ZGlmZiAtLWdpdCBhLy5jb3B5cml0ZV9hbGlhc2VzIGIvLmNvcHlyaXRlX2FsaWFzZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxZmJlOAotLS0gL2Rldi9udWxsCisrKyBiLy5jb3B5cml0ZV9hbGlhc2VzCkBAIC0wLDAgKzEsMTExIEBACitbCisgIHsKKyAgICAibWFpbHMiOiBbCisgICAgICAiY3BvcGFAY2xvdWRiYXNlc29sdXRpb25zLmNvbSIsCisgICAgICAicGNtYW50aWNvcmVAZ21haWwuY29tIgorICAgIF0sCisgICAgImF1dGhvcml0YXRpdmVfbWFpbCI6ICJwY21hbnRpY29yZUBnbWFpbC5jb20iLAorICAgICJuYW1lIjogIkNsYXVkaXUgUG9wYSIKKyAgfSwKKyAgeworICAgICJtYWlscyI6IFsKKyAgICAgICJwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbSIsCisgICAgICAicGllcnJlLnNhc3NvdWxhc0BjZWEuZnIiLAorICAgICAgInBpZXJyZS5zYXNzb3VsYXNAd2lzZWJpbS5mciIKKyAgICBdLAorICAgICJhdXRob3JpdGF0aXZlX21haWwiOiAicGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20iLAorICAgICJuYW1lIjogIlBpZXJyZSBTYXNzb3VsYXMiCisgIH0sCisgIHsKKyAgICAibWFpbHMiOiBbCisgICAgICAgICJhbGV4YW5kcmUuZmF5b2xsZUBsb2dpbGFiLmZyIiwKKyAgICAgICAgImVtaWxlLmFuY2xpbkBsb2dpbGFiLmZyIiwKKyAgICAgICAgImRhdmlkLmRvdWFyZEBsb2dpbGFiLmZyIiwKKyAgICAgICAgImxhdXJhLm1lZGlvbmlAbG9naWxhYi5mciIsCisgICAgICAgICJhbnRob255LnRydWNoZXRAbG9naWxhYi5mciIsCisgICAgICAgICJhbGFpbi5sZXVmcm95QGxvZ2lsYWIuZnIiLAorICAgICAgICAianVsaWVuLmNyaXN0YXVAbG9naWxhYi5mciIsCisgICAgICAgICJBZHJpZW4uRGlNYXNjaW9AbG9naWxhYi5mciIsCisgICAgICAgICJlbWlsZUBjcmF0ZXIubG9naWxhYi5mciIsCisgICAgICAgICJzeWx2YWluLnRoZW5hdWx0QGxvZ2lsYWIuZnIiLAorICAgICAgICAicGllcnJlLXl2ZXMuZGF2aWRAbG9naWxhYi5mciIsCisgICAgICAgICJuaWNvbGFzLmNoYXV2YXRAbG9naWxhYi5mciIsCisgICAgICAgICJhZmF5b2xsZS5tbEBmcmVlLmZyIiwKKyAgICAgICAgImF1cmVsaWVuLmNhbXBlYXNAbG9naWxhYi5mciIsCisgICAgICAgICJjaGFybGVzLmhlYmVydEBsb2dpbGFiLmZyIiwKKyAgICAgICAgImp1bGllbi5qZWhhbm5ldEBsb2dpbGFiLmZyIiwKKyAgICAgICAgImxtZWRpb25pQGxvZ2lsYWIuZnIiCisgICAgXSwKKyAgICAiYXV0aG9yaXRhdGl2ZV9tYWlsIjogImNvbnRhY3RAbG9naWxhYi5mciIsCisgICAgIm5hbWUiOiAiTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSIKKyAgfSwKKyAgeworICAgICJtYWlscyI6IFsKKyAgICAgICJtb3lsb3AyNjBAdmF1eG9vLmNvbSIKKyAgICBdLAorICAgICJuYW1lIjogIk1vaXNlcyBMb3BleiIsCisgICAgImF1dGhvcml0YXRpdmVfbWFpbCI6ICJtb3lsb3AyNjBAdmF1eG9vLmNvbSIKKyAgfSwKKyAgeworICAgICJtYWlscyI6IFsKKyAgICAgICAibmF0aGFuaWVsQGdvb2dsZS5jb20iLAorICAgICAgICJtYnBAZ29vZ2xlLmNvbSIsCisgICAgICAgInRtYXJla0Bnb29nbGUuY29tIiwKKyAgICAgICAic2hsb21tZUBnbWFpbC5jb20iLAorICAgICAgICJiYWxwYXJkYUBnb29nbGUuY29tIiwKKyAgICAgICAiZGxpbmRxdWlzdEBnb29nbGUuY29tIgorICAgIF0sCisgICAgIm5hbWUiOiAiR29vZ2xlLCBJbmMuIgorICB9LAorICB7CisgICAibWFpbHMiOiBbCisgICAgICAiYXNobGV5QGF3aGV0dGVyLmNvLnVrIiwKKyAgICAgICJhd2hldHRlci4yMDExQG15LmJyaXN0b2wuYWMudWsiLAorICAgICAgImFzd0BkbmVnLmNvbSIsCisgICAgICAiQVdoZXR0ZXJAdXNlcnMubm9yZXBseS5naXRodWIuY29tIgorICAgXSwKKyAgICJuYW1lIjogIkFzaGxleSBXaGV0dGVyIiwKKyAgICJhdXRob3JpdGF0aXZlX21haWwiOiAiYXNobGV5QGF3aGV0dGVyLmNvLnVrIgorICB9LAorICB7CisgICAgIm1haWxzIjogWworICAgICAgInZpbGxlLnNreXR0YUBpa2kuZmkiLAorICAgICAgInZpbGxlLnNreXR0YUB1cGNsb3VkLmNvbSIKKyAgICBdLAorICAgICJhdXRob3JpdGF0aXZlX21haWwiOiAidmlsbGUuc2t5dHRhQGlraS5maSIsCisgICAgIm5hbWUiOiAiVmlsbGUgU2t5dHTDpCIKKyAgfSwKKyAgICB7CisgICAgIm1haWxzIjogWworICAgICAgInVidW50dUBpcC0xNzItMzEtODktNTkuZWMyLmludGVybmFsIiwKKyAgICAgICJlbGk4OGZpbmVAZ21haWwuY29tIiwKKyAgICAgICJlamZpbmVAZ21haWwuY29tIgorICAgIF0sCisgICAgImF1dGhvcml0YXRpdmVfbWFpbCI6ICJlamZpbmVAZ21haWwuY29tIiwKKyAgICAibmFtZSI6ICJFbGkgRmluZSIKKyAgfSwKKyAgICB7CisgICAgIm1haWxzIjogWworICAgICAgImFuZGkuZmlua2xlckBnbWFpbC5jb20iLAorICAgICAgIjM5Mjk4MzQrRHVkZU5yMzNAdXNlcnMubm9yZXBseS5naXRodWIuY29tIgorICAgIF0sCisgICAgImF1dGhvcml0YXRpdmVfbWFpbCI6ICJhbmRpLmZpbmtsZXJAZ21haWwuY29tIiwKKyAgICAibmFtZSI6ICJBbmRyZWFzIEZpbmtsZXIiCisgIH0sCisgICAgICB7CisgICAgIm1haWxzIjogWworICAgICAgIm1hdHVzdmFsb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iLAorICAgICAgIm1hdHVzdmFsb0BnbWFpbC5jb20iCisgICAgXSwKKyAgICAiYXV0aG9yaXRhdGl2ZV9tYWlsIjogIm1hdHVzdmFsb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iLAorICAgICJuYW1lIjogIk1hdHVzIFZhbG8iCisgIH0sCisgICAgeworICAgICJtYWlscyI6IFsKKyAgICAgICI2Njg1MzExMytwcmUtY29tbWl0LWNpW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIiwKKyAgICAgICI0OTY5OTMzMytkZXBlbmRhYm90W2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgorICAgIF0sCisgICAgImF1dGhvcml0YXRpdmVfbWFpbCI6ICJib3RAbm9yZXBseS5naXRodWIuY29tIiwKKyAgICAibmFtZSI6ICJib3QiCisgIH0KK10KZGlmZiAtLWdpdCBhLy5jb3ZlcmFnZXJjIGIvLmNvdmVyYWdlcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3YWY3NwotLS0gL2Rldi9udWxsCisrKyBiLy5jb3ZlcmFnZXJjCkBAIC0wLDAgKzEsMTkgQEAKK1twYXRoc10KK3NvdXJjZSA9CisgICBweWxpbnQKKworW3JlcG9ydF0KK2luY2x1ZGUgPQorICAgIHB5bGludC8qCitvbWl0ID0KKyAgICAqL3Rlc3QvKgorZXhjbHVkZV9saW5lcyA9CisgICAgIyBSZS1lbmFibGUgZGVmYXVsdCBwcmFnbWEKKyAgICBwcmFnbWE6IG5vIGNvdmVyCisKKyAgICAjIERlYnVnLW9ubHkgY29kZQorICAgIGRlZiBfX3JlcHJfXworCisgICAgIyBUeXBlIGNoZWNraW5nIGNvZGUgbm90IGV4ZWN1dGVkIGR1cmluZyBweXRlc3QgcnVucworICAgIGlmIFRZUEVfQ0hFQ0tJTkc6CisgICAgQG92ZXJsb2FkCmRpZmYgLS1naXQgYS8uZmxha2U4IGIvLmZsYWtlOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTcwMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvLmZsYWtlOApAQCAtMCwwICsxLDcgQEAKK1tmbGFrZThdCitpZ25vcmUgPQorICAgIEUyMDMsIFc1MDMsICMgSW5jb21wYXRpYmxlIHdpdGggYmxhY2sgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbWJ2L2JsYWNrL2lzc3Vlcy8zMTUKKyAgICBFNTAxLCAjIExvdCBvZiBsaW5lcyB0b28gbG9uZyByaWdodCBub3cKKworbWF4LWxpbmUtbGVuZ3RoPTg4CittYXgtY29tcGxleGl0eT0zOQpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9DT05UUklCVVRJTkcubWQgYi8uZ2l0aHViL0NPTlRSSUJVVElORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2M5N2ViCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9DT05UUklCVVRJTkcubWQKQEAgLTAsMCArMSwyIEBACitQbGVhc2UgcmVhZCB0aGUKK1tjb250cmlidXRlIGRvY10oaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9kb2MvZGV2ZWxvcG1lbnRfZ3VpZGUvY29udHJpYnV0ZS5yc3QpLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9GVU5ESU5HLnltbCBiLy5naXRodWIvRlVORElORy55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzZjJkMgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvRlVORElORy55bWwKQEAgLTAsMCArMSwzIEBACisjIFRoZXNlIGFyZSBzdXBwb3J0ZWQgZnVuZGluZyBtb2RlbCBwbGF0Zm9ybXMKKwordGlkZWxpZnQ6ICJweXBpL3B5bGludCIKZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvMV9CdWdfcmVwb3J0Lm1kIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS8xX0J1Z19yZXBvcnQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhMjBlMAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvMV9CdWdfcmVwb3J0Lm1kCkBAIC0wLDAgKzEsNjMgQEAKKy0tLQorbmFtZTogQnVnIHJlcG9ydAorYWJvdXQ6IFJlcG9ydCBhIGJ1ZyBpbiBweWxpbnQKKy0tLQorCis8IS0tCisgIEhpIHRoZXJlISBUaGFuayB5b3UgZm9yIGRpc2NvdmVyaW5nIGFuZCBzdWJtaXR0aW5nIGFuIGlzc3VlLgorCisgIEJlZm9yZSB5b3Ugc3VibWl0IHRoaXMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBpc3N1ZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKKyAgb3IgaWYgaXQgaXMgbm90IGNsb3NlZC4KKworICBJcyB5b3VyIGlzc3VlIGZpeGVkIG9uIHRoZSBwcmV2aWV3IHJlbGVhc2U/OgorICAgIHBpcCBpbnN0YWxsIHB5bGludCBhc3Ryb2lkIC0tcHJlIC1VCistLT4KKworIyMjIFN0ZXBzIHRvIHJlcHJvZHVjZQorCis8IS0tCitHaXZlbiBhIGZpbGUgYGEucHlgOgorYGBgcHl0aG9uCisjIChEaXNhYmxlIG1lc3NhZ2UgdW5yZWxhdGVkIHRvIHRoZSBidWcpCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywuLi4KKworYGBgCisKK0dpdmVuIG11bHRpcGxlIGZpbGVzOgorYGBgCitfX2luaXRfXy5weQorYS5weQorbW9kdWxlXAorICAgIF9faW5pdF9fLnB5CisgICAgYi5weQorICAgIGMucHkKK2BgYAorLS0+CisKKyMjIyBDdXJyZW50IGJlaGF2aW9yCisKKzwhLS0KK1Jlc3VsdCBvZiBgcHlsaW50IGEucHlgOgorYGBgCisKK2BgYAorLS0+CisKKyMjIyBFeHBlY3RlZCBiZWhhdmlvcgorCisjIyMgcHlsaW50IC0tdmVyc2lvbiBvdXRwdXQKKworUmVzdWx0IG9mIGBweWxpbnQgLS12ZXJzaW9uYCBvdXRwdXQ6CisKK2BgYAorCitgYGAKKworPCEtLQorQWRkaXRpb25hbCBkZXBlbmRlbmNpZXM6CitgYGAKK3BhbmRhcz09MC4yMy4yCittYXJzaG1hbGxvdz09My4xMC4wCisuLi4KK2BgYAorLS0+CmRpZmYgLS1naXQgYS8uZ2l0aHViL0lTU1VFX1RFTVBMQVRFLzJfRmVhdHVyZV9yZXF1ZXN0Lm1kIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS8yX0ZlYXR1cmVfcmVxdWVzdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBhMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS8yX0ZlYXR1cmVfcmVxdWVzdC5tZApAQCAtMCwwICsxLDIzIEBACistLS0KK25hbWU6IEZlYXR1cmUgcmVxdWVzdAorYWJvdXQ6IFN1Z2dlc3QgYW4gaWRlYSBmb3IgdGhpcyBwcm9qZWN0CistLS0KKworPCEtLQorICBIaSB0aGVyZSEgVGhhbmsgeW91IGZvciB3YW50aW5nIHRvIG1ha2UgcHlsaW50IGJldHRlci4KKworICBCZWZvcmUgeW91IHN1Ym1pdCB0aGlzLCBtYWtlIHN1cmUgdGhhdCB0aGlzIGZlYXR1cmUgd2Fzbid0CisgIGFscmVhZHkgcmVxdWVzdGVkIG9yIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGltcGxlbWVudGVkIGluIHRoZSBtYXN0ZXIgYnJhbmNoLgorLS0+CisKKyMjIyBJcyB5b3VyIGZlYXR1cmUgcmVxdWVzdCByZWxhdGVkIHRvIGEgcHJvYmxlbT8gUGxlYXNlIGRlc2NyaWJlCisKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgcHJvYmxlbSBpcy4KKworIyMjIERlc2NyaWJlIHRoZSBzb2x1dGlvbiB5b3UnZCBsaWtlCisKK0EgY2xlYXIgYW5kIGNvbmNpc2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB5b3Ugd2FudCB0byBoYXBwZW4uCisKKyMjIyBBZGRpdGlvbmFsIGNvbnRleHQKKworQWRkIGFueSBvdGhlciBjb250ZXh0IGFib3V0IHRoZSBmZWF0dXJlIHJlcXVlc3QgaGVyZS4KZGlmZiAtLWdpdCBhLy5naXRodWIvSVNTVUVfVEVNUExBVEUvM19RdWVzdGlvbi5tZCBiLy5naXRodWIvSVNTVUVfVEVNUExBVEUvM19RdWVzdGlvbi5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTkxODdkCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9JU1NVRV9URU1QTEFURS8zX1F1ZXN0aW9uLm1kCkBAIC0wLDAgKzEsOCBAQAorLS0tCituYW1lOiBTdXBwb3J0IHF1ZXN0aW9uCithYm91dDoKKyAgUXVlc3Rpb25zIGFib3V0IHB5bGludCB0aGF0IGFyZSBub3QgY292ZXJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAoaHR0cHM6Ly9weWxpbnQucHljcWEub3JnL2VuL2xhdGVzdC8pCistLS0KKworIyMgUXVlc3Rpb24KZGlmZiAtLWdpdCBhLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhMjQ0NwotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kCkBAIC0wLDAgKzEsMzkgQEAKKzwhLS0KKworVGhhbmsgeW91IGZvciBzdWJtaXR0aW5nIGEgUFIgdG8gcHlsaW50IQorCitUbyBlYXNlIHRoZSBwcm9jZXNzIG9mIHJldmlld2luZyB5b3VyIFBSLCBkbyBtYWtlIHN1cmUgdG8gY29tcGxldGUgdGhlIGZvbGxvd2luZyBib3hlcy4KKworWW91IGNhbiBhbHNvIHJlYWQgbW9yZSBhYm91dCBjb250cmlidXRpbmcgdG8gcHlsaW50IGluIHRoaXMgZG9jdW1lbnQ6CitodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL2RvYy9kZXZlbG9wbWVudF9ndWlkZS9jb250cmlidXRlLnJzdCNyZXBvc2l0b3J5CistLT4KKworIyMgU3RlcHMKKworLSBbIF0gQWRkIHlvdXJzZWxmIHRvIENPTlRSSUJVVE9SUyBpZiB5b3UgYXJlIGEgbmV3IGNvbnRyaWJ1dG9yLgorLSBbIF0gQWRkIGEgQ2hhbmdlTG9nIGVudHJ5IGRlc2NyaWJpbmcgd2hhdCB5b3VyIFBSIGRvZXMuCistIFsgXSBJZiBpdCdzIGEgbmV3IGZlYXR1cmUgb3IgYW4gaW1wb3J0YW50IGJ1ZyBmaXgsIGFkZCBhIFdoYXQncyBOZXcgZW50cnkgaW4KKyAgICAgIGBkb2Mvd2hhdHNuZXcvPGN1cnJlbnQgcmVsZWFzZS5yc3Q+YC4KKy0gWyBdIFdyaXRlIGEgZ29vZCBkZXNjcmlwdGlvbiBvbiB3aGF0IHRoZSBQUiBkb2VzLgorCisjIyBEZXNjcmlwdGlvbgorCisjIyBUeXBlIG9mIENoYW5nZXMKKworPCEtLSBMZWF2ZSB0aGUgY29ycmVzcG9uZGluZyBsaW5lcyBmb3IgdGhlIGFwcGxpY2FibGUgdHlwZSBvZiBjaGFuZ2U6IC0tPgorCit8ICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgfAorfCAtLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wg4pyTICAgfCA6YnVnOiBCdWcgZml4ICAgICAgICAgIHwKK3wg4pyTICAgfCA6c3BhcmtsZXM6IE5ldyBmZWF0dXJlIHwKK3wg4pyTICAgfCA6aGFtbWVyOiBSZWZhY3RvcmluZyAgIHwKK3wg4pyTICAgfCA6c2Nyb2xsOiBEb2NzICAgICAgICAgIHwKKworIyMgUmVsYXRlZCBJc3N1ZQorCis8IS0tCitJZiB0aGlzIFBSIGZpeGVzIGEgcGFydGljdWxhciBpc3N1ZSwgdXNlIHRoZSBmb2xsb3dpbmcgdG8gYXV0b21hdGljYWxseSBjbG9zZSB0aGF0IGlzc3VlCitvbmNlIHRoaXMgUFIgZ2V0cyBtZXJnZWQ6CisKK0Nsb3NlcyAjWFhYCistLT4KZGlmZiAtLWdpdCBhLy5naXRodWIvU0VDVVJJVFkubWQgYi8uZ2l0aHViL1NFQ1VSSVRZLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTZmYzIKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aHViL1NFQ1VSSVRZLm1kCkBAIC0wLDAgKzEgQEAKK0Nvb3JkaW5hdGVkIERpc2Nsb3N1cmUgUGxhbjogaHR0cHM6Ly90aWRlbGlmdC5jb20vc2VjdXJpdHkKZGlmZiAtLWdpdCBhLy5naXRodWIvZGVwZW5kYWJvdC55bWwgYi8uZ2l0aHViL2RlcGVuZGFib3QueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzA0N2EKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aHViL2RlcGVuZGFib3QueW1sCkBAIC0wLDAgKzEsMTkgQEAKK3ZlcnNpb246IDIKK3VwZGF0ZXM6CisgIC0gcGFja2FnZS1lY29zeXN0ZW06ICJwaXAiCisgICAgZGlyZWN0b3J5OiAiLyIKKyAgICBzY2hlZHVsZToKKyAgICAgIGludGVydmFsOiAid2Vla2x5IgorICAgIGxhYmVsczoKKyAgICAgIC0gImRlcGVuZGVuY3kiCisgICAgb3Blbi1wdWxsLXJlcXVlc3RzLWxpbWl0OiAxMAorICAgIHJlYmFzZS1zdHJhdGVneTogImRpc2FibGVkIgorCisgIC0gcGFja2FnZS1lY29zeXN0ZW06ICJnaXRodWItYWN0aW9ucyIKKyAgICBkaXJlY3Rvcnk6ICIvIgorICAgIHNjaGVkdWxlOgorICAgICAgaW50ZXJ2YWw6ICJ3ZWVrbHkiCisgICAgbGFiZWxzOgorICAgICAgLSAiZGVwZW5kZW5jeSIKKyAgICBvcGVuLXB1bGwtcmVxdWVzdHMtbGltaXQ6IDEwCisgICAgcmViYXNlLXN0cmF0ZWd5OiAiZGlzYWJsZWQiCmRpZmYgLS1naXQgYS8uZ2l0aHViL3dvcmtmbG93cy9jaS55YW1sIGIvLmdpdGh1Yi93b3JrZmxvd3MvY2kueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzI4ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MvY2kueWFtbApAQCAtMCwwICsxLDQ3NyBAQAorbmFtZTogQ0kKKworb246CisgIHB1c2g6CisgICAgYnJhbmNoZXM6CisgICAgICAtIG1hc3RlcgorICAgICAgLSAyLioKKyAgcHVsbF9yZXF1ZXN0OiB+CisKK2VudjoKKyAgQ0FDSEVfVkVSU0lPTjogMgorICBERUZBVUxUX1BZVEhPTjogMy42CisgIFBSRV9DT01NSVRfQ0FDSEU6IH4vLmNhY2hlL3ByZS1jb21taXQKKworam9iczoKKyAgcHJlcGFyZS1iYXNlOgorICAgIG5hbWU6IFByZXBhcmUgYmFzZSBkZXBlbmRlbmNpZXMKKyAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CisgICAgb3V0cHV0czoKKyAgICAgIHB5dGhvbi1rZXk6ICR7eyBzdGVwcy5nZW5lcmF0ZS1weXRob24ta2V5Lm91dHB1dHMua2V5IH19CisgICAgICBwcmUtY29tbWl0LWtleTogJHt7IHN0ZXBzLmdlbmVyYXRlLXByZS1jb21taXQta2V5Lm91dHB1dHMua2V5IH19CisgICAgc3RlcHM6CisgICAgICAtIG5hbWU6IENoZWNrIG91dCBjb2RlIGZyb20gR2l0SHViCisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIuMy40CisgICAgICAgIHdpdGg6CisgICAgICAgICAgZmV0Y2gtZGVwdGg6IDAKKyAgICAgIC0gbmFtZTogU2V0IHVwIFB5dGhvbiAke3sgZW52LkRFRkFVTFRfUFlUSE9OIH19CisgICAgICAgIGlkOiBweXRob24KKyAgICAgICAgdXNlczogYWN0aW9ucy9zZXR1cC1weXRob25AdjIuMi4yCisgICAgICAgIHdpdGg6CisgICAgICAgICAgcHl0aG9uLXZlcnNpb246ICR7eyBlbnYuREVGQVVMVF9QWVRIT04gfX0KKyAgICAgIC0gbmFtZTogR2VuZXJhdGUgcGFydGlhbCBQeXRob24gdmVudiByZXN0b3JlIGtleQorICAgICAgICBpZDogZ2VuZXJhdGUtcHl0aG9uLWtleQorICAgICAgICBydW46ID4tCisgICAgICAgICAgZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9a2V5OjpiYXNlLXZlbnYtJHt7IGVudi5DQUNIRV9WRVJTSU9OIH19LSR7eworICAgICAgICAgICAgaGFzaEZpbGVzKCdzZXR1cC5jZmcnLCAncmVxdWlyZW1lbnRzX3Rlc3QudHh0JywgJ3JlcXVpcmVtZW50c190ZXN0X21pbi50eHQnKQorICAgICAgICAgIH19IgorICAgICAgLSBuYW1lOiBSZXN0b3JlIFB5dGhvbiB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgIGlkOiBjYWNoZS12ZW52CisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2FjaGVAdjIuMS42CisgICAgICAgIHdpdGg6CisgICAgICAgICAgcGF0aDogdmVudgorICAgICAgICAgIGtleTogPi0KKyAgICAgICAgICAgICR7eyBydW5uZXIub3MgfX0tJHt7IHN0ZXBzLnB5dGhvbi5vdXRwdXRzLnB5dGhvbi12ZXJzaW9uIH19LSR7eworICAgICAgICAgICAgc3RlcHMuZ2VuZXJhdGUtcHl0aG9uLWtleS5vdXRwdXRzLmtleSB9fQorICAgICAgICAgIHJlc3RvcmUta2V5czogfAorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS0ke3sgc3RlcHMucHl0aG9uLm91dHB1dHMucHl0aG9uLXZlcnNpb24gfX0tYmFzZS12ZW52LSR7eyBlbnYuQ0FDSEVfVkVSU0lPTiB9fS0KKyAgICAgIC0gbmFtZTogQ3JlYXRlIFB5dGhvbiB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgIGlmOiBzdGVwcy5jYWNoZS12ZW52Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBweXRob24gLW0gdmVudiB2ZW52CisgICAgICAgICAgLiB2ZW52L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIHB5dGhvbiAtbSBwaXAgaW5zdGFsbCAtVSBwaXAgc2V0dXB0b29scyB3aGVlbAorICAgICAgICAgIHBpcCBpbnN0YWxsIC1VIC1yIHJlcXVpcmVtZW50c190ZXN0LnR4dAorICAgICAgLSBuYW1lOiBHZW5lcmF0ZSBwcmUtY29tbWl0IHJlc3RvcmUga2V5CisgICAgICAgIGlkOiBnZW5lcmF0ZS1wcmUtY29tbWl0LWtleQorICAgICAgICBydW46ID4tCisgICAgICAgICAgZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9a2V5OjpwcmUtY29tbWl0LSR7eyBlbnYuQ0FDSEVfVkVSU0lPTiB9fS0ke3sKKyAgICAgICAgICAgIGhhc2hGaWxlcygnLnByZS1jb21taXQtY29uZmlnLnlhbWwnKSB9fSIKKyAgICAgIC0gbmFtZTogUmVzdG9yZSBwcmUtY29tbWl0IGVudmlyb25tZW50CisgICAgICAgIGlkOiBjYWNoZS1wcmVjb21taXQKKyAgICAgICAgdXNlczogYWN0aW9ucy9jYWNoZUB2Mi4xLjYKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBwYXRoOiAke3sgZW52LlBSRV9DT01NSVRfQ0FDSEUgfX0KKyAgICAgICAgICBrZXk6ID4tCisgICAgICAgICAgICAke3sgcnVubmVyLm9zIH19LSR7eyBzdGVwcy5nZW5lcmF0ZS1wcmUtY29tbWl0LWtleS5vdXRwdXRzLmtleSB9fQorICAgICAgICAgIHJlc3RvcmUta2V5czogfAorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS1wcmUtY29tbWl0LSR7eyBlbnYuQ0FDSEVfVkVSU0lPTiB9fS0KKyAgICAgIC0gbmFtZTogSW5zdGFsbCBwcmUtY29tbWl0IGRlcGVuZGVuY2llcworICAgICAgICBpZjogc3RlcHMuY2FjaGUtcHJlY29tbWl0Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICAuIHZlbnYvYmluL2FjdGl2YXRlCisgICAgICAgICAgcHJlLWNvbW1pdCBpbnN0YWxsIC0taW5zdGFsbC1ob29rcworCisgIGZvcm1hdHRpbmc6CisgICAgbmFtZTogUnVuIHByZS1jb21taXQgY2hlY2tzCisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorICAgIG5lZWRzOiBwcmVwYXJlLWJhc2UKKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogQ2hlY2sgb3V0IGNvZGUgZnJvbSBHaXRIdWIKKyAgICAgICAgdXNlczogYWN0aW9ucy9jaGVja291dEB2Mi4zLjQKKyAgICAgIC0gbmFtZTogU2V0IHVwIFB5dGhvbiAke3sgZW52LkRFRkFVTFRfUFlUSE9OIH19CisgICAgICAgIGlkOiBweXRob24KKyAgICAgICAgdXNlczogYWN0aW9ucy9zZXR1cC1weXRob25AdjIuMi4yCisgICAgICAgIHdpdGg6CisgICAgICAgICAgcHl0aG9uLXZlcnNpb246ICR7eyBlbnYuREVGQVVMVF9QWVRIT04gfX0KKyAgICAgIC0gbmFtZTogUmVzdG9yZSBQeXRob24gdmlydHVhbCBlbnZpcm9ubWVudAorICAgICAgICBpZDogY2FjaGUtdmVudgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NhY2hlQHYyLjEuNgorICAgICAgICB3aXRoOgorICAgICAgICAgIHBhdGg6IHZlbnYKKyAgICAgICAgICBrZXk6CisgICAgICAgICAgICAke3sgcnVubmVyLm9zIH19LSR7eyBzdGVwcy5weXRob24ub3V0cHV0cy5weXRob24tdmVyc2lvbiB9fS0ke3sKKyAgICAgICAgICAgIG5lZWRzLnByZXBhcmUtYmFzZS5vdXRwdXRzLnB5dGhvbi1rZXkgfX0KKyAgICAgIC0gbmFtZTogRmFpbCBqb2IgaWYgUHl0aG9uIGNhY2hlIHJlc3RvcmUgZmFpbGVkCisgICAgICAgIGlmOiBzdGVwcy5jYWNoZS12ZW52Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBlY2hvICJGYWlsZWQgdG8gcmVzdG9yZSBQeXRob24gdmVudiBmcm9tIGNhY2hlIgorICAgICAgICAgIGV4aXQgMQorICAgICAgLSBuYW1lOiBSZXN0b3JlIHByZS1jb21taXQgZW52aXJvbm1lbnQKKyAgICAgICAgaWQ6IGNhY2hlLXByZWNvbW1pdAorICAgICAgICB1c2VzOiBhY3Rpb25zL2NhY2hlQHYyLjEuNgorICAgICAgICB3aXRoOgorICAgICAgICAgIHBhdGg6ICR7eyBlbnYuUFJFX0NPTU1JVF9DQUNIRSB9fQorICAgICAgICAgIGtleTogJHt7IHJ1bm5lci5vcyB9fS0ke3sgbmVlZHMucHJlcGFyZS1iYXNlLm91dHB1dHMucHJlLWNvbW1pdC1rZXkgfX0KKyAgICAgIC0gbmFtZTogRmFpbCBqb2IgaWYgcHJlLWNvbW1pdCBjYWNoZSByZXN0b3JlIGZhaWxlZAorICAgICAgICBpZjogc3RlcHMuY2FjaGUtcHJlY29tbWl0Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBlY2hvICJGYWlsZWQgdG8gcmVzdG9yZSBwcmUtY29tbWl0IGVudmlyb25tZW50IGZyb20gY2FjaGUiCisgICAgICAgICAgZXhpdCAxCisgICAgICAtIG5hbWU6IFJ1biBmb3JtYXR0aW5nIGNoZWNrCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIC4gdmVudi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBwaXAgaW5zdGFsbCAtZSAuCisgICAgICAgICAgcHJlLWNvbW1pdCBydW4gcHlsaW50IC0tYWxsLWZpbGVzCisKKyAgc3BlbGxpbmc6CisgICAgbmFtZTogUnVuIHNwZWxsaW5nIGNoZWNrcworICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBuZWVkczogcHJlcGFyZS1iYXNlCisgICAgc3RlcHM6CisgICAgICAtIG5hbWU6IENoZWNrIG91dCBjb2RlIGZyb20gR2l0SHViCisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIuMy40CisgICAgICAtIG5hbWU6IFNldCB1cCBQeXRob24gJHt7IGVudi5ERUZBVUxUX1BZVEhPTiB9fQorICAgICAgICBpZDogcHl0aG9uCisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHYyLjIuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAke3sgZW52LkRFRkFVTFRfUFlUSE9OIH19CisgICAgICAtIG5hbWU6IFJlc3RvcmUgUHl0aG9uIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgaWQ6IGNhY2hlLXZlbnYKKyAgICAgICAgdXNlczogYWN0aW9ucy9jYWNoZUB2Mi4xLjYKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBwYXRoOiB2ZW52CisgICAgICAgICAga2V5OgorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS0ke3sgc3RlcHMucHl0aG9uLm91dHB1dHMucHl0aG9uLXZlcnNpb24gfX0tJHt7CisgICAgICAgICAgICBuZWVkcy5wcmVwYXJlLWJhc2Uub3V0cHV0cy5weXRob24ta2V5IH19CisgICAgICAtIG5hbWU6IEZhaWwgam9iIGlmIFB5dGhvbiBjYWNoZSByZXN0b3JlIGZhaWxlZAorICAgICAgICBpZjogc3RlcHMuY2FjaGUtdmVudi5vdXRwdXRzLmNhY2hlLWhpdCAhPSAndHJ1ZScKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgZWNobyAiRmFpbGVkIHRvIHJlc3RvcmUgUHl0aG9uIHZlbnYgZnJvbSBjYWNoZSIKKyAgICAgICAgICBleGl0IDEKKyAgICAgIC0gbmFtZTogUnVuIHNwZWxsaW5nIGNoZWNrcworICAgICAgICBydW46IHwKKyAgICAgICAgICAuIHZlbnYvYmluL2FjdGl2YXRlCisgICAgICAgICAgcHl0ZXN0IHRlc3RzLyAtayB1bml0dGVzdF9zcGVsbGluZworCisgIHByZXBhcmUtdGVzdHMtbGludXg6CisgICAgbmFtZTogUHJlcGFyZSB0ZXN0cyBmb3IgUHl0aG9uICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0gKExpbnV4KQorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdHJhdGVneToKKyAgICAgIG1hdHJpeDoKKyAgICAgICAgcHl0aG9uLXZlcnNpb246IFszLjYsIDMuNywgMy44LCAzLjksIDMuMTAtZGV2XQorICAgIG91dHB1dHM6CisgICAgICBweXRob24ta2V5OiAke3sgc3RlcHMuZ2VuZXJhdGUtcHl0aG9uLWtleS5vdXRwdXRzLmtleSB9fQorICAgIHN0ZXBzOgorICAgICAgLSBuYW1lOiBDaGVjayBvdXQgY29kZSBmcm9tIEdpdEh1YgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYyLjMuNAorICAgICAgICB3aXRoOgorICAgICAgICAgIGZldGNoLWRlcHRoOiAwCisgICAgICAtIG5hbWU6IFNldCB1cCBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgICBpZDogcHl0aG9uCisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHYyLjIuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19CisgICAgICAtIG5hbWU6IEdlbmVyYXRlIHBhcnRpYWwgUHl0aG9uIHZlbnYgcmVzdG9yZSBrZXkKKyAgICAgICAgaWQ6IGdlbmVyYXRlLXB5dGhvbi1rZXkKKyAgICAgICAgcnVuOiA+LQorICAgICAgICAgIGVjaG8gIjo6c2V0LW91dHB1dCBuYW1lPWtleTo6dmVudi0ke3sgZW52LkNBQ0hFX1ZFUlNJT04gfX0tJHt7CisgICAgICAgICAgICBoYXNoRmlsZXMoJ3NldHVwLmNmZycsICdyZXF1aXJlbWVudHNfdGVzdC50eHQnLCAncmVxdWlyZW1lbnRzX3Rlc3RfbWluLnR4dCcpCisgICAgICAgICAgfX0iCisgICAgICAtIG5hbWU6IFJlc3RvcmUgUHl0aG9uIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgaWQ6IGNhY2hlLXZlbnYKKyAgICAgICAgdXNlczogYWN0aW9ucy9jYWNoZUB2Mi4xLjYKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBwYXRoOiB2ZW52CisgICAgICAgICAga2V5OiA+LQorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS0ke3sgc3RlcHMucHl0aG9uLm91dHB1dHMucHl0aG9uLXZlcnNpb24gfX0tJHt7CisgICAgICAgICAgICBzdGVwcy5nZW5lcmF0ZS1weXRob24ta2V5Lm91dHB1dHMua2V5IH19CisgICAgICAgICAgcmVzdG9yZS1rZXlzOiB8CisgICAgICAgICAgICAke3sgcnVubmVyLm9zIH19LSR7eyBzdGVwcy5weXRob24ub3V0cHV0cy5weXRob24tdmVyc2lvbiB9fS12ZW52LSR7eyBlbnYuQ0FDSEVfVkVSU0lPTiB9fS0KKyAgICAgIC0gbmFtZTogQ3JlYXRlIFB5dGhvbiB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgIGlmOiBzdGVwcy5jYWNoZS12ZW52Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBweXRob24gLW0gdmVudiB2ZW52CisgICAgICAgICAgLiB2ZW52L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIHB5dGhvbiAtbSBwaXAgaW5zdGFsbCAtVSBwaXAgc2V0dXB0b29scyB3aGVlbAorICAgICAgICAgIHBpcCBpbnN0YWxsIC1VIC1yIHJlcXVpcmVtZW50c190ZXN0LnR4dAorCisgIHB5dGVzdC1saW51eDoKKyAgICBuYW1lOiBSdW4gdGVzdHMgUHl0aG9uICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0gKExpbnV4KQorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBuZWVkczogcHJlcGFyZS10ZXN0cy1saW51eAorICAgIHN0cmF0ZWd5OgorICAgICAgZmFpbC1mYXN0OiBmYWxzZQorICAgICAgbWF0cml4OgorICAgICAgICBweXRob24tdmVyc2lvbjogWzMuNiwgMy43LCAzLjgsIDMuOSwgMy4xMC1kZXZdCisgICAgc3RlcHM6CisgICAgICAtIG5hbWU6IENoZWNrIG91dCBjb2RlIGZyb20gR2l0SHViCisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIuMy40CisgICAgICAtIG5hbWU6IFNldCB1cCBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgICBpZDogcHl0aG9uCisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHYyLjIuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19CisgICAgICAtIG5hbWU6IFJlc3RvcmUgUHl0aG9uIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgaWQ6IGNhY2hlLXZlbnYKKyAgICAgICAgdXNlczogYWN0aW9ucy9jYWNoZUB2Mi4xLjYKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBwYXRoOiB2ZW52CisgICAgICAgICAga2V5OgorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS0ke3sgc3RlcHMucHl0aG9uLm91dHB1dHMucHl0aG9uLXZlcnNpb24gfX0tJHt7CisgICAgICAgICAgICBuZWVkcy5wcmVwYXJlLXRlc3RzLWxpbnV4Lm91dHB1dHMucHl0aG9uLWtleSB9fQorICAgICAgLSBuYW1lOiBGYWlsIGpvYiBpZiBQeXRob24gY2FjaGUgcmVzdG9yZSBmYWlsZWQKKyAgICAgICAgaWY6IHN0ZXBzLmNhY2hlLXZlbnYub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIGVjaG8gIkZhaWxlZCB0byByZXN0b3JlIFB5dGhvbiB2ZW52IGZyb20gY2FjaGUiCisgICAgICAgICAgZXhpdCAxCisgICAgICAtIG5hbWU6IFJ1biBweXRlc3QKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgLiB2ZW52L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIHB5dGVzdCAtLWJlbmNobWFyay1kaXNhYmxlIC0tY292IC0tY292LXJlcG9ydD0gdGVzdHMvCisgICAgICAtIG5hbWU6IFVwbG9hZCBjb3ZlcmFnZSBhcnRpZmFjdAorICAgICAgICB1c2VzOiBhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2Mi4yLjQKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBuYW1lOiBjb3ZlcmFnZS0ke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19CisgICAgICAgICAgcGF0aDogLmNvdmVyYWdlCisKKyAgY292ZXJhZ2U6CisgICAgbmFtZTogUHJvY2VzcyB0ZXN0IGNvdmVyYWdlCisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorICAgIG5lZWRzOiBbInByZXBhcmUtdGVzdHMtbGludXgiLCAicHl0ZXN0LWxpbnV4Il0KKyAgICBzdHJhdGVneToKKyAgICAgIG1hdHJpeDoKKyAgICAgICAgcHl0aG9uLXZlcnNpb246IFszLjhdCisgICAgZW52OgorICAgICAgQ09WRVJBR0VSQ19GSUxFOiAuY292ZXJhZ2VyYworICAgIHN0ZXBzOgorICAgICAgLSBuYW1lOiBDaGVjayBvdXQgY29kZSBmcm9tIEdpdEh1YgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYyLjMuNAorICAgICAgLSBuYW1lOiBTZXQgdXAgUHl0aG9uICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0KKyAgICAgICAgaWQ6IHB5dGhvbgorICAgICAgICB1c2VzOiBhY3Rpb25zL3NldHVwLXB5dGhvbkB2Mi4yLjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBweXRob24tdmVyc2lvbjogJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgLSBuYW1lOiBSZXN0b3JlIFB5dGhvbiB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgIGlkOiBjYWNoZS12ZW52CisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2FjaGVAdjIuMS42CisgICAgICAgIHdpdGg6CisgICAgICAgICAgcGF0aDogdmVudgorICAgICAgICAgIGtleToKKyAgICAgICAgICAgICR7eyBydW5uZXIub3MgfX0tJHt7IHN0ZXBzLnB5dGhvbi5vdXRwdXRzLnB5dGhvbi12ZXJzaW9uIH19LSR7eworICAgICAgICAgICAgbmVlZHMucHJlcGFyZS10ZXN0cy1saW51eC5vdXRwdXRzLnB5dGhvbi1rZXkgfX0KKyAgICAgIC0gbmFtZTogRmFpbCBqb2IgaWYgUHl0aG9uIGNhY2hlIHJlc3RvcmUgZmFpbGVkCisgICAgICAgIGlmOiBzdGVwcy5jYWNoZS12ZW52Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBlY2hvICJGYWlsZWQgdG8gcmVzdG9yZSBQeXRob24gdmVudiBmcm9tIGNhY2hlIgorICAgICAgICAgIGV4aXQgMQorICAgICAgLSBuYW1lOiBEb3dubG9hZCBhbGwgY292ZXJhZ2UgYXJ0aWZhY3RzCisgICAgICAgIHVzZXM6IGFjdGlvbnMvZG93bmxvYWQtYXJ0aWZhY3RAdjIuMC4xMAorICAgICAgLSBuYW1lOiBDb21iaW5lIGNvdmVyYWdlIHJlc3VsdHMKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgLiB2ZW52L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGNvdmVyYWdlIGNvbWJpbmUgY292ZXJhZ2UqLy5jb3ZlcmFnZQorICAgICAgICAgIGNvdmVyYWdlIHJlcG9ydCAtLXJjZmlsZT0ke3sgZW52LkNPVkVSQUdFUkNfRklMRSB9fQorICAgICAgLSBuYW1lOiBVcGxvYWQgY292ZXJhZ2UgdG8gQ292ZXJhbGxzCisgICAgICAgIGVudjoKKyAgICAgICAgICBHSVRIVUJfVE9LRU46ICR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fQorICAgICAgICBydW46IHwKKyAgICAgICAgICAuIHZlbnYvYmluL2FjdGl2YXRlCisgICAgICAgICAgY292ZXJhbGxzIC0tcmNmaWxlPSR7eyBlbnYuQ09WRVJBR0VSQ19GSUxFIH19IC0tc2VydmljZT1naXRodWIKKworICBiZW5jaG1hcmstbGludXg6CisgICAgbmFtZTogUnVuIGJlbmNobWFyayB0ZXN0cyBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fSAoTGludXgpCisgICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdAorICAgIG5lZWRzOiBwcmVwYXJlLXRlc3RzLWxpbnV4CisgICAgc3RyYXRlZ3k6CisgICAgICBmYWlsLWZhc3Q6IGZhbHNlCisgICAgICBtYXRyaXg6CisgICAgICAgIHB5dGhvbi12ZXJzaW9uOiBbMy44LCAzLjldCisgICAgc3RlcHM6CisgICAgICAtIG5hbWU6IENoZWNrIG91dCBjb2RlIGZyb20gR2l0SHViCisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIuMy40CisgICAgICAtIG5hbWU6IFNldCB1cCBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgICBpZDogcHl0aG9uCisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHYyLjIuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19CisgICAgICAtIG5hbWU6IFJlc3RvcmUgUHl0aG9uIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgaWQ6IGNhY2hlLXZlbnYKKyAgICAgICAgdXNlczogYWN0aW9ucy9jYWNoZUB2Mi4xLjYKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBwYXRoOiB2ZW52CisgICAgICAgICAga2V5OgorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS0ke3sgc3RlcHMucHl0aG9uLm91dHB1dHMucHl0aG9uLXZlcnNpb24gfX0tJHt7CisgICAgICAgICAgICBuZWVkcy5wcmVwYXJlLXRlc3RzLWxpbnV4Lm91dHB1dHMucHl0aG9uLWtleSB9fQorICAgICAgLSBuYW1lOiBGYWlsIGpvYiBpZiBQeXRob24gY2FjaGUgcmVzdG9yZSBmYWlsZWQKKyAgICAgICAgaWY6IHN0ZXBzLmNhY2hlLXZlbnYub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIGVjaG8gIkZhaWxlZCB0byByZXN0b3JlIFB5dGhvbiB2ZW52IGZyb20gY2FjaGUiCisgICAgICAgICAgZXhpdCAxCisgICAgICAtIG5hbWU6IFJ1biBweXRlc3QKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgLiB2ZW52L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIHBpcCBpbnN0YWxsIHB5Z2FsCisgICAgICAgICAgcGlwIGluc3RhbGwgLWUgLgorICAgICAgICAgIHB5dGVzdCAtLWV4aXRmaXJzdCBcCisgICAgICAgICAgICAtLWJlbmNobWFyay1vbmx5IFwKKyAgICAgICAgICAgIC0tYmVuY2htYXJrLWF1dG9zYXZlIFwKKyAgICAgICAgICAgIC0tYmVuY2htYXJrLXNhdmUtZGF0YSBcCisgICAgICAgICAgICAtLWJlbmNobWFyay1ncm91cC1ieT0iZ3JvdXAiCisgICAgICAtIG5hbWU6IENyZWF0ZSBwYXJ0aWFsIGFydGlmYWN0IG5hbWUgc3VmZml4CisgICAgICAgIGlkOiBhcnRpZmFjdC1uYW1lLXN1ZmZpeAorICAgICAgICBydW46ID4tCisgICAgICAgICAgZWNobyAiOjpzZXQtb3V0cHV0IG5hbWU9ZGF0ZXRpbWU6OiIkKGRhdGUgIislWSVtJWRfJUglTSIpCisgICAgICAtIG5hbWU6IFVwbG9hZCBiZW5jaG1hcmsgYXJ0aWZhY3QKKyAgICAgICAgdXNlczogYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjIuMi40CisgICAgICAgIHdpdGg6CisgICAgICAgICAgbmFtZToKKyAgICAgICAgICAgIGJlbmNobWFyay0ke3sgcnVubmVyLm9zIH19LSR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX1fJHt7CisgICAgICAgICAgICBzdGVwcy5hcnRpZmFjdC1uYW1lLXN1ZmZpeC5vdXRwdXRzLmRhdGV0aW1lIH19CisgICAgICAgICAgcGF0aDogLmJlbmNobWFya3MvCisKKyAgcHJlcGFyZS10ZXN0cy13aW5kb3dzOgorICAgIG5hbWU6IFByZXBhcmUgdGVzdHMgZm9yIFB5dGhvbiAke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19IChXaW5kb3dzKQorICAgIHJ1bnMtb246IHdpbmRvd3MtbGF0ZXN0CisgICAgc3RyYXRlZ3k6CisgICAgICBtYXRyaXg6CisgICAgICAgIHB5dGhvbi12ZXJzaW9uOiBbMy42LCAzLjcsIDMuOCwgMy45LCAzLjEwLWRldl0KKyAgICBvdXRwdXRzOgorICAgICAgcHl0aG9uLWtleTogJHt7IHN0ZXBzLmdlbmVyYXRlLXB5dGhvbi1rZXkub3V0cHV0cy5rZXkgfX0KKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogQ2hlY2sgb3V0IGNvZGUgZnJvbSBHaXRIdWIKKyAgICAgICAgdXNlczogYWN0aW9ucy9jaGVja291dEB2Mi4zLjQKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBmZXRjaC1kZXB0aDogMAorICAgICAgLSBuYW1lOiBTZXQgdXAgUHl0aG9uICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0KKyAgICAgICAgaWQ6IHB5dGhvbgorICAgICAgICB1c2VzOiBhY3Rpb25zL3NldHVwLXB5dGhvbkB2Mi4yLjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBweXRob24tdmVyc2lvbjogJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgLSBuYW1lOiBHZW5lcmF0ZSBwYXJ0aWFsIFB5dGhvbiB2ZW52IHJlc3RvcmUga2V5CisgICAgICAgIGlkOiBnZW5lcmF0ZS1weXRob24ta2V5CisgICAgICAgIHJ1bjogPi0KKyAgICAgICAgICBlY2hvICI6OnNldC1vdXRwdXQgbmFtZT1rZXk6OnZlbnYtJHt7IGVudi5DQUNIRV9WRVJTSU9OIH19LSR7eworICAgICAgICAgICAgaGFzaEZpbGVzKCdzZXR1cC5jZmcnLCAncmVxdWlyZW1lbnRzX3Rlc3RfbWluLnR4dCcpCisgICAgICAgICAgfX0iCisgICAgICAtIG5hbWU6IFJlc3RvcmUgUHl0aG9uIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgaWQ6IGNhY2hlLXZlbnYKKyAgICAgICAgdXNlczogYWN0aW9ucy9jYWNoZUB2Mi4xLjYKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBwYXRoOiB2ZW52CisgICAgICAgICAga2V5OiA+LQorICAgICAgICAgICAgJHt7IHJ1bm5lci5vcyB9fS0ke3sgc3RlcHMucHl0aG9uLm91dHB1dHMucHl0aG9uLXZlcnNpb24gfX0tJHt7CisgICAgICAgICAgICBzdGVwcy5nZW5lcmF0ZS1weXRob24ta2V5Lm91dHB1dHMua2V5IH19CisgICAgICAgICAgcmVzdG9yZS1rZXlzOiB8CisgICAgICAgICAgICAke3sgcnVubmVyLm9zIH19LSR7eyBzdGVwcy5weXRob24ub3V0cHV0cy5weXRob24tdmVyc2lvbiB9fS12ZW52LSR7eyBlbnYuQ0FDSEVfVkVSU0lPTiB9fS0KKyAgICAgIC0gbmFtZTogQ3JlYXRlIFB5dGhvbiB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgIGlmOiBzdGVwcy5jYWNoZS12ZW52Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBweXRob24gLW0gdmVudiB2ZW52CisgICAgICAgICAgLiB2ZW52XFxTY3JpcHRzXFxhY3RpdmF0ZQorICAgICAgICAgIHB5dGhvbiAtbSBwaXAgaW5zdGFsbCAtVSBwaXAgc2V0dXB0b29scyB3aGVlbAorICAgICAgICAgIHBpcCBpbnN0YWxsIC1VIC1yIHJlcXVpcmVtZW50c190ZXN0X21pbi50eHQKKworICBweXRlc3Qtd2luZG93czoKKyAgICBuYW1lOiBSdW4gdGVzdHMgUHl0aG9uICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0gKFdpbmRvd3MpCisgICAgcnVucy1vbjogd2luZG93cy1sYXRlc3QKKyAgICBuZWVkczogcHJlcGFyZS10ZXN0cy13aW5kb3dzCisgICAgc3RyYXRlZ3k6CisgICAgICBmYWlsLWZhc3Q6IGZhbHNlCisgICAgICBtYXRyaXg6CisgICAgICAgIHB5dGhvbi12ZXJzaW9uOiBbMy42LCAzLjcsIDMuOCwgMy45LCAzLjEwLWRldl0KKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogU2V0IHRlbXAgZGlyZWN0b3J5CisgICAgICAgIHJ1bjogZWNobyAiVEVNUD0kZW52OlVTRVJQUk9GSUxFXEFwcERhdGFcTG9jYWxcVGVtcCIgPj4gJGVudjpHSVRIVUJfRU5WCisgICAgICAgICMgV29ya2Fyb3VuZCB0byBzZXQgY29ycmVjdCB0ZW1wIGRpcmVjdG9yeSBvbiBXaW5kb3dzCisgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvdmlydHVhbC1lbnZpcm9ubWVudHMvaXNzdWVzLzcxMgorICAgICAgLSBuYW1lOiBDaGVjayBvdXQgY29kZSBmcm9tIEdpdEh1YgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYyLjMuNAorICAgICAgLSBuYW1lOiBTZXQgdXAgUHl0aG9uICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0KKyAgICAgICAgaWQ6IHB5dGhvbgorICAgICAgICB1c2VzOiBhY3Rpb25zL3NldHVwLXB5dGhvbkB2Mi4yLjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICBweXRob24tdmVyc2lvbjogJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgLSBuYW1lOiBSZXN0b3JlIFB5dGhvbiB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgIGlkOiBjYWNoZS12ZW52CisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2FjaGVAdjIuMS42CisgICAgICAgIHdpdGg6CisgICAgICAgICAgcGF0aDogdmVudgorICAgICAgICAgIGtleToKKyAgICAgICAgICAgICR7eyBydW5uZXIub3MgfX0tJHt7IHN0ZXBzLnB5dGhvbi5vdXRwdXRzLnB5dGhvbi12ZXJzaW9uIH19LSR7eworICAgICAgICAgICAgbmVlZHMucHJlcGFyZS10ZXN0cy13aW5kb3dzLm91dHB1dHMucHl0aG9uLWtleSB9fQorICAgICAgLSBuYW1lOiBGYWlsIGpvYiBpZiBQeXRob24gY2FjaGUgcmVzdG9yZSBmYWlsZWQKKyAgICAgICAgaWY6IHN0ZXBzLmNhY2hlLXZlbnYub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIGVjaG8gIkZhaWxlZCB0byByZXN0b3JlIFB5dGhvbiB2ZW52IGZyb20gY2FjaGUiCisgICAgICAgICAgZXhpdCAxCisgICAgICAtIG5hbWU6IFJ1biBweXRlc3QKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgLiB2ZW52XFxTY3JpcHRzXFxhY3RpdmF0ZQorICAgICAgICAgIHB5dGVzdCAtLWJlbmNobWFyay1kaXNhYmxlIHRlc3RzLworCisgIHByZXBhcmUtdGVzdHMtcHlweToKKyAgICBuYW1lOiBQcmVwYXJlIHRlc3RzIGZvciBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBzdHJhdGVneToKKyAgICAgIG1hdHJpeDoKKyAgICAgICAgcHl0aG9uLXZlcnNpb246IFsicHlweTMiXQorICAgIG91dHB1dHM6CisgICAgICBweXRob24ta2V5OiAke3sgc3RlcHMuZ2VuZXJhdGUtcHl0aG9uLWtleS5vdXRwdXRzLmtleSB9fQorICAgIHN0ZXBzOgorICAgICAgLSBuYW1lOiBDaGVjayBvdXQgY29kZSBmcm9tIEdpdEh1YgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHYyLjMuNAorICAgICAgICB3aXRoOgorICAgICAgICAgIGZldGNoLWRlcHRoOiAwCisgICAgICAtIG5hbWU6IFNldCB1cCBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgICAgICBpZDogcHl0aG9uCisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHYyLjIuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19CisgICAgICAtIG5hbWU6IEdlbmVyYXRlIHBhcnRpYWwgUHl0aG9uIHZlbnYgcmVzdG9yZSBrZXkKKyAgICAgICAgaWQ6IGdlbmVyYXRlLXB5dGhvbi1rZXkKKyAgICAgICAgcnVuOiA+LQorICAgICAgICAgIGVjaG8gIjo6c2V0LW91dHB1dCBuYW1lPWtleTo6dmVudi0ke3sgZW52LkNBQ0hFX1ZFUlNJT04gfX0tJHt7CisgICAgICAgICAgICBoYXNoRmlsZXMoJ3NldHVwLmNmZycsICdyZXF1aXJlbWVudHNfdGVzdF9taW4udHh0JykKKyAgICAgICAgICB9fSIKKyAgICAgIC0gbmFtZTogUmVzdG9yZSBQeXRob24gdmlydHVhbCBlbnZpcm9ubWVudAorICAgICAgICBpZDogY2FjaGUtdmVudgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NhY2hlQHYyLjEuNgorICAgICAgICB3aXRoOgorICAgICAgICAgIHBhdGg6IHZlbnYKKyAgICAgICAgICBrZXk6ID4tCisgICAgICAgICAgICAke3sgcnVubmVyLm9zIH19LSR7eyBzdGVwcy5weXRob24ub3V0cHV0cy5weXRob24tdmVyc2lvbiB9fS0ke3sKKyAgICAgICAgICAgIHN0ZXBzLmdlbmVyYXRlLXB5dGhvbi1rZXkub3V0cHV0cy5rZXkgfX0KKyAgICAgICAgICByZXN0b3JlLWtleXM6IHwKKyAgICAgICAgICAgICR7eyBydW5uZXIub3MgfX0tJHt7IHN0ZXBzLnB5dGhvbi5vdXRwdXRzLnB5dGhvbi12ZXJzaW9uIH19LXZlbnYtJHt7IGVudi5DQUNIRV9WRVJTSU9OIH19LQorICAgICAgLSBuYW1lOiBDcmVhdGUgUHl0aG9uIHZpcnR1YWwgZW52aXJvbm1lbnQKKyAgICAgICAgaWY6IHN0ZXBzLmNhY2hlLXZlbnYub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIHB5dGhvbiAtbSB2ZW52IHZlbnYKKyAgICAgICAgICAuIHZlbnYvYmluL2FjdGl2YXRlCisgICAgICAgICAgcHl0aG9uIC1tIHBpcCBpbnN0YWxsIC1VIHBpcCBzZXR1cHRvb2xzIHdoZWVsCisgICAgICAgICAgcGlwIGluc3RhbGwgLVUgLXIgcmVxdWlyZW1lbnRzX3Rlc3RfbWluLnR4dAorCisgIHB5dGVzdC1weXB5OgorICAgIG5hbWU6IFJ1biB0ZXN0cyBQeXRob24gJHt7IG1hdHJpeC5weXRob24tdmVyc2lvbiB9fQorICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKKyAgICBuZWVkczogcHJlcGFyZS10ZXN0cy1weXB5CisgICAgc3RyYXRlZ3k6CisgICAgICBmYWlsLWZhc3Q6IGZhbHNlCisgICAgICBtYXRyaXg6CisgICAgICAgIHB5dGhvbi12ZXJzaW9uOiBbInB5cHkzIl0KKyAgICBzdGVwczoKKyAgICAgIC0gbmFtZTogQ2hlY2sgb3V0IGNvZGUgZnJvbSBHaXRIdWIKKyAgICAgICAgdXNlczogYWN0aW9ucy9jaGVja291dEB2Mi4zLjQKKyAgICAgIC0gbmFtZTogU2V0IHVwIFB5dGhvbiAke3sgbWF0cml4LnB5dGhvbi12ZXJzaW9uIH19CisgICAgICAgIGlkOiBweXRob24KKyAgICAgICAgdXNlczogYWN0aW9ucy9zZXR1cC1weXRob25AdjIuMi4yCisgICAgICAgIHdpdGg6CisgICAgICAgICAgcHl0aG9uLXZlcnNpb246ICR7eyBtYXRyaXgucHl0aG9uLXZlcnNpb24gfX0KKyAgICAgIC0gbmFtZTogUmVzdG9yZSBQeXRob24gdmlydHVhbCBlbnZpcm9ubWVudAorICAgICAgICBpZDogY2FjaGUtdmVudgorICAgICAgICB1c2VzOiBhY3Rpb25zL2NhY2hlQHYyLjEuNgorICAgICAgICB3aXRoOgorICAgICAgICAgIHBhdGg6IHZlbnYKKyAgICAgICAgICBrZXk6CisgICAgICAgICAgICAke3sgcnVubmVyLm9zIH19LSR7eyBzdGVwcy5weXRob24ub3V0cHV0cy5weXRob24tdmVyc2lvbiB9fS0ke3sKKyAgICAgICAgICAgIG5lZWRzLnByZXBhcmUtdGVzdHMtcHlweS5vdXRwdXRzLnB5dGhvbi1rZXkgfX0KKyAgICAgIC0gbmFtZTogRmFpbCBqb2IgaWYgUHl0aG9uIGNhY2hlIHJlc3RvcmUgZmFpbGVkCisgICAgICAgIGlmOiBzdGVwcy5jYWNoZS12ZW52Lm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJworICAgICAgICBydW46IHwKKyAgICAgICAgICBlY2hvICJGYWlsZWQgdG8gcmVzdG9yZSBQeXRob24gdmVudiBmcm9tIGNhY2hlIgorICAgICAgICAgIGV4aXQgMQorICAgICAgLSBuYW1lOiBSdW4gcHl0ZXN0CisgICAgICAgIHJ1bjogfAorICAgICAgICAgIC4gdmVudi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBweXRlc3QgLS1iZW5jaG1hcmstZGlzYWJsZSB0ZXN0cy8KZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sIGIvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2YWY2ZgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sCkBAIC0wLDAgKzEsMzcgQEAKK25hbWU6IFJlbGVhc2UKKworb246CisgIHJlbGVhc2U6CisgICAgdHlwZXM6CisgICAgICAtIHB1Ymxpc2hlZAorCitlbnY6CisgIERFRkFVTFRfUFlUSE9OOiAzLjkKKworam9iczoKKyAgcmVsZWFzZS1weXBpOgorICAgIG5hbWU6IFVwbG9hZCByZWxlYXNlIHRvIFB5UEkKKyAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CisgICAgc3RlcHM6CisgICAgICAtIG5hbWU6IENoZWNrIG91dCBjb2RlIGZyb20gR2l0aHViCisgICAgICAgIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIuMy40CisgICAgICAtIG5hbWU6IFNldCB1cCBQeXRob24gJHt7IGVudi5ERUZBVUxUX1BZVEhPTiB9fQorICAgICAgICBpZDogcHl0aG9uCisgICAgICAgIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHYyLjIuMgorICAgICAgICB3aXRoOgorICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAke3sgZW52LkRFRkFVTFRfUFlUSE9OIH19CisgICAgICAtIG5hbWU6IEluc3RhbGwgcmVxdWlyZW1lbnRzCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIHB5dGhvbiAtbSBwaXAgaW5zdGFsbCAtVSBwaXAgdHdpbmUgd2hlZWwKKyAgICAgICAgICBweXRob24gLW0gcGlwIGluc3RhbGwgLVUgInNldHVwdG9vbHM+PTU2LjAuMCIKKyAgICAgIC0gbmFtZTogQnVpbGQgZGlzdHJpYnV0aW9ucworICAgICAgICBydW46IHwKKyAgICAgICAgICBweXRob24gc2V0dXAucHkgc2Rpc3QgYmRpc3Rfd2hlZWwKKyAgICAgIC0gbmFtZTogVXBsb2FkIHRvIFB5UEkKKyAgICAgICAgaWY6IGdpdGh1Yi5ldmVudF9uYW1lID09ICdyZWxlYXNlJyAmJiBzdGFydHNXaXRoKGdpdGh1Yi5yZWYsICdyZWZzL3RhZ3MnKQorICAgICAgICBlbnY6CisgICAgICAgICAgVFdJTkVfUkVQT1NJVE9SWTogcHlwaQorICAgICAgICAgIFRXSU5FX1VTRVJOQU1FOiBfX3Rva2VuX18KKyAgICAgICAgICBUV0lORV9QQVNTV09SRDogJHt7IHNlY3JldHMuUFlQSV9BUElfVE9LRU4gfX0KKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgdHdpbmUgdXBsb2FkIC0tdmVyYm9zZSBkaXN0LyoKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTYwNjEKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjEgQEAKKyMgRG8gbm90IGFkZCBlbnRyaWVzIHNwZWNpZmljIHRvIHlvdXIgZGV2IGVudmlyb25tZW50IG9yIGRldmVsb3BtZW50CisjIHByZWZlcmVuY2VzIGluIHRoaXMgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGdsb2JhbCAuZ2l0aWdub3JlIGZvciB0aGF0OgorIyBnaXQgY29uZmlnIC0tZ2xvYmFsIGNvcmUuZXhjbHVkZXNGaWxlICd+Ly5naXRpZ25vcmUnCisvbG9nCisqLnB5W2NvZF0KKy9idWlsZAorL2RvYy9fYnVpbGQKKy9kaXN0LworL3B5bGludC5lZ2ctaW5mby8KKy50b3gKKyouc3dbYS16XQorZG9jL3RlY2huaWNhbF9yZWZlcmVuY2UvZXh0ZW5zaW9ucy5yc3QKK2RvYy90ZWNobmljYWxfcmVmZXJlbmNlL2ZlYXR1cmVzLnJzdAorcHl2ZQorYnVpbGQtc3RhbXAKKy5jb3ZlcmFnZQorLmNvdmVyYWdlLioKKy5jYWNoZS8KKy5lZ2dzLworLnB5dGVzdF9jYWNoZS8KKy5teXB5X2NhY2hlLwpkaWZmIC0tZ2l0IGEvLnByZS1jb21taXQtY29uZmlnLnlhbWwgYi8ucHJlLWNvbW1pdC1jb25maWcueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYzMGJmCi0tLSAvZGV2L251bGwKKysrIGIvLnByZS1jb21taXQtY29uZmlnLnlhbWwKQEAgLTAsMCArMSw4NiBAQAorY2k6CisgIHNraXA6IFtweWxpbnRdCisKK3JlcG9zOgorICAtIHJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmUtY29tbWl0L3ByZS1jb21taXQtaG9va3MKKyAgICByZXY6IHY0LjAuMQorICAgIGhvb2tzOgorICAgICAgLSBpZDogdHJhaWxpbmctd2hpdGVzcGFjZQorICAgICAgICBleGNsdWRlOiAidGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX3doaXRlc3BhY2VzLnB5IgorICAgICAgLSBpZDogZW5kLW9mLWZpbGUtZml4ZXIKKyAgICAgICAgZXhjbHVkZTogInRlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZmluYWxfbmV3bGluZS5weXx0ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfbmV3bGluZXMucHkiCisgIC0gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL215aW50L2F1dG9mbGFrZQorICAgIHJldjogdjEuNAorICAgIGhvb2tzOgorICAgICAgLSBpZDogYXV0b2ZsYWtlCisgICAgICAgIGV4Y2x1ZGU6ICZmaXh0dXJlcyB0ZXN0cy9mdW5jdGlvbmFsL3x0ZXN0cy9pbnB1dHx0ZXN0cy9leHRlbnNpb25zL2RhdGF8dGVzdHMvcmVncnRlc3RfZGF0YS98dGVzdHMvZGF0YS8KKyAgICAgICAgYXJnczoKKyAgICAgICAgICAtIC0taW4tcGxhY2UKKyAgICAgICAgICAtIC0tcmVtb3ZlLWFsbC11bnVzZWQtaW1wb3J0cworICAgICAgICAgIC0gLS1leHBhbmQtc3Rhci1pbXBvcnRzCisgICAgICAgICAgLSAtLXJlbW92ZS1kdXBsaWNhdGUta2V5cworICAgICAgICAgIC0gLS1yZW1vdmUtdW51c2VkLXZhcmlhYmxlcworICAtIHJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9hc290dGlsZS9weXVwZ3JhZGUKKyAgICByZXY6IHYyLjE5LjQKKyAgICBob29rczoKKyAgICAgIC0gaWQ6IHB5dXBncmFkZQorICAgICAgICBhcmdzOiBbLS1weTM2LXBsdXNdCisgICAgICAgIGV4Y2x1ZGU6ICpmaXh0dXJlcworICAtIHJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9pc29ydAorICAgIHJldjogNS44LjAKKyAgICBob29rczoKKyAgICAgIC0gaWQ6IGlzb3J0CisgIC0gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL3BzZi9ibGFjaworICAgIHJldjogMjEuNmIwCisgICAgaG9va3M6CisgICAgICAtIGlkOiBibGFjaworICAgICAgICBhcmdzOiBbLS1zYWZlLCAtLXF1aWV0XQorICAgICAgICBleGNsdWRlOiAqZml4dHVyZXMKKyAgLSByZXBvOiBodHRwczovL2dpdGh1Yi5jb20vUGllcnJlLVNhc3NvdWxhcy9ibGFjay1kaXNhYmxlLWNoZWNrZXIvCisgICAgcmV2OiAxLjAuMQorICAgIGhvb2tzOgorICAgICAgLSBpZDogYmxhY2stZGlzYWJsZS1jaGVja2VyCisgIC0gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL2ZsYWtlOAorICAgIHJldjogMy45LjIKKyAgICBob29rczoKKyAgICAgIC0gaWQ6IGZsYWtlOAorICAgICAgICBleGNsdWRlOiAqZml4dHVyZXMKKyAgLSByZXBvOiBsb2NhbAorICAgIGhvb2tzOgorICAgICAgLSBpZDogcHlsaW50CisgICAgICAgIG5hbWU6IHB5bGludAorICAgICAgICBlbnRyeTogcHlsaW50CisgICAgICAgIGxhbmd1YWdlOiBzeXN0ZW0KKyAgICAgICAgdHlwZXM6IFtweXRob25dCisgICAgICAgIGFyZ3M6CisgICAgICAgICAgWworICAgICAgICAgICAgIi1ybiIsCisgICAgICAgICAgICAiLXNuIiwKKyAgICAgICAgICAgICItLXJjZmlsZT1weWxpbnRyYyIsCisgICAgICAgICAgICAiLS1sb2FkLXBsdWdpbnM9cHlsaW50LmV4dGVuc2lvbnMuZG9jcGFyYW1zIiwKKyAgICAgICAgICBdCisgICAgICAgICMgZGlzYWJsZWQgcGx1Z2luczogcHlsaW50LmV4dGVuc2lvbnMubWNjYWJlCisgICAgICAgIGV4Y2x1ZGU6IHRlc3RzL2Z1bmN0aW9uYWwvfHRlc3RzL2lucHV0fHRlc3RzL2V4dGVuc2lvbnMvZGF0YXx0ZXN0cy9yZWdydGVzdF9kYXRhL3x0ZXN0cy9kYXRhL3xkb2MvCisgICAgICAtIGlkOiBmaXgtZG9jdW1lbnRhdGlvbgorICAgICAgICBuYW1lOiBGaXggZG9jdW1lbnRhdGlvbgorICAgICAgICBlbnRyeTogcHl0aG9uMyAtbSBzY3JpcHQuZml4X2RvY3VtZW50YXRpb24KKyAgICAgICAgbGFuZ3VhZ2U6IHN5c3RlbQorICAgICAgICB0eXBlczogW3RleHRdCisgICAgICAgIGZpbGVzOiBeKENoYW5nZUxvZ3xkb2Mvd2hhdHNuZXcvXGQrXC5cZCtcLnJzdCkKKyAgLSByZXBvOiBodHRwczovL2dpdGh1Yi5jb20vcHJlLWNvbW1pdC9taXJyb3JzLW15cHkKKyAgICByZXY6IHYwLjkwMgorICAgIGhvb2tzOgorICAgICAgLSBpZDogbXlweQorICAgICAgICBuYW1lOiBteXB5CisgICAgICAgIGVudHJ5OiBteXB5CisgICAgICAgIGxhbmd1YWdlOiBweXRob24KKyAgICAgICAgdHlwZXM6IFtweXRob25dCisgICAgICAgIGFyZ3M6IFtdCisgICAgICAgIHJlcXVpcmVfc2VyaWFsOiB0cnVlCisgICAgICAgIGFkZGl0aW9uYWxfZGVwZW5kZW5jaWVzOiBbInR5cGVzLXBrZ19yZXNvdXJjZXM9PTAuMS4yIiwgInR5cGVzLXRvbWw9PTAuMS4yIl0KKyAgICAgICAgZXhjbHVkZTogdGVzdHMvZnVuY3Rpb25hbC98dGVzdHMvaW5wdXR8dGVzdHMvZXh0ZW5zaW9ucy9kYXRhfHRlc3RzL3JlZ3J0ZXN0X2RhdGEvfHRlc3RzL2RhdGEvfGRvYy98YmluLworICAtIHJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmUtY29tbWl0L21pcnJvcnMtcHJldHRpZXIKKyAgICByZXY6IHYyLjMuMQorICAgIGhvb2tzOgorICAgICAgLSBpZDogcHJldHRpZXIKKyAgICAgICAgYXJnczogWy0tcHJvc2Utd3JhcD1hbHdheXMsIC0tcHJpbnQtd2lkdGg9ODhdCmRpZmYgLS1naXQgYS8ucHJlLWNvbW1pdC1ob29rcy55YW1sIGIvLnByZS1jb21taXQtaG9va3MueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVjMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvLnByZS1jb21taXQtaG9va3MueWFtbApAQCAtMCwwICsxLDYgQEAKKy0gaWQ6IHB5bGludAorICBuYW1lOiBweWxpbnQKKyAgZW50cnk6IHB5bGludAorICBsYW5ndWFnZTogcHl0aG9uCisgIHR5cGVzOiBbcHl0aG9uXQorICByZXF1aXJlX3NlcmlhbDogdHJ1ZQpkaWZmIC0tZ2l0IGEvLnJlYWR0aGVkb2NzLnlhbWwgYi8ucmVhZHRoZWRvY3MueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2UyNWRmCi0tLSAvZGV2L251bGwKKysrIGIvLnJlYWR0aGVkb2NzLnlhbWwKQEAgLTAsMCArMSwxMSBAQAorIyBTZWUgaHR0cHM6Ly9kb2NzLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS9jb25maWctZmlsZS92Mi5odG1sIGZvciBkZXRhaWxzCisKK3ZlcnNpb246IDIKKworc3BoaW54OgorICBjb25maWd1cmF0aW9uOiBkb2MvY29uZi5weQorCitweXRob246CisgIHZlcnNpb246IDMuNworICBpbnN0YWxsOgorICAgIC0gcmVxdWlyZW1lbnRzOiBkb2MvcmVxdWlyZW1lbnRzLnR4dApkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUT1JTLnR4dCBiL0NPTlRSSUJVVE9SUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZTdmZgotLS0gL2Rldi9udWxsCisrKyBiL0NPTlRSSUJVVE9SUy50eHQKQEAgLTAsMCArMSw1MDUgQEAKK++7v0NvbnRyaWJ1dG9ycworLS0tLS0tLS0tLS0tCisKK0N1cnJlbnQgdGVhbToKKworKiBBc2hsZXkgV2hldHRlcjogbWFpbnRhaW5lciwgY29udHJpYnV0b3IKKworKiBCcnljZSBHdWludGE6IG1haW50YWluZXIsIGNvbnRyaWJ1dG9yCisKKyogQ2xhdWRpdSBQb3BhOiBtYWludGFpbmVyLCBjb250cmlidXRvcgorCisqIENhcmEgVmluc29uOiBhc3Ryb2lkIGNvbW1pdHRlci4KKworKiBHdWlsbGF1bWUgUGVpbGxleDogY29tbWl0dGVyCisKKyogxYF1a2FzeiBSb2dhbHNraTogY29tbWl0dGVyLgorCisqIFJveSBXaWxsaWFtcyAoTHlmdCk6IGNvbW1pdHRlcgorCisgIGFkZGVkIGNoZWNrIGZvciBpbXBsZW1lbnRpbmcgX19lcV9fIHdpdGhvdXQgaW1wbGVtZW50aW5nIF9faGFzaF9fLAorICBBZGRlZCBQeXRob24gMyBjaGVjayBmb3IgYWNjZXNzaW5nIEV4Y2VwdGlvbi5tZXNzYWdlLgorICBBZGRlZCBQeXRob24gMyBjaGVjayBmb3IgY2FsbGluZyBlbmNvZGUvZGVjb2RlIHdpdGggaW52YWxpZCBjb2RlY3MuCisgIEFkZGVkIFB5dGhvbiAzIGNoZWNrIGZvciBhY2Nlc3Npbmcgc3lzLm1heGludC4KKyAgQWRkZWQgUHl0aG9uIDMgY2hlY2sgZm9yIGJhZCBpbXBvcnQgc3RhdGVtZW50cy4KKyAgQWRkZWQgUHl0aG9uIDMgY2hlY2sgZm9yIGFjY2Vzc2luZyBkZXByZWNhdGVkIG1ldGhvZHMgb24gdGhlICdzdHJpbmcnIG1vZHVsZSwKKyAgdmFyaW91cyBwYXRjaGVzLgorCisqIERtaXRyeSBQcmlieXNoOiBjb21taXR0ZXIKKworICBtdWx0aXBsZS1pbXBvcnRzLCBub3QtaXRlcmFibGUsIG5vdC1hLW1hcHBpbmcsIHZhcmlvdXMgcGF0Y2hlcy4KKworKiBKaW0gUm9iZXJ0c29uOiBjb21taXR0ZXIKKworRXgtbWFpbnRhaW5lcnM6CisKKyogU3lsdmFpbiBUaGVuYXVsdCAoTG9naWxhYik6IG1haW4gYXV0aG9yIC8gbWFpbnRhaW5lcgorCisqIFRvcnN0ZW4gTWFyZWsgKEdvb2dsZSk6IGNvbW1pdHRlciAvIGNvbnRyaWJ1dG9yCisKKworV2Ugd291bGQgbm90IGJlIGhlcmUgd2l0aG91dCBmb2xrcyB0aGF0IGNvbnRyaWJ1dGVkIHBhdGNoZXMsIHB1bGwgcmVxdWVzdHMsCitpc3N1ZXMgYW5kIHRoZWlyIHRpbWUgdG8gcHlsaW50LiBXZSdyZSBpbmNyZWRpYmx5IGdyYXRlZnVsIHRvIGFsbCBvZiB0aGVzZQorY29udHJpYnV0b3JzOgorCisKKyogRGFuaWVsIEJhbHBhcmRhIChHb29nbGUpOiBHUHlMaW50IG1haW50YWluZXIgKEdvb2dsZSdzIHB5bGludCB2YXJpYW50KSwKKyAgdmFyaW91cyBwYXRjaGVzCisKKyogTWFydGluIFBvb2wgKEdvb2dsZSk6IHdhcm5pbmdzIGZvciBhbm9tYWxvdXMgYmFja3NsYXNoZXMsIHN5bWJvbGljIG5hbWVzIGZvcgorICBtZXNzYWdlcyAobGlrZSAndW51c2VkJyksIGV0YworCisqIEFsZXhhbmRyZSBGYXlvbGxlIChMb2dpbGFiKTogVGtJbnRlciBndWksIGRvY3VtZW50YXRpb24sIGRlYmlhbiBzdXBwb3J0CisKKyogSnVsaWVuIENyaXN0YXUsIEVtaWxlIEFuY2xpbiAoTG9naWxhYik6IHB5dGhvbiAzIHN1cHBvcnQKKworKiBTYW5kcm8gVG9zaTogRGViaWFuIHBhY2thZ2luZworCisqIE1hZHMgS2lpbGVyaWNoLCBCb3JpcyBGZWxkLCBCaWxsIFdlbmRsaW5nLCBTZWJhc3RpYW4gVWxyaWNoOgorICB2YXJpb3VzIHBhdGNoZXMKKworKiBCcmlhbiB2YW4gZGVuIEJyb2VrOiB3aW5kb3dzIGluc3RhbGxhdGlvbiBkb2N1bWVudGF0aW9uCisKKyogQW1hdXJ5IEZvcmdlb3QgZCdBcmM6IGNoZWNrIG5hbWVzIGltcG9ydGVkIGZyb20gYSBtb2R1bGUgZXhpc3RzIGluIHRoZSBtb2R1bGUKKworKiBCZW5qYW1pbiBOaWVtYW5uOiBhbGxvdyBibG9jayBsZXZlbCBlbmFibGluZy9kaXNhYmxpbmcgb2YgbWVzc2FnZXMKKworKiBOYXRoYW5pZWwgTWFuaXN0YTogc3VzcGljaW91cyBsYW1iZGEgY2hlY2tpbmcKKworKiBEYXZpZCBTaGVhOiBpbnZhbGlkIHNlcXVlbmNlIGFuZCBzbGljZSBpbmRleAorCisqIENhcmwgQ3Jvd2RlcjogZG9uJ3QgZXZhbHVhdGUgdGhlIHZhbHVlIG9mIGFyZ3VtZW50cyBmb3IgJ2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlJworCisqIE1pY2hhbCBOb3dpa293c2tpOiB3cm9uZy1zcGVsbGluZy1pbi1jb21tZW50LCB3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmcsCisgIHBhcmFsbGVsIGV4ZWN1dGlvbiBvbiBtdWx0aXBsZSBDUFVzIGFuZCBvdGhlciBwYXRjaGVzLgorCisqIERhdmlkIExpbmRxdWlzdDogbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbiB3YXJuaW5nLgorCisqIEJyZXR0IENhbm5vbjogUG9ydCBzb3VyY2UgY29kZSB0byBiZSBQeXRob24gMi8zIGNvbXBhdGlibGUsIFB5dGhvbiAzCisgIGNoZWNrZXIuCisKKyogVmxhZCBUZW1pYW46IHJlZHVuZGFudC11bml0dGVzdC1hc3NlcnQgYW5kIHRoZSBKU09OIHJlcG9ydGVyLgorCisqIENvc21pbiBQb2llYW7EgzogdW5pY2hyLWJ1aWx0aW4gYW5kIGltcHJvdmVtZW50cyB0byBiYWQtb3Blbi1tb2RlLgorCisqIFZpb3JlbCDImHRpcmJ1OiBpbnRlcm4tYnVpbHRpbiB3YXJuaW5nLgorCisqIERhbiBHb2xkc21pdGg6IHN1cHBvcnQgZm9yIG1zZy10ZW1wbGF0ZSBpbiBIVE1MIHJlcG9ydGVyLgorCisqIENocmlzIFJlYmVydDogdW5pZGlvbWF0aWMtdHlwZWNoZWNrLgorCisqIFN0ZXZlbiBNeWludDogZHVwbGljYXRlLWV4Y2VwdC4KKworKiBSYWR1IENpb3JiYTogbm90LWNvbnRleHQtbWFuYWdlciBhbmQgY29uZnVzaW5nLXdpdGgtc3RhdGVtZW50IHdhcm5pbmdzLgorCisqIEJydW5vIERhbmllbDogY2hlY2tfZG9jcyBleHRlbnNpb24uCisKKyogSmFtZXMgTW9yZ2Vuc2VuOiBpZ25vcmVkLW1vZHVsZXMgb3B0aW9uIGFwcGxpZXMgdG8gaW1wb3J0IGVycm9ycy4KKworKiBDZXphciBFbG5hemxpOiBkZXByZWNhdGVkLW1ldGhvZAorCisqIFN0w6lwaGFuZSBXaXJ0ZWw6IG5vbmxvY2FsLXdpdGhvdXQtYmluZGluZworCisqIExhdXJhIE1lZGlvbmkgKExvZ2lsYWIsIG9uIGJlaGFsZiBvZiB0aGUgQ05FUyk6IG1pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50LAorICBuby1jbGFzc21ldGhvZC1kZWNvcmF0b3IsIG5vLXN0YXRpY21ldGhvZC1kZWNvcmF0b3IsIHRvby1tYW55LW5lc3RlZC1ibG9ja3MsCisgIHRvby1tYW55LWJvb2xlYW4tZXhwcmVzc2lvbnMsIHVubmVlZGVkLW5vdCwgd3JvbmctaW1wb3J0LW9yZGVyLCB1bmdyb3VwZWQtaW1wb3J0cywKKyAgd3JvbmctaW1wb3J0LXBvc2l0aW9uLCByZWRlZmluZWQtdmFyaWFibGUtdHlwZQorCisqIEFydSBTYWhuaTogR2l0IGlnbm9yaW5nLCByZWdleC1iYXNlZCBpZ25vcmVzCisKKyogTWlrZSBGcnlzaW5nZXI6IGNvbnRyaWJ1dG9yLgorCisqIE1vaXPDqXMgTMOzcGV6IChWYXV4b28pOiBTdXBwb3J0IGZvciBkZXByZWNhdGVkLW1vZHVsZXMgaW4gbW9kdWxlcyBub3QgaW5zdGFsbGVkLAorICBSZWZhY3RvciB3cm9uZy1pbXBvcnQtb3JkZXIgdG8gaW50ZWdyYXRlIGl0IHdpdGggYGlzb3J0YCBsaWJyYXJ5CisgIEFkZCBjaGVjayB0b28tY29tcGxleCB3aXRoIG1jY2FiZSBmb3IgY3ljbG9tYXRpYyBjb21wbGV4aXR5CisgIFJlZmFjdG9yIHdyb25nLWltcG9ydC1wb3NpdGlvbiB0byBza2lwIHRyeS1pbXBvcnQgYW5kIG5lc3RlZCBjYXNlcworICBBZGQgY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlLCBzdXBlcmZsdW91cy1lbHNlLXJldHVybgorICBGaXggY29uc2lkZXItdXNpbmctdGVybmFyeSBmb3IgJ1RydWUgYW5kIFRydWUgYW5kIFRydWUgb3IgVHJ1ZScgY2FzZQorCisqIEx1aXMgRXNjb2JhciAoVmF1eG9vKSwgTW9pc8OpcyBMw7NwZXogKFZhdXhvbyk6IEFkZCBiYWQtZG9jc3RyaW5nLXF1b3RlcyBhbmQgZG9jc3RyaW5nLWZpcnN0LWxpbmUtZW1wdHkKKworKiBZYW5uaWNrIEJyZWhvbjogY29udHJpYnV0b3IuCisKKyogR2xlbm4gTWF0dGhld3M6IGF1dG9nZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBmb3Igb3B0aW9uYWwgZXh0ZW5zaW9ucywKKyAgYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgZm9yIGRvY3BhcmFtcyAobsOpZSBjaGVja19kb2NzKSBleHRlbnNpb24KKworKiBFbGlhcyBEb3JuZWxlczogbWlub3IgYWRqdXN0IHRvIGNvbmZpZyBkZWZhdWx0cyBhbmQgZG9jcworCisqIFl1cmkgQm9jaGthcmV2OiBBZGRlZCBlcHl0ZXh0IHN1cHBvcnQgdG8gZG9jcGFyYW1zIGV4dGVuc2lvbi4KKworKiBBbGV4YW5kZXIgVG9kb3JvdjogYWRkZWQgbmV3IGVycm9yIGNvbmRpdGlvbnMgdG8gJ2JhZC1zdXBlci1jYWxsJywKKyAgQWRkZWQgbmV3IGNoZWNrIGZvciBpbmNvcnJlY3QgbGVuKFNFUVVFTkNFKSB1c2FnZSwKKyAgQWRkZWQgbmV3IGV4dGVuc2lvbiBmb3IgY29tcGFyaXNvbiBhZ2FpbnN0IGVtcHR5IHN0cmluZyBjb25zdGFudHMsCisgIEFkZGVkIG5ldyBleHRlbnNpb24gd2hpY2ggZGV0ZWN0cyBjb21wYXJpbmcgaW50ZWdlcnMgdG8gemVybywKKyAgQWRkZWQgbmV3IHVzZWxlc3MtcmV0dXJuIGNoZWNrZXIsCisgIEFkZGVkIG5ldyB0cnktZXhjZXB0LXJhaXNlIGNoZWNrZXIKKworKiBFcmlrIEVyaWtzc29uIC0gQWRkZWQgb3ZlcmxhcHBpbmctZXhjZXB0IGVycm9yIGNoZWNrLgorCisqIEFudGhvbnkgRm9nbGlhIChHb29nbGUpOiBBZGRlZCBzaW1wbGUgc3RyaW5nIHNsb3RzIGNoZWNrLgorCisqIERlcmVrIEd1c3RhZnNvbjogY29udHJpYnV0b3IKKworKiBQZXRyIFB1bGM6IHJlcXVpcmUgd2hpdGVzcGFjZSBhcm91bmQgYW5ub3RhdGlvbnMKKworKiBKb2huIFBhcmFza2V2b3BvdWxvczogYWRkICdkaWZmZXJpbmctcGFyYW0tZG9jJyBhbmQgJ2RpZmZlcmluZy10eXBlLWRvYycKKworKiBNYXJ0aW4gdm9uIEdhZ2VybiAoR29vZ2xlKTogQWRkZWQgJ3JhaXNpbmctZm9ybWF0LXR1cGxlJyB3YXJuaW5nLgorCisqIEFoaXJuaXNoIFBhcmVlaywgJ2tleXdvcmQtYXJnLWJlZm9yZS12YXItYXJnJyBjaGVjaworCisqIERhbmllbCBNaWxsZXI6IGNvbnRyaWJ1dG9yLgorCisqIEJyeWNlIEd1aW50YTogY29udHJpYnV0b3IKKworKiBNYXJ0aW4gQmHFoXRpOiBjb250cmlidXRvcgorICBBZGRlZCBuZXcgY2hlY2sgZm9yIHNoYWxsb3cgY29weSBvZiBvcy5lbnZpcm9uCisKKyogSmFjcXVlcyBLdmFtOiBjb250cmlidXRvcgorCisqIEJyaWFuIFNoYWdpbmF3OiBwcmV2ZW50IGVycm9yIG9uIGV4Y2VwdGlvbiBjaGVjayBmb3IgZnVuY3Rpb25zCisKKyogSW9hbmEgVGFnaXJ0YTogZml4IGJhZCB0aHJlYWQgaW5zdGFudGlhdGlvbiBjaGVjaworCisqIFJldmVyYiBDaHU6IGNvbnRyaWJ1dG9yCisKKyogVG9iaWFzIEhlcm5zdGlnOiBjb250cmlidXRvcgorCisqIEtvbnN0YW50aW4gTWFubmE6IGNvbnRyaWJ1dG9yCisKKyogQW5kcmVhcyBGcmVpbXV0aDogZml4IGluZGVudGF0aW9uIGNoZWNraW5nIHdpdGggdGFicworCisqIFJlbmF0IEdhbGltb3Y6IGNvbnRyaWJ1dG9yCisKKyogVGhvbWFzIFNub3dkZW46IGZpeCBtaXNzaW5nLWRvY3N0cmluZyBmb3IgaW5uZXIgZnVuY3Rpb25zCisKKyogTWl0Y2hlbGwgWW91bmc6IG1pbm9yIGFkanVzdG1lbnQgdG8gZG9jcGFyYW1zCisKKyogTWFyaWFubmEgUG9sYXRvZ2xvdTogbWlub3IgY29udHJpYnV0aW9uIGZvciB3aWxkY2FyZCBpbXBvcnQgY2hlY2sKKworKiBCZW4gR3JlZW46IGNvbnRyaWJ1dG9yCisKKyogQmVuamFtaW4gRnJlZW1hbjogY29udHJpYnV0b3IKKworKiBGdXJlaWdoOiBjb250cmlidXRvcgorCisqIEphY2UgQnJvd25pbmc6IHVwZGF0ZWQgZGVmYXVsdCByZXBvcnQgZm9ybWF0IHdpdGggY2xpY2thYmxlIHBhdGhzCisKKyogU3VzaG9iaGl0IChzdXNob2JoaXQyNyk6IGNvbnRyaWJ1dG9yCisgIEFkZGVkIG5ldyBjaGVjayAnY29tcGFyaXNvbi13aXRoLWl0c2VsZicuCisgIEFkZGVkIG5ldyBjaGVjayAndXNlbGVzcy1pbXBvcnQtYWxpYXMnLgorICBBZGRlZCBzdXBwb3J0IG9mIGFubm90YXRpb25zIGluIG1pc3NpbmctdHlwZS1kb2MgYW5kIG1pc3NpbmctcmV0dXJuLXR5cGUtZG9jLgorICBBZGRlZCBuZXcgY2hlY2sgJ2NvbXBhcmlzb24td2l0aC1jYWxsYWJsZScuCisgIFJlbW92ZWQgc2l4IHBhY2thZ2UgZGVwZW5kZW5jeS4KKyAgQWRkZWQgbmV3IGNoZWNrICdjaGFpbmVkLWNvbXBhcmlzb24nLgorICBBZGRlZCBuZXcgY2hlY2sgJ3VzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlJy4KKworKiBNYXJpYXR0YSBXaWpheWE6IGNvbnRyaWJ1dG9yCisgIEFkZGVkIG5ldyBjaGVjayBgbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb25gCisgIERvY3VtZW50YXRpb24gdHlwbyBmaXhlcworCisqIEphc29uIE93ZW46IGNvbnRyaWJ1dG9yCisKKyogTWFyayBSb21hbiBNaWxsZXI6IGZpeCBpbmxpbmUgZGVmcyBpbiB0b28tbWFueS1zdGF0ZW1lbnRzCisKKyogQWRhbSBEYW5nb29yOiBjb250cmlidXRvcgorCisqIEdhcnkgVHlsZXIgTWNMZW9kOiBjb250cmlidXRvcgorCisqIFdvbGZnYW5nIEdyYWZlbiwgQXhlbCBNdWxsZXIsIEZhYmlvIFphZHJvem55LCBQaWVycmUgUm91bGVhdSwKKyAgTWFhcnRlbiB0ZXIgSHV1cm5lLCBNaXJrbyBGcmllZGVuaGFnZW4gYW5kIGFsbCB0aGUgTG9naWxhYidzIHRlYW0gKGFtb25nIG90aGVycykuCisKKyogTWF0ZWogTWFydXNhazogY29udHJpYnV0b3IKKworKiBOaWNrIERyb3pkOiBjb250cmlidXRvciwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIGFzdHJvaWQKKworKiBLb3NhcmNodWsgU2VyZ2V5OiBjb250cmlidXRvcgorCisqIENhcmV5IE1ldGNhbGZlOiBkZW1vdGVkIGB0cnktZXhjZXB0LXJhaXNlYCBmcm9tIGVycm9yIHRvIHdhcm5pbmcKKworKiBNYXJjdXMgTsOkc2x1bmQgKG5hc2x1bmR4KTogY29udHJpYnV0b3IKKworKiBOYXRhbGllIFNlcmVicnlha292YTogY29udHJpYnV0b3IKKworKiBDYWlvIENhcnJhcmE6IGNvbnRyaWJ1dG9yCisKKyogUm9iZXJ0byBMZWluYXJkaTogUHlDaGFybSBwbHVnaW4gbWFpbnRhaW5lcgorCisqIEFpdmFyIEFubmFtYWE6IGNvbnRyaWJ1dG9yCisKKyogSG9ybndpdHNlcjogZml4IGltcG9ydCBncmFwaAorCisqIFl1cmkgR3JpYm92OiBjb250cmlidXRvcgorCisqIERyZXcgUmlzaW5nZXI6IGNvbW1pdHRlciAoZG9jcykKKworKiBCZW4gSmFtZXMKKworKiBUb21lciBDaGFjaGFtdSwgUmljaGFyZCBHb29kbWFuOiBzaW1wbGlmaWFibGUtaWYtZXhwcmVzc2lvbgorCisqIEFsYW4gQ2hhbjogY29udHJpYnV0b3IKKworKiBCZW5qYW1pbiBEcnVuZzogY29udHJpYnV0aW5nIERlYmlhbiBEZXZlbG9wZXIKKworKiBTY290dCBXb3JsZXk6IGNvbnRyaWJ1dG9yCisKKyogTWljaGFlbCBIdWRzb24tRG95bGUKKworKiBMdWNhcyBDaW1vbjogY29udHJpYnV0b3IKKworKiBNaWtlIE1pbGxlcjogY29udHJpYnV0b3IKKworKiBTZXJnZWkgTGViZWRldjogY29udHJpYnV0b3IKKworKiBTYXNoYSBCYWdhbgorCisqIFBhYmxvIEdhbGluZG8gU2FsZ2FkbzogY29udHJpYnV0b3IKKyAgRml4IGZhbHNlIHBvc2l0aXZlICdOb24taXRlcmFibGUgdmFsdWUnIHdpdGggYXN5bmMgY29tcHJlaGVuc2lvbnMuCisKKyogTWF0dXMgVmFsbworCisqIFNhcmRvcmJlayBJbW9tYWxpZXY6IGNvbnRyaWJ1dG9yCisKKyogSnVzdGluIExpIChqdXN0aW5uaGxpKQorCisqIE5pY29sYXMgRGlja3JldXRlcgorCisqIFBhc2NhbCBDb3JwZXQKKworKiBTdmV0b3NsYXYgTmV5a292OiBjb250cmlidXRvcgorCisqIEZlZGVyaWNvIEJvbmQ6IGNvbnRyaWJ1dG9yCisKKyogRmFudGl4IEtpbmcgKFVDaGljYWdvKTogY29udHJpYnV0b3IKKworKiBZb3J5ICh5b3J5OCk6IGNvbnRyaWJ1dG9yCisKKyogVGhvbWFzIEhpc2NoOiBjb250cmlidXRvcgorCisqIENsw6ltZW50IFBpdC1DbGF1ZGVsIDogY29udHJpYnV0b3IKKworKiBHb3VkY29kZTogY29udHJpYnV0b3IKKworKiBQYXVsIFJlbnZvaXNlIDogY29udHJpYnV0b3IKKworKiBCbHVlc2hlZXB0b2tlbjogY29udHJpYnV0b3IKKworKiBNaWNoYWVsIFNjb3R0IEN1dGhiZXJ0OiBjb250cmlidXRvcgorCisqIFBpZXJyZSBTYXNzb3VsYXMgOiBtYWludGFpbmVyLCBjb250cmlidXRvcgorCisqIE5hdGhhbiBNYXJyb3cKKworKiBUYWV3b24gS2ltIDogY29udHJpYnV0b3IKKworKiBEYW5paWwgS2hhcmtvdjogY29udHJpYnV0b3IKKworKiBUeWxlciBOLiBUaGllZGluZzogY29udHJpYnV0b3IKKworKiBaZWIgTmljaG9sbHM6IGNvbnRyaWJ1dG9yCisgICAgLSBNYWRlIFc5MDExIGNvbXBhdGlibGUgd2l0aCAnb2YnIHN5bnRheCBpbiByZXR1cm4gdHlwZXMKKworKiBNYXJ0aW4gVmllbHNtYWllcjogY29udHJpYnV0b3IKKworKiBBZ3VzdGluIFRvbGVkbzogY29udHJpYnV0b3IKKworKiBOaWNob2xhcyBTbWl0aDogY29udHJpYnV0b3IKKworKiBQZXRlciBLb2xidXMgKEdhcm1pbik6IGNvbnRyaWJ1dG9yCisKKyogT2lzaW4gTW9yYW46IGNvbnRyaWJ1dG9yCisKKyogQW5kcnplaiBLbGFqbmVydDogY29udHJpYnV0b3IKKworKiBBbmRyw6lzIFDDqXJleiBIb3J0YWw6IGNvbnRyaWJ1dG9yCisKKyogTmlrbyBXZW5zZWxvd3NraTogY29udHJpYnV0b3IKKworKiBEYW5ueSBIZXJtZXM6IGNvbnRyaWJ1dG9yCisKKyogRXJpYyBGcm9lbWxpbmc6IGNvbnRyaWJ1dG9yCisKKyogUm9iZXJ0IFNjaHdlaXplcjogY29udHJpYnV0b3IKKworKiBIdWdvIHZhbiBLZW1lbmFkZTogY29udHJpYnV0b3IKKworKiBNaWtoYWlsIEZlc2Vua286IGNvbnRyaWJ1dG9yCisKKyogVHJldm9yIEJla29sYXk6IGNvbnRyaWJ1dG9yCisgICAgLSBBZGRlZCAtLWxpc3QtbXNncy1lbmFibGVkIGNvbW1hbmQKKworKiBSw6ltaSBDYXJkb25hOiBjb250cmlidXRvcgorCisqIERhbmllbCBEcmFwZXI6IGNvbnRyaWJ1dG9yCisKKyogR2FicmllbCBSLiBTZXplZnJlZG86IGNvbnRyaWJ1dG9yCisgICAgLSBGaXhlZCAiZXhjZXB0aW9uLWVzY2FwZSIgZmFsc2UgcG9zaXRpdmUgd2l0aCBnZW5lcmF0b3JzCisKKyogbGFpa2U5bTogY29udHJpYnV0b3IKKworKiBKYW5uZSBSw7Zua2vDtjogY29udHJpYnV0b3IKKworKiBIdWd1ZXMgQnJ1YW50OiBjb250cmlidXRvcgorCisqIFRpbSBHYXRlczogY29udHJpYnV0b3IKKworKiBFbmppIENvb3BlcjogY29udHJpYnV0b3IKKworKiBCYXN0aWVuIFZhbGxldDogY29udHJpYnV0b3IKKworKiBQZWsgQ2hoYW46IGNvbnRyaWJ1dG9yCisKKyogQ3JhaWcgSGVucmlxdWVzOiBjb250cmlidXRvcgorCisqIE1hdHRoaWpzIEJsb206IGNvbnRyaWJ1dG9yCisKKyogQW5keSBQYWxtZXI6IGNvbnRyaWJ1dG9yCisKKyogV2VzIFR1cm5lciAoR29vZ2xlKTogYWRkZWQgbmV3IGNoZWNrICdpbmNvbnNpc3RlbnQtcXVvdGVzJworCisqIEF0aG9zIFJpYmVpcm8KKyAgICBGaXhlZCBkaWN0LWtleXMtbm90LWl0ZXJhdGluZyBmYWxzZSBwb3NpdGl2ZSBmb3IgaW52ZXJzZSBjb250YWlubWVudCBjaGVja3MKKworKiBBbnViaGF2OiBjb250cmlidXRvcgorCisqIEJlbiBHcmFoYW06IGNvbnRyaWJ1dG9yCisKKyogQW50aG9ueSBUYW46IGNvbnRyaWJ1dG9yCisKKyogQmVubnkgTcO8bGxlcjogY29udHJpYnV0b3IKKworKiBCZXJuaWUgR3JheTogY29udHJpYnV0b3IKKworKiBTbGF2Zm94OiBjb250cmlidXRvcgorCisqIE1hdHRoZXcgQmVja2VycyAobWF0dGxiZWNrKTogY29udHJpYnV0b3IKKworKiBZYW5nIFlhbmc6IGNvbnRyaWJ1dG9yCisKKyogQW5kcmV3IEouIFNpbW1vbnMgKGFuanNpbW1vKTogY29udHJpYnV0b3IKKworKiBEYW1pZW4gQmF0eTogY29udHJpYnV0b3IKKworKiBEYW5pZWwgUi4gTmVhbCAoZGFucm5lYWwpOiBjb250cmlidXRlcgorCisqIEplcmVteSBGbGVpc2NobWFuIChqZmx5KTogY29udHJpYnV0ZXIKKworKiBTaGl2IFZlbmthdGFzdWJyYWhtYW55YW0KKworKiBKb2NoZW4gUHJldXNjaGUgKGlpbGVpKTogY29udHJpYnV0b3IKKworKiBSYW0gUmFjaHVtIChjb29sLVJSKQorCisqIFBpZXRlciBFbmdlbGJyZWNodAorCisqIEV0aGFuIExlYmE6IGNvbnRyaWJ1dG9yCisKKyogTWF0xJtqIEdyYWJvdnNrw706IGNvbnRyaWJ1dG9yCisKKyogWWV0aW5nIExpICh5ZXRpbmdsaSk6IGNvbnRyaWJ1dG9yCisKKyogRnJvc3QgTWluZyAoZnJvc3RtaW5nKTogY29udHJpYnV0b3IKKworKiBMdWlnaSBCZXJ0YWNvIENyaXN0b2ZvbGluaSAobHVpZ2liZXJ0YWNvKTogY29udHJpYnV0b3IKKworKiBFbGkgRmluZSAoZWxpODhmaW5lKTogRml4ZWQgZmFsc2UgcG9zaXRpdmUgZHVwbGljYXRlIGNvZGUgd2FybmluZyBmb3IgbGluZXMgd2l0aCBzeW1ib2xzIG9ubHkKKworKiBHYW5kZW4gU2NoYWZmbmVyOiBjb250cmlidXRvcgorCisqIEpvc3NlbGluIEZlaXN0OiBjb250cmlidXRvcgorCisqIERhdmlkIENhaW46IGNvbnRyaWJ1dG9yCisKKyogUGVkcm8gQWxnYXJ2aW8gKHMwdW5kdDNjaCk6IGNvbnRyaWJ1dG9yCisKKyogTHVpZ2kgQmVydGFjbyBDcmlzdG9mb2xpbmkgKGx1aWdpYmVydGFjbyk6IGNvbnRyaWJ1dG9yCisKKyogT3IgQmFoYXJpCisKKyogSm9zaHVhIENhbm5vbjogY29udHJpYnV0b3IKKworKiBHaXVzZXBwZSBWYWxlbnRlOiBjb250cmlidXRvcgorCisqIFRha2FzaGkgSGlyYXNoaW1hOiBjb250cmlidXRvcgorCisqIEpvZmZyZXkgTWFuZGVyOiBjb250cmlidXRvcgorCisqIEp1bGllbiBQYWxhcmQ6IGNvbnRyaWJ1dG9yCisKKyogUmFwaGFlbCBHYXNjaGlnbmFyZDogY29udHJpYnV0b3IKKworKiBTb3JpbiBTYmFybmVhOiBjb250cmlidXRvcgorCisqIEdlcmdlbHkgS2FsbcOhcjogY29udHJpYnV0b3IKKworKiBCYXR1aGFuIFRhc2theWE6IGNvbnRyaWJ1dG9yCisKKyogRnJhbmsgSGFycmlzb24gKGRvdWJsZXRoZWZpc2gpOiBjb250cmlidXRvcgorCisqIEdhdXRoaWVyIFNlYmF1eDogY29udHJpYnV0b3IKKworKiBMb2dhbiBNaWxsZXIgKGtvbW9kbzQ3Mik6IGNvbnRyaWJ1dG9yCisKKyogTWF0dGhldyBTdW96em86IGNvbnRyaWJ1dG9yCisKKyogTWFyYyBNdWVsbGVyIChjZGNlOHApOiBjb250cmlidXRvcgorCisqIERhdmlkIEdpbG1hbjogY29udHJpYnV0b3IKKworKiBJa3JhZHV5YSBFZGlhbjogY29udHJpYnV0b3IKKyAgICAtIEFkZGVkIG5ldyBjaGVja3MgJ2NvbnNpZGVyLXVzaW5nLWdlbmVyYXRvcicgYW5kICd1c2UtYS1nZW5lcmF0b3InLgorCisqIFRpYWdvIEhvbm9yYXRvOiBjb250cmlidXRvcgorCisqIExlZnRlcmlzIEthcmFwZXRzYXM6IGNvbnRyaWJ1dG9yCisKKyogTG91aXMgU2F1dGllcjogY29udHJpYnV0b3IKKworKiBRdWVudGluIFlvdW5nOiBjb250cmlidXRvcgorCisqIEFsZXhhbmRlciBLYXBzaHVuYTogY29udHJpYnV0b3IKKworKiBNYXJrIEJ5cm5lOiBjb250cmlidXRvcgorCisqIEtvbnN0YW50aW5hIFNha2V0b3U6IGNvbnRyaWJ1dG9yCisKKyogQW5kcmV3IEhvd2U6IGNvbnRyaWJ1dG9yCisKKyogSmFtZXMgU2luY2xhaXIgKGlyZ2Vlayk6IGNvbnRyaWJ1dG9yCisKKyogQW5kcmVhcyBGaW5rbGVyOiBjb250cmlidXRvcgorCisqIEFpZGFuIEhhYXNlLCBFbGl6YWJldGggQm90dDogY29udHJpYnV0b3IKKworKiBTZWJhc3RpYW4gTcO8bGxlcjogY29udHJpYnV0b3IKKworKiBSYW1pcm8gTGVhbC1DYXZhem9zIChyYW1pcm8wNTApOiBGaXhlZCBidWcgcHJldmVudGluZyBweWxpbnQgZnJvbSB3b3JraW5nIHdpdGggZW1hY3MgdHJhbXAKKworKiBtYW5kZXJqOiBjb250cmlidXRvcgorCisqIHF3aWRkbGU6IGNvbnRyaWJ1dG9yCisKKyogZGFzLWludGVuc2l0eTogY29udHJpYnV0b3IKKworKiBKaWFqdW5zdSAodmljdG9yKTogY29udHJpYnV0b3IKKworKiBBbmRyZXcgSGFpZ2ggKG5lbGZpbik6IGNvbnRyaWJ1dG9yCisKKyogUGFuZyBZdSBTaGFvICh5dXNoYW8yKTogY29udHJpYnV0b3IKKworKiBBZGl0eWEgR3VwdGEgKGFkaXR5YWd1cHRhMTA4OSkgOiBjb250cmlidXRvcgorICAtIEFkZGVkIGlnbm9yZV9zaWduYXR1cmVzIHRvIGR1cGxpY2F0ZSBjaGVja2VyCisKKyogSmFjb2IgV2FsbHM6IGNvbnRyaWJ1dG9yCisKKyogcnVybzogY29udHJpYnV0b3IKKworKiBEYXZpZCBMaXUgKGRhdmlkLXl6LWxpdSk6IGNvbnRyaWJ1dG9yCisKKyogQmVybmFyZCBOYXV3ZWxhZXJ0czogY29udHJpYnV0b3IKKworKiBGYWJpYW4gRGFta2VuOiBjb250cmlidXRvcgorCisqIE1hcmt1cyBTaWViZW5oYWFyOiBjb250cmlidXRvcgorCisqIExvcmVuYSBCdWNpdSAobG9yZW5hLWIpOiBjb250cmlidXRvcgpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDEyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1NTUxIEBACistLS0tLS0tLS0tLS0tLS0tLS0KK1B5bGludCdzIENoYW5nZUxvZworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuOS4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZWxlYXNlIGRhdGU6IFRCQQorCisuLgorICBQdXQgbmV3IGZlYXR1cmVzIGFuZCBidWdmaXhlcyBoZXJlIGFuZCBhbHNvIGluICdkb2Mvd2hhdHNuZXcvMi45LnJzdCcKKworKiBgYHNldHVwdG9vbHNfc2NtYGAgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgYnkgYGB0YnVtcGBgIGluIG9yZGVyIHRvIG5vdAorICBoYXZlIGhpZGRlbiBydW50aW1lIGRlcGVuZGVuY2llcyB0byBzZXR1cHRvb2xzCisKKyogQXBwdmV5b3IgaXMgbm8gbG9uZ2VyIHVzZWQgaW4gdGhlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24KKworKiBBZGRlZCBgYGRlcHJlY2F0ZWQtZGVjb3JhdG9yYGA6IEVtaXR0ZWQgd2hlbiBkZXByZWNhdGVkIGRlY29yYXRvciBpcyB1c2VkLgorCisgIENsb3NlcyAjNDQyOQorCisqIEFkZGVkIGBgaWdub3JlLXBhdGhzYGAgYmVoYXZpb3VyLiBEZWZpbmVkIHJlZ2V4IHBhdHRlcm5zIGFyZSBtYXRjaGVkIGFnYWluc3QgZnVsbCBmaWxlIHBhdGguCisKKyAgQ2xvc2UgIzI1NDEKKworKiBGaXggZmFsc2UgbmVnYXRpdmUgZm9yIGBgY29uc2lkZXItdXNpbmctd2l0aGBgIGlmIGNhbGxzIGxpa2UgYGBvcGVuKClgYCB3ZXJlIHVzZWQgb3V0c2lkZSBvZiBhc3NpZ25tZW50IGV4cHJlc3Npb25zLgorCisqIFRoZSB3YXJuaW5nIGZvciBgYGFyZ3VtZW50cy1kaWZmZXJgYCBub3cgc2lnbmFscyBleHBsaWNpdGx5IHRoZSBkaWZmZXJlbmNlIGl0IGRldGVjdGVkCisgIGJ5IG5hbWluZyB0aGUgYXJndW1lbnQgb3IgYXJndW1lbnRzIHRoYXQgY2hhbmdlZCBhbmQgdGhlIHR5cGUgb2YgY2hhbmdlIHRoYXQgb2NjdXJyZWQuCisKKyogU3VwcHJlc3MgYGBjb25zaWRlci11c2luZy13aXRoYGAgaW5zaWRlIGNvbnRleHQgbWFuYWdlcnMuCisKKyAgQ2xvc2VzICM0NDMwCisKKyogQWRkZWQgYGAtLWZhaWwtb25gYCBvcHRpb24gdG8gcmV0dXJuIG5vbi16ZXJvIGV4aXQgY29kZXMgcmVnYXJkbGVzcyBvZiBgYC0tZmFpbC11bmRlcmBgIHZhbHVlLgorCisqIG51bXZlcnNpb24gdHVwbGUgY29udGFpbnMgaW50ZWdlcnMgYWdhaW4gdG8gZml4IG11bHRpcGxlIHB5bGludCdzIHBsdWdpbnMgdGhhdCByZWxpZWQgb24gaXQKKworICBDbG9zZXMgIzQ0MjAKKworKiBGaXggZmFsc2UtcG9zaXRpdmUgYGB0b28tbWFueS1hbmNlc3RvcnNgYCB3aGVuIGluaGVyaXRpbmcgZnJvbSBidWlsdGluIGNsYXNzZXMsCisgIGVzcGVjaWFsbHkgZnJvbSB0aGUgYGBjb2xsZWN0aW9ucy5hYmNgYCBtb2R1bGUKKworICBDbG9zZXMgIzQxNjYKKyAgQ2xvc2VzICM0NDE1CisKKyogU3RkbGliIGRlcHJlY2F0ZWQgbW9kdWxlcyBjaGVjayBpcyBtb3ZlZCB0byBzdGRsaWIgY2hlY2tlci4gTmV3IGRlcHJlY2F0ZWQKK21vZHVsZXMgYXJlIGFkZGVkLgorCisqIEZpeCByYWlzaW5nIGZhbHNlLXBvc2l0aXZlIGBgbm8tbWVtYmVyYGAgb24gYWJzdHJhY3QgcHJvcGVydGllcworCisqIENyZWF0ZWQgbmV3IGVycm9yIG1lc3NhZ2UgY2FsbGVkIGBgYXJndW1lbnRzLXJlbmFtZWRgYCB3aGljaCBpZGVudGlmaWVzIGFueSBjaGFuZ2VzIGF0IHRoZSBwYXJhbWV0ZXIKKyAgbmFtZXMgb2Ygb3ZlcnJpZGRlbiBmdW5jdGlvbnMuCisKKyAgQ2xvc2VzICMzNTM2CisKKyogTmV3IGNoZWNrZXIgYGBjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zYGAuIEVtaXR0ZWQgIHdoZW4gaXRlcmF0aW5nIG92ZXIgZGljdGlvbmFyeSBrZXlzIGFuZCB0aGVuCisgIGluZGV4aW5nIHRoZSBzYW1lIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5IHdpdGhpbiBsb29wIGJvZHkuCisKKyAgQ2xvc2VzICMzMzg5CisKKyogRG9uJ3QgZW1pdCBgYGltcG9ydC1lcnJvcmBgIGlmIGltcG9ydCBndWFyZGVkIGJlaGluZCBgYGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKHgsIHgpYGAKKworKiBGaXggaW5jb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDMuNi4wIGNhdXNlZCBieSBgYHR5cGluZy5Db3VudGVyYGAgYW5kIGBgdHlwaW5nLk5vUmV0dXJuYGAgdXNhZ2UKKworICBDbG9zZXMgIzQ0MTIKKworKiBOZXcgY2hlY2tlciBgYHVzZS1tYXhzcGxpdC1hcmdgYC4gRW1pdHRlZCBlaXRoZXIgd2hlbiBhY2Nlc3Npbmcgb25seSB0aGUgZmlyc3Qgb3IgbGFzdAorICBlbGVtZW50IG9mIGBgc3RyLnNwbGl0KClgYC4KKworICBDbG9zZXMgIzQ0NDAKKworKiBBZGQgaWdub3JlX3NpZ25hdHVyZXMgdG8gZHVwbGljYXRlIGNvZGUgY2hlY2tlcgorCisgIENsb3NlcyAjMzYxOQorCisqIEZpeCBkb2N1bWVudGF0aW9uIGVycm9ycyBpbiAiQmxvY2sgZGlzYWJsZXMiIHBhcmFncmFwaCBvZiBVc2VyIEd1aWRlLgorCisqIE5ldyBjaGVja2VyIGBgdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBgYC4gRW1pdHRlZCB3aGVuIGl0ZXJhdGluZyBvdmVyIGRpY3Rpb25hcnkgaXRlbXMKKyAgKGtleS12YWx1ZSBwYWlycykgYW5kIGFjY2Vzc2luZyB0aGUgdmFsdWUgYnkgaW5kZXggbG9va3VwLgorCisgIENsb3NlcyAjNDQ3MAorCisqIE5ldyBjaGVja2VyYGBjb25zaWRlci11c2luZy1mcm9tLWltcG9ydGBgLiBFbWl0dGVkIHdoZW4gYSBzdWJtb2R1bGUvbWVtYmVyIG9mIGEgcGFja2FnZSBpcyBpbXBvcnRlZCBhbmQgYWxpYXNlZAorICB3aXRoIHRoZSBzYW1lIG5hbWUuCisKKyAgQ2xvc2VzICMyMzA5CisKKyogQWxsb3cgY29tbWEtc2VwYXJhdGVkIGxpc3QgaW4gYGBvdXRwdXQtZm9ybWF0YGAgYW5kIHNlcGFyYXRlIG91dHB1dCBmaWxlcyBmb3IKKyAgZWFjaCBzcGVjaWZpZWQgZm9ybWF0LgorCisgIENsb3NlcyAjMTc5OAorCisqIE1ha2UgYGB1c2luZy1jb25zdGFudC10ZXN0YGAgZGV0ZWN0IGNvbnN0YW50IHRlc3RzIGNvbnNpc3Rpbmcgb2YgbGlzdCBsaXRlcmFscyBsaWtlIGBgW11gYCBhbmQKKyAgYGBbMSwgMiwgM11gYC4KKworKiBJbXByb3ZlZCBlcnJvciBtZXNzYWdlIG9mIGBgdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbmBgIGNoZWNrZXIgYnkgcHJvdmlkaW5nIGNvZGUgc3VnZ2VzdGlvbi4KKworICBDbG9zZXMgIzQ0OTkKKworKiBOZXcgY2hlY2tlciBgYHVudXNlZC1wcml2YXRlLW1lbWJlcmBgLiBFbWl0dGVkIHdoZW4gYSBwcml2YXRlIG1lbWJlciAoaS5lLiwgc3RhcnRzIHdpdGggYGBfX2BgKSBvZiBhIGNsYXNzCisgIGlzIGRlZmluZWQgYnV0IG5vdCB1c2VkLgorCisgIENsb3NlcyAjNDQ4MworCisqIEZpeCBmYWxzZSBuZWdhdGl2ZSBvZiBgYGNvbnNpZGVyLXVzaW5nLWVudW1lcmF0ZWBgIHdoZW4gaXRlcmF0aW5nIG92ZXIgYW4gYXR0cmlidXRlLgorCisgIENsb3NlcyAjMzY1NworCisqIE5ldyBjaGVja2VyIGBgaW52YWxpZC1jbGFzcy1vYmplY3RgYC4gRW1pdHRlZCB3aGVuIGEgbm9uLWNsYXNzIGlzIGFzc2lnbmVkIHRvIGEgYGBfX2NsYXNzX19gYCBhdHRyaWJ1dGUuCisKKyAgQ2xvc2VzICM1ODUKKworKiBGaXggYSBjcmFzaCB3aGVuIGEgcGx1Z2luIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gY291bGQgbm90IGJlIGxvYWRlZCBhbmQgcmFpc2UgYW4gZXJyb3IKKyAgJ2JhZC1wbHVnaW4tdmFsdWUnIGluc3RlYWQKKworQ2xvc2VzICM0NTU1CisKKyogQWRkZWQgaGFuZGxpbmcgb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHdoZW4gcGFyc2luZyBjb25maWd1cmF0aW9uIGZyb20gcHlwcm9qZWN0LnRvbWwKKworICBDbG9zZXMgIzQ1MTgKKworKiBgYGludmFsaWQtbGVuZ3RoLXJldHVybmVkYGAsIG5vdyBhbHNvIHdvcmtzIHdoZW4gbm90aGluZyBhdCBhbGwgaXMgcmV0dXJuZWQKKyAgZm9sbG93aW5nIGFuIHVwZ3JhZGUgaW4gYXN0cm9pZC4KKworKiBgYGxvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb25gYCBhbmQgYGBsb2dnaW5nLW5vdC1sYXp5YGAsIG5vdyB3b3JrcyBvbiBsb2dnZXIKKyAgY2xhc3MgY3JlYXRlZCBmcm9tIHJlbmFtZWQgbG9nZ2luZyBpbXBvcnQgZm9sbG93aW5nIGFuIHVwZ3JhZGUgaW4gYXN0cm9pZC4KKworKiBGaXggZmFsc2UtcG9zaXRpdmUgYGBuby1tZW1iZXJgYCB3aXRoIGdlbmVyaWMgYmFzZSBjbGFzcworCisgIENsb3NlcyBQeUNRQS9hc3Ryb2lkIzk0MgorCisqIEZpeCBgYGFzc2lnbmluZy1ub24tc2xvdGBgIGZhbHNlLXBvc2l0aXZlIHdpdGggYmFzZSB0aGF0IGluaGVyaXRzIGZyb20gYGB0eXBpbmcuR2VuZXJpY2BgCisKKyAgQ2xvc2VzICM0NTA5CisgIENsb3NlcyBQeUNRQS9hc3Ryb2lkIzk5OQorCisqIE5ldyBjaGVja2VyIGBgaW52YWxpZC1hbGwtZm9ybWF0YGAuIEVtaXR0ZWQgd2hlbiBgYF9fYWxsX19gYCBoYXMgYW4gaW52YWxpZCBmb3JtYXQsCisgIGkuZS4gaXNuJ3QgYSBgYHR1cGxlYGAgb3IgYGBsaXN0YGAuCisKKyogRml4IGZhbHNlIHBvc2l0aXZlIGBgdW51c2VkLXZhcmlhYmxlYGAgYW5kIGBgdW5kZWZpbmVkLXZhcmlhYmxlYGAgd2l0aAorICBQYXR0ZXJuIE1hdGNoaW5nIGluIFB5dGhvbiAzLjEwCisKKyogTmV3IGNoZWNrZXIgYGBhd2FpdC1vdXRzaWRlLWFzeW5jYGAuIEVtaXR0ZWQgd2hlbiBhd2FpdCBpcyB1c2VkIG91dHNpZGUgYW4gYXN5bmMgZnVuY3Rpb24uCisKKyogQ2xhcmlmeSBkb2N1bWVudGF0aW9uIGZvciBgYHR5cGluZ2BgIGV4dGVuc2lvbi4KKworICBDbG9zZXMgIzQ1NDUKKworKiBBZGQgbmV3IGV4dGVuc2lvbiBgYENvZGVTdHlsZUNoZWNrZXJgYC4gSXQgaW5jbHVkZXMgY2hlY2tlcnMgdGhhdCBjYW4gaW1wcm92ZSBjb2RlCisgIGNvbnNpc3RlbmN5LiBBcyBzdWNoIHRoZXkgZG9uJ3QgbmVjZXNzYXJpbHkgcHJvdmlkZSBhIHBlcmZvcm1hbmNlIGJlbmVmaXQKKyAgYW5kIGFyZSBvZnRlbiB0aW1lcyBvcGluaW9uYXRlZC4KKworICAqIE5ldyBjaGVja2VyIGBgY29uc2lkZXItdXNpbmctdHVwbGVgYC4gRW1pdHRlZCB3aGVuIGFuIGluLXBsYWNlIGRlZmluZWQKKyAgICBsaXN0IG9yIHNldCBjYW4gYmUgcmVwbGFjZWQgYnkgYSB0dXBsZS4KKworICAqIE5ldyBjaGVja2VyIGBgY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3NgYC4gRW1pdHRlZCB3aGVuIGRpY3Rpb25hcnkgdmFsdWVzCisgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IG5hbWVkdHVwbGVzIG9yIGRhdGFjbGFzcyBpbnN0YW5jZXMuCisKKyogRml4IGVycm9yIHRoYXQgb2NjdXJyZWQgd2hlbiB1c2luZyBgYHNsaWNlYGAgYXMgc3Vic2NyaXB0IGZvciBkaWN0LgorCisqIFJlZHVjZSBmYWxzZS1wb3NpdGl2ZXMgYXJvdW5kIGluZmVyZW5jZSBvZiBgYC52YWx1ZWBgIGFuZCBgYC5uYW1lYGAKKyAgcHJvcGVydGllcyBvbiBgYEVudW1gYCBzdWJjbGFzc2VzLCBmb2xsb3dpbmcgYW4gdXBncmFkZSBpbiBhc3Ryb2lkCisKKyAgQ2xvc2VzICMxOTMyCisgIENsb3NlcyAjMjA2MgorCisqIEZpeCBpc3N1ZSB3aXRoIGBgY2FjaGVkX3Byb3BlcnR5YGAgdGhhdCBjYXVzZWQgYGBpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kYGAgZXJyb3IKKyAgd2hlbiBvdmVycmlkaW5nIGEgYGBwcm9wZXJ0eWBgLgorCisgIENsb3NlcyAjNDAyMworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuOC4zPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZWxlYXNlIGRhdGU6IDIwMjEtMDUtMzEKKworKiBBc3Ryb2lkIGhhcyBiZWVuIHBpbm5lZCB0byAyLjUuNiBmb3IgdGhlIDIuOCBicmFuY2ggc2VlICM0NTI3LgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuOC4yPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZWxlYXNlIGRhdGU6IDIwMjEtMDQtMjYKKworKiBLZWVwIGBgX19wa2dpbmZvX18ubnVtdmVyc2lvbmBgIGEgdHVwbGUgdG8gYXZvaWQgYnJlYWtpbmcgcHlsaW50LWRqYW5nby4KKworICBDbG9zZXMgIzQ0MDUKKworKiBzY21fc2V0dXB0b29scyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcGFja2FnaW5nLgorCisqIFB5bGludCdzIHRhZ3MgYXJlIG5vdyB0aGUgc3RhbmRhcmQgZm9ybSBgYHZYLlkuWmBgIGFuZCBub3QgYGBweWxpbnQtWC5ZLlpgYCBhbnltb3JlLgorCisqIE5ldyB3YXJuaW5nIG1lc3NhZ2UgYGBkZXByZWNhdGVkLWNsYXNzYGAuIFRoaXMgbWVzc2FnZSBpcyBlbWl0dGVkIGlmIGltcG9ydCBvciBjYWxsIGRlcHJlY2F0ZWQgY2xhc3Mgb2YgdGhlCitzdGFuZGFyZCBsaWJyYXJ5IChsaWtlIGBgY29sbGVjdGlvbnMuSXRlcmFibGVgYCB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy4xMCkuCisKK0Nsb3NlcyAjNDM4OAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuOC4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZWxlYXNlIGRhdGU6IDIwMjEtMDQtMjUKKworKiBBZGQgbnVtdmVyc2lvbiBiYWNrICh0ZW1wb3JhcmlseSkgaW4gYGBfX3BrZ2luZm9fX2BgIGJlY2F1c2UgaXQgYnJva2UgUHlsYW1hIGFuZCByZXZlcnQgdGhlIHVubmVjZXNzYXJ5CisgIGBgcHlsaW50LnZlcnNpb25gYCBicmVha2luZyBjaGFuZ2UuCisKKyAgQ2xvc2VzICM0Mzk5CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi44LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JlbGVhc2UgZGF0ZTogMjAyMS0wNC0yNAorCisqIE5ldyByZWZhY3RvcmluZyBtZXNzYWdlIGBgY29uc2lkZXItdXNpbmctd2l0aGBgLiBUaGlzIG1lc3NhZ2UgaXMgZW1pdHRlZCBpZiByZXNvdXJjZS1hbGxvY2F0aW5nIGZ1bmN0aW9ucyBvciBtZXRob2RzIG9mIHRoZQorICBzdGFuZGFyZCBsaWJyYXJ5IChsaWtlIGBgb3BlbigpYGAgb3IgYGB0aHJlYWRpbmcuTG9jay5hY3F1aXJlKClgYCkgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlciBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgYSBgYHdpdGhgYCBibG9jay4KKworICBDbG9zZXMgIzM0MTMKKworKiBSZXNvbHZlIGZhbHNlIHBvc2l0aXZlcyBvbiB1bnVzZWQgdmFyaWFibGVzIGluIGRlY29yYXRvciBmdW5jdGlvbnMKKworICBDbG9zZXMgIzQyNTIKKworKiBBZGQgbmV3IGV4dGVuc2lvbiBgYENvbmZ1c2luZ0NvbnNlY3V0aXZlRWxpZkNoZWNrZXJgYC4gVGhpcyBvcHRpb25hbCBjaGVja2VyIGVtaXRzIGEgcmVmYWN0b3JpbmcgbWVzc2FnZSAoUjU2MDEgYGBjb25mdXNpbmctY29uc2VjdXRpdmUtZWxpZmBgKQorICBpZiBpZi9lbGlmIHN0YXRlbWVudHMgd2l0aCBkaWZmZXJlbnQgaW5kZW50YXRpb24gbGV2ZWxzIGZvbGxvdyBkaXJlY3RseSBvbmUgYWZ0ZXIgdGhlIG90aGVyLgorCisqIE5ldyBvcHRpb24gYGAtLW91dHB1dD08ZmlsZT5gYCB0byBvdXRwdXQgcmVzdWx0IHRvIGEgZmlsZSByYXRoZXIgdGhhbiBwcmludGluZyB0byBzdGRvdXQuCisKKyAgQ2xvc2VzICMxMDcwCisKKyogVXNlIGEgcHJlc2NyaXB0aXZlIG1lc3NhZ2UgZm9yIGBgdW5pZGlvbWF0aWMtdHlwZWNoZWNrYGAKKworICBDbG9zZXMgIzM4OTEKKworKiBBcHBseSBgYGNvbnN0LW5hbWluZy1zdHlsZWBgIHRvIG1vZHVsZSBjb25zdGFudHMgYW5ub3RhdGVkIHdpdGgKKyAgYGB0eXBpbmcuRmluYWxgYAorCisqIFRoZSBwYWNrYWdpbmcgaXMgbm93IGRvbmUgdmlhIHNldHVwdG9vbHMgZXhjbHVzaXZlbHkuIGBgZG9jYGAsIGBgdGVzdHNgYCwgYGBtYW5gYCwgYGBlbGlzcGBgIGFuZCBgYENoYW5nZWxvZ2BgIGFyZQorICBub3QgcGFja2FnZWQgYW55bW9yZSAtIHJlZHVjaW5nIHRoZSBzaXplIG9mIHRoZSBwYWNrYWdlIGJ5IDc1JS4KKworKiBEZWJpYW4gcGFja2FnaW5nIGlzIG5vdyAgKG9mZmljaWFsbHkpIGRvbmUgaW4gaHR0cHM6Ly9zYWxzYS5kZWJpYW4ub3JnL3B5dGhvbi10ZWFtL3BhY2thZ2VzL3B5bGludC4KKworKiBUaGUgJ2RvYycgZXh0cmEtcmVxdWlyZSBoYXMgYmVlbiByZW1vdmVkLgorCisqIGBgX19wa2dpbmZvX19gYCBub3cgb25seSBjb250YWluIGBgX192ZXJzaW9uX19gYCAoYWxzbyBhY2Nlc3NpYmxlIHdpdGggYGBweWxpbnQuX192ZXJzaW9uX19gYCksIG90aGVyIG1ldGEtaW5mb3JtYXRpb24gYXJlIHN0aWxsCisgIGFjY2Vzc2libGUgd2l0aCBgYGZyb20gaW1wb3J0bGliIGltcG9ydCBtZXRhZGF0YTttZXRhZGF0YS5tZXRhZGF0YSgncHlsaW50JylgYC4KKworKiBDT1BZSU5HIGhhcyBiZWVuIHJlbmFtZWQgdG8gTElDRU5TRSBmb3Igc3RhbmRhcmRpemF0aW9uLgorCisqIEZpeCBmYWxzZS1wb3NpdGl2ZSBgYHVzZWQtYmVmb3JlLWFzc2lnbm1lbnRgYCBpbiBmdW5jdGlvbiByZXR1cm5zLgorCisgIENsb3NlcyAjNDMwMQorCisqIFVwZGF0ZWQgYGBhc3Ryb2lkYGAgdG8gMi41LjMKKworICBDbG9zZXMgIzI4MjIsICM0MjA2LCAjNDI4NAorCisqIEFkZCBgYGNvbnNpZGVyLXVzaW5nLW1pbi1tYXgtYnVpbHRpbmBgIGNoZWNrIGZvciBpZiBzdGF0ZW1lbnQgd2hpY2ggY291bGQgYmUgcmVwbGFjZWQgYnkgUHl0aG9uIGJ1aWx0aW4gbWluIG9yIG1heAorCisgIENsb3NlcyAjMzQwNgorCisqIERvbid0IGF1dG8tZW5hYmxlIHBvc3Rwb25lZCBldmFsdWF0aW9uIG9mIHR5cGUgYW5ub3RhdGlvbnMgd2l0aCBQeXRob24gMy4xMAorCisqIFVwZGF0ZSBgYGFzdHJvaWRgYCB0byAyLjUuNAorCisqIEFkZCBuZXcgZXh0ZW5zaW9uIGBgVHlwaW5nQ2hlY2tlcmBgLiBUaGlzIG9wdGlvbmFsIGNoZWNrZXIgY2FuIGRldGVjdCB0aGUgdXNlIG9mIGRlcHJlY2F0ZWQgdHlwaW5nIGFsaWFzZXMKKyAgYW5kIGNhbiBzdWdnZXN0IHRoZSB1c2Ugb2YgdGhlIGFsdGVybmF0aXZlIHVuaW9uIHN5bnRheCB3aGVyZSBwb3NzaWJsZS4KKyAgKEZvciBleGFtcGxlLCAndHlwaW5nLkRpY3QnIGNhbiBiZSByZXBsYWNlZCBieSAnZGljdCcsIGFuZCAndHlwaW5nLlVuaW9ucycgYnkgJ3wnLCBldGMuKQorICBNYWtlIHN1cmUgdG8gY2hlY2sgdGhlIGNvbmZpZyBvcHRpb25zIGlmIHlvdSBwbGFuIG9uIHVzaW5nIGl0IQorCisqIFJlYWN0aXZhdGVzIG9sZCBjb3VudHMgaW4gcmVwb3J0IG1vZGUuCisKKyAgQ2xvc2VzICMzODE5CisKKyogRHVyaW5nIGRldGVjdGlvbiBvZiBgYGluY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c2BgIGNvbnNpZGVyIHRoYXQgYGBhc3NlcnQgRmFsc2VgYCBpcyBhIHJldHVybiBub2RlLgorCisgIENsb3NlcyAjNDAxOQorCisqIFJ1biB3aWxsIG5vdCBmYWlsIGlmIHNjb3JlIGV4YWN0bHkgZXF1YWxzIGBgY29uZmlnLmZhaWxfdW5kZXJgYC4KKworKiBGdW5jdGlvbnMgdGhhdCBuZXZlciByZXR1cm5zIG1heSBkZWNsYXJlIGBgTm9SZXR1cm5gYCBhcyB0eXBlIGhpbnRzLCBzbyB0aGF0CisgIGBgaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzYGAgaXMgbm90IGVtaXR0ZWQuCisKKyAgQ2xvc2VzICM0MTIyLCAjNDE4OAorCisqIEltcHJvdmVkIHByb3RlY3RlZCBhY2Nlc3MgY2hlY2tzIHRvIGFsbG93IGFjY2VzcyBpbnNpZGUgY2xhc3MgbWV0aG9kcworCisgIENsb3NlcyAjMTE1OQorCisqIEZpeCBpc3N1ZSB3aXRoIFBFUCA1ODUgc3ludGF4IGFuZCB0aGUgdXNlIG9mIGBgY29sbGVjdGlvbnMuYWJjLlNldGBgCisKKyogRml4IGlzc3VlIHRoYXQgY2F1c2VkIGNsYXNzIHZhcmlhYmxlcyBhbm5vdGF0ZWQgd2l0aCBgYHR5cGluZy5DbGFzc1ZhcmBgIHRvIGJlCisgIGlkZW50aWZpZWQgYXMgY2xhc3MgY29uc3RhbnRzLiBOb3csIGNsYXNzIHZhcmlhYmxlcyBhbm5vdGF0ZWQgd2l0aAorICBgYHR5cGluZy5GaW5hbGBgIGFyZSBpZGVudGlmaWVkIGFzIHN1Y2guCisKKyAgQ2xvc2VzICM0Mjc3CisKKyogQ29udGludW91cyBpbnRlZ3JhdGlvbiB3aXRoIHJlYWQgdGhlIGRvYyBoYXMgYmVlbiBhZGRlZC4KKworICBDbG9zZXMgIzM4NTAKKworKiBEb24ndCBzaG93IGBgRHVwbGljYXRlQmFzZXNFcnJvcmBgIGZvciBhdHRyaWJ1dGUgYWNjZXNzCisKKyogRml4IGNyYXNoIHdoZW4gY2hlY2tpbmcgYGBzZXR1cC5jZmdgYCBmb3IgcHlsaW50IGNvbmZpZyB3aGVuIHRoZXJlIGFyZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGVyZQorCisgIENsb3NlcyAjNDMyOAorCisqIEFsbG93IGNvZGUgZmxhbmtlZCBpbiBiYWNrdGlja3MgdG8gYmUgc2tpcHBlZCBieSBzcGVsbGNoZWNrZXIKKworICBDbG9zZXMgIzQzMTkKKworKiBBbGxvdyBQeXRob24gdG9vbCBkaXJlY3RpdmVzIChmb3IgYmxhY2ssIGZsYWtlOCwgemltcG9ydHMsIGlzb3J0LCBteXB5LCBiYW5kaXQsIHB5Y2hhcm0pIGF0IGJlZ2lubmluZyBvZiBjb21tZW50cyB0byBiZSBza2lwcGVkIGJ5IHNwZWxsY2hlY2tlcgorCisgIENsb3NlcyAjNDMyMAorCisqIEZpeCBpc3N1ZSB0aGF0IGNhdXNlZCBlbWFjcyBweWxpbnQgdG8gZmFpbCB3aGVuIHVzZWQgd2l0aCB0cmFtcAorCisqIEltcHJvdmUgY2hlY2sgZm9yIGludmFsaWQgUEVQIDU4NSBzeW50YXggaW5zaWRlIGZ1bmN0aW9ucworICBpZiBwb3N0cG9uZWQgZXZhbHVhdGlvbiBvZiB0eXBlIGFubm90YXRpb25zIGlzIGVuYWJsZWQKKworKiBJbXByb3ZlIGNoZWNrIGZvciBpbnZhbGlkIFBFUCA1ODUgc3ludGF4IGFzIGRlZmF1bHQgZnVuY3Rpb24gYXJndW1lbnRzCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi43LjQ/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JlbGVhc2UgZGF0ZTogMjAyMS0wMy0zMAorCisKKyogRml4IGEgcHJvYmxlbSB3aXRoIGRpc2FibGVkIG1zZ2lkIG5vdCBiZWluZyBpZ25vcmVkCisKKyAgQ2xvc2VzICM0MjY1CisKKyogRml4IGlzc3VlIHdpdGggYW5ub3RhdGVkIGNsYXNzIGNvbnN0YW50cworCisgIENsb3NlcyAjNDI2NAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuNy4zPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CitSZWxlYXNlIGRhdGU6IDIwMjEtMDMtMjkKKworKiBJbnRyb2R1Y2UgbG9naWMgZm9yIGNoZWNraW5nIGRlcHJlY2F0ZWQgYXR0cmlidXRlcyBpbiBEZXByZWNhdGlvbk1peGluLgorCisqIFJlZHVjZSB1c2FnZSBvZiBibGFja2xpc3Qvd2hpdGVsaXN0IHRlcm1pbm9sb2d5LiBOb3RhYmx5LCBgYGV4dGVuc2lvbi1wa2ctYWxsb3ctbGlzdGBgIGlzIGFuCisgIGFsdGVybmF0aXZlIHRvIGBgZXh0ZW5zaW9uLXBrZy13aGl0ZWxpc3RgYCBhbmQgdGhlIG1lc3NhZ2UgYGBibGFja2xpc3RlZC1uYW1lYGAgaXMgbm93IGVtaXR0ZWQgYXMKKyAgYGBkaXNhbGxvd2VkLW5hbWVgYC4gVGhlIHByZXZpb3VzIG5hbWVzIGFyZSBhY2NlcHRlZCB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisqIE1vdmUgZGVwcmVjYXRlZCBjaGVja2VyIHRvIGBgRGVwcmVjYXRlZE1peGluYGAKKworICBDbG9zZXMgIzQwODYKKworKiBCdW1wIGBgYXN0cm9pZGBgIHZlcnNpb24gdG8gYGAyLjUuMmBgCisKKyogRml4IGZhbHNlIHBvc2l0aXZlIGZvciBgYG1ldGhvZC1oaWRkZW5gYCB3aGVuIHVzaW5nIHByaXZhdGUgYXR0cmlidXRlIGFuZCBtZXRob2QKKworICBDbG9zZXMgIzM5MzYKKworKiBgYHVzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWRgYCBub3cgYWxzbyB3b3JrcyBvbiBsZWdhY3kgbWVzc2FnZXMgbGlrZSBgYEMwMTExYGAgKGBgbWlzc2luZy1kb2NzdHJpbmdgYCkuCisKKyogUmVtb3ZlIHVud2FudGVkIHByaW50IHRvIHN0ZG91dCBmcm9tIGBgX2VtaXRfbm9fbWVtYmVyYGAKKworKiBJbnRyb2R1Y2UgYSBjb21tYW5kLWxpbmUgb3B0aW9uIHRvIHNwZWNpZnkgcHlyZXZlcnNlIG91dHB1dCBkaXJlY3RvcnkKKworICBDbG9zZXMgIzQxNTkKKworKiBGaXggaXNzdWUgd2l0aCBFbnVtcyBhbmQgYGBjbGFzcy1hdHRyaWJ1dGUtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2VgYAorCisgIENsb3NlcyAjNDE0OQorCisqIEFkZCBgYGFsbG93ZWQtcmVkZWZpbmVkLWJ1aWx0aW5zYGAgb3B0aW9uIGZvciBmaW5lIHR1bmluZyBgYHJlZGVmaW5lZC1idWlsdGluYGAgY2hlY2suCisKKyAgQ2xvc2UgIzMyNjMKKworKiBGaXggaXNzdWUgd2hlbiBleGVjdXRpbmcgd2l0aCBgYHB5dGhvbiAtbSBweWxpbnRgYAorCisgIENsb3NlcyAjNDE2MQorCisqIEV4ZW1wdCBgYHR5cGluZy5UeXBlZERpY3RgYCBmcm9tIGBgdG9vLWZldy1wdWJsaWMtbWV0aG9kc2BgIGNoZWNrLgorCisgIENsb3NlcyAjNDE4MAorCisqIEZpeCBmYWxzZS1wb3NpdGl2ZSBgYG5vLW1lbWJlcmBgIGZvciB0eXBlZCBhbm5vdGF0aW9ucyB3aXRob3V0IGRlZmF1bHQgdmFsdWUuCisKKyAgQ2xvc2VzICMzMTY3CisKKyogQWRkIGBgLS1jbGFzcy1jb25zdC1uYW1pbmctc3R5bGVgYCBmb3IgRW51bSBjb25zdGFudHMgYW5kIGNsYXNzIHZhcmlhYmxlcyBhbm5vdGF0ZWQKKyAgd2l0aCBgYHR5cGluZy5DbGFzc1ZhcmBgCisKKyAgQ2xvc2VzICM0MTgxCisKKyogRml4IGFzdHJvaWQuSW5mZXJlbmNlIGVycm9yIGZvciB1bmRlZmluZWQtdmFyaWFibGVzIHdpdGggYGBsZW4oKWBgYAorCisgIENsb3NlcyAjNDIxNQorCisqIEZpeCBjb2x1bW4gaW5kZXggb24gRklYTUUgd2FybmluZyBtZXNzYWdlcworCisgIENsb3NlcyAjNDIxOAorCisqIEltcHJvdmUgaGFuZGxpbmcgb2YgYXNzaWdubWVudCBleHByZXNzaW9ucywgYmV0dGVyIGVkZ2UgY2FzZSBoYW5kbGluZworCisgIENsb3NlcyAjMzc2MywgIzQyMzgKKworKiBJbXByb3ZlIGNoZWNrIGlmIGNsYXNzIGlzIHN1YnNjcmlwdGFibGUgUEVQNTg1CisKKyogRml4IGRvY3VtZW50YXRpb24gYW5kIGZpbGVuYW1lIGhhbmRsaW5nIG9mIC0taW1wb3J0LWdyYXBoCisKKyogRml4IGZhbHNlLXBvc2l0aXZlIGZvciBgYHVudXNlZC1pbXBvcnRgYCBvbiBjbGFzcyBrZXl3b3JkIGFyZ3VtZW50cworCisgIENsb3NlcyAjMzIwMgorCisqIEZpeCByZWdyZXNzaW9uIHdpdGggcGx1Z2lucyBvbiBQWVRIT05QQVRIIGlmIGxhdHRlciBpcyBjd2QKKworICBDbG9zZXMgIzQyNTIKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjcuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorUmVsZWFzZSBkYXRlOiAyMDIxLTAyLTI4CisKKyogRml4IEZhbHNlIFBvc2l0aXZlIG9uIGBgRW51bS5fX21lbWJlcnNfXy5pdGVtcygpYGAsIGBgRW51bS5fX21lbWJlcnNfXy52YWx1ZXNgYCwgYW5kIGBgRW51bS5fX21lbWJlcnNfXy5rZXlzYGAKKyAgQ2xvc2VzICM0MTIzCisKKyogUHJvcGVybHkgc3RyaXAgZGFuZ2Vyb3VzIHN5cy5wYXRoIGVudHJpZXMgKG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUpCisKKyAgQ2xvc2VzICMzNjM2CisKKyogV29ya2Zsb3cgYW5kIHBhY2thZ2luZyBpbXByb3ZlbWVudHMKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjcuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorUmVsZWFzZSBkYXRlOiAyMDIxLTAyLTIzCisKKyogRXhwb3NlIGBgVW5pdHRlc3RMaW50ZXJgYCBpbiBweWxpbnQudGVzdHV0aWxzCisKKyogRG9uJ3QgY2hlY2sgZGlyZWN0b3JpZXMgc3RhcnRpbmcgd2l0aCAnLicgd2hlbiB1c2luZyByZWdpc3Rlcl9wbHVnaW5zCisKKyAgQ2xvc2VzICM0MTE5CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi43LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1JlbGVhc2UgZGF0ZTogMjAyMS0wMi0yMQorCisqIEludHJvZHVjZSBEZXByZWNhdGlvbk1peGluIGZvciByZXVzYWJsZSBkZXByZWNhdGlvbiBjaGVja3MuCisKKyAgQ2xvc2VzICM0MDQ5CisKKyogRml4IGZhbHNlIHBvc2l0aXZlIGZvciBgYGJ1aWx0aW4tbm90LWl0ZXJhdGluZ2BgIHdoZW4gYGBtYXBgYCByZWNlaXZlcyBpdGVyYWJsZQorCisgIENsb3NlcyAjNDA3OAorCisqIFB5dGhvbiAzLjYrIGlzIG5vdyByZXF1aXJlZC4KKworKiBGaXggZmFsc2UgcG9zaXRpdmUgZm9yIGBgYnVpbHRpbi1ub3QtaXRlcmF0aW5nYGAgd2hlbiBgYHppcGBgIHJlY2VpdmVzIGl0ZXJhYmxlCisKKyogQWRkIGBgbmFuLWNvbXBhcmlzb25gYCBjaGVjayBmb3IgTmFOIGNvbXBhcmlzb25zCisKKyogQnVnIGZpeCBmb3IgZW1wdHktY29tbWVudCBtZXNzYWdlIGxpbmUgbnVtYmVyLgorCisgIENsb3NlcyAjNDAwOQorCisqIE9ubHkgZW1pdCBgYGJhZC1yZXZlcnNlZC1zZXF1ZW5jZWBgIG9uIGRpY3Rpb25hcmllcyBpZiBiZWxvdyBweTMuOAorCisgIENsb3NlcyAjMzk0MAorCisqIEhhbmRsZSBjbGFzcyBkZWNvcmF0b3JzIGFwcGxpZWQgdG8gZnVuY3Rpb24uCisKKyAgQ2xvc2VzICMzODgyCisKKyogQWRkIGNoZWNrIGZvciBlbXB0eSBjb21tZW50cworCisqIEZpeCBtaW5vciBkb2N1bWVudGF0aW9uIGlzc3VlIGluIGNvbnRyaWJ1dGUucnN0CisKKyogRW51bXMgYXJlIG5vdyByZXF1aXJlZCB0byBiZSBuYW1lZCBpbiBVUFBFUl9DQVNFIGJ5IGBgaW52YWxpZC1uYW1lYGAuCisKKyAgQ2xvc2UgIzM4MzQKKworKiBBZGQgbWlzc2luZyBjaGVja3MgZm9yIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLgorCisqIFBvc3Rwb25lZCBldmFsdWF0aW9uIG9mIGFubm90YXRpb25zIGFyZSBub3cgcmVjb2duaXplZCBieSBkZWZhdWx0IGlmIHB5dGhvbiB2ZXJzaW9uIGlzIGFib3ZlIDMuMTAKKworICBDbG9zZXMgIzM5OTIKKworKiBGaXggY29sdW1uIG1ldGFkYXRhIGZvciBhbm9tYWxvdXMgYmFja3NsYXNoIGxpbnRzCisKKyogRHJvcCBzdXBwb3J0IGZvciBQeXRob24gMy41CisKKyogQWRkIHN1cHBvcnQgZm9yIHBlcDU4NSB3aXRoIHBvc3Rwb25lZCBldmFsdWF0aW9uCisKKyAgQ2xvc2VzICMzMzIwCisKKyogQ2hlY2sgYWx0ZXJuYXRpdmUgdW5pb24gc3ludGF4IC0gUEVQIDYwNAorCisgIENsb3NlcyAjNDA2NQorCisqIEZpeCBtdWx0aXBsZSBmYWxzZSBwb3NpdGl2ZXMgd2l0aCBhc3NpZ25tZW50IGV4cHJlc3Npb25zCisKKyAgQ2xvc2VzICMzMzQ3LCAjMzk1MywgIzM4NjUsICMzMjc1CisKKyogRml4IFR5cGVkRGljdCBpbmhlcml0LW5vbi1jbGFzcyBmYWxzZS1wb3NpdGl2ZSBQeXRob24gMy45KworCisgIENsb3NlcyAjMTkyNworCisqIEZpeCBpc3N1ZSB3aXRoIG5lc3RlZCBQRVAgNTg1IHN5bnRheAorCisqIEZpeCBpc3N1ZSB3aXRoIG5lc3RlZCBQRVAgNjA0IHN5bnRheAorCisqIEZpeCBhIGNyYXNoIGluIGBgdW5kZWZpbmVkLXZhcmlhYmxlYGAgY2F1c2VkIGJ5IGNoYWluZWQgYXR0cmlidXRlcyBpbiBtZXRhY2xhc3MKKworICBDbG9zZSAjMzc0MgorCisqIEZpeCBmYWxzZSBwb3NpdGl2ZSBmb3IgYGBub3QtYXN5bmMtY29udGV4dC1tYW5hZ2VyYGAgd2hlbiBgYGNvbnRleHRsaWIuYXN5bmNjb250ZXh0bWFuYWdlcmBgIGlzIHVzZWQKKworICBDbG9zZSAjMzg2MgorCisqIEZpeCBsaW50ZXIgbXVsdGlwcm9jZXNzaW5nIHBvb2wgc2h1dGRvd24gKHRyaWdnZXJlZCB3YXJuaW5ncyB3aGVuIHJ1bm5lZCBpbiBwYXJhbGxlbHMgd2l0aCBvdGhlciBweXRlc3QgcGx1Z2lucykKKworICBDbG9zZXMgIzM3NzkKKworKiBGaXggYSBmYWxzZS1wb3NpdGl2ZSBlbWlzc2lvbiBvZiBgYG5vLXNlbGYtdXNlYGAgYW5kIGBgdW51c2VkLWFyZ3VtZW50YGAgZm9yIG1ldGhvZHMKKyAgb2YgZ2VuZXJpYyBzdHJ1Y3R1cmFsIHR5cGVzIChgUHJvdG9jb2xbVF1gKQorCisgIENsb3NlcyAjMzg4NQorCisqIEZpeCBidWcgdGhhdCBsZWFkIHRvIGR1cGxpY2F0ZSBtZXNzYWdlcyB3aGVuIHVzaW5nIGBgLS1qb2JzIDJgYCBvciBtb3JlLgorCisgIENsb3NlICMzNTg0CisKKyogQWRkcyBvcHRpb24gYGBjaGVjay1wcm90ZWN0ZWQtYWNjZXNzLWluLXNwZWNpYWwtbWV0aG9kc2BgIGluIHRoZSBDbGFzc0NoZWNrZXIgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZQorICBgYHByb3RlY3RlZC1hY2Nlc3NgYCBtZXNzYWdlIGVtaXNzaW9uIGZvciBzaW5nbGUgdW5kZXJzY29yZSBwcmVmaXhlZCBhdHRyaWJ1dGUgaW4gc3BlY2lhbCBtZXRob2RzLgorCisgIENsb3NlICMzMTIwCisKKyogRml4IHZ1bG5lcmFibGUgcmVndWxhciBleHByZXNzaW9ucyBpbiBgYHB5cmV2ZXJzZWBgCisKKyAgQ2xvc2UgIzM4MTEKKworKiBgYGluY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c2BgIG1lc3NhZ2UgaXMgbm93IGVtaXR0ZWQgaWYgb25lIG9mIGBgdHJ5L2V4Y2VwdGBgIHN0YXRlbWVudAorICBpcyBub3QgcmV0dXJuaW5nIGV4cGxpY2l0bHkgd2hpbGUgdGhlIG90aGVyIGRvLgorCisgIENsb3NlcyAjMzQ2OAorCisqIEZpeCBgYHVzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbmBgIGZhbHNlIHBvc2l0aXZlIHdoZW4gZGVmYXVsdCBrZXl3b3JkIGFyZ3VtZW50IGlzIGEgZGljdGlvbm5hcnkuCisKKyAgQ2xvc2UgIzM3NzMKKworKiBGaXggYSBjcmFzaCB3aGVuIGEgc3BlY2lmaWVkIGNvbmZpZyBmaWxlIGRvZXMgbm90IGV4aXN0CisKKyogQWRkIHN1cHBvcnQgdG8gYGBpZ25vcmVkLWFyZ3VtZW50LW5hbWVzYGAgaW4gRG9jc3RyaW5nUGFyYW1ldGVyQ2hlY2tlciBhbmQgYWRkcyBgYHVzZWxlc3MtcGFyYW0tZG9jYGAgYW5kIGBgdXNlbGVzcy10eXBlLWRvY2BgIG1lc3NhZ2VzLgorCisgIENsb3NlICMzODAwCisKKyogRW5mb3JjZSBkb2NwYXJhbXMgY29uc2lzdGVudGx5IHdoZW4gZG9jc3RyaW5nIGlzIG5vdCBwcmVzZW50CisKKyAgQ2xvc2UgIzI3MzgKKworKiBGaXggYGBkdXBsaWNhdGUtY29kZWBgIGZhbHNlIHBvc2l0aXZlIHdoZW4gbGluZXMgb25seSBjb250YWluIHdoaXRlc3BhY2UgYW5kIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyAoZS5nLiBwYXJlbnRoZXNlcywgYnJhY2tldCwgY29tbWEsIGV0Yy4pCisKKyogSW1wcm92ZSBsaW50IG1lc3NhZ2UgZm9yIGBgc2luZ2xldG9uLWNvbXBhcmlzb25gYCB3aXRoIGJvb2xzCisKKyogRml4IHNwZWxsLWNoZWNrZXIgY3Jhc2ggb24gaW5kZW50ZWQgZG9jc3RyaW5nIGxpbmVzIHRoYXQgbG9vayBsaWtlICMgY29tbWVudHMKKworICBDbG9zZSAjMzc4NgorCisqIEZpeCBBdHRyaWJ1dGVFcnJvciBpbiBjaGVja2Vycy9yZWZhY3RvcmluZy5weQorCisqIEltcHJvdmUgc3BoaW54IGRpcmVjdGl2ZXMgc3BlbGxpbmcgZmlsdGVyCisKKyogRml4IGEgYnVnIHdpdGggcG9zdHBvbmVkIGV2YWx1YXRpb24gd2hlbiB1c2luZyBhbGlhc2VzIGZvciBhbm5vdGF0aW9ucy4KKworICBDbG9zZSAjMzc5OAorCisqIEZpeCBtaW5vciBkb2N1bWVudGF0aW9uIGlzc3VlcworCisqIEltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBsaW5lIGxlbmd0aCBjaGVjay4KKworKiBSZW1vdmVkIGluY29ycmVjdCBkZXByZWNhdGlvbiBvZiBgYGluc3BlY3QuZ2V0ZnVsbGFyZ3NwZWNgYAorCisqIEZpeCBgYHNpZ25hdHVyZS1kaWZmZXJzYGAgZmFsc2UgcG9zaXRpdmUgZm9yIGZ1bmN0aW9ucyB3aXRoIHZhcmlhZGljcworCisgIENsb3NlICMzNzM3CisKKyogRml4IGEgY3Jhc2ggaW4gYGBjb25zaWRlci11c2luZy1lbnVtZXJhdGVgYCB3aGVuIGVuY291bnRlcmluZyBgYHJhbmdlKClgYCB3aXRob3V0IGFyZ3VtZW50cworCisgIENsb3NlICMzNzM1CisKKyogYGBsZW4tYXMtY29uZGl0aW9uc2BgIGlzIG5vdyB0cmlnZ2VyZWQgb25seSBmb3IgY2xhc3NlcyB0aGF0IGFyZSBpbmhlcml0aW5nIGRpcmVjdGx5IGZyb20gbGlzdCwgZGljdCwgb3Igc2V0IGFuZCBub3QgaW1wbGVtZW50aW5nIHRoZSBgYF9fYm9vbF9fYGAgZnVuY3Rpb24sIG9yIGZyb20gZ2VuZXJhdG9ycyBsaWtlIHJhbmdlIG9yIGxpc3QvZGljdC9zZXQgY29tcHJlaGVuc2lvbi4gVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBmYWxzZSBwb3NpdGl2ZXMgZm9yIG90aGVyIGNsYXNzZXMsIGxpa2UgcGFuZGFzJ3MgRGF0YUZyYW1lIG9yIG51bXB5J3MgQXJyYXkuCisKKyAgQ2xvc2UgIzE4NzkKKworKiBGaXhlcyBkdXBsaWNhdGUtZXJyb3JzIG5vdCB3b3JraW5nIHdpdGggLWoyKworCisgIENsb3NlICMzMzE0CisKKyogYGBnZW5lcmF0ZWQtbWVtYmVyc2BgIG5vdyBtYXRjaGVzIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiBtZW1iZXJzCisKKyAgQ2xvc2UgIzI0OTgKKworKiBBZGQgY2hlY2sgZm9yIGJvb2wgZnVuY3Rpb24gdG8gYGBsZW4tYXMtY29uZGl0aW9uYGAKKworKiBBZGQgYGBzaW1wbGlmaWFibGUtY29uZGl0aW9uYGAgY2hlY2sgZm9yIGV4dHJhbmVvdXMgY29uc3RhbnRzIGluIGNvbmRpdGlvbmFscyB1c2luZyBhbmQvb3IuCisKKyogQWRkIGBgY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50YGAgY2hlY2sgZm9yIGNvbmRpdGlvbmFscyB1c2luZyBhbmQvb3IgdGhhdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50LgorCisgIENsb3NlICMzNDA3CisKKyogQ2hhbmdlZCBzZXR1cC5weSB0byB3b3JrIHdpdGggW2Rpc3RsaWJdKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9kaXN0bGliKQorCisgIENsb3NlICMzNTU1CisKKyogTmV3IGNoZWNrOiBgYGNvbnNpZGVyLXVzaW5nLWdlbmVyYXRvcmBgCisKKyAgVGhpcyBjaGVjayB3YXJucyB3aGVuIGEgY29tcHJlaGVuc2lvbiBpcyB1c2VkIGluc2lkZSBhbiBgYGFueWBgIG9yIGBgYWxsYGAgZnVuY3Rpb24sCisgIHNpbmNlIGl0IGlzIHVubmVjZXNzYXJ5IGFuZCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBnZW5lcmF0b3IgaW5zdGVhZC4KKyAgVXNpbmcgYSBnZW5lcmF0b3Igd291bGQgYmUgbGVzcyBjb2RlIGFuZCB3YXkgZmFzdGVyLgorCisgIENsb3NlICMzMTY1CisKKyogQWRkIEdpdGh1YiBBY3Rpb25zIHRvIHJlcGxhY2UgVHJhdmlzIGFuZCBBcHBWZXlvciBpbiB0aGUgZnV0dXJlCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi42LjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKiBBc3Ryb2lkIHZlcnNpb24gaGFzIGJlZW4gc2V0IGFzIDwgMi41CisKKyAgQ2xvc2UgIzQwOTMKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjYuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMjAtMDgtMjAKKworKiBGaXggdmFyaW91cyBzY29wZS1yZWxhdGVkIGJ1Z3MgaW4gYGB1bmRlZmluZWQtdmFyaWFibGVgYCBjaGVja2VyCisKKyAgQ2xvc2UgIzEwODIsICMzNDM0LCAjMzQ2MQorCisqIGJhZC1jb250aW51YXRpb24gYW5kIGJhZC13aGl0ZXNwYWNlIGhhdmUgYmVlbiByZW1vdmVkLCBibGFjayBvciBhbm90aGVyIGZvcm1hdHRlciBjYW4gaGVscCB5b3Ugd2l0aCB0aGlzIGJldHRlciB0aGFuIFB5bGludAorCisgIENsb3NlICMyNDYsICMyODksICM2MzgsICM3NDcsICMxMTQ4LCAjMTE3OSwgIzE5NDMsICMyMDQxLCAjMjMwMSwgIzIzMDQsICMyOTQ0LCAjMzU2NQorCisqIFRoZSBuby1zcGFjZS1jaGVjayBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gSXQncyBubyBsb25nZXIgcG9zc2libGUgdG8gY29uc2lkZXIgZW1wdHkgbGluZSBsaWtlIGEgYGB0cmFpbGluZy13aGl0ZXNwYWNlYGAgYnkgdXNpbmcgY2xldmVyIG9wdGlvbnMKKworICBDbG9zZSAjMTM2OAorCisqIGBgbWlzc2luZy1rd29hYGAgaXMgbm8gbG9uZ2VyIGVtaXR0ZWQgd2hlbiBkZWFsaW5nIHdpdGggb3ZlcmxvYWQgZnVuY3Rpb25zCisKKyAgQ2xvc2UgIzM2NTUKKworKiBtaXhlZC1pbmRlbnRhdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBpdCBpcyBubyBsb25nZXIgdXNlZnVsIHNpbmNlIFRhYkVycm9yIGlzIGluY2x1ZGVkIGRpcmVjdGx5IGluIHB5dGhvbjMKKworICBDbG9zZSAjMjk4NCAjMzU3MworCisqIEFkZCBgYHN1cGVyLXdpdGgtYXJndW1lbnRzYGAgY2hlY2sgZm9yIGZsYWdnaW5nIGluc3RhbmNlcyBvZiBQeXRob24gMiBzdHlsZSBzdXBlciBjYWxscy4KKworKiBBZGQgYW4gZmFxIGRldGFpbGluZyB3aGljaCBtZXNzYWdlcyB0byBkaXNhYmxlIHRvIGF2b2lkIGR1cGxpY2F0ZXMgdy8gb3RoZXIgcG9wdWxhciBsaW50ZXJzCisKKyogRml4IHN1cGVyZmx1b3VzLXBhcmVucyBmYWxzZS1wb3NpdGl2ZSBmb3IgdGhlIHdhbHJ1cyBvcGVyYXRvcgorCisgIENsb3NlICMzMzgzCisKKyogRml4IGBgZmFpbC11bmRlcmBgIG5vdCBhY2NlcHRpbmcgZmxvYXRzCisKKyogRml4IGEgYnVnIHdpdGggYGBpZ25vcmUtZG9jc3RyaW5nc2BgIGlnbm9yaW5nIGFsbCBsaW5lcyBpbiBhIG1vZHVsZQorCisqIEZpeCBgYHByZS1jb21taXRgYCBjb25maWcgdGhhdCBjb3VsZCBsZWFkIHRvIHVuZGV0ZWN0ZWQgZHVwbGljYXRlIGxpbmVzIG9mIGNvZGUKKworKiBGaXggYSBjcmFzaCBpbiBwYXJhbGxlbCBtb2RlIHdoZW4gdGhlIG1vZHVsZSdzIGZpbGVwYXRoIGlzIG5vdCBzZXQKKworICBDbG9zZSAjMzU2NAorCisqIEFkZCBgYHJhaXNlLW1pc3NpbmctZnJvbWBgIGNoZWNrIGZvciBleGNlcHRpb25zIHRoYXQgc2hvdWxkIGhhdmUgYSBjYXVzZS4KKworKiBTdXBwb3J0IGJvdGggaXNvcnQgNCBhbmQgaXNvcnQgNS4gSWYgeW91IGhhdmUgcGlubmVkIGlzb3J0IDQgaW4geW91ciBwcm9qZXQgcmVxdWlyZW1lbnRzLCBub3RoaW5nIGNoYW5nZXMuIElmIHlvdSB1c2UgaXNvcnQgNSwgdGhvdWdoLCBub3RlIHRoYXQgdGhlIGBga25vd24tc3RhbmRhcmQtbGlicmFyeWBgIG9wdGlvbiBpcyBub3QgaW50ZXJwcmV0ZWQgdGhlIHNhbWUgaW4gaXNvcnQgNCBhbmQgaXNvcnQgNSAoc2VlIHRoZSBtaWdyYXRpb24gZ3VpZGUgaW4gaXNvcnQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzKS4gRm9yIGNvbXBhdGliaWxpdHkncyBzYWtlIGZvciBtb3N0IHB5bGludCB1c2VycywgdGhlIGBga25vd24tc3RhbmRhcmQtbGlicmFyeWBgIG9wdGlvbiBpbiBweWxpbnQgbm93IG1hcHMgdG8gYGBleHRyYS1zdGFuZGFyZC1saWJyYXJ5YGAgaW4gaXNvcnQgNS4gSWYgeW91IHJlYWxseSB3YW50IHdoYXQgYGBrbm93bi1zdGFuZGFyZC1saWJyYXJ5YGAgbm93IG1lYW5zIGluIGlzb3J0IDUsIHlvdSBtdXN0IGRpc2FibGUgdGhlIGBgd3JvbmctaW1wb3J0LW9yZGVyYGAgY2hlY2sgaW4gcHlsaW50IGFuZCBydW4gaXNvcnQgbWFudWFsbHkgd2l0aCBhIHByb3BlciBpc29ydCBjb25maWd1cmF0aW9uIGZpbGUuCisKKyAgQ2xvc2UgIzM3MjIKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjUuND8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqIEZpeCBhIGNyYXNoIGNhdXNlZCBieSBub3QgZ3VhcmRpbmcgYWdhaW5zdCBgYEluZmVyZW5jZUVycm9yYGAgd2hlbiBjYWxsaW5nIGBgaW5mZXJfY2FsbF9yZXN1bHRgYAorCisgIENsb3NlICMzNjkwCisKKyogRml4IGEgY3Jhc2ggaW4gcGFyYWxsZWwgbW9kZSB3aGVuIHRoZSBtb2R1bGUncyBmaWxlcGF0aCBpcyBub3Qgc2V0CisKKyAgQ2xvc2UgIzM1NjQKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjUuMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMjAtMDYtOAorCisqIEZpeCBhIHJlZ3Jlc3Npb24gd2hlcmUgZGlzYWJsZSBjb21tZW50cyB0aGF0IGhhdmUgY2hlY2tlciBuYW1lcyB3aXRoIG51bWJlcnMgaW4gdGhlbSBhcmUgbm90IHBhcnNlZCBjb3JyZWN0bHkKKworICBDbG9zZSAjMzY2NgorCisqIGBgcHJvcGVydHktd2l0aC1wYXJhbWV0ZXJzYGAgcHJvcGVybHkgaGFuZGxlcyBhYnN0cmFjdCBwcm9wZXJ0aWVzCisKKyAgQ2xvc2UgIzM2MDAKKworKiBgYGNvbnRpbnVlLWluLWZpbmFsbHlgYCBubyBsb25nZXIgZW1pdHRlZCBvbiBQeXRob24gMy44IHdoZXJlIGl0J3Mgbm93IHZhbGlkCisKKyAgQ2xvc2UgIzM2MTIKKworKiBGaXggYSByZWdyZXNzaW9uIHdoZXJlIG1lc3NhZ2VzIHdpdGggZGFzaCBhcmUgbm90IGZ1bGx5IHBhcnNlZAorCisgIENsb3NlICMzNjA0CisKKyogSW4gYSBUT01MIGNvbmZpZ3VyYXRpb24gZmlsZSwgaXQncyBub3cgcG9zc2libGUgdG8gdXNlIHJpY2ggKG5vbi1zdHJpbmcpIHR5cGVzLCBzdWNoIGFzIGxpc3QsIGludGVnZXIgb3IgYm9vbGVhbiBpbnN0ZWFkIG9mIHN0cmluZ3MuIEZvciBleGFtcGxlLCBvbmUgY2FuIG5vdyBkZWZpbmUgYSAqbGlzdCogb2YgbWVzc2FnZSBpZGVudGlmaWVycyB0byBlbmFibGUgbGlrZSB0aGlzOjoKKworICAgIGVuYWJsZSA9IFsKKyAgICAgICAgInVzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWQiLAorICAgICAgICAidXNlbGVzcy1zdXBwcmVzc2lvbiIsCisgICAgXQorCisgIENsb3NlICMzNTM4CisKKyogRml4IGEgcmVncmVzc2lvbiB3aGVyZSB0aGUgc2NvcmUgd2FzIG5vdCByZXBvcnRlZCB3aXRoIG11bHRpcGxlIGpvYnMKKworICBDbG9zZSAjMzU0NworCisqIFByb3RlY3QgYWdhaW5zdCBgYEF0dHJpYnV0ZUVycm9yYGAgd2hlbiBjaGVja2luZyBgYGNlbGwtdmFyLWZyb20tbG9vcGBgCisKKyAgQ2xvc2UgIzM2NDYKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjUuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMjAtMDUtMDUKKworKiBgYHB5bGludC5SdW5gYCBhY2NlcHRzIGBgZG9fZXhpdGBgIGFzIGEgZGVwcmVjYXRlZCBwYXJhbWV0ZXIKKworICBDbG9zZSAjMzU5MAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuNS4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAyMC0wNS0wNQorCisqIEZpeCBhIGNyYXNoIGluIGBgbWV0aG9kLWhpZGRlbmBgIGxvb2t1cCBmb3IgdW5rbm93biBiYXNlIGNsYXNzZXMKKworICBDbG9zZSAjMzUyNworCisqIFJldmVydCBweWxpbnQuUnVuJ3MgYGBleGl0YGAgcGFyYW1ldGVyIHRvIGBgZG9fZXhpdGBgCisKKyAgVGhpcyBoYXMgYmVlbiBpbmFkdmVydGVudGx5IGNoYW5nZWQgc2V2ZXJhbCByZWxlYXNlcyBhZ28gdG8gYGBkb19leGl0YGAuCisKKyAgQ2xvc2UgIzM1MzMKKworKiBgYG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJgYCB2YXJpYWRpYyBkZXRlY3Rpb24gaGFzIGltcHJvdmVkIGZvciBhc3NpZ24gc3RhdGVtZW50cworCisgIENsb3NlICMzNTYzCisKKyogQWxsb3cgcGFja2FnZSBmaWxlcyB0byBiZSBwcm9wZXJseSBkaXNjb3ZlcmVkIHdpdGggbXVsdGlwbGUgam9icworCisgIENsb3NlICMzNTI0CisKKyogQWxsb3cgbGludGluZyBkaXJlY3RvcmllcyB3aXRob3V0IGBgX19pbml0X18ucHlgYCB3aGljaCB3YXMgYSByZWdyZXNzaW9uIGluIDIuNS4KKworICBDbG9zZSAjMzUyOAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuNS4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAyMC0wNC0yNworCisqIEZpeCBhIGZhbHNlIG5lZ2F0aXZlIGZvciBgYHVuZGVmaW5lZC12YXJpYWJsZWBgIHdoZW4gdXNpbmcgY2xhc3MgYXR0cmlidXRlIGluIGNvbXByZWhlbnNpb24uCisKKyAgQ2xvc2UgIzM0OTQKKworKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSBmb3IgYGB1bmRlZmluZWQtdmFyaWFibGVgYCB3aGVuIHVzaW5nIGNsYXNzIGF0dHJpYnV0ZSBpbiBkZWNvcmF0b3Igb3IgYXMgdHlwZSBoaW50LgorCisgIENsb3NlICM1MTEKKyAgQ2xvc2UgIzE5NzYKKworKiBSZW1vdmUgSFRNTCBxdW90aW5nIG9mIG1lc3NhZ2VzIGluIEpTT04gb3V0cHV0LgorCisgIENsb3NlICMyNzY5CisKKyogQWRqdXN0IHRoZSBgYGludmFsaWQtbmFtZWBgIHJ1bGUgdG8gd29yayB3aXRoIG5vbi1BU0NJSSBpZGVudGlmaWVycyBhbmQgYWRkIHRoZSBgYG5vbi1hc2NpaS1uYW1lYGAgcnVsZS4KKworICBDbG9zZSAjMjcyNQorCisqIFBvc2l0aW9uYWwtb25seSBhcmd1bWVudHMgYXJlIHRha2VuIGluIGFjY291bnQgZm9yIGBgdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uYGAKKworKiBgYHVuaWRpb21hdGljLXR5cGVjaGVja2BgIGlzIG5vIGxvbmdlciBlbWl0dGVkIGZvciBgYGluYGAgYW5kIGBgbm90IGluYGAgb3BlcmF0b3JzCisKKyAgQ2xvc2UgIzMzMzcKKworKiBQb3NpdGlvbmFsLW9ubHkgYXJndW1lbnQgYW5ub3RhdGlvbnMgYXJlIHRha2VuIGluIGFjY291bnQgZm9yIGBgdW51c2VkLWltcG9ydGBgCisKKyAgQ2xvc2UgIzM0NjIKKworKiBBZGQgYSBjb21tYW5kIHRvIGxpc3QgYXZhaWxhYmxlIGV4dGVuc2lvbnMuCisKKyogQWxsb3cgdXNlZCB2YXJpYWJsZXMgdG8gYmUgcHJvcGVybHkgY29uc3VtZWQgd2hlbiBkaWZmZXJlbnQgY2hlY2tzIGFyZSBlbmFibGVkIC8gZGlzYWJsZWQKKworICBDbG9zZSAjMzQ0NQorCisqIEZpeCBkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZSBydWxlIHRvIGFjY291bnQgZm9yIGtleXdvcmQgYXJndW1lbnQgZGVmYXVsdHMKKworICBDbG9zZSAjMzM3MworCisqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIG9mIGBgc2VsZi1hc3NpZ25pbmctdmFyaWFibGVgYCBvbiB0dXBsZSB1bnBhY2tpbmcuCisKKyAgQ2xvc2UgIzM0MzMKKworKiBgYG5vLXNlbGYtdXNlYGAgaXMgbm8gbG9uZ2VyIGVtaXR0ZWQgZm9yIHR5cGluZyBzdHVicy4KKworICBDbG9zZSAjMzQzOQorCisqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIGZvciBgYHVuZGVmaW5lZC12YXJpYWJsZWBgIHdoZW4gYGBfX2NsYXNzX19gYCBpcyB1c2VkCisKKyAgQ2xvc2UgIzMwOTAKKworKiBFbWl0IGBgaW52YWxpZC1uYW1lYGAgZm9yIHZhcmlhYmxlcyBkZWZpbmVkIGluIGxvb3BzIGF0IG1vZHVsZSBsZXZlbC4KKworICBDbG9zZSAjMjY5NQorCisqIEFkZCBhIGNoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBgaXNpbnN0YW5jZWBgIGlzIG5vdCBhIHR5cGUuCisKKyAgQ2xvc2UgIzMzMDgKKworKiBBZGQgJ25vdGVzLXJneCcgb3B0aW9uLCB0byBiZSB1c2VkIGZvciBmaXhtZSBjaGVjay4KKworICBDbG9zZSAjMjg3NAorCisqIGBgZnVuY3Rpb24tcmVkZWZpbmVkYGAgZXhlbXB0cyBmdW5jdGlvbiByZWRlZmluZWQgb24gYSBjb25kaXRpb24uCisKKyAgQ2xvc2UgIzI0MTAKKworKiBgYHR5cGluZy5vdmVybG9hZGBgIGZ1bmN0aW9ucyBhcmUgZXhlbXB0ZWQgZnJvbSBkb2NzdHJpbmcgY2hlY2tzCisKKyAgQ2xvc2UgIzMzNTAKKworKiBFbWl0IGBgaW52YWxpZC1vdmVycmlkZGVuLW1ldGhvZGBgIGZvciBpbXByb3BlciBhc3luYyBkZWYgb3ZlcnJpZGVzLgorCisgIENsb3NlICMzMzU1CisKKyogRG8gbm90IGFsbG93IGBgcHl0aG9uIC1tIHB5bGludCAuLi5gYCB0byBpbXBvcnQgdXNlciBjb2RlCisKKyAgYGBweXRob24gLW0gcHlsaW50IC4uLmBgIGFkZHMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYXMgdGhlIGZpcnN0IGVsZW1lbnQKKyAgb2YgYGBzeXMucGF0aGBgLiBUaGlzIG9wZW5zIHVwIGEgcG90ZW50aWFsIHNlY3VyaXR5IGhvbGUgd2hlcmUgYGBweWxpbnRgYCB3aWxsIGltcG9ydAorICB1c2VyIGxldmVsIGNvZGUgYXMgbG9uZyBhcyB0aGF0IGNvZGUgcmVzaWRlcyBpbiBtb2R1bGVzIGhhdmluZyB0aGUgc2FtZSBuYW1lIGFzIHN0ZGxpYgorICBvciBweWxpbnQncyBvd24gbW9kdWxlcy4KKworICBDbG9zZSAjMzM4NgorCisqIEFkZCBgYGR1bW15LXZhcmlhYmxlcy1yZ3hgYCBvcHRpb24gZm9yIGBgX3JlZGVjbGFyZWQtYXNzaWduZWQtbmFtZWBgIGNoZWNrLgorCisgIENsb3NlICMzMzQxCisKKyogRml4ZWQgZ3JhcGggY3JlYXRpb24gZm9yIHJlbGF0aXZlIHBhdGhzCisKKyogQWRkIGEgY2hlY2sgZm9yIGFzc2VydHMgb24gc3RyaW5nIGxpdGVyYWxzLgorCisgIENsb3NlICMzMjg0CisKKyogYGBub3QgaW5gYCBpcyBjb25zaWRlcmVkIGl0ZXJhdGluZyBjb250ZXh0IGZvciBzb21lIG9mIHRoZSBQeXRob24gMyBwb3J0aW5nIGNoZWNrZXJzLgorCisqIEEgbmV3IGNoZWNrIGBgaW5jb25zaXN0ZW50LXF1b3Rlc2BgIHdhcyBhZGRlZC4KKworKiBBZGQgYSBjaGVjayBmb3Igbm9uIHN0cmluZyBhc3NpZ25tZW50IHRvIF9fbmFtZV9fIGF0dHJpYnV0ZS4KKworICBDbG9zZSAjNTgzCisKKyogYGBfX3Bvd19fYGAsIGBgX19pbWF0bXVsX19gYCwgYGBfX3RydW5jX19gYCwgYGBfX2Zsb29yX19gYCwgYW5kIGBgX19jZWlsX19gYCBhcmUgcmVjb2duaXplZCBhcyBzcGVjaWFsIG1ldGhvZCBuYW1lcy4KKworICBDbG9zZSAjMzI4MQorCisqIEFkZGVkIGVycm9ycyBmb3IgcHJvdG9jb2wgZnVuY3Rpb25zIHdoZW4gaW52YWxpZCByZXR1cm4gdHlwZXMgYXJlIGRldGVjdGVkLgorICBFMDMwNCAoaW52YWxpZC1ib29sLXJldHVybmVkKTogX19ib29sX18gZGlkIG5vdCByZXR1cm4gYSBib29sCisgIEUwMzA1IChpbnZhbGlkLWluZGV4LXJldHVybmVkKTogX19pbmRleF9fIGRpZCBub3QgcmV0dXJuIGFuIGludGVnZXIKKyAgRTAzMDYgKGludmFsaWQtcmVwci1yZXR1cm5lZCk6IF9fcmVwcl9fIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nCisgIEUwMzA3IChpbnZhbGlkLXN0ci1yZXR1cm5lZCk6IF9fc3RyX18gZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcKKyAgRTAzMDggKGludmFsaWQtYnl0ZXMtcmV0dXJuZWQpOiBfX2J5dGVzX18gZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcKKyAgRTAzMDkgKGludmFsaWQtaGFzaC1yZXR1cm5lZCk6IF9faGFzaF9fIGRpZCBub3QgcmV0dXJuIGFuIGludGVnZXIKKyAgRTAzMTAgKGludmFsaWQtbGVuZ3RoLWhpbnQtcmV0dXJuZWQpOiBfX2xlbmd0aF9oaW50X18gZGlkIG5vdCByZXR1cm4gYSBub24tbmVnYXRpdmUgaW50ZWdlcgorICBFMDMxMSAoaW52YWxpZC1mb3JtYXQtcmV0dXJuZWQpOiBfX2Zvcm1hdF9fIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nCisgIEUwMzEyIChpbnZhbGlkLWdldG5ld2FyZ3MtcmV0dXJuZWQpOiBfX2dldG5ld2FyZ3NfXyBkaWQgbm90IHJldHVybiBhIHR1cGxlCisgIEUwMzEzIChpbnZhbGlkLWdldG5ld2FyZ3MtZXgtcmV0dXJuZWQpOiBfX2dldG5ld2FyZ3NfZXhfXyBkaWQgbm90IHJldHVybiBhIHR1cGxlIG9mIHRoZSBmb3JtICh0dXBsZSwgZGljdCkKKworICBDbG9zZSAjNTYwCisKKyogYGBtaXNzaW5nLSotZG9jc3RyaW5nYGAgY2FuIGxvb2sgZm9yIGBgX19kb2NfX2BgIGFzc2lnbm1lbnRzLgorCisgIENsb3NlICMzMzAxCisKKyogYGB1bmRlZmluZWQtdmFyaWFibGVgYCBjYW4gbm93IGZpbmQgdW5kZWZpbmVkIGxvb3AgaXRlcmFibGVzCisKKyAgQ2xvc2UgIzQ5OAorCisqIGBgc2FmZV9pbmZlcmBgIGNhbiBpbmZlciBhIHZhbHVlIGFzIGxvbmcgYXMgYWxsIHRoZSBwYXRocyBzaGFyZSB0aGUgc2FtZSB0eXBlLgorCisgIENsb3NlICMyNTAzCisKKyogQWRkIGEgLS1mYWlsLXVuZGVyIDxzY29yZT4gZmxhZywgYWxzbyBjb25maWd1cmFibGUgaW4gYSAucHlsaW50cmMgZmlsZS4gSWYgdGhlIGZpbmFsIHNjb3JlIGlzIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIHNjb3JlLCBpdCdzIGNvbnNpZGVyZWQgYSBzdWNjZXNzIGFuZCBweWxpbnQgZXhpdHMgd2l0aCBleGl0Y29kZSAwLiBPdGhlcndpc2UsIGl0J3MgY29uc2lkZXJlZCBhIGZhaWx1cmUgYW5kIHB5bGludCBleGl0cyB3aXRoIGl0cyBjdXJyZW50IGV4aXRjb2RlIGJhc2VkIG9uIHRoZSBtZXNzYWdlcyBpc3N1ZWQuCisKKyAgQ2xvc2UgIzIyNDIKKworKiBEb24ndCBlbWl0IGBgbGluZS10b28tbG9uZ2BgIGZvciBtdWx0aWxpbmVzIHdoZW4gYGBkaXNhYmxlPWxpbmUtdG9vLWxvbmdgYCBjb21tZW50IHN0YW5kcyBhdCB0aGVpciBlbmQKKworICBDbG9zZSAjMjk1NworCisqIEZpeGVkIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBjYXVzZWQgYnkgaW1wcm9wZXIgaGFuZGxpbmcgb2YgYGBkYXRhY2xhc3Nlc2BgIGluZmVyZW5jZSBpbiBgYHB5cmV2ZXJzZWBgCisKKyAgQ2xvc2UgIzMyNTYKKworKiBEbyBub3QgZXhlbXB0IGJhcmUgZXhjZXB0IGZyb20gYGB1bmRlZmluZWQtdmFyaWFibGVgYCBhbmQgc2ltaWxhciBjaGVja3MKKworICBJZiBhIG5vZGUgd2FzIHdyYXBwZWQgaW4gYSBgYFRyeUV4Y2VwdGBgLCBgYHB5bGludGBgIHdhcyB0YWtpbmcgYSBoaW50CisgIGZyb20gdGhlIGV4Y2VwdCBoYW5kbGVyIHdoZW4gZGVjaWRpbmcgdG8gZW1pdCBvciBub3QgYSBtZXNzYWdlLgorICBXZSB3ZXJlIHRyZWF0aW5nIGJhcmUgZXhjZXB0IGFzIGEgZnVsbHkgZmxlZGdlZCBpZ25vcmUgYnV0IG9ubHkKKyAgdGhlIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9ucyBzaG91bGQgYmUgaGFuZGxlZCB0aGF0IHdheSAoZS5nLiBgYE5hbWVFcnJvcmBgIG9yIGBgSW1wb3J0RXJyb3JgYCkKKworICBDbG9zZSAjMzIzNQorCisqIE5vIGxvbmdlciBlbWl0IGBgYXNzaWdubWVudC1mcm9tLW5vLXJldHVybmBgIHdoZW4gYSBmdW5jdGlvbiBvbmx5IHJhaXNlcyBhbiBleGNlcHRpb24KKworICBDbG9zZSAjMzIxOAorCisqIEFsbG93IGltcG9ydCBhbGlhc2VzIHRvIGV4ZW1wdCBgYGltcG9ydC1lcnJvcmBgIHdoZW4gdXNlZCBpbiB0eXBlIGFubm90YXRpb25zLgorCisgIENsb3NlICMzMTc4CisKKyogYGBFbGxpcHNpc2AgaXMgZXhlbXB0ZWQgZnJvbSBgYG11bHRpcGxlLXN0YXRlbWVudHNgYCBmb3IgZnVuY3Rpb24gb3ZlcmxvYWRzLgorCisgIENsb3NlICMzMjI0CisKKyogTm8gbG9uZ2VyIGVtaXQgYGBpbnZhbGlkLW5hbWVgYCBmb3Igbm9uLWNvbnN0YW50cyBmb3VuZCBhdCBtb2R1bGUgbGV2ZWwuCisKKyAgUHlsaW50IHdhcyB0YWtpbmcgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgZnJvbSBQRVAtOCB0b28gZmFyLCBjb25zaWRlcmluZworICBhbGwgbW9kdWxlIGxldmVsIHZhcmlhYmxlcyBhcyBjb25zdGFudHMsIHdoaWNoIGlzIG5vdCB3aGF0IHRoZSBzdGF0ZW1lbnQgaXMgc2F5aW5nOgorCisgIGBDb25zdGFudHMgYXJlIHVzdWFsbHkgZGVmaW5lZCBvbiBhIG1vZHVsZSBsZXZlbCBhbmQgd3JpdHRlbiBpbgorICBhbGwgY2FwaXRhbCBsZXR0ZXJzIHdpdGggdW5kZXJzY29yZXMgc2VwYXJhdGluZyB3b3Jkcy5gCisKKyAgQ2xvc2UgIzMxMTEKKyAgQ2xvc2UgIzMxMzIKKworKiBBbGxvdyBgYGltcGxpY2l0LXN0ci1jb25jYXQtaW4tc2VxdWVuY2VgYCB0byBiZSBlbWl0dGVkIGZvciBzdHJpbmcganV4dGFwb3NpdGlvbgorCisgIENsb3NlICMzMDMwCisKKyogYGBpbXBsaWNpdC1zdHItY29uY2F0LWluLXNlcXVlbmNlYGAgd2FzIHJlbmFtZWQgYGBpbXBsaWNpdC1zdHItY29uY2F0YGAKKworKiBUaGUgYGBqc29uYGAgcmVwb3J0ZXIgbm8gbG9uZ2VyIGJ5cGFzc2VzIGBgcmVkaXJlY3Rfc3Rkb3V0YGAuIENsb3NlICMzMjI3CisKKyogTW92ZSBgYE5vRmlsZUVycm9yYGAsIGBgT3V0cHV0TGluZWBgLCBgYEZ1bmN0aW9uYWxUZXN0UmVwb3J0ZXJgYCwKKyAgYGBGdW5jdGlvbmFsVGVzdEZpbGVgYCwgYGBMaW50TW9kdWxlVGVzdGBgIGFuZCByZWxhdGVkIG1ldGhvZHMgZnJvbQorICBgYHRlc3RfZnVuY3Rpb25hbC5weWBgIHRvIGBgcHlsaW50LnRlc3R1dGlsc2BgIHRvIGhlbHAgdGVzdGluZyBmb3IgM3JkCisgIHBhcnR5IHB5bGludCBwbHVnaW5zLgorCisqIENhbiByZWFkIGNvbmZpZyBmcm9tIGEgc2V0dXAuY2ZnIG9yIHB5cHJvamVjdC50b21sIGZpbGUuCisKKyAgQ2xvc2UgIzYxNworCisqIEZpeCBleGNlcHRpb24tZXNjYXBlIGZhbHNlIHBvc2l0aXZlIHdpdGggZ2VuZXJhdG9ycworCisgIENsb3NlICMzMTI4CisKKyogYGBpbnNwZWN0LmdldGFyZ3ZhbHVlc2BgIGlzIG5vIGxvbmdlciBtYXJrZWQgYXMgZGVwcmVjYXRlZC4KKworKiBBIG5ldyBjaGVjayBgYGYtc3RyaW5nLXdpdGhvdXQtaW50ZXJwb2xhdGlvbmBgIHdhcyBhZGRlZAorCisgIENsb3NlICMzMTkwCisKKyogRmxhZyBtdXRhYmxlIGBgY29sbGVjdGlvbnMuKmBgIHV0aWxpdGllcyBhcyBkYW5nZXJvdXMgZGVmYXVsdHMKKworICBDbG9zZSAjMzE4MworCisqIGBgZG9jcGFyYW1zYGAgZXh0ZW5zaW9uIHN1cHBvcnRzIG11bHRpcGxlIHR5cGVzIGluIHJhaXNlcyBzZWN0aW9ucy4KKworICBNdWx0aXBsZSB0eXBlcyBjYW4gYWxzbyBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzIGluIGFsbCB2YWxpZCBzZWN0aW9ucy4KKworICBDbG9zZXMgIzI3MjkKKworKiBBbGxvdyBwYXJhbGxlbCBsaW50aW5nIHdoZW4gcnVuIHVuZGVyIFByb3NwZWN0b3IKKworKiBGaXhlZCBmYWxzZSBwb3NpdGl2ZXMgb2YgYGBtZXRob2QtaGlkZGVuYGAgd2hlbiBhIHN1YmNsYXNzIGRlZmluZXMgdGhlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIGhpZGRlbi4KKworICBDbG9zZXMgIzQxNAorCisqIFB5dGhvbiAzIHBvcnRpbmcgbW9kZSBpcyAzMC01MCUgZmFzdGVyIG9uIG1vc3QgY29kZWJhc2VzCisKKyogUHl0aG9uIDMgcG9ydGluZyBtb2RlIG5vIGxvbmdlciBzd2FsbG93cyBzeW50YXggZXJyb3JzCisKKyAgQ2xvc2VzICMyOTU2CisKKyogUGFzcyB0aGUgYWN0dWFsIFB5TGludGVyIG9iamVjdCB0byBzdWIgcHJvY2Vzc2VzIHRvIGFsbG93IHVzaW5nIGN1c3RvbQorICBQeUxpbnRlciBjbGFzc2VzLgorCisgIFB5TGludGVyIG9iamVjdCAoYW5kIGFsbCBpdHMgbWVtYmVycyBleGNlcHQgcmVwb3J0ZXIpIG5lZWRzIHRvIHN1cHBvcnQKKyAgcGlja2xpbmcgc28gdGhlIFB5TGludGVyIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIHdvcmtlciBwcm9jZXNzZXMuCisKKyogQ2xlYW4gdXAgc2V0dXAucHkKKworICBNYWtlIHB5dGVzdC1ydW5uZXIgYSByZXF1aXJlbWVudCBvbmx5IGlmIHJ1bm5pbmcgdGVzdHMsIHNpbWlsYXIgdG8gTWNDYWJlLgorCisgIENsZWFuIHVwIHRoZSBzZXR1cC5weSBmaWxlLCByZXNvbHZpbmcgYSBudW1iZXIgb2Ygd2FybmluZ3MgYXJvdW5kIGl0LgorCisqIEhhbmRsZSBTeW50YXhFcnJvciBpbiBmaWxlcyBwYXNzZWQgdmlhIGBgLS1mcm9tLXN0ZGluYGAgb3B0aW9uCisKKyAgUHlsaW50IG5vIGxvbmdlciBvdXRwdXRzIGEgdHJhY2ViYWNrLCBpZiBhIGZpbGUsIHJlYWQgZnJvbSBzdGRpbiwKKyAgY29udGFpbnMgYSBzeW50YXhlcnJvci4KKworKiBGaXggdXBwZXJjYXNlIHN0eWxlIHRvIGRpc2FsbG93IDMrIHVwcGVyY2FzZSBmb2xsb3dlZCBieSBsb3dlcmNhc2UuCisKKyogRml4ZWQgYGB1bmRlZmluZWQtdmFyaWFibGVgYCBhbmQgYGB1bnVzZWQtaW1wb3J0YGAgZmFsc2UgcG9zaXRpdmVzCisgIHdoZW4gdXNpbmcgYSBtZXRhY2xhc3MgdmlhIGFuIGF0dHJpYnV0ZS4KKworICBDbG9zZSAjMTYwMworCisqIEVtaXQgYGB1bnVzZWQtYXJndW1lbnRgYCBmb3IgZnVuY3Rpb25zIHRoYXQgcGFydGlhbGx5IHVzZXMgdGhlaXIgYXJndW1lbnQgbGlzdCBiZWZvcmUgcmFpc2luZyBhbiBleGNlcHRpb24uCisKKyAgQ2xvc2UgIzMyNDYKKworKiBGaXhlZCBgYGJyb2FkX3RyeV9jbGF1c2VgYCBleHRlbnNpb24gdG8gY2hlY2sgdHJ5L2ZpbmFsbHkgc3RhdGVtZW50cyBhbmQgdG8KKyAgY2hlY2sgZm9yIG5lc3RlZCBzdGF0ZW1lbnRzIChlLmcuLCBpbnNpZGUgb2YgYW4gYGBpZmBgIHN0YXRlbWVudCkuCisKKyogUmVjb2duaXplIGNsYXNzZXMgZXhwbGljaXRseSBpbmhlcml0aW5nIGZyb20gYGBhYmMuQUJDYGAgb3IgaGF2aW5nIGFuCisgIGBgYWJjLkFCQ01ldGFgYCBtZXRhY2xhc3MgYXMgYWJzdHJhY3QuIFRoaXMgbWFrZXMgdGhlbSBub3QgdHJpZ2dlciBXMDIyMy4KKworICBDbG9zZXMgIzMwOTgKKworKiBGaXggb3ZlcnplYWxvdXMgYGBhcmd1bWVudHMtZGlmZmVyYGAgd2hlbiBvdmVycmlkZGVuIGZ1bmN0aW9uIHVzZXMgdmFyaWFkaWNzCisKKyAgTm8gbWVzc2FnZSBpcyBlbWl0dGVkIGlmIHRoZSBvdmVycmlkaW5nIGZ1bmN0aW9uIHByb3ZpZGVzIHBvc2l0aW9uYWwgb3IKKyAga2V5d29yZCB2YXJpYWRpY3MgaW4gaXRzIHNpZ25hdHVyZSB0aGF0IGNhbiBmZWFzaWJseSBhY2NlcHQgYW5kIHBhc3Mgb24KKyAgYWxsIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIG92ZXJyaWRkZW4gZnVuY3Rpb24uCisKKyAgQ2xvc2UgIzE0ODIKKyAgQ2xvc2UgIzE1NTMKKworKiBNdWx0aXBsZSB0eXBlcyBvZiBzdHJpbmcgZm9ybWF0dGluZyBhcmUgYWxsb3dlZCBpbiBsb2dnaW5nIGZ1bmN0aW9ucy4KKworICBUaGUgYGBsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbmBgIG1lc3NhZ2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHRvIGFsbG93CisgIG11bHRpcGxlIHR5cGVzIG9mIHN0cmluZyBmb3JtYXR0aW5nIHRvIGJlIHVzZWQuCisKKyAgQ2xvc2UgIzMzNjEKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjQuND8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorUmVsZWFzZSBkYXRlOiAyMDE5LTExLTEzCisKKyogRXhlbXB0IGFsbCB0aGUgbmFtZXMgZm91bmQgaW4gdHlwZSBhbm5vdGF0aW9ucyBmcm9tIGBgdW51c2VkLWltcG9ydGBgCisKKyAgVGhlIHByZXZpb3VzIGNvZGUgd2FzIGFzc3VtaW5nIHRoYXQgb25seSBgYHR5cGluZ2BgIG5hbWVzIG5lZWQgdG8gYmUKKyAgZXhlbXB0ZWQsIGJ1dCB3ZSBuZWVkIHRvIGRvIHRoYXQgZm9yIHRoZSByZXN0IG9mIHRoZSB0eXBlIGNvbW1lbnQKKyAgbmFtZXMgYXMgd2VsbC4KKworICBDbG9zZSAjMzExMgorCisqIFJlbGF4IHR5cGUgaW1wb3J0IGRldGVjdGlvbiBmb3IgbmFtZXMgdGhhdCBkbyBub3QgY29tZSBmcm9tIHRoZSBgYHR5cGluZ2BgIG1vZHVsZQorCisgIENsb3NlICMzMTkxCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi40LjM/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE5LTEwLTE4CisKKyogRml4IGFuIGlzc3VlIHdpdGggYGB1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uYGAgaW4gY29tcHJlaGVuc2lvbnMgd2l0aCBhZGRpdGlvbmFsIHJlcGFja2luZyBvZiBlbGVtZW50cy4KKworICBDbG9zZSAjMzE0OAorCisqIGBgaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWxgYCBpcyBlbWl0dGVkIGZvciBgYEltcG9ydEZyb21gYCBub2RlcyBhcyB3ZWxsLgorCisgIENsb3NlICMzMTc1CisKKyogRG8gbm90IGVtaXQgYGBuby1tZXRob2QtYXJndW1lbnRgYCBmb3IgZnVuY3Rpb25zIHVzaW5nIHBvc2l0aW9uYWwgb25seSBhcmdzLgorCisgIENsb3NlICMzMTYxCisKKyogYGBjb25zaWRlci11c2luZy1zeXMtZXhpdGBgIGlzIG5vIGxvbmdlciBlbWl0dGVkIHdoZW4gYGBleGl0YGAgaXMgaW1wb3J0ZWQgaW4gdGhlIGxvY2FsIHNjb3BlLgorCisgIENsb3NlICMzMTQ3CisKKyogYGBpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kYGAgdGFrZXMgYGBhYmMuYWJzdHJhY3Rwcm9wZXJ0eWBgIGluIGFjY291bnQKKworICBDbG9zZSAjMzE1MAorCisqIEZpeGVkIGBgbWlzc2luZy15aWVsZC10eXBlLWRvY2BgIGdldHRpbmcgaW5jb3JyZWN0bHkgcmFpc2VkIHdoZW4KKyAgYSBnZW5lcmF0b3IgZG9lcyBub3QgZG9jdW1lbnQgYSB5aWVsZCB0eXBlIGJ1dCBoYXMgYSB0eXBlIGFubm90YXRpb24uCisKKyAgQ2xvc2VzICMzMTg1CisKKyogYGB0eXBpbmcub3ZlcmxvYWRgYCBmdW5jdGlvbnMgYXJlIGV4ZW1wdGVkIGZyb20gYGB0b28tbWFueS1mdW5jdGlvbi1hcmdzYGAKKworICBDbG9zZSAjMzE3MAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuNC4yPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxOS0wOS0zMAorCisKKyogYGBpZ25vcmVkLW1vZHVsZXNgYCBjYW4gc2tpcCBzdWJtb2R1bGVzLiBDbG9zZSAjMzEzNQorCisqIGBgc2VsZi1hc3NpZ25pbmctdmFyaWFibGVgYCBza2lwcyBjbGFzcyBsZXZlbCBhc3NpZ25tZW50cy4KKworICAgQ2xvc2UgIzI5MzAKKworKiBgYGNvbnNpZGVyLXVzaW5nLXN5cy1leGl0YGAgaXMgZXhlbXB0ZWQgd2hlbiBgYGV4aXQoKWBgIGlzIGltcG9ydGVkIGZyb20gYGBzeXNgYAorCisgICBDbG9zZSAjMzE0NQorCisqIEV4ZW1wdCBhbm5vdGF0ZWQgYXNzaWdubWVudHMgd2l0aG91dCB2YXJpYWJsZSBmcm9tIGBgY2xhc3MtdmFyaWFibGUtc2xvdHMtY29uZmxpY3RgYAorCisgIENsb3NlICMzMTQxCisKKyogRml4IGBgdXRpbHMuaXNfZXJyb3JgYCB0byBhY2NvdW50IGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGVhcmx5LgorCisgIFRoaXMgZml4ZXMgYSBmYWxzZSBuZWdhdGl2ZSB3aXRoIGBgdW51c2VkLXZhcmlhYmxlYGAgd2hpY2ggd2FzIG5vIGxvbmdlciB0cmlnZ2VyZWQKKyAgd2hlbiBhIGZ1bmN0aW9uIHJhaXNlZCBhbiBleGNlcHRpb24gYXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sIGJ1dCB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24KKyAgc3RpbGwgaGFkIHVudXNlZCB2YXJpYWJsZXMuCisKKyAgQ2xvc2UgIzMwMjgKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjQuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTktMDktMjUKKworCisqIEV4ZW1wdCB0eXBlIGNoZWNraW5nIGRlZmluaXRpb25zIGRlZmluZWQgaW4gYm90aCBjbGF1c2VzIG9mIGEgdHlwZSBjaGVja2luZyBndWFyZAorCisgIENsb3NlICMzMTI3CisKKworKiBFeGVtcHQgdHlwZSBjaGVja2luZyBkZWZpbml0aW9ucyBpbnNpZGUgdGhlIHR5cGUgY2hlY2sgZ3VhcmQKKworICBJbiBhN2YyMzY1MjhiYjM3NTg4ODZiOTcyODVhNTZmM2Y5Y2U1YjEzYTk5IHdlIGFkZGVkIGJhc2ljIHN1cHBvcnQKKyAgZm9yIGVtaXR0aW5nIGBgdXNlZC1iZWZvcmUtYXNzaWdubWVudGBgIGlmIGEgdmFyaWFibGUgd2FzIG9ubHkgZGVmaW5lZAorICBpbnNpZGUgYSB0eXBlIGNoZWNraW5nIGd1YXJkICh1c2luZyBgYFRZUEVfQ0hFQ0tJTkdgYCB2YXJpYWJsZSBmcm9tIGB0eXBpbmdgKQorICBVbmZvcnR1bmF0ZWx5IHRoYXQgbWlzc2VkIHRoZSBjYXNlIG9mIHVzaW5nIHRob3NlIHR5cGUgY2hlY2tpbmcgaW1wb3J0cworICBpbnNpZGUgdGhlIGd1YXJkIGl0c2VsZiwgd2hpY2ggdHJpZ2dlcmVkIHNwdXJpb3VzIHVzZWQtYmVmb3JlLWFzc2lnbm1lbnQgZXJyb3JzLgorCisgIENsb3NlICMzMTE5CisKKyogUmVxdWlyZSBhc3Ryb2lkID49IDIuMyB0byBhdm9pZCBhbnkgY29tcGF0aWJpbGl0eSBpc3N1ZXMuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi40LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE5LTA5LTI0CisKKyogTmV3IGNoZWNrOiBgYGltcG9ydC1vdXRzaWRlLXRvcGxldmVsYGAKKworICBUaGlzIGNoZWNrIHdhcm5zIHdoZW4gbW9kdWxlcyBhcmUgaW1wb3J0ZWQgZnJvbSBwbGFjZXMgb3RoZXIgdGhhbiBhCisgIG1vZHVsZSB0b3BsZXZlbCwgZS5nLiBpbnNpZGUgYSBmdW5jdGlvbiBvciBhIGNsYXNzLgorCisqIEhhbmRsZSBpbmZlcmVuY2UgYW1iaWd1aXR5IGZvciBgYGludmFsaWQtZm9ybWF0LWluZGV4YGAKKworICBDbG9zZSAjMjc1MgorCisqIFJlbW92ZWQgUHl0aG9uIDIgc3BlY2lmaWMgY2hlY2tzIHN1Y2ggYXMgYGByZWxhdGl2ZS1pbXBvcnRgYCwKKyAgYGBpbnZhbGlkLWVuY29kZWQtZGF0YWBgLCBgYG1pc3Npbmctc3VwZXItYXJndW1lbnRgYC4KKworKiBTdXBwb3J0IGZvcndhcmQgcmVmZXJlbmNlcyBmb3IgYGBmdW5jdGlvbi1yZWRlZmluZWRgYCBjaGVjay4KKworICBDbG9zZSAjMjU0MAorCisqIEhhbmRsZSByZWRlZmluaXRpb25zIGluIGNhc2Ugb2YgdHlwZSBjaGVja2luZyBpbXBvcnRzLgorCisgIENsb3NlICMyODM0CisKKyogQWRkZWQgYSBuZXcgY2hlY2ssIGBgY29uc2lkZXItdXNpbmctc3lzLWV4aXRgYAorCisgIFRoaXMgY2hlY2sgaXMgZW1pdHRlZCB3aGVuIHdlIGRldGVjdCB0aGF0IGEgcXVpdCgpIG9yIGV4aXQoKSBpcyBpbnZva2VkCisgIGluc3RlYWQgb2Ygc3lzLmV4aXQoKSwgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCB3YXkgb2YgZXhpdGluZyBpbiBwcm9ncmFtLgorCisgIENsb3NlICMyOTI1CisKKyogYGB1c2VsZXNzLXN1cHByZXNzaW9uYGAgY2hlY2sgbm93IGlnbm9yZXMgYGBjeWNsaWMtaW1wb3J0YGAgc3VwcHJlc3Npb25zLAorICB3aGljaCBjb3VsZCBsZWFkIHRvIGZhbHNlIHBvc3RpaXZlcyBkdWUgdG8gaW5jb21wbGV0ZSBjb250ZXh0IGF0IHRoZSB0aW1lCisgIG9mIHRoZSBjaGVjay4KKworICBDbG9zZSAjMzA2NAorCisqIEFkZGVkIG5ldyBjaGVja3MsIGBgbm8tZWxzZS1icmVha2BgIGFuZCBgYG5vLWVsc2UtY29udGludWVgYAorCisgIFRoZXNlIGNoZWNrcyBoaWdobGlnaHQgdW5uZWNlc3NhcnkgYGBlbHNlYGAgYW5kIGBgZWxpZmBgIGJsb2NrcyBhZnRlcgorICBgYGJyZWFrYGAgYW5kIGBgY29udGludWVgYCBzdGF0ZW1lbnRzLgorCisgIENsb3NlICMyMzI3CisKKyogRG9uJ3QgZW1pdCBgYHByb3RlY3RlZC1hY2Nlc3NgYCB3aGVuIGEgc2luZ2xlIHVuZGVyc2NvcmUgcHJlZml4ZWQgYXR0cmlidXRlCisgIGlzIHVzZWQgaW5zaWRlIGEgc3BlY2lhbCBtZXRob2QKKworICBDbG9zZSAjMTgwMgorCisqIEZpeCB0aGUgInN0YXRlbWVudCIgdmFsdWVzIGluIHRoZSBQeUxpbnRlcidzIHN0YXRzIHJlcG9ydHMgYnkgbW9kdWxlLgorCisqIEFkZGVkIGEgbmV3IGNoZWNrLCBgYGludmFsaWQtb3ZlcnJpZGRlbi1tZXRob2RgYAorCisgIFRoaXMgY2hlY2sgaXMgZW1pdHRlZCB3aGVuIHdlIGRldGVjdCB0aGF0IGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4KKyAgYXMgYSBwcm9wZXJ0eSBvciBhIHByb3BlcnR5IGlzIG92ZXJyaWRkZW4gYXMgYSBtZXRob2QuIFRoaXMgY2FuIGluZGljYXRlCisgIGEgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRoYXQgd2lsbCB0cmlnZ2VyIGEgcnVudGltZSBlcnJvci4KKworICBDbG9zZSAjMjY3MAorCisqIEFkZGVkIGEgbmV3IGNoZWNrLCBgYGFyZ3VtZW50cy1vdXQtb2Ytb3JkZXJgYAorCisgIFRoaXMgY2hlY2sgd2FybnMgaWYgeW91IGhhdmUgYXJndW1lbnRzIHdpdGggbmFtZXMgdGhhdCBtYXRjaCB0aG9zZSBpbgorICBhIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlIGJ1dCB5b3UgYXJlIHBhc3NpbmcgdGhlbSBpbiB0byB0aGUgZnVuY3Rpb24KKyAgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCisKKyAgQ2xvc2UgIzI5NzUKKworKiBBZGRlZCBhIG5ldyBjaGVjaywgYGByZWRlY2xhcmVkLWFzc2lnbmVkLW5hbWVgYAorCisgIFRoaXMgY2hlY2sgaXMgZW1pdHRlZCB3aGVuIGBgcHlsaW50YGAgZGV0ZWN0cyB0aGF0IGEgbmFtZQorICB3YXMgYXNzaWduZWQgb25lIG9yIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGFzc2lnbm1lbnQsCisgIHdoaWNoIGluZGljYXRlIGEgcG90ZW50aWFsIGJ1Zy4KKyAgQ2xvc2UgIzI4OTgKKworKiBJZ25vcmUgbGFtYmRhIGNhbGxzIHdpdGggdmFyaWFkaWMgYXJndW1lbnRzIHdpdGhvdXQgYSBjb250ZXh0LgorCisgIEluZmVycmluZyB2YXJpYWRpYyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbmQga2V5d29yZCBhcmd1bWVudHMKKyAgd2lsbCByZXN1bHQgaW50byBlbXB0eSBUdXBsZXMgYW5kIERpY3RzLCB3aGljaCBjYW4gbGVhZCBpbgorICBzb21lIGNhc2VzIHRvIGZhbHNlIHBvc2l0aXZlcyB3aXRoIHJlZ2FyZCB0byBuby12YWx1ZS1mb3ItcGFyYW1ldGVyLgorICBJbiBvcmRlciB0byBhdm9pZCB0aGlzLCB1bnRpbCB3ZSdsbCBoYXZlIHN1cHBvcnQgZm9yIGNhbGwgY29udGV4dAorICBwcm9wYWdhdGlvbiwgd2UncmUgaWdub3Jpbmcgc3VjaCBjYXNlcyBpZiBkZXRlY3RlZC4KKyAgV2UgYWxyZWFkeSBkaWQgdGhhdCBmb3IgZnVuY3Rpb24gY2FsbHMsIGJ1dCB0aGUgcHJldmlvdXMgZml4CisgIHdhcyBub3QgdGFraW5nIGluIGNvbnNpZGVyYXRpb24gYGBsYW1iZGFzYGAKKworICBDbG9zZSAjMjkxOAorCisqIEFkZGVkIGEgbmV3IGNoZWNrLCBgYHNlbGYtYXNzaWduaW5nLXZhcmlhYmxlYGAKKworICBUaGlzIGNoZWNrIGlzIGVtaXR0ZWQgd2hlbiB3ZSBkZXRlY3QgdGhhdCBhIHZhcmlhYmxlIGlzIGFzc2lnbmVkCisgIHRvIGl0c2VsZiwgd2hpY2ggbWlnaHQgaW5kaWNhdGUgYSBwb3RlbnRpYWwgYnVnIGluIHRoZSBjb2RlIGFwcGxpY2F0aW9uLgorICBDbG9zZSAjMjkzMAorCisqIEFkZGVkIGEgbmV3IGNoZWNrLCBgYHByb3BlcnR5LXdpdGgtcGFyYW1ldGVyc2BgLgorCisgIFRoaXMgY2hlY2sgaXMgZW1pdHRlZCB3aGVuIHdlIGRldGVjdCB0aGF0IGEgZGVmaW5lZCBwcm9wZXJ0eSBhbHNvCisgIGhhcyBwYXJhbWV0ZXJzLCB3aGljaCBhcmUgdXNlbGVzcy4KKyAgQ2xvc2UgIzMwMDYKKworKiBFeGNsdWRlZCBwcm90b2NvbCBjbGFzc2VzIGZyb20gYSBjb3VwbGUgb2YgY2hlY2tzLiBDbG9zZSAjMzAwMi4KKworKiBBZGQgYSBjaGVjayBgYHVubmVjZXNzYXJ5LWNvbXByZWhlbnNpb25gYCB0aGF0IGRldGVjdHMgdW5uZWNlc3NhcnkgY29tcHJlaGVuc2lvbnMuCisKKyAgVGhpcyBjaGVjayBpcyBlbWl0dGVkIHdoZW4gYGBweWxpbnRgYCBmaW5kcyBsaXN0LSwgc2V0LSBvciBkaWN0LWNvbXByZWhlbnNpb25zLAorICB0aGF0IGFyZSB1bm5lY2Vzc2FyeSBhbmQgY2FuIGJlIHJld3JpdHRlbiB3aXRoIHRoZSBsaXN0LSwgc2V0LSBvciBkaWN0LWNvbnN0cnVjdG9ycy4KKworICBDbG9zZSAjMjkwNQorCisqIEV4Y2x1ZGVkIFBFUCA1MjYgaW5zdGFuY2UgYW5kIGNsYXNzIHZhcmlhYmxlcyBmcm9tIGBgbm8tbWVtYmVyYGAuIENsb3NlICMyOTQ1CisKKyogRXhjbHVkZWQgYGBhdHRyc2BgIGZyb20gYGB0b28tZmV3LXB1YmxpYy1tZXRob2RzYGAgY2hlY2suIENsb3NlICMyOTg4LgorCisqIGBgdW51c2VkLWltcG9ydGBgIGVtaXR0ZWQgZm9yIHRoZSByaWdodCBpbXBvcnQgbmFtZXMgaW4gZnVuY3Rpb24gc2NvcGVzLgorCisgIENsb3NlICMyOTI4CisKKyogRHJvcHBlZCBzdXBwb3J0IGZvciBQeXRob24gMy40LgorCisqIGBgYXNzaWdubWVudC1mcm9tLW5vLXJldHVybmBgIG5vdCB0cmlnZ2VyZWQgZm9yIGFzeW5jIG1ldGhvZHMuCisKKyAgQ2xvc2UgIzI5MDIKKworKiBEb24ndCBlbWl0IGBgYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0YGAgZm9yIHZhcmlhYmxlcyBkZWZpbmVkIGluIHNldHRlcnMuCisKKyAgQ2xvc2UgIzQwOQorCisqIFN5bnRheCBlcnJvcnMgcmVwb3J0IHRoZSBjb2x1bW4gbnVtYmVyLgorCisgIENsb3NlICMyOTE0CisKKyogU3VwcG9ydCBmdWxseSBxdWFsaWZpZWQgdHlwaW5nIGltcG9ydHMgZm9yIHR5cGUgYW5ub3RhdGlvbnMuCisKKyAgQ2xvc2UgIzI5MTUKKworKiBFeGNsdWRlIGBgX19kaWN0X19gYCBmcm9tIGBgYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0YGAKKworKiBGaXggcG9pbnRlciBvbiBzcGVsbGluZyBjaGVjayB3aGVuIHRoZSBlcnJvciBhcmUgbW9yZSB0aGFuIG9uZSB0aW1lIGluIHRoZSBzYW1lIGxpbmUuCisKKyAgQ2xvc2UgIzI4OTUKKworKiBGaXggY3Jhc2ggaGFwcGVuaW5nIHdoZW4gcGFyZW50IG9mIGNhbGxlZCBvYmplY3QgY2Fubm90IGJlIGRldGVybWluZWQKKworKiBBbGxvdyBvZiBpbiBgYEdvb2dsZURvY3N0cmluZy5yZV9tdWx0aXBsZV90eXBlYGAKKworKiBBZGRlZCBgYHN1YnByb2Nlc3MtcnVuLWNoZWNrYGAgdG8gaGFuZGxlIHN1YnJvY2Vzcy5ydW4gd2l0aG91dCBleHBsaWNpdGx5IHNldCBgYGNoZWNrYGAga2V5d29yZC4KKworICBDbG9zZSAjMjg0OAorCisqIFdoZW4gd2UgY2FuJ3QgaW5mZXIgYmFyZSBleGNlcHQgaGFuZGxlcnMsIHNraXAgYGB0cnktZXhjZXB0LXJhaXNlYGAKKworICBDbG9zZSAjMjg1MworCisqIEhhbmRsZSBtb3JlIGBgdW5uZWNlc3NhcnktbGFtYmRhYGAgY2FzZXMgd2hlbiBkZWFsaW5nIHdpdGggYWRkaXRpb25hbCBrd2FyZ3MgaW4gd3JhcHBlZCBjYWxscworCisgIENsb3NlICMyODQ1CisKKyogQmV0dGVyIHBvc3Rwb25lZCBldmFsdWF0aW9uIG9mIGFubm90YXRpb25zIGhhbmRsaW5nCisKKyAgQ2xvc2UgIzI4NDcKKworKiBTdXBwb3J0IHBvc3Rwb25lZCBldmFsdWF0aW9uIG9mIGFubm90YXRpb25zIGZvciB2YXJpYWJsZSBhbm5vdGF0aW9ucy4KKworICBDbG9zZSAjMjgzOAorCisqIGBgZXB5bGludC5weV9ydW5gYCBkZWZhdWx0cyB0byBgYHB5dGhvbmBgIGluIGNhc2UgdGhlIGN1cnJlbnQgZXhlY3V0YWJsZSBpcyBub3QgYSBQeXRob24gb25lLgorCisgIENsb3NlICMyODM3CisKKyogSWdub3JlIHJhdyBkb2NzdHJpbmdzIHdoZW4gcnVubmluZyBTaW1pbGFyaXRpZXMgY2hlY2tlciB3aXRoIGBgaWdub3JlLWRvY3N0cmluZ3M9eWVzYGAgb3B0aW9uCisKKyogRml4IGNyYXNoIHdoZW4gY2FsbGluZyBgYGluaGVyaXRfZnJvbV9zdGRfZXhgYCBvbiBhIGNsYXNzIHdoaWNoIGlzIGl0cyBvd24gYW5jZXN0b3IKKworICBDbG9zZSAjMjY4MAorCisqIEFkZGVkIGEgbmV3IGNoZWNrIHRoYXQgd2FybnMgdGhlIHVzZXIgaWYgYSBmdW5jdGlvbiBjYWxsIGlzIHVzZWQgaW5zaWRlIGEgdGVzdCBidXQgcGFyZW50aGVzZXMgYXJlIG1pc3NpbmcuCisKKyAgQ2xvc2UgIzI2NTgKKworKiBgYGxlbi1hcy1jb25kaXRpb25gYCBub3cgb25seSBmaXJlcyB3aGVuIGEgYGBsZW4oeClgYCBjYWxsIGlzIG1hZGUgd2l0aG91dCBhbiBleHBsaWNpdCBjb21wYXJpc29uCisKKyAgVGhlIG1lc3NhZ2UgYW5kIGRlc2NyaXB0aW9uIGFjY29tcGFueWluZyB0aGlzIGNoZWNrZXIgaGFzIGJlZW4gY2hhbmdlZAorICByZWZsZWN0IHRoaXMgbmV3IGJlaGF2aW9yLCBieSBleHBsaWNpdGx5IGFza2luZyB0byBlaXRoZXIgcmVseSBvbiB0aGUKKyAgZmFjdCB0aGF0IGVtcHR5IHNlcXVlbmNlIGFyZSBmYWxzZSBvciB0byBjb21wYXJlIHRoZSBsZW5ndGggd2l0aCBhIHNjYWxhci4KKworICBDbG9zZSAjMjY4NAorCisqIEFkZCBgYHByZWZlcnJlZC1tb2R1bGVgYCBjaGVja2VyIHRoYXQgbm90aWZ5IGlmIGFuIGltcG9ydCBoYXMgYSByZXBsYWNlbWVudCBtb2R1bGUgdGhhdCBzaG91bGQgYmUgdXNlZC4KKworICBUaGlzIGNoZWNrIGlzIGVtaXR0ZWQgd2hlbiBgYHB5bGludGBgIGZpbmRzIGFuIGltcG9ydGVkIG1vZHVsZSB0aGF0IGhhcyBhCisgIHByZWZlcnJlZCByZXBsYWNlbWVudCBsaXN0ZWQgaW4gYGBwcmVmZXJyZWQtbW9kdWxlc2BgLgorCisqIGBgYXNzaWduaW5nLW5vbi1zbG90YGAgbm90IGVtaXR0ZWQgZm9yIGNsYXNzZXMgd2l0aCB1bmtub3duIGJhc2UgY2xhc3Nlcy4KKworICBDbG9zZSAjMjgwNworCisqIGBgb2xkLWRpdmlzaW9uYGAgaXMgbm90IGVtaXR0ZWQgZm9yIG5vbi1Db25zdCBub2Rlcy4KKworICBDbG9zZSAjMjgwOAorCisqIEFkZGVkIG1ldGhvZCBhcmd1bWVudHMgdG8gdGhlIGRvdCB3cml0ZXIgZm9yIHB5cmV2ZXJzZS4KKworICBDbG9zZSAjMjEzOQorCisqIFN1cHBvcnQgZm9yIGxpbnRpbmcgZmlsZSBmcm9tIHN0ZGluLgorCisgIElERXMgbWF5IGJlbmVmaXQgZnJvbSB0aGUgc3VwcG9ydCBmb3IgbGludGluZyBmcm9tIGFuIGluLW1lbW9yeSBmaWxlLgorCisgIENsb3NlICMxMTg3CisKKyogQWRkZWQgYSBuZXcgY2hlY2sgYGBjbGFzcy12YXJpYWJsZS1zbG90cy1jb25mbGljdGBgCisKKyAgVGhpcyBjaGVjayBpcyBlbWl0dGVkIHdoZW4gYGBweWxpbnRgYCBmaW5kcyBhIGNsYXNzIHZhcmlhYmxlIHRoYXQgY29uZmxpY3RzIHdpdGggYSBzbG90CisgIG5hbWUsIHdoaWNoIHdvdWxkIHJhaXNlIGEgYGBWYWx1ZUVycm9yYGAgYXQgcnVudGltZS4KKworKiBBZGRlZCBuZXcgY2hlY2s6IGRpY3QtaXRlci1taXNzaW5nLWl0ZW1zIChFMTE0MSkKKworICBDbG9zZSAjMjc2MQorCisqIEZpeCBpc3N1ZSB3aXRoIHB5bGludCBuYW1lIGluIG91dHB1dCBvZiBweXRob24gLW0gcHlsaW50IC0tdmVyc2lvbgorCisgIENsb3NlICMyNzY0CisKKyogUmVsaWNlbnNlIGxvZ28gbWF0ZXJpYWwgdW5kZXIgdGhlIENDIEJZLVNBIDQuMCBsaWNlbnNlLgorCisqIFNraXAgYGBpZmBgIGV4cHJlc3Npb25zIGZyb20gZi1zdHJpbmdzIGZvciB0aGUgYGBjaGVja19lbGlmYGAgY2hlY2tlcgorCisgIENsb3NlICMyODE2CisKKyogQzA0MTIgKHVuZ3JvdXBlZC1pbXBvcnQpIGlzIG5vdyBjb21wYXRpYmxlIHdpdGggaXNvcnQuCisKKyAgQ2xvc2UgIzI4MDYKKworKiBBZGRlZCBuZXcgZXh0ZW5zaW9uIHRvIGRldGVjdCB0b28gbXVjaCBjb2RlIGluIGEgdHJ5IGNsYXVzZQorCisgIENsb3NlICMyODc3CisKKyogYGBzaWduYXR1cmUtbXV0YXRvcnNgYCBvcHRpb24gd2FzIGFkZGVkCisKKyAgIFdpdGggdGhpcyBvcHRpb24sIHVzZXJzIGNhbiBjaG9vc2UgdG8gaWdub3JlIGBgdG9vLW1hbnktZnVuY3Rpb24tYXJnc2BgLCBgYHVuZXhwZWN0ZWQta2V5d29yZC1hcmdgYCwKKyAgIGFuZCBgYG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJgYCBmb3IgZnVuY3Rpb25zIGRlY29yYXRlZCB3aXRoIGRlY29yYXRvcnMgdGhhdCBjaGFuZ2UKKyAgIHRoZSBzaWduYXR1cmUgb2YgYSBkZWNvcmF0ZWQgZnVuY3Rpb24uCisKKyAgIENsb3NlICMyNTkKKworKiBGaXhlZCBhIHByYWdtYSBjb21tZW50IG9uIGl0cyBvd24gcGh5c2ljYWwgbGluZSBiZWluZyBpZ25vcmVkIHdoZW4gcGFydAorICBvZiBhIGxvZ2ljYWwgbGluZSB3aXRoIHRoZSBwcmV2aW91cyBwaHlzaWNhbCBsaW5lLgorCisgIENsb3NlICMxOTkKKworKiBGaXhlZCBmYWxzZSBgYHVuZGVmaW5lZC1sb29wLXZhcmlhYmxlYGAgZm9yIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgbG9vcCwKKyAgdGhhdCB1c2VzIHRoZSB2YXJpYWJsZSBkZWZpbmVkIGluIHRoYXQgbG9vcC4KKworICBDbG9zZSAjMjAyCisKKyogRml4ZWQgYGB1bnVzZWQtYXJndW1lbnRgYCBhbmQgYGBmdW5jdGlvbi1yZWRlZmluZWRgYCBnZXR0aW5nIHJhaXNlZCBmb3IKKyAgZnVuY3Rpb25zIGRlY29yYXRlZCB3aXRoIGBgdHlwaW5nLm92ZXJsb2FkYGAuCisKKyAgQ2xvc2UgIzE1ODEKKworKiBGaXhlZCBhIGZhbHNlIHBvc2l0aXZlIHdpdGggYGBjb25zaWRlci11c2luZy1kaWN0LWNvbXByZWhlbnNpb25gYCBmb3IgY29uc3RydWN0aW9ucyB0aGF0IGNhbid0IGJlIGNvbnZlcnRlZCB0byBhIGNvbXByZWhlbnNpb24KKworICBDbG9zZSAjMjk2MworCisqIEFkZGVkIGBgX19wb3N0X2luaXRfX2BgIHRvIGBgZGVmaW5pbmctYXR0ci1tZXRob2RzYGAgaW4gb3JkZXIgdG8gYXZvaWQgYGBhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXRgYCBpbiBkYXRhY2xhc3Nlcy4KKworICBDbG9zZSAjMjU4MQorCisqIENoYW5nZWQgZGVzY3JpcHRpb24gb2YgVzAxOTkgdG8gdXNlIHRoZSB0ZXJtIDItaXRlbS10dXBsZSBpbnN0ZWFkIG9mIDItdXBsZS4KKworKiBBbGxvdyBhIGBgLmBgIGFzIGEgcHJlZml4IGZvciBTcGhpbnggbmFtZSByZXNvbHV0aW9uLgorCisqIENoZWNrZXJzIG11c3Qgbm93IGtlZXAgYSAxIHRvIDEgcmVsYXRpb25zaGlwIGJldHdlZW4gIm1zZ2lkIiAoaWU6IEMxMjM0KSBhbmQgInN5bWJvbCIgKGllIDogaHVtYW4tcmVhZGFibGUtc3ltYm9sKQorKiBJbiBjaGVja2VycywgYW4gb2xkX25hbWVzIGNhbiBub3cgYmUgdXNlZCBmb3IgbXVsdGlwbGUgbmV3IG1lc3NhZ2VzIGFuZCBweWxpbnQgaXMgbm93IGEgbGl0dGxlIGZhc3RlcgorCitDYXVzZWQgYnkgIzExNjQuIEl0IG1lYW5zIGlmIHlvdSBkbyBhIHBhcnRpYWwgb2xkX25hbWVzIGZvciBhIG1lc3NhZ2UgZGVmaW5pdGlvbiBhbiBleGNlcHRpb24gd2lsbCB0ZWxsIHlvdSB0aGF0IHlvdQorbXVzdCByZW5hbWUgdGhlIGFzc29jaWF0ZWQgaWRlbnRpZmljYXRpb24uCisKKyogQWxsb3cgdGhlIGNob2ljZSBvZiBmLXN0cmluZ3MgYXMgYSB2YWxpZCB3YXkgb2YgZm9ybWF0dGluZyBsb2dnaW5nIHN0cmluZ3MuCisKKyAgQ2xvc2VzICMyMzk1CisKKyogQWRkZWQgYGAtLWxpc3QtbXNncy1lbmFibGVkYGAgY29tbWFuZCB0byBsaXN0IGFsbCBlbmFibGVkIGFuZCBkaXNhYmxlZCBtZXNzYWdlcyBnaXZlbiB0aGUgY3VycmVudCBSQyBmaWxlIGFuZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuMy4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxOS0wMi0yNworCisqIFByb3RlY3QgYWdhaW5zdCBgYE5vbkRlZHVjaWJsZVR5cGVIaWVyYXJjaHlgYCB3aGVuIGNhbGxpbmcgc2VtaS1wcml2YXRlIGBgaXNfc3VidHlwZWBgCisKKyAgYGBhc3Ryb2lkLmhlbHBlcnMuaXNfc3VidHlwZWBgIHJhaXNlcyBgYE5vbkRlZHVjaWJsZVR5cGVIaWVyYXJjaHlgYCB3aGVuIGl0IGNhbm5vdCBpbmZlcgorICB0aGUgYmFzZSBjbGFzc2VzIG9mIHRoZSBnaXZlbiB0eXBlcywgYnV0IHRoYXQgbWFrZXMgc2Vuc2UgaW4gaXRzIGNvbnRleHQgZ2l2ZW4gdGhhdAorICB0aGUgbWV0aG9kIGlzIG1vc3RseSB1c2VkIHRvIGluZm9ybSB0aGUgaW5mZXJlbmNlIHByb2Nlc3MgYWJvdXQgdGhlIGhpZXJhcmNoeSBvZiBjbGFzc2VzLgorICBEb2Vzbid0IG1ha2UgdGhhdCBtdWNoIHNlbnNlIGZvciBgYHB5bGludGBgIGl0c2VsZiwgd2hpY2ggaXMgd2h5IHdlJ3JlIGhhbmRsaW5nIHRoZQorICBleGNlcHRpb24gaGVyZSwgcmF0aGVyIHRoYW4gaW4gYGBhc3Ryb2lkYGAKKworICBDbG9zZSBQeUNRQS9hc3Ryb2lkIzY0NAorCisqIEFkZGVkIGEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24gYGBsaXN0LWdyb3Vwc2BgIGZvciBsaXN0aW5nIGFsbCB0aGUgY2hlY2sgZ3JvdXBzIGBgcHlsaW50YGAga25vd3MgYWJvdXQuCisKKyogQWxsb3cgYGBCYXNlRXhjZXB0aW9uYGAgZm9yIGVtaXR0aW5nIGBgYnJvYWQtZXhjZXB0YGAsIGp1c3QgbGlrZSBgYEV4Y2VwdGlvbmBgLgorCisgIENsb3NlICMyNzQxCisKKyogRml4ZWQgYSBjcmFzaCB0aGF0IG9jY3VycmVkIGZvciBgYGJhZC1zdHItc3RyaXAtY2FsbGBgIHdoZW4gYGBzdHJpcCgpYGAgcmVjZWl2ZWQgYGBOb25lYGAKKworICBDbG9zZSAjMjc0MworCisqIERvbid0IGVtaXQgYGAqLW5vdC1pdGVyYXRpbmdgYCBjaGVja3MgZm9yIGJ1aWx0aW5zIGNvbnN1bWVkIGJ5IGBgaXRlcnRvb2xzYGAKKworICBDbG9zZSAjMjczMQorCisqIEZpeCBhIGNyYXNoIGNhdXNlZCBieSBpdGVyYXRpbmcgb3ZlciBgYFVuaW5mZXJhYmxlYGAgaW4gYSBzdHJpbmcgZm9ybWF0dGluZyBjaGVjay4KKworICBDbG9zZSAjMjcyNworCisqIEZpeGVkIGZhbHNlIHBvc2l0aXZlcyBmb3IgYGBuby1zZWxmLWFyZ3VtZW50YGAgYW5kIGBgdW5zdWJzY3JpcHRhYmxlLW9iamVjdGBgIHdoZW4gdXNpbmcgYGBfX2NsYXNzX2dldGl0ZW1fX2BgIChuZXcgaW4gUHl0aG9uIDMuNykKKworICBDbG9zZSAjMjQxNgorCisqIFN1cHBvcnQgYGBFbGxpcHNpc2BgIGFzIGEgc3lub255bSBmb3IgYGBwYXNzYGAgc3RhdGVtZW50cy4KKworICBDbG9zZSAjMjcxOAorCisqIGBgZml4bWVgYCBnZXRzIHRyaWdnZXJlZCBvbmx5IG9uIGNvbW1lbnRzLgorCisgIENsb3NlICMyMzIxCisKKyogRml4ZWQgYSBmYWxzZSBwb3NpdGl2ZSBmb3IgYGB1bnVzZWQtdmFyaWFibGVgYCBhbmQgYGBub25sb2NhbGBgIGFzc2lnbm1lbnRzCisKKyAgQ2xvc2UgIzI2NzEKKworKiBBZGRlZCBgYGxvYWRfY29uZmlndXJhdGlvbigpYGAgaG9vayBmb3IgcGx1Z2lucworCisgIE5ldyBvcHRpb25hbCBob29rIGZvciBwbHVnaW5zIGlzIGFkZGVkOiBgYGxvYWRfY29uZmlndXJhdGlvbigpYGAuCisgIFRoaXMgaG9vayBpcyBleGVjdXRlZCBhZnRlciBjb25maWd1cmF0aW9uIGlzIGxvYWRlZCB0byBwcmV2ZW50CisgIG92ZXJ3cml0aW5nIHBsdWdpbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHZpYSB1c2VyLWJhc2VkCisgIGNvbmZpZ3VyYXRpb24uCisKKyAgQ2xvc2UgIzI2MzUKKworKiBGaXggbWlzc2luZy1yYWlzZXMtZG9jIGZhbHNlIHBvc2l0aXZlIChXOTAwNikKKworICBDbG9zZSAjMTUwMgorCisqIEV4ZW1wdCBzdGFycmVkIHVucGFja2luZyBmcm9tIGBgKi1ub3QtaXRlcmF0aW5nYGAgUHl0aG9uIDMgY2hlY2tzCisKKyAgQ2xvc2UgIzI2NTEKKworKiBNYWtlIGBgY29tcGFyZS10by16ZXJvYGAgbGVzcyB6ZWFsb3VzIGJ5IGNoZWNraW5nIGFnYWluc3QgZXF1YWxpdHkgYW5kIGlkZW50aXR5CisKKyAgQ2xvc2UgIzI2NDUKKworKiBBZGQgYGBuby1lbHNlLXJhaXNlYGAgd2FybmluZyAoUjE3MjApCisKKyAgQ2xvc2UgIzI1NTgKKworKiBFeGVtcHQgYGB5aWVsZCBmcm9tYGAgZnJvbSBgYCotbm90LWl0ZXJhdGluZ2BgIFB5dGhvbiAzIGNoZWNrcy4KKworICBDbG9zZSAjMjY0MworCisqIEZpeCBpbmNvcnJlY3QgZ2VuZXJhdGlvbiBvZiBgYG5vLWVsc2UtcmV0dXJuYGAgd2FybmluZ3MgKFIxNzA1KQorCisgIEZpeGVkIGlzc3VlIHdoZXJlIGBgaWZgYCBzdGF0ZW1lbnRzIHdpdGggbmVzdGVkIGBgaWZgYCBzdGF0ZW1lbnRzCisgIHdlcmUgaW5jb3JyZWN0bHkgYmVpbmcgZmxhZ2dlZCBhcyBgYG5vLWVsc2UtcmV0dXJuYGAgaW4gc29tZSBjYXNlcyBhbmQKKyAgbm90IGJlaW5nIGZsYWdnZWQgYXMgYGBuby1lbHNlLXJldHVybmBgIGluIG90aGVyIGNhc2VzLiAgQWRkZWQgdGVzdHMKKyAgZm9yIHZlcmlmaWNhdGlvbiBhbmQgdXBkYXRlZCBweWxpbnQgc291cmNlIGZpbGVzIHRvIGVsaW1pbmF0ZSBuZXdseQorICBleHBvc2VkIHdhcm5pbmdzLgorCisqIEZpeCBmYWxzZSBwb3NpdGl2ZSB3aXRoIGBgbm90LWFzeW5jLWNvbnRleHQtbWFuYWdlcmBgIGNhdXNlZCBieSBub3QgdW5kZXJzdGFuZGluZyBgYGNvbnRleHRsaWIuYXN5bmNjb250ZXh0bWFuYWdlcmBgCisKKyAgQ2xvc2UgIzI0NDAKKworKiBSZWZhY3RvciBgYGJhZC1yZXZlcnNlZC1zZXF1ZW5jZWBgIHRvIGFjY291bnQgZm9yIG1vcmUgb2JqZWN0cyB0aGF0IGNhbiBkZWZpbmUgYGBfX3JldmVyc2VkX19gYAorCisgIE9uZSBzdWNoIG9iamVjdCB3b3VsZCBiZSBhbiBlbnVtIGNsYXNzLCBmb3Igd2hpY2ggYGBfX3JldmVyc2VkX19gYCB5aWVsZHMgZWFjaCBpbmRpdmlkdWFsIGVudW0uCisgIEFzIHN1Y2gsIHRoZSBjaGVjayBmb3IgYGBiYWQtcmV2ZXJzZWQtc2VxdWVuY2VgYCBuZWVkcyB0byBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGNsYXNzZXMKKyAgYW5kIGluc3RhbmNlcyB3aGVuIGl0IGNvbWVzIGZvciBjaGVja2luZyBvZiBgYF9fcmV2ZXJzZWRfX2BgIHByZXNlbmNlLgorCisgIENsb3NlICMyNTk4CisKKyogQWRkZWQgYGB3cm9uZy1leGNlcHRpb24tb3BlcmF0aW9uYGAKKworICBVc2VkIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGRvbmUgYWdhaW5zdCBhbiBleGNlcHRpb24sIGJ1dCB0aGUgb3BlcmF0aW9uCisgIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGV4Y2VwdGlvbiBpbiBxdWVzdGlvbi4gVXN1YWxseSBlbWl0dGVkIHdoZW4gaGF2aW5nCisgIGJpbmFyeSBvcGVyYXRpb25zIGJldHdlZW4gZXhjZXB0aW9ucyBpbiBleGNlcHQgaGFuZGxlcnMuCisKKyAgQ2xvc2UgIzI0OTQKKworKiBgYG5vLW1lbWJlcmBgIGlzIGVtaXR0ZWQgZm9yIGVudW1zIHdoZW4gdGhleSBsYWNrIGEgbWVtYmVyCisKKyAgUHJldmlvdXNseSB3ZSB3ZXJlbid0IGRvaW5nIHRoaXMgYmVjYXVzZSB3ZSBkZXRlY3RlZCBhCisgIGBgX19nZXRhdHRyX19gYCBpbXBsZW1lbnRhdGlvbiBvbiB0aGUgYGBFbnVtYGAgY2xhc3MKKyAgKGFuZCB0aGlzIGNoZWNrIGlzIHNraXBwZWQgZm9yIGNsYXNzZXMgd2l0aCBgYF9fZ2V0YXR0cl9fYGApLAorICBidXQgdGhhdCBpcyBmaW5lIGZvciBFbnVtcywgZ2l2ZW4gdGhhdCB0aGV5IGFyZSBpbmZlcnJlZCBpbiBhIGN1c3RvbWlzZWQKKyAgd2F5IGluIGFzdHJvaWQuCisKKyAgQ2xvc2UgIzI1NjUKKworKiBHZW5lcmFsaXplIGBgY2hhaW5lZC1jb21wYXJpc29uYGAKKworICBQcmV2aW91cyB2ZXJzaW9uIGluY29ycmVjdGx5IGRldGVjdHMgYGEgPCBiIDwgYyBhbmQgYiA8IGRgIGFuZCBmYWlscyB0bworICBkZXRlY3QgYGEgPCBiIDwgYyBhbmQgYyA8IGRgLgorCisqIEF2b2lkIHBvcHBpbmcgX19tYWluX18gd2hlbiB1c2luZyBtdWx0aXBsZSBqb2JzCisKKyAgQ2xvc2UgIzI2ODkKKworKiBBZGQgYSBuZXcgb3B0aW9uICdjaGVjay1zdHItY29uY2F0LW92ZXItbGluZS1qdW1wcycgdG8gY2hlY2sgJ2ltcGxpY2l0LXN0ci1jb25jYXQtaW4tc2VxdWVuY2UnCisKKyogRml4ZXMgZm9yIHRoZSBuZXcgc3R5bGUgbG9nZ2luZyBmb3JtYXQgbGludGVyLgorCisgIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHdhcyBub3QgaGFuZGxlZCBwcm9wZXJseSwgbGVhZGluZyB0byBhbiBhbHdheXMKKyAgc3VjY2Vzc2Z1bCBjaGVjay4KKworKiBGaXggZmFsc2UgcG9zaXRpdmUgYGBub3QtY2FsbGFibGVgYCBmb3IgdW5pbmZlcmFibGUgcHJvcGVydGllcy4KKworKiBGaXggZmFsc2UgcG9zaXRpdmUgYGB1c2VsZXNzLWVsc2Utb24tbG9vcGBgIGlmIHRoZSBicmVhayBpcyBkZWVwIGluIHRoZSBlbHNlCisgIG9mIGFuIGlubmVyIGxvb3AuCisKKyogTWlub3IgaW1wcm92ZW1lbnRzIHRvIHRoZSBoZWxwIHRleHQgZm9yIGEgZmV3IG9wdGlvbnMuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi4yLjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE4LTExLTI4CisKKyogQ2hhbmdlIHRoZSBgYGxvZ2dpbmctZm9ybWF0LXN0eWxlYGAgdG8gdXNlIG5hbWUgaWRlbnRpZmllciBpbnN0ZWFkIG9mIHRoZWlyCisgIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGlkZW50aWZpZXJzCisKKyAgVGhpcyBpcyB0byBwcmV2ZW50IHVzZXJzIGhhdmluZyB0byB0aGluayBhYm91dCBlc2NhcGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKKyAgYGBsb2dnaW5nLWZvcm1hdC1zdHlsZWBgIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnIGZpbGUuIEFsc28gb3VyIGNvbmZpZyBwYXJzaW5nCisgIHV0aWxpdGllcyBkb24ndCBxdWl0ZSBzdXBwb3J0IGVzY2FwZWQgdmFsdWVzIHdoZW4gaXQgY29tZXMgdG8gYGBjaG9pY2VzYGAgZGV0ZWN0aW9uLAorICBzbyB0aGlzIHdvdWxkIGhhdmUgbmVlZGVkIHZhcmlvdXMgaGFja3MgYXJvdW5kIHRoYXQuCisKKyAgQ2xvc2VzICMyNjE0CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi4yLjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE4LTExLTI3CisKKyogRml4IGEgY3Jhc2ggY2F1c2VkIGJ5IGBgaW1wbGljaXQtc3RyLWNvbmNhdC1pbi1zZXF1ZW5jZWBgIGFuZCBtdWx0aS1ieXRlcyBjaGFyYWN0ZXJzLgorCisgIENsb3NlcyAjMjYxMAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE4LTExLTI1CisKKyAgICogQ29uc2lkZXIgYGByYW5nZSgpYGAgb2JqZWN0cyBmb3IgYGB1bmRlZmluZWQtbG9vcC12YXJpYWJsZWBgIGxlYWtpbmcgZnJvbSBpdGVyYXRpb24uCisKKyAgICAgQ2xvc2UgIzI1MzMKKworICAgKiBgYGRlcHJlY2F0ZWQtbWV0aG9kYGAgY2FuIHVzZSB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIGlkZW50aWZ5aW5nIGEgZGVwcmVjYXRlZCBtZXRob2QKKworICAgICBQcmV2aW91c2x5IHdlIHdlcmUgdXNpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCB3aGljaCB3ZSBzdGlsbCBkbywgYnV0IHRoZSBmdWxseQorICAgICBxdWFsaWZpZWQgbmFtZSBmb3Igc29tZSBgYHVuaXR0ZXN0YGAgZGVwcmVjYXRlZCBhbGlhc2VzIGxlYWRzIHRvIGEgZ2VuZXJpYworICAgICBkZXByZWNhdGlvbiBmdW5jdGlvbi4gSW5zdGVhZCBvbiByZWx5aW5nIG9uIHRoYXQsIHdlIG5vdyBhbHNvIHJlbHkgb24gdGhlIGF0dHJpYnV0ZQorICAgICBuYW1lLCB3aGljaCBzaG91bGQgc29sdmUgc29tZSBmYWxzZSBwb3NpdGl2ZXMuCisKKyAgICAgQ2xvc2UgIzE2NTMKKyAgICAgQ2xvc2UgIzE5NDYKKworICAgKiBGaXggY29tcGF0aWJpbGl0eSB3aXRoIGNoYW5nZXMgdG8gc3RkbGliIHRva2VuaXplci4KKworICAgKiBgYHB5bGludGBgIGlzIGxlc3MgZWFnZXIgdG8gY29uc3VtZSB0aGUgd2hvbGUgbGluZSBmb3IgcHJhZ21hcworCisgICAgIENsb3NlICMyNDg1CisKKyAgICogT2J0YWluIHRoZSBjb3JyZWN0IG51bWJlciBvZiBDUFVzIGZvciB2aXJ0dWFsaXplZCBvciBjb250YWluZXJpemVkIGVudmlyb25tZW50cy4KKworICAgICBDbG9zZSAjMjUxOQorCisgICAqIENoYW5nZSBgYHVuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nYGAgYmFjayB0byBhIHdhcm5pbmcuCisKKyAgICAgSXQgdXNlZCB0byBiZSBhIHdhcm5pbmcgdW50aWwgYSBjb3VwbGUgb2YgeWVhcnMgYWdvLCBhZnRlciBpdCB3YXMgcHJvbW90ZWQgdG8KKyAgICAgYW4gZXJyb3IuIEJ1dCB0aGUgY2hlY2sgbWlnaHQgYmUgc3VnZ2VzdGluZyB0aGUgd3JvbmcgdGhpbmcgaW4gc29tZSBjYXNlcywKKyAgICAgZm9yIGluc3RhbmNlIHdoZW4gY2hlY2tpbmcgYWdhaW5zdCBgYHN5cy5hcmd2YGAgd2hpY2ggY2Fubm90IGJlIGtub3duIGF0IHN0YXRpYworICAgICBhbmFseXNpcyB0aW1lLiBHaXZlbiBpdCBtaWdodCByZWx5IG9uIHBvdGVudGlhbCB1bmtub3duIGRhdGEsIGl0J3MgYmVzdCB0bworICAgICBoYXZlIGl0IGFzIGEgd2FybmluZy4KKworICAgICBDbG9zZSAjMjUyMgorCisgICAqIFJlbW92ZSBgYGVudW1lcmF0ZWBgIHVzYWdlIHN1Z2dlc3Rpb24gd2hlbiBkZWZpbmluZyBgYF9faXRlcl9fYGAgKEMwMjAwKQorCisgICAgIENsb3NlICMyNDc3CisKKyAgICogRW1pdCBgYHRvby1tYW55LXN0YXJyZWQtYXNzaWdubWVudGBgIG9ubHkgd2hlbiB0aGUgbnVtYmVyIG9mIFN0YXJyZWQgbm9kZXMgaXMgcGVyIGFzc2lnbm1lbnQgZWxlbWVudHMKKworICAgICBDbG9zZSAjMjUxMworCisgICAqIGBgdHJ5LWV4Y2VwdC1yYWlzZWBgIGNoZWNrZXIgbm93IGhhbmRsZXMgbXVsdGlsZXZlbCBpbmhlcml0YW5jZSBoaXJlcmFjaHkgZm9yIGV4Y2VwdGlvbnMgY29ycmVjdGx5LgorCisgICAgIENsb3NlICMyNDg0CisKKyAgICogQWRkIGEgbmV3IGNoZWNrLCBgYHNpbXBsaWZpYWJsZS1pZi1leHByZXNzaW9uYGAgZm9yIGV4cHJlc3Npb25zIGxpa2UgYGBUcnVlIGlmIGNvbmQgZWxzZSBGYWxzZWBgLgorCisgICAgIENsb3NlICMyNDg3CisKKyAgICogYGB0b28tZmV3LXB1YmxpYy1tZXRob2RzYGAgaXMgbm90IHJlcG9ydGVkIGZvciBgYHR5cGluZy5OYW1lZFR1cGxlYGAKKworICAgICBDbG9zZSAjMjQ1OQorCisgICAqIGBgYHRvby1mZXctcHVibGljLW1ldGhvZHNgYCBpcyBub3QgcmVwb3J0ZWQgZm9yIGRhdGFjbGFzc2VzIGNyZWF0ZWQgd2l0aCBvcHRpb25zLgorCisgICAgIENsb3NlICMyNDg4CisKKyAgICogUmVtb3ZlIHdyb25nIG1vZHVsZXMgZnJvbSAnYmFkLXB5dGhvbjMtaW1wb3J0Jy4KKworICAgICBDbG9zZSAjMjQ1MworCisgICAqIFRoZSBgYGpzb25gYCByZXBvcnRlciBwcmludHMgYW4gZW1wdHkgbGlzdCB3aGVuIG5vIG1lc3NhZ2VzIGFyZSBlbWl0dGVkCisKKyAgICAgQ2xvc2UgIzI0NDYKKworICAgKiBBZGQgYSBuZXcgY2hlY2ssIGBgZHVwbGljYXRlLXN0cmluZy1mb3JtYXR0aW5nLWFyZ3VtZW50YGAKKworICAgICBUaGlzIG5ldyBjaGVjayBpcyBlbWl0dGVkIHdoZW5ldmVyIGEgZHVwbGljYXRlIHN0cmluZyBmb3JtYXR0aW5nIGFyZ3VtZW50CisgICAgIGlzIGZvdW5kLgorCisgICAgIENsb3NlICM0OTcKKworICAgKiBgYGFzc2lnbm1lbnQtZnJvbS1uby1yZXR1cm5gYCBpcyBub3QgZW1pdHRlZCBmb3IgY29yb3V0aW5lcy4KKworICAgICBDbG9zZSAjMTcxNQorCisgICAqIFJlcG9ydCBmb3JtYXQgc3RyaW5nIHR5cGUgbWlzbWF0Y2hlcy4KKworICAgKiBgYGNvbnNpZGVyLXVzaW5nLXRlcm5hcnlgYCBhbmQgYGBzaW1wbGlmaWVkLWJvb2xlYW4tZXhwcmVzc2lvbmBgIG5vIGxvbmdlciBlbWl0IGZvciBzZXF1ZW5jZSBiYXNlZCBjaGVja3MKKworICAgICBDbG9zZSAjMjQ3MworCisgICAqIEhhbmRsZSBgYEFzdHJvaWRTeW50YXhFcnJvcmBgIHdoZW4gdHJ5aW5nIHRvIGltcG9ydCBhIG1vZHVsZS4KKworICAgICBDbG9zZSAjMjMxMworCisgICAqIEFsbG93IGBgX19tb2R1bGVfX2BgIHRvIGJlIHJlZGVmaW5lZCBhdCBhIGNsYXNzIGxldmVsLiBDbG9zZSAjMjQ1MQorCisgICAqIGBgcHlsaW50YGAgdXNlZCB0byBlbWl0IGEgYGB1bnVzZWQtdmFyaWFibGVgYCBlcnJvciBpZiB1bnVzZWQgaW1wb3J0IHdhcyBmb3VuZCBpbiB0aGUgZnVuY3Rpb24uIE5vdyBpbnN0ZWFkIG9mCisgICAgIGBgdW51c2VkLXZhcmlhYmxlYGAsIGBgdW51c2VkLWltcG9ydGBgIGlzIGVtaXR0ZWQuCisKKyAgICAgQ2xvc2UgIzI0MjEKKworICAgKiBIYW5kbGUgYXN5bmNpby5jb3JvdXRpbmUgd2hlbiBsb29raW5nIGZvciBgYG5vdC1hbi1pdGVyYWJsZWBgIGNoZWNrLgorCisgICAgIENsb3NlICM5OTYKKworICAgKiBUaGUgYGBsb2NhbGx5LWVuYWJsZWRgYCBjaGVjayBpcyBnb25lLgorCisgICAgIENsb3NlICMyNDQyCisKKyAgICogSW5mZXIgZGVjb3JhdGVkIG1ldGhvZHMgd2hlbiBsb29raW5nIGZvciBtZXRob2QtaGlkZGVuCisKKyAgICAgQ2xvc2UgIzIzNjkKKworICAgKiBQaWNrIHRoZSBsYXRlc3QgdmFsdWUgZnJvbSB0aGUgaW5mZXJyZWQgdmFsdWVzIHdoZW4gbG9va2luZyBmb3IgYGByYWlzaW5nLW5vbi1leGNlcHRpb25gYAorCisgICAgIENsb3NlICMyNDMxCisKKyAgICogRXh0ZW5kIHRoZSBUWVBFX0NIRUNLSU5HIGd1YXJkIHRvIFRZUEVfQ0hFQ0tJTkcgbmFtZSBhcyB3ZWxsLCBub3QganVzdCB0aGUgYXR0cmlidXRlCisKKyAgICAgQ2xvc2UgIzI0MTEKKworICAgKiBJZ25vcmUgaW1wb3J0IHgueS56IGFzIHogY2FzZXMgZm9yIGNoZWNrZXIgYGB1c2VsZXNzLWltcG9ydC1hbGlhc2BgLgorCisgICAgIENsb3NlICMyMzA5CisKKyAgICogRml4IGZhbHNlIHBvc2l0aXZlIGBgdW5kZWZpbmVkLXZhcmlhYmxlYGAgYW5kIGBgdXNlZC1iZWZvcmUtYXNzaWdubWVudGBgIHdpdGggbm9ubG9jYWwga2V5d29yZCB1c2FnZS4KKworICAgICBDbG9zZSAjMjA0OQorCisgICAqIFN0b3AgYGBwcm90ZWN0ZWQtYWNjZXNzYGAgZXhjZXB0aW9uIGZvciBtaXNzaW5nIGNsYXNzIGF0dHJpYnV0ZXMKKworICAgKiBEb24ndCBlbWl0IGBgYXNzaWdubWVudC1mcm9tLW5vLXJldHVybmBgIGZvciBkZWNvcmF0ZWQgZnVuY3Rpb24gbm9kZXMKKworICAgICBDbG9zZSAjMjM4NQorCisgICAqIGBgdW5uZWNlc3NhcnktcGFzc2BgIGlzIG5vdyBhbHNvIGVtaXR0ZWQgd2hlbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGNvbnRhaW5zIG9ubHkgZG9jc3RyaW5nIGFuZCBwYXNzIHN0YXRlbWVudC4KKworICAgICAgSW4gUHl0aG9uLCBzdHViYmVkIGZ1bmN0aW9ucyBvZnRlbiBoYXZlIGEgYm9keSB0aGF0IGNvbnRhaW5zIGp1c3QgYSBzaW5nbGUgYGBwYXNzYGAgc3RhdGVtZW50LAorICAgICAgaW5kaWNhdGluZyB0aGF0IHRoZSBmdW5jdGlvbiBkb2Vzbid0IGRvIGFueXRoaW5nLiBIb3dldmVyLCBhIHN0dWJiZWQgZnVuY3Rpb24gY2FuIGFsc28gaGF2ZSBqdXN0IGEKKyAgICAgIGRvY3N0cmluZywgYW5kIGZ1bmN0aW9uIHdpdGggYSBkb2NzdHJpbmcgYW5kIG5vIGJvZHkgYWxzbyBkb2VzIG5vdGhpbmcuCisKKyAgICAgIENsb3NlICMyMjA4CisKKyAgICogYGBkdXBsaWNhdGUtYXJndW1lbnQtbmFtZWBgIGlzIGVtaXR0ZWQgZm9yIG1vcmUgdGhhbiBvbmUgZHVwbGljYXRlIGFyZ3VtZW50IHBlciBmdW5jdGlvbgorCisgICAgICBDbG9zZSAjMTcxMgorCisgICAqIEFsbG93IGRvdWJsZSBpbmRlbnRhdGlvbiBsZXZlbHMgZm9yIG1vcmUgZGlzdGluZ3Vpc2hhYmxlIGluZGVudGF0aW9ucworCisgICAgIENsb3NlICM3NDEKKworICAgKiBDb25zaWRlciB0dXBsZXMgaW4gZXhjZXB0aW9uIGhhbmRsZXIgZm9yIGBgdHJ5LWV4Y2VwdC1yYWlzZWBgLgorICAgICBDbG9zZSAjMjM4OQorCisgICAqIEZpeCBhc3Ryb2lkLkNsYXNzRGVmIGNoZWNrIGluIGNoZWNrZXJzLnV0aWxzLmlzX3N1YmNsYXNzX29mCisKKyAgICogRml4IHdpbGRjYXJkIGltcG9ydHMgYmVpbmcgaWdub3JlZCBieSB0aGUgaW1wb3J0IGNoZWNrZXIKKworICAgKiBGaXggZXh0ZXJuYWwvaW50ZXJuYWwgZGlzdGluY3Rpb24gYmVpbmcgYnJva2VuIGluIHRoZSBpbXBvcnQgZ3JhcGgKKworICAgKiBGaXggd2lsZGNhcmQgaW1wb3J0IGNoZWNrIG5vdCBza2lwcGluZyBgYF9faW5pdF9fLnB5YGAKKworICAgICBDbG9zZSAjMjQzMAorCisgICAqIEFkZCBuZXcgb3B0aW9uIHRvIGxvZ2dpbmcgY2hlY2tlciwgYGBsb2dnaW5nX2Zvcm1hdF9zdHlsZWBgCisKKyAgICogRml4IC0taWdub3JlLWltcG9ydHMgdG8gdW5kZXJzdGFuZCBtdWx0aS1saW5lIGltcG9ydHMKKworICAgICBDbG9zZSAjMTQyMgorICAgICBDbG9zZSAjMjAxOQorCisgICAqIEFkZCBhIG5ldyBjaGVjayAnaW1wbGljaXQtc3RyLWNvbmNhdC1pbi1zZXF1ZW5jZScgdG8gc3BvdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbnNpZGUgbGlzdHMsIHNldHMgJiB0dXBsZXMuCisKKyAgICogYGBsaXRlcmFsLWNvbXBhcmlzb25gYCBpcyBub3cgZW1pdHRlZCBmb3IgMCBhbmQgMSBsaXRlcmFscy4KKworCitXaGF0J3MgTmV3IGluIFB5bGludCAyLjEuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTgtMDgtMDcKKworICAgKiBmaXggcHlsaW50IGNyYXNoIGR1ZSB0byBgYG1pc3BsYWNlZC1mb3JtYXQtZnVuY3Rpb25gYCBub3QgY29ycmVjdGx5IGhhbmRsaW5nIGNsYXNzIGF0dHJpYnV0ZS4KKyAgICAgQ2xvc2UgIzIzODQKKworICAgKiBEbyBub3QgZW1pdCBcKi1idWlsdGluIGZvciBQeXRob24gMyBidWlsdGluIGNoZWNrcyB3aGVuIHRoZSBidWlsdGluIGlzIHVzZWQgaW5zaWRlIGEgdHJ5LWV4Y2VwdAorCisgICAgIENsb3NlIFB5Q1FBL3B5bGludCMyMjI4CisKKyAgICogYGBzaW1wbGlmaWFibGUtaWYtc3RhdGVtZW50YGAgbm90IGVtaXR0ZWQgd2hlbiBkZWFsaW5nIHdpdGggc3Vic2NyaXB0cworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDIuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE4LTA4LTAxCisgICAqIGBgdHJhaWxpbmctY29tbWEtdHVwbGVgYCBnZXRzIGVtaXR0ZWQgZm9yIGBgeWllbGRgYCBzdGF0ZW1lbnRzIGFzIHdlbGwuCisKKyAgICAgIENsb3NlICMyMzYzCisKKyAgICogR2V0IG9ubHkgdGhlIGFyZ3VtZW50cyBvZiB0aGUgc2NvcGUgZnVuY3Rpb24gZm9yIGBgcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWxgYAorCisgICAgIENsb3NlICMyMzY0CisKKyAgICogQWRkIGEgY2hlY2sgYGBtaXNwbGFjZWQtZm9ybWF0LWZ1bmN0aW9uYGAgd2hpY2ggaXMgZW1pdHRlZCBpZiBmb3JtYXQgZnVuY3Rpb24gaXMgdXNlZCBvbgorICAgICBub24gc3RyIG9iamVjdC4KKworICAgICBDbG9zZSAjMjIwMAorCisgICAqIGBgY2hhaW4uZnJvbV9pdGVyYWJsZWBgIG5vIGxvbmdlciBlbWl0cyBgZGljdC17fS1ub3QtaXRlcmF0aW5nYCB3aGVuIGRlYWxpbmcgd2l0aCBkaWN0IHZhbHVlcyBhbmQga2V5cworCisgICAqIERlbW90ZSB0aGUgYGB0cnktZXhjZXB0LXJhaXNlYGAgbWVzc2FnZSBmcm9tIGFuIGVycm9yIHRvIGEgd2FybmluZyAoRTA3MDUgLT4gVzA3MDYpCisKKyAgICAgIENsb3NlICMyMzIzCisKKyAgICogQ29ycmVjdGx5IGhhbmRsZSB0aGUgbmV3IG5hbWUgb2YgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYGBhYmNgYCBtb2R1bGUuCisKKyAgICAgQ2xvc2UgUHlDUUEvYXN0cm9pZCMyMjg4CisKKyAgICAqIE1vZHVsZXMgd2l0aCBgYF9fZ2V0YXR0cl9fYGAgYXJlIGV4ZW1wdGVkIGJ5IGRlZmF1bHQgZnJvbSBgYG5vLW1lbWJlcmBgCisKKyAgICAgIFRoZXJlJ3Mgbm8gZWFzeSB3YXkgdG8gZmlndXJlIG91dCBpZiBhIG1vZHVsZSBoYXMgYSBwYXJ0aWN1bGFyIG1lbWJlciB3aGVuCisgICAgICB0aGUgc2FpZCBtb2R1bGUgdXNlcyBgYF9fZ2V0YXR0cl9fYGAsIHdoaWNoIGlzIGEgbmV3IGFkZGl0aW9uIHRvIFB5dGhvbiAzLjcuCisgICAgICBJbnN0ZWFkIHdlIGFzc3VtZSB0aGUgc2FmZSB0aGluZyB0byBkbywgaW4gdGhlIHNhbWUgd2F5IHdlIGRvIGZvciBjbGFzc2VzLAorICAgICAgYW5kIHNraXAgdGhvc2UgbW9kdWxlcyBmcm9tIGNoZWNraW5nLgorCisgICAgICBDbG9zZSAjMjMzMQorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSBgYGludmFsaWQgbmFtZWBgIG1lc3NhZ2Ugd2hlbiBtZXRob2Qgb3IgYXR0cmlidXRlIG5hbWUgaXMgbG9uZ2VyIHRoZW4gMzAgY2hhcmFjdGVycy4KKworICAgICAgQ2xvc2UgIzIwNDcKKworICAgICogSW5jbHVkZSB0aGUgdHlwZSBvZiB0aGUgbmV4dCBicmFuY2ggaW4gYGBuby1lbHNlLXJldHVybmBgCisKKyAgICAgIENsb3NlICMyMjk1CisKKyAgICAqIEZpeCBpbmNvbnNpc3RlbnQgYmVoYXZpb3VyIGZvciBiYWQtY29udGludWF0aW9uIG9uIGZpcnN0IGxpbmUgb2YgZmlsZQorCisgICAgICBDbG9zZSAjMjI4MQorCisgICAgICogRml4IG5vdCBiZWluZyBhYmxlIHRvIGRpc2FibGUgY2VydGFpbiBtZXNzYWdlcyBvbiB0aGUgbGFzdCBsaW5lIHRocm91Z2gKKyAgICAgICB0aGUgZ2xvYmFsIGRpc2FibGUgb3B0aW9uCisKKyAgICAgICBDbG9zZSAjMjI3OAorCisgICAgKiBEb24ndCBlbWl0IGBgdXNlbGVzcy1yZXR1cm5gYCB3aGVuIHdlIGhhdmUgYSBzaW5nbGUgc3RhdGVtZW50IHRoYXQgaXMgdGhlIHJldHVybiBpdHNlbGYKKworICAgICAgV2Ugc3RpbGwgd2FudCB0byBiZSBleHBsaWNpdCB3aGVuIGEgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gcmV0dXJuCisgICAgICBhbiBvcHRpb25hbCB2YWx1ZTsgZXZlbiB0aG91Z2ggYGBwYXNzYGAgY291bGQgc3RpbGwgd29yaywgaXQncyBub3QgZXhwbGljaXQKKyAgICAgIGVub3VnaCBhbmQgdGhlIGZ1bmN0aW9uIG1pZ2h0IGxvb2sgbGlrZSBpdCdzIG1pc3NpbmcgYW4gaW1wbGVtZW50YXRpb24uCisgICAgICBDbG9zZSAjMjMwMAorCisgICAqIEZpeCBmYWxzZS1wb3NpdGl2ZSB1bmRlZmluZWQtdmFyaWFibGUgZm9yIHNlbGYgcmVmZXJlbnRpYWwgY2xhc3MgbmFtZSBpbiBsYW1kYmFzCisKKyAgICAgIENsb3NlICM3MDQKKworICAgICogRG9uJ3QgY3Jhc2ggd2hlbiBgYHB5bGludGBgIGlzIHVuYWJsZSB0byBpbmZlciB0aGUgdmFsdWUgb2YgYW4gYXJndW1lbnQgdG8gYGBuZXh0KClgYAorCisgICAgICBDbG9zZSAjMjMxNgorCisgICAgKiBEb24ndCBlbWl0IGBgbm90LWFuLWl0ZXJhYmxlYGAgd2hlbiBkZWFsaW5nIHdpdGggYXN5bmMgaXRlcmF0b3JzLgorCisgICAgICBCdXQgZG8gZW1pdCBpdCB3aGVuIHVzaW5nIHRoZSB1c3VhbCBpdGVyYXRpb24gcHJvdG9jb2wgYWdhaW5zdAorICAgICAgYXN5bmMgaXRlcmF0b3JzLgorCisgICAgICBDbG9zZSAjMjMxMQorCisgICAqIENhbiBzcGVjaWZ5IGEgZGVmYXVsdCBkb2NzdHJpbmcgdHlwZSBmb3Igd2hlbiB0aGUgY2hlY2sgY2Fubm90IGd1ZXNzIHRoZSB0eXBlCisKKyAgICAgIENsb3NlICMxMTY5CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMi4wPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTgtMDctMTUKKyAgICAqIGBgdHJ5LWV4Y2VwdC1yYWlzZWBgIHNob3VsZCBub3QgYmUgZW1pdHRlZCBpZiB0aGVyZSBhcmUgYW55IHBhcmVudCBleGNlcHRpb24gY2xhc3MgaGFuZGxlcnMuCisKKyAgICAgICBDbG9zZSAjMjI4NAorCisgICAgKiBgYHRyYWlsaW5nLWNvbW1hLXR1cGxlYGAgY2FuIGJlIGVtaXR0ZWQgZm9yIGBgcmV0dXJuYGAgc3RhdGVtZW50cyBhcyB3ZWxsLgorCisgICAgICAgQ2xvc2UgIzIyNjkKKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgYGBpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNgYCBtZXNzYWdlIHdoZW4gZXhjZXB0aW9uIGlzIHJhaXNlZAorICAgICAgaW5zaWRlIGFuIGVsc2Ugc3RhdGVtZW50LgorCisgICAgICBDbG9zZSAjMTc4MgorCisgICAgKiBgYEltcG9ydEZyb21gYCBub2RlcyBjb3JyZWN0bHkgdXNlIHRoZSBmdWxsIG5hbWUgZm9yIHRoZSBpbXBvcnQgc29ydGluZyBjaGVja3MuCisKKyAgICAgIENsb3NlICMyMTgxCisKKyAgICAqIFtdLmV4dGVuZCBhbmQgc2ltaWxhciBidWlsdGluIG9wZXJhdGlvbnMgZG9uJ3QgZW1pdCBgZGljdC0qLW5vdC1pdGVyYXRpbmdgIHdpdGggdGhlIFB5dGhvbiAzIHBvcnRpbmcgY2hlY2tlcgorCisgICAgICBDbG9zZSAjMjE4NworCisgICAgKiBBZGQgYSBjaGVjayBgYGNvbnNpZGVyLXVzaW5nLWRpY3QtY29tcHJlaGVuc2lvbmBgIHdoaWNoIGlzIGVtaXR0ZWQgaWYgZm9yIGRpY3QgaW5pdGlhbGl6YXRpb24KKyAgICAgIHRoZSBvbGQgc3R5bGUgd2l0aCBsaXN0IGNvbXByZWhlbnNpb25zIGlzIHVzZWQuCisKKyAgICAqIEFkZCBhIGNoZWNrIGBgY29uc2lkZXItdXNpbmctc2V0LWNvbXByZWhlbnNpb25gYCB3aGljaCBpcyBlbWl0dGVkIGlmIGZvciBzZXQgaW5pdGlhbGl6YXRpb24KKyAgICAgIHRoZSBvbGQgc3R5bGUgd2l0aCBsaXN0IGNvbXByZWhlbnNpb25zIGlzIHVzZWQuCisKKyAgICAqIGBgbG9nZ2luZy1ub3QtbGF6eWBgIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgcHlsaW50IGluZmVycyB0aGF0IGEgc3RyaW5nIGlzIGJ1aWx0IHdpdGggYWRkaXRpb24KKworICAgICAgQ2xvc2UgIzIxOTMKKworICAgICogQWRkIGEgY2hlY2sgYGBjaGFpbmVkLWNvbXBhcmlzb25gYCB3aGljaCBpcyBlbWl0dGVkIGlmIGEgYm9vbGVhbiBvcGVyYXRpb24gY2FuIGJlIHNpbXBsaWZpZWQKKyAgICAgIGJ5IGNoYWluaW5nIHNvbWUgb2YgaXRzIG9wZXJhdGlvbnMuCisgICAgICBlLmcgImEgPCBiIGFuZCBiIDwgYyIsIGNhbiBiZSBzaW1wbGlmaWVkIGFzICJhIDwgYiA8IGMiLgorCisgICAgICBDbG9zZSAjMjAzMgorCisgICAgKiBBZGQgYSBjaGVjayBgYGNvbnNpZGVyLXVzaW5nLWluYGAgZm9yIGNvbXBhcmlzb25zIG9mIGEgdmFyaWFibGUgYWdhaW5zdAorICAgICAgbXVsdGlwbGUgdmFsdWVzIHdpdGggIj09IiBhbmQgIm9yInMgaW5zdGVhZCBvZiBjaGVja2luZyBpZiB0aGUgdmFyaWFibGUKKyAgICAgIGlzIGNvbnRhaW5lZCAiaW4iIGEgdHVwbGUgb2YgdGhvc2UgdmFsdWVzLgorCisgICAgKiBgYGluYGAgaXMgY29uc2lkZXJlZCBpdGVyYXRpbmcgY29udGV4dCBmb3Igc29tZSBvZiB0aGUgUHl0aG9uIDMgcG9ydGluZyBjaGVja2VycworCisgICAgICBDbG9zZSAjMjE4NgorCisgICAgKiBBZGQgYGAtLWlnbm9yZS1ub25lYGAgZmxhZyB0byBjb250cm9sIGlmIHB5bGludCBzaG91bGQgd2FybiBhYm91dCBgYG5vLW1lbWJlcmBgIHdoZXJlIHRoZSBvd25lciBpcyBOb25lCisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIHJlbGF0ZWQgdG8gYGB0b28tbWFueS1hcmd1bWVudHNgYCBhbmQgYm91bmRlZCBgYF9fZ2V0X19gYCBtZXRob2RzCisKKyAgICAgIENsb3NlICMyMTcyCisKKyAgICAqIGBgbWNzYGAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciBvZiBtZXRhY2xhc3MncyBgYF9fbmV3X19gYCBtZXRob2Qgd2FzIHJlcGxhY2VkIGJ5IGBgY2xzYGAKKworICAgICAgQ2xvc2UgIzIwMjgKKworICAgICogYGBhc3NpZ25tZW50LWZyb20tbm8tcmV0dXJuYGAgY29uc2lkZXJzIG1ldGhvZHMgYXMgd2VsbC4KKworICAgICAgIENsb3NlICMyMDgxCisKKyAgICAqIFN1cHBvcnQgdHlwaW5nLlRZUEVfQ0hFQ0tJTkcgZm9yICp1bnVzZWQtaW1wb3J0KiBlcnJvcnMKKworICAgICAgQ2xvc2UgIzE5NDgKKworICAgICogSW5mZXJyZWQgY2xhc3NlcyBhdCBhIGZ1bmN0aW9uIGxldmVsIG5vIGxvbmdlciBlbWl0IGBgaW52YWxpZC1uYW1lYGAKKyAgICAgIHdoZW4gdGhleSBkb24ndCByZXNwZWN0IHRoZSB2YXJpYWJsZSByZWd1bGFyIGV4cHJlc3Npb24KKworICAgICAgQ2xvc2UgIzEwNDkKKworICAgICogQWRkZWQgYmFzaWMgc3VwcG9ydCBmb3IgcG9zdHBvbmVkIGV2YWx1YXRpb24gb2YgZnVuY3Rpb24gYW5ub3RhdGlvbnMuCisKKyAgICAgIENsb3NlICMyMDY5CisKKyAgICAqIEZpeCBhIGJ1ZyB3aXRoIGBgbWlzc2luZy1rd29hYGAgYW5kIHZhcmlhZGljcyBwYXJhbWV0ZXJzCisKKyAgICAgIENsb3NlICMxMTExCisKKyAgICAqIGBgc2ltcGxpZmlhYmxlLWlmLXN0YXRlbWVudGBgIHRha2VzIGluIGFjY291bnQgb25seSB3aGVuIGFzc2lnbmluZyB0byBzYW1lIHRhcmdldHMKKworICAgICAgIENsb3NlICMxOTg0CisKKyAgICAqIE1ha2UgYGBsZW4tYXMtY29uZGl0aW9uYGAgdGVzdCBtb3JlIGNhc2VzLCBzdWNoIGFzIGBgbGVuKCkgPCAxYGAgb3IgYGBsZW4gPD0gMGBgCisKKyAgICAqIEZpeCBmYWxzZS1wb3NpdGl2ZSBgYGxpbmUtdG9vLWxvbmdgYCBtZXNzYWdlIGVtaXNzaW9uIGZvcgorICAgICAgY29tbWVudGVkIGxpbmUgYXQgdGhlIGVuZCBvZiBhIG1vZHVsZQorCisgICAgICBDbG9zZSAjMTk1MAorCisgICAgKiBGaXggZmFsc2UtcG9zaXRpdmUgYGBiYWQtY29udGludWF0aW9uYGAgZm9yIHdpdGggc3RhdGVtZW50cworCisgICAgICBDbG9zZSAjNDYxCisKKyAgICAqIERvbid0IHdhcm4gYWJvdXQgYGBzdG9wLWl0ZXJhdGlvbi1yZXR1cm5gYCB3aGVuIHVzaW5nIGBgbmV4dCgpYGAgb3ZlciBgYGl0ZXJ0b29scy5jb3VudGBgCisKKyAgICAgIENsb3NlICMyMTU4CisKKyAgICAqIEFkZCBhIGNoZWNrIGBgY29uc2lkZXItdXNpbmctZ2V0YGAgZm9yIHVuaWRpb21hdGljIHVzYWdlIG9mIHZhbHVlL2RlZmF1bHQtcmV0cmlldmFsCisgICAgICBmb3IgYSBrZXkgZnJvbSBhIGRpY3Rpb25hcnkKKworICAgICAgQ2xvc2UgIzIwNzYKKworICAgICogaW52YWxpZC1zbGljZS1pbmRleCBpcyBub3QgZW1pdHRlZCB3aGVuIHRoZSBzbGljZSBpcyB1c2VkIGFzIGluZGV4IGZvciBhIGNvbXBsZXggb2JqZWN0LgorCisgICAgICBXZSBvbmx5IHVzZSBhIGhhbmRmdWwgb2Yga25vd24gb2JqZWN0cyAobGlzdCwgc2V0IGFuZCBmcmllbmRzKSB0byBmaWd1cmUgb3V0IGlmCisgICAgICB3ZSBzaG91bGQgZW1pdCBpbnZhbGlkLXNsaWNlLWluZGV4IHdoZW4gdGhlIHNsaWNlIGlzIHVzZWQgdG8gc3Vic2NyaXB0IGFuIG9iamVjdC4KKworICAgICogRG9uJ3QgZW1pdCBgYHVudXNlZC1pbXBvcnRgYCBhbnltb3JlIGZvciB0eXBpbmcgaW1wb3J0cyB1c2VkIGluIHR5cGUgY29tbWVudHMuCisKKyAgICAqIEFkZCBhIG5ldyBjaGVjayAndXNlbGVzcy1pbXBvcnQtYWxpYXMnLgorCisgICAgICBDbG9zZSAjMjA1MgorCisgICAgKiBBZGQgYGBjb21wYXJpc29uLXdpdGgtY2FsbGFibGVgYCB0byB3YXJuIGZvciBjb21wYXJpc29uIHdpdGggYmFyZSBjYWxsYWJsZSwgd2l0aG91dCBjYWxsaW5nIGl0LgorCisgICAgICBDbG9zZSAjMjA4MgorCisgICAgKiBEb24ndCB3YXJuIGZvciBgYG1pc3NpbmctdHlwZS1kb2NgYCBhbmQvb3IgYGBtaXNzaW5nLXJldHVybi10eXBlLWRvY2BgLCBpZiB0eXBlCisgICAgICBhbm5vdGF0aW9ucyBleGlzdCBvbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBhIHBhcmFtZXRlciBhbmQvb3IgcmV0dXJuIHR5cGUuCisgICAgICBDbG9zZSAjMjA4MworCisgICAgKiBBZGQgYGAtLWV4aXQtemVyb2BgIG9wdGlvbiBmb3IgY29udGludW91cyBpbnRlZ3JhdGlvbiBzY3JpcHRzIHRvIG1vcmUKKyAgICAgIGVhc2lseSBjYWxsIFB5bGludCBpbiBlbnZpcm9ubWVudHMgdGhhdCBhYm9ydCB3aGVuIGEgcHJvZ3JhbSByZXR1cm5zIGEKKyAgICAgIG5vbi16ZXJvIChlcnJvcikgc3RhdHVzIGNvZGUuCisKKyAgICAgIENsb3NlICMyMDQyCisKKyAgICAqIFdhcm4gaWYgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGFuIGluc3RhbmNlLyBjbGFzcyBtZXRob2QgZ2V0cyBhc3NpZ25lZAorCisgICAgICBDbG9zZSAjOTc3CisKKyAgICAqIE5ldyBjaGVjayBgYGNvbXBhcmlzb24td2l0aC1pdHNlbGZgYCB0byBjaGVjayBjb21wYXJpc29uIGJldHdlZW4gc2FtZSB2YWx1ZS4KKworICAgICAgQ2xvc2UgIzIwNTEKKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICdsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbicsIGVtaXR0ZWQgd2hlbiBmLXN0cmluZworICAgICAgaXMgdXNlZCB3aXRoaW4gbG9nZ2luZyBmdW5jdGlvbiBjYWxscy4KKworICAgICAgQ2xvc2UgIzE5OTgKKworICAgICogRG9uJ3Qgc2hvdyAndXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uJyBpZiB0aGUgc3ViY2xhc3MgbWV0aG9kIGhhcyBkaWZmZXJlbnQgdHlwZSBhbm5vdGF0aW9ucy4KKworICAgICAgQ2xvc2UgIzE5MjMKKworICAgICogQWRkIGBgdW5oYXNoYWJsZS1kaWN0LWtleWBgIGNoZWNrLgorCisgICAgICBDbG9zZXMgIzU4NgorCisgICAgKiBEb24ndCB3YXJuIHRoYXQgYSBnbG9iYWwgdmFyaWFibGUgaXMgdW51c2VkIGlmIGl0IGlzIGRlZmluZWQgYnkgYW4gaW1wb3J0CisKKyAgICAgIENsb3NlICMxNDUzCisKKyAgICAqIFNraXAgd2lsZGNhcmQgaW1wb3J0IGNoZWNrIGZvciBgYF9faW5pdF9fLnB5YGAuCisKKyAgICAgIENsb3NlICMyMDI2CisKKyAgICAqIFRoZSBQeXRob24gMyBwb3J0aW5nIG1vZGUgY2FuIG5vdyBydW4gd2l0aCBQeXRob24gMyBhcyB3ZWxsLgorCisgICAgKiBgYHRvby1mZXctcHVibGljLW1ldGhvZHNgYCBpcyBub3QgZW1pdHRlZCBmb3IgZGF0YWNsYXNzZXMuCisKKyAgICAgICBDbG9zZSAjMTc5MworCisgICAgKiBOZXcgdmVyYm9zZSBtb2RlIG9wdGlvbiwgZW5hYmxlZCB3aXRoIGBgLS12ZXJib3NlYGAgY29tbWFuZCBsaW5lIGZsYWcsIHRvCisgICAgICBkaXNwbGF5IG9mIGV4dHJhIG5vbi1jaGVja2VyLXJlbGF0ZWQgb3V0cHV0LiBJdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorCisgICAgICBDbG9zZSAjMTg2MworCisgICAgKiBgYHVuZGVmaW5lZC1sb29wLXZhcmlhYmxlYGAgdGFrZXMgaW4gY29uc2lkZXJhdGlvbiBub24tZW1wdHkgaXRlcnJlZCBvYmplY3RzIGJlZm9yZSBlbWl0dGluZworCisgICAgICBDbG9zZSAjMjAzOQorCisgICAgKiBBZGQgc3VwcG9ydCBmb3IgbnVtcHlkb2Mgb3B0aW9uYWwgcmV0dXJuIHZhbHVlIG5hbWVzLgorCisgICAgICBDbG9zZSAjMjAzMAorCisgICAgKiBgYHNpbmdsZXRvbi1jb21wYXJpc29uYGAgYWNjb3VudHMgZm9yIG5lZ2F0aXZlIGNoZWNrcworCisgICAgICBDbG9zZSAjMjAzNworCisgICAgKiBBZGQgYSBjaGVjayBgYGNvbnNpZGVyLXVzaW5nLWluYGAgZm9yIGNvbXBhcmlzb25zIG9mIGEgdmFyaWFibGUgYWdhaW5zdAorICAgICAgbXVsdGlwbGUgdmFsdWVzIHdpdGggIj09IiBhbmQgIm9yInMgaW5zdGVhZCBvZiBjaGVja2luZyBpZiB0aGUgdmFyaWFibGUKKyAgICAgIGlzIGNvbnRhaW5lZCAiaW4iIGEgdHVwbGUgb2YgdGhvc2UgdmFsdWVzLgorCisgICAgICBDbG9zZSAjMTk3NworCisgICAgKiBkZWZhdWx0ZGljdCBhbmQgc3ViY2xhc3NlcyBvZiBkaWN0IGFyZSBub3cgaGFuZGxlZCBmb3IgZGljdC1pdGVyLSogY2hlY2tzCisKKyAgICAgIENsb3NlICMyMDA1CisKKyAgICAqIGBgbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbmBgIGFsc28gZW1pdHMgd2hlbiBmLXN0cmluZ3MgYXJlIHVzZWQgaW5zdGVhZCBvZiAlIHN5bnRheC4KKworICAgICAgQ2xvc2UgIzE3ODgKKworICAgICogRG9uJ3QgdHJpZ2dlciBtaXNwbGFjZWQtYmFyZS1yYWlzZSB3aGVuIHRoZSByYWlzZSBpcyBpbiBhIGZpbmFsbHkgY2xhdXNlCisKKyAgICAgIENsb3NlICMxOTI0CisKKyAgICAqIEFkZCBhIG5ldyBjaGVjaywgYGBwb3NzaWJseS11bnVzZWQtdmFyaWFibGVgYC4KKworICAgICAgVGhpcyBpcyBzaW1pbGFyIHRvIGBgdW51c2VkLXZhcmlhYmxlYGAsIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBpcworICAgICAgZW1pdHRlZCB3aGVuIHdlIGRldGVjdCBhIGxvY2FscygpIGNhbGwgaW4gdGhlIHNjb3BlIG9mIHRoZSB1bnVzZWQgdmFyaWFibGUuCisgICAgICBUaGUgYGBsb2NhbHMoKWBgIGNhbGwgY291bGQgcG90ZW50aWFsbHkgdXNlIHRoZSBzYWlkIHZhcmlhYmxlLCBieSBjb25zdW1pbmcKKyAgICAgIGFsbCB2YWx1ZXMgdGhhdCBhcmUgcHJlc2VudCB1cCB0byB0aGUgcG9pbnQgb2YgdGhlIGNhbGwuIFRoaXMgbmV3IGNoZWNrCisgICAgICBhbGxvd3MgdG8gZGlzYWJsZSB0aGlzIGVycm9yIHdoZW4gdGhlIHVzZXIgaW50ZW50aW9uYWxseSB1c2VzIGBgbG9jYWxzKClgYAorICAgICAgdG8gY29uc3VtZSBldmVyeXRoaW5nLgorCisgICAgICBDbG9zZSAjMTkwOS4KKworICAgICogYGBuby1lbHNlLXJldHVybmBgIGFjY291bnRzIGZvciBtdWx0aXBsZSBjYXNlcworCisgICAgICAgVGhlIGNoZWNrIHdhcyBhIGJpdCBvdmVycmVzdHJpY3RpdmUgYmVjYXVzZSB3ZSB3ZXJlIGNoZWNraW5nIGZvcgorICAgICAgIHJldHVybiBub2RlcyBpbiB0aGUgLm9yZWxzZSBub2RlLiBBdCB0aGF0IHBvaW50IHRob3VnaCB0aGUgaWYgc3RhdGVtZW50CisgICAgICAgY2FuIGJlIHJlZmFjdG9yZWQgdG8gbm90IGhhdmUgdGhlIG9yZWxzZS4gVGhpcyBpbXByb3ZlcyB0aGUgZGV0ZWN0aW9uIG9mCisgICAgICAgb3RoZXIgY2FzZXMsIGZvciBpbnN0YW5jZSBpdCBub3cgZGV0ZWN0cyBUcnlFeGNlcHQgbm9kZXMgdGhhdCBhcmUgcGFydCBvZgorICAgICAgIHRoZSAuZWxzZSBicmFuY2guCisKKyAgICAgICBDbG9zZSAjMTg1MgorCisgICAgKiBBZGRlZCB0d28gbmV3IGNoZWNrcywgYGBpbnZhbGlkLWVudnZhci12YWx1ZWBgIGFuZCBgYGludmFsaWQtZW52dmFyLWRlZmF1bHRgYC4KKworICAgICAgVGhlIGZvcm1lciBpcyB0cmlnZ2VyIHdoZW5ldmVyIHB5bGludCBkZXRlY3RzIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUgbWFuaXB1bGF0aW9uCisgICAgICBmdW5jdGlvbnMgdXNlcyBhIGRpZmZlcmVudCB0eXBlIHRoYW4gc3RyaW5ncywgd2hpbGUgdGhlIGxhdHRlciBpcyBlbWl0dGVkIHdoZW5ldmVyCisgICAgICB0aGUgc2FpZCBmdW5jdGlvbnMgYXJlIHVzaW5nIGEgZGVmYXVsdCB2YXJpYWJsZSBvZiBkaWZmZXJlbnQgdHlwZSB0aGFuIGV4cGVjdGVkLgorCisgICAgKiBBZGQgYSBjaGVjayBgYGNvbnNpZGVyLXVzaW5nLWpvaW5gYCBmb3IgY29uY2F0ZW5hdGlvbiBvZiBzdHJpbmdzIHVzaW5nIHN0ci5qb2luKHNlcXVlbmNlKQorCisgICAgICBDbG9zZSAjMTk1MgorCisgICAgKiBBZGQgYSBjaGVjayBgYGNvbnNpZGVyLXN3YXAtdmFyaWFibGVzYGAgZm9yIHN3YXBwaW5nIHZhcmlhYmxlcyB3aXRoIHR1cGxlIHVucGFja2luZworCisgICAgICBDbG9zZSAjMTkyMgorCisgICAgKiBBZGQgbmV3IGNoZWNrZXIgYGB0cnktZXhjZXB0LXJhaXNlYGAgdGhhdCB3YXJucyB0aGUgdXNlciBpZiBhbiBleGNlcHQgaGFuZGxlciBibG9jaworICAgICAgaGFzIGEgYGByYWlzZWBgIHN0YXRlbWVudCBhcyBpdHMgZmlyc3Qgb3BlcmF0b3IuIFRoZSB3YXJuaW5nIGlzIHNob3duIHdoZW4gdGhlcmUgaXMKKyAgICAgIGEgYmFyZSByYWlzZSBzdGF0ZW1lbnQsIGVmZmVjdGl2ZWx5IHJlLXJhaXNpbmcgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyBjYXVnaHQgb3IgdGhlCisgICAgICB0eXBlIG9mIHRoZSBleGNlcHRpb24gYmVpbmcgcmFpc2VkIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgYmVpbmcgaGFuZGxlZC4KKworICAgICogRG9uJ3QgY3Jhc2ggb24gaW52YWxpZCBzdHJpbmdzIHdoZW4gY2hlY2tpbmcgZm9yIGBgbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbmBgCisKKyAgICAgIENsb3NlICMxOTQ0CisKKyAgICAqIEV4ZW1wdCBgYF9fZG9jX19gYCBmcm9tIHRyaWdnZXJpbmcgYSBgYHJlZGVmaW5lZC1idWlsdGluYGAKKworICAgICAgYGBfX2RvY19fYGAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGRvY3N0cmluZyBmb3IgYSBtb2R1bGUgd2l0aG91dAorICAgICAgcGFzc2luZyBpdCBhcyBhIGZpcnN0LXN0YXRlbWVudCBzdHJpbmcuCisKKyAgICAqIEZpeCBmYWxzZSBwb3NpdGl2ZSBiYWQtd2hpdGVzcGFjZSBmcm9tIGZ1bmN0aW9uIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQKKyAgICAgIHZhbHVlcyBhbmQgYW5ub3RhdGlvbnMKKworICAgICAgQ2xvc2UgIzE4MzEKKworICAgICogRml4IHN0b3AtaXRlcmF0aW9uLXJldHVybiBmYWxzZSBwb3NpdGl2ZSB3aGVuIG5leHQgYnVpbHRpbiBoYXMgYQorICAgICAgZGVmYXVsdCB2YWx1ZSBpbiBhIGdlbmVyYXRvcgorCisgICAgICBDbG9zZSAjMTgzMAorCisgICAgKiBGaXggZW1pc3Npb24gb2YgZmFsc2UgcG9zaXRpdmUgYGBuby1tZW1iZXJgYCBtZXNzYWdlIGZvciBjbGFzcyB3aXRoICAicHJpdmF0ZSIgYXR0cmlidXRlcyB3aG9zZSBuYW1lIGlzIG1hbmdsZWQuCisKKyAgICAgIENsb3NlICMxNjQzCisKKyAgICAqIEZpeGVkIGEgY3Jhc2ggd2hpY2ggb2NjdXJyZWQgd2hlbiBgYFVuaW5mZXJhYmxlYGAgd2Fzbid0IHByb3Blcmx5IGhhbmRsZWQgaW4gYGBzdG9wLWl0ZXJhdGlvbi1yZXR1cm5gYAorCisgICAgICBDbG9zZSAjMTc3OQorCisgICAgKiBVc2UgdGhlIHByb3BlciBub2RlIHRvIGdldCB0aGUgbmFtZSBmb3IgcmVkZWZpbmVkIGZ1bmN0aW9ucyAoIzE3OTIpCisKKyAgICAgIENsb3NlICMxNzc0CisKKyAgICAqIERvbid0IGNyYXNoIHdoZW4gZW5jb3VudGVyaW5nIGJhcmUgcmFpc2VzIHdoaWxlIGNoZWNraW5nIGluY29uc2lzdGVudCByZXR1cm5zCisKKyAgICAgIENsb3NlICMxNzczCisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIGBgaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzYGAgbWVzc2FnZSB3aGVuIGlmIHN0YXRlbWVudCBpcyBpbnNpZGUgdHJ5L2V4Y2VwdC4KKworICAgICAgQ2xvc2UgIzE3NzAKKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgYGBpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNgYCBtZXNzYWdlIHdoZW4gd2hpbGUgbG9vcCBhcmUgdXNlZC4KKworICAgICAgQ2xvc2UgIzE3NzIKKworICAgICogQ29ycmVjdCBjb2x1bW4gbnVtYmVyIGZvciB3aGl0ZXNwYWNlIGNvbnZlbnRpb25zLgorCisgICAgICBQcmV2aW91c2x5IHRoZSBjb2x1bW4gd2FzIHN0dWNrIGF0IDAKKworICAgICAgQ2xvc2UgIzE2NDkKKworICAgICogRml4IGBgdW51c2VkLWFyZ3VtZW50YGAgZmFsc2UgcG9zaXRpdmVzIHdpdGggb3ZlcnNoYWRvd2VkIHZhcmlhYmxlIGluCisgICAgICBkaWN0aW9uYXJ5IGNvbXByZWhlbnNpb24uCisKKyAgICAgIENsb3NlICMxNzMxCisKKyAgICAqIEZpeCBmYWxzZSBwb3NpdGl2ZSBgYGluY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c2BgIG1lc3NhZ2Ugd2hlbiBuZXZlcgorICAgICAgcmV0dXJuaW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCAoaS5lIHN5cy5leGl0IGZvciBleGFtcGxlKS4KKworICAgICAgQ2xvc2UgIzE3NzEKKworICAgICogRml4IGVycm9yIHdoZW4gY2hlY2tpbmcgaWYgZnVuY3Rpb24gaXMgZXhjZXB0aW9uLCBhcyBpbiBgYGJhZC1leGNlcHRpb24tY29udGV4dGBgLgorCisgICAgKiBGaXggZmFsc2UgcG9zaXRpdmUgYGBpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNgYCBtZXNzYWdlIHdoZW4gYQorICAgICAgZnVuY3Rpb24gaXMgZGVmaW5lZCB1bmRlciBhbiBpZiBzdGF0ZW1lbnQuCisKKyAgICAgIENsb3NlICMxNzk0CisKKyAgICAqIE5ldyBgYHVzZWxlc3MtcmV0dXJuYGAgbWVzc2FnZSB3aGVuIGZ1bmN0aW9uIG9yIG1ldGhvZCBlbmRzIHdpdGggYSAicmV0dXJuIiBvcgorICAgICAgInJldHVybiBOb25lIiBzdGF0ZW1lbnQgYW5kIHRoaXMgaXMgdGhlIG9ubHkgcmV0dXJuIHN0YXRlbWVudCBpbiB0aGUgYm9keS4KKworICAgICogRml4IGZhbHNlIHBvc2l0aXZlIGBgaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzYGAgbWVzc2FnZSBieQorICAgICAgYXZvaWRpbmcgdXNlbGVzcyBleGNlcHRpb24gaW5mZXJlbmNlIGlmIHRoZSBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQuCisKKyAgICAgIENsb3NlICMxNzk0IChzZWNvbmQgcGFydCkKKworICAgICogRml4IGJhZCB0aHJlYWQgaW5zdGFudGlhdGlvbiBjaGVjayB3aGVuIHRhcmdldCBmdW5jdGlvbiBpcyBwcm92aWRlZCBpbiBhcmdzLgorCisgICAgICBDbG9zZSAjMTg0MAorCisgICAgKiBGaXhlZCBmYWxzZSBwb3NpdGl2ZSB3aGVuIGEgbnVtcHkgQXR0cmlidXRlcyBzZWN0aW9uIGZvbGxvd3MgYSBQYXJhbWV0ZXJzCisgICAgICBzZWN0aW9uCisKKyAgICAgIENsb3NlICMxODY3CisKKyAgICAqIEZpeCBpbmNvcnJlY3QgZmlsZSBwYXRoIHdoZW4gZmlsZSBhYnNvbHV0ZSBwYXRoIGNvbnRhaW5zIG11bHRpcGxlIGBgcGF0aF9zdHJpcF9wcmVmaXhgYCBzdHJpbmdzLgorCisgICAgICBDbG9zZSAjMTEyMAorCisgICAgKiBGaXggZmFsc2UgcG9zaXRpdmUgdW5kZWZpbmVkLXZhcmlhYmxlIGZvciBsYW1iZGEgYXJndW1lbnQgaW4gY2xhc3MgZGVmaW5pdGlvbnMKKworICAgICAgQ2xvc2UgIzE4MjQKKworICAgICogQWRkIG9mIGEgbmV3IGNoZWNrZXIgdGhhdCB3YXJucyB0aGUgdXNlciBpZiBzb21lIG1lc3NhZ2VzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkCisgICAgICBieSBpZCBpbnN0ZWFkIG9mIHN5bWJvbC4KKworICAgICAgQ2xvc2UgIzE1OTkKKworICAgICogU3VwcHJlc3MgZmFsc2UtcG9zaXRpdmUgYGBub3QtY2FsbGFibGVgYCBtZXNzYWdlcyBmcm9tIGNlcnRhaW4KKyAgICAgIHN0YXRpY21ldGhvZCBkZXNjcmlwdG9ycworCisgICAgICBDbG9zZSAjMTY5OQorCisgICAgKiBGaXggaW5kZW50YXRpb24gaGFuZGxpbmcgd2l0aCB0YWJzCisKKyAgICAgIENsb3NlICMxMTQ4CisKKyAgICAqIEZpeCBmYWxzZS1wb3NpdGl2ZSBgYGJhZC1jb250aW51YXRpb25gYCBlcnJvcgorCisgICAgICBDbG9zZSAjNjM4CisKKyAgICAqIEZpeCBmYWxzZSBwb3NpdGl2ZSB1bnVzZWQtdmFyaWFibGUgaW4gbGFtYmRhIGRlZmF1bHQgYXJndW1lbnRzCisKKyAgICAgIENsb3NlICMxOTIxCisgICAgICBDbG9zZSAjMTU1MgorICAgICAgQ2xvc2UgIzEwOTkKKyAgICAgIENsb3NlICMyMTAKKworICAgICogVXBkYXRlZCB0aGUgZGVmYXVsdCByZXBvcnQgZm9ybWF0IHRvIGluY2x1ZGUgcGF0aHMgdGhhdCBjYW4gYmUgY2xpY2tlZCBvbiBpbiBzb21lIHRlcm1pbmFscyAoZS5nLiBpVGVybSkuCisKKyAgICAqIEZpeCBpbmxpbmUgZGVmIGJlaGF2aW9yIHdpdGggYGB0b28tbWFueS1zdGF0ZW1lbnRzYGAgY2hlY2tlcgorCisgICAgICBDbG9zZSAjMTk3OAorCisgICAgKiBGaXggYGBLZXlFcnJvcmBgIHJhaXNlZCB3aGVuIHVzaW5nIGRvY3BhcmFtcyBhbmQgTm90SW1wbGVtZW50ZWRFcnJvciBpcyBkb2N1bWVudGVkLgorCisgICAgICBDbG9zZSAjMjEwMgorCisgICAgKiBGaXggJ21ldGhvZC1oaWRkZW4nIHJhaXNlZCB3aGVuIGFzc2lnbmluZyB0byBhIHByb3BlcnR5IG9yIGRhdGEgZGVzY3JpcHRvci4KKworICAgICogRml4IGVtaXR0aW5nIGBgdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uYGAgd2hlbiBjaGFuZ2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBrZXl3b3JkIGFyZ3VtZW50cy4KKworICAgICAgQ2xvc2UgIzIwMjIKKworICAgICogRXhwYW5kIGlnbm9yZWQtYXJndW1lbnQtbmFtZXMgaW5jbHVkZSBzdGFycmVkIGFyZ3VtZW50cyBhbmQga2V5d29yZCBhcmd1bWVudHMKKworICAgICAgQ2xvc2UgIzIyMTQKKworICAgICogRml4IGZhbHNlLXBvc2l0aXZlIHVuZGVmaW5lZC12YXJpYWJsZSBpbiBuZXN0ZWQgbGFtYmRhCisKKyAgICAgIENsb3NlICM3NjAKKworICAgICogRml4IGZhbHNlLXBvc2l0aXZlIGBgYmFkLXdoaXRlc3BhY2VgYCBtZXNzYWdlIGZvciB0eXBpbmcgYW5ub2F0YXRpb25zCisgICAgICB3aXRoIGVsbGlwc2VzIGluIHRoZW0KKworICAgICAgQ2xvc2UgMTk5MgorCisgICAgKiBCcm9rZSBkb3duICJtaXNzaW5nLWRvY3N0cmluZ3MiIGJldHdlZW4gIm1vZHVsZSIsICJjbGFzcyIgYW5kICJmdW5jdGlvbiIKKworICAgICAgRm9yIHRoaXMgdG8gd29yayB3ZSBoYWQgdG8gbWFrZSBtdWx0aXBsZSBtZXNzYWdlcyB3aXRoIHRoZSBzYW1lIG9sZCBuYW1lCisgICAgICBwb3NzaWJsZS4KKworICAgICAgQ2xvc2VzICMxMTY0CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS45PworPT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTgtMDUtMTUKKworICAgICogQWRkZWQgdHdvIG5ldyBQeXRob24gMyBwb3J0aW5nIGNoZWNrcywgYGBleGNlcHRpb24tZXNjYXBlYGAgYW5kIGBgY29tcHJlaGVuc2lvbi1lc2NhcGVgYAorCisgICAgICBUaGVzZSB0d28gYXJlIGVtaXR0ZWQgd2hlbmV2ZXIgcHlsaW50IGRldGVjdHMgdGhhdCBhIHZhcmlhYmxlIGRlZmluZWQgaW4gdGhlCisgICAgICBzYWlkIGJsb2NrcyBpcyB1c2VkIG91dHNpZGUgb2YgdGhlIGdpdmVuIGJsb2NrLiBPbiBQeXRob24gMyB0aGVzZSB2YWx1ZXMgYXJlIGRlbGV0ZWQuCisKKyAgICAqIEFkZGVkIGEgbmV3IGBgZGVwcmVjYXRlZC1zeXMtZnVuY3Rpb25gYCwgZW1pdHRlZCB3aGVuIGFjY2Vzc2luZyByZW1vdmVkIHN5cyBtZW1iZXJzLgorCisgICAgKiBBZGRlZCBgYHhyZWFkbGluZXMtYXR0cmlidXRlYGAsIGVtaXR0ZWQgd2hlbiB0aGUgYGB4cmVhZGxpbmVzKClgYCBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQuCisKKyAgICAqIFRoZSBQeXRob24gMyBwb3J0aW5nIG1vZGUgY2FuIG5vdyBydW4gd2l0aCBQeXRob24gMyBhcyB3ZWxsLgorCisgICAgKiBkb2NwYXJhbXMgZXh0ZW5zaW9uIGFsbG93cyBhYnN0cmFjdCBtZXRob2RzIHRvIGRvY3VtZW50IHdoYXQgb3ZlcnJpZGluZworICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCByZXR1cm4sIGFuZCB0byByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIHdpdGhvdXQKKyAgICAgIGRvY3VtZW50aW5nIGl0LgorCisgICAgICBDbG9zZXMgIzIwNDQKKworICAgICogU3BlY2lhbCBtZXRob2RzIGRvIG5vdCBjb3VudCB0b3dhcmRzIGBgdG9vLWZldy1tZXRob2RzYGAsCisgICAgICBhbmQgYXJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHVibGljIEFQSS4KKworICAgICogRW51bSBjbGFzc2VzIGRvIG5vdCB0cmlnZ2VyIGBgdG9vLWZldy1tZXRob2RzYGAKKworICAgICAgQ2xvc2UgIzYwNQorCisgICAgKiBBZGRlZCBhIG5ldyBQeXRob24gMi8zIGNoZWNrIGZvciBhY2Nlc3NpbmcgYGBvcGVyYXRvci5kaXZgYCwgd2hpY2ggaXMgcmVtb3ZlZCBpbiBQeXRob24gMworCisgICAgICBDbG9zZSAjMTkzNgorCisgICAgKiBBZGRlZCBhIG5ldyBQeXRob24gMi8zIGNoZWNrIGZvciBhY2Nlc3NpbmcgcmVtb3ZlZCB1cmxsaWIgZnVuY3Rpb25zCisKKyAgICAgIENsb3NlICMxOTk3CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS44LjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE3LTEyLTE1CisKKyAgICAqIFdyb25nIHZlcnNpb24gbnVtYmVyIGluIF9fcGtnaW5mb19fLgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuOD8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE3LTEyLTE1CisKKyAgICAqIFJlc3BlY3QgZGlzYWJsZT0uLi4gaW4gY29uZmlnIGZpbGUgd2hlbiBydW5uaW5nIHdpdGggLS1weTNrLgorCisgICAgKiBOZXcgd2FybmluZyBgYHNoYWxsb3ctY29weS1lbnZpcm9uYGAgYWRkZWQKKworICAgICAgU2hhbGxvdyBjb3B5IG9mIG9zLmVudmlyb24gZG9lc24ndCB3b3JrIGFzIHBlb3BsZSBtYXkgZXhwZWN0LiBvcy5lbnZpcm9uCisgICAgICBpcyBub3QgYSBkaWN0IG9iamVjdCBidXQgcmF0aGVyIGEgcHJveHkgb2JqZWN0LCBzbyBhbnkgY2hhbmdlcyBtYWRlCisgICAgICBvbiBjb3B5IG1heSBoYXZlIHVuZXhwZWN0ZWQgZWZmZWN0cyBvbiBvcy5lbnZpcm9uCisKKyAgICAgIEluc3RlYWQgb2YgY29weS5jb3B5KG9zLmVudmlyb24pIG1ldGhvZCBvcy5lbnZpcm9uLmNvcHkoKSBzaG91bGQgYmUKKyAgICAgIHVzZWQuCisKKyAgICAgIFNlZSBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1MzczIGZvciBkZXRhaWxzLgorCisgICAgICBDbG9zZSAjMTMwMQorCisgICAgKiBEbyBub3QgZGlzcGxheSBuby1hYnNvbHV0ZS1pbXBvcnQgd2FybmluZyBtdWx0aXBsZSB0aW1lcyBwZXIgZmlsZS4KKworICAgICogYGB0cmFpbGluZy1jb21tYS10dXBsZWBgIHJlZmFjdG9yIGNoZWNrIG5vdyBleHRlbmRzIHRvIGFzc2lnbm1lbnQgd2l0aAorICAgICAgIG1vcmUgdGhhbiBvbmUgZWxlbWVudCAoc3VjaCBhcyBsaXN0cykKKworICAgICAgQ2xvc2UgIzE3MTMKKworICAgICogRml4aW5nIHUnJyBzdHJpbmcgaW4gc3VwZXJmbHVvdXMtcGFyZW5zIG1lc3NhZ2UKKworICAgICAgQ2xvc2UgIzE0MjAKKworICAgICogYGBhYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWRgYCBpcyBub3cgZW1pdHRlZCBmb3IgYWxsIGluZmVyZW5jZSBwYXRocy4KKworICAgICAgIENsb3NlICMxNjczCisKKyAgICAqIEFkZCBzZXQgb2YgcHJlZGVmaW5lZCBuYW1pbmcgc3R5bGUgdG8gZWFzZSBjb25maWd1cmF0aW9uIG9mIGNoZWNraW5nCisgICAgICBuYW1pbmcgY29udmVudGlvbnMuCisKKyAgICAgIENsb3NlcyAjMTAxMworCisgICAgKiBBZGRlZCBhIG5ldyBjaGVjaywgYGBrZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnYGAKKworICAgICAgVGhpcyBpcyBlbWl0dGVkIGZvciBmdW5jdGlvbiBkZWZpbml0aW9ucworICAgICAgaW4gd2hpY2gga2V5d29yZCBhcmd1bWVudHMgYXJlIHBsYWNlZCBiZWZvcmUgdmFyaWFibGUKKyAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzIChcKmFyZ3MpLgorCisgICAgICBUaGlzIG1heSBsZWFkIHRvIGFyZ3MgbGlzdCBnZXR0aW5nIG1vZGlmaWVkIGlmIGtleXdvcmQgYXJndW1lbnQncyB2YWx1ZQorICAgICAgaXMgbm90IHByb3ZpZGVkIGluIHRoZSBmdW5jdGlvbiBjYWxsIGFzc3VtaW5nIGl0IHdpbGwgdGFrZSBkZWZhdWx0IHZhbHVlCisgICAgICBwcm92aWRlZCBpbiB0aGUgZGVmaW5pdGlvbi4KKworICAgICogVGhlIGBgaW52YWxpZC1uYW1lYGAgY2hlY2sgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIHRoYXQgY2F1c2VkIHRoZSBmYWlsdXJlCisKKyAgICAgIENsb3NlICMxMTc2CisKKyAgICAqIFVzaW5nIHRoZSAtaiBmbGFnIHdvbid0IHN0YXJ0IG1vcmUgY2hpbGQgbGludGVycyB0aGFuIG5lZWRlZC4KKworICAgICAgQ29udHJpYnV0ZWQgYnkgUm9tYW4gSXZhbm92IGluICMxNjE0CisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIHdpdGggYmFkLXB5dGhvbjMtaW1wb3J0IG9uIHJlbGF0aXZlIGltcG9ydHMKKworICAgICAgQ2xvc2UgIzE2MDgKKworICAgICogQWRkZWQgYSBuZXcgUHl0aG9uIDMgY2hlY2ssIGBgbm9uLWFzY2lpLWJ5dGVzLWxpdGVyYWxzYGAKKworICAgICAgQ2xvc2UgIzE1NDUKKworICAgICogQWRkZWQgYSBjb3VwbGUgb2YgbmV3IFB5dGhvbiAzIGNoZWNrcyBmb3IgYWNjZXNzaW5nIGRpY3QgbWV0aG9kcyBpbiBub24taXRlcmFibGUgY29udGV4dAorCisgICAgKiBQcm90b2NvbCBjaGVja3MgKG5vdC1hLW1hcHBpbmcsIG5vdC1hbi1pdGVyYWJsZSBhbmQgY28uKSBhcmVuJ3QgZW1pdHRlZCBvbiBjbGFzc2VzIHdpdGggZHluYW1pYyBnZXRhdHRyCisKKyAgICAqIEFkZGVkIGEgbmV3IHdhcm5pbmcsICdiYWQtdGhyZWFkLWluc3RhbnRpYXRpb24nCisKKyAgICAgIFRoaXMgbWVzc2FnZSBpcyBlbWl0dGVkIHdoZW4gdGhlIHRocmVhZGluZy5UaHJlYWQgY2xhc3MgZG9lcyBub3QKKyAgICAgIHJlY2VpdmUgdGhlIHRhcmdldCBhcmd1bWVudCwgYnV0IHJlY2VpdmVzIGp1c3Qgb25lIGFyZ3VtZW50LCB3aGljaAorICAgICAgaXMgYnkgZGVmYXVsdCB0aGUgZ3JvdXAgcGFyYW1ldGVyLgorCisgICAgICBDbG9zZSAjMTMyNworCisgICAgKiBJbiBub24tcXVpZXQgbW9kZSwgYWJzb2x1dGUgcGF0aCBvZiB1c2VkIGNvbmZpZyBmaWxlIGlzIGxvZ2dlZCB0bworICAgICAgc3RhbmRhcmQgZXJyb3IuCisgICAgICBDbG9zZSAjMTUxOQorCisgICAgKiBSYWlzZSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCByZXBvcnRlciBjbGFzcyBiZWluZyBzZWxlY3RlZAorCisgICAgICBXaGVuIHVua25vd24gcmVwb3J0ZXIgY2xhc3Mgd2lsbCBiZSBzZWxlY3RlZCBhcyBQeWxpbnQgcmVwb3J0ZXIsCisgICAgICBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2Ugd291bGQgYmUgcmFpc2VkIGluc3RlYWQgb2YgYmFyZSBgYEltcG9ydEVycm9yYGAKKyAgICAgIG9yIGBgQXR0cmlidWVFcnJvcmBgIHJlbGF0ZWQgdG8gbW9kdWxlIG9yIHJlcG9ydGVyIGNsYXNzIGJlaW5nIG5vdCBmb3VuZC4KKyAgICAgIENsb3NlICMxMzg4CisKKyAgICAqIEFkZGVkIGEgbmV3IFB5dGhvbiAzIGNoZWNrIGZvciBhY2Nlc3NpbmcgcmVtb3ZlZCBmdW5jdGlvbnMgZnJvbSBpdGVydG9vbHMKKyAgICAgIGxpa2UgYGBpemlwYGAgb3IgYGBpZmlsdGVyZmFsc2VgYAorCisgICAgKiBBZGRlZCBhIG5ldyBQeXRob24gMyBjaGVjayBmb3IgYWNjZXNzaW5nIHJlbW92ZWQgZmllbGRzIGZyb20gdGhlIHR5cGVzCisgICAgICBtb2R1bGUgbGlrZSBgYFVuaWNvZGVUeXBlYGAgb3IgYGBYUmFuZ2VUeXBlYGAKKworICAgICogQWRkZWQgYSBuZXcgUHl0aG9uIDMgY2hlY2sgZm9yIGRlY2xhcmluZyBhIG1ldGhvZCBgYG5leHRgYCB0aGF0IHdvdWxkIGhhdmUKKyAgICAgIGJlZW4gdHJlYXRlZCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMiBidXQgYSBub3JtYWwgZnVuY3Rpb24gaW4gUHl0aG9uIDMuCisKKyAgICAqIEFkZGVkIGEgbmV3IGtleS12YWx1ZSBwYWlyIGluIGpzb24gb3V0cHV0LiBUaGUga2V5IGlzIGBgbWVzc2FnZS1pZGBgCisgICAgICBhbmQgdGhlIHZhbHVlIGlzIHRoZSBtZXNzYWdlIGlkLgorICAgICAgQ2xvc2UgIzE1MTIKKworICAgICogQWRkZWQgYSBuZXcgUHl0aG9uIDMuMCBjaGVjayBmb3IgcmFpc2luZyBhIFN0b3BJdGVyYXRpb24gaW5zaWRlIGEgZ2VuZXJhdG9yLgorICAgICAgVGhlIGNoZWNrIGFib3V0IHJhaXNpbmcgYSBTdG9wSXRlcmF0aW9uIGluc2lkZSBhIGdlbmVyYXRvciBpcyBhbHNvIHZhbGlkIGlmIHRoZSBleGNlcHRpb24KKyAgICAgIHJhaXNlZCBpbmhlcml0IGZyb20gU3RvcEl0ZXJhdGlvbi4KKyAgICAgIENsb3NlICMxMzg1CisKKyAgICAqIEFkZGVkIGEgbmV3IHdhcm5pbmcsIGBgcmFpc2luZy1mb3JtYXQtdHVwbGVgYCwgdG8gZGV0ZWN0IG11bHRpLWFyZ3VtZW50CisgICAgICBleGNlcHRpb24gY29uc3RydWN0aW9uIGluc3RlYWQgb2YgbWVzc2FnZSBzdHJpbmcgZm9ybWF0dGluZy4KKworICAgICogQWRkZWQgYSBuZXcgY2hlY2sgZm9yIG1ldGhvZCBvZiBsb2dnaW5nIG1vZHVsZSB0aGF0IGNvbmNhdGVuYXRlIHN0cmluZyB2aWEgKyBvcGVyYXRvcgorICAgICAgQ2xvc2UgIzE0NzkKKworICAgICogQWRkZWQgcGFyYW1ldGVyIGZvciBsaW1pdGluZyBudW1iZXIgb2Ygc3VnZ2VzdGlvbnMgaW4gc3BlbGxjaGVja2luZyBjaGVja2VycworCisgICAgKiBGaXggYSBjb3JuZXItY2FzZSBpbiBgYGNvbnNpZGVyLXVzaW5nLXRlcm5hcnlgYCBjaGVja2VyLgorCisgICAgICBXaGVuIG9iamVjdCBgYEFgYCB1c2VkIGluICBgYFggYW5kIEEgb3IgQmBgIHdhcyBmYWxzeSBpbiBib29sZWFuIGNvbnRleHQsCisgICAgICBQeWxpbnQgaW5jb3JyZWN0bHkgZW1pdHRlZCBub24tZXF1aXZhbGVudCB0ZXJuYXJ5LWJhc2VkIHN1Z2dlc3Rpb24uCisgICAgICBBZnRlciBhIGNoYW5nZSBtZXNzYWdlIGlzIGNvcnJlY3RseSBub3QgZW1pdHRlZCBmb3IgdGhpcyBjYXNlLgorICAgICAgQ2xvc2UgIzE1NTkKKworICAgICogQWRkZWQgYGBzdWdnZXN0aW9uLW1vZGVgYCBjb25maWd1cmF0aW9uIGZsYWcuIFdoZW4gZmxhZyBpcyBlbmFibGVkLCBpbmZvcm1hdGlvbmFsCisgICAgICBtZXNzYWdlIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiBjcnlwdGljIGVycm9yIG1lc3NhZ2UgZm9yIGF0dHJpYnV0ZXMgYWNjZXNzZWQgb24KKyAgICAgIGMtZXh0ZW5zaW9ucy4KKyAgICAgIENsb3NlICMxNDY2CisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIGBgdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uYGAgbWVzc2FnZSB3aGVuCisgICAgICBwYXJhbWV0ZXJzIGRlZmF1bHQgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSB1c2VkIGluIHRoZSBiYXNlIGNsYXNzLgorICAgICAgQ2xvc2UgIzEwODUKKworICAgICogRGlzYWJsaW5nICd3cm9uZy1pbXBvcnQtb3JkZXInLCAnd3JvbmctaW1wb3J0LXBvc2l0aW9uJywgb3IKKyAgICAgICd1bmdyb3VwZWQtaW1wb3J0cycgZm9yIGEgc2luZ2xlIGxpbmUgbm93IHByZXZlbnRzIHRoYXQgbGluZSBmcm9tCisgICAgICB0cmlnZ2VyaW5nIHZpb2xhdGlvbnMgb24gc3Vic2VxdWVudCBsaW5lcy4KKworICAgICAgQ2xvc2UgIzEzMzYKKworICAgICogQWRkZWQgYSBuZXcgUHl0aG9uIGNoZWNrIGZvciBpbmNvbnNpc3RlbnQgcmV0dXJuIHN0YXRlbWVudHMgaW5zaWRlIG1ldGhvZCBvciBmdW5jdGlvbi4KKyAgICAgIENsb3NlICMxMjY3CisKKyAgICAqIEZpeCBgYHN1cGVyZmx1b3VzLXBhcmVuc2BgIGZhbHNlIHBvc2l0aXZlIHJlbGF0ZWQgdG8gaGFuZGxpbmcgbG9naWNhbCBzdGF0ZW1lbnRzCisgICAgICBpbnZvbHZpbmcgYGBpbmBgIG9wZXJhdG9yLgorCisgICAgICBDbG9zZSAjNTc0CisKKyAgICAqIGBgZnVuY3Rpb24tcmVkZWZpbmVkYGAgbWVzc2FnZSBpcyBubyBsb25nZXIgZW1pdHRlZCBmb3IgZnVuY3Rpb25zIGFuZAorICAgICAgbWV0aG9kcyB3aGljaCBuYW1lcyBtYXRjaGVzIGR1bW15IHZhcmlhYmxlIG5hbWUgcmVndWxhciBleHByZXNzaW9uLgorICAgICAgQ2xvc2UgIzEzNjkKKworICAgICogRml4IGBgbWlzc2luZy1wYXJhbS1kb2NgYCBhbmQgYGBtaXNzaW5nLXR5cGUtZG9jYGAgZmFsc2UgcG9zaXRpdmVzIHdoZW4KKyAgICAgIG1peGluZyBgYEFyZ3NgYCBhbmQgYGBLZXl3b3JkIEFyZ3NgYCBpbiBHb29nbGUgZG9jc3RyaW5nLgorICAgICAgQ2xvc2UgIzE0MDkKKworICAgICAqIEZpeCBgYG1pc3NpbmctZG9jc3RyaW5nYGAgZmFsc2UgbmVnYXRpdmVzIHdoZW4gbW9kdWxlcywgY2xhc3Nlcywgb3IgbWV0aG9kcworICAgICAgIGNvbnNpc3Qgb2YgY29tcG91bmQgc3RhdGVtZW50cyB0aGF0IGV4Y2VlZCB0aGUgYGBkb2NzdHJpbmctbWluLWxlbmd0aGBgCisKKyAgICAqIEZpeCBgYHVzZWxlc3MtZWxzZS1vbi1sb29wYGAgZmFsc2UgcG9zaXRpdmVzIHdoZW4gYnJlYWsgc3RhdGVtZW50cyBhcmUKKyAgICAgIGRlZXBseSBuZXN0ZWQgaW5zaWRlIGxvb3AuCisgICAgICBDbG9zZSAjMTY2MQorCisgICAgKiBGaXggbm8gYGB3cm9uZy1pbXBvcnQtb3JkZXJgYCBtZXNzYWdlIGVtaXR0ZWQgb24gb3JkZXJpbmcgb2YgZmlyc3QgYW5kIHRoaXJkIHBhcnR5CisgICAgICBsaWJyYXJpZXMuIFdpdGggdGhpcyBmaXgsIHB5bGludCBkaXN0aW5ndWlzaGVzIHRoaXJkIGFuZCBmaXJzdCBwYXJ0eQorICAgICAgbW9kdWxlcyB3aGVuIGNoZWNraW5nIGltcG9ydCBvcmRlci4KKyAgICAgIENsb3NlICMxNzAyCisKKyAgICAqIEZpeCBgYHB5bGludCBkaXNhYmxlPWZpeG1lYGAgZGlyZWN0aXZlcyBpZ25vcmVkIGZvciBjb21tZW50cyBmb2xsb3dpbmcgdGhlCisgICAgICBsYXN0IHN0YXRlbWVudCBpbiBhIGZpbGUuCisgICAgICBDbG9zZSAjMTY4MQorCisgICAgKiBGaXggYGBsaW5lLXRvby1sb25nYGAgbWVzc2FnZSBkZWFjdGl2YXRlZCBieSB3cm9uZyBkaXNhYmxlIGRpcmVjdGl2ZS4KKyAgICAgIFRoZSBkaXJlY3RpdmUgYGBkaXNhYmxlPWZpeG1lYGAgZG9lc24ndCBkZWFjdGl2YXRlIGFueW1vcmUgdGhlIGVtaXNzaW9uCisgICAgICBvZiBgYGxpbmUtdG9vLWxvbmdgYCBtZXNzYWdlIGZvciBsb25nIGNvbW1lbnRlZCBsaW5lcy4KKyAgICAgIENsb3NlICMxNzQxCisKKyAgICAqIElmIHRoZSByY2ZpbGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgZG9lc24ndCBleGlzdCwgdGhlbiBhbgorICAgICAgSU9FcnJvciBleGNlcHRpb24gaXMgcmFpc2VkLgorICAgICAgQ2xvc2UgIzE3NDcKKworICAgICogRml4IHRoZSB3cm9uZyBzY29wZSBvZiB0aGUgYGBkaXNhYmxlPWBgIGRpcmVjdGl2ZSBhZnRlciBhIGNvbW1lbnRlZCBsaW5lLgorICAgICAgRm9yIGV4YW1wbGUgd2hlbiBhIGBgZGlzYWJsZT1saW5lLXRvby1sb25nYGAgZGlyZWN0aXZlIGlzIGF0IHRoZSBlbmQgb2YKKyAgICAgIGEgbG9uZyBjb21tZW50ZWQgbGluZSwgaXQgbm8gbG9uZ2VyIGRpc2FibGVzIHRoZSBlbWlzc2lvbiBvZiBgYGxpbmUtdG9vLWxvbmdgYAorICAgICAgbWVzc2FnZSBmb3IgbGluZXMgdGhhdCBmb2xsb3cuCisgICAgICBDbG9zZSAjMTc0MgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuNy4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNy0wNC0xNworCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSB3aGljaCBvY2N1cnJlZCB3aGVuIGFuIGV4Y2VwdGlvbiB3YXMgcmVyYWlzZWQKKworICAgICAgQ2xvc2UgIzE0MTkKKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgb2YgYGBkaXNhbGxvdy10cmFpbGluZy10dXBsZWBgCisKKyAgICAgIFRoZSBjaGVjayB3YXMgaW1wcm92ZWQgYnkgdmVyaWZ5aW5nIGZvciBub24tdGVybWluYXRpbmcgbmV3bGluZXMsIHdoaWNoCisgICAgICBzaG91bGQgZXhlbXB0IGZ1bmN0aW9uIGNhbGxzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmcm9tIHRoZSBjaGVjaworICAgICAgQ2xvc2UgIzE0MjQKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAxLjc/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNy0wNC0xMworCisgICAgKiBEb24ndCBlbWl0IG1pc3NpbmctZmluYWwtbmV3bGluZSBvciB0cmFpbGluZy13aGl0ZXNwYWNlIGZvciBmb3JtZmVlZHMgKHBhZ2UgYnJlYWtzKS4KKworICAgICAgQ2xvc2UgIzEyMTggYW5kICMxMjE5CisKKyAgICAqIERvbid0IGVtaXQgYnkgZGVmYXVsdCBuby1tZW1iZXIgaWYgd2UgaGF2ZSBvcGFxdWUgaW5mZXJlbmNlIG9iamVjdHMgaW4gdGhlIGluZmVyZW5jZSByZXN1bHRzCisKKyAgICAgIFRoaXMgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBuZXcgZmxhZyBpZ25vcmUtb24tb3BhcXVlLWluZmVyZW5jZSwgd2hpY2ggaXMgYnkKKyAgICAgIGRlZmF1bHQgVHJ1ZS4gVGhlIGluZmVyZW5jZSBjYW4gcmV0dXJuICBtdWx0aXBsZSBwb3RlbnRpYWwgcmVzdWx0cyB3aGlsZQorICAgICAgZXZhbHVhdGluZyBhIFB5dGhvbiBvYmplY3QsIGJ1dCBzb21lIGJyYW5jaGVzIG1pZ2h0IG5vdCBiZSBldmFsdWF0ZWQsIHdoaWNoCisgICAgICByZXN1bHRzIGluIHBhcnRpYWwgaW5mZXJlbmNlLiBJbiB0aGF0IGNhc2UsIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBzdGlsbCBlbWl0CisgICAgICBuby1tZW1iZXIgYW5kIG90aGVyIGNoZWNrcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGluZmVycmVkIG9iamVjdHMuCisKKyAgICAqIEFkZGVkIG5ldyBtZXNzYWdlIGBgYXNzaWduLXRvLW5ldy1rZXl3b3JkYGAgdG8gd2FybiBhYm91dCBhc3NpZ25pbmcgdG8gbmFtZXMgd2hpY2gKKyAgICAgIHdpbGwgYmVjb21lIGEga2V5d29yZCBpbiBmdXR1cmUgUHl0aG9uIHJlbGVhc2VzLgorCisgICAgICBDbG9zZSAjMTM1MQorCisgICAgKiBTcGxpdCB0aGUgJ21pc3Npbmcgb3IgZGlmZmVyaW5nJyBpbiBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiBpbiBkaWZmZXJlbnQgZXJyb3IuCisgICAgICAnZGlmZmVyaW5nLXBhcmFtLWRvYycgY292ZXJzIHRoZSBkaWZmZXJpbmcgcGFydCBvZiB0aGUgb2xkICdtaXNzaW5nLXBhcmFtLWRvYycsCisgICAgICBhbmQgJ2RpZmZlcmluZy10eXBlLWRvYycgY292ZXJzIHRoZSBkaWZmZXJpbmcgcGFydCBvZiB0aGUgb2xkICdtaXNzaW5nLXR5cGUtZG9jJworCisgICAgICBDbG9zZSAjMTM0MgorCisgICAgKiBBZGRlZCBhIG5ldyBlcnJvciwgJ3VzZWQtcHJpb3ItZ2xvYmFsLWRlY2xhcmF0aW9uJywgd2hpY2ggaXMgZW1pdHRlZCB3aGVuIGEgbmFtZQorICAgICAgaXMgdXNlZCBwcmlvciBhIGdsb2JhbCBkZWNsYXJhdGlvbiBpbiBhIGZ1bmN0aW9uLiBUaGlzIGNhdXNlcyBhIFN5bnRheEVycm9yIGluCisgICAgICBQeXRob24gMy42CisKKyAgICAgIENsb3NlICMxMjU3CisKKyAgICAqIFRoZSBwcm90b2NvbCBjaGVja3MgYXJlIGVtaXR0aW5nIHRoZWlyIG1lc3NhZ2VzIHdoZW4gYSBzcGVjaWFsIG1ldGhvZCBpcyBzZXQgdG8gTm9uZS4KKworICAgICAgQ2xvc2UgIzEyNjMKKworICAgICogUHJvcGVybHkgZGV0ZWN0IGlmIGltcG9ydGVkIG5hbWUgaXMgYXNzaWduZWQgdG8gc2FtZSBuYW1lIGluIGRpZmZlcmVudAorICAgICAgc2NvcGUuCisKKyAgICAgIENsb3NlICM2MzYsICM4NDgsICM4NTEsIGFuZCAjOTAwCisKKyAgICAqIFJlcXVpcmUgb25lIHNwYWNlIGZvciBhbm5vdGF0aW9ucyB3aXRoIHR5cGUgaGludHMsIGFzIHBlciBQRVAgOC4KKworICAgICogJ3RyYWlsaW5nLWNvbW1hLXR1cGxlJyBjaGVjayB3YXMgYWRkZWQKKworICAgICAgVGhpcyBtZXNzYWdlIGlzIGVtaXR0ZWQgd2hlbiBweWxpbnQgZmluZHMgYW4gb25lLWVsZW1lbnQgdHVwbGUsCisgICAgICBjcmVhdGVkIGJ5IGEgc3RyYXkgY29tbWEuIFRoaXMgY2FuIHN1Z2dlc3QgYSBwb3RlbnRpYWwgcHJvYmxlbSBpbiB0aGUKKyAgICAgIGNvZGUgYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBwYXJhbnRoZXNlcyBpbiBvcmRlciB0byBlbXBoYXNpc2UgdGhlCisgICAgICBjcmVhdGlvbiBvZiBhIHR1cGxlLCByYXRoZXIgdGhhbiByZWx5aW5nIG9uIHRoZSBjb21tYSBpdHNlbGYuCisKKyAgICAqIERvbid0IGVtaXQgbm90LWNhbGxhYmxlIGZvciBpbnN0YW5jZXMgd2l0aCB1bmtub3duIGJhc2VzLgorCisgICAgICBDbG9zZSAjMTIxMworCisgICAgKiBUcmVhdCBrZXl3b3JkIG9ubHkgYXJndW1lbnRzIHRoZSBzYW1lIGFzIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdpdGggcmVnYXJkIHRvIHVudXNlZC1hcmd1bWVudCBjaGVjaworCisgICAgKiBEb24ndCB0cnkgdG8gYWNjZXNzIHZhcmlhYmxlcyBkZWZpbmVkIGluIGEgc2VwYXJhdGUgc2NvcGUgd2hlbiBjaGVja2luZyBmb3IgYGBwcm90ZWN0ZWQtYWNjZXNzYGAKKworICAgICogQWRkZWQgbmV3IGNoZWNrIHRvIGRldGVjdCBpbmNvcnJlY3QgdXNhZ2Ugb2YgbGVuKFNFUVVFTkNFKSBpbnNpZGUKKyAgICAgIHRlc3QgY29uZGl0aW9ucy4KKworICAgICogQWRkZWQgbmV3IGV4dGVuc2lvbiB0byBkZXRlY3QgY29tcGFyaXNvbnMgYWdhaW5zdCBlbXB0eSBzdHJpbmcgY29uc3RhbnRzCisKKyAgICAqIEFkZGVkIG5ldyBleHRlbnNpb24gdG8gZGV0ZWN0IGNvbXBhcmlzb25zIG9mIGludGVnZXJzIGFnYWluc3QgemVybworCisgICAgKiBBZGRlZCBuZXcgZXJyb3IgY29uZGl0aW9ucyBmb3IgJ2JhZC1zdXBlci1jYWxsJworCisgICAgICBOb3cgZGV0ZWN0cyBgYHN1cGVyKHR5cGUoc2VsZiksIHNlbGYpYGAgYW5kIGBgc3VwZXIoc2VsZi5fX2NsYXNzX18sIHNlbGYpYGAKKyAgICAgIHdoaWNoIGNhbiBsZWFkIHRvIHJlY3Vyc2lvbiBsb29wIGluIGRlcml2ZWQgY2xhc3Nlcy4KKworICAgICogUHlMaW50ZXIuc2hvdWxkX2FuYWx5emVfZmlsZSBoYXMgYSBuZXcgb3B0aW9uYWwgcGFyYW1ldGVyLCBjYWxsZWQgYGBpc19hcmd1bWVudGBgCisKKyAgICAgIENsb3NlICMxMDc5CisKKyAgICAqIEFkZCBhdHRyaWJ1dGUgaGludHMgZm9yIG1pc3NpbmcgbWVtYmVycworCisgICAgICBDbG9zZXMgIzEwMzUKKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICdyZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbCcKKworICAgICAgQ2xvc2VzICM2NDkKKworICAgICogU3VwcG9ydCBpbmxpbmUgY29tbWVudHMgZm9yIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgaW4gdGhlIGNvbmZpZyBmaWxlCisKKyAgICAgIENsb3NlcyAjMTAyNAorCisgICAgKiBlcHlsaW50LnB5X3J1bidzICpzY3JpcHQqIHBhcmFtZXRlciB3YXMgcmVtb3ZlZC4KKworICAgICogZXB5bGludC5weV9ydW4gbm93IHVzZXMgYGBzaGVsbD1GYWxzZWBgIGZvciBydW5uaW5nIHRoZSB1bmRlcmx5aW5nIHByb2Nlc3MuCisKKyAgICAgIENsb3NlcyAjNDQxCisKKyAgICAqIEFkZGVkIGEgbmV3IHdhcm5pbmcsICd1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb24nCisKKyAgICAgIENsb3NlIDgzOS4KKworICAgICogQWRkZWQgYSBuZXcgZXJyb3IsICdpbnZhbGlkLW1ldGFjbGFzcycsIHJhaXNlZCB3aGVuCisgICAgICB3ZSBjYW4gZGV0ZWN0IHRoYXQgYSBjbGFzcyBpcyB1c2luZyBhbiBpbXByb3BlciBtZXRhY2xhc3MuCisKKyAgICAgIENsb3NlICM1NzkKKworICAgICogQWRkZWQgYSBuZXcgcmVmYWN0b3JpbmcgbWVzc2FnZSwgJ2xpdGVyYWwtY29tcGFyaXNvbicuCisKKyAgICAgIENsb3NlICM3ODYKKworICAgICogYXJndW1lbnRzLWRpZmZlciB0YWtlcyBpbiBjb25zaWRlcmF0aW9uIGt3b25seWFyZ3MgYW5kIHZhcmlhZGljcworCisgICAgICBDbG9zZSAjOTgzCisKKyAgICAqIFJlbW92ZWQgLS1vcHRpbWl6ZWQtYXN0LiBQYXJ0IG9mICM5NzUuCisKKyAgICAqIFJlbW92ZWQgLS1maWxlcy1vdXRwdXQgb3B0aW9uLiBQYXJ0IG9mICM5NzUuCisKKyAgICAqIFJlbW92ZWQgcHlsaW50LWd1aSBmcm9tIHRoZSBwYWNrYWdlLgorCisgICAgKiBSZW1vdmVkIHRoZSBIVE1MIHJlcG9ydGVyLiBQYXJ0IG9mICM5NzUuCisKKyAgICAqIGlnbm9yZWQtYXJndW1lbnQtbmFtZXMgaXMgbm93IHVzZWQgZm9yIGlnbm9yaW5nIGFyZ3VtZW50cyBmb3IgdW51c2VkLXZhcmlhYmxlIGNoZWNrLgorCisgICAgICBUaGlzIG9wdGlvbiB3YXMgdXNlZCBmb3IgaWdub3JpbmcgYXJndW1lbnRzIHdoZW4gY29tcHV0aW5nIHRoZSBjb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMKKyAgICAgIGEgZnVuY3Rpb24gc2hvdWxkIGhhdmUsIGJ1dCBmb3IgaGFuZGxpbmcgdGhlIGFyZ3VtZW50cyB3aXRoIHJlZ2FyZAorICAgICAgdG8gdW51c2VkLXZhcmlhYmxlIGNoZWNrLCBkdW1teS12YXJpYWJsZXMtcmd4IHdhcyB1c2VkIGluc3RlYWQuIE5vdywgaWdub3JlZC1hcmd1bWVudC1uYW1lcworICAgICAgaXMgdXNlZCBmb3IgaXRzIG9yaWdpbmFsIHB1cnBvc2UgYW5kIGFsc28gZm9yIGlnbm9yaW5nIHRoZSBtYXRjaGVkIGFyZ3VtZW50cyBmb3IKKyAgICAgIHRoZSB1bnVzZWQtdmFyaWFibGUgY2hlY2suIFRoaXMgb2ZmZXJzIGEgYmV0dGVyIGNvbnRyb2wgb2Ygd2hhdCBzaG91bGQgYmUgaWdub3JlZAorICAgICAgYW5kIGhvdy4KKyAgICAgIEFsc28sIHRoZSBzYW1lIG9wdGlvbiB3YXMgbW92ZWQgZnJvbSB0aGUgZGVzaWduIGNoZWNrZXIgdG8gdGhlIHZhcmlhYmxlcyBjaGVja2VyLAorICAgICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgb3B0aW9uIG5vdyBhcHBlYXJzIHVuZGVyIHRoZSBgYFtWQVJJQUJMRVNdYGAgc2VjdGlvbiBpbnNpZGUKKyAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICBDbG9zZSAjODYyLgorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSBmb3Iga2V5d29yZCB2YXJpYWRpY3Mgd2l0aCByZWdhcmQgdG8ga2V5d29yZCBvbmx5IGFyZ3VtZW50cy4KKworICAgICAgSWYgYSBrZXl3b3JkIG9ubHkgYXJndW1lbnQgd2FzIG5lY2Vzc2FyeSBmb3IgYSBmdW5jdGlvbiwgYnV0IHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZAorICAgICAgd2l0aCBrZXl3b3JkIHZhcmlhZGljcyAoXCoqa3dhcmdzKSwgdGhlbiB3ZSB3ZXJlIGVtaXR0aW5nIGEgbWlzc2luZy1rd29hIGZhbHNlIHBvc2l0aXZlLAorICAgICAgd2hpY2ggaXMgbm93IGZpeGVkLgorCisgICAgICBDbG9zZSAjOTM0LgorCisgICAgKiBGaXggc29tZSBmYWxzZSBwb3NpdGl2ZXMgd2l0aCB1bmtub3duIHNpemVkIHZhcmlhZGljcy4KKworICAgICAgQ2xvc2UgIzg3OAorCisgICAgKiBBZGRlZCBhIG5ldyBleHRlbnNpb24sIGNoZWNrX2RvY3N0cmluZywgZm9yIGNoZWNraW5nIFBFUCAyNTcgY29udmVudGlvbnMuCisKKyAgICAgIENsb3NlcyAjODY4LgorCisgICAgKiBjb25maWcgZmlsZXMgd2l0aCBCT00gbWFya2VycyBjYW4gbm93IGJlIHJlYWQuCisKKyAgICAgIENsb3NlICM4NjQuCisKKyAgICAqIGVweWxpbnQucHlfcnVuIGRvZXMgbm90IGNyYXNoIG9uIGJpZyBmaWxlcywgdXNpbmcgLmNvbW11bmljYXRlKCkgaW5zdGVhZCBvZiAud2FpdCgpCisKKyAgICAgIENsb3NlICM1OTkKKworICAgICogRGlzYWJsZSByZXBvcnRzIGJ5IGRlZmF1bHQgYW5kIHNob3cgdGhlIGV2YWx1YXRpb24gc2NvcmUgYnkgZGVmYXVsdAorCisgICAgICBBcyBwZXIgZGlzY3Vzc2lvbiBmcm9tIGlzc3VlICM3NDYsIHRoZSByZXBvcnRzIHdlcmUgZGlzYWJsZWQgYnkKKyAgICAgIGRlZmF1bHQgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHRvb2wKKyAgICAgIGFuZCB0aGUgdXNlcnMuIFRoZSBzY29yZSBpcyBzdGlsbCBzaG93biBieSBkZWZhdWx0LCBhcyBhIHdheSBvZgorICAgICAgY2xvc2VseSBtZWFzdXJpbmcgd2hlbiBpdCBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGR1ZSB0byBjaGFuZ2VzCisgICAgICBicm91Z2h0IHRvIHRoZSBjb2RlLgorCisgICAgKiBEaXNhYmxlIHRoZSBpbmZvcm1hdGlvbiBjYXRlZ29yeSBtZXNzYWdlcyBieSBkZWZhdWx0LgorCisgICAgICBUaGlzIGlzIGEgc3RlcCB0b3dhcmRzIG1ha2luZyBweWxpbnQgbW9yZSBzYW5lLCBhcworICAgICAgcGVyIHRoZSBkaXNjdXNzaW9uIGZyb20gaXNzdWUgIzc0Ni4KKworICAgICogQ2F0Y2ggbW9yZSBjYXNlcyBhcyBub3QgcHJvcGVyIGl0ZXJhYmxlcyBmb3IgX19zbG90c19fIHdpdGgKKyAgICAgIHJlZ2FyZCB0byBpbnZhbGlkLXNsb3RzIHBhdHRlcm4uIENsb3NlcyBpc3N1ZSAjNzc1LgorCisgICAgKiBlbXB0eSBpbmRlbnQgc3RyaW5ncyBhcmUgcmVqZWN0ZWQuCisKKyAgICAqIEFkZGVkIGEgbmV3IGVycm9yLCAncmVsYXRpdmUtYmV5b25kLXRvcC1sZXZlbCcsIHdoaWNoIGlzIGVtaXR0ZWQKKyAgICAgIHdoZW4gYSByZWxhdGl2ZSBpbXBvcnQgd2FzIGF0dGVtcHRlZCBiZXlvbmQgdGhlIHRvcCBsZXZlbCBwYWNrYWdlLgorCisgICAgICBDbG9zZXMgaXNzdWUgIzU4OC4KKworICAgICogQWRkZWQgYSBuZXcgd2FybmluZywgJ3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uJywgd2hpY2ggaXMKKyAgICAgIGVtaXR0ZWQgd2hlbiBpdGVtIGFzc2lnbm1lbnQgaXMgdHJpZWQgb24gYW4gb2JqZWN0IHdoaWNoIGRvZXNuJ3QKKyAgICAgIGhhdmUgdGhpcyBhYmlsaXR5LiBDbG9zZXMgaXNzdWUgIzU5MS4KKworICAgICogQWRkZWQgYSBuZXcgd2FybmluZywgJ3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb24nLCB3aGljaCBpcworICAgICAgZW1pdHRlZCB3aGVuIGl0ZW0gZGVsZXRpb24gaXMgdHJpZWQgb24gYW4gb2JqZWN0IHdoaWNoIGRvZXNuJ3QKKyAgICAgIGhhdmUgdGhpcyBhYmlsaXR5LiBDbG9zZXMgaXNzdWUgIzU5Mi4KKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgb2YgJ3JlZHVuZGFudC1yZXR1cm5zLWRvYycsIG9jY3VycmVkIHdoZW4gdGhlIGRvY3VtZW50ZWQKKyAgICAgIGZ1bmN0aW9uIHdhcyB1c2luZyAqeWllbGQqIGluc3RlYWQgb2YgKnJldHVybiouCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjOTg0LgorCisgICAgKiBGaXggZmFsc2UgcG9zaXRpdmVzIG9mICdtaXNzaW5nLVtyYWlzZXN8cGFyYW1zfHR5cGVdLWRvYycgZHVlIHRvIG5vdAorICAgICAgcmVjb2duaXppbmcga2V5d29yZCBzeW5vbnltcyBzdXBwb3J0ZWQgYnkgU3BoaW54LgorCisgICAgKiBBZGRlZCBhIG5ldyByZWZhY3RvcmluZyBtZXNzYWdlLCAnY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlJywgd2hpY2ggaXMKKyAgICAgIGVtaXR0ZWQgd2hlbmV2ZXIgd2UgY2FuIGRldGVjdCB0aGF0IGNvbnNlY3V0aXZlIGlzaW5zdGFuY2UgY2FsbHMgY2FuIGJlCisgICAgICBtZXJnZWQgdG9nZXRoZXIuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjOTY4CisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIG9mICdtaXNzaW5nLXBhcmFtLWRvYycgYW5kICdtaXNzaW5nLXR5cGUtZG9jJywKKyAgICAgIG9jY3VycmVkIHdoZW4gYSBjbGFzcyBkb2NzdHJpbmcgdXNlcyB0aGUgJ0ZvciB0aGUgcGFyYW1ldGVycywgc2VlJworICAgICAgbWFnaWMgc3RyaW5nIGJ1dCB0aGUgY2xhc3MgX19pbml0X18gZG9jc3RyaW5nIGRvZXMgbm90LCBvciB2aWNlIHZlcnNhLgorCisgICAgKiBgYHJlZGVmaW5lZC1vdXRlci1uYW1lYGAgaXMgbm93IGFsc28gZW1pdHRlZCB3aGVuIGEgbmVzdGVkIGxvb3AncyB0YXJnZXQKKyAgICAgIHZhcmlhYmxlIGlzIHRoZSBzYW1lIGFzIGEgdGFyZ2V0IHZhcmlhYmxlIGluIGFuIG91dGVyIGxvb3AuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjOTExLgorCisgICAgKiBBZGRlZCBwcm9wZXIgZXhjZXB0aW9uIHR5cGUgaW5mZXJlbmNlIGZvciAnbWlzc2luZy1yYWlzZXMtZG9jJy4KKworICAgICogQWRkZWQgSW52YWxpZE1lc3NhZ2VFcnJvciBleGNlcHRpb24gY2xhc3MgdG8gcmVwbGFjZSBhc3NlcnRzIGluCisgICAgICBweWxpbnQudXRpbHMuCisKKyAgICAqIE1vcmUgdGhvcm91Z2ggdmFsaWRhdGlvbiBpbiBNZXNzYWdlc1N0b3JlLnJlZ2lzdGVyX21lc3NhZ2VzKCkgdG8gYXZvaWQKKyAgICAgIG9uZSBtZXNzYWdlIGFjY2lkZW50YWxseSBvdmVyd3JpdGluZyBhbm90aGVyLgorCisgICAgKiBJbnZhbGlkTWVzc2FnZUVycm9yLCBVbmtub3duTWVzc2FnZSwgYW5kIEVtcHR5UmVwb3J0IGV4Y2VwdGlvbnMgYXJlCisgICAgICBtb3ZlZCB0byB0aGUgbmV3IHB5bGludC5leGNlcHRpb25zIHN1Ym1vZHVsZS4KKworICAgICogVW5rbm93bk1lc3NhZ2UgYW5kIEVtcHR5UmVwb3J0IGFyZSByZW5hbWVkIHRvIFVua25vd25NZXNzYWdlRXJyb3IgYW5kCisgICAgICBFbXB0eVJlcG9ydEVycm9yLgorCisgICAgKiBXYXJuaW5ncyAnbWlzc2luZy1yZXR1cm5zLXR5cGUtZG9jJyBhbmQgJ21pc3NpbmcteWllbGRzLXR5cGUtZG9jJworICAgICAgaGF2ZSBlYWNoIGJlZW4gc3BsaXQgaW50byB0d28gd2FybmluZ3MgLSAnbWlzc2luZy1bcmV0dXJufHlpZWxkXS1kb2MnCisgICAgICBhbmQgJ21pc3NpbmctW3JldHVybnx5aWVsZF0tdHlwZS1kb2MnLgorCisgICAgKiBBZGRlZCBlcHl0ZXh0IHN1cHBvcnQgdG8gZG9jcGFyYW1zIGV4dGVuc2lvbi4KKworICAgICAgQ2xvc2VzICMxMDI5LgorCisgICAgKiBTdXBwb3J0IGhhdmluZyBwbHVnaW5zIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgd2l0aCBvcHRpb25zIGRlZmluZWQKKworICAgICAgQ2xvc2VzICMxMDE4CisKKyAgICAqIFNvcnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGluIGEgc2VjdGlvbgorCisgICAgICBDbG9zZXMgIzEwODcKKworICAgICogQWRkZWQgYSBuZXcgUHl0aG9uIDMgd2FybmluZyBhcm91bmQgaW1wbGVtZW50aW5nICdfX2Rpdl9fJywgJ19faWRpdl9fJywgb3IKKyAgICAgICdfX3JkaXZfXycgYXMgdGhvc2UgbWV0aG9kcyBhcmUgcGhhc2VkIG91dCBpbiBQeXRob24gMy4KKworICAgICogQWRkZWQgYSBuZXcgd2FybmluZywgJ292ZXJsYXBwaW5nLWV4Y2VwdCcsIHdoaWNoIGlzCisgICAgICBlbWl0dGVkIHdoZW4gdHdvIGV4Y2VwdGlvbnMgaW4gdGhlIHNhbWUgZXhjZXB0LWNsYXVzZSBhcmUgYWxpYXNlcworICAgICAgZm9yIGVhY2ggb3RoZXIgb3Igb25lIGV4Y2VwdGlvbnMgaXMgYW4gYW5jZXN0b3Igb2YgYW5vdGhlci4KKworICAgICogQXZvaWQgY3Jhc2hpbmcgb24gaWxsLWZvcm1hdHRlZCBzdHJpbmdzIHdoZW4gY2hlY2tpbmcgZm9yIHN0cmluZyBmb3JtYXR0aW5nIGVycm9ycy4KKworICAgICogQWRkZWQgYSBuZXcgUHl0aG9uIDMgd2FybmluZyBmb3IgY2FsbGluZyAnc3RyLmVuY29kZScgb3IgJ3N0ci5kZWNvZGUnIHdpdGggYSBub24tdGV4dAorICAgICAgZW5jb2RpbmcuCisKKyAgICAqIEFkZGVkIG5ldyBjb2RpbmcgY29udmVudGlvbiBtZXNzYWdlLCAnc2luZ2xlLXN0cmluZy11c2VkLWZvci1zbG90cycuCisKKyAgICAgIENsb3NlcyAjMTE2NgorCisgICAgKiBBZGRlZCBhIG5ldyBQeXRob24gMyBjaGVjayBmb3IgYWNjZXNzaW5nICdzeXMubWF4aW50JyB3aGljaCB3YXMgcmVtb3ZlZCBpbiBQeXRob24gMyBpbiBmYXZvcgorICAgICAgb2YgJ3N5cy5tYXhzaXplJworCisgICAgKiBBZGRlZCBhIG5ldyBQeXRob24gMyBjaGVjayBmb3IgYmFkIGltcG9ydHMuCisKKyAgICAqIEFkZGVkIGEgbmV3IFB5dGhvbiAzIGNoZWNrIGZvciBhY2Nlc3NpbmcgZGVwcmVjYXRlZCBzdHJpbmcgZnVuY3Rpb25zLgorCisgICAgKiBEbyBub3Qgd2FybiBhYm91dCB1bnVzZWQgYXJndW1lbnRzIG9yIGZ1bmN0aW9uIGJlaW5nIHJlZGVmaW5lZCBpbiBzaW5nbGVkaXNwYXRjaAorICAgICAgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnMuCisKKyAgICAgIENsb3NlcyAjMTAzMiBhbmQgIzEwMzQKKworICAgICogQWRkZWQgcmVmYWN0b3JpbmcgbWVzc2FnZSAnbm8tZWxzZS1yZXR1cm4nLgorCisgICAgKiBJbXByb3ZlIHVudXNlZC12YXJpYWJsZSBjaGVja2VyIHRvIHdhcm4gYWJvdXQgdW51c2VkIHZhcmlhYmxlcyBpbiBtb2R1bGUgc2NvcGUuCisKKyAgICAgIENsb3NlcyAjOTE5CisKKyAgICAqIElnbm9yZSBtb2R1bGVzIGltcG9ydCBhcyBfIHdoZW4gY2hlY2tpbmcgZm9yIHVudXNlZCBpbXBvcnRzLgorCisgICAgICBDbG9zZXMgIzExOTAKKworICAgICogSW1wcm92ZSBoYW5kaW5nIG9mIFB5dGhvbiAzIGNsYXNzZXMgd2l0aCBtZXRhY2xhc3NlcyBkZWNsYXJlZCBpbiBuZXN0ZWQgc2NvcGVzLgorCisgICAgICBDbG9zZXMgIzExNzcKKworICAgICogQWRkZWQgcmVmYWN0b3JpbmcgbWVzc2FnZSAnY29uc2lkZXItdXNpbmctdGVybmFyeScuCisKKyAgICAgIENsb3NlcyAjMTIwNAorCisgICAgKiBCdWctZml4IGZvciBmYWxzZS1wb3NpdGl2ZSBsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uYCB3aGVuIGZvcm1hdCBzcGVjaWZpY2F0aW9ucworICAgICAgYXJlIHVzZWQgaW4gZm9ybWF0dGVkIHN0cmluZy4KKworICAgICAgRml4ZXMgIzU3MgorCisgICAgKiBBZGRlZCBhIG5ldyBzd2l0Y2ggYGBzaW5nbGUtbGluZS1jbGFzcy1zdG10YGAgdG8gYWxsb3cgc2luZ2xlLWxpbmUgZGVjbGFyYXRpb24KKyAgICAgIG9mIGVtcHR5IGNsYXNzIGJvZGllcy4KKworICAgICAgQ2xvc2VzICM3MzgKKworICAgICogUHJvdGVjdGVkIGFjY2VzcyBpbiBmb3JtIGBgdHlwZShzZWxmKS5fYXR0cmlidXRlYGAgYXJlIG5vdyBhbGxvd2VkLgorCisgICAgICBGaXhlcyAjMTAzMQorCisgICAgKiBMZXQgdGhlIHVzZXIgbW9kaWZ5IG1zZy10ZW1wbGF0ZSB3aGVuIFB5bGludCBpcyBjYWxsZWQgZnJvbSBhIFB5dGhvbiBzY3JpcHQKKworICAgICAgRml4ZXMgIzEyNjkKKworICAgICogSW1wb3J0cyBjaGVja2VyIHN1cHBvcnRzIG5ldyBzd2l0Y2ggYGBhbGxvdy13aWxkY2FyZC13aXRoLWFsbGBgIHdoaWNoIGRpc2FibGVzCisgICAgICB3YXJuaW5nIG9uIHdpbGRjYXJkIGltcG9ydCB3aGVuIGltcG9ydGVkIG1vZHVsZSBkZWZpbmVzIGBgX19hbGxfX2BgIHZhcmlhYmxlLgorCisgICAgICBGaXhlcyAjODMxCisKKyAgICAqIGBgdG9vLW1hbnktZm9ybWF0LWFyZ3NgYCBhbmQgYGB0b28tZmV3LWZvcm1hdC1hcmdzYGAgYXJlIGVtaXR0ZWQgY29ycmVjdGx5IHdoZW4KKyAgICAgIHN0YXJyZWQgZXhwcmVzc2lvbiBhcmUgdXNlZCBpbiBSSFMgdHVwbGUuCisKKyAgICAgIEZpeGVzICM5NTcKKworICAgICogYGBjeWNsaWMtaW1wb3J0YGAgY2hlY2tlciBzdXBwb3J0cyBsb2NhbCBkaXNhYmxlIGNsYXVzZXMuIFdoZW4gb25lCisgICAgICBvZiBjeWNsZSBpbXBvcnRzIHdhcyBkb25lIGluIHNjb3BlIHdoZXJlIGRpc2FibGUgY2xhdXNlIHdhcyBhY3RpdmUsCisgICAgICBjeWNsZSBpcyBub3QgcmVwb3J0ZWQgYXMgdmlvbGF0aW9uLgorCisgICAgICBGaXhlcyAjNTkKKworCitXaGF0J3MgbmV3IGluIFB5bGludCAxLjYuMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTYtMDctMTgKKworICAgICogRG8gbm90IGNyYXNoIHdoZW4gaW5mZXJyaW5nIHVuaW5mZXJhYmxlIGV4Y2VwdGlvbiB0eXBlcyBmb3IgZG9jcGFyYW1zIGV4dGVuc2lvbgorCisgICAgICBDbG9zZSAjOTk4CisKKworV2hhdCdzIG5ldyBpbiBQeWxpbnQgMS42LjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiBUQkEKKworICAgICogRG8gbm90IGNyYXNoIHdoZW4gcHJpbnRpbmcgdGhlIGhlbHAgb2Ygb3B0aW9ucyB3aXRoIGRlZmF1bHQgcmVndWxhciBleHByZXNzaW9ucworCisgICAgICBDbG9zZSAjOTkwCisKKyAgICAqIE1vcmUgZ3JhbnVsYXIgdmVyc2lvbnMgZm9yIGRlcHJlY2F0ZWQgbW9kdWxlcy4KKworICAgICAgQ2xvc2UgIzk5MQorCisKK1doYXQncyBuZXcgaW4gUHlsaW50IDEuNi4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNi0wNy0wNworCisgICAgKiBVc2UgZW52aXJvbm1lbnQgbWFya2VycyBmb3Igc3VwcG9ydGluZyBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS42LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE2LTA3LTAzCisKKyAgICAqIEFkZGVkIGEgbmV3IGV4dGVuc2lvbiwgYGBweWxpbnQuZXh0ZW5zaW9ucy5tY2NhYmVgYCwgZm9yIHdhcm5pbmcKKyAgICAgIGFib3V0IGNvbXBsZXhpdHkgaW4gY29kZS4KKworICAgICogRGVwcmVjYXRlIHN1cHBvcnQgZm9yIC0tb3B0aW1pemUtYXN0LiBQYXJ0IG9mICM5NzUuCisKKyAgICAqIERlcHJlY2F0ZSBzdXBwb3J0IGZvciB0aGUgSFRNTCBvdXRwdXQuIFBhcnQgb2YgIzk3NS4KKworICAgICogRGVwcmVjYXRlIHN1cHBvcnQgZm9yIC0tb3V0cHV0LWZpbGVzLiBQYXJ0IG9mICM5NzUuCisKKyAgICAqIEZpeGVkIGEgZG9jdW1lbnRhdGlvbiBlcnJvciBmb3IgdGhlIGNoZWNrX2RvY3MgZXh0ZW5zaW9uLiBGaXhlcyAjNzM1LgorCisgICAgKiBNYWRlIHRoZSBsaXN0IG9mIHByb3BlcnR5LWRlZmluaW5nIGRlY29yYXRvcnMgY29uZmlndXJhYmxlLgorCisgICAgKiBGaXggYSBidWcgd2hlcmUgdGhlIHRvcCBuYW1lIG9mIGEgcXVhbGlmaWVkIGltcG9ydCB3YXMgZGV0ZWN0ZWQgYXMgdW51c2VkIHZhcmlhYmxlLgorCisgICAgICBDbG9zZSAjOTIzLgorCisgICAgKiBiYWQtYnVpbHRpbiBpcyBub3cgYW4gZXh0ZW5zaW9uIGNoZWNrLgorCisgICAgKiBnZW5lcmF0ZWQtbWVtYmVycyBzdXBwb3J0IHF1YWxpZmllZCBuYW1lIHRocm91Z2ggcmVndWxhciBleHByZXNzaW9ucy4KKworICAgICAgRm9yIGluc3RhbmNlLCBvbmUgY2FuIHNwZWNpZnkgYSByZWd1bGFyIGV4cHJlc3Npb24gYXMgLS1nZW5lcmF0ZWQtbWVtYmVycz1hc3Ryb2lkLm5vZGVfY2xhc3Nlcy4qCisgICAgICBmb3IgaWdub3JpbmcgZXZlcnkgbm8tbWVtYmVyIGVycm9yIHRoYXQgaXMgYWNjZXNzZWQgYXMgaW4gYGBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5taXNzaW5nLm9iamVjdGBgLgorCisgICAgKiBBZGQgdGhlIGFiaWxpdHkgdG8gaWdub3JlIGZpbGVzIGJhc2VkIG9uIHJlZ2V4IG1hdGNoaW5nLCB3aXRoIHRoZSBuZXcgYGAtLWlnbm9yZS1wYXR0ZXJuc2BgCisgICAgICBvcHRpb24uCisKKyAgICAgIFRoaXMgYWRkcmVzc2VzIGlzc3VlICMxNTYgYnkgYWxsb3dpbmcgZm9yIG11bHRpcGxlIGlnbm9yZSBwYXR0ZXJucworICAgICAgdG8gYmUgc3BlY2lmaWVkLiBSYXRoZXIgdGhhbiBjbG9iYmVyIHRoZSBleGlzdGluZyBpZ25vcmUgb3B0aW9uLCB3ZQorICAgICAgaW50cm9kdWNlZCBhIG5ldyBvbmUgY2FsbGVkIGlnbm9yZS1wYXR0ZXJucy4KKworICAgICogQWRkZWQgYSBuZXcgZXJyb3IsICd0cmFpbGluZy1uZXdsaW5lcycsIHdoaWNoIGlzIGVtaXR0ZWQgd2hlbiBhIGZpbGUKKyAgICAgIGhhcyB0cmFpbGluZyBuZXcgbGluZXMuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjNjgyLgorCisgICAgKiBBZGQgYSBuZXcgb3B0aW9uLCAncmVkZWZpbmluZy1idWlsdGlucy1tb2R1bGVzJywgZm9yIGNvbnRyb2xsaW5nIHRoZSBtb2R1bGVzCisgICAgICB3aGljaCBjYW4gcmVkZWZpbmUgYnVpbHRpbnMsIHN1Y2ggYXMgc2l4Lm1vdmVzIGFuZCBmdXR1cmUuYnVpbHRpbnMuCisKKyAgICAgIENsb3NlICM0NjQuCisKKyAgICAqICdyZWltcG9ydGVkJyBpcyBlbWl0dGVkIHdoZW4gdGhlIHNhbWUgbmFtZSBpcyBpbXBvcnRlZCBmcm9tIGRpZmZlcmVudCBtb2R1bGUuCisKKyAgICAgIENsb3NlICMxNjIuCisKKyAgICAqIEFkZCBhIG5ldyByZWNvbW1lbmRhdGlvbiBjaGVja2VyLCAnY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnknLCB3aGljaCBpcyBlbWl0dGVkCisgICAgICB3aGljaCBpcyBlbWl0dGVkIHdoZW4gYSBkaWN0aW9uYXJ5IGlzIGl0ZXJhdGVkIHRocm91Z2ggLmtleXMoKS4KKworICAgICAgQ2xvc2UgIzY5OQorCisgICAgKiBVc2UgdGhlIGNvbmZpZ3BhcnNlciBiYWNrcG9ydCBmb3IgUHl0aG9uIDIKKworICAgICAgVGhpcyBmaXhlcyBhIHByb2JsZW0gd2Ugd2VyZSBoYXZpbmcgd2l0aCBjb21tZW50cyBpbnNpZGUgdmFsdWVzLCB3aGljaCBpcyBmaXhlZAorICAgICAgaW4gUHl0aG9uIDMncyBjb25maWdwYXJzZXIuCisgICAgICBDbG9zZSAjODI4CisKKyAgICAqIEEgbmV3IGVycm9yIHdhcyBhZGRlZCwgJ2ludmFsaWQtbGVuZ3RoLXJldHVybmVkJywgd2hlbiB0aGUgYGBfX2xlbl9fYGAKKyAgICAgIHNwZWNpYWwgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBlbHNlIHRoYW4gYSBub24tbmVnYXRpdmUgbnVtYmVyLgorCisgICAgICBDbG9zZSBpc3N1ZSAjNTU3CisKKyAgICAqIFN3aXRjaCB0byB1c2luZyBpc29ydCBpbnRlcm5hbGx5IGZvciB3cm9uZy1pbXBvcnQtb3JkZXIuCisKKyAgICAgIENsb3NlcyAjODc5LgorCisgICAgKiBjaGVja19kb2NzIGV4dGVuc2lvbiBjYW4gZmluZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGluIF9faW5pdF9fLgorCisgICAgICBDbG9zZXMgIzg4Ny4KKworICAgICogRG9uJ3Qgd2FybiBhYm91dCBpbnZhbGlkLXNlcXVlbmNlLWluZGV4IGlmIHRoZSBpbmRleGVkIG9iamVjdCBoYXMgdW5rbm93biBiYXNlCisgICAgICBjbGFzc2VzLgorCisgICAgICBDbG9zZXMgIzg2NworCisgICAgKiBEb24ndCBjcmFzaCB3aGVuIGNoZWNraW5nLCBmb3Igc3VwZXItaW5pdC1ub3QtY2FsbGVkLCBhIG1ldGhvZCBkZWZpbmVkIGluIGFuIGlmIGJsb2NrLgorCisgICAgKiBEbyBub3QgZW1pdCBpbXBvcnQtZXJyb3Igb3Igbm8tbmFtZS1pbi1tb2R1bGUgZm9yIGZhbGxiYWNrIGltcG9ydCBibG9ja3MgYnkgZGVmYXVsdC4KKworICAgICAgVW50aWwgbm93LCB3ZSB3YXJuZWQgd2l0aCB0aGVzZSBlcnJvcnMgd2hlbiBhIGZhbGxiYWNrIGltcG9ydCBibG9jayAoYSBUcnlFeGNlcHQgYmxvY2sKKyAgICAgIHRoYXQgY29udGFpbmVkIGltcG9ydHMgZm9yIFB5dGhvbiAyIGFuZCAzKSB3YXMgZm91bmQsIGJ1dCB0aGlzIGdldHMgY3VtYmVyc29tZSB3aGVuCisgICAgICB0cnlpbmcgdG8gd3JpdGUgY29tcGF0aWJsZSBjb2RlLiBBcyBzdWNoLCB3ZSBkb24ndCBjaGVjayB0aGVzZSBibG9ja3MgYnkgZGVmYXVsdCwKKyAgICAgIGJ1dCB0aGUgYW5hbHlzaXMgY2FuIGJlIGVuZm9yY2VkIGJ5IHVzaW5nIHRoZSBuZXcgYGAtLWFuYWx5c2UtZmFsbGJhY2stYmxvY2tgYCBmbGFnLgorCisgICAgICBDbG9zZSAjNzY5LgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuNS41PworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNi0wMy0yMQorCisKKyAgICAqIExldCB2aXNpdF9pbXBvcnRmcm9tIGZyb20gUHl0aG9uIDMgcG9ydGluZyBjaGVja2VyIGJlIGNhbGxlZCB3aGVuIGV2ZXJ5dGhpbmcgaXMgZGlzYWJsZWQKKworICAgICAgQmVjYXVzZSB0aGUgdmlzaXQgbWV0aG9kIHdhcyBmaWx0ZXJpbmcgdGhlIHBhdHRlcm5zIGl0IHdhcyBleHBlY3RpbmcgdG8gYmUgYWN0aXZhdGVkLAorICAgICAgaXQgZGlkbid0IHJ1biB3aGVuIGV2ZXJ5dGhpbmcgYnV0IG9uZSBwYXR0ZXJuIHdhcyBkaXNhYmxlZCwgbGVhZGluZyB0byBzcHVyaW91cyBmYWxzZQorICAgICAgcG9zaXRpdmVzCisKKyAgICAgIENsb3NlICM4NTIKKworICAgICogRG9uJ3QgZW1pdCB1bnN1YnNjcmlwdGFibGUtdmFsdWUgZm9yIGNsYXNzZXMgd2l0aCB1bmtub3duCisgICAgICBiYXNlIGNsYXNzZXMuCisKKyAgICAgIENsb3NlICM3NzYuCisKKyAgICAqIFVzZSBhbiBPcmRlcmVkRGljdCBmb3Igc3RvcmluZyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cworCisgICAgICBUaGlzIGZpeGVzIGFuIGlzc3VlIHJlbGF0ZWQgdG8gaW1wcmVkaWN0aWJsZSBvcmRlciBvZiB0aGUgZGlzYWJsZSAvIGVuYWJsZQorICAgICAgZWxlbWVudHMgZnJvbSBhIGNvbmZpZyBmaWxlLiBJbiBjZXJ0YWluIGNhc2VzLCB0aGUgZGlzYWJsZSB3YXMgY29taW5nIGJlZm9yZQorICAgICAgdGhlIGVuYWJsZSB3aGljaCByZXN1bHRlZCBpbiBjbGFzc2VzIG9mIGVycm9ycyB0byBiZSBlbmFibGVkLCBldmVuIHRob3VnaCB0aGUgaW50ZW50aW9uCisgICAgICB3YXMgdG8gZGlzYWJsZSB0aGVtLiBUaGUgYmVzdCBleGFtcGxlIGZvciB0aGlzIHdhcyBpbiB0aGUgY29udGV4dCBvZiBydW5uaW5nIG11bHRpcGxlCisgICAgICBwcm9jZXNzZXMsIGVhY2ggb25lIG9mIGl0IGhhdmluZyBkaWZmZXJlbnQgZW5hYmxlcyAvIGRpc2FibGVzIHRoYXQgYWZmZWN0ZWQgdGhlIG91dHB1dC4KKworICAgICAgQ2xvc2UgIzgxNQorCisgICAgKiBEb24ndCBjb25zaWRlciBiYXJlIGFuZCBicm9hZCBleGNlcHQgaGFuZGxlcnMgYXMgaWdub3JpbmcgTmFtZUVycm9yLAorICAgICAgQXR0cmlidXRlRXJyb3IgYW5kIHNpbWlsYXIgZXhjZXB0aW9ucywgaW4gdGhlIGNvbnRleHQgb2YgY2hlY2tlcnMgZm9yCisgICAgICB0aGVzZSBpc3N1ZXMuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjODI2CisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS41LjQ/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE2LTAxLTE1CisKKworICAgICogTWVyZ2UgU3RyaW5nTWV0aG9kQ2hlY2tlciB3aXRoIFN0cmluZ0Zvcm1hdENoZWNrZXIuIFRoaXMgZml4ZXMgYQorICAgICAgYnVnIHdoZXJlIGRpc2FibGluZyBhbGwgdGhlIG1lc3NhZ2VzIGFuZCBlbmFibGluZyBvbmx5IGEgaGFuZGZ1bCBvZgorICAgICAgbWVzc2FnZXMgZnJvbSB0aGUgU3RyaW5nRm9ybWF0Q2hlY2tlciB3b3VsZCBoYXZlIHJlc3VsdGVkIGluIG5vCisgICAgICBtZXNzYWdlcyBhdCBhbGwuCisKKyAgICAqIERvbid0IGFwcGx5IHVubmVlZGVkLW5vdCBvdmVyIHNldHMuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS41LjM/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE2LTAxLTExCisKKyAgICAqIEhhbmRsZSB0aGUgaW1wb3J0IGZhbGxiYWNrIGlkaW9tIHdpdGggcmVnYXJkIHRvIHdyb25nLWltcG9ydC1vcmRlci4KKworICAgICAgQ2xvc2VzIGlzc3VlICM3NTAuCisKKyAgICAqIERlY291cGxlIHRoZSBkaXNwbGF5aW5nIG9mIHJlcG9ydHMgZnJvbSB0aGUgZGlzcGxheWluZyBvZiBtZXNzYWdlcworCisgICAgICBTb21lIHJlcG9ydGVycyBhcmUgYWdncmVnYXRpbmcgdGhlIG1lc3NhZ2VzIGluc3RlYWQgb2YgZGlzcGxheWluZworICAgICAgdGhlbSB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS4gVGhlIGFjdHVhbCBkaXNwbGF5aW5nIHdhcyBjb25mbGF0dGVkCisgICAgICBpbiB0aGUgZ2VuZXJhdGVfcmVwb3J0cy4gVW5mb3J0dW5hdGVseSB0aGlzIGJlaGF2aW91ciB3YXMgZmxha3kKKyAgICAgIGFuZCBpbiB0aGUgY2FzZSBvZiB0aGUgSlNPTiByZXBvcnRlciwgdGhlIG1lc3NhZ2VzIHdlcmVuJ3Qgc2hvd24KKyAgICAgIGF0IGFsbCBpZiBhIGZpbGUgaGFkIHN5bnRheCBlcnJvcnMgb3IgaWYgaXQgd2FzIG1pc3NpbmcuCisgICAgICBJbiBvcmRlciB0byBmaXggdGhpcywgdGhlIGFnZ3JlZ2F0ZWQgbWVzc2FnZXMgY2FuIG5vdyBiZQorICAgICAgZGlzcGxheWVkIHdpdGggUmVwb3J0ZXIuZGlzcGxheV9tZXNzYWdlLCB3aGlsZSB0aGUgcmVwb3J0cyBhcmUKKyAgICAgIGRpc3BsYXllZCB3aXRoIGRpc3BsYXlfcmVwb3J0cy4KKworICAgICAgQ2xvc2VzIGlzc3VlcyAjNzY2IGFuZCAjNzY1LgorCisgICAgKiBJZ25vcmUgZnVuY3Rpb24gY2FsbHMgd2l0aCB2YXJpYWRpYyBhcmd1bWVudHMgd2l0aG91dCBhIGNvbnRleHQuCisKKyAgICAgIEluZmVycmluZyB2YXJpYWRpYyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhbmQga2V5d29yZCBhcmd1bWVudHMKKyAgICAgIHdpbGwgcmVzdWx0IGludG8gZW1wdHkgVHVwbGVzIGFuZCBEaWN0cywgd2hpY2ggY2FuIGxlYWQgaW4KKyAgICAgIHNvbWUgY2FzZXMgdG8gZmFsc2UgcG9zaXRpdmVzIHdpdGggcmVnYXJkIHRvIG5vLXZhbHVlLWZvci1wYXJhbWV0ZXIuCisgICAgICBJbiBvcmRlciB0byBhdm9pZCB0aGlzLCB1bnRpbCB3ZSdsbCBoYXZlIHN1cHBvcnQgZm9yIGNhbGwgY29udGV4dAorICAgICAgcHJvcGFnYXRpb24sIHdlJ3JlIGlnbm9yaW5nIHN1Y2ggY2FzZXMgaWYgZGV0ZWN0ZWQuCisgICAgICBDbG9zZXMgaXNzdWUgIzcyMi4KKworICAgICogVHJlYXQgQXN5bmNGdW5jdGlvbkRlZiBqdXN0IGxpa2UgRnVuY3Rpb25EZWYgbm9kZXMsCisgICAgICBieSBpbXBsZW1lbnRpbmcgdmlzaXRfYXN5bmNmdW5jdGlvbmRlZiBpbiB0ZXJtcyBvZgorICAgICAgdmlzaXRfZnVuY3Rpb25kZWYuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjNzY3LgorCisgICAgKiBUYWtlIGluIGFjY291bnQga3dvbmx5YXJncyB3aGVuIHZlcmlmeWluZyB0aGF0IGFyZ3VtZW50cworICAgICAgYXJlIGRlZmluZWQgd2l0aCB0aGUgY2hlY2tfZG9jcyBleHRlbnNpb24uCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjNzQ1LgorCisgICAgKiBTdXBwcmVzcyByZXBvcnRpbmcgJ3VubmVlZGVkLW5vdCcgaW5zaWRlIGBgX19uZV9fYGAgbWV0aG9kcworCisgICAgICBDbG9zZXMgaXNzdWUgIzc0OS4KKworCitXaGF0J3MgTmV3IGluIFB5bGludCAxLjUuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTUtMTItMjEKKworICAgICogRG9uJ3QgY3Jhc2ggaWYgZ3JhcGh2aXogaXMgbm90IGluc3RhbGxlZCwgaW5zdGVhZCBlbWl0IGEKKyAgICAgIHdhcm5pbmcgbGV0dGluZyB0aGUgdXNlciB0byBrbm93LgorCisgICAgICBDbG9zZXMgaXNzdWUgIzE2OC4KKworICAgICogQWNjZXB0IG9ubHkgZnVuY3Rpb25zIGFuZCBtZXRob2RzIGZvciB0aGUgZGVwcmVjYXRlZC1tZXRob2QgY2hlY2tlci4KKworICAgICAgVGhpcyBwcmV2ZW50cyBhIGNyYXNoIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGFuIG9iamVjdCBkb2Vzbid0IGhhdmUKKyAgICAgIC5xbmFtZSgpIG1ldGhvZCBhZnRlciB0aGUgaW5mZXJlbmNlLgorCisgICAgKiBEb24ndCBlbWl0IHN1cGVyLW9uLW9sZC1jbGFzcyBvbiBjbGFzc2VzIHdpdGggdW5rbm93biBiYXNlcy4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNzIxLgorCisgICAgKiBBbGxvdyBzdGF0ZW1lbnRzIGluIGBgaWZgYCBvciBgYHRyeWBgIGJsb2NrcyBjb250YWluaW5nIGltcG9ydHMuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjNzE0LgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuNS4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNS0xMi0wMgorCisKKyAgICAqIEZpeCBhIGNyYXNoIHdoaWNoIG9jY3VycmVkIHdoZW4gb2xkIHZpc2l0IG1ldGhvZHMgYXJlIGVuY291bnRlcmVkCisgICAgICBpbiBwbHVnaW4gbW9kdWxlcy4gQ2xvc2VzIGlzc3VlICM3MTEuCisKKyAgICAqIEFkZCB3cm9uZy1pbXBvcnQtcG9zaXRpb24gdG8gY2hlY2tfbWVzc2FnZXMncyBkZWNvcmF0b3IgYXJndW1lbnRzCisgICAgICBmb3IgSW1wb3J0Q2hlY2tlci5sZWF2ZV9tb2R1bGUKKyAgICAgIFRoaXMgZml4ZXMgYW4gZXNvdGVyaWMgYnVnIHdoaWNoIG9jY3VycyB3aGVuIHVuZ3JvdXBlZC1pbXBvcnRzIGFuZAorICAgICAgd3JvbmctaW1wb3J0LW9yZGVyIGFyZSBkaXNhYmxlZCBhbmQgcHlsaW50IGlzIGV4ZWN1dGVkIG9uIG11bHRpcGxlIGZpbGVzLgorICAgICAgV2hhdCBoYXBwZW5zIGlzIHRoYXQgd2l0aG91dCB3cm9uZy1pbXBvcnQtcG9zaXRpb24gaW4gY2hlY2tfbWVzc2FnZXMsCisgICAgICBsZWF2ZV9tb2R1bGUgd2lsbCBuZXZlciBiZSBjYWxsZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGZpcnN0IG5vbi1pbXBvcnQgbm9kZQorICAgICAgZnJvbSBvdGhlciBmaWxlcyBtaWdodCBsZWFrIGludG8gdGhlIGN1cnJlbnQgZmlsZSwKKyAgICAgIGxlYWRpbmcgdG8gd3JvbmctaW1wb3J0LXBvc2l0aW9uIGJlaW5nIGVtaXR0ZWQgYnkgcHlsaW50LgorCisgICAgKiBGaXggYSBjcmFzaCB3aGljaCBvY2N1cnJlZCB3aGVuIG9sZCB2aXNpdCBtZXRob2RzIGFyZSBlbmNvdW50ZXJlZAorICAgICAgaW4gcGx1Z2luIG1vZHVsZXMuIENsb3NlcyBpc3N1ZSAjNzExLgorCisgICAgKiBEb24ndCBlbWl0IGltcG9ydC1zZWxmIGFuZCBjeWNsaWMtaW1wb3J0IGZvciByZWxhdGl2ZSBpbXBvcnRzCisgICAgICBvZiBtb2R1bGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgcGFja2FnZSBpdHNlbGYuCisgICAgICBDbG9zZXMgaXNzdWVzICM3MDggYW5kICM3MDYuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS41LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE1LTExLTI5CisKKworICAgICogQWRkZWQgbXVsdGlwbGUgd2FybmluZ3MgcmVsYXRlZCB0byBpbXBvcnRzLiAnd3JvbmctaW1wb3J0LW9yZGVyJworICAgICAgaXMgZW1pdHRlZCB3aGVuIFBFUCA4IHJlY29tbWVuZGF0aW9ucyByZWdhcmRpbmcgaW1wb3J0cyBhcmUgbm90CisgICAgICByZXNwZWN0ZWQgKHRoYXQgaXMsIHN0YW5kYXJkIGltcG9ydHMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IHRoaXJkLXBhcnR5CisgICAgICBpbXBvcnRzIGFuZCB0aGVuIGJ5IGxvY2FsIGltcG9ydHMpLiAndW5ncm91cGVkLWltcG9ydHMnIGlzIGVtaXR0ZWQKKyAgICAgIHdoZW4gaW1wb3J0cyBmcm9tIHRoZSBzYW1lIHBhY2thZ2Ugb3IgbW9kdWxlIGFyZSBub3QgcGxhY2VkCisgICAgICB0b2dldGhlciwgYnV0IHNjYXR0ZXJlZCBhcm91bmQgaW4gdGhlIGNvZGUuICd3cm9uZy1pbXBvcnQtcG9zaXRpb24nCisgICAgICBpcyBlbWl0dGVkIHdoZW4gY29kZSBpcyBtaXhlZCB3aXRoIGltcG9ydHMsIGJlaW5nIHJlY29tbWVuZGVkIGZvciB0aGUKKyAgICAgIGxhdHRlciB0byBiZSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCBpbiBvcmRlciB0byBmaWd1cmUgb3V0IGVhc2llciBieQorICAgICAgYSBodW1hbiByZWFkZXIgd2hhdCBkZXBlbmRlbmNpZXMgYSBtb2R1bGUgaGFzLgorICAgICAgQ2xvc2VzIGlzc3VlICM2OTIuCisKKyAgICAqIEFkZGVkIGEgbmV3IHJlZmFjdG9yaW5nIHdhcm5pbmcsICd1bm5lZWRlZC1ub3QnLCBlbWl0dGVkCisgICAgICB3aGVuIGFuIGV4cHJlc3Npb24gd2l0aCB0aGUgbm90IG9wZXJhdG9yIGNvdWxkIGJlIHNpbXBsaWZpZWQuCisgICAgICBDbG9zZXMgaXNzdWUgIzY3MC4KKworICAgICogQWRkZWQgYSBuZXcgcmVmYWN0b3Jpbmcgd2FybmluZywgJ3NpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnQnLAorICAgICAgdXNlZCB3aGVuIGFuIGlmIHN0YXRlbWVudCBjb3VsZCBiZSByZWR1Y2VkIHRvIGEgYm9vbGVhbiBldmFsdWF0aW9uCisgICAgICBvZiBpdHMgdGVzdC4gQ2xvc2VzIGlzc3VlICM2OTguCisKKyAgICAqIEFkZGVkIGEgbmV3IHJlZmFjdG9yaW5nIHdhcm5pbmcsICd0b28tbWFueS1ib29sZWFuLWV4cHJlc3Npb25zJywKKyAgICAgIHVzZWQgd2hlbiBhbiBpZiBzdGF0ZW1lbnQgY29udGFpbnMgdG9vIG1hbnkgYm9vbGVhbiBleHByZXNzaW9ucywKKyAgICAgIHdoaWNoIG1ha2VzIHRoZSBjb2RlIGxlc3MgbWFpbnRhaW5hYmxlIGFuZCBoYXJkZXIgdG8gdW5kZXJzdGFuZC4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNjc3LgorCisgICAgKiBQcm9wZXJ0eSBtZXRob2RzIGFyZSBzaG93biBhcyBhdHRyaWJ1dGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zIGluCisgICAgICBweXJldmVyc2UgY2xhc3MgZGlhZ3JhbXMuIENsb3NlcyBJc3N1ZSAjMjg0CisKKyAgICAqIEFkZCBhIG5ldyByZWZhY3RvcmluZyBlcnJvciwgJ3Rvby1tYW55LW5lc3RlZC1ibG9ja3MnLCB3aGljaCBpcyBlbWl0dGVkCisgICAgICB3aGVuIGEgZnVuY3Rpb24gb3IgYSBtZXRob2QgaGFzIHRvbyBtYW55IG5lc3RlZCBibG9ja3MsIHdoaWNoIG1ha2VzIHRoZQorICAgICAgY29kZSBsZXNzIHJlYWRhYmxlIGFuZCBoYXJkZXIgdG8gdW5kZXJzdGFuZC4gQ2xvc2VzIGlzc3VlICM2NjguCisKKyAgICAqIEFkZCBhIG5ldyBlcnJvciwgJ3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QnLCB0aGF0IGlzIGVtaXR0ZWQgd2hlbgorICAgICAgdmFsdWUgdXNlZCBpbiBzdWJzY3JpcHRpb24gZXhwcmVzc2lvbiBkb2Vzbid0IHN1cHBvcnQgc3Vic2NyaXB0aW9uCisgICAgICAoaS5lLiBkb2Vzbid0IGRlZmluZSBfX2dldGl0ZW1fXyBtZXRob2QpLgorCisgICAgKiBEb24ndCB3YXJuIGFib3V0IGFic3RyYWN0IGNsYXNzZXMgaW5zdGFudGlhdGVkIGluIHRoZWlyIG93bgorICAgICAgYm9keS4gQ2xvc2VzIGlzc3VlICM2MjcuCisKKyAgICAqIE9ic29sZXRlIG9wdGlvbnMgYXJlIG5vdCBwcmVzZW50IGJ5IGRlZmF1bHQgaW4gdGhlIGdlbmVyYXRlZAorICAgICAgY29uZmlndXJhdGlvbiBmaWxlLiBDbG9zZXMgaXNzdWUgIzYzMi4KKworICAgICogbm9uLWl0ZXJhdG9yLXJldHVybmVkIGNhbiBkZXRlY3QgY2xhc3NlcyB3aXRoIGl0ZXJhdG9yLW1ldGFjbGFzc2VzLgorICAgICAgQ2xvc2VzIGlzc3VlICM2NzkuCisKKyAgICAqIEFkZCBhIG5ldyBlcnJvciwgJ3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdCcsIGVtaXR0ZWQgd2hlbiB2YWx1ZQorICAgICAgdG8gdGhlIHJpZ2h0IG9mIHRoZSAnaW4nIG9wZXJhdG9yIGRvZXNuJ3Qgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3QKKyAgICAgIHByb3RvY29sIChpLmUuIGRvZXNuJ3QgZGVmaW5lIF9fY29udGFpbnNfXy9fX2l0ZXJfXy9fX2dldGl0ZW1fXykKKworICAgICogQWRkIG5ldyBlcnJvcnMsICdub3QtYW4taXRlcmFibGUnLCBlbWl0dGVkIHdoZW4gbm9uLWl0ZXJhYmxlIHZhbHVlCisgICAgICBpcyB1c2VkIGluIGFuIGl0ZXJhdGluZyBjb250ZXh0IChzdGFyYXJncywgZm9yLXN0YXRlbWVudCwKKyAgICAgIGNvbXByZWhlbnNpb25zLCBldGMpLCBhbmQgJ25vdC1hLW1hcHBpbmcnLCBlbWl0dGVkIHdoZW4gbm9uLW1hcHBpbmcKKyAgICAgIHZhbHVlIGlzIHVzZWQgaW4gYSBtYXBwaW5nIGNvbnRleHQuIENsb3NlcyBpc3N1ZSAjNTYzLgorCisgICAgKiBNYWtlICduby1zZWxmLXVzZScgY2hlY2tlciBub3QgZW1pdCBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgYSAnc3VwZXIoKScKKyAgICAgIGNhbGwgaW5zaWRlIHRoZSBtZXRob2QuCisgICAgICBDbG9zZXMgaXNzdWUgIzY2Ny4KKworICAgICogQWRkIGNoZWNrZXIgdG8gaWRlbnRpZnkgbXVsdGlwbGUgaW1wb3J0cyBvbiBvbmUgbGluZS4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNTk4LgorCisgICAgKiBGaXggdW51c2VkLWFyZ3VtZW50IGZhbHNlIHBvc2l0aXZlIHdoZW4gdGhlICIrPSIgb3BlcmF0b3IgaXMgdXNlZC4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNTE4LgorCisgICAgKiBEb24ndCBlbWl0IGltcG9ydC1lcnJvciBmb3IgaWdub3JlZCBtb2R1bGVzLiBQeUxpbnQgd2lsbCBub3QgZW1pdCBpbXBvcnQKKyAgICAgIGVycm9ycyBmb3IgYW55IGltcG9ydCB3aGljaCBpcywgb3IgaXMgYSBzdWJwYWNrYWdlIG9mLCBhIG1vZHVsZSBpbgorICAgICAgdGhlIGlnbm9yZWQtbW9kdWxlcyBsaXN0LiBDbG9zZXMgaXNzdWUgIzIyMy4KKworICAgICogRml4IHVudXNlZC1pbXBvcnQgZmFsc2UgcG9zaXRpdmUgd2hlbiB0aGUgaW1wb3J0IGlzIHVzZWQgaW4gYQorICAgICAgY2xhc3MgYXNzaWdubWVudC4gQ2xvc2VzIGlzc3VlICM0NzUKKworICAgICogQWRkIGEgbmV3IGVycm9yLCAnbm90LWNvbnRleHQtbWFuYWdlcicsIGVtaXR0ZWQgd2hlbiBzb21ldGhpbmcKKyAgICAgIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgX19lbnRlcl9fIGFuZCBfX2V4aXRfXyBpcyB1c2VkIGluIGEgd2l0aAorICAgICAgc3RhdGVtZW50LgorCisgICAgKiBBZGQgYSBuZXcgd2FybmluZywgJ2NvbmZ1c2luZy13aXRoLXN0YXRlbWVudCcsIGVtaXR0ZWQgYnkgdGhlCisgICAgICBiYXNlIGNoZWNrZXIsIHdoZW4gYW4gYW1iaWd1b3VzIGxvb2tpbmcgd2l0aCBzdGF0ZW1lbnQgaXMgdXNlZC4KKyAgICAgIEZvciBleGFtcGxlIGB3aXRoIG9wZW4oKSBhcyBmaXJzdCwgc2Vjb25kYCB3aGljaCBsb29rcyBsaWtlIGEKKyAgICAgIHR1cGxlIGFzc2lnbm1lbnQgYnV0IGlzIGFjdHVhbGx5IDIgY29udGV4dCBtYW5hZ2Vycy4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICdkdXBsaWNhdGUtZXhjZXB0JywgZW1pdHRlZCB3aGVuIHRoZXJlIGlzIGFuCisgICAgICBleGNlcHRpb24gaGFuZGxlciB3aGljaCBoYW5kbGVzIGFuIGV4Y2VwdGlvbiB0eXBlIHRoYXQgd2FzIGhhbmRsZWQKKyAgICAgIGJlZm9yZS4gQ2xvc2VzIGlzc3VlICM0ODUuCisKKyAgICAqIEEgY291cGxlIG9mIHdhcm5pbmdzIGdvdCBwcm9tb3RlZCB0byBlcnJvcnMsIHNpbmNlIHRoZXkgY291bGQgdW5jb3ZlcgorICAgICAgcG90ZW50aWFsIGJ1Z3MgaW4gdGhlIGNvZGUuIFRoZXNlIHdhcm5pbmdzIGFyZTogYXNzaWdubWVudC1mcm9tLW5vbmUsCisgICAgICB1bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZywgdW5wYWNraW5nLW5vbi1zZXF1ZW5jZSwgbm9uLWl0ZXJhdG9yLXJldHVybmVkLgorICAgICAgQ2xvc2VzIGlzc3VlICMzODguCisKKyAgICAqIEFsbG93IGVuZGluZyBhIHByYWdtYSBjb250cm9sIHdpdGggYSBzZW1pY29sb24uIEluIHRoaXMgd2F5LCB1c2VycworICAgICAgY2FuIGNvbnRpbnVlIGEgcHJhZ21hIGNvbnRyb2wgd2l0aCBhIHJlYXNvbiBmb3Igd2h5IGl0IGlzIHVzZWQsCisgICAgICBhcyBpbiBgIyBweWxpbnQ6IGRpc2FibGU9b2xkLXN0eWxlLWNsYXNzO3JlYXNvbj0uLi5gLgorICAgICAgQ2xvc2VzIGlzc3VlICM0NDkuCisKKyAgICAqIC0tam9icyBjYW4gYmUgdXNlZCB3aXRoIC0tbG9hZC1wbHVnaW5zIG5vdy4gQ2xvc2VzIGlzc3VlICM0NTYuCisKKyAgICAqIEltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIC0tam9icyB3aGVuIGRlYWxpbmcgb25seSB3aXRoIGEgcGFja2FnZQorICAgICAgbmFtZS4gQ2xvc2VzIGlzc3VlICM0NzkuCisKKyAgICAqIERvbid0IGVtaXQgYW4gdW51c2VkLXdpbGRjYXJkLWltcG9ydCB3aGVuIHRoZSBpbXBvcnRlZCBuYW1lIGNvbWVzCisgICAgICBmcm9tIGFub3RoZXIgbW9kdWxlIGFuZCBpdCBpcyBpbiBmYWN0IGEgX19mdXR1cmVfXyBuYW1lLgorCisgICAgKiBUaGUgY29sb3JpemVkIHJlcG9ydGVyIG5vdyB3b3JrcyBvbiBXaW5kb3dzLiBDbG9zZXMgaXNzdWUgIzk2LgorCisgICAgKiBSZW1vdmUgcG9pbnRsZXNzLWV4Y2VwdCB3YXJuaW5nLiBJdCB3YXMgcHJldmlvdXNseSBkaXNhYmxlZCBieQorICAgICAgZGVmYXVsdCBhbmQgaXQgd2Fzbid0IHZlcnkgdXNlZnVsLiBDbG9zZXMgaXNzdWUgIzUwNi4KKworICAgICogRml4IGEgY3Jhc2ggb24gUHl0aG9uIDMgcmVsYXRlZCB0byB0aGUgc3RyaW5nIGNoZWNrZXIsIHdoaWNoCisgICAgICBjcmFzaGVkIHdoZW4gaXQgZW5jb3VudGVyZWQgYSBieXRlcyBzdHJpbmcgd2l0aCBhIC5mb3JtYXQKKyAgICAgIG1ldGhvZCBjYWxsZWQuCisKKyAgICAqIERvbid0IHdhcm4gYWJvdXQgbm8tc2VsZi11c2UgZm9yIGJ1aWx0aW4gcHJvcGVydGllcy4KKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgZm9yIGJhZC1yZXZlcnNlZC1zZXF1ZW5jZSwgd2hlbiBhIHN1YmNsYXNzCisgICAgICBvZiBhIGBgZGljdGBgIHByb3ZpZGVzIGEgX19yZXZlcnNlZF9fIG1ldGhvZC4KKworICAgICogQ2hhbmdlIHRoZSBkZWZhdWx0IG5vLWRvY3N0cmluZy1yZ3ggc28gbWlzc2luZy1kb2NzdHJpbmcgaXNuJ3QKKyAgICAgIGVtaXR0ZWQgZm9yIHByaXZhdGUgZnVuY3Rpb25zLgorCisgICAgKiBEb24ndCBlbWl0IHJlZGVmaW5lZC1vdXRlci1uYW1lIGZvciBfX2Z1dHVyZV9fIGRpcmVjdGl2ZXMuCisgICAgICBDbG9zZXMgaXNzdWUgIzUyMC4KKworICAgICogUHJvdmlkZSBzb21lIGhpbnRzIGZvciB0aGUgYmFkLWJ1aWx0aW4gbWVzc2FnZS4gQ2xvc2VzIGlzc3VlICM1MjIuCisKKyAgICAqIFdoZW4gY2hlY2tpbmcgZm9yIGludmFsaWQgYXJndW1lbnRzIHRvIGEgY2FsbGFibGUsIGluIHR5cGVjaGVjay5weSwKKyAgICAgIGxvb2sgdXAgZm9yIHRoZSBfX2luaXRfXyBpbiBjYXNlIHRoZSBmb3VuZCBfX25ld19fIGNvbWVzIGZyb20gYnVpbHRpbnMuCisKKyAgICAgIFNpbmNlIHRoZSBfX25ld19fIGNvbWVzIGZyb20gYnVpbHRpbnMsIGl0IHdpbGwgbm90IGhhdmUgYXR0YWNoZWQgYW55CisgICAgICBpbmZvcm1hdGlvbiByZWdhcmRpbmcgd2hhdCBwYXJhbWV0ZXJzIGl0IGV4cGVjdHMsIHNvIHRoZSBjaGVjaworICAgICAgd2lsbCBiZSB1c2VsZXNzLiBSZXRyaWV2aW5nIF9faW5pdF9fIGluIHRoYXQgY2FzZSB3aWxsIGF0IGxlYXN0CisgICAgICBkZXRlY3QgYSBjb3VwbGUgb2YgZmFsc2UgbmVnYXRpdmVzLiBDbG9zZXMgaXNzdWUgIzQyOS4KKworICAgICogRG9uJ3QgZW1pdCBuby1tZW1iZXIgZm9yIGNsYXNzZXMgd2l0aCB1bmtub3duIGJhc2VzLgorCisgICAgICBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQgdGhvc2UgYmFzZXMgbWlnaHQgYWRkLCB3ZSBzaW1wbHkgaWdub3JlCisgICAgICB0aGUgZXJyb3IgaW4gdGhpcyBjYXNlLgorCisgICAgKiBMb29rdXAgaW4gdGhlIGltcGxpY2l0IG1ldGFjbGFzcyB3aGVuIGNoZWNraW5nIGZvciBuby1tZW1iZXIsCisgICAgICBpZiB0aGUgY2xhc3MgaW4gcXVlc3Rpb24gaGFzIGFuIGltcGxpY2l0IG1ldGFjbGFzcywgd2hpY2ggaXMKKyAgICAgIFRydWUgZm9yIG5ldyBzdHlsZSBjbGFzc2VzLiBDbG9zZXMgaXNzdWUgIzQzOC4KKworICAgICogQWRkIHR3byBuZXcgd2FybmluZ3MsIGR1cGxpY2F0ZS1iYXNlcyBhbmQgaW5jb25zaXN0ZW50LW1yby4KKworICAgICAgZHVwbGljYXRlLWJhc2VzIGlzIGVtaXR0ZWQgd2hlbiBhIGNsYXNzIGhhcyB0aGUgc2FtZSBiYXNlcworICAgICAgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIGl0cyBiYXNlcyBkZWZpbml0aW9uLCB3aGlsZSBpbmNvbnNpc3RlbnQtbXJvCisgICAgICBpcyBlbWl0dGVkIHdoZW4gbm8gc2FuZSBtcm8gaGllcmFyY2h5IGNhbiBiZSBkZXRlcm1pbmVkLiBDbG9zZXMgaXNzdWUgIzUyNi4KKworICAgICogUmVtb3ZlIGludGVyZmFjZS1ub3QtaW1wbGVtZW50ZWQgd2FybmluZy4gQ2xvc2VzIGlzc3VlICM1MzIuCisKKyAgICAqIFJlbW92ZSB0aGUgcmVzdCBvZiBpbnRlcmZhY2UgY2hlY2tzOiBpbnRlcmZhY2UtaXMtbm90LWNsYXNzLAorICAgICAgbWlzc2luZy1pbnRlcmZhY2UtbWV0aG9kLCB1bnJlc29sdmVkLWludGVyZmFjZS4gVGhlIHJlYXNvbiBpcyB0aGF0CisgICAgICBpdHMgYmV0dGVyIHRvIHN0YXJ0IHJlY29tbWVuZGluZyBBQkNzIGluc3RlYWQgb2YgdGhlIG9sZCBab3BlIGVyYQorICAgICAgb2YgaW50ZXJmYWNlcy4gT25lIHNpZGUgZWZmZWN0IG9mIHRoaXMgY2hhbmdlIGlzIHRoYXQgaWdub3JlLWlmYWNlLW1ldGhvZHMKKyAgICAgIGJlY29tZXMgYSBub29wLCBpdCdzIGRlcHJlY2F0ZWQgYW5kIGl0IHdpbGwgYmUgcmVtb3ZlZCBhdCBzb21lIHRpbWUuCisKKyAgICAqIEVtaXQgYSBwcm9wZXIgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgcmVwb3J0ZXJzLkJhc2VSZXBvcnRlci5hZGRfbWVzc2FnZS4KKworICAgICAgVGhlIGFsdGVybmF0aXZlIHdheSBpcyB0byB1c2UgaGFuZGxlX21lc3NhZ2UuIGFkZF9tZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZCBpbgorICAgICAgUHlsaW50IDEuNi4KKworICAgICogQWRkZWQgbmV3IG1vZHVsZSAnZXh0ZW5zaW9ucycgZm9yIG9wdGlvbmFsIGNoZWNrZXJzIHdpdGggdGhlIHRlc3QKKyAgICAgIGRpcmVjdG9yeSAndGVzdC9leHRlbnNpb25zJyBhbmQgZG9jdW1lbnRhdGlvbiBmaWxlICdkb2MvZXh0ZW5zaW9ucy5yc3QnLgorCisgICAgKiBBZGRlZCBuZXcgY2hlY2tlciAnZXh0ZW5zaW9ucy5jaGVja19kb2NzJyB0aGF0IHZlcmlmaWVzIHBhcmFtZXRlcgorICAgICAgZG9jdW1lbnRpb24gaW4gU3BoaW54LCBHb29nbGUsIGFuZCBOdW1weSBzdHlsZS4KKworICAgICogRGV0ZWN0IHVuZGVmaW5lZCB2YXJpYWJsZSBjYXNlcywgd2hlcmUgdGhlICJkZWZpbml0aW9uIiBvZiBhbiB1bmRlZmluZWQKKyAgICAgIHZhcmlhYmxlIHdhcyBpbiBkZWwgc3RhdGVtZW50LiBJbnN0ZWFkIG9mIGVtaXR0aW5nIHVzZWQtYmVmb3JlLWFzc2lnbm1lbnQsCisgICAgICB3aGljaCBpcyB0b3RhbGx5IG1pc2xlYWRpbmcsIGl0IG5vdyBlbWl0cyB1bmRlZmluZWQtdmFyaWFibGUuCisgICAgICBDbG9zZXMgaXNzdWUgIzUyOC4KKworICAgICogRG9uJ3QgZW1pdCBhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQgYW5kIGFjY2Vzcy1tZW1iZXItYmVmb3JlLWRlZmluaXRpb24KKyAgICAgIGZvciBtaXhpbiBjbGFzc2VzLiBBY3R1YWwgZXJyb3JzIGNhbiBvY2N1ciBpbiBtaXhpbiBjbGFzc2VzLCBidXQgdGhpcyBpcworICAgICAgY29udHJvbGxlZCBieSB0aGUgaWdub3JlLW1peGluLW1lbWJlcnMgb3B0aW9uLiBDbG9zZXMgaXNzdWUgIzQxMi4KKworICAgICogSW1wcm92ZSB0aGUgZGV0ZWN0aW9uIG9mIHVuZGVmaW5lZCB2YXJpYWJsZXMgYW5kIHZhcmlhYmxlcyB1c2VkIGJlZm9yZQorICAgICAgYXNzaWdubWVudCBmb3IgdmFyaWFibGVzIHVzZWQgYXMgZGVmYXVsdCBhcmd1bWVudHMgdG8gZnVuY3Rpb24sCisgICAgICB3aGVyZSB0aGUgdmFyaWFibGUgd2FzIGZpcnN0IGRlZmluZWQgaW4gdGhlIGNsYXNzIHNjb3BlLgorICAgICAgQ2xvc2VzIGlzc3VlICMzNDIgYW5kIGlzc3VlICM0MDQuCisKKyAgICAqIEFkZCBhIG5ldyB3YXJuaW5nLCAndW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmUnLCB3aGljaCBpcyBlbWl0dGVkCisgICAgICB3aGVuIGEgc3BlY2lhbCBtZXRob2QgKGR1bmRlciBtZXRob2QpIGRvZXNuJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLAorICAgICAgd2hpY2ggY2FuIGxlYWQgdG8gYWN0dWFsIGVycm9ycyBpbiB0aGUgYXBwbGljYXRpb24gY29kZS4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMjUzLgorCisgICAgKiBSZW1vdmUgJ2JhZC1jb250ZXh0LW1hbmFnZXInIGR1ZSB0byB0aGUgaW5jbHVzaW9uIG9mICd1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZScuCisKKyAgICAqIERvbid0IGVtaXQgbm8tbmFtZS1pbi1tb2R1bGUgaWYgdGhlIGltcG9ydCBpcyBndWFyZGVkIGJ5IGFuIEltcG9ydEVycm9yLCBFeGNlcHRpb24gb3IKKyAgICAgIGEgYmFyZSBleGNlcHQgY2xhdXNlLgorCisgICAgKiBEb24ndCBlbWl0IG5vLW1lbWJlciBpZiB0aGUgYXR0cmlidXRlIGFjY2VzcyBub2RlIGlzIHByb3RlY3RlZCBieSBhbgorICAgICAgZXhjZXB0IGhhbmRsZXIsIHdoaWNoIGhhbmRsZXMgQXR0cmlidXRlRXJyb3IsIEV4Y2VwdGlvbiBvciBpdCBpcyBhCisgICAgICBiYXJlIGV4Y2VwdC4KKworICAgICogRG9uJ3QgZW1pdCBpbXBvcnQtZXJyb3IgaWYgdGhlIGltcG9ydCBpcyBndWFyZGVkIGJ5IGFuIEltcG9ydEVycm9yLCBFeGNlcHRpb24gb3IgYQorICAgICAgYmFyZSBleGNlcHQgY2xhdXNlLgorCisgICAgKiBEb24ndCBlbWl0IHVuZGVmaW5lZC12YXJpYWJsZSBpZiB0aGUgbm9kZSBpcyBndWFyZGVkIGJ5IGEgTmFtZUVycm9yLCBFeGNlcHRpb24KKyAgICAgIG9yIGJhcmUgZXhjZXB0IGNsYXVzZS4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICd1c2luZy1jb25zdGFudC10ZXN0Jywgd2hpY2ggaXMgZW1pdHRlZCB3aGVuIGEgY29uZGl0aW9uYWwKKyAgICAgIHN0YXRlbWVudCAoSWYsIElmRXhwKSB1c2VzIGEgdGVzdCB3aGljaCBpcyBhbHdheXMgY29uc3RhbnQsIHN1Y2ggYXMgbnVtYmVycywKKyAgICAgIGNsYXNzZXMsIGZ1bmN0aW9ucyBldGMuIFRoaXMgaXMgbW9zdCBsaWtlbHkgYW4gZXJyb3IgZnJvbSB0aGUgdXNlcidzIHBhcnQuCisgICAgICBDbG9zZXMgaXNzdWUgIzUyNC4KKworICAgICogRG9uJ3QgZW1pdCAncmFpc2luZy1ub24tZXhjZXB0aW9uJyB3aGVuIHRoZSBleGNlcHRpb24gaGFzIHVua25vd24KKyAgICAgIGJhc2VzLiBXZSBkb24ndCBrbm93IHdoYXQgdGhvc2UgYmFzZXMgYWN0dWFsbHkgYXJlIGFuZCBpdCdzIGJldHRlcgorICAgICAgdG8gYXNzdW1lIHRoYXQgdGhlIHVzZXIga25vd3Mgd2hhdCBoZSBpcyBkb2luZyByYXRoZXIgdGhhbiBlbWl0dGluZworICAgICAgYSBtZXNzYWdlIHdoaWNoIGNhbiBiZSBjb25zaWRlcmVkIGEgZmFsc2UgcG9zaXRpdmUuCisKKyAgICAqIExvb2sgZm9yIGEgLnB5bGludHJjIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgY3VycmVudCBmb2xkZXIsCisgICAgICBpZiBweWxpbnRyYyBpcyBub3QgZm91bmQuIERvdHRlZCBweWxpbnRyYyBmaWxlcyB3aWxsIG5vdCBiZSBzZWFyY2hlZAorICAgICAgaW4gdGhlIHBhcmVudHMgb2YgdGhlIGN1cnJlbnQgZm9sZGVyLCBhcyBpdCBpcyBkb25lIGZvciBweWxpbnRyYy4KKworICAgICogQWRkIGEgbmV3IGVycm9yLCAnaW52YWxpZC11bmFyeS10eXBlLW9wZXJhbmQnLCBlbWl0dGVkIHdoZW4KKyAgICAgIGFuIHVuYXJ5IG9wZXJhbmQgaXMgdXNlZCBvbiBzb21ldGhpbmcgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHRoYXQKKyAgICAgIG9wZXJhdGlvbiAoZm9yIGluc3RhbmNlLCB1c2luZyB0aGUgdW5hcnkgYml0d2lzZSBpbnZlcnNpb24gb3BlcmF0b3IKKyAgICAgIG9uIGFuIGluc3RhbmNlIHdoaWNoIGRvZXNuJ3QgaW1wbGVtZW50IF9faW52ZXJ0X18pLgorCisgICAgKiBUYWtlIGluIGNvbnNpZGVyYXRpb24gZGlmZmVyZW5jZXMgYmV0d2VlbiBhcmd1bWVudHMgb2YgdmFyaW91cworICAgICAgdHlwZSBvZiBmdW5jdGlvbnMgKGNsYXNzbWV0aG9kcywgc3RhdGljbWV0aG9kcywgcHJvcGVydGllcykKKyAgICAgIHdoZW4gY2hlY2tpbmcgZm9yIGBgYXJndW1lbnRzLWRpZmZlcmBgLiBDbG9zZXMgaXNzdWUgIzU0OC4KKworICAgICogYXN0cm9pZC5pbnNwZWN0b3Igd2FzIG1vdmVkIHRvIHB5bGludC5weXJldmVyc2UsIHNpbmNlIGl0IGJlbG9uZ3MKKyAgICAgIHRoZXJlIGFuZCBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgaW4gYXN0cm9pZC4KKworICAgICogYXN0cm9pZC51dGlscy5Mb2NhbHNWaXNpdG9yIHdhcyBtb3ZlZCB0byBweWxpbnQucHlyZXZlcnNlLkxvY2Fsc1Zpc2l0b3IuCisKKyAgICAqIHB5bGludC5jaGVja2Vycy51dGlscy5leGNlcHRzX2ltcG9ydF9lcnJvciB3YXMgcmVtb3ZlZC4KKyAgICAgIFVzZSBweWxpbnQuY2hla2NlcnMudXRpbHMuZXJyb3Jfb2ZfdHlwZSBpbnN0ZWFkLgorCisgICAgKiBEb24ndCBlbWl0IHVuZGVmaW5lZC1hbGwtdmFyaWFibGVzIGZvciBub2RlcyB3aGljaCBjYW4ndCBiZQorICAgICAgaW5mZXJyZWQgKFlFUyBub2RlcykuCisKKyAgICAqIHlpZWxkLW91dHNpZGUtZnVuYyBpcyBhbHNvIGVtaXR0ZWQgZm9yIGBgeWllbGQgZnJvbWBgLgorCisgICAgKiBBZGQgYSBuZXcgZXJyb3IsICd0b28tbWFueS1zdGFyLWV4cHJlc3Npb25zJywgZW1pdHRlZCB3aGVuCisgICAgICB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdGFycmVkIGV4cHJlc3Npb24gKGAqeGApIGluIGFuIGFzc2lnbm1lbnQuCisgICAgICBUaGUgd2FybmluZyBpcyBlbWl0dGVkIG9ubHkgb24gUHl0aG9uIDMuCisKKyAgICAqIEFkZCBhIG5ldyBlcnJvciwgJ2ludmFsaWQtc3Rhci1hc3NpZ25tZW50LXRhcmdldCcsIGVtaXR0ZWQgd2hlbgorICAgICAgYSBzdGFycmVkIGV4cHJlc3Npb24gKGAqeGApIGlzIHVzZWQgYXMgdGhlIGxocyBzaWRlIG9mIGFuIGFzc2lnbm1lbnQsCisgICAgICBhcyBpbiBgKnggPSBbMSwgMl1gLiBUaGlzIGlzIG5vdCBhIFN5bnRheEVycm9yIG9uIFB5dGhvbiAzIHRob3VnaC4KKworICAgICogRGV0ZWN0IGEgY291cGxlIG9mIG9iamVjdHMgd2hpY2ggY2FuJ3QgYmUgYmFzZSBjbGFzc2VzIChib29sLAorICAgICAgc2xpY2UsIHJhbmdlIGFuZCBtZW1vcnl2aWV3LCB3aGljaCB3ZXJlbid0IGRldGVjdGVkIHVudGlsIG5vdykuCisKKyAgICAqIEFkZCBhIG5ldyBlcnJvciBmb3IgdGhlIFB5dGhvbiAzIHBvcnRpbmcgY2hlY2tlciwgYGBpbXBvcnQtc3Rhci1tb2R1bGUtbGV2ZWxgYCwKKyAgICAgIHdoaWNoIGlzIHVzZWQgd2hlbiBhIHN0YXIgaW1wb3J0IGlzIGRldGVjdGVkIGluIGFub3RoZXIgc2NvcGUgdGhhbiB0aGUKKyAgICAgIG1vZHVsZSBsZXZlbCwgd2hpY2ggaXMgYW4gZXJyb3Igb24gUHl0aG9uIDMuIFVzaW5nIHRoaXMgd2lsbCBlbWl0IGEKKyAgICAgIFN5bnRheFdhcm5pbmcgb24gUHl0aG9uIDIuCisKKyAgICAqIEFkZCBhIG5ldyBlcnJvciwgJ3N0YXItbmVlZHMtYXNzaWdubWVudC10YXJnZXQnLCBlbWl0dGVkIG9uIFB5dGhvbiAzIHdoZW4KKyAgICAgIGEgU3RhcnJlZCBleHByZXNzaW9uIChgKnhgKSBpcyBub3QgdXNlZCBpbiBhbiBhc3NpZ25tZW50IHRhcmdldC4gVGhpcyBpcyBub3QKKyAgICAgIGNhdWdodCB3aGVuIHBhcnNpbmcgdGhlIEFTVCBvbiBQeXRob24gMywgc28gaXQgbmVlZHMgdG8gYmUgYSBzZXBhcmF0ZSBjaGVjay4KKworICAgICogQWRkIGEgbmV3IGVycm9yLCAndW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbicsIGVtaXR0ZWQgd2hlbgorICAgICAgdHdvIGEgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uIGlzIGV4ZWN1dGVkIGJldHdlZW4gdHdvIG9iamVjdHMKKyAgICAgIHdoaWNoIGRvbid0IHN1cHBvcnQgaXQgKGEgbnVtYmVyIHBsdXMgYSBzdHJpbmcgZm9yIGluc3RhbmNlKS4KKyAgICAgIFRoaXMgaXMgY3VycmVudGx5IGRpc2FibGVkLCBzaW5jZSB0aGUgaXQgZXhoaWJpdHMgd2F5IHRvbyBtYW55IGZhbHNlCisgICAgICBwb3NpdGl2ZXMsIGJ1dCBpdCB3aWxsIGJlIHJlZW5hYmxlZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorCisgICAgKiBOZXcgaW1wb3J0ZWQgZmVhdHVyZXMgZnJvbSBhc3Ryb2lkIGludG8gcHlyZXZlcnNlOiBweXJldmVyc2UuaW5zcGVjdG9yLlByb2plY3QsCisgICAgICBweXJldmVyc2UuaW5zcGVjdG9yLnByb2plY3RfZnJvbV9maWxlcyBhbmQgcHlyZXZlcnNlLmluc3BlY3Rvci5pbnRlcmZhY2VzLgorCisgICAgICBUaGVzZSB3ZXJlIG1vdmVkIHNpbmNlIHRoZXkgZGlkbid0IGJlbG9uZyBpbiBhc3Ryb2lkLgorCisgICAgKiBFbmFibGUgbWlzcGxhY2VkLWZ1dHVyZSBmb3IgUHl0aG9uIDMuIENsb3NlcyBpc3N1ZSAjNTgwLgorCisgICAgKiBBZGQgYSBuZXcgZXJyb3IsICdub25sb2NhbC1hbmQtZ2xvYmFsJywgd2hpY2ggaXMgZW1pdHRlZCB3aGVuIGEKKyAgICAgIG5hbWUgaXMgZm91bmQgdG8gYmUgYm90aCBub25sb2NhbCBhbmQgZ2xvYmFsIGluIHRoZSBzYW1lIHNjb3BlLgorICAgICAgQ2xvc2VzIGlzc3VlICM1ODEuCisKKyAgICAqIGlnbm9yZWQtY2xhc3NlcyBvcHRpb24gY2FuIHdvcmsgd2l0aCBxdWFsaWZpZWQgbmFtZXMgKGlnbm9yZWQtY2xhc3Nlcz1vcHRwYXJzZS5WYWx1ZXMpCisgICAgICBDbG9zZXMgaXNzdWUgIzI5Ny4KKworICAgICogaWdub3JlZC1tb2R1bGVzIGNhbiB3b3JrIHdpdGggcXVhbGlmaWVkIG5hbWVzIGFzIHdlbGwgYXMgd2l0aCBVbml4IHBhdHRlcm4KKyAgICAgIG1hdGNoaW5nIGZvciByZWN1cnNpdmUgaWdub3JpbmcuIENsb3NlcyBpc3N1ZXMgIzI0NC4KKworICAgICogSW1wcm92ZSBkZXRlY3Rpb24gb2YgcmVsYXRpdmUgaW1wb3J0cyBpbiBub24tcGFja2FnZXMsIGFzIHdlbGwgYXMgaW1wb3J0aW5nCisgICAgICBtaXNzaW5nIG1vZHVsZXMgd2l0aCBhIHJlbGF0aXZlIGltcG9ydCBmcm9tIGEgcGFja2FnZS4KKworICAgICogRG9uJ3QgZW1pdCBuby1pbml0IGlmIG5vdCBhbGwgdGhlIGJhc2VzIGZyb20gYSBjbGFzcyBhcmUga25vd24uCisgICAgICBDbG9zZXMgaXNzdWUgIzYwNC4KKworICAgICogLS1uby1zcGFjZS1jaGVjayBvcHRpb24gYWNjZXB0cyBgYGVtcHR5LWxpbmVgYCBhcyBhIHBvc3NpYmxlIG9wdGlvbi4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNTQxLgorCisgICAgKiAtLWdlbmVyYXRlLXJjZmlsZSBnZW5lcmF0ZXMgYnkgZGVmYXVsdCBodW1hbiByZWFkYWJsZSBzeW1ib2xzCisgICAgICBmb3IgdGhlIC0tZGlzYWJsZSBvcHRpb24uIENsb3NlcyBpc3N1ZSAjNjA4LgorCisgICAgKiBJbXByb3ZlZCB0aGUgbm90LWluLWxvb3AgY2hlY2tlciB0byBwcm9wZXJseSBkZXRlY3QgbW9yZSBjYXNlcy4KKworICAgICogQWRkIGEgbmV3IGVycm9yLCAnY29udGludWUtaW4tZmluYWxseScsIHdoaWNoIGlzIGVtaXR0ZWQgd2hlbgorICAgICAgdGhlIGBgY29udGludWVgYCBrZXl3b3JkIGlzIGZvdW5kIGluc2lkZSBhIGBgZmluYWxseWBgIGNsYXVzZSwgd2hpY2gKKyAgICAgIGlzIGEgU3ludGF4RXJyb3IuCisKKyAgICAqIFRoZSAtLXpvcGUgZmxhZyBpcyBkZXByZWNhdGVkIGFuZCBpdCBpcyBzbGF0ZWQgZm9yIHJlbW92YWwKKyAgICAgIGluIFB5bGludCAxLjYuCisKKyAgICAgIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgcmVtb3ZhbCBpcyB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzcGVjaWFsaXplZAorICAgICAgZmxhZyBhbmQgdGhlcmUgYXJlIHNvbHV0aW9ucyBmb3IgdGhlIG9yaWdpbmFsIHByb2JsZW06CisgICAgICB1c2UgLS1nZW5lcmF0ZWQtbWVtYmVycyB3aXRoIHRoZSBtZW1iZXJzIHRoYXQgY2F1c2VzIHByb2JsZW1zCisgICAgICB3aGVuIHVzaW5nIFpvcGUgb3IgYWRkIEFTVCB0cmFuc2Zvcm1zIHRhaWxvcmVkIHRvIHRoZSB6b3BlCisgICAgICBwcm9qZWN0LgorCisgICAgICBBdCB0aGUgc2FtZSB0aW1lLCAtLWluY2x1ZGUtaWRzIGFuZCAtLXN5bWJvbHMgd2lsbCBhbHNvIGJlIHJlbW92ZWQKKyAgICAgIGluIFB5bGludCAxLjYuIENsb3NlcyBpc3N1ZSAjNTcwLgorCisgICAgKiBtaXNzaW5nLW1vZHVsZS1hdHRyaWJ1dGUgd2FzIHJlbW92ZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICBDTEkgb3B0aW9uLCByZXF1aXJlZC1hdHRyaWJ1dGVzLCB3aGljaCBpcyBzbGF0ZWQgZm9yIHJlbW92YWwKKyAgICAgIGluIFB5bGludCAxLjYuCisKKyAgICAqIG1pc3NpbmctcmV2ZXJzZWQtYXJndW1lbnQgd2FzIHJlbW92ZWQuCisKKyAgICAgIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgaXMgdGhhdCB0aGlzIGtpbmQgb2YgZXJyb3JzIHNob3VsZCBiZQorICAgICAgZGV0ZWN0ZWQgYnkgdGhlIHR5cGUgY2hlY2tlciBmb3IgKmFsbCogdGhlIGJ1aWx0aW5zIGFuZCBub3QKKyAgICAgIGFzIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgcmV2ZXJzZWQgYnVpbHRpbi4gVGhpcyB3aWxsIGhhcHBlbgorICAgICAgc2hvcnRseSBpbiB0aGUgZnV0dXJlLgorCisgICAgKiAtLWNvbW1lbnQgZmxhZyBpcyBvYnNvbGV0ZSBhbmQgaXQgd2lsbCBiZSByZW1vdmVkIGluIFB5bGludCAxLjYuCisKKyAgICAqIC0tcHJvZmlsZSBmbGFnIGlzIG9ic29sZXRlIGFuZCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gUHlsaW50IDEuNi4KKworICAgICogQWRkIGEgbmV3IGVycm9yLCAnbWlzcGxhY2VkLWJhcmUtcmFpc2UnLgorCisgICAgICBUaGUgZXJyb3IgaXMgdXNlZCB3aGVuIGEgYmFyZSByYWlzZSBpcyBub3QgdXNlZCBpbnNpZGUgYW4gZXhjZXB0IGNsYXVzZS4KKyAgICAgIFRoaXMgY2FuIGdlbmVyYXRlIGEgUnVudGltZUVycm9yIGluIFB5dGhvbiwgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBleGNlcHRpb25zCisgICAgICB0byBiZSByZXJhaXNlZC4gV2hpbGUgaXQgd29ya3MgaW4gUHl0aG9uIDIgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGV4Y2VwdGlvbgorICAgICAgbGVha3Mgb3V0c2lkZSBvZiB0aGUgZXhjZXB0IGJsb2NrLCBpdCdzIG5ldmVydGhlbGVzcyBhIGJlaGF2aW91ciB0aGF0CisgICAgICBhIHVzZXIgc2hvdWxkbid0IGRlcGVuZCB1cG9uLCBzaW5jZSBpdCdzIG5vdCBvYnZpb3VzIHRvIHRoZSByZWFkZXIgb2YgdGhlIGNvZGUKKyAgICAgIHdoYXQgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGFuZCBpdCB3aWxsIG5vdCBiZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDMgYW55aG93LgorICAgICAgQ2xvc2VzIGlzc3VlICM2MzMuCisKKyAgICAqIEJyaW5nIGxvZ2lsYWItY29tbW9uJ3MgdXJlcG9ydHMgaW50byBweWxpbnQucmVwb3J0ZXJzLgorCisgICAgICBXaXRoIHRoaXMgY2hhbmdlLCB3ZSBtb3ZlZCBhd2F5IGZyb20gZGVwZW5kaW5nIG9uIGxvZ2lsYWItY29tbW9uLAorICAgICAgaGF2aW5nIGluIFB5bGludCBhbGwgdGhlIGNvbXBvbmVudHMgdGhhdCB3ZXJlIHVzZWQgZnJvbSBsb2dpbGFiLWNvbW1vbi4KKyAgICAgIFRoZSBBUEkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGFuZCBjYW4gY2hhbmdlIGF0CisgICAgICBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCisgICAgICBDbG9zZXMgaXNzdWUgIzYyMS4KKworICAgICogYGByZWltcG9ydGVkYGAgaXMgZW1pdHRlZCBmb3IgcmVpbXBvcnRlZCBvYmplY3RzIG9uIHRoZSBzYW1lIGxpbmUuCisKKyAgICAgIENsb3NlcyBpc3N1ZSAjNjM5LgorCisgICAgKiBBYmJyZXZpYXRpb25zIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGFueW1vcmUuCisKKyAgICAgIFVzaW5nIGFiYnJldmlhdGlvbnMgZm9yIENMSSBvcHRpb25zIHdhcyBuZXZlciBjb25zaWRlcmVkIHRvIGJlCisgICAgICBhIGZlYXR1cmUgb2YgcHlsaW50LCB0aGlzIGZhY3QgYmVpbmcgb25seSBhIHNpZGUgZWZmZWN0IG9mIHVzaW5nIG9wdHBhcnNlLgorICAgICAgQXMgdGhpcyB3YXMgdGhlIGNhc2UsIHVzaW5nIC0tbG9hZC1wbHVnaW4gb3Igb3RoZXIgYWJicmV2aWF0aW9uCisgICAgICBmb3IgLS1sb2FkLXBsdWdpbnMgbmV2ZXIgYWN0dWFsbHkgd29ya2VkLCB3aGlsZSBpdCBhbHNvIGRpZG4ndCByYWlzZQorICAgICAgYW4gZXJyb3IuIENsb3NlcyBpc3N1ZSAjNDI0LgorCisgICAgKiBBZGQgYSBuZXcgZXJyb3IsICdub25sb2NhbC13aXRob3V0LWJpbmRpbmcnCisKKyAgICAgIFRoZSBlcnJvciBpcyBlbWl0dGVkIG9uIFB5dGhvbiAzIHdoZW4gYSBub25sb2NhbCBuYW1lIGlzIG5vdCBib3VuZAorICAgICAgdG8gYW55IHZhcmlhYmxlIGluIHRoZSBwYXJlbnRzIHNjb3Blcy4gQ2xvc2VzIGlzc3VlICM1ODIuCisKKyAgICAqICdkZXByZWNhdGVkLW1vZHVsZScgY2FuIGJlIHNob3duIGZvciBtb2R1bGVzIHdoaWNoIGFyZW4ndAorICAgICAgIGF2YWlsYWJsZS4gQ2xvc2VzIGlzc3VlICMzNjIuCisKKyAgICAqIERvbid0IGNvbnNpZGVyIGEgY2xhc3MgYWJzdHJhY3QgaWYgaXRzIG1lbWJlcnMgY2FuJ3QKKyAgICAgIGJlIHByb3Blcmx5IGluZmVycmVkLgorCisgICAgICBUaGlzIGZpeGVzIGEgZmFsc2UgcG9zaXRpdmUgcmVsYXRlZCB0byBhYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWQuCisgICAgICBDbG9zZXMgaXNzdWUgIzY0OC4KKworICAgICogQWRkIGEgbmV3IGNoZWNrZXIgZm9yIHRoZSBhc3luYyBmZWF0dXJlcyBhZGRlZCBieSBQRVAgNDkyLgorCisgICAgKiBBZGQgYSBuZXcgZXJyb3IsICd5aWVsZC1pbnNpZGUtYXN5bmMtZnVuY3Rpb24nLCBlbWl0dGVkIG9uCisgICAgICBQeXRob24gMy41IGFuZCB1cHdhcmRzIHdoZW4gdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgZm91bmQgaW5zaWRlCisgICAgICBhIG5ldyBjb3JvdXRpbmUgZnVuY3Rpb24gKFBFUCA0OTIpLgorCisgICAgKiBBZGQgYSBuZXcgZXJyb3IsICdub3QtYXN5bmMtY29udGV4dC1tYW5hZ2VyJywgZW1pdHRlZCB3aGVuCisgICAgICBhbiBhc3luYyBjb250ZXh0IG1hbmFnZXIgYmxvY2sgaXMgdXNlZCB3aXRoIGFuIG9iamVjdCB3aGljaCBkb2Vzbid0CisgICAgICBzdXBwb3J0IHRoaXMgcHJvdG9jb2wgKFBFUCA0OTIpLgorCisgICAgKiBBZGQgYSBuZXcgY29udmVudGlvbiB3YXJuaW5nLCAnc2luZ2xldG9uLWNvbXBhcmlzb24nLCBlbWl0dGVkIHdoZW4KKyAgICAgIGNvbXBhcmlzb24gdG8gVHJ1ZSwgRmFsc2Ugb3IgTm9uZSBpcyBmb3VuZC4KKworICAgICogRG9uJ3QgZW1pdCAnYXNzaWduaW5nLW5vbi1zbG90JyBmb3IgZGVzY3JpcHRvcnMuIENsb3NlcyBpc3N1ZSAjNjUyLgorCisgICAgKiBBZGQgYSBuZXcgZXJyb3IsICdyZXBlYXRlZC1rZXl3b3JkJywgd2hlbiBhIGtleXdvcmQgYXJndW1lbnQgaXMgcGFzc2VkCisgICAgICBtdWx0aXBsZSB0aW1lcyBpbnRvIGEgZnVuY3Rpb24gY2FsbC4KKworICAgICAgVGhpcyBpcyBzaW1pbGFyIHdpdGggcmVkdW5kYW50LWtleXdvcmQtYXJnLCBidXQgaXQncyBtaWxkbHkgZGlmZmVyZW50CisgICAgICB0aGF0IGl0IG5lZWRzIHRvIGJlIGEgc2VwYXJhdGUgZXJyb3IuCisKKyAgICAqIC0tZW5hYmxlPWFsbCBjYW4gbm93IGJlIHVzZWQuIENsb3NlcyBpc3N1ZSAjMTQyLgorCisgICAgKiBBZGQgYSBuZXcgY29udmVudGlvbiBtZXNzYWdlLCAnbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQnLAorICAgICAgZW1pdHRlZCB3aGVuIGEgY29uc3RhbnQgaXMgcGxhY2VkIGluIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhIGNvbXBhcmlzb24sCisgICAgICBhcyBpbiAnNSA9PSBmdW5jKCknLiBUaGlzIGlzIGFsc28gY2FsbGVkIFlvZGEgY29uZGl0aW9uLCBzaW5jZSB0aGUKKyAgICAgIGZsb3cgb2YgY29kZSByZW1pbmRzIG9mIHRoZSBTdGFyIFdhcnMgZ3JlZW4gY2hhcmFjdGVyLCBjb25kaXRpb25zIHVzdWFsbHkKKyAgICAgIGVuY291bnRlcmVkIGluIGxhbmd1YWdlcyB3aXRoIHZhcmlhYmlsZSBhc3NpZ25tZW50cyBpbiBjb25kaXRpb25hbAorICAgICAgc3RhdGVtZW50cy4KKworICAgICogQWRkIGEgbmV3IGNvbnZlbnRpb24gbWVzc2FnZSwgJ2NvbnNpZGVyLXVzaW5nLWVudW1lcmF0ZScsIHdoaWNoIGlzCisgICAgICBlbWl0dGVkIHdoZW4gY29kZSB0aGF0IHVzZXMgYGByYW5nZWBgIGFuZCBgYGxlbmBgIGZvciBpdGVyYXRpbmcgaXMgZW5jb3VudGVyZWQuCisgICAgICBDbG9zZXMgaXNzdWUgIzY4NC4KKworICAgICogQWRkZWQgdHdvIG5ldyByZWZhY3RvcmluZyBtZXNzYWdlcywgJ25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcicgYW5kCisgICAgICAnbm8tc3RhdGljbWV0aG9kLWRlY29yYXRvcicsIHdoaWNoIGFyZSBlbWl0dGVkIHdoZW4gYSBzdGF0aWMgbWV0aG9kIG9yIGEgY2xhc3MKKyAgICAgIG1ldGhvZCBpcyBkZWNsYXJlZCB3aXRob3V0IHVzaW5nIGRlY29yYXRvcnMgc3ludGF4LgorCisgICAgICBDbG9zZXMgaXNzdWUgIzY3NS4KKworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuNC4zPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNS0wMy0xNAorCisKKyAgICAqIFJlbW92ZSB0aHJlZSB3YXJuaW5nczogc3Rhci1hcmdzLCBhYnN0cmFjdC1jbGFzcy1saXR0bGUtdXNlZCwKKyAgICAgIGFic3RyYWN0LWNsYXNzLW5vdC11c2VkLiBUaGVzZSB3YXJuaW5ncyBkb24ndCBhZGQgYW55IHJlYWwgdmFsdWUKKyAgICAgIGFuZCB0aGV5IGRvbid0IGltcGx5IGVycm9ycyBvciBwcm9ibGVtcyBpbiB0aGUgY29kZS4KKworICAgICogQWRkZWQgYSBuZXcgb3B0aW9uIGZvciBjb250cm9sbGluZyB0aGUgcGVlcGhvbGUgb3B0aW1pemVyIGluIGFzdHJvaWQuCisgICAgICBUaGUgb3B0aW9uIGBgLS1vcHRpbWl6ZS1hc3RgYCB3aWxsIGNvbnRyb2wgdGhlIHBlZXBob2xlIG9wdGltaXplciwKKyAgICAgIHdoaWNoIGlzIHVzZWQgdG8gb3B0aW1pemUgYSBjb3VwbGUgb2YgQVNUIHN1YnRyZWVzLiBUaGUgY3VycmVudCBwcm9ibGVtCisgICAgICBzb2x2ZWQgYnkgdGhlIHBlZXBob2xlIG9wdGltaXplciBpcyB3aGVuIG11bHRpcGxlIGpvaW5lZCBzdHJpbmdzLAorICAgICAgd2l0aCB0aGUgYWRkaXRpb24gb3BlcmF0b3IsIGFyZSBlbmNvdW50ZXJlZC4gSWYgdGhlIG51bWJlcnMgb2Ygc3VjaAorICAgICAgc3RyaW5ncyBpcyBoaWdoIGVub3VnaCwgUHlsaW50IHdpbGwgdGhlbiBmYWlsIHdpdGggYSBtYXhpbXVtIHJlY3Vyc2lvbgorICAgICAgZGVwdGggZXhjZWVkZWQgZXJyb3IsIGR1ZSB0byBpdHMgdmlzaXRvciBhcmNoaXRlY3R1cmUuIFRoZSBwZWVwaG9sZQorICAgICAganVzdCB0cmFuc2Zvcm1zIHN1Y2ggY2FsbHMsIGlmIGl0IGNhbiwgaW50byB0aGUgZmluYWwgcmVzdWx0aW5nIHN0cmluZworICAgICAgYW5kIHRoaXMgZXhoaWJpdCBhIHByb2JsZW0sIGJlY2F1c2UgdGhlIHZpc2l0X2Jpbm9wIG1ldGhvZCBzdG9wcyBiZWluZworICAgICAgY2FsbGVkIChpbiB0aGUgb3B0aW1pemVkIEFTVCBpdCB3aWxsIGJlIGEgQ29uc3Qgbm9kZSkuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS40LjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE1LTAzLTExCisKKyAgICAqIERvbid0IHJlcXVpcmUgYSBkb2NzdHJpbmcgZm9yIGVtcHR5IG1vZHVsZXMuIENsb3NlcyBpc3N1ZSAjMjYxLgorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSB3aXRoIGBgdG9vLWZldy1mb3JtYXQtYXJnc2BgIHN0cmluZyB3YXJuaW5nLAorICAgICAgZW1pdHRlZCB3aGVuIHRoZSBzdHJpbmcgZm9ybWF0IGNvbnRhaW5lZCBhIG5vcm1hbCBwb3NpdGlvbmFsCisgICAgICBhcmd1bWVudCAoJ3swfScpLCBtaXhlZCB3aXRoIGEgcG9zaXRpb25hbCBhcmd1bWVudCB3aGljaCBkaWQKKyAgICAgIGFuIGF0dHJpYnV0ZSBhY2Nlc3MgKCd7MC5fX2NsYXNzX199JykuCisgICAgICBDbG9zZXMgaXNzdWUgIzQ2My4KKworICAgICogVGFrZSBpbiBhY2NvdW50IGFsbCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBhbmNlc3RvcnMKKyAgICAgIHdoZW4gY2hlY2tpbmcgZm9yIHRvby1mZXctcHVibGljLW1ldGhvZHMuIENsb3NlcyBpc3N1ZSAjNDcxLgorCisgICAgKiBDYXRjaCBlbmNoYW50IGVycm9ycyBhbmQgZW1pdCAnaW52YWxpZC1jaGFyYWN0ZXJzLWluLWRvY3N0cmluZycKKyAgICAgIHdoZW4gY2hlY2tpbmcgZm9yIHNwZWxsaW5nIGVycm9ycy4gQ2xvc2VzIGlzc3VlICM0NjkuCisKKyAgICAqIFVzZSBhbGwgdGhlIGluZmVycmVkIHN0YXRlbWVudHMgZm9yIHRoZSBzdXBlci1pbml0LW5vdC1jYWxsZWQKKyAgICAgIGNoZWNrLiBDbG9zZXMgaXNzdWUgIzM4OS4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICd1bmljaHItYnVpbHRpbicsIGVtaXR0ZWQgYnkgdGhlIFB5dGhvbiAzCisgICAgICBwb3J0aW5nIGNoZWNrZXIsIHdoZW4gdGhlIHVuaWNociBidWlsdGluIGlzIGZvdW5kLiBDbG9zZXMgaXNzdWUgIzQ3Mi4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICdpbnRlcm4tYnVpbHRpbicsIGVtaXR0ZWQgYnkgdGhlIFB5dGhvbiAzCisgICAgICBwb3J0aW5nIGNoZWNrZXIsIHdoZW4gdGhlIGludGVybiBidWlsdGluIGlzIGZvdW5kLiBDbG9zZXMgaXNzdWUgIzQ3My4KKworICAgICogQWRkIHN1cHBvcnQgZm9yIGVkaXRhYmxlIGluc3RhbGxhdGlvbnMuCisKKyAgICAqIFRoZSBIVE1MIG91dHB1dCBhY2NlcHRzIHRoZSBgYC0tbXNnLXRlbXBsYXRlYGAgb3B0aW9uLiBQYXRjaCBieQorICAgICAgRGFuIEdvbGRzbWl0aC4KKworICAgICogQWRkICdtYXAtYnVpbHRpbi1ub3QtaXRlcmF0aW5nJyAocmVwbGFjaW5nICdpbXBsaWNpdC1tYXAtZXZhbHVhdGlvbicpLAorICAgICAgJ3ppcC1idWlsdGluLW5vdC1pdGVyYXRpbmcnLCAncmFuZ2UtYnVpbHRpbi1ub3QtaXRlcmF0aW5nJywgYW5kCisgICAgICAnZmlsdGVyLWJ1aWx0aW4tbm90LWl0ZXJhdGluZycgd2hpY2ggYXJlIGVtaXR0ZWQgYnkgYGAtLXB5M2tgYCB3aGVuIHRoZQorICAgICAgYXBwcm9wcmlhdGUgYnVpbHQtaW4gaXMgbm90IHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQgKHNlbWFudGljcworICAgICAgdGFrZW4gZnJvbSAydG8zKS4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICd1bmlkaW9tYXRpYy10eXBlY2hlY2snLCBlbWl0dGVkIHdoZW4gYW4gZXhwbGljaXQKKyAgICAgIHR5cGVjaGVjayB1c2VzIHR5cGUoKSBpbnN0ZWFkIG9mIGlzaW5zdGFuY2UoKS4gRm9yIGV4YW1wbGUsCisgICAgICBgdHlwZSh4KSA9PSBZYCBpbnN0ZWFkIG9mIGBpc2luc3RhbmNlKHgsIFkpYC4gUGF0Y2ggYnkgQ2hyaXMgUmViZXJ0LgorICAgICAgQ2xvc2VzIGlzc3VlICMyOTkuCisKKyAgICAqIEFkZCBzdXBwb3J0IGZvciBjb21iaW5pbmcgdGhlIFB5dGhvbiAzIGNoZWNrZXIgbW9kZSB3aXRoIHRoZSAtLWpvYnMKKyAgICAgIGZsYWcgKC0tcHkzayBhbmQgLS1qb2JzKS4gQ2xvc2VzIGlzc3VlICM0NjcuCisKKyAgICAqIEFkZCBhIG5ldyB3YXJuaW5nIGZvciB0aGUgUHl0aG9uIDMgcG9ydGluZyBjaGVja2VyLCAndXNpbmctY21wLWFyZ3VtZW50JywKKyAgICAgIGVtaXR0ZWQgd2hlbiB0aGUgYGBjbXBgYCBhcmd1bWVudCBmb3IgdGhlIGBgbGlzdC5zb3J0YGAgb3IgYGBzb3J0ZWQgYnVpbHRpbmBgCisgICAgICBpcyBlbmNvdW50ZXJlZC4KKworICAgICogTWFrZSB0aGUgLS1weTNrIGZsYWcgY29tbXV0YXRpdmUgd2l0aCB0aGUgLUUgZmxhZy4gQWxzbywgdGhpcyBwYXRjaAorICAgICAgZml4ZXMgdGhlIGxlYWtzIG9mIGVycm9yIG1lc3NhZ2VzIGZyb20gdGhlIFB5dGhvbiAzIGNoZWNrZXIgd2hlbgorICAgICAgdGhlIGVycm9ycyBtb2RlIHdhcyBhY3RpdmF0ZWQuIENsb3NlcyBpc3N1ZSAjNDM3LgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuNC4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNS0wMS0xNgorCisgICAgKiBMb29rIG9ubHkgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24ncyBzY29wZSBmb3IgYmFkLXN1cGVyLWNhbGwuCisgICAgICBDbG9zZXMgaXNzdWUgIzQwMy4KKworICAgICogQ2hlY2sgdGhlIHJldHVybiBvZiBwcm9wZXJ0aWVzIHdoZW4gY2hlY2tpbmcgZm9yIG5vdC1jYWxsYWJsZS4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNDA2LgorCisgICAgKiBXYXJuIGFib3V0IHVzaW5nIHRoZSBpbnB1dCgpIG9yIHJvdW5kKCkgYnVpbHQtaW5zIGZvciBQeXRob24gMy4KKyAgICAgIENsb3NlcyBpc3N1ZSAjNDExLgorCisgICAgKiBQcm9wZXIgYWJzdHJhY3QgbWV0aG9kIGxvb2t1cCB3aGlsZSBjaGVja2luZyBmb3IKKyAgICAgIGFic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZC4gQ2xvc2VzIGlzc3VlICM0MDEuCisKKyAgICAqIFVzZSBhIG1ybyB0cmF2ZXJzYWwgZm9yIGZpbmRpbmcgYWJzdHJhY3QgbWV0aG9kcy4gQ2xvc2VzIGlzc3VlICM0MTUuCisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIHdpdGggY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbiBhbmQgdHVwbGVzIG9mCisgICAgICBleGNlcHRpb25zLgorCisgICAgKiBGaXggYSBmYWxzZSBuZWdhdGl2ZSB3aXRoIHJhaXNpbmctbm9uLWV4Y2VwdGlvbiwgd2hlbiB0aGUgcmFpc2UgdXNlZAorICAgICAgYW4gdW5pbmZlcnJhYmxlIGV4Y2VwdGlvbiBjb250ZXh0LgorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSBvbiBQeXRob24gMiBmb3IgcmFpc2luZy1iYWQtdHlwZSwgd2hlbgorICAgICAgcmFpc2luZyB0dXBsZXMgaW4gdGhlIGZvcm0gJ3JhaXNlIChaZXJvRGl2aXNpb25FcnJvciwgTm9uZSknLgorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSB3aXRoIGludmFsaWQtc2xvdHMtb2JqZWN0cywgd2hlcmUgdGhlIHNsb3QgZW50cnkKKyAgICAgIHdhcyBhIHVuaWNvZGUgc3RyaW5nIG9uIFB5dGhvbiAyLiBDbG9zZXMgaXNzdWUgIzQyMS4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICdyZWR1bmRhbnQtdW5pdHRlc3QtYXNzZXJ0JywgZW1pdHRlZCB3aGVuIHVzaW5nCisgICAgICB1bml0dGVzdCdzIG1ldGhvZHMgYXNzZXJ0VHJ1ZSBhbmQgYXNzZXJ0RmFsc2Ugd2l0aCBjb25zdGFudCB2YWx1ZQorICAgICAgYXMgYXJndW1lbnQuIFBhdGNoIGJ5IFZsYWQgVGVtaWFuLgorCisgICAgKiBBZGQgYSBuZXcgSlNPTiByZXBvcnRlciwgdXNhYmxlIHRocm91Z2ggLWYgZmxhZy4KKworICAgICogQWRkIHRoZSBtZXRob2QgbmFtZXMgZm9yIHRoZSAnc2lnbmF0dXJlLWRpZmZlcnMnIGFuZCAnYXJndW1lbnQtZGlmZmVycycKKyAgICAgIHdhcm5pbmdzLiBDbG9zZXMgaXNzdWUgIzQzMy4KKworICAgICogRG9uJ3QgY29tcGlsZSB0ZXN0IGZpbGVzIHdoZW4gaW5zdGFsbGluZy4KKworICAgICogRml4IGEgY3Jhc2ggd2hpY2ggb2NjdXJyZWQgd2hlbiB1c2luZyBtdWx0aXBsZSBqb2JzIGFuZCB0aGUgZmlsZXMKKyAgICAgIGdpdmVuIGFzIGFyZ3VtZW50IGRpZG4ndCBleGlzdCBhdCBhbGwuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS40LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNC0xMS0yMworCisKKyAgICAqIEFkZGVkIG5ldyBvcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgbG9hZGluZyBvZiBDIGV4dGVuc2lvbnMuCisgICAgICBCeSBkZWZhdWx0LCBvbmx5IEMgZXh0ZW5zaW9ucyBmcm9tIHRoZSBzdGRsaWIgd2lsbCBiZSBsb2FkZWQKKyAgICAgIGludG8gdGhlIGFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIgZm9yIGluc3BlY3Rpb24sIGJlY2F1c2UgdGhleQorICAgICAgY2FuIHJ1biBhcmJpdHJhcnkgY29kZSBvbiBpbXBvcnQuIFRoZSBvcHRpb24KKyAgICAgIGBgLS1leHRlbnNpb24tcGtnLXdoaXRlbGlzdGBgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgbW9kdWxlcworICAgICAgb3IgcGFja2FnZXMgdGhhdCBhcmUgc2FmZSB0byBsb2FkLgorCisgICAgKiBDaGFuZ2UgZGVmYXVsdCBtYXgtbGluZS1sZW5ndGggdG8gMTAwIHJhdGhlciB0aGFuIDgwCisKKyAgICAqIERyb3AgQmFzZVJhd0NoZWNrZXIgY2xhc3Mgd2hpY2ggd2VyZSBvbmx5IHRoZXJlIGZvciBiYWNrd2FyZAorICAgICAgY29tcGF0IGZvciBhIHdoaWxlIG5vdworCisgICAgKiBEb24ndCB0cnkgdG8gYW5hbHl6ZSBzdHJpbmcgZm9ybWF0dGluZyB3aXRoIG9iamVjdHMgY29taW5nIGZyb20KKyAgICAgIGZ1bmN0aW9uIGFyZ3VtZW50cy4gQ2xvc2VzIGlzc3VlICMzNzMuCisKKyAgICAqIFBvcnQgc291cmNlIGNvZGUgdG8gYmUgUHl0aG9uIDIvMyBjb21wYXRpYmxlLiBUaGlzIGRyb3BzIHRoZQorICAgICAgbmVlZCBmb3IgMnRvMywgYnV0IGRvZXMgZHJvcCBzdXBwb3J0IGZvciBQeXRob24gMi41LgorCisgICAgKiBFYWNoIG1lc3NhZ2Ugbm93IGNvbWVzIHdpdGggYSBjb25maWRlbmNlIGxldmVsIGF0dGFjaGVkLCBhbmQKKyAgICAgIGNhbiBiZSBmaWx0ZXJlZCBiYXNlIG9uIHRoaXMgbGV2ZWwuIFRoaXMgYWxsb3dzIHRvIGZpbHRlciBvdXQKKyAgICAgIGFsbCBtZXNzYWdlcyB0aGF0IHdlcmUgZW1pdHRlZCBldmVuIHRob3VnaCBhbiBpbmZlcmVuY2UgZmFpbHVyZQorICAgICAgaGFwcGVuZWQgZHVyaW5nIGNoZWNraW5nLgorCisgICAgKiBJbXByb3ZlZCBwcmVzZW50aW5nIHVudXNlZC1pbXBvcnQgbWVzc2FnZS4gQ2xvc2VzIGlzc3VlICMyOTMuCisKKyAgICAqIEFkZCBuZXcgY2hlY2tlciBmb3IgZmluZGluZyBzcGVsbGluZyBlcnJvcnMuIE5ldyBtZXNzYWdlczoKKyAgICAgIHdyb25nLXNwZWxsaW5nLWluLWNvbW1lbnQsIHdyb25nLXNwZWxsaW5nLWluLWRvY3N0cmluZy4KKyAgICAgIE5ldyBvcHRpb25zOiBzcGVsbGluZy1kaWN0LCBzcGVsbGluZy1pZ25vcmUtd29yZHMuCisKKyAgICAqIEFkZCBuZXcgJy1qJyBvcHRpb24gZm9yIHJ1bm5pbmcgY2hlY2tzIGluIHN1Yi1wcm9jZXNzZXMuCisKKyAgICAqIEFkZGVkIG5ldyBjaGVja3MgZm9yIGxpbmUgZW5kaW5ncyBpZiB0aGV5IGFyZSBtaXhlZCAoTEYgdnMgQ1JMRikKKyAgICAgIG9yIGlmIHRoZXkgYXJlIG5vdCBhcyBleHBlY3RlZC4gTmV3IG1lc3NhZ2VzOiBtaXhlZC1saW5lLWVuZGluZ3MsCisgICAgICB1bmV4cGVjdGVkLWxpbmUtZW5kaW5nLWZvcm1hdC4gTmV3IG9wdGlvbjogZXhwZWN0ZWQtbGluZS1lbmRpbmctZm9ybWF0LgorCisgICAgKiAnZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWUnIG5vIGxvbmdlciBldmFsdWF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudHMsCisgICAgICB3aGljaCBjb3VsZCByZXN1bHQgaW4gbG9uZyBlcnJvciBtZXNzYWdlcyBvciBzZW5zaXRpdmUgZGF0YSBiZWluZyBsZWFrZWQuCisgICAgICBDbG9zZXMgaXNzdWUgIzI4MgorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSB3aXRoIHN0cmluZyBmb3JtYXR0aW5nIGNoZWNrZXIsIHdoZW4KKyAgICAgIGVuY291bnRlcmluZyBhIHN0cmluZyB3aGljaCB1c2VzIG9ubHkgcG9zaXRpb24tYmFzZWQgYXJndW1lbnRzLgorICAgICAgQ2xvc2VzIGlzc3VlICMyODUuCisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIHdpdGggc3RyaW5nIGZvcm1hdHRpbmcgY2hlY2tlciwgd2hlbiB1c2luZworICAgICAga2V5d29yZCBhcmd1bWVudCBwYWNraW5nLiBDbG9zZXMgaXNzdWUgIzI4OC4KKworICAgICogUHJvcGVyIGhhbmRsZSBjbGFzcyBsZXZlbCBzY29wZSBmb3IgbGFtYmRhcy4KKworICAgICogSGFuZGxlICd0b28tZmV3LWZvcm1hdC1hcmdzJyBvciAndG9vLW1hbnktZm9ybWF0LWFyZ3MnIGZvciBmb3JtYXQKKyAgICAgIHN0cmluZ3Mgd2l0aCBib3RoIG5hbWVkIGFuZCBwb3NpdGlvbmFsIGZpZWxkcy4gQ2xvc2VzIGlzc3VlICMyODYuCisKKyAgICAqIEFuYWx5emUgb25seSBzdHJpbmdzIGJ5IHRoZSBzdHJpbmcgZm9ybWF0IGNoZWNrZXIuIENsb3NlcyBpc3N1ZSAjMjg3LgorCisgICAgKiBQcm9wZXJseSBoYW5kbGUgbmVzdGVkIGZvcm1hdCBzdHJpbmcgZmllbGRzLiBDbG9zZXMgaXNzdWUgIzI5NC4KKworICAgICogRG9uJ3QgZW1pdCAnYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0JyBpZiB0aGUgYXR0cmlidXRlCisgICAgICB3YXMgc2V0IGJ5IGEgZnVuY3Rpb24gY2FsbCBpbiBhIGRlZmluaW5nIG1ldGhvZC4gQ2xvc2VzIGlzc3VlICMxOTIuCisKKyAgICAqIFByb3Blcmx5IGhhbmRsZSB1bmljb2RlIGZvcm1hdCBzdHJpbmdzIGZvciBQeXRob24gMi4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMjk2LgorCisgICAgKiBEb24ndCBlbWl0ICdpbXBvcnQtZXJyb3InIGlmIGFuIGltcG9ydCB3YXMgcHJvdGVjdGVkIGJ5IGEgdHJ5LWV4Y2VwdCwKKyAgICAgIHdoaWNoIGV4Y2VwdGVkIEltcG9ydEVycm9yLgorCisgICAgKiBGaXggYW4gJ3VudXNlZC1pbXBvcnQnIGZhbHNlIHBvc2l0aXZlLCB3aGVuIHRoZSBlcnJvciB3YXMgZW1pdHRlZAorICAgICAgZm9yIGFsbCB0aGUgbWVtYmVycyBpbXBvcnRlZCB3aXRoICdmcm9tIGltcG9ydCcgZm9ybS4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMzA0LgorCisgICAgKiBEb24ndCBlbWl0ICdpbnZhbGlkLW5hbWUnIHdoZW4gYXNzaWduaW5nIGEgbmFtZSBpbiBhbgorICAgICAgSW1wb3J0RXJyb3IgaGFuZGxlci4gQ2xvc2VzIGlzc3VlICMzMDIuCisKKyAgICAqIERvbid0IGNvdW50IGJyYW5jaGVzIGZyb20gbmVzdGVkIGZ1bmN0aW9ucy4KKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgd2l0aCAndG9vLWZldy1mb3JtYXQtYXJncycsIHdoZW4gdGhlIGZvcm1hdAorICAgICAgc3RyaW5ncyBjb250YWlucyBkdXBsaWNhdGUgbWFudWFsIHBvc2l0aW9uIGFyZ3VtZW50cy4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMzEwLgorCisgICAgKiBmaXhtZSByZWdleCBoYW5kbGVzIGNvbW1lbnRzIHdpdGhvdXQgc3BhY2VzIGFmdGVyIHRoZSBoYXNoLgorICAgICAgQ2xvc2VzIGlzc3VlICMzMTEuCisKKyAgICAqIERvbid0IGVtaXQgJ3VudXNlZC1pbXBvcnQnIHdoZW4gYSBzcGVjaWFsIG9iamVjdCBpcyBpbXBvcnRlZAorICAgICAgKF9fYWxsX18sIF9fZG9jX18gZXRjLikuIENsb3NlcyBpc3N1ZSAjMzA5LgorCisgICAgKiBMb29rIGluIHRoZSBtZXRhY2xhc3MsIGlmIGRlZmluZWQsIGZvciBtZW1iZXJzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudAorICAgICAgY2xhc3MuIENsb3NlcyBpc3N1ZSAjMzA2LgorCisgICAgKiBEb24ndCBlbWl0ICdwcm90ZWN0ZWQtYWNjZXNzJyBpZiB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHVzaW5nCisgICAgICBhIHByb3BlcnR5IGRlZmluZWQgYXQgdGhlIGNsYXNzIGxldmVsLgorCisgICAgKiBEZXRlY3QgY2FsbHMgb2YgdGhlIHBhcmVudCdzIF9faW5pdF9fLCB0aHJvdWdoIGEgYmluZGVkIHN1cGVyKCkgY2FsbC4KKworICAgICogQ2hlY2sgdGhhdCBhIGNsYXNzIGhhcyBhbiBleHBsaWNpdGx5IGRlZmluZWQgbWV0YWNsYXNzIGJlZm9yZQorICAgICAgZW1pdHRpbmcgJ29sZC1zdHlsZS1jbGFzcycgZm9yIFB5dGhvbiAyLgorCisgICAgKiBFbWl0ICdjYXRjaGluZy1ub24tZXhjZXB0aW9uJyBmb3Igbm9uLWNsYXNzIG5vZGVzLiBDbG9zZXMgaXNzdWUgIzMwMy4KKworICAgICogT3JkZXIgb2YgcmVwb3J0aW5nIGlzIGNvbnNpc3RlbnQuCisKKyAgICAqIEFkZCBhIG5ldyB3YXJuaW5nLCAnYm9vbGVhbi1kYXRldGltZScsIGVtaXR0ZWQgd2hlbiBhbiBpbnN0YW5jZQorICAgICAgb2YgJ2RhdGV0aW1lLnRpbWUnIGlzIHVzZWQgaW4gYSBib29sZWFuIGNvbnRleHQuIENsb3NlcyBpc3N1ZSAjMjM5LgorCisgICAgKiBGaXggYSBjcmFzaCB3aGljaCBvY2N1cnJlZCB3aGlsZSBjaGVja2luZyBmb3IgJ21ldGhvZC1oaWRkZW4nLAorICAgICAgd2hlbiB0aGUgcGFyZW50IGZyYW1lIHdhcyBzb21ldGhpbmcgZGlmZmVyZW50IHRoYW4gYSBmdW5jdGlvbi4KKworICAgICogR2VuZXJhdGUgaHRtbCBvdXRwdXQgZm9yIG1pc3NpbmcgZmlsZXMuIENsb3NlcyBpc3N1ZSAjMzIwLgorCisgICAgKiBGaXggYSBmYWxzZSBwb3NpdGl2ZSB3aXRoICd0b28tbWFueS1mb3JtYXQtYXJncycsIHdoZW4gdGhlIGZvcm1hdAorICAgICAgc3RyaW5nIGNvbnRhaW5zIG1peGVkIGF0dHJpYnV0ZSBhY2Nlc3MgYXJndW1lbnRzIGFuZCBtYW51YWwKKyAgICAgIGZpZWxkcy4gQ2xvc2VzIGlzc3VlICMzMjIuCisKKyAgICAqIEV4dGVuZCB0aGUgY2FzZXMgd2hlcmUgJ3VuZGVmaW5lZC12YXJpYWJsZScgYW5kICd1c2VkLWJlZm9yZS1hc3NpZ25tZW50JworICAgICAgY2FuIGJlIGRldGVjdGVkLiBDbG9zZXMgaXNzdWUgIzI5MS4KKworICAgICogQWRkIHN1cHBvcnQgZm9yIGN1c3RvbWlzaW5nIGNhbGxiYWNrIGlkZW50aWZpZXJzLCBieSBhZGRpbmcgYSBuZXcKKyAgICAgICctLWNhbGxiYWNrcycgY29tbWFuZCBsaW5lIG9wdGlvbi4gQ2xvc2VzIGlzc3VlICMzMjYuCisKKyAgICAqIEFkZCBhIG5ldyB3YXJuaW5nLCAnbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbicsIGVtaXR0ZWQgd2hlbiAuZm9ybWF0KCkKKyAgICAgIHN0cmluZyBpbnRlcnBvbGF0aW9uIGlzIHVzZWQgd2l0aGluIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMuCisKKyAgICAqIERvbid0IGVtaXQgJ3VuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nJyB3aGVuIHRoZSByaHMgb2YgdGhlIGFzc2lnbm1lbnQKKyAgICAgIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50LiBDbG9zZXMgaXNzdWUgIzMyOS4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcsICdpbmhlcml0LW5vbi1jbGFzcycsIGVtaXR0ZWQgd2hlbiBhIGNsYXNzIGluaGVyaXRzCisgICAgICBmcm9tIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYSBjbGFzcy4gQ2xvc2VzIGlzc3VlICMzMzEuCisKKyAgICAqIEZpeCBhbm90aGVyIGZhbHNlIHBvc2l0aXZlcyB3aXRoICd1bmRlZmluZWQtdmFyaWFibGUnLCB3aGVyZSB0aGUgdmFyaWFibGUKKyAgICAgIGNhbiBiZSBmb3VuZCBhcyBhIGNsYXNzIGFzc2lnbm1lbnQgYW5kIHVzZWQgaW4gYSBmdW5jdGlvbiBhbm5vdGF0aW9uLgorICAgICAgQ2xvc2VzIGlzc3VlICMzNDIuCisKKyAgICAqIEhhbmRsZSBhc3NpZ25tZW50IG9mIHRoZSBzdHJpbmcgZm9ybWF0IG1ldGhvZCB0byBhIHZhcmlhYmxlLgorICAgICAgQ2xvc2VzIGlzc3VlICMzNTEuCisKKyAgICAqIFN1cHBvcnQgd2hlZWwgcGFja2FnaW5nIGZvcm1hdCBmb3IgUHlQaS4gQ2xvc2VzIGlzc3VlICMzMzQuCisKKyAgICAqIENoZWNrIHRoYXQgdmFyaW91cyBidWlsdC1pbnMgdGhhdCBkbyBub3QgZXhpc3QgaW4gUHl0aG9uIDMgYXJlIG5vdAorICAgICAgdXNlZDogYXBwbHksIGJhc2VzdHJpbmcsIGJ1ZmZlciwgY21wLCBjb2VyY2UsIGV4ZWNmaWxlLCBmaWxlLCBsb25nCisgICAgICByYXdfaW5wdXQsIHJlZHVjZSwgU3RhbmRhcmRFcnJvciwgdW5pY29kZSwgcmVsb2FkIGFuZCB4cmFuZ2UuCisKKyAgICAqIFdhcm4gZm9yIG1hZ2ljIG1ldGhvZHMgd2hpY2ggYXJlIG5vdCB1c2VkIGluIGFueSB3YXkgaW4gUHl0aG9uIDM6CisgICAgICBfX2NvZXJjZV9fLCBfX2RlbHNsaWNlX18sIF9fZ2V0c2xpY2VfXywgX19zZXRzbGljZV9fLCBfX2NtcF9fLAorICAgICAgX19vY3RfXywgX19ub256ZXJvX18gYW5kIF9faGV4X18uCisKKyAgICAqIERvbid0IGVtaXQgJ2Fzc2lnbmluZy1ub24tc2xvdCcgd2hlbiB0aGUgYXNzaWdubWVudCBpcyBmb3IgYSBwcm9wZXJ0eS4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMzU5LgorCisgICAgKiBGaXggZm9yIHJlZ3Jlc3Npb246ICd7cGF0aH0nIHdhcyBubyBsb25nZXIgYWNjZXB0ZWQgaW4gJy0tbXNnLXRlbXBsYXRlJy4KKworICAgICogUmVwb3J0IHRoZSBwZXJjZW50YWdlIG9mIGFsbCBtZXNzYWdlcywgbm90IGp1c3QgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MuCisgICAgICBDbG9zZXMgaXNzdWUgIzMxOS4KKworICAgICogJ3Rvby1tYW55LXB1YmxpYy1tZXRob2RzJyBpcyByZXBvcnRlZCBvbmx5IGZvciBtZXRob2RzIGRlZmluZWQgaW4gYSBjbGFzcywKKyAgICAgIG5vdCBpbiBpdHMgYW5jZXN0b3JzLiBDbG9zZXMgaXNzdWUgIzI0OC4KKworICAgICogJ3Rvby1tYW55LWxpbmVzJyBkaXNhYmxlIHByYWdtYSBjYW4gYmUgbG9jYXRlZCBvbiBhbnkgbGluZSwgbm90IG9ubHkgdGhlCisgICAgICBmaXJzdC4gQ2xvc2VzIGlzc3VlICMzMjEuCisKKyAgICAqIFdhcm4gaW4gUHl0aG9uIDIgd2hlbiBhbiBpbXBvcnQgc3RhdGVtZW50IGlzIGZvdW5kIHdpdGhvdXQgYQorICAgICAgY29ycmVzcG9uZGluZyBgYGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0YGAuCisKKyAgICAqIFdhcm4gaW4gUHl0aG9uIDIgd2hlbiBhIG5vbi1mbG9vciBkaXZpc2lvbiBvcGVyYXRpb24gaXMgZm91bmQgd2l0aG91dAorICAgICAgYSBjb3JyZXNwb25kaW5nIGBgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbmBgLgorCisgICAgKiBBZGQgYSBuZXcgb3B0aW9uLCAnZXhjbHVkZS1wcm90ZWN0ZWQnLCBmb3IgZXhjbHVkaW5nIG1lbWJlcnMKKyAgICAgIGZyb20gdGhlIHByb3RlY3RlZC1hY2Nlc3Mgd2FybmluZy4gQ2xvc2VzIGlzc3VlICM0OC4KKworICAgICogV2FybiBpbiBQeXRob24gMiB3aGVuIHVzaW5nIGRpY3QuaXRlciooKSwgZGljdC52aWV3KigpOyBub25lIG9mIHRoZXNlCisgICAgICBtZXRob2RzIGFyZSBhdmFpbGFibGUgaW4gUHl0aG9uIDMuCisKKyAgICAqIFdhcm4gaW4gUHl0aG9uIDIgd2hlbiBjYWxsaW5nIGFuIG9iamVjdCdzIG5leHQoKSBtZXRob2Q7IFB5dGhvbiAzIHVzZXMKKyAgICAgIF9fbmV4dF9fKCkgaW5zdGVhZC4KKworICAgICogV2FybiB3aGVuIGFzc2lnbmluZyB0byBfX21ldGFjbGFzc19fIGF0IGEgY2xhc3Mgc2NvcGU7IGluIFB5dGhvbiAzIGEKKyAgICAgIG1ldGFjbGFzcyBpcyBzcGVjaWZpZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlICdjbGFzcycgc3RhdGVtZW50LgorCisgICAgKiBXYXJuIHdoZW4gcGVyZm9ybWluZyBwYXJhbWV0ZXIgdHVwbGUgdW5wYWNraW5nOyBpdCBpcyBub3Qgc3VwcG9ydGVkIGluCisgICAgICBQeXRob24gMy4KKworICAgICogJ2Fic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZCcgaXMgYWxzbyBlbWl0dGVkIGZvciBQeXRob24gMi4KKyAgICAgIEl0IHdhcyBwcmV2aW91c2x5IGRpc2FibGVkLgorCisgICAgKiBBZGQgJ2xvbmctc3VmZml4JyBlcnJvciwgZW1pdHRlZCB3aGVuIGVuY291bnRlcmluZyB0aGUgbG9uZyBzdWZmaXgKKyAgICAgIG9uIG51bWJlcnMuCisKKyAgICAqIEFkZCBzdXBwb3J0IGZvciBkaXNhYmxpbmcgYSBjaGVja2VyLCBieSBzcGVjaWZ5aW5nIGFuICdlbmFibGVkJworICAgICAgYXR0cmlidXRlIG9uIHRoZSBjaGVja2VyIGNsYXNzLgorCisgICAgKiBBZGQgYSBuZXcgQ0xJIG9wdGlvbiwgLS1weTNrLCBmb3IgZW5hYmxpbmcgUHl0aG9uIDMgcG9ydGluZyBtb2RlLiBUaGlzCisgICAgICBtb2RlIHdpbGwgZGlzYWJsZSBhbGwgb3RoZXIgY2hlY2tlcnMgYW5kIHdpbGwgZW1pdCB3YXJuaW5ncyBhbmQKKyAgICAgIGVycm9ycyBmb3IgY29uc3RydWN0cyB3aGljaCBhcmUgaW52YWxpZCBvciByZW1vdmVkIGluIFB5dGhvbiAzLgorCisgICAgKiBBZGQgJ29sZC1vY3RhbC1saXRlcmFsJyB0byBQeXRob24gMyBwb3J0aW5nIGNoZWNrZXIsIGVtaXR0ZWQgd2hlbgorICAgICAgZW5jb3VudGVyaW5nIG9jdGFscyB3aXRoIHRoZSBvbGQgc3ludGF4LgorCisgICAgKiBBZGQgJ2ltcGxpY2l0LW1hcC1ldmFsdWF0aW9uJyB0byBQeXRob24gMyBwb3J0aW5nIGNoZWNrZXIsIGVtaXR0ZWQKKyAgICAgIHdoZW4gZW5jb3VudGVyaW5nIHRoZSB1c2Ugb2YgbWFwIGJ1aWx0aW4sIHdpdGhvdXQgZXhwbGljaXQgZXZhbHVhdGlvbi4KKworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuMy4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNC0wNy0yNgorCisgICAgKiBBbGxvdyBoYW5naW5nIGNvbnRpbnVlZCBpbmRlbnRhdGlvbiBmb3IgaW1wbGljaXRseSBjb25jYXRlbmF0ZWQKKyAgICAgIHN0cmluZ3MuIENsb3NlcyBpc3N1ZSAjMjMyLgorCisgICAgKiBQeWxpbnQgd29ya3MgdW5kZXIgUHl0aG9uIDIuNSBhZ2FpbiwgYW5kIGl0cyB0ZXN0IHN1aXRlIHBhc3Nlcy4KKworICAgICogRml4IHNvbWUgZmFsc2UgcG9zaXRpdmVzIGZvciB0aGUgY2VsbHZhci1mcm9tLWxvb3Agd2FybmluZ3MuCisgICAgICBDbG9zZXMgaXNzdWUgIzIzMy4KKworICAgICogUmV0dXJuIG5ldyBhc3Ryb2lkIGNsYXNzIG5vZGVzIHdoZW4gdGhlIGluZmVyZW5jZXIgY2FuIGRldGVjdCB0aGF0CisgICAgICB0aGF0IHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGludm9jYXRpb24gb24gYSB0eXBlIChsaWtlIGBgdHlwZWBgIG9yCisgICAgICBgYWJjLkFCQ01ldGFgKSBpcyByZXF1ZXN0ZWQuIENsb3NlcyAjMjA1LgorCisgICAgKiBFbWl0ICd1bmRlZmluZWQtdmFyaWFibGUnIGZvciB1bmRlZmluZWQgbmFtZXMgd2hlbiB1c2luZyB0aGUKKyAgICAgIFB5dGhvbiAzIGBgbWV0YWNsYXNzPWBgIGFyZ3VtZW50LgorCisgICAgKiBDaGVja2VycyByZXNwZWN0IHByaW9yaXR5IG5vdy4gQ2xvc2UgaXNzdWUgIzIyOS4KKworICAgICogRml4IGEgZmFsc2UgcG9zaXRpdmUgcmVnYXJkaW5nIFcwNTExLiBDbG9zZXMgaXNzdWUgIzE0OS4KKworICAgICogRml4IHVudXNlZC1pbXBvcnQgZmFsc2UgcG9zaXRpdmUgd2l0aCBQeXRob24gMyBtZXRhY2xhc3NlcyAoIzE0MykuCisKKyAgICAqIERvbid0IHdhcm4gd2l0aCAnYmFkLWZvcm1hdC1jaGFyYWN0ZXInIHdoZW4gZW5jb3VudGVyaW5nCisgICAgICB0aGUgJ2EnIGZvcm1hdCBvbiBQeXRob24gMy4KKworICAgICogQWRkIG11bHRpcGxlIGNoZWNrcyBmb3IgUEVQIDMxMDEgYWR2YW5jZWQgc3RyaW5nIGZvcm1hdHRpbmc6CisgICAgICAnYmFkLWZvcm1hdC1zdHJpbmcnLCAnbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5JywKKyAgICAgICd1bnVzZWQtZm9ybWF0LXN0cmluZy1hcmd1bWVudCcsICdmb3JtYXQtY29tYmluZWQtc3BlY2lmaWNhdGlvbicsCisgICAgICAnbWlzc2luZy1mb3JtYXQtYXR0cmlidXRlJyBhbmQgJ2ludmFsaWQtZm9ybWF0LWluZGV4Jy4KKworICAgICogSXNzdWUgYnJvYWQtZXhjZXB0IGFuZCBiYXJlLWV4Y2VwdCBldmVuIGlmIHRoZSBudW1iZXIKKyAgICAgIG9mIGV4Y2VwdCBoYW5kbGVycyBpcyBkaWZmZXJlbnQgdGhhbiAxLiBGaXhlcyBpc3N1ZSAjMTEzLgorCisgICAgKiBJc3N1ZSBhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQgZm9yIGFsbCBjYXNlcywgbm90IGp1c3QKKyAgICAgIGZvciB0aGUgbGFzdCBhc3NpZ25tZW50LiBDbG9zZXMgaXNzdWUgIzI2Mi4KKworICAgICogRW1pdCAnbm90LWNhbGxhYmxlJyB3aGVuIGNhbGxpbmcgcHJvcGVydGllcy4gQ2xvc2VzIGlzc3VlICMyNjguCisKKyAgICAqIEZpeCBhIGZhbHNlIHBvc2l0aXZlIHdpdGggdW5iYWxhbmNlZCBpdGVyYWJsZSB1bnBhY2tpbmcsCisgICAgICB3aGVuIGVuY291bnRlcmluZyBzdGFycmVkIG5vZGVzLiBDbG9zZXMgaXNzdWUgIzI3My4KKworICAgICogQWRkIG5ldyBjaGVja3MsICdpbnZhbGlkLXNsaWNlLWluZGV4JyBhbmQgJ2ludmFsaWQtc2VxdWVuY2UtaW5kZXgnCisgICAgICBmb3IgaW52YWxpZCBzZXF1ZW5jZSBhbmQgc2xpY2UgaW5kaWNlcy4KKworICAgICogQWRkICdhc3NpZ25pbmctbm9uLXNsb3QnIHdhcm5pbmcsIHdoaWNoIGRldGVjdHMgYXNzaWdubWVudHMgdG8KKyAgICAgIGF0dHJpYnV0ZXMgbm90IGRlZmluZWQgaW4gc2xvdHMuCisKKyAgICAqIERvbid0IGVtaXQgJ25vLW5hbWUtaW4tbW9kdWxlJyBmb3IgaWdub3JlZCBtb2R1bGVzLgorICAgICAgQ2xvc2VzIGlzc3VlICMyMjMuCisKKyAgICAqIEZpeCBhbiAndW51c2VkLXZhcmlhYmxlJyBmYWxzZSBwb3NpdGl2ZSwgd2hlcmUgdGhlIHZhcmlhYmxlIGlzCisgICAgICBhc3NpZ25lZCB0aHJvdWdoIGFuIGltcG9ydC4gQ2xvc2VzIGlzc3VlICMxOTYuCisKKyAgICAqIERlZmluaXRpb24gb3JkZXIgaXMgY29uc2lkZXJlZCBmb3IgY2xhc3NlcywgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgICBhbmQgYW5ub3RhdGlvbnMuIENsb3NlcyBpc3N1ZSAjMjU3LgorCisgICAgKiBEb24ndCBlbWl0ICd1bnVzZWQtdmFyaWFibGUnIHdoZW4gYXNzaWduaW5nIHRvIGEgbm9ubG9jYWwuCisgICAgICBDbG9zZXMgaXNzdWUgIzI3NS4KKworICAgICogRG8gbm90IGxldCBJbXBvcnRFcnJvciBwcm9wYWdhdGUgZnJvbSB0aGUgaW1wb3J0IGNoZWNrZXIsIGxlYWRpbmcgdG8gY3Jhc2gKKyAgICAgIGluIHNvbWUgbmFtZXNwYWNlIHBhY2thZ2UgcmVsYXRlZCBjYXNlcy4gQ2xvc2VzIGlzc3VlICMyMDMuCisKKyAgICAqIERvbid0IGVtaXQgJ3BvaW50bGVzcy1zdHJpbmctc3RhdGVtZW50JyBmb3IgYXR0cmlidXRlIGRvY3N0cmluZ3MuCisgICAgICBDbG9zZXMgaXNzdWUgIzE5My4KKworICAgICogVXNlIHRoZSBwcm9wZXIgbW9kZSBmb3IgcGlja2xlIHdoZW4gb3BlbmluZyBhbmQgd3JpdGluZyB0aGUgc3RhdHMgZmlsZS4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMTQ4LgorCisgICAgKiBEb24ndCBlbWl0IGhpZGRlbi1tZXRob2QgbWVzc2FnZSB3aGVuIHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4KKyAgICAgIG1vbmtleS1wYXRjaGVkLCB5b3UncmUgb24geW91ciBvd24gd2hlbiB5b3UgZG8gdGhhdC4KKworICAgICogT25seSBlbWl0IGF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCBmb3IgZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNhbWUKKyAgICAgIG1vZHVsZSBhcyB0aGUgb2ZmZW5kZWQgY2xhc3MsIGF2b2lkaW5nIHRvIG1hbmdsZSB0aGUgb3V0cHV0IGluIHNvbWUgY2FzZXMuCisKKyAgICAqIERvbid0IGVtaXQgJ3VubmVjZXNzYXJ5LWxhbWJkYScgaWYgdGhlIGJvZHkgb2YgdGhlIGxhbWJkYSBjYWxsIGNvbnRhaW5zCisgICAgICBjYWxsIGNoYWluaW5nLiBDbG9zZXMgaXNzdWUgIzI0My4KKworICAgICogRG9uJ3QgZW1pdCAnbWlzc2luZy1kb2NzdHJpbmcnIHdoZW4gdGhlIGFjdHVhbCBkb2NzdHJpbmcgdXNlcyBgYC5mb3JtYXRgYC4KKyAgICAgIENsb3NlcyBpc3N1ZSAjMjgxLgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuMi4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNC0wNC0zMAorCisgICAgKiBSZXN0b3JlIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgdGhlIGluaXQtaG9vayBvcHRpb24gdmlhIHRoZQorICAgICAgY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaCB3YXMgYWNjaWRlbnRhbGx5IGJyb2tlbiBpbiAxLjIuMC4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcgW2JhZC1jb250aW51YXRpb25dIGZvciBiYWRseSBpbmRlbnRlbmQgY29udGludWVkCisgICAgICBsaW5lcy4KKworICAgICogRW1pdCBbYXNzaWdubWVudC1mcm9tLW5vbmVdIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGJhcmUgcmV0dXJucy4KKyAgICAgIEZpeGVzIEJpdEJ1Y2tldCBpc3N1ZSAjMTkxLgorCisgICAgKiBBZGRlZCBhIG5ldyB3YXJuaW5nIGZvciBjbG9zaW5nIG92ZXIgdmFyaWFibGVzIHRoYXQgYXJlCisgICAgICBkZWZpbmVkIGluIGxvb3BzLiBGaXhlcyBCaXRidWNrZXQgaXNzdWUgIzE3Ni4KKworICAgICogRG8gbm90IHdhcm4gYWJvdXQgXHUgZXNjYXBlcyBpbiBzdHJpbmcgbGl0ZXJhbHMgd2hlbiBVbmljb2RlIGxpdGVyYWxzCisgICAgICBhcmUgdXNlZCBmb3IgUHl0aG9uIDIuKi4gRml4ZXMgQml0QnVja2V0IGlzc3VlICMxNTEuCisKKyAgICAqIEV4dGVuZCB0aGUgY2hlY2tpbmcgZm9yIHVuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nIGFuZAorICAgICAgdW5wYWNraW5nLW5vbi1zZXF1ZW5jZSB0byBpbnN0YW5jZSBhdHRyaWJ1dGUgdW5wYWNraW5nIGFzIHdlbGwuCisKKyAgICAqIEZpeCBleHBsaWNpdCBjaGVja2luZyBvZiBweXRob24gc2NyaXB0ICgxLjIgcmVncmVzc2lvbiwgIzIxOSkKKworICAgICogUmVzdG9yZSAtLWluaXQtaG9vaywgcmVuYW1lZCBhY2NpZGVudGFsbHkgaW50byAtLWluaXQtaG9va3MgaW4gMS4yLjAKKyAgICAgICgjMjExKQorCisgICAgKiBBZGQgJ2luZGV4aW5nLWV4Y2VwdGlvbicgd2FybmluZywgd2hpY2ggZGV0ZWN0cyB0aGF0IGluZGV4aW5nCisgICAgICBhbiBleGNlcHRpb24gb2NjdXJzIGluIFB5dGhvbiAyIChiZWhhdmlvdXIgcmVtb3ZlZCBpbiBQeXRob24gMykuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS4yLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDE0LTA0LTE4CisKKyAgICAqIFBhc3MgdGhlIGN1cnJlbnQgcHl0aG9uIHBhdGhzIHRvIHB5bGludCBwcm9jZXNzIHdoZW4gaW52b2tlZCB2aWEKKyAgICAgIGVweWxpbnQuICBGaXhlcyBCaXRCdWNrZXQgaXNzdWUgIzEzMy4KKworICAgICogQWRkIC1pIC8gLS1pbmNsdWRlLWlkcyBhbmQgLXMgLyAtLXN5bWJvbHMgYmFjayBhcyBjb21wbGV0ZWx5IGlnbm9yZWQKKyAgICAgIG9wdGlvbnMuIEZpeGVzIEJpdEJ1Y2tldCBpc3N1ZSAjMTgwLgorCisgICAgKiBFeHRlbmQgdGhlIG51bWJlciBvZiBjYXNlcyBpbiB3aGljaCBsb2dnaW5nIGNhbGxzIGFyZSBkZXRlY3RlZC4gRml4ZXMKKyAgICAgIGJpdGJ1Y2tldCBpc3N1ZSAjMTgyLgorCisgICAgKiBJbXByb3ZlIHByYWdtYSBoYW5kbGluZyB0byBub3QgZGV0ZWN0IHB5bGludDoqIHN0cmluZ3MgaW4gbm9uLWNvbW1lbnRzLgorICAgICAgRml4ZXMgQml0QnVja2V0IGlzc3VlICM3OS4KKworICAgICogRG8gbm90IGNyYXNoIHdpdGggVW5rbm93bk1lc3NhZ2UgaWYgYW4gdW5rbm93biBtZXNzYWdlIElEL25hbWUgYXBwZWFycworICAgICAgaW4gZGlzYWJsZSBvciBlbmFibGUgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIFBhdGNoIGJ5IENvbGUgUm9iaW5zb24uCisgICAgICBGaXhlcyBiaXRidWNrZXQgaXNzdWUgIzE3MC4KKworICAgICogQWRkIG5ldyB3YXJuaW5nICdldmFsLXVzZWQnLCBjaGVja2luZyB0aGF0IHRoZSBidWlsdGluIGZ1bmN0aW9uIGBgZXZhbGBgCisgICAgICB3YXMgdXNlZC4KKworICAgICogTWFrZSBpdCBwb3NzaWJsZSB0byBzaG93IGEgbmFtaW5nIGhpbnQgZm9yIGludmFsaWQgbmFtZSBieSBzZXR0aW5nCisgICAgICBpbmNsdWRlLW5hbWluZy1oaW50LiBBbHNvIG1ha2UgdGhlIG5hbWluZyBoaW50cyBjb25maWd1cmFibGUuIEZpeGVzCisgICAgICBCaXRCdWNrZXQgaXNzdWUgIzEzOC4KKworICAgICogQWRkZWQgc3VwcG9ydCBmb3IgZW5mb3JjaW5nIG11bHRpcGxlLCBidXQgY29uc2lzdGVudCBuYW1lIHN0eWxlcyBmb3IKKyAgICAgIGRpZmZlcmVudCBuYW1lIHR5cGVzIGluc2lkZSBhIHNpbmdsZSBtb2R1bGU7IGJhc2VkIG9uIGEgcGF0Y2ggd3JpdHRlbgorICAgICAgYnkgbW9yYm9AZ29vZ2xlLmNvbS4KKworICAgICogQWxzbyB3YXJuIGFib3V0IGVtcHR5IGRvY3N0cmluZ3Mgb24gb3ZlcnJpZGRlbiBtZXRob2RzOyBjb250cmlidXRlZAorICAgICAgYnkgc2ViYXN0aWFudUBnb29nbGUuY29tLgorCisgICAgKiBBbHNvIGluc3BlY3QgYXJndW1lbnRzIHRvIGNvbnN0cnVjdG9yIGNhbGxzLCBhbmQgZW1pdCByZWxldmFudAorICAgICAgd2FybmluZ3M7IGNvbnRyaWJ1dGVkIGJ5IHNlYmFzdGlhbnVAZ29vZ2xlLmNvbS4KKworICAgICogQWRkZWQgYSBuZXcgY29uZmlndXJhdGlvbiBvcHRpb24gbG9nZ2luZy1tb2R1bGVzIHRvIG1ha2UgdGhlIGxpc3QKKyAgICAgIG9mIG1vZHVsZSBuYW1lcyB0aGF0IGNhbiBiZSBjaGVja2VkIGZvciAnbG9nZ2luZy1ub3QtbGF6eScgZXQuIGFsLgorICAgICAgY29uZmlndXJhYmxlOyBjb250cmlidXRlZCBieSBtb3Jib0Bnb29nbGUuY29tLgorCisgICAgKiBlbnN1cmUgaW5pdC1ob29rcyBpcyBldmFsdWF0ZWQgYmVmb3JlIG90aGVyIG9wdGlvbnMsIG5vdGFibHkgbG9hZC1wbHVnaW5zCisgICAgICAoIzE2NikKKworICAgICogUHl0aG9uIDIuNSBzdXBwb3J0IHJlc3RvcmVkOiBmaXhlZCBzbWFsbCBpc3N1ZXMgcHJldmVudGluZyBweWxpbnQgdG8gcnVuCisgICAgICBvbiBweXRob24gMi41LiBCaXRidWNrZXQgaXNzdWVzICM1MCBhbmQgIzYyLgorCisgICAgKiBiaXRidWNrZXQgIzEyODogcHlsaW50IGRvZXNuJ3QgY3Jhc2ggd2hlbiBsb29raW5nCisgICAgICBmb3IgdXNlZC1iZWZvcmUtYXNzaWdubWVudCBpbiBjb250ZXh0IG1hbmFnZXIKKyAgICAgIGFzc2lnbm1lbnRzLgorCisgICAgKiBBZGQgbmV3IHdhcm5pbmcsICdiYWQtcmV2ZXJzZWQtc2VxdWVuY2UnLCBmb3IgY2hlY2tpbmcgdGhhdCB0aGUKKyAgICAgIHJldmVyc2VkKCkgYnVpbHRpbiByZWNlaXZlIGEgc2VxdWVuY2UgKGltcGxlbWVudHMgX19nZXRpdGVtX18gYW5kIF9fbGVuX18sCisgICAgICB3aXRob3V0IGJlaW5nIGEgZGljdCBvciBhIGRpY3Qgc3ViY2xhc3MpIG9yIGFuIGluc3RhbmNlIHdoaWNoIGltcGxlbWVudHMKKyAgICAgIF9fcmV2ZXJzZWRfXy4KKworICAgICogTWFyayBgYGZpbGVgYCBhcyBhIGJhZCBmdW5jdGlvbiB3aGVuIHVzaW5nIHB5dGhvbjIgKGNsb3NlcyAjOCkuCisKKyAgICAqIEFkZCBuZXcgd2FybmluZyAnYmFkLWV4Y2VwdGlvbi1jb250ZXh0JywgY2hlY2tpbmcKKyAgICAgIHRoYXQgYGByYWlzZSAuLi4gZnJvbSAuLi5gYCB1c2VzIGEgcHJvcGVyIGV4Y2VwdGlvbiBjb250ZXh0CisgICAgICAoTm9uZSBvciBhbiBleGNlcHRpb24pLgorCisgICAgKiBFbmhhbmNlIHRoZSBjaGVjayBmb3IgJ3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQnIHRvIGxvb2sKKyAgICAgIGZvciAnbm9ubG9jYWwnIHVzZXMuCisKKyAgICAqIEVtaXQgJ3VuZGVmaW5lZC1hbGwtdmFyaWFibGUnIGlmIGEgcGFja2FnZSdzIF9fYWxsX18KKyAgICAgIHZhcmlhYmxlIGNvbnRhaW5zIGEgbWlzc2luZyBzdWJtb2R1bGUgKGNsb3NlcyAjMTI2KS4KKworICAgICogQWRkIGEgbmV3IHdhcm5pbmcgJ2Fic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZCcgZm9yIGNoZWNraW5nCisgICAgICB0aGF0IGFic3RyYWN0IGNsYXNzZXMgY3JlYXRlZCB3aXRoIGBgYWJjYGAgbW9kdWxlIGFuZAorICAgICAgd2l0aCBhYnN0cmFjdCBtZXRob2RzIGFyZSBpbnN0YW50aWVkLgorCisgICAgKiBEbyBub3Qgd2FybiBhYm91dCAncmV0dXJuLWFyZy1pbi1nZW5lcmF0b3InIGluIFB5dGhvbiAzLjMrLgorCisgICAgKiBEbyBub3Qgd2FybiBhYm91dCAnYWJzdHJhY3QtbWV0aG9kJyB3aGVuIHRoZSBhYnN0cmFjdCBtZXRob2QKKyAgICAgIGlzIGltcGxlbWVudGVkIHRocm91Z2ggYXNzaWdubWVudCAoIzE1NSkuCisKKyAgICAqIEltcHJvdmUgY3ljbGljIGltcG9ydCBkZXRlY3Rpb24gaW4gdGhlIGNhc2Ugb2YgcGFja2FnZXMsIHBhdGNoIGJ5IEJ1Y2sKKyAgICAgIEdvbGVtb24KKworICAgICogQWRkIG5ldyB3YXJuaW5ncyBmb3IgY2hlY2tpbmcgcHJvcGVyIGNsYXNzIF9fc2xvdHNfXzoKKyAgICAgIGBgaW52YWxpZC1zbG90cy1vYmplY3RgYCBhbmQgYGBpbnZhbGlkLXNsb3RzYGAuCisKKyAgICAqIFNlYXJjaCBmb3IgcmMgZmlsZSBpbiBgfi8uY29uZmlnL3B5bGludHJjYCBpZiBgfi8ucHlsaW50cmNgCisgICAgICBkb2Vzbid0IGV4aXN0cyAoIzEyMSkKKworICAgICogRG9uJ3QgcmVnaXN0ZXIgdGhlIG5ld3N0eWxlIGNoZWNrZXIgdy8gcHl0aG9uID49IDMKKworICAgICogRml4IHVudXNlZC1pbXBvcnQgZmFsc2UgcG9zaXRpdmUgdy8gYXVnbWVudCBhc3NpZ25tZW50ICgjNzgpCisKKyAgICAqIEZpeCBhY2Nlc3MtbWVtYmVyLWJlZm9yZS1kZWZpbml0aW9uIGZhbHNlIG5lZ2F0aXZlIHdydCBhdWcgYXNzaWduICgjMTY0KQorCisgICAgKiBEbyBub3QgYXR0ZW1wdCB0byBhbmFseXplIG5vbiBweXRob24gZmlsZSwgZWcgLnNvIGZpbGUgKCMxMjIpCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMS4xLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDEzLTEyLTIyCisKKyAgICAqIEFkZCBuZXcgY2hlY2sgZm9yIHVzZSBvZiBkZXByZWNhdGVkIHByYWdtYSBkaXJlY3RpdmVzICJweWxpbnQ6ZGlzYWJsZS1tc2ciCisgICAgICBvciAicHlsaW50OmVuYWJsZS1tc2ciIChJMDAyMiwgZGVwcmVjYXRlZC1wcmFnbWEpIHdoaWNoIHdhcyBwcmV2aW91c2x5CisgICAgICBlbWl0dGVkIGFzIGEgcmVndWxhciB3YXJuKCkuCisKKyAgICAqIEF2b2lkIGZhbHNlIHVzZWQtYmVmb3JlLWFzc2lnbm1lbnQgZm9yIGV4Y2VwdCBoYW5kbGVyIGRlZmluZWQKKyAgICAgIGlkZW50aWZpZXIgdXNlZCBvbiB0aGUgc2FtZSBsaW5lICgjMTExKS4KKworICAgICogQ29tYmluZSAnbm8tc3BhY2UtYWZ0ZXItb3BlcmF0b3InLCAnbm8tc3BhY2UtYWZ0ZXItY29tbWEnIGFuZAorICAgICAgJ25vLXNwYWNlLWJlZm9yZS1vcGVyYXRvcicgaW50byBhIG5ldyB3YXJuaW5nICdiYWQtd2hpdGVzcGFjZScuCisKKyAgICAqIEFkZCBhIG5ldyB3YXJuaW5nICdzdXBlcmZsdW91cy1wYXJlbnMnIGZvciB1bm5lY2Vzc2FyeQorICAgICAgcGFyZW50aGVzZXMgYWZ0ZXIgY2VydGFpbiBrZXl3b3Jkcy4KKworICAgICogRml4IGEgcG90ZW50aWFsIGNyYXNoIGluIHRoZSByZWRlZmluZS1pbi1oYW5kbGVyIHdhcm5pbmcKKyAgICAgIGlmIHRoZSByZWRlZmluZWQgbmFtZSBpcyBhIG5lc3RlZCBnZXRhdHRyIG5vZGUuCisKKyAgICAqIEFkZCBhIG5ldyBvcHRpb24gZm9yIHRoZSBtdWx0aS1zdGF0ZW1lbnQgd2FybmluZyB0bworICAgICAgYWxsb3cgc2luZ2xlLWxpbmUgaWYgc3RhdGVtZW50cy4KKworICAgICogQWRkICdiYWQtY29udGV4dC1tYW5hZ2VyJyBlcnJvciwgY2hlY2tpbmcgdGhhdCAnX19leGl0X18nCisgICAgICBzcGVjaWFsIG1ldGhvZCBhY2NlcHRzIHRoZSByaWdodCBudW1iZXIgb2YgYXJndW1lbnRzLgorCisgICAgKiBSdW4gcHlsaW50IGFzIGEgcHl0aG9uIG1vZHVsZSAncHl0aG9uIC1tIHB5bGludCcgKGFuYXRvbHkgdGVjaHRvbmlrKS4KKworICAgICogQ2hlY2sgZm9yIG5vbi1leGNlcHRpb24gY2xhc3NlcyBpbnNpZGUgYW4gZXhjZXB0IGNsYXVzZS4KKworICAgICogZXB5bGludCBzdXBwb3J0IG9wdGlvbnMgdG8gZ2l2ZSB0byBweWxpbnQgYWZ0ZXIgdGhlIGZpbGUgdG8gYW5hbHl6ZSBhbmQKKyAgICAgIGhhdmUgYmFzaWMgaW5wdXQgdmFsaWRhdGlvbiAoYml0YnVja2V0ICM1MyBhbmQgIzU0KSwgcGF0Y2hlcyBwcm92aWRlZCBieQorICAgICAgZmVsaXBlb2Nob2EgYW5kIEJyaWFuIExhbmUuCisKKyAgICAqIEFkZGVkIGEgbmV3IHdhcm5pbmcsICdub24taXRlcmF0b3ItcmV0dXJuZWQnLCBmb3Igbm9uLWl0ZXJhdG9ycworICAgICAgcmV0dXJuZWQgYnkgJ19faXRlcl9fJy4KKworICAgICogQWRkIG5ldyBjaGVja3MgZm9yIHVucGFja2luZyBub24tc2VxdWVuY2VzIGluIGFzc2lnbm1lbnRzCisgICAgICAodW5wYWNraW5nLW5vbi1zZXF1ZW5jZSkgYXMgd2VsbCBhcyB1bmJhbGFuY2VkIHR1cGxlIHVucGFja2luZworICAgICAgKHVuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nKS4KKworICAgICogdXNlbGVzcy1lbHNlLW9uLWxvb3Agbm90IGVtaXR0ZWQgaWYgdGhlcmUgaXMgYSBicmVhayBpbiB0aGUKKyAgICAgIGVsc2UgY2xhdXNlIG9mIGlubmVyIGxvb3AgKCMxMTcpLgorCisgICAgKiBkb24ndCBtYXJrIGBgaW5wdXRgYCBhcyBhIGJhZCBmdW5jdGlvbiB3aGVuIHVzaW5nIHB5dGhvbjMgKCMxMTApLgorCisgICAgKiBiYWRseS1pbXBsZW1lbnRlZC1jb250YWluZXIgY2F1c2VkIHNldmVyYWwgcHJvYmxlbXMgaW4gaXRzCisgICAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uLiBEZWFjdGl2YXRlIGl0IHVudGlsIHdlIGhhdmUgc29tZXRoaW5nCisgICAgICBiZXR0ZXIuIFNlZSAjMTEyIGZvciBpbnN0YW5jZS4KKworICAgICogVXNlIGF0dHJpYnV0ZSByZWdleHAgZm9yIHByb3BlcnRpZXMgaW4gcHl0aG9uMywgYXMgaW4gcHl0aG9uMgorCisgICAgKiBDcmVhdGUgdGhlIFBZTElOVEhPTUUgZGlyZWN0b3J5IHdoZW4gbmVlZGVkLCBpdCBtaWdodCBmYWlsIGFuZCBsZWFkIHRvCisgICAgICBzcHVyaW91cyB3YXJuaW5ncyBvbiBpbXBvcnQgb2YgcHlsaW50LmNvbmZpZy4KKworICAgICogRml4IHNldHVwLnB5IHNvIHRoYXQgcHlsaW50IHByb3Blcmx5IGluc3RhbGwgb24gV2luZG93cyB3aGVuIHVzaW5nIHB5dGhvbjMKKworICAgICogVmFyaW91cyBkb2N1bWVudGF0aW9uIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKKworICAgICogRml4IGlzc3VlICM1NSAoZmFsc2UtcG9zaXRpdmUgdHJhaWxpbmctd2hpdGVzcGFjZSBvbiBXaW5kb3dzKQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDEuMC4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxMy0wOC0wNgorCisKKyAgICAqIEFkZCBjaGVjayBmb3IgdGhlIHVzZSBvZiAnZXhlYycgZnVuY3Rpb24KKworICAgICogTmV3IC0tbXNnLXRlbXBsYXRlIG9wdGlvbiB0byBjb250cm9sIG91dHB1dCwgZGVwcmVjYXRpbmcgIm1zdmMiIGFuZAorICAgICAgInBhcnNlYWJsZSIgb3V0cHV0IGZvcm1hdHMgYXMgd2VsbCBhcyBraWxsaW5nIGBgLS1pbmNsdWRlLWlkc2BgIGFuZCBgYC0tc3ltYm9sc2BgCisgICAgICBvcHRpb25zCisKKyAgICAqIERvIG5vdCBlbWl0IFtmaXhtZV0gZm9yIGV2ZXJ5IGxpbmUgaWYgdGhlIGNvbmZpZyB2YWx1ZSAnbm90ZXMnCisgICAgICBpcyBlbXB0eSwgYnV0IFtmaXhtZV0gaXMgZW5hYmxlZC4KKworICAgICogRW1pdCB3YXJuaW5ncyBhYm91dCBsaW5lcyBleGNlZWRpbmcgdGhlIGNvbHVtbiBsaW1pdCB3aGVuCisgICAgICB0aG9zZSBsaW5lcyBhcmUgaW5zaWRlIG11bHRpbGluZSBkb2NzdHJpbmdzLgorCisgICAgKiBEbyBub3QgZG91YmxlLWNoZWNrIHBhcmFtZXRlciBuYW1lcyB3aXRoIHRoZSByZWdleCBmb3IgcGFyYW1ldGVycyBhbmQKKyAgICAgIGlubGluZSB2YXJpYWJsZXMuCisKKyAgICAqIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWlzc2luZy1maW5hbC1uZXdsaW5lIChDMDMwNCkgZm9yIGZpbGVzIG1pc3NpbmcKKyAgICAgIHRoZSBmaW5hbCBuZXdsaW5lLgorCisgICAgKiBNZXRob2RzIHRoYXQgYXJlIGRlY29yYXRlZCBhcyBwcm9wZXJ0aWVzIGFyZSBub3cgdHJlYXRlZCBhcyBhdHRyaWJ1dGVzCisgICAgICBmb3IgdGhlIHB1cnBvc2VzIG9mIG5hbWUgY2hlY2tpbmcuCisKKyAgICAqIE5hbWVzIG9mIGRlcml2ZWQgaW5zdGFuY2UgY2xhc3MgbWVtYmVyIGFyZSBub3QgY2hlY2tlZCBhbnkgbW9yZS4KKworICAgICogTmFtZXMgaW4gZ2xvYmFsIHN0YXRlbWVudHMgYXJlIG5vdyBjaGVja2VkIGFnYWluc3QgdGhlIHJlZ3VsYXIKKyAgICAgIGV4cHJlc3Npb24gZm9yIGNvbnN0YW50cy4KKworICAgICogRm9yIHRvcGxldmVsIG5hbWUgYXNzaWdubWVudCwgdGhlIGNsYXNzIG5hbWUgcmVnZXggd2lsbCBiZSB1c2VkIGlmCisgICAgICBweWxpbnQgY2FuIGRldGVjdCB0aGF0IHZhbHVlIG9uIHRoZSByaWdodC1oYW5kIHNpZGUgaXMgYSBjbGFzcworICAgICAgKGxpa2UgY29sbGVjdGlvbnMubmFtZWR0dXBsZSgpKS4KKworICAgICogU2ltcGxpZmllZCBpbnZhbGlkLW5hbWUgbWVzc2FnZQorCisgICAgKiBBZGRlZCBhIG5ldyB3YXJuaW5nIGludmFsaWQtZW5jb2RlZC1kYXRhIChXMDUxMikgZm9yIGZpbGVzIHRoYXQKKyAgICAgIGNvbnRhaW4gZGF0YSB0aGF0IGNhbm5vdCBiZSBkZWNvZGVkIHdpdGggdGhlIHNwZWNpZmllZCBvcgorICAgICAgZGVmYXVsdCBlbmNvZGluZy4KKworICAgICogTmV3IHdhcm5pbmcgYmFkLW9wZW4tbW9kZSAoVzE1MDEpIGZvciBjYWxscyB0byBvcGVuIChvciBmaWxlKSB0aGF0CisgICAgICBzcGVjaWZ5IGludmFsaWQgb3BlbiBtb2RlcyAoT3JpZ2luYWwgaW1wbGVtZW50YXRpb24gYnkgU2FzaGEgSXNzYXlldikuCisKKyAgICAqIE5ldyB3YXJuaW5nIG9sZC1zdHlsZS1jbGFzcyAoQzEwMDEpIGZvciBjbGFzc2VzIHRoYXQgZG8gbm90IGhhdmUgYW55CisgICAgICBiYXNlIGNsYXNzLgorCisgICAgKiBBZGQgbmV3IG5hbWUgdHlwZSAnY2xhc3NfYXR0cmlidXRlJyBmb3IgYXR0cmlidXRlcyBkZWZpbmVkCisgICAgICBpbiBjbGFzcyBzY29wZS4gQnkgZGVmYXVsdCwgYWxsb3cgYm90aCBjb25zdCBhbmQgdmFyaWFibGUgbmFtZXMuCisKKyAgICAqIE5ldyB3YXJuaW5nIHRyYWlsaW5nLXdoaXRlc3BhY2UgKEMwMzAzKSB0aGF0IHdhcm5zIGFib3V0CisgICAgICB0cmFpbGluZyB3aGl0ZXNwYWNlLgorCisgICAgKiBBZGRlZCBhIG5ldyB3YXJuaW5nIHVucGFja2luZy1pbi1leGNlcHQgKFcwNzEyKSBhYm91dCB1bnBhY2tpbmcKKyAgICAgIGV4Y2VwdGlvbnMgaW4gaGFuZGxlcnMsIHdoaWNoIGlzIHVuc3VwcG9ydGVkIGluIFB5dGhvbiAzLgorCisgICAgKiBBZGQgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgbWlzc2luZy1kb2NzdHJpbmcgdG8KKyAgICAgIG9wdGlvbmFsbHkgZXhlbXB0IHNob3J0IGZ1bmN0aW9ucy9tZXRob2RzL2NsYXNzZXMgZnJvbQorICAgICAgdGhlIGNoZWNrLgorCisgICAgKiBBZGQgdGhlIHR5cGUgb2YgdGhlIG9mZmVuZGluZyBub2RlIHRvIG1pc3NpbmctZG9jc3RyaW5nCisgICAgICBhbmQgZW1wdHktZG9jc3RyaW5nLgorCisgICAgKiBOZXcgdXRpbGl0eSBjbGFzc2VzIGZvciBwZXItY2hlY2tlciB1bml0dGVzdHMgaW4gdGVzdHV0aWxzLnB5CisKKyAgICAqIERvIG5vdCB3YXJuIGFib3V0IHJlZGVmaW5pdGlvbnMgb2YgdmFyaWFibGVzIHRoYXQgbWF0Y2ggdGhlCisgICAgICBkdW1teSByZWdleC4KKworICAgICogRG8gbm90IHRyZWF0IGFsbCB2YXJpYWJsZXMgc3RhcnRpbmcgd2l0aCBfIGFzIGR1bW15IHZhcmlhYmxlcywKKyAgICAgIG9ubHkgXyBpdHNlbGYuCisKKyAgICAqIE1ha2UgdGhlIGxpbmUtdG9vLWxvbmcgd2FybmluZyBjb25maWd1cmFibGUgYnkgYWRkaW5nIGEgcmVnZXggZm9yIGxpbmVzCisgICAgICBmb3Igd2l0aCB0aGUgbGVuZ3RoIGxpbWl0IHNob3VsZCBub3QgYmUgZW5mb3JjZWQKKworICAgICogRG8gbm90IHdhcm4gYWJvdXQgYSBsb25nIGxpbmUgaWYgYSBweWxpbnQgZGlzYWJsZQorICAgICAgb3B0aW9uIGJyaW5ncyBpdCBhYm92ZSB0aGUgbGVuZ3RoIGxpbWl0CisKKyAgICAqIERvIG5vdCBmbGFnIG5hbWVzIGluIG5lc3RlZCB3aXRoIHN0YXRlbWVudHMgYXMgdW5kZWZpbmVkLgorCisgICAgKiBBZGRlZCBhIG5ldyB3YXJuaW5nICdvbGQtcmFpc2Utc3ludGF4JyBmb3IgdGhlIGRlcHJlY2F0ZWQgc3ludGF4CisgICAgICByYWlzZSBFeGNlcHRpb24sIGFyZ3MKKworICAgICogU3VwcG9ydCBmb3IgUEVQIDMxMDIgYW5kIG5ldyBtaXNzaW5nLWt3b2EgKEUxMTI1KSBtZXNzYWdlIGZvciBtaXNzaW5nCisgICAgICBtYW5kYXRvcnkga2V5d29yZCBhcmd1bWVudCAobG9naWxhYi5vcmcncyAjMTA3Nzg4KQorCisgICAgKiBGaXggc3BlbGxpbmcgb2YgbWF4LWJyYW5jaHMgb3B0aW9uLCBub3cgbWF4LWJyYW5jaGVzCisKKyAgICAqIEFkZGVkIGEgbmV3IGJhc2UgY2xhc3MgYW5kIGludGVyZmFjZSBmb3IgY2hlY2tlcnMgdGhhdCB3b3JrIG9uIHRoZQorICAgICAgdG9rZW5zIHJhdGhlciB0aGFuIHRoZSBzeW50YXgsIGFuZCBvbmx5IHRva2VuaXplIHRoZSBpbnB1dCBmaWxlCisgICAgICBvbmNlLgorCisgICAgKiBGb2xsb3cgYXN0bmcgcmVuYW1pbmcgdG8gYXN0cm9pZAorCisgICAgKiBiaXRidWNrZXQgIzM3OiBjaGVjayBmb3IgdW5iYWxhbmNlZCB1bnBhY2tpbmcgaW4gYXNzaWdubWVudHMKKworICAgICogYml0YnVja2V0ICMyNTogZml4IGluY29tcGxldGUtcHJvdG9jb2wgZmFsc2UgcG9zaXRpdmUgZm9yIHJlYWQtb25seQorICAgICAgY29udGFpbmVycyBsaWtlIHR1cGxlCisKKyAgICAqIGJpdGJ1Y2tldCAjMTY6IGZpeCBGYWxzZSBwb3NpdGl2ZSBFMTAwMyBvbiBQeXRob24gMyBmb3IgYXJndW1lbnQtbGVzcyBzdXBlcigpCisKKyAgICAqIGJpdGJ1Y2tldCAjNjogcHV0IGJhY2sgZG9jdW1lbnRhdGlvbiBpbiBzb3VyY2UgZGlzdHJpYnV0aW9uCisKKyAgICAqIGJpdGJ1Y2tldCAjMTU6IGVweWxpbnQgc2hvdWxkbid0IGhhbmcgYW55bW9yZSB3aGVuIHRoZXJlIGlzIGEgbGFyZ2UKKyAgICAgIG91dHB1dCBvbiBweWxpbnQnc3RkZXJyCisKKyAgICAqIGJpdGJ1Y2tldCAjNzogZml4IGVweWxpbnQgdy8gcHl0aG9uMworCisgICAgKiBiaXRidWNrZXQgIzM6IHJlbW92ZSBzdHJpbmcgbW9kdWxlIGZyb20gdGhlIGRlZmF1bHQgbGlzdCBvZiBkZXByZWNhdGVkCisgICAgICBtb2R1bGVzCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4yOC4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTMtMDQtMjUKKworICAgICogYml0YnVja2V0ICMxOiBmaXggImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iIGNyYXNoCisKKyAgICAqICM3NDAxMzogbmV3IEUxMzEwW2JhZC1zdHItc3RyaXAtY2FsbF0gbWVzc2FnZSB3YXJuaW5nIHdoZW4gYSBjYWxsIHRvIGEKKyAgICAgIHtsLHIsfXN0cmlwIG1ldGhvZCBjb250YWlucyBkdXBsaWNhdGUgY2hhcmFjdGVycyAocGF0Y2ggYnkgVG9yc3RlbiBNYXJlaykKKworICAgICogIzEyMzIzMzogbmV3IEUwMTA4W2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lXSBtZXNzYWdlIHJlcG9ydGluZyBkdXBsaWNhdGUKKyAgICAgIGFyZ3VtZW50IG5hbWVzCisKKyAgICAqICM4MTM3ODogZW1pdCBXMDEyMFt1c2VsZXNzLWVsc2Utb24tbG9vcF0gZm9yIGxvb3BzIHdpdGhvdXQgYnJlYWsKKworICAgICogIzEyNDY2MDogaW50ZXJuYWwgZGVwZW5kZW5jaWVzIHNob3VsZCBub3QgYXBwZWFyIGluIGV4dGVybmFsIGRlcGVuZGVuY2llcworICAgICAgcmVwb3J0CisKKyAgICAqICMxMjQ2NjI6IGZpeCBuYW1lIGVycm9yIGNhdXNpbmcgY3Jhc2ggd2hlbiBzeW1ib2xzIGFyZSBpbmNsdWRlZCBpbiBvdXRwdXQKKyAgICAgIG1lc3NhZ2VzCisKKyAgICAqICMxMjMyODU6IGFwcGx5IHByYWdtYXMgZm9yIHdhcm5pbmdzIGF0dGFjaGVkIHRvIGxpbmVzIHRvIHBoeXNpY2FsIHNvdXJjZQorICAgICAgY29kZSBsaW5lcworCisgICAgKiAjMTIzMjU5OiBkbyBub3QgZW1pdCBFMDEwNSBmb3IgeWllbGQgZXhwcmVzc2lvbnMgaW5zaWRlIGxhbWJkYXMKKworICAgICogIzEyMzg5MjogZG9uJ3QgY3Jhc2ggd2hlbiBhdHRlbXB0aW5nIHRvIHNob3cgc291cmNlIGNvZGUgbGluZSB0aGF0IGNhbid0CisgICAgICBiZSBlbmNvZGVkIHdpdGggdGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmdzCisKKyAgICAqIFNpbXBsaWZ5IGNoZWNrcyBmb3IgZGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWVzIGJ5IHVuaWZ5aW5nIHRlc3RzIGZvciBhbGwKKyAgICAgIGRpZmZlcmVudCBtdXRhYmxlIGNvbXBvdW5kIGxpdGVyYWxzLgorCisgICAgKiBJbXByb3ZlIHRoZSBkZXNjcmlwdGlvbiBmb3IgRTExMjRbcmVkdW5kYW50LWtleXdvcmQtYXJnXQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjcuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDEzLTAyLTI2CisKKyAgICAqICMyMDY5MzogcmVwbGFjZSBweWxpbnQuZWwgYnkgSWFuIEV1cmUgdmVyc2lvbiAocGF0Y2ggYnkgSi5Lb3R0YSkKKworICAgICogIzEwNTMyNzogYWRkIHN1cHBvcnQgZm9yIC0tZGlzYWJsZT1hbGwgb3B0aW9uIGFuZCBkZXByZWNhdGUgdGhlCisgICAgICAnZGlzYWJsZS1hbGwnIGlubGluZSBkaXJlY3RpdmUgaW4gZmF2b3VyIG9mICdza2lwLWZpbGUnIChwYXRjaCBieQorICAgICAgQS5GYXlvbGxlKQorCisgICAgKiAjMTEwODQwOiBhZGQgbWVzc2FnZXMgSTAwMjAgYW5kIEkwMDIxIGZvciByZXBvcnRpbmcgb2Ygc3VwcHJlc3NlZAorICAgICAgbWVzc2FnZXMgYW5kIHVzZWxlc3Mgc3VwcHJlc3Npb24gcHJhZ21hcy4gKHBhdGNoIGJ5IFRvcnN0ZW4gTWFyZWspCisKKyAgICAqICMxMTI3Mjg6IGFkZCB3YXJuaW5nIEUwNjA0IGZvciBub24tc3RyaW5nIG9iamVjdHMgaW4gX19hbGxfXworICAgICAgKHBhdGNoIGJ5IFRvcnN0ZW4gTWFyZWspCisKKyAgICAqICMxMjA2NTc6IGFkZCB3YXJuaW5nIFcwMTEwL2RlcHJlY2F0ZWQtbGFtYmRhIHdoZW4gYSBtYXAvZmlsdGVyCisgICAgICBvZiBhIGxhbWJkYSBjb3VsZCBiZSBhIGNvbXByZWhlbnNpb24gKHBhdGNoIGJ5IE1hcnRpbiBQb29sKQorCisgICAgKiAjMTEzMjMxOiBsb2dnaW5nIGNoZWNrZXIgbm93IGxvb2tzIGF0IGluc3RhbmNlcyBvZiBMb2dnZXIgY2xhc3NlcworICAgICAgaW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgbG9nZ2luZyBtb2R1bGUuIChwYXRjaCBieSBNaWtlIEJyeWFudCkKKworICAgICogIzExMTc5OTogZG9uJ3Qgd2FybiBhYm91dCBvY3RhbCBlc2NhcGUgc2VxdWVuY2UsIGJ1dCB3YXJuIGFib3V0IFxvCisgICAgICB3aGljaCBpcyBub3Qgb2N0YWwgaW4gUHl0aG9uIChwYXRjaCBieSBNYXJ0aW4gUG9vbCkKKworICAgICogIzExMDgzOTogYmluZCA8RjU+IHRvIFJ1biBidXR0b24gaW4gcHlsaW50LWd1aQorCisgICAgKiAjMTE1NTgwOiBmaXggZXJyb25lb3VzIFcwMjEyIChhY2Nlc3MgdG8gcHJvdGVjdGVkIG1lbWJlcikgb24gc3VwZXIgY2FsbAorICAgICAgKHBhdGNoIGJ5IE1hcnRpbiBQb29sKQorCisgICAgKiAjMTEwODUzOiBmaXggYSBjcmFzaCB3aGVuIGFuIF9faW5pdF9fIG1ldGhvZCBpbiBhIGJhc2UgY2xhc3MgaGFzIGJlZW4KKyAgICAgIGNyZWF0ZWQgYnkgYXNzaWdubWVudCByYXRoZXIgdGhhbiBkaXJlY3QgZnVuY3Rpb24gZGVmaW5pdGlvbiAocGF0Y2ggYnkKKyAgICAgIFRvcnN0ZW4gTWFyZWspCisKKyAgICAqICMxMTA4Mzg6IGZpeCBweWxpbnQtZ3VpIGNyYXNoIHdoZW4gaW5jbHVkZS1pZHMgaXMgYWN0aXZhdGVkIChwYXRjaCBieQorICAgICAgT21lZ2EgV2VhcG9uKQorCisgICAgKiAjMTEyNjY3OiBmaXggZW1pc3Npb24gb2YgcmVpbXBvcnQgd2FybmluZ3MgZm9yIG1peGVkIGltcG9ydHMgYW5kIGV4dGVuZAorICAgICAgdGhlIHRlc3RjYXNlIChwYXRjaCBieSBUb3JzdGVuIE1hcmVrKQorCisgICAgKiAjMTEyNjk4OiBmaXggY3Jhc2ggcmVsYXRlZCB0byBub24taW5mZXJhYmxlIF9fYWxsX18gYXR0cmlidXRlcyBhbmQKKyAgICAgIGludmFsaWQgX19hbGxfXyBjb250ZW50cyAocGF0Y2ggYnkgVG9yc3RlbiBNYXJlaykKKworICAgICogUHl0aG9uIDMgcmVsYXRlZCBmaXhlczoKKworICAgICogIzExMDIxMzogZml4IGltcG9ydCBvZiBjaGVja2VycyBicm9rZW4gd2l0aCBweXRob24gMy4zLCBjYXVzaW5nCisgICAgICAgICJObyBzdWNoIG1lc3NhZ2UgaWQgVzA3MDQiIGJyZWFrYWdlCisKKyAgICAqICMxMjA2MzU6IHJlZGVmaW5lIGNtcCBmdW5jdGlvbiB1c2VkIGluIHB5bGludC5yZXBvcnRlcnMKKworICAgICogSW5jbHVkZSBmdWxsIHdhcm5pbmcgaWQgZm9yIEkwMDIwIGFuZCBJMDAyMSBhbmQgbWFrZSBzdXJlIHRvIGZsdXNoCisgICAgICB3YXJuaW5ncyBhZnRlciBlYWNoIG1vZHVsZSwgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHB5bGludCBydW4uCisgICAgICAocGF0Y2ggYnkgVG9yc3RlbiBNYXJlaykKKworICAgICogQ2hhbmdlZCB0aGUgcmVndWxhciBleHByZXNzaW9uIGZvciBpbmxpbmUgb3B0aW9ucyBzbyB0aGF0IGl0IG11c3QgYmUKKyAgICAgIHByZWNlZGVkIGJ5IGEgIyAocGF0Y2ggYnkgVG9yc3RlbiBNYXJlaykKKworICAgICogTWFrZSBkb3Qgb3V0cHV0IGZvciBpbXBvcnQgZ3JhcGggcHJlZGljdGFibGUgYW5kIG5vdCBkZXBlbmQKKyAgICAgIG9uIG9yZGVyaW5nIG9mIHN0cmluZ3MgaW4gaGFzaGVzLiAocGF0Y2ggYnkgVG9yc3RlbiBNYXJlaykKKworICAgICogQWRkIGhvb2tzIGZvciBpbXBvcnQgcGF0aCBzZXR1cCBhbmQgbW92ZSBweWxpbnQncyBzeXMucGF0aAorICAgICAgbW9kaWZpY2F0aW9ucyBpbnRvIHRoZW0uIChwYXRjaCBieSBUb3JzdGVuIE1hcmVrKQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjYuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDEyLTEwLTA1CisKKyAgICAqICMxMDY1MzQ6IGFkZCAtLWlnbm9yZS1pbXBvcnRzIG9wdGlvbiB0byBjb2RlIHNpbWlsYXJpdHkgY2hlY2tpbmcKKyAgICAgIGFuZCAnc3ltaWxhcicgY29tbWFuZCBsaW5lIHRvb2wgKHBhdGNoIGJ5IFJ5NGFuIEJyYXNlKQorCisgICAgKiAjMTA0NTcxOiBjaGVjayBmb3IgYW5vbWFsb3VzIGJhY2tzbGFzaCBlc2NhcGUsIGludHJvZHVjaW5nIG5ldworICAgICAgVzE0MDEgYW5kIFcxNDAyIG1lc3NhZ2VzIChwYXRjaCBieSBNYXJ0aW4gUG9vbCkKKworICAgICogIzEwMDcwNzogY2hlY2sgZm9yIGJvb2xvcCBiZWluZyB1c2VkIGFzIGV4Y2VwdGlvbiBjbGFzcywgaW50cm9kdWNpbmcKKyAgICAgIG5ldyBXMDcxMSBtZXNzYWdlIChwYXRjaCBieSBUaW0gSGF0Y2gpCisKKyAgICAqICM0MDE0OiBpbXByb3ZlIGNoZWNraW5nIG9mIG1ldGFjbGFzcyBtZXRob2RzIGZpcnN0IGFyZ3MsIGludHJvZHVjaW5nCisgICAgICBuZXcgQzAyMDQgbWVzc2FnZSAocGF0Y2ggYnkgbG90aGlyYWxkYW5AZ21haWwuY29tIGZpbmFsaXplZCBieSBzdGhlbmF1bHQpCisKKyAgICAqICM0Njg1OiBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgYSBtb2R1bGUncyBfX2FsbF9fIHZhcmlhYmxlLAorICAgICAgaW50cm9kdWNpbmcgbmV3IEUwNjAzIG1lc3NhZ2UKKworICAgICogIzEwNTMzNzogYWxsb3cgY3VzdG9tIHJlcG9ydGVyIGluIG91dHB1dC1mb3JtYXQgKHBhdGNoIGJ5IEtldmluIEppbmcgUWl1KQorCisgICAgKiAjMTA0NDIwOiBjaGVjayBmb3IgcHJvdG9jb2wgY29tcGxldG5lc3MgYW5kIGF2b2lkIGZhbHNlIFIwOTAzCisgICAgICAocGF0Y2ggYnkgUGV0ZXIgSGFtbW9uZCkKKworICAgICogIzEwMDY1NDogZml4IGdyYW1tYXRpY2FsIGVycm9yIGZvciBXMDMzMiBtZXNzYWdlICh1c2luZyAnbCcgYXMKKyAgICAgIGxvbmcgaW50IGlkZW50aWZpZXIpCisKKyAgICAqICMxMDM2NTY6IGZpeCBXMDIzMSBmYWxzZSBwb3NpdGl2ZSBmb3IgbWlzc2luZyBjYWxsIHRvIG9iamVjdC5fX2luaXRfXworICAgICAgKHBhdGNoIGJ5IGxvdGhpcmFsZGFuQGdtYWlsLmNvbSkKKworICAgICogIzYzNDI0OiBmaXggc2ltaWxhcml0eSByZXBvcnQgZGlzYWJsaW5nIGJ5IHByb3Blcmx5IHJlbmFtaW5nIGl0IHRvIFJQMDgwMQorCisgICAgKiAjMTAzOTQ5OiBjcmVhdGUgYSBjb25zb2xlX3NjcmlwdHMgZW50cnkgcG9pbnQgdG8gYmUgdXNlZCBieQorICAgICAgZWFzeV9pbnN0YWxsLCBidWlsZG91dCBhbmQgcGlwCisKKyAgICAqIGZpeCBjcm9zcy1pbnRlcnByZXRlciBpc3N1ZSAobm9uIGNvbXBhdGlibGUgYWNjZXNzIHRvIF9fYnVpbHRpbnNfXykKKworICAgICogc3RvcCBpbmNsdWRpbmcgdGVzdHMgZmlsZXMgaW4gZGlzdHJpYnV0aW9uLCB0aGV5IGNhdXNlcyBjcmFzaCB3aGVuCisgICAgICBpbnN0YWxsZWQgd2l0aCBweXRob24zICgjNzIwMjIsICM4MjQxNywgIzc2OTEwKQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjUuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDEyLTA3LTE3CisKKyAgICAqICM5MzU5MTogQ29ycmVjdGx5IGVtaXQgd2FybmluZ3MgYWJvdXQgY2xvYmJlcmVkIHZhcmlhYmxlIG5hbWVzIHdoZW4gYW4KKyAgICAgIGV4Y2VwdCBoYW5kbGVyIGNvbnRhaW5zIGEgdHVwbGUgb2YgbmFtZXMgaW5zdGVhZCBvZiBhIHNpbmdsZSBuYW1lLgorICAgICAgKHBhdGNoIGJ5IHRtYXJla0Bnb29nbGUuY29tKQorCisgICAgKiAjNzM5NDogVzAyMTIgKGFjY2VzcyB0byBwcm90ZWN0ZWQgbWVtYmVyKSBub3QgZW1pdHRlZCBvbiBhc3NpZ21lbnRzCisgICAgICAocGF0Y2ggYnkgbG90aGlyYWxkYW5AZ21haWwuY29tKQorCisgICAgKiAjMTg3NzI7IG5vIHByb3RvdHlwZSBjb25zaXN0ZW5jeSBjaGVjayBmb3IgbWFuZ2xlZCBtZXRob2RzIChwYXRjaCBieQorICAgICAgbG90aGlyYWxkYW5AZ21haWwuY29tKQorCisgICAgKiAjOTI5MTE6IGVtaXQgVzAxMDIgd2hlbiBzZXRzIGFyZSB1c2VkIGFzIGRlZmF1bHQgYXJndW1lbnRzIGluIGZ1bmN0aW9ucworICAgICAgKHBhdGNoIGJ5IHRtYXJla0Bnb29nbGUuY29tKQorCisgICAgKiAjNzc5ODI6IGRvIG5vdCBlbWl0IEUwNjAyIGZvciBsb29wIHZhcmlhYmxlcyBvZiBjb21wcmVoZW5zaW9ucworICAgICAgdXNlZCBhcyBhcmd1bWVudCB2YWx1ZXMgaW5zaWRlIGEgZGVjb3JhdG9yIChwYXRjaCBieSB0bWFyZWtAZ29vZ2xlLmNvbSkKKworICAgICogIzg5MDkyOiBkb24ndCBlbWl0IEUwMjAyIChhdHRyaWJ1dGUgaGlkaW5nIGEgbWV0aG9kKSBvbiBAcHJvcGVydHkgbWV0aG9kcworCisgICAgKiAjOTI1ODQ6IGZpeCBweWxpbnQtZ3VpIGNyYXNoIGR1ZSB0byBpbnRlcm5hbCBBUEkgY2hhbmdlCisKKyAgICAqICM4NzE5MjogZml4IGNyYXNoIHdoZW4gZGVjb3JhdG9ycyBhcmUgYWNjZXNzZWQgdGhyb3VnaCBtb3JlIHRoYW4gb25lIGRvdAorICAgICAgKGZvciBpbnN0YW5jZSBAYS5iIGlzIGZpbmUsIEBhLmIuYyBjcmFzaCkKKworICAgICogIzg4OTE0OiBmaXggcGFyc2luZyBvZiAtLWdlbmVyYXRlZC1tZW1iZXJzIG9wdGlvbnMsIGxlYWRpbmcgdG8gY3Jhc2gKKyAgICAgIHdoZW4gdXNpbmcgYSByZWdleHAgdmFsdWUgc2V0CisKKyAgICAqIGZpeCBwb3RlbnRpYWwgY3Jhc2hlcyB3aXRoIHV0aWxzLnNhZmVfaW5mZXIgcmFpc2luZyBJbmZlcmVuY2VFcnJvcgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjUuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDExLTEyLTA4CisKKyAgICAqICM4MTA3ODogV2FybiBpZiBuYW1lcyBpbiAgZXhjZXB0aW9uIGhhbmRsZXJzIGNsb2JiZXIgb3ZlcndyaXRlCisgICAgICBleGlzdGluZyBuYW1lcyAocGF0Y2ggYnkgdG1hcmVrQGdvb2dsZS5jb20pCisKKyAgICAqICM4MTExMzogRml4IFcwNzAyIG1lc3NhZ2VzIGFwcGVhcmluZyB3aXRoIHRoZSB3cm9uZyBsaW5lIG51bWJlci4KKyAgICAgIChwYXRjaCBieSB0bWFyZWtAZ29vZ2xlLmNvbSkKKworICAgICogIzUwNDYxLCAjNTIwMjAsICM1MTIyMjogRG8gbm90IGlzc3VlIHdhcm5pbmdzIHdoZW4gdXNpbmcgMi42J3MKKyAgICAgIHByb3BlcnR5LnNldHRlci9kZWxldGVyIGZ1bmN0aW9uYWxpdHkgKHBhdGNoIGJ5IGRuZWlsQGdvb2dsZS5jb20pCisKKyAgICAqICM5MTg4LCAjNDAyNDogRG8gbm90IHRyaWdnZXIgVzA2MzEgaWYgYSBsb29wIHZhcmlhYmxlIGlzIGFzc2lnbmVkCisgICAgICBpbiB0aGUgZWxzZSBicmFuY2ggb2YgYSBmb3IgbG9vcC4KKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjI1LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxMS0xMC03CisKKyAgICAqICM3NDc0MjogbWFrZSBhbGxvd2VkIG5hbWUgZm9yIGZpcnN0IGFyZ3VtZW50IG9mIGNsYXNzIG1ldGhvZCBjb25maWd1cmFibGUKKyAgICAgIChwYXRjaCBieSBHb29nbGUpCisKKyAgICAqICM3NDA4NzogaGFuZGxlIGNhc2Ugd2hlcmUgaW5mZXJlbmNlIG9mIGEgbW9kdWxlIHJldHVybiBZRVM7IHRoaXMgYXZvaWQKKyAgICAgIHNvbWUgY2FzZXMgb2YgIlR5cGVFcnJvcjogJ19ZZXMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGluZGV4aW5nIiAocGF0Y2gKKyAgICAgIGJ5IEdvb2dsZSkKKworICAgICogIzc0NzQ1OiBtYWtlICJ0b28gZ2VuZXJhbCIgZXhjZXB0aW9uIG5hbWVzIGNvbmZpZ3VyYWJsZSAocGF0Y2ggYnkgR29vZ2xlKQorCisgICAgKiAjNzQ3NDc6IGNyYXNoIG9jY3VycyB3aGVuIGxvb2t1cCB1cCBhIHNwZWNpYWwgYXR0cmlidXRlIGluIGNsYXNzIHNjb3BlCisgICAgICAocGF0Y2ggYnkgZ29vZ2xlKQorCisgICAgKiAjNzY5MjA6IGNyYXNoIGlmIG9uIGVnICJweWxpbnQgLS1yY2ZpbGUiIChwYXRjaCBieSBUb3JzdGVuIE1hcmVrKQorCisgICAgKiAjNzcyMzc6IHdhcm5pbmcgZm9yIEUwMjAyIG1heSBiZSB2ZXJ5IG1pc2xlYWRpbmcKKworICAgICogIzczOTQxOiBIVE1MIHJlcG9ydCBtZXNzYWdlcyB0YWJsZSBpcyBiYWRseSByZW5kZXJlZAorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjQuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDExLTA3LTE4CisKKyAgICAqICM2OTczODogYWRkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3VwcG9ydCBmb3IgImdlbmVyYXRlZC1tZW1iZXJzIgorCisgICAgKiBpZHMgb2YgbG9nZ2luZyBhbmQgc3RyaW5nX2Zvcm1hdCBjaGVja2VycyBoYXZlIGJlZW4gY2hhbmdlZDoKKyAgICAgIGxvZ2dpbmc6IDY1IC0+IDEyLCBzdHJpbmdfZm9ybWF0OiA5OSAtPiAxMworICAgICAgQWxzbyBhZGQgZG9jdW1lbnRhdGlvbiB0byBzYXkgdGhhdCBpZHMgb2YgcmFuZ2UgMS01MCBzaGFsbCBiZSByZXNlcnZlZAorICAgICAgdG8gcHlsaW50IGludGVybmFsIGNoZWNrZXJzCisKKyAgICAqICM2OTk5MzogQWRkaXRpb25hbCBzdHJpbmcgZm9ybWF0IGNoZWNrcyBmb3IgbG9nZ2luZyBtb2R1bGU6CisgICAgICBjaGVjayBmb3IgbWlzc2luZyBhcmd1bWVudHMsIHRvbyBtYW55IGFyZ3VtZW50cywgb3IgaW52YWxpZCBzdHJpbmcKKyAgICAgIGZvcm1hdHMgaW4gdGhlIGxvZ2dpbmcgY2hlY2tlciBtb2R1bGUuIENvbnRyaWJ1dGVkIGJ5IERhbmllbCBBcmVuYQorCisgICAgKiAjNjkyMjA6IGFkZCBjb2x1bW4gb2Zmc2V0IHRvIHRoZSByZXBvcnRzLiBJZiB5b3UndmUgYSBjdXN0b20gcmVwb3J0ZXIsCisgICAgICB0aGlzIGNoYW5nZSBtYXkgYnJlYWsgaXQgaGFzIG5vdyBsb2NhdGlvbiBnYWluIGEgbmV3IGl0ZW0gZ2l2aW5nIHRoZQorICAgICAgY29sdW1uIG9mZnNldC4KKworICAgICogIzYwODI4OiBGaXggZmFsc2UgcG9zaXRpdmUgaW4gcmVpbXBvcnQgY2hlY2sKKworICAgICogIzcwNDk1OiBhYnNvbHV0ZSBpbXBvcnRzIGZhaWwgZGVwZW5kaW5nIG9uIG1vZHVsZSBwYXRoIChwYXRjaCBieSBKYWNlayBLb25pZWN6bnkpCisKKyAgICAqICMyMjI3MzogRml4IC0taWdub3JlIG9wdGlvbiBkb2N1bWVudGF0aW9uIHRvIG1hdGNoIHJlYWxpdHkKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjIzLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxMS0wMS0xMQorCisgICAgKiBkb2N1bWVudGF0aW9uIHVwZGF0ZSwgYWRkIG1hbnBhZ2VzCisKKyAgICAqIHNldmVyYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisKKyAgICAqIGZpbmFsaXplIHB5dGhvbjMgc3VwcG9ydAorCisgICAgKiBuZXcgVzAxMDYgd2FybmluZyAnRXhwcmVzc2lvbiAiJXMiIGlzIGFzc2lnbmVkIHRvIG5vdGhpbmcnCisKKyAgICAqIGRyb3AgRTA1MDEgYW5kIEUwNTAyIG1lc3NhZ2VzIGFib3V0IHdyb25nIHNvdXJjZSBlbmNvZGluZzogbm90IGFueW1vcmUKKyAgICAgIGludGVyZXN0aW5nIHNpbmNlIGl0J3MgYSBzeW50YXggZXJyb3IgZm9yIHB5dGhvbiA+PSAyLjUgYW5kIHdlIG5vdyBvbmx5CisgICAgICBzdXBwb3J0IHRoaXMgcHl0aG9uIHZlcnNpb24gYW5kIGFib3ZlLgorCisgICAgKiBkb24ndCBlbWl0IFcwMjIxIG9yIFcwMjIyIHdoZW4gbWV0aG9kcyBhcyB2YXJpYWJsZSBhcmd1bWVudHMgKGVnIFwqYXJnCisgICAgICBhbmQvb3IgXCpcKmFyZ3MpLiBQYXRjaCBzdWJtaXR0ZWQgYnkgQ2hhcmxlcyBEdWZmeS4KKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjIyLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxMC0xMS0xNQorCisgICAgKiBweXRob24gdmVyc2lvbnM6IG1pbmltYWwgcHl0aG9uMy54IHN1cHBvcnQ7IGRyb3AgcHl0aG9uIDwgMi41IHN1cHBvcnQKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjIxLjQ/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxMC0xMC0yNworCisgICAgKiBmaXggIzQ4MDY2OiBweWxpbnQgY3Jhc2hlcyB3aGVuIHJlZGlyZWN0aW5nIG91dHB1dCBjb250YWluaW5nIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCisKKyAgICAqIGZpeCAjMTk3OTk6ICJweWxpbnQgLWJsYWgiIGV4aXQgd2l0aCBzdGF0dXMgMgorCisgICAgKiB1cGRhdGUgZG9jdW1lbnRhdGlvbgorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjEuMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDEwLTA5LTI4CisKKyAgICAqIHJlc3RvcmVkIHB5dGhvbiAyLjMgY29tcGF0aWJpbGl0eS4gQWxvbmcgd2l0aCBsb2dpbGFiLWFzdG5nCisgICAgICAwLjIxLjMgYW5kIGxvZ2lsYWItY29tbW9uIDAuNTIsIHRoaXMgd2lsbCBtdWNoIHByb2JhYmx5IGJlIHRoZQorICAgICAgbGF0ZXN0IHJlbGVhc2Ugc3VwcG9ydGluZyBweXRob24gPCAyLjUuCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4yMS4yPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTAtMDgtMjYKKworICAgICogZml4ICMzNjE5MzogaW1wb3J0IGNoZWNrZXIgcmFpc2UgZXhjZXB0aW9uIG9uIGN5Y2xpYyBpbXBvcnQKKworICAgICogZml4ICMyODc5NjogcmVncmVzc2lvbiBpbiAtLWdlbmVyYXRlZC1tZW1iZXJzIGludHJvZHVjZWQgcHlsaW50IDAuMjAKKworICAgICogc29tZSBkb2N1bWVudGF0aW9uIGNsZWFudXBzCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4yMS4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTAtMDYtMDQKKworICAgICogZml4ICMyODk2MjogcHlsaW50IGNyYXNoIHdpdGggbmV3IG9wdGlvbnMsIGR1ZSB0byBtaXNzaW5nIHN0YXRzIGRhdGEgd2hpbGUKKyAgICAgIHdyaXRpbmcgdGhlIFN0YXRpc3RpY3MgYnkgdHlwZXMgcmVwb3J0CisKKyAgICAqIHVwZGF0ZWQgbWFuIHBhZ2UgdG8gMC4yMSBvciBncmVhdGVyIGNvbW1hbmQgbGluZSB1c2FnZSAoZml4IGRlYmlhbiAjNTgyNDk0KQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMjEuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDEwLTA1LTExCisKKyAgICAqIGNvbW1hbmQgbGluZSB1cGRhdGVkIChjbG9zZXMgIzk3NzQsICM5Nzg3LCAjOTk5MiwgIzIyOTYyKToKKworICAgICogYWxsIGVuYWJsZS0qIC8gZGlzYWJsZS0qIG9wdGlvbnMgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIC0tZW5hYmxlIC8gLS1kaXNhYmxlCisKKyAgICAqIEJBQ0tXQVJEIElOQ09NUEFUSUJMRSBDSEFOR0U6IHNob3J0IG5hbWUgb2YgLS1lcnJvcnMtb25seSBiZWNvbWVzIC1FLCAtZSBiZWluZworICAgICAgYWZmZWN0ZWQgdG8gLS1lbmFibGUKKworICAgICogcHlsaW50IC0taGVscCBvdXRwdXQgbXVjaCBzaW1wbGlmaWVkLCB3aXRoIC0tbG9uZy1oZWxwIGF2YWlsYWJsZSB0byBnZXQgdGhlCisgICAgICBjb21wbGV0ZSBvbmUKKworICAgICogcmV2aXNpdGVkIGd1aSwgdGhhbmtzIHRvIHN0dWRlbnRzIGZyb20gVG9yb250byB1bml2ZXJzaXR5ICh0aGV5IGFyZSBncmVhdAorICAgICAgY29udHJpYnV0b3JzIHRvIHRoaXMgcmVsZWFzZSEpCisKKyAgICAqIGZpeCAjMjE1OTE6IGh0bWwgcmVwb3J0ZXIgcHJvZHVjZXMgbm8gb3V0cHV0IGlmIHJlcG9ydHMgaXMgc2V0IHRvICdubycKKworICAgICogZml4ICM0NTgxOiBub3QgTWlzc2luZyBkb2NzdHJpbmcgKEMwMTExKSB3YXJuaW5nIGlmIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4KKworICAgICogZml4ICM0NjgzOiBOb24tQVNDSUkgY2hhcmFjdGVycyBjb3VudCBkb3VibGUgaWYgdXRmOCBlbmNvZGUKKworICAgICogZml4ICM5MDE4OiB3aGVuIHVzaW5nIGRlZmluaW5nLWF0dHItbWV0aG9kLCBtZXRob2Qgb3JkZXIgbWF0dGVycworCisgICAgKiBmaXggIzQ1OTU6IENvbW1hIG5vdCBmb2xsb3dlZCBieSBhIHNwYWNlIHNob3VsZCBub3Qgb2NjdXJzIG9uIHRyYWlsaW5nIGNvbW1hCisgICAgICBpbiBsaXN0L3R1cGxlL2RpY3QgZGVmaW5pdGlvbgorCisgICAgKiBmaXggIzIyNTg1OiBbUGF0Y2hdIGZpeCBtYW4gd2FybmluZ3MgZm9yIHB5cmV2ZXJzZS4xIG1hbnBhZ2UKKworICAgICogZml4ICMyMDA2NzogQXR0cmlidXRlRXJyb3I6ICdOb25lVHlwZScgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ25hbWUnIHdpdGggd2l0aAorCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4yMC4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTAtMDMtMDEKKworICAgICogZml4ICMxOTQ5ODogZml4IHdpbmRvd3MgYmF0Y2ggZmlsZQorCisgICAgKiBmaXggIzE5MzM5OiBweWxpbnQuZWwgOiBub24gZXhpc3RpbmcgcHktbW9kLW1hcAorICAgICAgKGNsb3NlcyBEZWJpYW4gQnVnIHJlcG9ydCBsb2dzIC0gIzQ3NTkzOSkKKworICAgICogaW1wbGVtZW50ICMxODg2MCwgbmV3IFcwMTk5IG1lc3NhZ2Ugb24gYXNzZXJ0IChhLCBiKQorCisgICAgKiBpbXBsZW1lbnQgIzk3NzYsICdXMDE1MCcgYnJlYWsgb3IgcmV0dXJuIHN0YXRlbWVudCBpbiBmaW5hbGx5IGJsb2NrIG1heQorICAgICAgc3dhbGxvdyBleGNlcHRpb24uCisKKyAgICAqIGZpeCAjOTI2MywgX19pbml0X18gYW5kIF9fbmV3X18gYXJlIGNoZWNrZWQgZm9yIHVudXNlZCBhcmd1bWVudHMKKworICAgICogZml4ICMyMDk5MSwgY2xhc3Mgc2NvcGUgZGVmaW5pdGlvbnMgaWdub3JlZCBpbiBhIGdlbmV4cHIKKworICAgICogZml4ICM1OTc1LCBBYnN0cmFjdCBpbnRlcm1lZGlhdGUgY2xhc3Mgbm90IHJlY29nbml6ZWQgYXMgc3VjaAorCisgICAgKiBmaXggIzU5NzcsIHlpZWxkIGFuZCByZXR1cm4gc3RhdGVtZW50IGhhdmUgdGhlaXIgb3duIGNvdW50ZXJzLCBubyBtb3JlIFIwOTExCisgICAgICAoVG9vIG1hbnkgcmV0dXJuIHN0YXRlbWVudHMpIHdoZW4gYSBmdW5jdGlvbiBoYXZlIG1hbnkgeWllbGQgc3RhbXRlbWVudHMKKworICAgICogaW1wbGVtZW50ICM1NTY0LCBmdW5jdGlvbiAvIG1ldGhvZCBhcmd1bWVudHMgd2l0aCBsZWFkaW5nICJfIiBhcmUgaWdub3JlZCBpbgorICAgICAgYXJndW1lbnRzIC8gbG9jYWwgdmFyaWFibGVzIGNvdW50LgorCisgICAgKiBpbXBsZW1lbnQgIzk5ODIsIEUwNzExIHNwZWNpZmljIGVycm9yIG1lc3NhZ2Ugd2hlbiByYWlzaW5nIE5vdEltcGxlbWVudGVkCisKKyAgICAqIHJlbW92ZSAtLWNhY2hlLXNpemUgb3B0aW9uCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4xOS4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDktMTItMTgKKworICAgICogaW1wbGVtZW50ICMxODk0NywgIzU1NjE6IGNoZWNrZXIgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cworCisgICAgKiBpbmNsdWRlIEphbWVzIExpbmdhcmQgc3RyaW5nIGZvcm1hdCBjaGVja2VyCisKKyAgICAqIGluY2x1ZGUgc2ltcGxlIG1lc3NhZ2UgKGlkcykgbGlzdGluZyBieSBWaW5jZW50IEZlcm90aW4gKCM5NzkxKQorCisgICAgKiAtLWVycm9ycy1vbmx5IGRvZXMgbm90IGhpZGUgZmF0YWwgZXJyb3IgYW55bW9yZQorCisgICAgKiBpbmNsdWRlIGphbWVzIExpbmdhcmQgcGF0Y2hlcyBmb3IgKysvLS0gYW5kIGR1cGxpY2F0ZSBrZXkgaW4gZGljdHMKKworICAgICogaW5jbHVkZSBKYW1lcyBMaW5nYXJkIHBhdGNoZXMgZm9yIGZ1bmN0aW9uIGNhbGwgYXJndW1lbnRzIGNoZWNrZXIKKworICAgICogaW1wcm92ZWQgZmx5bWFrZSBjb2RlIGFuZCBkb2MgcHJvdmlkZWQgYnkgRGVyZWsgSGFybGFuZAorCisgICAgKiByZWZhY3RvciBhbmQgZml4IHRoZSBpbXBvcnRzIGNoZWNrZXIKKworICAgICogZml4ICMxODg2MjogRTA2MDEgZmFsc2UgcG9zaXRpdmUgd2l0aCBsYW1iZGEgZnVuY3Rpb25zCisKKyAgICAqIGZpeCAjODc2NDogTW9yZSB0aGFuIG9uZSBzdGF0ZW1lbnQgb24gYSBzaW5nbGUgbGluZSBmYWxzZSBwb3NpdGl2ZSB3aXRoCisgICAgICB0cnkvZXhjZXB0L2ZpbmFsbHkKKworICAgICogZml4ICM5MjE1OiBmYWxzZSB1bmRlZmluZWQgdmFyaWFibGUgZXJyb3IgaW4gbGFtYmRhIGZ1bmN0aW9uCisKKyAgICAqIGZpeCBmb3IgdzAxMDggZmFsc2UgcG9zaXRpdmUgKE5hdGhhbmllbCkKKworICAgICogZml4IHRlc3QvZnVsbHRlc3Quc2gKKworICAgICogIzU4MjEgYWRkZWQgYSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHJ1biBweWxpbnQgaW4gYW5vdGhlciBwcm9jZXNzIChwYXRjaCBwcm92aWRlIGJ5IFZpbmNlbnQgRmVyb3RpbikKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjE4LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwOS0wMy0yNQorCisgICAgKiB0ZXN0cyBvayB3aXRoIHB5dGhvbiAyLjQsIDIuNSwgMi42LiAyLjMgbm90IHRlc3RlZAorCisgICAgKiBmaXggIzg2ODcsIFcwNjEzIGZhbHNlIHBvc2l0aXZlIG9uIGlubmVyIGZ1bmN0aW9uCisKKyAgICAqIGZpeCAjODM1MCwgQzAzMjIgZmFsc2UgcG9zaXRpdmUgb24gbXVsdGktbGluZSBzdHJpbmcKKworICAgICogZml4ICM4MzMyOiBzZXQgRTA1MDEgbGluZSBubyB0byB0aGUgZmlyc3QgbGluZSB3aGVyZSBub24gYXNjaWkgY2hhcmFjdGVyCisgICAgICBoYXMgYmVlbiBmb3VuZAorCisgICAgKiBhdm9pZCBzb21lIEUwMjAzIC8gRTA2MDIgZmFsc2UgbmVnYXRpdmVzIGJ5IGRldGVjdGluZyByZXNwZWN0aXZlbHkKKyAgICAgIEF0dHJpYnV0ZUVycm9yIC8gTmFtZUVycm9yCisKKyAgICAqIGltcGxlbWVudHMgIzQwMzc6IGRvbid0IGlzc3VlIFcwMTQyICgqIG9yICoqIG1hZ2ljKSB3aGVuIHRoZXkgYXJlIGJhcmVseQorICAgICAgcGFzc2VkIGZyb20gKi8qKiBhcmd1bWVudHMKKworICAgICogY29tcGxldGUgIzU1NzM6IG1vcmUgY29tcGxldGUgbGlzdCBvZiBzcGVjaWFsIG1ldGhvZHMsIGFsc28gc2tpcCBXMDYxMworICAgICAgZm9yIHB5dGhvbiBpbnRlcm5hbCBtZXRob2QKKworICAgICogZG9uJ3Qgc2hvdyBpbmZvcm1hdGlvbiBtZXNzYWdlcyBieSBkZWZhdWx0CisKKyAgICAqIGludGVncmF0aW9uIG9mIFl1ZW4gSG8gV29uZydzIHBhdGNoZXMgb24gZW1hY3MgbGlzcCBmaWxlcworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMTcuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDA5LTAzLTE5CisKKyAgICAqIHNlbWljb2xvbiBjaGVjayA6IG1vdmUgVzA2MDEgdG8gVzAzMDEKKworICAgICogcmVtb3ZlIHJweXRob24gOiByZW1vdmUgYWxsIHJweXRob24gY2hlY2tlciwgbW9kdWxlcyBhbmQgdGVzdHMKKworICAgICogYXN0bmcgMC4xOCBjb21wYXRpYmlsaXR5OiBzdXBwb3J0IGZvciBfYXN0IG1vZHVsZSBtb2RpZmllcyBpbnRlcmZhY2VzCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4xNi4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDktMDEtMjgKKworICAgICogY2hhbmdlIFtlbnxkaXNdYWJsZS1tc2ctY2F0IG9wdGlvbnM6IG9ubHkgYWNjZXB0IG1lc3NhZ2UgY2F0ZWdvcmllcworICAgICAgaWRlbnRpZmllZCBieSB0aGVpciBmaXJzdCBsZXR0ZXIgKGVnIElSQ1dFRikgd2l0aG91dCB0aGUgbmVlZCBmb3IgY29tbWEKKyAgICAgIGFzIHNlcGFyYXRvcgorCisgICAgKiBhZGQgZXB5bGludC5iYXQgc2NyaXB0IHRvIGZpeCBXaW5kb3dzIGluc3RhbGxhdGlvbgorCisgICAgKiBzZXR1cHRvb2xzL2Vhc3lfaW5zdGFsbCBzdXBwb3J0CisKKyAgICAqIGluY2x1ZGUgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIE1hYXJ0ZW4gdGVyIEh1dXJuZSBwYXRjaCB0byBhdm9pZCBXMDYxMworICAgICAgd2FybmluZyBvbiBhcmd1bWVudHMgZnJvbSBvdmVycmlkZGVuIG1ldGhvZAorCisgICAgKiBpbXBsZW1lbnQgIzU1NzUgIGRyb3AgZHVtYiBXMDcwNCBtZXNzYWdlKSBieSBhZGRpbmcgVzA3MDQgdG8gaWdub3JlZAorICAgICAgbWVzc2FnZXMgYnkgZGVmYXVsdAorCisgICAgKiBuZXcgVzAxMDggbWVzc2FnZSwgY2hlY2tpbmcgZm9yIHN1c3BpY2lvdXMgbGFtYmRhIChwcm92aWRlZCBieSAgTmF0aGFuaWVsCisgICAgICBNYW5pc3RhKQorCisgICAgKiBmaXggVzA2MzEsIGZhbHNlIHBvc2l0aXZlIHJlcG9ydGVkIGJ5IFBhdWwgSGFjaG1hbm4KKworICAgICogZml4ICM2OTUxOiBmYWxzZSBwb3NpdGl2ZSB3aXRoIFcwMTA0CisKKyAgICAqIGZpeCAjNjk0OQorCisgICAgKiBwYXRjaGVzIGJ5IE1hZHMgS2lpbGVyaWNoOgorCisgICAgKiBpbXBsZW1lbnQgIzQ2OTEsIG1ha2UgcHlsaW50IGV4aXRzIHdpdGggYSBub24gemVybyByZXR1cm4KKyAgICAgIHN0YXR1cyBpZiBhbnkgbWVzc2FnZXMgb3RoZXIgdGhlbiBJbmZvcm1hdGlvbiBhcmUgaXNzdWVkCisKKyAgICAqIGZpeCAjMzcxMSwgIzU2MjYgKG5hbWUgcmVzb2x1dGlvbiBidWcgdy8gZGVjb3JhdG9yIGFuZCBjbGFzcyBtZW1iZXJzKQorCisgICAgKiBmaXggIzY5NTQKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjE1LjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwOC0xMC0xMworCisgICAgKiBmaXggIzU2NzI6IFcwNzA2IHdlaXJkbmVzcyAoIFcwNzA2IHJlbW92ZWQgKQorCisgICAgKiBmaXggIzU5OTg6IGRvY3VtZW50YXRpb24gcG9pbnRzIHRvIHdyb25nIHVybCBmb3IgbWFpbGluZyBsaXN0CisKKyAgICAqIGZpeCAjNjAyMjogbm8gZXJyb3IgbWVzc2FnZSBvbiB3cm9uZyBtb2R1bGUgbmFtZXMKKworICAgICogZml4ICM2MDQwOiBweXRlc3QgZG9lc24ndCBydW4gdGVzdC9mdW5jX3Rlc3QucHkKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjE1LjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwOC0wOS0xNQorCisgICAgKiBmaXggIzQ5MTA6IGRlZmF1bHQgdmFsdWVzIGFyZSBtaXNzaW5nIGluIG1hbnBhZ2UKKworICAgICogZml4ICM1OTkxOiBtaXNzaW5nIGZpbGVzIGluIDAuMTUuMCB0YXJiYWxsCisKKyAgICAqIGZpeCAjNTk5MzogZXB5bGludCBzaG91bGQgd29yayB3aXRoIHB5dGhvbiAyLjMKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjE1LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwOC0wOS0xMAorCisgICAgKiBpbmNsdWRlIHB5cmV2ZXJzZSBwYWNrYWdlIGFuZCBjbGFzcyBkaWFncmFtIGdlbmVyYXRpb24KKworICAgICogaW5jbHVkZWQgU3RlZmFuIFJhbmsncyBwYXRjaCB0byBkZWFsIHdpdGggMi40IHJlbGF0aXZlIGltcG9ydAorCisgICAgKiBpbmNsdWRlZCBSb2JlcnQgS2lya3BhdHJpY2sncyB0dXRvcmlhbCBhbmQgdHlwb3MgZml4ZXMKKworICAgICogZml4IGJ1ZyBpbiByZWVuYWJsaW5nIG1lc3NhZ2UKKworICAgICogZml4ICMyNDczOiBpbnZva2luZyBweWxpbnQgb24gX19pbml0X18ucHkgKGhvcGVmdWxseSkKKworICAgICogdHlwZWNoZWNrOiBhY3F1aXJlZC1tZW1iZXJzIG9wdGlvbiBoYXMgYmVlbiBkcm9wcGVkIGluIGZhdm9yIG9mIHRoZSBtb3JlCisgICAgICBnZW5lcmljIGdlbmVyYXRlZC1tZW1iZXJzIG9wdGlvbi4gSWYgdGhlIHpvcGUgb3B0aW9uIGlzIHNldCwgdGhlIGJlaGF2aW91cgorICAgICAgaXMgbm93IHRvIGFkZCBzb21lIGRlZmF1bHQgdmFsdWVzIHRvIGdlbmVyYXRlZC1tZW1iZXJzLgorCisgICAgKiBmbHltYWtlIGludGVncmF0aW9uOiBhZGRlZCBiaW4vZXB5bGludCBhbmQgZWxpc3AvcHlsaW50LWZseW1ha2UuZWwKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjE0LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwOC0wMS0xNAorCisgICAgKiBmaXggIzM3MzM6IE1lc3NhZ2VzIChkaXMpYXBwZWFyIGRlcGVuZGluZyBvbiBvcmRlciBvZiBmaWxlIG5hbWVzCisKKyAgICAqIGZpeCAjNDAyNjogcHlsaW50LmVsIHNob3VsZCByZXF1aXJlIGNvbXBpbGUKKworICAgICogZml4IGEgYnVnIGluIGNvbG9yaXplZCByZXBvcnRlciwgc3BvdHRlZCBieSBEYXZlIEJvcm93aXR6CisKKyAgICAqIGFwcGxpZWQgcGF0Y2ggZnJvbSBTdGVmYW4gUmFuayB0byBhdm9pZCBXMDQxMCBmYWxzZSBwb3NpdGl2ZSB3aGVuCisgICAgICBtdWx0aXBsZSAiZnJvbSBfX2Z1dHVyZV9fIiBpbXBvcnQgc3RhdGVtZW50cworCisgICAgKiBpbXBsZW1lbnQgIzQwMTI6IGZsYWcgYmFjayB0aWNrIGFzIGRlcHJlY2F0ZWQgKG5ldyBXMDMzMyBtZXNzYWdlKQorCisgICAgKiBuZXcgaWdub3JlZC1jbGFzcyBvcHRpb24gb24gdHlwZWNoZWNrIGNoZWNrZXIgYWxsb3dpbmcgdG8gc2tpcCBtZW1iZXJzCisgICAgICBjaGVja2luZyBiYXNlZCBvbiBjbGFzcyBuYW1lIChwYXRjaCBwcm92aWRlZCBieSBUaG9tYXMgVyBCYXJyKQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMTMuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDA3LTA2LTA3CisKKyAgICAqIGZpeCBkaXNhYmxlLWNoZWNrZXIgb3B0aW9uIHNvIHRoYXQgaXQgd29uJ3QgYWNjaWRlbnRhbGx5IGVuYWJsZSB0aGUKKyAgICAgIHJweXRob24gY2hlY2tlciB3aGljaCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisKKyAgICAqIGFkZGVkIG5vdGUgYWJvdXQgdGhlIGdlZGl0IHBsdWdpbiBpbnRvIGRvY3VtZW50YXRpb24KKworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMTMuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDA3LTAzLTAyCisKKyAgICAqIGZpeCBzb21lIHVuZXhwbGFpbmVkIDAuMTMuMCBwYWNrYWdpbmcgaXNzdWUgd2hpY2ggbGVkIHRvIGEgYnVuY2ggb2YKKyAgICAgIGZpbGVzIG1pc3NpbmcgZnJvbSB0aGUgZGlzdHJpYnV0aW9uCisKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjEzLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNy0wMi0yOAorCisgICAgKiBuZXcgUlB5dGhvbiAoUmVzdHJpY3RlZCBQeXRob24pIGNoZWNrZXIgZm9yIFB5UHkgZmVsbG93IG9yIHBlb3BsZQorICAgICAgd2FudGluZyB0byBnZXQgYSBjb21waWxlZCB2ZXJzaW9uIG9mIHRoZWlyIHB5dGhvbiBwcm9ncmFtIHVzaW5nIHRoZQorICAgICAgdHJhbnNsYXRvciBvZiB0aGUgUHlQeSBwcm9qZWN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBQeVB5IG9yCisgICAgICBSUHl0aG9uLCB2aXNpdCBodHRwOi8vY29kZXNwZWFrLm5ldC9weXB5LworCisgICAgKiBuZXcgRTAxMDQgYW5kIEUwMTA1IG1lc3NhZ2VzIGludHJvZHVjZWQgdG8gcmVzcGVjdGl2ZWx5IHdhcm4gYWJvdXQKKyAgICAgICJyZXR1cm4iIGFuZCAieWllbGQiIG91dHNpZGUgZnVuY3Rpb24gb3IgbWV0aG9kCisKKyAgICAqIG5ldyBFMDEwNiBtZXNzYWdlIHdoZW4gInlpZWxkIiBhbmQgInJldHVybiBzb21ldGhpbmciIGFyZSBtaXhlZCBpbiBhCisgICAgICBmdW5jdGlvbiBvciBtZXRob2QKKworICAgICogbmV3IFcwMTA3IG1lc3NhZ2UgZm9yIHVubmVjZXNzYXJ5IHBhc3Mgc3RhdGVtZW50CisKKyAgICAqIG5ldyBXMDYxNCBtZXNzYWdlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB1bnVzZWQgYGBpbXBvcnQgWGBgIGFuZAorICAgICAgdW51c2VkIGBmcm9tIFggaW1wb3J0ICpgICgjMzIwOSwgcGF0Y2ggc3VibWl0dGVkIGJ5IERhbmllbCBEcmFrZSkKKworICAgICogaW5jbHVkZWQgRGFuaWVsIERyYWtlJ3MgcGF0Y2ggdG8gaGF2ZSBhIGRpZmZlcmVudCBtZXNzYWdlIEUxMDAzIGluc3RlYWQgb2YKKyAgICAgIEUxMDAxIHdoZW4gYSBtaXNzaW5nIG1lbWJlciBpcyBmb3VuZCBidXQgYW4gaW5mZXJlbmNlIGZhaWx1cmUgaGFzIGJlZW4KKyAgICAgIGRldGVjdGVkCisKKyAgICAqIG1zdnMgcmVwb3J0ZXIgZm9yIFZpc3VhbCBTdHVkaW8gbGluZSBudW1iZXIgcmVwb3J0aW5nICgjMzI4NSkKKworICAgICogYWxsb3cgZGlzYWJsZS1hbGwgb3B0aW9uIGlubGluZSAoIzMyMTgsIHBhdGNoIHN1Ym1pdHRlZCBieSBEYW5pZWwgRHJha2UpCisKKyAgICAqIC0taW5pdC1ob29rIG9wdGlvbiB0byBjYWxsIGFyYml0cmFyeSBjb2RlIG5lY2Vzc2FyeSB0byBzZXQKKyAgICAgIGVudmlyb25tZW50IChlZyBzeXMucGF0aCkgKCMzMTU2KQorCisgICAgKiBPbmUgbW9yZSBEYW5pZWwncyBwYXRjaCBmaXhpbmcgYSBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcKKyAgICAgIHByb2JsZW0sIHRoaXMnbGwgZGVmaW5pdGVseSBiZSB0aGUgRERyYWtlIHJlbGVhc2UgOikKKworICAgICogZml4ICMzMTg0OiBjcmFzaGVzIG9uICJyZXR1cm4iIG91dHNpZGUgZnVuY3Rpb24KKworICAgICogZml4ICMzMjA1OiBXMDcwNCBmYWxzZSBwb3NpdGl2ZQorCisgICAgKiBmaXggIzMxMjM6IFcwMjEyIGZhbHNlIHBvc2l0aXZlIG9uIHN0YXRpYyBtZXRob2QKKworICAgICogZml4ICMyNDg1OiBXMDIyMiBmYWxzZSBwb3NpdGl2ZQorCisgICAgKiBmaXggIzMyNTk6IHdoZW4gYSBtZXNzYWdlIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCwgY2hlY2sgdGhlIGNoZWNrZXIKKyAgICAgIGVtaXR0aW5nIGl0IGlzIGVuYWJsZWQKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjEyLjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNi0xMS0yMworCisgICAgKiBmaXggIzMxNDM6IFcwMjMzIGJ1ZyB3LyBZRVMgb2JqZWN0cworCisgICAgKiBmaXggIzMxMTk6IE9mZi1ieS1vbmUgZXJyb3IgY291bnRpbmcgbGluZXMgaW4gYSBmaWxlCisKKyAgICAqIGZpeCAjMzExNzogZWFzZSBzeXMuc3Rkb3V0IG92ZXJyaWRpbmcgZm9yIHJlcG9ydGVycworCisgICAgKiBmaXggIzI1MDg6IEUwNjAxIGZhbHNlIHBvc2l0aXZlIHdpdGggbGFtYmRhCisKKyAgICAqIGZpeCAjMzEyNTogRTExMDEgZmFsc2UgcG9zaXRpdmUgYW5kIGEgbWVzc2FnZSBkdXBsaWNhdGlvbi4gT25seSB0aGUgbGFzdCBwYXJ0CisgICAgICBpcyBhY3R1YWxseSBmaXhlZCBzaW5jZSB0aGUgaW5pdGlhbCBmYWxzZSBwb3NpdGl2ZSBpcyBkdWUgdG8gZHluYW1pYyBzZXR0aW5nIG9mCisgICAgICBhdHRyaWJ1dGVzIG9uIHRoZSBkZWNpbWFsLkNvbnRleHQgY2xhc3MuCisKKyAgICAqIGZpeCAjMzE0OTogRTAxMDEgZmFsc2UgcG9zaXRpdmVzIGFuZCBpbnRyb2R1Y2VkIEUwMTAwIGZvciBnZW5lcmF0b3IgX19pbml0X18KKyAgICAgIG1ldGhvZHMKKworICAgICogZml4ZWQgc29tZSBmb3JtYXQgY2hlY2tlciBmYWxzZSBwb3NpdGl2ZXMKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjEyLjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworUmVsZWFzZSBkYXRlOiAyMDA2LTA5LTI1CisKKyAgICAqIGZpeGVkIHB5dGhvbiA+PSAyLjQgZm9ybWF0IGZhbHNlIHBvc2l0aXZlIHdpdGggbXVsdGlwbGUgbGluZXMgc3RhdGVtZW50CisKKyAgICAqIGZpeGVkIHNvbWUgMi41IGlzc3VlcworCisgICAgKiBmaXhlZCBnZW5lcmF0b3IgZXhwcmVzc2lvbiBzY29wZSBidWcgKGRlcGVuZHMgb24gYXN0bmcgMC4xNi4xKQorCisgICAgKiBzdG9wIHJlcXVpcmluZyBfX3JldmlzaW9uX18KKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjEyLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworUmVsZWFzZSBkYXRlOiAyMDA2LTA4LTEwCisKKyAgICAqIHVzYWJpbGl0eSBjaGFuZ2VzOgorCisgICAgICAgICogcGFyc2VhYmxlLCBodG1sIGFuZCBjb2xvciBvcHRpb25zIGFyZSBub3cgaGFuZGxlZCBieSBhIHNpbmdsZQorICAgICAgICAgIG91dHB1dC1mb3JtYXQgb3B0aW9uCisKKyAgICAgICAgKiBlbmFibGUtPGNoZWNrZXJpZD4gYW5kIGRpc2FibGUtYWxsIG9wdGlvbnMgYXJlIG5vdyBoYW5kbGVkIGJ5CisgICAgICAgICAgdHdvIChleGNsdXNpdmUpIGVuYWJsZS1jaGVja2VyIGFuZCBkaXNhYmxlLWNoZWNrZXIgb3B0aW9ucworICAgICAgICAgIHRha2luZyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNoZWNrZXIgbmFtZXMgYXMgdmFsdWUKKworICAgICAgICAqIHJlbmFtZWQgZGVidWctbW9kZSBvcHRpb24gdG8gZXJyb3JzLW9ubHkKKworICAgICogc3RhcnRlZCBhIHJlZmVyZW5jZSB1c2VyIG1hbnVhbAorCisgICAgKiBuZXcgVzAyMTIgbWVzc2FnZSBmb3IgYWNjZXNzIHRvIHByb3RlY3RlZCBtZW1iZXIgZnJvbSBjbGllbnQgY29kZQorICAgICAgKGNsb3NlICMxNDA4MSkKKworICAgICogbmV3IFcwMTA1IGFuZCBXMDEwNiBtZXNzYWdlcyBleHRyYWN0ZWQgZnJvbSBXMDEwNCAoc3RhdGVtZW50IHNlZW1zCisgICAgICB0byBoYXZlIG5vIGVmZmVjdCkgcmVzcGVjdGl2ZWx5IHdoZW4gdGhlIHN0YXRlbWVudCBpcyBhY3R1YWxseSBzdHJpbmcKKyAgICAgICh0aGF0J3Mgc29tZXRpbWVzIHVzZWQgaW5zdGVhZCBvZiBjb21tZW50cyBmb3IgZG9jdW1lbnRhdGlvbikgb3IgYW4KKyAgICAgIGVtcHR5ICBzdGF0ZW1lbnQgZ2VuZXJhdGVkIGJ5IGEgdXNlbGVzcyBzZW1pY29sb24KKworICAgICogcmVjbGFzc2lmaWVkIFcwMzAyIHRvIEMwMzAyCisKKyAgICAqIGZpeCBzbyB0aGF0IGdsb2JhbCBtZXNzYWdlcyBhcmUgbm90IGFueW1vcmUgY29ubmVjdGVkIHRvIHRoZSBsYXN0CisgICAgICBhbmFseXplZCBtb2R1bGUgKGNsb3NlICMxMDEwNikKKworICAgICogZml4IHNvbWUgYnVncyByZWxhdGVkIHRvIGxvY2FsIGRpc2FibGluZyBvZiBtZXNzYWdlcworCisgICAgKiBmaXggY3IvbGYgcGIgd2hlbiBnZW5lcmF0aW5nIHRoZSByYyBmaWxlIG9uIHdpbmRvd3MgcGxhdGZvcm1zCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4xMS4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDYtMDQtMTkKKworICAgICogZml4IGNyYXNoIGNhdXNlZCBieSB0aGUgZXhjZXB0aW9ucyBjaGVja2VyIGluIHNvbWUgY2FzZQorCisgICAgKiBmaXggc29tZSBFMTEwMSBmYWxzZSBwb3NpdGl2ZSB3aXRoIGFic3RyYWN0IG1ldGhvZCBvciBjbGFzc2VzIGRlZmluaW5nCisgICAgICBfX2dldGF0dHJfXworCisgICAgKiBkaXJ0eSBmaXggdG8gYXZvaWQgIl9zb2NrZXRvYmplY3QiIGhhcyBub3QgImNvbm5lY3QiIG1lbWJlci4gVGhlIGFjdHVhbAorICAgICAgcHJvYmxlbSBpcyB0aGF0IGFzdG5nIGlzbid0IGFibGUgdG8gdW5kZXJzdGFuZCB0aGUgY29kZSB1c2VkIHRvIGNyZWF0ZQorICAgICAgc29ja2V0LnNvY2tldCBvYmplY3Qgd2l0aCBleGVjCisKKyAgICAqIGFkZGVkIGFuIG9wdGlvbiBpbiB0aGUgc2ltaWxhcml0eSBjaGVja2VyIHRvIGlnbm9yZSBkb2NzdHJpbmdzLCBlbmFibGVkCisgICAgICBieSBkZWZhdWx0CisKKyAgICAqIGluY2x1ZGVkIHBhdGNoIGZyb20gQmVuamFtaW4gTmllbWFubiB0byBhbGxvdyBibG9jayBsZXZlbAorICAgICAgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIG1lc3NhZ2VzCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4xMC4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDYtMDMtMDYKKworICAgICogV0FSTklORywgdGhpcyByZWxlYXNlIGluY2x1ZGUgc29tZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgKHNlZSBiZWxvdyksCisgICAgICBzbyB5b3UgbWF5IGhhdmUgdG8gY2hlY2sgYW5kIHVwZGF0ZSB5b3VyIG93biBjb25maWd1cmF0aW9uIGZpbGUocykgaWYKKyAgICAgIHlvdSB1c2Ugb25lCisKKyAgICAqIHRoaXMgcmVsZWFzZSByZXF1aXJlIHRoZSAwLjE1IHZlcnNpb24gb2YgYXN0bmcgb3Igc3VwZXJpb3IgKGl0IHdpbGwgc2F2ZQorICAgICAgeW91IGEgbG90IG9mIHB5bGludCBjcmFzaGVzLi4uKQorCisgICAgKiBXMDcwNSBoYXMgYmVlbiByZWNsYXNzaWZpZWQgdG8gRTA3MDEsIGFuZCBpcyBub3cgZGV0ZWN0aW5nIG1vcmUKKyAgICAgIGluaGVyaXRpbmcgcHJvYmxlbSwgYW5kIGEgZmFsc2UgcG9zaXRpdmUgd2hlbiBlbXB0eSBleGNlcHQgY2xhdXNlIGlzCisgICAgICBmb2xsb3dpbmcgYW4gRXhjZXB0aW9uIGNhdGNoIGhhcyBiZWVuIGZpeGVkIChjbG9zZSAjMTA0MjIpCisKKyAgICAqIEUwMjEyIGFuZCBFMDIxNCAobWV0YWNsYXNzL2NsYXNzIG1ldGhvZCBzaG91bGQgaGF2ZSBtY3MvY2xzIGFzIGZpcnN0CisgICAgICBhcmd1bWVudCBoYXZlIGJlZW4gcmVjbGFzc2lmaWVkIHRvIEMwMjAyIGFuZCBDMDIwMyBzaW5jZSB0aGlzIG5vdCBhcworICAgICAgd2VsbCBlc3RhYmxpc2hlZCBhcyAic2VsZiIgZm9yIGluc3RhbmNlIG1ldGhvZCAoRTAyMTMpCisKKyAgICAqIFcwMjI0IGhhcyBiZWVuIHJlY2xhc3NpZmllZCBpbnRvIEYwMjIwIChmYWlsZWQgdG8gcmVzb2x2ZSBpbnRlcmZhY2VzCisgICAgICBpbXBsZW1lbnRlZCBieSBhIGNsYXNzKQorCisgICAgKiBhIG5ldyB0eXBlY2hlY2sgY2hlY2tlciwgaW50cm9kdWNpbmcgdGhlIGZvbGxvd2luZyBjaGVja3M6CisKKyAgICAgICAgLSBFMTEwMSwgYWNjZXNzIHRvIHVuZXhpc3RlbnQgbWVtYmVyIChpbXBsZW1lbnRzICMxMDQzMCksIHJlbW92ZQorICAgICAgICAgIHRoZSBuZWVkIG9mIEUwMjAxIGFuZCBzbyBzb21lIG9wdGlvbnMgaGFzIGJlZW4gbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgICBjbGFzc2VzIGNoZWNrZXIgdG8gdGhpcyBvbmUKKyAgICAgICAgLSBFMTEwMiwgY2FsbGluZyBhIG5vbiBjYWxsYWJsZSBvYmplY3QKKyAgICAgICAgLSBFMTExMSBhbmQgVzExMTEgd2hlbiBhbiBhc3NpZ25tZW50IGlzIGRvbmUgb24gYSBmdW5jdGlvbiBjYWxsIGJ1dCB0aGUKKyAgICAgICAgICBpbmZlcnJlZCBmdW5jdGlvbiByZXR1cm5zIE5vbmUgKGltcGxlbWVudHMgIzEwNDMxKQorCisgICAgKiBjaGFuZ2UgaW4gdGhlIGJhc2UgY2hlY2tlcjoKKworICAgICAgICAtIGNoZWNrcyBtb2R1bGUgbGV2ZWwgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZSBuYW1lcyAobmV3IGNvbnN0LXJneAorICAgICAgICAgIGFuZCBhdHRyLXJneCBjb25maWd1cmF0aW9uIG9wdGlvbikgKGltcGxlbWVudHMgIzEwMjA5ICBhbmQKKyAgICAgICAgICAjMTA0NDApCisgICAgICAgIC0gbGlzdCBjb21wcmVoZW5zaW9uIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbiB2YXJpYWJsZXMgaGF2ZSB0aGVpcgorICAgICAgICAgIG93biByZWd1bGFyIGV4cHJlc3Npb24gICh0aGUgaW5saW5ldmFyLXJneCBvcHRpb24pIChpbXBsZW1lbnRzCisgICAgICAgICAgIzkxNDYpCisgICAgICAgIC0gdGhlIEMwMTAxIGNoZWNrIHdpdGggaXRzIG1pbi1uYW1lLWxlbmd0aCBvcHRpb24gaGFzCisgICAgICAgICAgYmVlbiByZW1vdmVkICh0aGlzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHJlZ3hwIGFmdGVyIGFsbC4uLikKKyAgICAgICAgLSBXMDEwMyBhbmQgVzAxMjEgYXJlIG5vdyBoYW5kbGVkIGJ5IHRoZSB2YXJpYWJsZXMgY2hlY2tlcgorICAgICAgICAgIChXMDEwMyBpcyBub3cgVzA2MDMgYW5kIFcwNjA0IGhhcyBiZWVuIHNwbGl0dGVkIGludG8gZGlmZmVyZW50IG1lc3NhZ2VzKQorICAgICAgICAtIFcwMTMxIGFuZCBXMDEzMiBtZXNzYWdlcyAgaGF2ZSBiZWVuIHJlY2xhc3NpZmllZCB0byBDMDExMSBhbmQKKyAgICAgICAgICBDMDExMiByZXNwZWN0aXZlbHkKKyAgICAgICAgLSBuZXcgVzAxMDQgbWVzc2FnZSBvbiBzdGF0ZW1lbnQgd2l0aG91dCBlZmZlY3QKKworICAgICogcmVnZXhwIHN1cHBvcnQgZm9yIGR1bW15LXZhcmlhYmxlcyAoZHVtbXktdmFyaWFibGVzLXJneCBvcHRpb24KKyAgICAgIHJlcGxhY2UgZHVtbXktdmFyaWFibGVzKSAoaW1wbGVtZW50cyAjMTAwMjcpCisKKyAgICAqIGJldHRlciBnbG9iYWwgc3RhdGVtZW50IGhhbmRsaW5nLCBzZWUgVzA2MDIsIFcwNjAzLCBXMDYwNCBtZXNzYWdlcworICAgICAgKGltcGxlbWVudHMgIzEwMzQ0IGFuZCAjMTAyMzYpCisKKyAgICAqIC0tZGVidWctbW9kZSBvcHRpb24sIGRpc2FibGluZyBhbGwgY2hlY2tlcnMgd2l0aG91dCBlcnJvciBtZXNzYWdlCisgICAgICBhbmQgZmlsdGVyaW5nIG90aGVycyB0byBvbmx5IGRpc3BsYXkgZXJyb3IKKworICAgICogZml4ZWQgc29tZSBSMDIwMSAobWV0aG9kIGNvdWxkIGJlIGEgZnVuY3Rpb24pIGZhbHNlIHBvc2l0aXZlCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC45LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNi0wMS0xMAorCisgICAgKiBhIGxvdCBvZiB1cGRhdGVzIHRvIGZvbGxvdyBhc3RuZyAwLjE0IEFQSSBjaGFuZ2VzLCBzbyBpbnN0YWxsCisgICAgICBsb2dpbGFiLWFzdG5nICAwLjE0IG9yIGdyZWF0ZXIgYmVmb3JlIHVzaW5nIHRoaXMgdmVyc2lvbiBvZiBweWxpbnQKKworICAgICogY2hlY2tlciBudW1iZXIgMTAgISBuZXdzdHlsZSB3aWxsIHNlYXJjaCBmb3IgcHJvYmxlbXMgcmVnYXJkaW5nIG9sZAorICAgICAgc3R5bGUgLyBuZXcgc3R5bGUgY2xhc3NlcyB1c2FnZSBwcm9ibGVtcyAocmVseSBvbiBhc3RuZyAwLjE0IG5ldworICAgICAgc3R5bGUgZGV0ZWN0aW9uIGZlYXR1cmUpCisKKyAgICAqIG5ldyAnbG9hZC1wbHVnaW5zJyBvcHRpb25zIHRvIGxvYWQgYWRkaXRpb25hbCBweWxpbnQgcGx1Z2lucyAodXNhYmxlCisgICAgICBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZSkgKGltcGxlbWVudHMKKyAgICAgICMxMDAzMSkKKworICAgICogY2hlY2sgaWYgYSAicHlsaW50cmMiIGZpbGUgZXhpc3RzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CisgICAgICBiZWZvcmUgdXNpbmcgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIFBZTElOVFJDIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICBvciB0aGUgZGVmYXVsdCB+Ly5weWxpbnRyYyBvciAvZXRjL3B5bGludHJjCisKKyAgICAqIGZpeGVkIFcwNzA2IChJZGVudGlmaWVyIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGlzIGFzc2lnbmVkLi4uKQorICAgICAgZmFsc2UgcG9zaXRpdmUgYW5kIHJlcmFpc2luZyBhIGNhdGNoZWQgZXhjZXB0aW9uIGluc3RhbmNlCisKKyAgICAqIGZpeGVkIEUwNjExIChObyBuYW1lIGdldCBpbiBtb2R1bGUgYmxhYmxhKSBmYWxzZSBwb3NpdGl2ZSB3aGVuIGFjY2Vzc2luZworICAgICAgdG8gYSBjbGFzcydfX2RpY3RfXworCisgICAgKiBmaXhlZCBzb21lIEUwMjAzICgiYWNjZXNzIHRvIG1lbWJlciBiZWZvcmUgaXRzIGRlZmluaXRpb24iKSBmYWxzZQorICAgICAgcG9zaXRpdmUKKworICAgICogZml4ZWQgRTAyMTQgKCJtZXRhY2xhc3MgbWV0aG9kIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBtY3MpIGZhbHNlCisgICAgICBwb3NpdGl2ZSB3aXRoIHN0YXRpY21ldGhvZCB1c2VkIG9uIGEgbWV0YWNsYXNzCisKKyAgICAqIGZpeGVkIHBhY2thZ2luZyB3aGljaCB3YXMgbWlzc2luZyB0aGUgdGVzdC9yZWdydGVzdF9kYXRhIGRpcmVjdG9yeQorCisgICAgKiBXMDIxMiAobWV0aG9kIGNvdWxkIGJlIGEgZnVuY3Rpb24pIGhhcyBiZWVuIHJlY2xhc3NpZmllZCBpbiB0aGUKKyAgICAgIFJFRkFDVE9SIGNhdGVnb3J5IGFzIFIwMjAxLCBhbmQgaXMgbm8gbW9yZSBjb25zaWRlcmVyIHdoZW4gYSBtZXRob2QKKyAgICAgIG92ZXJyaWRlcyBhbiBhYnN0cmFjdCBtZXRob2QgZnJvbSBhbiBhbmNlc3RvciBjbGFzcworCisgICAgKiBpbmNsdWRlIG1vZHVsZSBuYW1lIGluIFcwNDAxICh3aWxkY2FyZCBpbXBvcnQpLCBhcyBzdWdnZXN0ZWQgYnkKKyAgICAgIEFtYXVyeQorCisgICAgKiB3aGVuIHVzaW5nIHRoZSAnLS1wYXJzZWFibGUnLCBwYXRoIGFyZSB3cml0dGVuIHJlbGF0aXZlIHRvIHRoZQorICAgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiBpbiBhIHN1Yi1kaXJlY3Rvcnkgb2YgaXQgKCM5Nzg5KQorCisgICAgKiAncHlsaW50IC0tdmVyc2lvbicgc2hvd3MgbG9naWxhYi1hc3RuZyBhbmQgbG9naWxhYi1jb21tb24gdmVyc2lvbnMKKworICAgICogZml4ZWQgcHlsaW50LmVsIHRvIGhhbmRsZSBzcGFjZSBpbiBmaWxlIG5hbWVzCisKKyAgICAqIG1pc2MgbGludCBzdHlsZSBmaXhlcworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuOC4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1JlbGVhc2UgZGF0ZTogMjAwNS0xMS0wNworCisgICAgKiBmaXggImRlcHJlY2F0ZWQgbW9kdWxlIiBmYWxzZSBwb3NpdGl2ZSB3aGVuIHRoZSBjb2RlIGltcG9ydHMgYQorICAgICAgbW9kdWxlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkZXByZWNhdGVkIG1vZHVsZSdzIG5hbWUgKGNsb3NlCisgICAgICAjMTAwNjEpCisKKyAgICAqIGZpeCAibW9kdWxlIGhhcyBubyBuYW1lIF9fZGljdF9fIiBmYWxzZSBwb3NpdGl2ZSAoY2xvc2UgIzEwMDM5KQorCisgICAgKiBmaXggImFjY2VzcyB0byB1bmRlZmluZWQgdmFyaWFibGUgX19wYXRoX18iIGZhbHNlIHBvc2l0aXZlIChjbG9zZQorICAgICAgIzEwMDY1KQorCisgICAgKiBmaXggImV4cGxpY2l0IHJldHVybiBpbiBfX2luaXRfXyIgZmFsc2UgcG9zaXRpdmUgd2hlbiByZXR1cm4gaXMKKyAgICAgIGFjdHVhbGx5IGluIGFuIGlubmVyIGZ1bmN0aW9uIChjbG9zZSAjMTAwNzUpCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC44LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNS0xMC0yMQorCisgICAgKiBjaGVjayBuYW1lcyBpbXBvcnRlZCBmcm9tIGEgbW9kdWxlIGV4aXN0cyBpbiB0aGUgbW9kdWxlIChFMDYxMSksCisgICAgICBwYXRjaCBjb250cmlidXRlZCBieSBBbWF1cnkgRm9yZ2VvdCBkJ0FyYworCisgICAgKiBwcmludCBhIHdhcm5pbmcgKFcwMjEyKSBmb3IgbWV0aG9kcyB0aGF0IGNvdWxkIGJlIGEgZnVuY3Rpb24KKyAgICAgIChpbXBsZW1lbnRzICM5MTAwKQorCisgICAgKiBuZXcgLS1kZWZpbmluZy1hdHRyLW1ldGhvZHMgb3B0aW9uIG9uIGNsYXNzZXMgY2hlY2tlcgorCisgICAgKiBuZXcgLS1hY3F1aXJlZC1tZW1iZXJzIG9wdGlvbiBvbiB0aGUgY2xhc3NlcyBjaGVja2VyLCB1c2VkIHdoZW4KKyAgICAgIC0tem9wZT15ZXMgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUgb24gYWNxdWlyZWQgYXR0cmlidXRlcyAobGlzdGVkCisgICAgICB1c2luZyB0aGlzIG5ldyBvcHRpb24pIChjbG9zZSAjODYxNikKKworICAgICogZ2VuZXJhdGUgb25lIEUwNjAyIGZvciBlYWNoIHVzZSBvZiBhbiB1bmRlZmluZWQgdmFyaWFibGUKKyAgICAgIChwcmV2aW91c2x5LCBvbmx5IG9uZSBmb3IgdGhlIGZpcnN0IHVzZSBidXQgbm90IGZvciB0aGUgZm9sbG93aW5nKQorICAgICAgKGltcGxlbWVudHMgIzEwMDApCisKKyAgICAqIG1ha2UgcHJvZmlsZSBvcHRpb24gc2F2ZWFibGUKKworICAgICogZml4IFdpbmRvd3MgLmJhdCBmaWxlLCAgcGF0Y2ggY29udHJpYnV0ZWQgYnkgQW1hdXJ5IEZvcmdlb3QgZCdBcmMKKworICAgICogZml4IG9uZSBtb3JlIGZhbHNlIHBvc2l0aXZlIGZvciBFMDYwMSAoYWNjZXNzIGJlZm9yZSBkZWZpbml0aW9uKQorICAgICAgd2l0aCBmb3IgbG9vcCBzdWNoIGFzICJmb3IgaSBpbiByYW5nZSgxMCk6IHByaW50IGkiICh0ZXN0CisgICAgICBmdW5jX25vZXJyb3JfZGVmaW5lZF9hbmRfdXNlZF9vbl9zYW1lX2xpbmUpCisKKyAgICAqIGZpeCBmYWxzZSBwb3NpdGl2ZSBmb3IgRTAyMDEgKHVuZGVmaW5lZCBtZW1iZXIpIHdoZW4gYWNjZXNzaW5nIHRvCisgICAgICBfX25hbWVfXyBvbiBhIGNsYXNzIG9iamVjdAorCisgICAgKiBmaXggYXN0bmcgY2hlY2tlcnMgdHJhdmVyc2FsIG9yZGVyCisKKyAgICAqIGZpeCBidWcgaW4gZm9ybWF0IGNoZWNrZXIgd2hlbiBwYXJzaW5nIGEgZmlsZSBmcm9tIGEgcGxhdGZvcm0KKyAgICAgIHVzaW5nIGRpZmZlcmVudCBuZXcgbGluZSBjaGFyYWN0ZXJzIChjbG9zZSAjOTIzOSkKKworICAgICogZml4IGVuY29kaW5nIGRldGVjdGlvbiByZWdleHAKKworICAgICogZml4IC0tcmNmaWxlIGhhbmRsaW5nIChzdXBwb3J0IGZvciAtLXJjZmlsZT1maWxlLCBjbG9zZSAjOTU5MCkKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjcuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitSZWxlYXNlIGRhdGU6IDIwMDUtMDUtMjcKKworICAgICogV0FSTklORzogcHlsaW50IGlzIG5vIGxvbmdlciBhIGxvZ2lsYWIgc3VicGFja2FnZS4gVXNlcnMgbWF5IGhhdmUgdG8KKyAgICAgIG1hbnVhbGx5IHJlbW92ZSB0aGUgb2xkIGxvZ2lsYWIvcHlsaW50IGRpcmVjdG9yeS4KKworICAgICogaW50cm9kdWNlIGEgbmV3IC0tYWRkaXRpb25hbC1idWlsdGlucyBvcHRpb24gdG8gaGFuZGxlIHVzZXIgZGVmaW5lZAorICAgICAgYnVpbHRpbnMKKworICAgICogLS1yZXBvcnRzIG9wdGlvbiBoYXMgbm93IC1yIGFzIHNob3J0IGFsaWFzLCBhbmQgLWkgZm9yIC0taW5jbHVkZS1pZHMKKworICAgICogZml4IGEgYnVnIGluIHRoZSB2YXJpYWJsZXMgY2hlY2tlciB3aGljaCBtYXkgY2F1c2luZyBzb21lIGZhbHNlCisgICAgICBwb3NpdGl2ZXMgd2hlbiB2YXJpYWJsZXMgYXJlIGRlZmluZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBzYW1lCisgICAgICBzdGF0ZW1lbnQgKHRlc3QgZnVuY19ub2Vycm9yX2RlZmluZWRfYW5kX3VzZWRfb25fc2FtZV9saW5lKQorCisgICAgKiB0aGlzIHRpbWUsIHJlYWwgZml4IG9mIHRoZSAiZGlzYWJsZS1tc2cgaW4gdGhlIGNvbmZpZyBmaWxlIiBwcm9ibGVtLAorICAgICAgdGVzdCBhZGRlZCB0byB1bml0dGVzdF9saW50CisKKyAgICAqIGZpeCBidWcgd2l0aCAtLWxpc3QtbWVzc2FnZXMgYW5kIHB5dGhvbiAtT08KKworICAgICogZml4IHBvc3NpYmxlIGZhbHNlIHBvc2l0aXZlIGZvciBXMDIwMQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuNi40PworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworUmVsZWFzZSBkYXRlOiAyMDA1LTA0LTE0CisKKyAgICAqIGFsbG93IHRvIHBhcnNlIGZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9uIHdoZW4gYSBwYXRoIGlzIGdpdmVuIG9uIHRoZQorICAgICAgY29tbWFuZCBsaW5lICh0ZXN0IG5vZXh0KQorCisgICAgKiBkb24ndCBmYWlsIGlmIHdlIGFyZSB1bmFibGUgdG8gcmVhZCBhbiBpbmxpbmUgb3B0aW9uICAoZS5nLiBpbnNpZGUgYQorICAgICAgbW9kdWxlKSwganVzdCBwcm9kdWNlIGFuIGluZm9ybWF0aW9uIG1lc3NhZ2UgKHRlc3QgZnVuY19pMDAxMCkKKworICAgICogbmV3IG1lc3NhZ2UgRTAxMDMgZm9yIGJyZWFrIG9yIGNvbnRpbnVlIG91dHNpZGUgbG9vcCAoY2xvc2UgIzg4ODMsCisgICAgICB0ZXN0IGZ1bmNfY29udGludWVfbm90X2luX2xvb3ApCisKKyAgICAqIGZpeCBidWcgaW4gdGhlIHZhcmlhYmxlcyBjaGVja2VyLCBjYXVzaW5nIG5vbiBkZXRlY3Rpb24gb2Ygc29tZQorICAgICAgYWN0dWFsIG5hbWUgZXJyb3IgKGNsb3NlICM4ODg0LCB0ZXN0CisgICAgICBmdW5jX25hbWVlcnJvcl9vbl9zdHJpbmdfc3Vic3RpdHV0aW9uKQorCisgICAgKiBmaXggYnVnIGluIHRoZSBjbGFzc2VzIGNoZWNrZXIgd2hpY2ggd2FzIG1ha2luZyBweWxpbnQgY3Jhc2ggaWYKKyAgICAgICJvYmplY3QiIGlzIGFzc2lnbmVkIGluIGEgY2xhc3MgaW5oZXJpdGluZyBmcm9tIGl0ICh0ZXN0CisgICAgICBmdW5jX25vZXJyb3Jfb2JqZWN0X2FzX2NsYXNzX2F0dHJpYnV0ZSkKKworICAgICogZml4IHByb2JsZW0gd2l0aCB0aGUgc2ltaWxhciBjaGVja2VyIHdoZW4gcmVsYXRlZCBvcHRpb25zIGFyZQorICAgICAgZGVmaW5lZCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZQorCisgICAgKiBuZXcgLS1nZW5lcmF0ZS1tYW4gb3B0aW9uIHRvIGdlbmVyYXRlIHB5bGludCdzIG1hbiBwYWdlIChyZXF1aXJlIHRoZQorICAgICAgbGF0ZXN0IGxvZ2lsYWIuY29tbW9uICg+PSAwLjkuMykKKworICAgICogcGFja2FnZWQgKGdlbmVyYXRlZC4uLikgbWFuIHBhZ2UKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjYuMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDUtMDItMjQKKworICAgICogZml4IHNjb3BlIHByb2JsZW0gd2hpY2ggbWF5IGNhdXNlIGZhbHNlIHBvc2l0aXZlIGFuZCB0cnVlIG5lZ2F0aXZlCisgICAgICBvbiBFMDYwMgorCisgICAgKiBmaXggcHJvYmxlbSB3aXRoIHNvbWUgb3B0aW9ucyBzdWNoIGFzIGRpc2FibGUtbXNnIGNhdXNpbmcgZXJyb3Igd2hlbgorICAgICAgdGhleSBhcmUgY29taW5nIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuNi4yPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1JlbGVhc2UgZGF0ZTogMjAwNS0wMi0xNgorCisgICAgKiBmaXggZmFsc2UgcG9zaXRpdmUgb24gRTAyMDEgKCJhY2Nlc3MgdG8gdW5kZWZpbmVkIG1lbWJlciIpIHdpdGgKKyAgICAgIG1ldGFjbGFzc2VzCisKKyAgICAqIGZpeCBmYWxzZSBwb3NpdGl2ZSBvbiBFMDIwMyAoImFjY2VzcyB0byBtZW1iZXIgYmVmb3JlIGl0cworICAgICAgZGVmaW5pdGlvbiIpIHdoZW4gYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBhIHBhcmVudCBjbGFzcworCisgICAgKiBmaXggZmFsc2UgcG9zaXRpdmUgb24gVzA3MDYgKCJpZGVudGlmaWVyIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICBhc3NpZ25lZCB0by4uLiIpCisKKyAgICAqIGZpeCBpbnRlcnByZXRhdGlvbiBvZiAiXHQiIGFzIHZhbHVlIGZvciB0aGUgaW5kZW50LXN0cmluZworICAgICAgY29uZmlndXJhdGlvbiB2YXJpYWJsZQorCisgICAgKiBmaXggLS1yY2ZpbGUgc28gdGhhdCAtLXJjZmlsZT1weWxpbnRyYyAob25seSAtLXJjZmlsZSBweWxpbnRyYyB3YXMKKyAgICAgIHdvcmtpbmcgaW4gZWFybGllciByZWxlYXNlKQorCisgICAgKiBuZXcgcmF3IGNoZWNrZXIgZXhhbXBsZSBpbiB0aGUgZXhhbXBsZXMvIGRpcmVjdG9yeQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuNi4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNS0wMi0wNAorCisgICAgKiBuZXcgLS1yY2ZpbGUgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aXRob3V0IHRoZQorICAgICAgUFlMSU5UUkMgZW52aXJvbm1lbnQgdmFyaWFibGUKKworICAgICogYWRkZWQgYW4gZXhhbXBsZSBtb2R1bGUgZm9yIGEgY3VzdG9tIHB5bGludCBjaGVja2VyIChzZWUgdGhlCisgICAgICBleGFtcGxlLyBkaXJlY3RvcnkpCisKKyAgICAqIHNvbWUgZml4ZXMgdG8gaGFuZGxlIGZpeGVzIGluIGNvbW1vbiAwLjkuMSAoc2hvdWxkIGhvd2V2ZXIgc3RpbGwgd29ya2luZworICAgICAgd2l0aCBjb21tb24gMC45LjAsIGV2ZW4gaWYgdXBncmFkZSBpcyByZWNvbW1lbmRlZCkKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjYuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDUtMDEtMjAKKworICAgICogcmVmaXggcHlsaW50IGVtYWNzIG1vZGUKKworICAgICogbm8gbW9yZSB0cmFjZWJhY2sgd2hlbiBqdXN0IHR5cGluZyAicHlsaW50IgorCisgICAgKiBmaXggYSBidWcgd2hpY2ggbWF5IGNhdXNlIGNyYXNoZXMgb24gcmVzb2x2aW5nIHBhcmVudCBjbGFzc2VzCisKKyAgICAqIGZpeCBwcm9ibGVtcyB3aXRoIHRoZSBmb3JtYXQgY2hlY2tlcjogZG9uJ3QgY2hvY2sgb24gZmlsZXMKKyAgICAgIGNvbnRhaW5pbmcgbXVsdGlwbGUgQ1IsIGF2b2lkIEMwMzIyLCBDMDMyMywgQzAzMjQgZmFsc2UgcG9zaXRpdmVzCisgICAgICB3aXRoIHRyaXBsZSBxdW90ZWQgc3RyaW5nIHdpdGggcXVvdGUgaW5zaWRlCisKKyAgICAqIGNvcnJlY3RseSBkZXRlY3QgYWNjZXNzIHRvIG1lbWJlciBkZWZpbmVkIGxhdHRlciBpbiBfX2luaXRfXyBtZXRob2QKKworICAgICogbm93IGRlcGVuZHMgb24gY29tbW9uIDAuOC4xIHRvIGZpeCBwcm9ibGVtIHdpdGggaW50ZXJmYWNlIHJlc29sdXRpb24KKyAgICAgIChjbG9zZSAjODYwNikKKworICAgICogbmV3IC0tbGlzdC1tc2dzIG9wdGlvbiBkZXNjcmliaW5nIGF2YWlsYWJsZSBjaGVja2VycyBhbmQgdGhlaXIKKyAgICAgIG1lc3NhZ2VzCisKKyAgICAqIGFkZGVkIHdpbmRvd3Mgc3BlY2lmaWMgZG9jdW1lbnRhdGlvbiB0byB0aGUgUkVBRE1FIGZpbGUsIGNvbnRyaWJ1dGVkCisgICAgICBieSBCcmlhbiB2YW4gZGVuIEJyb2VrCisKKyAgICAqIHVwZGF0ZWQgZG9jL2ZlYXR1cmVzLnR4dCAoYWN0dWFsbHkgdGhpcyBmaWxlIGlzIG5vdyBnZW5lcmF0ZWQgdXNpbmcKKyAgICAgIHRoZSAtLWxpc3QtbXNncyBvcHRpb24pLCBtb3JlIGVudHJpZXMgaW50byB0aGUgRkFRCisKKyAgICAqIGltcHJvdmVkIHRlc3RzIGNvdmVyYWdlCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC41LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZWFzZSBkYXRlOiAyMDA0LTEwLTE5CisKKyAgICAqIGF2b2lkIGltcG9ydGluZyBhbmFseXplZCBtb2R1bGVzICEKKworICAgICogbmV3IFJlZmFjdG9yIGFuZCBDb252ZW50aW9uIG1lc3NhZ2UgY2F0ZWdvcmllcy4gU29tZSBXYXJuaW5ncyBoYXZlIGJlZW4KKyAgICAgIHJlbWFwZWQgaW50byB0aG9zZSBuZXcgY2F0ZWdvcmllcworCisgICAgKiBhZGRlZCAic2ltaWxhciIsIGEgdG9vbCB0byBmaW5kIGNvcGllZCBhbmQgcGFzdGVkIGxpbmVzIG9mIGNvZGUsCisgICAgICBib3RoIHVzaW5nIGEgc3BlY2lmaWMgY29tbWFuZCBsaW5lIHRvb2wgYW5kIGludGVncmF0ZWQgYXMgYQorICAgICAgcHlsaW50J3MgY2hlY2tlcgorCisgICAgKiBpbXBvcnRzIGNoZWNrZXIgbWF5IHJlcG9ydCBpbXBvcnQgZGVwZW5kZW5jaWVzIGFzIGEgZG90IGdyYXBoCisKKyAgICAqIG5ldyBjaGVja2VyIHJlZ3JvdXBpbmcgbW9zdCBSZWZhY3RvciBkZXRlY3Rpb24gKHdpdGggc29tZSBuZXcgbWV0cmljcykKKworICAgICogbW9yZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBzdG9yYWJsZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisKKyAgICAqIGZpeCBidWcgd2l0aCB0b3RhbCAvIHVuZG9jdW1lbnRlZCBudW1iZXIgb2YgbWV0aG9kcworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuNC4yPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNC0wNy0wOAorCisgICAgKiBmaXggcHlsaW50IGVtYWNzIG1vZGUKKworICAgICogZml4IGNsYXNzZXMgY2hlY2tlcnMgdG8gaGFuZGxlciB0d2lzdGVkIGludGVyZmFjZXMKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjQuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDQtMDUtMTQKKworICAgICogZml4IHRoZSBzZXR1cC5weSBzY3JpcHQgdG8gYWxsb3cgYmRpc3Rfd2luc3QgKHdlbGwsIHRoZSBnZW5lcmF0ZWQKKyAgICAgIGluc3RhbGxlciBoYXMgbm90IGJlZW4gdGVzdGVkLi4uKSB3aXRoIHRoZSBuZWNlc3NhcnkKKyAgICAgIGxvZ2lsYWIvX19pbml0X18ucHkgZmlsZQorCisgICAgKiBmaXggZmlsZSBuYW1pbmcgY29udmVudGlvbiBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBBbW9yb3NvCisKKyAgICAqIGZpeCBzdHVwaWQgY3Jhc2ggYnVnIHdpdGggYmFkIG1ldGhvZCBuYW1lcworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuNC4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwNC0wNS0xMAorCisgICAgKiBmaXggZmlsZSBwYXRoIHdpdGggLS1wYXJzYWJsZQorCisgICAgKiAtLXBhcnNhYmxlIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIC0tcGFyc2VhYmxlCisKKyAgICAqIGFkZGVkIHBhdGNoIGZyb20gQW5kcmVhcyBBbW9yb3NvIHRvIG91dHB1dCBtZXNzYWdlIHRvIGZpbGVzIGluc3RlYWQKKyAgICAgIG9mIHN0YW5kYXJkIG91dHB1dAorCisgICAgKiBhZGRlZCBSdW4gdG8gdGhlIGxpc3Qgb2YgY29ycmVjdCB2YXJpYWJsZSBuYW1lcworCisgICAgKiBmaXggdmFyaWFibGUgbmFtZXMgcmVnZXhwIGFuZCBjaGVja2luZyBvZiBsb2NhbCBjbGFzc2VzIG5hbWVzCisKKyAgICAqIHNvbWUgYmFzaWMgaGFuZGxpbmcgb2YgbWV0YWNsYXNzZXMKKworICAgICogbm8tZG9jc3RyaW5nLXJneCBhcHBseSBub3cgb24gY2xhc3NlcyB0b28KKworICAgICogbmV3IG9wdGlvbiB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IHJlZ2V4cCBmb3IgbWV0aG9kcyB0aGFuIGZvcgorICAgICAgZnVuY3Rpb25zCisKKyAgICAqIGRvIG5vdCBkaXNwbGF5IHRoZSBldmFsdWF0aW9uIHJlcG9ydCB3aGVuIG5vIHN0YXRlbWVudHMgaGFzIGJlZW4KKyAgICAgIGFuYWx5c2VkCisKKyAgICAqIGZpeGVkIGNyYXNoIHdpdGggYSBjbGFzcyBuZXN0ZWQgaW4gYSBtZXRob2QKKworICAgICogZml4ZWQgZm9ybWF0IGNoZWNrZXIgdG8gZGVhbHMgd2l0aCB0cmlwbGUgcXVvdGVkIHN0cmluZyBhbmQKKyAgICAgIGxpbmVzIHdpdGggY29kZSBhbmQgY29tbWVudCBtaXhlZAorCisgICAgKiB1c2UgbG9naWxhYi5jb21tb24udXJlcG9ydHMgdG8gbGF5b3V0IHJlcG9ydHMKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjMuMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDQtMDItMTcKKworICAgICogYWRkZWQgYSBwYXJzYWJsZSB0ZXh0IG91dHB1dCwgdXNlZCB3aGVuIHRoZSAtLXBhcnNhYmxlIG9wdGlvbiBpcworICAgICAgcHJvdmlkZWQKKworICAgICogYWRkZWQgYW4gZW1hY3MgbW9kZSB1c2luZyB0aGlzIG91dHB1dCwgYXZhaWxhYmxlIGluIHRoZSBkaXN0cmliJ3MKKyAgICAgIGVsaXNwIGRpcmVjdG9yeQorCisgICAgKiBmaXhlZCBzb21lIHR5cG9zIGluIG1lc3NhZ2VzCisKKyAgICAqIGNoYW5nZSBpbmNsdWRlLWlkcyBvcHRpb25zIHRvIHluLCBhbmQgYWxsb3cgaXQgdG8gYmUgaW4gdGhlCisgICAgICBjb25maWd1cmF0aW9uIGZpbGUKKworICAgICogZG8gbm90IGNob2NrIG9uIGNvcnJ1cHRlZCBzdGF0cyBmaWxlcworCisgICAgKiBmaXhlZCBidWcgaW4gdGhlIGZvcm1hdCBjaGVja2VyIHdoaWNoIG1heSBzdG9wIHB5bGludCBleGVjdXRpb24KKworICAgICogcHJvdmlkZSBzY3JpcHRzIGZvciB1bml4IGFuZCB3aW5kb3dzIHRvIHdyYXAgdGhlIG1pbmltYWwgcHlsaW50IHRrCisgICAgICBndWkKKworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMy4yPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAwMy0xMi0yMworCisgICAgKiBodG1sLWVzY2FwZSBtZXNzYWdlcyBpbiB0aGUgSFRNTCByZXBvcnRlciAoYnVnIHJlcG9ydGVkIGJ5IEp1ZXJnZW4KKyAgICAgIEhlcm1hbm4pCisKKyAgICAqIGFkZGVkICJUT0RPIiB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG5vdGUgdGFncworCisgICAgKiBhZGRlZCAicmV4ZWMiIHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZGVwcmVjYXRlZCBtb2R1bGVzCisKKyAgICAqIGZpeGVkIHR5cG9zIGluIHNvbWUgbWVzc2FnZXMKKworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMy4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworUmVsZWFzZSBkYXRlOiAyMDAzLTEyLTA1CisKKyAgICAqIGJ1ZyBmaXggaW4gZm9ybWF0IGFuZCBjbGFzc2VzIGNoZWNrZXJzCisKKyAgICAqIHJlbW92ZSBwcmludCBzdGF0ZW1lbnQgZnJvbSBpbXBvcnRzIGNoZWNrZXJzCisKKyAgICAqIHByb3ZpZGUgYSBzaW1wbGUgdGsgZ3VpLCBlc3NlbnRpYWxseSB1c2VmdWwgZm9yIHdpbmRvd3MgdXNlcnMKKworCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMy4wPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworUmVsZWFzZSBkYXRlOiAyMDAzLTExLTIwCisKKyAgICAqIG5ldyBleGNlcHRpb25zIGNoZWNrZXIsIGNoZWNraW5nIGZvciBzdHJpbmcgZXhjZXB0aW9uIGFuZCBlbXB0eQorICAgICAgZXhjZXB0IGNsYXVzZXMuCisKKyAgICAqIGltcG9ydHMgY2hlY2tlciBjaGVja3MgZm9yIHJlaW1wb3J0IG9mIG1vZHVsZXMKKworICAgICogY2xhc3NlcyBjaGVja2VyIGNoZWNrcyBmb3IgY2FsbHMgdG8gYW5jZXN0b3IncyBfX2luaXRfXyBhbmQgYWJzdHJhY3QKKyAgICAgIG1ldGhvZCBub3Qgb3ZlcnJpZGRlbi4gSXQgZG9lc24ndCBjb21wbGFpbiBhbnltb3JlIGZvciB1bnVzZWQgaW1wb3J0IGluCisgICAgICBfX2luaXRfXyBmaWxlcywgYW5kIHByb3ZpZGVzIGEgbmV3IG9wdGlvbiBpZ25vcmUtaW50ZXJmYWNlLW1ldGhvZHMsCisgICAgICB1c2VmdWwgd2hlbiB5b3UncmUgdXNpbmcgem9wZSBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gaW4geW91ciBwcm9qZWN0CisKKyAgICAqIGJhc2UgY2hlY2tlciBjaGVja3MgZm9yIGRpc2FsbG93ZWQgYnVpbHRpbnMgY2FsbCAoY29udHJvbGxlZCBieSB0aGUKKyAgICAgIGJhZC1mdW5jdGlvbnMgb3B0aW9uKSBhbmQgZm9yIHVzZSBvZiAqIGFuZCAqKgorCisgICAgKiBmb3JtYXQgY2hlY2tlciBjaGVja3MgZm9yIHVzZSBvZiA8PiBhbmQgImwiIGFzIGxvbmcgaW50IG1hcmtlcgorCisgICAgKiBtYWpvciBpbnRlcm5hbCBBUEkgY2hhbmdlcworCisgICAgKiB1c2UgdGhlIHJld3JpdGUgb2YgYXN0bmcsIGJhc2VkIG9uIGNvbXBpbGVyLmFzdAorCisgICAgKiBhZGRlZCB1bmlxdWUgaWQgZm9yIG1lc3NhZ2VzLCBhcyBzdWdnZXN0ZWQgYnkgV29sZmdhbmcgR3JhZmVuCisKKyAgICAqIGFkZGVkIHVuaXF1ZSBpZCBmb3IgcmVwb3J0cworCisgICAgKiBjYW4gdGFrZSBtdWx0aXBsZSBtb2R1bGVzIG9yIGZpbGVzIGFzIGFyZ3VtZW50CisKKyAgICAqIG5ldyBvcHRpb25zIGNvbW1hbmQgbGluZSBvcHRpb25zIDogLS1kaXNhYmxlLW1zZywgLS1lbmFibGUtbXNnLAorICAgICAgLS1oZWxwLW1zZywgLS1pbmNsdWRlLWlkcywgLS1yZXBvcnRzLCAtLWRpc2FibGUtcmVwb3J0LCAtLWNhY2hlLXNpemUKKworICAgICogLS12ZXJzaW9uIHNob3dzIHRoZSB2ZXJzaW9uIG9mIHRoZSBweXRob24gaW50ZXJwcmV0ZXIKKworICAgICogcmVtb3ZlZCBzb21lIG9wdGlvbnMgd2hpY2ggYXJlIG5vdyByZXBsYWNlZCBieSBbZW58ZGlzXWFibGUtbXNnLCBvcgorICAgICAgZGlzYWJsZS1yZXBvcnQKKworICAgICogcmVhZCBkaXNhYmxlLW1zZyBhbmQgZW5hYmxlLW1zZyBvcHRpb25zIGluIHNvdXJjZSBmaWxlcyAoc2hvdWxkIGJlCisgICAgICBpbiBjb21tZW50cyBvbiB0aGUgdG9wIG9mIHRoZSBmaWxlLCBpbiB0aGUgZm9ybQorICAgICAgIiMgcHlsaW50OiBkaXNhYmxlLW1zZz1XMDQwMiIKKworICAgICogbmV3IG1lc3NhZ2UgZm9yIG1vZHVsZXMgaW1wb3J0aW5nIHRoZW1zZWx2ZXMgaW5zdGVhZCBvZiB0aGUgImN5Y2xpYworICAgICAgaW1wb3J0IiBtZXNzYWdlCisKKyAgICAqIGZpeCBidWcgd2l0aCByZWxhdGl2ZSBhbmQgY3ljbGljIGltcG9ydHMKKworICAgICogZml4IGJ1ZyBpbiBpbXBvcnRzIGNoZWNrZXIgKGN5Y2xlIHdhcyBub3QgYWx3YXlzIGRldGVjdGVkKQorCisgICAgKiBzdGlsbCBmaXhlcyBpbiBmb3JtYXQgY2hlY2tlciA6IGRvbid0IGNoZWNrIGNvbW1lbnQgYW5kIGRvY3N0cmluZywKKyAgICAgIGNoZWNrIGZpcnN0IGxpbmUgYWZ0ZXIgYW4gaW5kZW50CisKKyAgICAqIGFsbG93ZWQvcHJvaGliaXRlZCBuYW1lcyBub3cgYXBwbHkgdG8gYWxsIGlkZW50aWZpZXJzLCBub3Qgb25seQorICAgICAgdmFyaWFibGVzLCAgc28gY2hhbmdlZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gZnJvbQorICAgICAgKGdvb2R8YmFkKS12YXJpYWJsZS1uYW1lcyB0byAoZ29vZHxiYWQpLW5hbWVzCisKKyAgICAqIGFkZGVkIHN0cmluZywgcmV4ZWMgYW5kIEJhc3Rpb24gdG8gdGhlIGRlZmF1bHQgbGlzdCBvZiBkZXByZWNhdGVkCisgICAgICBtb2R1bGVzCisKKyAgICAqIGRvIG5vdCBwcmludCByZWRlZmluaXRpb24gd2FybmluZyBmb3IgZnVuY3Rpb24vY2xhc3MvbWV0aG9kIGRlZmluZWQKKyAgICAgIGluIG11dHVhbGx5IGV4Y2x1c2l2ZSBicmFuY2hlcworCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4yLjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitSZWxlYXNlIGRhdGU6IDIwMDMtMTAtMTAKKworICAgICogYWRkZWQgc29tZSBkb2N1bWVudGF0aW9uLCBmaXhlZCBzb21lIHR5cG9zCisKKyAgICAqIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBQWUxJTlRfSU1QT1JUIHRvIDEgZHVyaW5nIHB5bGludCBleGVjdXRpb24uCisKKyAgICAqIGNoZWNrIHRoYXQgdmFyaWFibGVzICJpbXBvcnRlZCIgdXNpbmcgdGhlIGdsb2JhbCBzdGF0ZW1lbnQgZXhpc3QKKworICAgICogaW5kZW50YXRpb24gcHJvYmxlbXMgYXJlIG5vdyB3YXJuaW5nIGluc3RlYWQgb2YgZXJyb3JzCisKKyAgICAqIGZpeCBjaGVja2Vycy5pbml0aWFsaXplIHRvIHRyeSB0byBsb2FkIGFsbCBmaWxlcyB3aXRoIGEga25vd24gcHl0aG9uCisgICAgICBleHRlbnNpb24gKHBhdGNoIGZyb20gd3JvYmVsbCkKKworICAgICogZml4IGEgYnVuY2ggb2YgbWVzc2FnZXMKKworICAgICogZml4IHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUKKworICAgICogZml4IHRoZSBiYWQtY29uc3RydWN0aW9uIG9wdGlvbgorCisgICAgKiBmaXggZW5jb2RpbmcgY2hlY2tlcgorCisgICAgKiBmaXggZm9ybWF0IGNoZWNrZXIKKworCitXaGF0J3MgTmV3IGluIFB5bGludCAwLjIuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1JlbGVhc2UgZGF0ZTogMjAwMy0wOS0xMgorCisgICAgKiBuZXcgc291cmNlIGVuY29kaW5nIC8gRklYTUUgY2hlY2tlciAocGVwIDI2MykKKworICAgICogbmV3IC0tem9wZSBvcHRpb24gd2hpY2ggdHJpZ2dlciBab3BlIGltcG9ydC4gVXNlZnVsIHRvIGNoZWNrIFpvcGUKKyAgICAgIHByb2R1Y3RzIGNvZGUuCisKKyAgICAqIG5ldyAtLWNvbW1lbnQgb3B0aW9uIHdoaWNoIGVuYWJsZSB0aGUgZXZhbHVhdGlvbiBub3RlIGNvbW1lbnQKKyAgICAgIChkaXNhYmxlZCBieSBkZWZhdWx0KS4KKworICAgICogYSB0b24gb2YgYnVnIGZpeGVzCisKKyAgICAqIGVhc3kgZnVuY3Rpb25hbCB0ZXN0IGluZnJhc3RydWN0dXJlCisKKworV2hhdCdzIE5ldyBpbiBQeWxpbnQgMC4xLjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitSZWxlYXNlIGRhdGU6IDIwMDMtMDYtMTgKKworICAgICogYnVnIGZpeCByZWxlYXNlCisKKyAgICAqIHJlbW92ZSBkZXBlbmRlbmN5IHRvIHB5cmV2ZXJzZQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMS4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworUmVsZWFzZSBkYXRlOiAyMDAzLTA2LTAxCisKKyAgICAqIG11Y2ggbW9yZSBmdW5jdGlvbmFsaXRpZXMgIQorCisKK1doYXQncyBOZXcgaW4gUHlsaW50IDAuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMDMtMDUtMTkKKworICAgICogaW5pdGlhbCByZWxlYXNlCmRpZmYgLS1naXQgYS9Eb2NrZXJmaWxlIGIvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWZlNjJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDcgQEAKK0ZST00gcHl0aG9uOjMuOS4wLWFscGluZTMuMTIKKworQ09QWSAuLyAvdG1wL2J1aWxkCitXT1JLRElSIC90bXAvYnVpbGQKK1JVTiBweXRob24gc2V0dXAucHkgaW5zdGFsbCAmJiBybSAtcmYgL3RtcC9idWlsZAorCitFTlRSWVBPSU5UIFsicHlsaW50Il0KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNGM4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwk1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIHllYXIgIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9NQU5JRkVTVC5pbiBiL01BTklGRVNULmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTY4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9NQU5JRkVTVC5pbgpAQCAtMCwwICsxLDE0IEBACityZWN1cnNpdmUtZXhjbHVkZSBweWxpbnQgKi5yc3QKK3BydW5lIC5naXRodWIKK3BydW5lIGRvYworcHJ1bmUgZWxpc3AKK3BydW5lIGV4YW1wbGVzCitwcnVuZSB0ZXN0cworcHJ1bmUgc2NyaXB0CitleGNsdWRlIC4qCitleGNsdWRlIENoYW5nZUxvZworZXhjbHVkZSBEb2NrZXJmaWxlCitleGNsdWRlIFJFQURNRS5yc3QKK2V4Y2x1ZGUgcHlsaW50cmMKK2V4Y2x1ZGUgcmVxdWlyZW1lbnRzXyoudHh0CitleGNsdWRlIHRveC5pbmkKZGlmZiAtLWdpdCBhL1JFQURNRS5yc3QgYi9SRUFETUUucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTJkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUucnN0CkBAIC0wLDAgKzEsMTcwIEBACisKK1JFQURNRSBmb3IgUHlsaW50IC0gaHR0cHM6Ly9weWxpbnQucHljcWEub3JnLworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIGltYWdlOjogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9hY3Rpb25zL3dvcmtmbG93cy9jaS55YW1sL2JhZGdlLnN2Zz9icmFuY2g9bWFzdGVyCisgICAgOnRhcmdldDogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9hY3Rpb25zCisKKy4uIGltYWdlOjogaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vcmVwb3MvZ2l0aHViL1B5Q1FBL3B5bGludC9iYWRnZS5zdmc/YnJhbmNoPW1hc3RlcgorICAgIDp0YXJnZXQ6IGh0dHBzOi8vY292ZXJhbGxzLmlvL2dpdGh1Yi9QeUNRQS9weWxpbnQ/YnJhbmNoPW1hc3RlcgorCisKKy4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3YvcHlsaW50LnN2ZworICAgIDphbHQ6IFB5cGkgUGFja2FnZSB2ZXJzaW9uCisgICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9weWxpbnQKKworLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9weWxpbnQvYmFkZ2UvP3ZlcnNpb249bGF0ZXN0CisgICAgOnRhcmdldDogaHR0cHM6Ly9weWxpbnQucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0Lz9iYWRnZT1sYXRlc3QKKyAgICA6YWx0OiBEb2N1bWVudGF0aW9uIFN0YXR1cworCisuLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvY29kZSUyMHN0eWxlLWJsYWNrLTAwMDAwMC5zdmcKKyAgICA6dGFyZ2V0OiBodHRwczovL2dpdGh1Yi5jb20vYW1idi9ibGFjaworCisuLiBpbWFnZTo6IGh0dHBzOi8vcmVzdWx0cy5wcmUtY29tbWl0LmNpL2JhZGdlL2dpdGh1Yi9QeUNRQS9weWxpbnQvbWFzdGVyLnN2ZworICAgOnRhcmdldDogaHR0cHM6Ly9yZXN1bHRzLnByZS1jb21taXQuY2kvbGF0ZXN0L2dpdGh1Yi9QeUNRQS9weWxpbnQvbWFzdGVyCisgICA6YWx0OiBwcmUtY29tbWl0LmNpIHN0YXR1cworCisuLiB8dGlkZWxpZnRsb2dvfCBpbWFnZTo6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9QeUNRQS9weWxpbnQvbWFzdGVyL2RvYy9tZWRpYS9UaWRlbGlmdF9Mb2dvc19SR0JfVGlkZWxpZnRfU2hvcnRoYW5kX09uLVdoaXRlLnBuZworICAgOndpZHRoOiA3NQorICAgOmhlaWdodDogNjAKKyAgIDphbHQ6IFRpZGVsaWZ0CisKKy4uIGxpc3QtdGFibGU6OgorICAgOndpZHRoczogMTAgMTAwCisKKyAgICogLSB8dGlkZWxpZnRsb2dvfAorICAgICAtIFByb2Zlc3Npb25hbCBzdXBwb3J0IGZvciBweWxpbnQgaXMgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIGBUaWRlbGlmdAorICAgICAgIFN1YnNjcmlwdGlvbmBfLiAgVGlkZWxpZnQgZ2l2ZXMgc29mdHdhcmUgZGV2ZWxvcG1lbnQgdGVhbXMgYSBzaW5nbGUgc291cmNlIGZvcgorICAgICAgIHB1cmNoYXNpbmcgYW5kIG1haW50YWluaW5nIHRoZWlyIHNvZnR3YXJlLCB3aXRoIHByb2Zlc3Npb25hbCBncmFkZSBhc3N1cmFuY2VzCisgICAgICAgZnJvbSB0aGUgZXhwZXJ0cyB3aG8ga25vdyBpdCBiZXN0LCB3aGlsZSBzZWFtbGVzc2x5IGludGVncmF0aW5nIHdpdGggZXhpc3RpbmcKKyAgICAgICB0b29scy4KKworLi4gX1RpZGVsaWZ0IFN1YnNjcmlwdGlvbjogaHR0cHM6Ly90aWRlbGlmdC5jb20vc3Vic2NyaXB0aW9uL3BrZy9weXBpLXB5bGludD91dG1fc291cmNlPXB5cGktcHlsaW50JnV0bV9tZWRpdW09cmVmZXJyYWwmdXRtX2NhbXBhaWduPXJlYWRtZQorCisKKz09PT09PQorUHlsaW50Cis9PT09PT0KKworKipJdCdzIG5vdCBqdXN0IGEgbGludGVyIHRoYXQgYW5ub3lzIHlvdSEqKgorCitQeWxpbnQgaXMgYSBQeXRob24gc3RhdGljIGNvZGUgYW5hbHlzaXMgdG9vbCB3aGljaCBsb29rcyBmb3IgcHJvZ3JhbW1pbmcgZXJyb3JzLAoraGVscHMgZW5mb3JjaW5nIGEgY29kaW5nIHN0YW5kYXJkLCBzbmlmZnMgZm9yIGNvZGUgc21lbGxzIGFuZCBvZmZlcnMgc2ltcGxlIHJlZmFjdG9yaW5nCitzdWdnZXN0aW9ucy4KKworSXQncyBoaWdobHkgY29uZmlndXJhYmxlLCBoYXZpbmcgc3BlY2lhbCBwcmFnbWFzIHRvIGNvbnRyb2wgaXRzIGVycm9ycyBhbmQgd2FybmluZ3MKK2Zyb20gd2l0aGluIHlvdXIgY29kZSwgYXMgd2VsbCBhcyBmcm9tIGFuIGV4dGVuc2l2ZSBjb25maWd1cmF0aW9uIGZpbGUuCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHdyaXRlIHlvdXIgb3duIHBsdWdpbnMgZm9yIGFkZGluZyB5b3VyIG93biBjaGVja3Mgb3IgZm9yCitleHRlbmRpbmcgcHlsaW50IGluIG9uZSB3YXkgb3IgYW5vdGhlci4KKworSXQncyBhIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIHVubGVzcworb3RoZXJ3aXNlIHNwZWNpZmllZC4KKworRGV2ZWxvcG1lbnQgaXMgaG9zdGVkIG9uIEdpdEh1YjogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC8KKworWW91IGNhbiB1c2UgdGhlIGNvZGUtcXVhbGl0eUBweXRob24ub3JnIG1haWxpbmcgbGlzdCB0byBkaXNjdXNzIGFib3V0CitQeWxpbnQuIFN1YnNjcmliZSBhdCBodHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2NvZGUtcXVhbGl0eS8KK29yIHJlYWQgdGhlIGFyY2hpdmVzIGF0IGh0dHBzOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9jb2RlLXF1YWxpdHkvCisKK1B1bGwgcmVxdWVzdHMgYXJlIGFtYXppbmcgYW5kIG1vc3Qgd2VsY29tZS4KKworSW5zdGFsbAorLS0tLS0tLQorCitQeWxpbnQgY2FuIGJlIHNpbXBseSBpbnN0YWxsZWQgYnkgcnVubmluZzo6CisKKyAgICBwaXAgaW5zdGFsbCBweWxpbnQKKworSWYgeW91IGFyZSB1c2luZyBQeXRob24gMy42KywgdXBncmFkZSB0byBnZXQgZnVsbCBzdXBwb3J0IGZvciB5b3VyIHZlcnNpb246OgorCisgICAgcGlwIGluc3RhbGwgcHlsaW50IC0tdXBncmFkZQorCitJZiB5b3Ugd2FudCB0byBpbnN0YWxsIGZyb20gYSBzb3VyY2UgZGlzdHJpYnV0aW9uLCBleHRyYWN0IHRoZSB0YXJiYWxsIGFuZCBydW4KK3RoZSBmb2xsb3dpbmcgY29tbWFuZCA6OgorCisgICAgcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKKworCitEbyBtYWtlIHN1cmUgdG8gZG8gdGhlIHNhbWUgZm9yIGFzdHJvaWQsIHdoaWNoIGlzIHVzZWQgaW50ZXJuYWxseSBieSBweWxpbnQuCisKK0ZvciBkZWJpYW4gYW5kIHJwbSBwYWNrYWdlcywgdXNlIHlvdXIgdXN1YWwgdG9vbHMgYWNjb3JkaW5nIHRvIHlvdXIgTGludXggZGlzdHJpYnV0aW9uLgorCitNb3JlIGluZm9ybWF0aW9uIGFib3V0IGluc3RhbGxhdGlvbiBhbmQgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbiBmb3JtYXQKK2NhbiBiZSBmb3VuZCBoZXJlXy4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorCitUaGUgZG9jdW1lbnRhdGlvbiBsaXZlcyBhdCBodHRwczovL3B5bGludC5weWNxYS5vcmcvLgorCitQeWxpbnQgaXMgc2hpcHBlZCB3aXRoIGZvbGxvd2luZyBhZGRpdGlvbmFsIGNvbW1hbmRzOgorCisqIHB5cmV2ZXJzZTogYW4gVU1MIGRpYWdyYW0gZ2VuZXJhdG9yCisqIHN5bWlsYXI6IGFuIGluZGVwZW5kZW50IHNpbWlsYXJpdGllcyBjaGVja2VyCisqIGVweWxpbnQ6IEVtYWNzIGFuZCBGbHltYWtlIGNvbXBhdGlibGUgUHlsaW50CisKKworVGVzdGluZworLS0tLS0tLQorCitXZSB1c2UgdG94XyBhbmQgcHl0ZXN0LWJlbmNobWFya18gZm9yIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUuIFlvdSBzaG91bGQgYmUgYWJsZSB0byBpbnN0YWxsIGl0IHdpdGg6OgorCisgICAgcGlwIGluc3RhbGwgdG94IHB5dGVzdCBweXRlc3QtYmVuY2htYXJrCisKKworVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBhIHBhcnRpY3VsYXIgUHl0aG9uIHZlcnNpb24sIHlvdSBjYW4gZG86OgorCisgICAgdG94IC1lIHB5MzcKKworCitUbyBydW4gaW5kaXZpZHVhbCB0ZXN0cyB3aXRoIGBgdG94YGAsIHlvdSBjYW4gZG86OgorCisgICAgdG94IC1lIHB5MzcgLS0gLWsgbmFtZV9vZl90aGVfdGVzdAorCisKK1dlIHVzZSBweXRlc3RfIGZvciB0ZXN0aW5nIGBgcHlsaW50YGAsIHdoaWNoIHlvdSBjYW4gdXNlIHdpdGhvdXQgdXNpbmcgYGB0b3hgYCBmb3IgYSBmYXN0ZXIgZGV2ZWxvcG1lbnQgY3ljbGUuCisKK0lmIHlvdSB3YW50IHRvIHJ1biB0ZXN0cyBvbiBhIHNwZWNpZmljIHBvcnRpb24gb2YgdGhlIGNvZGUgd2l0aCBweXRlc3RfLCAocHl0ZXN0LWNvdl8pIGFuZCB5b3VyIGxvY2FsIHB5dGhvbiB2ZXJzaW9uOjoKKworICAgICMgKCBwaXAgaW5zdGFsbCBweXRlc3QtY292ICkKKyAgICAjIEV2ZXJ5dGhpbmc6CisgICAgcHl0aG9uMyAtbSBweXRlc3QgdGVzdHMvCisgICAgIyBFdmVyeXRoaW5nIGluIHRlc3RzL21lc3NhZ2Ugd2l0aCBjb3ZlcmFnZSBmb3IgdGhlIHJlbGV2YW50IGNvZGU6CisgICAgcHl0aG9uMyAtbSBweXRlc3QgdGVzdHMvbWVzc2FnZS8gLS1jb3Y9cHlsaW50Lm1lc3NhZ2UKKyAgICBjb3ZlcmFnZSBodG1sCisgICAgIyBPbmx5IHRoZSBmdW5jdGlvbmFsIHRlc3QgIm1pc3Npbmdfa3dvYV9weTMiOgorICAgIHB5dGhvbjMgLW0gcHl0ZXN0ICJ0ZXN0cy90ZXN0X2Z1bmN0aW9uYWwucHk6OnRlc3RfZnVuY3Rpb25hbFttaXNzaW5nX2t3b2FfcHkzXSIKKworCitEbyBub3QgZm9yZ2V0IHRvIGNsb25lIGFzdHJvaWRfIGFuZCBpbnN0YWxsIHRoZSBsYXN0IHZlcnNpb246OgorCisKKyAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL2FzdHJvaWQuZ2l0CisKKyAgICAjIEZyb20gc291cmNlCisgICAgcHl0aG9uMyBhc3Ryb2lkL3NldHVwLnB5IGJ1aWxkIHNkaXN0CisgICAgcGlwMyBpbnN0YWxsIGFzdHJvaWQvZGlzdC9hc3Ryb2lkKi50YXIuZ3oKKworICAgICMgVXNpbmcgYW4gZWRpdGFibGUgaW5zdGFsbGF0aW9uCisgICAgY2QgYXN0cm9pZAorICAgIHB5dGhvbjMgLW0gcGlwIGluc3RhbGwgLWUgLgorCisKK0ZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbi4KKworLi4gX2hlcmU6IGh0dHBzOi8vcHlsaW50LnB5Y3FhLm9yZy9lbi9sYXRlc3QvdXNlcl9ndWlkZS9pbnN0YWxsYXRpb24uaHRtbAorLi4gX3RveDogaHR0cHM6Ly90b3gucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0LworLi4gX3B5dGVzdDogaHR0cHM6Ly9kb2NzLnB5dGVzdC5vcmcvZW4vbGF0ZXN0LworLi4gX3B5dGVzdC1iZW5jaG1hcms6IGh0dHBzOi8vcHl0ZXN0LWJlbmNobWFyay5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvaW5kZXguaHRtbAorLi4gX3B5dGVzdC1jb3Y6IGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9weXRlc3QtY292LworLi4gX2FzdHJvaWQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9hc3Ryb2lkCisKK0xpY2Vuc2UKKy0tLS0tLS0KKworcHlsaW50IGlzLCB3aXRoIGEgZmV3IGV4Y2VwdGlvbnMgbGlzdGVkIGJlbG93LCBgR1BMdjIgPGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRT5gXy4KKworVGhlIGljb24gZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBgQ0MgQlktU0EgNC4wIDxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz5gXyBsaWNlbnNlOgorCistIGBkb2MvbG9nby5wbmcgPGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9QeUNRQS9weWxpbnQvbWFzdGVyL2RvYy9sb2dvLnBuZz5gXworLSBgZG9jL2xvZ28uc3ZnIDxodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUHlDUUEvcHlsaW50L21hc3Rlci9kb2MvbG9nby5zdmc+YF8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2N1c3RvbS5weSBiL2V4YW1wbGVzL2N1c3RvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU5N2JiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY3VzdG9tLnB5CkBAIC0wLDAgKzEsNzQgQEAKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyCisKKworIyBUaGlzIGlzIG91ciBjaGVja2VyIGNsYXNzLgorIyBDaGVja2VycyBzaG91bGQgYWx3YXlzIGluaGVyaXQgZnJvbSBgQmFzZUNoZWNrZXJgLgorY2xhc3MgTXlBc3Ryb2lkQ2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgIiIiQWRkIGNsYXNzIG1lbWJlciBhdHRyaWJ1dGVzIHRvIHRoZSBjbGFzcyBsb2NhbHMgZGljdGlvbmFyeS4iIiIKKworICAgICMgVGhpcyBjbGFzcyB2YXJpYWJsZSBkZWZpbmVzIHRoZSB0eXBlIG9mIGNoZWNrZXIgdGhhdCB3ZSBhcmUgaW1wbGVtZW50aW5nLgorICAgICMgSW4gdGhpcyBjYXNlLCB3ZSBhcmUgaW1wbGVtZW50aW5nIGFuIEFTVCBjaGVja2VyLgorICAgIF9faW1wbGVtZW50c19fID0gSUFzdHJvaWRDaGVja2VyCisKKyAgICAjIFRoZSBuYW1lIGRlZmluZXMgYSBjdXN0b20gc2VjdGlvbiBvZiB0aGUgY29uZmlnIGZvciB0aGlzIGNoZWNrZXIuCisgICAgbmFtZSA9ICJjdXN0b20iCisgICAgIyBUaGUgcHJpb3JpdHkgaW5kaWNhdGVzIHRoZSBvcmRlciB0aGF0IHB5bGludCB3aWxsIHJ1biB0aGUgY2hlY2tlcnMuCisgICAgcHJpb3JpdHkgPSAtMQorICAgICMgVGhpcyBjbGFzcyB2YXJpYWJsZSBkZWNsYXJlcyB0aGUgbWVzc2FnZXMgKGllIHRoZSB3YXJuaW5ncyBhbmQgZXJyb3JzKQorICAgICMgdGhhdCB0aGUgY2hlY2tlciBjYW4gZW1pdC4KKyAgICBtc2dzID0geworICAgICAgICAjIEVhY2ggbWVzc2FnZSBoYXMgYSBjb2RlLCBhIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciB3aWxsIHNlZSwKKyAgICAgICAgIyBhIHVuaXF1ZSBzeW1ib2wgdGhhdCBpZGVudGlmaWVzIHRoZSBtZXNzYWdlLAorICAgICAgICAjIGFuZCBhIGRldGFpbGVkIGhlbHAgbWVzc2FnZQorICAgICAgICAjIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgIlcwMDAxIjogKCJNZXNzYWdlIHRoYXQgd2lsbCBiZSBlbWl0dGVkIiwgIm1lc3NhZ2Utc3ltYm9sIiwgIk1lc3NhZ2UgaGVscCIpCisgICAgfQorICAgICMgVGhpcyBjbGFzcyB2YXJpYWJsZSBkZWNsYXJlcyB0aGUgb3B0aW9ucworICAgICMgdGhhdCBhcmUgY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyLgorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICMgRWFjaCBvcHRpb24gZGVmaW5pdGlvbiBoYXMgYSBuYW1lIHdoaWNoIGlzIHVzZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICAgICAgICAjIGFuZCBpbiBjb25maWcgZmlsZXMsIGFuZCBhIGRpY3Rpb25hcnkgb2YgYXJndW1lbnRzCisgICAgICAgICMgKHNpbWlsYXIgdG8gdGhvc2UgdG8gdGhvc2UgdG8KKyAgICAgICAgIyBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlci5hZGRfYXJndW1lbnQpLgorICAgICAgICAoCisgICAgICAgICAgICAic3RvcmUtbG9jYWxzLWluZGljYXRvciIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAicHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICJUaGUgZXhwcmVzc2lvbiBuYW1lIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGxvY2FscyBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgICAiYmUgc3RvcmVkIgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiBhIDpjbGFzczpgLmFzdHJvaWQubm9kZV9jbGFzc2VzLkNhbGxgIG5vZGUgaXMgdmlzaXRlZC4KKworICAgICAgICBTZWUgOm1vZDpgYXN0cm9pZGAgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBhdmFpbGFibGUgbm9kZXMuCisKKyAgICAgICAgOnBhcmFtIG5vZGU6IFRoZSBub2RlIHRvIGNoZWNrLgorICAgICAgICA6dHlwZSBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5DYWxsCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5mdW5jLmV4cHIsIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgIGFuZCBub2RlLmZ1bmMuZXhwci5uYW1lID09IHNlbGYuY29uZmlnLnN0b3JlX2xvY2Fsc19pbmRpY2F0b3IKKyAgICAgICAgICAgIGFuZCBub2RlLmZ1bmMuYXR0cm5hbWUgPT0gImNyZWF0ZSIKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbl9jbGFzcyA9IG5vZGUuZnJhbWUoKQorICAgICAgICBmb3IgcGFyYW0gaW4gbm9kZS5hcmdzOgorICAgICAgICAgICAgaW5fY2xhc3MubG9jYWxzW3BhcmFtLm5hbWVdID0gbm9kZQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiIlRoaXMgcmVxdWlyZWQgbWV0aG9kIGF1dG8gcmVnaXN0ZXJzIHRoZSBjaGVja2VyLgorCisgICAgOnBhcmFtIGxpbnRlcjogVGhlIGxpbnRlciB0byByZWdpc3RlciB0aGUgY2hlY2tlciB0by4KKyAgICA6dHlwZSBsaW50ZXI6IHB5bGludC5saW50LlB5TGludGVyCisgICAgIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoTXlBc3Ryb2lkQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY3VzdG9tX3Jhdy5weSBiL2V4YW1wbGVzL2N1c3RvbV9yYXcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlNGFlYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2N1c3RvbV9yYXcucHkKQEAgLTAsMCArMSwzOCBAQAorZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJUmF3Q2hlY2tlcgorCisKK2NsYXNzIE15UmF3Q2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgIiIiY2hlY2sgZm9yIGxpbmUgY29udGludWF0aW9ucyB3aXRoICdcJyBpbnN0ZWFkIG9mIHVzaW5nIHRyaXBsZQorICAgIHF1b3RlZCBzdHJpbmcgb3IgcGFyZW50aGVzaXMKKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gSVJhd0NoZWNrZXIKKworICAgIG5hbWUgPSAiY3VzdG9tX3JhdyIKKyAgICBtc2dzID0geworICAgICAgICAiVzk5MDEiOiAoCisgICAgICAgICAgICAidXNlIFxcIGZvciBsaW5lIGNvbnRpbnVhdGlvbiIsCisgICAgICAgICAgICAiYmFja3NsYXNoLWxpbmUtY29udGludWF0aW9uIiwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiVXNlZCB3aGVuIGEgXFwgaXMgdXNlZCBmb3IgYSBsaW5lIGNvbnRpbnVhdGlvbiBpbnN0ZWFkIgorICAgICAgICAgICAgICAgICIgb2YgdXNpbmcgdHJpcGxlIHF1b3RlZCBzdHJpbmcgb3IgcGFyZW50aGVzaXMuIgorICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgIH0KKyAgICBvcHRpb25zID0gKCkKKworICAgIGRlZiBwcm9jZXNzX21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIicHJvY2VzcyBhIG1vZHVsZQorCisgICAgICAgIHRoZSBtb2R1bGUncyBjb250ZW50IGlzIGFjY2Vzc2libGUgdmlhIG5vZGUuc3RyZWFtKCkgZnVuY3Rpb24KKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggbm9kZS5zdHJlYW0oKSBhcyBzdHJlYW06CisgICAgICAgICAgICBmb3IgKGxpbmVubywgbGluZSkgaW4gZW51bWVyYXRlKHN0cmVhbSk6CisgICAgICAgICAgICAgICAgaWYgbGluZS5yc3RyaXAoKS5lbmRzd2l0aCgiXFwiKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYmFja3NsYXNoLWxpbmUtY29udGludWF0aW9uIiwgbGluZT1saW5lbm8pCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIicmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoTXlSYXdDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kZXByZWNhdGlvbl9jaGVja2VyLnB5IGIvZXhhbXBsZXMvZGVwcmVjYXRpb25fY2hlY2tlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzkxMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVwcmVjYXRpb25fY2hlY2tlci5weQpAQCAtMCwwICsxLDk5IEBACisiIiIKK0V4YW1wbGUgY2hlY2tlciBkZXRlY3RpbmcgZGVwcmVjYXRlZCBmdW5jdGlvbnMvbWV0aG9kcy4gRm9sbG93aW5nIGV4YW1wbGUgc2VhcmNoZXMgZm9yIHVzYWdlcyBvZgorZGVwcmVjYXRlZCBmdW5jdGlvbiBgZGVwcmVjYXRlZF9mdW5jdGlvbmAgYW5kIGRlcHJlY2F0ZWQgbWV0aG9kIGBNeUNsYXNzLmRlcHJlY2F0ZWRfbWV0aG9kYAorZnJvbSBtb2R1bGUgbXltb2R1bGU6CisKKy4uIGNvZGUtYmxvY2s6OiBjb25zb2xlCisgICAgJCBjYXQgbXltb2R1bGUucHkKKyAgICBkZWYgZGVwcmVjYXRlZF9mdW5jdGlvbigpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbXlmdW5jdGlvbihhcmcwLCBhcmcxLCBkZXByZWNhdGVkX2FyZzE9Tm9uZSwgYXJnMj0nZm9vJywgYXJnMz0nYmFyJywgZGVwcmVjYXRlZF9hcmcyPSdzcGFtJyk6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIE15Q2xhc3M6CisgICAgICAgIGRlZiBkZXByZWNhdGVkX21ldGhvZChzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgbXltZXRob2Qoc2VsZiwgYXJnMCwgYXJnMSwgZGVwcmVjYXRlZDE9Tm9uZSwgYXJnMj0nZm9vJywgZGVwcmVjYXRlZDI9J2JhcicsIGFyZzM9J3NwYW0nKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICQgY2F0IG15bWFpbi5weQorICAgIGZyb20gbXltb2R1bGUgaW1wb3J0IGRlcHJlY2F0ZWRfZnVuY3Rpb24sIG15ZnVuY3Rpb24sIE15Q2xhc3MKKworICAgIGRlcHJlY2F0ZWRfZnVuY3Rpb24oKQorICAgIG15ZnVuY3Rpb24oMCwgMSwgJ2RlcHJlY2F0ZWRfYXJnMScsIGRlcHJlY2F0ZWRfYXJnMj1Ob25lKQorICAgIE15Q2xhc3MoKS5kZXByZWNhdGVkX21ldGhvZCgpCisgICAgTXlDbGFzcygpLm15bWV0aG9kKDAsIDEsIGRlcHJlY2F0ZWQxPU5vbmUsIGRlcHJlY2F0ZWQyPU5vbmUpCisKKyAgICAkIHB5bGludCAtLWxvYWQtcGx1Z2lucz1kZXByZWNhdGlvbl9jaGVja2VyIG15bWFpbi5weQorICAgICoqKioqKioqKioqKiogTW9kdWxlIG15bWFpbgorICAgIG15bWFpbi5weTozOjA6IFcxNTA1OiBVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBkZXByZWNhdGVkX2Z1bmN0aW9uKCkgKGRlcHJlY2F0ZWQtbWV0aG9kKQorICAgIG15bWFpbi5weTo0OjA6IFcxNTExOiBVc2luZyBkZXByZWNhdGVkIGFyZ3VtZW50IGRlcHJlY2F0ZWRfYXJnMSBvZiBtZXRob2QgbXlmdW5jdGlvbigpIChkZXByZWNhdGVkLWFyZ3VtZW50KQorICAgIG15bWFpbi5weTo0OjA6IFcxNTExOiBVc2luZyBkZXByZWNhdGVkIGFyZ3VtZW50IGRlcHJlY2F0ZWRfYXJnMiBvZiBtZXRob2QgbXlmdW5jdGlvbigpIChkZXByZWNhdGVkLWFyZ3VtZW50KQorICAgIG15bWFpbi5weTo1OjA6IFcxNTA1OiBVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBkZXByZWNhdGVkX21ldGhvZCgpIChkZXByZWNhdGVkLW1ldGhvZCkKKyAgICBteW1haW4ucHk6NjowOiBXMTUxMTogVXNpbmcgZGVwcmVjYXRlZCBhcmd1bWVudCBkZXByZWNhdGVkMSBvZiBtZXRob2QgbXltZXRob2QoKSAoZGVwcmVjYXRlZC1hcmd1bWVudCkKKyAgICBteW1haW4ucHk6NjowOiBXMTUxMTogVXNpbmcgZGVwcmVjYXRlZCBhcmd1bWVudCBkZXByZWNhdGVkMiBvZiBtZXRob2QgbXltZXRob2QoKSAoZGVwcmVjYXRlZC1hcmd1bWVudCkKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFlvdXIgY29kZSBoYXMgYmVlbiByYXRlZCBhdCAyLjAwLzEwIChwcmV2aW91cyBydW46IDIuMDAvMTAsICswLjAwKQorIiIiCitmcm9tIHR5cGluZyBpbXBvcnQgU2V0LCBUdXBsZSwgVW5pb24KKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyLCBEZXByZWNhdGVkTWl4aW4KK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElBc3Ryb2lkQ2hlY2tlcgorCisKK2NsYXNzIERlcHJlY2F0aW9uQ2hlY2tlcihEZXByZWNhdGVkTWl4aW4sIEJhc2VDaGVja2VyKToKKyAgICAiIiJDbGFzcyBpbXBsZW1lbnRpbmcgZGVwcmVjYXRpb24gY2hlY2tlci4iIiIKKworICAgICMgRGVwcmVjYXRpb25NaXhpbiBjbGFzcyBpcyBNaXhpbiBjbGFzcyBpbXBsZW1lbnRpbmcgbG9naWMgZm9yIHNlYXJjaGluZyBkZXByZWNhdGVkIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4KKyAgICAjIFRoZSBsaXN0IG9mIGRlcHJlY2F0ZWQgbWV0aG9kcy9mdW5jdGlvbnMgaXMgZGVmaW5lZCBieSBpbXBsZW1lbnRpbmcgY2xhc3MgdmlhIGRlcHJlY2F0ZWRfbWV0aG9kcyBjYWxsYmFjay4KKyAgICAjIERlcHJlY2F0ZWRNaXhpbiBjbGFzcyBpcyBvdmVycmlkaW5nIGF0dHJpYnV0ZXMgb2YgQmFzZUNoZWNrZXIgaGVuY2UgbXVzdCBiZSBzcGVjaWZpZWQgKmJlZm9yZSogQmFzZUNoZWNrZXIKKyAgICAjIGluIGxpc3Qgb2YgYmFzZSBjbGFzc2VzLgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoSUFzdHJvaWRDaGVja2VyLCkKKyAgICAjIFRoZSBuYW1lIGRlZmluZXMgYSBjdXN0b20gc2VjdGlvbiBvZiB0aGUgY29uZmlnIGZvciB0aGlzIGNoZWNrZXIuCisgICAgbmFtZSA9ICJkZXByZWNhdGVkIgorCisgICAgZGVmIGRlcHJlY2F0ZWRfbWV0aG9kcyhzZWxmKSAtPiBTZXRbc3RyXToKKyAgICAgICAgIiIiQ2FsbGJhY2sgbWV0aG9kIGNhbGxlZCBieSBEZXByZWNhdGVkTWl4aW4gZm9yIGV2ZXJ5IG1ldGhvZC9mdW5jdGlvbiBmb3VuZCBpbiB0aGUgY29kZS4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lciBvZiBkZXByZWNhdGVkIGZ1bmN0aW9uL21ldGhvZCBuYW1lcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB7Im15bW9kdWxlLmRlcHJlY2F0ZWRfZnVuY3Rpb24iLCAibXltb2R1bGUuTXlDbGFzcy5kZXByZWNhdGVkX21ldGhvZCJ9CisKKyAgICBkZWYgZGVwcmVjYXRlZF9hcmd1bWVudHMoCisgICAgICAgIHNlbGYsIG1ldGhvZDogc3RyCisgICAgKSAtPiBUdXBsZVtUdXBsZVtVbmlvbltpbnQsIE5vbmVdLCBzdHJdLCAuLi5dOgorICAgICAgICAiIiJDYWxsYmFjayByZXR1cm5pbmcgdGhlIGRlcHJlY2F0ZWQgYXJndW1lbnRzIG9mIG1ldGhvZC9mdW5jdGlvbi4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlIGluIGZvcm06CisgICAgICAgICAgICAgICAgKChQT1NJVElPTjEsIFBBUkFNMSksIChQT1NJVElPTjI6IFBBUkFNMikgLi4uKQorICAgICAgICAgICAgd2hlcmUKKyAgICAgICAgICAgICAgICAqIFBPU0lUSU9OWCAtIHBvc2l0aW9uIG9mIGRlcHJlY2F0ZWQgYXJndW1lbnQgUEFSQU1YIGluIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgICAgICAgICAgICAgICAgICBJZiBhcmd1bWVudCBpcyBrZXl3b3JkLW9ubHksIFBPU0lUSU9OWCBzaG91bGQgYmUgTm9uZS4KKyAgICAgICAgICAgICAgICAqIFBBUkFNWCAtIG5hbWUgb2YgdGhlIGRlcHJlY2F0ZWQgYXJndW1lbnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBtZXRob2QgPT0gIm15bW9kdWxlLm15ZnVuY3Rpb24iOgorICAgICAgICAgICAgIyBteWZ1bmN0aW9uKCkgaGFzIHR3byBkZXByZWNhdGVkIGFyZ3VtZW50czoKKyAgICAgICAgICAgICMgKiBkZXByZWNhdGVkX2FyZzEgZGVmaW5lZCBhdCAybmQgcG9zaXRpb24gYW5kCisgICAgICAgICAgICAjICogZGVwcmVjYXRlZF9hcmcyIGRlZmluZWQgYXQgNXRoIHBvc2l0aW9uLgorICAgICAgICAgICAgcmV0dXJuICgoMiwgImRlcHJlY2F0ZWRfYXJnMSIpLCAoNSwgImRlcHJlY2F0ZWRfYXJnMiIpKQorICAgICAgICBpZiBtZXRob2QgPT0gIm15bW9kdWxlLk15Q2xhc3MubXltZXRob2QiOgorICAgICAgICAgICAgIyBteW1ldGhvZCgpIGhhcyB0d28gZGVwcmVjYXRlZCBhcmd1bWVudHM6CisgICAgICAgICAgICAjICogZGVwcmVjYXRlZDEgZGVmaW5lZCBhdCAybmQgcG9zaXRpb24gYW5kCisgICAgICAgICAgICAjICogZGVwcmVjYXRlZDIgZGVmaW5lZCBhdCA0dGggcG9zaXRpb24uCisgICAgICAgICAgICByZXR1cm4gKCgyLCAiZGVwcmVjYXRlZDEiKSwgKDQsICJkZXByZWNhdGVkMiIpKQorICAgICAgICByZXR1cm4gKCkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJUaGlzIHJlcXVpcmVkIG1ldGhvZCBhdXRvIHJlZ2lzdGVycyB0aGUgY2hlY2tlci4KKworICAgIDpwYXJhbSBsaW50ZXI6IFRoZSBsaW50ZXIgdG8gcmVnaXN0ZXIgdGhlIGNoZWNrZXIgdG8uCisgICAgOnR5cGUgbGludGVyOiBweWxpbnQubGludC5QeUxpbnRlcgorICAgICIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKERlcHJlY2F0aW9uQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcHlsaW50cmMgYi9leGFtcGxlcy9weWxpbnRyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTk4ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcHlsaW50cmMKQEAgLTAsMCArMSw2MDAgQEAKK1tNQVNURVJdCisKKyMgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlIG9yIG1vZHVsZSBuYW1lcyBmcm9tIHdoZXJlIEMgZXh0ZW5zaW9ucyBtYXkKKyMgYmUgbG9hZGVkLiBFeHRlbnNpb25zIGFyZSBsb2FkaW5nIGludG8gdGhlIGFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIG1heQorIyBydW4gYXJiaXRyYXJ5IGNvZGUuCitleHRlbnNpb24tcGtnLWFsbG93LWxpc3Q9CisKKyMgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlIG9yIG1vZHVsZSBuYW1lcyBmcm9tIHdoZXJlIEMgZXh0ZW5zaW9ucyBtYXkKKyMgYmUgbG9hZGVkLiBFeHRlbnNpb25zIGFyZSBsb2FkaW5nIGludG8gdGhlIGFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIG1heQorIyBydW4gYXJiaXRyYXJ5IGNvZGUuIChUaGlzIGlzIGFuIGFsdGVybmF0aXZlIG5hbWUgdG8gZXh0ZW5zaW9uLXBrZy1hbGxvdy1saXN0CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LikKK2V4dGVuc2lvbi1wa2ctd2hpdGVsaXN0PQorCisjIFNwZWNpZnkgYSBzY29yZSB0aHJlc2hvbGQgdG8gYmUgZXhjZWVkZWQgYmVmb3JlIHByb2dyYW0gZXhpdHMgd2l0aCBlcnJvci4KK2ZhaWwtdW5kZXI9MTAKKworIyBGaWxlcyBvciBkaXJlY3RvcmllcyB0byBiZSBza2lwcGVkLiBUaGV5IHNob3VsZCBiZSBiYXNlIG5hbWVzLCBub3QgcGF0aHMuCitpZ25vcmU9Q1ZTCisKKyMgRmlsZXMgb3IgZGlyZWN0b3JpZXMgbWF0Y2hpbmcgdGhlIHJlZ2V4IHBhdHRlcm5zIGFyZSBza2lwcGVkLiBUaGUgcmVnZXgKKyMgbWF0Y2hlcyBhZ2FpbnN0IGJhc2UgbmFtZXMsIG5vdCBwYXRocy4KK2lnbm9yZS1wYXR0ZXJucz0KKworIyBQeXRob24gY29kZSB0byBleGVjdXRlLCB1c3VhbGx5IGZvciBzeXMucGF0aCBtYW5pcHVsYXRpb24gc3VjaCBhcworIyBweWd0ay5yZXF1aXJlKCkuCisjaW5pdC1ob29rPQorCisjIFVzZSBtdWx0aXBsZSBwcm9jZXNzZXMgdG8gc3BlZWQgdXAgUHlsaW50LiBTcGVjaWZ5aW5nIDAgd2lsbCBhdXRvLWRldGVjdCB0aGUKKyMgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIHRvIHVzZS4KK2pvYnM9MQorCisjIENvbnRyb2wgdGhlIGFtb3VudCBvZiBwb3RlbnRpYWwgaW5mZXJyZWQgdmFsdWVzIHdoZW4gaW5mZXJyaW5nIGEgc2luZ2xlCisjIG9iamVjdC4gVGhpcyBjYW4gaGVscCB0aGUgcGVyZm9ybWFuY2Ugd2hlbiBkZWFsaW5nIHdpdGggbGFyZ2UgZnVuY3Rpb25zIG9yCisjIGNvbXBsZXgsIG5lc3RlZCBjb25kaXRpb25zLgorbGltaXQtaW5mZXJlbmNlLXJlc3VsdHM9MTAwCisKKyMgTGlzdCBvZiBwbHVnaW5zIChhcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIG9mIHB5dGhvbiBtb2R1bGUgbmFtZXMpIHRvIGxvYWQsCisjIHVzdWFsbHkgdG8gcmVnaXN0ZXIgYWRkaXRpb25hbCBjaGVja2Vycy4KK2xvYWQtcGx1Z2lucz0KKworIyBQaWNrbGUgY29sbGVjdGVkIGRhdGEgZm9yIGxhdGVyIGNvbXBhcmlzb25zLgorcGVyc2lzdGVudD15ZXMKKworIyBXaGVuIGVuYWJsZWQsIHB5bGludCB3b3VsZCBhdHRlbXB0IHRvIGd1ZXNzIGNvbW1vbiBtaXNjb25maWd1cmF0aW9uIGFuZCBlbWl0CisjIHVzZXItZnJpZW5kbHkgaGludHMgaW5zdGVhZCBvZiBmYWxzZS1wb3NpdGl2ZSBlcnJvciBtZXNzYWdlcy4KK3N1Z2dlc3Rpb24tbW9kZT15ZXMKKworIyBBbGxvdyBsb2FkaW5nIG9mIGFyYml0cmFyeSBDIGV4dGVuc2lvbnMuIEV4dGVuc2lvbnMgYXJlIGltcG9ydGVkIGludG8gdGhlCisjIGFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIG1heSBydW4gYXJiaXRyYXJ5IGNvZGUuCit1bnNhZmUtbG9hZC1hbnktZXh0ZW5zaW9uPW5vCisKKworW01FU1NBR0VTIENPTlRST0xdCisKKyMgT25seSBzaG93IHdhcm5pbmdzIHdpdGggdGhlIGxpc3RlZCBjb25maWRlbmNlIGxldmVscy4gTGVhdmUgZW1wdHkgdG8gc2hvdworIyBhbGwuIFZhbGlkIGxldmVsczogSElHSCwgSU5GRVJFTkNFLCBJTkZFUkVOQ0VfRkFJTFVSRSwgVU5ERUZJTkVELgorY29uZmlkZW5jZT0KKworIyBEaXNhYmxlIHRoZSBtZXNzYWdlLCByZXBvcnQsIGNhdGVnb3J5IG9yIGNoZWNrZXIgd2l0aCB0aGUgZ2l2ZW4gaWQocykuIFlvdQorIyBjYW4gZWl0aGVyIGdpdmUgbXVsdGlwbGUgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IGNvbW1hICgsKSBvciBwdXQgdGhpcworIyBvcHRpb24gbXVsdGlwbGUgdGltZXMgKG9ubHkgb24gdGhlIGNvbW1hbmQgbGluZSwgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCisjIGZpbGUgd2hlcmUgaXQgc2hvdWxkIGFwcGVhciBvbmx5IG9uY2UpLiBZb3UgY2FuIGFsc28gdXNlICItLWRpc2FibGU9YWxsIiB0bworIyBkaXNhYmxlIGV2ZXJ5dGhpbmcgZmlyc3QgYW5kIHRoZW4gcmVlbmFibGUgc3BlY2lmaWMgY2hlY2tzLiBGb3IgZXhhbXBsZSwgaWYKKyMgeW91IHdhbnQgdG8gcnVuIG9ubHkgdGhlIHNpbWlsYXJpdGllcyBjaGVja2VyLCB5b3UgY2FuIHVzZSAiLS1kaXNhYmxlPWFsbAorIyAtLWVuYWJsZT1zaW1pbGFyaXRpZXMiLiBJZiB5b3Ugd2FudCB0byBydW4gb25seSB0aGUgY2xhc3NlcyBjaGVja2VyLCBidXQgaGF2ZQorIyBubyBXYXJuaW5nIGxldmVsIG1lc3NhZ2VzIGRpc3BsYXllZCwgdXNlICItLWRpc2FibGU9YWxsIC0tZW5hYmxlPWNsYXNzZXMKKyMgLS1kaXNhYmxlPVciLgorZGlzYWJsZT1wcmludC1zdGF0ZW1lbnQsCisgICAgICAgIHBhcmFtZXRlci11bnBhY2tpbmcsCisgICAgICAgIHVucGFja2luZy1pbi1leGNlcHQsCisgICAgICAgIG9sZC1yYWlzZS1zeW50YXgsCisgICAgICAgIGJhY2t0aWNrLAorICAgICAgICBsb25nLXN1ZmZpeCwKKyAgICAgICAgb2xkLW5lLW9wZXJhdG9yLAorICAgICAgICBvbGQtb2N0YWwtbGl0ZXJhbCwKKyAgICAgICAgaW1wb3J0LXN0YXItbW9kdWxlLWxldmVsLAorICAgICAgICBub24tYXNjaWktYnl0ZXMtbGl0ZXJhbCwKKyAgICAgICAgcmF3LWNoZWNrZXItZmFpbGVkLAorICAgICAgICBiYWQtaW5saW5lLW9wdGlvbiwKKyAgICAgICAgbG9jYWxseS1kaXNhYmxlZCwKKyAgICAgICAgZmlsZS1pZ25vcmVkLAorICAgICAgICBzdXBwcmVzc2VkLW1lc3NhZ2UsCisgICAgICAgIHVzZWxlc3Mtc3VwcHJlc3Npb24sCisgICAgICAgIGRlcHJlY2F0ZWQtcHJhZ21hLAorICAgICAgICB1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkLAorICAgICAgICBhcHBseS1idWlsdGluLAorICAgICAgICBiYXNlc3RyaW5nLWJ1aWx0aW4sCisgICAgICAgIGJ1ZmZlci1idWlsdGluLAorICAgICAgICBjbXAtYnVpbHRpbiwKKyAgICAgICAgY29lcmNlLWJ1aWx0aW4sCisgICAgICAgIGV4ZWNmaWxlLWJ1aWx0aW4sCisgICAgICAgIGZpbGUtYnVpbHRpbiwKKyAgICAgICAgbG9uZy1idWlsdGluLAorICAgICAgICByYXdfaW5wdXQtYnVpbHRpbiwKKyAgICAgICAgcmVkdWNlLWJ1aWx0aW4sCisgICAgICAgIHN0YW5kYXJkZXJyb3ItYnVpbHRpbiwKKyAgICAgICAgdW5pY29kZS1idWlsdGluLAorICAgICAgICB4cmFuZ2UtYnVpbHRpbiwKKyAgICAgICAgY29lcmNlLW1ldGhvZCwKKyAgICAgICAgZGVsc2xpY2UtbWV0aG9kLAorICAgICAgICBnZXRzbGljZS1tZXRob2QsCisgICAgICAgIHNldHNsaWNlLW1ldGhvZCwKKyAgICAgICAgbm8tYWJzb2x1dGUtaW1wb3J0LAorICAgICAgICBvbGQtZGl2aXNpb24sCisgICAgICAgIGRpY3QtaXRlci1tZXRob2QsCisgICAgICAgIGRpY3Qtdmlldy1tZXRob2QsCisgICAgICAgIG5leHQtbWV0aG9kLWNhbGxlZCwKKyAgICAgICAgbWV0YWNsYXNzLWFzc2lnbm1lbnQsCisgICAgICAgIGluZGV4aW5nLWV4Y2VwdGlvbiwKKyAgICAgICAgcmFpc2luZy1zdHJpbmcsCisgICAgICAgIHJlbG9hZC1idWlsdGluLAorICAgICAgICBvY3QtbWV0aG9kLAorICAgICAgICBoZXgtbWV0aG9kLAorICAgICAgICBub256ZXJvLW1ldGhvZCwKKyAgICAgICAgY21wLW1ldGhvZCwKKyAgICAgICAgaW5wdXQtYnVpbHRpbiwKKyAgICAgICAgcm91bmQtYnVpbHRpbiwKKyAgICAgICAgaW50ZXJuLWJ1aWx0aW4sCisgICAgICAgIHVuaWNoci1idWlsdGluLAorICAgICAgICBtYXAtYnVpbHRpbi1ub3QtaXRlcmF0aW5nLAorICAgICAgICB6aXAtYnVpbHRpbi1ub3QtaXRlcmF0aW5nLAorICAgICAgICByYW5nZS1idWlsdGluLW5vdC1pdGVyYXRpbmcsCisgICAgICAgIGZpbHRlci1idWlsdGluLW5vdC1pdGVyYXRpbmcsCisgICAgICAgIHVzaW5nLWNtcC1hcmd1bWVudCwKKyAgICAgICAgZXEtd2l0aG91dC1oYXNoLAorICAgICAgICBkaXYtbWV0aG9kLAorICAgICAgICBpZGl2LW1ldGhvZCwKKyAgICAgICAgcmRpdi1tZXRob2QsCisgICAgICAgIGV4Y2VwdGlvbi1tZXNzYWdlLWF0dHJpYnV0ZSwKKyAgICAgICAgaW52YWxpZC1zdHItY29kZWMsCisgICAgICAgIHN5cy1tYXgtaW50LAorICAgICAgICBiYWQtcHl0aG9uMy1pbXBvcnQsCisgICAgICAgIGRlcHJlY2F0ZWQtc3RyaW5nLWZ1bmN0aW9uLAorICAgICAgICBkZXByZWNhdGVkLXN0ci10cmFuc2xhdGUtY2FsbCwKKyAgICAgICAgZGVwcmVjYXRlZC1pdGVydG9vbHMtZnVuY3Rpb24sCisgICAgICAgIGRlcHJlY2F0ZWQtdHlwZXMtZmllbGQsCisgICAgICAgIG5leHQtbWV0aG9kLWRlZmluZWQsCisgICAgICAgIGRpY3QtaXRlbXMtbm90LWl0ZXJhdGluZywKKyAgICAgICAgZGljdC1rZXlzLW5vdC1pdGVyYXRpbmcsCisgICAgICAgIGRpY3QtdmFsdWVzLW5vdC1pdGVyYXRpbmcsCisgICAgICAgIGRlcHJlY2F0ZWQtb3BlcmF0b3ItZnVuY3Rpb24sCisgICAgICAgIGRlcHJlY2F0ZWQtdXJsbGliLWZ1bmN0aW9uLAorICAgICAgICB4cmVhZGxpbmVzLWF0dHJpYnV0ZSwKKyAgICAgICAgZGVwcmVjYXRlZC1zeXMtZnVuY3Rpb24sCisgICAgICAgIGV4Y2VwdGlvbi1lc2NhcGUsCisgICAgICAgIGNvbXByZWhlbnNpb24tZXNjYXBlCisKKyMgRW5hYmxlIHRoZSBtZXNzYWdlLCByZXBvcnQsIGNhdGVnb3J5IG9yIGNoZWNrZXIgd2l0aCB0aGUgZ2l2ZW4gaWQocykuIFlvdSBjYW4KKyMgZWl0aGVyIGdpdmUgbXVsdGlwbGUgaWRlbnRpZmllciBzZXBhcmF0ZWQgYnkgY29tbWEgKCwpIG9yIHB1dCB0aGlzIG9wdGlvbgorIyBtdWx0aXBsZSB0aW1lIChvbmx5IG9uIHRoZSBjb21tYW5kIGxpbmUsIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdoZXJlCisjIGl0IHNob3VsZCBhcHBlYXIgb25seSBvbmNlKS4gU2VlIGFsc28gdGhlICItLWRpc2FibGUiIG9wdGlvbiBmb3IgZXhhbXBsZXMuCitlbmFibGU9Yy1leHRlbnNpb24tbm8tbWVtYmVyCisKKworW1JFUE9SVFNdCisKKyMgUHl0aG9uIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIHJldHVybiBhIHNjb3JlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMC4gWW91CisjIGhhdmUgYWNjZXNzIHRvIHRoZSB2YXJpYWJsZXMgJ2Vycm9yJywgJ3dhcm5pbmcnLCAncmVmYWN0b3InLCBhbmQgJ2NvbnZlbnRpb24nCisjIHdoaWNoIGNvbnRhaW4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBpbiBlYWNoIGNhdGVnb3J5LCBhcyB3ZWxsIGFzICdzdGF0ZW1lbnQnCisjIHdoaWNoIGlzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3RhdGVtZW50cyBhbmFseXplZC4gVGhpcyBzY29yZSBpcyB1c2VkIGJ5IHRoZQorIyBnbG9iYWwgZXZhbHVhdGlvbiByZXBvcnQgKFJQMDAwNCkuCitldmFsdWF0aW9uPTEwLjAgLSAoKGZsb2F0KDUgKiBlcnJvciArIHdhcm5pbmcgKyByZWZhY3RvciArIGNvbnZlbnRpb24pIC8gc3RhdGVtZW50KSAqIDEwKQorCisjIFRlbXBsYXRlIHVzZWQgdG8gZGlzcGxheSBtZXNzYWdlcy4gVGhpcyBpcyBhIHB5dGhvbiBuZXctc3R5bGUgZm9ybWF0IHN0cmluZworIyB1c2VkIHRvIGZvcm1hdCB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbi4gU2VlIGRvYyBmb3IgYWxsIGRldGFpbHMuCisjbXNnLXRlbXBsYXRlPQorCisjIFNldCB0aGUgb3V0cHV0IGZvcm1hdC4gQXZhaWxhYmxlIGZvcm1hdHMgYXJlIHRleHQsIHBhcnNlYWJsZSwgY29sb3JpemVkLCBqc29uCisjIGFuZCBtc3ZzICh2aXN1YWwgc3R1ZGlvKS4gWW91IGNhbiBhbHNvIGdpdmUgYSByZXBvcnRlciBjbGFzcywgZS5nLgorIyBteXBhY2thZ2UubXltb2R1bGUuTXlSZXBvcnRlckNsYXNzLgorb3V0cHV0LWZvcm1hdD10ZXh0CisKKyMgVGVsbHMgd2hldGhlciB0byBkaXNwbGF5IGEgZnVsbCByZXBvcnQgb3Igb25seSB0aGUgbWVzc2FnZXMuCityZXBvcnRzPW5vCisKKyMgQWN0aXZhdGUgdGhlIGV2YWx1YXRpb24gc2NvcmUuCitzY29yZT15ZXMKKworCitbUkVGQUNUT1JJTkddCisKKyMgTWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIGJsb2NrcyBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LW5lc3RlZC1ibG9ja3M9NQorCisjIENvbXBsZXRlIG5hbWUgb2YgZnVuY3Rpb25zIHRoYXQgbmV2ZXIgcmV0dXJucy4gV2hlbiBjaGVja2luZyBmb3IKKyMgaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzIGlmIGEgbmV2ZXIgcmV0dXJuaW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCB0aGVuCisjIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBhcyBhbiBleHBsaWNpdCByZXR1cm4gc3RhdGVtZW50IGFuZCBubyBtZXNzYWdlIHdpbGwgYmUKKyMgcHJpbnRlZC4KK25ldmVyLXJldHVybmluZy1mdW5jdGlvbnM9c3lzLmV4aXQKKworCitbTE9HR0lOR10KKworIyBGb3JtYXQgc3R5bGUgdXNlZCB0byBjaGVjayBsb2dnaW5nIGZvcm1hdCBzdHJpbmcuIGBvbGRgIG1lYW5zIHVzaW5nICUKKyMgZm9ybWF0dGluZyBhbmQgYG5ld2AgaXMgZm9yIGB7fWAgZm9ybWF0dGluZy4KK2xvZ2dpbmctZm9ybWF0LXN0eWxlPW9sZAorCisjIExvZ2dpbmcgbW9kdWxlcyB0byBjaGVjayB0aGF0IHRoZSBzdHJpbmcgZm9ybWF0IGFyZ3VtZW50cyBhcmUgaW4gbG9nZ2luZworIyBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9ybWF0LgorbG9nZ2luZy1tb2R1bGVzPWxvZ2dpbmcKKworCitbU1BFTExJTkddCisKKyMgTGltaXRzIGNvdW50IG9mIGVtaXR0ZWQgc3VnZ2VzdGlvbnMgZm9yIHNwZWxsaW5nIG1pc3Rha2VzLgorbWF4LXNwZWxsaW5nLXN1Z2dlc3Rpb25zPTQKKworIyBTcGVsbGluZyBkaWN0aW9uYXJ5IG5hbWUuIEF2YWlsYWJsZSBkaWN0aW9uYXJpZXM6IG5vbmUuIFRvIG1ha2UgaXQgd29yaywKKyMgaW5zdGFsbCB0aGUgcHl0aG9uLWVuY2hhbnQgcGFja2FnZS4KK3NwZWxsaW5nLWRpY3Q9CisKKyMgTGlzdCBvZiBjb21tYSBzZXBhcmF0ZWQgd29yZHMgdGhhdCBzaG91bGQgbm90IGJlIGNoZWNrZWQuCitzcGVsbGluZy1pZ25vcmUtd29yZHM9CisKKyMgQSBwYXRoIHRvIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwcml2YXRlIGRpY3Rpb25hcnk7IG9uZSB3b3JkIHBlciBsaW5lLgorc3BlbGxpbmctcHJpdmF0ZS1kaWN0LWZpbGU9CisKKyMgVGVsbHMgd2hldGhlciB0byBzdG9yZSB1bmtub3duIHdvcmRzIHRvIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgKHNlZSB0aGUKKyMgLS1zcGVsbGluZy1wcml2YXRlLWRpY3QtZmlsZSBvcHRpb24pIGluc3RlYWQgb2YgcmFpc2luZyBhIG1lc3NhZ2UuCitzcGVsbGluZy1zdG9yZS11bmtub3duLXdvcmRzPW5vCisKKworW01JU0NFTExBTkVPVVNdCisKKyMgTGlzdCBvZiBub3RlIHRhZ3MgdG8gdGFrZSBpbiBjb25zaWRlcmF0aW9uLCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KK25vdGVzPUZJWE1FLAorICAgICAgWFhYLAorICAgICAgVE9ETworCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBub3RlIHRhZ3MgdG8gdGFrZSBpbiBjb25zaWRlcmF0aW9uLgorI25vdGVzLXJneD0KKworCitbVFlQRUNIRUNLXQorCisjIExpc3Qgb2YgZGVjb3JhdG9ycyB0aGF0IHByb2R1Y2UgY29udGV4dCBtYW5hZ2Vycywgc3VjaCBhcworIyBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyLiBBZGQgdG8gdGhpcyBsaXN0IHRvIHJlZ2lzdGVyIG90aGVyIGRlY29yYXRvcnMgdGhhdAorIyBwcm9kdWNlIHZhbGlkIGNvbnRleHQgbWFuYWdlcnMuCitjb250ZXh0bWFuYWdlci1kZWNvcmF0b3JzPWNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKworIyBMaXN0IG9mIG1lbWJlcnMgd2hpY2ggYXJlIHNldCBkeW5hbWljYWxseSBhbmQgbWlzc2VkIGJ5IHB5bGludCBpbmZlcmVuY2UKKyMgc3lzdGVtLCBhbmQgc28gc2hvdWxkbid0IHRyaWdnZXIgRTExMDEgd2hlbiBhY2Nlc3NlZC4gUHl0aG9uIHJlZ3VsYXIKKyMgZXhwcmVzc2lvbnMgYXJlIGFjY2VwdGVkLgorZ2VuZXJhdGVkLW1lbWJlcnM9CisKKyMgVGVsbHMgd2hldGhlciBtaXNzaW5nIG1lbWJlcnMgYWNjZXNzZWQgaW4gbWl4aW4gY2xhc3Mgc2hvdWxkIGJlIGlnbm9yZWQuIEEKKyMgbWl4aW4gY2xhc3MgaXMgZGV0ZWN0ZWQgaWYgaXRzIG5hbWUgZW5kcyB3aXRoICJtaXhpbiIgKGNhc2UgaW5zZW5zaXRpdmUpLgoraWdub3JlLW1peGluLW1lbWJlcnM9eWVzCisKKyMgVGVsbHMgd2hldGhlciB0byB3YXJuIGFib3V0IG1pc3NpbmcgbWVtYmVycyB3aGVuIHRoZSBvd25lciBvZiB0aGUgYXR0cmlidXRlCisjIGlzIGluZmVycmVkIHRvIGJlIE5vbmUuCitpZ25vcmUtbm9uZT15ZXMKKworIyBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBweWxpbnQgc2hvdWxkIHdhcm4gYWJvdXQgbm8tbWVtYmVyIGFuZCBzaW1pbGFyCisjIGNoZWNrcyB3aGVuZXZlciBhbiBvcGFxdWUgb2JqZWN0IGlzIHJldHVybmVkIHdoZW4gaW5mZXJyaW5nLiBUaGUgaW5mZXJlbmNlCisjIGNhbiByZXR1cm4gbXVsdGlwbGUgcG90ZW50aWFsIHJlc3VsdHMgd2hpbGUgZXZhbHVhdGluZyBhIFB5dGhvbiBvYmplY3QsIGJ1dAorIyBzb21lIGJyYW5jaGVzIG1pZ2h0IG5vdCBiZSBldmFsdWF0ZWQsIHdoaWNoIHJlc3VsdHMgaW4gcGFydGlhbCBpbmZlcmVuY2UuIEluCisjIHRoYXQgY2FzZSwgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIHN0aWxsIGVtaXQgbm8tbWVtYmVyIGFuZCBvdGhlciBjaGVja3MgZm9yCisjIHRoZSByZXN0IG9mIHRoZSBpbmZlcnJlZCBvYmplY3RzLgoraWdub3JlLW9uLW9wYXF1ZS1pbmZlcmVuY2U9eWVzCisKKyMgTGlzdCBvZiBjbGFzcyBuYW1lcyBmb3Igd2hpY2ggbWVtYmVyIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBjaGVja2VkICh1c2VmdWwKKyMgZm9yIGNsYXNzZXMgd2l0aCBkeW5hbWljYWxseSBzZXQgYXR0cmlidXRlcykuIFRoaXMgc3VwcG9ydHMgdGhlIHVzZSBvZgorIyBxdWFsaWZpZWQgbmFtZXMuCitpZ25vcmVkLWNsYXNzZXM9b3B0cGFyc2UuVmFsdWVzLHRocmVhZC5fbG9jYWwsX3RocmVhZC5fbG9jYWwKKworIyBMaXN0IG9mIG1vZHVsZSBuYW1lcyBmb3Igd2hpY2ggbWVtYmVyIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBjaGVja2VkCisjICh1c2VmdWwgZm9yIG1vZHVsZXMvcHJvamVjdHMgd2hlcmUgbmFtZXNwYWNlcyBhcmUgbWFuaXB1bGF0ZWQgZHVyaW5nIHJ1bnRpbWUKKyMgYW5kIHRodXMgZXhpc3RpbmcgbWVtYmVyIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGRlZHVjZWQgYnkgc3RhdGljIGFuYWx5c2lzKS4gSXQKKyMgc3VwcG9ydHMgcXVhbGlmaWVkIG1vZHVsZSBuYW1lcywgYXMgd2VsbCBhcyBVbml4IHBhdHRlcm4gbWF0Y2hpbmcuCitpZ25vcmVkLW1vZHVsZXM9CisKKyMgU2hvdyBhIGhpbnQgd2l0aCBwb3NzaWJsZSBuYW1lcyB3aGVuIGEgbWVtYmVyIG5hbWUgd2FzIG5vdCBmb3VuZC4gVGhlIGFzcGVjdAorIyBvZiBmaW5kaW5nIHRoZSBoaW50IGlzIGJhc2VkIG9uIGVkaXQgZGlzdGFuY2UuCittaXNzaW5nLW1lbWJlci1oaW50PXllcworCisjIFRoZSBtaW5pbXVtIGVkaXQgZGlzdGFuY2UgYSBuYW1lIHNob3VsZCBoYXZlIGluIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQgYQorIyBzaW1pbGFyIG1hdGNoIGZvciBhIG1pc3NpbmcgbWVtYmVyIG5hbWUuCittaXNzaW5nLW1lbWJlci1oaW50LWRpc3RhbmNlPTEKKworIyBUaGUgdG90YWwgbnVtYmVyIG9mIHNpbWlsYXIgbmFtZXMgdGhhdCBzaG91bGQgYmUgdGFrZW4gaW4gY29uc2lkZXJhdGlvbiB3aGVuCisjIHNob3dpbmcgYSBoaW50IGZvciBhIG1pc3NpbmcgbWVtYmVyLgorbWlzc2luZy1tZW1iZXItbWF4LWNob2ljZXM9MQorCisjIExpc3Qgb2YgZGVjb3JhdG9ycyB0aGF0IGNoYW5nZSB0aGUgc2lnbmF0dXJlIG9mIGEgZGVjb3JhdGVkIGZ1bmN0aW9uLgorc2lnbmF0dXJlLW11dGF0b3JzPQorCisKK1tWQVJJQUJMRVNdCisKKyMgTGlzdCBvZiBhZGRpdGlvbmFsIG5hbWVzIHN1cHBvc2VkIHRvIGJlIGRlZmluZWQgaW4gYnVpbHRpbnMuIFJlbWVtYmVyIHRoYXQKKyMgeW91IHNob3VsZCBhdm9pZCBkZWZpbmluZyBuZXcgYnVpbHRpbnMgd2hlbiBwb3NzaWJsZS4KK2FkZGl0aW9uYWwtYnVpbHRpbnM9CisKKyMgVGVsbHMgd2hldGhlciB1bnVzZWQgZ2xvYmFsIHZhcmlhYmxlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHZpb2xhdGlvbi4KK2FsbG93LWdsb2JhbC11bnVzZWQtdmFyaWFibGVzPXllcworCisjIExpc3Qgb2Ygc3RyaW5ncyB3aGljaCBjYW4gaWRlbnRpZnkgYSBjYWxsYmFjayBmdW5jdGlvbiBieSBuYW1lLiBBIGNhbGxiYWNrCisjIG5hbWUgbXVzdCBzdGFydCBvciBlbmQgd2l0aCBvbmUgb2YgdGhvc2Ugc3RyaW5ncy4KK2NhbGxiYWNrcz1jYl8sCisgICAgICAgICAgX2NiCisKKyMgQSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgdGhlIG5hbWUgb2YgZHVtbXkgdmFyaWFibGVzIChpLmUuIGV4cGVjdGVkIHRvCisjIG5vdCBiZSB1c2VkKS4KK2R1bW15LXZhcmlhYmxlcy1yZ3g9XyskfChfW2EtekEtWjAtOV9dKlthLXpBLVowLTldKz8kKXxkdW1teXxeaWdub3JlZF98XnVudXNlZF8KKworIyBBcmd1bWVudCBuYW1lcyB0aGF0IG1hdGNoIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHQgdG8gbmFtZQorIyB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZS4KK2lnbm9yZWQtYXJndW1lbnQtbmFtZXM9Xy4qfF5pZ25vcmVkX3xedW51c2VkXworCisjIFRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGNoZWNrIGZvciB1bnVzZWQgaW1wb3J0IGluIF9faW5pdF9fIGZpbGVzLgoraW5pdC1pbXBvcnQ9bm8KKworIyBMaXN0IG9mIHF1YWxpZmllZCBtb2R1bGUgbmFtZXMgd2hpY2ggY2FuIGhhdmUgb2JqZWN0cyB0aGF0IGNhbiByZWRlZmluZQorIyBidWlsdGlucy4KK3JlZGVmaW5pbmctYnVpbHRpbnMtbW9kdWxlcz1zaXgubW92ZXMscGFzdC5idWlsdGlucyxmdXR1cmUuYnVpbHRpbnMsYnVpbHRpbnMsaW8KKworCitbRk9STUFUXQorCisjIEV4cGVjdGVkIGZvcm1hdCBvZiBsaW5lIGVuZGluZywgZS5nLiBlbXB0eSAoYW55IGxpbmUgZW5kaW5nKSwgTEYgb3IgQ1JMRi4KK2V4cGVjdGVkLWxpbmUtZW5kaW5nLWZvcm1hdD0KKworIyBSZWdleHAgZm9yIGEgbGluZSB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIGxpbWl0LgoraWdub3JlLWxvbmctbGluZXM9XlxzKigjICk/PD9odHRwcz86Ly9cUys+PyQKKworIyBOdW1iZXIgb2Ygc3BhY2VzIG9mIGluZGVudCByZXF1aXJlZCBpbnNpZGUgYSBoYW5naW5nIG9yIGNvbnRpbnVlZCBsaW5lLgoraW5kZW50LWFmdGVyLXBhcmVuPTQKKworIyBTdHJpbmcgdXNlZCBhcyBpbmRlbnRhdGlvbiB1bml0LiBUaGlzIGlzIHVzdWFsbHkgIiAgICAiICg0IHNwYWNlcykgb3IgIlx0IiAoMQorIyB0YWIpLgoraW5kZW50LXN0cmluZz0nICAgICcKKworIyBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9uIGEgc2luZ2xlIGxpbmUuCittYXgtbGluZS1sZW5ndGg9MTAwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgaW4gYSBtb2R1bGUuCittYXgtbW9kdWxlLWxpbmVzPTEwMDAKKworIyBMaXN0IG9mIG9wdGlvbmFsIGNvbnN0cnVjdHMgZm9yIHdoaWNoIHdoaXRlc3BhY2UgY2hlY2tpbmcgaXMgZGlzYWJsZWQuIGBkaWN0LQorIyBzZXBhcmF0b3JgIGlzIHVzZWQgdG8gYWxsb3cgdGFidWxhdGlvbiBpbiBkaWN0cywgZXRjLjogezEgIDogMSxcbjIyMjogMn0uCisjIGB0cmFpbGluZy1jb21tYWAgYWxsb3dzIGEgc3BhY2UgYmV0d2VlbiBjb21tYSBhbmQgY2xvc2luZyBicmFja2V0OiAoYSwgKS4KKyMgYGVtcHR5LWxpbmVgIGFsbG93cyBzcGFjZS1vbmx5IGxpbmVzLgorbm8tc3BhY2UtY2hlY2s9dHJhaWxpbmctY29tbWEsCisgICAgICAgICAgICAgICBkaWN0LXNlcGFyYXRvcgorCisjIEFsbG93IHRoZSBib2R5IG9mIGEgY2xhc3MgdG8gYmUgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZGVjbGFyYXRpb24gaWYgYm9keQorIyBjb250YWlucyBzaW5nbGUgc3RhdGVtZW50Lgorc2luZ2xlLWxpbmUtY2xhc3Mtc3RtdD1ubworCisjIEFsbG93IHRoZSBib2R5IG9mIGFuIGlmIHRvIGJlIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIHRlc3QgaWYgdGhlcmUgaXMgbm8KKyMgZWxzZS4KK3NpbmdsZS1saW5lLWlmLXN0bXQ9bm8KKworCitbU0lNSUxBUklUSUVTXQorCisjIElnbm9yZSBjb21tZW50cyB3aGVuIGNvbXB1dGluZyBzaW1pbGFyaXRpZXMuCitpZ25vcmUtY29tbWVudHM9eWVzCisKKyMgSWdub3JlIGRvY3N0cmluZ3Mgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLgoraWdub3JlLWRvY3N0cmluZ3M9eWVzCisKKyMgSWdub3JlIGltcG9ydHMgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLgoraWdub3JlLWltcG9ydHM9bm8KKworIyBNaW5pbXVtIGxpbmVzIG51bWJlciBvZiBhIHNpbWlsYXJpdHkuCittaW4tc2ltaWxhcml0eS1saW5lcz00CisKKworW0JBU0lDXQorCisjIE5hbWluZyBzdHlsZSBtYXRjaGluZyBjb3JyZWN0IGFyZ3VtZW50IG5hbWVzLgorYXJndW1lbnQtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBhcmd1bWVudCBuYW1lcy4gT3ZlcnJpZGVzIGFyZ3VtZW50LQorIyBuYW1pbmctc3R5bGUuCisjYXJndW1lbnQtcmd4PQorCisjIE5hbWluZyBzdHlsZSBtYXRjaGluZyBjb3JyZWN0IGF0dHJpYnV0ZSBuYW1lcy4KK2F0dHItbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBhdHRyaWJ1dGUgbmFtZXMuIE92ZXJyaWRlcyBhdHRyLW5hbWluZy0KKyMgc3R5bGUuCisjYXR0ci1yZ3g9CisKKyMgQmFkIHZhcmlhYmxlIG5hbWVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgcmVmdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCitiYWQtbmFtZXM9Zm9vLAorICAgICAgICAgIGJhciwKKyAgICAgICAgICBiYXosCisgICAgICAgICAgdG90bywKKyAgICAgICAgICB0dXR1LAorICAgICAgICAgIHRhdGEKKworIyBCYWQgdmFyaWFibGUgbmFtZXMgcmVnZXhlcywgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIElmIG5hbWVzIG1hdGNoIGFueSByZWdleCwKKyMgdGhleSB3aWxsIGFsd2F5cyBiZSByZWZ1c2VkCitiYWQtbmFtZXMtcmd4cz0KKworIyBOYW1pbmcgc3R5bGUgbWF0Y2hpbmcgY29ycmVjdCBjbGFzcyBhdHRyaWJ1dGUgbmFtZXMuCitjbGFzcy1hdHRyaWJ1dGUtbmFtaW5nLXN0eWxlPWFueQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IGNsYXNzIGF0dHJpYnV0ZSBuYW1lcy4gT3ZlcnJpZGVzIGNsYXNzLQorIyBhdHRyaWJ1dGUtbmFtaW5nLXN0eWxlLgorI2NsYXNzLWF0dHJpYnV0ZS1yZ3g9CisKKyMgTmFtaW5nIHN0eWxlIG1hdGNoaW5nIGNvcnJlY3QgY2xhc3MgbmFtZXMuCitjbGFzcy1uYW1pbmctc3R5bGU9UGFzY2FsQ2FzZQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IGNsYXNzIG5hbWVzLiBPdmVycmlkZXMgY2xhc3MtbmFtaW5nLQorIyBzdHlsZS4KKyNjbGFzcy1yZ3g9CisKKyMgTmFtaW5nIHN0eWxlIG1hdGNoaW5nIGNvcnJlY3QgY29uc3RhbnQgbmFtZXMuCitjb25zdC1uYW1pbmctc3R5bGU9VVBQRVJfQ0FTRQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IGNvbnN0YW50IG5hbWVzLiBPdmVycmlkZXMgY29uc3QtbmFtaW5nLQorIyBzdHlsZS4KKyNjb25zdC1yZ3g9CisKKyMgTWluaW11bSBsaW5lIGxlbmd0aCBmb3IgZnVuY3Rpb25zL2NsYXNzZXMgdGhhdCByZXF1aXJlIGRvY3N0cmluZ3MsIHNob3J0ZXIKKyMgb25lcyBhcmUgZXhlbXB0LgorZG9jc3RyaW5nLW1pbi1sZW5ndGg9LTEKKworIyBOYW1pbmcgc3R5bGUgbWF0Y2hpbmcgY29ycmVjdCBmdW5jdGlvbiBuYW1lcy4KK2Z1bmN0aW9uLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCisKKyMgUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGNvcnJlY3QgZnVuY3Rpb24gbmFtZXMuIE92ZXJyaWRlcyBmdW5jdGlvbi0KKyMgbmFtaW5nLXN0eWxlLgorI2Z1bmN0aW9uLXJneD0KKworIyBHb29kIHZhcmlhYmxlIG5hbWVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgYWNjZXB0ZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hLgorZ29vZC1uYW1lcz1pLAorICAgICAgICAgICBqLAorICAgICAgICAgICBrLAorICAgICAgICAgICBleCwKKyAgICAgICAgICAgUnVuLAorICAgICAgICAgICBfCisKKyMgR29vZCB2YXJpYWJsZSBuYW1lcyByZWdleGVzLCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gSWYgbmFtZXMgbWF0Y2ggYW55IHJlZ2V4LAorIyB0aGV5IHdpbGwgYWx3YXlzIGJlIGFjY2VwdGVkCitnb29kLW5hbWVzLXJneHM9CisKKyMgSW5jbHVkZSBhIGhpbnQgZm9yIHRoZSBjb3JyZWN0IG5hbWluZyBmb3JtYXQgd2l0aCBpbnZhbGlkLW5hbWUuCitpbmNsdWRlLW5hbWluZy1oaW50PW5vCisKKyMgTmFtaW5nIHN0eWxlIG1hdGNoaW5nIGNvcnJlY3QgaW5saW5lIGl0ZXJhdGlvbiBuYW1lcy4KK2lubGluZXZhci1uYW1pbmctc3R5bGU9YW55CisKKyMgUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGNvcnJlY3QgaW5saW5lIGl0ZXJhdGlvbiBuYW1lcy4gT3ZlcnJpZGVzCisjIGlubGluZXZhci1uYW1pbmctc3R5bGUuCisjaW5saW5ldmFyLXJneD0KKworIyBOYW1pbmcgc3R5bGUgbWF0Y2hpbmcgY29ycmVjdCBtZXRob2QgbmFtZXMuCittZXRob2QtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBtZXRob2QgbmFtZXMuIE92ZXJyaWRlcyBtZXRob2QtbmFtaW5nLQorIyBzdHlsZS4KKyNtZXRob2Qtcmd4PQorCisjIE5hbWluZyBzdHlsZSBtYXRjaGluZyBjb3JyZWN0IG1vZHVsZSBuYW1lcy4KK21vZHVsZS1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IG1vZHVsZSBuYW1lcy4gT3ZlcnJpZGVzIG1vZHVsZS1uYW1pbmctCisjIHN0eWxlLgorI21vZHVsZS1yZ3g9CisKKyMgQ29sb24tZGVsaW1pdGVkIHNldHMgb2YgbmFtZXMgdGhhdCBkZXRlcm1pbmUgZWFjaCBvdGhlcidzIG5hbWluZyBzdHlsZSB3aGVuCisjIHRoZSBuYW1lIHJlZ2V4ZXMgYWxsb3cgc2V2ZXJhbCBzdHlsZXMuCituYW1lLWdyb3VwPQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBmdW5jdGlvbiBvciBjbGFzcyBuYW1lcyB0aGF0IGRvCisjIG5vdCByZXF1aXJlIGEgZG9jc3RyaW5nLgorbm8tZG9jc3RyaW5nLXJneD1eXworCisjIExpc3Qgb2YgZGVjb3JhdG9ycyB0aGF0IHByb2R1Y2UgcHJvcGVydGllcywgc3VjaCBhcyBhYmMuYWJzdHJhY3Rwcm9wZXJ0eS4gQWRkCisjIHRvIHRoaXMgbGlzdCB0byByZWdpc3RlciBvdGhlciBkZWNvcmF0b3JzIHRoYXQgcHJvZHVjZSB2YWxpZCBwcm9wZXJ0aWVzLgorIyBUaGVzZSBkZWNvcmF0b3JzIGFyZSB0YWtlbiBpbiBjb25zaWRlcmF0aW9uIG9ubHkgZm9yIGludmFsaWQtbmFtZS4KK3Byb3BlcnR5LWNsYXNzZXM9YWJjLmFic3RyYWN0cHJvcGVydHkKKworIyBOYW1pbmcgc3R5bGUgbWF0Y2hpbmcgY29ycmVjdCB2YXJpYWJsZSBuYW1lcy4KK3ZhcmlhYmxlLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCisKKyMgUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGNvcnJlY3QgdmFyaWFibGUgbmFtZXMuIE92ZXJyaWRlcyB2YXJpYWJsZS0KKyMgbmFtaW5nLXN0eWxlLgorI3ZhcmlhYmxlLXJneD0KKworCitbU1RSSU5HXQorCisjIFRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIGluY29uc2lzdGVudC1xdW90ZXMgZ2VuZXJhdGVzIGEgd2FybmluZyB3aGVuIHRoZQorIyBjaGFyYWN0ZXIgdXNlZCBhcyBhIHF1b3RlIGRlbGltaXRlciBpcyB1c2VkIGluY29uc2lzdGVudGx5IHdpdGhpbiBhIG1vZHVsZS4KK2NoZWNrLXF1b3RlLWNvbnNpc3RlbmN5PW5vCisKKyMgVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGltcGxpY2l0LXN0ci1jb25jYXQgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZworIyBvbiBpbXBsaWNpdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBzZXF1ZW5jZXMgZGVmaW5lZCBvdmVyIHNldmVyYWwgbGluZXMuCitjaGVjay1zdHItY29uY2F0LW92ZXItbGluZS1qdW1wcz1ubworCisKK1tJTVBPUlRTXQorCisjIExpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSBpbXBvcnRlZCBhdCBhbnkgbGV2ZWwsIG5vdCBqdXN0IHRoZSB0b3AgbGV2ZWwKKyMgb25lLgorYWxsb3ctYW55LWltcG9ydC1sZXZlbD0KKworIyBBbGxvdyB3aWxkY2FyZCBpbXBvcnRzIGZyb20gbW9kdWxlcyB0aGF0IGRlZmluZSBfX2FsbF9fLgorYWxsb3ctd2lsZGNhcmQtd2l0aC1hbGw9bm8KKworIyBBbmFseXNlIGltcG9ydCBmYWxsYmFjayBibG9ja3MuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCBib3RoIFB5dGhvbiAyIGFuZAorIyAzIGNvbXBhdGlibGUgY29kZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYmxvY2sgbWlnaHQgaGF2ZSBjb2RlIHRoYXQgZXhpc3RzCisjIG9ubHkgaW4gb25lIG9yIGFub3RoZXIgaW50ZXJwcmV0ZXIsIGxlYWRpbmcgdG8gZmFsc2UgcG9zaXRpdmVzIHdoZW4gYW5hbHlzZWQuCithbmFseXNlLWZhbGxiYWNrLWJsb2Nrcz1ubworCisjIERlcHJlY2F0ZWQgbW9kdWxlcyB3aGljaCBzaG91bGQgbm90IGJlIHVzZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hLgorZGVwcmVjYXRlZC1tb2R1bGVzPW9wdHBhcnNlLHRraW50ZXIudGl4CisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGluIHRoZSBnaXZlbiBmaWxlIChyZXBvcnQgUlAwNDAyIG11c3QKKyMgbm90IGJlIGRpc2FibGVkKS4KK2V4dC1pbXBvcnQtZ3JhcGg9CisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgZXZlcnkgKGkuZS4gaW50ZXJuYWwgYW5kIGV4dGVybmFsKSBkZXBlbmRlbmNpZXMgaW4gdGhlCisjIGdpdmVuIGZpbGUgKHJlcG9ydCBSUDA0MDIgbXVzdCBub3QgYmUgZGlzYWJsZWQpLgoraW1wb3J0LWdyYXBoPQorCisjIENyZWF0ZSBhIGdyYXBoIG9mIGludGVybmFsIGRlcGVuZGVuY2llcyBpbiB0aGUgZ2l2ZW4gZmlsZSAocmVwb3J0IFJQMDQwMiBtdXN0CisjIG5vdCBiZSBkaXNhYmxlZCkuCitpbnQtaW1wb3J0LWdyYXBoPQorCisjIEZvcmNlIGltcG9ydCBvcmRlciB0byByZWNvZ25pemUgYSBtb2R1bGUgYXMgcGFydCBvZiB0aGUgc3RhbmRhcmQKKyMgY29tcGF0aWJpbGl0eSBsaWJyYXJpZXMuCitrbm93bi1zdGFuZGFyZC1saWJyYXJ5PQorCisjIEZvcmNlIGltcG9ydCBvcmRlciB0byByZWNvZ25pemUgYSBtb2R1bGUgYXMgcGFydCBvZiBhIHRoaXJkIHBhcnR5IGxpYnJhcnkuCitrbm93bi10aGlyZC1wYXJ0eT1lbmNoYW50CisKKyMgQ291cGxlcyBvZiBtb2R1bGVzIGFuZCBwcmVmZXJyZWQgbW9kdWxlcywgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCitwcmVmZXJyZWQtbW9kdWxlcz0KKworCitbQ0xBU1NFU10KKworIyBMaXN0IG9mIG1ldGhvZCBuYW1lcyB1c2VkIHRvIGRlY2xhcmUgKGkuZS4gYXNzaWduKSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgorZGVmaW5pbmctYXR0ci1tZXRob2RzPV9faW5pdF9fLAorICAgICAgICAgICAgICAgICAgICAgIF9fbmV3X18sCisgICAgICAgICAgICAgICAgICAgICAgc2V0VXAsCisgICAgICAgICAgICAgICAgICAgICAgX19wb3N0X2luaXRfXworCisjIExpc3Qgb2YgbWVtYmVyIG5hbWVzLCB3aGljaCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgcHJvdGVjdGVkIGFjY2VzcworIyB3YXJuaW5nLgorZXhjbHVkZS1wcm90ZWN0ZWQ9X2FzZGljdCwKKyAgICAgICAgICAgICAgICAgIF9maWVsZHMsCisgICAgICAgICAgICAgICAgICBfcmVwbGFjZSwKKyAgICAgICAgICAgICAgICAgIF9zb3VyY2UsCisgICAgICAgICAgICAgICAgICBfbWFrZQorCisjIExpc3Qgb2YgdmFsaWQgbmFtZXMgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCBpbiBhIGNsYXNzIG1ldGhvZC4KK3ZhbGlkLWNsYXNzbWV0aG9kLWZpcnN0LWFyZz1jbHMKKworIyBMaXN0IG9mIHZhbGlkIG5hbWVzIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgaW4gYSBtZXRhY2xhc3MgY2xhc3MgbWV0aG9kLgordmFsaWQtbWV0YWNsYXNzLWNsYXNzbWV0aG9kLWZpcnN0LWFyZz1jbHMKKworCitbREVTSUdOXQorCisjIE1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gLyBtZXRob2QuCittYXgtYXJncz01CisKKyMgTWF4aW11bSBudW1iZXIgb2YgYXR0cmlidXRlcyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAyKS4KK21heC1hdHRyaWJ1dGVzPTcKKworIyBNYXhpbXVtIG51bWJlciBvZiBib29sZWFuIGV4cHJlc3Npb25zIGluIGFuIGlmIHN0YXRlbWVudCAoc2VlIFIwOTE2KS4KK21heC1ib29sLWV4cHI9NQorCisjIE1heGltdW0gbnVtYmVyIG9mIGJyYW5jaCBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keS4KK21heC1icmFuY2hlcz0xMgorCisjIE1heGltdW0gbnVtYmVyIG9mIGxvY2FscyBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keS4KK21heC1sb2NhbHM9MTUKKworIyBNYXhpbXVtIG51bWJlciBvZiBwYXJlbnRzIGZvciBhIGNsYXNzIChzZWUgUjA5MDEpLgorbWF4LXBhcmVudHM9NworCisjIE1heGltdW0gbnVtYmVyIG9mIHB1YmxpYyBtZXRob2RzIGZvciBhIGNsYXNzIChzZWUgUjA5MDQpLgorbWF4LXB1YmxpYy1tZXRob2RzPTIwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgcmV0dXJuIC8geWllbGQgZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkuCittYXgtcmV0dXJucz02CisKKyMgTWF4aW11bSBudW1iZXIgb2Ygc3RhdGVtZW50cyBpbiBmdW5jdGlvbiAvIG1ldGhvZCBib2R5LgorbWF4LXN0YXRlbWVudHM9NTAKKworIyBNaW5pbXVtIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAzKS4KK21pbi1wdWJsaWMtbWV0aG9kcz0yCisKKworW0VYQ0VQVElPTlNdCisKKyMgRXhjZXB0aW9ucyB0aGF0IHdpbGwgZW1pdCBhIHdhcm5pbmcgd2hlbiBiZWluZyBjYXVnaHQuIERlZmF1bHRzIHRvCisjICJCYXNlRXhjZXB0aW9uLCBFeGNlcHRpb24iLgorb3ZlcmdlbmVyYWwtZXhjZXB0aW9ucz1CYXNlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3B5bGludHJjX2NhbWVsY2FzZSBiL2V4YW1wbGVzL3B5bGludHJjX2NhbWVsY2FzZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNkYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcHlsaW50cmNfY2FtZWxjYXNlCkBAIC0wLDAgKzEsMjIgQEAKKyMgVGhpcyBweWxpbnRyYyBmaWxlIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGV4Y2VwdCBmb3IgdGhlCisjIG5hbWluZyBjb252ZW50aW9ucywgd2hpY2ggd2lsbCBhbGxvdyBmb3IgY2FtZWwgY2FzZSBuYW1pbmcgYXMgZm91bmQKKyMgaW4gSmF2YSBjb2RlIG9yIHNldmVyYWwgbGlicmFyaWVzIHN1Y2ggYXMgUHlRdCwgZXRjLgorCitbQkFTSUNdCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1vZHVsZSBuYW1lcworbW9kdWxlLXJneD0oKFthLXpdW2EtejAtOV0qKXwoW0EtWl1bYS16QS1aMC05XSspKSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCBjbGFzcyBuYW1lcworY2xhc3Mtcmd4PVtBLVpdW2EtekEtWjAtOV0rJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGZ1bmN0aW9uIG5hbWVzCitmdW5jdGlvbi1yZ3g9W2Etel9dW2EtekEtWjAtOV0qJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1ldGhvZCBuYW1lcworbWV0aG9kLXJneD1bYS16X11bYS16QS1aMC05XSokCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgYXJndW1lbnQgbmFtZXMKK2FyZ3VtZW50LXJneD1bYS16XVthLXpBLVowLTldKiQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCB2YXJpYWJsZSBuYW1lcwordmFyaWFibGUtcmd4PVthLXpdW2EtekEtWjAtOV0qJApkaWZmIC0tZ2l0IGEvcHlsaW50L19faW5pdF9fLnB5IGIvcHlsaW50L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YmYxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvX19pbml0X18ucHkKQEAgLTAsMCArMSw3OCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTYtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxOCBOaWNrIERyb3pkIDxuaWNob2xhc2Ryb3pkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2Zyb20gcHlsaW50Ll9fcGtnaW5mb19fIGltcG9ydCBfX3ZlcnNpb25fXworCisjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtb3V0c2lkZS10b3BsZXZlbAorCisKK2RlZiBydW5fcHlsaW50KCk6CisgICAgZnJvbSBweWxpbnQubGludCBpbXBvcnQgUnVuIGFzIFB5bGludFJ1bgorCisgICAgdHJ5OgorICAgICAgICBQeWxpbnRSdW4oc3lzLmFyZ3ZbMTpdKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgc3lzLmV4aXQoMSkKKworCitkZWYgcnVuX2VweWxpbnQoKToKKyAgICBmcm9tIHB5bGludC5lcHlsaW50IGltcG9ydCBSdW4gYXMgRXB5bGludFJ1bgorCisgICAgRXB5bGludFJ1bigpCisKKworZGVmIHJ1bl9weXJldmVyc2UoKToKKyAgICAiIiJydW4gcHlyZXZlcnNlIiIiCisgICAgZnJvbSBweWxpbnQucHlyZXZlcnNlLm1haW4gaW1wb3J0IFJ1biBhcyBQeXJldmVyc2VSdW4KKworICAgIFB5cmV2ZXJzZVJ1bihzeXMuYXJndlsxOl0pCisKKworZGVmIHJ1bl9zeW1pbGFyKCk6CisgICAgIiIicnVuIHN5bWlsYXIiIiIKKyAgICBmcm9tIHB5bGludC5jaGVja2Vycy5zaW1pbGFyIGltcG9ydCBSdW4gYXMgU2ltaWxhclJ1bgorCisgICAgU2ltaWxhclJ1bihzeXMuYXJndlsxOl0pCisKKworZGVmIG1vZGlmeV9zeXNfcGF0aCgpIC0+IE5vbmU6CisgICAgIiIiTW9kaWZ5IHN5cyBwYXRoIGZvciBleGVjdXRpb24gYXMgUHl0aG9uIG1vZHVsZS4KKworICAgIFN0cmlwIG91dCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmcm9tIHN5cy5wYXRoLgorICAgIEhhdmluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkgaW4gYHN5cy5wYXRoYCBtZWFucyB0aGF0IGBweWxpbnRgIG1pZ2h0CisgICAgaW5hZHZlcnRlbnRseSBpbXBvcnQgdXNlciBjb2RlIGZyb20gbW9kdWxlcyBoYXZpbmcgdGhlIHNhbWUgbmFtZSBhcworICAgIHN0ZGxpYiBvciBweWxpbnQncyBvd24gbW9kdWxlcy4KKyAgICBDUHl0aG9uIGlzc3VlOiBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTMzMDUzCisKKyAgICAtIFJlbW92ZSB0aGUgZmlyc3QgZW50cnkuIFRoaXMgd2lsbCBhbHdheXMgYmUgZWl0aGVyICIiIG9yIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorICAgIC0gUmVtb3ZlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmcm9tIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGVudHJpZXMKKyAgICAgIGlmIFBZVEhPTlBBVEggaW5jbHVkZXMgYSAiOiIgYXQgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kLgorICAgICAgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMzYzNgorICAgICAgRG9uJ3QgcmVtb3ZlIGl0IGlmIFBZVEhPTlBBVEggY29udGFpbnMgdGhlIGN3ZCBvciAnLicgYXMgdGhlIGVudHJ5IHdpbGwKKyAgICAgIG9ubHkgYmUgYWRkZWQgb25jZS4KKyAgICAtIERvbid0IHJlbW92ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgZnJvbSB0aGUgcmVzdC4gSXQgd2lsbCBiZSBpbmNsdWRlZAorICAgICAgaWYgcHlsaW50IGlzIGluc3RhbGxlZCBpbiBhbiBlZGl0YWJsZSBjb25maWd1cmF0aW9uIChhcyB0aGUgbGFzdCBpdGVtKS4KKyAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzQxNjEKKyAgICAiIiIKKyAgICBzeXMucGF0aC5wb3AoMCkKKyAgICBlbnZfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQWVRIT05QQVRIIiwgIiIpCisgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICBpZiBlbnZfcHl0aG9ucGF0aC5zdGFydHN3aXRoKCI6IikgYW5kIGVudl9weXRob25wYXRoIG5vdCBpbiAoZiI6e2N3ZH0iLCAiOi4iKToKKyAgICAgICAgc3lzLnBhdGgucG9wKDApCisgICAgZWxpZiBlbnZfcHl0aG9ucGF0aC5lbmRzd2l0aCgiOiIpIGFuZCBlbnZfcHl0aG9ucGF0aCBub3QgaW4gKGYie2N3ZH06IiwgIi46Iik6CisgICAgICAgIHN5cy5wYXRoLnBvcCgxKQorCisKK3ZlcnNpb24gPSBfX3ZlcnNpb25fXworX19hbGxfXyA9IFsiX192ZXJzaW9uX18iLCAidmVyc2lvbiJdCmRpZmYgLS1naXQgYS9weWxpbnQvX19tYWluX18ucHkgYi9weWxpbnQvX19tYWluX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxNWUzMgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9fX21haW5fXy5weQpAQCAtMCwwICsxLDkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBweWxpbnQKKworcHlsaW50Lm1vZGlmeV9zeXNfcGF0aCgpCitweWxpbnQucnVuX3B5bGludCgpCmRpZmYgLS1naXQgYS9weWxpbnQvX19wa2dpbmZvX18ucHkgYi9weWxpbnQvX19wa2dpbmZvX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxYzY5MwotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9fX3BrZ2luZm9fXy5weQpAQCAtMCwwICsxLDM1IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCitmcm9tIHR5cGluZyBpbXBvcnQgVHVwbGUKKworX192ZXJzaW9uX18gPSAiMi45LjAtZGV2MSIKKworCitkZWYgZ2V0X251bXZlcnNpb25fZnJvbV92ZXJzaW9uKHY6IHN0cikgLT4gVHVwbGU6CisgICAgIiIiS2VwdCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb24KKworICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80Mzk5CisgICAgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDQyMCwKKyAgICAiIiIKKyAgICB2ID0gdi5yZXBsYWNlKCJweWxpbnQtIiwgIiIpCisgICAgdmVyc2lvbiA9IFtdCisgICAgZm9yIG4gaW4gdi5zcGxpdCgiLiIpWzA6M106CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKGludChuKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBudW0gPSAiIgorICAgICAgICAgICAgZm9yIGMgaW4gbjoKKyAgICAgICAgICAgICAgICBpZiBjLmlzZGlnaXQoKToKKyAgICAgICAgICAgICAgICAgICAgbnVtICs9IGMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKGludChudW0pKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQoMCkKKyAgICB3aGlsZSBsZW4odmVyc2lvbikgIT0gMzoKKyAgICAgICAgdmVyc2lvbi5hcHBlbmQoMCkKKyAgICByZXR1cm4gdHVwbGUodmVyc2lvbikKKworCitudW12ZXJzaW9uID0gZ2V0X251bXZlcnNpb25fZnJvbV92ZXJzaW9uKF9fdmVyc2lvbl9fKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2NoZWNrZXJzL19faW5pdF9fLnB5IGIvcHlsaW50L2NoZWNrZXJzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDFiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvX19pbml0X18ucHkKQEAgLTAsMCArMSw4NiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTMgYnVja0B5ZWxwLmNvbSA8YnVja0B5ZWxwLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgTW9pc2VzIExvcGV6IDxtb3lsb3AyNjBAdmF1eG9vLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQnJ1bm8gUC4gS2lub3NoaXRhIDxraW5vd0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEZyYW5rIEhhcnJpc29uIDxmcmFua0Bkb3VibGV0aGVmaXNoLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hdHVzIFZhbG8gPG1hdHVzdmFsb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIidXRpbGl0aWVzIG1ldGhvZHMgYW5kIGNsYXNzZXMgZm9yIGNoZWNrZXJzCisKK0Jhc2UgaWQgb2Ygc3RhbmRhcmQgY2hlY2tlcnMgKHVzZWQgaW4gbXNnIGFuZCByZXBvcnQgaWRzKToKKzAxOiBiYXNlCiswMjogY2xhc3NlcworMDM6IGZvcm1hdAorMDQ6IGltcG9ydAorMDU6IG1pc2MKKzA2OiB2YXJpYWJsZXMKKzA3OiBleGNlcHRpb25zCiswODogc2ltaWxhcgorMDk6IGRlc2lnbl9hbmFseXNpcworMTA6IG5ld3N0eWxlCisxMTogdHlwZWNoZWNrCisxMjogbG9nZ2luZworMTM6IHN0cmluZ19mb3JtYXQKKzE0OiBzdHJpbmdfY29uc3RhbnQKKzE1OiBzdGRsaWIKKzE2OiBweXRob24zCisxNzogcmVmYWN0b3JpbmcKKzE4LTUwOiBub3QgeWV0IHVzZWQ6IHJlc2VydmVkIGZvciBmdXR1cmUgaW50ZXJuYWwgY2hlY2tlcnMuCis1MS05OTogcGVyaGFwcyB1c2VkOiByZXNlcnZlZCBmb3IgZXh0ZXJuYWwgY2hlY2tlcnMKKworVGhlIHJhd19tZXRyaWNzIGNoZWNrZXIgaGFzIG5vIG51bWJlciBhc3NvY2lhdGVkIHNpbmNlIGl0IGRvZXNuJ3QgZW1pdCBhbnkKK21lc3NhZ2VzIG5vciByZXBvcnRzLiBYWFggbm90IHRydWUsIGVtaXQgYSAwNyByZXBvcnQgIQorCisiIiIKKworZnJvbSBweWxpbnQuY2hlY2tlcnMuYmFzZV9jaGVja2VyIGltcG9ydCBCYXNlQ2hlY2tlciwgQmFzZVRva2VuQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMuZGVwcmVjYXRlZCBpbXBvcnQgRGVwcmVjYXRlZE1peGluCitmcm9tIHB5bGludC5jaGVja2Vycy5tYXByZWR1Y2VfY2hlY2tlciBpbXBvcnQgTWFwUmVkdWNlTWl4aW4KK2Zyb20gcHlsaW50LnV0aWxzIGltcG9ydCBkaWZmX3N0cmluZywgcmVnaXN0ZXJfcGx1Z2lucworCisKK2RlZiB0YWJsZV9saW5lc19mcm9tX3N0YXRzKHN0YXRzLCBvbGRfc3RhdHMsIGNvbHVtbnMpOgorICAgICIiImdldCB2YWx1ZXMgbGlzdGVkIGluIDxjb2x1bW5zPiBmcm9tIDxzdGF0cz4gYW5kIDxvbGRfc3RhdHM+LAorICAgIGFuZCByZXR1cm4gYSBmb3JtYXRlZCBsaXN0IG9mIHZhbHVlcywgZGVzaWduZWQgdG8gYmUgZ2l2ZW4gdG8gYQorICAgIHVyZXBvcnQuVGFibGUgb2JqZWN0CisgICAgIiIiCisgICAgbGluZXMgPSBbXQorICAgIGZvciBtX3R5cGUgaW4gY29sdW1uczoKKyAgICAgICAgbmV3ID0gc3RhdHNbbV90eXBlXQorICAgICAgICBvbGQgPSBvbGRfc3RhdHMuZ2V0KG1fdHlwZSkKKyAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGlmZl9zdHIgPSBkaWZmX3N0cmluZyhvbGQsIG5ldykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9sZCwgZGlmZl9zdHIgPSAiTkMiLCAiTkMiCisgICAgICAgIG5ldyA9ICIlLjNmIiAlIG5ldyBpZiBpc2luc3RhbmNlKG5ldywgZmxvYXQpIGVsc2Ugc3RyKG5ldykKKyAgICAgICAgb2xkID0gIiUuM2YiICUgb2xkIGlmIGlzaW5zdGFuY2Uob2xkLCBmbG9hdCkgZWxzZSBzdHIob2xkKQorICAgICAgICBsaW5lcyArPSAobV90eXBlLnJlcGxhY2UoIl8iLCAiICIpLCBuZXcsIG9sZCwgZGlmZl9zdHIpCisgICAgcmV0dXJuIGxpbmVzCisKKworZGVmIGluaXRpYWxpemUobGludGVyKToKKyAgICAiIiJpbml0aWFsaXplIGxpbnRlciB3aXRoIGNoZWNrZXJzIGluIHRoaXMgcGFja2FnZSIiIgorICAgIHJlZ2lzdGVyX3BsdWdpbnMobGludGVyLCBfX3BhdGhfX1swXSkKKworCitfX2FsbF9fID0gWworICAgICJCYXNlQ2hlY2tlciIsCisgICAgIkJhc2VUb2tlbkNoZWNrZXIiLAorICAgICJpbml0aWFsaXplIiwKKyAgICAiTWFwUmVkdWNlTWl4aW4iLAorICAgICJEZXByZWNhdGVkTWl4aW4iLAorICAgICJyZWdpc3Rlcl9wbHVnaW5zIiwKK10KZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9hc3luYy5weSBiL3B5bGludC9jaGVja2Vycy9hc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQwMTkyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL2FzeW5jLnB5CkBAIC0wLDAgKzEsOTQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LCAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIkNoZWNrZXIgZm9yIGFueXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGFzeW5jIHByb3RvY29sIChQRVAgNDkyKS4iIiIKKworaW1wb3J0IHN5cworCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGludGVyZmFjZXMsIHV0aWxzCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMgYXMgY2hlY2tlcl91dGlscworZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0IGRlY29yYXRlZF93aXRoCisKKworY2xhc3MgQXN5bmNDaGVja2VyKGNoZWNrZXJzLkJhc2VDaGVja2VyKToKKyAgICBfX2ltcGxlbWVudHNfXyA9IGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyCisgICAgbmFtZSA9ICJhc3luYyIKKyAgICBtc2dzID0geworICAgICAgICAiRTE3MDAiOiAoCisgICAgICAgICAgICAiWWllbGQgaW5zaWRlIGFzeW5jIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICJ5aWVsZC1pbnNpZGUtYXN5bmMtZnVuY3Rpb24iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBgeWllbGRgIG9yIGB5aWVsZCBmcm9tYCBzdGF0ZW1lbnQgaXMgIgorICAgICAgICAgICAgImZvdW5kIGluc2lkZSBhbiBhc3luYyBmdW5jdGlvbi4iLAorICAgICAgICAgICAgeyJtaW52ZXJzaW9uIjogKDMsIDUpfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkUxNzAxIjogKAorICAgICAgICAgICAgIkFzeW5jIGNvbnRleHQgbWFuYWdlciAnJXMnIGRvZXNuJ3QgaW1wbGVtZW50IF9fYWVudGVyX18gYW5kIF9fYWV4aXRfXy4iLAorICAgICAgICAgICAgIm5vdC1hc3luYy1jb250ZXh0LW1hbmFnZXIiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBhc3luYyBjb250ZXh0IG1hbmFnZXIgaXMgdXNlZCB3aXRoIGFuIG9iamVjdCAiCisgICAgICAgICAgICAidGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGFzeW5jIGNvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbC4iLAorICAgICAgICAgICAgeyJtaW52ZXJzaW9uIjogKDMsIDUpfSwKKyAgICAgICAgKSwKKyAgICB9CisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5faWdub3JlX21peGluX21lbWJlcnMgPSB1dGlscy5nZXRfZ2xvYmFsX29wdGlvbigKKyAgICAgICAgICAgIHNlbGYsICJpZ25vcmUtbWl4aW4tbWVtYmVycyIKKyAgICAgICAgKQorICAgICAgICBzZWxmLl9hc3luY19nZW5lcmF0b3JzID0gWyJjb250ZXh0bGliLmFzeW5jY29udGV4dG1hbmFnZXIiXQorCisgICAgQGNoZWNrZXJfdXRpbHMuY2hlY2tfbWVzc2FnZXMoInlpZWxkLWluc2lkZS1hc3luYy1mdW5jdGlvbiIpCisgICAgZGVmIHZpc2l0X2FzeW5jZnVuY3Rpb25kZWYoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuWWllbGQpOgorICAgICAgICAgICAgaWYgY2hpbGQuc2NvcGUoKSBpcyBub2RlIGFuZCAoCisgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDMsIDUpIG9yIGlzaW5zdGFuY2UoY2hpbGQsIGFzdHJvaWQuWWllbGRGcm9tKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ5aWVsZC1pbnNpZGUtYXN5bmMtZnVuY3Rpb24iLCBub2RlPWNoaWxkKQorCisgICAgQGNoZWNrZXJfdXRpbHMuY2hlY2tfbWVzc2FnZXMoIm5vdC1hc3luYy1jb250ZXh0LW1hbmFnZXIiKQorICAgIGRlZiB2aXNpdF9hc3luY3dpdGgoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBjdHhfbWdyLCBfIGluIG5vZGUuaXRlbXM6CisgICAgICAgICAgICBpbmZlcnJlZCA9IGNoZWNrZXJfdXRpbHMuc2FmZV9pbmZlcihjdHhfbWdyKQorICAgICAgICAgICAgaWYgaW5mZXJyZWQgaXMgTm9uZSBvciBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuQXN5bmNGdW5jdGlvbkRlZik6CisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgZnVuY3Rpb24gZGVjb3JhdGVkCisgICAgICAgICAgICAgICAgIyB3aXRoIGNvbnRleHRsaWIuYXN5bmNjb250ZXh0bWFuYWdlci4KKyAgICAgICAgICAgICAgICBpZiBkZWNvcmF0ZWRfd2l0aChpbmZlcnJlZCwgc2VsZi5fYXN5bmNfZ2VuZXJhdG9ycyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuYmFzZXMuQXN5bmNHZW5lcmF0b3IpOgorICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGZ1bmN0aW9uIGRlY29yYXRlZAorICAgICAgICAgICAgICAgICMgd2l0aCBjb250ZXh0bGliLmFzeW5jY29udGV4dG1hbmFnZXIuCisgICAgICAgICAgICAgICAgaWYgZGVjb3JhdGVkX3dpdGgoaW5mZXJyZWQucGFyZW50LCBzZWxmLl9hc3luY19nZW5lcmF0b3JzKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbmZlcnJlZC5nZXRhdHRyKCJfX2FlbnRlcl9fIikKKyAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWQuZ2V0YXR0cigiX19hZXhpdF9fIikKKyAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5leGNlcHRpb25zLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuSW5zdGFuY2UpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBkbyBub3Qga25vdyB0aGUgYmFzZXMgb2YgdGhpcyBjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICMganVzdCBza2lwIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNoZWNrZXJfdXRpbHMuaGFzX2tub3duX2Jhc2VzKGluZmVycmVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBKdXN0IGlnbm9yZSBtaXhpbiBjbGFzc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faWdub3JlX21peGluX21lbWJlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5mZXJyZWQubmFtZVstNTpdLmxvd2VyKCkgPT0gIm1peGluIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAibm90LWFzeW5jLWNvbnRleHQtbWFuYWdlciIsIG5vZGU9bm9kZSwgYXJncz0oaW5mZXJyZWQubmFtZSwpCisgICAgICAgICAgICApCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIicmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoQXN5bmNDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvYmFzZS5weSBiL3B5bGludC9jaGVja2Vycy9iYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNzUzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvYmFzZS5weQpAQCAtMCwwICsxLDI1OTcgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMTYgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTAgRGFuaWVsIEhhcmRpbmcgPGRoYXJkaW5nQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNSBOaWNrIEJhc3RpbiA8bmljay5iYXN0aW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgTWljaGFlbCBLZWZlZGVyIDxvc3NAbXVsdGl3YXZlLmNoPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRG1pdHJ5IFByaWJ5c2ggPGRtYW5kQHlhbmRleC5ydT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFN0ZXBoYW5lIFdpcnRlbCA8c3RlcGhhbmVAd2lydGVsLmJlPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQ29zbWluIFBvaWVhbmEgPGNtaW5Acm9weXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBSYWR1IENpb3JiYSA8cmFkdUBkZXZyYW5kb20ucm8+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBKYWt1YiBXaWxrIDxqd2lsa0Bqd2lsay5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbGVubkBlLWRhZC5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNiBFbGlhcyBEb3JuZWxlcyA8ZWxpYXNkb3JuZWxlc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBZYW5uYWNrIDx5YW5uYWNrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFsZXggSnVya2lld2ljeiA8YWxleEBqdXJraWV3aS5jej4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNywgMjAxOS0yMDIxIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IGRhbmllbGRzIDxkYW5pZWxkczc2MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBKYWNxdWVzIEt2YW0gPGp3a3ZhbUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyB0dGVuaG9ldmUtYWEgPHR0ZW5ob2V2ZUBhcHBhbm5pZS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU2VyZ2VpIExlYmVkZXYgPDE4NTg1NitzdXBlcmJvYnJ5QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1Y2FzIENpbW9uIDxsdWNhcy5jaW1vbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBOYXRhbGllIFNlcmVicnlha292YSA8bmF0YWxpZS5zZXJlYnJ5YWtvdmFATmF0YWxpZXMtTWFjQm9vay1Qcm8ubG9jYWw+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFNlcmdleUtvc2FyY2h1ayA8c2VyZ2V5a29zYXJjaHVrQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN0ZXZlbiBNLiBWYXNjZWxsYXJvIDxzdmFzY2VsbGFyb0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IENocmlzIExhbWIgPGNocmlzQGNocmlzLWxhbWIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxOCBnbG1kZ3JpZWxzb24gPDMyNDE1NDAzK2dsbWRncmllbHNvbkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBEYW5pZWwgRHJhcGVyIDxHZXJtYW5kcnVtbWVyOTJAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBOaWtvIFdlbnNlbG93c2tpIDxuaWtvQG5lcmRuby5kZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE5pa2l0YSBTb2JvbGV2IDxtYWlsQHNvYm9sZXZuLm1lPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgT2lzw61uIE1vcmFuIDxPaXNpbk1vcmFuQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEZhbnRpeCBLaW5nIDxmYW50aXhAdWNoaWNhZ28uZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgUGV0ZXIgS29sYnVzIDxwZXRlci5rb2xidXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgZXRoYW4tbGViYSA8ZXRoYW5sZWJhNUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCDjgbjjg7zjgZXjgpMgPGhpcmE5NjAzODU5NTA0QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFJhbSBSYWNodW0gPHJhbUByYWNodW0uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMCBiZXJuaWUgZ3JheSA8YmZncmF5M0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBHYWJyaWVsIFIgU2V6ZWZyZWRvIDxnQGJyaWVsLmRldj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEJlbm55IDxiZW5ueS5tdWVsbGVyOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW51YmhhdiA8MzU2MjE3NTkrYW51YmgtdkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBEYXZpZCBMaXUgPGRhdmlkQGNzLnRvcm9udG8uZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgQW5kcmVhcyBGaW5rbGVyIDxhbmRpLmZpbmtsZXJAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgT3IgQmFoYXJpIDxvcmJhaGFyaUBtYWlsLnRhdS5hYy5pbD4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJiYXNpYyBjaGVja2VyIGZvciBQeXRob24gY29kZSIiIgoraW1wb3J0IGJ1aWx0aW5zCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSB0eXBpbmcgaW1wb3J0IFBhdHRlcm4KKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzLCBleGNlcHRpb25zLCBpbnRlcmZhY2VzCitmcm9tIHB5bGludCBpbXBvcnQgdXRpbHMgYXMgbGludF91dGlscworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IHV0aWxzCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgKAorICAgIGlzX292ZXJsb2FkX3N0dWIsCisgICAgaXNfcHJvcGVydHlfZGVsZXRlciwKKyAgICBpc19wcm9wZXJ0eV9zZXR0ZXIsCispCitmcm9tIHB5bGludC5yZXBvcnRlcnMudXJlcG9ydHMgaW1wb3J0IG5vZGVzIGFzIHJlcG9ydGVyX25vZGVzCisKKworY2xhc3MgTmFtaW5nU3R5bGU6CisgICAgIiIiSXQgbWF5IHNlZW0gY291bnRlcmludHVpdGl2ZSB0aGF0IHNpbmdsZSBuYW1pbmcgc3R5bGUgaGFzIG11bHRpcGxlICJhY2NlcHRlZCIKKyAgICBmb3JtcyBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBidXQgd2UgbmVlZCB0byBzcGVjaWFsLWNhc2Ugc3R1ZmYgbGlrZSBkdW5kZXIgbmFtZXMKKyAgICBpbiBtZXRob2QgbmFtZXMuIiIiCisKKyAgICBBTlk6IFBhdHRlcm5bc3RyXSA9IHJlLmNvbXBpbGUoIi4qIikKKyAgICBDTEFTU19OQU1FX1JHWDogUGF0dGVybltzdHJdID0gQU5ZCisgICAgTU9EX05BTUVfUkdYOiBQYXR0ZXJuW3N0cl0gPSBBTlkKKyAgICBDT05TVF9OQU1FX1JHWDogUGF0dGVybltzdHJdID0gQU5ZCisgICAgQ09NUF9WQVJfUkdYOiBQYXR0ZXJuW3N0cl0gPSBBTlkKKyAgICBERUZBVUxUX05BTUVfUkdYOiBQYXR0ZXJuW3N0cl0gPSBBTlkKKyAgICBDTEFTU19BVFRSSUJVVEVfUkdYOiBQYXR0ZXJuW3N0cl0gPSBBTlkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnZXRfcmVnZXgoY2xzLCBuYW1lX3R5cGUpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgIm1vZHVsZSI6IGNscy5NT0RfTkFNRV9SR1gsCisgICAgICAgICAgICAiY29uc3QiOiBjbHMuQ09OU1RfTkFNRV9SR1gsCisgICAgICAgICAgICAiY2xhc3MiOiBjbHMuQ0xBU1NfTkFNRV9SR1gsCisgICAgICAgICAgICAiZnVuY3Rpb24iOiBjbHMuREVGQVVMVF9OQU1FX1JHWCwKKyAgICAgICAgICAgICJtZXRob2QiOiBjbHMuREVGQVVMVF9OQU1FX1JHWCwKKyAgICAgICAgICAgICJhdHRyIjogY2xzLkRFRkFVTFRfTkFNRV9SR1gsCisgICAgICAgICAgICAiYXJndW1lbnQiOiBjbHMuREVGQVVMVF9OQU1FX1JHWCwKKyAgICAgICAgICAgICJ2YXJpYWJsZSI6IGNscy5ERUZBVUxUX05BTUVfUkdYLAorICAgICAgICAgICAgImNsYXNzX2F0dHJpYnV0ZSI6IGNscy5DTEFTU19BVFRSSUJVVEVfUkdYLAorICAgICAgICAgICAgImNsYXNzX2NvbnN0IjogY2xzLkNPTlNUX05BTUVfUkdYLAorICAgICAgICAgICAgImlubGluZXZhciI6IGNscy5DT01QX1ZBUl9SR1gsCisgICAgICAgIH1bbmFtZV90eXBlXQorCisKK2NsYXNzIFNuYWtlQ2FzZVN0eWxlKE5hbWluZ1N0eWxlKToKKyAgICAiIiJSZWdleCBydWxlcyBmb3Igc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUuIiIiCisKKyAgICBDTEFTU19OQU1FX1JHWCA9IHJlLmNvbXBpbGUociJbXlxXXGRBLVpdW15cV0EtWl0rJCIpCisgICAgTU9EX05BTUVfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZEEtWl1bXlxXQS1aXSokIikKKyAgICBDT05TVF9OQU1FX1JHWCA9IHJlLmNvbXBpbGUociIoW15cV1xkQS1aXVteXFdBLVpdKnxfXy4qX18pJCIpCisgICAgQ09NUF9WQVJfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZEEtWl1bXlxXQS1aXSokIikKKyAgICBERUZBVUxUX05BTUVfUkdYID0gcmUuY29tcGlsZSgKKyAgICAgICAgciIoW15cV1xkQS1aXVteXFdBLVpdezIsfXxfW15cV0EtWl0qfF9fW15cV0EtWlxkX11bXlxXQS1aXStfXykkIgorICAgICkKKyAgICBDTEFTU19BVFRSSUJVVEVfUkdYID0gcmUuY29tcGlsZShyIihbXlxXXGRBLVpdW15cV0EtWl17Mix9fF9fLipfXykkIikKKworCitjbGFzcyBDYW1lbENhc2VTdHlsZShOYW1pbmdTdHlsZSk6CisgICAgIiIiUmVnZXggcnVsZXMgZm9yIGNhbWVsQ2FzZSBuYW1pbmcgc3R5bGUuIiIiCisKKyAgICBDTEFTU19OQU1FX1JHWCA9IHJlLmNvbXBpbGUociJbXlxXXGRBLVpdW15cV19dKyQiKQorICAgIE1PRF9OQU1FX1JHWCA9IHJlLmNvbXBpbGUociJbXlxXXGRBLVpdW15cV19dKiQiKQorICAgIENPTlNUX05BTUVfUkdYID0gcmUuY29tcGlsZShyIihbXlxXXGRBLVpdW15cV19dKnxfXy4qX18pJCIpCisgICAgQ09NUF9WQVJfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZEEtWl1bXlxXX10qJCIpCisgICAgREVGQVVMVF9OQU1FX1JHWCA9IHJlLmNvbXBpbGUociIoW15cV1xkQS1aXVteXFdfXXsyLH18X19bXlxXXGRBLVpfXVx3K19fKSQiKQorICAgIENMQVNTX0FUVFJJQlVURV9SR1ggPSByZS5jb21waWxlKHIiKFteXFdcZEEtWl1bXlxXX117Mix9fF9fLipfXykkIikKKworCitjbGFzcyBQYXNjYWxDYXNlU3R5bGUoTmFtaW5nU3R5bGUpOgorICAgICIiIlJlZ2V4IHJ1bGVzIGZvciBQYXNjYWxDYXNlIG5hbWluZyBzdHlsZS4iIiIKKworICAgIENMQVNTX05BTUVfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZGEtel1bXlxXX10rJCIpCisgICAgTU9EX05BTUVfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZGEtel1bXlxXX10rJCIpCisgICAgQ09OU1RfTkFNRV9SR1ggPSByZS5jb21waWxlKHIiKFteXFdcZGEtel1bXlxXX10qfF9fLipfXykkIikKKyAgICBDT01QX1ZBUl9SR1ggPSByZS5jb21waWxlKHIiW15cV1xkYS16XVteXFdfXSskIikKKyAgICBERUZBVUxUX05BTUVfUkdYID0gcmUuY29tcGlsZShyIihbXlxXXGRhLXpdW15cV19dezIsfXxfX1teXFdcZEEtWl9dXHcrX18pJCIpCisgICAgQ0xBU1NfQVRUUklCVVRFX1JHWCA9IHJlLmNvbXBpbGUociJbXlxXXGRhLXpdW15cV19dezIsfSQiKQorCisKK2NsYXNzIFVwcGVyQ2FzZVN0eWxlKE5hbWluZ1N0eWxlKToKKyAgICAiIiJSZWdleCBydWxlcyBmb3IgVVBQRVJfQ0FTRSBuYW1pbmcgc3R5bGUuIiIiCisKKyAgICBDTEFTU19OQU1FX1JHWCA9IHJlLmNvbXBpbGUociJbXlxXXGRhLXpdW15cV2Etel0rJCIpCisgICAgTU9EX05BTUVfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZGEtel1bXlxXYS16XSskIikKKyAgICBDT05TVF9OQU1FX1JHWCA9IHJlLmNvbXBpbGUociIoW15cV1xkYS16XVteXFdhLXpdKnxfXy4qX18pJCIpCisgICAgQ09NUF9WQVJfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZGEtel1bXlxXYS16XSskIikKKyAgICBERUZBVUxUX05BTUVfUkdYID0gcmUuY29tcGlsZShyIihbXlxXXGRhLXpdW15cV2Etel17Mix9fF9fW15cV1xkQS1aX11cdytfXykkIikKKyAgICBDTEFTU19BVFRSSUJVVEVfUkdYID0gcmUuY29tcGlsZShyIlteXFdcZGEtel1bXlxXYS16XXsyLH0kIikKKworCitjbGFzcyBBbnlTdHlsZShOYW1pbmdTdHlsZSk6CisgICAgcGFzcworCisKK05BTUlOR19TVFlMRVMgPSB7CisgICAgInNuYWtlX2Nhc2UiOiBTbmFrZUNhc2VTdHlsZSwKKyAgICAiY2FtZWxDYXNlIjogQ2FtZWxDYXNlU3R5bGUsCisgICAgIlBhc2NhbENhc2UiOiBQYXNjYWxDYXNlU3R5bGUsCisgICAgIlVQUEVSX0NBU0UiOiBVcHBlckNhc2VTdHlsZSwKKyAgICAiYW55IjogQW55U3R5bGUsCit9CisKKyMgZG8gbm90IHJlcXVpcmUgYSBkb2Mgc3RyaW5nIG9uIHByaXZhdGUvc3lzdGVtIG1ldGhvZHMKK05PX1JFUVVJUkVEX0RPQ19SR1ggPSByZS5jb21waWxlKCJeXyIpCitSRVZFUlNFRF9QUk9UT0NPTF9NRVRIT0QgPSAiX19yZXZlcnNlZF9fIgorU0VRVUVOQ0VfUFJPVE9DT0xfTUVUSE9EUyA9ICgiX19nZXRpdGVtX18iLCAiX19sZW5fXyIpCitSRVZFUlNFRF9NRVRIT0RTID0gKFNFUVVFTkNFX1BST1RPQ09MX01FVEhPRFMsIChSRVZFUlNFRF9QUk9UT0NPTF9NRVRIT0QsKSkKK1RZUEVDSEVDS19DT01QQVJJU09OX09QRVJBVE9SUyA9IGZyb3plbnNldCgoImlzIiwgImlzIG5vdCIsICI9PSIsICIhPSIpKQorTElURVJBTF9OT0RFX1RZUEVTID0gKGFzdHJvaWQuQ29uc3QsIGFzdHJvaWQuRGljdCwgYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlNldCkKK1VOSVRURVNUX0NBU0UgPSAidW5pdHRlc3QuY2FzZSIKK0JVSUxUSU5TID0gYnVpbHRpbnMuX19uYW1lX18KK1RZUEVfUU5BTUUgPSAiJXMudHlwZSIgJSBCVUlMVElOUworQUJDX01FVEFDTEFTU0VTID0geyJfcHlfYWJjLkFCQ01ldGEiLCAiYWJjLkFCQ01ldGEifSAgIyBQeXRob24gMy43KywKKworIyBOYW1lIGNhdGVnb3JpZXMgdGhhdCBhcmUgYWx3YXlzIGNvbnNpc3RlbnQgd2l0aCBhbGwgbmFtaW5nIGNvbnZlbnRpb25zLgorRVhFTVBUX05BTUVfQ0FURUdPUklFUyA9IHsiZXhlbXB0IiwgImlnbm9yZSJ9CisKKyMgQSBtYXBwaW5nIGZyb20gcW5hbWUgLT4gc3ltYm9sLCB0byBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBtZXNzYWdlcworIyBhYm91dCBkYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZXMgYXMgYXJndW1lbnRzCitERUZBVUxUX0FSR1VNRU5UX1NZTUJPTFMgPSBkaWN0KAorICAgIHppcCgKKyAgICAgICAgWyIuIi5qb2luKFtCVUlMVElOUywgeF0pIGZvciB4IGluICgic2V0IiwgImRpY3QiLCAibGlzdCIpXSwKKyAgICAgICAgWyJzZXQoKSIsICJ7fSIsICJbXSJdLAorICAgICksCisgICAgKip7CisgICAgICAgIHg6ICIlcygpIiAlIHgKKyAgICAgICAgZm9yIHggaW4gKAorICAgICAgICAgICAgImNvbGxlY3Rpb25zLmRlcXVlIiwKKyAgICAgICAgICAgICJjb2xsZWN0aW9ucy5DaGFpbk1hcCIsCisgICAgICAgICAgICAiY29sbGVjdGlvbnMuQ291bnRlciIsCisgICAgICAgICAgICAiY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiLAorICAgICAgICAgICAgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0IiwKKyAgICAgICAgICAgICJjb2xsZWN0aW9ucy5Vc2VyRGljdCIsCisgICAgICAgICAgICAiY29sbGVjdGlvbnMuVXNlckxpc3QiLAorICAgICAgICApCisgICAgfSwKKykKK1JFVkVSU0VEX0NPTVBTID0geyI8IjogIj4iLCAiPD0iOiAiPj0iLCAiPiI6ICI8IiwgIj49IjogIjw9In0KK0NPTVBBUklTT05fT1BFUkFUT1JTID0gZnJvemVuc2V0KCgiPT0iLCAiIT0iLCAiPCIsICI+IiwgIjw9IiwgIj49IikpCisjIExpc3Qgb2YgbWV0aG9kcyB3aGljaCBjYW4gYmUgcmVkZWZpbmVkCitSRURFRklOQUJMRV9NRVRIT0RTID0gZnJvemVuc2V0KCgiX19tb2R1bGVfXyIsKSkKK1RZUElOR19GT1JXQVJEX1JFRl9RTkFNRSA9ICJ0eXBpbmcuRm9yd2FyZFJlZiIKKworCitkZWYgX3JlZGVmaW5lc19pbXBvcnQobm9kZSk6CisgICAgIiIiRGV0ZWN0IHRoYXQgdGhlIGdpdmVuIG5vZGUgKEFzc2lnbk5hbWUpIGlzIGluc2lkZSBhbgorICAgIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCByZWRlZmluZXMgYW4gaW1wb3J0IGZyb20gdGhlIHRyeWV4Y2VwdCBib2R5LgorICAgIFJldHVybnMgVHJ1ZSBpZiB0aGUgbm9kZSByZWRlZmluZXMgYW4gaW1wb3J0LCBGYWxzZSBvdGhlcndpc2UuCisgICAgIiIiCisgICAgY3VycmVudCA9IG5vZGUKKyAgICB3aGlsZSBjdXJyZW50IGFuZCBub3QgaXNpbnN0YW5jZShjdXJyZW50LnBhcmVudCwgYXN0cm9pZC5FeGNlcHRIYW5kbGVyKToKKyAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50CisgICAgaWYgbm90IGN1cnJlbnQgb3Igbm90IHV0aWxzLmVycm9yX29mX3R5cGUoY3VycmVudC5wYXJlbnQsIEltcG9ydEVycm9yKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgdHJ5X2Jsb2NrID0gY3VycmVudC5wYXJlbnQucGFyZW50CisgICAgZm9yIGltcG9ydF9ub2RlIGluIHRyeV9ibG9jay5ub2Rlc19vZl9jbGFzcygoYXN0cm9pZC5JbXBvcnRGcm9tLCBhc3Ryb2lkLkltcG9ydCkpOgorICAgICAgICBmb3IgbmFtZSwgYWxpYXMgaW4gaW1wb3J0X25vZGUubmFtZXM6CisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBpZiBhbGlhcyA9PSBub2RlLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBlbGlmIG5hbWUgPT0gbm9kZS5uYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIGluX2xvb3Aobm9kZSk6CisgICAgIiIicmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgaW5zaWRlIGEga2luZCBvZiBmb3IgbG9vcCIiIgorICAgIHBhcmVudCA9IG5vZGUucGFyZW50CisgICAgd2hpbGUgcGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBpc2luc3RhbmNlKAorICAgICAgICAgICAgcGFyZW50LAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGFzdHJvaWQuRm9yLAorICAgICAgICAgICAgICAgIGFzdHJvaWQuTGlzdENvbXAsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5TZXRDb21wLAorICAgICAgICAgICAgICAgIGFzdHJvaWQuRGljdENvbXAsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5HZW5lcmF0b3JFeHAsCisgICAgICAgICAgICApLAorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudAorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpbl9uZXN0ZWRfbGlzdChuZXN0ZWRfbGlzdCwgb2JqKToKKyAgICAiIiJyZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFuIGVsZW1lbnQgb2YgPG5lc3RlZF9saXN0PiBvciBvZiBhIG5lc3RlZAorICAgIGxpc3QKKyAgICAiIiIKKyAgICBmb3IgZWxtdCBpbiBuZXN0ZWRfbGlzdDoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShlbG10LCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIGlmIGluX25lc3RlZF9saXN0KGVsbXQsIG9iaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxpZiBlbG10ID09IG9iajoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9nZXRfYnJlYWtfbG9vcF9ub2RlKGJyZWFrX25vZGUpOgorICAgICIiIgorICAgIFJldHVybnMgdGhlIGxvb3Agbm9kZSB0aGF0IGhvbGRzIHRoZSBicmVhayBub2RlIGluIGFyZ3VtZW50cy4KKworICAgIEFyZ3M6CisgICAgICAgIGJyZWFrX25vZGUgKGFzdHJvaWQuQnJlYWspOiB0aGUgYnJlYWsgbm9kZSBvZiBpbnRlcmVzdC4KKworICAgIFJldHVybnM6CisgICAgICAgIGFzdHJvaWQuRm9yIG9yIGFzdHJvaWQuV2hpbGU6IHRoZSBsb29wIG5vZGUgaG9sZGluZyB0aGUgYnJlYWsgbm9kZS4KKyAgICAiIiIKKyAgICBsb29wX25vZGVzID0gKGFzdHJvaWQuRm9yLCBhc3Ryb2lkLldoaWxlKQorICAgIHBhcmVudCA9IGJyZWFrX25vZGUucGFyZW50CisgICAgd2hpbGUgbm90IGlzaW5zdGFuY2UocGFyZW50LCBsb29wX25vZGVzKSBvciBicmVha19ub2RlIGluIGdldGF0dHIoCisgICAgICAgIHBhcmVudCwgIm9yZWxzZSIsIFtdCisgICAgKToKKyAgICAgICAgYnJlYWtfbm9kZSA9IHBhcmVudAorICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50CisgICAgICAgIGlmIHBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gcGFyZW50CisKKworZGVmIF9sb29wX2V4aXRzX2Vhcmx5KGxvb3ApOgorICAgICIiIgorICAgIFJldHVybnMgdHJ1ZSBpZiBhIGxvb3AgbWF5IGVuZHMgdXAgaW4gYSBicmVhayBzdGF0ZW1lbnQuCisKKyAgICBBcmdzOgorICAgICAgICBsb29wIChhc3Ryb2lkLkZvciwgYXN0cm9pZC5XaGlsZSk6IHRoZSBsb29wIG5vZGUgaW5zcGVjdGVkLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgYm9vbDogVHJ1ZSBpZiB0aGUgbG9vcCBtYXkgZW5kcyB1cCBpbiBhIGJyZWFrIHN0YXRlbWVudCwgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICIiIgorICAgIGxvb3Bfbm9kZXMgPSAoYXN0cm9pZC5Gb3IsIGFzdHJvaWQuV2hpbGUpCisgICAgZGVmaW5pdGlvbl9ub2RlcyA9IChhc3Ryb2lkLkZ1bmN0aW9uRGVmLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgIGlubmVyX2xvb3Bfbm9kZXMgPSBbCisgICAgICAgIF9ub2RlCisgICAgICAgIGZvciBfbm9kZSBpbiBsb29wLm5vZGVzX29mX2NsYXNzKGxvb3Bfbm9kZXMsIHNraXBfa2xhc3M9ZGVmaW5pdGlvbl9ub2RlcykKKyAgICAgICAgaWYgX25vZGUgIT0gbG9vcAorICAgIF0KKyAgICByZXR1cm4gYW55KAorICAgICAgICBfbm9kZQorICAgICAgICBmb3IgX25vZGUgaW4gbG9vcC5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkJyZWFrLCBza2lwX2tsYXNzPWRlZmluaXRpb25fbm9kZXMpCisgICAgICAgIGlmIF9nZXRfYnJlYWtfbG9vcF9ub2RlKF9ub2RlKSBub3QgaW4gaW5uZXJfbG9vcF9ub2RlcworICAgICkKKworCitkZWYgX2lzX211bHRpX25hbWluZ19tYXRjaChtYXRjaCwgbm9kZV90eXBlLCBjb25maWRlbmNlKToKKyAgICByZXR1cm4gKAorICAgICAgICBtYXRjaCBpcyBub3QgTm9uZQorICAgICAgICBhbmQgbWF0Y2gubGFzdGdyb3VwIGlzIG5vdCBOb25lCisgICAgICAgIGFuZCBtYXRjaC5sYXN0Z3JvdXAgbm90IGluIEVYRU1QVF9OQU1FX0NBVEVHT1JJRVMKKyAgICAgICAgYW5kIChub2RlX3R5cGUgIT0gIm1ldGhvZCIgb3IgY29uZmlkZW5jZSAhPSBpbnRlcmZhY2VzLklORkVSRU5DRV9GQUlMVVJFKQorICAgICkKKworCitCVUlMVElOX1BST1BFUlRZID0gImJ1aWx0aW5zLnByb3BlcnR5IgorCisKK2RlZiBfZ2V0X3Byb3BlcnRpZXMoY29uZmlnKToKKyAgICAiIiJSZXR1cm5zIGEgdHVwbGUgb2YgcHJvcGVydHkgY2xhc3NlcyBhbmQgbmFtZXMuCisKKyAgICBQcm9wZXJ0eSBjbGFzc2VzIGFyZSBmdWxseSBxdWFsaWZpZWQsIHN1Y2ggYXMgJ2FiYy5hYnN0cmFjdHByb3BlcnR5JyBhbmQKKyAgICBwcm9wZXJ0eSBuYW1lcyBhcmUgdGhlIGFjdHVhbCBuYW1lcywgc3VjaCBhcyAnYWJzdHJhY3RfcHJvcGVydHknLgorICAgICIiIgorICAgIHByb3BlcnR5X2NsYXNzZXMgPSB7QlVJTFRJTl9QUk9QRVJUWX0KKyAgICBwcm9wZXJ0eV9uYW1lcyA9IHNldCgpICAjIE5vdCByZXR1cm5pbmcgJ3Byb3BlcnR5JywgaXQgaGFzIGl0cyBvd24gY2hlY2suCisgICAgaWYgY29uZmlnIGlzIG5vdCBOb25lOgorICAgICAgICBwcm9wZXJ0eV9jbGFzc2VzLnVwZGF0ZShjb25maWcucHJvcGVydHlfY2xhc3NlcykKKyAgICAgICAgcHJvcGVydHlfbmFtZXMudXBkYXRlKAorICAgICAgICAgICAgcHJvcC5yc3BsaXQoIi4iLCAxKVstMV0gZm9yIHByb3AgaW4gY29uZmlnLnByb3BlcnR5X2NsYXNzZXMKKyAgICAgICAgKQorICAgIHJldHVybiBwcm9wZXJ0eV9jbGFzc2VzLCBwcm9wZXJ0eV9uYW1lcworCisKK2RlZiBfZGV0ZXJtaW5lX2Z1bmN0aW9uX25hbWVfdHlwZShub2RlOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmLCBjb25maWc9Tm9uZSk6CisgICAgIiIiRGV0ZXJtaW5lIHRoZSBuYW1lIHR5cGUgd2hvc2UgcmVnZXggdGhlIGEgZnVuY3Rpb24ncyBuYW1lIHNob3VsZCBtYXRjaC4KKworICAgIDpwYXJhbSBub2RlOiBBIGZ1bmN0aW9uIG5vZGUuCisgICAgOnBhcmFtIGNvbmZpZzogQ29uZmlndXJhdGlvbiBmcm9tIHdoaWNoIHRvIHB1bGwgYWRkaXRpb25hbCBwcm9wZXJ0eSBjbGFzc2VzLgorICAgIDp0eXBlIGNvbmZpZzogOmNsYXNzOmBvcHRwYXJzZS5WYWx1ZXNgCisKKyAgICA6cmV0dXJuczogT25lIG9mICgnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ2F0dHInKQorICAgIDpydHlwZTogc3RyCisgICAgIiIiCisgICAgcHJvcGVydHlfY2xhc3NlcywgcHJvcGVydHlfbmFtZXMgPSBfZ2V0X3Byb3BlcnRpZXMoY29uZmlnKQorICAgIGlmIG5vdCBub2RlLmlzX21ldGhvZCgpOgorICAgICAgICByZXR1cm4gImZ1bmN0aW9uIgorCisgICAgaWYgaXNfcHJvcGVydHlfc2V0dGVyKG5vZGUpIG9yIGlzX3Byb3BlcnR5X2RlbGV0ZXIobm9kZSk6CisgICAgICAgICMgSWYgdGhlIGZ1bmN0aW9uIGlzIGRlY29yYXRlZCB1c2luZyB0aGUgcHJvcF9tZXRob2Que3NldHRlcixnZXR0ZXJ9CisgICAgICAgICMgZm9ybSwgdHJlYXQgaXQgbGlrZSBhbiBhdHRyaWJ1dGUgYXMgd2VsbC4KKyAgICAgICAgcmV0dXJuICJhdHRyIgorCisgICAgaWYgbm9kZS5kZWNvcmF0b3JzOgorICAgICAgICBkZWNvcmF0b3JzID0gbm9kZS5kZWNvcmF0b3JzLm5vZGVzCisgICAgZWxzZToKKyAgICAgICAgZGVjb3JhdG9ycyA9IFtdCisgICAgZm9yIGRlY29yYXRvciBpbiBkZWNvcmF0b3JzOgorICAgICAgICAjIElmIHRoZSBmdW5jdGlvbiBpcyBhIHByb3BlcnR5IChkZWNvcmF0ZWQgd2l0aCBAcHJvcGVydHkKKyAgICAgICAgIyBvciBAYWJjLmFic3RyYWN0cHJvcGVydHkpLCB0aGUgbmFtZSB0eXBlIGlzICdhdHRyJy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShkZWNvcmF0b3IsIGFzdHJvaWQuTmFtZSkgb3IgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShkZWNvcmF0b3IsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgYW5kIGRlY29yYXRvci5hdHRybmFtZSBpbiBwcm9wZXJ0eV9uYW1lcworICAgICAgICApOgorICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKGRlY29yYXRvcikKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBpbmZlcnJlZAorICAgICAgICAgICAgICAgIGFuZCBoYXNhdHRyKGluZmVycmVkLCAicW5hbWUiKQorICAgICAgICAgICAgICAgIGFuZCBpbmZlcnJlZC5xbmFtZSgpIGluIHByb3BlcnR5X2NsYXNzZXMKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJhdHRyIgorICAgIHJldHVybiAibWV0aG9kIgorCisKK2RlZiBfaGFzX2Fic3RyYWN0X21ldGhvZHMobm9kZSk6CisgICAgIiIiCisgICAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBgbm9kZWAgaGFzIGFic3RyYWN0IG1ldGhvZHMuCisKKyAgICBUaGUgbWV0aG9kcyBzaG91bGQgYmUgbWFkZSBhYnN0cmFjdCBieSBkZWNvcmF0aW5nIHRoZW0KKyAgICB3aXRoIGBhYmNgIGRlY29yYXRvcnMuCisgICAgIiIiCisgICAgcmV0dXJuIGxlbih1dGlscy51bmltcGxlbWVudGVkX2Fic3RyYWN0X21ldGhvZHMobm9kZSkpID4gMAorCisKK2RlZiByZXBvcnRfYnlfdHlwZV9zdGF0cyhzZWN0LCBzdGF0cywgb2xkX3N0YXRzKToKKyAgICAiIiJtYWtlIGEgcmVwb3J0IG9mCisKKyAgICAqIHBlcmNlbnRhZ2Ugb2YgZGlmZmVyZW50IHR5cGVzIGRvY3VtZW50ZWQKKyAgICAqIHBlcmNlbnRhZ2Ugb2YgZGlmZmVyZW50IHR5cGVzIHdpdGggYSBiYWQgbmFtZQorICAgICIiIgorICAgICMgcGVyY2VudGFnZSBvZiBkaWZmZXJlbnQgdHlwZXMgZG9jdW1lbnRlZCBhbmQvb3Igd2l0aCBhIGJhZCBuYW1lCisgICAgbmljZV9zdGF0cyA9IHt9CisgICAgZm9yIG5vZGVfdHlwZSBpbiAoIm1vZHVsZSIsICJjbGFzcyIsICJtZXRob2QiLCAiZnVuY3Rpb24iKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG90YWwgPSBzdGF0c1tub2RlX3R5cGVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgZXhjZXB0aW9ucy5FbXB0eVJlcG9ydEVycm9yKCkgZnJvbSBlCisgICAgICAgIG5pY2Vfc3RhdHNbbm9kZV90eXBlXSA9IHt9CisgICAgICAgIGlmIHRvdGFsICE9IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG9jdW1lbnRlZCA9IHRvdGFsIC0gc3RhdHNbInVuZG9jdW1lbnRlZF8iICsgbm9kZV90eXBlXQorICAgICAgICAgICAgICAgIHBlcmNlbnQgPSAoZG9jdW1lbnRlZCAqIDEwMC4wKSAvIHRvdGFsCisgICAgICAgICAgICAgICAgbmljZV9zdGF0c1tub2RlX3R5cGVdWyJwZXJjZW50X2RvY3VtZW50ZWQiXSA9ICIlLjJmIiAlIHBlcmNlbnQKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBuaWNlX3N0YXRzW25vZGVfdHlwZV1bInBlcmNlbnRfZG9jdW1lbnRlZCJdID0gIk5DIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBlcmNlbnQgPSAoc3RhdHNbImJhZG5hbWVfIiArIG5vZGVfdHlwZV0gKiAxMDAuMCkgLyB0b3RhbAorICAgICAgICAgICAgICAgIG5pY2Vfc3RhdHNbbm9kZV90eXBlXVsicGVyY2VudF9iYWRuYW1lIl0gPSAiJS4yZiIgJSBwZXJjZW50CisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgbmljZV9zdGF0c1tub2RlX3R5cGVdWyJwZXJjZW50X2JhZG5hbWUiXSA9ICJOQyIKKyAgICBsaW5lcyA9ICgidHlwZSIsICJudW1iZXIiLCAib2xkIG51bWJlciIsICJkaWZmZXJlbmNlIiwgIiVkb2N1bWVudGVkIiwgIiViYWRuYW1lIikKKyAgICBmb3Igbm9kZV90eXBlIGluICgibW9kdWxlIiwgImNsYXNzIiwgIm1ldGhvZCIsICJmdW5jdGlvbiIpOgorICAgICAgICBuZXcgPSBzdGF0c1tub2RlX3R5cGVdCisgICAgICAgIG9sZCA9IG9sZF9zdGF0cy5nZXQobm9kZV90eXBlLCBOb25lKQorICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkaWZmX3N0ciA9IGxpbnRfdXRpbHMuZGlmZl9zdHJpbmcob2xkLCBuZXcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvbGQsIGRpZmZfc3RyID0gIk5DIiwgIk5DIgorICAgICAgICBsaW5lcyArPSAoCisgICAgICAgICAgICBub2RlX3R5cGUsCisgICAgICAgICAgICBzdHIobmV3KSwKKyAgICAgICAgICAgIHN0cihvbGQpLAorICAgICAgICAgICAgZGlmZl9zdHIsCisgICAgICAgICAgICBuaWNlX3N0YXRzW25vZGVfdHlwZV0uZ2V0KCJwZXJjZW50X2RvY3VtZW50ZWQiLCAiMCIpLAorICAgICAgICAgICAgbmljZV9zdGF0c1tub2RlX3R5cGVdLmdldCgicGVyY2VudF9iYWRuYW1lIiwgIjAiKSwKKyAgICAgICAgKQorICAgIHNlY3QuYXBwZW5kKHJlcG9ydGVyX25vZGVzLlRhYmxlKGNoaWxkcmVuPWxpbmVzLCBjb2xzPTYsIHJoZWFkZXJzPTEpKQorCisKK2RlZiByZWRlZmluZWRfYnlfZGVjb3JhdG9yKG5vZGUpOgorICAgICIiInJldHVybiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZXRob2QgcmVkZWZpbmVkIHZpYSBkZWNvcmF0b3IuCisKKyAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgQHByb3BlcnR5CisgICAgICAgIGRlZiB4KHNlbGYpOiByZXR1cm4gc2VsZi5feAorICAgICAgICBAeC5zZXR0ZXIKKyAgICAgICAgZGVmIHgoc2VsZiwgdmFsdWUpOiBzZWxmLl94ID0gdmFsdWUKKyAgICAiIiIKKyAgICBpZiBub2RlLmRlY29yYXRvcnM6CisgICAgICAgIGZvciBkZWNvcmF0b3IgaW4gbm9kZS5kZWNvcmF0b3JzLm5vZGVzOgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGVjb3JhdG9yLCBhc3Ryb2lkLkF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICBhbmQgZ2V0YXR0cihkZWNvcmF0b3IuZXhwciwgIm5hbWUiLCBOb25lKSA9PSBub2RlLm5hbWUKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBfQmFzaWNDaGVja2VyKGNoZWNrZXJzLkJhc2VDaGVja2VyKToKKyAgICBfX2ltcGxlbWVudHNfXyA9IGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyCisgICAgbmFtZSA9ICJiYXNpYyIKKworCitjbGFzcyBCYXNpY0Vycm9yQ2hlY2tlcihfQmFzaWNDaGVja2VyKToKKyAgICBtc2dzID0geworICAgICAgICAiRTAxMDAiOiAoCisgICAgICAgICAgICAiX19pbml0X18gbWV0aG9kIGlzIGEgZ2VuZXJhdG9yIiwKKyAgICAgICAgICAgICJpbml0LWlzLWdlbmVyYXRvciIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBzcGVjaWFsIGNsYXNzIG1ldGhvZCBfX2luaXRfXyBpcyB0dXJuZWQgaW50byBhICIKKyAgICAgICAgICAgICJnZW5lcmF0b3IgYnkgYSB5aWVsZCBpbiBpdHMgYm9keS4iLAorICAgICAgICApLAorICAgICAgICAiRTAxMDEiOiAoCisgICAgICAgICAgICAiRXhwbGljaXQgcmV0dXJuIGluIF9faW5pdF9fIiwKKyAgICAgICAgICAgICJyZXR1cm4taW4taW5pdCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBzcGVjaWFsIGNsYXNzIG1ldGhvZCBfX2luaXRfXyBoYXMgYW4gZXhwbGljaXQgIgorICAgICAgICAgICAgInJldHVybiB2YWx1ZS4iLAorICAgICAgICApLAorICAgICAgICAiRTAxMDIiOiAoCisgICAgICAgICAgICAiJXMgYWxyZWFkeSBkZWZpbmVkIGxpbmUgJXMiLAorICAgICAgICAgICAgImZ1bmN0aW9uLXJlZGVmaW5lZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gLyBjbGFzcyAvIG1ldGhvZCBpcyByZWRlZmluZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTAzIjogKAorICAgICAgICAgICAgIiVyIG5vdCBwcm9wZXJseSBpbiBsb29wIiwKKyAgICAgICAgICAgICJub3QtaW4tbG9vcCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGJyZWFrIG9yIGNvbnRpbnVlIGtleXdvcmRzIGFyZSB1c2VkIG91dHNpZGUgYSBsb29wLiIsCisgICAgICAgICksCisgICAgICAgICJFMDEwNCI6ICgKKyAgICAgICAgICAgICJSZXR1cm4gb3V0c2lkZSBmdW5jdGlvbiIsCisgICAgICAgICAgICAicmV0dXJuLW91dHNpZGUtZnVuY3Rpb24iLAorICAgICAgICAgICAgJ1VzZWQgd2hlbiBhICJyZXR1cm4iIHN0YXRlbWVudCBpcyBmb3VuZCBvdXRzaWRlIGEgZnVuY3Rpb24gb3IgbWV0aG9kLicsCisgICAgICAgICksCisgICAgICAgICJFMDEwNSI6ICgKKyAgICAgICAgICAgICJZaWVsZCBvdXRzaWRlIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICJ5aWVsZC1vdXRzaWRlLWZ1bmN0aW9uIiwKKyAgICAgICAgICAgICdVc2VkIHdoZW4gYSAieWllbGQiIHN0YXRlbWVudCBpcyBmb3VuZCBvdXRzaWRlIGEgZnVuY3Rpb24gb3IgbWV0aG9kLicsCisgICAgICAgICksCisgICAgICAgICJFMDEwNiI6ICgKKyAgICAgICAgICAgICJSZXR1cm4gd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yIiwKKyAgICAgICAgICAgICJyZXR1cm4tYXJnLWluLWdlbmVyYXRvciIsCisgICAgICAgICAgICAnVXNlZCB3aGVuIGEgInJldHVybiIgc3RhdGVtZW50IHdpdGggYW4gYXJndW1lbnQgaXMgZm91bmQgJworICAgICAgICAgICAgIm91dHNpZGUgaW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24gb3IgbWV0aG9kIChlLmcuIHdpdGggc29tZSAiCisgICAgICAgICAgICAnInlpZWxkIiBzdGF0ZW1lbnRzKS4nLAorICAgICAgICAgICAgeyJtYXh2ZXJzaW9uIjogKDMsIDMpfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTA3IjogKAorICAgICAgICAgICAgIlVzZSBvZiB0aGUgbm9uLWV4aXN0ZW50ICVzIG9wZXJhdG9yIiwKKyAgICAgICAgICAgICJub25leGlzdGVudC1vcGVyYXRvciIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgQy1zdHlsZSBwcmUtaW5jcmVtZW50IG9yICIKKyAgICAgICAgICAgICJwcmUtZGVjcmVtZW50IG9wZXJhdG9yIC0tIGFuZCArKywgd2hpY2ggZG9lc24ndCBleGlzdCBpbiBQeXRob24uIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTA4IjogKAorICAgICAgICAgICAgIkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lICVzIGluIGZ1bmN0aW9uIGRlZmluaXRpb24iLAorICAgICAgICAgICAgImR1cGxpY2F0ZS1hcmd1bWVudC1uYW1lIiwKKyAgICAgICAgICAgICJEdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgaW4gZnVuY3Rpb24gZGVmaW5pdGlvbnMgYXJlIHN5bnRheCBlcnJvcnMuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTEwIjogKAorICAgICAgICAgICAgIkFic3RyYWN0IGNsYXNzICVyIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBpbnN0YW50aWF0ZWQiLAorICAgICAgICAgICAgImFic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFuIGFic3RyYWN0IGNsYXNzIHdpdGggYGFiYy5BQkNNZXRhYCBhcyBtZXRhY2xhc3MgIgorICAgICAgICAgICAgImhhcyBhYnN0cmFjdCBtZXRob2RzIGFuZCBpcyBpbnN0YW50aWF0ZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTIwIjogKAorICAgICAgICAgICAgIkVsc2UgY2xhdXNlIG9uIGxvb3Agd2l0aG91dCBhIGJyZWFrIHN0YXRlbWVudCIsCisgICAgICAgICAgICAidXNlbGVzcy1lbHNlLW9uLWxvb3AiLAorICAgICAgICAgICAgIkxvb3BzIHNob3VsZCBvbmx5IGhhdmUgYW4gZWxzZSBjbGF1c2UgaWYgdGhleSBjYW4gZXhpdCBlYXJseSAiCisgICAgICAgICAgICAid2l0aCBhIGJyZWFrIHN0YXRlbWVudCwgb3RoZXJ3aXNlIHRoZSBzdGF0ZW1lbnRzIHVuZGVyIGVsc2UgIgorICAgICAgICAgICAgInNob3VsZCBiZSBvbiB0aGUgc2FtZSBzY29wZSBhcyB0aGUgbG9vcCBpdHNlbGYuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTEyIjogKAorICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgc3RhcnJlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnQiLAorICAgICAgICAgICAgInRvby1tYW55LXN0YXItZXhwcmVzc2lvbnMiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdGFycmVkICIKKyAgICAgICAgICAgICJleHByZXNzaW9ucyAoYCp4YCkgaW4gYW4gYXNzaWdubWVudC4gVGhpcyBpcyBhIFN5bnRheEVycm9yLiIsCisgICAgICAgICksCisgICAgICAgICJFMDExMyI6ICgKKyAgICAgICAgICAgICJTdGFycmVkIGFzc2lnbm1lbnQgdGFyZ2V0IG11c3QgYmUgaW4gYSBsaXN0IG9yIHR1cGxlIiwKKyAgICAgICAgICAgICJpbnZhbGlkLXN0YXItYXNzaWdubWVudC10YXJnZXQiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIHN0YXIgZXhwcmVzc2lvbiBpcyB1c2VkIGFzIGEgc3RhcnJlZCBhc3NpZ25tZW50IHRhcmdldC4iLAorICAgICAgICApLAorICAgICAgICAiRTAxMTQiOiAoCisgICAgICAgICAgICAiQ2FuIHVzZSBzdGFycmVkIGV4cHJlc3Npb24gb25seSBpbiBhc3NpZ25tZW50IHRhcmdldCIsCisgICAgICAgICAgICAic3Rhci1uZWVkcy1hc3NpZ25tZW50LXRhcmdldCIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGEgc3RhciBleHByZXNzaW9uIGlzIG5vdCB1c2VkIGluIGFuIGFzc2lnbm1lbnQgdGFyZ2V0LiIsCisgICAgICAgICksCisgICAgICAgICJFMDExNSI6ICgKKyAgICAgICAgICAgICJOYW1lICVyIGlzIG5vbmxvY2FsIGFuZCBnbG9iYWwiLAorICAgICAgICAgICAgIm5vbmxvY2FsLWFuZC1nbG9iYWwiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIG5hbWUgaXMgYm90aCBub25sb2NhbCBhbmQgZ2xvYmFsLiIsCisgICAgICAgICksCisgICAgICAgICJFMDExNiI6ICgKKyAgICAgICAgICAgICInY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UiLAorICAgICAgICAgICAgImNvbnRpbnVlLWluLWZpbmFsbHkiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiB0aGUgYGNvbnRpbnVlYCBrZXl3b3JkIGlzIGZvdW5kICIKKyAgICAgICAgICAgICJpbnNpZGUgYSBmaW5hbGx5IGNsYXVzZSwgd2hpY2ggaXMgYSBTeW50YXhFcnJvci4iLAorICAgICAgICAgICAgeyJtYXh2ZXJzaW9uIjogKDMsIDgpfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTE3IjogKAorICAgICAgICAgICAgIm5vbmxvY2FsIG5hbWUgJXMgZm91bmQgd2l0aG91dCBiaW5kaW5nIiwKKyAgICAgICAgICAgICJub25sb2NhbC13aXRob3V0LWJpbmRpbmciLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIG5vbmxvY2FsIHZhcmlhYmxlIGRvZXMgbm90IGhhdmUgYW4gYXR0YWNoZWQgIgorICAgICAgICAgICAgIm5hbWUgc29tZXdoZXJlIGluIHRoZSBwYXJlbnQgc2NvcGVzIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMTE4IjogKAorICAgICAgICAgICAgIk5hbWUgJXIgaXMgdXNlZCBwcmlvciB0byBnbG9iYWwgZGVjbGFyYXRpb24iLAorICAgICAgICAgICAgInVzZWQtcHJpb3ItZ2xvYmFsLWRlY2xhcmF0aW9uIiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gYSBuYW1lIGlzIHVzZWQgcHJpb3IgYSBnbG9iYWwgZGVjbGFyYXRpb24sICIKKyAgICAgICAgICAgICJ3aGljaCByZXN1bHRzIGluIGFuIGVycm9yIHNpbmNlIFB5dGhvbiAzLjYuIiwKKyAgICAgICAgICAgIHsibWludmVyc2lvbiI6ICgzLCA2KX0sCisgICAgICAgICksCisgICAgfQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJmdW5jdGlvbi1yZWRlZmluZWQiKQorICAgIGRlZiB2aXNpdF9jbGFzc2RlZihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVkZWZpbml0aW9uKCJjbGFzcyIsIG5vZGUpCisKKyAgICBkZWYgX3Rvb19tYW55X3N0YXJyZWRfZm9yX3R1cGxlKHNlbGYsIGFzc2lnbl90dXBsZSk6CisgICAgICAgIHN0YXJyZWRfY291bnQgPSAwCisgICAgICAgIGZvciBlbGVtIGluIGFzc2lnbl90dXBsZS5pdGVyZWQoKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbSwgYXN0cm9pZC5UdXBsZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Rvb19tYW55X3N0YXJyZWRfZm9yX3R1cGxlKGVsZW0pCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsZW0sIGFzdHJvaWQuU3RhcnJlZCk6CisgICAgICAgICAgICAgICAgc3RhcnJlZF9jb3VudCArPSAxCisgICAgICAgIHJldHVybiBzdGFycmVkX2NvdW50ID4gMQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJ0b28tbWFueS1zdGFyLWV4cHJlc3Npb25zIiwgImludmFsaWQtc3Rhci1hc3NpZ25tZW50LXRhcmdldCIpCisgICAgZGVmIHZpc2l0X2Fzc2lnbihzZWxmLCBub2RlKToKKyAgICAgICAgIyBDaGVjayAqYSwgKmIgPSAuLi4KKyAgICAgICAgYXNzaWduX3RhcmdldCA9IG5vZGUudGFyZ2V0c1swXQorICAgICAgICAjIENoZWNrICphID0gYgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUudGFyZ2V0c1swXSwgYXN0cm9pZC5TdGFycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtc3Rhci1hc3NpZ25tZW50LXRhcmdldCIsIG5vZGU9bm9kZSkKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3NpZ25fdGFyZ2V0LCBhc3Ryb2lkLlR1cGxlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl90b29fbWFueV9zdGFycmVkX2Zvcl90dXBsZShhc3NpZ25fdGFyZ2V0KToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInRvby1tYW55LXN0YXItZXhwcmVzc2lvbnMiLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInN0YXItbmVlZHMtYXNzaWdubWVudC10YXJnZXQiKQorICAgIGRlZiB2aXNpdF9zdGFycmVkKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGEgU3RhcnJlZCBleHByZXNzaW9uIGlzIHVzZWQgaW4gYW4gYXNzaWdubWVudCB0YXJnZXQuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgICAgICAjIGYoKmFyZ3MpIGlzIGNvbnZlcnRlZCB0byBDYWxsKGFyZ3M9W1N0YXJyZWRdKSwgc28gaWdub3JlCisgICAgICAgICAgICAjIHRoZW0gZm9yIHRoaXMgY2hlY2suCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUucGFyZW50LCAoYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlR1cGxlLCBhc3Ryb2lkLlNldCwgYXN0cm9pZC5EaWN0KQorICAgICAgICApOgorICAgICAgICAgICAgIyBQRVAgNDQ4IHVucGFja2luZy4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHN0bXQgPSBub2RlLnN0YXRlbWVudCgpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuQXNzaWduKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHN0bXQudmFsdWUgaXMgbm9kZSBvciBzdG10LnZhbHVlLnBhcmVudF9vZihub2RlKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInN0YXItbmVlZHMtYXNzaWdubWVudC10YXJnZXQiLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJpbml0LWlzLWdlbmVyYXRvciIsCisgICAgICAgICJyZXR1cm4taW4taW5pdCIsCisgICAgICAgICJmdW5jdGlvbi1yZWRlZmluZWQiLAorICAgICAgICAicmV0dXJuLWFyZy1pbi1nZW5lcmF0b3IiLAorICAgICAgICAiZHVwbGljYXRlLWFyZ3VtZW50LW5hbWUiLAorICAgICAgICAibm9ubG9jYWwtYW5kLWdsb2JhbCIsCisgICAgICAgICJ1c2VkLXByaW9yLWdsb2JhbC1kZWNsYXJhdGlvbiIsCisgICAgKQorICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbm9ubG9jYWxfYW5kX2dsb2JhbChub2RlKQorICAgICAgICBzZWxmLl9jaGVja19uYW1lX3VzZWRfcHJpb3JfZ2xvYmFsKG5vZGUpCisgICAgICAgIGlmIG5vdCByZWRlZmluZWRfYnlfZGVjb3JhdG9yKAorICAgICAgICAgICAgbm9kZQorICAgICAgICApIGFuZCBub3QgdXRpbHMuaXNfcmVnaXN0ZXJlZF9pbl9zaW5nbGVkaXNwYXRjaF9mdW5jdGlvbihub2RlKToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3JlZGVmaW5pdGlvbihub2RlLmlzX21ldGhvZCgpIGFuZCAibWV0aG9kIiBvciAiZnVuY3Rpb24iLCBub2RlKQorICAgICAgICAjIGNoZWNrcyBmb3IgbWF4IHJldHVybnMsIGJyYW5jaCwgcmV0dXJuIGluIF9faW5pdF9fCisgICAgICAgIHJldHVybnMgPSBub2RlLm5vZGVzX29mX2NsYXNzKAorICAgICAgICAgICAgYXN0cm9pZC5SZXR1cm4sIHNraXBfa2xhc3M9KGFzdHJvaWQuRnVuY3Rpb25EZWYsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICkKKyAgICAgICAgaWYgbm9kZS5pc19tZXRob2QoKSBhbmQgbm9kZS5uYW1lID09ICJfX2luaXRfXyI6CisgICAgICAgICAgICBpZiBub2RlLmlzX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImluaXQtaXMtZ2VuZXJhdG9yIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbci52YWx1ZSBmb3IgciBpbiByZXR1cm5zXQorICAgICAgICAgICAgICAgICMgQXJlIHdlIHJldHVybmluZyBhbnl0aGluZyBidXQgTm9uZSBmcm9tIGNvbnN0cnVjdG9ycworICAgICAgICAgICAgICAgIGlmIGFueSh2IGZvciB2IGluIHZhbHVlcyBpZiBub3QgdXRpbHMuaXNfbm9uZSh2KSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJldHVybi1pbi1pbml0Iiwgbm9kZT1ub2RlKQorICAgICAgICAjIENoZWNrIGZvciBkdXBsaWNhdGUgbmFtZXMgYnkgY2x1c3RlcmluZyBhcmdzIHdpdGggc2FtZSBuYW1lIGZvciBkZXRhaWxlZCByZXBvcnQKKyAgICAgICAgYXJnX2NsdXN0ZXJzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgYXJndW1lbnRzID0gZmlsdGVyKE5vbmUsIFtub2RlLmFyZ3MuYXJncywgbm9kZS5hcmdzLmt3b25seWFyZ3NdKQorCisgICAgICAgIGZvciBhcmcgaW4gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUoYXJndW1lbnRzKToKKyAgICAgICAgICAgIGFyZ19jbHVzdGVyc1thcmcubmFtZV0uYXBwZW5kKGFyZykKKworICAgICAgICAjIHByb3ZpZGUgZGV0YWlsZWQgcmVwb3J0IGFib3V0IGVhY2ggcmVwZWF0ZWQgYXJndW1lbnQKKyAgICAgICAgZm9yIGFyZ3VtZW50X2R1cGxpY2F0ZXMgaW4gYXJnX2NsdXN0ZXJzLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3VtZW50X2R1cGxpY2F0ZXMpICE9IDE6CisgICAgICAgICAgICAgICAgZm9yIGFyZ3VtZW50IGluIGFyZ3VtZW50X2R1cGxpY2F0ZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlLWFyZ3VtZW50LW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1hcmd1bWVudC5saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlPWFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oYXJndW1lbnQubmFtZSwpLAorICAgICAgICAgICAgICAgICAgICApCisKKyAgICB2aXNpdF9hc3luY2Z1bmN0aW9uZGVmID0gdmlzaXRfZnVuY3Rpb25kZWYKKworICAgIGRlZiBfY2hlY2tfbmFtZV91c2VkX3ByaW9yX2dsb2JhbChzZWxmLCBub2RlKToKKworICAgICAgICBzY29wZV9nbG9iYWxzID0geworICAgICAgICAgICAgbmFtZTogY2hpbGQKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuR2xvYmFsKQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gY2hpbGQubmFtZXMKKyAgICAgICAgICAgIGlmIGNoaWxkLnNjb3BlKCkgaXMgbm9kZQorICAgICAgICB9CisKKyAgICAgICAgaWYgbm90IHNjb3BlX2dsb2JhbHM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3Igbm9kZV9uYW1lIGluIG5vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIGlmIG5vZGVfbmFtZS5zY29wZSgpIGlzIG5vdCBub2RlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIG5hbWUgPSBub2RlX25hbWUubmFtZQorICAgICAgICAgICAgY29ycmVzcG9uZGluZ19nbG9iYWwgPSBzY29wZV9nbG9iYWxzLmdldChuYW1lKQorICAgICAgICAgICAgaWYgbm90IGNvcnJlc3BvbmRpbmdfZ2xvYmFsOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGdsb2JhbF9saW5lbm8gPSBjb3JyZXNwb25kaW5nX2dsb2JhbC5mcm9tbGluZW5vCisgICAgICAgICAgICBpZiBnbG9iYWxfbGluZW5vIGFuZCBnbG9iYWxfbGluZW5vID4gbm9kZV9uYW1lLmZyb21saW5lbm86CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgInVzZWQtcHJpb3ItZ2xvYmFsLWRlY2xhcmF0aW9uIiwgbm9kZT1ub2RlX25hbWUsIGFyZ3M9KG5hbWUsKQorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfbm9ubG9jYWxfYW5kX2dsb2JhbChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhIG5hbWUgaXMgYm90aCBub25sb2NhbCBhbmQgZ2xvYmFsLiIiIgorCisgICAgICAgIGRlZiBzYW1lX3Njb3BlKGN1cnJlbnQpOgorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuc2NvcGUoKSBpcyBub2RlCisKKyAgICAgICAgZnJvbV9pdGVyID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUKKyAgICAgICAgbm9ubG9jYWxzID0gc2V0KAorICAgICAgICAgICAgZnJvbV9pdGVyKAorICAgICAgICAgICAgICAgIGNoaWxkLm5hbWVzCisgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5Ob25sb2NhbCkKKyAgICAgICAgICAgICAgICBpZiBzYW1lX3Njb3BlKGNoaWxkKQorICAgICAgICAgICAgKQorICAgICAgICApCisKKyAgICAgICAgaWYgbm90IG5vbmxvY2FsczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGdsb2JhbF92YXJzID0gc2V0KAorICAgICAgICAgICAgZnJvbV9pdGVyKAorICAgICAgICAgICAgICAgIGNoaWxkLm5hbWVzCisgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5HbG9iYWwpCisgICAgICAgICAgICAgICAgaWYgc2FtZV9zY29wZShjaGlsZCkKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgICAgICBmb3IgbmFtZSBpbiBub25sb2NhbHMuaW50ZXJzZWN0aW9uKGdsb2JhbF92YXJzKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5vbmxvY2FsLWFuZC1nbG9iYWwiLCBhcmdzPShuYW1lLCksIG5vZGU9bm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygicmV0dXJuLW91dHNpZGUtZnVuY3Rpb24iKQorICAgIGRlZiB2aXNpdF9yZXR1cm4oc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUuZnJhbWUoKSwgYXN0cm9pZC5GdW5jdGlvbkRlZik6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJyZXR1cm4tb3V0c2lkZS1mdW5jdGlvbiIsIG5vZGU9bm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygieWllbGQtb3V0c2lkZS1mdW5jdGlvbiIpCisgICAgZGVmIHZpc2l0X3lpZWxkKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja195aWVsZF9vdXRzaWRlX2Z1bmMobm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygieWllbGQtb3V0c2lkZS1mdW5jdGlvbiIpCisgICAgZGVmIHZpc2l0X3lpZWxkZnJvbShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfeWllbGRfb3V0c2lkZV9mdW5jKG5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoIm5vdC1pbi1sb29wIiwgImNvbnRpbnVlLWluLWZpbmFsbHkiKQorICAgIGRlZiB2aXNpdF9jb250aW51ZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfaW5fbG9vcChub2RlLCAiY29udGludWUiKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJub3QtaW4tbG9vcCIpCisgICAgZGVmIHZpc2l0X2JyZWFrKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19pbl9sb29wKG5vZGUsICJicmVhayIpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInVzZWxlc3MtZWxzZS1vbi1sb29wIikKKyAgICBkZWYgdmlzaXRfZm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19lbHNlX29uX2xvb3Aobm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidXNlbGVzcy1lbHNlLW9uLWxvb3AiKQorICAgIGRlZiB2aXNpdF93aGlsZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZWxzZV9vbl9sb29wKG5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoIm5vbmV4aXN0ZW50LW9wZXJhdG9yIikKKyAgICBkZWYgdmlzaXRfdW5hcnlvcChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgdXNlIG9mIHRoZSBub24tZXhpc3RlbnQgKysgYW5kIC0tIG9wZXJhdG9yIG9wZXJhdG9yIiIiCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIChub2RlLm9wIGluICIrLSIpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLm9wZXJhbmQsIGFzdHJvaWQuVW5hcnlPcCkKKyAgICAgICAgICAgIGFuZCAobm9kZS5vcGVyYW5kLm9wID09IG5vZGUub3ApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJub25leGlzdGVudC1vcGVyYXRvciIsIG5vZGU9bm9kZSwgYXJncz1ub2RlLm9wICogMikKKworICAgIGRlZiBfY2hlY2tfbm9ubG9jYWxfd2l0aG91dF9iaW5kaW5nKHNlbGYsIG5vZGUsIG5hbWUpOgorICAgICAgICBjdXJyZW50X3Njb3BlID0gbm9kZS5zY29wZSgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBjdXJyZW50X3Njb3BlLnBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGN1cnJlbnRfc2NvcGUsIChhc3Ryb2lkLkNsYXNzRGVmLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibm9ubG9jYWwtd2l0aG91dC1iaW5kaW5nIiwgYXJncz0obmFtZSwpLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGN1cnJlbnRfc2NvcGUubG9jYWxzOgorICAgICAgICAgICAgICAgIGN1cnJlbnRfc2NvcGUgPSBjdXJyZW50X3Njb3BlLnBhcmVudC5zY29wZSgpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBPa2F5LCBmb3VuZCBpdC4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGN1cnJlbnRfc2NvcGUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibm9ubG9jYWwtd2l0aG91dC1iaW5kaW5nIiwgYXJncz0obmFtZSwpLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoIm5vbmxvY2FsLXdpdGhvdXQtYmluZGluZyIpCisgICAgZGVmIHZpc2l0X25vbmxvY2FsKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbm9ubG9jYWxfd2l0aG91dF9iaW5kaW5nKG5vZGUsIG5hbWUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImFic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZCIpCisgICAgZGVmIHZpc2l0X2NhbGwoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIGluc3RhbnRpYXRpbmcgYWJzdHJhY3QgY2xhc3Mgd2l0aAorICAgICAgICBhYmMuQUJDTWV0YSBhcyBtZXRhY2xhc3MuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaW5mZXJyZWQgaW4gbm9kZS5mdW5jLmluZmVyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW5mZXJyZWRfY2xhc3NfaXNfYWJzdHJhY3QoaW5mZXJyZWQsIG5vZGUpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX2NoZWNrX2luZmVycmVkX2NsYXNzX2lzX2Fic3RyYWN0KHNlbGYsIGluZmVycmVkLCBub2RlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAga2xhc3MgPSB1dGlscy5ub2RlX2ZyYW1lX2NsYXNzKG5vZGUpCisgICAgICAgIGlmIGtsYXNzIGlzIGluZmVycmVkOgorICAgICAgICAgICAgIyBEb24ndCBlbWl0IHRoZSB3YXJuaW5nIGlmIHRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQKKyAgICAgICAgICAgICMgaW4gaXRzIG93biBib2R5IG9yIGlmIHRoZSBjYWxsIGlzIG5vdCBhbiBpbnN0YW5jZQorICAgICAgICAgICAgIyBjcmVhdGlvbi4gSWYgdGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZCBpbnRvIGl0cyBvd24KKyAgICAgICAgICAgICMgYm9keSwgd2UncmUgZXhwZWN0aW5nIHRoYXQgaXQga25vd3Mgd2hhdCBpdCBpcyBkb2luZy4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgX19pbml0X18gd2FzIGNhbGxlZAorICAgICAgICBhYnN0cmFjdF9tZXRob2RzID0gX2hhc19hYnN0cmFjdF9tZXRob2RzKGluZmVycmVkKQorCisgICAgICAgIGlmIG5vdCBhYnN0cmFjdF9tZXRob2RzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbWV0YWNsYXNzID0gaW5mZXJyZWQubWV0YWNsYXNzKCkKKworICAgICAgICBpZiBtZXRhY2xhc3MgaXMgTm9uZToKKyAgICAgICAgICAgICMgUHl0aG9uIDMuNCBoYXMgYGFiYy5BQkNgLCB3aGljaCB3b24ndCBiZSBkZXRlY3RlZAorICAgICAgICAgICAgIyBieSBDbGFzc05vZGUubWV0YWNsYXNzKCkKKyAgICAgICAgICAgIGZvciBhbmNlc3RvciBpbiBpbmZlcnJlZC5hbmNlc3RvcnMoKToKKyAgICAgICAgICAgICAgICBpZiBhbmNlc3Rvci5xbmFtZSgpID09ICJhYmMuQUJDIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWQiLCBhcmdzPShpbmZlcnJlZC5uYW1lLCksIG5vZGU9bm9kZQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG1ldGFjbGFzcy5xbmFtZSgpIGluIEFCQ19NRVRBQ0xBU1NFUzoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgImFic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZCIsIGFyZ3M9KGluZmVycmVkLm5hbWUsKSwgbm9kZT1ub2RlCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX3lpZWxkX291dHNpZGVfZnVuYyhzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS5mcmFtZSgpLCAoYXN0cm9pZC5GdW5jdGlvbkRlZiwgYXN0cm9pZC5MYW1iZGEpKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInlpZWxkLW91dHNpZGUtZnVuY3Rpb24iLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2Vsc2Vfb25fbG9vcChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhbnkgbG9vcCB3aXRoIGFuIGVsc2UgY2xhdXNlIGhhcyBhIGJyZWFrIHN0YXRlbWVudC4iIiIKKyAgICAgICAgaWYgbm9kZS5vcmVsc2UgYW5kIG5vdCBfbG9vcF9leGl0c19lYXJseShub2RlKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInVzZWxlc3MtZWxzZS1vbi1sb29wIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIG5vdCBvcHRpbWFsLCBidXQgdGhlIGxpbmUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAjIHRvIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGVsc2UgY2xhdXNlCisgICAgICAgICAgICAgICAgIyB3aWxsIHVzdWFsbHkgYmUgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIHRoZSBlbHNlOi4KKyAgICAgICAgICAgICAgICBsaW5lPW5vZGUub3JlbHNlWzBdLmxpbmVubyAtIDEsCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX2luX2xvb3Aoc2VsZiwgbm9kZSwgbm9kZV9uYW1lKToKKyAgICAgICAgIiIiY2hlY2sgdGhhdCBhIG5vZGUgaXMgaW5zaWRlIGEgZm9yIG9yIHdoaWxlIGxvb3AiIiIKKyAgICAgICAgX25vZGUgPSBub2RlLnBhcmVudAorICAgICAgICB3aGlsZSBfbm9kZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX25vZGUsIChhc3Ryb2lkLkZvciwgYXN0cm9pZC5XaGlsZSkpOgorICAgICAgICAgICAgICAgIGlmIG5vZGUgbm90IGluIF9ub2RlLm9yZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX25vZGUsIChhc3Ryb2lkLkNsYXNzRGVmLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKF9ub2RlLCBhc3Ryb2lkLlRyeUZpbmFsbHkpCisgICAgICAgICAgICAgICAgYW5kIG5vZGUgaW4gX25vZGUuZmluYWxib2R5CisgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db250aW51ZSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29udGludWUtaW4tZmluYWxseSIsIG5vZGU9bm9kZSkKKworICAgICAgICAgICAgX25vZGUgPSBfbm9kZS5wYXJlbnQKKworICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJub3QtaW4tbG9vcCIsIG5vZGU9bm9kZSwgYXJncz1ub2RlX25hbWUpCisKKyAgICBkZWYgX2NoZWNrX3JlZGVmaW5pdGlvbihzZWxmLCByZWRlZnR5cGUsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayBmb3IgcmVkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24gLyBtZXRob2QgLyBjbGFzcyBuYW1lIiIiCisgICAgICAgIHBhcmVudF9mcmFtZSA9IG5vZGUucGFyZW50LmZyYW1lKCkKKworICAgICAgICAjIElnbm9yZSBmdW5jdGlvbiBzdHVicyBjcmVhdGVkIGZvciB0eXBlIGluZm9ybWF0aW9uCisgICAgICAgIHJlZGVmaW5pdGlvbnMgPSBwYXJlbnRfZnJhbWUubG9jYWxzW25vZGUubmFtZV0KKyAgICAgICAgZGVmaW5lZF9zZWxmID0gbmV4dCgKKyAgICAgICAgICAgIChsb2NhbCBmb3IgbG9jYWwgaW4gcmVkZWZpbml0aW9ucyBpZiBub3QgdXRpbHMuaXNfb3ZlcmxvYWRfc3R1Yihsb2NhbCkpLAorICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgKQorICAgICAgICBpZiBkZWZpbmVkX3NlbGYgaXMgbm90IG5vZGUgYW5kIG5vdCBhc3Ryb2lkLmFyZV9leGNsdXNpdmUobm9kZSwgZGVmaW5lZF9zZWxmKToKKyAgICAgICAgICAgICMgQWRkaXRpb25hbCBjaGVja3MgZm9yIG1ldGhvZHMgd2hpY2ggYXJlIG5vdCBjb25zaWRlcmVkCisgICAgICAgICAgICAjIHJlZGVmaW5lZCwgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBwYXJ0IG9mIHRoZSBiYXNlIEFQSS4KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHBhcmVudF9mcmFtZSwgYXN0cm9pZC5DbGFzc0RlZikKKyAgICAgICAgICAgICAgICBhbmQgbm9kZS5uYW1lIGluIFJFREVGSU5BQkxFX01FVEhPRFMKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgU2tpcCB0eXBpbmcub3ZlcmxvYWQoKSBmdW5jdGlvbnMuCisgICAgICAgICAgICBpZiB1dGlscy5pc19vdmVybG9hZF9zdHViKG5vZGUpOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIEV4ZW1wdCBmdW5jdGlvbnMgcmVkZWZpbmVkIG9uIGEgY29uZGl0aW9uLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5JZik6CisgICAgICAgICAgICAgICAgIyBFeGVtcHQgImlmIG5vdCA8ZnVuYz4iIGNhc2VzCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucGFyZW50LnRlc3QsIGFzdHJvaWQuVW5hcnlPcCkKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vZGUucGFyZW50LnRlc3Qub3AgPT0gIm5vdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQudGVzdC5vcGVyYW5kLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub2RlLnBhcmVudC50ZXN0Lm9wZXJhbmQubmFtZSA9PSBub2RlLm5hbWUKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgICMgRXhlbXB0ICJpZiA8ZnVuYz4gaXMgbm90IE5vbmUiIGNhc2VzCisgICAgICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9ucworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnBhcmVudC50ZXN0LCBhc3Ryb2lkLkNvbXBhcmUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUucGFyZW50LnRlc3QubGVmdCwgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgICAgICBhbmQgbm9kZS5wYXJlbnQudGVzdC5sZWZ0Lm5hbWUgPT0gbm9kZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBub2RlLnBhcmVudC50ZXN0Lm9wc1swXVswXSA9PSAiaXMiCisgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUucGFyZW50LnRlc3Qub3BzWzBdWzFdLCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgICAgICAgICBhbmQgbm9kZS5wYXJlbnQudGVzdC5vcHNbMF1bMV0udmFsdWUgaXMgTm9uZQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgZm9yd2FyZCByZWZlcmVuY2VzIGZvciB0aGlzIG5vZGUuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVkZWZpbml0aW9uX2luZGV4ID0gcmVkZWZpbml0aW9ucy5pbmRleChub2RlKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgcmVkZWZpbml0aW9uIGluIHJlZGVmaW5pdGlvbnNbOnJlZGVmaW5pdGlvbl9pbmRleF06CisgICAgICAgICAgICAgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihyZWRlZmluaXRpb24pCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVkCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5JbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmZlcnJlZC5xbmFtZSgpID09IFRZUElOR19GT1JXQVJEX1JFRl9RTkFNRQorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGR1bW15X3ZhcmlhYmxlc19yZ3ggPSBsaW50X3V0aWxzLmdldF9nbG9iYWxfb3B0aW9uKAorICAgICAgICAgICAgICAgIHNlbGYsICJkdW1teS12YXJpYWJsZXMtcmd4IiwgZGVmYXVsdD1Ob25lCisgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBkdW1teV92YXJpYWJsZXNfcmd4IGFuZCBkdW1teV92YXJpYWJsZXNfcmd4Lm1hdGNoKG5vZGUubmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJmdW5jdGlvbi1yZWRlZmluZWQiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPShyZWRlZnR5cGUsIGRlZmluZWRfc2VsZi5mcm9tbGluZW5vKSwKKyAgICAgICAgICAgICkKKworCitjbGFzcyBCYXNpY0NoZWNrZXIoX0Jhc2ljQ2hlY2tlcik6CisgICAgIiIiY2hlY2tzIGZvciA6CisgICAgKiBkb2Mgc3RyaW5ncworICAgICogbnVtYmVyIG9mIGFyZ3VtZW50cywgbG9jYWwgdmFyaWFibGVzLCBicmFuY2hlcywgcmV0dXJucyBhbmQgc3RhdGVtZW50cyBpbgorICAgIGZ1bmN0aW9ucywgbWV0aG9kcworICAgICogcmVxdWlyZWQgbW9kdWxlIGF0dHJpYnV0ZXMKKyAgICAqIGRhbmdlcm91cyBkZWZhdWx0IHZhbHVlcyBhcyBhcmd1bWVudHMKKyAgICAqIHJlZGVmaW5pdGlvbiBvZiBmdW5jdGlvbiAvIG1ldGhvZCAvIGNsYXNzCisgICAgKiB1c2VzIG9mIHRoZSBnbG9iYWwgc3RhdGVtZW50CisgICAgIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyCisKKyAgICBuYW1lID0gImJhc2ljIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJXMDEwMSI6ICgKKyAgICAgICAgICAgICJVbnJlYWNoYWJsZSBjb2RlIiwKKyAgICAgICAgICAgICJ1bnJlYWNoYWJsZSIsCisgICAgICAgICAgICAnVXNlZCB3aGVuIHRoZXJlIGlzIHNvbWUgY29kZSBiZWhpbmQgYSAicmV0dXJuIiBvciAicmFpc2UiICcKKyAgICAgICAgICAgICJzdGF0ZW1lbnQsIHdoaWNoIHdpbGwgbmV2ZXIgYmUgYWNjZXNzZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTAyIjogKAorICAgICAgICAgICAgIkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlICVzIGFzIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICJkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZSIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgbXV0YWJsZSB2YWx1ZSBhcyBsaXN0IG9yIGRpY3Rpb25hcnkgaXMgZGV0ZWN0ZWQgaW4gIgorICAgICAgICAgICAgImEgZGVmYXVsdCB2YWx1ZSBmb3IgYW4gYXJndW1lbnQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTA0IjogKAorICAgICAgICAgICAgIlN0YXRlbWVudCBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdCIsCisgICAgICAgICAgICAicG9pbnRsZXNzLXN0YXRlbWVudCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgc3RhdGVtZW50IGRvZXNuJ3QgaGF2ZSAob3IgYXQgbGVhc3Qgc2VlbXMgdG8pIGFueSBlZmZlY3QuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTA1IjogKAorICAgICAgICAgICAgIlN0cmluZyBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdCIsCisgICAgICAgICAgICAicG9pbnRsZXNzLXN0cmluZy1zdGF0ZW1lbnQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIHN0cmluZyBpcyB1c2VkIGFzIGEgc3RhdGVtZW50ICh3aGljaCBvZiBjb3Vyc2UgIgorICAgICAgICAgICAgImhhcyBubyBlZmZlY3QpLiBUaGlzIGlzIGEgcGFydGljdWxhciBjYXNlIG9mIFcwMTA0IHdpdGggaXRzICIKKyAgICAgICAgICAgICJvd24gbWVzc2FnZSBzbyB5b3UgY2FuIGVhc2lseSBkaXNhYmxlIGl0IGlmIHlvdSdyZSB1c2luZyAiCisgICAgICAgICAgICAidGhvc2Ugc3RyaW5ncyBhcyBkb2N1bWVudGF0aW9uLCBpbnN0ZWFkIG9mIGNvbW1lbnRzLiIsCisgICAgICAgICksCisgICAgICAgICJXMDEwNiI6ICgKKyAgICAgICAgICAgICdFeHByZXNzaW9uICIlcyIgaXMgYXNzaWduZWQgdG8gbm90aGluZycsCisgICAgICAgICAgICAiZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBleHByZXNzaW9uIHRoYXQgaXMgbm90IGEgZnVuY3Rpb24gY2FsbCBpcyBhc3NpZ25lZCAiCisgICAgICAgICAgICAidG8gbm90aGluZy4gUHJvYmFibHkgc29tZXRoaW5nIGVsc2Ugd2FzIGludGVuZGVkLiIsCisgICAgICAgICksCisgICAgICAgICJXMDEwOCI6ICgKKyAgICAgICAgICAgICJMYW1iZGEgbWF5IG5vdCBiZSBuZWNlc3NhcnkiLAorICAgICAgICAgICAgInVubmVjZXNzYXJ5LWxhbWJkYSIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBib2R5IG9mIGEgbGFtYmRhIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvbiBjYWxsICIKKyAgICAgICAgICAgICJvbiB0aGUgc2FtZSBhcmd1bWVudCBsaXN0IGFzIHRoZSBsYW1iZGEgaXRzZWxmOyBzdWNoIGxhbWJkYSAiCisgICAgICAgICAgICAiZXhwcmVzc2lvbnMgYXJlIGluIGFsbCBidXQgYSBmZXcgY2FzZXMgcmVwbGFjZWFibGUgd2l0aCB0aGUgIgorICAgICAgICAgICAgImZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBpbiB0aGUgYm9keSBvZiB0aGUgbGFtYmRhLiIsCisgICAgICAgICksCisgICAgICAgICJXMDEwOSI6ICgKKyAgICAgICAgICAgICJEdXBsaWNhdGUga2V5ICVyIGluIGRpY3Rpb25hcnkiLAorICAgICAgICAgICAgImR1cGxpY2F0ZS1rZXkiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIGRpY3Rpb25hcnkgZXhwcmVzc2lvbiBiaW5kcyB0aGUgc2FtZSBrZXkgbXVsdGlwbGUgdGltZXMuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTIyIjogKAorICAgICAgICAgICAgIlVzZSBvZiBleGVjIiwKKyAgICAgICAgICAgICJleGVjLXVzZWQiLAorICAgICAgICAgICAgJ1VzZWQgd2hlbiB5b3UgdXNlIHRoZSAiZXhlYyIgc3RhdGVtZW50IChmdW5jdGlvbiBmb3IgUHl0aG9uICcKKyAgICAgICAgICAgICIzKSwgdG8gZGlzY291cmFnZSBpdHMgdXNhZ2UuIFRoYXQgZG9lc24ndCAiCisgICAgICAgICAgICAibWVhbiB5b3UgY2Fubm90IHVzZSBpdCAhIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTIzIjogKAorICAgICAgICAgICAgIlVzZSBvZiBldmFsIiwKKyAgICAgICAgICAgICJldmFsLXVzZWQiLAorICAgICAgICAgICAgJ1VzZWQgd2hlbiB5b3UgdXNlIHRoZSAiZXZhbCIgZnVuY3Rpb24sIHRvIGRpc2NvdXJhZ2UgaXRzICcKKyAgICAgICAgICAgICJ1c2FnZS4gQ29uc2lkZXIgdXNpbmcgYGFzdC5saXRlcmFsX2V2YWxgIGZvciBzYWZlbHkgZXZhbHVhdGluZyAiCisgICAgICAgICAgICAic3RyaW5ncyBjb250YWluaW5nIFB5dGhvbiBleHByZXNzaW9ucyAiCisgICAgICAgICAgICAiZnJvbSB1bnRydXN0ZWQgc291cmNlcy4gIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTUwIjogKAorICAgICAgICAgICAgIiVzIHN0YXRlbWVudCBpbiBmaW5hbGx5IGJsb2NrIG1heSBzd2FsbG93IGV4Y2VwdGlvbiIsCisgICAgICAgICAgICAibG9zdC1leGNlcHRpb24iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIGJyZWFrIG9yIGEgcmV0dXJuIHN0YXRlbWVudCBpcyBmb3VuZCBpbnNpZGUgdGhlICIKKyAgICAgICAgICAgICJmaW5hbGx5IGNsYXVzZSBvZiBhIHRyeS4uLmZpbmFsbHkgYmxvY2s6IHRoZSBleGNlcHRpb25zIHJhaXNlZCAiCisgICAgICAgICAgICAiaW4gdGhlIHRyeSBjbGF1c2Ugd2lsbCBiZSBzaWxlbnRseSBzd2FsbG93ZWQgaW5zdGVhZCBvZiBiZWluZyAiCisgICAgICAgICAgICAicmUtcmFpc2VkLiIsCisgICAgICAgICksCisgICAgICAgICJXMDE5OSI6ICgKKyAgICAgICAgICAgICJBc3NlcnQgY2FsbGVkIG9uIGEgMi1pdGVtLXR1cGxlLiBEaWQgeW91IG1lYW4gJ2Fzc2VydCB4LHknPyIsCisgICAgICAgICAgICAiYXNzZXJ0LW9uLXR1cGxlIiwKKyAgICAgICAgICAgICJBIGNhbGwgb2YgYXNzZXJ0IG9uIGEgdHVwbGUgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gdHJ1ZSBpZiAiCisgICAgICAgICAgICAidGhlIHR1cGxlIGlzIG5vdCBlbXB0eSwgYW5kIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvIGZhbHNlIGlmICIKKyAgICAgICAgICAgICJpdCBpcy4iLAorICAgICAgICApLAorICAgICAgICAiVzAxMjQiOiAoCisgICAgICAgICAgICAnRm9sbG93aW5nICJhcyIgd2l0aCBhbm90aGVyIGNvbnRleHQgbWFuYWdlciBsb29rcyBsaWtlIGEgdHVwbGUuJywKKyAgICAgICAgICAgICJjb25mdXNpbmctd2l0aC1zdGF0ZW1lbnQiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIGB3aXRoYCBzdGF0ZW1lbnQgY29tcG9uZW50IHJldHVybnMgbXVsdGlwbGUgdmFsdWVzICIKKyAgICAgICAgICAgICJhbmQgdXNlcyBuYW1lIGJpbmRpbmcgd2l0aCBgYXNgIG9ubHkgZm9yIGEgcGFydCBvZiB0aG9zZSB2YWx1ZXMsICIKKyAgICAgICAgICAgICJhcyBpbiB3aXRoIGN0eCgpIGFzIGEsIGIuIFRoaXMgY2FuIGJlIG1pc2xlYWRpbmcsIHNpbmNlIGl0J3Mgbm90ICIKKyAgICAgICAgICAgICJjbGVhciBpZiB0aGUgY29udGV4dCBtYW5hZ2VyIHJldHVybnMgYSB0dXBsZSBvciBpZiB0aGUgbm9kZSB3aXRob3V0ICIKKyAgICAgICAgICAgICJhIG5hbWUgYmluZGluZyBpcyBhbm90aGVyIGNvbnRleHQgbWFuYWdlci4iLAorICAgICAgICApLAorICAgICAgICAiVzAxMjUiOiAoCisgICAgICAgICAgICAiVXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlIiwKKyAgICAgICAgICAgICJ1c2luZy1jb25zdGFudC10ZXN0IiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgKElmIG9yIHRlcm5hcnkgaWYpICIKKyAgICAgICAgICAgICJ1c2VzIGEgY29uc3RhbnQgdmFsdWUgZm9yIGl0cyB0ZXN0LiBUaGlzIG1pZ2h0IG5vdCBiZSB3aGF0ICIKKyAgICAgICAgICAgICJ0aGUgdXNlciBpbnRlbmRlZCB0byBkby4iLAorICAgICAgICApLAorICAgICAgICAiVzAxMjYiOiAoCisgICAgICAgICAgICAiVXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBwb3RlbnRpYWxseSB3cm9uZyBmdW5jdGlvbiBvciBtZXRob2QgY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcyIsCisgICAgICAgICAgICAibWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0IiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgKElmIG9yIHRlcm5hcnkgaWYpICIKKyAgICAgICAgICAgICJzZWVtcyB0byB3cm9uZ2x5IGNhbGwgYSBmdW5jdGlvbiBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcyIsCisgICAgICAgICksCisgICAgICAgICJXMDEyNyI6ICgKKyAgICAgICAgICAgICJBc3NpZ25pbmcgdGhlIHNhbWUgdmFyaWFibGUgJXIgdG8gaXRzZWxmIiwKKyAgICAgICAgICAgICJzZWxmLWFzc2lnbmluZy12YXJpYWJsZSIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIHdlIGRldGVjdCB0aGF0IGEgdmFyaWFibGUgaXMgYXNzaWduZWQgdG8gaXRzZWxmIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcwMTI4IjogKAorICAgICAgICAgICAgIlJlZGVjbGFyZWQgdmFyaWFibGUgJXIgaW4gYXNzaWdubWVudCIsCisgICAgICAgICAgICAicmVkZWNsYXJlZC1hc3NpZ25lZC1uYW1lIiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gd2UgZGV0ZWN0IHRoYXQgYSB2YXJpYWJsZSB3YXMgcmVkZWNsYXJlZCBpbiB0aGUgc2FtZSBhc3NpZ25tZW50LiIsCisgICAgICAgICksCisgICAgICAgICJFMDExMSI6ICgKKyAgICAgICAgICAgICJUaGUgZmlyc3QgcmV2ZXJzZWQoKSBhcmd1bWVudCBpcyBub3QgYSBzZXF1ZW5jZSIsCisgICAgICAgICAgICAiYmFkLXJldmVyc2VkLXNlcXVlbmNlIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHJldmVyc2VkKCkgYnVpbHRpbiAiCisgICAgICAgICAgICAiaXNuJ3QgYSBzZXF1ZW5jZSAoZG9lcyBub3QgaW1wbGVtZW50IF9fcmV2ZXJzZWRfXywgIgorICAgICAgICAgICAgIm5vciBfX2dldGl0ZW1fXyBhbmQgX19sZW5fXyIsCisgICAgICAgICksCisgICAgICAgICJFMDExOSI6ICgKKyAgICAgICAgICAgICJmb3JtYXQgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBvbiBzdHIiLAorICAgICAgICAgICAgIm1pc3BsYWNlZC1mb3JtYXQtZnVuY3Rpb24iLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBmb3JtYXQgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBvbiBzdHIgb2JqZWN0LiAiCisgICAgICAgICAgICAnZS5nIGRvaW5nIHByaW50KCJ2YWx1ZToge30iKS5mb3JtYXQoMTIzKSBpbnN0ZWFkIG9mICcKKyAgICAgICAgICAgICdwcmludCgidmFsdWU6IHt9Ii5mb3JtYXQoMTIzKSkuIFRoaXMgbWlnaHQgbm90IGJlIHdoYXQgdGhlIHVzZXIgJworICAgICAgICAgICAgImludGVuZGVkIHRvIGRvLiIsCisgICAgICAgICksCisgICAgICAgICJXMDEyOSI6ICgKKyAgICAgICAgICAgICJBc3NlcnQgc3RhdGVtZW50IGhhcyBhIHN0cmluZyBsaXRlcmFsIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4gVGhlIGFzc2VydCB3aWxsICVzIGZhaWwuIiwKKyAgICAgICAgICAgICJhc3NlcnQtb24tc3RyaW5nLWxpdGVyYWwiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBhc3NlcnQgc3RhdGVtZW50IGhhcyBhIHN0cmluZyBsaXRlcmFsIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgd2hpY2ggd2lsbCAiCisgICAgICAgICAgICAiY2F1c2UgdGhlIGFzc2VydCB0byBhbHdheXMgcGFzcy4iLAorICAgICAgICApLAorICAgIH0KKworICAgIHJlcG9ydHMgPSAoKCJSUDAxMDEiLCAiU3RhdGlzdGljcyBieSB0eXBlIiwgcmVwb3J0X2J5X3R5cGVfc3RhdHMpLCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXIpOgorICAgICAgICBfQmFzaWNDaGVja2VyLl9faW5pdF9fKHNlbGYsIGxpbnRlcikKKyAgICAgICAgc2VsZi5zdGF0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5fdHJ5ZmluYWxseXMgPSBOb25lCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIiIiaW5pdGlhbGl6ZSB2aXNpdCB2YXJpYWJsZXMgYW5kIHN0YXRpc3RpY3MiIiIKKyAgICAgICAgc2VsZi5fdHJ5ZmluYWxseXMgPSBbXQorICAgICAgICBzZWxmLnN0YXRzID0gc2VsZi5saW50ZXIuYWRkX3N0YXRzKG1vZHVsZT0wLCBmdW5jdGlvbj0wLCBtZXRob2Q9MCwgY2xhc3NfPTApCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInVzaW5nLWNvbnN0YW50LXRlc3QiLCAibWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0IikKKyAgICBkZWYgdmlzaXRfaWYoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3VzaW5nX2NvbnN0YW50X3Rlc3Qobm9kZSwgbm9kZS50ZXN0KQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJ1c2luZy1jb25zdGFudC10ZXN0IiwgIm1pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdCIpCisgICAgZGVmIHZpc2l0X2lmZXhwKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja191c2luZ19jb25zdGFudF90ZXN0KG5vZGUsIG5vZGUudGVzdCkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidXNpbmctY29uc3RhbnQtdGVzdCIsICJtaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3QiKQorICAgIGRlZiB2aXNpdF9jb21wcmVoZW5zaW9uKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub2RlLmlmczoKKyAgICAgICAgICAgIGZvciBpZl90ZXN0IGluIG5vZGUuaWZzOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3VzaW5nX2NvbnN0YW50X3Rlc3Qobm9kZSwgaWZfdGVzdCkKKworICAgIGRlZiBfY2hlY2tfdXNpbmdfY29uc3RhbnRfdGVzdChzZWxmLCBub2RlLCB0ZXN0KToKKyAgICAgICAgY29uc3Rfbm9kZXMgPSAoCisgICAgICAgICAgICBhc3Ryb2lkLk1vZHVsZSwKKyAgICAgICAgICAgIGFzdHJvaWQuc2NvcGVkX25vZGVzLkdlbmVyYXRvckV4cCwKKyAgICAgICAgICAgIGFzdHJvaWQuTGFtYmRhLAorICAgICAgICAgICAgYXN0cm9pZC5GdW5jdGlvbkRlZiwKKyAgICAgICAgICAgIGFzdHJvaWQuQ2xhc3NEZWYsCisgICAgICAgICAgICBhc3Ryb2lkLmJhc2VzLkdlbmVyYXRvciwKKyAgICAgICAgICAgIGFzdHJvaWQuVW5ib3VuZE1ldGhvZCwKKyAgICAgICAgICAgIGFzdHJvaWQuQm91bmRNZXRob2QsCisgICAgICAgICAgICBhc3Ryb2lkLk1vZHVsZSwKKyAgICAgICAgKQorICAgICAgICBzdHJ1Y3RzID0gKGFzdHJvaWQuRGljdCwgYXN0cm9pZC5UdXBsZSwgYXN0cm9pZC5TZXQsIGFzdHJvaWQuTGlzdCkKKworICAgICAgICAjIFRoZXNlIG5vZGVzIGFyZSBleGNlcHRlZCwgc2luY2UgdGhleSBhcmUgbm90IGNvbnN0YW50CisgICAgICAgICMgdmFsdWVzLCByZXF1aXJpbmcgYSBjb21wdXRhdGlvbiB0byBoYXBwZW4uCisgICAgICAgIGV4Y2VwdF9ub2RlcyA9ICgKKyAgICAgICAgICAgIGFzdHJvaWQuQ2FsbCwKKyAgICAgICAgICAgIGFzdHJvaWQuQmluT3AsCisgICAgICAgICAgICBhc3Ryb2lkLkJvb2xPcCwKKyAgICAgICAgICAgIGFzdHJvaWQuVW5hcnlPcCwKKyAgICAgICAgICAgIGFzdHJvaWQuU3Vic2NyaXB0LAorICAgICAgICApCisgICAgICAgIGluZmVycmVkID0gTm9uZQorICAgICAgICBlbWl0ID0gaXNpbnN0YW5jZSh0ZXN0LCAoYXN0cm9pZC5Db25zdCwpICsgc3RydWN0cyArIGNvbnN0X25vZGVzKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXN0LCBleGNlcHRfbm9kZXMpOgorICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKHRlc3QpCisKKyAgICAgICAgaWYgZW1pdDoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVzaW5nLWNvbnN0YW50LXRlc3QiLCBub2RlPW5vZGUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgY29uc3Rfbm9kZXMpOgorICAgICAgICAgICAgIyBJZiB0aGUgY29uc3RhbnQgbm9kZSBpcyBhIEZ1bmN0aW9uRGVmIG9yIExhbWJkYSB0aGVuCisgICAgICAgICAgICAjIGl0IG1heSBiZSBhIGlsbGljaXQgZnVuY3Rpb24gY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcworICAgICAgICAgICAgY2FsbF9pbmZlcnJlZCA9IE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgICAgICAgICAgY2FsbF9pbmZlcnJlZCA9IGluZmVycmVkLmluZmVyX2NhbGxfcmVzdWx0KCkKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuTGFtYmRhKToKKyAgICAgICAgICAgICAgICAgICAgY2FsbF9pbmZlcnJlZCA9IGluZmVycmVkLmluZmVyX2NhbGxfcmVzdWx0KG5vZGUpCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgICAgICBjYWxsX2luZmVycmVkID0gTm9uZQorICAgICAgICAgICAgaWYgY2FsbF9pbmZlcnJlZDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZvciBpbmZfY2FsbCBpbiBjYWxsX2luZmVycmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5mX2NhbGwgIT0gYXN0cm9pZC5VbmluZmVyYWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0Iiwgbm9kZT1ub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVzaW5nLWNvbnN0YW50LXRlc3QiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgdmlzaXRfbW9kdWxlKHNlbGYsIF8pOgorICAgICAgICAiIiJjaGVjayBtb2R1bGUgbmFtZSwgZG9jc3RyaW5nIGFuZCByZXF1aXJlZCBhcmd1bWVudHMiIiIKKyAgICAgICAgc2VsZi5zdGF0c1sibW9kdWxlIl0gKz0gMQorCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGUpOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgICIiImNoZWNrIG1vZHVsZSBuYW1lLCBkb2NzdHJpbmcgYW5kIHJlZGVmaW5pdGlvbgorICAgICAgICBpbmNyZW1lbnQgYnJhbmNoIGNvdW50ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RhdHNbImNsYXNzIl0gKz0gMQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKAorICAgICAgICAicG9pbnRsZXNzLXN0YXRlbWVudCIsICJwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudCIsICJleHByZXNzaW9uLW5vdC1hc3NpZ25lZCIKKyAgICApCisgICAgZGVmIHZpc2l0X2V4cHIoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIGZvciB2YXJpb3VzIGtpbmQgb2Ygc3RhdGVtZW50cyB3aXRob3V0IGVmZmVjdCIiIgorICAgICAgICBleHByID0gbm9kZS52YWx1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGV4cHIsIGFzdHJvaWQuQ29uc3QpIGFuZCBpc2luc3RhbmNlKGV4cHIudmFsdWUsIHN0cik6CisgICAgICAgICAgICAjIHRyZWF0IHN0cmluZyBzdGF0ZW1lbnQgaW4gYSBzZXBhcmF0ZWQgbWVzc2FnZQorICAgICAgICAgICAgIyBIYW5kbGUgUEVQLTI1NyBhdHRyaWJ1dGUgZG9jc3RyaW5ncy4KKyAgICAgICAgICAgICMgQW4gYXR0cmlidXRlIGRvY3N0cmluZyBpcyBkZWZpbmVkIGFzIGJlaW5nIGEgc3RyaW5nIHJpZ2h0IGFmdGVyCisgICAgICAgICAgICAjIGFuIGFzc2lnbm1lbnQgYXQgdGhlIG1vZHVsZSBsZXZlbCwgY2xhc3MgbGV2ZWwgb3IgX19pbml0X18gbGV2ZWwuCisgICAgICAgICAgICBzY29wZSA9IGV4cHIuc2NvcGUoKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBzY29wZSwgKGFzdHJvaWQuQ2xhc3NEZWYsIGFzdHJvaWQuTW9kdWxlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNjb3BlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSBhbmQgc2NvcGUubmFtZSAhPSAiX19pbml0X18iOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2libGluZyA9IGV4cHIucHJldmlvdXNfc2libGluZygpCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzaWJsaW5nLnNjb3BlKCkgaXMgc2NvcGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHNpYmxpbmcsIChhc3Ryb2lkLkFzc2lnbiwgYXN0cm9pZC5Bbm5Bc3NpZ24pKQorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSWdub3JlIGlmIHRoaXMgaXMgOgorICAgICAgICAjICogYSBkaXJlY3QgZnVuY3Rpb24gY2FsbAorICAgICAgICAjICogdGhlIHVuaXF1ZSBjaGlsZCBvZiBhIHRyeS9leGNlcHQgYm9keQorICAgICAgICAjICogYSB5aWVsZCBzdGF0ZW1lbnQKKyAgICAgICAgIyAqIGFuIGVsbGlwc2lzICh3aGljaCBjYW4gYmUgdXNlZCBvbiBQeXRob24gMyBpbnN0ZWFkIG9mIHBhc3MpCisgICAgICAgICMgd2FybiBXMDEwNiBpZiB3ZSBoYXZlIGFueSB1bmRlcmx5aW5nIGZ1bmN0aW9uIGNhbGwgKHdlIGNhbid0IHByZWRpY3QKKyAgICAgICAgIyBzaWRlIGVmZmVjdHMpLCBlbHNlIHBvaW50bGVzcy1zdGF0ZW1lbnQKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShleHByLCAoYXN0cm9pZC5ZaWVsZCwgYXN0cm9pZC5Bd2FpdCwgYXN0cm9pZC5DYWxsKSkKKyAgICAgICAgICAgIG9yICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLlRyeUV4Y2VwdCkKKyAgICAgICAgICAgICAgICBhbmQgbm9kZS5wYXJlbnQuYm9keSA9PSBbbm9kZV0KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIG9yIChpc2luc3RhbmNlKGV4cHIsIGFzdHJvaWQuQ29uc3QpIGFuZCBleHByLnZhbHVlIGlzIEVsbGlwc2lzKQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGFueShleHByLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQ2FsbCkpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQiLCBub2RlPW5vZGUsIGFyZ3M9ZXhwci5hc19zdHJpbmcoKQorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgicG9pbnRsZXNzLXN0YXRlbWVudCIsIG5vZGU9bm9kZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2ZpbHRlcl92YXJhcmcobm9kZSwgY2FsbF9hcmdzKToKKyAgICAgICAgIyBSZXR1cm4gdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGdpdmVuIGNhbGwgd2hpY2ggYXJlCisgICAgICAgICMgbm90IHBhc3NlZCBhcyB2YXJhcmcuCisgICAgICAgIGZvciBhcmcgaW4gY2FsbF9hcmdzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGFzdHJvaWQuU3RhcnJlZCk6CisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGFyZy52YWx1ZSwgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgICAgICBhbmQgYXJnLnZhbHVlLm5hbWUgIT0gbm9kZS5hcmdzLnZhcmFyZworICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGFyZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBhcmcKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2hhc192YXJpYWRpY19hcmd1bWVudChhcmdzLCB2YXJpYWRpY19uYW1lKToKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZy52YWx1ZSwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgICAgICBpZiBhcmcudmFsdWUubmFtZSAhPSB2YXJpYWRpY19uYW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidW5uZWNlc3NhcnktbGFtYmRhIikKKyAgICBkZWYgdmlzaXRfbGFtYmRhKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgbGFtYmRhIGlzIHN1c3BpY2lvdXMiIiIKKyAgICAgICAgIyBpZiB0aGUgYm9keSBvZiB0aGUgbGFtYmRhIGlzIGEgY2FsbCBleHByZXNzaW9uIHdpdGggdGhlIHNhbWUKKyAgICAgICAgIyBhcmd1bWVudCBsaXN0IGFzIHRoZSBsYW1iZGEgaXRzZWxmLCB0aGVuIHRoZSBsYW1iZGEgaXMKKyAgICAgICAgIyBwb3NzaWJseSB1bm5lY2Vzc2FyeSBhbmQgYXQgbGVhc3Qgc3VzcGljaW91cy4KKyAgICAgICAgaWYgbm9kZS5hcmdzLmRlZmF1bHRzOgorICAgICAgICAgICAgIyBJZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBsYW1iZGEgaW5jbHVkZSBkZWZhdWx0cywgdGhlbiBhCisgICAgICAgICAgICAjIGp1ZGdtZW50IGNhbm5vdCBiZSBtYWRlIGJlY2F1c2UgdGhlcmUgaXMgbm8gd2F5IHRvIGNoZWNrCisgICAgICAgICAgICAjIHRoYXQgdGhlIGRlZmF1bHRzIGRlZmluZWQgYnkgdGhlIGxhbWJkYSBhcmUgdGhlIHNhbWUgYXMKKyAgICAgICAgICAgICMgdGhlIGRlZmF1bHRzIGRlZmluZWQgYnkgdGhlIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgYm9keQorICAgICAgICAgICAgIyBvZiB0aGUgbGFtYmRhLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNhbGwgPSBub2RlLmJvZHkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FsbCwgYXN0cm9pZC5DYWxsKToKKyAgICAgICAgICAgICMgVGhlIGJvZHkgb2YgdGhlIGxhbWJkYSBtdXN0IGJlIGEgZnVuY3Rpb24gY2FsbCBleHByZXNzaW9uCisgICAgICAgICAgICAjIGZvciB0aGUgbGFtYmRhIHRvIGJlIHVubmVjZXNzYXJ5LgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5ib2R5LmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKSBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUuYm9keS5mdW5jLmV4cHIsIGFzdHJvaWQuQ2FsbAorICAgICAgICApOgorICAgICAgICAgICAgIyBDaGFpbmVkIGNhbGwsIHRoZSBpbnRlcm1lZGlhdGUgY2FsbCBtaWdodAorICAgICAgICAgICAgIyByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGJ1dCB3ZSBkb24ndCBjaGVjayB0aGF0LCB5ZXQpLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY2FsbF9zaXRlID0gYXN0cm9pZC5hcmd1bWVudHMuQ2FsbFNpdGUuZnJvbV9jYWxsKGNhbGwpCisgICAgICAgIG9yZGluYXJ5X2FyZ3MgPSBsaXN0KG5vZGUuYXJncy5hcmdzKQorICAgICAgICBuZXdfY2FsbF9hcmdzID0gbGlzdChzZWxmLl9maWx0ZXJfdmFyYXJnKG5vZGUsIGNhbGwuYXJncykpCisgICAgICAgIGlmIG5vZGUuYXJncy5rd2FyZzoKKyAgICAgICAgICAgIGlmIHNlbGYuX2hhc192YXJpYWRpY19hcmd1bWVudChjYWxsLmt3YXJncywgbm9kZS5hcmdzLmt3YXJnKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub2RlLmFyZ3MudmFyYXJnOgorICAgICAgICAgICAgaWYgc2VsZi5faGFzX3ZhcmlhZGljX2FyZ3VtZW50KGNhbGwuc3RhcmFyZ3MsIG5vZGUuYXJncy52YXJhcmcpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIGNhbGwuc3RhcmFyZ3M6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBjYWxsLmtleXdvcmRzOgorICAgICAgICAgICAgIyBMb29rIGZvciBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIG5vdCBwYXJ0CisgICAgICAgICAgICAjIG9mIHRoZSBsYW1iZGEncyBzaWduYXR1cmUKKyAgICAgICAgICAgIGxhbWJkYV9rd2FyZ3MgPSB7a2V5d29yZC5uYW1lIGZvciBrZXl3b3JkIGluIG5vZGUuYXJncy5kZWZhdWx0c30KKyAgICAgICAgICAgIGlmIGxlbihsYW1iZGFfa3dhcmdzKSAhPSBsZW4oY2FsbF9zaXRlLmtleXdvcmRfYXJndW1lbnRzKToKKyAgICAgICAgICAgICAgICAjIERpZmZlcmVudCBsZW5ndGhzLCBzbyBwcm9iYWJseSBub3QgaWRlbnRpY2FsCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBzZXQoY2FsbF9zaXRlLmtleXdvcmRfYXJndW1lbnRzKS5kaWZmZXJlbmNlKGxhbWJkYV9rd2FyZ3MpOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgVGhlICJvcmRpbmFyeSIgYXJndW1lbnRzIG11c3QgYmUgaW4gYSBjb3JyZXNwb25kZW5jZSBzdWNoIHRoYXQ6CisgICAgICAgICMgb3JkaW5hcnlfYXJnc1tpXS5uYW1lID09IGNhbGwuYXJnc1tpXS5uYW1lLgorICAgICAgICBpZiBsZW4ob3JkaW5hcnlfYXJncykgIT0gbGVuKG5ld19jYWxsX2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBhcmcsIHBhc3NlZF9hcmcgaW4gemlwKG9yZGluYXJ5X2FyZ3MsIG5ld19jYWxsX2FyZ3MpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFzc2VkX2FyZywgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGFyZy5uYW1lICE9IHBhc3NlZF9hcmcubmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bm5lY2Vzc2FyeS1sYW1iZGEiLCBsaW5lPW5vZGUuZnJvbWxpbmVubywgbm9kZT1ub2RlKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZSIpCisgICAgZGVmIHZpc2l0X2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayBmdW5jdGlvbiBuYW1lLCBkb2NzdHJpbmcsIGFyZ3VtZW50cywgcmVkZWZpbml0aW9uLAorICAgICAgICB2YXJpYWJsZSBuYW1lcywgbWF4IGxvY2FscworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdGF0c1sibWV0aG9kIiBpZiBub2RlLmlzX21ldGhvZCgpIGVsc2UgImZ1bmN0aW9uIl0gKz0gMQorICAgICAgICBzZWxmLl9jaGVja19kYW5nZXJvdXNfZGVmYXVsdChub2RlKQorCisgICAgdmlzaXRfYXN5bmNmdW5jdGlvbmRlZiA9IHZpc2l0X2Z1bmN0aW9uZGVmCisKKyAgICBkZWYgX2NoZWNrX2Rhbmdlcm91c19kZWZhdWx0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayBmb3IgZGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWVzIGFzIGFyZ3VtZW50cy4iIiIKKworICAgICAgICBkZWYgaXNfaXRlcmFibGUoaW50ZXJuYWxfbm9kZSk6CisgICAgICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShpbnRlcm5hbF9ub2RlLCAoYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlNldCwgYXN0cm9pZC5EaWN0KSkKKworICAgICAgICBkZWZhdWx0cyA9IG5vZGUuYXJncy5kZWZhdWx0cyBvciBbXSArIG5vZGUuYXJncy5rd19kZWZhdWx0cyBvciBbXQorICAgICAgICBmb3IgZGVmYXVsdCBpbiBkZWZhdWx0czoKKyAgICAgICAgICAgIGlmIG5vdCBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0KGRlZmF1bHQuaW5mZXIoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLkluc3RhbmNlKQorICAgICAgICAgICAgICAgIGFuZCB2YWx1ZS5xbmFtZSgpIGluIERFRkFVTFRfQVJHVU1FTlRfU1lNQk9MUworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtc2cgPSBERUZBVUxUX0FSR1VNRU5UX1NZTUJPTFNbdmFsdWUucW5hbWUoKV0KKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuSW5zdGFuY2UpIG9yIGlzX2l0ZXJhYmxlKHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBhcmUgaGVyZSBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbihzKToKKyAgICAgICAgICAgICAgICAgICAgIyAgICogYSBkaWN0L3NldC9saXN0L3R1cGxlIGNhbGwgd2hpY2ggd2Fzbid0IGluZmVycmVkCisgICAgICAgICAgICAgICAgICAgICMgICAgIHRvIGEgc3ludGF4IG5vZGUgKHt9LCAoKSBldGMuKS4gVGhpcyBjYW4gaGFwcGVuCisgICAgICAgICAgICAgICAgICAgICMgICAgIHdoZW4gdGhlIGFyZ3VtZW50cyBhcmUgaW52YWxpZCBvciB1bmtub3duIHRvCisgICAgICAgICAgICAgICAgICAgICMgICAgIHRoZSBpbmZlcmVuY2UuCisgICAgICAgICAgICAgICAgICAgICMgICAqIGEgdmFyaWFibGUgZnJvbSBzb21ld2hlcmUgZWxzZSwgd2hpY2ggdHVybnMgb3V0IHRvIGJlIGEgbGlzdAorICAgICAgICAgICAgICAgICAgICAjICAgICBvciBhIGRpY3QuCisgICAgICAgICAgICAgICAgICAgIGlmIGlzX2l0ZXJhYmxlKGRlZmF1bHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gdmFsdWUucHl0eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRlZmF1bHQsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBmInt2YWx1ZS5uYW1lfSgpICh7dmFsdWUucW5hbWUoKX0pIgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gZiJ7ZGVmYXVsdC5hc19zdHJpbmcoKX0gKHt2YWx1ZS5xbmFtZSgpfSkiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyB0aGlzIGFyZ3VtZW50IGlzIGEgbmFtZQorICAgICAgICAgICAgICAgICAgICBtc2cgPSBmIntkZWZhdWx0LmFzX3N0cmluZygpfSAoe0RFRkFVTFRfQVJHVU1FTlRfU1lNQk9MU1t2YWx1ZS5xbmFtZSgpXX0pIgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImRhbmdlcm91cy1kZWZhdWx0LXZhbHVlIiwgbm9kZT1ub2RlLCBhcmdzPShtc2csKSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidW5yZWFjaGFibGUiLCAibG9zdC1leGNlcHRpb24iKQorICAgIGRlZiB2aXNpdF9yZXR1cm4oc2VsZiwgbm9kZSk6CisgICAgICAgICIiIjEgLSBjaGVjayBpcyB0aGUgbm9kZSBoYXMgYSByaWdodCBzaWJsaW5nIChpZiBzbywgdGhhdCdzIHNvbWUKKyAgICAgICAgdW5yZWFjaGFibGUgY29kZSkKKyAgICAgICAgMiAtIGNoZWNrIGlzIHRoZSBub2RlIGlzIGluc2lkZSB0aGUgZmluYWxseSBjbGF1c2Ugb2YgYSB0cnkuLi5maW5hbGx5CisgICAgICAgIGJsb2NrCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVja191bnJlYWNoYWJsZShub2RlKQorICAgICAgICAjIElzIGl0IGluc2lkZSBmaW5hbCBib2R5IG9mIGEgdHJ5Li4uZmluYWxseSBibG9jID8KKyAgICAgICAgc2VsZi5fY2hlY2tfbm90X2luX2ZpbmFsbHkobm9kZSwgInJldHVybiIsIChhc3Ryb2lkLkZ1bmN0aW9uRGVmLCkpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInVucmVhY2hhYmxlIikKKyAgICBkZWYgdmlzaXRfY29udGludWUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIGlzIHRoZSBub2RlIGhhcyBhIHJpZ2h0IHNpYmxpbmcgKGlmIHNvLCB0aGF0J3Mgc29tZSB1bnJlYWNoYWJsZQorICAgICAgICBjb2RlKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfdW5yZWFjaGFibGUobm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidW5yZWFjaGFibGUiLCAibG9zdC1leGNlcHRpb24iKQorICAgIGRlZiB2aXNpdF9icmVhayhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiMSAtIGNoZWNrIGlzIHRoZSBub2RlIGhhcyBhIHJpZ2h0IHNpYmxpbmcgKGlmIHNvLCB0aGF0J3Mgc29tZQorICAgICAgICB1bnJlYWNoYWJsZSBjb2RlKQorICAgICAgICAyIC0gY2hlY2sgaXMgdGhlIG5vZGUgaXMgaW5zaWRlIHRoZSBmaW5hbGx5IGNsYXVzZSBvZiBhIHRyeS4uLmZpbmFsbHkKKyAgICAgICAgYmxvY2sKKyAgICAgICAgIiIiCisgICAgICAgICMgMSAtIElzIGl0IHJpZ2h0IHNpYmxpbmcgPworICAgICAgICBzZWxmLl9jaGVja191bnJlYWNoYWJsZShub2RlKQorICAgICAgICAjIDIgLSBJcyBpdCBpbnNpZGUgZmluYWwgYm9keSBvZiBhIHRyeS4uLmZpbmFsbHkgYmxvYyA/CisgICAgICAgIHNlbGYuX2NoZWNrX25vdF9pbl9maW5hbGx5KG5vZGUsICJicmVhayIsIChhc3Ryb2lkLkZvciwgYXN0cm9pZC5XaGlsZSkpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInVucmVhY2hhYmxlIikKKyAgICBkZWYgdmlzaXRfcmFpc2Uoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIGlmIHRoZSBub2RlIGhhcyBhIHJpZ2h0IHNpYmxpbmcgKGlmIHNvLCB0aGF0J3Mgc29tZSB1bnJlYWNoYWJsZQorICAgICAgICBjb2RlKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfdW5yZWFjaGFibGUobm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiZXhlYy11c2VkIikKKyAgICBkZWYgdmlzaXRfZXhlYyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIianVzdCBwcmludCBhIHdhcm5pbmcgb24gZXhlYyBzdGF0ZW1lbnRzIiIiCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImV4ZWMtdXNlZCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfbWlzcGxhY2VkX2Zvcm1hdF9mdW5jdGlvbihzZWxmLCBjYWxsX25vZGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjYWxsX25vZGUuZnVuYywgYXN0cm9pZC5BdHRyaWJ1dGUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGNhbGxfbm9kZS5mdW5jLmF0dHJuYW1lICE9ICJmb3JtYXQiOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZXhwciA9IHV0aWxzLnNhZmVfaW5mZXIoY2FsbF9ub2RlLmZ1bmMuZXhwcikKKyAgICAgICAgaWYgZXhwciBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBleHByOgorICAgICAgICAgICAgIyB3ZSBhcmUgZG91YnRmdWwgb24gaW5mZXJyZWQgdHlwZSBvZiBub2RlLCBzbyBoZXJlIGp1c3QgY2hlY2sgaWYgZm9ybWF0CisgICAgICAgICAgICAjIHdhcyBjYWxsZWQgb24gcHJpbnQoKQorICAgICAgICAgICAgY2FsbF9leHByID0gY2FsbF9ub2RlLmZ1bmMuZXhwcgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FsbF9leHByLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoY2FsbF9leHByLmZ1bmMsIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgICAgICBhbmQgY2FsbF9leHByLmZ1bmMubmFtZSA9PSAicHJpbnQiCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm1pc3BsYWNlZC1mb3JtYXQtZnVuY3Rpb24iLCBub2RlPWNhbGxfbm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgImV2YWwtdXNlZCIsICJleGVjLXVzZWQiLCAiYmFkLXJldmVyc2VkLXNlcXVlbmNlIiwgIm1pc3BsYWNlZC1mb3JtYXQtZnVuY3Rpb24iCisgICAgKQorICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBhIENhbGwgbm9kZSAtPiBjaGVjayBpZiB0aGlzIGlzIG5vdCBhIGRpc2FsbG93ZWQgYnVpbHRpbgorICAgICAgICBjYWxsIGFuZCBjaGVjayBmb3IgKiBvciAqKiB1c2UKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrX21pc3BsYWNlZF9mb3JtYXRfZnVuY3Rpb24obm9kZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICBuYW1lID0gbm9kZS5mdW5jLm5hbWUKKyAgICAgICAgICAgICMgaWdub3JlIHRoZSBuYW1lIGlmIGl0J3Mgbm90IGEgYnVpbHRpbiAoaS5lLiBub3QgZGVmaW5lZCBpbiB0aGUKKyAgICAgICAgICAgICMgbG9jYWxzIG5vciBnbG9iYWxzIHNjb3BlKQorICAgICAgICAgICAgaWYgbm90IChuYW1lIGluIG5vZGUuZnJhbWUoKSBvciBuYW1lIGluIG5vZGUucm9vdCgpKToKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJleGVjIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZXhlYy11c2VkIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAicmV2ZXJzZWQiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZXZlcnNlZChub2RlKQorICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAiZXZhbCI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImV2YWwtdXNlZCIsIG5vZGU9bm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiYXNzZXJ0LW9uLXR1cGxlIiwgImFzc2VydC1vbi1zdHJpbmctbGl0ZXJhbCIpCisgICAgZGVmIHZpc2l0X2Fzc2VydChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgd2hldGhlciBhc3NlcnQgaXMgdXNlZCBvbiBhIHR1cGxlIG9yIHN0cmluZyBsaXRlcmFsLiIiIgorICAgICAgICBpZiAoCisgICAgICAgICAgICBub2RlLmZhaWwgaXMgTm9uZQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS50ZXN0LCBhc3Ryb2lkLlR1cGxlKQorICAgICAgICAgICAgYW5kIGxlbihub2RlLnRlc3QuZWx0cykgPT0gMgorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYXNzZXJ0LW9uLXR1cGxlIiwgbm9kZT1ub2RlKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS50ZXN0LCBhc3Ryb2lkLkNvbnN0KSBhbmQgaXNpbnN0YW5jZShub2RlLnRlc3QudmFsdWUsIHN0cik6CisgICAgICAgICAgICBpZiBub2RlLnRlc3QudmFsdWU6CisgICAgICAgICAgICAgICAgd2hlbiA9ICJuZXZlciIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2hlbiA9ICJhbHdheXMiCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJhc3NlcnQtb24tc3RyaW5nLWxpdGVyYWwiLCBub2RlPW5vZGUsIGFyZ3M9KHdoZW4sKSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiZHVwbGljYXRlLWtleSIpCisgICAgZGVmIHZpc2l0X2RpY3Qoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIGR1cGxpY2F0ZSBrZXkgaW4gZGljdGlvbmFyeSIiIgorICAgICAgICBrZXlzID0gc2V0KCkKKyAgICAgICAgZm9yIGssIF8gaW4gbm9kZS5pdGVtczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaywgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICAgICAga2V5ID0gay52YWx1ZQorICAgICAgICAgICAgICAgIGlmIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJkdXBsaWNhdGUta2V5Iiwgbm9kZT1ub2RlLCBhcmdzPWtleSkKKyAgICAgICAgICAgICAgICBrZXlzLmFkZChrZXkpCisKKyAgICBkZWYgdmlzaXRfdHJ5ZmluYWxseShzZWxmLCBub2RlKToKKyAgICAgICAgIiIidXBkYXRlIHRyeS4uLmZpbmFsbHkgZmxhZyIiIgorICAgICAgICBzZWxmLl90cnlmaW5hbGx5cy5hcHBlbmQobm9kZSkKKworICAgIGRlZiBsZWF2ZV90cnlmaW5hbGx5KHNlbGYsIG5vZGUpOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgICIiInVwZGF0ZSB0cnkuLi5maW5hbGx5IGZsYWciIiIKKyAgICAgICAgc2VsZi5fdHJ5ZmluYWxseXMucG9wKCkKKworICAgIGRlZiBfY2hlY2tfdW5yZWFjaGFibGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIHVucmVhY2hhYmxlIGNvZGUiIiIKKyAgICAgICAgdW5yZWFjaF9zdG10ID0gbm9kZS5uZXh0X3NpYmxpbmcoKQorICAgICAgICBpZiB1bnJlYWNoX3N0bXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bnJlYWNoYWJsZSIsIG5vZGU9dW5yZWFjaF9zdG10KQorCisgICAgZGVmIF9jaGVja19ub3RfaW5fZmluYWxseShzZWxmLCBub2RlLCBub2RlX25hbWUsIGJyZWFrZXJfY2xhc3Nlcz0oKSk6CisgICAgICAgICIiImNoZWNrIHRoYXQgYSBub2RlIGlzIG5vdCBpbnNpZGUgYSBmaW5hbGx5IGNsYXVzZSBvZiBhCisgICAgICAgIHRyeS4uLmZpbmFsbHkgc3RhdGVtZW50LgorICAgICAgICBJZiB3ZSBmb3VuZCBiZWZvcmUgYSB0cnkuLi5maW5hbGx5IGJsb2MgYSBwYXJlbnQgd2hpY2ggaXRzIHR5cGUgaXMKKyAgICAgICAgaW4gYnJlYWtlcl9jbGFzc2VzLCB3ZSBza2lwIHRoZSB3aG9sZSBjaGVjay4iIiIKKyAgICAgICAgIyBpZiBzZWxmLl90cnlmaW5hbGx5cyBpcyBlbXB0eSwgd2UncmUgbm90IGFuIGluIHRyeS4uLmZpbmFsbHkgYmxvY2sKKyAgICAgICAgaWYgbm90IHNlbGYuX3RyeWZpbmFsbHlzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgdGhlIG5vZGUgY291bGQgYmUgYSBncmFuZC1ncmFuZC4uLi1jaGlsZHJlbiBvZiB0aGUgdHJ5Li4uZmluYWxseQorICAgICAgICBfcGFyZW50ID0gbm9kZS5wYXJlbnQKKyAgICAgICAgX25vZGUgPSBub2RlCisgICAgICAgIHdoaWxlIF9wYXJlbnQgYW5kIG5vdCBpc2luc3RhbmNlKF9wYXJlbnQsIGJyZWFrZXJfY2xhc3Nlcyk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKF9wYXJlbnQsICJmaW5hbGJvZHkiKSBhbmQgX25vZGUgaW4gX3BhcmVudC5maW5hbGJvZHk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibG9zdC1leGNlcHRpb24iLCBub2RlPW5vZGUsIGFyZ3M9bm9kZV9uYW1lKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgX25vZGUgPSBfcGFyZW50CisgICAgICAgICAgICBfcGFyZW50ID0gX25vZGUucGFyZW50CisKKyAgICBkZWYgX2NoZWNrX3JldmVyc2VkKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayB0aGF0IHRoZSBhcmd1bWVudCB0byBgcmV2ZXJzZWRgIGlzIGEgc2VxdWVuY2UiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXJndW1lbnQgPSB1dGlscy5zYWZlX2luZmVyKHV0aWxzLmdldF9hcmd1bWVudF9mcm9tX2NhbGwobm9kZSwgcG9zaXRpb249MCkpCisgICAgICAgIGV4Y2VwdCB1dGlscy5Ob1N1Y2hBcmd1bWVudEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYXJndW1lbnQgaXMgYXN0cm9pZC5VbmluZmVyYWJsZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGFyZ3VtZW50IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBOb3RoaW5nIHdhcyBpbmZlcnJlZC4KKyAgICAgICAgICAgICAgICAjIFRyeSB0byBzZWUgaWYgd2UgaGF2ZSBpdGVyKCkuCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmFyZ3NbMF0sIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBuZXh0KG5vZGUuYXJnc1swXS5mdW5jLmluZmVyKCkpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLCAibmFtZSIsIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgKSA9PSAiaXRlciIgYW5kIHV0aWxzLmlzX2J1aWx0aW5fb2JqZWN0KGZ1bmMpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYmFkLXJldmVyc2VkLXNlcXVlbmNlIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZ3VtZW50LCAoYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlR1cGxlKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJndW1lbnQsIGFzdHJvaWQuSW5zdGFuY2UpOgorICAgICAgICAgICAgICAgIGlmIGFueSgKKyAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IubmFtZSA9PSAiZGljdCIgYW5kIHV0aWxzLmlzX2J1aWx0aW5fb2JqZWN0KGFuY2VzdG9yKQorICAgICAgICAgICAgICAgICAgICBmb3IgYW5jZXN0b3IgaW4gaXRlcnRvb2xzLmNoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3VtZW50Ll9wcm94aWVkLCksIGFyZ3VtZW50Ll9wcm94aWVkLmFuY2VzdG9ycygpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAjIE1hcHBpbmdzIGFyZW4ndCBhY2NlcHRlZCBieSByZXZlcnNlZCgpLCB1bmxlc3MKKyAgICAgICAgICAgICAgICAgICAgIyB0aGV5IHByb3ZpZGUgZXhwbGljaXRseSBhIF9fcmV2ZXJzZWRfXyBtZXRob2QuCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LmxvY2Fsc1tSRVZFUlNFRF9QUk9UT0NPTF9NRVRIT0RdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhZC1yZXZlcnNlZC1zZXF1ZW5jZSIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYXJndW1lbnQsICJnZXRhdHRyIik6CisgICAgICAgICAgICAgICAgIyBldmVyeXRoaW5nIGVsc2UgaXMgbm90IGEgcHJvcGVyIHNlcXVlbmNlIGZvciByZXZlcnNlZCgpCisgICAgICAgICAgICAgICAgZm9yIG1ldGhvZHMgaW4gUkVWRVJTRURfTUVUSE9EUzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIG1ldGggaW4gbWV0aG9kczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC5nZXRhdHRyKG1ldGgpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhZC1yZXZlcnNlZC1zZXF1ZW5jZSIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYmFkLXJldmVyc2VkLXNlcXVlbmNlIiwgbm9kZT1ub2RlKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJjb25mdXNpbmctd2l0aC1zdGF0ZW1lbnQiKQorICAgIGRlZiB2aXNpdF93aXRoKHNlbGYsIG5vZGUpOgorICAgICAgICAjIGEgIndpdGgiIHN0YXRlbWVudCB3aXRoIG11bHRpcGxlIG1hbmFnZXJzIGNvcnJlc3BvbmRzCisgICAgICAgICMgdG8gb25lIEFTVCAiV2l0aCIgbm9kZSB3aXRoIG11bHRpcGxlIGl0ZW1zCisgICAgICAgIHBhaXJzID0gbm9kZS5pdGVtcworICAgICAgICBpZiBwYWlyczoKKyAgICAgICAgICAgIGZvciBwcmV2X3BhaXIsIHBhaXIgaW4gemlwKHBhaXJzLCBwYWlyc1sxOl0pOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocHJldl9wYWlyWzFdLCBhc3Ryb2lkLkFzc2lnbk5hbWUpIGFuZCAoCisgICAgICAgICAgICAgICAgICAgIHBhaXJbMV0gaXMgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UocGFpclswXSwgYXN0cm9pZC5DYWxsKQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgZW1pdCBhIG1lc3NhZ2UgaWYgdGhlIHNlY29uZCBpcyBhIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgIyB0aGVyZSdzIG5vIHdheSB0aGF0IGNhbiBiZSBtaXN0YWtlbiBmb3IgYSBuYW1lIGFzc2lnbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICMgSWYgdGhlIGxpbmUgbnVtYmVyIGRvZXNuJ3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSBhc3N1bWUgaXQncyBhIG5lc3RlZCAid2l0aCIuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImNvbmZ1c2luZy13aXRoLXN0YXRlbWVudCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfc2VsZl9hc3NpZ25pbmdfdmFyaWFibGUoc2VsZiwgbm9kZSk6CisgICAgICAgICMgRGV0ZWN0IGFzc2lnbmluZyB0byB0aGUgc2FtZSB2YXJpYWJsZS4KKworICAgICAgICBzY29wZSA9IG5vZGUuc2NvcGUoKQorICAgICAgICBzY29wZV9sb2NhbHMgPSBzY29wZS5sb2NhbHMKKworICAgICAgICByaHNfbmFtZXMgPSBbXQorICAgICAgICB0YXJnZXRzID0gbm9kZS50YXJnZXRzCisgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0c1swXSwgYXN0cm9pZC5UdXBsZSk6CisgICAgICAgICAgICBpZiBsZW4odGFyZ2V0cykgIT0gMToKKyAgICAgICAgICAgICAgICAjIEEgY29tcGxleCBhc3NpZ25tZW50LCBzbyBiYWlsIG91dCBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHRhcmdldHMgPSB0YXJnZXRzWzBdLmVsdHMKKyAgICAgICAgICAgIGlmIGxlbih0YXJnZXRzKSA9PSAxOgorICAgICAgICAgICAgICAgICMgVW5wYWNraW5nIGEgdmFyaWFibGUgaW50byB0aGUgc2FtZSBuYW1lLgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIGlmIGxlbih0YXJnZXRzKSAhPSAxOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmhzX25hbWVzID0gW25vZGUudmFsdWVdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3Ryb2lkLlR1cGxlKToKKyAgICAgICAgICAgIHJoc19jb3VudCA9IGxlbihub2RlLnZhbHVlLmVsdHMpCisgICAgICAgICAgICBpZiBsZW4odGFyZ2V0cykgIT0gcmhzX2NvdW50IG9yIHJoc19jb3VudCA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmhzX25hbWVzID0gbm9kZS52YWx1ZS5lbHRzCisKKyAgICAgICAgZm9yIHRhcmdldCwgbGhzX25hbWUgaW4gemlwKHRhcmdldHMsIHJoc19uYW1lcyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShsaHNfbmFtZSwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGFyZ2V0LCBhc3Ryb2lkLkFzc2lnbk5hbWUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNjb3BlLCBhc3Ryb2lkLkNsYXNzRGVmKSBhbmQgdGFyZ2V0Lm5hbWUgaW4gc2NvcGVfbG9jYWxzOgorICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgc2NvcGUgaXMgZGlmZmVyZW50IHRoYW4gYSBjbGFzcyBsZXZlbCwgd2hpY2ggaXMgdXN1YWxseQorICAgICAgICAgICAgICAgICMgYSBwYXR0ZXJuIHRvIGV4cG9zZSBtb2R1bGUgbGV2ZWwgYXR0cmlidXRlcyBhcyBjbGFzcyBsZXZlbCBvbmVzLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiB0YXJnZXQubmFtZSA9PSBsaHNfbmFtZS5uYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJzZWxmLWFzc2lnbmluZy12YXJpYWJsZSIsIGFyZ3M9KHRhcmdldC5uYW1lLCksIG5vZGU9dGFyZ2V0CisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19yZWRlY2xhcmVkX2Fzc2lnbl9uYW1lKHNlbGYsIHRhcmdldHMpOgorICAgICAgICBkdW1teV92YXJpYWJsZXNfcmd4ID0gbGludF91dGlscy5nZXRfZ2xvYmFsX29wdGlvbigKKyAgICAgICAgICAgIHNlbGYsICJkdW1teS12YXJpYWJsZXMtcmd4IiwgZGVmYXVsdD1Ob25lCisgICAgICAgICkKKworICAgICAgICBmb3IgdGFyZ2V0IGluIHRhcmdldHM6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0YXJnZXQsIGFzdHJvaWQuVHVwbGUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZvdW5kX25hbWVzID0gW10KKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHRhcmdldC5lbHRzOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgYXN0cm9pZC5UdXBsZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3JlZGVjbGFyZWRfYXNzaWduX25hbWUoW2VsZW1lbnRdKQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlbGVtZW50LCBhc3Ryb2lkLkFzc2lnbk5hbWUpIGFuZCBlbGVtZW50Lm5hbWUgIT0gIl8iOgorICAgICAgICAgICAgICAgICAgICBpZiBkdW1teV92YXJpYWJsZXNfcmd4IGFuZCBkdW1teV92YXJpYWJsZXNfcmd4Lm1hdGNoKGVsZW1lbnQubmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgZm91bmRfbmFtZXMuYXBwZW5kKGVsZW1lbnQubmFtZSkKKworICAgICAgICAgICAgbmFtZXMgPSBjb2xsZWN0aW9ucy5Db3VudGVyKGZvdW5kX25hbWVzKQorICAgICAgICAgICAgZm9yIG5hbWUsIGNvdW50IGluIG5hbWVzLm1vc3RfY29tbW9uKCk6CisgICAgICAgICAgICAgICAgaWYgY291bnQgPiAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVjbGFyZWQtYXNzaWduZWQtbmFtZSIsIGFyZ3M9KG5hbWUsKSwgbm9kZT10YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJzZWxmLWFzc2lnbmluZy12YXJpYWJsZSIsICJyZWRlY2xhcmVkLWFzc2lnbmVkLW5hbWUiKQorICAgIGRlZiB2aXNpdF9hc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3NlbGZfYXNzaWduaW5nX3ZhcmlhYmxlKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlZGVjbGFyZWRfYXNzaWduX25hbWUobm9kZS50YXJnZXRzKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJyZWRlY2xhcmVkLWFzc2lnbmVkLW5hbWUiKQorICAgIGRlZiB2aXNpdF9mb3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3JlZGVjbGFyZWRfYXNzaWduX25hbWUoW25vZGUudGFyZ2V0XSkKKworCitLTk9XTl9OQU1FX1RZUEVTID0geworICAgICJtb2R1bGUiLAorICAgICJjb25zdCIsCisgICAgImNsYXNzIiwKKyAgICAiZnVuY3Rpb24iLAorICAgICJtZXRob2QiLAorICAgICJhdHRyIiwKKyAgICAiYXJndW1lbnQiLAorICAgICJ2YXJpYWJsZSIsCisgICAgImNsYXNzX2F0dHJpYnV0ZSIsCisgICAgImNsYXNzX2NvbnN0IiwKKyAgICAiaW5saW5ldmFyIiwKK30KKworSFVNQU5fUkVBREFCTEVfVFlQRVMgPSB7CisgICAgIm1vZHVsZSI6ICJtb2R1bGUiLAorICAgICJjb25zdCI6ICJjb25zdGFudCIsCisgICAgImNsYXNzIjogImNsYXNzIiwKKyAgICAiZnVuY3Rpb24iOiAiZnVuY3Rpb24iLAorICAgICJtZXRob2QiOiAibWV0aG9kIiwKKyAgICAiYXR0ciI6ICJhdHRyaWJ1dGUiLAorICAgICJhcmd1bWVudCI6ICJhcmd1bWVudCIsCisgICAgInZhcmlhYmxlIjogInZhcmlhYmxlIiwKKyAgICAiY2xhc3NfYXR0cmlidXRlIjogImNsYXNzIGF0dHJpYnV0ZSIsCisgICAgImNsYXNzX2NvbnN0IjogImNsYXNzIGNvbnN0YW50IiwKKyAgICAiaW5saW5ldmFyIjogImlubGluZSBpdGVyYXRpb24iLAorfQorCitERUZBVUxUX05BTUlOR19TVFlMRVMgPSB7CisgICAgIm1vZHVsZSI6ICJzbmFrZV9jYXNlIiwKKyAgICAiY29uc3QiOiAiVVBQRVJfQ0FTRSIsCisgICAgImNsYXNzIjogIlBhc2NhbENhc2UiLAorICAgICJmdW5jdGlvbiI6ICJzbmFrZV9jYXNlIiwKKyAgICAibWV0aG9kIjogInNuYWtlX2Nhc2UiLAorICAgICJhdHRyIjogInNuYWtlX2Nhc2UiLAorICAgICJhcmd1bWVudCI6ICJzbmFrZV9jYXNlIiwKKyAgICAidmFyaWFibGUiOiAic25ha2VfY2FzZSIsCisgICAgImNsYXNzX2F0dHJpYnV0ZSI6ICJhbnkiLAorICAgICJjbGFzc19jb25zdCI6ICJVUFBFUl9DQVNFIiwKKyAgICAiaW5saW5ldmFyIjogImFueSIsCit9CisKKworZGVmIF9jcmVhdGVfbmFtaW5nX29wdGlvbnMoKToKKyAgICBuYW1lX29wdGlvbnMgPSBbXQorICAgIGZvciBuYW1lX3R5cGUgaW4gc29ydGVkKEtOT1dOX05BTUVfVFlQRVMpOgorICAgICAgICBodW1hbl9yZWFkYWJsZV9uYW1lID0gSFVNQU5fUkVBREFCTEVfVFlQRVNbbmFtZV90eXBlXQorICAgICAgICBkZWZhdWx0X3N0eWxlID0gREVGQVVMVF9OQU1JTkdfU1RZTEVTW25hbWVfdHlwZV0KKyAgICAgICAgbmFtZV90eXBlID0gbmFtZV90eXBlLnJlcGxhY2UoIl8iLCAiLSIpCisgICAgICAgIG5hbWVfb3B0aW9ucy5hcHBlbmQoCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgZiJ7bmFtZV90eXBlfS1uYW1pbmctc3R5bGUiLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBkZWZhdWx0X3N0eWxlLAorICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjaG9pY2UiLAorICAgICAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IGxpc3QoTkFNSU5HX1NUWUxFUy5rZXlzKCkpLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8c3R5bGU+IiwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiTmFtaW5nIHN0eWxlIG1hdGNoaW5nIGNvcnJlY3QgJXMgbmFtZXMuIgorICAgICAgICAgICAgICAgICAgICAlIChodW1hbl9yZWFkYWJsZV9uYW1lLCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgICAgICBuYW1lX29wdGlvbnMuYXBwZW5kKAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGYie25hbWVfdHlwZX0tcmd4IiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAicmVnZXhwIiwKKyAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHJlZ2V4cD4iLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCAlcyBuYW1lcy4gT3ZlcnJpZGVzICVzLW5hbWluZy1zdHlsZS4iCisgICAgICAgICAgICAgICAgICAgICUgKGh1bWFuX3JlYWRhYmxlX25hbWUsIG5hbWVfdHlwZSksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgIHJldHVybiB0dXBsZShuYW1lX29wdGlvbnMpCisKKworY2xhc3MgTmFtZUNoZWNrZXIoX0Jhc2ljQ2hlY2tlcik6CisgICAgbXNncyA9IHsKKyAgICAgICAgIkMwMTAzIjogKAorICAgICAgICAgICAgJyVzIG5hbWUgIiVzIiBkb2VzblwndCBjb25mb3JtIHRvICVzJywKKyAgICAgICAgICAgICJpbnZhbGlkLW5hbWUiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgbmFtZSBkb2Vzbid0IGNvbmZvcm0gdG8gbmFtaW5nIHJ1bGVzICIKKyAgICAgICAgICAgICJhc3NvY2lhdGVkIHRvIGl0cyB0eXBlIChjb25zdGFudCwgdmFyaWFibGUsIGNsYXNzLi4uKS4iLAorICAgICAgICApLAorICAgICAgICAiQzAxMDQiOiAoCisgICAgICAgICAgICAnRGlzYWxsb3dlZCBuYW1lICIlcyInLAorICAgICAgICAgICAgImRpc2FsbG93ZWQtbmFtZSIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBuYW1lIG1hdGNoZXMgYmFkLW5hbWVzIG9yIGJhZC1uYW1lcy1yZ3hzLSAodW5hdXRob3JpemVkIG5hbWVzKS4iLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJvbGRfbmFtZXMiOiBbCisgICAgICAgICAgICAgICAgICAgICgiQzAxMDIiLCAiYmxhY2tsaXN0ZWQtbmFtZSIpLAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICJDMDE0NCI6ICgKKyAgICAgICAgICAgICclcyBuYW1lICIlcyIgY29udGFpbnMgYSBub24tQVNDSUkgdW5pY29kZSBjaGFyYWN0ZXInLAorICAgICAgICAgICAgIm5vbi1hc2NpaS1uYW1lIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIG5hbWUgY29udGFpbnMgYXQgbGVhc3Qgb25lIG5vbi1BU0NJSSB1bmljb2RlIGNoYXJhY3Rlci4iLAorICAgICAgICApLAorICAgICAgICAiVzAxMTEiOiAoCisgICAgICAgICAgICAiTmFtZSAlcyB3aWxsIGJlY29tZSBhIGtleXdvcmQgaW4gUHl0aG9uICVzIiwKKyAgICAgICAgICAgICJhc3NpZ24tdG8tbmV3LWtleXdvcmQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhc3NpZ25tZW50IHdpbGwgYmVjb21lIGludmFsaWQgaW4gZnV0dXJlICIKKyAgICAgICAgICAgICJQeXRob24gcmVsZWFzZSBkdWUgdG8gaW50cm9kdWNpbmcgbmV3IGtleXdvcmQuIiwKKyAgICAgICAgKSwKKyAgICB9CisKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAiZ29vZC1uYW1lcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoImkiLCAiaiIsICJrIiwgImV4IiwgIlJ1biIsICJfIiksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bmFtZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJHb29kIHZhcmlhYmxlIG5hbWVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgYWNjZXB0ZWQsIgorICAgICAgICAgICAgICAgICIgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJnb29kLW5hbWVzLXJneHMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAgICAgInR5cGUiOiAicmVnZXhwX2NzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiR29vZCB2YXJpYWJsZSBuYW1lcyByZWdleGVzLCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gSWYgbmFtZXMgbWF0Y2ggYW55IHJlZ2V4LCIKKyAgICAgICAgICAgICAgICAiIHRoZXkgd2lsbCBhbHdheXMgYmUgYWNjZXB0ZWQiLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImJhZC1uYW1lcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoImZvbyIsICJiYXIiLCAiYmF6IiwgInRvdG8iLCAidHV0dSIsICJ0YXRhIiksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bmFtZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJCYWQgdmFyaWFibGUgbmFtZXMgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSByZWZ1c2VkLCAiCisgICAgICAgICAgICAgICAgInNlcGFyYXRlZCBieSBhIGNvbW1hLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiYmFkLW5hbWVzLXJneHMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAgICAgInR5cGUiOiAicmVnZXhwX2NzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiQmFkIHZhcmlhYmxlIG5hbWVzIHJlZ2V4ZXMsIHNlcGFyYXRlZCBieSBhIGNvbW1hLiBJZiBuYW1lcyBtYXRjaCBhbnkgcmVnZXgsIgorICAgICAgICAgICAgICAgICIgdGhleSB3aWxsIGFsd2F5cyBiZSByZWZ1c2VkIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJuYW1lLWdyb3VwIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgpLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG5hbWUxOm5hbWUyPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICJDb2xvbi1kZWxpbWl0ZWQgc2V0cyBvZiBuYW1lcyB0aGF0IGRldGVybWluZSBlYWNoIgorICAgICAgICAgICAgICAgICAgICAiIG90aGVyJ3MgbmFtaW5nIHN0eWxlIHdoZW4gdGhlIG5hbWUgcmVnZXhlcyIKKyAgICAgICAgICAgICAgICAgICAgIiBhbGxvdyBzZXZlcmFsIHN0eWxlcy4iCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJpbmNsdWRlLW5hbWluZy1oaW50IiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IEZhbHNlLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiSW5jbHVkZSBhIGhpbnQgZm9yIHRoZSBjb3JyZWN0IG5hbWluZyBmb3JtYXQgd2l0aCBpbnZhbGlkLW5hbWUuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJwcm9wZXJ0eS1jbGFzc2VzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgiYWJjLmFic3RyYWN0cHJvcGVydHkiLCksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8ZGVjb3JhdG9yIG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBkZWNvcmF0b3JzIHRoYXQgcHJvZHVjZSBwcm9wZXJ0aWVzLCBzdWNoIGFzICIKKyAgICAgICAgICAgICAgICAiYWJjLmFic3RyYWN0cHJvcGVydHkuIEFkZCB0byB0aGlzIGxpc3QgdG8gcmVnaXN0ZXIgIgorICAgICAgICAgICAgICAgICJvdGhlciBkZWNvcmF0b3JzIHRoYXQgcHJvZHVjZSB2YWxpZCBwcm9wZXJ0aWVzLiAiCisgICAgICAgICAgICAgICAgIlRoZXNlIGRlY29yYXRvcnMgYXJlIHRha2VuIGluIGNvbnNpZGVyYXRpb24gb25seSBmb3IgaW52YWxpZC1uYW1lLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkgKyBfY3JlYXRlX25hbWluZ19vcHRpb25zKCkKKworICAgIEtFWVdPUkRfT05TRVQgPSB7KDMsIDcpOiB7ImFzeW5jIiwgImF3YWl0In19CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGludGVyKToKKyAgICAgICAgX0Jhc2ljQ2hlY2tlci5fX2luaXRfXyhzZWxmLCBsaW50ZXIpCisgICAgICAgIHNlbGYuX25hbWVfY2F0ZWdvcnkgPSB7fQorICAgICAgICBzZWxmLl9uYW1lX2dyb3VwID0ge30KKyAgICAgICAgc2VsZi5fYmFkX25hbWVzID0ge30KKyAgICAgICAgc2VsZi5fbmFtZV9yZWdleHBzID0ge30KKyAgICAgICAgc2VsZi5fbmFtZV9oaW50cyA9IHt9CisgICAgICAgIHNlbGYuX2dvb2RfbmFtZXNfcmd4c19jb21waWxlZCA9IFtdCisgICAgICAgIHNlbGYuX2JhZF9uYW1lc19yZ3hzX2NvbXBpbGVkID0gW10KKyAgICAgICAgc2VsZi5fbm9uX2FzY2lpX3JneF9jb21waWxlZCA9IHJlLmNvbXBpbGUoIlteXHUwMDAwLVx1MDA3Rl0iKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuc3RhdHMgPSBzZWxmLmxpbnRlci5hZGRfc3RhdHMoCisgICAgICAgICAgICBiYWRuYW1lX21vZHVsZT0wLAorICAgICAgICAgICAgYmFkbmFtZV9jbGFzcz0wLAorICAgICAgICAgICAgYmFkbmFtZV9mdW5jdGlvbj0wLAorICAgICAgICAgICAgYmFkbmFtZV9tZXRob2Q9MCwKKyAgICAgICAgICAgIGJhZG5hbWVfYXR0cj0wLAorICAgICAgICAgICAgYmFkbmFtZV9jb25zdD0wLAorICAgICAgICAgICAgYmFkbmFtZV92YXJpYWJsZT0wLAorICAgICAgICAgICAgYmFkbmFtZV9pbmxpbmV2YXI9MCwKKyAgICAgICAgICAgIGJhZG5hbWVfYXJndW1lbnQ9MCwKKyAgICAgICAgICAgIGJhZG5hbWVfY2xhc3NfYXR0cmlidXRlPTAsCisgICAgICAgICAgICBiYWRuYW1lX2NsYXNzX2NvbnN0PTAsCisgICAgICAgICkKKyAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYuY29uZmlnLm5hbWVfZ3JvdXA6CisgICAgICAgICAgICBmb3IgbmFtZV90eXBlIGluIGdyb3VwLnNwbGl0KCI6Iik6CisgICAgICAgICAgICAgICAgc2VsZi5fbmFtZV9ncm91cFtuYW1lX3R5cGVdID0gZiJncm91cF97Z3JvdXB9IgorCisgICAgICAgIHJlZ2V4cHMsIGhpbnRzID0gc2VsZi5fY3JlYXRlX25hbWluZ19ydWxlcygpCisgICAgICAgIHNlbGYuX25hbWVfcmVnZXhwcyA9IHJlZ2V4cHMKKyAgICAgICAgc2VsZi5fbmFtZV9oaW50cyA9IGhpbnRzCisgICAgICAgIHNlbGYuX2dvb2RfbmFtZXNfcmd4c19jb21waWxlZCA9IFsKKyAgICAgICAgICAgIHJlLmNvbXBpbGUocmd4cCkgZm9yIHJneHAgaW4gc2VsZi5jb25maWcuZ29vZF9uYW1lc19yZ3hzCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5fYmFkX25hbWVzX3JneHNfY29tcGlsZWQgPSBbCisgICAgICAgICAgICByZS5jb21waWxlKHJneHApIGZvciByZ3hwIGluIHNlbGYuY29uZmlnLmJhZF9uYW1lc19yZ3hzCisgICAgICAgIF0KKworICAgIGRlZiBfY3JlYXRlX25hbWluZ19ydWxlcyhzZWxmKToKKyAgICAgICAgcmVnZXhwcyA9IHt9CisgICAgICAgIGhpbnRzID0ge30KKworICAgICAgICBmb3IgbmFtZV90eXBlIGluIEtOT1dOX05BTUVfVFlQRVM6CisgICAgICAgICAgICBuYW1pbmdfc3R5bGVfb3B0aW9uX25hbWUgPSBmIntuYW1lX3R5cGV9X25hbWluZ19zdHlsZSIKKyAgICAgICAgICAgIG5hbWluZ19zdHlsZV9uYW1lID0gZ2V0YXR0cihzZWxmLmNvbmZpZywgbmFtaW5nX3N0eWxlX29wdGlvbl9uYW1lKQorCisgICAgICAgICAgICByZWdleHBzW25hbWVfdHlwZV0gPSBOQU1JTkdfU1RZTEVTW25hbWluZ19zdHlsZV9uYW1lXS5nZXRfcmVnZXgobmFtZV90eXBlKQorCisgICAgICAgICAgICBjdXN0b21fcmVnZXhfc2V0dGluZ19uYW1lID0gZiJ7bmFtZV90eXBlfV9yZ3giCisgICAgICAgICAgICBjdXN0b21fcmVnZXggPSBnZXRhdHRyKHNlbGYuY29uZmlnLCBjdXN0b21fcmVnZXhfc2V0dGluZ19uYW1lLCBOb25lKQorICAgICAgICAgICAgaWYgY3VzdG9tX3JlZ2V4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlZ2V4cHNbbmFtZV90eXBlXSA9IGN1c3RvbV9yZWdleAorCisgICAgICAgICAgICBpZiBjdXN0b21fcmVnZXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaGludHNbbmFtZV90eXBlXSA9ICIlciBwYXR0ZXJuIiAlIGN1c3RvbV9yZWdleC5wYXR0ZXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhpbnRzW25hbWVfdHlwZV0gPSAiJXMgbmFtaW5nIHN0eWxlIiAlIG5hbWluZ19zdHlsZV9uYW1lCisKKyAgICAgICAgcmV0dXJuIHJlZ2V4cHMsIGhpbnRzCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImRpc2FsbG93ZWQtbmFtZSIsICJpbnZhbGlkLW5hbWUiLCAibm9uLWFzY2lpLW5hbWUiKQorICAgIGRlZiB2aXNpdF9tb2R1bGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoIm1vZHVsZSIsIG5vZGUubmFtZS5zcGxpdCgiLiIpWy0xXSwgbm9kZSkKKyAgICAgICAgc2VsZi5fYmFkX25hbWVzID0ge30KKworICAgIGRlZiBsZWF2ZV9tb2R1bGUoc2VsZiwgbm9kZSk6ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgZm9yIGFsbF9ncm91cHMgaW4gc2VsZi5fYmFkX25hbWVzLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgbGVuKGFsbF9ncm91cHMpIDwgMjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZ3JvdXBzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgICAgIG1pbl93YXJuaW5ncyA9IHN5cy5tYXhzaXplCisgICAgICAgICAgICBmb3IgZ3JvdXAgaW4gYWxsX2dyb3Vwcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBncm91cHNbbGVuKGdyb3VwKV0uYXBwZW5kKGdyb3VwKQorICAgICAgICAgICAgICAgIG1pbl93YXJuaW5ncyA9IG1pbihsZW4oZ3JvdXApLCBtaW5fd2FybmluZ3MpCisgICAgICAgICAgICBpZiBsZW4oZ3JvdXBzW21pbl93YXJuaW5nc10pID4gMToKKyAgICAgICAgICAgICAgICBieV9saW5lID0gc29ydGVkKAorICAgICAgICAgICAgICAgICAgICBncm91cHNbbWluX3dhcm5pbmdzXSwKKyAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSBncm91cDogbWluKHdhcm5pbmdbMF0ubGluZW5vIGZvciB3YXJuaW5nIGluIGdyb3VwKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgd2FybmluZ3MgPSBpdGVydG9vbHMuY2hhaW4oKmJ5X2xpbmVbMTpdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IGdyb3Vwc1ttaW5fd2FybmluZ3NdWzBdCisgICAgICAgICAgICBmb3IgYXJncyBpbiB3YXJuaW5nczoKKyAgICAgICAgICAgICAgICBzZWxmLl9yYWlzZV9uYW1lX3dhcm5pbmcoKmFyZ3MpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJkaXNhbGxvd2VkLW5hbWUiLCAiaW52YWxpZC1uYW1lIiwgImFzc2lnbi10by1uZXcta2V5d29yZCIsICJub24tYXNjaWktbmFtZSIKKyAgICApCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19hc3NpZ25fdG9fbmV3X2tleXdvcmRfdmlvbGF0aW9uKG5vZGUubmFtZSwgbm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgiY2xhc3MiLCBub2RlLm5hbWUsIG5vZGUpCisgICAgICAgIGZvciBhdHRyLCBhbm9kZXMgaW4gbm9kZS5pbnN0YW5jZV9hdHRycy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IGFueShub2RlLmluc3RhbmNlX2F0dHJfYW5jZXN0b3JzKGF0dHIpKToKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19uYW1lKCJhdHRyIiwgYXR0ciwgYW5vZGVzWzBdKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKAorICAgICAgICAiZGlzYWxsb3dlZC1uYW1lIiwgImludmFsaWQtbmFtZSIsICJhc3NpZ24tdG8tbmV3LWtleXdvcmQiLCAibm9uLWFzY2lpLW5hbWUiCisgICAgKQorICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgIyBEbyBub3QgZW1pdCBhbnkgd2FybmluZ3MgaWYgdGhlIG1ldGhvZCBpcyBqdXN0IGFuIGltcGxlbWVudGF0aW9uCisgICAgICAgICMgb2YgYSBiYXNlIGNsYXNzIG1ldGhvZC4KKyAgICAgICAgc2VsZi5fY2hlY2tfYXNzaWduX3RvX25ld19rZXl3b3JkX3Zpb2xhdGlvbihub2RlLm5hbWUsIG5vZGUpCisgICAgICAgIGNvbmZpZGVuY2UgPSBpbnRlcmZhY2VzLkhJR0gKKyAgICAgICAgaWYgbm9kZS5pc19tZXRob2QoKToKKyAgICAgICAgICAgIGlmIHV0aWxzLm92ZXJyaWRlc19hX21ldGhvZChub2RlLnBhcmVudC5mcmFtZSgpLCBub2RlLm5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgY29uZmlkZW5jZSA9ICgKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLklORkVSRU5DRQorICAgICAgICAgICAgICAgIGlmIHV0aWxzLmhhc19rbm93bl9iYXNlcyhub2RlLnBhcmVudC5mcmFtZSgpKQorICAgICAgICAgICAgICAgIGVsc2UgaW50ZXJmYWNlcy5JTkZFUkVOQ0VfRkFJTFVSRQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoCisgICAgICAgICAgICBfZGV0ZXJtaW5lX2Z1bmN0aW9uX25hbWVfdHlwZShub2RlLCBjb25maWc9c2VsZi5jb25maWcpLAorICAgICAgICAgICAgbm9kZS5uYW1lLAorICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgICAgIGNvbmZpZGVuY2UsCisgICAgICAgICkKKyAgICAgICAgIyBDaGVjayBhcmd1bWVudCBuYW1lcworICAgICAgICBhcmdzID0gbm9kZS5hcmdzLmFyZ3MKKyAgICAgICAgaWYgYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3JlY3Vyc2l2ZV9jaGVja19uYW1lcyhhcmdzLCBub2RlKQorCisgICAgdmlzaXRfYXN5bmNmdW5jdGlvbmRlZiA9IHZpc2l0X2Z1bmN0aW9uZGVmCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImRpc2FsbG93ZWQtbmFtZSIsICJpbnZhbGlkLW5hbWUiLCAibm9uLWFzY2lpLW5hbWUiKQorICAgIGRlZiB2aXNpdF9nbG9iYWwoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBuYW1lIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBzZWxmLl9jaGVja19uYW1lKCJjb25zdCIsIG5hbWUsIG5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJkaXNhbGxvd2VkLW5hbWUiLCAiaW52YWxpZC1uYW1lIiwgImFzc2lnbi10by1uZXcta2V5d29yZCIsICJub24tYXNjaWktbmFtZSIKKyAgICApCisgICAgZGVmIHZpc2l0X2Fzc2lnbm5hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIG1vZHVsZSBsZXZlbCBhc3NpZ25lZCBuYW1lcyIiIgorICAgICAgICBzZWxmLl9jaGVja19hc3NpZ25fdG9fbmV3X2tleXdvcmRfdmlvbGF0aW9uKG5vZGUubmFtZSwgbm9kZSkKKyAgICAgICAgZnJhbWUgPSBub2RlLmZyYW1lKCkKKyAgICAgICAgYXNzaWduX3R5cGUgPSBub2RlLmFzc2lnbl90eXBlKCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhc3NpZ25fdHlwZSwgYXN0cm9pZC5Db21wcmVoZW5zaW9uKToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoImlubGluZXZhciIsIG5vZGUubmFtZSwgbm9kZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFzc2lnbl90eXBlLCBhc3Ryb2lkLkFzc2lnbik6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh1dGlscy5zYWZlX2luZmVyKGFzc2lnbl90eXBlLnZhbHVlKSwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoImNsYXNzIiwgbm9kZS5uYW1lLCBub2RlKQorICAgICAgICAgICAgICAgICMgRG9uJ3QgZW1pdCBpZiB0aGUgbmFtZSByZWRlZmluZXMgYW4gaW1wb3J0CisgICAgICAgICAgICAgICAgIyBpbiBhbiBJbXBvcnRFcnJvciBleGNlcHQgaGFuZGxlci4KKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBfcmVkZWZpbmVzX2ltcG9ydChub2RlKSBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2FmZV9pbmZlcihhc3NpZ25fdHlwZS52YWx1ZSksIGFzdHJvaWQuQ29uc3QKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19uYW1lKCJjb25zdCIsIG5vZGUubmFtZSwgbm9kZSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBhc3NpZ25fdHlwZSwgYXN0cm9pZC5Bbm5Bc3NpZ24KKyAgICAgICAgICAgICkgYW5kIHV0aWxzLmlzX2Fzc2lnbl9uYW1lX2Fubm90YXRlZF93aXRoKG5vZGUsICJGaW5hbCIpOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX25hbWUoImNvbnN0Iiwgbm9kZS5uYW1lLCBub2RlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZnJhbWUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgIyBnbG9iYWwgaW50cm9kdWNlZCB2YXJpYWJsZSBhcmVuJ3QgaW4gdGhlIGZ1bmN0aW9uIGxvY2FscworICAgICAgICAgICAgaWYgbm9kZS5uYW1lIGluIGZyYW1lIGFuZCBub2RlLm5hbWUgbm90IGluIGZyYW1lLmFyZ25hbWVzKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IF9yZWRlZmluZXNfaW1wb3J0KG5vZGUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19uYW1lKCJ2YXJpYWJsZSIsIG5vZGUubmFtZSwgbm9kZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkNsYXNzRGVmKToKKyAgICAgICAgICAgIGlmIG5vdCBsaXN0KGZyYW1lLmxvY2FsX2F0dHJfYW5jZXN0b3JzKG5vZGUubmFtZSkpOgorICAgICAgICAgICAgICAgIGZvciBhbmNlc3RvciBpbiBmcmFtZS5hbmNlc3RvcnMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IubmFtZSA9PSAiRW51bSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbmNlc3Rvci5yb290KCkubmFtZSA9PSAiZW51bSIKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yIHV0aWxzLmlzX2Fzc2lnbl9uYW1lX2Fubm90YXRlZF93aXRoKG5vZGUsICJGaW5hbCIpCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19uYW1lKCJjbGFzc19jb25zdCIsIG5vZGUubmFtZSwgbm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgiY2xhc3NfYXR0cmlidXRlIiwgbm9kZS5uYW1lLCBub2RlKQorCisgICAgZGVmIF9yZWN1cnNpdmVfY2hlY2tfbmFtZXMoc2VsZiwgYXJncywgbm9kZSk6CisgICAgICAgICIiImNoZWNrIG5hbWVzIGluIGEgcG9zc2libHkgcmVjdXJzaXZlIGxpc3QgPGFyZz4iIiIKKyAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGFzdHJvaWQuQXNzaWduTmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfbmFtZSgiYXJndW1lbnQiLCBhcmcubmFtZSwgbm9kZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVjdXJzaXZlX2NoZWNrX25hbWVzKGFyZy5lbHRzLCBub2RlKQorCisgICAgZGVmIF9maW5kX25hbWVfZ3JvdXAoc2VsZiwgbm9kZV90eXBlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWVfZ3JvdXAuZ2V0KG5vZGVfdHlwZSwgbm9kZV90eXBlKQorCisgICAgZGVmIF9yYWlzZV9uYW1lX3dhcm5pbmcoCisgICAgICAgIHNlbGYsIG5vZGUsIG5vZGVfdHlwZSwgbmFtZSwgY29uZmlkZW5jZSwgd2FybmluZz0iaW52YWxpZC1uYW1lIgorICAgICk6CisgICAgICAgIHR5cGVfbGFiZWwgPSBIVU1BTl9SRUFEQUJMRV9UWVBFU1tub2RlX3R5cGVdCisgICAgICAgIGhpbnQgPSBzZWxmLl9uYW1lX2hpbnRzW25vZGVfdHlwZV0KKyAgICAgICAgaWYgc2VsZi5jb25maWcuaW5jbHVkZV9uYW1pbmdfaGludDoKKyAgICAgICAgICAgIGhpbnQgKz0gIiAoJXIgcGF0dGVybikiICUgc2VsZi5fbmFtZV9yZWdleHBzW25vZGVfdHlwZV0ucGF0dGVybgorICAgICAgICBhcmdzID0gKAorICAgICAgICAgICAgKHR5cGVfbGFiZWwuY2FwaXRhbGl6ZSgpLCBuYW1lLCBoaW50KQorICAgICAgICAgICAgaWYgd2FybmluZyA9PSAiaW52YWxpZC1uYW1lIgorICAgICAgICAgICAgZWxzZSAodHlwZV9sYWJlbC5jYXBpdGFsaXplKCksIG5hbWUpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKHdhcm5pbmcsIG5vZGU9bm9kZSwgYXJncz1hcmdzLCBjb25maWRlbmNlPWNvbmZpZGVuY2UpCisgICAgICAgIHNlbGYuc3RhdHNbImJhZG5hbWVfIiArIG5vZGVfdHlwZV0gKz0gMQorCisgICAgZGVmIF9uYW1lX2FsbG93ZWRfYnlfcmVnZXgoc2VsZiwgbmFtZTogc3RyKSAtPiBib29sOgorICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLmNvbmZpZy5nb29kX25hbWVzIG9yIGFueSgKKyAgICAgICAgICAgIHBhdHRlcm4ubWF0Y2gobmFtZSkgZm9yIHBhdHRlcm4gaW4gc2VsZi5fZ29vZF9uYW1lc19yZ3hzX2NvbXBpbGVkCisgICAgICAgICkKKworICAgIGRlZiBfbmFtZV9kaXNhbGxvd2VkX2J5X3JlZ2V4KHNlbGYsIG5hbWU6IHN0cikgLT4gYm9vbDoKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5jb25maWcuYmFkX25hbWVzIG9yIGFueSgKKyAgICAgICAgICAgIHBhdHRlcm4ubWF0Y2gobmFtZSkgZm9yIHBhdHRlcm4gaW4gc2VsZi5fYmFkX25hbWVzX3JneHNfY29tcGlsZWQKKyAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19uYW1lKHNlbGYsIG5vZGVfdHlwZSwgbmFtZSwgbm9kZSwgY29uZmlkZW5jZT1pbnRlcmZhY2VzLkhJR0gpOgorICAgICAgICAiIiJjaGVjayBmb3IgYSBuYW1lIHVzaW5nIHRoZSB0eXBlJ3MgcmVnZXhwIiIiCisgICAgICAgIG5vbl9hc2NpaV9tYXRjaCA9IHNlbGYuX25vbl9hc2NpaV9yZ3hfY29tcGlsZWQubWF0Y2gobmFtZSkKKyAgICAgICAgaWYgbm9uX2FzY2lpX21hdGNoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fcmFpc2VfbmFtZV93YXJuaW5nKAorICAgICAgICAgICAgICAgIG5vZGUsIG5vZGVfdHlwZSwgbmFtZSwgY29uZmlkZW5jZSwgd2FybmluZz0ibm9uLWFzY2lpLW5hbWUiCisgICAgICAgICAgICApCisKKyAgICAgICAgZGVmIF9zaG91bGRfZXhlbXB0X2Zyb21faW52YWxpZF9uYW1lKG5vZGUpOgorICAgICAgICAgICAgaWYgbm9kZV90eXBlID09ICJ2YXJpYWJsZSI6CisgICAgICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKG5vZGUpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLl9uYW1lX2FsbG93ZWRfYnlfcmVnZXgobmFtZT1uYW1lKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9uYW1lX2Rpc2FsbG93ZWRfYnlfcmVnZXgobmFtZT1uYW1lKToKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbImJhZG5hbWVfIiArIG5vZGVfdHlwZV0gKz0gMQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZGlzYWxsb3dlZC1uYW1lIiwgbm9kZT1ub2RlLCBhcmdzPW5hbWUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmVnZXhwID0gc2VsZi5fbmFtZV9yZWdleHBzW25vZGVfdHlwZV0KKyAgICAgICAgbWF0Y2ggPSByZWdleHAubWF0Y2gobmFtZSkKKworICAgICAgICBpZiBfaXNfbXVsdGlfbmFtaW5nX21hdGNoKG1hdGNoLCBub2RlX3R5cGUsIGNvbmZpZGVuY2UpOgorICAgICAgICAgICAgbmFtZV9ncm91cCA9IHNlbGYuX2ZpbmRfbmFtZV9ncm91cChub2RlX3R5cGUpCisgICAgICAgICAgICBiYWRfbmFtZV9ncm91cCA9IHNlbGYuX2JhZF9uYW1lcy5zZXRkZWZhdWx0KG5hbWVfZ3JvdXAsIHt9KQorICAgICAgICAgICAgd2FybmluZ3MgPSBiYWRfbmFtZV9ncm91cC5zZXRkZWZhdWx0KG1hdGNoLmxhc3Rncm91cCwgW10pCisgICAgICAgICAgICB3YXJuaW5ncy5hcHBlbmQoKG5vZGUsIG5vZGVfdHlwZSwgbmFtZSwgY29uZmlkZW5jZSkpCisKKyAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZSBhbmQgbm90IF9zaG91bGRfZXhlbXB0X2Zyb21faW52YWxpZF9uYW1lKG5vZGUpOgorICAgICAgICAgICAgc2VsZi5fcmFpc2VfbmFtZV93YXJuaW5nKG5vZGUsIG5vZGVfdHlwZSwgbmFtZSwgY29uZmlkZW5jZSkKKworICAgIGRlZiBfY2hlY2tfYXNzaWduX3RvX25ld19rZXl3b3JkX3Zpb2xhdGlvbihzZWxmLCBuYW1lLCBub2RlKToKKyAgICAgICAga2V5d29yZF9maXJzdF92ZXJzaW9uID0gc2VsZi5fbmFtZV9iZWNhbWVfa2V5d29yZF9pbl92ZXJzaW9uKAorICAgICAgICAgICAgbmFtZSwgc2VsZi5LRVlXT1JEX09OU0VUCisgICAgICAgICkKKyAgICAgICAgaWYga2V5d29yZF9maXJzdF92ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiYXNzaWduLXRvLW5ldy1rZXl3b3JkIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0obmFtZSwga2V5d29yZF9maXJzdF92ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPWludGVyZmFjZXMuSElHSCwKKyAgICAgICAgICAgICkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX25hbWVfYmVjYW1lX2tleXdvcmRfaW5fdmVyc2lvbihuYW1lLCBydWxlcyk6CisgICAgICAgIGZvciB2ZXJzaW9uLCBrZXl3b3JkcyBpbiBydWxlcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBrZXl3b3JkcyBhbmQgc3lzLnZlcnNpb25faW5mbyA8IHZlcnNpb246CisgICAgICAgICAgICAgICAgcmV0dXJuICIuIi5qb2luKHN0cih2KSBmb3IgdiBpbiB2ZXJzaW9uKQorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIERvY1N0cmluZ0NoZWNrZXIoX0Jhc2ljQ2hlY2tlcik6CisgICAgbXNncyA9IHsKKyAgICAgICAgIkMwMTEyIjogKAorICAgICAgICAgICAgIkVtcHR5ICVzIGRvY3N0cmluZyIsCisgICAgICAgICAgICAiZW1wdHktZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBtb2R1bGUsIGZ1bmN0aW9uLCBjbGFzcyBvciBtZXRob2QgaGFzIGFuIGVtcHR5ICIKKyAgICAgICAgICAgICJkb2NzdHJpbmcgKGl0IHdvdWxkIGJlIHRvbyBlYXN5IDspLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcwMTMyIiwgIm9sZC1lbXB0eS1kb2NzdHJpbmciKV19LAorICAgICAgICApLAorICAgICAgICAiQzAxMTQiOiAoCisgICAgICAgICAgICAiTWlzc2luZyBtb2R1bGUgZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICJtaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmciLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIG1vZHVsZSBoYXMgbm8gZG9jc3RyaW5nLiIKKyAgICAgICAgICAgICJFbXB0eSBtb2R1bGVzIGRvIG5vdCByZXF1aXJlIGEgZG9jc3RyaW5nLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIkMwMTExIiwgIm1pc3NpbmctZG9jc3RyaW5nIildfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkMwMTE1IjogKAorICAgICAgICAgICAgIk1pc3NpbmcgY2xhc3MgZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICJtaXNzaW5nLWNsYXNzLWRvY3N0cmluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgY2xhc3MgaGFzIG5vIGRvY3N0cmluZy4iCisgICAgICAgICAgICAiRXZlbiBhbiBlbXB0eSBjbGFzcyBtdXN0IGhhdmUgYSBkb2NzdHJpbmcuIiwKKyAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiQzAxMTEiLCAibWlzc2luZy1kb2NzdHJpbmciKV19LAorICAgICAgICApLAorICAgICAgICAiQzAxMTYiOiAoCisgICAgICAgICAgICAiTWlzc2luZyBmdW5jdGlvbiBvciBtZXRob2QgZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICJtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGhhcyBubyBkb2NzdHJpbmcuIgorICAgICAgICAgICAgIlNvbWUgc3BlY2lhbCBtZXRob2RzIGxpa2UgX19pbml0X18gZG8gbm90IHJlcXVpcmUgYSAiCisgICAgICAgICAgICAiZG9jc3RyaW5nLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIkMwMTExIiwgIm1pc3NpbmctZG9jc3RyaW5nIildfSwKKyAgICAgICAgKSwKKyAgICB9CisgICAgb3B0aW9ucyA9ICgKKyAgICAgICAgKAorICAgICAgICAgICAgIm5vLWRvY3N0cmluZy1yZ3giLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogTk9fUkVRVUlSRURfRE9DX1JHWCwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJyZWdleHAiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxyZWdleHA+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvciBjbGFzcyBuYW1lcyB0aGF0IGRvIG5vdCByZXF1aXJlIGEgIgorICAgICAgICAgICAgICAgICJkb2NzdHJpbmcuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJkb2NzdHJpbmctbWluLWxlbmd0aCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAtMSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgIk1pbmltdW0gbGluZSBsZW5ndGggZm9yIGZ1bmN0aW9ucy9jbGFzc2VzIHRoYXQiCisgICAgICAgICAgICAgICAgICAgICIgcmVxdWlyZSBkb2NzdHJpbmdzLCBzaG9ydGVyIG9uZXMgYXJlIGV4ZW1wdC4iCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuc3RhdHMgPSBzZWxmLmxpbnRlci5hZGRfc3RhdHMoCisgICAgICAgICAgICB1bmRvY3VtZW50ZWRfbW9kdWxlPTAsCisgICAgICAgICAgICB1bmRvY3VtZW50ZWRfZnVuY3Rpb249MCwKKyAgICAgICAgICAgIHVuZG9jdW1lbnRlZF9tZXRob2Q9MCwKKyAgICAgICAgICAgIHVuZG9jdW1lbnRlZF9jbGFzcz0wLAorICAgICAgICApCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoIm1pc3NpbmctZG9jc3RyaW5nIiwgImVtcHR5LWRvY3N0cmluZyIpCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZG9jc3RyaW5nKCJtb2R1bGUiLCBub2RlKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJtaXNzaW5nLWRvY3N0cmluZyIsICJlbXB0eS1kb2NzdHJpbmciKQorICAgIGRlZiB2aXNpdF9jbGFzc2RlZihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgc2VsZi5jb25maWcubm9fZG9jc3RyaW5nX3JneC5tYXRjaChub2RlLm5hbWUpIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9jaGVja19kb2NzdHJpbmcoImNsYXNzIiwgbm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygibWlzc2luZy1kb2NzdHJpbmciLCAiZW1wdHktZG9jc3RyaW5nIikKKyAgICBkZWYgdmlzaXRfZnVuY3Rpb25kZWYoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIHNlbGYuY29uZmlnLm5vX2RvY3N0cmluZ19yZ3gubWF0Y2gobm9kZS5uYW1lKSBpcyBOb25lOgorICAgICAgICAgICAgZnR5cGUgPSAibWV0aG9kIiBpZiBub2RlLmlzX21ldGhvZCgpIGVsc2UgImZ1bmN0aW9uIgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzX3Byb3BlcnR5X3NldHRlcihub2RlKQorICAgICAgICAgICAgICAgIG9yIGlzX3Byb3BlcnR5X2RlbGV0ZXIobm9kZSkKKyAgICAgICAgICAgICAgICBvciBpc19vdmVybG9hZF9zdHViKG5vZGUpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LmZyYW1lKCksIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgICAgIG92ZXJyaWRkZW4gPSBGYWxzZQorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAoCisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMuSU5GRVJFTkNFCisgICAgICAgICAgICAgICAgICAgIGlmIHV0aWxzLmhhc19rbm93bl9iYXNlcyhub2RlLnBhcmVudC5mcmFtZSgpKQorICAgICAgICAgICAgICAgICAgICBlbHNlIGludGVyZmFjZXMuSU5GRVJFTkNFX0ZBSUxVUkUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBub2RlIGlzIGZyb20gYSBtZXRob2Qgb3ZlcnJpZGRlbiBieSBpdHMgYW5jZXN0b3IKKyAgICAgICAgICAgICAgICBmb3IgYW5jZXN0b3IgaW4gbm9kZS5wYXJlbnQuZnJhbWUoKS5hbmNlc3RvcnMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lIGluIGFuY2VzdG9yIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3Jbbm9kZS5uYW1lXSwgYXN0cm9pZC5GdW5jdGlvbkRlZgorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGRlbiA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfZG9jc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBmdHlwZSwgbm9kZSwgcmVwb3J0X21pc3Npbmc9bm90IG92ZXJyaWRkZW4sIGNvbmZpZGVuY2U9Y29uZmlkZW5jZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudC5mcmFtZSgpLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfZG9jc3RyaW5nKGZ0eXBlLCBub2RlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgIHZpc2l0X2FzeW5jZnVuY3Rpb25kZWYgPSB2aXNpdF9mdW5jdGlvbmRlZgorCisgICAgZGVmIF9jaGVja19kb2NzdHJpbmcoCisgICAgICAgIHNlbGYsIG5vZGVfdHlwZSwgbm9kZSwgcmVwb3J0X21pc3Npbmc9VHJ1ZSwgY29uZmlkZW5jZT1pbnRlcmZhY2VzLkhJR0gKKyAgICApOgorICAgICAgICAiIiJjaGVjayB0aGUgbm9kZSBoYXMgYSBub24gZW1wdHkgZG9jc3RyaW5nIiIiCisgICAgICAgIGRvY3N0cmluZyA9IG5vZGUuZG9jCisgICAgICAgIGlmIGRvY3N0cmluZyBpcyBOb25lOgorICAgICAgICAgICAgZG9jc3RyaW5nID0gX2luZmVyX2R1bmRlcl9kb2NfYXR0cmlidXRlKG5vZGUpCisKKyAgICAgICAgaWYgZG9jc3RyaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBub3QgcmVwb3J0X21pc3Npbmc6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBsaW5lcyA9IHV0aWxzLmdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUpIC0gbm9kZS5saW5lbm8KKworICAgICAgICAgICAgaWYgbm9kZV90eXBlID09ICJtb2R1bGUiIGFuZCBub3QgbGluZXM6CisgICAgICAgICAgICAgICAgIyBJZiB0aGUgbW9kdWxlIGhhcyBubyBib2R5LCB0aGVyZSdzIG5vIHJlYXNvbgorICAgICAgICAgICAgICAgICMgdG8gcmVxdWlyZSBhIGRvY3N0cmluZy4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1heF9saW5lcyA9IHNlbGYuY29uZmlnLmRvY3N0cmluZ19taW5fbGVuZ3RoCisKKyAgICAgICAgICAgIGlmIG5vZGVfdHlwZSAhPSAibW9kdWxlIiBhbmQgbWF4X2xpbmVzID4gLTEgYW5kIGxpbmVzIDwgbWF4X2xpbmVzOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5zdGF0c1sidW5kb2N1bWVudGVkXyIgKyBub2RlX3R5cGVdICs9IDEKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBub2RlLmJvZHkKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmJvZHlbMF0sIGFzdHJvaWQuRXhwcikKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmJvZHlbMF0udmFsdWUsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyBNb3N0IGxpa2VseSBhIHN0cmluZyB3aXRoIGEgZm9ybWF0IGNhbGwuIExldCdzIHNlZS4KKyAgICAgICAgICAgICAgICBmdW5jID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLmJvZHlbMF0udmFsdWUuZnVuYykKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZ1bmMsIGFzdHJvaWQuQm91bmRNZXRob2QpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBmdW5jLmJvdW5kLCBhc3Ryb2lkLkluc3RhbmNlCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgIyBTdHJpbmdzLgorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jLmJvdW5kLm5hbWUgaW4gKCJzdHIiLCAidW5pY29kZSIsICJieXRlcyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub2RlX3R5cGUgPT0gIm1vZHVsZSI6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJtaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmciCisgICAgICAgICAgICBlbGlmIG5vZGVfdHlwZSA9PSAiY2xhc3MiOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAibWlzc2luZy1jbGFzcy1kb2NzdHJpbmciCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1lc3NhZ2UsIG5vZGU9bm9kZSwgY29uZmlkZW5jZT1jb25maWRlbmNlKQorICAgICAgICBlbGlmIG5vdCBkb2NzdHJpbmcuc3RyaXAoKToKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbInVuZG9jdW1lbnRlZF8iICsgbm9kZV90eXBlXSArPSAxCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJlbXB0eS1kb2NzdHJpbmciLCBub2RlPW5vZGUsIGFyZ3M9KG5vZGVfdHlwZSwpLCBjb25maWRlbmNlPWNvbmZpZGVuY2UKKyAgICAgICAgICAgICkKKworCitjbGFzcyBQYXNzQ2hlY2tlcihfQmFzaWNDaGVja2VyKToKKyAgICAiIiJjaGVjayBpZiB0aGUgcGFzcyBzdGF0ZW1lbnQgaXMgcmVhbGx5IG5lY2Vzc2FyeSIiIgorCisgICAgbXNncyA9IHsKKyAgICAgICAgIlcwMTA3IjogKAorICAgICAgICAgICAgIlVubmVjZXNzYXJ5IHBhc3Mgc3RhdGVtZW50IiwKKyAgICAgICAgICAgICJ1bm5lY2Vzc2FyeS1wYXNzIiwKKyAgICAgICAgICAgICdVc2VkIHdoZW4gYSAicGFzcyIgc3RhdGVtZW50IHRoYXQgY2FuIGJlIGF2b2lkZWQgaXMgZW5jb3VudGVyZWQuJywKKyAgICAgICAgKQorICAgIH0KKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidW5uZWNlc3NhcnktcGFzcyIpCisgICAgZGVmIHZpc2l0X3Bhc3Moc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIGxlbihub2RlLnBhcmVudC5jaGlsZF9zZXF1ZW5jZShub2RlKSkgPiAxIG9yICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIChhc3Ryb2lkLkNsYXNzRGVmLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSkKKyAgICAgICAgICAgIGFuZCAobm9kZS5wYXJlbnQuZG9jIGlzIG5vdCBOb25lKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW5uZWNlc3NhcnktcGFzcyIsIG5vZGU9bm9kZSkKKworCitkZWYgX2lzX29uZV9hcmdfcG9zX2NhbGwoY2FsbCk6CisgICAgIiIiSXMgdGhpcyBhIGNhbGwgd2l0aCBleGFjdGx5IDEgYXJndW1lbnQsCisgICAgd2hlcmUgdGhhdCBhcmd1bWVudCBpcyBwb3NpdGlvbmFsPworICAgICIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKGNhbGwsIGFzdHJvaWQuQ2FsbCkgYW5kIGxlbihjYWxsLmFyZ3MpID09IDEgYW5kIG5vdCBjYWxsLmtleXdvcmRzCisKKworZGVmIF9pbmZlcl9kdW5kZXJfZG9jX2F0dHJpYnV0ZShub2RlKToKKyAgICAjIFRyeSB0byBzZWUgaWYgd2UgaGF2ZSBhIGBfX2RvY19fYCBhdHRyaWJ1dGUuCisgICAgdHJ5OgorICAgICAgICBkb2NzdHJpbmcgPSBub2RlWyJfX2RvY19fIl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkb2NzdHJpbmcgPSB1dGlscy5zYWZlX2luZmVyKGRvY3N0cmluZykKKyAgICBpZiBub3QgZG9jc3RyaW5nOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGRvY3N0cmluZywgYXN0cm9pZC5Db25zdCk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIGRvY3N0cmluZy52YWx1ZQorCisKK2NsYXNzIENvbXBhcmlzb25DaGVja2VyKF9CYXNpY0NoZWNrZXIpOgorICAgICIiIkNoZWNrcyBmb3IgY29tcGFyaXNvbnMKKworICAgIC0gc2luZ2xldG9uIGNvbXBhcmlzb246ICdleHByID09IFRydWUnLCAnZXhwciA9PSBGYWxzZScgYW5kICdleHByID09IE5vbmUnCisgICAgLSB5b2RhIGNvbmRpdGlvbjogJ2NvbnN0ICJjb21wIiByaWdodCcgd2hlcmUgY29tcCBjYW4gYmUgJz09JywgJyE9JywgJzwnLAorICAgICAgJzw9JywgJz4nIG9yICc+PScsIGFuZCByaWdodCBjYW4gYmUgYSB2YXJpYWJsZSwgYW4gYXR0cmlidXRlLCBhIG1ldGhvZCBvcgorICAgICAgYSBmdW5jdGlvbgorICAgICIiIgorCisgICAgbXNncyA9IHsKKyAgICAgICAgIkMwMTIxIjogKAorICAgICAgICAgICAgIkNvbXBhcmlzb24gJXMgc2hvdWxkIGJlICVzIiwKKyAgICAgICAgICAgICJzaW5nbGV0b24tY29tcGFyaXNvbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFuIGV4cHJlc3Npb24gaXMgY29tcGFyZWQgdG8gc2luZ2xldG9uICIKKyAgICAgICAgICAgICJ2YWx1ZXMgbGlrZSBUcnVlLCBGYWxzZSBvciBOb25lLiIsCisgICAgICAgICksCisgICAgICAgICJDMDEyMiI6ICgKKyAgICAgICAgICAgICJDb21wYXJpc29uIHNob3VsZCBiZSAlcyIsCisgICAgICAgICAgICAibWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgY29uc3RhbnQgaXMgcGxhY2VkIG9uIHRoZSBsZWZ0IHNpZGUgIgorICAgICAgICAgICAgIm9mIGEgY29tcGFyaXNvbi4gSXQgaXMgdXN1YWxseSBjbGVhcmVyIGluIGludGVudCB0byAiCisgICAgICAgICAgICAicGxhY2UgaXQgaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgY29tcGFyaXNvbi4iLAorICAgICAgICApLAorICAgICAgICAiQzAxMjMiOiAoCisgICAgICAgICAgICAiVXNlIGlzaW5zdGFuY2UoKSByYXRoZXIgdGhhbiB0eXBlKCkgZm9yIGEgdHlwZWNoZWNrLiIsCisgICAgICAgICAgICAidW5pZGlvbWF0aWMtdHlwZWNoZWNrIiwKKyAgICAgICAgICAgICJUaGUgaWRpb21hdGljIHdheSB0byBwZXJmb3JtIGFuIGV4cGxpY2l0IHR5cGVjaGVjayBpbiAiCisgICAgICAgICAgICAiUHl0aG9uIGlzIHRvIHVzZSBpc2luc3RhbmNlKHgsIFkpIHJhdGhlciB0aGFuICIKKyAgICAgICAgICAgICJ0eXBlKHgpID09IFksIHR5cGUoeCkgaXMgWS4gVGhvdWdoIHRoZXJlIGFyZSB1bnVzdWFsICIKKyAgICAgICAgICAgICJzaXR1YXRpb25zIHdoZXJlIHRoZXNlIGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuIiwKKyAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiVzAxNTQiLCAib2xkLXVuaWRpb21hdGljLXR5cGVjaGVjayIpXX0sCisgICAgICAgICksCisgICAgICAgICJSMDEyMyI6ICgKKyAgICAgICAgICAgICJDb21wYXJpc29uIHRvIGxpdGVyYWwiLAorICAgICAgICAgICAgImxpdGVyYWwtY29tcGFyaXNvbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGNvbXBhcmluZyBhbiBvYmplY3QgdG8gYSBsaXRlcmFsLCB3aGljaCBpcyB1c3VhbGx5ICIKKyAgICAgICAgICAgICJ3aGF0IHlvdSBkbyBub3Qgd2FudCB0byBkbywgc2luY2UgeW91IGNhbiBjb21wYXJlIHRvIGEgZGlmZmVyZW50ICIKKyAgICAgICAgICAgICJsaXRlcmFsIHRoYW4gd2hhdCB3YXMgZXhwZWN0ZWQgYWx0b2dldGhlci4iLAorICAgICAgICApLAorICAgICAgICAiUjAxMjQiOiAoCisgICAgICAgICAgICAiUmVkdW5kYW50IGNvbXBhcmlzb24gLSAlcyIsCisgICAgICAgICAgICAiY29tcGFyaXNvbi13aXRoLWl0c2VsZiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHNvbWV0aGluZyBpcyBjb21wYXJlZCBhZ2FpbnN0IGl0c2VsZi4iLAorICAgICAgICApLAorICAgICAgICAiVzAxNDMiOiAoCisgICAgICAgICAgICAiQ29tcGFyaW5nIGFnYWluc3QgYSBjYWxsYWJsZSwgZGlkIHlvdSBvbWl0IHRoZSBwYXJlbnRoZXNpcz8iLAorICAgICAgICAgICAgImNvbXBhcmlzb24td2l0aC1jYWxsYWJsZSIsCisgICAgICAgICAgICAiVGhpcyBtZXNzYWdlIGlzIGVtaXR0ZWQgd2hlbiBweWxpbnQgZGV0ZWN0cyB0aGF0IGEgY29tcGFyaXNvbiB3aXRoIGEgIgorICAgICAgICAgICAgImNhbGxhYmxlIHdhcyBtYWRlLCB3aGljaCBtaWdodCBzdWdnZXN0IHRoYXQgc29tZSBwYXJlbnRoZXNpcyB3ZXJlIG9taXR0ZWQsICIKKyAgICAgICAgICAgICJyZXN1bHRpbmcgaW4gcG90ZW50aWFsIHVud2FudGVkIGJlaGF2aW91ci4iLAorICAgICAgICApLAorICAgICAgICAiVzAxNzciOiAoCisgICAgICAgICAgICAiQ29tcGFyaXNvbiAlcyBzaG91bGQgYmUgJXMiLAorICAgICAgICAgICAgIm5hbi1jb21wYXJpc29uIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gZXhwcmVzc2lvbiBpcyBjb21wYXJlZCB0byBOYU4iCisgICAgICAgICAgICAidmFsdWVzIGxpa2UgbnVtcHkuTmFOIGFuZCBmbG9hdCgnbmFuJykiLAorICAgICAgICApLAorICAgIH0KKworICAgIGRlZiBfY2hlY2tfc2luZ2xldG9uX2NvbXBhcmlzb24oCisgICAgICAgIHNlbGYsIGxlZnRfdmFsdWUsIHJpZ2h0X3ZhbHVlLCByb290X25vZGUsIGNoZWNraW5nX2Zvcl9hYnNlbmNlOiBib29sID0gRmFsc2UKKyAgICApOgorICAgICAgICAiIiJDaGVjayBpZiA9PSBvciAhPSBpcyBiZWluZyB1c2VkIHRvIGNvbXBhcmUgYSBzaW5nbGV0b24gdmFsdWUiIiIKKyAgICAgICAgc2luZ2xldG9uX3ZhbHVlcyA9IChUcnVlLCBGYWxzZSwgTm9uZSkKKworICAgICAgICBkZWYgX2lzX3NpbmdsZXRvbl9jb25zdChub2RlKSAtPiBib29sOgorICAgICAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIGFueSgKKyAgICAgICAgICAgICAgICBub2RlLnZhbHVlIGlzIHZhbHVlIGZvciB2YWx1ZSBpbiBzaW5nbGV0b25fdmFsdWVzCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgX2lzX3NpbmdsZXRvbl9jb25zdChsZWZ0X3ZhbHVlKToKKyAgICAgICAgICAgIHNpbmdsZXRvbiwgb3RoZXJfdmFsdWUgPSBsZWZ0X3ZhbHVlLnZhbHVlLCByaWdodF92YWx1ZQorICAgICAgICBlbGlmIF9pc19zaW5nbGV0b25fY29uc3QocmlnaHRfdmFsdWUpOgorICAgICAgICAgICAgc2luZ2xldG9uLCBvdGhlcl92YWx1ZSA9IHJpZ2h0X3ZhbHVlLnZhbHVlLCBsZWZ0X3ZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzaW5nbGV0b25fY29tcGFyaXNvbl9leGFtcGxlID0ge0ZhbHNlOiAiJ3t9IGlzIHt9JyIsIFRydWU6ICIne30gaXMgbm90IHt9JyJ9CisKKyAgICAgICAgIyBUcnVlL0ZhbHNlIHNpbmdsZXRvbnMgaGF2ZSBhIHNwZWNpYWwtY2FzZWQgbWVzc2FnZSBpbiBjYXNlIHRoZSB1c2VyIGlzCisgICAgICAgICMgbWlzdGFrZW5seSB1c2luZyA9PSBvciAhPSB0byBjaGVjayBmb3IgdHJ1dGhpbmVzcworICAgICAgICBpZiBzaW5nbGV0b24gaW4gKFRydWUsIEZhbHNlKToKKyAgICAgICAgICAgIHN1Z2dlc3Rpb25fdGVtcGxhdGUgPSAoCisgICAgICAgICAgICAgICAgInt9IGlmIGNoZWNraW5nIGZvciB0aGUgc2luZ2xldG9uIHZhbHVlIHt9LCBvciB7fSBpZiB0ZXN0aW5nIGZvciB7fSIKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRydXRoaW5lc3NfZXhhbXBsZSA9IHtGYWxzZTogIm5vdCB7fSIsIFRydWU6ICJ7fSJ9CisgICAgICAgICAgICB0cnV0aGluZXNzX3BocmFzZSA9IHtUcnVlOiAidHJ1dGhpbmVzcyIsIEZhbHNlOiAiZmFsc2luZXNzIn0KKworICAgICAgICAgICAgIyBMb29rcyBmb3IgY29tcGFyaXNvbnMgbGlrZSB4ID09IFRydWUgb3IgeCAhPSBGYWxzZQorICAgICAgICAgICAgY2hlY2tpbmdfdHJ1dGhpbmVzcyA9IHNpbmdsZXRvbiBpcyBub3QgY2hlY2tpbmdfZm9yX2Fic2VuY2UKKworICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHN1Z2dlc3Rpb25fdGVtcGxhdGUuZm9ybWF0KAorICAgICAgICAgICAgICAgIHNpbmdsZXRvbl9jb21wYXJpc29uX2V4YW1wbGVbY2hlY2tpbmdfZm9yX2Fic2VuY2VdLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgbGVmdF92YWx1ZS5hc19zdHJpbmcoKSwgcmlnaHRfdmFsdWUuYXNfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIHNpbmdsZXRvbiwKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICInYm9vbCh7fSknIgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgdXRpbHMuaXNfdGVzdF9jb25kaXRpb24ocm9vdF9ub2RlKSBhbmQgY2hlY2tpbmdfdHJ1dGhpbmVzcworICAgICAgICAgICAgICAgICAgICBlbHNlICIne30nIgorICAgICAgICAgICAgICAgICkuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICB0cnV0aGluZXNzX2V4YW1wbGVbY2hlY2tpbmdfdHJ1dGhpbmVzc10uZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdmFsdWUuYXNfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgdHJ1dGhpbmVzc19waHJhc2VbY2hlY2tpbmdfdHJ1dGhpbmVzc10sCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWdnZXN0aW9uID0gc2luZ2xldG9uX2NvbXBhcmlzb25fZXhhbXBsZVtjaGVja2luZ19mb3JfYWJzZW5jZV0uZm9ybWF0KAorICAgICAgICAgICAgICAgIGxlZnRfdmFsdWUuYXNfc3RyaW5nKCksIHJpZ2h0X3ZhbHVlLmFzX3N0cmluZygpCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAic2luZ2xldG9uLWNvbXBhcmlzb24iLAorICAgICAgICAgICAgbm9kZT1yb290X25vZGUsCisgICAgICAgICAgICBhcmdzPShmIid7cm9vdF9ub2RlLmFzX3N0cmluZygpfSciLCBzdWdnZXN0aW9uKSwKKyAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19uYW5fY29tcGFyaXNvbigKKyAgICAgICAgc2VsZiwgbGVmdF92YWx1ZSwgcmlnaHRfdmFsdWUsIHJvb3Rfbm9kZSwgY2hlY2tpbmdfZm9yX2Fic2VuY2U6IGJvb2wgPSBGYWxzZQorICAgICk6CisgICAgICAgIGRlZiBfaXNfZmxvYXRfbmFuKG5vZGUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5DYWxsKSBhbmQgbGVuKG5vZGUuYXJncykgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5hcmdzWzBdLnZhbHVlLmxvd2VyKCkgPT0gIm5hbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub2RlLmluZmVycmVkKClbMF0ucHl0eXBlKCkgPT0gImJ1aWx0aW5zLmZsb2F0IgorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBkZWYgX2lzX251bXB5X25hbihub2RlKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5BdHRyaWJ1dGUpIGFuZCBub2RlLmF0dHJuYW1lID09ICJOYU4iOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5leHByLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5leHByLm5hbWUgaW4gKCJudW1weSIsICJubXAiLCAibnAiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZGVmIF9pc19uYW4obm9kZSkgLT4gYm9vbDoKKyAgICAgICAgICAgIHJldHVybiBfaXNfZmxvYXRfbmFuKG5vZGUpIG9yIF9pc19udW1weV9uYW4obm9kZSkKKworICAgICAgICBuYW5fbGVmdCA9IF9pc19uYW4obGVmdF92YWx1ZSkKKyAgICAgICAgaWYgbm90IG5hbl9sZWZ0IGFuZCBub3QgX2lzX25hbihyaWdodF92YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBhYnNlbmNlX3RleHQgPSAiIgorICAgICAgICBpZiBjaGVja2luZ19mb3JfYWJzZW5jZToKKyAgICAgICAgICAgIGFic2VuY2VfdGV4dCA9ICJub3QgIgorICAgICAgICBpZiBuYW5fbGVmdDoKKyAgICAgICAgICAgIHN1Z2dlc3Rpb24gPSBmIid7YWJzZW5jZV90ZXh0fW1hdGguaXNuYW4oe3JpZ2h0X3ZhbHVlLmFzX3N0cmluZygpfSknIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGYiJ3thYnNlbmNlX3RleHR9bWF0aC5pc25hbih7bGVmdF92YWx1ZS5hc19zdHJpbmcoKX0pJyIKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICJuYW4tY29tcGFyaXNvbiIsCisgICAgICAgICAgICBub2RlPXJvb3Rfbm9kZSwKKyAgICAgICAgICAgIGFyZ3M9KGYiJ3tyb290X25vZGUuYXNfc3RyaW5nKCl9JyIsIHN1Z2dlc3Rpb24pLAorICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX2xpdGVyYWxfY29tcGFyaXNvbihzZWxmLCBsaXRlcmFsLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgd2UgY29tcGFyZSB0byBhIGxpdGVyYWwsIHdoaWNoIGlzIHVzdWFsbHkgd2hhdCB3ZSBkbyBub3Qgd2FudCB0byBkby4iIiIKKyAgICAgICAgbm9kZXMgPSAoYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlR1cGxlLCBhc3Ryb2lkLkRpY3QsIGFzdHJvaWQuU2V0KQorICAgICAgICBpc19vdGhlcl9saXRlcmFsID0gaXNpbnN0YW5jZShsaXRlcmFsLCBub2RlcykKKyAgICAgICAgaXNfY29uc3QgPSBGYWxzZQorICAgICAgICBpZiBpc2luc3RhbmNlKGxpdGVyYWwsIGFzdHJvaWQuQ29uc3QpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaXRlcmFsLnZhbHVlLCBib29sKSBvciBsaXRlcmFsLnZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBOb3QgaW50ZXJlc3RlZCBpbiB0aGlzIHZhbHVlcy4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlzX2NvbnN0ID0gaXNpbnN0YW5jZShsaXRlcmFsLnZhbHVlLCAoYnl0ZXMsIHN0ciwgaW50LCBmbG9hdCkpCisKKyAgICAgICAgaWYgaXNfY29uc3Qgb3IgaXNfb3RoZXJfbGl0ZXJhbDoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImxpdGVyYWwtY29tcGFyaXNvbiIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfbWlzcGxhY2VkX2NvbnN0YW50KHNlbGYsIG5vZGUsIGxlZnQsIHJpZ2h0LCBvcGVyYXRvcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocmlnaHQsIGFzdHJvaWQuQ29uc3QpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG9wZXJhdG9yID0gUkVWRVJTRURfQ09NUFMuZ2V0KG9wZXJhdG9yLCBvcGVyYXRvcikKKyAgICAgICAgc3VnZ2VzdGlvbiA9IGYie3JpZ2h0LmFzX3N0cmluZygpfSB7b3BlcmF0b3J9IHtsZWZ0LnZhbHVlIXJ9IgorICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudCIsIG5vZGU9bm9kZSwgYXJncz0oc3VnZ2VzdGlvbiwpKQorCisgICAgZGVmIF9jaGVja19sb2dpY2FsX3RhdXRvbG9neShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgaWRlbnRpZmllciBpcyBjb21wYXJlZCBhZ2FpbnN0IGl0c2VsZi4KKyAgICAgICAgOnBhcmFtIG5vZGU6IENvbXBhcmUgbm9kZQorICAgICAgICA6dHlwZSBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Db21wYXJlCisgICAgICAgIDpFeGFtcGxlOgorICAgICAgICB2YWwgPSA3ODYKKyAgICAgICAgaWYgdmFsID09IHZhbDogICMgW2NvbXBhcmlzb24td2l0aC1pdHNlbGZdCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICBsZWZ0X29wZXJhbmQgPSBub2RlLmxlZnQKKyAgICAgICAgcmlnaHRfb3BlcmFuZCA9IG5vZGUub3BzWzBdWzFdCisgICAgICAgIG9wZXJhdG9yID0gbm9kZS5vcHNbMF1bMF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShsZWZ0X29wZXJhbmQsIGFzdHJvaWQuQ29uc3QpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgcmlnaHRfb3BlcmFuZCwgYXN0cm9pZC5Db25zdAorICAgICAgICApOgorICAgICAgICAgICAgbGVmdF9vcGVyYW5kID0gbGVmdF9vcGVyYW5kLnZhbHVlCisgICAgICAgICAgICByaWdodF9vcGVyYW5kID0gcmlnaHRfb3BlcmFuZC52YWx1ZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobGVmdF9vcGVyYW5kLCBhc3Ryb2lkLk5hbWUpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgcmlnaHRfb3BlcmFuZCwgYXN0cm9pZC5OYW1lCisgICAgICAgICk6CisgICAgICAgICAgICBsZWZ0X29wZXJhbmQgPSBsZWZ0X29wZXJhbmQubmFtZQorICAgICAgICAgICAgcmlnaHRfb3BlcmFuZCA9IHJpZ2h0X29wZXJhbmQubmFtZQorCisgICAgICAgIGlmIGxlZnRfb3BlcmFuZCA9PSByaWdodF9vcGVyYW5kOgorICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGYie2xlZnRfb3BlcmFuZH0ge29wZXJhdG9yfSB7cmlnaHRfb3BlcmFuZH0iCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb21wYXJpc29uLXdpdGgtaXRzZWxmIiwgbm9kZT1ub2RlLCBhcmdzPShzdWdnZXN0aW9uLCkpCisKKyAgICBkZWYgX2NoZWNrX2NhbGxhYmxlX2NvbXBhcmlzb24oc2VsZiwgbm9kZSk6CisgICAgICAgIG9wZXJhdG9yID0gbm9kZS5vcHNbMF1bMF0KKyAgICAgICAgaWYgb3BlcmF0b3Igbm90IGluIENPTVBBUklTT05fT1BFUkFUT1JTOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYmFyZV9jYWxsYWJsZXMgPSAoYXN0cm9pZC5GdW5jdGlvbkRlZiwgYXN0cm9pZC5Cb3VuZE1ldGhvZCkKKyAgICAgICAgbGVmdF9vcGVyYW5kLCByaWdodF9vcGVyYW5kID0gbm9kZS5sZWZ0LCBub2RlLm9wc1swXVsxXQorICAgICAgICAjIHRoaXMgbWVzc2FnZSBzaG91bGQgYmUgZW1pdHRlZCBvbmx5IHdoZW4gdGhlcmUgaXMgY29tcGFyaXNvbiBvZiBiYXJlIGNhbGxhYmxlCisgICAgICAgICMgd2l0aCBub24gYmFyZSBjYWxsYWJsZS4KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgc3VtKAorICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICBmb3Igb3BlcmFuZCBpbiAobGVmdF9vcGVyYW5kLCByaWdodF9vcGVyYW5kKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodXRpbHMuc2FmZV9pbmZlcihvcGVyYW5kKSwgYmFyZV9jYWxsYWJsZXMpCisgICAgICAgICAgICApCisgICAgICAgICAgICA9PSAxCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb21wYXJpc29uLXdpdGgtY2FsbGFibGUiLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJzaW5nbGV0b24tY29tcGFyaXNvbiIsCisgICAgICAgICJtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudCIsCisgICAgICAgICJ1bmlkaW9tYXRpYy10eXBlY2hlY2siLAorICAgICAgICAibGl0ZXJhbC1jb21wYXJpc29uIiwKKyAgICAgICAgImNvbXBhcmlzb24td2l0aC1pdHNlbGYiLAorICAgICAgICAiY29tcGFyaXNvbi13aXRoLWNhbGxhYmxlIiwKKyAgICApCisgICAgZGVmIHZpc2l0X2NvbXBhcmUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX2NhbGxhYmxlX2NvbXBhcmlzb24obm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfbG9naWNhbF90YXV0b2xvZ3kobm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfdW5pZGlvbWF0aWNfdHlwZWNoZWNrKG5vZGUpCisgICAgICAgICMgTk9URTogdGhpcyBjaGVja2VyIG9ubHkgd29ya3Mgd2l0aCBiaW5hcnkgY29tcGFyaXNvbnMgbGlrZSAneCA9PSA0MicKKyAgICAgICAgIyBidXQgbm90ICd4ID09IHkgPT0gNDInCisgICAgICAgIGlmIGxlbihub2RlLm9wcykgIT0gMToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGxlZnQgPSBub2RlLmxlZnQKKyAgICAgICAgb3BlcmF0b3IsIHJpZ2h0ID0gbm9kZS5vcHNbMF0KKyAgICAgICAgaWYgb3BlcmF0b3IgaW4gQ09NUEFSSVNPTl9PUEVSQVRPUlMgYW5kIGlzaW5zdGFuY2UobGVmdCwgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19taXNwbGFjZWRfY29uc3RhbnQobm9kZSwgbGVmdCwgcmlnaHQsIG9wZXJhdG9yKQorCisgICAgICAgIGlmIG9wZXJhdG9yIGluICgiPT0iLCAiIT0iKToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NpbmdsZXRvbl9jb21wYXJpc29uKAorICAgICAgICAgICAgICAgIGxlZnQsIHJpZ2h0LCBub2RlLCBjaGVja2luZ19mb3JfYWJzZW5jZT1vcGVyYXRvciA9PSAiIT0iCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgb3BlcmF0b3IgaW4gKCI9PSIsICIhPSIsICJpcyIsICJpcyBub3QiKToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX25hbl9jb21wYXJpc29uKAorICAgICAgICAgICAgICAgIGxlZnQsIHJpZ2h0LCBub2RlLCBjaGVja2luZ19mb3JfYWJzZW5jZT1vcGVyYXRvciBpbiAoIiE9IiwgImlzIG5vdCIpCisgICAgICAgICAgICApCisgICAgICAgIGlmIG9wZXJhdG9yIGluICgiaXMiLCAiaXMgbm90Iik6CisgICAgICAgICAgICBzZWxmLl9jaGVja19saXRlcmFsX2NvbXBhcmlzb24ocmlnaHQsIG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3VuaWRpb21hdGljX3R5cGVjaGVjayhzZWxmLCBub2RlKToKKyAgICAgICAgb3BlcmF0b3IsIHJpZ2h0ID0gbm9kZS5vcHNbMF0KKyAgICAgICAgaWYgb3BlcmF0b3IgaW4gVFlQRUNIRUNLX0NPTVBBUklTT05fT1BFUkFUT1JTOgorICAgICAgICAgICAgbGVmdCA9IG5vZGUubGVmdAorICAgICAgICAgICAgaWYgX2lzX29uZV9hcmdfcG9zX2NhbGwobGVmdCk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfdHlwZV94X2lzX3kobm9kZSwgbGVmdCwgb3BlcmF0b3IsIHJpZ2h0KQorCisgICAgZGVmIF9jaGVja190eXBlX3hfaXNfeShzZWxmLCBub2RlLCBsZWZ0LCBvcGVyYXRvciwgcmlnaHQpOgorICAgICAgICAiIiJDaGVjayBmb3IgZXhwcmVzc2lvbnMgbGlrZSB0eXBlKHgpID09IFkuIiIiCisgICAgICAgIGxlZnRfZnVuYyA9IHV0aWxzLnNhZmVfaW5mZXIobGVmdC5mdW5jKQorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShsZWZ0X2Z1bmMsIGFzdHJvaWQuQ2xhc3NEZWYpIGFuZCBsZWZ0X2Z1bmMucW5hbWUoKSA9PSBUWVBFX1FOQU1FCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBvcGVyYXRvciBpbiAoImlzIiwgImlzIG5vdCIpIGFuZCBfaXNfb25lX2FyZ19wb3NfY2FsbChyaWdodCk6CisgICAgICAgICAgICByaWdodF9mdW5jID0gdXRpbHMuc2FmZV9pbmZlcihyaWdodC5mdW5jKQorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UocmlnaHRfZnVuYywgYXN0cm9pZC5DbGFzc0RlZikKKyAgICAgICAgICAgICAgICBhbmQgcmlnaHRfZnVuYy5xbmFtZSgpID09IFRZUEVfUU5BTUUKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyB0eXBlKHgpID09IHR5cGUoYSkKKyAgICAgICAgICAgICAgICByaWdodF9hcmcgPSB1dGlscy5zYWZlX2luZmVyKHJpZ2h0LmFyZ3NbMF0pCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmlnaHRfYXJnLCBMSVRFUkFMX05PREVfVFlQRVMpOgorICAgICAgICAgICAgICAgICAgICAjIG5vdCBlLmcuIHR5cGUoeCkgPT0gdHlwZShbXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVuaWRpb21hdGljLXR5cGVjaGVjayIsIG5vZGU9bm9kZSkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihCYXNpY0Vycm9yQ2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEJhc2ljQ2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKE5hbWVDaGVja2VyKGxpbnRlcikpCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoRG9jU3RyaW5nQ2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFBhc3NDaGVja2VyKGxpbnRlcikpCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoQ29tcGFyaXNvbkNoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9iYXNlX2NoZWNrZXIucHkgYi9weWxpbnQvY2hlY2tlcnMvYmFzZV9jaGVja2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjE4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvYmFzZV9jaGVja2VyLnB5CkBAIC0wLDAgKzEsMTg1IEBACisjIENvcHlyaWdodCAoYykgMjAwNi0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMyBidWNrQHllbHAuY29tIDxidWNrQHllbHAuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBNb2lzZXMgTG9wZXogPG1veWxvcDI2MEB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBCcnljZSBHdWludGEgPGJyeWNlLnBhdWwuZ3VpbnRhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBCcnVubyBQLiBLaW5vc2hpdGEgPGtpbm93QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQoraW1wb3J0IGZ1bmN0b29scworZnJvbSBpbnNwZWN0IGltcG9ydCBjbGVhbmRvYworZnJvbSB0eXBpbmcgaW1wb3J0IEFueQorCitmcm9tIHB5bGludC5jb25maWcgaW1wb3J0IE9wdGlvbnNQcm92aWRlck1peEluCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IF9NU0dfT1JERVIsIFdhcm5pbmdTY29wZQorZnJvbSBweWxpbnQuZXhjZXB0aW9ucyBpbXBvcnQgSW52YWxpZE1lc3NhZ2VFcnJvcgorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgVU5ERUZJTkVELCBJUmF3Q2hlY2tlciwgSVRva2VuQ2hlY2tlciwgaW1wbGVtZW50cworZnJvbSBweWxpbnQubWVzc2FnZS5tZXNzYWdlX2RlZmluaXRpb24gaW1wb3J0IE1lc3NhZ2VEZWZpbml0aW9uCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgZ2V0X3JzdF9zZWN0aW9uLCBnZXRfcnN0X3RpdGxlCisKKworQGZ1bmN0b29scy50b3RhbF9vcmRlcmluZworY2xhc3MgQmFzZUNoZWNrZXIoT3B0aW9uc1Byb3ZpZGVyTWl4SW4pOgorCisgICAgIyBjaGVja2VyIG5hbWUgKHlvdSBtYXkgcmV1c2UgYW4gZXhpc3Rpbmcgb25lKQorICAgIG5hbWU6IHN0ciA9ICIiCisgICAgIyBvcHRpb25zIGxldmVsICgwIHdpbGwgYmUgZGlzcGxheWluZyBpbiAtLWhlbHAsIDEgaW4gLS1sb25nLWhlbHApCisgICAgbGV2ZWwgPSAxCisgICAgIyBvcmRlcmVkIGxpc3Qgb2Ygb3B0aW9ucyB0byBjb250cm9sIHRoZSBjaGVja2VyIGJlaGF2aW91cgorICAgIG9wdGlvbnM6IEFueSA9ICgpCisgICAgIyBtZXNzYWdlcyBpc3N1ZWQgYnkgdGhpcyBjaGVja2VyCisgICAgbXNnczogQW55ID0ge30KKyAgICAjIHJlcG9ydHMgaXNzdWVkIGJ5IHRoaXMgY2hlY2tlcgorICAgIHJlcG9ydHM6IEFueSA9ICgpCisgICAgIyBtYXJrIHRoaXMgY2hlY2tlciBhcyBlbmFibGVkIG9yIG5vdC4KKyAgICBlbmFibGVkOiBib29sID0gVHJ1ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcj1Ob25lKToKKyAgICAgICAgIiIiY2hlY2tlciBpbnN0YW5jZXMgc2hvdWxkIGhhdmUgdGhlIGxpbnRlciBhcyBhcmd1bWVudAorCisgICAgICAgIDpwYXJhbSBJTGludGVyIGxpbnRlcjogaXMgYW4gb2JqZWN0IGltcGxlbWVudGluZyBJTGludGVyLiIiIgorICAgICAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBzZWxmLm5hbWUubG93ZXIoKQorICAgICAgICBPcHRpb25zUHJvdmlkZXJNaXhJbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmxpbnRlciA9IGxpbnRlcgorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlBlcm1pdCB0byBzb3J0IGEgbGlzdCBvZiBDaGVja2VyIGJ5IG5hbWUuIiIiCisgICAgICAgIHJldHVybiBmIntzZWxmLm5hbWV9e3NlbGYubXNnc30iLl9fZ3RfXyhmIntvdGhlci5uYW1lfXtvdGhlci5tc2dzfSIpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHN0YXR1cyA9ICJDaGVja2VyIiBpZiBzZWxmLmVuYWJsZWQgZWxzZSAiRGlzYWJsZWQgY2hlY2tlciIKKyAgICAgICAgbXNncyA9ICInLCAnIi5qb2luKHNlbGYubXNncy5rZXlzKCkpCisgICAgICAgIHJldHVybiBmIntzdGF0dXN9ICd7c2VsZi5uYW1lfScgKHJlc3BvbnNpYmxlIGZvciAne21zZ3N9JykiCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiVGhpcyBtaWdodCBiZSBpbmNvbXBsZXRlIGJlY2F1c2UgbXVsdGlwbGUgY2xhc3MgaW5oZXJpdGluZyBCYXNlQ2hlY2tlcgorICAgICAgICBjYW4gaGF2ZSB0aGUgc2FtZSBuYW1lLiBDZiBNZXNzYWdlSGFuZGxlck1peEluLmdldF9mdWxsX2RvY3VtZW50YXRpb24oKSIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRfZnVsbF9kb2N1bWVudGF0aW9uKAorICAgICAgICAgICAgbXNncz1zZWxmLm1zZ3MsIG9wdGlvbnM9c2VsZi5vcHRpb25zX2FuZF92YWx1ZXMoKSwgcmVwb3J0cz1zZWxmLnJlcG9ydHMKKyAgICAgICAgKQorCisgICAgZGVmIGdldF9mdWxsX2RvY3VtZW50YXRpb24oc2VsZiwgbXNncywgb3B0aW9ucywgcmVwb3J0cywgZG9jPU5vbmUsIG1vZHVsZT1Ob25lKToKKyAgICAgICAgcmVzdWx0ID0gIiIKKyAgICAgICAgY2hlY2tlcl90aXRsZSA9ICIlcyBjaGVja2VyIiAlIChzZWxmLm5hbWUucmVwbGFjZSgiXyIsICIgIikudGl0bGUoKSkKKyAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgIyBQcm92aWRlIGFuY2hvciB0byBsaW5rIGFnYWluc3QKKyAgICAgICAgICAgIHJlc3VsdCArPSAiLi4gXyVzOlxuXG4iICUgbW9kdWxlCisgICAgICAgIHJlc3VsdCArPSAiJXNcbiIgJSBnZXRfcnN0X3RpdGxlKGNoZWNrZXJfdGl0bGUsICJ+IikKKyAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgcmVzdWx0ICs9ICJUaGlzIGNoZWNrZXIgaXMgcHJvdmlkZWQgYnkgYGAlc2BgLlxuIiAlIG1vZHVsZQorICAgICAgICByZXN1bHQgKz0gIlZlcmJhdGltIG5hbWUgb2YgdGhlIGNoZWNrZXIgaXMgYGAlc2BgLlxuXG4iICUgc2VsZi5uYW1lCisgICAgICAgIGlmIGRvYzoKKyAgICAgICAgICAgICMgUHJvdmlkZSBhbmNob3IgdG8gbGluayBhZ2FpbnN0CisgICAgICAgICAgICByZXN1bHQgKz0gZ2V0X3JzdF90aXRsZShmIntjaGVja2VyX3RpdGxlfSBEb2N1bWVudGF0aW9uIiwgIl4iKQorICAgICAgICAgICAgcmVzdWx0ICs9ICIlc1xuXG4iICUgY2xlYW5kb2MoZG9jKQorICAgICAgICAjIG9wdGlvbnMgbWlnaHQgYmUgYW4gZW1wdHkgZ2VuZXJhdG9yIGFuZCBub3QgYmUgRmFsc2Ugd2hlbiBjYXN0ZWQgdG8gYm9vbGVhbgorICAgICAgICBvcHRpb25zID0gbGlzdChvcHRpb25zKQorICAgICAgICBpZiBvcHRpb25zOgorICAgICAgICAgICAgcmVzdWx0ICs9IGdldF9yc3RfdGl0bGUoZiJ7Y2hlY2tlcl90aXRsZX0gT3B0aW9ucyIsICJeIikKKyAgICAgICAgICAgIHJlc3VsdCArPSAiJXNcbiIgJSBnZXRfcnN0X3NlY3Rpb24oTm9uZSwgb3B0aW9ucykKKyAgICAgICAgaWYgbXNnczoKKyAgICAgICAgICAgIHJlc3VsdCArPSBnZXRfcnN0X3RpdGxlKGYie2NoZWNrZXJfdGl0bGV9IE1lc3NhZ2VzIiwgIl4iKQorICAgICAgICAgICAgZm9yIG1zZ2lkLCBtc2cgaW4gc29ydGVkKAorICAgICAgICAgICAgICAgIG1zZ3MuaXRlbXMoKSwga2V5PWxhbWJkYSBrdjogKF9NU0dfT1JERVIuaW5kZXgoa3ZbMF1bMF0pLCBrdlsxXSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgbXNnID0gc2VsZi5jcmVhdGVfbWVzc2FnZV9kZWZpbml0aW9uX2Zyb21fdHVwbGUobXNnaWQsIG1zZykKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiVzXG4iICUgbXNnLmZvcm1hdF9oZWxwKGNoZWNrZXJyZWY9RmFsc2UpCisgICAgICAgICAgICByZXN1bHQgKz0gIlxuIgorICAgICAgICBpZiByZXBvcnRzOgorICAgICAgICAgICAgcmVzdWx0ICs9IGdldF9yc3RfdGl0bGUoZiJ7Y2hlY2tlcl90aXRsZX0gUmVwb3J0cyIsICJeIikKKyAgICAgICAgICAgIGZvciByZXBvcnQgaW4gcmVwb3J0czoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIjolczogJXNcbiIgJSByZXBvcnRbOjJdCisgICAgICAgICAgICByZXN1bHQgKz0gIlxuIgorICAgICAgICByZXN1bHQgKz0gIlxuIgorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgYWRkX21lc3NhZ2UoCisgICAgICAgIHNlbGYsIG1zZ2lkLCBsaW5lPU5vbmUsIG5vZGU9Tm9uZSwgYXJncz1Ob25lLCBjb25maWRlbmNlPU5vbmUsIGNvbF9vZmZzZXQ9Tm9uZQorICAgICk6CisgICAgICAgIGlmIG5vdCBjb25maWRlbmNlOgorICAgICAgICAgICAgY29uZmlkZW5jZSA9IFVOREVGSU5FRAorICAgICAgICBzZWxmLmxpbnRlci5hZGRfbWVzc2FnZShtc2dpZCwgbGluZSwgbm9kZSwgYXJncywgY29uZmlkZW5jZSwgY29sX29mZnNldCkKKworICAgIGRlZiBjaGVja19jb25zaXN0ZW5jeShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhlIGNvbnNpc3RlbmN5IG9mIG1zZ2lkLgorCisgICAgICAgIG1zZyBpZHMgZm9yIGEgY2hlY2tlciBzaG91bGQgYmUgYSBzdHJpbmcgb2YgbGVuIDQsIHdoZXJlIHRoZSB0d28gZmlyc3QKKyAgICAgICAgY2hhcmFjdGVycyBhcmUgdGhlIGNoZWNrZXIgaWQgYW5kIHRoZSB0d28gbGFzdCB0aGUgbXNnIGlkIGluIHRoaXMKKyAgICAgICAgY2hlY2tlci4KKworICAgICAgICA6cmFpc2VzIEludmFsaWRNZXNzYWdlRXJyb3I6IElmIHRoZSBjaGVja2VyIGlkIGluIHRoZSBtZXNzYWdlcyBhcmUgbm90CisgICAgICAgIGFsd2F5cyB0aGUgc2FtZS4iIiIKKyAgICAgICAgY2hlY2tlcl9pZCA9IE5vbmUKKyAgICAgICAgZXhpc3RpbmdfaWRzID0gW10KKyAgICAgICAgZm9yIG1lc3NhZ2UgaW4gc2VsZi5tZXNzYWdlczoKKyAgICAgICAgICAgIGlmIGNoZWNrZXJfaWQgaXMgbm90IE5vbmUgYW5kIGNoZWNrZXJfaWQgIT0gbWVzc2FnZS5tc2dpZFsxOjNdOgorICAgICAgICAgICAgICAgIGVycm9yX21zZyA9ICJJbmNvbnNpc3RlbnQgY2hlY2tlciBwYXJ0IGluIG1lc3NhZ2UgaWQgIgorICAgICAgICAgICAgICAgIGVycm9yX21zZyArPSBmIid7bWVzc2FnZS5tc2dpZH0nIChleHBlY3RlZCAneHtjaGVja2VyX2lkfXh4JyAiCisgICAgICAgICAgICAgICAgZXJyb3JfbXNnICs9IGYiYmVjYXVzZSB3ZSBhbHJlYWR5IGhhZCB7ZXhpc3RpbmdfaWRzfSkuIgorICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRNZXNzYWdlRXJyb3IoZXJyb3JfbXNnKQorICAgICAgICAgICAgY2hlY2tlcl9pZCA9IG1lc3NhZ2UubXNnaWRbMTozXQorICAgICAgICAgICAgZXhpc3RpbmdfaWRzLmFwcGVuZChtZXNzYWdlLm1zZ2lkKQorCisgICAgZGVmIGNyZWF0ZV9tZXNzYWdlX2RlZmluaXRpb25fZnJvbV90dXBsZShzZWxmLCBtc2dpZCwgbXNnX3R1cGxlKToKKyAgICAgICAgaWYgaW1wbGVtZW50cyhzZWxmLCAoSVJhd0NoZWNrZXIsIElUb2tlbkNoZWNrZXIpKToKKyAgICAgICAgICAgIGRlZmF1bHRfc2NvcGUgPSBXYXJuaW5nU2NvcGUuTElORQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmYXVsdF9zY29wZSA9IFdhcm5pbmdTY29wZS5OT0RFCisgICAgICAgIG9wdGlvbnMgPSB7fQorICAgICAgICBpZiBsZW4obXNnX3R1cGxlKSA+IDM6CisgICAgICAgICAgICAobXNnLCBzeW1ib2wsIGRlc2NyLCBvcHRpb25zKSA9IG1zZ190dXBsZQorICAgICAgICBlbGlmIGxlbihtc2dfdHVwbGUpID4gMjoKKyAgICAgICAgICAgIChtc2csIHN5bWJvbCwgZGVzY3IpID0gbXNnX3R1cGxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlcnJvcl9tc2cgPSAiIiJNZXNzYWdlcyBzaG91bGQgaGF2ZSBhIG1zZ2lkIGFuZCBhIHN5bWJvbC4gU29tZXRoaW5nIGxpa2UgdGhpcyA6CisKKyJXMTIzNCI6ICgKKyAgICAibWVzc2FnZSIsCisgICAgIm1lc3NhZ2Utc3ltYm9sIiwKKyAgICAiTWVzc2FnZSBkZXNjcmlwdGlvbiB3aXRoIGRldGFpbC4iLAorICAgIC4uLgorKSwKKyIiIgorICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1lc3NhZ2VFcnJvcihlcnJvcl9tc2cpCisgICAgICAgIG9wdGlvbnMuc2V0ZGVmYXVsdCgic2NvcGUiLCBkZWZhdWx0X3Njb3BlKQorICAgICAgICByZXR1cm4gTWVzc2FnZURlZmluaXRpb24oc2VsZiwgbXNnaWQsIG1zZywgZGVzY3IsIHN5bWJvbCwgKipvcHRpb25zKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG1lc3NhZ2VzKHNlbGYpIC0+IGxpc3Q6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9tZXNzYWdlX2RlZmluaXRpb25fZnJvbV90dXBsZShtc2dpZCwgbXNnX3R1cGxlKQorICAgICAgICAgICAgZm9yIG1zZ2lkLCBtc2dfdHVwbGUgaW4gc29ydGVkKHNlbGYubXNncy5pdGVtcygpKQorICAgICAgICBdCisKKyAgICAjIGR1bW15IG1ldGhvZHMgaW1wbGVtZW50aW5nIHRoZSBJQ2hlY2tlciBpbnRlcmZhY2UKKworICAgIGRlZiBnZXRfbWVzc2FnZV9kZWZpbml0aW9uKHNlbGYsIG1zZ2lkKToKKyAgICAgICAgZm9yIG1lc3NhZ2VfZGVmaW5pdGlvbiBpbiBzZWxmLm1lc3NhZ2VzOgorICAgICAgICAgICAgaWYgbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkID09IG1zZ2lkOgorICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlX2RlZmluaXRpb24KKyAgICAgICAgZXJyb3JfbXNnID0gZiJNZXNzYWdlRGVmaW5pdGlvbiBmb3IgJ3ttc2dpZH0nIGRvZXMgbm90IGV4aXN0cy4gIgorICAgICAgICBlcnJvcl9tc2cgKz0gZiJDaG9vc2UgZnJvbSB7W20ubXNnaWQgZm9yIG0gaW4gc2VsZi5tZXNzYWdlc119LiIKKyAgICAgICAgcmFpc2UgSW52YWxpZE1lc3NhZ2VFcnJvcihlcnJvcl9tc2cpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIiIiY2FsbGVkIGJlZm9yZSB2aXNpdGluZyBwcm9qZWN0IChpLmUgc2V0IG9mIG1vZHVsZXMpIiIiCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiImNhbGxlZCBhZnRlciB2aXNpdGluZyBwcm9qZWN0IChpLmUgc2V0IG9mIG1vZHVsZXMpIiIiCisKKworY2xhc3MgQmFzZVRva2VuQ2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgY2hlY2tlcnMgdGhhdCB3YW50IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSB0b2tlbiBzdHJlYW0uIiIiCisKKyAgICBkZWYgcHJvY2Vzc190b2tlbnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIiIiU2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvY2xhc3Nlcy5weSBiL3B5bGludC9jaGVja2Vycy9jbGFzc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkODZhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvY2xhc3Nlcy5weQpAQCAtMCwwICsxLDIzMjkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMTYgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTAgTWFhcnRlbiB0ZXIgSHV1cm5lIDxtYWFydGVuQHRyZWV3YWxrZXIub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEZFTEQgQm9yaXMgPGxvdGhpcmFsZGFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWwgTm93aWtvd3NraSA8Z29kZnJ5ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IERhdmlkIFB1cnNlaG91c2UgPGRhdmlkLnB1cnNlaG91c2VAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRG1pdHJ5IFByaWJ5c2ggPGRtYW5kQHlhbmRleC5ydT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgVG9kb3JvdiA8YXRvZG9yb3ZAb3RiLmJnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQW50aG9ueSBGb2dsaWEgPGFmb2dsaWFAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNiBNb2lzZXMgTG9wZXogPG1veWxvcDI2MEB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgSmFrdWIgV2lsayA8andpbGtAandpbGsubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTktMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTmljayBEcm96ZCA8bmljaG9sYXNkcm96ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxOCBMdWNhcyBDaW1vbiA8bHVjYXMuY2ltb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBCZW4gR3JlZW4gPGJlbmhncmVlbkBpY2xvdWQuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBtYXR0bGJlY2sgPDE3MTA4NzUyK21hdHRsYmVja0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIwIGNyYWlnLXNoIDxjcmFpZy1zaEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBKYW5uZSBSw7Zua2vDtiA8amFubmVyb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEdyeWdvcmlpIEllcm1vbGVua28gPGd5ZXJtb2xlbmtvQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFuZHJ6ZWogS2xham5lcnQgPGdpdGh1YkBha2xham5lcnQucGw+CisjIENvcHlyaWdodCAoYykgMjAxOSBQYXNjYWwgQ29ycGV0IDxwY29ycGV0QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEdlcmdlbHlLYWxtYXIgPGdlcmdlbHkua2FsbWFyQGxvZ2lrYWwuanA+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSB5dXNoYW8yIDwzNjg0ODQ3Mit5dXNoYW8yQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEtvbnN0YW50aW5hIFNha2V0b3UgPDU2NTE1MzAzK2tzYWtldG91QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEphbWVzIFNpbmNsYWlyIDxqYW1lc0BudXJmaGVyZGVyLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIHRpYWdvaG9ub3JhdG8gPDYxMDU5MjQzK3RpYWdvaG9ub3JhdG9AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiImNsYXNzZXMgY2hlY2tlciBmb3IgUHl0aG9uIGNvZGUKKyIiIgoraW1wb3J0IGNvbGxlY3Rpb25zCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIHppcF9sb25nZXN0Citmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgUGF0dGVybgorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCAoCisgICAgUFlNRVRIT0RTLAorICAgIFNQRUNJQUxfTUVUSE9EU19QQVJBTVMsCisgICAgY2hlY2tfbWVzc2FnZXMsCisgICAgY2xhc3NfaXNfYWJzdHJhY3QsCisgICAgZGVjb3JhdGVkX3dpdGgsCisgICAgZGVjb3JhdGVkX3dpdGhfcHJvcGVydHksCisgICAgaGFzX2tub3duX2Jhc2VzLAorICAgIGlzX2F0dHJfcHJpdmF0ZSwKKyAgICBpc19hdHRyX3Byb3RlY3RlZCwKKyAgICBpc19idWlsdGluX29iamVjdCwKKyAgICBpc19jb21wcmVoZW5zaW9uLAorICAgIGlzX2l0ZXJhYmxlLAorICAgIGlzX292ZXJsb2FkX3N0dWIsCisgICAgaXNfcHJvcGVydHlfc2V0dGVyLAorICAgIGlzX3Byb3BlcnR5X3NldHRlcl9vcl9kZWxldGVyLAorICAgIGlzX3Byb3RvY29sX2NsYXNzLAorICAgIG5vZGVfZnJhbWVfY2xhc3MsCisgICAgb3ZlcnJpZGVzX2FfbWV0aG9kLAorICAgIHNhZmVfaW5mZXIsCisgICAgdW5pbXBsZW1lbnRlZF9hYnN0cmFjdF9tZXRob2RzLAorKQorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgZ2V0X2dsb2JhbF9vcHRpb24KKworTkVYVF9NRVRIT0QgPSAiX19uZXh0X18iCitJTlZBTElEX0JBU0VfQ0xBU1NFUyA9IHsiYm9vbCIsICJyYW5nZSIsICJzbGljZSIsICJtZW1vcnl2aWV3In0KK0JVSUxUSU5fREVDT1JBVE9SUyA9IHsiYnVpbHRpbnMucHJvcGVydHkiLCAiYnVpbHRpbnMuY2xhc3NtZXRob2QifQorCisjIERlYWxpbmcgd2l0aCB1c2VsZXNzIG92ZXJyaWRlIGRldGVjdGlvbiwgd2l0aCByZWdhcmQKKyMgdG8gcGFyYW1ldGVycyB2cyBhcmd1bWVudHMKKworX0NhbGxTaWduYXR1cmUgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAorICAgICJfQ2FsbFNpZ25hdHVyZSIsICJhcmdzIGt3cyBzdGFycmVkX2FyZ3Mgc3RhcnJlZF9rd3MiCispCitfUGFyYW1ldGVyU2lnbmF0dXJlID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKKyAgICAiX1BhcmFtZXRlclNpZ25hdHVyZSIsICJhcmdzIGt3b25seWFyZ3MgdmFyYXJncyBrd2FyZ3MiCispCisKKworZGVmIF9zaWduYXR1cmVfZnJvbV9jYWxsKGNhbGwpOgorICAgIGt3cyA9IHt9CisgICAgYXJncyA9IFtdCisgICAgc3RhcnJlZF9rd3MgPSBbXQorICAgIHN0YXJyZWRfYXJncyA9IFtdCisgICAgZm9yIGtleXdvcmQgaW4gY2FsbC5rZXl3b3JkcyBvciBbXToKKyAgICAgICAgYXJnLCB2YWx1ZSA9IGtleXdvcmQuYXJnLCBrZXl3b3JkLnZhbHVlCisgICAgICAgIGlmIGFyZyBpcyBOb25lIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgIyBTdGFycmVkIG5vZGUgYW5kIHdlIGFyZSBpbnRlcmVzdGVkIG9ubHkgaW4gbmFtZXMsCisgICAgICAgICAgICAjIG90aGVyd2lzZSBzb21lIHRyYW5zZm9ybWF0aW9uIG1pZ2h0IG9jY3VyIGZvciB0aGUgcGFyYW1ldGVyLgorICAgICAgICAgICAgc3RhcnJlZF9rd3MuYXBwZW5kKHZhbHVlLm5hbWUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIGt3c1thcmddID0gdmFsdWUubmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAga3dzW2FyZ10gPSBOb25lCisKKyAgICBmb3IgYXJnIGluIGNhbGwuYXJnczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGFzdHJvaWQuU3RhcnJlZCkgYW5kIGlzaW5zdGFuY2UoYXJnLnZhbHVlLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgIyBQb3NpdGlvbmFsIHZhcmlhZGljIGFuZCBhIG5hbWUsIG90aGVyd2lzZSBzb21lIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICAgICAjIG1pZ2h0IGhhdmUgb2NjdXJyZWQuCisgICAgICAgICAgICBzdGFycmVkX2FyZ3MuYXBwZW5kKGFyZy52YWx1ZS5uYW1lKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXJnLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoYXJnLm5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzLmFwcGVuZChOb25lKQorCisgICAgcmV0dXJuIF9DYWxsU2lnbmF0dXJlKGFyZ3MsIGt3cywgc3RhcnJlZF9hcmdzLCBzdGFycmVkX2t3cykKKworCitkZWYgX3NpZ25hdHVyZV9mcm9tX2FyZ3VtZW50cyhhcmd1bWVudHMpOgorICAgIGt3YXJnID0gYXJndW1lbnRzLmt3YXJnCisgICAgdmFyYXJnID0gYXJndW1lbnRzLnZhcmFyZworICAgIGFyZ3MgPSBbCisgICAgICAgIGFyZy5uYW1lCisgICAgICAgIGZvciBhcmcgaW4gY2hhaW4oYXJndW1lbnRzLnBvc29ubHlhcmdzLCBhcmd1bWVudHMuYXJncykKKyAgICAgICAgaWYgYXJnLm5hbWUgIT0gInNlbGYiCisgICAgXQorICAgIGt3b25seWFyZ3MgPSBbYXJnLm5hbWUgZm9yIGFyZyBpbiBhcmd1bWVudHMua3dvbmx5YXJnc10KKyAgICByZXR1cm4gX1BhcmFtZXRlclNpZ25hdHVyZShhcmdzLCBrd29ubHlhcmdzLCB2YXJhcmcsIGt3YXJnKQorCisKK2RlZiBfZGVmaW5pdGlvbl9lcXVpdmFsZW50X3RvX2NhbGwoZGVmaW5pdGlvbiwgY2FsbCk6CisgICAgIiIiQ2hlY2sgaWYgYSBkZWZpbml0aW9uIHNpZ25hdHVyZSBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbC4iIiIKKyAgICBpZiBkZWZpbml0aW9uLmt3YXJnczoKKyAgICAgICAgc2FtZV9rd192YXJpYWRpY3MgPSBkZWZpbml0aW9uLmt3YXJncyBpbiBjYWxsLnN0YXJyZWRfa3dzCisgICAgZWxzZToKKyAgICAgICAgc2FtZV9rd192YXJpYWRpY3MgPSBub3QgY2FsbC5zdGFycmVkX2t3cworICAgIGlmIGRlZmluaXRpb24udmFyYXJnczoKKyAgICAgICAgc2FtZV9hcmdzX3ZhcmlhZGljcyA9IGRlZmluaXRpb24udmFyYXJncyBpbiBjYWxsLnN0YXJyZWRfYXJncworICAgIGVsc2U6CisgICAgICAgIHNhbWVfYXJnc192YXJpYWRpY3MgPSBub3QgY2FsbC5zdGFycmVkX2FyZ3MKKyAgICBzYW1lX2t3b25seWFyZ3MgPSBhbGwoa3cgaW4gY2FsbC5rd3MgZm9yIGt3IGluIGRlZmluaXRpb24ua3dvbmx5YXJncykKKyAgICBzYW1lX2FyZ3MgPSBkZWZpbml0aW9uLmFyZ3MgPT0gY2FsbC5hcmdzCisKKyAgICBub19hZGRpdGlvbmFsX2t3YXJnX2FyZ3VtZW50cyA9IFRydWUKKyAgICBpZiBjYWxsLmt3czoKKyAgICAgICAgZm9yIGtleXdvcmQgaW4gY2FsbC5rd3M6CisgICAgICAgICAgICBpc19hcmcgPSBrZXl3b3JkIGluIGNhbGwuYXJncworICAgICAgICAgICAgaXNfa3dvbmx5ID0ga2V5d29yZCBpbiBkZWZpbml0aW9uLmt3b25seWFyZ3MKKyAgICAgICAgICAgIGlmIG5vdCBpc19hcmcgYW5kIG5vdCBpc19rd29ubHk6CisgICAgICAgICAgICAgICAgIyBNYXliZSB0aGlzIGFyZ3VtZW50IGdvZXMgaW50byAqKmt3YXJncywKKyAgICAgICAgICAgICAgICAjIG9yIGl0IGlzIGFuIGV4dHJhbmVvdXMgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgIyBJbiBhbnkgY2FzZSwgdGhlIHNpZ25hdHVyZSBpcyBkaWZmZXJlbnQgdGhhbgorICAgICAgICAgICAgICAgICMgdGhlIGNhbGwgc2l0ZSwgd2hpY2ggc3RvcHMgb3VyIHNlYXJjaC4KKyAgICAgICAgICAgICAgICBub19hZGRpdGlvbmFsX2t3YXJnX2FyZ3VtZW50cyA9IEZhbHNlCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIHJldHVybiBhbGwoCisgICAgICAgICgKKyAgICAgICAgICAgIHNhbWVfYXJncywKKyAgICAgICAgICAgIHNhbWVfa3dvbmx5YXJncywKKyAgICAgICAgICAgIHNhbWVfYXJnc192YXJpYWRpY3MsCisgICAgICAgICAgICBzYW1lX2t3X3ZhcmlhZGljcywKKyAgICAgICAgICAgIG5vX2FkZGl0aW9uYWxfa3dhcmdfYXJndW1lbnRzLAorICAgICAgICApCisgICAgKQorCisKKyMgRGVhbCB3aXRoIHBhcmFtZXRlcnMgb3ZlcnJpZGRpbmcgaW4gdHdvIG1ldGhvZHMuCisKKworZGVmIF9wb3NpdGlvbmFsX3BhcmFtZXRlcnMobWV0aG9kKToKKyAgICBwb3NpdGlvbmFsID0gbWV0aG9kLmFyZ3MuYXJncworICAgIGlmIG1ldGhvZC50eXBlIGluICgiY2xhc3NtZXRob2QiLCAibWV0aG9kIik6CisgICAgICAgIHBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsWzE6XQorICAgIHJldHVybiBwb3NpdGlvbmFsCisKKworZGVmIF9nZXRfbm9kZV90eXBlKG5vZGUsIHBvdGVudGlhbF90eXBlcyk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBub2RlIGlmIGl0IGV4aXN0cyBpbiBwb3RlbnRpYWxfdHlwZXMuCisKKyAgICBBcmdzOgorICAgICAgICBub2RlIChhc3Ryb2lkLm5vZGUpOiBub2RlIHRvIGdldCB0aGUgdHlwZSBvZi4KKyAgICAgICAgcG90ZW50aWFsX3R5cGVzICh0dXBsZSk6IHBvdGVudGlhbCB0eXBlcyBvZiB0aGUgbm9kZS4KKworICAgIFJldHVybnM6CisgICAgICAgIHR5cGU6IHR5cGUgb2YgdGhlIG5vZGUgb3IgTm9uZS4KKyAgICAiIiIKKyAgICBmb3IgcG90ZW50aWFsX3R5cGUgaW4gcG90ZW50aWFsX3R5cGVzOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHBvdGVudGlhbF90eXBlKToKKyAgICAgICAgICAgIHJldHVybiBwb3RlbnRpYWxfdHlwZQorICAgIHJldHVybiBOb25lCisKKworZGVmIF9jaGVja19hcmdfZXF1YWxpdHkobm9kZV9hLCBub2RlX2IsIGF0dHJfbmFtZSk6CisgICAgIiIiCisgICAgQ2hlY2sgZXF1YWxpdHkgb2Ygbm9kZXMgYmFzZWQgb24gdGhlIGNvbXBhcmlzb24gb2YgdGhlaXIgYXR0cmlidXRlcyBuYW1lZCBhdHRyX25hbWUuCisKKyAgICBBcmdzOgorICAgICAgICBub2RlX2EgKGFzdHJvaWQubm9kZSk6IGZpcnN0IG5vZGUgdG8gY29tcGFyZS4KKyAgICAgICAgbm9kZV9iIChhc3Ryb2lkLm5vZGUpOiBzZWNvbmQgbm9kZSB0byBjb21wYXJlLgorICAgICAgICBhdHRyX25hbWUgKHN0cik6IG5hbWUgb2YgdGhlIG5vZGVzIGF0dHJpYnV0ZSB0byB1c2UgZm9yIGNvbXBhcmlzb24uCisKKyAgICBSZXR1cm5zOgorICAgICAgICBib29sOiBUcnVlIGlmIG5vZGVfYS5hdHRyX25hbWUgPT0gbm9kZV9iLmF0dHJfbmFtZSwgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICIiIgorICAgIHJldHVybiBnZXRhdHRyKG5vZGVfYSwgYXR0cl9uYW1lKSA9PSBnZXRhdHRyKG5vZGVfYiwgYXR0cl9uYW1lKQorCisKK2RlZiBfaGFzX2RpZmZlcmVudF9wYXJhbWV0ZXJzX2RlZmF1bHRfdmFsdWUob3JpZ2luYWwsIG92ZXJyaWRkZW4pOgorICAgICIiIgorICAgIENoZWNrIGlmIG9yaWdpbmFsIGFuZCBvdmVycmlkZGVuIG1ldGhvZHMgYXJndW1lbnRzIGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWVzCisKKyAgICBSZXR1cm4gVHJ1ZSBpZiBvbmUgb2YgdGhlIG92ZXJyaWRkZW4gYXJndW1lbnRzIGhhcyBhIGRlZmF1bHQKKyAgICB2YWx1ZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgYXJndW1lbnQKKyAgICBJZiBvbmUgb2YgdGhlIG1ldGhvZCBkb2Vzbid0IGhhdmUgYXJndW1lbnQgKC5hcmdzIGlzIE5vbmUpCisgICAgcmV0dXJuIEZhbHNlCisgICAgIiIiCisgICAgaWYgb3JpZ2luYWwuYXJncyBpcyBOb25lIG9yIG92ZXJyaWRkZW4uYXJncyBpcyBOb25lOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGFsbF9hcmdzID0gY2hhaW4ob3JpZ2luYWwuYXJncywgb3JpZ2luYWwua3dvbmx5YXJncykKKyAgICBvcmlnaW5hbF9wYXJhbV9uYW1lcyA9IFtwYXJhbS5uYW1lIGZvciBwYXJhbSBpbiBhbGxfYXJnc10KKyAgICBkZWZhdWx0X21pc3NpbmcgPSBvYmplY3QoKQorICAgIGZvciBwYXJhbV9uYW1lIGluIG9yaWdpbmFsX3BhcmFtX25hbWVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcmlnaW5hbF9kZWZhdWx0ID0gb3JpZ2luYWwuZGVmYXVsdF92YWx1ZShwYXJhbV9uYW1lKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5leGNlcHRpb25zLk5vRGVmYXVsdDoKKyAgICAgICAgICAgIG9yaWdpbmFsX2RlZmF1bHQgPSBkZWZhdWx0X21pc3NpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3ZlcnJpZGRlbl9kZWZhdWx0ID0gb3ZlcnJpZGRlbi5kZWZhdWx0X3ZhbHVlKHBhcmFtX25hbWUpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLmV4Y2VwdGlvbnMuTm9EZWZhdWx0OgorICAgICAgICAgICAgb3ZlcnJpZGRlbl9kZWZhdWx0ID0gZGVmYXVsdF9taXNzaW5nCisKKyAgICAgICAgZGVmYXVsdF9saXN0ID0gWworICAgICAgICAgICAgYXJnID09IGRlZmF1bHRfbWlzc2luZyBmb3IgYXJnIGluIChvcmlnaW5hbF9kZWZhdWx0LCBvdmVycmlkZGVuX2RlZmF1bHQpCisgICAgICAgIF0KKyAgICAgICAgaWYgYW55KGRlZmF1bHRfbGlzdCkgYW5kIG5vdCBhbGwoZGVmYXVsdF9saXN0KToKKyAgICAgICAgICAgICMgT25seSBvbmUgYXJnIGhhcyBubyBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGFzdHJvaWRfdHlwZV9jb21wYXJlZF9hdHRyID0geworICAgICAgICAgICAgYXN0cm9pZC5Db25zdDogInZhbHVlIiwKKyAgICAgICAgICAgIGFzdHJvaWQuQ2xhc3NEZWY6ICJuYW1lIiwKKyAgICAgICAgICAgIGFzdHJvaWQuVHVwbGU6ICJlbHRzIiwKKyAgICAgICAgICAgIGFzdHJvaWQuTGlzdDogImVsdHMiLAorICAgICAgICAgICAgYXN0cm9pZC5EaWN0OiAiaXRlbXMiLAorICAgICAgICB9CisgICAgICAgIGhhbmRsZWRfdHlwZXMgPSB0dXBsZSgKKyAgICAgICAgICAgIGFzdHJvaWRfdHlwZSBmb3IgYXN0cm9pZF90eXBlIGluIGFzdHJvaWRfdHlwZV9jb21wYXJlZF9hdHRyCisgICAgICAgICkKKyAgICAgICAgb3JpZ2luYWxfdHlwZSA9IF9nZXRfbm9kZV90eXBlKG9yaWdpbmFsX2RlZmF1bHQsIGhhbmRsZWRfdHlwZXMpCisgICAgICAgIGlmIG9yaWdpbmFsX3R5cGU6CisgICAgICAgICAgICAjIFdlIGhhbmRsZSBvbmx5IGFzdHJvaWQgdHlwZXMgdGhhdCBhcmUgaW5zaWRlIHRoZSBkaWN0IGFzdHJvaWRfdHlwZV9jb21wYXJlZF9hdHRyCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdmVycmlkZGVuX2RlZmF1bHQsIG9yaWdpbmFsX3R5cGUpOgorICAgICAgICAgICAgICAgICMgVHdvIGFyZ3Mgd2l0aCBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCB0eXBlcworICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBpZiBub3QgX2NoZWNrX2FyZ19lcXVhbGl0eSgKKyAgICAgICAgICAgICAgICBvcmlnaW5hbF9kZWZhdWx0LAorICAgICAgICAgICAgICAgIG92ZXJyaWRkZW5fZGVmYXVsdCwKKyAgICAgICAgICAgICAgICBhc3Ryb2lkX3R5cGVfY29tcGFyZWRfYXR0cltvcmlnaW5hbF90eXBlXSwKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyBUd28gYXJncyB3aXRoIHNhbWUgdHlwZSBidXQgZGlmZmVyZW50IHZhbHVlcworICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9oYXNfZGlmZmVyZW50X3BhcmFtZXRlcnMoCisgICAgb3JpZ2luYWw6IExpc3RbYXN0cm9pZC5Bc3NpZ25OYW1lXSwKKyAgICBvdmVycmlkZGVuOiBMaXN0W2FzdHJvaWQuQXNzaWduTmFtZV0sCisgICAgZHVtbXlfcGFyYW1ldGVyX3JlZ2V4OiBQYXR0ZXJuLAorKSAtPiBMaXN0W3N0cl06CisgICAgcmVzdWx0ID0gW10KKyAgICB6aXBwZWQgPSB6aXBfbG9uZ2VzdChvcmlnaW5hbCwgb3ZlcnJpZGRlbikKKyAgICBmb3Igb3JpZ2luYWxfcGFyYW0sIG92ZXJyaWRkZW5fcGFyYW0gaW4gemlwcGVkOgorICAgICAgICBwYXJhbXMgPSAob3JpZ2luYWxfcGFyYW0sIG92ZXJyaWRkZW5fcGFyYW0pCisgICAgICAgIGlmIG5vdCBhbGwocGFyYW1zKToKKyAgICAgICAgICAgIHJldHVybiBbIk51bWJlciBvZiBwYXJhbWV0ZXJzICJdCisKKyAgICAgICAgIyBjaGVjayBmb3IgdGhlIGFyZ3VtZW50cycgbmFtZQorICAgICAgICBuYW1lcyA9IFtwYXJhbS5uYW1lIGZvciBwYXJhbSBpbiBwYXJhbXNdCisgICAgICAgIGlmIGFueShkdW1teV9wYXJhbWV0ZXJfcmVnZXgubWF0Y2gobmFtZSkgZm9yIG5hbWUgaW4gbmFtZXMpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgb3JpZ2luYWxfcGFyYW0ubmFtZSAhPSBvdmVycmlkZGVuX3BhcmFtLm5hbWU6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgICAgIGYiUGFyYW1ldGVyICd7b3JpZ2luYWxfcGFyYW0ubmFtZX0nIGhhcyBiZWVuIHJlbmFtZWQgIgorICAgICAgICAgICAgICAgIGYidG8gJ3tvdmVycmlkZGVuX3BhcmFtLm5hbWV9JyBpbiIKKyAgICAgICAgICAgICkKKworICAgIHJldHVybiByZXN1bHQKKworCitkZWYgX2RpZmZlcmVudF9wYXJhbWV0ZXJzKAorICAgIG9yaWdpbmFsOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmLAorICAgIG92ZXJyaWRkZW46IGFzdHJvaWQuRnVuY3Rpb25EZWYsCisgICAgZHVtbXlfcGFyYW1ldGVyX3JlZ2V4OiBQYXR0ZXJuLAorKSAtPiBMaXN0W3N0cl06CisgICAgIiIiRGV0ZXJtaW5lIGlmIHRoZSB0d28gbWV0aG9kcyBoYXZlIGRpZmZlcmVudCBwYXJhbWV0ZXJzCisKKyAgICBUaGV5IGFyZSBjb25zaWRlcmVkIHRvIGhhdmUgZGlmZmVyZW50IHBhcmFtZXRlcnMgaWY6CisKKyAgICAgICAqIHRoZXkgaGF2ZSBkaWZmZXJlbnQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgZGlmZmVyZW50IG5hbWVzCisKKyAgICAgICAqIG9uZSBvZiB0aGUgbWV0aG9kcyBpcyBoYXZpbmcgdmFyaWFkaWNzLCB3aGlsZSB0aGUgb3RoZXIgaXMgbm90CisKKyAgICAgICAqIHRoZXkgaGF2ZSBkaWZmZXJlbnQga2V5d29yZCBvbmx5IHBhcmFtZXRlcnMuCisKKyAgICAiIiIKKyAgICBvdXRwdXRfbWVzc2FnZXMgPSBbXQorICAgIG9yaWdpbmFsX3BhcmFtZXRlcnMgPSBfcG9zaXRpb25hbF9wYXJhbWV0ZXJzKG9yaWdpbmFsKQorICAgIG92ZXJyaWRkZW5fcGFyYW1ldGVycyA9IF9wb3NpdGlvbmFsX3BhcmFtZXRlcnMob3ZlcnJpZGRlbikKKworICAgICMgQ29weSBrd29ubHlhcmdzIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZmZlY3QgbGF0ZXIgZnVuY3Rpb24gbGludGluZworICAgIG9yaWdpbmFsX2t3b25seWFyZ3MgPSBvcmlnaW5hbC5hcmdzLmt3b25seWFyZ3MKKworICAgICMgQWxsb3cgcG9zaXRpb25hbC9rZXl3b3JkIHZhcmlhZGljIGluIG92ZXJyaWRkZW4gdG8gbWF0Y2ggYWdhaW5zdCBhbnkKKyAgICAjIHBvc2l0aW9uYWwva2V5d29yZCBhcmd1bWVudCBpbiBvcmlnaW5hbC4KKyAgICAjIEtlZXAgYW55IGFyZ3VtZW50cyB0aGF0IGFyZSBmb3VuZCBzZXBlcmF0ZWx5IGluIG92ZXJyaWRkZW4gdG8gc2F0aXNmeQorICAgICMgbGF0ZXIgdGVzdHMKKyAgICBpZiBvdmVycmlkZGVuLmFyZ3MudmFyYXJnOgorICAgICAgICBvdmVyaWRkZW5fbmFtZXMgPSBbdi5uYW1lIGZvciB2IGluIG92ZXJyaWRkZW5fcGFyYW1ldGVyc10KKyAgICAgICAgb3JpZ2luYWxfcGFyYW1ldGVycyA9IFsKKyAgICAgICAgICAgIHYgZm9yIHYgaW4gb3JpZ2luYWxfcGFyYW1ldGVycyBpZiB2Lm5hbWUgaW4gb3ZlcmlkZGVuX25hbWVzCisgICAgICAgIF0KKworICAgIGlmIG92ZXJyaWRkZW4uYXJncy5rd2FyZzoKKyAgICAgICAgb3ZlcmlkZGVuX25hbWVzID0gW3YubmFtZSBmb3IgdiBpbiBvdmVycmlkZGVuLmFyZ3Mua3dvbmx5YXJnc10KKyAgICAgICAgb3JpZ2luYWxfa3dvbmx5YXJncyA9IFsKKyAgICAgICAgICAgIHYgZm9yIHYgaW4gb3JpZ2luYWwuYXJncy5rd29ubHlhcmdzIGlmIHYubmFtZSBpbiBvdmVyaWRkZW5fbmFtZXMKKyAgICAgICAgXQorCisgICAgZGlmZmVyZW50X3Bvc2l0aW9uYWwgPSBfaGFzX2RpZmZlcmVudF9wYXJhbWV0ZXJzKAorICAgICAgICBvcmlnaW5hbF9wYXJhbWV0ZXJzLCBvdmVycmlkZGVuX3BhcmFtZXRlcnMsIGR1bW15X3BhcmFtZXRlcl9yZWdleAorICAgICkKKyAgICBkaWZmZXJlbnRfa3dvbmx5ID0gX2hhc19kaWZmZXJlbnRfcGFyYW1ldGVycygKKyAgICAgICAgb3JpZ2luYWxfa3dvbmx5YXJncywgb3ZlcnJpZGRlbi5hcmdzLmt3b25seWFyZ3MsIGR1bW15X3BhcmFtZXRlcl9yZWdleAorICAgICkKKyAgICBpZiBkaWZmZXJlbnRfa3dvbmx5IGFuZCBkaWZmZXJlbnRfcG9zaXRpb25hbDoKKyAgICAgICAgaWYgIk51bWJlciAiIGluIGRpZmZlcmVudF9wb3NpdGlvbmFsWzBdIGFuZCAiTnVtYmVyICIgaW4gZGlmZmVyZW50X2t3b25seVswXToKKyAgICAgICAgICAgIG91dHB1dF9tZXNzYWdlcy5hcHBlbmQoIk51bWJlciBvZiBwYXJhbWV0ZXJzICIpCisgICAgICAgICAgICBvdXRwdXRfbWVzc2FnZXMgKz0gZGlmZmVyZW50X3Bvc2l0aW9uYWxbMTpdCisgICAgICAgICAgICBvdXRwdXRfbWVzc2FnZXMgKz0gZGlmZmVyZW50X2t3b25seVsxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dF9tZXNzYWdlcyArPSBkaWZmZXJlbnRfcG9zaXRpb25hbAorICAgICAgICAgICAgb3V0cHV0X21lc3NhZ2VzICs9IGRpZmZlcmVudF9rd29ubHkKKyAgICBlbHNlOgorICAgICAgICBpZiBkaWZmZXJlbnRfcG9zaXRpb25hbDoKKyAgICAgICAgICAgIG91dHB1dF9tZXNzYWdlcyArPSBkaWZmZXJlbnRfcG9zaXRpb25hbAorICAgICAgICBpZiBkaWZmZXJlbnRfa3dvbmx5OgorICAgICAgICAgICAgb3V0cHV0X21lc3NhZ2VzICs9IGRpZmZlcmVudF9rd29ubHkKKworICAgIGlmIG9yaWdpbmFsLm5hbWUgaW4gUFlNRVRIT0RTOgorICAgICAgICAjIElnbm9yZSB0aGUgZGlmZmVyZW5jZSBmb3Igc3BlY2lhbCBtZXRob2RzLiBJZiB0aGUgcGFyYW1ldGVyCisgICAgICAgICMgbnVtYmVycyBhcmUgZGlmZmVyZW50LCB0aGVuIHRoYXQgaXMgZ29pbmcgdG8gYmUgY2F1Z2h0IGJ5CisgICAgICAgICMgdW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmUuCisgICAgICAgICMgSWYgdGhlIG5hbWVzIGFyZSBkaWZmZXJlbnQsIGl0IGRvZXNuJ3QgbWF0dGVyLCBzaW5jZSB0aGV5IGNhbid0CisgICAgICAgICMgYmUgdXNlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cyBhbnl3YXkuCisgICAgICAgIG91dHB1dF9tZXNzYWdlcy5jbGVhcigpCisKKyAgICAjIEFyZ3VtZW50cyB3aWxsIG9ubHkgdmlvbGF0ZSBMU1AgaWYgdGhlcmUgYXJlIHZhcmlhZGljcyBpbiB0aGUgb3JpZ2luYWwKKyAgICAjIHRoYXQgYXJlIHRoZW4gcmVtb3ZlZCBmcm9tIHRoZSBvdmVycmlkZGVuCisgICAga3dhcmdfbG9zdCA9IG9yaWdpbmFsLmFyZ3Mua3dhcmcgYW5kIG5vdCBvdmVycmlkZGVuLmFyZ3Mua3dhcmcKKyAgICB2YXJhcmdfbG9zdCA9IG9yaWdpbmFsLmFyZ3MudmFyYXJnIGFuZCBub3Qgb3ZlcnJpZGRlbi5hcmdzLnZhcmFyZworCisgICAgaWYga3dhcmdfbG9zdCBvciB2YXJhcmdfbG9zdDoKKyAgICAgICAgb3V0cHV0X21lc3NhZ2VzICs9IFsiVmFyaWFkaWNzIHJlbW92ZWQgaW4iXQorCisgICAgcmV0dXJuIG91dHB1dF9tZXNzYWdlcworCisKK2RlZiBfaXNfaW52YWxpZF9iYXNlX2NsYXNzKGNscyk6CisgICAgcmV0dXJuIGNscy5uYW1lIGluIElOVkFMSURfQkFTRV9DTEFTU0VTIGFuZCBpc19idWlsdGluX29iamVjdChjbHMpCisKKworZGVmIF9oYXNfZGF0YV9kZXNjcmlwdG9yKGNscywgYXR0cik6CisgICAgYXR0cmlidXRlcyA9IGNscy5nZXRhdHRyKGF0dHIpCisgICAgZm9yIGF0dHJpYnV0ZSBpbiBhdHRyaWJ1dGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaW5mZXJyZWQgaW4gYXR0cmlidXRlLmluZmVyKCk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5JbnN0YW5jZSk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVkLmdldGF0dHIoIl9fZ2V0X18iKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWQuZ2V0YXR0cigiX19zZXRfXyIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAjIENhbid0IGluZmVyLCBhdm9pZCBlbWl0dGluZyBhIGZhbHNlIHBvc2l0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9jYWxsZWRfaW5fbWV0aG9kcyhmdW5jLCBrbGFzcywgbWV0aG9kcyk6CisgICAgIiIiQ2hlY2sgaWYgdGhlIGZ1bmMgd2FzIGNhbGxlZCBpbiBhbnkgb2YgdGhlIGdpdmVuIG1ldGhvZHMsCisgICAgYmVsb25naW5nIHRvIHRoZSAqa2xhc3MqLiBSZXR1cm5zIFRydWUgaWYgc28sIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZm9yIG1ldGhvZCBpbiBtZXRob2RzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmZlcnJlZCA9IGtsYXNzLmdldGF0dHIobWV0aG9kKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIGluZmVyX21ldGhvZCBpbiBpbmZlcnJlZDoKKyAgICAgICAgICAgIGZvciBjYWxsIGluIGluZmVyX21ldGhvZC5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBuZXh0KGNhbGwuZnVuYy5pbmZlcigpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoYXN0cm9pZC5JbmZlcmVuY2VFcnJvciwgU3RvcEl0ZXJhdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYm91bmQsIGFzdHJvaWQuQm91bmRNZXRob2QpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZ1bmNfb2JqID0gYm91bmQuX3Byb3hpZWQKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZ1bmNfb2JqLCBhc3Ryb2lkLlVuYm91bmRNZXRob2QpOgorICAgICAgICAgICAgICAgICAgICBmdW5jX29iaiA9IGZ1bmNfb2JqLl9wcm94aWVkCisgICAgICAgICAgICAgICAgaWYgZnVuY19vYmoubmFtZSA9PSBmdW5jLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9pc19hdHRyaWJ1dGVfcHJvcGVydHkobmFtZSwga2xhc3MpOgorICAgICIiIkNoZWNrIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgKm5hbWUqIGlzIGEgcHJvcGVydHkgaW4gdGhlIGdpdmVuICprbGFzcyouCisKKyAgICBJdCB3aWxsIGxvb2sgZm9yIGBwcm9wZXJ0eWAgY2FsbHMgb3IgZm9yIGZ1bmN0aW9ucworICAgIHdpdGggdGhlIGdpdmVuIG5hbWUsIGRlY29yYXRlZCBieSBgcHJvcGVydHlgIG9yIGBwcm9wZXJ0eWAKKyAgICBzdWJjbGFzc2VzLgorICAgIFJldHVybnMgYGBUcnVlYGAgaWYgdGhlIG5hbWUgaXMgYSBwcm9wZXJ0eSBpbiB0aGUgZ2l2ZW4ga2xhc3MsCisgICAgYGBGYWxzZWBgIG90aGVyd2lzZS4KKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgICAgYXR0cmlidXRlcyA9IGtsYXNzLmdldGF0dHIobmFtZSkKKyAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBwcm9wZXJ0eV9uYW1lID0gZiJ7YXN0cm9pZC5iYXNlcy5CVUlMVElOU30ucHJvcGVydHkiCisgICAgZm9yIGF0dHIgaW4gYXR0cmlidXRlczoKKyAgICAgICAgaWYgYXR0ciBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5mZXJyZWQgPSBuZXh0KGF0dHIuaW5mZXIoKSkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSBhbmQgZGVjb3JhdGVkX3dpdGhfcHJvcGVydHkoCisgICAgICAgICAgICBpbmZlcnJlZAorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgaW5mZXJyZWQucHl0eXBlKCkgIT0gcHJvcGVydHlfbmFtZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgY2xzID0gbm9kZV9mcmFtZV9jbGFzcyhpbmZlcnJlZCkKKyAgICAgICAgaWYgY2xzID09IGtsYXNzLmRlY2xhcmVkX21ldGFjbGFzcygpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgX2hhc19iYXJlX3N1cGVyX2NhbGwoZnVuZGVmX25vZGUpOgorICAgIGZvciBjYWxsIGluIGZ1bmRlZl9ub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQ2FsbCk6CisgICAgICAgIGZ1bmMgPSBjYWxsLmZ1bmMKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmdW5jLCBhc3Ryb2lkLk5hbWUpIGFuZCBmdW5jLm5hbWUgPT0gInN1cGVyIiBhbmQgbm90IGNhbGwuYXJnczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9zYWZlX2luZmVyX2NhbGxfcmVzdWx0KG5vZGUsIGNhbGxlciwgY29udGV4dD1Ob25lKToKKyAgICAiIiIKKyAgICBTYWZlbHkgaW5mZXIgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uLgorCisgICAgUmV0dXJucyBOb25lIGlmIGluZmVyZW5jZSBmYWlsZWQgb3IgaWYgdGhlcmUgaXMgc29tZSBhbWJpZ3VpdHkgKG1vcmUgdGhhbgorICAgIG9uZSBub2RlIGhhcyBiZWVuIGluZmVycmVkKS4gT3RoZXJ3aXNlIHJldHVybnMgaW5mZXJyZWQgdmFsdWUuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbmZlcml0ID0gbm9kZS5pbmZlcl9jYWxsX3Jlc3VsdChjYWxsZXIsIGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgdmFsdWUgPSBuZXh0KGluZmVyaXQpCisgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lICAjIGluZmVyZW5jZSBmYWlsZWQKKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIE5vbmUgICMgbm8gdmFsdWVzIGluZmVycmVkCisgICAgdHJ5OgorICAgICAgICBuZXh0KGluZmVyaXQpCisgICAgICAgIHJldHVybiBOb25lICAjIHRoZXJlIGlzIGFtYmlndWl0eSBvbiB0aGUgaW5mZXJyZWQgbm9kZQorICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZSAgIyB0aGVyZSBpcyBzb21lIGtpbmQgb2YgYW1iaWd1aXR5CisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHJldHVybiB2YWx1ZQorCisKK2RlZiBfaGFzX3NhbWVfbGF5b3V0X3Nsb3RzKHNsb3RzLCBhc3NpZ25lZF92YWx1ZSk6CisgICAgaW5mZXJyZWQgPSBuZXh0KGFzc2lnbmVkX3ZhbHVlLmluZmVyKCkpCisgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgIG90aGVyX3Nsb3RzID0gaW5mZXJyZWQuc2xvdHMoKQorICAgICAgICBpZiBhbGwoCisgICAgICAgICAgICBmaXJzdF9zbG90IGFuZCBzZWNvbmRfc2xvdCBhbmQgZmlyc3Rfc2xvdC52YWx1ZSA9PSBzZWNvbmRfc2xvdC52YWx1ZQorICAgICAgICAgICAgZm9yIChmaXJzdF9zbG90LCBzZWNvbmRfc2xvdCkgaW4gemlwX2xvbmdlc3Qoc2xvdHMsIG90aGVyX3Nsb3RzKQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitNU0dTID0geyAgIyBweWxpbnQ6IGRpc2FibGU9Y29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3MKKyAgICAiRjAyMDIiOiAoCisgICAgICAgICJVbmFibGUgdG8gY2hlY2sgbWV0aG9kcyBzaWduYXR1cmUgKCVzIC8gJXMpIiwKKyAgICAgICAgIm1ldGhvZC1jaGVjay1mYWlsZWQiLAorICAgICAgICAiVXNlZCB3aGVuIFB5bGludCBoYXMgYmVlbiB1bmFibGUgdG8gY2hlY2sgbWV0aG9kcyBzaWduYXR1cmUgIgorICAgICAgICAiY29tcGF0aWJpbGl0eSBmb3IgYW4gdW5leHBlY3RlZCByZWFzb24uIFBsZWFzZSByZXBvcnQgdGhpcyBraW5kICIKKyAgICAgICAgImlmIHlvdSBkb24ndCBtYWtlIHNlbnNlIG9mIGl0LiIsCisgICAgKSwKKyAgICAiRTAyMDIiOiAoCisgICAgICAgICJBbiBhdHRyaWJ1dGUgZGVmaW5lZCBpbiAlcyBsaW5lICVzIGhpZGVzIHRoaXMgbWV0aG9kIiwKKyAgICAgICAgIm1ldGhvZC1oaWRkZW4iLAorICAgICAgICAiVXNlZCB3aGVuIGEgY2xhc3MgZGVmaW5lcyBhIG1ldGhvZCB3aGljaCBpcyBoaWRkZW4gYnkgYW4gIgorICAgICAgICAiaW5zdGFuY2UgYXR0cmlidXRlIGZyb20gYW4gYW5jZXN0b3IgY2xhc3Mgb3Igc2V0IGJ5IHNvbWUgIgorICAgICAgICAiY2xpZW50IGNvZGUuIiwKKyAgICApLAorICAgICJFMDIwMyI6ICgKKyAgICAgICAgIkFjY2VzcyB0byBtZW1iZXIgJXIgYmVmb3JlIGl0cyBkZWZpbml0aW9uIGxpbmUgJXMiLAorICAgICAgICAiYWNjZXNzLW1lbWJlci1iZWZvcmUtZGVmaW5pdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW5zdGFuY2UgbWVtYmVyIGlzIGFjY2Vzc2VkIGJlZm9yZSBpdCdzIGFjdHVhbGx5IGFzc2lnbmVkLiIsCisgICAgKSwKKyAgICAiVzAyMDEiOiAoCisgICAgICAgICJBdHRyaWJ1dGUgJXIgZGVmaW5lZCBvdXRzaWRlIF9faW5pdF9fIiwKKyAgICAgICAgImF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW5zdGFuY2UgYXR0cmlidXRlIGlzIGRlZmluZWQgb3V0c2lkZSB0aGUgX19pbml0X18gbWV0aG9kLiIsCisgICAgKSwKKyAgICAiVzAyMTIiOiAoCisgICAgICAgICJBY2Nlc3MgdG8gYSBwcm90ZWN0ZWQgbWVtYmVyICVzIG9mIGEgY2xpZW50IGNsYXNzIiwgICMgRTAyMTQKKyAgICAgICAgInByb3RlY3RlZC1hY2Nlc3MiLAorICAgICAgICAiVXNlZCB3aGVuIGEgcHJvdGVjdGVkIG1lbWJlciAoaS5lLiBjbGFzcyBtZW1iZXIgd2l0aCBhIG5hbWUgIgorICAgICAgICAiYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZSkgaXMgYWNjZXNzIG91dHNpZGUgdGhlIGNsYXNzIG9yIGEgIgorICAgICAgICAiZGVzY2VuZGFudCBvZiB0aGUgY2xhc3Mgd2hlcmUgaXQncyBkZWZpbmVkLiIsCisgICAgKSwKKyAgICAiRTAyMTEiOiAoCisgICAgICAgICJNZXRob2QgaGFzIG5vIGFyZ3VtZW50IiwKKyAgICAgICAgIm5vLW1ldGhvZC1hcmd1bWVudCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBtZXRob2Qgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIGJvdW5kIGluc3RhbmNlIGFzICIKKyAgICAgICAgImZpcnN0IGFyZ3VtZW50IGhhcyBubyBhcmd1bWVudCBkZWZpbmVkLiIsCisgICAgKSwKKyAgICAiRTAyMTMiOiAoCisgICAgICAgICdNZXRob2Qgc2hvdWxkIGhhdmUgInNlbGYiIGFzIGZpcnN0IGFyZ3VtZW50JywKKyAgICAgICAgIm5vLXNlbGYtYXJndW1lbnQiLAorICAgICAgICAnVXNlZCB3aGVuIGEgbWV0aG9kIGhhcyBhbiBhdHRyaWJ1dGUgZGlmZmVyZW50IHRoZSAic2VsZiIgYXMgJworICAgICAgICAiZmlyc3QgYXJndW1lbnQuIFRoaXMgaXMgY29uc2lkZXJlZCBhcyBhbiBlcnJvciBzaW5jZSB0aGlzIGlzICIKKyAgICAgICAgImEgc28gY29tbW9uIGNvbnZlbnRpb24gdGhhdCB5b3Ugc2hvdWxkbid0IGJyZWFrIGl0ISIsCisgICAgKSwKKyAgICAiQzAyMDIiOiAoCisgICAgICAgICJDbGFzcyBtZXRob2QgJXMgc2hvdWxkIGhhdmUgJXMgYXMgZmlyc3QgYXJndW1lbnQiLAorICAgICAgICAiYmFkLWNsYXNzbWV0aG9kLWFyZ3VtZW50IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGNsYXNzIG1ldGhvZCBoYXMgYSBmaXJzdCBhcmd1bWVudCBuYW1lZCBkaWZmZXJlbnRseSAiCisgICAgICAgICJ0aGFuIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdmFsaWQtY2xhc3NtZXRob2QtZmlyc3QtYXJnIG9wdGlvbiAiCisgICAgICAgICcoZGVmYXVsdCB0byAiY2xzIiksIHJlY29tbWVuZGVkIHRvIGVhc2lseSBkaWZmZXJlbnRpYXRlIHRoZW0gJworICAgICAgICAiZnJvbSByZWd1bGFyIGluc3RhbmNlIG1ldGhvZHMuIiwKKyAgICApLAorICAgICJDMDIwMyI6ICgKKyAgICAgICAgIk1ldGFjbGFzcyBtZXRob2QgJXMgc2hvdWxkIGhhdmUgJXMgYXMgZmlyc3QgYXJndW1lbnQiLAorICAgICAgICAiYmFkLW1jcy1tZXRob2QtYXJndW1lbnQiLAorICAgICAgICAiVXNlZCB3aGVuIGEgbWV0YWNsYXNzIG1ldGhvZCBoYXMgYSBmaXJzdCBhcmd1bWVudCBuYW1lZCAiCisgICAgICAgICJkaWZmZXJlbnRseSB0aGFuIHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdmFsaWQtY2xhc3NtZXRob2QtZmlyc3QiCisgICAgICAgICctYXJnIG9wdGlvbiAoZGVmYXVsdCB0byAiY2xzIiksIHJlY29tbWVuZGVkIHRvIGVhc2lseSAnCisgICAgICAgICJkaWZmZXJlbnRpYXRlIHRoZW0gZnJvbSByZWd1bGFyIGluc3RhbmNlIG1ldGhvZHMuIiwKKyAgICApLAorICAgICJDMDIwNCI6ICgKKyAgICAgICAgIk1ldGFjbGFzcyBjbGFzcyBtZXRob2QgJXMgc2hvdWxkIGhhdmUgJXMgYXMgZmlyc3QgYXJndW1lbnQiLAorICAgICAgICAiYmFkLW1jcy1jbGFzc21ldGhvZC1hcmd1bWVudCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBtZXRhY2xhc3MgY2xhc3MgbWV0aG9kIGhhcyBhIGZpcnN0IGFyZ3VtZW50IG5hbWVkICIKKyAgICAgICAgImRpZmZlcmVudGx5IHRoYW4gdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB2YWxpZC1tZXRhY2xhc3MtIgorICAgICAgICAnY2xhc3NtZXRob2QtZmlyc3QtYXJnIG9wdGlvbiAoZGVmYXVsdCB0byAibWNzIiksIHJlY29tbWVuZGVkIHRvICcKKyAgICAgICAgImVhc2lseSBkaWZmZXJlbnRpYXRlIHRoZW0gZnJvbSByZWd1bGFyIGluc3RhbmNlIG1ldGhvZHMuIiwKKyAgICApLAorICAgICJXMDIxMSI6ICgKKyAgICAgICAgIlN0YXRpYyBtZXRob2Qgd2l0aCAlciBhcyBmaXJzdCBhcmd1bWVudCIsCisgICAgICAgICJiYWQtc3RhdGljbWV0aG9kLWFyZ3VtZW50IiwKKyAgICAgICAgJ1VzZWQgd2hlbiBhIHN0YXRpYyBtZXRob2QgaGFzICJzZWxmIiBvciBhIHZhbHVlIHNwZWNpZmllZCBpbiAnCisgICAgICAgICJ2YWxpZC1jbGFzc21ldGhvZC1maXJzdC1hcmcgb3B0aW9uIG9yICIKKyAgICAgICAgInZhbGlkLW1ldGFjbGFzcy1jbGFzc21ldGhvZC1maXJzdC1hcmcgb3B0aW9uIGFzIGZpcnN0IGFyZ3VtZW50LiIsCisgICAgKSwKKyAgICAiUjAyMDEiOiAoCisgICAgICAgICJNZXRob2QgY291bGQgYmUgYSBmdW5jdGlvbiIsCisgICAgICAgICJuby1zZWxmLXVzZSIsCisgICAgICAgICJVc2VkIHdoZW4gYSBtZXRob2QgZG9lc24ndCB1c2UgaXRzIGJvdW5kIGluc3RhbmNlLCBhbmQgc28gY291bGQgIgorICAgICAgICAiYmUgd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLiIsCisgICAgKSwKKyAgICAiVzAyMjEiOiAoCisgICAgICAgICIlcyAlcyAlciBtZXRob2QiLAorICAgICAgICAiYXJndW1lbnRzLWRpZmZlciIsCisgICAgICAgICJVc2VkIHdoZW4gYSBtZXRob2QgaGFzIGEgZGlmZmVyZW50IG51bWJlciBvZiBhcmd1bWVudHMgdGhhbiBpbiAiCisgICAgICAgICJ0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIG9yIGluIGFuIG92ZXJyaWRkZW4gbWV0aG9kLiIsCisgICAgKSwKKyAgICAiVzAyMjIiOiAoCisgICAgICAgICJTaWduYXR1cmUgZGlmZmVycyBmcm9tICVzICVyIG1ldGhvZCIsCisgICAgICAgICJzaWduYXR1cmUtZGlmZmVycyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBtZXRob2Qgc2lnbmF0dXJlIGlzIGRpZmZlcmVudCB0aGFuIGluIHRoZSAiCisgICAgICAgICJpbXBsZW1lbnRlZCBpbnRlcmZhY2Ugb3IgaW4gYW4gb3ZlcnJpZGRlbiBtZXRob2QuIiwKKyAgICApLAorICAgICJXMDIyMyI6ICgKKyAgICAgICAgIk1ldGhvZCAlciBpcyBhYnN0cmFjdCBpbiBjbGFzcyAlciBidXQgaXMgbm90IG92ZXJyaWRkZW4iLAorICAgICAgICAiYWJzdHJhY3QtbWV0aG9kIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBhYnN0cmFjdCBtZXRob2QgKGkuZS4gcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcikgaXMgIgorICAgICAgICAibm90IG92ZXJyaWRkZW4gaW4gY29uY3JldGUgY2xhc3MuIiwKKyAgICApLAorICAgICJXMDIzMSI6ICgKKyAgICAgICAgIl9faW5pdF9fIG1ldGhvZCBmcm9tIGJhc2UgY2xhc3MgJXIgaXMgbm90IGNhbGxlZCIsCisgICAgICAgICJzdXBlci1pbml0LW5vdC1jYWxsZWQiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGFuY2VzdG9yIGNsYXNzIG1ldGhvZCBoYXMgYW4gX19pbml0X18gbWV0aG9kICIKKyAgICAgICAgIndoaWNoIGlzIG5vdCBjYWxsZWQgYnkgYSBkZXJpdmVkIGNsYXNzLiIsCisgICAgKSwKKyAgICAiVzAyMzIiOiAoCisgICAgICAgICJDbGFzcyBoYXMgbm8gX19pbml0X18gbWV0aG9kIiwKKyAgICAgICAgIm5vLWluaXQiLAorICAgICAgICAiVXNlZCB3aGVuIGEgY2xhc3MgaGFzIG5vIF9faW5pdF9fIG1ldGhvZCwgbmVpdGhlciBpdHMgcGFyZW50IGNsYXNzZXMuIiwKKyAgICApLAorICAgICJXMDIzMyI6ICgKKyAgICAgICAgIl9faW5pdF9fIG1ldGhvZCBmcm9tIGEgbm9uIGRpcmVjdCBiYXNlIGNsYXNzICVyIGlzIGNhbGxlZCIsCisgICAgICAgICJub24tcGFyZW50LWluaXQtY2FsbGVkIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBfX2luaXRfXyBtZXRob2QgaXMgY2FsbGVkIG9uIGEgY2xhc3Mgd2hpY2ggaXMgbm90ICIKKyAgICAgICAgImluIHRoZSBkaXJlY3QgYW5jZXN0b3JzIGZvciB0aGUgYW5hbHlzZWQgY2xhc3MuIiwKKyAgICApLAorICAgICJXMDIzNSI6ICgKKyAgICAgICAgIlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJXIiLAorICAgICAgICAidXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uIiwKKyAgICAgICAgIlVzZWQgd2hlbmV2ZXIgd2UgY2FuIGRldGVjdCB0aGF0IGFuIG92ZXJyaWRkZW4gbWV0aG9kIGlzIHVzZWxlc3MsICIKKyAgICAgICAgInJlbHlpbmcgb24gc3VwZXIoKSBkZWxlZ2F0aW9uIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGFub3RoZXIgbWV0aG9kICIKKyAgICAgICAgImZyb20gdGhlIE1STy4iLAorICAgICksCisgICAgIlcwMjM2IjogKAorICAgICAgICAiTWV0aG9kICVyIHdhcyBleHBlY3RlZCB0byBiZSAlciwgZm91bmQgaXQgaW5zdGVhZCBhcyAlciIsCisgICAgICAgICJpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kIiwKKyAgICAgICAgIlVzZWQgd2hlbiB3ZSBkZXRlY3QgdGhhdCBhIG1ldGhvZCB3YXMgb3ZlcnJpZGRlbiBpbiBhIHdheSAiCisgICAgICAgICJ0aGF0IGRvZXMgbm90IG1hdGNoIGl0cyBiYXNlIGNsYXNzICIKKyAgICAgICAgIndoaWNoIGNvdWxkIHJlc3VsdCBpbiBwb3RlbnRpYWwgYnVncyBhdCBydW50aW1lLiIsCisgICAgKSwKKyAgICAiVzAyMzciOiAoCisgICAgICAgICIlcyAlcyAlciBtZXRob2QiLAorICAgICAgICAiYXJndW1lbnRzLXJlbmFtZWQiLAorICAgICAgICAiVXNlZCB3aGVuIGEgbWV0aG9kIHBhcmFtZXRlciBoYXMgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIGluICIKKyAgICAgICAgInRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2Ugb3IgaW4gYW4gb3ZlcnJpZGRlbiBtZXRob2QuIiwKKyAgICApLAorICAgICJXMDIzOCI6ICgKKyAgICAgICAgIlVudXNlZCBwcml2YXRlIG1lbWJlciBgJXMuJXNgIiwKKyAgICAgICAgInVudXNlZC1wcml2YXRlLW1lbWJlciIsCisgICAgICAgICJFbWl0dGVkIHdoZW4gYSBwcml2YXRlIG1lbWJlciBvZiBhIGNsYXNzIGlzIGRlZmluZWQgYnV0IG5vdCB1c2VkLiIsCisgICAgKSwKKyAgICAiRTAyMzYiOiAoCisgICAgICAgICJJbnZhbGlkIG9iamVjdCAlciBpbiBfX3Nsb3RzX18sIG11c3QgY29udGFpbiBvbmx5IG5vbiBlbXB0eSBzdHJpbmdzIiwKKyAgICAgICAgImludmFsaWQtc2xvdHMtb2JqZWN0IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBpbnZhbGlkIChub24tc3RyaW5nKSBvYmplY3Qgb2NjdXJzIGluIF9fc2xvdHNfXy4iLAorICAgICksCisgICAgIkUwMjM3IjogKAorICAgICAgICAiQXNzaWduaW5nIHRvIGF0dHJpYnV0ZSAlciBub3QgZGVmaW5lZCBpbiBjbGFzcyBzbG90cyIsCisgICAgICAgICJhc3NpZ25pbmctbm9uLXNsb3QiLAorICAgICAgICAiVXNlZCB3aGVuIGFzc2lnbmluZyB0byBhbiBhdHRyaWJ1dGUgbm90IGRlZmluZWQgaW4gdGhlIGNsYXNzIHNsb3RzLiIsCisgICAgKSwKKyAgICAiRTAyMzgiOiAoCisgICAgICAgICJJbnZhbGlkIF9fc2xvdHNfXyBvYmplY3QiLAorICAgICAgICAiaW52YWxpZC1zbG90cyIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW52YWxpZCBfX3Nsb3RzX18gaXMgZm91bmQgaW4gY2xhc3MuICIKKyAgICAgICAgIk9ubHkgYSBzdHJpbmcsIGFuIGl0ZXJhYmxlIG9yIGEgc2VxdWVuY2UgaXMgcGVybWl0dGVkLiIsCisgICAgKSwKKyAgICAiRTAyMzkiOiAoCisgICAgICAgICJJbmhlcml0aW5nICVyLCB3aGljaCBpcyBub3QgYSBjbGFzcy4iLAorICAgICAgICAiaW5oZXJpdC1ub24tY2xhc3MiLAorICAgICAgICAiVXNlZCB3aGVuIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgY2xhc3MuIiwKKyAgICApLAorICAgICJFMDI0MCI6ICgKKyAgICAgICAgIkluY29uc2lzdGVudCBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBmb3IgY2xhc3MgJXIiLAorICAgICAgICAiaW5jb25zaXN0ZW50LW1ybyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBjbGFzcyBoYXMgYW4gaW5jb25zaXN0ZW50IG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyLiIsCisgICAgKSwKKyAgICAiRTAyNDEiOiAoCisgICAgICAgICJEdXBsaWNhdGUgYmFzZXMgZm9yIGNsYXNzICVyIiwKKyAgICAgICAgImR1cGxpY2F0ZS1iYXNlcyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBjbGFzcyBoYXMgZHVwbGljYXRlIGJhc2VzLiIsCisgICAgKSwKKyAgICAiRTAyNDIiOiAoCisgICAgICAgICJWYWx1ZSAlciBpbiBzbG90cyBjb25mbGljdHMgd2l0aCBjbGFzcyB2YXJpYWJsZSIsCisgICAgICAgICJjbGFzcy12YXJpYWJsZS1zbG90cy1jb25mbGljdCIsCisgICAgICAgICJVc2VkIHdoZW4gYSB2YWx1ZSBpbiBfX3Nsb3RzX18gY29uZmxpY3RzIHdpdGggYSBjbGFzcyB2YXJpYWJsZSwgcHJvcGVydHkgb3IgbWV0aG9kLiIsCisgICAgKSwKKyAgICAiRTAyNDMiOiAoCisgICAgICAgICJJbnZhbGlkIF9fY2xhc3NfXyBvYmplY3QiLAorICAgICAgICAiaW52YWxpZC1jbGFzcy1vYmplY3QiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGludmFsaWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGEgX19jbGFzc19fIHByb3BlcnR5LiAiCisgICAgICAgICJPbmx5IGEgY2xhc3MgaXMgcGVybWl0dGVkLiIsCisgICAgKSwKKyAgICAiUjAyMDIiOiAoCisgICAgICAgICJDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgY2xhc3NtZXRob2QiLAorICAgICAgICAibm8tY2xhc3NtZXRob2QtZGVjb3JhdG9yIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGNsYXNzIG1ldGhvZCBpcyBkZWZpbmVkIHdpdGhvdXQgdXNpbmcgdGhlIGRlY29yYXRvciBzeW50YXguIiwKKyAgICApLAorICAgICJSMDIwMyI6ICgKKyAgICAgICAgIkNvbnNpZGVyIHVzaW5nIGEgZGVjb3JhdG9yIGluc3RlYWQgb2YgY2FsbGluZyBzdGF0aWNtZXRob2QiLAorICAgICAgICAibm8tc3RhdGljbWV0aG9kLWRlY29yYXRvciIsCisgICAgICAgICJVc2VkIHdoZW4gYSBzdGF0aWMgbWV0aG9kIGlzIGRlZmluZWQgd2l0aG91dCB1c2luZyB0aGUgZGVjb3JhdG9yIHN5bnRheC4iLAorICAgICksCisgICAgIkMwMjA1IjogKAorICAgICAgICAiQ2xhc3MgX19zbG90c19fIHNob3VsZCBiZSBhIG5vbi1zdHJpbmcgaXRlcmFibGUiLAorICAgICAgICAic2luZ2xlLXN0cmluZy11c2VkLWZvci1zbG90cyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBjbGFzcyBfX3Nsb3RzX18gaXMgYSBzaW1wbGUgc3RyaW5nLCByYXRoZXIgdGhhbiBhbiBpdGVyYWJsZS4iLAorICAgICksCisgICAgIlIwMjA1IjogKAorICAgICAgICAiQ2xhc3MgJXIgaW5oZXJpdHMgZnJvbSBvYmplY3QsIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCBmcm9tIGJhc2VzIGluIHB5dGhvbjMiLAorICAgICAgICAidXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UiLAorICAgICAgICAiVXNlZCB3aGVuIGEgY2xhc3MgaW5oZXJpdCBmcm9tIG9iamVjdCwgd2hpY2ggdW5kZXIgcHl0aG9uMyBpcyBpbXBsaWNpdCwgIgorICAgICAgICAiaGVuY2UgY2FuIGJlIHNhZmVseSByZW1vdmVkIGZyb20gYmFzZXMuIiwKKyAgICApLAorICAgICJSMDIwNiI6ICgKKyAgICAgICAgIkNhbm5vdCBoYXZlIGRlZmluZWQgcGFyYW1ldGVycyBmb3IgcHJvcGVydGllcyIsCisgICAgICAgICJwcm9wZXJ0eS13aXRoLXBhcmFtZXRlcnMiLAorICAgICAgICAiVXNlZCB3aGVuIHdlIGRldGVjdCB0aGF0IGEgcHJvcGVydHkgYWxzbyBoYXMgcGFyYW1ldGVycywgd2hpY2ggYXJlIHVzZWxlc3MsICIKKyAgICAgICAgImdpdmVuIHRoYXQgcHJvcGVydGllcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGggYWRkaXRpb25hbCBhcmd1bWVudHMuIiwKKyAgICApLAorfQorCisKK2RlZiBfc2NvcGVfZGVmYXVsdCgpOgorICAgIHJldHVybiBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorCisKK2NsYXNzIFNjb3BlQWNjZXNzTWFwOgorICAgICIiIlN0b3JlIHRoZSBhY2Nlc3NlZCB2YXJpYWJsZXMgcGVyIHNjb3BlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9zY29wZXMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChfc2NvcGVfZGVmYXVsdCkKKworICAgIGRlZiBzZXRfYWNjZXNzZWQoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlNldCB0aGUgZ2l2ZW4gbm9kZSBhcyBhY2Nlc3NlZC4iIiIKKworICAgICAgICBmcmFtZSA9IG5vZGVfZnJhbWVfY2xhc3Mobm9kZSkKKyAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgVGhlIG5vZGUgZG9lcyBub3QgbGl2ZSBpbiBhIGNsYXNzLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3Njb3Blc1tmcmFtZV1bbm9kZS5hdHRybmFtZV0uYXBwZW5kKG5vZGUpCisKKyAgICBkZWYgYWNjZXNzZWQoc2VsZiwgc2NvcGUpOgorICAgICAgICAiIiJHZXQgdGhlIGFjY2Vzc2VkIHZhcmlhYmxlcyBmb3IgdGhlIGdpdmVuIHNjb3BlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2NvcGVzLmdldChzY29wZSwge30pCisKKworY2xhc3MgQ2xhc3NDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAiIiJjaGVja3MgZm9yIDoKKyAgICAqIG1ldGhvZHMgd2l0aG91dCBzZWxmIGFzIGZpcnN0IGFyZ3VtZW50CisgICAgKiBvdmVycmlkZGVuIG1ldGhvZHMgc2lnbmF0dXJlCisgICAgKiBhY2Nlc3Mgb25seSB0byBleGlzdGVudCBtZW1iZXJzIHZpYSBzZWxmCisgICAgKiBhdHRyaWJ1dGVzIG5vdCBkZWZpbmVkIGluIHRoZSBfX2luaXRfXyBtZXRob2QKKyAgICAqIHVucmVhY2hhYmxlIGNvZGUKKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisKKyAgICAjIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lCisgICAgbmFtZSA9ICJjbGFzc2VzIgorICAgICMgbWVzc2FnZXMKKyAgICBtc2dzID0gTVNHUworICAgIHByaW9yaXR5ID0gLTIKKyAgICAjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJkZWZpbmluZy1hdHRyLW1ldGhvZHMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogKCJfX2luaXRfXyIsICJfX25ld19fIiwgInNldFVwIiwgIl9fcG9zdF9pbml0X18iKSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtZXRob2QgbmFtZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJMaXN0IG9mIG1ldGhvZCBuYW1lcyB1c2VkIHRvIGRlY2xhcmUgKGkuZS4gYXNzaWduKSBcCitpbnN0YW5jZSBhdHRyaWJ1dGVzLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAidmFsaWQtY2xhc3NtZXRob2QtZmlyc3QtYXJnIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgiY2xzIiwpLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGFyZ3VtZW50IG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiB2YWxpZCBuYW1lcyBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IGluIFwKK2EgY2xhc3MgbWV0aG9kLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAidmFsaWQtbWV0YWNsYXNzLWNsYXNzbWV0aG9kLWZpcnN0LWFyZyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoImNscyIsKSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxhcmd1bWVudCBuYW1lcz4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkxpc3Qgb2YgdmFsaWQgbmFtZXMgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCBpbiBcCithIG1ldGFjbGFzcyBjbGFzcyBtZXRob2QuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJleGNsdWRlLXByb3RlY3RlZCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoCisgICAgICAgICAgICAgICAgICAgICMgbmFtZWR0dXBsZSBwdWJsaWMgQVBJLgorICAgICAgICAgICAgICAgICAgICAiX2FzZGljdCIsCisgICAgICAgICAgICAgICAgICAgICJfZmllbGRzIiwKKyAgICAgICAgICAgICAgICAgICAgIl9yZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgIl9zb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAiX21ha2UiLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8cHJvdGVjdGVkIGFjY2VzcyBleGNsdXNpb25zPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICJMaXN0IG9mIG1lbWJlciBuYW1lcywgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkICIKKyAgICAgICAgICAgICAgICAgICAgImZyb20gdGhlIHByb3RlY3RlZCBhY2Nlc3Mgd2FybmluZy4iCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJjaGVjay1wcm90ZWN0ZWQtYWNjZXNzLWluLXNwZWNpYWwtbWV0aG9kcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHkgb3Igbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIldhcm4gYWJvdXQgcHJvdGVjdGVkIGF0dHJpYnV0ZSBhY2Nlc3MgaW5zaWRlIHNwZWNpYWwgbWV0aG9kcyIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXI9Tm9uZSk6CisgICAgICAgIEJhc2VDaGVja2VyLl9faW5pdF9fKHNlbGYsIGxpbnRlcikKKyAgICAgICAgc2VsZi5fYWNjZXNzZWQgPSBTY29wZUFjY2Vzc01hcCgpCisgICAgICAgIHNlbGYuX2ZpcnN0X2F0dHJzID0gW10KKyAgICAgICAgc2VsZi5fbWV0aF9jb3VsZF9iZV9mdW5jID0gTm9uZQorCisgICAgQGFzdHJvaWQuZGVjb3JhdG9ycy5jYWNoZWRwcm9wZXJ0eQorICAgIGRlZiBfZHVtbXlfcmd4KHNlbGYpOgorICAgICAgICByZXR1cm4gZ2V0X2dsb2JhbF9vcHRpb24oc2VsZiwgImR1bW15LXZhcmlhYmxlcy1yZ3giLCBkZWZhdWx0PU5vbmUpCisKKyAgICBAYXN0cm9pZC5kZWNvcmF0b3JzLmNhY2hlZHByb3BlcnR5CisgICAgZGVmIF9pZ25vcmVfbWl4aW4oc2VsZik6CisgICAgICAgIHJldHVybiBnZXRfZ2xvYmFsX29wdGlvbihzZWxmLCAiaWdub3JlLW1peGluLW1lbWJlcnMiLCBkZWZhdWx0PVRydWUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJhYnN0cmFjdC1tZXRob2QiLAorICAgICAgICAibm8taW5pdCIsCisgICAgICAgICJpbnZhbGlkLXNsb3RzIiwKKyAgICAgICAgInNpbmdsZS1zdHJpbmctdXNlZC1mb3Itc2xvdHMiLAorICAgICAgICAiaW52YWxpZC1zbG90cy1vYmplY3QiLAorICAgICAgICAiY2xhc3MtdmFyaWFibGUtc2xvdHMtY29uZmxpY3QiLAorICAgICAgICAiaW5oZXJpdC1ub24tY2xhc3MiLAorICAgICAgICAidXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UiLAorICAgICAgICAiaW5jb25zaXN0ZW50LW1ybyIsCisgICAgICAgICJkdXBsaWNhdGUtYmFzZXMiLAorICAgICkKKyAgICBkZWYgdmlzaXRfY2xhc3NkZWYoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImluaXQgdmlzaXQgdmFyaWFibGUgX2FjY2Vzc2VkIiIiCisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2VzX2NsYXNzZXMobm9kZSkKKyAgICAgICAgIyBpZiBub3QgYW4gZXhjZXB0aW9uIG9yIGEgbWV0YWNsYXNzCisgICAgICAgIGlmIG5vZGUudHlwZSA9PSAiY2xhc3MiIGFuZCBoYXNfa25vd25fYmFzZXMobm9kZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbm9kZS5sb2NhbF9hdHRyKCJfX2luaXRfXyIpCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5vLWluaXQiLCBhcmdzPW5vZGUsIG5vZGU9bm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc2xvdHMobm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcHJvcGVyX2Jhc2VzKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnNpc3RlbnRfbXJvKG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2NvbnNpc3RlbnRfbXJvKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJEZXRlY3QgdGhhdCBhIGNsYXNzIGhhcyBhIGNvbnNpc3RlbnQgbXJvIG9yIGR1cGxpY2F0ZSBiYXNlcy4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbm9kZS5tcm8oKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmNvbnNpc3RlbnRNcm9FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImluY29uc2lzdGVudC1tcm8iLCBhcmdzPW5vZGUubmFtZSwgbm9kZT1ub2RlKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5EdXBsaWNhdGVCYXNlc0Vycm9yOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZHVwbGljYXRlLWJhc2VzIiwgYXJncz1ub2RlLm5hbWUsIG5vZGU9bm9kZSkKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICAjIE9sZCBzdHlsZSBjbGFzcywgdGhlcmUncyBubyBtcm8gc28gZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX2NoZWNrX3Byb3Blcl9iYXNlcyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiCisgICAgICAgIERldGVjdCB0aGF0IGEgY2xhc3MgaW5oZXJpdHMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICAgICBhIGNsYXNzIG9yIGEgdHlwZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBiYXNlIGluIG5vZGUuYmFzZXM6CisgICAgICAgICAgICBhbmNlc3RvciA9IHNhZmVfaW5mZXIoYmFzZSkKKyAgICAgICAgICAgIGlmIG5vdCBhbmNlc3RvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhbmNlc3RvciwgYXN0cm9pZC5JbnN0YW5jZSkgYW5kIGFuY2VzdG9yLmlzX3N1YnR5cGVfb2YoCisgICAgICAgICAgICAgICAgZiJ7YXN0cm9pZC5iYXNlcy5CVUlMVElOU30udHlwZSIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYW5jZXN0b3IsIGFzdHJvaWQuQ2xhc3NEZWYpIG9yIF9pc19pbnZhbGlkX2Jhc2VfY2xhc3MoCisgICAgICAgICAgICAgICAgYW5jZXN0b3IKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW5oZXJpdC1ub24tY2xhc3MiLCBhcmdzPWJhc2UuYXNfc3RyaW5nKCksIG5vZGU9bm9kZSkKKworICAgICAgICAgICAgaWYgYW5jZXN0b3IubmFtZSA9PSBvYmplY3QuX19uYW1lX186CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgInVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlIiwgYXJncz1ub2RlLm5hbWUsIG5vZGU9bm9kZQorICAgICAgICAgICAgICAgICkKKworICAgIEBjaGVja19tZXNzYWdlcygidW51c2VkLXByaXZhdGUtbWVtYmVyIiwgImF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCIpCisgICAgZGVmIGxlYXZlX2NsYXNzZGVmKHNlbGYsIG5vZGU6IGFzdHJvaWQuQ2xhc3NEZWYpIC0+IE5vbmU6CisgICAgICAgICIiImNsb3NlIGEgY2xhc3Mgbm9kZToKKyAgICAgICAgY2hlY2sgdGhhdCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIF9faW5pdF9fIGFuZCBjaGVjaworICAgICAgICBhY2Nlc3MgdG8gZXhpc3RlbnQgbWVtYmVycworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfdW51c2VkX3ByaXZhdGVfbWVtYmVycyhub2RlKQorICAgICAgICBzZWxmLl9jaGVja19hdHRyaWJ1dGVfZGVmaW5lZF9vdXRzaWRlX2luaXQobm9kZSkKKworICAgIGRlZiBfY2hlY2tfdW51c2VkX3ByaXZhdGVfbWVtYmVycyhzZWxmLCBub2RlOiBhc3Ryb2lkLkNsYXNzRGVmKSAtPiBOb25lOgorICAgICAgICAjIENoZWNrIGZvciB1bnVzZWQgcHJpdmF0ZSBmdW5jdGlvbnMKKyAgICAgICAgZm9yIGZ1bmN0aW9uX2RlZiBpbiBub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgZm91bmQgPSBGYWxzZQorICAgICAgICAgICAgaWYgbm90IGlzX2F0dHJfcHJpdmF0ZShmdW5jdGlvbl9kZWYubmFtZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gbm9kZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuYXR0cm5hbWUgPT0gZnVuY3Rpb25fZGVmLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGF0dHJpYnV0ZS5zY29wZSgpICE9IGZ1bmN0aW9uX2RlZiAgIyBXZSBpZ25vcmUgcmVjdXJzaXZlIGNhbGxzCisgICAgICAgICAgICAgICAgICAgIGFuZCBhdHRyaWJ1dGUuZXhwci5uYW1lIGluICgic2VsZiIsIG5vZGUubmFtZSkKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCBmb3VuZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAidW51c2VkLXByaXZhdGUtbWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZT1mdW5jdGlvbl9kZWYsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZiJ7ZnVuY3Rpb25fZGVmLm5hbWV9KHtmdW5jdGlvbl9kZWYuYXJncy5hc19zdHJpbmcoKX0pIiwKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgIyBDaGVjayBmb3IgdW51c2VkIHByaXZhdGUgdmFyaWFibGVzCisgICAgICAgIGZvciBhc3NpZ25fbmFtZSBpbiBub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQXNzaWduTmFtZSk6CisgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFzc2lnbl9uYW1lLnBhcmVudCwgYXN0cm9pZC5Bcmd1bWVudHMpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIElnbm9yZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICAgICAgICAgIGlmIG5vdCBpc19hdHRyX3ByaXZhdGUoYXNzaWduX25hbWUubmFtZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLm5vZGVzX29mX2NsYXNzKChhc3Ryb2lkLk5hbWUsIGFzdHJvaWQuQXR0cmlidXRlKSk6CisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGNoaWxkLCBhc3Ryb2lkLk5hbWUpIGFuZCBjaGlsZC5uYW1lID09IGFzc2lnbl9uYW1lLm5hbWUKKyAgICAgICAgICAgICAgICApIG9yICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShjaGlsZCwgYXN0cm9pZC5BdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBjaGlsZC5hdHRybmFtZSA9PSBhc3NpZ25fbmFtZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBjaGlsZC5leHByLm5hbWUgaW4gKCJjbHMiLCBub2RlLm5hbWUpCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3QgZm91bmQ6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgInVudXNlZC1wcml2YXRlLW1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgIG5vZGU9YXNzaWduX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M9KG5vZGUubmFtZSwgYXNzaWduX25hbWUubmFtZSksCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgICMgQ2hlY2sgZm9yIHVudXNlZCBwcml2YXRlIGF0dHJpYnV0ZXMKKyAgICAgICAgZm9yIGFzc2lnbl9hdHRyIGluIG5vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5Bc3NpZ25BdHRyKToKKyAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgIGlmIG5vdCBpc19hdHRyX3ByaXZhdGUoYXNzaWduX2F0dHIuYXR0cm5hbWUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgYXR0cmlidXRlIGluIG5vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5BdHRyaWJ1dGUpOgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmF0dHJuYW1lID09IGFzc2lnbl9hdHRyLmF0dHJuYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBhdHRyaWJ1dGUuZXhwci5uYW1lID09IGFzc2lnbl9hdHRyLmV4cHIubmFtZQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IGZvdW5kOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJ1bnVzZWQtcHJpdmF0ZS1tZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICBub2RlPWFzc2lnbl9hdHRyLAorICAgICAgICAgICAgICAgICAgICBhcmdzPShub2RlLm5hbWUsIGFzc2lnbl9hdHRyLmF0dHJuYW1lKSwKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX2F0dHJpYnV0ZV9kZWZpbmVkX291dHNpZGVfaW5pdChzZWxmLCBjbm9kZTogYXN0cm9pZC5DbGFzc0RlZikgLT4gTm9uZToKKyAgICAgICAgIyBjaGVjayBhY2Nlc3MgdG8gZXhpc3RlbnQgbWVtYmVycyBvbiBub24gbWV0YWNsYXNzIGNsYXNzZXMKKyAgICAgICAgaWYgc2VsZi5faWdub3JlX21peGluIGFuZCBjbm9kZS5uYW1lWy01Ol0ubG93ZXIoKSA9PSAibWl4aW4iOgorICAgICAgICAgICAgIyBXZSBhcmUgaW4gYSBtaXhpbiBjbGFzcy4gTm8gbmVlZCB0byB0cnkgdG8gZmlndXJlIG91dCBpZgorICAgICAgICAgICAgIyBzb21ldGhpbmcgaXMgbWlzc2luZywgc2luY2UgaXQgaXMgbW9zdCBsaWtlbHkgdGhhdCBpdCB3aWxsCisgICAgICAgICAgICAjIG1pc3MuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBhY2Nlc3NlZCA9IHNlbGYuX2FjY2Vzc2VkLmFjY2Vzc2VkKGNub2RlKQorICAgICAgICBpZiBjbm9kZS50eXBlICE9ICJtZXRhY2xhc3MiOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfYWNjZXNzZWRfbWVtYmVycyhjbm9kZSwgYWNjZXNzZWQpCisgICAgICAgICMgY2hlY2tzIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgaW4gYW4gYWxsb3dlZCBtZXRob2Qgc3VjaCBhcyBfX2luaXRfXworICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQiKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkZWZpbmluZ19tZXRob2RzID0gc2VsZi5jb25maWcuZGVmaW5pbmdfYXR0cl9tZXRob2RzCisgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gY25vZGUucm9vdCgpCisgICAgICAgIGZvciBhdHRyLCBub2RlcyBpbiBjbm9kZS5pbnN0YW5jZV9hdHRycy5pdGVtcygpOgorICAgICAgICAgICAgIyBFeGNsdWRlIGBfX2RpY3RfX2AgYXMgaXQgaXMgYWxyZWFkeSBkZWZpbmVkLgorICAgICAgICAgICAgaWYgYXR0ciA9PSAiX19kaWN0X18iOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgU2tpcCBub2RlcyB3aGljaCBhcmUgbm90IGluIHRoZSBjdXJyZW50IG1vZHVsZSBhbmQgaXQgbWF5IHNjcmV3IHVwCisgICAgICAgICAgICAjIHRoZSBvdXRwdXQsIHdoaWxlIGl0J3Mgbm90IHdvcnRoIGl0CisgICAgICAgICAgICBub2RlcyA9IFsKKyAgICAgICAgICAgICAgICBuCisgICAgICAgICAgICAgICAgZm9yIG4gaW4gbm9kZXMKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuLnN0YXRlbWVudCgpLCAoYXN0cm9pZC5EZWxldGUsIGFzdHJvaWQuQXVnQXNzaWduKSkKKyAgICAgICAgICAgICAgICBhbmQgbi5yb290KCkgaXMgY3VycmVudF9tb2R1bGUKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGlmIG5vdCBub2RlczoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBlcnJvciBkZXRlY3RlZCBieSB0eXBlY2hlY2tpbmcKKworICAgICAgICAgICAgIyBDaGVjayBpZiBhbnkgbWV0aG9kIGF0dHIgaXMgZGVmaW5lZCBpbiBpcyBhIGRlZmluaW5nIG1ldGhvZAorICAgICAgICAgICAgIyBvciBpZiB3ZSBoYXZlIHRoZSBhdHRyaWJ1dGUgZGVmaW5lZCBpbiBhIHNldHRlci4KKyAgICAgICAgICAgIGZyYW1lcyA9IChub2RlLmZyYW1lKCkgZm9yIG5vZGUgaW4gbm9kZXMpCisgICAgICAgICAgICBpZiBhbnkoCisgICAgICAgICAgICAgICAgZnJhbWUubmFtZSBpbiBkZWZpbmluZ19tZXRob2RzIG9yIGlzX3Byb3BlcnR5X3NldHRlcihmcmFtZSkKKyAgICAgICAgICAgICAgICBmb3IgZnJhbWUgaW4gZnJhbWVzCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgY2hlY2sgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gYSBwYXJlbnQncyBfX2luaXRfXworICAgICAgICAgICAgZm9yIHBhcmVudCBpbiBjbm9kZS5pbnN0YW5jZV9hdHRyX2FuY2VzdG9ycyhhdHRyKToKKyAgICAgICAgICAgICAgICBhdHRyX2RlZmluZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgYW55IHBhcmVudCBtZXRob2QgYXR0ciBpcyBkZWZpbmVkIGluIGlzIGEgZGVmaW5pbmcgbWV0aG9kCisgICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gcGFyZW50Lmluc3RhbmNlX2F0dHJzW2F0dHJdOgorICAgICAgICAgICAgICAgICAgICBpZiBub2RlLmZyYW1lKCkubmFtZSBpbiBkZWZpbmluZ19tZXRob2RzOgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9kZWZpbmVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGF0dHJfZGVmaW5lZDoKKyAgICAgICAgICAgICAgICAgICAgIyB3ZSdyZSBkb25lIDopCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgY2hlY2sgYXR0cmlidXRlIGlzIGRlZmluZWQgYXMgYSBjbGFzcyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNub2RlLmxvY2FsX2F0dHIoYXR0cikKKyAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vZGUuZnJhbWUoKS5uYW1lIG5vdCBpbiBkZWZpbmluZ19tZXRob2RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgdGhlIGF0dHJpYnV0ZSB3YXMgc2V0IGJ5IGEgY2FsbCBpbiBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIHRoZSBkZWZpbmluZyBtZXRob2RzLCB0aGVuIGRvbid0IGVtaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9jYWxsZWRfaW5fbWV0aG9kcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mcmFtZSgpLCBjbm9kZSwgZGVmaW5pbmdfbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCIsIGFyZ3M9YXR0ciwgbm9kZT1ub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHZpc2l0X2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayBtZXRob2QgYXJndW1lbnRzLCBvdmVycmlkaW5nIiIiCisgICAgICAgICMgaWdub3JlIGFjdHVhbCBmdW5jdGlvbnMKKyAgICAgICAgaWYgbm90IG5vZGUuaXNfbWV0aG9kKCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9jaGVja191c2VsZXNzX3N1cGVyX2RlbGVnYXRpb24obm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcHJvcGVydHlfd2l0aF9wYXJhbWV0ZXJzKG5vZGUpCisKKyAgICAgICAga2xhc3MgPSBub2RlLnBhcmVudC5mcmFtZSgpCisgICAgICAgIHNlbGYuX21ldGhfY291bGRfYmVfZnVuYyA9IFRydWUKKyAgICAgICAgIyBjaGVjayBmaXJzdCBhcmd1bWVudCBpcyBzZWxmIGlmIHRoaXMgaXMgYWN0dWFsbHkgYSBtZXRob2QKKyAgICAgICAgc2VsZi5fY2hlY2tfZmlyc3RfYXJnX2Zvcl90eXBlKG5vZGUsIGtsYXNzLnR5cGUgPT0gIm1ldGFjbGFzcyIpCisgICAgICAgIGlmIG5vZGUubmFtZSA9PSAiX19pbml0X18iOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW5pdChub2RlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgY2hlY2sgc2lnbmF0dXJlIGlmIHRoZSBtZXRob2Qgb3ZlcmxvYWRzIGluaGVyaXRlZCBtZXRob2QKKyAgICAgICAgZm9yIG92ZXJyaWRkZW4gaW4ga2xhc3MubG9jYWxfYXR0cl9hbmNlc3RvcnMobm9kZS5uYW1lKToKKyAgICAgICAgICAgICMgZ2V0IGFzdHJvaWQgZm9yIHRoZSBzZWFyY2hlZCBtZXRob2QKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXJlbnRfZnVuY3Rpb24gPSBvdmVycmlkZGVuW25vZGUubmFtZV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHdlIGhhdmUgZm91bmQgdGhlIG1ldGhvZCBidXQgaXQncyBub3QgaW4gdGhlIGxvY2FsCisgICAgICAgICAgICAgICAgIyBkaWN0aW9uYXJ5LgorICAgICAgICAgICAgICAgICMgVGhpcyBtYXkgaGFwcGVuIHdpdGggYXN0cm9pZCBidWlsZCBmcm9tIGxpdmluZyBvYmplY3RzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhcmVudF9mdW5jdGlvbiwgYXN0cm9pZC5GdW5jdGlvbkRlZik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NpZ25hdHVyZShub2RlLCBwYXJlbnRfZnVuY3Rpb24sICJvdmVycmlkZGVuIiwga2xhc3MpCisgICAgICAgICAgICBzZWxmLl9jaGVja19pbnZhbGlkX292ZXJyaWRkZW5fbWV0aG9kKG5vZGUsIHBhcmVudF9mdW5jdGlvbikKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgbm9kZS5kZWNvcmF0b3JzOgorICAgICAgICAgICAgZm9yIGRlY29yYXRvciBpbiBub2RlLmRlY29yYXRvcnMubm9kZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkZWNvcmF0b3IsIGFzdHJvaWQuQXR0cmlidXRlKSBhbmQgZGVjb3JhdG9yLmF0dHJuYW1lIGluICgKKyAgICAgICAgICAgICAgICAgICAgImdldHRlciIsCisgICAgICAgICAgICAgICAgICAgICJzZXR0ZXIiLAorICAgICAgICAgICAgICAgICAgICAiZGVsZXRlciIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgIyBhdHRyaWJ1dGUgYWZmZWN0YXRpb24gd2lsbCBjYWxsIHRoaXMgbWV0aG9kLCBub3QgaGlkaW5nIGl0CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVjb3JhdG9yLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgICAgICAgICBpZiBkZWNvcmF0b3IubmFtZSA9PSAicHJvcGVydHkiOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBhdHRyaWJ1dGUgYWZmZWN0YXRpb24gd2lsbCBlaXRoZXIgY2FsbCBhIHNldHRlciBvciByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBhbiBhdHRyaWJ1dGUgZXJyb3IsIGFueXdheSBub3QgaGlkaW5nIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICAjIEluZmVyIHRoZSBkZWNvcmF0b3IgYW5kIHNlZSBpZiBpdCByZXR1cm5zIHNvbWV0aGluZyB1c2VmdWwKKyAgICAgICAgICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIoZGVjb3JhdG9yKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpbmZlcnJlZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5GdW5jdGlvbkRlZik6CisgICAgICAgICAgICAgICAgICAgICMgT2theSwgaXQncyBhIGRlY29yYXRvciwgbGV0J3Mgc2VlIHdoYXQgaXQgY2FuIGluZmVyLgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcnJlZCA9IG5leHQoaW5mZXJyZWQuaW5mZXJfY2FsbF9yZXN1bHQoaW5mZXJyZWQpKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpbmZlcnJlZCwgKGFzdHJvaWQuSW5zdGFuY2UsIGFzdHJvaWQuQ2xhc3NEZWYpKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluZmVycmVkLmdldGF0dHIoIl9fZ2V0X18iKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluZmVycmVkLmdldGF0dHIoIl9fc2V0X18iKQorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuQXR0cmlidXRlSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBtZXRob2QgaXMgaGlkZGVuIGJ5IGFuIGF0dHJpYnV0ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdmVycmlkZGVuID0ga2xhc3MuaW5zdGFuY2VfYXR0cihub2RlLm5hbWUpWzBdCisgICAgICAgICAgICBvdmVycmlkZGVuX2ZyYW1lID0gb3ZlcnJpZGRlbi5mcmFtZSgpCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShvdmVycmlkZGVuX2ZyYW1lLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgICAgIGFuZCBvdmVycmlkZGVuX2ZyYW1lLnR5cGUgPT0gIm1ldGhvZCIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgb3ZlcnJpZGRlbl9mcmFtZSA9IG92ZXJyaWRkZW5fZnJhbWUucGFyZW50LmZyYW1lKCkKKyAgICAgICAgICAgIGlmIG5vdCAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShvdmVycmlkZGVuX2ZyYW1lLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgICAgIGFuZCBrbGFzcy5pc19zdWJ0eXBlX29mKG92ZXJyaWRkZW5fZnJhbWUucW5hbWUoKSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgSWYgYSBzdWJjbGFzcyBkZWZpbmVkIHRoZSBtZXRob2QgdGhlbiBpdCdzIG5vdCBvdXIgZmF1bHQuCisgICAgICAgICAgICBmb3IgYW5jZXN0b3IgaW4ga2xhc3MuYW5jZXN0b3JzKCk6CisgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lIGluIGFuY2VzdG9yLmluc3RhbmNlX2F0dHJzIGFuZCBpc19hdHRyX3ByaXZhdGUobm9kZS5uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZm9yIG9iaiBpbiBhbmNlc3Rvci5sb29rdXAobm9kZS5uYW1lKVsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhcmdzID0gKG92ZXJyaWRkZW4ucm9vdCgpLm5hbWUsIG92ZXJyaWRkZW4uZnJvbWxpbmVubykKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm1ldGhvZC1oaWRkZW4iLCBhcmdzPWFyZ3MsIG5vZGU9bm9kZSkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIHZpc2l0X2FzeW5jZnVuY3Rpb25kZWYgPSB2aXNpdF9mdW5jdGlvbmRlZgorCisgICAgZGVmIF9jaGVja191c2VsZXNzX3N1cGVyX2RlbGVnYXRpb24oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICAiIiJDaGVjayBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gbm9kZSBpcyBhbiB1c2VsZXNzIG1ldGhvZCBvdmVycmlkZQorCisgICAgICAgIFdlIGNvbnNpZGVyIGl0ICp1c2VsZXNzKiBpZiBpdCB1c2VzIHRoZSBzdXBlcigpIGJ1aWx0aW4sIGJ1dCBoYXZpbmcKKyAgICAgICAgbm90aGluZyBhZGRpdGlvbmFsIHdoYXRzb2V2ZXIgdGhhbiBub3QgaW1wbGVtZW50aW5nIHRoZSBtZXRob2QgYXQgYWxsLgorICAgICAgICBJZiB0aGUgbWV0aG9kIHVzZXMgc3VwZXIoKSB0byBkZWxlZ2F0ZSBhbiBvcGVyYXRpb24gdG8gdGhlIHJlc3Qgb2YgdGhlIE1STywKKyAgICAgICAgYW5kIGlmIHRoZSBtZXRob2QgY2FsbGVkIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG9uZSwgdGhlIGFyZ3VtZW50cworICAgICAgICBwYXNzZWQgdG8gc3VwZXIoKSBhcmUgdGhlIHNhbWUgYXMgdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIHBhc3NlZCB0bworICAgICAgICB0aGlzIG1ldGhvZCwgdGhlbiB0aGUgbWV0aG9kIGNvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlciwgYnkgbGV0dGluZworICAgICAgICBvdGhlciBpbXBsZW1lbnRhdGlvbiB0byB0YWtlIHByZWNlZGVuY2UuCisgICAgICAgICIiIgorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIG5vdCBmdW5jdGlvbi5pc19tZXRob2QoKQorICAgICAgICAgICAgIyBXaXRoIGRlY29yYXRvcnMgaXMgYSBjaGFuZ2Ugb2YgdXNlCisgICAgICAgICAgICBvciBmdW5jdGlvbi5kZWNvcmF0b3JzCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBib2R5ID0gZnVuY3Rpb24uYm9keQorICAgICAgICBpZiBsZW4oYm9keSkgIT0gMToKKyAgICAgICAgICAgICMgTXVsdGlwbGUgc3RhdGVtZW50cywgd2hpY2ggbWVhbnMgdGhpcyBvdmVycmlkZGVuIG1ldGhvZAorICAgICAgICAgICAgIyBjb3VsZCBkbyBtdWx0aXBsZSB0aGluZ3Mgd2UgYXJlIG5vdCBhd2FyZSBvZi4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHN0YXRlbWVudCA9IGJvZHlbMF0KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3RhdGVtZW50LCAoYXN0cm9pZC5FeHByLCBhc3Ryb2lkLlJldHVybikpOgorICAgICAgICAgICAgIyBEb2luZyBzb21ldGhpbmcgZWxzZSB0aGFuIHdoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW50by4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNhbGwgPSBzdGF0ZW1lbnQudmFsdWUKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UoY2FsbCwgYXN0cm9pZC5DYWxsKQorICAgICAgICAgICAgIyBOb3QgYSBzdXBlcigpIGF0dHJpYnV0ZSBhY2Nlc3MuCisgICAgICAgICAgICBvciBub3QgaXNpbnN0YW5jZShjYWxsLmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTaG91bGQgYmUgYSBzdXBlciBjYWxsLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdXBlcl9jYWxsID0gbmV4dChjYWxsLmZ1bmMuZXhwci5pbmZlcigpKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3VwZXJfY2FsbCwgYXN0cm9pZC5vYmplY3RzLlN1cGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFRoZSBuYW1lIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICAgICAgaWYgY2FsbC5mdW5jLmF0dHJuYW1lICE9IGZ1bmN0aW9uLm5hbWU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFNob3VsZCBiZSBhIHN1cGVyIGNhbGwgd2l0aCB0aGUgTVJPIHBvaW50ZXIgYmVpbmcgdGhlCisgICAgICAgICMgY3VycmVudCBjbGFzcyBhbmQgdGhlIHR5cGUgYmVpbmcgdGhlIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgICAgIGN1cnJlbnRfc2NvcGUgPSBmdW5jdGlvbi5wYXJlbnQuc2NvcGUoKQorICAgICAgICBpZiAoCisgICAgICAgICAgICBzdXBlcl9jYWxsLm1yb19wb2ludGVyICE9IGN1cnJlbnRfc2NvcGUKKyAgICAgICAgICAgIG9yIG5vdCBpc2luc3RhbmNlKHN1cGVyX2NhbGwudHlwZSwgYXN0cm9pZC5JbnN0YW5jZSkKKyAgICAgICAgICAgIG9yIHN1cGVyX2NhbGwudHlwZS5uYW1lICE9IGN1cnJlbnRfc2NvcGUubmFtZQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBDaGVjayB2YWx1ZXMgb2YgZGVmYXVsdCBhcmdzCisgICAgICAgIGtsYXNzID0gZnVuY3Rpb24ucGFyZW50LmZyYW1lKCkKKyAgICAgICAgbWV0aF9ub2RlID0gTm9uZQorICAgICAgICBmb3Igb3ZlcnJpZGRlbiBpbiBrbGFzcy5sb2NhbF9hdHRyX2FuY2VzdG9ycyhmdW5jdGlvbi5uYW1lKToKKyAgICAgICAgICAgICMgZ2V0IGFzdHJvaWQgZm9yIHRoZSBzZWFyY2hlZCBtZXRob2QKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXRoX25vZGUgPSBvdmVycmlkZGVuW2Z1bmN0aW9uLm5hbWVdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIGZvdW5kIHRoZSBtZXRob2QgYnV0IGl0J3Mgbm90IGluIHRoZSBsb2NhbAorICAgICAgICAgICAgICAgICMgZGljdGlvbmFyeS4KKyAgICAgICAgICAgICAgICAjIFRoaXMgbWF5IGhhcHBlbiB3aXRoIGFzdHJvaWQgYnVpbGQgZnJvbSBsaXZpbmcgb2JqZWN0cworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UobWV0aF9ub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgICAgICMgSWYgdGhlIG1ldGhvZCBoYXZlIGFuIGFuY2VzdG9yIHdoaWNoIGlzIG5vdCBhCisgICAgICAgICAgICAgICAgIyBmdW5jdGlvbiB0aGVuIGl0IGlzIGxlZ2l0aW1hdGUgdG8gcmVkZWZpbmUgaXQKKyAgICAgICAgICAgICAgICBvciBfaGFzX2RpZmZlcmVudF9wYXJhbWV0ZXJzX2RlZmF1bHRfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG1ldGhfbm9kZS5hcmdzLCBmdW5jdGlvbi5hcmdzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBEZXRlY3QgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBjYWxsJ3MgYXJndW1lbnRzLgorICAgICAgICBwYXJhbXMgPSBfc2lnbmF0dXJlX2Zyb21fYXJndW1lbnRzKGZ1bmN0aW9uLmFyZ3MpCisgICAgICAgIGFyZ3MgPSBfc2lnbmF0dXJlX2Zyb21fY2FsbChjYWxsKQorCisgICAgICAgIGlmIG1ldGhfbm9kZSBpcyBub3QgTm9uZToKKworICAgICAgICAgICAgZGVmIGZvcm1fYW5ub3RhdGlvbnMoYXJndW1lbnRzKToKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGNoYWluKAorICAgICAgICAgICAgICAgICAgICAoYXJndW1lbnRzLnBvc29ubHlhcmdzX2Fubm90YXRpb25zIG9yIFtdKSwgYXJndW1lbnRzLmFubm90YXRpb25zCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHJldHVybiBbYW5uLmFzX3N0cmluZygpIGZvciBhbm4gaW4gYW5ub3RhdGlvbnMgaWYgYW5uIGlzIG5vdCBOb25lXQorCisgICAgICAgICAgICBjYWxsZWRfYW5ub3RhdGlvbnMgPSBmb3JtX2Fubm90YXRpb25zKGZ1bmN0aW9uLmFyZ3MpCisgICAgICAgICAgICBvdmVycmlkZGVuX2Fubm90YXRpb25zID0gZm9ybV9hbm5vdGF0aW9ucyhtZXRoX25vZGUuYXJncykKKyAgICAgICAgICAgIGlmIGNhbGxlZF9hbm5vdGF0aW9ucyBhbmQgb3ZlcnJpZGRlbl9hbm5vdGF0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBjYWxsZWRfYW5ub3RhdGlvbnMgIT0gb3ZlcnJpZGRlbl9hbm5vdGF0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgX2RlZmluaXRpb25fZXF1aXZhbGVudF90b19jYWxsKHBhcmFtcywgYXJncyk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb24iLCBub2RlPWZ1bmN0aW9uLCBhcmdzPShmdW5jdGlvbi5uYW1lLCkKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfcHJvcGVydHlfd2l0aF9wYXJhbWV0ZXJzKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiAoCisgICAgICAgICAgICBub2RlLmFyZ3MuYXJncworICAgICAgICAgICAgYW5kIGxlbihub2RlLmFyZ3MuYXJncykgPiAxCisgICAgICAgICAgICBhbmQgZGVjb3JhdGVkX3dpdGhfcHJvcGVydHkobm9kZSkKKyAgICAgICAgICAgIGFuZCBub3QgaXNfcHJvcGVydHlfc2V0dGVyKG5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJwcm9wZXJ0eS13aXRoLXBhcmFtZXRlcnMiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2ludmFsaWRfb3ZlcnJpZGRlbl9tZXRob2Qoc2VsZiwgZnVuY3Rpb25fbm9kZSwgcGFyZW50X2Z1bmN0aW9uX25vZGUpOgorICAgICAgICBwYXJlbnRfaXNfcHJvcGVydHkgPSBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eSgKKyAgICAgICAgICAgIHBhcmVudF9mdW5jdGlvbl9ub2RlCisgICAgICAgICkgb3IgaXNfcHJvcGVydHlfc2V0dGVyX29yX2RlbGV0ZXIocGFyZW50X2Z1bmN0aW9uX25vZGUpCisgICAgICAgIGN1cnJlbnRfaXNfcHJvcGVydHkgPSBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eSgKKyAgICAgICAgICAgIGZ1bmN0aW9uX25vZGUKKyAgICAgICAgKSBvciBpc19wcm9wZXJ0eV9zZXR0ZXJfb3JfZGVsZXRlcihmdW5jdGlvbl9ub2RlKQorICAgICAgICBpZiBwYXJlbnRfaXNfcHJvcGVydHkgYW5kIG5vdCBjdXJyZW50X2lzX3Byb3BlcnR5OgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW52YWxpZC1vdmVycmlkZGVuLW1ldGhvZCIsCisgICAgICAgICAgICAgICAgYXJncz0oZnVuY3Rpb25fbm9kZS5uYW1lLCAicHJvcGVydHkiLCBmdW5jdGlvbl9ub2RlLnR5cGUpLAorICAgICAgICAgICAgICAgIG5vZGU9ZnVuY3Rpb25fbm9kZSwKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxpZiBub3QgcGFyZW50X2lzX3Byb3BlcnR5IGFuZCBjdXJyZW50X2lzX3Byb3BlcnR5OgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW52YWxpZC1vdmVycmlkZGVuLW1ldGhvZCIsCisgICAgICAgICAgICAgICAgYXJncz0oZnVuY3Rpb25fbm9kZS5uYW1lLCAibWV0aG9kIiwgInByb3BlcnR5IiksCisgICAgICAgICAgICAgICAgbm9kZT1mdW5jdGlvbl9ub2RlLAorICAgICAgICAgICAgKQorCisgICAgICAgIHBhcmVudF9pc19hc3luYyA9IGlzaW5zdGFuY2UocGFyZW50X2Z1bmN0aW9uX25vZGUsIGFzdHJvaWQuQXN5bmNGdW5jdGlvbkRlZikKKyAgICAgICAgY3VycmVudF9pc19hc3luYyA9IGlzaW5zdGFuY2UoZnVuY3Rpb25fbm9kZSwgYXN0cm9pZC5Bc3luY0Z1bmN0aW9uRGVmKQorCisgICAgICAgIGlmIHBhcmVudF9pc19hc3luYyBhbmQgbm90IGN1cnJlbnRfaXNfYXN5bmM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kIiwKKyAgICAgICAgICAgICAgICBhcmdzPShmdW5jdGlvbl9ub2RlLm5hbWUsICJhc3luYyIsICJub24tYXN5bmMiKSwKKyAgICAgICAgICAgICAgICBub2RlPWZ1bmN0aW9uX25vZGUsCisgICAgICAgICAgICApCisKKyAgICAgICAgZWxpZiBub3QgcGFyZW50X2lzX2FzeW5jIGFuZCBjdXJyZW50X2lzX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW52YWxpZC1vdmVycmlkZGVuLW1ldGhvZCIsCisgICAgICAgICAgICAgICAgYXJncz0oZnVuY3Rpb25fbm9kZS5uYW1lLCAibm9uLWFzeW5jIiwgImFzeW5jIiksCisgICAgICAgICAgICAgICAgbm9kZT1mdW5jdGlvbl9ub2RlLAorICAgICAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19zbG90cyhzZWxmLCBub2RlKToKKyAgICAgICAgaWYgIl9fc2xvdHNfXyIgbm90IGluIG5vZGUubG9jYWxzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBzbG90cyBpbiBub2RlLmlnZXRhdHRyKCJfX3Nsb3RzX18iKToKKyAgICAgICAgICAgICMgY2hlY2sgaWYgX19zbG90c19fIGlzIGEgdmFsaWQgdHlwZQorICAgICAgICAgICAgaWYgc2xvdHMgaXMgYXN0cm9pZC5VbmluZmVyYWJsZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGlzX2l0ZXJhYmxlKHNsb3RzKSBhbmQgbm90IGlzX2NvbXByZWhlbnNpb24oc2xvdHMpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtc2xvdHMiLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICAgICAgIyBhIHN0cmluZywgaWdub3JlIHRoZSBmb2xsb3dpbmcgY2hlY2tzCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic2luZ2xlLXN0cmluZy11c2VkLWZvci1zbG90cyIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2xvdHMsICJpdGVyZWQiKToKKyAgICAgICAgICAgICAgICAjIHdlIGNhbid0IG9idGFpbiB0aGUgdmFsdWVzLCBtYXliZSBhIC5kZXF1ZT8KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBhc3Ryb2lkLkRpY3QpOgorICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtpdGVtWzBdIGZvciBpdGVtIGluIHNsb3RzLml0ZW1zXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzbG90cy5pdGVyZWQoKQorICAgICAgICAgICAgaWYgdmFsdWVzIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmb3IgZWx0IGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3Nsb3RzX2VsdChlbHQsIG5vZGUpCisgICAgICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICBkZWYgX2NoZWNrX3Nsb3RzX2VsdChzZWxmLCBlbHQsIG5vZGUpOgorICAgICAgICBmb3IgaW5mZXJyZWQgaW4gZWx0LmluZmVyKCk6CisgICAgICAgICAgICBpZiBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5Db25zdCkgb3Igbm90IGlzaW5zdGFuY2UoCisgICAgICAgICAgICAgICAgaW5mZXJyZWQudmFsdWUsIHN0cgorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1zbG90cy1vYmplY3QiLCBhcmdzPWluZmVycmVkLmFzX3N0cmluZygpLCBub2RlPWVsdAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGluZmVycmVkLnZhbHVlOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLXNsb3RzLW9iamVjdCIsIGFyZ3M9aW5mZXJyZWQuYXNfc3RyaW5nKCksIG5vZGU9ZWx0CisgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICAjIENoZWNrIGlmIHdlIGhhdmUgYSBjb25mbGljdCB3aXRoIGEgY2xhc3MgdmFyaWFibGUuCisgICAgICAgICAgICBjbGFzc192YXJpYWJsZSA9IG5vZGUubG9jYWxzLmdldChpbmZlcnJlZC52YWx1ZSkKKyAgICAgICAgICAgIGlmIGNsYXNzX3ZhcmlhYmxlOgorICAgICAgICAgICAgICAgICMgU2tpcCBhbm5vdGF0ZWQgYXNzaWdubWVudHMgd2hpY2ggZG9uJ3QgY29uZmxpY3QgYXQgYWxsIHdpdGggc2xvdHMuCisgICAgICAgICAgICAgICAgaWYgbGVuKGNsYXNzX3ZhcmlhYmxlKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBjbGFzc192YXJpYWJsZVswXS5wYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuQW5uQXNzaWduKSBhbmQgcGFyZW50LnZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAiY2xhc3MtdmFyaWFibGUtc2xvdHMtY29uZmxpY3QiLCBhcmdzPShpbmZlcnJlZC52YWx1ZSwpLCBub2RlPWVsdAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBsZWF2ZV9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIib24gbWV0aG9kIG5vZGUsIGNoZWNrIGlmIHRoaXMgbWV0aG9kIGNvdWxkbid0IGJlIGEgZnVuY3Rpb24KKworICAgICAgICBpZ25vcmUgY2xhc3MsIHN0YXRpYyBhbmQgYWJzdHJhY3QgbWV0aG9kcywgaW5pdGlhbGl6ZXIsCisgICAgICAgIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tIGEgcGFyZW50IGNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm9kZS5pc19tZXRob2QoKToKKyAgICAgICAgICAgIGlmIG5vZGUuYXJncy5hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpcnN0X2F0dHJzLnBvcCgpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJuby1zZWxmLXVzZSIpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgY2xhc3Nfbm9kZSA9IG5vZGUucGFyZW50LmZyYW1lKCkKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXRoX2NvdWxkX2JlX2Z1bmMKKyAgICAgICAgICAgICAgICBhbmQgbm9kZS50eXBlID09ICJtZXRob2QiCisgICAgICAgICAgICAgICAgYW5kIG5vZGUubmFtZSBub3QgaW4gUFlNRVRIT0RTCisgICAgICAgICAgICAgICAgYW5kIG5vdCAoCisgICAgICAgICAgICAgICAgICAgIG5vZGUuaXNfYWJzdHJhY3QoKQorICAgICAgICAgICAgICAgICAgICBvciBvdmVycmlkZXNfYV9tZXRob2QoY2xhc3Nfbm9kZSwgbm9kZS5uYW1lKQorICAgICAgICAgICAgICAgICAgICBvciBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eShub2RlKQorICAgICAgICAgICAgICAgICAgICBvciBfaGFzX2JhcmVfc3VwZXJfY2FsbChub2RlKQorICAgICAgICAgICAgICAgICAgICBvciBpc19wcm90b2NvbF9jbGFzcyhjbGFzc19ub2RlKQorICAgICAgICAgICAgICAgICAgICBvciBpc19vdmVybG9hZF9zdHViKG5vZGUpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJuby1zZWxmLXVzZSIsIG5vZGU9bm9kZSkKKworICAgIGRlZiB2aXNpdF9hdHRyaWJ1dGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIGlmIHRoZSBnZXRhdHRyIGlzIGFuIGFjY2VzcyB0byBhIGNsYXNzIG1lbWJlcgorICAgICAgICBpZiBzbywgcmVnaXN0ZXIgaXQuIEFsc28gY2hlY2sgZm9yIGFjY2VzcyB0byBwcm90ZWN0ZWQKKyAgICAgICAgY2xhc3MgbWVtYmVyIGZyb20gb3V0c2lkZSBpdHMgY2xhc3MgKGJ1dCBpZ25vcmUgX19zcGVjaWFsX18KKyAgICAgICAgbWV0aG9kcykKKyAgICAgICAgIiIiCisgICAgICAgICMgQ2hlY2sgc2VsZgorICAgICAgICBpZiBzZWxmLl91c2VzX21hbmRhdG9yeV9tZXRob2RfcGFyYW0obm9kZSk6CisgICAgICAgICAgICBzZWxmLl9hY2Nlc3NlZC5zZXRfYWNjZXNzZWQobm9kZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJwcm90ZWN0ZWQtYWNjZXNzIik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9jaGVja19wcm90ZWN0ZWRfYXR0cmlidXRlX2FjY2Vzcyhub2RlKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJhc3NpZ25pbmctbm9uLXNsb3QiLCAiaW52YWxpZC1jbGFzcy1vYmplY3QiKQorICAgIGRlZiB2aXNpdF9hc3NpZ25hdHRyKHNlbGYsIG5vZGU6IGFzdHJvaWQuQXNzaWduQXR0cikgLT4gTm9uZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUuYXNzaWduX3R5cGUoKSwgYXN0cm9pZC5BdWdBc3NpZ24KKyAgICAgICAgKSBhbmQgc2VsZi5fdXNlc19tYW5kYXRvcnlfbWV0aG9kX3BhcmFtKG5vZGUpOgorICAgICAgICAgICAgc2VsZi5fYWNjZXNzZWQuc2V0X2FjY2Vzc2VkKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX2luX3Nsb3RzKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX2ludmFsaWRfY2xhc3Nfb2JqZWN0KG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2ludmFsaWRfY2xhc3Nfb2JqZWN0KHNlbGYsIG5vZGU6IGFzdHJvaWQuQXNzaWduQXR0cikgLT4gTm9uZToKKyAgICAgICAgaWYgbm90IG5vZGUuYXR0cm5hbWUgPT0gIl9fY2xhc3NfXyI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW5mZXJyZWQgPSBzYWZlX2luZmVyKG5vZGUucGFyZW50LnZhbHVlKQorICAgICAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNsYXNzRGVmKSBvciBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgIyBJZiBpcyB1bmluZmVycmFibGUsIHdlIGFsbG93IGl0IHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1jbGFzcy1vYmplY3QiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2luX3Nsb3RzKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHRoZSBnaXZlbiBBc3NpZ25BdHRyIG5vZGUKKyAgICAgICAgaXMgZGVmaW5lZCBpbiB0aGUgY2xhc3Mgc2xvdHMuCisgICAgICAgICIiIgorICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIobm9kZS5leHByKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5JbnN0YW5jZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBrbGFzcyA9IGluZmVycmVkLl9wcm94aWVkCisgICAgICAgIGlmIG5vdCBoYXNfa25vd25fYmFzZXMoa2xhc3MpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmICJfX3Nsb3RzX18iIG5vdCBpbiBrbGFzcy5sb2NhbHMgb3Igbm90IGtsYXNzLm5ld3N0eWxlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBJZiAndHlwaW5nLkdlbmVyaWMnIGlzIGEgYmFzZSBvZiBiYXNlcyBvZiBrbGFzcywgdGhlIGNhY2hlZCB2ZXJzaW9uCisgICAgICAgICMgb2YgJ3Nsb3RzKCknIG1pZ2h0IGhhdmUgYmVlbiBldmFsdWF0ZWQgaW5jb3JyZWN0bHksIHRodXMgZGVsZXRlZCBjYWNoZSBlbnRyeS4KKyAgICAgICAgaWYgYW55KGJhc2UucW5hbWUoKSA9PSAidHlwaW5nLkdlbmVyaWMiIGZvciBiYXNlIGluIGtsYXNzLm1ybygpKToKKyAgICAgICAgICAgIGNhY2hlID0gZ2V0YXR0cihrbGFzcywgIl9fY2FjaGUiLCBOb25lKQorICAgICAgICAgICAgaWYgY2FjaGUgYW5kIGNhY2hlLmdldChrbGFzcy5zbG90cykgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIGNhY2hlW2tsYXNzLnNsb3RzXQorCisgICAgICAgIHNsb3RzID0ga2xhc3Muc2xvdHMoKQorICAgICAgICBpZiBzbG90cyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgSWYgYW55IGFuY2VzdG9yIGRvZXNuJ3QgdXNlIHNsb3RzLCB0aGUgc2xvdHMKKyAgICAgICAgIyBkZWZpbmVkIGZvciB0aGlzIGNsYXNzIGFyZSBzdXBlcmZsdW91cy4KKyAgICAgICAgaWYgYW55KAorICAgICAgICAgICAgIl9fc2xvdHNfXyIgbm90IGluIGFuY2VzdG9yLmxvY2FscyBhbmQgYW5jZXN0b3IubmFtZSAhPSAib2JqZWN0IgorICAgICAgICAgICAgZm9yIGFuY2VzdG9yIGluIGtsYXNzLmFuY2VzdG9ycygpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgYW55KHNsb3QudmFsdWUgPT0gbm9kZS5hdHRybmFtZSBmb3Igc2xvdCBpbiBzbG90cyk6CisgICAgICAgICAgICAjIElmIHdlIGhhdmUgYSAnX19kaWN0X18nIGluIHNsb3RzLCB0aGVuCisgICAgICAgICAgICAjIGFzc2lnbmluZyBhbnkgbmFtZSBpcyB2YWxpZC4KKyAgICAgICAgICAgIGlmIG5vdCBhbnkoc2xvdC52YWx1ZSA9PSAiX19kaWN0X18iIGZvciBzbG90IGluIHNsb3RzKToKKyAgICAgICAgICAgICAgICBpZiBfaXNfYXR0cmlidXRlX3Byb3BlcnR5KG5vZGUuYXR0cm5hbWUsIGtsYXNzKToKKyAgICAgICAgICAgICAgICAgICAgIyBQcm9wZXJ0aWVzIGNpcmN1bXZlbnQgdGhlIHNsb3RzIG1lY2hhbmlzbSwKKyAgICAgICAgICAgICAgICAgICAgIyBzbyB3ZSBzaG91bGQgbm90IGVtaXQgYSB3YXJuaW5nIGZvciB0aGVtLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBub2RlLmF0dHJuYW1lIGluIGtsYXNzLmxvY2FscyBhbmQgX2hhc19kYXRhX2Rlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIGtsYXNzLCBub2RlLmF0dHJuYW1lCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgIyBEZXNjcmlwdG9ycyBjaXJjdW12ZW50IHRoZSBzbG90cyBtZWNoYW5pc20gYXMgd2VsbC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgbm9kZS5hdHRybmFtZSA9PSAiX19jbGFzc19fIiBhbmQgX2hhc19zYW1lX2xheW91dF9zbG90cygKKyAgICAgICAgICAgICAgICAgICAgc2xvdHMsIG5vZGUucGFyZW50LnZhbHVlCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYXNzaWduaW5nLW5vbi1zbG90IiwgYXJncz0obm9kZS5hdHRybmFtZSwpLCBub2RlPW5vZGUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJwcm90ZWN0ZWQtYWNjZXNzIiwgIm5vLWNsYXNzbWV0aG9kLWRlY29yYXRvciIsICJuby1zdGF0aWNtZXRob2QtZGVjb3JhdG9yIgorICAgICkKKyAgICBkZWYgdmlzaXRfYXNzaWduKHNlbGYsIGFzc2lnbl9ub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfY2xhc3NtZXRob2RfZGVjbGFyYXRpb24oYXNzaWduX25vZGUpCisgICAgICAgIG5vZGUgPSBhc3NpZ25fbm9kZS50YXJnZXRzWzBdCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQXNzaWduQXR0cik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLl91c2VzX21hbmRhdG9yeV9tZXRob2RfcGFyYW0obm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY2hlY2tfcHJvdGVjdGVkX2F0dHJpYnV0ZV9hY2Nlc3Mobm9kZSkKKworICAgIGRlZiBfY2hlY2tfY2xhc3NtZXRob2RfZGVjbGFyYXRpb24oc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrcyBmb3IgdXNlcyBvZiBjbGFzc21ldGhvZCgpIG9yIHN0YXRpY21ldGhvZCgpCisKKyAgICAgICAgV2hlbiBhIEBjbGFzc21ldGhvZCBvciBAc3RhdGljbWV0aG9kIGRlY29yYXRvciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICBBIG1lc3NhZ2Ugd2lsbCBiZSBlbWl0dGVkIG9ubHkgaWYgdGhlIGFzc2lnbm1lbnQgaXMgYXQgYSBjbGFzcyBzY29wZQorICAgICAgICBhbmQgb25seSBpZiB0aGUgY2xhc3NtZXRob2QncyBhcmd1bWVudCBiZWxvbmdzIHRvIHRoZSBjbGFzcyB3aGVyZSBpdAorICAgICAgICBpcyBkZWZpbmVkLgorICAgICAgICBgbm9kZWAgaXMgYW4gYXNzaWduIG5vZGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBjaGVjayB0aGUgZnVuY3Rpb24gY2FsbGVkIGlzICJjbGFzc21ldGhvZCIgb3IgInN0YXRpY21ldGhvZCIKKyAgICAgICAgZnVuYyA9IG5vZGUudmFsdWUuZnVuYworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jLCBhc3Ryb2lkLk5hbWUpIG9yIGZ1bmMubmFtZSBub3QgaW4gKAorICAgICAgICAgICAgImNsYXNzbWV0aG9kIiwKKyAgICAgICAgICAgICJzdGF0aWNtZXRob2QiLAorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbXNnID0gKAorICAgICAgICAgICAgIm5vLWNsYXNzbWV0aG9kLWRlY29yYXRvciIKKyAgICAgICAgICAgIGlmIGZ1bmMubmFtZSA9PSAiY2xhc3NtZXRob2QiCisgICAgICAgICAgICBlbHNlICJuby1zdGF0aWNtZXRob2QtZGVjb3JhdG9yIgorICAgICAgICApCisgICAgICAgICMgYXNzaWdubWVudCBtdXN0IGJlIGF0IGEgY2xhc3Mgc2NvcGUKKyAgICAgICAgcGFyZW50X2NsYXNzID0gbm9kZS5zY29wZSgpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhcmVudF9jbGFzcywgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIENoZWNrIGlmIHRoZSBhcmcgcGFzc2VkIHRvIGNsYXNzbWV0aG9kIGlzIGEgY2xhc3MgbWVtYmVyCisgICAgICAgIGNsYXNzbWV0aF9hcmcgPSBub2RlLnZhbHVlLmFyZ3NbMF0KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2xhc3NtZXRoX2FyZywgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG1ldGhvZF9uYW1lID0gY2xhc3NtZXRoX2FyZy5uYW1lCisgICAgICAgIGlmIGFueShtZXRob2RfbmFtZSA9PSBtZW1iZXIubmFtZSBmb3IgbWVtYmVyIGluIHBhcmVudF9jbGFzcy5teW1ldGhvZHMoKSk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1zZywgbm9kZT1ub2RlLnRhcmdldHNbMF0pCisKKyAgICBkZWYgX2NoZWNrX3Byb3RlY3RlZF9hdHRyaWJ1dGVfYWNjZXNzKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJHaXZlbiBhbiBhdHRyaWJ1dGUgYWNjZXNzIG5vZGUgKHNldCBvciBnZXQpLCBjaGVjayBpZiBhdHRyaWJ1dGUKKyAgICAgICAgYWNjZXNzIGlzIGxlZ2l0aW1hdGUuIENhbGwgX2NoZWNrX2ZpcnN0X2F0dHIgd2l0aCBub2RlIGJlZm9yZSBjYWxsaW5nCisgICAgICAgIHRoaXMgbWV0aG9kLiBWYWxpZCBjYXNlcyBhcmU6CisgICAgICAgICogc2VsZi5fYXR0ciBpbiBhIG1ldGhvZCBvciBjbHMuX2F0dHIgaW4gYSBjbGFzc21ldGhvZC4gQ2hlY2tlZCBieQorICAgICAgICBfY2hlY2tfZmlyc3RfYXR0ci4KKyAgICAgICAgKiBLbGFzcy5fYXR0ciBpbnNpZGUgIktsYXNzIiBjbGFzcy4KKyAgICAgICAgKiBLbGFzczIuX2F0dHIgaW5zaWRlICJLbGFzcyIgY2xhc3Mgd2hlbiBLbGFzczIgaXMgYSBiYXNlIGNsYXNzIG9mCisgICAgICAgICAgICBLbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGF0dHJuYW1lID0gbm9kZS5hdHRybmFtZQorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzX2F0dHJfcHJvdGVjdGVkKGF0dHJuYW1lKQorICAgICAgICAgICAgYW5kIGF0dHJuYW1lIG5vdCBpbiBzZWxmLmNvbmZpZy5leGNsdWRlX3Byb3RlY3RlZAorICAgICAgICApOgorCisgICAgICAgICAgICBrbGFzcyA9IG5vZGVfZnJhbWVfY2xhc3Mobm9kZSkKKworICAgICAgICAgICAgIyBJbiBjbGFzc2VzLCBjaGVjayB3ZSBhcmUgbm90IGdldHRpbmcgYSBwYXJlbnQgbWV0aG9kCisgICAgICAgICAgICAjIHRocm91Z2ggdGhlIGNsYXNzIG9iamVjdCBvciB0aHJvdWdoIHN1cGVyCisgICAgICAgICAgICBjYWxsZWUgPSBub2RlLmV4cHIuYXNfc3RyaW5nKCkKKworICAgICAgICAgICAgIyBXZSBhcmUgbm90IGluIGEgY2xhc3MsIG5vIHJlbWFpbmluZyB2YWxpZCBjYXNlCisgICAgICAgICAgICBpZiBrbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInByb3RlY3RlZC1hY2Nlc3MiLCBub2RlPW5vZGUsIGFyZ3M9YXR0cm5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgSWYgdGhlIGV4cHJlc3Npb24gYmVnaW5zIHdpdGggYSBjYWxsIHRvIHN1cGVyLCB0aGF0J3Mgb2suCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmV4cHIsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmV4cHIuZnVuYywgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgIGFuZCBub2RlLmV4cHIuZnVuYy5uYW1lID09ICJzdXBlciIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgSWYgdGhlIGV4cHJlc3Npb24gYmVnaW5zIHdpdGggYSBjYWxsIHRvIHR5cGUoc2VsZiksIHRoYXQncyBvay4KKyAgICAgICAgICAgIGlmIHNlbGYuX2lzX3R5cGVfc2VsZl9jYWxsKG5vZGUuZXhwcik6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgV2UgYXJlIGluIGEgY2xhc3MsIG9uZSByZW1haW5pbmcgdmFsaWQgY2FzZXMsIEtsYXNzLl9hdHRyIGluc2lkZQorICAgICAgICAgICAgIyBLbGFzcworICAgICAgICAgICAgaWYgbm90IChjYWxsZWUgPT0ga2xhc3MubmFtZSBvciBjYWxsZWUgaW4ga2xhc3MuYmFzZW5hbWVzKToKKyAgICAgICAgICAgICAgICAjIERldGVjdCBwcm9wZXJ0eSBhc3NpZ25tZW50cyBpbiB0aGUgYm9keSBvZiB0aGUgY2xhc3MuCisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFjY2VwdGFibGU6CisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgY2xhc3MgQToKKyAgICAgICAgICAgICAgICAjICAgICBiID0gcHJvcGVydHkobGFtYmRhOiBzZWxmLl9iKQorCisgICAgICAgICAgICAgICAgc3RtdCA9IG5vZGUucGFyZW50LnN0YXRlbWVudCgpCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuQXNzaWduKQorICAgICAgICAgICAgICAgICAgICBhbmQgbGVuKHN0bXQudGFyZ2V0cykgPT0gMQorICAgICAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzdG10LnRhcmdldHNbMF0sIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gc3RtdC50YXJnZXRzWzBdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgX2lzX2F0dHJpYnV0ZV9wcm9wZXJ0eShuYW1lLCBrbGFzcyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faXNfY2xhc3NtZXRob2Qobm9kZS5mcmFtZSgpKQorICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5faXNfaW5mZXJyZWRfaW5zdGFuY2Uobm9kZS5leHByLCBrbGFzcykKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNlbGYuX2lzX2NsYXNzX2F0dHJpYnV0ZShhdHRybmFtZSwga2xhc3MpCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBsaWNpdF9wcm90ZWN0ZWRfbWVtYmVyID0gbm90IGF0dHJuYW1lLnN0YXJ0c3dpdGgoIl9fIikKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLmNvbmZpZy5jaGVja19wcm90ZWN0ZWRfYWNjZXNzX2luX3NwZWNpYWxfbWV0aG9kcworICAgICAgICAgICAgICAgICAgICBhbmQgbGljaXRfcHJvdGVjdGVkX21lbWJlcgorICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5faXNfY2FsbGVkX2luc2lkZV9zcGVjaWFsX21ldGhvZChub2RlKQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgicHJvdGVjdGVkLWFjY2VzcyIsIG5vZGU9bm9kZSwgYXJncz1hdHRybmFtZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX2NhbGxlZF9pbnNpZGVfc3BlY2lhbF9tZXRob2Qobm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGlzIGxvY2F0ZWQgaW5zaWRlIGEgc3BlY2lhbCAoYWthIGR1bmRlcikgbWV0aG9kCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcmFtZV9uYW1lID0gbm9kZS5mcmFtZSgpLm5hbWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBmcmFtZV9uYW1lIGFuZCBmcmFtZV9uYW1lIGluIFBZTUVUSE9EUworCisgICAgZGVmIF9pc190eXBlX3NlbGZfY2FsbChzZWxmLCBleHByKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoZXhwciwgYXN0cm9pZC5DYWxsKQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoZXhwci5mdW5jLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICBhbmQgZXhwci5mdW5jLm5hbWUgPT0gInR5cGUiCisgICAgICAgICAgICBhbmQgbGVuKGV4cHIuYXJncykgPT0gMQorICAgICAgICAgICAgYW5kIHNlbGYuX2lzX21hbmRhdG9yeV9tZXRob2RfcGFyYW0oZXhwci5hcmdzWzBdKQorICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9pc19jbGFzc21ldGhvZChmdW5jKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuICpmdW5jKiBub2RlIGlzIGEgY2xhc3MgbWV0aG9kLiIiIgorCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKGZ1bmMsIGFzdHJvaWQuRnVuY3Rpb25EZWYpIGFuZCAoCisgICAgICAgICAgICBmdW5jLnR5cGUgPT0gImNsYXNzbWV0aG9kIiBvciBmdW5jLm5hbWUgPT0gIl9fY2xhc3NfZ2V0aXRlbV9fIgorICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9pc19pbmZlcnJlZF9pbnN0YW5jZShleHByLCBrbGFzcyk6CisgICAgICAgICIiIkNoZWNrIGlmIHRoZSBpbmZlcnJlZCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gKmV4cHIqIGlzIGFuIGluc3RhbmNlIG9mICprbGFzcyouIiIiCisKKyAgICAgICAgaW5mZXJyZWQgPSBzYWZlX2luZmVyKGV4cHIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkluc3RhbmNlKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBpbmZlcnJlZC5fcHJveGllZCBpcyBrbGFzcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfY2xhc3NfYXR0cmlidXRlKG5hbWUsIGtsYXNzKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSAqbmFtZSogaXMgYSBjbGFzcyBvciBpbnN0YW5jZSBtZW1iZXIgb2YgdGhlIGdpdmVuICprbGFzcyouCisKKyAgICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiB0aGUgbmFtZSBpcyBhIHByb3BlcnR5IGluIHRoZSBnaXZlbiBrbGFzcywKKyAgICAgICAgYGBGYWxzZWBgIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2xhc3MuZ2V0YXR0cihuYW1lKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBrbGFzcy5pbnN0YW5jZV9hdHRyKG5hbWUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgdmlzaXRfbmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgaWYgdGhlIG5hbWUgaGFuZGxlIGFuIGFjY2VzcyB0byBhIGNsYXNzIG1lbWJlcgorICAgICAgICBpZiBzbywgcmVnaXN0ZXIgaXQKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2ZpcnN0X2F0dHJzIGFuZCAoCisgICAgICAgICAgICBub2RlLm5hbWUgPT0gc2VsZi5fZmlyc3RfYXR0cnNbLTFdIG9yIG5vdCBzZWxmLl9maXJzdF9hdHRyc1stMV0KKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuX21ldGhfY291bGRfYmVfZnVuYyA9IEZhbHNlCisKKyAgICBkZWYgX2NoZWNrX2FjY2Vzc2VkX21lbWJlcnMoc2VsZiwgbm9kZSwgYWNjZXNzZWQpOgorICAgICAgICAiIiJjaGVjayB0aGF0IGFjY2Vzc2VkIG1lbWJlcnMgYXJlIGRlZmluZWQiIiIKKyAgICAgICAgZXhjcyA9ICgiQXR0cmlidXRlRXJyb3IiLCAiRXhjZXB0aW9uIiwgIkJhc2VFeGNlcHRpb24iKQorICAgICAgICBmb3IgYXR0ciwgbm9kZXMgaW4gYWNjZXNzZWQuaXRlbXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIGlzIGl0IGEgY2xhc3MgYXR0cmlidXRlID8KKyAgICAgICAgICAgICAgICBub2RlLmxvY2FsX2F0dHIoYXR0cikKKyAgICAgICAgICAgICAgICAjIHllcywgc3RvcCBoZXJlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBpcyBpdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb2YgYSBwYXJlbnQgY2xhc3MgPworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5leHQobm9kZS5pbnN0YW5jZV9hdHRyX2FuY2VzdG9ycyhhdHRyKSkKKyAgICAgICAgICAgICAgICAjIHllcywgc3RvcCBoZXJlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgaXMgaXQgYW4gaW5zdGFuY2UgYXR0cmlidXRlID8KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWZzdG10cyA9IG5vZGUuaW5zdGFuY2VfYXR0cihhdHRyKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgZmlsdGVyIG91dCBhdWdtZW50IGFzc2lnbm1lbnQgbm9kZXMKKyAgICAgICAgICAgICAgICBkZWZzdG10cyA9IFtzdG10IGZvciBzdG10IGluIGRlZnN0bXRzIGlmIHN0bXQgbm90IGluIG5vZGVzXQorICAgICAgICAgICAgICAgIGlmIG5vdCBkZWZzdG10czoKKyAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGF1Z21lbnQgYXNzaWdubWVudCBmb3IgdGhpcyBub2RlLCBuby1tZW1iZXIgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAgICAgICMgdHJpZ2dlcmVkIGJ5IHRoZSB0eXBlY2hlY2sgY2hlY2tlcgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgZmlsdGVyIGRlZnN0bXRzIHRvIG9ubHkgcGljayB0aGUgZmlyc3Qgb25lIHdoZW4gdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgIyBzZXZlcmFsIGFzc2lnbm1lbnRzIGluIHRoZSBzYW1lIHNjb3BlCisgICAgICAgICAgICAgICAgc2NvcGUgPSBkZWZzdG10c1swXS5zY29wZSgpCisgICAgICAgICAgICAgICAgZGVmc3RtdHMgPSBbCisgICAgICAgICAgICAgICAgICAgIHN0bXQKKyAgICAgICAgICAgICAgICAgICAgZm9yIGksIHN0bXQgaW4gZW51bWVyYXRlKGRlZnN0bXRzKQorICAgICAgICAgICAgICAgICAgICBpZiBpID09IDAgb3Igc3RtdC5zY29wZSgpIGlzIG5vdCBzY29wZQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAjIGlmIHRoZXJlIGFyZSBzdGlsbCBtb3JlIHRoYW4gb25lLCBkb24ndCBhdHRlbXB0IHRvIGJlIHNtYXJ0ZXIKKyAgICAgICAgICAgICAgICAjIHRoYW4gd2UgY2FuIGJlCisgICAgICAgICAgICAgICAgaWYgbGVuKGRlZnN0bXRzKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBkZWZzdG10ID0gZGVmc3RtdHNbMF0KKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aGF0IGlmIHRoZSBub2RlIGlzIGFjY2Vzc2VkIGluIHRoZSBzYW1lIG1ldGhvZCBhcworICAgICAgICAgICAgICAgICAgICAjIGl0J3MgZGVmaW5lZCwgaXQncyBhY2Nlc3NlZCBhZnRlciB0aGUgaW5pdGlhbCBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gZGVmc3RtdC5mcmFtZSgpCisgICAgICAgICAgICAgICAgICAgIGxubyA9IGRlZnN0bXQuZnJvbWxpbmVubworICAgICAgICAgICAgICAgICAgICBmb3IgX25vZGUgaW4gbm9kZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25vZGUuZnJhbWUoKSBpcyBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBfbm9kZS5mcm9tbGluZW5vIDwgbG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhc3Ryb2lkLmFyZV9leGNsdXNpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ub2RlLnN0YXRlbWVudCgpLCBkZWZzdG10LCBleGNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzLW1lbWJlci1iZWZvcmUtZGVmaW5pdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGF0dHIsIGxubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19maXJzdF9hcmdfZm9yX3R5cGUoc2VsZiwgbm9kZSwgbWV0YWNsYXNzPTApOgorICAgICAgICAiIiJjaGVjayB0aGUgbmFtZSBvZiBmaXJzdCBhcmd1bWVudCwgZXhwZWN0OgorCisgICAgICAgICogJ3NlbGYnIGZvciBhIHJlZ3VsYXIgbWV0aG9kCisgICAgICAgICogJ2NscycgZm9yIGEgY2xhc3MgbWV0aG9kIG9yIGEgbWV0YWNsYXNzIHJlZ3VsYXIgbWV0aG9kIChhY3R1YWxseQorICAgICAgICAgIHZhbGlkLWNsYXNzbWV0aG9kLWZpcnN0LWFyZyB2YWx1ZSkKKyAgICAgICAgKiAnbWNzJyBmb3IgYSBtZXRhY2xhc3MgY2xhc3MgbWV0aG9kIChhY3R1YWxseQorICAgICAgICAgIHZhbGlkLW1ldGFjbGFzcy1jbGFzc21ldGhvZC1maXJzdC1hcmcpCisgICAgICAgICogbm90IG9uZSBvZiB0aGUgYWJvdmUgZm9yIGEgc3RhdGljIG1ldGhvZAorICAgICAgICAiIiIKKyAgICAgICAgIyBkb24ndCBjYXJlIGFib3V0IGZ1bmN0aW9ucyB3aXRoIHVua25vd24gYXJndW1lbnQgKGJ1aWx0aW5zKQorICAgICAgICBpZiBub2RlLmFyZ3MuYXJncyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vZGUuYXJncy5wb3Nvbmx5YXJnczoKKyAgICAgICAgICAgIGZpcnN0X2FyZyA9IG5vZGUuYXJncy5wb3Nvbmx5YXJnc1swXS5uYW1lCisgICAgICAgIGVsaWYgbm9kZS5hcmdzLmFyZ3M6CisgICAgICAgICAgICBmaXJzdF9hcmcgPSBub2RlLmFyZ25hbWVzKClbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0X2FyZyA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmlyc3RfYXR0cnMuYXBwZW5kKGZpcnN0X2FyZykKKyAgICAgICAgZmlyc3QgPSBzZWxmLl9maXJzdF9hdHRyc1stMV0KKyAgICAgICAgIyBzdGF0aWMgbWV0aG9kCisgICAgICAgIGlmIG5vZGUudHlwZSA9PSAic3RhdGljbWV0aG9kIjoKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBmaXJzdF9hcmcgPT0gInNlbGYiCisgICAgICAgICAgICAgICAgb3IgZmlyc3RfYXJnIGluIHNlbGYuY29uZmlnLnZhbGlkX2NsYXNzbWV0aG9kX2ZpcnN0X2FyZworICAgICAgICAgICAgICAgIG9yIGZpcnN0X2FyZyBpbiBzZWxmLmNvbmZpZy52YWxpZF9tZXRhY2xhc3NfY2xhc3NtZXRob2RfZmlyc3RfYXJnCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhZC1zdGF0aWNtZXRob2QtYXJndW1lbnQiLCBhcmdzPWZpcnN0LCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLl9maXJzdF9hdHRyc1stMV0gPSBOb25lCisgICAgICAgICMgY2xhc3MgLyByZWd1bGFyIG1ldGhvZCB3aXRoIG5vIGFyZ3MKKyAgICAgICAgZWxpZiBub3Qgbm9kZS5hcmdzLmFyZ3MgYW5kIG5vdCBub2RlLmFyZ3MucG9zb25seWFyZ3M6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJuby1tZXRob2QtYXJndW1lbnQiLCBub2RlPW5vZGUpCisgICAgICAgICMgbWV0YWNsYXNzCisgICAgICAgIGVsaWYgbWV0YWNsYXNzOgorICAgICAgICAgICAgIyBtZXRhY2xhc3MgX19uZXdfXyBvciBjbGFzc21ldGhvZAorICAgICAgICAgICAgaWYgbm9kZS50eXBlID09ICJjbGFzc21ldGhvZCI6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfZmlyc3RfYXJnX2NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLnZhbGlkX21ldGFjbGFzc19jbGFzc21ldGhvZF9maXJzdF9hcmcsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICJiYWQtbWNzLWNsYXNzbWV0aG9kLWFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICMgbWV0YWNsYXNzIHJlZ3VsYXIgbWV0aG9kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ZpcnN0X2FyZ19jb25maWcoCisgICAgICAgICAgICAgICAgICAgIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy52YWxpZF9jbGFzc21ldGhvZF9maXJzdF9hcmcsCisgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICJiYWQtbWNzLW1ldGhvZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICMgcmVndWxhciBjbGFzcworICAgICAgICBlbHNlOiAgIyBweWxpbnQ6IGRpc2FibGU9ZWxzZS1pZi11c2VkCisgICAgICAgICAgICAjIGNsYXNzIG1ldGhvZAorICAgICAgICAgICAgaWYgbm9kZS50eXBlID09ICJjbGFzc21ldGhvZCIgb3Igbm9kZS5uYW1lID09ICJfX2NsYXNzX2dldGl0ZW1fXyI6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfZmlyc3RfYXJnX2NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLnZhbGlkX2NsYXNzbWV0aG9kX2ZpcnN0X2FyZywKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgImJhZC1jbGFzc21ldGhvZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAjIHJlZ3VsYXIgbWV0aG9kIHdpdGhvdXQgc2VsZiBhcyBhcmd1bWVudAorICAgICAgICAgICAgZWxpZiBmaXJzdCAhPSAic2VsZiI6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibm8tc2VsZi1hcmd1bWVudCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfZmlyc3RfYXJnX2NvbmZpZyhzZWxmLCBmaXJzdCwgY29uZmlnLCBub2RlLCBtZXNzYWdlLCBtZXRob2RfbmFtZSk6CisgICAgICAgIGlmIGZpcnN0IG5vdCBpbiBjb25maWc6CisgICAgICAgICAgICBpZiBsZW4oY29uZmlnKSA9PSAxOgorICAgICAgICAgICAgICAgIHZhbGlkID0gcmVwcihjb25maWdbMF0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbGlkID0gIiwgIi5qb2luKHJlcHIodikgZm9yIHYgaW4gY29uZmlnWzotMV0pCisgICAgICAgICAgICAgICAgdmFsaWQgPSBmInt2YWxpZH0gb3Ige2NvbmZpZ1stMV0hcn0iCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1lc3NhZ2UsIGFyZ3M9KG1ldGhvZF9uYW1lLCB2YWxpZCksIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfYmFzZXNfY2xhc3NlcyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgdGhhdCB0aGUgZ2l2ZW4gY2xhc3Mgbm9kZSBpbXBsZW1lbnRzIGFic3RyYWN0IG1ldGhvZHMgZnJvbQorICAgICAgICBiYXNlIGNsYXNzZXMKKyAgICAgICAgIiIiCisKKyAgICAgICAgZGVmIGlzX2Fic3RyYWN0KG1ldGhvZCk6CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmlzX2Fic3RyYWN0KHBhc3NfaXNfYWJzdHJhY3Q9RmFsc2UpCisKKyAgICAgICAgIyBjaGVjayBpZiB0aGlzIGNsYXNzIGFic3RyYWN0CisgICAgICAgIGlmIGNsYXNzX2lzX2Fic3RyYWN0KG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbWV0aG9kcyA9IHNvcnRlZCgKKyAgICAgICAgICAgIHVuaW1wbGVtZW50ZWRfYWJzdHJhY3RfbWV0aG9kcyhub2RlLCBpc19hYnN0cmFjdCkuaXRlbXMoKSwKKyAgICAgICAgICAgIGtleT1sYW1iZGEgaXRlbTogaXRlbVswXSwKKyAgICAgICAgKQorICAgICAgICBmb3IgbmFtZSwgbWV0aG9kIGluIG1ldGhvZHM6CisgICAgICAgICAgICBvd25lciA9IG1ldGhvZC5wYXJlbnQuZnJhbWUoKQorICAgICAgICAgICAgaWYgb3duZXIgaXMgbm9kZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBvd25lciBpcyBub3QgdGhpcyBjbGFzcywgaXQgbXVzdCBiZSBhIHBhcmVudCBjbGFzcworICAgICAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBhbmNlc3RvcidzIG1ldGhvZCBpcyBub3QgYWJzdHJhY3QKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gbm9kZS5sb2NhbHM6CisgICAgICAgICAgICAgICAgIyBpdCBpcyByZWRlZmluZWQgYXMgYW4gYXR0cmlidXRlIG9yIHdpdGggYSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImFic3RyYWN0LW1ldGhvZCIsIG5vZGU9bm9kZSwgYXJncz0obmFtZSwgb3duZXIubmFtZSkpCisKKyAgICBkZWYgX2NoZWNrX2luaXQoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIHRoYXQgdGhlIF9faW5pdF9fIG1ldGhvZCBjYWxsIHN1cGVyIG9yIGFuY2VzdG9ycydfX2luaXRfXworICAgICAgICBtZXRob2QgKHVubGVzcyBpdCBpcyB1c2VkIGZvciB0eXBlIGhpbnRpbmcgd2l0aCBgdHlwaW5nLm92ZXJsb2FkYCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoCisgICAgICAgICAgICAic3VwZXItaW5pdC1ub3QtY2FsbGVkIgorICAgICAgICApIGFuZCBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJub24tcGFyZW50LWluaXQtY2FsbGVkIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAga2xhc3Nfbm9kZSA9IG5vZGUucGFyZW50LmZyYW1lKCkKKyAgICAgICAgdG9fY2FsbCA9IF9hbmNlc3RvcnNfdG9fY2FsbChrbGFzc19ub2RlKQorICAgICAgICBub3RfY2FsbGVkX3lldCA9IGRpY3QodG9fY2FsbCkKKyAgICAgICAgZm9yIHN0bXQgaW4gbm9kZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgZXhwciA9IHN0bXQuZnVuYworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhwciwgYXN0cm9pZC5BdHRyaWJ1dGUpIG9yIGV4cHIuYXR0cm5hbWUgIT0gIl9faW5pdF9fIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBza2lwIHRoZSB0ZXN0IGlmIHVzaW5nIHN1cGVyCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShleHByLmV4cHIsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShleHByLmV4cHIuZnVuYywgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgIGFuZCBleHByLmV4cHIuZnVuYy5uYW1lID09ICJzdXBlciIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGtsYXNzIGluIGV4cHIuZXhwci5pbmZlcigpOgorICAgICAgICAgICAgICAgICAgICBpZiBrbGFzcyBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgaW5mZXJyZWQga2xhc3MgY2FuIGJlIHN1cGVyKCksIHdoaWNoIHdhcworICAgICAgICAgICAgICAgICAgICAjIGFzc2lnbmVkIHRvIGEgdmFyaWFibGUgYW5kIHRoZSBgX19pbml0X19gCisgICAgICAgICAgICAgICAgICAgICMgd2FzIGNhbGxlZCBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAjIGJhc2UgPSBzdXBlcigpCisgICAgICAgICAgICAgICAgICAgICMgYmFzZS5fX2luaXRfXyguLi4pCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShrbGFzcywgYXN0cm9pZC5JbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGtsYXNzLl9wcm94aWVkLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGlzX2J1aWx0aW5fb2JqZWN0KGtsYXNzLl9wcm94aWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGtsYXNzLl9wcm94aWVkLm5hbWUgPT0gInN1cGVyIgorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2xhc3MsIGFzdHJvaWQub2JqZWN0cy5TdXBlcik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIG5vdF9jYWxsZWRfeWV0W2tsYXNzXQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBrbGFzcyBub3QgaW4gdG9fY2FsbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLXBhcmVudC1pbml0LWNhbGxlZCIsIG5vZGU9ZXhwciwgYXJncz1rbGFzcy5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIGtsYXNzLCBtZXRob2QgaW4gbm90X2NhbGxlZF95ZXQuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGRlY29yYXRlZF93aXRoKG5vZGUsIFsidHlwaW5nLm92ZXJsb2FkIl0pOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBjbHMgPSBub2RlX2ZyYW1lX2NsYXNzKG1ldGhvZCkKKyAgICAgICAgICAgIGlmIGtsYXNzLm5hbWUgPT0gIm9iamVjdCIgb3IgKGNscyBhbmQgY2xzLm5hbWUgPT0gIm9iamVjdCIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJzdXBlci1pbml0LW5vdC1jYWxsZWQiLCBhcmdzPWtsYXNzLm5hbWUsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfc2lnbmF0dXJlKHNlbGYsIG1ldGhvZDEsIHJlZm1ldGhvZCwgY2xhc3NfdHlwZSwgY2xzKToKKyAgICAgICAgIiIiY2hlY2sgdGhhdCB0aGUgc2lnbmF0dXJlIG9mIHRoZSB0d28gZ2l2ZW4gbWV0aG9kcyBtYXRjaCIiIgorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShtZXRob2QxLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UocmVmbWV0aG9kLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAibWV0aG9kLWNoZWNrLWZhaWxlZCIsIGFyZ3M9KG1ldGhvZDEsIHJlZm1ldGhvZCksIG5vZGU9bWV0aG9kMQorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW5zdGFuY2UgPSBjbHMuaW5zdGFudGlhdGVfY2xhc3MoKQorICAgICAgICBtZXRob2QxID0gYXN0cm9pZC5zY29wZWRfbm9kZXMuZnVuY3Rpb25fdG9fbWV0aG9kKG1ldGhvZDEsIGluc3RhbmNlKQorICAgICAgICByZWZtZXRob2QgPSBhc3Ryb2lkLnNjb3BlZF9ub2Rlcy5mdW5jdGlvbl90b19tZXRob2QocmVmbWV0aG9kLCBpbnN0YW5jZSkKKworICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgZnVuY3Rpb25zIHdpdGggdW5rbm93biBhcmd1bWVudCAoYnVpbHRpbnMpLgorICAgICAgICBpZiBtZXRob2QxLmFyZ3MuYXJncyBpcyBOb25lIG9yIHJlZm1ldGhvZC5hcmdzLmFyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSWdub3JlIHByaXZhdGUgdG8gY2xhc3MgbWV0aG9kcy4KKyAgICAgICAgaWYgaXNfYXR0cl9wcml2YXRlKG1ldGhvZDEubmFtZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBJZ25vcmUgc2V0dGVycywgdGhleSBoYXZlIGFuIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LAorICAgICAgICAjIHdoaWNoIHNob3VsZG4ndCBiZSB0YWtlbiBpbiBjb25zaWRlcmF0aW9uLgorICAgICAgICBpZiBpc19wcm9wZXJ0eV9zZXR0ZXIobWV0aG9kMSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBhcmdfZGlmZmVyX291dHB1dCA9IF9kaWZmZXJlbnRfcGFyYW1ldGVycygKKyAgICAgICAgICAgIHJlZm1ldGhvZCwgbWV0aG9kMSwgZHVtbXlfcGFyYW1ldGVyX3JlZ2V4PXNlbGYuX2R1bW15X3JneAorICAgICAgICApCisgICAgICAgIGlmIGxlbihhcmdfZGlmZmVyX291dHB1dCkgPiAwOgorICAgICAgICAgICAgZm9yIG1zZyBpbiBhcmdfZGlmZmVyX291dHB1dDoKKyAgICAgICAgICAgICAgICBpZiAiTnVtYmVyIiBpbiBtc2c6CisgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FyZ3NfbWV0aG9kMSA9IGxlbihtZXRob2QxLmFyZ3MuYXJncykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWV0aG9kMS5hcmdzLnZhcmFyZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FyZ3NfbWV0aG9kMSArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIG1ldGhvZDEuYXJncy5rd2FyZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FyZ3NfbWV0aG9kMSArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIG1ldGhvZDEuYXJncy5rd29ubHlhcmdzOgorICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYXJnc19tZXRob2QxICs9IGxlbihtZXRob2QxLmFyZ3Mua3dvbmx5YXJncykKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfYXJnc19yZWZtZXRob2QgPSBsZW4ocmVmbWV0aG9kLmFyZ3MuYXJncykKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVmbWV0aG9kLmFyZ3MudmFyYXJnOgorICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfYXJnc19yZWZtZXRob2QgKz0gMQorICAgICAgICAgICAgICAgICAgICBpZiByZWZtZXRob2QuYXJncy5rd2FyZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FyZ3NfcmVmbWV0aG9kICs9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVmbWV0aG9kLmFyZ3Mua3dvbmx5YXJnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2FyZ3NfcmVmbWV0aG9kICs9IGxlbihyZWZtZXRob2QuYXJncy5rd29ubHlhcmdzKQorICAgICAgICAgICAgICAgICAgICBlcnJvcl90eXBlID0gImFyZ3VtZW50cy1kaWZmZXIiCisgICAgICAgICAgICAgICAgICAgIG1zZ19hcmdzID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnCisgICAgICAgICAgICAgICAgICAgICAgICArIGYid2FzIHt0b3RhbF9hcmdzX3JlZm1ldGhvZH0gaW4gJ3tyZWZtZXRob2QucGFyZW50Lm5hbWV9LntyZWZtZXRob2QubmFtZX0nIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICBmImlzIG5vdyB7dG90YWxfYXJnc19tZXRob2QxfSBpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZiJ7bWV0aG9kMS5wYXJlbnQubmFtZX0ue21ldGhvZDEubmFtZX0iLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZWxpZiAicmVuYW1lZCIgaW4gbXNnOgorICAgICAgICAgICAgICAgICAgICBlcnJvcl90eXBlID0gImFyZ3VtZW50cy1yZW5hbWVkIgorICAgICAgICAgICAgICAgICAgICBtc2dfYXJncyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmInttZXRob2QxLnBhcmVudC5uYW1lfS57bWV0aG9kMS5uYW1lfSIsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcl90eXBlID0gImFyZ3VtZW50cy1kaWZmZXIiCisgICAgICAgICAgICAgICAgICAgIG1zZ19hcmdzID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGYie21ldGhvZDEucGFyZW50Lm5hbWV9LnttZXRob2QxLm5hbWV9IiwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoZXJyb3JfdHlwZSwgYXJncz1tc2dfYXJncywgbm9kZT1tZXRob2QxKQorICAgICAgICBlbGlmICgKKyAgICAgICAgICAgIGxlbihtZXRob2QxLmFyZ3MuZGVmYXVsdHMpIDwgbGVuKHJlZm1ldGhvZC5hcmdzLmRlZmF1bHRzKQorICAgICAgICAgICAgYW5kIG5vdCBtZXRob2QxLmFyZ3MudmFyYXJnCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJzaWduYXR1cmUtZGlmZmVycyIsIGFyZ3M9KGNsYXNzX3R5cGUsIG1ldGhvZDEubmFtZSksIG5vZGU9bWV0aG9kMQorICAgICAgICAgICAgKQorCisgICAgZGVmIF91c2VzX21hbmRhdG9yeV9tZXRob2RfcGFyYW0oc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgYXR0cmlidXRlIGxvb2t1cCBuYW1lIHVzZSBmaXJzdCBhdHRyaWJ1dGUgdmFyaWFibGUgbmFtZQorCisgICAgICAgIE5hbWUgaXMgYHNlbGZgIGZvciBtZXRob2QsIGBjbHNgIGZvciBjbGFzc21ldGhvZCBhbmQgYG1jc2AgZm9yIG1ldGFjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19tYW5kYXRvcnlfbWV0aG9kX3BhcmFtKG5vZGUuZXhwcikKKworICAgIGRlZiBfaXNfbWFuZGF0b3J5X21ldGhvZF9wYXJhbShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgYXN0cm9pZC5OYW1lIGNvcnJlc3BvbmRzIHRvIGZpcnN0IGF0dHJpYnV0ZSB2YXJpYWJsZSBuYW1lCisKKyAgICAgICAgTmFtZSBpcyBgc2VsZmAgZm9yIG1ldGhvZCwgYGNsc2AgZm9yIGNsYXNzbWV0aG9kIGFuZCBgbWNzYCBmb3IgbWV0YWNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIHNlbGYuX2ZpcnN0X2F0dHJzCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICBhbmQgbm9kZS5uYW1lID09IHNlbGYuX2ZpcnN0X2F0dHJzWy0xXQorICAgICAgICApCisKKworY2xhc3MgU3BlY2lhbE1ldGhvZHNDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAiIiJDaGVja2VyIHdoaWNoIHZlcmlmaWVzIHRoYXQgc3BlY2lhbCBtZXRob2RzCisgICAgYXJlIGltcGxlbWVudGVkIGNvcnJlY3RseS4KKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisgICAgbmFtZSA9ICJjbGFzc2VzIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJFMDMwMSI6ICgKKyAgICAgICAgICAgICJfX2l0ZXJfXyByZXR1cm5zIG5vbi1pdGVyYXRvciIsCisgICAgICAgICAgICAibm9uLWl0ZXJhdG9yLXJldHVybmVkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gX19pdGVyX18gbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhbiAiCisgICAgICAgICAgICAiaXRlcmFibGUgKGkuZS4gaGFzIG5vIGAlc2AgbWV0aG9kKSIgJSBORVhUX01FVEhPRCwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAib2xkX25hbWVzIjogWworICAgICAgICAgICAgICAgICAgICAoIlcwMjM0IiwgIm9sZC1ub24taXRlcmF0b3ItcmV0dXJuZWQtMSIpLAorICAgICAgICAgICAgICAgICAgICAoIkUwMjM0IiwgIm9sZC1ub24taXRlcmF0b3ItcmV0dXJuZWQtMiIpLAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICJFMDMwMiI6ICgKKyAgICAgICAgICAgICJUaGUgc3BlY2lhbCBtZXRob2QgJXIgZXhwZWN0cyAlcyBwYXJhbShzKSwgJWQgJXMgZ2l2ZW4iLAorICAgICAgICAgICAgInVuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlIiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gYSBzcGVjaWFsIG1ldGhvZCB3YXMgZGVmaW5lZCB3aXRoIGFuICIKKyAgICAgICAgICAgICJpbnZhbGlkIG51bWJlciBvZiBwYXJhbWV0ZXJzLiBJZiBpdCBoYXMgdG9vIGZldyBvciAiCisgICAgICAgICAgICAidG9vIG1hbnksIGl0IG1pZ2h0IG5vdCB3b3JrIGF0IGFsbC4iLAorICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJFMDIzNSIsICJiYWQtY29udGV4dC1tYW5hZ2VyIildfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMzAzIjogKAorICAgICAgICAgICAgIl9fbGVuX18gZG9lcyBub3QgcmV0dXJuIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIiwKKyAgICAgICAgICAgICJpbnZhbGlkLWxlbmd0aC1yZXR1cm5lZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgX19sZW5fXyBtZXRob2QgcmV0dXJucyBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgIgorICAgICAgICAgICAgIm5vbi1uZWdhdGl2ZSBpbnRlZ2VyIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMzA0IjogKAorICAgICAgICAgICAgIl9fYm9vbF9fIGRvZXMgbm90IHJldHVybiBib29sIiwKKyAgICAgICAgICAgICJpbnZhbGlkLWJvb2wtcmV0dXJuZWQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fYm9vbF9fIG1ldGhvZCByZXR1cm5zIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYSBib29sIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMzA1IjogKAorICAgICAgICAgICAgIl9faW5kZXhfXyBkb2VzIG5vdCByZXR1cm4gaW50IiwKKyAgICAgICAgICAgICJpbnZhbGlkLWluZGV4LXJldHVybmVkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gX19pbmRleF9fIG1ldGhvZCByZXR1cm5zIHNvbWV0aGluZyB3aGljaCBpcyBub3QgIgorICAgICAgICAgICAgImFuIGludGVnZXIiLAorICAgICAgICApLAorICAgICAgICAiRTAzMDYiOiAoCisgICAgICAgICAgICAiX19yZXByX18gZG9lcyBub3QgcmV0dXJuIHN0ciIsCisgICAgICAgICAgICAiaW52YWxpZC1yZXByLXJldHVybmVkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBfX3JlcHJfXyBtZXRob2QgcmV0dXJucyBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGEgc3RyaW5nIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUwMzA3IjogKAorICAgICAgICAgICAgIl9fc3RyX18gZG9lcyBub3QgcmV0dXJuIHN0ciIsCisgICAgICAgICAgICAiaW52YWxpZC1zdHItcmV0dXJuZWQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fc3RyX18gbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhIHN0cmluZyIsCisgICAgICAgICksCisgICAgICAgICJFMDMwOCI6ICgKKyAgICAgICAgICAgICJfX2J5dGVzX18gZG9lcyBub3QgcmV0dXJuIGJ5dGVzIiwKKyAgICAgICAgICAgICJpbnZhbGlkLWJ5dGVzLXJldHVybmVkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBfX2J5dGVzX18gbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBieXRlcyIsCisgICAgICAgICksCisgICAgICAgICJFMDMwOSI6ICgKKyAgICAgICAgICAgICJfX2hhc2hfXyBkb2VzIG5vdCByZXR1cm4gaW50IiwKKyAgICAgICAgICAgICJpbnZhbGlkLWhhc2gtcmV0dXJuZWQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9faGFzaF9fIG1ldGhvZCByZXR1cm5zIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYW4gaW50ZWdlciIsCisgICAgICAgICksCisgICAgICAgICJFMDMxMCI6ICgKKyAgICAgICAgICAgICJfX2xlbmd0aF9oaW50X18gZG9lcyBub3QgcmV0dXJuIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIiwKKyAgICAgICAgICAgICJpbnZhbGlkLWxlbmd0aC1oaW50LXJldHVybmVkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBfX2xlbmd0aF9oaW50X18gbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhICIKKyAgICAgICAgICAgICJub24tbmVnYXRpdmUgaW50ZWdlciIsCisgICAgICAgICksCisgICAgICAgICJFMDMxMSI6ICgKKyAgICAgICAgICAgICJfX2Zvcm1hdF9fIGRvZXMgbm90IHJldHVybiBzdHIiLAorICAgICAgICAgICAgImludmFsaWQtZm9ybWF0LXJldHVybmVkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBfX2Zvcm1hdF9fIG1ldGhvZCByZXR1cm5zIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYSBzdHJpbmciLAorICAgICAgICApLAorICAgICAgICAiRTAzMTIiOiAoCisgICAgICAgICAgICAiX19nZXRuZXdhcmdzX18gZG9lcyBub3QgcmV0dXJuIGEgdHVwbGUiLAorICAgICAgICAgICAgImludmFsaWQtZ2V0bmV3YXJncy1yZXR1cm5lZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgX19nZXRuZXdhcmdzX18gbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCAiCisgICAgICAgICAgICAiYSB0dXBsZSIsCisgICAgICAgICksCisgICAgICAgICJFMDMxMyI6ICgKKyAgICAgICAgICAgICJfX2dldG5ld2FyZ3NfZXhfXyBkb2VzIG5vdCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nICh0dXBsZSwgZGljdCkiLAorICAgICAgICAgICAgImludmFsaWQtZ2V0bmV3YXJncy1leC1yZXR1cm5lZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgX19nZXRuZXdhcmdzX2V4X18gbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCAiCisgICAgICAgICAgICAib2YgdGhlIGZvcm0gdHVwbGUodHVwbGUsIGRpY3QpIiwKKyAgICAgICAgKSwKKyAgICB9CisgICAgcHJpb3JpdHkgPSAtMgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcj1Ob25lKToKKyAgICAgICAgQmFzZUNoZWNrZXIuX19pbml0X18oc2VsZiwgbGludGVyKQorICAgICAgICBzZWxmLl9wcm90b2NvbF9tYXAgPSB7CisgICAgICAgICAgICAiX19pdGVyX18iOiBzZWxmLl9jaGVja19pdGVyLAorICAgICAgICAgICAgIl9fbGVuX18iOiBzZWxmLl9jaGVja19sZW4sCisgICAgICAgICAgICAiX19ib29sX18iOiBzZWxmLl9jaGVja19ib29sLAorICAgICAgICAgICAgIl9faW5kZXhfXyI6IHNlbGYuX2NoZWNrX2luZGV4LAorICAgICAgICAgICAgIl9fcmVwcl9fIjogc2VsZi5fY2hlY2tfcmVwciwKKyAgICAgICAgICAgICJfX3N0cl9fIjogc2VsZi5fY2hlY2tfc3RyLAorICAgICAgICAgICAgIl9fYnl0ZXNfXyI6IHNlbGYuX2NoZWNrX2J5dGVzLAorICAgICAgICAgICAgIl9faGFzaF9fIjogc2VsZi5fY2hlY2tfaGFzaCwKKyAgICAgICAgICAgICJfX2xlbmd0aF9oaW50X18iOiBzZWxmLl9jaGVja19sZW5ndGhfaGludCwKKyAgICAgICAgICAgICJfX2Zvcm1hdF9fIjogc2VsZi5fY2hlY2tfZm9ybWF0LAorICAgICAgICAgICAgIl9fZ2V0bmV3YXJnc19fIjogc2VsZi5fY2hlY2tfZ2V0bmV3YXJncywKKyAgICAgICAgICAgICJfX2dldG5ld2FyZ3NfZXhfXyI6IHNlbGYuX2NoZWNrX2dldG5ld2FyZ3NfZXgsCisgICAgICAgIH0KKworICAgIEBjaGVja19tZXNzYWdlcygKKyAgICAgICAgInVuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlIiwKKyAgICAgICAgIm5vbi1pdGVyYXRvci1yZXR1cm5lZCIsCisgICAgICAgICJpbnZhbGlkLWxlbmd0aC1yZXR1cm5lZCIsCisgICAgICAgICJpbnZhbGlkLWJvb2wtcmV0dXJuZWQiLAorICAgICAgICAiaW52YWxpZC1pbmRleC1yZXR1cm5lZCIsCisgICAgICAgICJpbnZhbGlkLXJlcHItcmV0dXJuZWQiLAorICAgICAgICAiaW52YWxpZC1zdHItcmV0dXJuZWQiLAorICAgICAgICAiaW52YWxpZC1ieXRlcy1yZXR1cm5lZCIsCisgICAgICAgICJpbnZhbGlkLWhhc2gtcmV0dXJuZWQiLAorICAgICAgICAiaW52YWxpZC1sZW5ndGgtaGludC1yZXR1cm5lZCIsCisgICAgICAgICJpbnZhbGlkLWZvcm1hdC1yZXR1cm5lZCIsCisgICAgICAgICJpbnZhbGlkLWdldG5ld2FyZ3MtcmV0dXJuZWQiLAorICAgICAgICAiaW52YWxpZC1nZXRuZXdhcmdzLWV4LXJldHVybmVkIiwKKyAgICApCisgICAgZGVmIHZpc2l0X2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgbm9kZS5pc19tZXRob2QoKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGluZmVycmVkID0gX3NhZmVfaW5mZXJfY2FsbF9yZXN1bHQobm9kZSwgbm9kZSkKKyAgICAgICAgIyBPbmx5IHdhbnQgdG8gY2hlY2sgdHlwZXMgdGhhdCB3ZSBhcmUgYWJsZSB0byBpbmZlcgorICAgICAgICBpZiBpbmZlcnJlZCBhbmQgbm9kZS5uYW1lIGluIHNlbGYuX3Byb3RvY29sX21hcDoKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sX21hcFtub2RlLm5hbWVdKG5vZGUsIGluZmVycmVkKQorCisgICAgICAgIGlmIG5vZGUubmFtZSBpbiBQWU1FVEhPRFM6CisgICAgICAgICAgICBzZWxmLl9jaGVja191bmV4cGVjdGVkX21ldGhvZF9zaWduYXR1cmUobm9kZSkKKworICAgIHZpc2l0X2FzeW5jZnVuY3Rpb25kZWYgPSB2aXNpdF9mdW5jdGlvbmRlZgorCisgICAgZGVmIF9jaGVja191bmV4cGVjdGVkX21ldGhvZF9zaWduYXR1cmUoc2VsZiwgbm9kZSk6CisgICAgICAgIGV4cGVjdGVkX3BhcmFtcyA9IFNQRUNJQUxfTUVUSE9EU19QQVJBTVNbbm9kZS5uYW1lXQorCisgICAgICAgIGlmIGV4cGVjdGVkX3BhcmFtcyBpcyBOb25lOgorICAgICAgICAgICAgIyBUaGlzIGNhbiBzdXBwb3J0IGEgdmFyaWFibGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IG5vZGUuYXJncy5hcmdzIGFuZCBub3Qgbm9kZS5hcmdzLnZhcmFyZzoKKyAgICAgICAgICAgICMgTWV0aG9kIGhhcyBubyBwYXJhbWV0ZXIsIHdpbGwgYmUgY2F1Z2h0CisgICAgICAgICAgICAjIGJ5IG5vLW1ldGhvZC1hcmd1bWVudC4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGRlY29yYXRlZF93aXRoKG5vZGUsIFthc3Ryb2lkLmJhc2VzLkJVSUxUSU5TICsgIi5zdGF0aWNtZXRob2QiXSk6CisgICAgICAgICAgICAjIFdlIGV4cGVjdCB0byBub3QgdGFrZSBpbiBjb25zaWRlcmF0aW9uIHNlbGYuCisgICAgICAgICAgICBhbGxfYXJncyA9IG5vZGUuYXJncy5hcmdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbGxfYXJncyA9IG5vZGUuYXJncy5hcmdzWzE6XQorICAgICAgICBtYW5kYXRvcnkgPSBsZW4oYWxsX2FyZ3MpIC0gbGVuKG5vZGUuYXJncy5kZWZhdWx0cykKKyAgICAgICAgb3B0aW9uYWwgPSBsZW4obm9kZS5hcmdzLmRlZmF1bHRzKQorICAgICAgICBjdXJyZW50X3BhcmFtcyA9IG1hbmRhdG9yeSArIG9wdGlvbmFsCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZF9wYXJhbXMsIHR1cGxlKToKKyAgICAgICAgICAgICMgVGhlIGV4cGVjdGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzIGNhbiBiZSBhbnkgdmFsdWUgZnJvbSB0aGlzCisgICAgICAgICAgICAjIHR1cGxlLCBhbHRob3VnaCB0aGUgdXNlciBzaG91bGQgaW1wbGVtZW50IHRoZSBtZXRob2QKKyAgICAgICAgICAgICMgdG8gdGFrZSBhbGwgb2YgdGhlbSBpbiBjb25zaWRlcmF0aW9uLgorICAgICAgICAgICAgZW1pdCA9IG1hbmRhdG9yeSBub3QgaW4gZXhwZWN0ZWRfcGFyYW1zCisgICAgICAgICAgICBleHBlY3RlZF9wYXJhbXMgPSAiYmV0d2VlbiAlZCBvciAlZCIgJSBleHBlY3RlZF9wYXJhbXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSWYgdGhlIG51bWJlciBvZiBtYW5kYXRvcnkgcGFyYW1ldGVycyBkb2Vzbid0CisgICAgICAgICAgICAjIHN1ZmZpY2UsIHRoZSBleHBlY3RlZCBwYXJhbWV0ZXJzIGZvciB0aGlzCisgICAgICAgICAgICAjIGZ1bmN0aW9uIHdpbGwgYmUgZGVkdWNlZCBmcm9tIHRoZSBvcHRpb25hbAorICAgICAgICAgICAgIyBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgcmVzdCA9IGV4cGVjdGVkX3BhcmFtcyAtIG1hbmRhdG9yeQorICAgICAgICAgICAgaWYgcmVzdCA9PSAwOgorICAgICAgICAgICAgICAgIGVtaXQgPSBGYWxzZQorICAgICAgICAgICAgZWxpZiByZXN0IDwgMDoKKyAgICAgICAgICAgICAgICBlbWl0ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiByZXN0ID4gMDoKKyAgICAgICAgICAgICAgICBlbWl0ID0gbm90ICgob3B0aW9uYWwgLSByZXN0KSA+PSAwIG9yIG5vZGUuYXJncy52YXJhcmcpCisKKyAgICAgICAgaWYgZW1pdDoKKyAgICAgICAgICAgIHZlcmIgPSAid2FzIiBpZiBjdXJyZW50X3BhcmFtcyA8PSAxIGVsc2UgIndlcmUiCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZSIsCisgICAgICAgICAgICAgICAgYXJncz0obm9kZS5uYW1lLCBleHBlY3RlZF9wYXJhbXMsIGN1cnJlbnRfcGFyYW1zLCB2ZXJiKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9pc193cmFwcGVkX3R5cGUobm9kZSwgdHlwZV8pOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkluc3RhbmNlKQorICAgICAgICAgICAgYW5kIG5vZGUubmFtZSA9PSB0eXBlXworICAgICAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ29uc3QpCisgICAgICAgICkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX2ludChub2RlKToKKyAgICAgICAgaWYgU3BlY2lhbE1ldGhvZHNDaGVja2VyLl9pc193cmFwcGVkX3R5cGUobm9kZSwgImludCIpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkNvbnN0KSBhbmQgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBpbnQpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9pc19zdHIobm9kZSk6CisgICAgICAgIGlmIFNwZWNpYWxNZXRob2RzQ2hlY2tlci5faXNfd3JhcHBlZF90eXBlKG5vZGUsICJzdHIiKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgc3RyKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfYm9vbChub2RlKToKKyAgICAgICAgaWYgU3BlY2lhbE1ldGhvZHNDaGVja2VyLl9pc193cmFwcGVkX3R5cGUobm9kZSwgImJvb2wiKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgYm9vbCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX2J5dGVzKG5vZGUpOgorICAgICAgICBpZiBTcGVjaWFsTWV0aG9kc0NoZWNrZXIuX2lzX3dyYXBwZWRfdHlwZShub2RlLCAiYnl0ZXMiKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgYnl0ZXMpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9pc190dXBsZShub2RlKToKKyAgICAgICAgaWYgU3BlY2lhbE1ldGhvZHNDaGVja2VyLl9pc193cmFwcGVkX3R5cGUobm9kZSwgInR1cGxlIik6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ29uc3QpIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIHR1cGxlKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfZGljdChub2RlKToKKyAgICAgICAgaWYgU3BlY2lhbE1ldGhvZHNDaGVja2VyLl9pc193cmFwcGVkX3R5cGUobm9kZSwgImRpY3QiKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgZGljdCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX2l0ZXJhdG9yKG5vZGUpOgorICAgICAgICBpZiBub2RlIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAjIEp1c3QgaWdub3JlIFVuaW5mZXJhYmxlIG9iamVjdHMuCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuYmFzZXMuR2VuZXJhdG9yKToKKyAgICAgICAgICAgICMgR2VuZXJhdG9ycyBjYW4gYmUgaXRlcmF0ZWQuCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5JbnN0YW5jZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbm9kZS5sb2NhbF9hdHRyKE5FWFRfTUVUSE9EKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgbWV0YWNsYXNzID0gbm9kZS5tZXRhY2xhc3MoKQorICAgICAgICAgICAgaWYgbWV0YWNsYXNzIGFuZCBpc2luc3RhbmNlKG1ldGFjbGFzcywgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtZXRhY2xhc3MubG9jYWxfYXR0cihORVhUX01FVEhPRCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9jaGVja19pdGVyKHNlbGYsIG5vZGUsIGluZmVycmVkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX2l0ZXJhdG9yKGluZmVycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5vbi1pdGVyYXRvci1yZXR1cm5lZCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfbGVuKHNlbGYsIG5vZGUsIGluZmVycmVkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX2ludChpbmZlcnJlZCk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJpbnZhbGlkLWxlbmd0aC1yZXR1cm5lZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNvbnN0KSBhbmQgaW5mZXJyZWQudmFsdWUgPCAwOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1sZW5ndGgtcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2Jvb2woc2VsZiwgbm9kZSwgaW5mZXJyZWQpOgorICAgICAgICBpZiBub3Qgc2VsZi5faXNfYm9vbChpbmZlcnJlZCk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJpbnZhbGlkLWJvb2wtcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2luZGV4KHNlbGYsIG5vZGUsIGluZmVycmVkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX2ludChpbmZlcnJlZCk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJpbnZhbGlkLWluZGV4LXJldHVybmVkIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19yZXByKHNlbGYsIG5vZGUsIGluZmVycmVkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX3N0cihpbmZlcnJlZCk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJpbnZhbGlkLXJlcHItcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3N0cihzZWxmLCBub2RlLCBpbmZlcnJlZCk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9pc19zdHIoaW5mZXJyZWQpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1zdHItcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2J5dGVzKHNlbGYsIG5vZGUsIGluZmVycmVkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX2J5dGVzKGluZmVycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtYnl0ZXMtcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2hhc2goc2VsZiwgbm9kZSwgaW5mZXJyZWQpOgorICAgICAgICBpZiBub3Qgc2VsZi5faXNfaW50KGluZmVycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtaGFzaC1yZXR1cm5lZCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfbGVuZ3RoX2hpbnQoc2VsZiwgbm9kZSwgaW5mZXJyZWQpOgorICAgICAgICBpZiBub3Qgc2VsZi5faXNfaW50KGluZmVycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtbGVuZ3RoLWhpbnQtcmV0dXJuZWQiLCBub2RlPW5vZGUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5Db25zdCkgYW5kIGluZmVycmVkLnZhbHVlIDwgMDoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtbGVuZ3RoLWhpbnQtcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2Zvcm1hdChzZWxmLCBub2RlLCBpbmZlcnJlZCk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9pc19zdHIoaW5mZXJyZWQpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1mb3JtYXQtcmV0dXJuZWQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2dldG5ld2FyZ3Moc2VsZiwgbm9kZSwgaW5mZXJyZWQpOgorICAgICAgICBpZiBub3Qgc2VsZi5faXNfdHVwbGUoaW5mZXJyZWQpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1nZXRuZXdhcmdzLXJldHVybmVkIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19nZXRuZXdhcmdzX2V4KHNlbGYsIG5vZGUsIGluZmVycmVkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX3R1cGxlKGluZmVycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtZ2V0bmV3YXJncy1leC1yZXR1cm5lZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLlR1cGxlKToKKyAgICAgICAgICAgICMgSWYgaXQncyBub3QgYW4gYXN0cm9pZC5UdXBsZSB3ZSBjYW4ndCBhbmFseXplIGl0IGZ1cnRoZXIKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvdW5kX2Vycm9yID0gRmFsc2UKKworICAgICAgICBpZiBsZW4oaW5mZXJyZWQuZWx0cykgIT0gMjoKKyAgICAgICAgICAgIGZvdW5kX2Vycm9yID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGFyZywgY2hlY2sgaW4gKAorICAgICAgICAgICAgICAgIChpbmZlcnJlZC5lbHRzWzBdLCBzZWxmLl9pc190dXBsZSksCisgICAgICAgICAgICAgICAgKGluZmVycmVkLmVsdHNbMV0sIHNlbGYuX2lzX2RpY3QpLAorICAgICAgICAgICAgKToKKworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgICAgICAgICBhcmcgPSBzYWZlX2luZmVyKGFyZykKKworICAgICAgICAgICAgICAgIGlmIGFyZyBhbmQgYXJnIGlzIG5vdCBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2hlY2soYXJnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2Vycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBmb3VuZF9lcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtZ2V0bmV3YXJncy1leC1yZXR1cm5lZCIsIG5vZGU9bm9kZSkKKworCitkZWYgX2FuY2VzdG9yc190b19jYWxsKGtsYXNzX25vZGUsIG1ldGhvZD0iX19pbml0X18iKToKKyAgICAiIiJyZXR1cm4gYSBkaWN0aW9uYXJ5IHdoZXJlIGtleXMgYXJlIHRoZSBsaXN0IG9mIGJhc2UgY2xhc3NlcyBwcm92aWRpbmcKKyAgICB0aGUgcXVlcmllZCBtZXRob2QsIGFuZCBzbyB0aGF0IHNob3VsZC9tYXkgYmUgY2FsbGVkIGZyb20gdGhlIG1ldGhvZCBub2RlCisgICAgIiIiCisgICAgdG9fY2FsbCA9IHt9CisgICAgZm9yIGJhc2Vfbm9kZSBpbiBrbGFzc19ub2RlLmFuY2VzdG9ycyhyZWN1cnM9RmFsc2UpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b19jYWxsW2Jhc2Vfbm9kZV0gPSBuZXh0KGJhc2Vfbm9kZS5pZ2V0YXR0cihtZXRob2QpKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgcmV0dXJuIHRvX2NhbGwKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihDbGFzc0NoZWNrZXIobGludGVyKSkKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihTcGVjaWFsTWV0aG9kc0NoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9kZXByZWNhdGVkLnB5IGIvcHlsaW50L2NoZWNrZXJzL2RlcHJlY2F0ZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxNTYzYQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9kZXByZWNhdGVkLnB5CkBAIC0wLDAgKzEsMjM3IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIkNoZWNrZXIgbWl4aW4gZm9yIGRlcHJlY2F0ZWQgZnVuY3Rpb25hbGl0eS4iIiIKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgorZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgQ29udGFpbmVyLCBJdGVyYWJsZSwgVHVwbGUsIFVuaW9uCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCB1dGlscworZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0IHNhZmVfaW5mZXIKKworQUNDRVBUQUJMRV9OT0RFUyA9ICgKKyAgICBhc3Ryb2lkLkJvdW5kTWV0aG9kLAorICAgIGFzdHJvaWQuVW5ib3VuZE1ldGhvZCwKKyAgICBhc3Ryb2lkLkZ1bmN0aW9uRGVmLAorICAgIGFzdHJvaWQuQ2xhc3NEZWYsCispCisKKworY2xhc3MgRGVwcmVjYXRlZE1peGluOgorICAgICIiIkEgbWl4aW4gaW1wbGVtZW50aW5nIGxvZ2ljIGZvciBjaGVja2luZyBkZXByZWNhdGVkIHN5bWJvbHMuCisgICAgQSBjbGFzcyBpbXBsZW1lbnRpbmcgbWl4aW4gbXVzdCBkZWZpbmUgImRlcHJlY2F0ZWQtbWV0aG9kIiBNZXNzYWdlLgorICAgICIiIgorCisgICAgbXNnczogQW55ID0geworICAgICAgICAiVzE1MDUiOiAoCisgICAgICAgICAgICAiVXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgJXMoKSIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC1tZXRob2QiLAorICAgICAgICAgICAgIlRoZSBtZXRob2QgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiIsCisgICAgICAgICksCisgICAgICAgICJXMTUxMSI6ICgKKyAgICAgICAgICAgICJVc2luZyBkZXByZWNhdGVkIGFyZ3VtZW50ICVzIG9mIG1ldGhvZCAlcygpIiwKKyAgICAgICAgICAgICJkZXByZWNhdGVkLWFyZ3VtZW50IiwKKyAgICAgICAgICAgICJUaGUgYXJndW1lbnQgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiIsCisgICAgICAgICksCisgICAgICAgICJXMDQwMiI6ICgKKyAgICAgICAgICAgICJVc2VzIG9mIGEgZGVwcmVjYXRlZCBtb2R1bGUgJXIiLAorICAgICAgICAgICAgImRlcHJlY2F0ZWQtbW9kdWxlIiwKKyAgICAgICAgICAgICJBIG1vZHVsZSBtYXJrZWQgYXMgZGVwcmVjYXRlZCBpcyBpbXBvcnRlZC4iLAorICAgICAgICApLAorICAgICAgICAiVzE1MTIiOiAoCisgICAgICAgICAgICAiVXNpbmcgZGVwcmVjYXRlZCBjbGFzcyAlcyBvZiBtb2R1bGUgJXMiLAorICAgICAgICAgICAgImRlcHJlY2F0ZWQtY2xhc3MiLAorICAgICAgICAgICAgIlRoZSBjbGFzcyBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNTEzIjogKAorICAgICAgICAgICAgIlVzaW5nIGRlcHJlY2F0ZWQgZGVjb3JhdG9yICVzKCkiLAorICAgICAgICAgICAgImRlcHJlY2F0ZWQtZGVjb3JhdG9yIiwKKyAgICAgICAgICAgICJUaGUgZGVjb3JhdG9yIGlzIG1hcmtlZCBhcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4iLAorICAgICAgICApLAorICAgIH0KKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgImRlcHJlY2F0ZWQtbWV0aG9kIiwKKyAgICAgICAgImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAiZGVwcmVjYXRlZC1jbGFzcyIsCisgICAgKQorICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGU6IGFzdHJvaWQuQ2FsbCkgLT4gTm9uZToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gYSA6Y2xhc3M6YC5hc3Ryb2lkLm5vZGVfY2xhc3Nlcy5DYWxsYCBub2RlIGlzIHZpc2l0ZWQuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZGVwcmVjYXRlZF9jbGFzc19pbl9jYWxsKG5vZGUpCisgICAgICAgICAgICBmb3IgaW5mZXJyZWQgaW4gbm9kZS5mdW5jLmluZmVyKCk6CisgICAgICAgICAgICAgICAgIyBDYWxsaW5nIGVudHJ5IHBvaW50IGZvciBkZXByZWNhdGlvbiBjaGVjayBsb2dpYy4KKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2RlcHJlY2F0ZWRfbWV0aG9kKG5vZGUsIGluZmVycmVkKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgImRlcHJlY2F0ZWQtbW9kdWxlIiwKKyAgICAgICAgImRlcHJlY2F0ZWQtY2xhc3MiLAorICAgICkKKyAgICBkZWYgdmlzaXRfaW1wb3J0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ0cmlnZ2VyZWQgd2hlbiBhbiBpbXBvcnQgc3RhdGVtZW50IGlzIHNlZW4iIiIKKyAgICAgICAgZm9yIG5hbWUgaW4gKG5hbWUgZm9yIG5hbWUsIF8gaW4gbm9kZS5uYW1lcyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2RlcHJlY2F0ZWRfbW9kdWxlKG5vZGUsIG5hbWUpCisgICAgICAgICAgICBpZiAiLiIgaW4gbmFtZToKKyAgICAgICAgICAgICAgICAjIENoZWNraW5nIGRlcHJlY2F0aW9uIGZvciBpbXBvcnQgbW9kdWxlIHdpdGggY2xhc3MKKyAgICAgICAgICAgICAgICBtb2RfbmFtZSwgY2xhc3NfbmFtZSA9IG5hbWUuc3BsaXQoIi4iLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfZGVwcmVjYXRlZF9jbGFzcyhub2RlLCBtb2RfbmFtZSwgKGNsYXNzX25hbWUsKSkKKworICAgIGRlZiBkZXByZWNhdGVkX2RlY29yYXRvcnMoc2VsZikgLT4gSXRlcmFibGU6CisgICAgICAgICIiIkNhbGxiYWNrIHJldHVybmluZyB0aGUgZGVwcmVjYXRlZCBkZWNvcmF0b3JzLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyIG9mIGRlcHJlY2F0ZWQgZGVjb3JhdG9yIG5hbWVzLgorICAgICAgICAiIiIKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImRlcHJlY2F0ZWQtZGVjb3JhdG9yIikKKyAgICBkZWYgdmlzaXRfZGVjb3JhdG9ycyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiVHJpZ2dlcmVkIHdoZW4gYSBkZWNvcmF0b3Igc3RhdGVtZW50IGlzIHNlZW4iIiIKKyAgICAgICAgY2hpbGRyZW4gPSBsaXN0KG5vZGUuZ2V0X2NoaWxkcmVuKCkpCisgICAgICAgIGlmIG5vdCBjaGlsZHJlbjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkcmVuWzBdLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgaW5mID0gc2FmZV9pbmZlcihjaGlsZHJlblswXS5mdW5jKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5mID0gc2FmZV9pbmZlcihjaGlsZHJlblswXSkKKyAgICAgICAgcW5hbWUgPSBpbmYucW5hbWUoKSBpZiBpbmYgZWxzZSBOb25lCisgICAgICAgIGlmIHFuYW1lIGluIHNlbGYuZGVwcmVjYXRlZF9kZWNvcmF0b3JzKCk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJkZXByZWNhdGVkLWRlY29yYXRvciIsIG5vZGU9bm9kZSwgYXJncz1xbmFtZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgImRlcHJlY2F0ZWQtbW9kdWxlIiwKKyAgICAgICAgImRlcHJlY2F0ZWQtY2xhc3MiLAorICAgICkKKyAgICBkZWYgdmlzaXRfaW1wb3J0ZnJvbShzZWxmLCBub2RlKToKKyAgICAgICAgIiIidHJpZ2dlcmVkIHdoZW4gYSBmcm9tIHN0YXRlbWVudCBpcyBzZWVuIiIiCisgICAgICAgIGJhc2VuYW1lID0gbm9kZS5tb2RuYW1lCisgICAgICAgIHNlbGYuY2hlY2tfZGVwcmVjYXRlZF9tb2R1bGUobm9kZSwgYmFzZW5hbWUpCisgICAgICAgIGNsYXNzX25hbWVzID0gKG5hbWUgZm9yIG5hbWUsIF8gaW4gbm9kZS5uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19kZXByZWNhdGVkX2NsYXNzKG5vZGUsIGJhc2VuYW1lLCBjbGFzc19uYW1lcykKKworICAgIGRlZiBkZXByZWNhdGVkX21ldGhvZHMoc2VsZikgLT4gQ29udGFpbmVyW3N0cl06CisgICAgICAgICIiIkNhbGxiYWNrIHJldHVybmluZyB0aGUgZGVwcmVjYXRlZCBtZXRob2RzL2Z1bmN0aW9ucy4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lciBvZiBkZXByZWNhdGVkIGZ1bmN0aW9uL21ldGhvZCBuYW1lcy4KKyAgICAgICAgIiIiCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIGRlcHJlY2F0ZWRfYXJndW1lbnRzKAorICAgICAgICBzZWxmLCBtZXRob2Q6IHN0cgorICAgICkgLT4gSXRlcmFibGVbVHVwbGVbVW5pb25baW50LCBOb25lXSwgc3RyXV06CisgICAgICAgICIiIkNhbGxiYWNrIHJldHVybmluZyB0aGUgZGVwcmVjYXRlZCBhcmd1bWVudHMgb2YgbWV0aG9kL2Z1bmN0aW9uLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBtZXRob2QgKHN0cik6IG5hbWUgb2YgZnVuY3Rpb24vbWV0aG9kIGNoZWNrZWQgZm9yIGRlcHJlY2F0ZWQgYXJndW1lbnRzCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZSBpbiBmb3JtOgorICAgICAgICAgICAgICAgICgoUE9TSVRJT04xLCBQQVJBTTEpLCAoUE9TSVRJT04yOiBQQVJBTTIpIC4uLikKKyAgICAgICAgICAgIHdoZXJlCisgICAgICAgICAgICAgICAgKiBQT1NJVElPTlggLSBwb3NpdGlvbiBvZiBkZXByZWNhdGVkIGFyZ3VtZW50IFBBUkFNWCBpbiBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgICAgICAgICAgICAgICAgSWYgYXJndW1lbnQgaXMga2V5d29yZC1vbmx5LCBQT1NJVElPTlggc2hvdWxkIGJlIE5vbmUuCisgICAgICAgICAgICAgICAgKiBQQVJBTVggLSBuYW1lIG9mIHRoZSBkZXByZWNhdGVkIGFyZ3VtZW50LgorICAgICAgICAgICAgRS5nLiBzdXBwb3NlIGZ1bmN0aW9uOgorCisgICAgICAgICAgICAuLiBjb2RlLWJsb2NrOjogcHl0aG9uCisgICAgICAgICAgICAgICAgZGVmIGJhcihhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1PSdzcGFtJykKKworICAgICAgICAgICAgd2l0aCBkZXByZWNhdGVkIGFyZ3VtZW50cyBgYXJnMmAgYW5kIGBhcmc0YC4gYGRlcHJlY2F0ZWRfYXJndW1lbnRzYCBzaG91bGQgcmV0dXJuOgorCisgICAgICAgICAgICAuLiBjb2RlLWJsb2NrOjogcHl0aG9uCisgICAgICAgICAgICAgICAgKCgxLCAnYXJnMicpLCAoMywgJ2FyZzQnKSkKKyAgICAgICAgIiIiCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgICAgICByZXR1cm4gKCkKKworICAgIGRlZiBkZXByZWNhdGVkX21vZHVsZXMoc2VsZikgLT4gSXRlcmFibGU6CisgICAgICAgICIiIkNhbGxiYWNrIHJldHVybmluZyB0aGUgZGVwcmVjYXRlZCBtb2R1bGVzLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyIG9mIGRlcHJlY2F0ZWQgbW9kdWxlIG5hbWVzLgorICAgICAgICAiIiIKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgZGVwcmVjYXRlZF9jbGFzc2VzKHNlbGYsIG1vZHVsZTogc3RyKSAtPiBJdGVyYWJsZToKKyAgICAgICAgIiIiQ2FsbGJhY2sgcmV0dXJuaW5nIHRoZSBkZXByZWNhdGVkIGNsYXNzZXMgb2YgbW9kdWxlLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBtb2R1bGUgKHN0cik6IG5hbWUgb2YgbW9kdWxlIGNoZWNrZWQgZm9yIGRlcHJlY2F0ZWQgY2xhc3NlcworCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyIG9mIGRlcHJlY2F0ZWQgY2xhc3MgbmFtZXMuCisgICAgICAgICIiIgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICAgICAgICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgY2hlY2tfZGVwcmVjYXRlZF9tb2R1bGUoc2VsZiwgbm9kZSwgbW9kX3BhdGgpOgorICAgICAgICAiIiJDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyBkZXByZWNhdGVkIiIiCisKKyAgICAgICAgZm9yIG1vZF9uYW1lIGluIHNlbGYuZGVwcmVjYXRlZF9tb2R1bGVzKCk6CisgICAgICAgICAgICBpZiBtb2RfcGF0aCA9PSBtb2RfbmFtZSBvciBtb2RfcGF0aC5zdGFydHN3aXRoKG1vZF9uYW1lICsgIi4iKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJkZXByZWNhdGVkLW1vZHVsZSIsIG5vZGU9bm9kZSwgYXJncz1tb2RfcGF0aCkKKworICAgIGRlZiBjaGVja19kZXByZWNhdGVkX21ldGhvZChzZWxmLCBub2RlLCBpbmZlcnJlZCk6CisgICAgICAgICIiIkV4ZWN1dGVzIHRoZSBjaGVja2VyIGZvciB0aGUgZ2l2ZW4gbm9kZS4gVGhpcyBtZXRob2Qgc2hvdWxkCisgICAgICAgIGJlIGNhbGxlZCBmcm9tIHRoZSBjaGVja2VyIGltcGxlbWVudGluZyB0aGlzIG1peGluLgorICAgICAgICAiIiIKKworICAgICAgICAjIFJlamVjdCBub2RlcyB3aGljaCBhcmVuJ3Qgb2YgaW50ZXJlc3QgdG8gdXMuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBBQ0NFUFRBQkxFX05PREVTKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5mdW5jLCBhc3Ryb2lkLkF0dHJpYnV0ZSk6CisgICAgICAgICAgICBmdW5jX25hbWUgPSBub2RlLmZ1bmMuYXR0cm5hbWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIGZ1bmNfbmFtZSA9IG5vZGUuZnVuYy5uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vdCBpbnRlcmVzdGVkIGluIG90aGVyIG5vZGVzLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcW5hbWUgPSBpbmZlcnJlZC5xbmFtZSgpCisgICAgICAgIGlmIGFueShuYW1lIGluIHNlbGYuZGVwcmVjYXRlZF9tZXRob2RzKCkgZm9yIG5hbWUgaW4gKHFuYW1lLCBmdW5jX25hbWUpKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImRlcHJlY2F0ZWQtbWV0aG9kIiwgbm9kZT1ub2RlLCBhcmdzPShmdW5jX25hbWUsKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBudW1fb2ZfYXJncyA9IGxlbihub2RlLmFyZ3MpCisgICAgICAgIGt3YXJncyA9IHtrdy5hcmcgZm9yIGt3IGluIG5vZGUua2V5d29yZHN9IGlmIG5vZGUua2V5d29yZHMgZWxzZSB7fQorICAgICAgICBmb3IgcG9zaXRpb24sIGFyZ19uYW1lIGluIGNoYWluKAorICAgICAgICAgICAgc2VsZi5kZXByZWNhdGVkX2FyZ3VtZW50cyhmdW5jX25hbWUpLCBzZWxmLmRlcHJlY2F0ZWRfYXJndW1lbnRzKHFuYW1lKQorICAgICAgICApOgorICAgICAgICAgICAgaWYgYXJnX25hbWUgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgICMgZnVuY3Rpb24gd2FzIGNhbGxlZCB3aXRoIGRlcHJlY2F0ZWQgYXJndW1lbnQgYXMga2V5d29yZCBhcmd1bWVudAorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJkZXByZWNhdGVkLWFyZ3VtZW50Iiwgbm9kZT1ub2RlLCBhcmdzPShhcmdfbmFtZSwgZnVuY19uYW1lKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsaWYgcG9zaXRpb24gaXMgbm90IE5vbmUgYW5kIHBvc2l0aW9uIDwgbnVtX29mX2FyZ3M6CisgICAgICAgICAgICAgICAgIyBmdW5jdGlvbiB3YXMgY2FsbGVkIHdpdGggZGVwcmVjYXRlZCBhcmd1bWVudCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgImRlcHJlY2F0ZWQtYXJndW1lbnQiLCBub2RlPW5vZGUsIGFyZ3M9KGFyZ19uYW1lLCBmdW5jX25hbWUpCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX2RlcHJlY2F0ZWRfY2xhc3Moc2VsZiwgbm9kZSwgbW9kX25hbWUsIGNsYXNzX25hbWVzKToKKyAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSBjbGFzcyBpcyBkZXByZWNhdGVkIiIiCisKKyAgICAgICAgZm9yIGNsYXNzX25hbWUgaW4gY2xhc3NfbmFtZXM6CisgICAgICAgICAgICBpZiBjbGFzc19uYW1lIGluIHNlbGYuZGVwcmVjYXRlZF9jbGFzc2VzKG1vZF9uYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZC1jbGFzcyIsIG5vZGU9bm9kZSwgYXJncz0oY2xhc3NfbmFtZSwgbW9kX25hbWUpCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX2RlcHJlY2F0ZWRfY2xhc3NfaW5fY2FsbChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2tzIGlmIGNhbGwgdGhlIGRlcHJlY2F0ZWQgY2xhc3MiIiIKKworICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5BdHRyaWJ1dGUpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgbm9kZS5mdW5jLmV4cHIsIGFzdHJvaWQuTmFtZQorICAgICAgICApOgorICAgICAgICAgICAgbW9kX25hbWUgPSBub2RlLmZ1bmMuZXhwci5uYW1lCisgICAgICAgICAgICBjbGFzc19uYW1lID0gbm9kZS5mdW5jLmF0dHJuYW1lCisgICAgICAgICAgICBzZWxmLmNoZWNrX2RlcHJlY2F0ZWRfY2xhc3Mobm9kZSwgbW9kX25hbWUsIChjbGFzc19uYW1lLCkpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvZGVzaWduX2FuYWx5c2lzLnB5IGIvcHlsaW50L2NoZWNrZXJzL2Rlc2lnbl9hbmFseXNpcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIyOGIzCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL2Rlc2lnbl9hbmFseXNpcy5weQpAQCAtMCwwICsxLDU4OSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDktMjAxMCwgMjAxMi0yMDE1IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBhaGlybmlzaCA8YWhpcm5pc2hAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVjYXMgQ2ltb24gPGx1Y2FzLmNpbW9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTWFyayBNaWxsZXIgPDcyNW1ybUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEpha3ViIFdpbGsgPGp3aWxrQGp3aWxrLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBNaWNoYWVsIFNjb3R0IEN1dGhiZXJ0IDxjdXRoYmVydEBtaXQuZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSB5dXNoYW8yIDwzNjg0ODQ3Mit5dXNoYW8yQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJjaGVjayBmb3Igc2lnbnMgb2YgcG9vciBkZXNpZ24iIiIKKworaW1wb3J0IHJlCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAorCitpbXBvcnQgYXN0cm9pZAorZnJvbSBhc3Ryb2lkIGltcG9ydCBub2RlcworCitmcm9tIHB5bGludCBpbXBvcnQgdXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0IGNoZWNrX21lc3NhZ2VzCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJQXN0cm9pZENoZWNrZXIKKworTVNHUyA9IHsgICMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzCisgICAgIlIwOTAxIjogKAorICAgICAgICAiVG9vIG1hbnkgYW5jZXN0b3JzICglcy8lcykiLAorICAgICAgICAidG9vLW1hbnktYW5jZXN0b3JzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBjbGFzcyBoYXMgdG9vIG1hbnkgcGFyZW50IGNsYXNzZXMsIHRyeSB0byByZWR1Y2UgIgorICAgICAgICAidGhpcyB0byBnZXQgYSBzaW1wbGVyIChhbmQgc28gZWFzaWVyIHRvIHVzZSkgY2xhc3MuIiwKKyAgICApLAorICAgICJSMDkwMiI6ICgKKyAgICAgICAgIlRvbyBtYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgKCVzLyVzKSIsCisgICAgICAgICJ0b28tbWFueS1pbnN0YW5jZS1hdHRyaWJ1dGVzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBjbGFzcyBoYXMgdG9vIG1hbnkgaW5zdGFuY2UgYXR0cmlidXRlcywgdHJ5IHRvIHJlZHVjZSAiCisgICAgICAgICJ0aGlzIHRvIGdldCBhIHNpbXBsZXIgKGFuZCBzbyBlYXNpZXIgdG8gdXNlKSBjbGFzcy4iLAorICAgICksCisgICAgIlIwOTAzIjogKAorICAgICAgICAiVG9vIGZldyBwdWJsaWMgbWV0aG9kcyAoJXMvJXMpIiwKKyAgICAgICAgInRvby1mZXctcHVibGljLW1ldGhvZHMiLAorICAgICAgICAiVXNlZCB3aGVuIGNsYXNzIGhhcyB0b28gZmV3IHB1YmxpYyBtZXRob2RzLCBzbyBiZSBzdXJlIGl0J3MgIgorICAgICAgICAicmVhbGx5IHdvcnRoIGl0LiIsCisgICAgKSwKKyAgICAiUjA5MDQiOiAoCisgICAgICAgICJUb28gbWFueSBwdWJsaWMgbWV0aG9kcyAoJXMvJXMpIiwKKyAgICAgICAgInRvby1tYW55LXB1YmxpYy1tZXRob2RzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBjbGFzcyBoYXMgdG9vIG1hbnkgcHVibGljIG1ldGhvZHMsIHRyeSB0byByZWR1Y2UgIgorICAgICAgICAidGhpcyB0byBnZXQgYSBzaW1wbGVyIChhbmQgc28gZWFzaWVyIHRvIHVzZSkgY2xhc3MuIiwKKyAgICApLAorICAgICJSMDkxMSI6ICgKKyAgICAgICAgIlRvbyBtYW55IHJldHVybiBzdGF0ZW1lbnRzICglcy8lcykiLAorICAgICAgICAidG9vLW1hbnktcmV0dXJuLXN0YXRlbWVudHMiLAorICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGhhcyB0b28gbWFueSByZXR1cm4gc3RhdGVtZW50LCAiCisgICAgICAgICJtYWtpbmcgaXQgaGFyZCB0byBmb2xsb3cuIiwKKyAgICApLAorICAgICJSMDkxMiI6ICgKKyAgICAgICAgIlRvbyBtYW55IGJyYW5jaGVzICglcy8lcykiLAorICAgICAgICAidG9vLW1hbnktYnJhbmNoZXMiLAorICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGhhcyB0b28gbWFueSBicmFuY2hlcywgIgorICAgICAgICAibWFraW5nIGl0IGhhcmQgdG8gZm9sbG93LiIsCisgICAgKSwKKyAgICAiUjA5MTMiOiAoCisgICAgICAgICJUb28gbWFueSBhcmd1bWVudHMgKCVzLyVzKSIsCisgICAgICAgICJ0b28tbWFueS1hcmd1bWVudHMiLAorICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gb3IgbWV0aG9kIHRha2VzIHRvbyBtYW55IGFyZ3VtZW50cy4iLAorICAgICksCisgICAgIlIwOTE0IjogKAorICAgICAgICAiVG9vIG1hbnkgbG9jYWwgdmFyaWFibGVzICglcy8lcykiLAorICAgICAgICAidG9vLW1hbnktbG9jYWxzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBoYXMgdG9vIG1hbnkgbG9jYWwgdmFyaWFibGVzLiIsCisgICAgKSwKKyAgICAiUjA5MTUiOiAoCisgICAgICAgICJUb28gbWFueSBzdGF0ZW1lbnRzICglcy8lcykiLAorICAgICAgICAidG9vLW1hbnktc3RhdGVtZW50cyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBmdW5jdGlvbiBvciBtZXRob2QgaGFzIHRvbyBtYW55IHN0YXRlbWVudHMuIFlvdSAiCisgICAgICAgICJzaG91bGQgdGhlbiBzcGxpdCBpdCBpbiBzbWFsbGVyIGZ1bmN0aW9ucyAvIG1ldGhvZHMuIiwKKyAgICApLAorICAgICJSMDkxNiI6ICgKKyAgICAgICAgIlRvbyBtYW55IGJvb2xlYW4gZXhwcmVzc2lvbnMgaW4gaWYgc3RhdGVtZW50ICglcy8lcykiLAorICAgICAgICAidG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9ucyIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaWYgc3RhdGVtZW50IGNvbnRhaW5zIHRvbyBtYW55IGJvb2xlYW4gZXhwcmVzc2lvbnMuIiwKKyAgICApLAorfQorU1BFQ0lBTF9PQkogPSByZS5jb21waWxlKCJeX3syfVthLXpdK197Mn0kIikKK0RBVEFDTEFTU0VTX0RFQ09SQVRPUlMgPSBmcm96ZW5zZXQoeyJkYXRhY2xhc3MiLCAiYXR0cnMifSkKK0RBVEFDTEFTU19JTVBPUlQgPSAiZGF0YWNsYXNzZXMiCitUWVBJTkdfTkFNRURUVVBMRSA9ICJ0eXBpbmcuTmFtZWRUdXBsZSIKK1RZUElOR19UWVBFRERJQ1QgPSAidHlwaW5nLlR5cGVkRGljdCIKKworIyBTZXQgb2Ygc3RkbGliIGNsYXNzZXMgdG8gaWdub3JlIHdoZW4gY2FsY3VsYXRpbmcgbnVtYmVyIG9mIGFuY2VzdG9ycworU1RETElCX0NMQVNTRVNfSUdOT1JFX0FOQ0VTVE9SID0gZnJvemVuc2V0KAorICAgICgKKyAgICAgICAgImJ1aWx0aW5zLm9iamVjdCIsCisgICAgICAgICJidWlsdGlucy50dXBsZSIsCisgICAgICAgICJidWlsdGlucy5kaWN0IiwKKyAgICAgICAgImJ1aWx0aW5zLmxpc3QiLAorICAgICAgICAiYnVpbHRpbnMuc2V0IiwKKyAgICAgICAgImJ1bGl0aW5zLmZyb3plbnNldCIsCisgICAgICAgICJjb2xsZWN0aW9ucy5DaGFpbk1hcCIsCisgICAgICAgICJjb2xsZWN0aW9ucy5Db3VudGVyIiwKKyAgICAgICAgImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0IiwKKyAgICAgICAgImNvbGxlY3Rpb25zLlVzZXJEaWN0IiwKKyAgICAgICAgImNvbGxlY3Rpb25zLlVzZXJMaXN0IiwKKyAgICAgICAgImNvbGxlY3Rpb25zLlVzZXJTdHJpbmciLAorICAgICAgICAiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLAorICAgICAgICAiY29sbGVjdGlvbnMuZGVxdWUiLAorICAgICAgICAiY29sbGVjdGlvbnMubmFtZWR0dXBsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkF3YWl0YWJsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkNvcm91dGluZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkFzeW5jSXRlcmFibGUiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5Bc3luY0l0ZXJhdG9yIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuQXN5bmNHZW5lcmF0b3IiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5IYXNoYWJsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkl0ZXJhYmxlIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuSXRlcmF0b3IiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5HZW5lcmF0b3IiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5SZXZlcnNpYmxlIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuU2l6ZWQiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5Db250YWluZXIiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5Db2xsZWN0aW9uIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuU2V0IiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuTXV0YWJsZVNldCIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLk1hcHBpbmciLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5NdXRhYmxlTWFwcGluZyIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLk1hcHBpbmdWaWV3IiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuS2V5c1ZpZXciLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5JdGVtc1ZpZXciLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5WYWx1ZXNWaWV3IiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuU2VxdWVuY2UiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5NdXRhYmxlU2VxdWVuY2UiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5CeXRlU3RyaW5nIiwKKyAgICAgICAgInR5cGluZy5UdXBsZSIsCisgICAgICAgICJ0eXBpbmcuTGlzdCIsCisgICAgICAgICJ0eXBpbmcuRGljdCIsCisgICAgICAgICJ0eXBpbmcuU2V0IiwKKyAgICAgICAgInR5cGluZy5Gcm96ZW5TZXQiLAorICAgICAgICAidHlwaW5nLkRlcXVlIiwKKyAgICAgICAgInR5cGluZy5EZWZhdWx0RGljdCIsCisgICAgICAgICJ0eXBpbmcuT3JkZXJlZERpY3QiLAorICAgICAgICAidHlwaW5nLkNvdW50ZXIiLAorICAgICAgICAidHlwaW5nLkNoYWluTWFwIiwKKyAgICAgICAgInR5cGluZy5Bd2FpdGFibGUiLAorICAgICAgICAidHlwaW5nLkNvcm91dGluZSIsCisgICAgICAgICJ0eXBpbmcuQXN5bmNJdGVyYWJsZSIsCisgICAgICAgICJ0eXBpbmcuQXN5bmNJdGVyYXRvciIsCisgICAgICAgICJ0eXBpbmcuQXN5bmNHZW5lcmF0b3IiLAorICAgICAgICAidHlwaW5nLkl0ZXJhYmxlIiwKKyAgICAgICAgInR5cGluZy5JdGVyYXRvciIsCisgICAgICAgICJ0eXBpbmcuR2VuZXJhdG9yIiwKKyAgICAgICAgInR5cGluZy5SZXZlcnNpYmxlIiwKKyAgICAgICAgInR5cGluZy5Db250YWluZXIiLAorICAgICAgICAidHlwaW5nLkNvbGxlY3Rpb24iLAorICAgICAgICAidHlwaW5nLkFic3RyYWN0U2V0IiwKKyAgICAgICAgInR5cGluZy5NdXRhYmxlU2V0IiwKKyAgICAgICAgInR5cGluZy5NYXBwaW5nIiwKKyAgICAgICAgInR5cGluZy5NdXRhYmxlTWFwcGluZyIsCisgICAgICAgICJ0eXBpbmcuU2VxdWVuY2UiLAorICAgICAgICAidHlwaW5nLk11dGFibGVTZXF1ZW5jZSIsCisgICAgICAgICJ0eXBpbmcuQnl0ZVN0cmluZyIsCisgICAgICAgICJ0eXBpbmcuTWFwcGluZ1ZpZXciLAorICAgICAgICAidHlwaW5nLktleXNWaWV3IiwKKyAgICAgICAgInR5cGluZy5JdGVtc1ZpZXciLAorICAgICAgICAidHlwaW5nLlZhbHVlc1ZpZXciLAorICAgICAgICAidHlwaW5nLkNvbnRleHRNYW5hZ2VyIiwKKyAgICAgICAgInR5cGluZy5Bc3luY0NvbnRleHRNYW5nZXIiLAorICAgICAgICAidHlwaW5nLkhhc2hhYmxlIiwKKyAgICAgICAgInR5cGluZy5TaXplZCIsCisgICAgKQorKQorCisKK2RlZiBfaXNfZXhlbXB0X2Zyb21fcHVibGljX21ldGhvZHMobm9kZTogYXN0cm9pZC5DbGFzc0RlZikgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiBhIGNsYXNzIGlzIGV4ZW1wdCBmcm9tIHRvby1mZXctcHVibGljLW1ldGhvZHMiIiIKKworICAgICMgSWYgaXQncyBhIHR5cGluZy5OYW1lZHR1cGxlLCB0eXBpbmcuVHlwZWREaWN0IG9yIGFuIEVudW0KKyAgICBmb3IgYW5jZXN0b3IgaW4gbm9kZS5hbmNlc3RvcnMoKToKKyAgICAgICAgaWYgYW5jZXN0b3IubmFtZSA9PSAiRW51bSIgYW5kIGFuY2VzdG9yLnJvb3QoKS5uYW1lID09ICJlbnVtIjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGFuY2VzdG9yLnFuYW1lKCkgaW4gKFRZUElOR19OQU1FRFRVUExFLCBUWVBJTkdfVFlQRURESUNUKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIE9yIGlmIGl0J3MgYSBkYXRhY2xhc3MKKyAgICBpZiBub3Qgbm9kZS5kZWNvcmF0b3JzOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIHJvb3RfbG9jYWxzID0gc2V0KG5vZGUucm9vdCgpLmxvY2FscykKKyAgICBmb3IgZGVjb3JhdG9yIGluIG5vZGUuZGVjb3JhdG9ycy5ub2RlczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkZWNvcmF0b3IsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgICAgICBkZWNvcmF0b3IgPSBkZWNvcmF0b3IuZnVuYworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkZWNvcmF0b3IsIChhc3Ryb2lkLk5hbWUsIGFzdHJvaWQuQXR0cmlidXRlKSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGRlY29yYXRvciwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIG5hbWUgPSBkZWNvcmF0b3IubmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9IGRlY29yYXRvci5hdHRybmFtZQorICAgICAgICBpZiBuYW1lIGluIERBVEFDTEFTU0VTX0RFQ09SQVRPUlMgYW5kICgKKyAgICAgICAgICAgIHJvb3RfbG9jYWxzLmludGVyc2VjdGlvbihEQVRBQ0xBU1NFU19ERUNPUkFUT1JTKQorICAgICAgICAgICAgb3IgREFUQUNMQVNTX0lNUE9SVCBpbiByb290X2xvY2FscworICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgX2NvdW50X2Jvb2xlYW5fZXhwcmVzc2lvbnMoYm9vbF9vcCk6CisgICAgIiIiQ291bnRzIHRoZSBudW1iZXIgb2YgYm9vbGVhbiBleHByZXNzaW9ucyBpbiBCb29sT3AgYGJvb2xfb3BgIChyZWN1cnNpdmUpCisKKyAgICBleGFtcGxlOiBhIGFuZCAoYiBvciBjIG9yIChkIGFuZCBlKSkgPT0+IDUgYm9vbGVhbiBleHByZXNzaW9ucworICAgICIiIgorICAgIG5iX2Jvb2xfZXhwciA9IDAKKyAgICBmb3IgYm9vbF9leHByIGluIGJvb2xfb3AuZ2V0X2NoaWxkcmVuKCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9vbF9leHByLCBhc3Ryb2lkLkJvb2xPcCk6CisgICAgICAgICAgICBuYl9ib29sX2V4cHIgKz0gX2NvdW50X2Jvb2xlYW5fZXhwcmVzc2lvbnMoYm9vbF9leHByKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmJfYm9vbF9leHByICs9IDEKKyAgICByZXR1cm4gbmJfYm9vbF9leHByCisKKworZGVmIF9jb3VudF9tZXRob2RzX2luX2NsYXNzKG5vZGUpOgorICAgIGFsbF9tZXRob2RzID0gc3VtKDEgZm9yIG1ldGhvZCBpbiBub2RlLm1ldGhvZHMoKSBpZiBub3QgbWV0aG9kLm5hbWUuc3RhcnRzd2l0aCgiXyIpKQorICAgICMgU3BlY2lhbCBtZXRob2RzIGNvdW50IHRvd2FyZHMgdGhlIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcywKKyAgICAjIGJ1dCBkb24ndCBjb3VudCB0b3dhcmRzIHRoZXJlIGJlaW5nIHRvbyBtYW55IG1ldGhvZHMuCisgICAgZm9yIG1ldGhvZCBpbiBub2RlLm15bWV0aG9kcygpOgorICAgICAgICBpZiBTUEVDSUFMX09CSi5zZWFyY2gobWV0aG9kLm5hbWUpIGFuZCBtZXRob2QubmFtZSAhPSAiX19pbml0X18iOgorICAgICAgICAgICAgYWxsX21ldGhvZHMgKz0gMQorICAgIHJldHVybiBhbGxfbWV0aG9kcworCisKK2NsYXNzIE1pc2Rlc2lnbkNoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiImNoZWNrcyBmb3Igc2lnbiBvZiBwb29yL21pc2Rlc2lnbjoKKyAgICAqIG51bWJlciBvZiBtZXRob2RzLCBhdHRyaWJ1dGVzLCBsb2NhbCB2YXJpYWJsZXMuLi4KKyAgICAqIHNpemUsIGNvbXBsZXhpdHkgb2YgZnVuY3Rpb25zLCBtZXRob2RzCisgICAgIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChJQXN0cm9pZENoZWNrZXIsKQorCisgICAgIyBjb25maWd1cmF0aW9uIHNlY3Rpb24gbmFtZQorICAgIG5hbWUgPSAiZGVzaWduIgorICAgICMgbWVzc2FnZXMKKyAgICBtc2dzID0gTVNHUworICAgIHByaW9yaXR5ID0gLTIKKyAgICAjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJtYXgtYXJncyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1LAorICAgICAgICAgICAgICAgICJ0eXBlIjogImludCIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGludD4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gLyBtZXRob2QuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJtYXgtbG9jYWxzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDE1LAorICAgICAgICAgICAgICAgICJ0eXBlIjogImludCIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGludD4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIGxvY2FscyBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1heC1yZXR1cm5zIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDYsCisgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8aW50PiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2YgcmV0dXJuIC8geWllbGQgZm9yIGZ1bmN0aW9uIC8gIgorICAgICAgICAgICAgICAgICJtZXRob2QgYm9keS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1heC1icmFuY2hlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAxMiwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBicmFuY2ggZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJtYXgtc3RhdGVtZW50cyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA1MCwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBzdGF0ZW1lbnRzIGluIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJtYXgtcGFyZW50cyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA3LAorICAgICAgICAgICAgICAgICJ0eXBlIjogImludCIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG51bT4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIHBhcmVudHMgZm9yIGEgY2xhc3MgKHNlZSBSMDkwMSkuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJtYXgtYXR0cmlidXRlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA3LAorICAgICAgICAgICAgICAgICJ0eXBlIjogImludCIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG51bT4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIk1heGltdW0gbnVtYmVyIG9mIGF0dHJpYnV0ZXMgZm9yIGEgY2xhc3MgXAorKHNlZSBSMDkwMikuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJtaW4tcHVibGljLW1ldGhvZHMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMiwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxudW0+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNaW5pbXVtIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgYSBjbGFzcyBcCisoc2VlIFIwOTAzKS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1heC1wdWJsaWMtbWV0aG9kcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAyMCwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxudW0+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgYSBjbGFzcyBcCisoc2VlIFIwOTA0KS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1heC1ib29sLWV4cHIiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogNSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxudW0+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBib29sZWFuIGV4cHJlc3Npb25zIGluIGFuIGlmICIKKyAgICAgICAgICAgICAgICAic3RhdGVtZW50IChzZWUgUjA5MTYpLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXI9Tm9uZSk6CisgICAgICAgIEJhc2VDaGVja2VyLl9faW5pdF9fKHNlbGYsIGxpbnRlcikKKyAgICAgICAgc2VsZi5zdGF0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5fcmV0dXJucyA9IE5vbmUKKyAgICAgICAgc2VsZi5fYnJhbmNoZXMgPSBOb25lCisgICAgICAgIHNlbGYuX3N0bXRzID0gTm9uZQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgICIiImluaXRpYWxpemUgdmlzaXQgdmFyaWFibGVzIiIiCisgICAgICAgIHNlbGYuc3RhdHMgPSBzZWxmLmxpbnRlci5hZGRfc3RhdHMoKQorICAgICAgICBzZWxmLl9yZXR1cm5zID0gW10KKyAgICAgICAgc2VsZi5fYnJhbmNoZXMgPSBkZWZhdWx0ZGljdChpbnQpCisgICAgICAgIHNlbGYuX3N0bXRzID0gW10KKworICAgIGRlZiBfaW5jX2FsbF9zdG10cyhzZWxmLCBhbW91bnQpOgorICAgICAgICBmb3IgaSwgXyBpbiBlbnVtZXJhdGUoc2VsZi5fc3RtdHMpOgorICAgICAgICAgICAgc2VsZi5fc3RtdHNbaV0gKz0gYW1vdW50CisKKyAgICBAYXN0cm9pZC5kZWNvcmF0b3JzLmNhY2hlZHByb3BlcnR5CisgICAgZGVmIF9pZ25vcmVkX2FyZ3VtZW50X25hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gdXRpbHMuZ2V0X2dsb2JhbF9vcHRpb24oc2VsZiwgImlnbm9yZWQtYXJndW1lbnQtbmFtZXMiLCBkZWZhdWx0PU5vbmUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJ0b28tbWFueS1hbmNlc3RvcnMiLAorICAgICAgICAidG9vLW1hbnktaW5zdGFuY2UtYXR0cmlidXRlcyIsCisgICAgICAgICJ0b28tZmV3LXB1YmxpYy1tZXRob2RzIiwKKyAgICAgICAgInRvby1tYW55LXB1YmxpYy1tZXRob2RzIiwKKyAgICApCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGU6IG5vZGVzLkNsYXNzRGVmKToKKyAgICAgICAgIiIiY2hlY2sgc2l6ZSBvZiBpbmhlcml0YW5jZSBoaWVyYXJjaHkgYW5kIG51bWJlciBvZiBpbnN0YW5jZSBhdHRyaWJ1dGVzIiIiCisgICAgICAgIG5iX3BhcmVudHMgPSBzdW0oCisgICAgICAgICAgICAxCisgICAgICAgICAgICBmb3IgYW5jZXN0b3IgaW4gbm9kZS5hbmNlc3RvcnMoKQorICAgICAgICAgICAgaWYgYW5jZXN0b3IucW5hbWUoKSBub3QgaW4gU1RETElCX0NMQVNTRVNfSUdOT1JFX0FOQ0VTVE9SCisgICAgICAgICkKKyAgICAgICAgaWYgbmJfcGFyZW50cyA+IHNlbGYuY29uZmlnLm1heF9wYXJlbnRzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAidG9vLW1hbnktYW5jZXN0b3JzIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0obmJfcGFyZW50cywgc2VsZi5jb25maWcubWF4X3BhcmVudHMpLAorICAgICAgICAgICAgKQorCisgICAgICAgIGlmIGxlbihub2RlLmluc3RhbmNlX2F0dHJzKSA+IHNlbGYuY29uZmlnLm1heF9hdHRyaWJ1dGVzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAidG9vLW1hbnktaW5zdGFuY2UtYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KGxlbihub2RlLmluc3RhbmNlX2F0dHJzKSwgc2VsZi5jb25maWcubWF4X2F0dHJpYnV0ZXMpLAorICAgICAgICAgICAgKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJ0b28tZmV3LXB1YmxpYy1tZXRob2RzIiwgInRvby1tYW55LXB1YmxpYy1tZXRob2RzIikKKyAgICBkZWYgbGVhdmVfY2xhc3NkZWYoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyIiIgorICAgICAgICBteV9tZXRob2RzID0gc3VtKAorICAgICAgICAgICAgMSBmb3IgbWV0aG9kIGluIG5vZGUubXltZXRob2RzKCkgaWYgbm90IG1ldGhvZC5uYW1lLnN0YXJ0c3dpdGgoIl8iKQorICAgICAgICApCisKKyAgICAgICAgIyBEb2VzIHRoZSBjbGFzcyBjb250YWluIGxlc3MgdGhhbiBuIHB1YmxpYyBtZXRob2RzID8KKyAgICAgICAgIyBUaGlzIGNoZWNrcyBvbmx5IHRoZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgY2xhc3MsCisgICAgICAgICMgc2luY2UgdGhlIHVzZXIgbWlnaHQgbm90IGhhdmUgY29udHJvbCBvdmVyIHRoZSBjbGFzc2VzCisgICAgICAgICMgZnJvbSB0aGUgYW5jZXN0b3JzLiBJdCBhdm9pZHMgc29tZSBmYWxzZSBwb3NpdGl2ZXMKKyAgICAgICAgIyBmb3IgY2xhc3NlcyBzdWNoIGFzIHVuaXR0ZXN0LlRlc3RDYXNlLCB3aGljaCBwcm92aWRlcworICAgICAgICAjIGEgbG90IG9mIGFzc2VydCBtZXRob2RzLiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gd2FybgorICAgICAgICAjIHdoZW4gdGhlIHVzZXIgc3ViY2xhc3NlcyBUZXN0Q2FzZSB0byBhZGQgaGlzIG93biB0ZXN0cy4KKyAgICAgICAgaWYgbXlfbWV0aG9kcyA+IHNlbGYuY29uZmlnLm1heF9wdWJsaWNfbWV0aG9kczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInRvby1tYW55LXB1YmxpYy1tZXRob2RzIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0obXlfbWV0aG9kcywgc2VsZi5jb25maWcubWF4X3B1YmxpY19tZXRob2RzKSwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIFN0b3AgaGVyZSBmb3IgZXhjZXB0aW9uLCBtZXRhY2xhc3MsIGludGVyZmFjZSBjbGFzc2VzIGFuZCBvdGhlcgorICAgICAgICAjIGNsYXNzZXMgZm9yIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8gY291bnQgdGhlIG1ldGhvZHMuCisgICAgICAgIGlmIG5vZGUudHlwZSAhPSAiY2xhc3MiIG9yIF9pc19leGVtcHRfZnJvbV9wdWJsaWNfbWV0aG9kcyhub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRG9lcyB0aGUgY2xhc3MgY29udGFpbiBtb3JlIHRoYW4gbiBwdWJsaWMgbWV0aG9kcyA/CisgICAgICAgICMgVGhpcyBjaGVja3MgYWxsIHRoZSBtZXRob2RzIGRlZmluZWQgYnkgYW5jZXN0b3JzIGFuZAorICAgICAgICAjIGJ5IHRoZSBjdXJyZW50IGNsYXNzLgorICAgICAgICBhbGxfbWV0aG9kcyA9IF9jb3VudF9tZXRob2RzX2luX2NsYXNzKG5vZGUpCisgICAgICAgIGlmIGFsbF9tZXRob2RzIDwgc2VsZi5jb25maWcubWluX3B1YmxpY19tZXRob2RzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAidG9vLWZldy1wdWJsaWMtbWV0aG9kcyIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KGFsbF9tZXRob2RzLCBzZWxmLmNvbmZpZy5taW5fcHVibGljX21ldGhvZHMpLAorICAgICAgICAgICAgKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKAorICAgICAgICAidG9vLW1hbnktcmV0dXJuLXN0YXRlbWVudHMiLAorICAgICAgICAidG9vLW1hbnktYnJhbmNoZXMiLAorICAgICAgICAidG9vLW1hbnktYXJndW1lbnRzIiwKKyAgICAgICAgInRvby1tYW55LWxvY2FscyIsCisgICAgICAgICJ0b28tbWFueS1zdGF0ZW1lbnRzIiwKKyAgICAgICAgImtleXdvcmQtYXJnLWJlZm9yZS12YXJhcmciLAorICAgICkKKyAgICBkZWYgdmlzaXRfZnVuY3Rpb25kZWYoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIGZ1bmN0aW9uIG5hbWUsIGRvY3N0cmluZywgYXJndW1lbnRzLCByZWRlZmluaXRpb24sCisgICAgICAgIHZhcmlhYmxlIG5hbWVzLCBtYXggbG9jYWxzCisgICAgICAgICIiIgorICAgICAgICAjIGluaXQgYnJhbmNoIGFuZCByZXR1cm5zIGNvdW50ZXJzCisgICAgICAgIHNlbGYuX3JldHVybnMuYXBwZW5kKDApCisgICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgICAgICBhcmdzID0gbm9kZS5hcmdzLmFyZ3MKKyAgICAgICAgaWdub3JlZF9hcmd1bWVudF9uYW1lcyA9IHNlbGYuX2lnbm9yZWRfYXJndW1lbnRfbmFtZXMKKyAgICAgICAgaWYgYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlnbm9yZWRfYXJnc19udW0gPSAwCisgICAgICAgICAgICBpZiBpZ25vcmVkX2FyZ3VtZW50X25hbWVzOgorICAgICAgICAgICAgICAgIGlnbm9yZWRfYXJnc19udW0gPSBzdW0oCisgICAgICAgICAgICAgICAgICAgIDEgZm9yIGFyZyBpbiBhcmdzIGlmIGlnbm9yZWRfYXJndW1lbnRfbmFtZXMubWF0Y2goYXJnLm5hbWUpCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICBhcmdudW0gPSBsZW4oYXJncykgLSBpZ25vcmVkX2FyZ3NfbnVtCisgICAgICAgICAgICBpZiBhcmdudW0gPiBzZWxmLmNvbmZpZy5tYXhfYXJnczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAidG9vLW1hbnktYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICBhcmdzPShsZW4oYXJncyksIHNlbGYuY29uZmlnLm1heF9hcmdzKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZ25vcmVkX2FyZ3NfbnVtID0gMAorICAgICAgICAjIGNoZWNrIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMKKyAgICAgICAgbG9jbnVtID0gbGVuKG5vZGUubG9jYWxzKSAtIGlnbm9yZWRfYXJnc19udW0KKyAgICAgICAgaWYgbG9jbnVtID4gc2VsZi5jb25maWcubWF4X2xvY2FsczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInRvby1tYW55LWxvY2FscyIsIG5vZGU9bm9kZSwgYXJncz0obG9jbnVtLCBzZWxmLmNvbmZpZy5tYXhfbG9jYWxzKQorICAgICAgICAgICAgKQorICAgICAgICAjIGluaXQgbmV3IHN0YXRlbWVudHMgY291bnRlcgorICAgICAgICBzZWxmLl9zdG10cy5hcHBlbmQoMSkKKworICAgIHZpc2l0X2FzeW5jZnVuY3Rpb25kZWYgPSB2aXNpdF9mdW5jdGlvbmRlZgorCisgICAgQGNoZWNrX21lc3NhZ2VzKAorICAgICAgICAidG9vLW1hbnktcmV0dXJuLXN0YXRlbWVudHMiLAorICAgICAgICAidG9vLW1hbnktYnJhbmNoZXMiLAorICAgICAgICAidG9vLW1hbnktYXJndW1lbnRzIiwKKyAgICAgICAgInRvby1tYW55LWxvY2FscyIsCisgICAgICAgICJ0b28tbWFueS1zdGF0ZW1lbnRzIiwKKyAgICApCisgICAgZGVmIGxlYXZlX2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJtb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgaGVyZSBvbiBjbG9zZToKKyAgICAgICAgY2hlY2tzIGZvciBtYXggcmV0dXJucywgYnJhbmNoLCByZXR1cm4gaW4gX19pbml0X18KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybnMgPSBzZWxmLl9yZXR1cm5zLnBvcCgpCisgICAgICAgIGlmIHJldHVybnMgPiBzZWxmLmNvbmZpZy5tYXhfcmV0dXJuczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInRvby1tYW55LXJldHVybi1zdGF0ZW1lbnRzIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0ocmV0dXJucywgc2VsZi5jb25maWcubWF4X3JldHVybnMpLAorICAgICAgICAgICAgKQorICAgICAgICBicmFuY2hlcyA9IHNlbGYuX2JyYW5jaGVzW25vZGVdCisgICAgICAgIGlmIGJyYW5jaGVzID4gc2VsZi5jb25maWcubWF4X2JyYW5jaGVzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAidG9vLW1hbnktYnJhbmNoZXMiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPShicmFuY2hlcywgc2VsZi5jb25maWcubWF4X2JyYW5jaGVzKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgIyBjaGVjayBudW1iZXIgb2Ygc3RhdGVtZW50cworICAgICAgICBzdG10cyA9IHNlbGYuX3N0bXRzLnBvcCgpCisgICAgICAgIGlmIHN0bXRzID4gc2VsZi5jb25maWcubWF4X3N0YXRlbWVudHM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ0b28tbWFueS1zdGF0ZW1lbnRzIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0oc3RtdHMsIHNlbGYuY29uZmlnLm1heF9zdGF0ZW1lbnRzKSwKKyAgICAgICAgICAgICkKKworICAgIGxlYXZlX2FzeW5jZnVuY3Rpb25kZWYgPSBsZWF2ZV9mdW5jdGlvbmRlZgorCisgICAgZGVmIHZpc2l0X3JldHVybihzZWxmLCBfKToKKyAgICAgICAgIiIiY291bnQgbnVtYmVyIG9mIHJldHVybnMiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX3JldHVybnM6CisgICAgICAgICAgICByZXR1cm4gICMgcmV0dXJuIG91dHNpZGUgZnVuY3Rpb24sIHJlcG9ydGVkIGJ5IHRoZSBiYXNlIGNoZWNrZXIKKyAgICAgICAgc2VsZi5fcmV0dXJuc1stMV0gKz0gMQorCisgICAgZGVmIHZpc2l0X2RlZmF1bHQoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImRlZmF1bHQgdmlzaXQgbWV0aG9kIC0+IGluY3JlbWVudHMgdGhlIHN0YXRlbWVudHMgY291bnRlciBpZgorICAgICAgICBuZWNlc3NhcnkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vZGUuaXNfc3RhdGVtZW50OgorICAgICAgICAgICAgc2VsZi5faW5jX2FsbF9zdG10cygxKQorCisgICAgZGVmIHZpc2l0X3RyeWV4Y2VwdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiaW5jcmVtZW50cyB0aGUgYnJhbmNoZXMgY291bnRlciIiIgorICAgICAgICBicmFuY2hlcyA9IGxlbihub2RlLmhhbmRsZXJzKQorICAgICAgICBpZiBub2RlLm9yZWxzZToKKyAgICAgICAgICAgIGJyYW5jaGVzICs9IDEKKyAgICAgICAgc2VsZi5faW5jX2JyYW5jaChub2RlLCBicmFuY2hlcykKKyAgICAgICAgc2VsZi5faW5jX2FsbF9zdG10cyhicmFuY2hlcykKKworICAgIGRlZiB2aXNpdF90cnlmaW5hbGx5KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJpbmNyZW1lbnRzIHRoZSBicmFuY2hlcyBjb3VudGVyIiIiCisgICAgICAgIHNlbGYuX2luY19icmFuY2gobm9kZSwgMikKKyAgICAgICAgc2VsZi5faW5jX2FsbF9zdG10cygyKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJ0b28tbWFueS1ib29sZWFuLWV4cHJlc3Npb25zIikKKyAgICBkZWYgdmlzaXRfaWYoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImluY3JlbWVudHMgdGhlIGJyYW5jaGVzIGNvdW50ZXIgYW5kIGNoZWNrcyBib29sZWFuIGV4cHJlc3Npb25zIiIiCisgICAgICAgIHNlbGYuX2NoZWNrX2Jvb2xlYW5fZXhwcmVzc2lvbnMobm9kZSkKKyAgICAgICAgYnJhbmNoZXMgPSAxCisgICAgICAgICMgZG9uJ3QgZG91YmxlIGNvdW50IElmIG5vZGVzIGNvbWluZyBmcm9tIHNvbWUgJ2VsaWYnCisgICAgICAgIGlmIG5vZGUub3JlbHNlIGFuZCAoCisgICAgICAgICAgICBsZW4obm9kZS5vcmVsc2UpID4gMSBvciBub3QgaXNpbnN0YW5jZShub2RlLm9yZWxzZVswXSwgYXN0cm9pZC5JZikKKyAgICAgICAgKToKKyAgICAgICAgICAgIGJyYW5jaGVzICs9IDEKKyAgICAgICAgc2VsZi5faW5jX2JyYW5jaChub2RlLCBicmFuY2hlcykKKyAgICAgICAgc2VsZi5faW5jX2FsbF9zdG10cyhicmFuY2hlcykKKworICAgIGRlZiBfY2hlY2tfYm9vbGVhbl9leHByZXNzaW9ucyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiR28gdGhyb3VnaCAiaWYiIG5vZGUgYG5vZGVgIGFuZCBjb3VudHMgaXRzIGJvb2xlYW4gZXhwcmVzc2lvbnMKKworICAgICAgICBpZiB0aGUgImlmIiBub2RlIHRlc3QgaXMgYSBCb29sT3Agbm9kZQorICAgICAgICAiIiIKKyAgICAgICAgY29uZGl0aW9uID0gbm9kZS50ZXN0CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbmRpdGlvbiwgYXN0cm9pZC5Cb29sT3ApOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5iX2Jvb2xfZXhwciA9IF9jb3VudF9ib29sZWFuX2V4cHJlc3Npb25zKGNvbmRpdGlvbikKKyAgICAgICAgaWYgbmJfYm9vbF9leHByID4gc2VsZi5jb25maWcubWF4X2Jvb2xfZXhwcjoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInRvby1tYW55LWJvb2xlYW4tZXhwcmVzc2lvbnMiLAorICAgICAgICAgICAgICAgIG5vZGU9Y29uZGl0aW9uLAorICAgICAgICAgICAgICAgIGFyZ3M9KG5iX2Jvb2xfZXhwciwgc2VsZi5jb25maWcubWF4X2Jvb2xfZXhwciksCisgICAgICAgICAgICApCisKKyAgICBkZWYgdmlzaXRfd2hpbGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImluY3JlbWVudHMgdGhlIGJyYW5jaGVzIGNvdW50ZXIiIiIKKyAgICAgICAgYnJhbmNoZXMgPSAxCisgICAgICAgIGlmIG5vZGUub3JlbHNlOgorICAgICAgICAgICAgYnJhbmNoZXMgKz0gMQorICAgICAgICBzZWxmLl9pbmNfYnJhbmNoKG5vZGUsIGJyYW5jaGVzKQorCisgICAgdmlzaXRfZm9yID0gdmlzaXRfd2hpbGUKKworICAgIGRlZiBfaW5jX2JyYW5jaChzZWxmLCBub2RlLCBicmFuY2hlc251bT0xKToKKyAgICAgICAgIiIiaW5jcmVtZW50cyB0aGUgYnJhbmNoZXMgY291bnRlciIiIgorICAgICAgICBzZWxmLl9icmFuY2hlc1tub2RlLnNjb3BlKCldICs9IGJyYW5jaGVzbnVtCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIicmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoTWlzZGVzaWduQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2NoZWNrZXJzL2V4Y2VwdGlvbnMucHkgYi9weWxpbnQvY2hlY2tlcnMvZXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU0MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw1OTMgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMTEsIDIwMTMtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgVGltIEhhdGNoIDx0aW1AdGltaGF0Y2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgUmVuZSBaaGFuZyA8cno5OUBjb3JuZWxsLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IEZsb3JpYW4gQnJ1aGluIDxtZUB0aGUtY29tcGlsZXIub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgU3RldmVuIE15aW50IDxoZ0BzdGV2ZW5teWludC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEVyaWsgPGVyaWsuZXJpa3Nzb25AeWFob28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgSmFrdWIgV2lsayA8andpbGtAandpbGsubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgTWFydGluIHZvbiBHYWdlcm4gPGdhZ2VybkBnb29nbGUuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVjYXMgQ2ltb24gPGx1Y2FzLmNpbW9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE5hdGFsaWUgU2VyZWJyeWFrb3ZhIDxuYXRhbGllLnNlcmVicnlha292YUBOYXRhbGllcy1NYWNCb29rLVByby5sb2NhbD4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQ2FyZXkgTWV0Y2FsZmUgPGNhcmV5QGNtZXRjYWxmZS5jYT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQWxleGFuZGVyIFRvZG9yb3YgPGF0b2Rvcm92QG90Yi5iZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOSwgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IERqYWlsbGEgPGJhc3RpZW4udmFsbGV0QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgUmFtIFJhY2h1bSA8cmFtQHJhY2h1bS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJDaGVja3MgZm9yIHZhcmlvdXMgZXhjZXB0aW9uIHJlbGF0ZWQgZXJyb3JzLiIiIgoraW1wb3J0IGJ1aWx0aW5zCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IHR5cGluZworCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGludGVyZmFjZXMKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCB1dGlscworCisKK2RlZiBfYnVpbHRpbl9leGNlcHRpb25zKCk6CisgICAgZGVmIHByZWRpY2F0ZShvYmopOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmosIHR5cGUpIGFuZCBpc3N1YmNsYXNzKG9iaiwgQmFzZUV4Y2VwdGlvbikKKworICAgIG1lbWJlcnMgPSBpbnNwZWN0LmdldG1lbWJlcnMoYnVpbHRpbnMsIHByZWRpY2F0ZSkKKyAgICByZXR1cm4ge2V4Yy5fX25hbWVfXyBmb3IgKF8sIGV4YykgaW4gbWVtYmVyc30KKworCitkZWYgX2Fubm90YXRlZF91bnBhY2tfaW5mZXIoc3RtdCwgY29udGV4dD1Ob25lKToKKyAgICAiIiIKKyAgICBSZWN1cnNpdmVseSBnZW5lcmF0ZSBub2RlcyBpbmZlcnJlZCBieSB0aGUgZ2l2ZW4gc3RhdGVtZW50LgorICAgIElmIHRoZSBpbmZlcnJlZCB2YWx1ZSBpcyBhIGxpc3Qgb3IgYSB0dXBsZSwgcmVjdXJzZSBvbiB0aGUgZWxlbWVudHMuCisgICAgUmV0dXJucyBhbiBpdGVyYXRvciB3aGljaCB5aWVsZHMgdHVwbGVzIGluIHRoZSBmb3JtYXQKKyAgICAoJ29yaWdpbmFsIG5vZGUnLCAnaW5mZXJyZWQgbm9kZScpLgorICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgKGFzdHJvaWQuTGlzdCwgYXN0cm9pZC5UdXBsZSkpOgorICAgICAgICBmb3IgZWx0IGluIHN0bXQuZWx0czoKKyAgICAgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihlbHQpCisgICAgICAgICAgICBpZiBpbmZlcnJlZCBhbmQgaW5mZXJyZWQgaXMgbm90IGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgeWllbGQgZWx0LCBpbmZlcnJlZAorICAgICAgICByZXR1cm4KKyAgICBmb3IgaW5mZXJyZWQgaW4gc3RtdC5pbmZlcihjb250ZXh0KToKKyAgICAgICAgaWYgaW5mZXJyZWQgaXMgYXN0cm9pZC5VbmluZmVyYWJsZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHlpZWxkIHN0bXQsIGluZmVycmVkCisKKworZGVmIF9pc19yYWlzaW5nKGJvZHk6IHR5cGluZy5MaXN0KSAtPiBib29sOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdGF0ZW1lbnQgbm9kZSByYWlzZSBhbiBleGNlcHRpb24iIiIKKyAgICBmb3Igbm9kZSBpbiBib2R5OgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuUmFpc2UpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitPVkVSR0VORVJBTF9FWENFUFRJT05TID0gKCJCYXNlRXhjZXB0aW9uIiwgIkV4Y2VwdGlvbiIpCitCVUlMVElOU19OQU1FID0gYnVpbHRpbnMuX19uYW1lX18KKworTVNHUyA9IHsgICMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzCisgICAgIkUwNzAxIjogKAorICAgICAgICAiQmFkIGV4Y2VwdCBjbGF1c2VzIG9yZGVyICglcykiLAorICAgICAgICAiYmFkLWV4Y2VwdC1vcmRlciIsCisgICAgICAgICJVc2VkIHdoZW4gZXhjZXB0IGNsYXVzZXMgYXJlIG5vdCBpbiB0aGUgY29ycmVjdCBvcmRlciAoZnJvbSB0aGUgIgorICAgICAgICAibW9yZSBzcGVjaWZpYyB0byB0aGUgbW9yZSBnZW5lcmljKS4gSWYgeW91IGRvbid0IGZpeCB0aGUgb3JkZXIsICIKKyAgICAgICAgInNvbWUgZXhjZXB0aW9ucyBtYXkgbm90IGJlIGNhdWdodCBieSB0aGUgbW9zdCBzcGVjaWZpYyBoYW5kbGVyLiIsCisgICAgKSwKKyAgICAiRTA3MDIiOiAoCisgICAgICAgICJSYWlzaW5nICVzIHdoaWxlIG9ubHkgY2xhc3NlcyBvciBpbnN0YW5jZXMgYXJlIGFsbG93ZWQiLAorICAgICAgICAicmFpc2luZy1iYWQtdHlwZSIsCisgICAgICAgICJVc2VkIHdoZW4gc29tZXRoaW5nIHdoaWNoIGlzIG5laXRoZXIgYSBjbGFzcywgYW4gaW5zdGFuY2Ugb3IgYSAiCisgICAgICAgICJzdHJpbmcgaXMgcmFpc2VkIChpLmUuIGEgYFR5cGVFcnJvcmAgd2lsbCBiZSByYWlzZWQpLiIsCisgICAgKSwKKyAgICAiRTA3MDMiOiAoCisgICAgICAgICJFeGNlcHRpb24gY29udGV4dCBzZXQgdG8gc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhbiBleGNlcHRpb24sIG5vciBOb25lIiwKKyAgICAgICAgImJhZC1leGNlcHRpb24tY29udGV4dCIsCisgICAgICAgICdVc2VkIHdoZW4gdXNpbmcgdGhlIHN5bnRheCAicmFpc2UgLi4uIGZyb20gLi4uIiwgJworICAgICAgICAid2hlcmUgdGhlIGV4Y2VwdGlvbiBjb250ZXh0IGlzIG5vdCBhbiBleGNlcHRpb24sICIKKyAgICAgICAgIm5vciBOb25lLiIsCisgICAgKSwKKyAgICAiRTA3MDQiOiAoCisgICAgICAgICJUaGUgcmFpc2Ugc3RhdGVtZW50IGlzIG5vdCBpbnNpZGUgYW4gZXhjZXB0IGNsYXVzZSIsCisgICAgICAgICJtaXNwbGFjZWQtYmFyZS1yYWlzZSIsCisgICAgICAgICJVc2VkIHdoZW4gYSBiYXJlIHJhaXNlIGlzIG5vdCB1c2VkIGluc2lkZSBhbiBleGNlcHQgY2xhdXNlLiAiCisgICAgICAgICJUaGlzIGdlbmVyYXRlcyBhbiBlcnJvciwgc2luY2UgdGhlcmUgYXJlIG5vIGFjdGl2ZSBleGNlcHRpb25zICIKKyAgICAgICAgInRvIGJlIHJlcmFpc2VkLiBBbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIGlzIHJlcHJlc2VudGVkIGJ5ICIKKyAgICAgICAgImEgYmFyZSByYWlzZSBpbnNpZGUgYSBmaW5hbGx5IGNsYXVzZSwgd2hpY2ggbWlnaHQgd29yaywgYXMgbG9uZyAiCisgICAgICAgICJhcyBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluc2lkZSB0aGUgdHJ5IGJsb2NrLCBidXQgaXQgaXMgIgorICAgICAgICAibmV2ZXJ0aGVsZXNzIGEgY29kZSBzbWVsbCB0aGF0IG11c3Qgbm90IGJlIHJlbGllZCB1cG9uLiIsCisgICAgKSwKKyAgICAiRTA3MTAiOiAoCisgICAgICAgICJSYWlzaW5nIGEgbmV3IHN0eWxlIGNsYXNzIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEJhc2VFeGNlcHRpb24iLAorICAgICAgICAicmFpc2luZy1ub24tZXhjZXB0aW9uIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIG5ldyBzdHlsZSBjbGFzcyB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSAiCisgICAgICAgICJCYXNlRXhjZXB0aW9uIGlzIHJhaXNlZC4iLAorICAgICksCisgICAgIkUwNzExIjogKAorICAgICAgICAiTm90SW1wbGVtZW50ZWQgcmFpc2VkIC0gc2hvdWxkIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IiLAorICAgICAgICAibm90aW1wbGVtZW50ZWQtcmFpc2VkIiwKKyAgICAgICAgIlVzZWQgd2hlbiBOb3RJbXBsZW1lbnRlZCBpcyByYWlzZWQgaW5zdGVhZCBvZiBOb3RJbXBsZW1lbnRlZEVycm9yIiwKKyAgICApLAorICAgICJFMDcxMiI6ICgKKyAgICAgICAgIkNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBFeGNlcHRpb246ICVzIiwKKyAgICAgICAgImNhdGNoaW5nLW5vbi1leGNlcHRpb24iLAorICAgICAgICAiVXNlZCB3aGVuIGEgY2xhc3Mgd2hpY2ggZG9lc24ndCBpbmhlcml0IGZyb20gIgorICAgICAgICAiRXhjZXB0aW9uIGlzIHVzZWQgYXMgYW4gZXhjZXB0aW9uIGluIGFuIGV4Y2VwdCBjbGF1c2UuIiwKKyAgICApLAorICAgICJXMDcwMiI6ICgKKyAgICAgICAgIk5vIGV4Y2VwdGlvbiB0eXBlKHMpIHNwZWNpZmllZCIsCisgICAgICAgICJiYXJlLWV4Y2VwdCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gZXhjZXB0IGNsYXVzZSBkb2Vzbid0IHNwZWNpZnkgZXhjZXB0aW9ucyB0eXBlIHRvIGNhdGNoLiIsCisgICAgKSwKKyAgICAiVzA3MDMiOiAoCisgICAgICAgICJDYXRjaGluZyB0b28gZ2VuZXJhbCBleGNlcHRpb24gJXMiLAorICAgICAgICAiYnJvYWQtZXhjZXB0IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBleGNlcHQgY2F0Y2hlcyBhIHRvbyBnZW5lcmFsIGV4Y2VwdGlvbiwgIgorICAgICAgICAicG9zc2libHkgYnVyeWluZyB1bnJlbGF0ZWQgZXJyb3JzLiIsCisgICAgKSwKKyAgICAiVzA3MDUiOiAoCisgICAgICAgICJDYXRjaGluZyBwcmV2aW91c2x5IGNhdWdodCBleGNlcHRpb24gdHlwZSAlcyIsCisgICAgICAgICJkdXBsaWNhdGUtZXhjZXB0IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBleGNlcHQgY2F0Y2hlcyBhIHR5cGUgdGhhdCB3YXMgYWxyZWFkeSBjYXVnaHQgYnkgIgorICAgICAgICAiYSBwcmV2aW91cyBoYW5kbGVyLiIsCisgICAgKSwKKyAgICAiVzA3MDYiOiAoCisgICAgICAgICJUaGUgZXhjZXB0IGhhbmRsZXIgcmFpc2VzIGltbWVkaWF0ZWx5IiwKKyAgICAgICAgInRyeS1leGNlcHQtcmFpc2UiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGV4Y2VwdCBoYW5kbGVyIHVzZXMgcmFpc2UgYXMgaXRzIGZpcnN0IG9yIG9ubHkgIgorICAgICAgICAib3BlcmF0b3IuIFRoaXMgaXMgdXNlbGVzcyBiZWNhdXNlIGl0IHJhaXNlcyBiYWNrIHRoZSBleGNlcHRpb24gIgorICAgICAgICAiaW1tZWRpYXRlbHkuIFJlbW92ZSB0aGUgcmFpc2Ugb3BlcmF0b3Igb3IgdGhlIGVudGlyZSAiCisgICAgICAgICJ0cnktZXhjZXB0LXJhaXNlIGJsb2NrISIsCisgICAgKSwKKyAgICAiVzA3MDciOiAoCisgICAgICAgICJDb25zaWRlciBleHBsaWNpdGx5IHJlLXJhaXNpbmcgdXNpbmcgdGhlICdmcm9tJyBrZXl3b3JkIiwKKyAgICAgICAgInJhaXNlLW1pc3NpbmctZnJvbSIsCisgICAgICAgICJQeXRob24gMydzIGV4Y2VwdGlvbiBjaGFpbmluZyBtZWFucyBpdCBzaG93cyB0aGUgdHJhY2ViYWNrIG9mIHRoZSAiCisgICAgICAgICJjdXJyZW50IGV4Y2VwdGlvbiwgYnV0IGFsc28gdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4gTm90IHVzaW5nIGByYWlzZSAiCisgICAgICAgICJmcm9tYCBtYWtlcyB0aGUgdHJhY2ViYWNrIGluYWNjdXJhdGUsIGJlY2F1c2UgdGhlIG1lc3NhZ2UgaW1wbGllcyAiCisgICAgICAgICJ0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgZXhjZXB0aW9uLWhhbmRsaW5nIGNvZGUgaXRzZWxmLCB3aGljaCBpcyBhICIKKyAgICAgICAgInNlcGFyYXRlIHNpdHVhdGlvbiB0aGFuIHdyYXBwaW5nIGFuIGV4Y2VwdGlvbi4iLAorICAgICksCisgICAgIlcwNzExIjogKAorICAgICAgICAnRXhjZXB0aW9uIHRvIGNhdGNoIGlzIHRoZSByZXN1bHQgb2YgYSBiaW5hcnkgIiVzIiBvcGVyYXRpb24nLAorICAgICAgICAiYmluYXJ5LW9wLWV4Y2VwdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gdGhlIGV4Y2VwdGlvbiB0byBjYXRjaCBpcyBvZiB0aGUgZm9ybSAiCisgICAgICAgICciZXhjZXB0IEEgb3IgQjoiLiAgSWYgaW50ZW5kaW5nIHRvIGNhdGNoIG11bHRpcGxlLCAnCisgICAgICAgICdyZXdyaXRlIGFzICJleGNlcHQgKEEsIEIpOiInLAorICAgICksCisgICAgIlcwNzE1IjogKAorICAgICAgICAiRXhjZXB0aW9uIGFyZ3VtZW50cyBzdWdnZXN0IHN0cmluZyBmb3JtYXR0aW5nIG1pZ2h0IGJlIGludGVuZGVkIiwKKyAgICAgICAgInJhaXNpbmctZm9ybWF0LXR1cGxlIiwKKyAgICAgICAgIlVzZWQgd2hlbiBwYXNzaW5nIG11bHRpcGxlIGFyZ3VtZW50cyB0byBhbiBleGNlcHRpb24gIgorICAgICAgICAiY29uc3RydWN0b3IsIHRoZSBmaXJzdCBvZiB0aGVtIGEgc3RyaW5nIGxpdGVyYWwgY29udGFpbmluZyB3aGF0ICIKKyAgICAgICAgImFwcGVhcnMgdG8gYmUgcGxhY2Vob2xkZXJzIGludGVuZGVkIGZvciBmb3JtYXR0aW5nIiwKKyAgICApLAorICAgICJXMDcxNiI6ICgKKyAgICAgICAgIkludmFsaWQgZXhjZXB0aW9uIG9wZXJhdGlvbi4gJXMiLAorICAgICAgICAid3JvbmctZXhjZXB0aW9uLW9wZXJhdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGRvbmUgYWdhaW5zdCBhbiBleGNlcHRpb24sIGJ1dCB0aGUgb3BlcmF0aW9uICIKKyAgICAgICAgImlzIG5vdCB2YWxpZCBmb3IgdGhlIGV4Y2VwdGlvbiBpbiBxdWVzdGlvbi4gVXN1YWxseSBlbWl0dGVkIHdoZW4gaGF2aW5nICIKKyAgICAgICAgImJpbmFyeSBvcGVyYXRpb25zIGJldHdlZW4gZXhjZXB0aW9ucyBpbiBleGNlcHQgaGFuZGxlcnMuIiwKKyAgICApLAorfQorCisKK2NsYXNzIEJhc2VWaXNpdG9yOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHZpc2l0b3JzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2hlY2tlciwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrZXIgPSBjaGVja2VyCisgICAgICAgIHNlbGYuX25vZGUgPSBub2RlCisKKyAgICBkZWYgdmlzaXQoc2VsZiwgbm9kZSk6CisgICAgICAgIG5hbWUgPSBub2RlLl9fY2xhc3NfXy5fX25hbWVfXy5sb3dlcigpCisgICAgICAgIGRpc3BhdGNoX21ldGggPSBnZXRhdHRyKHNlbGYsICJ2aXNpdF8iICsgbmFtZSwgTm9uZSkKKyAgICAgICAgaWYgZGlzcGF0Y2hfbWV0aDoKKyAgICAgICAgICAgIGRpc3BhdGNoX21ldGgobm9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmlzaXRfZGVmYXVsdChub2RlKQorCisgICAgZGVmIHZpc2l0X2RlZmF1bHQoc2VsZiwgbm9kZSk6ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgIiIiRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIHRoZSBub2Rlcy4iIiIKKworCitjbGFzcyBFeGNlcHRpb25SYWlzZVJlZlZpc2l0b3IoQmFzZVZpc2l0b3IpOgorICAgICIiIlZpc2l0IHJlZmVyZW5jZXMgKGFueXRoaW5nIHRoYXQgaXMgbm90IGFuIEFTVCBsZWFmKS4iIiIKKworICAgIGRlZiB2aXNpdF9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lLm5hbWUgPT0gIk5vdEltcGxlbWVudGVkIjoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrZXIuYWRkX21lc3NhZ2UoIm5vdGltcGxlbWVudGVkLXJhaXNlZCIsIG5vZGU9c2VsZi5fbm9kZSkKKworICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIGNhbGwpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGNhbGwuZnVuYywgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIHNlbGYudmlzaXRfbmFtZShjYWxsLmZ1bmMpCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGxlbihjYWxsLmFyZ3MpID4gMQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoY2FsbC5hcmdzWzBdLCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoY2FsbC5hcmdzWzBdLnZhbHVlLCBzdHIpCisgICAgICAgICk6CisgICAgICAgICAgICBtc2cgPSBjYWxsLmFyZ3NbMF0udmFsdWUKKyAgICAgICAgICAgIGlmICIlIiBpbiBtc2cgb3IgKCJ7IiBpbiBtc2cgYW5kICJ9IiBpbiBtc2cpOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrZXIuYWRkX21lc3NhZ2UoInJhaXNpbmctZm9ybWF0LXR1cGxlIiwgbm9kZT1zZWxmLl9ub2RlKQorCisKK2NsYXNzIEV4Y2VwdGlvblJhaXNlTGVhZlZpc2l0b3IoQmFzZVZpc2l0b3IpOgorICAgICIiIlZpc2l0b3IgZm9yIGhhbmRsaW5nIGxlYWYga2luZHMgb2YgYSByYWlzZSB2YWx1ZS4iIiIKKworICAgIGRlZiB2aXNpdF9jb25zdChzZWxmLCBjb25zdCk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbnN0LnZhbHVlLCBzdHIpOgorICAgICAgICAgICAgIyByYWlzaW5nLXN0cmluZyB3aWxsIGJlIGVtaXR0ZWQgZnJvbSBweXRob24zIHBvcnRpbmcgY2hlY2tlci4KKyAgICAgICAgICAgIHNlbGYuX2NoZWNrZXIuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInJhaXNpbmctYmFkLXR5cGUiLCBub2RlPXNlbGYuX25vZGUsIGFyZ3M9Y29uc3QudmFsdWUuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgICAgICApCisKKyAgICBkZWYgdmlzaXRfaW5zdGFuY2Uoc2VsZiwgaW5zdGFuY2UpOgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgIGNscyA9IGluc3RhbmNlLl9wcm94aWVkCisgICAgICAgIHNlbGYudmlzaXRfY2xhc3NkZWYoY2xzKQorCisgICAgIyBFeGNlcHRpb24gaW5zdGFuY2VzIGhhdmUgYSBwYXJ0aWN1bGFyIGNsYXNzIHR5cGUKKyAgICB2aXNpdF9leGNlcHRpb25pbnN0YW5jZSA9IHZpc2l0X2luc3RhbmNlCisKKyAgICBkZWYgdmlzaXRfY2xhc3NkZWYoc2VsZiwgY2xzKToKKyAgICAgICAgaWYgbm90IHV0aWxzLmluaGVyaXRfZnJvbV9zdGRfZXgoY2xzKSBhbmQgdXRpbHMuaGFzX2tub3duX2Jhc2VzKGNscyk6CisgICAgICAgICAgICBpZiBjbHMubmV3c3R5bGU6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tlci5hZGRfbWVzc2FnZSgicmFpc2luZy1ub24tZXhjZXB0aW9uIiwgbm9kZT1zZWxmLl9ub2RlKQorCisgICAgZGVmIHZpc2l0X3R1cGxlKHNlbGYsIF8pOgorICAgICAgICBzZWxmLl9jaGVja2VyLmFkZF9tZXNzYWdlKCJyYWlzaW5nLWJhZC10eXBlIiwgbm9kZT1zZWxmLl9ub2RlLCBhcmdzPSJ0dXBsZSIpCisKKyAgICBkZWYgdmlzaXRfZGVmYXVsdChzZWxmLCBub2RlKToKKyAgICAgICAgbmFtZSA9IGdldGF0dHIobm9kZSwgIm5hbWUiLCBub2RlLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgc2VsZi5fY2hlY2tlci5hZGRfbWVzc2FnZSgicmFpc2luZy1iYWQtdHlwZSIsIG5vZGU9c2VsZi5fbm9kZSwgYXJncz1uYW1lKQorCisKK2NsYXNzIEV4Y2VwdGlvbnNDaGVja2VyKGNoZWNrZXJzLkJhc2VDaGVja2VyKToKKyAgICAiIiJFeGNlcHRpb24gcmVsYXRlZCBjaGVja3MuIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyCisKKyAgICBuYW1lID0gImV4Y2VwdGlvbnMiCisgICAgbXNncyA9IE1TR1MKKyAgICBwcmlvcml0eSA9IC00CisgICAgb3B0aW9ucyA9ICgKKyAgICAgICAgKAorICAgICAgICAgICAgIm92ZXJnZW5lcmFsLWV4Y2VwdGlvbnMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogT1ZFUkdFTkVSQUxfRVhDRVBUSU9OUywKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxjb21tYS1zZXBhcmF0ZWQgY2xhc3MgbmFtZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJFeGNlcHRpb25zIHRoYXQgd2lsbCBlbWl0IGEgd2FybmluZyAiCisgICAgICAgICAgICAgICAgJ3doZW4gYmVpbmcgY2F1Z2h0LiBEZWZhdWx0cyB0byAiJXMiLicKKyAgICAgICAgICAgICAgICAlICgiLCAiLmpvaW4oT1ZFUkdFTkVSQUxfRVhDRVBUSU9OUyksKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2J1aWx0aW5fZXhjZXB0aW9ucyA9IF9idWlsdGluX2V4Y2VwdGlvbnMoKQorICAgICAgICBzdXBlcigpLm9wZW4oKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKAorICAgICAgICAibWlzcGxhY2VkLWJhcmUtcmFpc2UiLAorICAgICAgICAicmFpc2luZy1iYWQtdHlwZSIsCisgICAgICAgICJyYWlzaW5nLW5vbi1leGNlcHRpb24iLAorICAgICAgICAibm90aW1wbGVtZW50ZWQtcmFpc2VkIiwKKyAgICAgICAgImJhZC1leGNlcHRpb24tY29udGV4dCIsCisgICAgICAgICJyYWlzaW5nLWZvcm1hdC10dXBsZSIsCisgICAgICAgICJyYWlzZS1taXNzaW5nLWZyb20iLAorICAgICkKKyAgICBkZWYgdmlzaXRfcmFpc2Uoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUuZXhjIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9jaGVja19taXNwbGFjZWRfYmFyZV9yYWlzZShub2RlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm9kZS5jYXVzZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfcmFpc2VfbWlzc2luZ19mcm9tKG5vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jaGVja19iYWRfZXhjZXB0aW9uX2NvbnRleHQobm9kZSkKKworICAgICAgICBleHByID0gbm9kZS5leGMKKyAgICAgICAgRXhjZXB0aW9uUmFpc2VSZWZWaXNpdG9yKHNlbGYsIG5vZGUpLnZpc2l0KGV4cHIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5mZXJyZWRfdmFsdWUgPSBleHByLmluZmVycmVkKClbLTFdCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaW5mZXJyZWRfdmFsdWU6CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUmFpc2VMZWFmVmlzaXRvcihzZWxmLCBub2RlKS52aXNpdChpbmZlcnJlZF92YWx1ZSkKKworICAgIGRlZiBfY2hlY2tfbWlzcGxhY2VkX2JhcmVfcmFpc2Uoc2VsZiwgbm9kZSk6CisgICAgICAgICMgRmlsdGVyIG91dCBpZiBpdCdzIHByZXNlbnQgaW4gX19leGl0X18uCisgICAgICAgIHNjb3BlID0gbm9kZS5zY29wZSgpCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpCisgICAgICAgICAgICBhbmQgc2NvcGUuaXNfbWV0aG9kKCkKKyAgICAgICAgICAgIGFuZCBzY29wZS5uYW1lID09ICJfX2V4aXRfXyIKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGN1cnJlbnQgPSBub2RlCisgICAgICAgICMgU3RvcCB3aGVuIGEgbmV3IHNjb3BlIGlzIGdlbmVyYXRlZCBvciB3aGVuIHRoZSByYWlzZQorICAgICAgICAjIHN0YXRlbWVudCBpcyBmb3VuZCBpbnNpZGUgYSBUcnlGaW5hbGx5LgorICAgICAgICBpZ25vcmVzID0gKGFzdHJvaWQuRXhjZXB0SGFuZGxlciwgYXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgd2hpbGUgY3VycmVudCBhbmQgbm90IGlzaW5zdGFuY2UoY3VycmVudC5wYXJlbnQsIGlnbm9yZXMpOgorICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50CisKKyAgICAgICAgZXhwZWN0ZWQgPSAoYXN0cm9pZC5FeGNlcHRIYW5kbGVyLCkKKyAgICAgICAgaWYgbm90IGN1cnJlbnQgb3Igbm90IGlzaW5zdGFuY2UoY3VycmVudC5wYXJlbnQsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm1pc3BsYWNlZC1iYXJlLXJhaXNlIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19iYWRfZXhjZXB0aW9uX2NvbnRleHQoc2VsZiwgbm9kZTogYXN0cm9pZC5SYWlzZSkgLT4gTm9uZToKKyAgICAgICAgIiIiVmVyaWZ5IHRoYXQgdGhlIGV4Y2VwdGlvbiBjb250ZXh0IGlzIHByb3Blcmx5IHNldC4KKworICAgICAgICBBbiBleGNlcHRpb24gY29udGV4dCBjYW4gYmUgb25seSBgTm9uZWAgb3IgYW4gZXhjZXB0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgY2F1c2UgPSB1dGlscy5zYWZlX2luZmVyKG5vZGUuY2F1c2UpCisgICAgICAgIGlmIGNhdXNlIGluIChhc3Ryb2lkLlVuaW5mZXJhYmxlLCBOb25lKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2F1c2UsIGFzdHJvaWQuQ29uc3QpOgorICAgICAgICAgICAgaWYgY2F1c2UudmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYmFkLWV4Y2VwdGlvbi1jb250ZXh0Iiwgbm9kZT1ub2RlKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGNhdXNlLCBhc3Ryb2lkLkNsYXNzRGVmKSBhbmQgbm90IHV0aWxzLmluaGVyaXRfZnJvbV9zdGRfZXgoCisgICAgICAgICAgICBjYXVzZQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYmFkLWV4Y2VwdGlvbi1jb250ZXh0Iiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19yYWlzZV9taXNzaW5nX2Zyb20oc2VsZiwgbm9kZTogYXN0cm9pZC5SYWlzZSkgLT4gTm9uZToKKyAgICAgICAgaWYgbm9kZS5leGMgaXMgTm9uZToKKyAgICAgICAgICAgICMgVGhpcyBpcyBhIHBsYWluIGByYWlzZWAsIHJhaXNpbmcgdGhlIHByZXZpb3VzbHktY2F1Z2h0IGV4Y2VwdGlvbi4gTm8gbmVlZCBmb3IgYQorICAgICAgICAgICAgIyBjYXVzZS4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFdlJ2QgbGlrZSB0byBjaGVjayB3aGV0aGVyIHdlJ3JlIGluc2lkZSBhbiBgZXhjZXB0YCBjbGF1c2U6CisgICAgICAgIGNvbnRhaW5pbmdfZXhjZXB0X25vZGUgPSB1dGlscy5maW5kX2V4Y2VwdF93cmFwcGVyX25vZGVfaW5fc2NvcGUobm9kZSkKKyAgICAgICAgaWYgbm90IGNvbnRhaW5pbmdfZXhjZXB0X25vZGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBXZSBmb3VuZCBhIHN1cnJvdW5kaW5nIGBleGNlcHRgISBXZSdyZSBhbG1vc3QgZG9uZSBwcm92aW5nIHRoZXJlJ3MgYQorICAgICAgICAjIGByYWlzZS1taXNzaW5nLWZyb21gIGhlcmUuIFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGlzIHRoYXQgbWF5YmUKKyAgICAgICAgIyB0aGUgYHJhaXNlYCBpcyByYWlzaW5nIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgY2F1Z2h0LCBwb3NzaWJseSB3aXRoIHNvbWUgc2hlbmFuaWdhbnMKKyAgICAgICAgIyBsaWtlIGBleGMud2l0aF90cmFjZWJhY2sod2hhdGV2ZXIpYC4gV2Ugd29uJ3QgYW5hbHl6ZSB0aGVzZSwgd2UnbGwganVzdCBhc3N1bWUKKyAgICAgICAgIyB0aGVyZSdzIGEgdmlvbGF0aW9uIG9uIHR3byBzaW1wbGUgY2FzZXM6IGByYWlzZSBTb21lRXhjZXB0aW9uKHdoYXRldmVyKWAgYW5kIGByYWlzZQorICAgICAgICAjIFNvbWVFeGNlcHRpb25gLgorICAgICAgICBpZiBjb250YWluaW5nX2V4Y2VwdF9ub2RlLm5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgVGhlIGBleGNlcHRgIGRvZXNuJ3QgaGF2ZSBhbiBgYXMgZXhjZXB0aW9uOmAgcGFydCwgbWVhbmluZyB0aGVyZSdzIG5vIHdheSB0aGF0CisgICAgICAgICAgICAjIHRoZSBgcmFpc2VgIGlzIHJhaXNpbmcgdGhlIHNhbWUgZXhjZXB0aW9uLgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgicmFpc2UtbWlzc2luZy1mcm9tIiwgbm9kZT1ub2RlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZS5leGMsIGFzdHJvaWQuQ2FsbCkgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgICAgICBub2RlLmV4Yy5mdW5jLCBhc3Ryb2lkLk5hbWUKKyAgICAgICAgKToKKyAgICAgICAgICAgICMgV2UgaGF2ZSBhIGByYWlzZSBTb21lRXhjZXB0aW9uKHdoYXRldmVyKWAuCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJyYWlzZS1taXNzaW5nLWZyb20iLCBub2RlPW5vZGUpCisgICAgICAgIGVsaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmV4YywgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgYW5kIG5vZGUuZXhjLm5hbWUgIT0gY29udGFpbmluZ19leGNlcHRfbm9kZS5uYW1lLm5hbWUKKyAgICAgICAgKToKKyAgICAgICAgICAgICMgV2UgaGF2ZSBhIGByYWlzZSBTb21lRXhjZXB0aW9uYC4KKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJhaXNlLW1pc3NpbmctZnJvbSIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfY2F0Y2hpbmdfbm9uX2V4Y2VwdGlvbihzZWxmLCBoYW5kbGVyLCBleGMsIHBhcnQpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGV4YywgYXN0cm9pZC5UdXBsZSk6CisgICAgICAgICAgICAjIENoZWNrIGlmIGl0IGlzIGEgdHVwbGUgb2YgZXhjZXB0aW9ucy4KKyAgICAgICAgICAgIGluZmVycmVkID0gW3V0aWxzLnNhZmVfaW5mZXIoZWx0KSBmb3IgZWx0IGluIGV4Yy5lbHRzXQorICAgICAgICAgICAgaWYgYW55KG5vZGUgaXMgYXN0cm9pZC5VbmluZmVyYWJsZSBmb3Igbm9kZSBpbiBpbmZlcnJlZCk6CisgICAgICAgICAgICAgICAgIyBEb24ndCBlbWl0IGlmIHdlIGRvbid0IGtub3cgZXZlcnkgY29tcG9uZW50LgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgYWxsKAorICAgICAgICAgICAgICAgIG5vZGUKKyAgICAgICAgICAgICAgICBhbmQgKHV0aWxzLmluaGVyaXRfZnJvbV9zdGRfZXgobm9kZSkgb3Igbm90IHV0aWxzLmhhc19rbm93bl9iYXNlcyhub2RlKSkKKyAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBpbmZlcnJlZAorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgIyBEb24ndCBlbWl0IHRoZSB3YXJuaW5nIGlmIHRoZSBpbmZlcnJlZCBzdG10CisgICAgICAgICAgICAjIGlzIE5vbmUsIGJ1dCB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXMgc29tZXRoaW5nIGVsc2UsCisgICAgICAgICAgICAjIG1heWJlIGl0IHdhcyByZWRlZmluZWQuCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4YywgYXN0cm9pZC5Db25zdCkgYW5kIGV4Yy52YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShoYW5kbGVyLnR5cGUsIGFzdHJvaWQuQ29uc3QpCisgICAgICAgICAgICAgICAgICAgIGFuZCBoYW5kbGVyLnR5cGUudmFsdWUgaXMgTm9uZQorICAgICAgICAgICAgICAgICkgb3IgaGFuZGxlci50eXBlLnBhcmVudF9vZihleGMpOgorICAgICAgICAgICAgICAgICAgICAjIElmIHRoZSBleGNlcHRpb24gaGFuZGxlciBjYXRjaGVzIE5vbmUgb3IKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIGNvbXBvbmVudCwgd2hpY2ggaXMgTm9uZSwgaXMKKyAgICAgICAgICAgICAgICAgICAgIyBkZWZpbmVkIGJ5IHRoZSBlbnRpcmUgZXhjZXB0aW9uIGhhbmRsZXIsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgIyBlbWl0IGEgd2FybmluZy4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYXRjaGluZy1ub24tZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9aGFuZGxlci50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0ocGFydC5hc19zdHJpbmcoKSwpLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJjYXRjaGluZy1ub24tZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZT1oYW5kbGVyLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHBhcnQuYXNfc3RyaW5nKCksKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiAoCisgICAgICAgICAgICBub3QgdXRpbHMuaW5oZXJpdF9mcm9tX3N0ZF9leChleGMpCisgICAgICAgICAgICBhbmQgZXhjLm5hbWUgbm90IGluIHNlbGYuX2J1aWx0aW5fZXhjZXB0aW9ucworICAgICAgICApOgorICAgICAgICAgICAgaWYgdXRpbHMuaGFzX2tub3duX2Jhc2VzKGV4Yyk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgImNhdGNoaW5nLW5vbi1leGNlcHRpb24iLCBub2RlPWhhbmRsZXIudHlwZSwgYXJncz0oZXhjLm5hbWUsKQorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfdHJ5X2V4Y2VwdF9yYWlzZShzZWxmLCBub2RlKToKKyAgICAgICAgZGVmIGdhdGhlcl9leGNlcHRpb25zX2Zyb21faGFuZGxlcigKKyAgICAgICAgICAgIGhhbmRsZXIsCisgICAgICAgICkgLT4gdHlwaW5nLk9wdGlvbmFsW3R5cGluZy5MaXN0W2FzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVOR11dOgorICAgICAgICAgICAgZXhjZXB0aW9uczogdHlwaW5nLkxpc3RbYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HXSA9IFtdCisgICAgICAgICAgICBpZiBoYW5kbGVyLnR5cGU6CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uc19pbl9oYW5kbGVyID0gdXRpbHMuc2FmZV9pbmZlcihoYW5kbGVyLnR5cGUpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleGNlcHRpb25zX2luX2hhbmRsZXIsIGFzdHJvaWQuVHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zID0gbGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhjZXB0aW9uIGluIGV4Y2VwdGlvbnNfaW5faGFuZGxlci5lbHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleGNlcHRpb24sIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGVsaWYgZXhjZXB0aW9uc19pbl9oYW5kbGVyOgorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zID0gW2V4Y2VwdGlvbnNfaW5faGFuZGxlcl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEJyZWFrIHdoZW4gd2UgY2Fubm90IGluZmVyIGFueXRoaW5nIHJlbGlhYmx5LgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbnMKKworICAgICAgICBiYXJlX3JhaXNlID0gRmFsc2UKKyAgICAgICAgaGFuZGxlcl9oYXZpbmdfYmFyZV9yYWlzZSA9IE5vbmUKKyAgICAgICAgZXhjc19pbl9iYXJlX2hhbmRsZXIgPSBbXQorICAgICAgICBmb3IgaGFuZGxlciBpbiBub2RlLmhhbmRsZXJzOgorICAgICAgICAgICAgaWYgYmFyZV9yYWlzZToKKyAgICAgICAgICAgICAgICAjIGNoZWNrIHRoYXQgc3Vic2VxdWVudCBoYW5kbGVyIGlzIG5vdCBwYXJlbnQgb2YgaGFuZGxlciB3aGljaCBoYWQgYmFyZSByYWlzZS4KKyAgICAgICAgICAgICAgICAjIHNpbmNlIHV0aWxzLnNhZmVfaW5mZXIgY2FuIGZhaWwgZm9yIGJhcmUgZXhjZXB0LCBjaGVjayBpdCBiZWZvcmUuCisgICAgICAgICAgICAgICAgIyBhbHNvIGJyZWFrIGVhcmx5IGlmIGJhcmUgZXhjZXB0IGlzIGZvbGxvd2VkIGJ5IGJhcmUgZXhjZXB0LgorCisgICAgICAgICAgICAgICAgZXhjc19pbl9jdXJyZW50X2hhbmRsZXIgPSBnYXRoZXJfZXhjZXB0aW9uc19mcm9tX2hhbmRsZXIoaGFuZGxlcikKKyAgICAgICAgICAgICAgICBpZiBub3QgZXhjc19pbl9jdXJyZW50X2hhbmRsZXI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgZXhjc19pbl9iYXJlX2hhbmRsZXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgYE5vbmVgIHdoZW4gdGhlIGluZmVyZW5jZSBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmb3IgZXhjX2luX2N1cnJlbnRfaGFuZGxlciBpbiBleGNzX2luX2N1cnJlbnRfaGFuZGxlcjoKKyAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWRfY3VycmVudCA9IHV0aWxzLnNhZmVfaW5mZXIoZXhjX2luX2N1cnJlbnRfaGFuZGxlcikKKyAgICAgICAgICAgICAgICAgICAgaWYgYW55KAorICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuaXNfc3ViY2xhc3Nfb2YodXRpbHMuc2FmZV9pbmZlcihlKSwgaW5mZXJyZWRfY3VycmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlIGluIGV4Y3NfaW5fYmFyZV9oYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXJlX3JhaXNlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgYHJhaXNlYCBhcyB0aGUgZmlyc3Qgb3BlcmF0b3IgaW5zaWRlIHRoZSBleGNlcHQgaGFuZGxlcgorICAgICAgICAgICAgaWYgX2lzX3JhaXNpbmcoW2hhbmRsZXIuYm9keVswXV0pOgorICAgICAgICAgICAgICAgICMgZmxhZ3Mgd2hlbiB0aGVyZSBpcyBhIGJhcmUgcmFpc2UKKyAgICAgICAgICAgICAgICBpZiBoYW5kbGVyLmJvZHlbMF0uZXhjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGJhcmVfcmFpc2UgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfaGF2aW5nX2JhcmVfcmFpc2UgPSBoYW5kbGVyCisgICAgICAgICAgICAgICAgICAgIGV4Y3NfaW5fYmFyZV9oYW5kbGVyID0gZ2F0aGVyX2V4Y2VwdGlvbnNfZnJvbV9oYW5kbGVyKGhhbmRsZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBiYXJlX3JhaXNlOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInRyeS1leGNlcHQtcmFpc2UiLCBub2RlPWhhbmRsZXJfaGF2aW5nX2JhcmVfcmFpc2UpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoIndyb25nLWV4Y2VwdGlvbi1vcGVyYXRpb24iKQorICAgIGRlZiB2aXNpdF9iaW5vcChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5FeGNlcHRIYW5kbGVyKToKKyAgICAgICAgICAgICMgZXhjZXB0IChWIHwgQSkKKyAgICAgICAgICAgIHN1Z2dlc3Rpb24gPSAiRGlkIHlvdSBtZWFuICcoe30sIHt9KScgaW5zdGVhZD8iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBub2RlLmxlZnQuYXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgbm9kZS5yaWdodC5hc19zdHJpbmcoKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIndyb25nLWV4Y2VwdGlvbi1vcGVyYXRpb24iLCBub2RlPW5vZGUsIGFyZ3M9KHN1Z2dlc3Rpb24sKSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygid3JvbmctZXhjZXB0aW9uLW9wZXJhdGlvbiIpCisgICAgZGVmIHZpc2l0X2NvbXBhcmUoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuRXhjZXB0SGFuZGxlcik6CisgICAgICAgICAgICAjIGV4Y2VwdCAoViA8IEEpCisgICAgICAgICAgICBzdWdnZXN0aW9uID0gIkRpZCB5b3UgbWVhbiAnKHt9LCB7fSknIGluc3RlYWQ/Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgbm9kZS5sZWZ0LmFzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICIsICIuam9pbihvcGVyYW5kLmFzX3N0cmluZygpIGZvciBfLCBvcGVyYW5kIGluIG5vZGUub3BzKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIndyb25nLWV4Y2VwdGlvbi1vcGVyYXRpb24iLCBub2RlPW5vZGUsIGFyZ3M9KHN1Z2dlc3Rpb24sKSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgImJhcmUtZXhjZXB0IiwKKyAgICAgICAgImJyb2FkLWV4Y2VwdCIsCisgICAgICAgICJ0cnktZXhjZXB0LXJhaXNlIiwKKyAgICAgICAgImJpbmFyeS1vcC1leGNlcHRpb24iLAorICAgICAgICAiYmFkLWV4Y2VwdC1vcmRlciIsCisgICAgICAgICJjYXRjaGluZy1ub24tZXhjZXB0aW9uIiwKKyAgICAgICAgImR1cGxpY2F0ZS1leGNlcHQiLAorICAgICkKKyAgICBkZWYgdmlzaXRfdHJ5ZXhjZXB0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayBmb3IgZW1wdHkgZXhjZXB0IiIiCisgICAgICAgIHNlbGYuX2NoZWNrX3RyeV9leGNlcHRfcmFpc2Uobm9kZSkKKyAgICAgICAgZXhjZXB0aW9uc19jbGFzc2VzID0gW10KKyAgICAgICAgbmJfaGFuZGxlcnMgPSBsZW4obm9kZS5oYW5kbGVycykKKyAgICAgICAgZm9yIGluZGV4LCBoYW5kbGVyIGluIGVudW1lcmF0ZShub2RlLmhhbmRsZXJzKToKKyAgICAgICAgICAgIGlmIGhhbmRsZXIudHlwZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIG5vdCBfaXNfcmFpc2luZyhoYW5kbGVyLmJvZHkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJiYXJlLWV4Y2VwdCIsIG5vZGU9aGFuZGxlcikKKworICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgYW4gImV4Y2VwdDoiIGlzIGZvbGxvd2VkIGJ5IHNvbWUgb3RoZXIKKyAgICAgICAgICAgICAgICAjIGV4Y2VwdAorICAgICAgICAgICAgICAgIGlmIGluZGV4IDwgKG5iX2hhbmRsZXJzIC0gMSk6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJlbXB0eSBleGNlcHQgY2xhdXNlIHNob3VsZCBhbHdheXMgYXBwZWFyIGxhc3QiCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhZC1leGNlcHQtb3JkZXIiLCBub2RlPW5vZGUsIGFyZ3M9bXNnKQorCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaGFuZGxlci50eXBlLCBhc3Ryb2lkLkJvb2xPcCk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgImJpbmFyeS1vcC1leGNlcHRpb24iLCBub2RlPWhhbmRsZXIsIGFyZ3M9aGFuZGxlci50eXBlLm9wCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGV4Y3MgPSBsaXN0KF9hbm5vdGF0ZWRfdW5wYWNrX2luZmVyKGhhbmRsZXIudHlwZSkpCisgICAgICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBmb3IgcGFydCwgZXhjIGluIGV4Y3M6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4YyBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleGMsIGFzdHJvaWQuSW5zdGFuY2UpIGFuZCB1dGlscy5pbmhlcml0X2Zyb21fc3RkX2V4KAorICAgICAgICAgICAgICAgICAgICAgICAgZXhjCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICBleGMgPSBleGMuX3Byb3hpZWQKKworICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19jYXRjaGluZ19ub25fZXhjZXB0aW9uKGhhbmRsZXIsIGV4YywgcGFydCkKKworICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBleGNfYW5jZXN0b3JzID0gWworICAgICAgICAgICAgICAgICAgICAgICAgYW5jCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW5jIGluIGV4Yy5hbmNlc3RvcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhbmMsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICAgICAgICAgICAgIF0KKworICAgICAgICAgICAgICAgICAgICBmb3IgcHJldmlvdXNfZXhjIGluIGV4Y2VwdGlvbnNfY2xhc3NlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzX2V4YyBpbiBleGNfYW5jZXN0b3JzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJ7fSBpcyBhbiBhbmNlc3RvciBjbGFzcyBvZiB7fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19leGMubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQtZXhjZXB0LW9yZGVyIiwgbm9kZT1oYW5kbGVyLnR5cGUsIGFyZ3M9bXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICBleGMubmFtZSBpbiBzZWxmLmNvbmZpZy5vdmVyZ2VuZXJhbF9leGNlcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXhjLnJvb3QoKS5uYW1lID09IHV0aWxzLkVYQ0VQVElPTlNfTU9EVUxFCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IF9pc19yYWlzaW5nKGhhbmRsZXIuYm9keSkKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJyb2FkLWV4Y2VwdCIsIGFyZ3M9ZXhjLm5hbWUsIG5vZGU9aGFuZGxlci50eXBlCisgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhjIGluIGV4Y2VwdGlvbnNfY2xhc3NlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZS1leGNlcHQiLCBhcmdzPWV4Yy5uYW1lLCBub2RlPWhhbmRsZXIudHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICAgICAgZXhjZXB0aW9uc19jbGFzc2VzICs9IFtleGMgZm9yIF8sIGV4YyBpbiBleGNzXQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiInJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlciIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEV4Y2VwdGlvbnNDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvZm9ybWF0LnB5IGIvcHlsaW50L2NoZWNrZXJzL2Zvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg3NzUyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL2Zvcm1hdC5weQpAQCAtMCwwICsxLDgwMSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTMgbW94aWFuIDxhbGVmdG1haWxAaW5ib3gucnU+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgZnJvc3QtbnpjcjQgPGZyb3N0Lm56Y3I0QGphZ21vcnQuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFsIE5vd2lrb3dza2kgPGdvZGZyeWRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNSBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBGYWJpbyBOYXRhbGkgPG1lQGZhYmlvbmF0YWxpLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IEhhcnV0IDx5ZXNAaGFydXR1bmUubmFtZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IE1paGFpIEJhbGludCA8YmFsaW50Lm1paGFpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IFBldHIgUHVsYyA8cGV0cnB1bGNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgTW9pc2VzIExvcGV6IDxtb3lsb3AyNjBAdmF1eG9vLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNywgMjAxOS0yMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBLcnp5c3p0b2YgQ3phcGxhIDxrLmN6YXBsYTY4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IEphbWVzIE0uIEFsbGVuIDxqYW1lcy5tLmFsbGVuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IHZpbm55cm9zZSA8dmlubnlyb3NlQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMCBCcnljZSBHdWludGEgPGJyeWNlLmd1aW50YUBwcm90b25tYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LCAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVjYXMgQ2ltb24gPGx1Y2FzLmNpbW9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1pY2hhZWwgSHVkc29uLURveWxlIDxtaWNoYWVsLmh1ZHNvbkBjYW5vbmljYWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTmF0YWxpZSBTZXJlYnJ5YWtvdmEgPG5hdGFsaWUuc2VyZWJyeWFrb3ZhQE5hdGFsaWVzLU1hY0Jvb2stUHJvLmxvY2FsPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTWFyY3VzIE7DpHNsdW5kIDxuYXNsdW5keEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEZ1cmVpZ2ggPHJoeXMuZnVyZWlnaEBnc2EuZ292PgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQW5kcmVhcyBGcmVpbXV0aCA8YW5kcmVhcy5mcmVpbXV0aEB1bml0ZWQtYml0cy5kZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEpha3ViIFdpbGsgPGp3aWxrQGp3aWxrLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBSYXBoYWVsIEdhc2NoaWduYXJkIDxyYXBoYWVsQHJ0cGcuY28+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiUHl0aG9uIGNvZGUgZm9ybWF0J3MgY2hlY2tlci4KKworQnkgZGVmYXVsdCB0cnkgdG8gZm9sbG93IEd1aWRvJ3Mgc3R5bGUgZ3VpZGUgOgorCitodHRwczovL3d3dy5weXRob24ub3JnL2RvYy9lc3NheXMvc3R5bGVndWlkZS8KKworU29tZSBwYXJ0cyBvZiB0aGUgcHJvY2Vzc190b2tlbiBtZXRob2QgaXMgYmFzZWQgZnJvbSBUaGUgVGFiIE5hbm55IHN0ZCBtb2R1bGUuCisiIiIKKworaW1wb3J0IHRva2VuaXplCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcmVkdWNlICAjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtYnVpbHRpbgorZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKKworZnJvbSBhc3Ryb2lkIGltcG9ydCBub2RlcworCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZVRva2VuQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0ICgKKyAgICBjaGVja19tZXNzYWdlcywKKyAgICBpc19vdmVybG9hZF9zdHViLAorICAgIGlzX3Byb3RvY29sX2NsYXNzLAorICAgIG5vZGVfZnJhbWVfY2xhc3MsCispCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IFdhcm5pbmdTY29wZQorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyLCBJUmF3Q2hlY2tlciwgSVRva2VuQ2hlY2tlcgorZnJvbSBweWxpbnQudXRpbHMucHJhZ21hX3BhcnNlciBpbXBvcnQgT1BUSU9OX1BPLCBQcmFnbWFQYXJzZXJFcnJvciwgcGFyc2VfcHJhZ21hCisKK19BU1lOQ19UT0tFTiA9ICJhc3luYyIKK19LRVlXT1JEX1RPS0VOUyA9IFsKKyAgICAiYXNzZXJ0IiwKKyAgICAiZGVsIiwKKyAgICAiZWxpZiIsCisgICAgImV4Y2VwdCIsCisgICAgImZvciIsCisgICAgImlmIiwKKyAgICAiaW4iLAorICAgICJub3QiLAorICAgICJyYWlzZSIsCisgICAgInJldHVybiIsCisgICAgIndoaWxlIiwKKyAgICAieWllbGQiLAorICAgICJ3aXRoIiwKK10KKworX1NQQUNFRF9PUEVSQVRPUlMgPSBbCisgICAgIj09IiwKKyAgICAiPCIsCisgICAgIj4iLAorICAgICIhPSIsCisgICAgIjw+IiwKKyAgICAiPD0iLAorICAgICI+PSIsCisgICAgIis9IiwKKyAgICAiLT0iLAorICAgICIqPSIsCisgICAgIioqPSIsCisgICAgIi89IiwKKyAgICAiLy89IiwKKyAgICAiJj0iLAorICAgICJ8PSIsCisgICAgIl49IiwKKyAgICAiJT0iLAorICAgICI+Pj0iLAorICAgICI8PD0iLAorXQorX09QRU5JTkdfQlJBQ0tFVFMgPSBbIigiLCAiWyIsICJ7Il0KK19DTE9TSU5HX0JSQUNLRVRTID0gWyIpIiwgIl0iLCAifSJdCitfVEFCX0xFTkdUSCA9IDgKKworX0VPTCA9IGZyb3plbnNldChbdG9rZW5pemUuTkVXTElORSwgdG9rZW5pemUuTkwsIHRva2VuaXplLkNPTU1FTlRdKQorX0pVTktfVE9LRU5TID0gKHRva2VuaXplLkNPTU1FTlQsIHRva2VuaXplLk5MKQorCisjIFdoaXRlc3BhY2UgY2hlY2tpbmcgcG9saWN5IGNvbnN0YW50cworX01VU1QgPSAwCitfTVVTVF9OT1QgPSAxCitfSUdOT1JFID0gMgorCitNU0dTID0geworICAgICJDMDMwMSI6ICgKKyAgICAgICAgIkxpbmUgdG9vIGxvbmcgKCVzLyVzKSIsCisgICAgICAgICJsaW5lLXRvby1sb25nIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBnaXZlbiBudW1iZXIgb2YgY2hhcmFjdGVycy4iLAorICAgICksCisgICAgIkMwMzAyIjogKAorICAgICAgICAiVG9vIG1hbnkgbGluZXMgaW4gbW9kdWxlICglcy8lcykiLCAgIyB3YXMgVzAzMDIKKyAgICAgICAgInRvby1tYW55LWxpbmVzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIG1vZHVsZSBoYXMgdG9vIG1hbnkgbGluZXMsIHJlZHVjaW5nIGl0cyByZWFkYWJpbGl0eS4iLAorICAgICksCisgICAgIkMwMzAzIjogKAorICAgICAgICAiVHJhaWxpbmcgd2hpdGVzcGFjZSIsCisgICAgICAgICJ0cmFpbGluZy13aGl0ZXNwYWNlIiwKKyAgICAgICAgIlVzZWQgd2hlbiB0aGVyZSBpcyB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGVuZCBvZiBhIGxpbmUgYW5kIHRoZSBuZXdsaW5lLiIsCisgICAgKSwKKyAgICAiQzAzMDQiOiAoCisgICAgICAgICJGaW5hbCBuZXdsaW5lIG1pc3NpbmciLAorICAgICAgICAibWlzc2luZy1maW5hbC1uZXdsaW5lIiwKKyAgICAgICAgIlVzZWQgd2hlbiB0aGUgbGFzdCBsaW5lIGluIGEgZmlsZSBpcyBtaXNzaW5nIGEgbmV3bGluZS4iLAorICAgICksCisgICAgIkMwMzA1IjogKAorICAgICAgICAiVHJhaWxpbmcgbmV3bGluZXMiLAorICAgICAgICAidHJhaWxpbmctbmV3bGluZXMiLAorICAgICAgICAiVXNlZCB3aGVuIHRoZXJlIGFyZSB0cmFpbGluZyBibGFuayBsaW5lcyBpbiBhIGZpbGUuIiwKKyAgICApLAorICAgICJXMDMxMSI6ICgKKyAgICAgICAgIkJhZCBpbmRlbnRhdGlvbi4gRm91bmQgJXMgJXMsIGV4cGVjdGVkICVzIiwKKyAgICAgICAgImJhZC1pbmRlbnRhdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gdW5leHBlY3RlZCBudW1iZXIgb2YgaW5kZW50YXRpb24ncyB0YWJ1bGF0aW9ucyBvciAiCisgICAgICAgICJzcGFjZXMgaGFzIGJlZW4gZm91bmQuIiwKKyAgICApLAorICAgICJXMDMwMSI6ICgKKyAgICAgICAgIlVubmVjZXNzYXJ5IHNlbWljb2xvbiIsICAjIHdhcyBXMDEwNgorICAgICAgICAidW5uZWNlc3Nhcnktc2VtaWNvbG9uIiwKKyAgICAgICAgJ1VzZWQgd2hlbiBhIHN0YXRlbWVudCBpcyBlbmRlZCBieSBhIHNlbWktY29sb24gKCI7IiksIHdoaWNoICcKKyAgICAgICAgImlzbid0IG5lY2Vzc2FyeSAodGhhdCdzIHB5dGhvbiwgbm90IEMgOykuIiwKKyAgICApLAorICAgICJDMDMyMSI6ICgKKyAgICAgICAgIk1vcmUgdGhhbiBvbmUgc3RhdGVtZW50IG9uIGEgc2luZ2xlIGxpbmUiLAorICAgICAgICAibXVsdGlwbGUtc3RhdGVtZW50cyIsCisgICAgICAgICJVc2VkIHdoZW4gbW9yZSB0aGFuIG9uIHN0YXRlbWVudCBhcmUgZm91bmQgb24gdGhlIHNhbWUgbGluZS4iLAorICAgICAgICB7InNjb3BlIjogV2FybmluZ1Njb3BlLk5PREV9LAorICAgICksCisgICAgIkMwMzI1IjogKAorICAgICAgICAiVW5uZWNlc3NhcnkgcGFyZW5zIGFmdGVyICVyIGtleXdvcmQiLAorICAgICAgICAic3VwZXJmbHVvdXMtcGFyZW5zIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIHNpbmdsZSBpdGVtIGluIHBhcmVudGhlc2VzIGZvbGxvd3MgYW4gaWYsIGZvciwgb3IgIgorICAgICAgICAib3RoZXIga2V5d29yZC4iLAorICAgICksCisgICAgIkMwMzI3IjogKAorICAgICAgICAiTWl4ZWQgbGluZSBlbmRpbmdzIExGIGFuZCBDUkxGIiwKKyAgICAgICAgIm1peGVkLWxpbmUtZW5kaW5ncyIsCisgICAgICAgICJVc2VkIHdoZW4gdGhlcmUgYXJlIG1peGVkIChMRiBhbmQgQ1JMRikgbmV3bGluZSBzaWducyBpbiBhIGZpbGUuIiwKKyAgICApLAorICAgICJDMDMyOCI6ICgKKyAgICAgICAgIlVuZXhwZWN0ZWQgbGluZSBlbmRpbmcgZm9ybWF0LiBUaGVyZSBpcyAnJXMnIHdoaWxlIGl0IHNob3VsZCBiZSAnJXMnLiIsCisgICAgICAgICJ1bmV4cGVjdGVkLWxpbmUtZW5kaW5nLWZvcm1hdCIsCisgICAgICAgICJVc2VkIHdoZW4gdGhlcmUgaXMgZGlmZmVyZW50IG5ld2xpbmUgdGhhbiBleHBlY3RlZC4iLAorICAgICksCit9CisKKworZGVmIF9sYXN0X3Rva2VuX29uX2xpbmVfaXModG9rZW5zLCBsaW5lX2VuZCwgdG9rZW4pOgorICAgIHJldHVybiAoCisgICAgICAgIGxpbmVfZW5kID4gMAorICAgICAgICBhbmQgdG9rZW5zLnRva2VuKGxpbmVfZW5kIC0gMSkgPT0gdG9rZW4KKyAgICAgICAgb3IgbGluZV9lbmQgPiAxCisgICAgICAgIGFuZCB0b2tlbnMudG9rZW4obGluZV9lbmQgLSAyKSA9PSB0b2tlbgorICAgICAgICBhbmQgdG9rZW5zLnR5cGUobGluZV9lbmQgLSAxKSA9PSB0b2tlbml6ZS5DT01NRU5UCisgICAgKQorCisKKyMgVGhlIGNvbnRleHRzIGZvciBoYW5naW5nIGluZGVudHMuCisjIEEgaGFuZ2luZyBpbmRlbnRlZCBkaWN0aW9uYXJ5IHZhbHVlIGFmdGVyIDoKK0hBTkdJTkdfRElDVF9WQUxVRSA9ICJkaWN0LXZhbHVlIgorIyBIYW5naW5nIGluZGVudGF0aW9uIGluIGFuIGV4cHJlc3Npb24uCitIQU5HSU5HID0gImhhbmdpbmciCisjIEhhbmdpbmcgaW5kZW50YXRpb24gaW4gYSBibG9jayBoZWFkZXIuCitIQU5HSU5HX0JMT0NLID0gImhhbmdpbmctYmxvY2siCisjIENvbnRpbnVlZCBpbmRlbnRhdGlvbiBpbnNpZGUgYW4gZXhwcmVzc2lvbi4KK0NPTlRJTlVFRCA9ICJjb250aW51ZWQiCisjIENvbnRpbnVlZCBpbmRlbnRhdGlvbiBpbiBhIGJsb2NrIGhlYWRlci4KK0NPTlRJTlVFRF9CTE9DSyA9ICJjb250aW51ZWQtYmxvY2siCisKK1NJTkdMRV9MSU5FID0gInNpbmdsZSIKK1dJVEhfQk9EWSA9ICJtdWx0aSIKKworCitjbGFzcyBUb2tlbldyYXBwZXI6CisgICAgIiIiQSB3cmFwcGVyIGZvciByZWFkYWJsZSBhY2Nlc3MgdG8gdG9rZW4gaW5mb3JtYXRpb24uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW5zKToKKyAgICAgICAgc2VsZi5fdG9rZW5zID0gdG9rZW5zCisKKyAgICBkZWYgdG9rZW4oc2VsZiwgaWR4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rva2Vuc1tpZHhdWzFdCisKKyAgICBkZWYgdHlwZShzZWxmLCBpZHgpOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9rZW5zW2lkeF1bMF0KKworICAgIGRlZiBzdGFydF9saW5lKHNlbGYsIGlkeCk6CisgICAgICAgIHJldHVybiBzZWxmLl90b2tlbnNbaWR4XVsyXVswXQorCisgICAgZGVmIHN0YXJ0X2NvbChzZWxmLCBpZHgpOgorICAgICAgICByZXR1cm4gc2VsZi5fdG9rZW5zW2lkeF1bMl1bMV0KKworICAgIGRlZiBsaW5lKHNlbGYsIGlkeCk6CisgICAgICAgIHJldHVybiBzZWxmLl90b2tlbnNbaWR4XVs0XQorCisKK2NsYXNzIEZvcm1hdENoZWNrZXIoQmFzZVRva2VuQ2hlY2tlcik6CisgICAgIiIiY2hlY2tzIGZvciA6CisgICAgKiB1bmF1dGhvcml6ZWQgY29uc3RydWN0aW9ucworICAgICogc3RyaWN0IGluZGVudGF0aW9uCisgICAgKiBsaW5lIGxlbmd0aAorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoSVRva2VuQ2hlY2tlciwgSUFzdHJvaWRDaGVja2VyLCBJUmF3Q2hlY2tlcikKKworICAgICMgY29uZmlndXJhdGlvbiBzZWN0aW9uIG5hbWUKKyAgICBuYW1lID0gImZvcm1hdCIKKyAgICAjIG1lc3NhZ2VzCisgICAgbXNncyA9IE1TR1MKKyAgICAjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICAgICMgZm9yIGF2YWlsYWJsZSBkaWN0IGtleXMvdmFsdWVzIHNlZSB0aGUgb3B0aWsgcGFyc2VyICdhZGRfb3B0aW9uJyBtZXRob2QKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAibWF4LWxpbmUtbGVuZ3RoIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEwMCwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9uIGEgc2luZ2xlIGxpbmUuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJpZ25vcmUtbG9uZy1saW5lcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAicmVnZXhwIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8cmVnZXhwPiIsCisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiByIl5ccyooIyApPzw/aHR0cHM/Oi8vXFMrPj8kIiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgIlJlZ2V4cCBmb3IgYSBsaW5lIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBsb25nZXIgdGhhbiB0aGUgbGltaXQuIgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAic2luZ2xlLWxpbmUtaWYtc3RtdCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHlfb3Jfbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogKAorICAgICAgICAgICAgICAgICAgICAiQWxsb3cgdGhlIGJvZHkgb2YgYW4gaWYgdG8gYmUgb24gdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAibGluZSBhcyB0aGUgdGVzdCBpZiB0aGVyZSBpcyBubyBlbHNlLiIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgInNpbmdsZS1saW5lLWNsYXNzLXN0bXQiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogRmFsc2UsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5X29yX24+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgIkFsbG93IHRoZSBib2R5IG9mIGEgY2xhc3MgdG8gYmUgb24gdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAibGluZSBhcyB0aGUgZGVjbGFyYXRpb24gaWYgYm9keSBjb250YWlucyAiCisgICAgICAgICAgICAgICAgICAgICJzaW5nbGUgc3RhdGVtZW50LiIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1heC1tb2R1bGUtbGluZXMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMTAwMCwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBsaW5lcyBpbiBhIG1vZHVsZS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImluZGVudC1zdHJpbmciLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiAgICAiLAorICAgICAgICAgICAgICAgICJ0eXBlIjogIm5vbl9lbXB0eV9zdHJpbmciLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxzdHJpbmc+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJTdHJpbmcgdXNlZCBhcyBpbmRlbnRhdGlvbiB1bml0LiBUaGlzIGlzIHVzdWFsbHkgIgorICAgICAgICAgICAgICAgICciICAgICIgKDQgc3BhY2VzKSBvciAiXFx0IiAoMSB0YWIpLicsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiaW5kZW50LWFmdGVyLXBhcmVuIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTnVtYmVyIG9mIHNwYWNlcyBvZiBpbmRlbnQgcmVxdWlyZWQgaW5zaWRlIGEgaGFuZ2luZyAiCisgICAgICAgICAgICAgICAgIm9yIGNvbnRpbnVlZCBsaW5lLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiZXhwZWN0ZWQtbGluZS1lbmRpbmctZm9ybWF0IiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjaG9pY2UiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxlbXB0eSBvciBMRiBvciBDUkxGPiIsCisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIiwKKyAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IFsiIiwgIkxGIiwgIkNSTEYiXSwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGZvcm1hdCBvZiBsaW5lIGVuZGluZywgIgorICAgICAgICAgICAgICAgICAgICAiZS5nLiBlbXB0eSAoYW55IGxpbmUgZW5kaW5nKSwgTEYgb3IgQ1JMRi4iCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcj1Ob25lKToKKyAgICAgICAgQmFzZVRva2VuQ2hlY2tlci5fX2luaXRfXyhzZWxmLCBsaW50ZXIpCisgICAgICAgIHNlbGYuX2xpbmVzID0gTm9uZQorICAgICAgICBzZWxmLl92aXNpdGVkX2xpbmVzID0gTm9uZQorICAgICAgICBzZWxmLl9icmFja2V0X3N0YWNrID0gW05vbmVdCisKKyAgICBkZWYgbmV3X2xpbmUoc2VsZiwgdG9rZW5zLCBsaW5lX2VuZCwgbGluZV9zdGFydCk6CisgICAgICAgICIiImEgbmV3IGxpbmUgaGFzIGJlZW4gZW5jb3VudGVyZWQsIHByb2Nlc3MgaXQgaWYgbmVjZXNzYXJ5IiIiCisgICAgICAgIGlmIF9sYXN0X3Rva2VuX29uX2xpbmVfaXModG9rZW5zLCBsaW5lX2VuZCwgIjsiKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVubmVjZXNzYXJ5LXNlbWljb2xvbiIsIGxpbmU9dG9rZW5zLnN0YXJ0X2xpbmUobGluZV9lbmQpKQorCisgICAgICAgIGxpbmVfbnVtID0gdG9rZW5zLnN0YXJ0X2xpbmUobGluZV9zdGFydCkKKyAgICAgICAgbGluZSA9IHRva2Vucy5saW5lKGxpbmVfc3RhcnQpCisgICAgICAgIGlmIHRva2Vucy50eXBlKGxpbmVfc3RhcnQpIG5vdCBpbiBfSlVOS19UT0tFTlM6CisgICAgICAgICAgICBzZWxmLl9saW5lc1tsaW5lX251bV0gPSBsaW5lLnNwbGl0KCJcbiIpWzBdCisgICAgICAgIHNlbGYuY2hlY2tfbGluZXMobGluZSwgbGluZV9udW0pCisKKyAgICBkZWYgcHJvY2Vzc19tb2R1bGUoc2VsZiwgX21vZHVsZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfY2hlY2tfa2V5d29yZF9wYXJlbnRoZXNlcygKKyAgICAgICAgc2VsZiwgdG9rZW5zOiBMaXN0W3Rva2VuaXplLlRva2VuSW5mb10sIHN0YXJ0OiBpbnQKKyAgICApIC0+IE5vbmU6CisgICAgICAgICIiIkNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vdCB1bm5lY2Vzc2FyeSBwYXJlbnRoZXNlcyBhZnRlciBhIGtleXdvcmQuCisKKyAgICAgICAgUGFyZW5zIGFyZSB1bm5lY2Vzc2FyeSBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBiYWxhbmNlZCBvdXRlciBwYWlyIG9uIGEKKyAgICAgICAgbGluZSwgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IGEgY29sb24sIGFuZCBjb250YWlucyBubyBjb21tYXMgKGkuZS4gaXMgbm90IGEKKyAgICAgICAgdHVwbGUpLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgIHRva2VuczogbGlzdCBvZiBUb2tlbnM7IHRoZSBlbnRpcmUgbGlzdCBvZiBUb2tlbnMuCisgICAgICAgIHN0YXJ0OiBpbnQ7IHRoZSBwb3NpdGlvbiBvZiB0aGUga2V5d29yZCBpbiB0aGUgdG9rZW4gbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgICMgSWYgdGhlIG5leHQgdG9rZW4gaXMgbm90IGEgcGFyZW4sIHdlJ3JlIGZpbmUuCisgICAgICAgIGlmIHNlbGYuX2JyYWNrZXRfc3RhY2tbLTFdID09ICI6IiBhbmQgdG9rZW5zW3N0YXJ0XS5zdHJpbmcgPT0gImZvciI6CisgICAgICAgICAgICBzZWxmLl9icmFja2V0X3N0YWNrLnBvcCgpCisgICAgICAgIGlmIHRva2Vuc1tzdGFydCArIDFdLnN0cmluZyAhPSAiKCI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm91bmRfYW5kX29yID0gRmFsc2UKKyAgICAgICAgY29udGFpbnNfd2FscnVzX29wZXJhdG9yID0gRmFsc2UKKyAgICAgICAgd2FscnVzX29wZXJhdG9yX2RlcHRoID0gMAorICAgICAgICBkZXB0aCA9IDAKKyAgICAgICAga2V5d29yZF90b2tlbiA9IHN0cih0b2tlbnNbc3RhcnRdLnN0cmluZykKKyAgICAgICAgbGluZV9udW0gPSB0b2tlbnNbc3RhcnRdLnN0YXJ0WzBdCisgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0LCBsZW4odG9rZW5zKSAtIDEpOgorICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV0KKworICAgICAgICAgICAgIyBJZiB3ZSBoaXQgYSBuZXdsaW5lLCB0aGVuIGFzc3VtZSBhbnkgcGFyZW5zIHdlcmUgZm9yIGNvbnRpbnVhdGlvbi4KKyAgICAgICAgICAgIGlmIHRva2VuLnR5cGUgPT0gdG9rZW5pemUuTkw6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIFNpbmNlIHRoZSB3YWxydXMgb3BlcmF0b3IgZG9lc24ndCBleGlzdCBiZWxvdyBweXRob24zLjgsIHRoZSB0b2tlbml6ZXIKKyAgICAgICAgICAgICMgZ2VuZXJhdGVzIGluZGVwZW5kZW50IHRva2VucworICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIHRva2VuLnN0cmluZyA9PSAiOj0iICAjIDwtLSBweXRob24zLjgrIHBhdGgKKyAgICAgICAgICAgICAgICBvciB0b2tlbi5zdHJpbmcgKyB0b2tlbnNbaSArIDFdLnN0cmluZyA9PSAiOj0iCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRhaW5zX3dhbHJ1c19vcGVyYXRvciA9IFRydWUKKyAgICAgICAgICAgICAgICB3YWxydXNfb3BlcmF0b3JfZGVwdGggPSBkZXB0aAorICAgICAgICAgICAgaWYgdG9rZW4uc3RyaW5nID09ICIoIjoKKyAgICAgICAgICAgICAgICBkZXB0aCArPSAxCisgICAgICAgICAgICBlbGlmIHRva2VuLnN0cmluZyA9PSAiKSI6CisgICAgICAgICAgICAgICAgZGVwdGggLT0gMQorICAgICAgICAgICAgICAgIGlmIGRlcHRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgJyknIGNhbid0IGhhcHBlbiBhZnRlciBpZiAoZm9vKSwgc2luY2UgaXQgd291bGQgYmUgYSBzeW50YXggZXJyb3IuCisgICAgICAgICAgICAgICAgaWYgdG9rZW5zW2kgKyAxXS5zdHJpbmcgaW4gKCI6IiwgIikiLCAiXSIsICJ9IiwgImluIikgb3IgdG9rZW5zWworICAgICAgICAgICAgICAgICAgICBpICsgMQorICAgICAgICAgICAgICAgIF0udHlwZSBpbiAodG9rZW5pemUuTkVXTElORSwgdG9rZW5pemUuRU5ETUFSS0VSLCB0b2tlbml6ZS5DT01NRU5UKToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgZW1wdHkgdHVwbGUgKCkgaXMgYWx3YXlzIGFjY2VwdGVkLgorICAgICAgICAgICAgICAgICAgICBpZiBjb250YWluc193YWxydXNfb3BlcmF0b3IgYW5kIHdhbHJ1c19vcGVyYXRvcl9kZXB0aCAtIDEgPT0gZGVwdGg6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFJlc2V0IHZhcmlhYmxlIGZvciBwb3NzaWJsZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zX3dhbHJ1c19vcGVyYXRvciA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBpID09IHN0YXJ0ICsgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBpZiBrZXl3b3JkX3Rva2VuID09ICJub3QiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZvdW5kX2FuZF9vcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwZXJmbHVvdXMtcGFyZW5zIiwgbGluZT1saW5lX251bSwgYXJncz1rZXl3b3JkX3Rva2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGtleXdvcmRfdG9rZW4gaW4gKCJyZXR1cm4iLCAieWllbGQiKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cGVyZmx1b3VzLXBhcmVucyIsIGxpbmU9bGluZV9udW0sIGFyZ3M9a2V5d29yZF90b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBmb3VuZF9hbmRfb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPWxpbmVfbnVtLCBhcmdzPWtleXdvcmRfdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsaWYgZGVwdGggPT0gMToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSB0dXBsZSwgd2hpY2ggaXMgYWx3YXlzIGFjY2VwdGFibGUuCisgICAgICAgICAgICAgICAgaWYgdG9rZW5bMV0gPT0gIiwiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAjICdhbmQnIGFuZCAnb3InIGFyZSB0aGUgb25seSBib29sZWFuIG9wZXJhdG9ycyB3aXRoIGxvd2VyIHByZWNlZGVuY2UKKyAgICAgICAgICAgICAgICAjIHRoYW4gJ25vdCcsIHNvIHBhcmVucyBhcmUgb25seSByZXF1aXJlZCB3aGVuIHRoZXkgYXJlIGZvdW5kLgorICAgICAgICAgICAgICAgIGlmIHRva2VuWzFdIGluICgiYW5kIiwgIm9yIik6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2FuZF9vciA9IFRydWUKKyAgICAgICAgICAgICAgICAjIEEgeWllbGQgaW5zaWRlIGFuIGV4cHJlc3Npb24gbXVzdCBhbHdheXMgYmUgaW4gcGFyZW50aGVzZXMsCisgICAgICAgICAgICAgICAgIyBxdWl0IGVhcmx5IHdpdGhvdXQgZXJyb3IuCisgICAgICAgICAgICAgICAgZWxpZiB0b2tlblsxXSA9PSAieWllbGQiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAjIEEgZ2VuZXJhdG9yIGV4cHJlc3Npb24gYWx3YXlzIGhhcyBhICdmb3InIHRva2VuIGluIGl0LCBhbmQKKyAgICAgICAgICAgICAgICAjIHRoZSAnZm9yJyB0b2tlbiBpcyBvbmx5IGxlZ2FsIGluc2lkZSBwYXJlbnMgd2hlbiBpdCBpcyBpbiBhCisgICAgICAgICAgICAgICAgIyBnZW5lcmF0b3IgZXhwcmVzc2lvbi4gIFRoZSBwYXJlbnMgYXJlIG5lY2Vzc2FyeSBoZXJlLCBzbyBiYWlsCisgICAgICAgICAgICAgICAgIyB3aXRob3V0IGFuIGVycm9yLgorICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bMV0gPT0gImZvciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIF9wcmVwYXJlX3Rva2VuX2Rpc3BhdGNoZXIoc2VsZik6CisgICAgICAgIGRpc3BhdGNoID0ge30KKyAgICAgICAgZm9yIHRva2VucywgaGFuZGxlciBpbiAoKF9LRVlXT1JEX1RPS0VOUywgc2VsZi5fY2hlY2tfa2V5d29yZF9wYXJlbnRoZXNlcyksKToKKyAgICAgICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CisgICAgICAgICAgICAgICAgZGlzcGF0Y2hbdG9rZW5dID0gaGFuZGxlcgorICAgICAgICByZXR1cm4gZGlzcGF0Y2gKKworICAgIGRlZiBwcm9jZXNzX3Rva2VucyhzZWxmLCB0b2tlbnMpOgorICAgICAgICAiIiJwcm9jZXNzIHRva2VucyBhbmQgc2VhcmNoIGZvciA6CisKKyAgICAgICAgXyB0b28gbG9uZyBsaW5lcyAoaS5lLiBsb25nZXIgdGhhbiA8bWF4X2NoYXJzPikKKyAgICAgICAgXyBvcHRpb25hbGx5IGJhZCBjb25zdHJ1Y3QgKGlmIGdpdmVuLCBiYWRfY29uc3RydWN0IG11c3QgYmUgYSBjb21waWxlZAorICAgICAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbikuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9icmFja2V0X3N0YWNrID0gW05vbmVdCisgICAgICAgIGluZGVudHMgPSBbMF0KKyAgICAgICAgY2hlY2tfZXF1YWwgPSBGYWxzZQorICAgICAgICBsaW5lX251bSA9IDAKKyAgICAgICAgc2VsZi5fbGluZXMgPSB7fQorICAgICAgICBzZWxmLl92aXNpdGVkX2xpbmVzID0ge30KKyAgICAgICAgdG9rZW5faGFuZGxlcnMgPSBzZWxmLl9wcmVwYXJlX3Rva2VuX2Rpc3BhdGNoZXIoKQorICAgICAgICBzZWxmLl9sYXN0X2xpbmVfZW5kaW5nID0gTm9uZQorICAgICAgICBsYXN0X2JsYW5rX2xpbmVfbnVtID0gMAorICAgICAgICBmb3IgaWR4LCAodG9rX3R5cGUsIHRva2VuLCBzdGFydCwgXywgbGluZSkgaW4gZW51bWVyYXRlKHRva2Vucyk6CisgICAgICAgICAgICBpZiBzdGFydFswXSAhPSBsaW5lX251bToKKyAgICAgICAgICAgICAgICBsaW5lX251bSA9IHN0YXJ0WzBdCisgICAgICAgICAgICAgICAgIyBBIHRva2VuaXplciBvZGRpdHk6IGlmIGFuIGluZGVudGVkIGxpbmUgY29udGFpbnMgYSBtdWx0aS1saW5lCisgICAgICAgICAgICAgICAgIyBkb2NzdHJpbmcsIHRoZSBsaW5lIG1lbWJlciBvZiB0aGUgSU5ERU5UIHRva2VuIGRvZXMgbm90IGNvbnRhaW4KKyAgICAgICAgICAgICAgICAjIHRoZSBmdWxsIGxpbmU7IHRoZXJlZm9yZSB3ZSBjaGVjayB0aGUgbmV4dCB0b2tlbiBvbiB0aGUgbGluZS4KKyAgICAgICAgICAgICAgICBpZiB0b2tfdHlwZSA9PSB0b2tlbml6ZS5JTkRFTlQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubmV3X2xpbmUoVG9rZW5XcmFwcGVyKHRva2VucyksIGlkeCAtIDEsIGlkeCArIDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdfbGluZShUb2tlbldyYXBwZXIodG9rZW5zKSwgaWR4IC0gMSwgaWR4KQorCisgICAgICAgICAgICBpZiB0b2tfdHlwZSA9PSB0b2tlbml6ZS5ORVdMSU5FOgorICAgICAgICAgICAgICAgICMgYSBwcm9ncmFtIHN0YXRlbWVudCwgb3IgRU5ETUFSS0VSLCB3aWxsIGV2ZW50dWFsbHkgZm9sbG93LAorICAgICAgICAgICAgICAgICMgYWZ0ZXIgc29tZSAocG9zc2libHkgZW1wdHkpIHJ1biBvZiB0b2tlbnMgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAjICAgICAoTkwgfCBDT01NRU5UKSogKElOREVOVCB8IERFREVOVCspPworICAgICAgICAgICAgICAgICMgSWYgYW4gSU5ERU5UIGFwcGVhcnMsIHNldHRpbmcgY2hlY2tfZXF1YWwgaXMgd3JvbmcsIGFuZCB3aWxsCisgICAgICAgICAgICAgICAgIyBiZSB1bmRvbmUgd2hlbiB3ZSBzZWUgdGhlIElOREVOVC4KKyAgICAgICAgICAgICAgICBjaGVja19lcXVhbCA9IFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19saW5lX2VuZGluZyh0b2tlbiwgbGluZV9udW0pCisgICAgICAgICAgICBlbGlmIHRva190eXBlID09IHRva2VuaXplLklOREVOVDoKKyAgICAgICAgICAgICAgICBjaGVja19lcXVhbCA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19pbmRlbnRfbGV2ZWwodG9rZW4sIGluZGVudHNbLTFdICsgMSwgbGluZV9udW0pCisgICAgICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQoaW5kZW50c1stMV0gKyAxKQorICAgICAgICAgICAgZWxpZiB0b2tfdHlwZSA9PSB0b2tlbml6ZS5ERURFTlQ6CisgICAgICAgICAgICAgICAgIyB0aGVyZSdzIG5vdGhpbmcgd2UgbmVlZCB0byBjaGVjayBoZXJlISAgd2hhdCdzIGltcG9ydGFudCBpcworICAgICAgICAgICAgICAgICMgdGhhdCB3aGVuIHRoZSBydW4gb2YgREVERU5UcyBlbmRzLCB0aGUgaW5kZW50YXRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgIyBwcm9ncmFtIHN0YXRlbWVudCAob3IgRU5ETUFSS0VSKSB0aGF0IHRyaWdnZXJlZCB0aGUgcnVuIGlzCisgICAgICAgICAgICAgICAgIyBlcXVhbCB0byB3aGF0J3MgbGVmdCBhdCB0aGUgdG9wIG9mIHRoZSBpbmRlbnRzIHN0YWNrCisgICAgICAgICAgICAgICAgY2hlY2tfZXF1YWwgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbGVuKGluZGVudHMpID4gMToKKyAgICAgICAgICAgICAgICAgICAgZGVsIGluZGVudHNbLTFdCisgICAgICAgICAgICBlbGlmIHRva190eXBlID09IHRva2VuaXplLk5MOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0cmlwKCJcclxuIik6CisgICAgICAgICAgICAgICAgICAgIGxhc3RfYmxhbmtfbGluZV9udW0gPSBsaW5lX251bQorICAgICAgICAgICAgZWxpZiB0b2tfdHlwZSBub3QgaW4gKHRva2VuaXplLkNPTU1FTlQsIHRva2VuaXplLkVOQ09ESU5HKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGZpcnN0IGNvbmNyZXRlIHRva2VuIGZvbGxvd2luZyBhIE5FV0xJTkUsIHNvIGl0CisgICAgICAgICAgICAgICAgIyBtdXN0IGJlIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgbmV4dCBwcm9ncmFtIHN0YXRlbWVudCwgb3IgYW4KKyAgICAgICAgICAgICAgICAjIEVORE1BUktFUjsgdGhlICJsaW5lIiBhcmd1bWVudCBleHBvc2VzIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICAjIGZvciB0aGlzIHN0YXRlbWVudDsgaW4gdGhlIGNhc2Ugb2YgRU5ETUFSS0VSLCBsaW5lIGlzIGFuIGVtcHR5CisgICAgICAgICAgICAgICAgIyBzdHJpbmcsIHNvIHdpbGwgcHJvcGVybHkgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZyB3aXRoIHdoaWNoIHRoZQorICAgICAgICAgICAgICAgICMgImluZGVudHMiIHN0YWNrIHdhcyBzZWVkZWQKKyAgICAgICAgICAgICAgICBpZiBjaGVja19lcXVhbDoKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfZXF1YWwgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2luZGVudF9sZXZlbChsaW5lLCBpbmRlbnRzWy0xXSwgbGluZV9udW0pCisKKyAgICAgICAgICAgIGlmIHRva190eXBlID09IHRva2VuaXplLk5VTUJFUiBhbmQgdG9rZW4uZW5kc3dpdGgoImwiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJsb3dlcmNhc2UtbC1zdWZmaXgiLCBsaW5lPWxpbmVfbnVtKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IHRva2VuX2hhbmRsZXJzW3Rva2VuXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGFuZGxlcih0b2tlbnMsIGlkeCkKKworICAgICAgICBsaW5lX251bSAtPSAxICAjIHRvIGJlIG9rIHdpdGggIndjIC1sIgorICAgICAgICBpZiBsaW5lX251bSA+IHNlbGYuY29uZmlnLm1heF9tb2R1bGVfbGluZXM6CisgICAgICAgICAgICAjIEdldCB0aGUgbGluZSB3aGVyZSB0aGUgdG9vLW1hbnktbGluZXMgKG9yIGl0cyBtZXNzYWdlIGlkKQorICAgICAgICAgICAgIyB3YXMgZGlzYWJsZWQgb3IgZGVmYXVsdCB0byAxLgorICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uID0gc2VsZi5saW50ZXIubXNnc19zdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucygKKyAgICAgICAgICAgICAgICAidG9vLW1hbnktbGluZXMiCisgICAgICAgICAgICApWzBdCisgICAgICAgICAgICBuYW1lcyA9IChtZXNzYWdlX2RlZmluaXRpb24ubXNnaWQsICJ0b28tbWFueS1saW5lcyIpCisgICAgICAgICAgICBsaW5lID0gbmV4dCgKKyAgICAgICAgICAgICAgICBmaWx0ZXIoTm9uZSwgKHNlbGYubGludGVyLl9wcmFnbWFfbGluZW5vLmdldChuYW1lKSBmb3IgbmFtZSBpbiBuYW1lcykpLAorICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ0b28tbWFueS1saW5lcyIsCisgICAgICAgICAgICAgICAgYXJncz0obGluZV9udW0sIHNlbGYuY29uZmlnLm1heF9tb2R1bGVfbGluZXMpLAorICAgICAgICAgICAgICAgIGxpbmU9bGluZSwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIFNlZSBpZiB0aGVyZSBhcmUgYW55IHRyYWlsaW5nIGxpbmVzLiAgRG8gbm90IGNvbXBsYWluIGFib3V0IGVtcHR5CisgICAgICAgICMgZmlsZXMgbGlrZSBfX2luaXRfXy5weSBtYXJrZXJzLgorICAgICAgICBpZiBsaW5lX251bSA9PSBsYXN0X2JsYW5rX2xpbmVfbnVtIGFuZCBsaW5lX251bSA+IDA6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ0cmFpbGluZy1uZXdsaW5lcyIsIGxpbmU9bGluZV9udW0pCisKKyAgICBkZWYgX2NoZWNrX2xpbmVfZW5kaW5nKHNlbGYsIGxpbmVfZW5kaW5nLCBsaW5lX251bSk6CisgICAgICAgICMgY2hlY2sgaWYgbGluZSBlbmRpbmdzIGFyZSBtaXhlZAorICAgICAgICBpZiBzZWxmLl9sYXN0X2xpbmVfZW5kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBsaW5lX2VuZGluZyA9PSAiIiBpbmRpY2F0ZXMgYSBzeW50aGV0aWMgbmV3bGluZSBhZGRlZCBhdAorICAgICAgICAgICAgIyB0aGUgZW5kIG9mIGEgZmlsZSB0aGF0IGRvZXMgbm90LCBpbiBmYWN0LCBlbmQgd2l0aCBhCisgICAgICAgICAgICAjIG5ld2xpbmUuCisgICAgICAgICAgICBpZiBsaW5lX2VuZGluZyBhbmQgbGluZV9lbmRpbmcgIT0gc2VsZi5fbGFzdF9saW5lX2VuZGluZzoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtaXhlZC1saW5lLWVuZGluZ3MiLCBsaW5lPWxpbmVfbnVtKQorCisgICAgICAgIHNlbGYuX2xhc3RfbGluZV9lbmRpbmcgPSBsaW5lX2VuZGluZworCisgICAgICAgICMgY2hlY2sgaWYgbGluZSBlbmRpbmcgaXMgYXMgZXhwZWN0ZWQKKyAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLmNvbmZpZy5leHBlY3RlZF9saW5lX2VuZGluZ19mb3JtYXQKKyAgICAgICAgaWYgZXhwZWN0ZWQ6CisgICAgICAgICAgICAjIHJlZHVjZSBtdWx0aXBsZSBcblxuXG5cbiB0byBvbmUgXG4KKyAgICAgICAgICAgIGxpbmVfZW5kaW5nID0gcmVkdWNlKGxhbWJkYSB4LCB5OiB4ICsgeSBpZiB4ICE9IHkgZWxzZSB4LCBsaW5lX2VuZGluZywgIiIpCisgICAgICAgICAgICBsaW5lX2VuZGluZyA9ICJMRiIgaWYgbGluZV9lbmRpbmcgPT0gIlxuIiBlbHNlICJDUkxGIgorICAgICAgICAgICAgaWYgbGluZV9lbmRpbmcgIT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtbGluZS1lbmRpbmctZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgYXJncz0obGluZV9lbmRpbmcsIGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgbGluZT1saW5lX251bSwKKyAgICAgICAgICAgICAgICApCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoIm11bHRpcGxlLXN0YXRlbWVudHMiKQorICAgIGRlZiB2aXNpdF9kZWZhdWx0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayB0aGUgbm9kZSBsaW5lIG51bWJlciBhbmQgY2hlY2sgaXQgaWYgbm90IHlldCBkb25lIiIiCisgICAgICAgIGlmIG5vdCBub2RlLmlzX3N0YXRlbWVudDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgbm9kZS5yb290KCkucHVyZV9weXRob246CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcHJldl9zaWJsID0gbm9kZS5wcmV2aW91c19zaWJsaW5nKCkKKyAgICAgICAgaWYgcHJldl9zaWJsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJldl9saW5lID0gcHJldl9zaWJsLmZyb21saW5lbm8KKyAgICAgICAgIyBUaGUgbGluZSBvbiB3aGljaCBhIGZpbmFsbHk6IG9jY3VycyBpbiBhIHRyeS9maW5hbGx5CisgICAgICAgICMgaXMgbm90IGRpcmVjdGx5IHJlcHJlc2VudGVkIGluIHRoZSBBU1QuIFdlIGluZmVyIGl0CisgICAgICAgICMgYnkgdGFraW5nIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGJvZHkgYW5kIGFkZGluZyAxLCB3aGljaAorICAgICAgICAjIHNob3VsZCBiZSB0aGUgbGluZSBvZiBmaW5hbGx5OgorICAgICAgICBlbGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIG5vZGVzLlRyeUZpbmFsbHkpIGFuZCBub2RlIGluIG5vZGUucGFyZW50LmZpbmFsYm9keQorICAgICAgICApOgorICAgICAgICAgICAgcHJldl9saW5lID0gbm9kZS5wYXJlbnQuYm9keVswXS50b2xpbmVubyArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByZXZfbGluZSA9IG5vZGUucGFyZW50LnN0YXRlbWVudCgpLmZyb21saW5lbm8KKyAgICAgICAgbGluZSA9IG5vZGUuZnJvbWxpbmVubworICAgICAgICBhc3NlcnQgbGluZSwgbm9kZQorICAgICAgICBpZiBwcmV2X2xpbmUgPT0gbGluZSBhbmQgc2VsZi5fdmlzaXRlZF9saW5lcy5nZXQobGluZSkgIT0gMjoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX211bHRpX3N0YXRlbWVudF9saW5lKG5vZGUsIGxpbmUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbGluZSBpbiBzZWxmLl92aXNpdGVkX2xpbmVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRvbGluZW5vID0gbm9kZS5ibG9ja3N0YXJ0X3RvbGluZW5vCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHRvbGluZW5vID0gbm9kZS50b2xpbmVubworICAgICAgICBhc3NlcnQgdG9saW5lbm8sIG5vZGUKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiByYW5nZShsaW5lLCB0b2xpbmVubyArIDEpOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRlZF9saW5lc1tsaW5lXSA9IDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc2VsZi5fbGluZXNbbGluZV0ucnN0cmlwKCkpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIiKQorCisgICAgZGVmIF9jaGVja19tdWx0aV9zdGF0ZW1lbnRfbGluZShzZWxmLCBub2RlLCBsaW5lKToKKyAgICAgICAgIiIiQ2hlY2sgZm9yIGxpbmVzIGNvbnRhaW5pbmcgbXVsdGlwbGUgc3RhdGVtZW50cy4iIiIKKyAgICAgICAgIyBEbyBub3Qgd2FybiBhYm91dCBtdWx0aXBsZSBuZXN0ZWQgY29udGV4dCBtYW5hZ2VycworICAgICAgICAjIGluIHdpdGggc3RhdGVtZW50cy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBub2Rlcy5XaXRoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIEZvciB0cnkuLi4gZXhjZXB0Li4uIGZpbmFsbHkuLi4sIHRoZSB0d28gbm9kZXMKKyAgICAgICAgIyBhcHBlYXIgdG8gYmUgb24gdGhlIHNhbWUgbGluZSBkdWUgdG8gaG93IHRoZSBBU1QgaXMgYnVpbHQuCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgbm9kZXMuVHJ5RXhjZXB0KSBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUucGFyZW50LCBub2Rlcy5UcnlGaW5hbGx5CisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgbm9kZXMuSWYpCisgICAgICAgICAgICBhbmQgbm90IG5vZGUucGFyZW50Lm9yZWxzZQorICAgICAgICAgICAgYW5kIHNlbGYuY29uZmlnLnNpbmdsZV9saW5lX2lmX3N0bXQKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBub2Rlcy5DbGFzc0RlZikKKyAgICAgICAgICAgIGFuZCBsZW4obm9kZS5wYXJlbnQuYm9keSkgPT0gMQorICAgICAgICAgICAgYW5kIHNlbGYuY29uZmlnLnNpbmdsZV9saW5lX2NsYXNzX3N0bXQKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRnVuY3Rpb24gb3ZlcmxvYWRzIHRoYXQgdXNlIGBgRWxsaXBzaXNgYCBhcmUgZXhlbXB0ZWQuCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZSwgbm9kZXMuRXhwcikKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIG5vZGVzLkNvbnN0KQorICAgICAgICAgICAgYW5kIG5vZGUudmFsdWUudmFsdWUgaXMgRWxsaXBzaXMKKyAgICAgICAgKToKKyAgICAgICAgICAgIGZyYW1lID0gbm9kZS5mcmFtZSgpCisgICAgICAgICAgICBpZiBpc19vdmVybG9hZF9zdHViKGZyYW1lKSBvciBpc19wcm90b2NvbF9jbGFzcyhub2RlX2ZyYW1lX2NsYXNzKGZyYW1lKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibXVsdGlwbGUtc3RhdGVtZW50cyIsIG5vZGU9bm9kZSkKKyAgICAgICAgc2VsZi5fdmlzaXRlZF9saW5lc1tsaW5lXSA9IDIKKworICAgIGRlZiBjaGVja19saW5lX2VuZGluZyhzZWxmLCBsaW5lOiBzdHIsIGk6IGludCkgLT4gTm9uZToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRoYXQgdGhlIGZpbmFsIG5ld2xpbmUgaXMgbm90IG1pc3NpbmcgYW5kIHRoYXQgdGhlcmUgaXMgbm8gdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBsaW5lLmVuZHN3aXRoKCJcbiIpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibWlzc2luZy1maW5hbC1uZXdsaW5lIiwgbGluZT1pKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgZXhjbHVkZSBcZiAoZm9ybWZlZWQpIGZyb20gdGhlIHJzdHJpcAorICAgICAgICBzdHJpcHBlZF9saW5lID0gbGluZS5yc3RyaXAoIlx0XG5cclx2ICIpCisgICAgICAgIGlmIGxpbmVbbGVuKHN0cmlwcGVkX2xpbmUpIDpdIG5vdCBpbiAoIlxuIiwgIlxyXG4iKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInRyYWlsaW5nLXdoaXRlc3BhY2UiLCBsaW5lPWksIGNvbF9vZmZzZXQ9bGVuKHN0cmlwcGVkX2xpbmUpCisgICAgICAgICAgICApCisKKyAgICBkZWYgY2hlY2tfbGluZV9sZW5ndGgoc2VsZiwgbGluZTogc3RyLCBpOiBpbnQpIC0+IE5vbmU6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0aGF0IHRoZSBsaW5lIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIGF1dGhvcml6ZWQgdmFsdWUKKyAgICAgICAgIiIiCisgICAgICAgIG1heF9jaGFycyA9IHNlbGYuY29uZmlnLm1heF9saW5lX2xlbmd0aAorICAgICAgICBpZ25vcmVfbG9uZ19saW5lID0gc2VsZi5jb25maWcuaWdub3JlX2xvbmdfbGluZXMKKyAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgaWYgbGVuKGxpbmUpID4gbWF4X2NoYXJzIGFuZCBub3QgaWdub3JlX2xvbmdfbGluZS5zZWFyY2gobGluZSk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJsaW5lLXRvby1sb25nIiwgbGluZT1pLCBhcmdzPShsZW4obGluZSksIG1heF9jaGFycykpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHJlbW92ZV9weWxpbnRfb3B0aW9uX2Zyb21fbGluZXMob3B0aW9uc19wYXR0ZXJuX29iaikgLT4gc3RyOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlIHRoZSBgIyBweWxpbnQgLi4uYCBwYXR0ZXJuIGZyb20gbGluZXMKKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVzID0gb3B0aW9uc19wYXR0ZXJuX29iai5zdHJpbmcKKyAgICAgICAgcHVyZ2VkX2xpbmVzID0gKAorICAgICAgICAgICAgbGluZXNbOiBvcHRpb25zX3BhdHRlcm5fb2JqLnN0YXJ0KDEpXS5yc3RyaXAoKQorICAgICAgICAgICAgKyBsaW5lc1tvcHRpb25zX3BhdHRlcm5fb2JqLmVuZCgxKSA6XQorICAgICAgICApCisgICAgICAgIHJldHVybiBwdXJnZWRfbGluZXMKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgaXNfbGluZV9sZW5ndGhfY2hlY2tfYWN0aXZhdGVkKHB5bGludF9wYXR0ZXJuX21hdGNoX29iamVjdCkgLT4gYm9vbDoKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lIGxlbmd0aCBjaGVjayBpcyBhY3RpdmF0ZWQKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBwcmFnbWEgaW4gcGFyc2VfcHJhZ21hKHB5bGludF9wYXR0ZXJuX21hdGNoX29iamVjdC5ncm91cCgyKSk6CisgICAgICAgICAgICAgICAgaWYgcHJhZ21hLmFjdGlvbiA9PSAiZGlzYWJsZSIgYW5kICJsaW5lLXRvby1sb25nIiBpbiBwcmFnbWEubWVzc2FnZXM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgUHJhZ21hUGFyc2VyRXJyb3I6CisgICAgICAgICAgICAjIFByaW50aW5nIHVzZWZ1bCBpbmZvcm1hdGlvbiBkZWFsaW5nIHdpdGggdGhpcyBlcnJvciBpcyBkb25lIGluIHRoZSBsaW50IHBhY2thZ2UKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc3BlY2lmaWNfc3BsaXRsaW5lcyhsaW5lczogc3RyKSAtPiBMaXN0W3N0cl06CisgICAgICAgICIiIgorICAgICAgICBTcGxpdCBsaW5lcyBhY2NvcmRpbmcgdG8gdW5pdmVyc2FsIG5ld2xpbmVzIGV4Y2VwdCB0aG9zZSBpbiBhIHNwZWNpZmljIHNldHMKKyAgICAgICAgIiIiCisgICAgICAgIHVuc3BsaXRfZW5kcyA9IHsKKyAgICAgICAgICAgICJcdiIsCisgICAgICAgICAgICAiXHgwYiIsCisgICAgICAgICAgICAiXGYiLAorICAgICAgICAgICAgIlx4MGMiLAorICAgICAgICAgICAgIlx4MWMiLAorICAgICAgICAgICAgIlx4MWQiLAorICAgICAgICAgICAgIlx4MWUiLAorICAgICAgICAgICAgIlx4ODUiLAorICAgICAgICAgICAgIlx1MjAyOCIsCisgICAgICAgICAgICAiXHUyMDI5IiwKKyAgICAgICAgfQorICAgICAgICByZXMgPSBbXQorICAgICAgICBidWZmZXIgPSAiIgorICAgICAgICBmb3IgYXRvbWljX2xpbmUgaW4gbGluZXMuc3BsaXRsaW5lcyhUcnVlKToKKyAgICAgICAgICAgIGlmIGF0b21pY19saW5lWy0xXSBub3QgaW4gdW5zcGxpdF9lbmRzOgorICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoYnVmZmVyICsgYXRvbWljX2xpbmUpCisgICAgICAgICAgICAgICAgYnVmZmVyID0gIiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnVmZmVyICs9IGF0b21pY19saW5lCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiBjaGVja19saW5lcyhzZWxmLCBsaW5lczogc3RyLCBsaW5lbm86IGludCkgLT4gTm9uZToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIGxpbmVzIGhhdmUgOgorICAgICAgICAgICAgLSBhIGZpbmFsIG5ld2xpbmUKKyAgICAgICAgICAgIC0gbm8gdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAgICAgICAgLSBsZXNzIHRoYW4gYSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICAgICIiIgorICAgICAgICAjIHdlJ3JlIGZpcnN0IGdvaW5nIHRvIGRvIGEgcm91Z2ggY2hlY2sgd2hldGhlciBhbnkgbGluZXMgaW4gdGhpcyBzZXQKKyAgICAgICAgIyBnbyBvdmVyIHRoZSBsaW5lIGxpbWl0LiBJZiBub25lIG9mIHRoZW0gZG8sIHRoZW4gd2UgZG9uJ3QgbmVlZCB0bworICAgICAgICAjIHBhcnNlIG91dCB0aGUgcHlsaW50IG9wdGlvbnMgbGF0ZXIgb24gYW5kIGNhbiBqdXN0IGFzc3VtZSB0aGF0IHRoZXNlCisgICAgICAgICMgbGluZXMgYXJlIGNsZWFuCisKKyAgICAgICAgIyB3ZSdsbCBhbHNvIGhhbmRsZSB0aGUgbGluZSBlbmRpbmcgY2hlY2sgaGVyZSB0byBhdm9pZCBkb3VibGUtaXRlcmF0aW9uCisgICAgICAgICMgdW5sZXNzIHRoZSBsaW5lIGxlbmd0aHMgYXJlIHN1c3BlY3QKKworICAgICAgICBtYXhfY2hhcnMgPSBzZWxmLmNvbmZpZy5tYXhfbGluZV9sZW5ndGgKKworICAgICAgICBzcGxpdF9saW5lcyA9IHNlbGYuc3BlY2lmaWNfc3BsaXRsaW5lcyhsaW5lcykKKworICAgICAgICBmb3Igb2Zmc2V0LCBsaW5lIGluIGVudW1lcmF0ZShzcGxpdF9saW5lcyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmVfZW5kaW5nKGxpbmUsIGxpbmVubyArIG9mZnNldCkKKworICAgICAgICAjIGhvbGQgb250byB0aGUgaW5pdGlhbCBsaW5lbm8gZm9yIGxhdGVyCisgICAgICAgIHBvdGVudGlhbF9saW5lX2xlbmd0aF93YXJuaW5nID0gRmFsc2UKKyAgICAgICAgZm9yIG9mZnNldCwgbGluZSBpbiBlbnVtZXJhdGUoc3BsaXRfbGluZXMpOgorICAgICAgICAgICAgIyB0aGlzIGNoZWNrIGlzIHB1cnBvc2VmdWxseSBzaW1wbGUgYW5kIGRvZXNuJ3QgcnN0cmlwCisgICAgICAgICAgICAjIHNpbmNlIHRoaXMgaXMgcnVubmluZyBvbiBldmVyeSBsaW5lIHlvdSdyZSBjaGVja2luZyBpdCdzCisgICAgICAgICAgICAjIGFkdmFudGFnZW91cyB0byBhdm9pZCBkb2luZyBhIGxvdCBvZiB3b3JrCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBtYXhfY2hhcnM6CisgICAgICAgICAgICAgICAgcG90ZW50aWFsX2xpbmVfbGVuZ3RoX3dhcm5pbmcgPSBUcnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIGlmIHRoZXJlIHdlcmUgbm8gbGluZXMgcGFzc2luZyB0aGUgbWF4X2NoYXJzIGNvbmZpZywgd2UgZG9uJ3QgYm90aGVyCisgICAgICAgICMgcnVubmluZyB0aGUgZnVsbCBsaW5lIGNoZWNrIChhcyB3ZSd2ZSBtZXQgYW4gZXZlbiBtb3JlIHN0cmljdCBjb25kaXRpb24pCisgICAgICAgIGlmIG5vdCBwb3RlbnRpYWxfbGluZV9sZW5ndGhfd2FybmluZzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgTGluZSBsZW5ndGggY2hlY2sgbWF5IGJlIGRlYWN0aXZhdGVkIHRocm91Z2ggYHB5bGludDogZGlzYWJsZWAgY29tbWVudAorICAgICAgICBtb2JqID0gT1BUSU9OX1BPLnNlYXJjaChsaW5lcykKKyAgICAgICAgaWYgbW9iajoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2xpbmVfbGVuZ3RoX2NoZWNrX2FjdGl2YXRlZChtb2JqKToKKyAgICAgICAgICAgICAgICAjIHRoZSBsaW5lIGxlbmd0aCBjaGVjayBpcyBkZWFjdGl2YXRlZCwgd2UgY2FuIHN0b3AgaGVyZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBUaGUgJ3B5bGludDogZGlzYWJsZSB3aGF0ZXZlcicgc2hvdWxkIG5vdCBiZSB0YWtlbiBpbnRvIGFjY291bnQgZm9yIGxpbmUgbGVuZ3RoIGNvdW50CisgICAgICAgICAgICBsaW5lcyA9IHNlbGYucmVtb3ZlX3B5bGludF9vcHRpb25fZnJvbV9saW5lcyhtb2JqKQorCisgICAgICAgICMgaGVyZSB3ZSByZS1ydW4gc3BlY2lmaWNfc3BsaXRsaW5lcyBzaW5jZSB3ZSBoYXZlIGZpbHRlcmVkIG91dCBweWxpbnQgb3B0aW9ucyBhYm92ZQorICAgICAgICBmb3Igb2Zmc2V0LCBsaW5lIGluIGVudW1lcmF0ZShzZWxmLnNwZWNpZmljX3NwbGl0bGluZXMobGluZXMpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGluZV9sZW5ndGgobGluZSwgbGluZW5vICsgb2Zmc2V0KQorCisgICAgZGVmIGNoZWNrX2luZGVudF9sZXZlbChzZWxmLCBzdHJpbmcsIGV4cGVjdGVkLCBsaW5lX251bSk6CisgICAgICAgICIiInJldHVybiB0aGUgaW5kZW50IGxldmVsIG9mIHRoZSBzdHJpbmciIiIKKyAgICAgICAgaW5kZW50ID0gc2VsZi5jb25maWcuaW5kZW50X3N0cmluZworICAgICAgICBpZiBpbmRlbnQgPT0gIlxcdCI6ICAjIFx0IGlzIG5vdCBpbnRlcnByZXRlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgICAgICBpbmRlbnQgPSAiXHQiCisgICAgICAgIGxldmVsID0gMAorICAgICAgICB1bml0X3NpemUgPSBsZW4oaW5kZW50KQorICAgICAgICB3aGlsZSBzdHJpbmdbOnVuaXRfc2l6ZV0gPT0gaW5kZW50OgorICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nW3VuaXRfc2l6ZTpdCisgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgICAgIHN1cHBsID0gIiIKKyAgICAgICAgd2hpbGUgc3RyaW5nIGFuZCBzdHJpbmdbMF0gaW4gIiBcdCI6CisgICAgICAgICAgICBzdXBwbCArPSBzdHJpbmdbMF0KKyAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZ1sxOl0KKyAgICAgICAgaWYgbGV2ZWwgIT0gZXhwZWN0ZWQgb3Igc3VwcGw6CisgICAgICAgICAgICBpX3R5cGUgPSAic3BhY2VzIgorICAgICAgICAgICAgaWYgaW5kZW50WzBdID09ICJcdCI6CisgICAgICAgICAgICAgICAgaV90eXBlID0gInRhYnMiCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJiYWQtaW5kZW50YXRpb24iLAorICAgICAgICAgICAgICAgIGxpbmU9bGluZV9udW0sCisgICAgICAgICAgICAgICAgYXJncz0obGV2ZWwgKiB1bml0X3NpemUgKyBsZW4oc3VwcGwpLCBpX3R5cGUsIGV4cGVjdGVkICogdW5pdF9zaXplKSwKKyAgICAgICAgICAgICkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihGb3JtYXRDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvaW1wb3J0cy5weSBiL3B5bGludC9jaGVja2Vycy9pbXBvcnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYWRhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvaW1wb3J0cy5weQpAQCAtMCwwICsxLDEwMTcgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDEzIGJ1Y2tAeWVscC5jb20gPGJ1Y2tAeWVscC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IE1vaXNlcyBMb3BleiA8bW95bG9wMjYwQHZhdXhvby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBEbWl0cnkgUHJpYnlzaCA8ZG1hbmRAeWFuZGV4LnJ1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQ2V6YXIgPGNlbG5hemxpQGJpdGRlZmVuZGVyLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IEZsb3JpYW4gQnJ1aGluIDxtZUB0aGUtY29tcGlsZXIub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgTm9hbSBZb3Jhdi1SYXBoYWVsIDxub2FtcmFwaEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBKYW1lcyBNb3JnZW5zZW4gPGphbWVzLm1vcmdlbnNlbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEphcmVkIEdhcnN0IDxjdWx0b2ZqYXJlZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBNYWlrIFLDtmRlciA8bWFpa3JvZWRlckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBHbGVubiBNYXR0aGV3cyA8Z2xlbm5AZS1kYWQubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IE1pY2hrYSBQb3BvZmYgPG1pY2hrYXBvcG9mZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBFcmlrIFdyaWdodCA8ZXJpay53cmlnaHRAc2hvcGlmeS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBMdWNhcyBDaW1vbiA8bHVjYXMuY2ltb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggSG9ybndpdHNlciA8Z2l0aHViQGhvcm53aXRzZXIubm8+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBOYXRhbGllIFNlcmVicnlha292YSA8bmF0YWxpZS5zZXJlYnJ5YWtvdmFATmF0YWxpZXMtTWFjQm9vay1Qcm8ubG9jYWw+CisjIENvcHlyaWdodCAoYykgMjAxOCBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTWFyaWFubmEgUG9sYXRvZ2xvdSA8bXBvbGF0b2dsb3VAYmxvb21iZXJnLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBOaWNrIERyb3pkIDxuaWNob2xhc2Ryb3pkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgTmljayBTbWl0aCA8Y2xpY2t0aGlzbmlja0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBQYXVsIFJlbnZvaXPDqSA8cmVudm9pc2VwYXVsQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFBldGVyIEtvbGJ1cyA8cGV0ZXIua29sYnVzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgeXVzaGFvMiA8MzY4NDg0NzIreXVzaGFvMkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXR1cyBWYWxvIDxtYXR1c3ZhbG9AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgQW5kcmV3IEhvd2UgPGhvd2VhakB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiaW1wb3J0cyBjaGVja2VycyBmb3IgUHl0aG9uIGNvZGUiIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29weQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgVW5pb24KKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyLCBEZXByZWNhdGVkTWl4aW4KK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCAoCisgICAgY2hlY2tfbWVzc2FnZXMsCisgICAgaXNfZnJvbV9mYWxsYmFja19ibG9jaywKKyAgICBub2RlX2lnbm9yZXNfZXhjZXB0aW9uLAorKQorZnJvbSBweWxpbnQuZXhjZXB0aW9ucyBpbXBvcnQgRW1wdHlSZXBvcnRFcnJvcgorZnJvbSBweWxpbnQuZ3JhcGggaW1wb3J0IERvdEJhY2tlbmQsIGdldF9jeWNsZXMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElBc3Ryb2lkQ2hlY2tlcgorZnJvbSBweWxpbnQucmVwb3J0ZXJzLnVyZXBvcnRzLm5vZGVzIGltcG9ydCBQYXJhZ3JhcGgsIFZlcmJhdGltVGV4dCwgVk5vZGUKK2Zyb20gcHlsaW50LnV0aWxzIGltcG9ydCBJc29ydERyaXZlciwgZ2V0X2dsb2JhbF9vcHRpb24KKworCitkZWYgX3F1YWxpZmllZF9uYW1lcyhtb2RuYW1lKToKKyAgICAiIiJTcGxpdCB0aGUgbmFtZXMgb2YgdGhlIGdpdmVuIG1vZHVsZSBpbnRvIHN1YnBhcnRzCisKKyAgICBGb3IgZXhhbXBsZSwKKyAgICAgICAgX3F1YWxpZmllZF9uYW1lcygncHlsaW50LmNoZWNrZXJzLkltcG9ydHNDaGVja2VyJykKKyAgICByZXR1cm5zCisgICAgICAgIFsncHlsaW50JywgJ3B5bGludC5jaGVja2VycycsICdweWxpbnQuY2hlY2tlcnMuSW1wb3J0c0NoZWNrZXInXQorICAgICIiIgorICAgIG5hbWVzID0gbW9kbmFtZS5zcGxpdCgiLiIpCisgICAgcmV0dXJuIFsiLiIuam9pbihuYW1lc1swIDogaSArIDFdKSBmb3IgaSBpbiByYW5nZShsZW4obmFtZXMpKV0KKworCitkZWYgX2dldF9pbXBvcnRfbmFtZShpbXBvcnRub2RlLCBtb2RuYW1lKToKKyAgICAiIiJHZXQgYSBwcmVwYXJlZCBtb2R1bGUgbmFtZSBmcm9tIHRoZSBnaXZlbiBpbXBvcnQgbm9kZQorCisgICAgSW4gdGhlIGNhc2Ugb2YgcmVsYXRpdmUgaW1wb3J0cywgdGhpcyB3aWxsIHJldHVybiB0aGUKKyAgICBhYnNvbHV0ZSBxdWFsaWZpZWQgbW9kdWxlIG5hbWUsIHdoaWNoIG1pZ2h0IGJlIHVzZWZ1bAorICAgIGZvciBkZWJ1Z2dpbmcuIE90aGVyd2lzZSwgdGhlIGluaXRpYWwgbW9kdWxlIG5hbWUKKyAgICBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRub2RlLCBhc3Ryb2lkLkltcG9ydEZyb20pOgorICAgICAgICBpZiBpbXBvcnRub2RlLmxldmVsOgorICAgICAgICAgICAgcm9vdCA9IGltcG9ydG5vZGUucm9vdCgpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJvb3QsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gcm9vdC5yZWxhdGl2ZV90b19hYnNvbHV0ZV9uYW1lKAorICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLCBsZXZlbD1pbXBvcnRub2RlLmxldmVsCisgICAgICAgICAgICAgICAgKQorICAgIHJldHVybiBtb2RuYW1lCisKKworZGVmIF9nZXRfZmlyc3RfaW1wb3J0KG5vZGUsIGNvbnRleHQsIG5hbWUsIGJhc2UsIGxldmVsLCBhbGlhcyk6CisgICAgIiIicmV0dXJuIHRoZSBub2RlIHdoZXJlIFtiYXNlLl08bmFtZT4gaXMgaW1wb3J0ZWQgb3IgTm9uZSBpZiBub3QgZm91bmQiIiIKKyAgICBmdWxsbmFtZSA9IGYie2Jhc2V9LntuYW1lfSIgaWYgYmFzZSBlbHNlIG5hbWUKKworICAgIGZpcnN0ID0gTm9uZQorICAgIGZvdW5kID0gRmFsc2UKKyAgICBmb3IgZmlyc3QgaW4gY29udGV4dC5ib2R5OgorICAgICAgICBpZiBmaXJzdCBpcyBub2RlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgZmlyc3Quc2NvcGUoKSBpcyBub2RlLnNjb3BlKCkgYW5kIGZpcnN0LmZyb21saW5lbm8gPiBub2RlLmZyb21saW5lbm86CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBpc2luc3RhbmNlKGZpcnN0LCBhc3Ryb2lkLkltcG9ydCk6CisgICAgICAgICAgICBpZiBhbnkoZnVsbG5hbWUgPT0gaW5hbWVbMF0gZm9yIGluYW1lIGluIGZpcnN0Lm5hbWVzKToKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlyc3QsIGFzdHJvaWQuSW1wb3J0RnJvbSk6CisgICAgICAgICAgICBpZiBsZXZlbCA9PSBmaXJzdC5sZXZlbDoKKyAgICAgICAgICAgICAgICBmb3IgaW1wb3J0ZWRfbmFtZSwgaW1wb3J0ZWRfYWxpYXMgaW4gZmlyc3QubmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bGxuYW1lID09IGYie2ZpcnN0Lm1vZG5hbWV9LntpbXBvcnRlZF9uYW1lfSI6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgIT0gIioiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZSA9PSBpbXBvcnRlZF9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IChhbGlhcyBvciBpbXBvcnRlZF9hbGlhcykKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBpZiBmb3VuZCBhbmQgbm90IGFzdHJvaWQuYXJlX2V4Y2x1c2l2ZShmaXJzdCwgbm9kZSk6CisgICAgICAgIHJldHVybiBmaXJzdAorICAgIHJldHVybiBOb25lCisKKworZGVmIF9pZ25vcmVfaW1wb3J0X2ZhaWx1cmUobm9kZSwgbW9kbmFtZSwgaWdub3JlZF9tb2R1bGVzKToKKyAgICBmb3Igc3VibW9kdWxlIGluIF9xdWFsaWZpZWRfbmFtZXMobW9kbmFtZSk6CisgICAgICAgIGlmIHN1Ym1vZHVsZSBpbiBpZ25vcmVkX21vZHVsZXM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBpZ25vcmUgaW1wb3J0IGZhaWx1cmUgaWYgZ3VhcmRlZCBieSBgc3lzLnZlcnNpb25faW5mb2AgdGVzdAorICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuSWYpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICBub2RlLnBhcmVudC50ZXN0LCBhc3Ryb2lkLkNvbXBhcmUKKyAgICApOgorICAgICAgICB2YWx1ZSA9IG5vZGUucGFyZW50LnRlc3QubGVmdAorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLlN1YnNjcmlwdCk6CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgYW5kIHZhbHVlLmFzX3N0cmluZygpID09ICJzeXMudmVyc2lvbl9pbmZvIgorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHJldHVybiBub2RlX2lnbm9yZXNfZXhjZXB0aW9uKG5vZGUsIEltcG9ydEVycm9yKQorCisKKyMgdXRpbGl0aWVzIHRvIHJlcHJlc2VudHMgaW1wb3J0IGRlcGVuZGVuY2llcyBhcyB0cmVlIGFuZCBkb3QgZ3JhcGggIyMjIyMjIyMjIyMKKworCitkZWYgX21ha2VfdHJlZV9kZWZzKG1vZF9maWxlc19saXN0KToKKyAgICAiIiJnZXQgYSBsaXN0IG9mIDItdXBsZSAobW9kdWxlLCBsaXN0X29mX2ZpbGVzX3doaWNoX2ltcG9ydF90aGlzX21vZHVsZSksCisgICAgaXQgd2lsbCByZXR1cm4gYSBkaWN0aW9uYXJ5IHRvIHJlcHJlc2VudCB0aGlzIGFzIGEgdHJlZQorICAgICIiIgorICAgIHRyZWVfZGVmcyA9IHt9CisgICAgZm9yIG1vZCwgZmlsZXMgaW4gbW9kX2ZpbGVzX2xpc3Q6CisgICAgICAgIG5vZGUgPSAodHJlZV9kZWZzLCAoKSkKKyAgICAgICAgZm9yIHByZWZpeCBpbiBtb2Quc3BsaXQoIi4iKToKKyAgICAgICAgICAgIG5vZGUgPSBub2RlWzBdLnNldGRlZmF1bHQocHJlZml4LCBbe30sIFtdXSkKKyAgICAgICAgbm9kZVsxXSArPSBmaWxlcworICAgIHJldHVybiB0cmVlX2RlZnMKKworCitkZWYgX3JlcHJfdHJlZV9kZWZzKGRhdGEsIGluZGVudF9zdHI9Tm9uZSk6CisgICAgIiIicmV0dXJuIGEgc3RyaW5nIHdoaWNoIHJlcHJlc2VudHMgaW1wb3J0cyBhcyBhIHRyZWUiIiIKKyAgICBsaW5lcyA9IFtdCisgICAgbm9kZXMgPSBkYXRhLml0ZW1zKCkKKyAgICBmb3IgaSwgKG1vZCwgKHN1YiwgZmlsZXMpKSBpbiBlbnVtZXJhdGUoc29ydGVkKG5vZGVzLCBrZXk9bGFtYmRhIHg6IHhbMF0pKToKKyAgICAgICAgaWYgbm90IGZpbGVzOgorICAgICAgICAgICAgZmlsZXMgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZXMgPSAiKCVzKSIgJSAiLCIuam9pbihzb3J0ZWQoZmlsZXMpKQorICAgICAgICBpZiBpbmRlbnRfc3RyIGlzIE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7bW9kfSB7ZmlsZXN9IikKKyAgICAgICAgICAgIHN1Yl9pbmRlbnRfc3RyID0gIiAgIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGZyIntpbmRlbnRfc3RyfVwte21vZH0ge2ZpbGVzfSIpCisgICAgICAgICAgICBpZiBpID09IGxlbihub2RlcykgLSAxOgorICAgICAgICAgICAgICAgIHN1Yl9pbmRlbnRfc3RyID0gIiVzICAiICUgaW5kZW50X3N0cgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdWJfaW5kZW50X3N0ciA9ICIlc3wgIiAlIGluZGVudF9zdHIKKyAgICAgICAgaWYgc3ViOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKF9yZXByX3RyZWVfZGVmcyhzdWIsIHN1Yl9pbmRlbnRfc3RyKSkKKyAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQorCisKK2RlZiBfZGVwZW5kZW5jaWVzX2dyYXBoKGZpbGVuYW1lOiBzdHIsIGRlcF9pbmZvOiBEaWN0W3N0ciwgTGlzdFtzdHJdXSkgLT4gc3RyOgorICAgICIiIndyaXRlIGRlcGVuZGVuY2llcyBhcyBhIGRvdCAoZ3JhcGh2aXopIGZpbGUiIiIKKyAgICBkb25lID0ge30KKyAgICBwcmludGVyID0gRG90QmFja2VuZChvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKVswXSwgcmFua2Rpcj0iTFIiKQorICAgIHByaW50ZXIuZW1pdCgnVVJMPSIuIiBub2RlW3NoYXBlPSJib3giXScpCisgICAgZm9yIG1vZG5hbWUsIGRlcGVuZGVuY2llcyBpbiBzb3J0ZWQoZGVwX2luZm8uaXRlbXMoKSk6CisgICAgICAgIGRvbmVbbW9kbmFtZV0gPSAxCisgICAgICAgIHByaW50ZXIuZW1pdF9ub2RlKG1vZG5hbWUpCisgICAgICAgIGZvciBkZXBtb2RuYW1lIGluIGRlcGVuZGVuY2llczoKKyAgICAgICAgICAgIGlmIGRlcG1vZG5hbWUgbm90IGluIGRvbmU6CisgICAgICAgICAgICAgICAgZG9uZVtkZXBtb2RuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICBwcmludGVyLmVtaXRfbm9kZShkZXBtb2RuYW1lKQorICAgIGZvciBkZXBtb2RuYW1lLCBkZXBlbmRlbmNpZXMgaW4gc29ydGVkKGRlcF9pbmZvLml0ZW1zKCkpOgorICAgICAgICBmb3IgbW9kbmFtZSBpbiBkZXBlbmRlbmNpZXM6CisgICAgICAgICAgICBwcmludGVyLmVtaXRfZWRnZShtb2RuYW1lLCBkZXBtb2RuYW1lKQorICAgIHJldHVybiBwcmludGVyLmdlbmVyYXRlKGZpbGVuYW1lKQorCisKK2RlZiBfbWFrZV9ncmFwaChmaWxlbmFtZTogc3RyLCBkZXBfaW5mbzogRGljdFtzdHIsIExpc3Rbc3RyXV0sIHNlY3Q6IFZOb2RlLCBndHlwZTogc3RyKToKKyAgICAiIiJnZW5lcmF0ZSBhIGRlcGVuZGVuY2llcyBncmFwaCBhbmQgYWRkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgaXQgaW4gdGhlCisgICAgcmVwb3J0J3Mgc2VjdGlvbgorICAgICIiIgorICAgIG91dHB1dGZpbGUgPSBfZGVwZW5kZW5jaWVzX2dyYXBoKGZpbGVuYW1lLCBkZXBfaW5mbykKKyAgICBzZWN0LmFwcGVuZChQYXJhZ3JhcGgoZiJ7Z3R5cGV9aW1wb3J0cyBncmFwaCBoYXMgYmVlbiB3cml0dGVuIHRvIHtvdXRwdXRmaWxlfSIpKQorCisKKyMgdGhlIGltcG9ydCBjaGVja2VyIGl0c2VsZiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTVNHUyA9IHsKKyAgICAiRTA0MDEiOiAoCisgICAgICAgICJVbmFibGUgdG8gaW1wb3J0ICVzIiwKKyAgICAgICAgImltcG9ydC1lcnJvciIsCisgICAgICAgICJVc2VkIHdoZW4gcHlsaW50IGhhcyBiZWVuIHVuYWJsZSB0byBpbXBvcnQgYSBtb2R1bGUuIiwKKyAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJGMDQwMSIsICJvbGQtaW1wb3J0LWVycm9yIildfSwKKyAgICApLAorICAgICJFMDQwMiI6ICgKKyAgICAgICAgIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kIHRvcC1sZXZlbCBwYWNrYWdlIiwKKyAgICAgICAgInJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwiLAorICAgICAgICAiVXNlZCB3aGVuIGEgcmVsYXRpdmUgaW1wb3J0IHRyaWVzIHRvIGFjY2VzcyB0b28gbWFueSBsZXZlbHMgIgorICAgICAgICAiaW4gdGhlIGN1cnJlbnQgcGFja2FnZS4iLAorICAgICksCisgICAgIlIwNDAxIjogKAorICAgICAgICAiQ3ljbGljIGltcG9ydCAoJXMpIiwKKyAgICAgICAgImN5Y2xpYy1pbXBvcnQiLAorICAgICAgICAiVXNlZCB3aGVuIGEgY3ljbGljIGltcG9ydCBiZXR3ZWVuIHR3byBvciBtb3JlIG1vZHVsZXMgaXMgZGV0ZWN0ZWQuIiwKKyAgICApLAorICAgICJSMDQwMiI6ICgKKyAgICAgICAgIlVzZSAnZnJvbSAlcyBpbXBvcnQgJXMnIGluc3RlYWQiLAorICAgICAgICAiY29uc2lkZXItdXNpbmctZnJvbS1pbXBvcnQiLAorICAgICAgICAiRW1pdHRlZCB3aGVuIGEgc3VibW9kdWxlL21lbWJlciBvZiBhIHBhY2thZ2UgaXMgaW1wb3J0ZWQgYW5kICIKKyAgICAgICAgImFsaWFzZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiCisgICAgICAgICJFLmcuLCBpbnN0ZWFkIG9mIGBgaW1wb3J0IHBhbmRhcy5EYXRhRnJhbWUgYXMgRGF0YUZyYW1lYGAgdXNlICIKKyAgICAgICAgImBgZnJvbSBwYW5kYXMgaW1wb3J0IERhdGFGcmFtZWBgIiwKKyAgICApLAorICAgICJXMDQwMSI6ICgKKyAgICAgICAgIldpbGRjYXJkIGltcG9ydCAlcyIsCisgICAgICAgICJ3aWxkY2FyZC1pbXBvcnQiLAorICAgICAgICAiVXNlZCB3aGVuIGBmcm9tIG1vZHVsZSBpbXBvcnQgKmAgaXMgZGV0ZWN0ZWQuIiwKKyAgICApLAorICAgICJXMDQwMiI6ICgKKyAgICAgICAgIlVzZXMgb2YgYSBkZXByZWNhdGVkIG1vZHVsZSAlciIsCisgICAgICAgICJkZXByZWNhdGVkLW1vZHVsZSIsCisgICAgICAgICJVc2VkIGEgbW9kdWxlIG1hcmtlZCBhcyBkZXByZWNhdGVkIGlzIGltcG9ydGVkLiIsCisgICAgKSwKKyAgICAiVzA0MDQiOiAoCisgICAgICAgICJSZWltcG9ydCAlciAoaW1wb3J0ZWQgbGluZSAlcykiLAorICAgICAgICAicmVpbXBvcnRlZCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBtb2R1bGUgaXMgcmVpbXBvcnRlZCBtdWx0aXBsZSB0aW1lcy4iLAorICAgICksCisgICAgIlcwNDA2IjogKAorICAgICAgICAiTW9kdWxlIGltcG9ydCBpdHNlbGYiLAorICAgICAgICAiaW1wb3J0LXNlbGYiLAorICAgICAgICAiVXNlZCB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGluZyBpdHNlbGYuIiwKKyAgICApLAorICAgICJXMDQwNyI6ICgKKyAgICAgICAgIlByZWZlciBpbXBvcnRpbmcgJXIgaW5zdGVhZCBvZiAlciIsCisgICAgICAgICJwcmVmZXJyZWQtbW9kdWxlIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIG1vZHVsZSBpbXBvcnRlZCBoYXMgYSBwcmVmZXJyZWQgcmVwbGFjZW1lbnQgbW9kdWxlLiIsCisgICAgKSwKKyAgICAiVzA0MTAiOiAoCisgICAgICAgICJfX2Z1dHVyZV9fIGltcG9ydCBpcyBub3QgdGhlIGZpcnN0IG5vbiBkb2NzdHJpbmcgc3RhdGVtZW50IiwKKyAgICAgICAgIm1pc3BsYWNlZC1mdXR1cmUiLAorICAgICAgICAiUHl0aG9uIDIuNSBhbmQgZ3JlYXRlciByZXF1aXJlIF9fZnV0dXJlX18gaW1wb3J0IHRvIGJlIHRoZSAiCisgICAgICAgICJmaXJzdCBub24gZG9jc3RyaW5nIHN0YXRlbWVudCBpbiB0aGUgbW9kdWxlLiIsCisgICAgKSwKKyAgICAiQzA0MTAiOiAoCisgICAgICAgICJNdWx0aXBsZSBpbXBvcnRzIG9uIG9uZSBsaW5lICglcykiLAorICAgICAgICAibXVsdGlwbGUtaW1wb3J0cyIsCisgICAgICAgICJVc2VkIHdoZW4gaW1wb3J0IHN0YXRlbWVudCBpbXBvcnRpbmcgbXVsdGlwbGUgbW9kdWxlcyBpcyBkZXRlY3RlZC4iLAorICAgICksCisgICAgIkMwNDExIjogKAorICAgICAgICAiJXMgc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgJXMiLAorICAgICAgICAid3JvbmctaW1wb3J0LW9yZGVyIiwKKyAgICAgICAgIlVzZWQgd2hlbiBQRVA4IGltcG9ydCBvcmRlciBpcyBub3QgcmVzcGVjdGVkIChzdGFuZGFyZCBpbXBvcnRzICIKKyAgICAgICAgImZpcnN0LCB0aGVuIHRoaXJkLXBhcnR5IGxpYnJhcmllcywgdGhlbiBsb2NhbCBpbXBvcnRzKSIsCisgICAgKSwKKyAgICAiQzA0MTIiOiAoCisgICAgICAgICJJbXBvcnRzIGZyb20gcGFja2FnZSAlcyBhcmUgbm90IGdyb3VwZWQiLAorICAgICAgICAidW5ncm91cGVkLWltcG9ydHMiLAorICAgICAgICAiVXNlZCB3aGVuIGltcG9ydHMgYXJlIG5vdCBncm91cGVkIGJ5IHBhY2thZ2VzIiwKKyAgICApLAorICAgICJDMDQxMyI6ICgKKyAgICAgICAgJ0ltcG9ydCAiJXMiIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlJywKKyAgICAgICAgIndyb25nLWltcG9ydC1wb3NpdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gY29kZSBhbmQgaW1wb3J0cyBhcmUgbWl4ZWQiLAorICAgICksCisgICAgIkMwNDE0IjogKAorICAgICAgICAiSW1wb3J0IGFsaWFzIGRvZXMgbm90IHJlbmFtZSBvcmlnaW5hbCBwYWNrYWdlIiwKKyAgICAgICAgInVzZWxlc3MtaW1wb3J0LWFsaWFzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBpbXBvcnQgYWxpYXMgaXMgc2FtZSBhcyBvcmlnaW5hbCBwYWNrYWdlLiIKKyAgICAgICAgImUuZyB1c2luZyBpbXBvcnQgbnVtcHkgYXMgbnVtcHkgaW5zdGVhZCBvZiBpbXBvcnQgbnVtcHkgYXMgbnAiLAorICAgICksCisgICAgIkMwNDE1IjogKAorICAgICAgICAiSW1wb3J0IG91dHNpZGUgdG9wbGV2ZWwgKCVzKSIsCisgICAgICAgICJpbXBvcnQtb3V0c2lkZS10b3BsZXZlbCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW1wb3J0IHN0YXRlbWVudCBpcyB1c2VkIGFueXdoZXJlIG90aGVyIHRoYW4gdGhlIG1vZHVsZSAiCisgICAgICAgICJ0b3BsZXZlbC4gTW92ZSB0aGlzIGltcG9ydCB0byB0aGUgdG9wIG9mIHRoZSBmaWxlLiIsCisgICAgKSwKK30KKworCitERUZBVUxUX1NUQU5EQVJEX0xJQlJBUlkgPSAoKQorREVGQVVMVF9LTk9XTl9USElSRF9QQVJUWSA9ICgiZW5jaGFudCIsKQorREVGQVVMVF9QUkVGRVJSRURfTU9EVUxFUyA9ICgpCisKKworY2xhc3MgSW1wb3J0c0NoZWNrZXIoRGVwcmVjYXRlZE1peGluLCBCYXNlQ2hlY2tlcik6CisgICAgIiIiY2hlY2tzIGZvcgorICAgICogZXh0ZXJuYWwgbW9kdWxlcyBkZXBlbmRlbmNpZXMKKyAgICAqIHJlbGF0aXZlIC8gd2lsZGNhcmQgaW1wb3J0cworICAgICogY3ljbGljIGltcG9ydHMKKyAgICAqIHVzZXMgb2YgZGVwcmVjYXRlZCBtb2R1bGVzCisgICAgKiB1c2VzIG9mIG1vZHVsZXMgaW5zdGVhZCBvZiBwcmVmZXJyZWQgbW9kdWxlcworICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJQXN0cm9pZENoZWNrZXIKKworICAgIG5hbWUgPSAiaW1wb3J0cyIKKyAgICBtc2dzID0gTVNHUworICAgIHByaW9yaXR5ID0gLTIKKyAgICBkZWZhdWx0X2RlcHJlY2F0ZWRfbW9kdWxlcyA9ICgpCisKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAiZGVwcmVjYXRlZC1tb2R1bGVzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGRlZmF1bHRfZGVwcmVjYXRlZF9tb2R1bGVzLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG1vZHVsZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJEZXByZWNhdGVkIG1vZHVsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSB1c2VkLCIKKyAgICAgICAgICAgICAgICAiIHNlcGFyYXRlZCBieSBhIGNvbW1hLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAicHJlZmVycmVkLW1vZHVsZXMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogREVGQVVMVF9QUkVGRVJSRURfTU9EVUxFUywKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtb2R1bGU6cHJlZmVycmVkLW1vZHVsZT4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkNvdXBsZXMgb2YgbW9kdWxlcyBhbmQgcHJlZmVycmVkIG1vZHVsZXMsIgorICAgICAgICAgICAgICAgICIgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJpbXBvcnQtZ3JhcGgiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8ZmlsZS5ndj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIk91dHB1dCBhIGdyYXBoICguZ3Ygb3IgYW55IHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQpIG9mIgorICAgICAgICAgICAgICAgICIgYWxsIChpLmUuIGludGVybmFsIGFuZCBleHRlcm5hbCkgZGVwZW5kZW5jaWVzIHRvIHRoZSBnaXZlbiBmaWxlIgorICAgICAgICAgICAgICAgICIgKHJlcG9ydCBSUDA0MDIgbXVzdCBub3QgYmUgZGlzYWJsZWQpLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiZXh0LWltcG9ydC1ncmFwaCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIiwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxmaWxlLmd2PiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiT3V0cHV0IGEgZ3JhcGggKC5ndiBvciBhbnkgc3VwcG9ydGVkIGltYWdlIGZvcm1hdCkiCisgICAgICAgICAgICAgICAgIiBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMgdG8gdGhlIGdpdmVuIGZpbGUiCisgICAgICAgICAgICAgICAgIiAocmVwb3J0IFJQMDQwMiBtdXN0IG5vdCBiZSBkaXNhYmxlZCkuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJpbnQtaW1wb3J0LWdyYXBoIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIiLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGZpbGUuZ3Y+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJPdXRwdXQgYSBncmFwaCAoLmd2IG9yIGFueSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0KSIKKyAgICAgICAgICAgICAgICAiIG9mIGludGVybmFsIGRlcGVuZGVuY2llcyB0byB0aGUgZ2l2ZW4gZmlsZSIKKyAgICAgICAgICAgICAgICAiIChyZXBvcnQgUlAwNDAyIG11c3Qgbm90IGJlIGRpc2FibGVkKS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImtub3duLXN0YW5kYXJkLWxpYnJhcnkiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogREVGQVVMVF9TVEFOREFSRF9MSUJSQVJZLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG1vZHVsZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJGb3JjZSBpbXBvcnQgb3JkZXIgdG8gcmVjb2duaXplIGEgbW9kdWxlIGFzIHBhcnQgb2YgIgorICAgICAgICAgICAgICAgICJ0aGUgc3RhbmRhcmQgY29tcGF0aWJpbGl0eSBsaWJyYXJpZXMuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJrbm93bi10aGlyZC1wYXJ0eSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBERUZBVUxUX0tOT1dOX1RISVJEX1BBUlRZLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG1vZHVsZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJGb3JjZSBpbXBvcnQgb3JkZXIgdG8gcmVjb2duaXplIGEgbW9kdWxlIGFzIHBhcnQgb2YgIgorICAgICAgICAgICAgICAgICJhIHRoaXJkIHBhcnR5IGxpYnJhcnkuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJhbGxvdy1hbnktaW1wb3J0LWxldmVsIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgpLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG1vZHVsZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgIkxpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSBpbXBvcnRlZCBhdCBhbnkgbGV2ZWwsIG5vdCBqdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgInRoZSB0b3AgbGV2ZWwgb25lLiIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImFuYWx5c2UtZmFsbGJhY2stYmxvY2tzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IEZhbHNlLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiQW5hbHlzZSBpbXBvcnQgZmFsbGJhY2sgYmxvY2tzLiBUaGlzIGNhbiBiZSB1c2VkIHRvICIKKyAgICAgICAgICAgICAgICAic3VwcG9ydCBib3RoIFB5dGhvbiAyIGFuZCAzIGNvbXBhdGlibGUgY29kZSwgd2hpY2ggIgorICAgICAgICAgICAgICAgICJtZWFucyB0aGF0IHRoZSBibG9jayBtaWdodCBoYXZlIGNvZGUgdGhhdCBleGlzdHMgIgorICAgICAgICAgICAgICAgICJvbmx5IGluIG9uZSBvciBhbm90aGVyIGludGVycHJldGVyLCBsZWFkaW5nIHRvIGZhbHNlICIKKyAgICAgICAgICAgICAgICAicG9zaXRpdmVzIHdoZW4gYW5hbHlzZWQuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJhbGxvdy13aWxkY2FyZC13aXRoLWFsbCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHlfb3Jfbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkFsbG93IHdpbGRjYXJkIGltcG9ydHMgZnJvbSBtb2R1bGVzIHRoYXQgZGVmaW5lIF9fYWxsX18uIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcj1Ob25lKToKKyAgICAgICAgQmFzZUNoZWNrZXIuX19pbml0X18oc2VsZiwgbGludGVyKQorICAgICAgICBzZWxmLnN0YXRzID0gTm9uZQorICAgICAgICBzZWxmLmltcG9ydF9ncmFwaCA9IE5vbmUKKyAgICAgICAgc2VsZi5faW1wb3J0c19zdGFjayA9IFtdCisgICAgICAgIHNlbGYuX2ZpcnN0X25vbl9pbXBvcnRfbm9kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fbW9kdWxlX3BrZyA9IHt9ICAjIG1hcHBpbmcgb2YgbW9kdWxlcyB0byB0aGUgcGtnIHRoZXkgYmVsb25nIGluCisgICAgICAgIHNlbGYuX2FsbG93X2FueV9pbXBvcnRfbGV2ZWwgPSBzZXQoKQorICAgICAgICBzZWxmLnJlcG9ydHMgPSAoCisgICAgICAgICAgICAoIlJQMDQwMSIsICJFeHRlcm5hbCBkZXBlbmRlbmNpZXMiLCBzZWxmLl9yZXBvcnRfZXh0ZXJuYWxfZGVwZW5kZW5jaWVzKSwKKyAgICAgICAgICAgICgiUlAwNDAyIiwgIk1vZHVsZXMgZGVwZW5kZW5jaWVzIGdyYXBoIiwgc2VsZi5fcmVwb3J0X2RlcGVuZGVuY2llc19ncmFwaCksCisgICAgICAgICkKKworICAgICAgICBzZWxmLl9zaXRlX3BhY2thZ2VzID0gc2VsZi5fY29tcHV0ZV9zaXRlX3BhY2thZ2VzKCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NvbXB1dGVfc2l0ZV9wYWNrYWdlcygpOgorICAgICAgICBkZWYgX25vcm1hbGl6ZWRfcGF0aChwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChwYXRoKSkKKworICAgICAgICBwYXRocyA9IHNldCgpCisgICAgICAgIHJlYWxfcHJlZml4ID0gZ2V0YXR0cihzeXMsICJyZWFsX3ByZWZpeCIsIE5vbmUpCisgICAgICAgIGZvciBwcmVmaXggaW4gZmlsdGVyKE5vbmUsIChyZWFsX3ByZWZpeCwgc3lzLnByZWZpeCkpOgorICAgICAgICAgICAgcGF0aCA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihwcmVmaXg9cHJlZml4KQorICAgICAgICAgICAgcGF0aCA9IF9ub3JtYWxpemVkX3BhdGgocGF0aCkKKyAgICAgICAgICAgIHBhdGhzLmFkZChwYXRoKQorCisgICAgICAgICMgSGFuZGxlIERlYmlhbidzIGRlcml2YXRpdmVzIC91c3IvbG9jYWwuCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKCIvZXRjL2RlYmlhbl92ZXJzaW9uIik6CisgICAgICAgICAgICBmb3IgcHJlZml4IGluIGZpbHRlcihOb25lLCAocmVhbF9wcmVmaXgsIHN5cy5wcmVmaXgpKToKKyAgICAgICAgICAgICAgICBsaWJweXRob24gPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgImxvY2FsIiwKKyAgICAgICAgICAgICAgICAgICAgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzY29uZmlnLmdldF9weXRob25fdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAiZGlzdC1wYWNrYWdlcyIsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHBhdGhzLmFkZChsaWJweXRob24pCisgICAgICAgIHJldHVybiBwYXRocworCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgICIiImNhbGxlZCBiZWZvcmUgdmlzaXRpbmcgcHJvamVjdCAoaS5lIHNldCBvZiBtb2R1bGVzKSIiIgorICAgICAgICBzZWxmLmxpbnRlci5hZGRfc3RhdHMoZGVwZW5kZW5jaWVzPXt9KQorICAgICAgICBzZWxmLmxpbnRlci5hZGRfc3RhdHMoY3ljbGVzPVtdKQorICAgICAgICBzZWxmLnN0YXRzID0gc2VsZi5saW50ZXIuc3RhdHMKKyAgICAgICAgc2VsZi5pbXBvcnRfZ3JhcGggPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCisgICAgICAgIHNlbGYuX21vZHVsZV9wa2cgPSB7fSAgIyBtYXBwaW5nIG9mIG1vZHVsZXMgdG8gdGhlIHBrZyB0aGV5IGJlbG9uZyBpbgorICAgICAgICBzZWxmLl9leGNsdWRlZF9lZGdlcyA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KHNldCkKKyAgICAgICAgc2VsZi5faWdub3JlZF9tb2R1bGVzID0gZ2V0X2dsb2JhbF9vcHRpb24oc2VsZiwgImlnbm9yZWQtbW9kdWxlcyIsIGRlZmF1bHQ9W10pCisgICAgICAgICMgQnVpbGQgYSBtYXBwaW5nIHsnbW9kdWxlJzogJ3ByZWZlcnJlZC1tb2R1bGUnfQorICAgICAgICBzZWxmLnByZWZlcnJlZF9tb2R1bGVzID0gZGljdCgKKyAgICAgICAgICAgIG1vZHVsZS5zcGxpdCgiOiIpCisgICAgICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYuY29uZmlnLnByZWZlcnJlZF9tb2R1bGVzCisgICAgICAgICAgICBpZiAiOiIgaW4gbW9kdWxlCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fYWxsb3dfYW55X2ltcG9ydF9sZXZlbCA9IHNldChzZWxmLmNvbmZpZy5hbGxvd19hbnlfaW1wb3J0X2xldmVsKQorCisgICAgZGVmIF9pbXBvcnRfZ3JhcGhfd2l0aG91dF9pZ25vcmVkX2VkZ2VzKHNlbGYpOgorICAgICAgICBmaWx0ZXJlZF9ncmFwaCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5pbXBvcnRfZ3JhcGgpCisgICAgICAgIGZvciBub2RlIGluIGZpbHRlcmVkX2dyYXBoOgorICAgICAgICAgICAgZmlsdGVyZWRfZ3JhcGhbbm9kZV0uZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5fZXhjbHVkZWRfZWRnZXNbbm9kZV0pCisgICAgICAgIHJldHVybiBmaWx0ZXJlZF9ncmFwaAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJjYWxsZWQgYmVmb3JlIHZpc2l0aW5nIHByb2plY3QgKGkuZSBzZXQgb2YgbW9kdWxlcykiIiIKKyAgICAgICAgaWYgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJjeWNsaWMtaW1wb3J0Iik6CisgICAgICAgICAgICBncmFwaCA9IHNlbGYuX2ltcG9ydF9ncmFwaF93aXRob3V0X2lnbm9yZWRfZWRnZXMoKQorICAgICAgICAgICAgdmVydGljZXMgPSBsaXN0KGdyYXBoKQorICAgICAgICAgICAgZm9yIGN5Y2xlIGluIGdldF9jeWNsZXMoZ3JhcGgsIHZlcnRpY2VzPXZlcnRpY2VzKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjeWNsaWMtaW1wb3J0IiwgYXJncz0iIC0+ICIuam9pbihjeWNsZSkpCisKKyAgICBkZWYgZGVwcmVjYXRlZF9tb2R1bGVzKHNlbGYpOgorICAgICAgICAiIiJDYWxsYmFjayByZXR1cm5pbmcgdGhlIGRlcHJlY2F0ZWQgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLmRlcHJlY2F0ZWRfbW9kdWxlcworCisgICAgQGNoZWNrX21lc3NhZ2VzKCpNU0dTKQorICAgIGRlZiB2aXNpdF9pbXBvcnQoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInRyaWdnZXJlZCB3aGVuIGFuIGltcG9ydCBzdGF0ZW1lbnQgaXMgc2VlbiIiIgorICAgICAgICBzZWxmLl9jaGVja19yZWltcG9ydChub2RlKQorICAgICAgICBzZWxmLl9jaGVja19pbXBvcnRfYXNfcmVuYW1lKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3RvcGxldmVsKG5vZGUpCisKKyAgICAgICAgbmFtZXMgPSBbbmFtZSBmb3IgbmFtZSwgXyBpbiBub2RlLm5hbWVzXQorICAgICAgICBpZiBsZW4obmFtZXMpID49IDI6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtdWx0aXBsZS1pbXBvcnRzIiwgYXJncz0iLCAiLmpvaW4obmFtZXMpLCBub2RlPW5vZGUpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2RlcHJlY2F0ZWRfbW9kdWxlKG5vZGUsIG5hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19wcmVmZXJyZWRfbW9kdWxlKG5vZGUsIG5hbWUpCisgICAgICAgICAgICBpbXBvcnRlZF9tb2R1bGUgPSBzZWxmLl9nZXRfaW1wb3J0ZWRfbW9kdWxlKG5vZGUsIG5hbWUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICAgICAgIyBBbGxvdyBpbXBvcnRzIG5lc3RlZAorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3Bvc2l0aW9uKG5vZGUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUuc2NvcGUoKSwgYXN0cm9pZC5Nb2R1bGUpOgorICAgICAgICAgICAgICAgIHNlbGYuX3JlY29yZF9pbXBvcnQobm9kZSwgaW1wb3J0ZWRfbW9kdWxlKQorCisgICAgICAgICAgICBpZiBpbXBvcnRlZF9tb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzZWxmLl9hZGRfaW1wb3J0ZWRfbW9kdWxlKG5vZGUsIGltcG9ydGVkX21vZHVsZS5uYW1lKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCpNU0dTKQorICAgIGRlZiB2aXNpdF9pbXBvcnRmcm9tKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ0cmlnZ2VyZWQgd2hlbiBhIGZyb20gc3RhdGVtZW50IGlzIHNlZW4iIiIKKyAgICAgICAgYmFzZW5hbWUgPSBub2RlLm1vZG5hbWUKKyAgICAgICAgaW1wb3J0ZWRfbW9kdWxlID0gc2VsZi5fZ2V0X2ltcG9ydGVkX21vZHVsZShub2RlLCBiYXNlbmFtZSkKKworICAgICAgICBzZWxmLl9jaGVja19pbXBvcnRfYXNfcmVuYW1lKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX21pc3BsYWNlZF9mdXR1cmUobm9kZSkKKyAgICAgICAgc2VsZi5jaGVja19kZXByZWNhdGVkX21vZHVsZShub2RlLCBiYXNlbmFtZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcHJlZmVycmVkX21vZHVsZShub2RlLCBiYXNlbmFtZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfd2lsZGNhcmRfaW1wb3J0cyhub2RlLCBpbXBvcnRlZF9tb2R1bGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbWVfbGluZV9pbXBvcnRzKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlaW1wb3J0KG5vZGUsIGJhc2VuYW1lPWJhc2VuYW1lLCBsZXZlbD1ub2RlLmxldmVsKQorICAgICAgICBzZWxmLl9jaGVja190b3BsZXZlbChub2RlKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgICMgQWxsb3cgaW1wb3J0cyBuZXN0ZWQKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3Bvc2l0aW9uKG5vZGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5zY29wZSgpLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLl9yZWNvcmRfaW1wb3J0KG5vZGUsIGltcG9ydGVkX21vZHVsZSkKKyAgICAgICAgaWYgaW1wb3J0ZWRfbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIG5hbWUsIF8gaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIGlmIG5hbWUgIT0gIioiOgorICAgICAgICAgICAgICAgIHNlbGYuX2FkZF9pbXBvcnRlZF9tb2R1bGUobm9kZSwgZiJ7aW1wb3J0ZWRfbW9kdWxlLm5hbWV9LntuYW1lfSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2FkZF9pbXBvcnRlZF9tb2R1bGUobm9kZSwgaW1wb3J0ZWRfbW9kdWxlLm5hbWUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoKk1TR1MpCisgICAgZGVmIGxlYXZlX21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgIyBDaGVjayBpbXBvcnRzIGFyZSBncm91cGVkIGJ5IGNhdGVnb3J5IChzdGFuZGFyZCwgM3JkIHBhcnR5LCBsb2NhbCkKKyAgICAgICAgc3RkX2ltcG9ydHMsIGV4dF9pbXBvcnRzLCBsb2NfaW1wb3J0cyA9IHNlbGYuX2NoZWNrX2ltcG9ydHNfb3JkZXIobm9kZSkKKworICAgICAgICAjIENoZWNrIHRoYXQgaW1wb3J0cyBhcmUgZ3JvdXBlZCBieSBwYWNrYWdlIHdpdGhpbiBhIGdpdmVuIGNhdGVnb3J5CisgICAgICAgIG1ldF9pbXBvcnQgPSBzZXQoKSAgIyBzZXQgZm9yICdpbXBvcnQgeCcgc3R5bGUKKyAgICAgICAgbWV0X2Zyb20gPSBzZXQoKSAgIyBzZXQgZm9yICdmcm9tIHggaW1wb3J0IHknIHN0eWxlCisgICAgICAgIGN1cnJlbnRfcGFja2FnZSA9IE5vbmUKKyAgICAgICAgZm9yIGltcG9ydF9ub2RlLCBpbXBvcnRfbmFtZSBpbiBzdGRfaW1wb3J0cyArIGV4dF9pbXBvcnRzICsgbG9jX2ltcG9ydHM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKAorICAgICAgICAgICAgICAgICJ1bmdyb3VwZWQtaW1wb3J0cyIsIGltcG9ydF9ub2RlLmZyb21saW5lbm8KKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW1wb3J0X25vZGUsIGFzdHJvaWQubm9kZV9jbGFzc2VzLkltcG9ydEZyb20pOgorICAgICAgICAgICAgICAgIG1ldCA9IG1ldF9mcm9tCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1ldCA9IG1ldF9pbXBvcnQKKyAgICAgICAgICAgIHBhY2thZ2UsIF8sIF8gPSBpbXBvcnRfbmFtZS5wYXJ0aXRpb24oIi4iKQorICAgICAgICAgICAgaWYgY3VycmVudF9wYWNrYWdlIGFuZCBjdXJyZW50X3BhY2thZ2UgIT0gcGFja2FnZSBhbmQgcGFja2FnZSBpbiBtZXQ6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW5ncm91cGVkLWltcG9ydHMiLCBub2RlPWltcG9ydF9ub2RlLCBhcmdzPXBhY2thZ2UpCisgICAgICAgICAgICBjdXJyZW50X3BhY2thZ2UgPSBwYWNrYWdlCisgICAgICAgICAgICBtZXQuYWRkKHBhY2thZ2UpCisKKyAgICAgICAgc2VsZi5faW1wb3J0c19zdGFjayA9IFtdCisgICAgICAgIHNlbGYuX2ZpcnN0X25vbl9pbXBvcnRfbm9kZSA9IE5vbmUKKworICAgIGRlZiBjb21wdXRlX2ZpcnN0X25vbl9pbXBvcnRfbm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgid3JvbmctaW1wb3J0LXBvc2l0aW9uIiwgbm9kZS5mcm9tbGluZW5vKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIGlmIHRoZSBub2RlIGRvZXMgbm90IGNvbnRhaW4gYW4gaW1wb3J0IGluc3RydWN0aW9uLCBhbmQgaWYgaXQgaXMgdGhlCisgICAgICAgICMgZmlyc3Qgbm9kZSBvZiB0aGUgbW9kdWxlLCBrZWVwIGEgdHJhY2sgb2YgaXQgKGFsbCB0aGUgaW1wb3J0IHBvc2l0aW9ucworICAgICAgICAjIG9mIHRoZSBtb2R1bGUgd2lsbCBiZSBjb21wYXJlZCB0byB0aGUgcG9zaXRpb24gb2YgdGhpcyBmaXJzdAorICAgICAgICAjIGluc3RydWN0aW9uKQorICAgICAgICBpZiBzZWxmLl9maXJzdF9ub25faW1wb3J0X25vZGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBuZXN0ZWRfYWxsb3dlZCA9IFthc3Ryb2lkLlRyeUV4Y2VwdCwgYXN0cm9pZC5UcnlGaW5hbGx5XQorICAgICAgICBpc19uZXN0ZWRfYWxsb3dlZCA9IFsKKyAgICAgICAgICAgIGFsbG93ZWQgZm9yIGFsbG93ZWQgaW4gbmVzdGVkX2FsbG93ZWQgaWYgaXNpbnN0YW5jZShub2RlLCBhbGxvd2VkKQorICAgICAgICBdCisgICAgICAgIGlmIGlzX25lc3RlZF9hbGxvd2VkIGFuZCBhbnkoCisgICAgICAgICAgICBub2RlLm5vZGVzX29mX2NsYXNzKChhc3Ryb2lkLkltcG9ydCwgYXN0cm9pZC5JbXBvcnRGcm9tKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQXNzaWduKToKKyAgICAgICAgICAgICMgQWRkIGNvbXBhdGliaWxpdHkgZm9yIG1vZHVsZSBsZXZlbCBkdW5kZXIgbmFtZXMKKyAgICAgICAgICAgICMgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDAwOC8jbW9kdWxlLWxldmVsLWR1bmRlci1uYW1lcworICAgICAgICAgICAgdmFsaWRfdGFyZ2V0cyA9IFsKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHRhcmdldCwgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgICAgIGFuZCB0YXJnZXQubmFtZS5zdGFydHN3aXRoKCJfXyIpCisgICAgICAgICAgICAgICAgYW5kIHRhcmdldC5uYW1lLmVuZHN3aXRoKCJfXyIpCisgICAgICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBub2RlLnRhcmdldHMKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGlmIGFsbCh2YWxpZF90YXJnZXRzKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fZmlyc3Rfbm9uX2ltcG9ydF9ub2RlID0gbm9kZQorCisgICAgdmlzaXRfdHJ5ZmluYWxseSA9ICgKKyAgICAgICAgdmlzaXRfdHJ5ZXhjZXB0CisgICAgKSA9ICgKKyAgICAgICAgdmlzaXRfYXNzaWduYXR0cgorICAgICkgPSAoCisgICAgICAgIHZpc2l0X2Fzc2lnbgorICAgICkgPSAoCisgICAgICAgIHZpc2l0X2lmZXhwCisgICAgKSA9IHZpc2l0X2NvbXByZWhlbnNpb24gPSB2aXNpdF9leHByID0gdmlzaXRfaWYgPSBjb21wdXRlX2ZpcnN0X25vbl9pbXBvcnRfbm9kZQorCisgICAgZGVmIHZpc2l0X2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJ3cm9uZy1pbXBvcnQtcG9zaXRpb24iLCBub2RlLmZyb21saW5lbm8pOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgSWYgaXQgaXMgdGhlIGZpcnN0IG5vbiBpbXBvcnQgaW5zdHJ1Y3Rpb24gb2YgdGhlIG1vZHVsZSwgcmVjb3JkIGl0LgorICAgICAgICBpZiBzZWxmLl9maXJzdF9ub25faW1wb3J0X25vZGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIENoZWNrIGlmIHRoZSBub2RlIGJlbG9uZ3MgdG8gYW4gYElmYCBvciBhIGBUcnlgIGJsb2NrLiBJZiB0aGV5CisgICAgICAgICMgY29udGFpbiBpbXBvcnRzLCBza2lwIHJlY29yZGluZyB0aGlzIG5vZGUuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUucGFyZW50LnNjb3BlKCksIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHJvb3QgPSBub2RlCisgICAgICAgIHdoaWxlIG5vdCBpc2luc3RhbmNlKHJvb3QucGFyZW50LCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICByb290ID0gcm9vdC5wYXJlbnQKKworICAgICAgICBpZiBpc2luc3RhbmNlKHJvb3QsIChhc3Ryb2lkLklmLCBhc3Ryb2lkLlRyeUZpbmFsbHksIGFzdHJvaWQuVHJ5RXhjZXB0KSk6CisgICAgICAgICAgICBpZiBhbnkocm9vdC5ub2Rlc19vZl9jbGFzcygoYXN0cm9pZC5JbXBvcnQsIGFzdHJvaWQuSW1wb3J0RnJvbSkpKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9maXJzdF9ub25faW1wb3J0X25vZGUgPSBub2RlCisKKyAgICB2aXNpdF9jbGFzc2RlZiA9IHZpc2l0X2ZvciA9IHZpc2l0X3doaWxlID0gdmlzaXRfZnVuY3Rpb25kZWYKKworICAgIGRlZiBfY2hlY2tfbWlzcGxhY2VkX2Z1dHVyZShzZWxmLCBub2RlKToKKyAgICAgICAgYmFzZW5hbWUgPSBub2RlLm1vZG5hbWUKKyAgICAgICAgaWYgYmFzZW5hbWUgPT0gIl9fZnV0dXJlX18iOgorICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBub24tZG9jc3RyaW5nIHN0YXRlbWVudCBpbiB0aGUgbW9kdWxlCisgICAgICAgICAgICBwcmV2ID0gbm9kZS5wcmV2aW91c19zaWJsaW5nKCkKKyAgICAgICAgICAgIGlmIHByZXY6CisgICAgICAgICAgICAgICAgIyBjb25zZWN1dGl2ZSBmdXR1cmUgc3RhdGVtZW50cyBhcmUgcG9zc2libGUKKyAgICAgICAgICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHByZXYsIGFzdHJvaWQuSW1wb3J0RnJvbSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIHByZXYubW9kbmFtZSA9PSAiX19mdXR1cmVfXyIKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtaXNwbGFjZWQtZnV0dXJlIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX2NoZWNrX3NhbWVfbGluZV9pbXBvcnRzKHNlbGYsIG5vZGUpOgorICAgICAgICAjIERldGVjdCBkdXBsaWNhdGUgaW1wb3J0cyBvbiB0aGUgc2FtZSBsaW5lLgorICAgICAgICBuYW1lcyA9IChuYW1lIGZvciBuYW1lLCBfIGluIG5vZGUubmFtZXMpCisgICAgICAgIGNvdW50ZXIgPSBjb2xsZWN0aW9ucy5Db3VudGVyKG5hbWVzKQorICAgICAgICBmb3IgbmFtZSwgY291bnQgaW4gY291bnRlci5pdGVtcygpOgorICAgICAgICAgICAgaWYgY291bnQgPiAxOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJlaW1wb3J0ZWQiLCBub2RlPW5vZGUsIGFyZ3M9KG5hbWUsIG5vZGUuZnJvbWxpbmVubykpCisKKyAgICBkZWYgX2NoZWNrX3Bvc2l0aW9uKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayBgbm9kZWAgaW1wb3J0IG9yIGltcG9ydGZyb20gbm9kZSBwb3NpdGlvbiBpcyBjb3JyZWN0CisKKyAgICAgICAgU2VuZCBhIG1lc3NhZ2UgIGlmIGBub2RlYCBjb21lcyBiZWZvcmUgYW5vdGhlciBpbnN0cnVjdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgIyBpZiBhIGZpcnN0IG5vbi1pbXBvcnQgaW5zdHJ1Y3Rpb24gaGFzIGFscmVhZHkgYmVlbiBlbmNvdW50ZXJlZCwKKyAgICAgICAgIyBpdCBtZWFucyB0aGUgaW1wb3J0IGNvbWVzIGFmdGVyIGl0IGFuZCB0aGVyZWZvcmUgaXMgbm90IHdlbGwgcGxhY2VkCisgICAgICAgIGlmIHNlbGYuX2ZpcnN0X25vbl9pbXBvcnRfbm9kZToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIndyb25nLWltcG9ydC1wb3NpdGlvbiIsIG5vZGU9bm9kZSwgYXJncz1ub2RlLmFzX3N0cmluZygpKQorCisgICAgZGVmIF9yZWNvcmRfaW1wb3J0KHNlbGYsIG5vZGUsIGltcG9ydGVkbW9kbm9kZSk6CisgICAgICAgICIiIlJlY29yZCB0aGUgcGFja2FnZSBgbm9kZWAgaW1wb3J0cyBmcm9tIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5JbXBvcnRGcm9tKToKKyAgICAgICAgICAgIGltcG9ydGVkbmFtZSA9IG5vZGUubW9kbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1wb3J0ZWRuYW1lID0gaW1wb3J0ZWRtb2Rub2RlLm5hbWUgaWYgaW1wb3J0ZWRtb2Rub2RlIGVsc2UgTm9uZQorICAgICAgICBpZiBub3QgaW1wb3J0ZWRuYW1lOgorICAgICAgICAgICAgaW1wb3J0ZWRuYW1lID0gbm9kZS5uYW1lc1swXVswXS5zcGxpdCgiLiIpWzBdCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkltcG9ydEZyb20pIGFuZCAobm9kZS5sZXZlbCBvciAwKSA+PSAxOgorICAgICAgICAgICAgIyBXZSBuZWVkIHRoZSBpbXBvcnRlZG5hbWUgd2l0aCBmaXJzdCBwb2ludCB0byBkZXRlY3QgbG9jYWwgcGFja2FnZQorICAgICAgICAgICAgIyBFeGFtcGxlIG9mIG5vZGU6CisgICAgICAgICAgICAjICAnZnJvbSAubXlfcGFja2FnZTEgaW1wb3J0IE15Q2xhc3MxJworICAgICAgICAgICAgIyAgdGhlIG91dHB1dCBzaG91bGQgYmUgJy5teV9wYWNrYWdlMScgaW5zdGVhZCBvZiAnbXlfcGFja2FnZTEnCisgICAgICAgICAgICAjIEV4YW1wbGUgb2Ygbm9kZToKKyAgICAgICAgICAgICMgICdmcm9tIC4gaW1wb3J0IG15X3BhY2thZ2UyJworICAgICAgICAgICAgIyAgdGhlIG91dHB1dCBzaG91bGQgYmUgJy5teV9wYWNrYWdlMicgaW5zdGVhZCBvZiAne3B5ZmlsZX0nCisgICAgICAgICAgICBpbXBvcnRlZG5hbWUgPSAiLiIgKyBpbXBvcnRlZG5hbWUKKworICAgICAgICBzZWxmLl9pbXBvcnRzX3N0YWNrLmFwcGVuZCgobm9kZSwgaW1wb3J0ZWRuYW1lKSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX2ZhbGxiYWNrX2ltcG9ydChub2RlLCBpbXBvcnRzKToKKyAgICAgICAgaW1wb3J0cyA9IFtpbXBvcnRfbm9kZSBmb3IgKGltcG9ydF9ub2RlLCBfKSBpbiBpbXBvcnRzXQorICAgICAgICByZXR1cm4gYW55KGFzdHJvaWQuYXJlX2V4Y2x1c2l2ZShpbXBvcnRfbm9kZSwgbm9kZSkgZm9yIGltcG9ydF9ub2RlIGluIGltcG9ydHMpCisKKyAgICBkZWYgX2NoZWNrX2ltcG9ydHNfb3JkZXIoc2VsZiwgX21vZHVsZV9ub2RlKToKKyAgICAgICAgIiIiQ2hlY2tzIGltcG9ydHMgb2YgbW9kdWxlIGBub2RlYCBhcmUgZ3JvdXBlZCBieSBjYXRlZ29yeQorCisgICAgICAgIEltcG9ydHMgbXVzdCBmb2xsb3cgdGhpcyBvcmRlcjogc3RhbmRhcmQsIDNyZCBwYXJ0eSwgbG9jYWwKKyAgICAgICAgIiIiCisgICAgICAgIHN0ZF9pbXBvcnRzID0gW10KKyAgICAgICAgdGhpcmRfcGFydHlfaW1wb3J0cyA9IFtdCisgICAgICAgIGZpcnN0X3BhcnR5X2ltcG9ydHMgPSBbXQorICAgICAgICAjIG5lZWQgb2YgYSBsaXN0IHRoYXQgaG9sZHMgdGhpcmQgb3IgZmlyc3QgcGFydHkgb3JkZXJlZCBpbXBvcnQKKyAgICAgICAgZXh0ZXJuYWxfaW1wb3J0cyA9IFtdCisgICAgICAgIGxvY2FsX2ltcG9ydHMgPSBbXQorICAgICAgICB0aGlyZF9wYXJ0eV9ub3RfaWdub3JlZCA9IFtdCisgICAgICAgIGZpcnN0X3BhcnR5X25vdF9pZ25vcmVkID0gW10KKyAgICAgICAgbG9jYWxfbm90X2lnbm9yZWQgPSBbXQorICAgICAgICBpc29ydF9kcml2ZXIgPSBJc29ydERyaXZlcihzZWxmLmNvbmZpZykKKyAgICAgICAgZm9yIG5vZGUsIG1vZG5hbWUgaW4gc2VsZi5faW1wb3J0c19zdGFjazoKKyAgICAgICAgICAgIGlmIG1vZG5hbWUuc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgICAgIHBhY2thZ2UgPSAiLiIgKyBtb2RuYW1lLnNwbGl0KCIuIilbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFja2FnZSA9IG1vZG5hbWUuc3BsaXQoIi4iKVswXQorICAgICAgICAgICAgbmVzdGVkID0gbm90IGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuTW9kdWxlKQorICAgICAgICAgICAgaWdub3JlX2Zvcl9pbXBvcnRfb3JkZXIgPSBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKAorICAgICAgICAgICAgICAgICJ3cm9uZy1pbXBvcnQtb3JkZXIiLCBub2RlLmZyb21saW5lbm8KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGltcG9ydF9jYXRlZ29yeSA9IGlzb3J0X2RyaXZlci5wbGFjZV9tb2R1bGUocGFja2FnZSkKKyAgICAgICAgICAgIG5vZGVfYW5kX3BhY2thZ2VfaW1wb3J0ID0gKG5vZGUsIHBhY2thZ2UpCisgICAgICAgICAgICBpZiBpbXBvcnRfY2F0ZWdvcnkgaW4gKCJGVVRVUkUiLCAiU1RETElCIik6CisgICAgICAgICAgICAgICAgc3RkX2ltcG9ydHMuYXBwZW5kKG5vZGVfYW5kX3BhY2thZ2VfaW1wb3J0KQorICAgICAgICAgICAgICAgIHdyb25nX2ltcG9ydCA9ICgKKyAgICAgICAgICAgICAgICAgICAgdGhpcmRfcGFydHlfbm90X2lnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgb3IgZmlyc3RfcGFydHlfbm90X2lnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgb3IgbG9jYWxfbm90X2lnbm9yZWQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfZmFsbGJhY2tfaW1wb3J0KG5vZGUsIHdyb25nX2ltcG9ydCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgd3JvbmdfaW1wb3J0IGFuZCBub3QgbmVzdGVkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nLWltcG9ydC1vcmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhbmRhcmQgaW1wb3J0ICIlcyInICUgbm9kZS5hc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiVzIicgJSB3cm9uZ19pbXBvcnRbMF1bMF0uYXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbGlmIGltcG9ydF9jYXRlZ29yeSA9PSAiVEhJUkRQQVJUWSI6CisgICAgICAgICAgICAgICAgdGhpcmRfcGFydHlfaW1wb3J0cy5hcHBlbmQobm9kZV9hbmRfcGFja2FnZV9pbXBvcnQpCisgICAgICAgICAgICAgICAgZXh0ZXJuYWxfaW1wb3J0cy5hcHBlbmQobm9kZV9hbmRfcGFja2FnZV9pbXBvcnQpCisgICAgICAgICAgICAgICAgaWYgbm90IG5lc3RlZCBhbmQgbm90IGlnbm9yZV9mb3JfaW1wb3J0X29yZGVyOgorICAgICAgICAgICAgICAgICAgICB0aGlyZF9wYXJ0eV9ub3RfaWdub3JlZC5hcHBlbmQobm9kZV9hbmRfcGFja2FnZV9pbXBvcnQpCisgICAgICAgICAgICAgICAgd3JvbmdfaW1wb3J0ID0gZmlyc3RfcGFydHlfbm90X2lnbm9yZWQgb3IgbG9jYWxfbm90X2lnbm9yZWQKKyAgICAgICAgICAgICAgICBpZiB3cm9uZ19pbXBvcnQgYW5kIG5vdCBuZXN0ZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmctaW1wb3J0LW9yZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlyZCBwYXJ0eSBpbXBvcnQgIiVzIicgJSBub2RlLmFzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJXMiJyAlIHdyb25nX2ltcG9ydFswXVswXS5hc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsaWYgaW1wb3J0X2NhdGVnb3J5ID09ICJGSVJTVFBBUlRZIjoKKyAgICAgICAgICAgICAgICBmaXJzdF9wYXJ0eV9pbXBvcnRzLmFwcGVuZChub2RlX2FuZF9wYWNrYWdlX2ltcG9ydCkKKyAgICAgICAgICAgICAgICBleHRlcm5hbF9pbXBvcnRzLmFwcGVuZChub2RlX2FuZF9wYWNrYWdlX2ltcG9ydCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbmVzdGVkIGFuZCBub3QgaWdub3JlX2Zvcl9pbXBvcnRfb3JkZXI6CisgICAgICAgICAgICAgICAgICAgIGZpcnN0X3BhcnR5X25vdF9pZ25vcmVkLmFwcGVuZChub2RlX2FuZF9wYWNrYWdlX2ltcG9ydCkKKyAgICAgICAgICAgICAgICB3cm9uZ19pbXBvcnQgPSBsb2NhbF9ub3RfaWdub3JlZAorICAgICAgICAgICAgICAgIGlmIHdyb25nX2ltcG9ydCBhbmQgbm90IG5lc3RlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZy1pbXBvcnQtb3JkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpcnN0IHBhcnR5IGltcG9ydCAiJXMiJyAlIG5vZGUuYXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyInICUgd3JvbmdfaW1wb3J0WzBdWzBdLmFzX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZWxpZiBpbXBvcnRfY2F0ZWdvcnkgPT0gIkxPQ0FMRk9MREVSIjoKKyAgICAgICAgICAgICAgICBsb2NhbF9pbXBvcnRzLmFwcGVuZCgobm9kZSwgcGFja2FnZSkpCisgICAgICAgICAgICAgICAgaWYgbm90IG5lc3RlZCBhbmQgbm90IGlnbm9yZV9mb3JfaW1wb3J0X29yZGVyOgorICAgICAgICAgICAgICAgICAgICBsb2NhbF9ub3RfaWdub3JlZC5hcHBlbmQoKG5vZGUsIHBhY2thZ2UpKQorICAgICAgICByZXR1cm4gc3RkX2ltcG9ydHMsIGV4dGVybmFsX2ltcG9ydHMsIGxvY2FsX2ltcG9ydHMKKworICAgIGRlZiBfZ2V0X2ltcG9ydGVkX21vZHVsZShzZWxmLCBpbXBvcnRub2RlLCBtb2RuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGltcG9ydG5vZGUuZG9faW1wb3J0X21vZHVsZShtb2RuYW1lKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5Ub29NYW55TGV2ZWxzRXJyb3I6CisgICAgICAgICAgICBpZiBfaWdub3JlX2ltcG9ydF9mYWlsdXJlKGltcG9ydG5vZGUsIG1vZG5hbWUsIHNlbGYuX2lnbm9yZWRfbW9kdWxlcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwiLCBub2RlPWltcG9ydG5vZGUpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkFzdHJvaWRTeW50YXhFcnJvciBhcyBleGM6CisgICAgICAgICAgICBtZXNzYWdlID0gIkNhbm5vdCBpbXBvcnQgeyFyfSBkdWUgdG8gc3ludGF4IGVycm9yIHshcn0iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBtb2RuYW1lLCBzdHIoZXhjLmVycm9yKSAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyOyBmYWxzZSBwb3NpdGl2ZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic3ludGF4LWVycm9yIiwgbGluZT1pbXBvcnRub2RlLmxpbmVubywgYXJncz1tZXNzYWdlKQorCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkFzdHJvaWRCdWlsZGluZ0V4Y2VwdGlvbjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoImltcG9ydC1lcnJvciIpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBpZiBfaWdub3JlX2ltcG9ydF9mYWlsdXJlKGltcG9ydG5vZGUsIG1vZG5hbWUsIHNlbGYuX2lnbm9yZWRfbW9kdWxlcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmZpZy5hbmFseXNlX2ZhbGxiYWNrX2Jsb2NrcyBhbmQgaXNfZnJvbV9mYWxsYmFja19ibG9jaygKKyAgICAgICAgICAgICAgICBpbXBvcnRub2RlCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgIGRvdHRlZF9tb2RuYW1lID0gX2dldF9pbXBvcnRfbmFtZShpbXBvcnRub2RlLCBtb2RuYW1lKQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW1wb3J0LWVycm9yIiwgYXJncz1yZXByKGRvdHRlZF9tb2RuYW1lKSwgbm9kZT1pbXBvcnRub2RlKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9hZGRfaW1wb3J0ZWRfbW9kdWxlKHNlbGYsIG5vZGUsIGltcG9ydGVkbW9kbmFtZSk6CisgICAgICAgICIiIm5vdGlmeSBhbiBpbXBvcnRlZCBtb2R1bGUsIHVzZWQgdG8gYW5hbHl6ZSBkZXBlbmRlbmNpZXMiIiIKKyAgICAgICAgbW9kdWxlX2ZpbGUgPSBub2RlLnJvb3QoKS5maWxlCisgICAgICAgIGNvbnRleHRfbmFtZSA9IG5vZGUucm9vdCgpLm5hbWUKKyAgICAgICAgYmFzZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShtb2R1bGVfZmlsZSkpWzBdCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0ZWRtb2RuYW1lID0gYXN0cm9pZC5tb2R1dGlscy5nZXRfbW9kdWxlX3BhcnQoCisgICAgICAgICAgICAgICAgaW1wb3J0ZWRtb2RuYW1lLCBtb2R1bGVfZmlsZQorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgY29udGV4dF9uYW1lID09IGltcG9ydGVkbW9kbmFtZToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImltcG9ydC1zZWxmIiwgbm9kZT1ub2RlKQorCisgICAgICAgIGVsaWYgbm90IGFzdHJvaWQubW9kdXRpbHMuaXNfc3RhbmRhcmRfbW9kdWxlKGltcG9ydGVkbW9kbmFtZSk6CisgICAgICAgICAgICAjIGlmIHRoaXMgaXMgbm90IGEgcGFja2FnZSBfX2luaXRfXyBtb2R1bGUKKyAgICAgICAgICAgIGlmIGJhc2UgIT0gIl9faW5pdF9fIiBhbmQgY29udGV4dF9uYW1lIG5vdCBpbiBzZWxmLl9tb2R1bGVfcGtnOgorICAgICAgICAgICAgICAgICMgcmVjb3JkIHRoZSBtb2R1bGUncyBwYXJlbnQsIG9yIHRoZSBtb2R1bGUgaXRzZWxmIGlmIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAjIGEgdG9wIGxldmVsIG1vZHVsZSwgYXMgdGhlIHBhY2thZ2UgaXQgYmVsb25ncyB0bworICAgICAgICAgICAgICAgIHNlbGYuX21vZHVsZV9wa2dbY29udGV4dF9uYW1lXSA9IGNvbnRleHRfbmFtZS5yc3BsaXQoIi4iLCAxKVswXQorCisgICAgICAgICAgICAjIGhhbmRsZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGltcG9ydGVkbW9kbmFtZXMgPSBzZWxmLnN0YXRzWyJkZXBlbmRlbmNpZXMiXS5zZXRkZWZhdWx0KAorICAgICAgICAgICAgICAgIGltcG9ydGVkbW9kbmFtZSwgc2V0KCkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGNvbnRleHRfbmFtZSBub3QgaW4gaW1wb3J0ZWRtb2RuYW1lczoKKyAgICAgICAgICAgICAgICBpbXBvcnRlZG1vZG5hbWVzLmFkZChjb250ZXh0X25hbWUpCisKKyAgICAgICAgICAgICMgdXBkYXRlIGltcG9ydCBncmFwaAorICAgICAgICAgICAgc2VsZi5pbXBvcnRfZ3JhcGhbY29udGV4dF9uYW1lXS5hZGQoaW1wb3J0ZWRtb2RuYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiY3ljbGljLWltcG9ydCIsIGxpbmU9bm9kZS5saW5lbm8pOgorICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGVkX2VkZ2VzW2NvbnRleHRfbmFtZV0uYWRkKGltcG9ydGVkbW9kbmFtZSkKKworICAgIGRlZiBfY2hlY2tfcHJlZmVycmVkX21vZHVsZShzZWxmLCBub2RlLCBtb2RfcGF0aCk6CisgICAgICAgICIiImNoZWNrIGlmIHRoZSBtb2R1bGUgaGFzIGEgcHJlZmVycmVkIHJlcGxhY2VtZW50IiIiCisgICAgICAgIGlmIG1vZF9wYXRoIGluIHNlbGYucHJlZmVycmVkX21vZHVsZXM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJwcmVmZXJyZWQtbW9kdWxlIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5wcmVmZXJyZWRfbW9kdWxlc1ttb2RfcGF0aF0sIG1vZF9wYXRoKSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfaW1wb3J0X2FzX3JlbmFtZSgKKyAgICAgICAgc2VsZiwgbm9kZTogVW5pb25bYXN0cm9pZC5JbXBvcnQsIGFzdHJvaWQuSW1wb3J0RnJvbV0KKyAgICApIC0+IE5vbmU6CisgICAgICAgIG5hbWVzID0gbm9kZS5uYW1lcworICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBhbGwobmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNwbGl0dGVkX3BhY2thZ2VzID0gbmFtZVswXS5yc3BsaXQoIi4iLCBtYXhzcGxpdD0xKQorICAgICAgICAgICAgaW1wb3J0X25hbWUgPSBzcGxpdHRlZF9wYWNrYWdlc1stMV0KKyAgICAgICAgICAgIGFsaWFzZWRfbmFtZSA9IG5hbWVbMV0KKyAgICAgICAgICAgIGlmIGltcG9ydF9uYW1lICE9IGFsaWFzZWRfbmFtZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBsZW4oc3BsaXR0ZWRfcGFja2FnZXMpID09IDE6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidXNlbGVzcy1pbXBvcnQtYWxpYXMiLCBub2RlPW5vZGUpCisgICAgICAgICAgICBlbGlmIGxlbihzcGxpdHRlZF9wYWNrYWdlcykgPT0gMjoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAiY29uc2lkZXItdXNpbmctZnJvbS1pbXBvcnQiLAorICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNwbGl0dGVkX3BhY2thZ2VzWzBdLCBpbXBvcnRfbmFtZSksCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19yZWltcG9ydChzZWxmLCBub2RlLCBiYXNlbmFtZT1Ob25lLCBsZXZlbD1Ob25lKToKKyAgICAgICAgIiIiY2hlY2sgaWYgdGhlIGltcG9ydCBpcyBuZWNlc3NhcnkgKGkuZS4gbm90IGFscmVhZHkgZG9uZSkiIiIKKyAgICAgICAgaWYgbm90IHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgicmVpbXBvcnRlZCIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnJhbWUgPSBub2RlLmZyYW1lKCkKKyAgICAgICAgcm9vdCA9IG5vZGUucm9vdCgpCisgICAgICAgIGNvbnRleHRzID0gWyhmcmFtZSwgbGV2ZWwpXQorICAgICAgICBpZiByb290IGlzIG5vdCBmcmFtZToKKyAgICAgICAgICAgIGNvbnRleHRzLmFwcGVuZCgocm9vdCwgTm9uZSkpCisKKyAgICAgICAgZm9yIGtub3duX2NvbnRleHQsIGtub3duX2xldmVsIGluIGNvbnRleHRzOgorICAgICAgICAgICAgZm9yIG5hbWUsIGFsaWFzIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICAgICAgZmlyc3QgPSBfZ2V0X2ZpcnN0X2ltcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwga25vd25fY29udGV4dCwgbmFtZSwgYmFzZW5hbWUsIGtub3duX2xldmVsLCBhbGlhcworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBmaXJzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWltcG9ydGVkIiwgbm9kZT1ub2RlLCBhcmdzPShuYW1lLCBmaXJzdC5mcm9tbGluZW5vKQorICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgX3JlcG9ydF9leHRlcm5hbF9kZXBlbmRlbmNpZXMoc2VsZiwgc2VjdCwgXywgX2R1bW15KToKKyAgICAgICAgIiIicmV0dXJuIGEgdmVyYmF0aW0gbGF5b3V0IGZvciBkaXNwbGF5aW5nIGRlcGVuZGVuY2llcyIiIgorICAgICAgICBkZXBfaW5mbyA9IF9tYWtlX3RyZWVfZGVmcyhzZWxmLl9leHRlcm5hbF9kZXBlbmRlbmNpZXNfaW5mbygpLml0ZW1zKCkpCisgICAgICAgIGlmIG5vdCBkZXBfaW5mbzoKKyAgICAgICAgICAgIHJhaXNlIEVtcHR5UmVwb3J0RXJyb3IoKQorICAgICAgICB0cmVlX3N0ciA9IF9yZXByX3RyZWVfZGVmcyhkZXBfaW5mbykKKyAgICAgICAgc2VjdC5hcHBlbmQoVmVyYmF0aW1UZXh0KHRyZWVfc3RyKSkKKworICAgIGRlZiBfcmVwb3J0X2RlcGVuZGVuY2llc19ncmFwaChzZWxmLCBzZWN0LCBfLCBfZHVtbXkpOgorICAgICAgICAiIiJ3cml0ZSBkZXBlbmRlbmNpZXMgYXMgYSBkb3QgKGdyYXBodml6KSBmaWxlIiIiCisgICAgICAgIGRlcF9pbmZvID0gc2VsZi5zdGF0c1siZGVwZW5kZW5jaWVzIl0KKyAgICAgICAgaWYgbm90IGRlcF9pbmZvIG9yIG5vdCAoCisgICAgICAgICAgICBzZWxmLmNvbmZpZy5pbXBvcnRfZ3JhcGgKKyAgICAgICAgICAgIG9yIHNlbGYuY29uZmlnLmV4dF9pbXBvcnRfZ3JhcGgKKyAgICAgICAgICAgIG9yIHNlbGYuY29uZmlnLmludF9pbXBvcnRfZ3JhcGgKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJhaXNlIEVtcHR5UmVwb3J0RXJyb3IoKQorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY29uZmlnLmltcG9ydF9ncmFwaAorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIF9tYWtlX2dyYXBoKGZpbGVuYW1lLCBkZXBfaW5mbywgc2VjdCwgIiIpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jb25maWcuZXh0X2ltcG9ydF9ncmFwaAorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIF9tYWtlX2dyYXBoKGZpbGVuYW1lLCBzZWxmLl9leHRlcm5hbF9kZXBlbmRlbmNpZXNfaW5mbygpLCBzZWN0LCAiZXh0ZXJuYWwgIikKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNvbmZpZy5pbnRfaW1wb3J0X2dyYXBoCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgX21ha2VfZ3JhcGgoZmlsZW5hbWUsIHNlbGYuX2ludGVybmFsX2RlcGVuZGVuY2llc19pbmZvKCksIHNlY3QsICJpbnRlcm5hbCAiKQorCisgICAgZGVmIF9maWx0ZXJfZGVwZW5kZW5jaWVzX2dyYXBoKHNlbGYsIGludGVybmFsKToKKyAgICAgICAgIiIiYnVpbGQgdGhlIGludGVybmFsIG9yIHRoZSBleHRlcm5hbCBkZXBlbmRlbmN5IGdyYXBoIiIiCisgICAgICAgIGdyYXBoID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Qoc2V0KQorICAgICAgICBmb3IgaW1wb3J0ZWUsIGltcG9ydGVycyBpbiBzZWxmLnN0YXRzWyJkZXBlbmRlbmNpZXMiXS5pdGVtcygpOgorICAgICAgICAgICAgZm9yIGltcG9ydGVyIGluIGltcG9ydGVyczoKKyAgICAgICAgICAgICAgICBwYWNrYWdlID0gc2VsZi5fbW9kdWxlX3BrZy5nZXQoaW1wb3J0ZXIsIGltcG9ydGVyKQorICAgICAgICAgICAgICAgIGlzX2luc2lkZSA9IGltcG9ydGVlLnN0YXJ0c3dpdGgocGFja2FnZSkKKyAgICAgICAgICAgICAgICBpZiBpc19pbnNpZGUgYW5kIGludGVybmFsIG9yIG5vdCBpc19pbnNpZGUgYW5kIG5vdCBpbnRlcm5hbDoKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhbaW1wb3J0ZWVdLmFkZChpbXBvcnRlcikKKyAgICAgICAgcmV0dXJuIGdyYXBoCisKKyAgICBAYXN0cm9pZC5kZWNvcmF0b3JzLmNhY2hlZAorICAgIGRlZiBfZXh0ZXJuYWxfZGVwZW5kZW5jaWVzX2luZm8oc2VsZik6CisgICAgICAgICIiInJldHVybiBjYWNoZWQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGluZm9ybWF0aW9uIG9yIGJ1aWxkIGFuZAorICAgICAgICBjYWNoZSB0aGVtCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsdGVyX2RlcGVuZGVuY2llc19ncmFwaChpbnRlcm5hbD1GYWxzZSkKKworICAgIEBhc3Ryb2lkLmRlY29yYXRvcnMuY2FjaGVkCisgICAgZGVmIF9pbnRlcm5hbF9kZXBlbmRlbmNpZXNfaW5mbyhzZWxmKToKKyAgICAgICAgIiIicmV0dXJuIGNhY2hlZCBpbnRlcm5hbCBkZXBlbmRlbmNpZXMgaW5mb3JtYXRpb24gb3IgYnVpbGQgYW5kCisgICAgICAgIGNhY2hlIHRoZW0KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9maWx0ZXJfZGVwZW5kZW5jaWVzX2dyYXBoKGludGVybmFsPVRydWUpCisKKyAgICBkZWYgX2NoZWNrX3dpbGRjYXJkX2ltcG9ydHMoc2VsZiwgbm9kZSwgaW1wb3J0ZWRfbW9kdWxlKToKKyAgICAgICAgaWYgbm9kZS5yb290KCkucGFja2FnZToKKyAgICAgICAgICAgICMgU2tpcCB0aGUgY2hlY2sgaWYgaW4gX19pbml0X18ucHkgaXNzdWUgIzIwMjYKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHdpbGRjYXJkX2ltcG9ydF9pc19hbGxvd2VkID0gc2VsZi5fd2lsZGNhcmRfaW1wb3J0X2lzX2FsbG93ZWQoaW1wb3J0ZWRfbW9kdWxlKQorICAgICAgICBmb3IgbmFtZSwgXyBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAiKiIgYW5kIG5vdCB3aWxkY2FyZF9pbXBvcnRfaXNfYWxsb3dlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ3aWxkY2FyZC1pbXBvcnQiLCBhcmdzPW5vZGUubW9kbmFtZSwgbm9kZT1ub2RlKQorCisgICAgZGVmIF93aWxkY2FyZF9pbXBvcnRfaXNfYWxsb3dlZChzZWxmLCBpbXBvcnRlZF9tb2R1bGUpOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgc2VsZi5jb25maWcuYWxsb3dfd2lsZGNhcmRfd2l0aF9hbGwKKyAgICAgICAgICAgIGFuZCBpbXBvcnRlZF9tb2R1bGUgaXMgbm90IE5vbmUKKyAgICAgICAgICAgIGFuZCAiX19hbGxfXyIgaW4gaW1wb3J0ZWRfbW9kdWxlLmxvY2FscworICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX3RvcGxldmVsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayB3aGV0aGVyIHRoZSBpbXBvcnQgaXMgbWFkZSBvdXRzaWRlIHRoZSBtb2R1bGUgdG9wbGV2ZWwuIiIiCisgICAgICAgICMgSWYgdGhlIHNjb3BlIG9mIHRoZSBpbXBvcnQgaXMgYSBtb2R1bGUsIHRoZW4gb2J2aW91c2x5IGl0IGlzCisgICAgICAgICMgbm90IG91dHNpZGUgdGhlIG1vZHVsZSB0b3BsZXZlbC4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnNjb3BlKCksIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG1vZHVsZV9uYW1lcyA9IFsKKyAgICAgICAgICAgIGYie25vZGUubW9kbmFtZX0ue25hbWVbMF19IgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkltcG9ydEZyb20pCisgICAgICAgICAgICBlbHNlIG5hbWVbMF0KKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5vZGUubmFtZXMKKyAgICAgICAgXQorCisgICAgICAgICMgR2V0IHRoZSBmdWxsIG5hbWVzIG9mIGFsbCB0aGUgaW1wb3J0cyB0aGF0IGFyZSBvbmx5IGFsbG93ZWQgYXQgdGhlIG1vZHVsZSBsZXZlbAorICAgICAgICBzY29wZWRfaW1wb3J0cyA9IFsKKyAgICAgICAgICAgIG5hbWUgZm9yIG5hbWUgaW4gbW9kdWxlX25hbWVzIGlmIG5hbWUgbm90IGluIHNlbGYuX2FsbG93X2FueV9pbXBvcnRfbGV2ZWwKKyAgICAgICAgXQorCisgICAgICAgIGlmIHNjb3BlZF9pbXBvcnRzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwiLCBhcmdzPSIsICIuam9pbihzY29wZWRfaW1wb3J0cyksIG5vZGU9bm9kZQorICAgICAgICAgICAgKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiInJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlciIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEltcG9ydHNDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvbG9nZ2luZy5weSBiL3B5bGludC9jaGVja2Vycy9sb2dnaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvbG9nZ2luZy5weQpAQCAtMCwwICsxLDQxNyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgMjAxMy0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyLCAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgTWlrZSBCcnlhbnQgPGxlYWNoaW1AbGVhY2hpbS5pbmZvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOS0yMDIwIEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiBDaHJpcyBNdXJyYXkgPGNocmlzQGNocmlzbXVycmF5LnNjb3Q+CisjIENvcHlyaWdodCAoYykgMjAxNyBndWlsbGF1bWUyIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb2w+CisjIENvcHlyaWdodCAoYykgMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBbGFuIENoYW4gPGFjaGFuOTYxMTE3QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFl1cnkgR3JpYm92IDx0ZXRyYTIwMDVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBNYXJpYXR0YSBXaWpheWEgPG1hcmlhdHRhQHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgRGphaWxsYSA8YmFzdGllbi52YWxsZXRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgU3ZldCA8c3ZldEBoeXBlcnNjaWVuY2UuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiImNoZWNrZXIgZm9yIHVzZSBvZiBQeXRob24gbG9nZ2luZworIiIiCitpbXBvcnQgc3RyaW5nCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycywgaW50ZXJmYWNlcworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IHV0aWxzCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMKKworTVNHUyA9IHsgICMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzCisgICAgIlcxMjAxIjogKAorICAgICAgICAiVXNlICVzIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMiLAorICAgICAgICAibG9nZ2luZy1ub3QtbGF6eSIsCisgICAgICAgICJVc2VkIHdoZW4gYSBsb2dnaW5nIHN0YXRlbWVudCBoYXMgYSBjYWxsIGZvcm0gb2YgIgorICAgICAgICAnImxvZ2dpbmcuPGxvZ2dpbmcgbWV0aG9kPihmb3JtYXRfc3RyaW5nICUgKGZvcm1hdF9hcmdzLi4uKSkiLiAnCisgICAgICAgICJVc2UgYW5vdGhlciB0eXBlIG9mIHN0cmluZyBmb3JtYXR0aW5nIGluc3RlYWQuICIKKyAgICAgICAgIllvdSBjYW4gdXNlICUgZm9ybWF0dGluZyBidXQgbGVhdmUgaW50ZXJwb2xhdGlvbiB0byAiCisgICAgICAgICJ0aGUgbG9nZ2luZyBmdW5jdGlvbiBieSBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGFzIGFyZ3VtZW50cy4gIgorICAgICAgICAiSWYgbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb24gaXMgZGlzYWJsZWQgdGhlbiAiCisgICAgICAgICJ5b3UgY2FuIHVzZSBmc3RyaW5nIGZvcm1hdHRpbmcuICIKKyAgICAgICAgIklmIGxvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb24gaXMgZGlzYWJsZWQgdGhlbiAiCisgICAgICAgICJ5b3UgY2FuIHVzZSBzdHIuZm9ybWF0LiIsCisgICAgKSwKKyAgICAiVzEyMDIiOiAoCisgICAgICAgICJVc2UgJXMgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucyIsCisgICAgICAgICJsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGxvZ2dpbmcgc3RhdGVtZW50IGhhcyBhIGNhbGwgZm9ybSBvZiAiCisgICAgICAgICcibG9nZ2luZy48bG9nZ2luZyBtZXRob2Q+KGZvcm1hdF9zdHJpbmcuZm9ybWF0KGZvcm1hdF9hcmdzLi4uKSkiLiAnCisgICAgICAgICJVc2UgYW5vdGhlciB0eXBlIG9mIHN0cmluZyBmb3JtYXR0aW5nIGluc3RlYWQuICIKKyAgICAgICAgIllvdSBjYW4gdXNlICUgZm9ybWF0dGluZyBidXQgbGVhdmUgaW50ZXJwb2xhdGlvbiB0byAiCisgICAgICAgICJ0aGUgbG9nZ2luZyBmdW5jdGlvbiBieSBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGFzIGFyZ3VtZW50cy4gIgorICAgICAgICAiSWYgbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb24gaXMgZGlzYWJsZWQgdGhlbiAiCisgICAgICAgICJ5b3UgY2FuIHVzZSBmc3RyaW5nIGZvcm1hdHRpbmcuICIKKyAgICAgICAgIklmIGxvZ2dpbmctbm90LWxhenkgaXMgZGlzYWJsZWQgdGhlbiAiCisgICAgICAgICJ5b3UgY2FuIHVzZSAlIGZvcm1hdHRpbmcgYXMgbm9ybWFsLiIsCisgICAgKSwKKyAgICAiVzEyMDMiOiAoCisgICAgICAgICJVc2UgJXMgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucyIsCisgICAgICAgICJsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gYSBsb2dnaW5nIHN0YXRlbWVudCBoYXMgYSBjYWxsIGZvcm0gb2YgIgorICAgICAgICAnImxvZ2dpbmcuPGxvZ2dpbmcgbWV0aG9kPihmIi4uLiIpIi4nCisgICAgICAgICJVc2UgYW5vdGhlciB0eXBlIG9mIHN0cmluZyBmb3JtYXR0aW5nIGluc3RlYWQuICIKKyAgICAgICAgIllvdSBjYW4gdXNlICUgZm9ybWF0dGluZyBidXQgbGVhdmUgaW50ZXJwb2xhdGlvbiB0byAiCisgICAgICAgICJ0aGUgbG9nZ2luZyBmdW5jdGlvbiBieSBwYXNzaW5nIHRoZSBwYXJhbWV0ZXJzIGFzIGFyZ3VtZW50cy4gIgorICAgICAgICAiSWYgbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbiBpcyBkaXNhYmxlZCB0aGVuICIKKyAgICAgICAgInlvdSBjYW4gdXNlIHN0ci5mb3JtYXQuICIKKyAgICAgICAgIklmIGxvZ2dpbmctbm90LWxhenkgaXMgZGlzYWJsZWQgdGhlbiAiCisgICAgICAgICJ5b3UgY2FuIHVzZSAlIGZvcm1hdHRpbmcgYXMgbm9ybWFsLiIsCisgICAgKSwKKyAgICAiRTEyMDAiOiAoCisgICAgICAgICJVbnN1cHBvcnRlZCBsb2dnaW5nIGZvcm1hdCBjaGFyYWN0ZXIgJXIgKCUjMDJ4KSBhdCBpbmRleCAlZCIsCisgICAgICAgICJsb2dnaW5nLXVuc3VwcG9ydGVkLWZvcm1hdCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciBpcyB1c2VkIGluIGEgbG9nZ2luZyAiCisgICAgICAgICJzdGF0ZW1lbnQgZm9ybWF0IHN0cmluZy4iLAorICAgICksCisgICAgIkUxMjAxIjogKAorICAgICAgICAiTG9nZ2luZyBmb3JtYXQgc3RyaW5nIGVuZHMgaW4gbWlkZGxlIG9mIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwKKyAgICAgICAgImxvZ2dpbmctZm9ybWF0LXRydW5jYXRlZCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBsb2dnaW5nIHN0YXRlbWVudCBmb3JtYXQgc3RyaW5nIHRlcm1pbmF0ZXMgYmVmb3JlICIKKyAgICAgICAgInRoZSBlbmQgb2YgYSBjb252ZXJzaW9uIHNwZWNpZmllci4iLAorICAgICksCisgICAgIkUxMjA1IjogKAorICAgICAgICAiVG9vIG1hbnkgYXJndW1lbnRzIGZvciBsb2dnaW5nIGZvcm1hdCBzdHJpbmciLAorICAgICAgICAibG9nZ2luZy10b28tbWFueS1hcmdzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGxvZ2dpbmcgZm9ybWF0IHN0cmluZyBpcyBnaXZlbiB0b28gbWFueSBhcmd1bWVudHMuIiwKKyAgICApLAorICAgICJFMTIwNiI6ICgKKyAgICAgICAgIk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBsb2dnaW5nIGZvcm1hdCBzdHJpbmciLAorICAgICAgICAibG9nZ2luZy10b28tZmV3LWFyZ3MiLAorICAgICAgICAiVXNlZCB3aGVuIGEgbG9nZ2luZyBmb3JtYXQgc3RyaW5nIGlzIGdpdmVuIHRvbyBmZXcgYXJndW1lbnRzLiIsCisgICAgKSwKK30KKworCitDSEVDS0VEX0NPTlZFTklFTkNFX0ZVTkNUSU9OUyA9IHsKKyAgICAiY3JpdGljYWwiLAorICAgICJkZWJ1ZyIsCisgICAgImVycm9yIiwKKyAgICAiZXhjZXB0aW9uIiwKKyAgICAiZmF0YWwiLAorICAgICJpbmZvIiwKKyAgICAid2FybiIsCisgICAgIndhcm5pbmciLAorfQorCisKK2RlZiBpc19tZXRob2RfY2FsbChmdW5jLCB0eXBlcz0oKSwgbWV0aG9kcz0oKSk6CisgICAgIiIiRGV0ZXJtaW5lcyBpZiBhIEJvdW5kTWV0aG9kIG5vZGUgcmVwcmVzZW50cyBhIG1ldGhvZCBjYWxsLgorCisgICAgQXJnczoKKyAgICAgIGZ1bmMgKGFzdHJvaWQuQm91bmRNZXRob2QpOiBUaGUgQm91bmRNZXRob2QgQVNUIG5vZGUgdG8gY2hlY2suCisgICAgICB0eXBlcyAoT3B0aW9uYWxbU3RyaW5nXSk6IE9wdGlvbmFsIHNlcXVlbmNlIG9mIGNhbGxlciB0eXBlIG5hbWVzIHRvIHJlc3RyaWN0IGNoZWNrLgorICAgICAgbWV0aG9kcyAoT3B0aW9uYWxbU3RyaW5nXSk6IE9wdGlvbmFsIHNlcXVlbmNlIG9mIG1ldGhvZCBuYW1lcyB0byByZXN0cmljdCBjaGVjay4KKworICAgIFJldHVybnM6CisgICAgICBib29sOiB0cnVlIGlmIHRoZSBub2RlIHJlcHJlc2VudHMgYSBtZXRob2QgY2FsbCBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kCisgICAgICBtZXRob2QgbmFtZXMsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICByZXR1cm4gKAorICAgICAgICBpc2luc3RhbmNlKGZ1bmMsIGFzdHJvaWQuQm91bmRNZXRob2QpCisgICAgICAgIGFuZCBpc2luc3RhbmNlKGZ1bmMuYm91bmQsIGFzdHJvaWQuSW5zdGFuY2UpCisgICAgICAgIGFuZCAoZnVuYy5ib3VuZC5uYW1lIGluIHR5cGVzIGlmIHR5cGVzIGVsc2UgVHJ1ZSkKKyAgICAgICAgYW5kIChmdW5jLm5hbWUgaW4gbWV0aG9kcyBpZiBtZXRob2RzIGVsc2UgVHJ1ZSkKKyAgICApCisKKworY2xhc3MgTG9nZ2luZ0NoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrcyB1c2Ugb2YgdGhlIGxvZ2dpbmcgbW9kdWxlLiIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBpbnRlcmZhY2VzLklBc3Ryb2lkQ2hlY2tlcgorICAgIG5hbWUgPSAibG9nZ2luZyIKKyAgICBtc2dzID0gTVNHUworCisgICAgb3B0aW9ucyA9ICgKKyAgICAgICAgKAorICAgICAgICAgICAgImxvZ2dpbmctbW9kdWxlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoImxvZ2dpbmciLCksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8Y29tbWEgc2VwYXJhdGVkIGxpc3Q+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJMb2dnaW5nIG1vZHVsZXMgdG8gY2hlY2sgdGhhdCB0aGUgc3RyaW5nIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgImFyZ3VtZW50cyBhcmUgaW4gbG9nZ2luZyBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9ybWF0LiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAibG9nZ2luZy1mb3JtYXQtc3R5bGUiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIm9sZCIsCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hvaWNlIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8b2xkICglKSBvciBuZXcgKHspPiIsCisgICAgICAgICAgICAgICAgImNob2ljZXMiOiBbIm9sZCIsICJuZXciXSwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJUaGUgdHlwZSBvZiBzdHJpbmcgZm9ybWF0dGluZyB0aGF0IGxvZ2dpbmcgbWV0aG9kcyBkby4gIgorICAgICAgICAgICAgICAgICJgb2xkYCBtZWFucyB1c2luZyAlIGZvcm1hdHRpbmcsIGBuZXdgIGlzIGZvciBge31gIGZvcm1hdHRpbmcuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBub2RlKTogICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgICAgICAiIiJDbGVhcnMgYW55IHN0YXRlIGxlZnQgaW4gdGhpcyBjaGVja2VyIGZyb20gbGFzdCBtb2R1bGUgY2hlY2tlZC4iIiIKKyAgICAgICAgIyBUaGUgY29kZSBiZWluZyBjaGVja2VkIGNhbiBqdXN0IGFzIGVhc2lseSAiaW1wb3J0IGxvZ2dpbmcgYXMgZm9vIiwKKyAgICAgICAgIyBzbyBpdCBpcyBuZWNlc3NhcnkgdG8gcHJvY2VzcyB0aGUgaW1wb3J0cyBhbmQgc3RvcmUgaW4gdGhpcyBmaWVsZAorICAgICAgICAjIHdoYXQgbmFtZSB0aGUgbG9nZ2luZyBtb2R1bGUgaXMgYWN0dWFsbHkgZ2l2ZW4uCisgICAgICAgIHNlbGYuX2xvZ2dpbmdfbmFtZXMgPSBzZXQoKQorICAgICAgICBsb2dnaW5nX21vZHMgPSBzZWxmLmNvbmZpZy5sb2dnaW5nX21vZHVsZXMKKworICAgICAgICBzZWxmLl9mb3JtYXRfc3R5bGUgPSBzZWxmLmNvbmZpZy5sb2dnaW5nX2Zvcm1hdF9zdHlsZQorCisgICAgICAgIHNlbGYuX2xvZ2dpbmdfbW9kdWxlcyA9IHNldChsb2dnaW5nX21vZHMpCisgICAgICAgIHNlbGYuX2Zyb21faW1wb3J0cyA9IHt9CisgICAgICAgIGZvciBsb2dnaW5nX21vZCBpbiBsb2dnaW5nX21vZHM6CisgICAgICAgICAgICBwYXJ0cyA9IGxvZ2dpbmdfbW9kLnJzcGxpdCgiLiIsIDEpCisgICAgICAgICAgICBpZiBsZW4ocGFydHMpID4gMToKKyAgICAgICAgICAgICAgICBzZWxmLl9mcm9tX2ltcG9ydHNbcGFydHNbMF1dID0gcGFydHNbMV0KKworICAgIGRlZiB2aXNpdF9pbXBvcnRmcm9tKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVja3MgdG8gc2VlIGlmIGEgbW9kdWxlIHVzZXMgYSBub24tUHl0aG9uIGxvZ2dpbmcgbW9kdWxlLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2dnaW5nX25hbWUgPSBzZWxmLl9mcm9tX2ltcG9ydHNbbm9kZS5tb2RuYW1lXQorICAgICAgICAgICAgZm9yIG1vZHVsZSwgYXNfbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgICAgIGlmIG1vZHVsZSA9PSBsb2dnaW5nX25hbWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ2dpbmdfbmFtZXMuYWRkKGFzX25hbWUgb3IgbW9kdWxlKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdmlzaXRfaW1wb3J0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVja3MgdG8gc2VlIGlmIHRoaXMgbW9kdWxlIHVzZXMgUHl0aG9uJ3MgYnVpbHQtaW4gbG9nZ2luZy4iIiIKKyAgICAgICAgZm9yIG1vZHVsZSwgYXNfbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgaWYgbW9kdWxlIGluIHNlbGYuX2xvZ2dpbmdfbW9kdWxlczoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2dnaW5nX25hbWVzLmFkZChhc19uYW1lIG9yIG1vZHVsZSkKKworICAgIEBjaGVja19tZXNzYWdlcygqTVNHUykKKyAgICBkZWYgdmlzaXRfY2FsbChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2tzIGNhbGxzIHRvIGxvZ2dpbmcgbWV0aG9kcy4iIiIKKworICAgICAgICBkZWYgaXNfbG9nZ2luZ19uYW1lKCk6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5mdW5jLCBhc3Ryb2lkLkF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmZ1bmMuZXhwciwgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgIGFuZCBub2RlLmZ1bmMuZXhwci5uYW1lIGluIHNlbGYuX2xvZ2dpbmdfbmFtZXMKKyAgICAgICAgICAgICkKKworICAgICAgICBkZWYgaXNfbG9nZ2VyX2NsYXNzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGluZmVycmVkIGluIG5vZGUuZnVuYy5pbmZlcigpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkJvdW5kTWV0aG9kKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IGluZmVycmVkLl9wcm94aWVkLnBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuQ2xhc3NEZWYpIGFuZCAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnFuYW1lKCkgPT0gImxvZ2dpbmcuTG9nZ2VyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFueSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IucW5hbWUoKSA9PSAibG9nZ2luZy5Mb2dnZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbmNlc3RvciBpbiBwYXJlbnQuYW5jZXN0b3JzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlLCBpbmZlcnJlZC5fcHJveGllZC5uYW1lCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5leGNlcHRpb25zLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJldHVybiBGYWxzZSwgTm9uZQorCisgICAgICAgIGlmIGlzX2xvZ2dpbmdfbmFtZSgpOgorICAgICAgICAgICAgbmFtZSA9IG5vZGUuZnVuYy5hdHRybmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LCBuYW1lID0gaXNfbG9nZ2VyX2NsYXNzKCkKKyAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NoZWNrX2xvZ19tZXRob2Qobm9kZSwgbmFtZSkKKworICAgIGRlZiBfY2hlY2tfbG9nX21ldGhvZChzZWxmLCBub2RlLCBuYW1lKToKKyAgICAgICAgIiIiQ2hlY2tzIGNhbGxzIHRvIGxvZ2dpbmcubG9nKGxldmVsLCBmb3JtYXQsICpmb3JtYXRfYXJncykuIiIiCisgICAgICAgIGlmIG5hbWUgPT0gImxvZyI6CisgICAgICAgICAgICBpZiBub2RlLnN0YXJhcmdzIG9yIG5vZGUua3dhcmdzIG9yIGxlbihub2RlLmFyZ3MpIDwgMjoKKyAgICAgICAgICAgICAgICAjIEVpdGhlciBhIG1hbGZvcm1lZCBjYWxsLCBzdGFyIGFyZ3MsIG9yIGRvdWJsZS1zdGFyIGFyZ3MuIEJleW9uZAorICAgICAgICAgICAgICAgICMgdGhlIHNjb3BlIG9mIHRoaXMgY2hlY2tlci4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvcm1hdF9wb3MgPSAxCisgICAgICAgIGVsaWYgbmFtZSBpbiBDSEVDS0VEX0NPTlZFTklFTkNFX0ZVTkNUSU9OUzoKKyAgICAgICAgICAgIGlmIG5vZGUuc3RhcmFyZ3Mgb3Igbm9kZS5rd2FyZ3Mgb3Igbm90IG5vZGUuYXJnczoKKyAgICAgICAgICAgICAgICAjIEVpdGhlciBubyBhcmdzLCBzdGFyIGFyZ3MsIG9yIGRvdWJsZS1zdGFyIGFyZ3MuIEJleW9uZCB0aGUKKyAgICAgICAgICAgICAgICAjIHNjb3BlIG9mIHRoaXMgY2hlY2tlci4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvcm1hdF9wb3MgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUuYXJnc1tmb3JtYXRfcG9zXSwgYXN0cm9pZC5CaW5PcCk6CisgICAgICAgICAgICBiaW5vcCA9IG5vZGUuYXJnc1tmb3JtYXRfcG9zXQorICAgICAgICAgICAgZW1pdCA9IGJpbm9wLm9wID09ICIlIgorICAgICAgICAgICAgaWYgYmlub3Aub3AgPT0gIisiOgorICAgICAgICAgICAgICAgIHRvdGFsX251bWJlcl9vZl9zdHJpbmdzID0gc3VtKAorICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICAgICAgICAgICAgIGZvciBvcGVyYW5kIGluIChiaW5vcC5sZWZ0LCBiaW5vcC5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfb3BlcmFuZF9saXRlcmFsX3N0cih1dGlscy5zYWZlX2luZmVyKG9wZXJhbmQpKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBlbWl0ID0gdG90YWxfbnVtYmVyX29mX3N0cmluZ3MgPiAwCisgICAgICAgICAgICBpZiBlbWl0OgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJsb2dnaW5nLW5vdC1sYXp5IiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICBhcmdzPShzZWxmLl9oZWxwZXJfc3RyaW5nKG5vZGUpLCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZS5hcmdzW2Zvcm1hdF9wb3NdLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfY2FsbF9mdW5jKG5vZGUuYXJnc1tmb3JtYXRfcG9zXSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUuYXJnc1tmb3JtYXRfcG9zXSwgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19mb3JtYXRfc3RyaW5nKG5vZGUsIGZvcm1hdF9wb3MpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLmFyZ3NbZm9ybWF0X3Bvc10sIGFzdHJvaWQuSm9pbmVkU3RyKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgImxvZ2dpbmctZnN0cmluZy1pbnRlcnBvbGF0aW9uIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5faGVscGVyX3N0cmluZyhub2RlKSwpLAorICAgICAgICAgICAgKQorCisgICAgZGVmIF9oZWxwZXJfc3RyaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDcmVhdGUgYSBzdHJpbmcgdGhhdCBsaXN0cyB0aGUgdmFsaWQgdHlwZXMgb2YgZm9ybWF0dGluZyBmb3IgdGhpcyBub2RlLiIiIgorICAgICAgICB2YWxpZF90eXBlcyA9IFsibGF6eSAlIl0KKworICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKAorICAgICAgICAgICAgImxvZ2dpbmctZnN0cmluZy1mb3JtYXR0aW5nIiwgbm9kZS5mcm9tbGluZW5vCisgICAgICAgICk6CisgICAgICAgICAgICB2YWxpZF90eXBlcy5hcHBlbmQoImZzdHJpbmciKQorICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKAorICAgICAgICAgICAgImxvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb24iLCBub2RlLmZyb21saW5lbm8KKyAgICAgICAgKToKKyAgICAgICAgICAgIHZhbGlkX3R5cGVzLmFwcGVuZCgiLmZvcm1hdCgpIikKKyAgICAgICAgaWYgbm90IHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgibG9nZ2luZy1ub3QtbGF6eSIsIG5vZGUuZnJvbWxpbmVubyk6CisgICAgICAgICAgICB2YWxpZF90eXBlcy5hcHBlbmQoIiUiKQorCisgICAgICAgIHJldHVybiAiIG9yICIuam9pbih2YWxpZF90eXBlcykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX29wZXJhbmRfbGl0ZXJhbF9zdHIob3BlcmFuZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmFuZCBpbiBhcmd1bWVudCBpcyBhIGxpdGVyYWwgc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvcGVyYW5kLCBhc3Ryb2lkLkNvbnN0KSBhbmQgb3BlcmFuZC5uYW1lID09ICJzdHIiCisKKyAgICBkZWYgX2NoZWNrX2NhbGxfZnVuYyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2tzIHRoYXQgZnVuY3Rpb24gY2FsbCBpcyBub3QgZm9ybWF0X3N0cmluZy5mb3JtYXQoKS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIG5vZGUgKGFzdHJvaWQubm9kZV9jbGFzc2VzLkNhbGwpOgorICAgICAgICAgICAgQ2FsbCBBU1Qgbm9kZSB0byBiZSBjaGVja2VkLgorICAgICAgICAiIiIKKyAgICAgICAgZnVuYyA9IHV0aWxzLnNhZmVfaW5mZXIobm9kZS5mdW5jKQorICAgICAgICB0eXBlcyA9ICgic3RyIiwgInVuaWNvZGUiKQorICAgICAgICBtZXRob2RzID0gKCJmb3JtYXQiLCkKKyAgICAgICAgaWYgaXNfbWV0aG9kX2NhbGwoZnVuYywgdHlwZXMsIG1ldGhvZHMpIGFuZCBub3QgaXNfY29tcGxleF9mb3JtYXRfc3RyKAorICAgICAgICAgICAgZnVuYy5ib3VuZAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAibG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbiIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYuX2hlbHBlcl9zdHJpbmcobm9kZSksKSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfZm9ybWF0X3N0cmluZyhzZWxmLCBub2RlLCBmb3JtYXRfYXJnKToKKyAgICAgICAgIiIiQ2hlY2tzIHRoYXQgZm9ybWF0IHN0cmluZyB0b2tlbnMgbWF0Y2ggdGhlIHN1cHBsaWVkIGFyZ3VtZW50cy4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIG5vZGUgKGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORyk6IEFTVCBub2RlIHRvIGJlIGNoZWNrZWQuCisgICAgICAgICAgZm9ybWF0X2FyZyAoaW50KTogSW5kZXggb2YgdGhlIGZvcm1hdCBzdHJpbmcgaW4gdGhlIG5vZGUgYXJndW1lbnRzLgorICAgICAgICAiIiIKKyAgICAgICAgbnVtX2FyZ3MgPSBfY291bnRfc3VwcGxpZWRfdG9rZW5zKG5vZGUuYXJnc1tmb3JtYXRfYXJnICsgMSA6XSkKKyAgICAgICAgaWYgbm90IG51bV9hcmdzOgorICAgICAgICAgICAgIyBJZiBubyBhcmdzIHdlcmUgc3VwcGxpZWQgdGhlIHN0cmluZyBpcyBub3QgaW50ZXJwb2xhdGVkIGFuZCBjYW4gY29udGFpbgorICAgICAgICAgICAgIyBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgLSBpdCdzIHVzZWQgdmVyYmF0aW0uIERvbid0IGNoZWNrIGFueSBmdXJ0aGVyLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IG5vZGUuYXJnc1tmb3JtYXRfYXJnXS52YWx1ZQorICAgICAgICByZXF1aXJlZF9udW1fYXJncyA9IDAKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmb3JtYXRfc3RyaW5nLCBieXRlcyk6CisgICAgICAgICAgICBmb3JtYXRfc3RyaW5nID0gZm9ybWF0X3N0cmluZy5kZWNvZGUoKQorICAgICAgICBpZiBpc2luc3RhbmNlKGZvcm1hdF9zdHJpbmcsIHN0cik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fZm9ybWF0X3N0eWxlID09ICJvbGQiOgorICAgICAgICAgICAgICAgICAgICBrZXl3b3JkX2FyZ3MsIHJlcXVpcmVkX251bV9hcmdzLCBfLCBfID0gdXRpbHMucGFyc2VfZm9ybWF0X3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBpZiBrZXl3b3JkX2FyZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEtleXdvcmQgY2hlY2tpbmcgb24gbG9nZ2luZyBzdHJpbmdzIGlzIGNvbXBsaWNhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwga2V5d29yZHMgLSBvdXQgb2Ygc2NvcGUuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2Zvcm1hdF9zdHlsZSA9PSAibmV3IjoKKyAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZF9hcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9wb3NfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0X3Bvc19hcmdzLAorICAgICAgICAgICAgICAgICAgICApID0gdXRpbHMucGFyc2VfZm9ybWF0X21ldGhvZF9zdHJpbmcoZm9ybWF0X3N0cmluZykKKworICAgICAgICAgICAgICAgICAgICBrZXl3b3JkX2FyZ3NfY250ID0gbGVuKAorICAgICAgICAgICAgICAgICAgICAgICAge2sgZm9yIGssIGwgaW4ga2V5d29yZF9hcmd1bWVudHMgaWYgbm90IGlzaW5zdGFuY2UoaywgaW50KX0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9udW1fYXJncyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRfYXJnc19jbnQgKyBpbXBsaWNpdF9wb3NfYXJncyArIGV4cGxpY2l0X3Bvc19hcmdzCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCB1dGlscy5VbnN1cHBvcnRlZEZvcm1hdENoYXJhY3RlciBhcyBleDoKKyAgICAgICAgICAgICAgICBjaGFyID0gZm9ybWF0X3N0cmluZ1tleC5pbmRleF0KKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAibG9nZ2luZy11bnN1cHBvcnRlZC1mb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGNoYXIsIG9yZChjaGFyKSwgZXguaW5kZXgpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCB1dGlscy5JbmNvbXBsZXRlRm9ybWF0U3RyaW5nOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImxvZ2dpbmctZm9ybWF0LXRydW5jYXRlZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbnVtX2FyZ3MgPiByZXF1aXJlZF9udW1fYXJnczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImxvZ2dpbmctdG9vLW1hbnktYXJncyIsIG5vZGU9bm9kZSkKKyAgICAgICAgZWxpZiBudW1fYXJncyA8IHJlcXVpcmVkX251bV9hcmdzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibG9nZ2luZy10b28tZmV3LWFyZ3MiLCBub2RlPW5vZGUpCisKKworZGVmIGlzX2NvbXBsZXhfZm9ybWF0X3N0cihub2RlKToKKyAgICAiIiJDaGVja3MgaWYgbm9kZSByZXByZXNlbnRzIGEgc3RyaW5nIHdpdGggY29tcGxleCBmb3JtYXR0aW5nIHNwZWNzLgorCisgICAgQXJnczoKKyAgICAgICAgbm9kZSAoYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKTogQVNUIG5vZGUgdG8gY2hlY2sKKyAgICBSZXR1cm5zOgorICAgICAgICBib29sOiBUcnVlIGlmIGluZmVycmVkIHN0cmluZyB1c2VzIGNvbXBsZXggZm9ybWF0dGluZywgRmFsc2Ugb3RoZXJ3aXNlCisgICAgIiIiCisgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKG5vZGUpCisgICAgaWYgaW5mZXJyZWQgaXMgTm9uZSBvciBub3QgKAorICAgICAgICBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNvbnN0KSBhbmQgaXNpbnN0YW5jZShpbmZlcnJlZC52YWx1ZSwgc3RyKQorICAgICk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgdHJ5OgorICAgICAgICBwYXJzZWQgPSBsaXN0KHN0cmluZy5Gb3JtYXR0ZXIoKS5wYXJzZShpbmZlcnJlZC52YWx1ZSkpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICMgVGhpcyBmb3JtYXQgc3RyaW5nIGlzIGludmFsaWQKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZm9yIF8sIF8sIGZvcm1hdF9zcGVjLCBfIGluIHBhcnNlZDoKKyAgICAgICAgaWYgZm9ybWF0X3NwZWM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBfY291bnRfc3VwcGxpZWRfdG9rZW5zKGFyZ3MpOgorICAgICIiIkNvdW50cyB0aGUgbnVtYmVyIG9mIHRva2VucyBpbiBhbiBhcmdzIGxpc3QuCisKKyAgICBUaGUgUHl0aG9uIGxvZyBmdW5jdGlvbnMgYWxsb3cgZm9yIHNwZWNpYWwga2V5d29yZCBhcmd1bWVudHM6IGZ1bmMsCisgICAgZXhjX2luZm8gYW5kIGV4dHJhLiBUbyBoYW5kbGUgdGhlc2UgY2FzZXMgY29ycmVjdGx5LCB3ZSBvbmx5IGNvdW50CisgICAgYXJndW1lbnRzIHRoYXQgYXJlbid0IGtleXdvcmRzLgorCisgICAgQXJnczoKKyAgICAgIGFyZ3MgKGxpc3QpOiBBU1Qgbm9kZXMgdGhhdCBhcmUgYXJndW1lbnRzIGZvciBhIGxvZyBmb3JtYXQgc3RyaW5nLgorCisgICAgUmV0dXJuczoKKyAgICAgIGludDogTnVtYmVyIG9mIEFTVCBub2RlcyB0aGF0IGFyZW4ndCBrZXl3b3Jkcy4KKyAgICAiIiIKKyAgICByZXR1cm4gc3VtKDEgZm9yIGFyZyBpbiBhcmdzIGlmIG5vdCBpc2luc3RhbmNlKGFyZywgYXN0cm9pZC5LZXl3b3JkKSkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJSZXF1aXJlZCBtZXRob2QgdG8gYXV0by1yZWdpc3RlciB0aGlzIGNoZWNrZXIuIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoTG9nZ2luZ0NoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9tYXByZWR1Y2VfY2hlY2tlci5weSBiL3B5bGludC9jaGVja2Vycy9tYXByZWR1Y2VfY2hlY2tlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmNjMDEyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL21hcHJlZHVjZV9jaGVja2VyLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDIwIEZyYW5rIEhhcnJpc29uIDxmcmFua0Bkb3VibGV0aGVmaXNoLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyYyBNdWVsbGVyIDwzMDEzMDM3MStjZGNlOHBAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCitpbXBvcnQgYWJjCisKKworY2xhc3MgTWFwUmVkdWNlTWl4aW4obWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKKyAgICAiIiJBIG1peGluIGRlc2lnbiB0byBhbGxvdyBtdWx0aXByb2Nlc3MvdGhyZWFkZWQgcnVucyBvZiBhIENoZWNrZXIiIiIKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgZ2V0X21hcF9kYXRhKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIG1lcmdhYmxlL3JlZHVjaWJsZSBkYXRhIHRoYXQgd2lsbCBiZSBleGFtaW5lZCIiIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiByZWR1Y2VfbWFwX2RhdGEoY2xzLCBsaW50ZXIsIGRhdGEpOgorICAgICAgICAiIiJGb3IgYSBnaXZlbiBDaGVja2VyLCByZWNlaXZlcyBkYXRhIGZvciBhbGwgbWFwcGVkIHJ1bnMiIiIKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9taXNjLnB5IGIvcHlsaW50L2NoZWNrZXJzL21pc2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlOTEyZgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9taXNjLnB5CkBAIC0wLDAgKzEsMTg3IEBACisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOS0yMDEzIExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQWxleGFuZHJ1IENvbWFuIDxmY29tYW5AYml0ZGVmZW5kZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IGdsZWdvdXggPGdpbGxlcy5sZWdvdXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBNaWtoYWlsIEZlc2Vua28gPHByb2dnZ2FAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUm9nYWxza2ksIEx1a2FzeiA8bHVrYXN6LnJvZ2Fsc2tpQGludGVsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1Y2FzIENpbW9uIDxsdWNhcy5jaW1vbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIHd0cmFjeSA8YWZpc2hpb25hZG9AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMCBCZW5ueSA8YmVubnkubXVlbGxlcjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEtvbnN0YW50aW5hIFNha2V0b3UgPDU2NTE1MzAzK2tzYWtldG91QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisKKyIiIkNoZWNrIHNvdXJjZSBjb2RlIGlzIGFzY2lpIG9ubHkgb3IgaGFzIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uIChQRVAgMjYzKSIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCB0b2tlbml6ZQorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElSYXdDaGVja2VyLCBJVG9rZW5DaGVja2VyCitmcm9tIHB5bGludC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlc0hhbmRsZXJNaXhJbgorZnJvbSBweWxpbnQudXRpbHMucHJhZ21hX3BhcnNlciBpbXBvcnQgT1BUSU9OX1BPLCBQcmFnbWFQYXJzZXJFcnJvciwgcGFyc2VfcHJhZ21hCisKKworY2xhc3MgQnlJZE1hbmFnZWRNZXNzYWdlc0NoZWNrZXIoQmFzZUNoZWNrZXIpOgorCisgICAgIiIiQ2hlY2tzIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBlbmFibGVkIG9yIGRpc2FibGVkIGJ5IGlkIGluc3RlYWQgb2Ygc3ltYm9sLiIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJUmF3Q2hlY2tlcgorICAgIG5hbWUgPSAibWlzY2VsbGFuZW91cyIKKyAgICBtc2dzID0geworICAgICAgICAiSTAwMjMiOiAoCisgICAgICAgICAgICAiJXMiLAorICAgICAgICAgICAgInVzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIG1lc3NhZ2UgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBieSBpZC4iLAorICAgICAgICApCisgICAgfQorICAgIG9wdGlvbnMgPSAoKQorCisgICAgZGVmIHByb2Nlc3NfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgICIiIkluc3BlY3QgdGhlIHNvdXJjZSBmaWxlIHRvIGZpbmQgbWVzc2FnZXMgYWN0aXZhdGVkIG9yIGRlYWN0aXZhdGVkIGJ5IGlkLiIiIgorICAgICAgICBtYW5hZ2VkX21zZ3MgPSBNZXNzYWdlc0hhbmRsZXJNaXhJbi5nZXRfYnlfaWRfbWFuYWdlZF9tc2dzKCkKKyAgICAgICAgZm9yIChtb2RfbmFtZSwgbXNnaWQsIHN5bWJvbCwgbGluZW5vLCBpc19kaXNhYmxlZCkgaW4gbWFuYWdlZF9tc2dzOgorICAgICAgICAgICAgaWYgbW9kX25hbWUgPT0gbW9kdWxlLm5hbWU6CisgICAgICAgICAgICAgICAgdmVyYiA9ICJkaXNhYmxlIiBpZiBpc19kaXNhYmxlZCBlbHNlICJlbmFibGUiCisgICAgICAgICAgICAgICAgdHh0ID0gZiIne21zZ2lkfScgaXMgY3J5cHRpYzogdXNlICcjIHB5bGludDoge3ZlcmJ9PXtzeW1ib2x9JyBpbnN0ZWFkIgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWQiLCBsaW5lPWxpbmVubywgYXJncz10eHQpCisgICAgICAgIE1lc3NhZ2VzSGFuZGxlck1peEluLmNsZWFyX2J5X2lkX21hbmFnZWRfbXNncygpCisKKworY2xhc3MgRW5jb2RpbmdDaGVja2VyKEJhc2VDaGVja2VyKToKKworICAgICIiImNoZWNrcyBmb3I6CisgICAgKiB3YXJuaW5nIG5vdGVzIGluIHRoZSBjb2RlIGxpa2UgRklYTUUsIFhYWAorICAgICogZW5jb2RpbmcgaXNzdWVzLgorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoSVJhd0NoZWNrZXIsIElUb2tlbkNoZWNrZXIpCisKKyAgICAjIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lCisgICAgbmFtZSA9ICJtaXNjZWxsYW5lb3VzIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJXMDUxMSI6ICgKKyAgICAgICAgICAgICIlcyIsCisgICAgICAgICAgICAiZml4bWUiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIHdhcm5pbmcgbm90ZSBhcyBGSVhNRSBvciBYWFggaXMgZGV0ZWN0ZWQuIiwKKyAgICAgICAgKQorICAgIH0KKworICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJub3RlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8Y29tbWEgc2VwYXJhdGVkIHZhbHVlcz4iLAorICAgICAgICAgICAgICAgICJkZWZhdWx0IjogKCJGSVhNRSIsICJYWFgiLCAiVE9ETyIpLAorICAgICAgICAgICAgICAgICJoZWxwIjogKAorICAgICAgICAgICAgICAgICAgICAiTGlzdCBvZiBub3RlIHRhZ3MgdG8gdGFrZSBpbiBjb25zaWRlcmF0aW9uLCAiCisgICAgICAgICAgICAgICAgICAgICJzZXBhcmF0ZWQgYnkgYSBjb21tYS4iCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJub3Rlcy1yZ3giLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHJlZ2V4cD4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIlJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBub3RlIHRhZ3MgdG8gdGFrZSBpbiBjb25zaWRlcmF0aW9uLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzdXBlcigpLm9wZW4oKQorCisgICAgICAgIG5vdGVzID0gInwiLmpvaW4ocmUuZXNjYXBlKG5vdGUpIGZvciBub3RlIGluIHNlbGYuY29uZmlnLm5vdGVzKQorICAgICAgICBpZiBzZWxmLmNvbmZpZy5ub3Rlc19yZ3g6CisgICAgICAgICAgICByZWdleF9zdHJpbmcgPSBmciIjXHMqKHtub3Rlc318e3NlbGYuY29uZmlnLm5vdGVzX3JneH0pXGIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWdleF9zdHJpbmcgPSByIiNccyooJXMpXGIiICUgKG5vdGVzKQorCisgICAgICAgIHNlbGYuX2ZpeG1lX3BhdHRlcm4gPSByZS5jb21waWxlKHJlZ2V4X3N0cmluZywgcmUuSSkKKworICAgIGRlZiBfY2hlY2tfZW5jb2Rpbmcoc2VsZiwgbGluZW5vLCBsaW5lLCBmaWxlX2VuY29kaW5nKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGxpbmUuZGVjb2RlKGZpbGVfZW5jb2RpbmcpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiIyIpIGFuZCAiY29kaW5nIiBpbiBsaW5lIGFuZCBmaWxlX2VuY29kaW5nIGluIGxpbmU6CisgICAgICAgICAgICAgICAgbXNnID0gZiJDYW5ub3QgZGVjb2RlIHVzaW5nIGVuY29kaW5nICd7ZmlsZV9lbmNvZGluZ30nLCBiYWQgZW5jb2RpbmciCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic3ludGF4LWVycm9yIiwgbGluZT1saW5lbm8sIGFyZ3M9bXNnKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHByb2Nlc3NfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgICIiImluc3BlY3QgdGhlIHNvdXJjZSBmaWxlIHRvIGZpbmQgZW5jb2RpbmcgcHJvYmxlbSIiIgorICAgICAgICBpZiBtb2R1bGUuZmlsZV9lbmNvZGluZzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gbW9kdWxlLmZpbGVfZW5jb2RpbmcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gImFzY2lpIgorCisgICAgICAgIHdpdGggbW9kdWxlLnN0cmVhbSgpIGFzIHN0cmVhbToKKyAgICAgICAgICAgIGZvciBsaW5lbm8sIGxpbmUgaW4gZW51bWVyYXRlKHN0cmVhbSk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfZW5jb2RpbmcobGluZW5vICsgMSwgbGluZSwgZW5jb2RpbmcpCisKKyAgICBkZWYgcHJvY2Vzc190b2tlbnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIiIiaW5zcGVjdCB0aGUgc291cmNlIHRvIGZpbmQgZml4bWUgcHJvYmxlbXMiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlnLm5vdGVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNvbW1lbnRzID0gKAorICAgICAgICAgICAgdG9rZW5faW5mbyBmb3IgdG9rZW5faW5mbyBpbiB0b2tlbnMgaWYgdG9rZW5faW5mby50eXBlID09IHRva2VuaXplLkNPTU1FTlQKKyAgICAgICAgKQorICAgICAgICBmb3IgY29tbWVudCBpbiBjb21tZW50czoKKyAgICAgICAgICAgIGNvbW1lbnRfdGV4dCA9IGNvbW1lbnQuc3RyaW5nWzE6XS5sc3RyaXAoKSAgIyB0cmltICcjJyBhbmQgd2hpdGVzcGFjZXMKKworICAgICAgICAgICAgIyBoYW5kbGUgcHlsaW50IGRpc2FibGUgY2xhdXNlcworICAgICAgICAgICAgZGlzYWJsZV9vcHRpb25fbWF0Y2ggPSBPUFRJT05fUE8uc2VhcmNoKGNvbW1lbnRfdGV4dCkKKyAgICAgICAgICAgIGlmIGRpc2FibGVfb3B0aW9uX21hdGNoOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHByYWdtYV9yZXByIGluICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JlcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwX3JlcCBpbiBwYXJzZV9wcmFnbWEoZGlzYWJsZV9vcHRpb25fbWF0Y2guZ3JvdXAoMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcF9yZXAuYWN0aW9uID09ICJkaXNhYmxlIgorICAgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZXh0ZW5kKHByYWdtYV9yZXByLm1lc3NhZ2VzKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgUHJhZ21hUGFyc2VyRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFByaW50aW5nIHVzZWZ1bCBpbmZvcm1hdGlvbiBkZWFsaW5nIHdpdGggdGhpcyBlcnJvciBpcyBkb25lIGluIHRoZSBsaW50IHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgaWYgc2V0KHZhbHVlcykgJiBzZXQoc2VsZi5jb25maWcubm90ZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQtaW5saW5lLW9wdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPWRpc2FibGVfb3B0aW9uX21hdGNoLmdyb3VwKDEpLnN0cmlwKCksCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPWNvbW1lbnQuc3RhcnRbMF0sCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBlbWl0IHdhcm5pbmdzIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLl9maXhtZV9wYXR0ZXJuLnNlYXJjaCgiIyIgKyBjb21tZW50X3RleHQubG93ZXIoKSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJmaXhtZSIsCisgICAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQ9Y29tbWVudC5zdGFydFsxXSArIDEsCisgICAgICAgICAgICAgICAgICAgIGFyZ3M9Y29tbWVudF90ZXh0LAorICAgICAgICAgICAgICAgICAgICBsaW5lPWNvbW1lbnQuc3RhcnRbMF0sCisgICAgICAgICAgICAgICAgKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiInJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlciIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEVuY29kaW5nQ2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEJ5SWRNYW5hZ2VkTWVzc2FnZXNDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvbmV3c3R5bGUucHkgYi9weWxpbnQvY2hlY2tlcnMvbmV3c3R5bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzMzQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9uZXdzdHlsZS5weQpAQCAtMCwwICsxLDEzNSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDgtMjAxMSwgMjAxMy0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFsIE5vd2lrb3dza2kgPGdvZGZyeWRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhhbmRlciBUb2Rvcm92IDxhdG9kb3JvdkBvdGIuYmc+CisjIENvcHlyaWdodCAoYykgMjAxNiBKYWt1YiBXaWxrIDxqd2lsa0Bqd2lsay5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxOCBMdWNhcyBDaW1vbiA8bHVjYXMuY2ltb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTmF0YWxpZSBTZXJlYnJ5YWtvdmEgPG5hdGFsaWUuc2VyZWJyeWFrb3ZhQE5hdGFsaWVzLU1hY0Jvb2stUHJvLmxvY2FsPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFJvYmVydCBTY2h3ZWl6ZXIgPHJvYmVydF9zY2h3ZWl6ZXJAZ214LmRlPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyYyBNdWVsbGVyIDwzMDEzMDM3MStjZGNlOHBAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiImNoZWNrIGZvciBuZXcgLyBvbGQgc3R5bGUgcmVsYXRlZCBwcm9ibGVtcworIiIiCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBjaGVja19tZXNzYWdlcywgaGFzX2tub3duX2Jhc2VzLCBub2RlX2ZyYW1lX2NsYXNzCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJQXN0cm9pZENoZWNrZXIKKworTVNHUyA9IHsKKyAgICAiRTEwMDMiOiAoCisgICAgICAgICJCYWQgZmlyc3QgYXJndW1lbnQgJXIgZ2l2ZW4gdG8gc3VwZXIoKSIsCisgICAgICAgICJiYWQtc3VwZXItY2FsbCIsCisgICAgICAgICJVc2VkIHdoZW4gYW5vdGhlciBhcmd1bWVudCB0aGFuIHRoZSBjdXJyZW50IGNsYXNzIGlzIGdpdmVuIGFzICIKKyAgICAgICAgImZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdXBlciBidWlsdGluLiIsCisgICAgKQorfQorCisKK2NsYXNzIE5ld1N0eWxlQ29uZmxpY3RDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAiIiJjaGVja3MgZm9yIHVzYWdlIG9mIG5ldyBzdHlsZSBjYXBhYmlsaXRpZXMgb24gb2xkIHN0eWxlIGNsYXNzZXMgYW5kCisgICAgb3RoZXIgbmV3L29sZCBzdHlsZXMgY29uZmxpY3RzIHByb2JsZW1zCisgICAgKiB1c2Ugb2YgcHJvcGVydHksIF9fc2xvdHNfXywgc3VwZXIKKyAgICAqICJzdXBlciIgdXNhZ2UKKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisKKyAgICAjIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lCisgICAgbmFtZSA9ICJuZXdzdHlsZSIKKyAgICAjIG1lc3NhZ2VzCisgICAgbXNncyA9IE1TR1MKKyAgICBwcmlvcml0eSA9IC0yCisgICAgIyBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAgICBvcHRpb25zID0gKCkKKworICAgIEBjaGVja19tZXNzYWdlcygiYmFkLXN1cGVyLWNhbGwiKQorICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgdXNlIG9mIHN1cGVyIiIiCisgICAgICAgICMgaWdub3JlIGFjdHVhbCBmdW5jdGlvbnMgb3IgbWV0aG9kIHdpdGhpbiBhIG5ldyBzdHlsZSBjbGFzcworICAgICAgICBpZiBub3Qgbm9kZS5pc19tZXRob2QoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBrbGFzcyA9IG5vZGUucGFyZW50LmZyYW1lKCkKKyAgICAgICAgZm9yIHN0bXQgaW4gbm9kZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgaWYgbm9kZV9mcmFtZV9jbGFzcyhzdG10KSAhPSBub2RlX2ZyYW1lX2NsYXNzKG5vZGUpOgorICAgICAgICAgICAgICAgICMgRG9uJ3QgbG9vayBkb3duIGluIG90aGVyIHNjb3Blcy4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBleHByID0gc3RtdC5mdW5jCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleHByLCBhc3Ryb2lkLkF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgY2FsbCA9IGV4cHIuZXhwcgorICAgICAgICAgICAgIyBza2lwIHRoZSB0ZXN0IGlmIHVzaW5nIHN1cGVyCisgICAgICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoY2FsbCwgYXN0cm9pZC5DYWxsKQorICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGNhbGwuZnVuYywgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgIGFuZCBjYWxsLmZ1bmMubmFtZSA9PSAic3VwZXIiCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgc3VwZXIgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIGFuIG9sZCBzdHlsZSBjbGFzcworICAgICAgICAgICAgaWYga2xhc3MubmV3c3R5bGUgb3Igbm90IGhhc19rbm93bl9iYXNlcyhrbGFzcyk6CisgICAgICAgICAgICAgICAgIyBzdXBlciBmaXJzdCBhcmcgc2hvdWxkIG5vdCBiZSB0aGUgY2xhc3MKKyAgICAgICAgICAgICAgICBpZiBub3QgY2FsbC5hcmdzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyBjYWxsaW5nIHN1cGVyKHR5cGUoc2VsZiksIHNlbGYpIGNhbiBsZWFkIHRvIHJlY3Vyc2lvbiBsb29wCisgICAgICAgICAgICAgICAgIyBpbiBkZXJpdmVkIGNsYXNzZXMKKyAgICAgICAgICAgICAgICBhcmcwID0gY2FsbC5hcmdzWzBdCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGFyZzAsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoYXJnMC5mdW5jLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBhcmcwLmZ1bmMubmFtZSA9PSAidHlwZSIKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJiYWQtc3VwZXItY2FsbCIsIG5vZGU9Y2FsbCwgYXJncz0oInR5cGUiLCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIGNhbGxpbmcgc3VwZXIoc2VsZi5fX2NsYXNzX18sIHNlbGYpIGNhbiBsZWFkIHRvIHJlY3Vyc2lvbiBsb29wCisgICAgICAgICAgICAgICAgIyBpbiBkZXJpdmVkIGNsYXNzZXMKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIGxlbihjYWxsLmFyZ3MpID49IDIKKyAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoY2FsbC5hcmdzWzFdLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBjYWxsLmFyZ3NbMV0ubmFtZSA9PSAic2VsZiIKKyAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoYXJnMCwgYXN0cm9pZC5BdHRyaWJ1dGUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBhcmcwLmF0dHJuYW1lID09ICJfX2NsYXNzX18iCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQtc3VwZXItY2FsbCIsIG5vZGU9Y2FsbCwgYXJncz0oInNlbGYuX19jbGFzc19fIiwpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3VwY2xzID0gY2FsbC5hcmdzIGFuZCBuZXh0KGNhbGwuYXJnc1swXS5pbmZlcigpLCBOb25lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYga2xhc3MgaXMgbm90IHN1cGNsczoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgIyBpZiBzdXBjbHMgaXMgbm90IFVuaW5mZXJhYmxlLCB0aGVuIHN1cGNscyB3YXMgaW5mZXJyZWQKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgdXNlIGl0cyBuYW1lLiBPdGhlcndpc2UsIHRyeSB0byBsb29rCisgICAgICAgICAgICAgICAgICAgICMgZm9yIGNhbGwuYXJnc1swXS5uYW1lCisgICAgICAgICAgICAgICAgICAgIGlmIHN1cGNsczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzdXBjbHMubmFtZQorICAgICAgICAgICAgICAgICAgICBlbGlmIGNhbGwuYXJncyBhbmQgaGFzYXR0cihjYWxsLmFyZ3NbMF0sICJuYW1lIik6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gY2FsbC5hcmdzWzBdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhZC1zdXBlci1jYWxsIiwgbm9kZT1jYWxsLCBhcmdzPShuYW1lLCkpCisKKyAgICB2aXNpdF9hc3luY2Z1bmN0aW9uZGVmID0gdmlzaXRfZnVuY3Rpb25kZWYKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihOZXdTdHlsZUNvbmZsaWN0Q2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2NoZWNrZXJzL3B5dGhvbjMucHkgYi9weWxpbnQvY2hlY2tlcnMvcHl0aG9uMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I3NTM0Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL3B5dGhvbjMucHkKQEAgLTAsMCArMSwxNDMzIEBACisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBTaW11IFRvbmkgPHNpbXV0b25pQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IENvc21pbiBQb2llYW5hIDxjbWluQHJvcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFZpb3JlbCBTdGlyYnUgPHZpb3JlbHNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggSmFrdWIgV2lsayA8andpbGtAandpbGsubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyBSb3kgV2lsbGlhbXMgPHJveS53aWxsaWFtcy5paWlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgUm95IFdpbGxpYW1zIDxyd2lsbGlhbXNAbHlmdC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBFcmlrIDxlcmlrLmVyaWtzc29uQHlhaG9vLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IERhbmllbCBNaWxsZXIgPG1pbGxlcmRldkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBhaGlybmlzaCA8YWhpcm5pc2hAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNiYWdhbiA8cG5sYmFnYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVjYXMgQ2ltb24gPGx1Y2FzLmNpbW9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEFpdmFyIEFubmFtYWEgPGFpdmFyYW5uYW1hYUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxOCBnYXVyaWtob2xrYXIgPGYyMDEzMDAyQGdvYS5iaXRzLXBpbGFuaS5hYy5pbj4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBOaWNrIERyb3pkIDxuaWNob2xhc2Ryb3pkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z3VlcyBCcnVhbnQgPGh1Z3Vlcy5icnVhbnRAYWZmaXJtLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEdhYnJpZWwgUiBTZXplZnJlZG8gPGdhYnJpZWxAc2V6ZWZyZWRvLmNvbS5icj4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgYmx1ZXNoZWVwdG9rZW4gPGxvdWlzLmZydWxldXgxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFBldGVyIEtvbGJ1cyA8cGV0ZXIua29sYnVzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIOiwreS5nem8jiA8MTA5MjI0NTczQHFxLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEZlZGVyaWNvIEJvbmQgPGZlZGVyaWNvYm9uZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBdGhvcyBSaWJlaXJvIDxhdGhvc2NyQGZlZG9yYXByb2plY3Qub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyYyBNdWVsbGVyIDwzMDEzMDM3MStjZGNlOHBAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgYm90IDxib3RAbm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgVGlhZ28gSG9ub3JhdG8gPHRpYWdvaG9ub3JhdG8xQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIHRpYWdvaG9ub3JhdG8gPDYxMDU5MjQzK3RpYWdvaG9ub3JhdG9AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJDaGVjayBQeXRob24gMiBjb2RlIGZvciBQeXRob24gMi8zIHNvdXJjZS1jb21wYXRpYmxlIGlzc3Vlcy4iIiIKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCByZQoraW1wb3J0IHRva2VuaXplCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycywgaW50ZXJmYWNlcworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IHV0aWxzCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgZmluZF90cnlfZXhjZXB0X3dyYXBwZXJfbm9kZSwgbm9kZV9pZ25vcmVzX2V4Y2VwdGlvbgorZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCBXYXJuaW5nU2NvcGUKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElORkVSRU5DRSwgSU5GRVJFTkNFX0ZBSUxVUkUKKworX1pFUk8gPSByZS5jb21waWxlKCJeMCskIikKKworCitkZWYgX2lzX29sZF9vY3RhbChsaXRlcmFsKToKKyAgICBpZiBfWkVSTy5tYXRjaChsaXRlcmFsKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgcmUubWF0Y2gociIwXGQrIiwgbGl0ZXJhbCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGludChsaXRlcmFsLCA4KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBOb25lCisKKworZGVmIF9pbmZlcnJlZF92YWx1ZV9pc19kaWN0KHZhbHVlKToKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLkRpY3QpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLkluc3RhbmNlKSBhbmQgImRpY3QiIGluIHZhbHVlLmJhc2VuYW1lcworCisKK2RlZiBfaW5mZXJfaWZfcmVsZXZhbnRfYXR0cihub2RlLCByZWxldmFudF9hdHRycyk6CisgICAgcmV0dXJuIG5vZGUuZXhwci5pbmZlcigpIGlmIG5vZGUuYXR0cm5hbWUgaW4gcmVsZXZhbnRfYXR0cnMgZWxzZSBbXQorCisKK2RlZiBfaXNfYnVpbHRpbihub2RlKToKKyAgICByZXR1cm4gZ2V0YXR0cihub2RlLCAibmFtZSIsIE5vbmUpIGluICgiX19idWlsdGluX18iLCAiYnVpbHRpbnMiKQorCisKK19BQ0NFUFRTX0lURVJBVE9SID0geworICAgICJpdGVyIiwKKyAgICAibGlzdCIsCisgICAgInR1cGxlIiwKKyAgICAic29ydGVkIiwKKyAgICAic2V0IiwKKyAgICAic3VtIiwKKyAgICAiYW55IiwKKyAgICAiYWxsIiwKKyAgICAiZW51bWVyYXRlIiwKKyAgICAiZGljdCIsCisgICAgImZpbHRlciIsCisgICAgInJldmVyc2VkIiwKKyAgICAibWF4IiwKKyAgICAibWluIiwKKyAgICAiZnJvemVuc2V0IiwKKyAgICAiT3JkZXJlZERpY3QiLAorICAgICJ6aXAiLAorICAgICJtYXAiLAorfQorQVRUUklCVVRFU19BQ0NFUFRTX0lURVJBVE9SID0geyJqb2luIiwgImZyb21faXRlcmFibGUifQorX0JVSUxUSU5fTUVUSE9EX0FDQ0VQVFNfSVRFUkFUT1IgPSB7CisgICAgImJ1aWx0aW5zLmxpc3QuZXh0ZW5kIiwKKyAgICAiYnVpbHRpbnMuZGljdC51cGRhdGUiLAorICAgICJidWlsdGlucy5zZXQudXBkYXRlIiwKK30KK0RJQ1RfTUVUSE9EUyA9IHsiaXRlbXMiLCAia2V5cyIsICJ2YWx1ZXMifQorCisKK2RlZiBfaW5faXRlcmF0aW5nX2NvbnRleHQobm9kZSk6CisgICAgIiIiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgYmVpbmcgdXNlZCBhcyBhbiBpdGVyYXRvci4KKworICAgIERlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwuaW5fc3BlY2lhbF9jb250ZXh0KCkuCisgICAgIiIiCisgICAgcGFyZW50ID0gbm9kZS5wYXJlbnQKKyAgICAjIFNpbmNlIGEgY2FsbCBjYW4ndCBiZSB0aGUgbG9vcCB2YXJpYW50IHdlIG9ubHkgbmVlZCB0byBrbm93IGlmIHRoZSBub2RlJ3MKKyAgICAjIHBhcmVudCBpcyBhICdmb3InIGxvb3AgdG8ga25vdyBpdCdzIGJlaW5nIHVzZWQgYXMgdGhlIGl0ZXJhdG9yIGZvciB0aGUKKyAgICAjIGxvb3AuCisgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuRm9yKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICAjIE5lZWQgdG8gbWFrZSBzdXJlIHRoZSB1c2Ugb2YgdGhlIG5vZGUgaXMgaW4gdGhlIGl0ZXJhdG9yIHBhcnQgb2YgdGhlCisgICAgIyBjb21wcmVoZW5zaW9uLgorICAgIGlmIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLkNvbXByZWhlbnNpb24pOgorICAgICAgICBpZiBwYXJlbnQuaXRlciA9PSBub2RlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAjIFZhcmlvdXMgYnVpbHQtaW5zIGNhbiB0YWtlIGluIGFuIGl0ZXJhYmxlIG9yIGxpc3QgYW5kIGxlYWQgdG8gdGhlIHNhbWUKKyAgICAjIHZhbHVlLgorICAgIGVsaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyZW50LmZ1bmMsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICBpZiBwYXJlbnQuZnVuYy5uYW1lIGluIF9BQ0NFUFRTX0lURVJBVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXJlbnQuZnVuYywgYXN0cm9pZC5BdHRyaWJ1dGUpOgorICAgICAgICAgICAgaWYgcGFyZW50LmZ1bmMuYXR0cm5hbWUgaW4gQVRUUklCVVRFU19BQ0NFUFRTX0lURVJBVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKHBhcmVudC5mdW5jKQorICAgICAgICBpZiBpbmZlcnJlZDoKKyAgICAgICAgICAgIGlmIGluZmVycmVkLnFuYW1lKCkgaW4gX0JVSUxUSU5fTUVUSE9EX0FDQ0VQVFNfSVRFUkFUT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJvb3QgPSBpbmZlcnJlZC5yb290KCkKKyAgICAgICAgICAgIGlmIHJvb3QgYW5kIHJvb3QubmFtZSA9PSAiaXRlcnRvb2xzIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICMgSWYgdGhlIGNhbGwgaXMgaW4gYW4gdW5wYWNraW5nLCB0aGVyZSdzIG5vIG5lZWQgdG8gd2FybiwKKyAgICAjIHNpbmNlIGl0IGNhbiBiZSBjb25zaWRlcmVkIGl0ZXJhdGluZy4KKyAgICBlbGlmIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLkFzc2lnbikgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgIHBhcmVudC50YXJnZXRzWzBdLCAoYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlR1cGxlKQorICAgICk6CisgICAgICAgIGlmIGxlbihwYXJlbnQudGFyZ2V0c1swXS5lbHRzKSA+IDE6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICMgSWYgdGhlIGNhbGwgaXMgaW4gYSBjb250YWlubWVudCBjaGVjaywgd2UgY29uc2lkZXIgdGhhdCB0bworICAgICMgYmUgYW4gaXRlcmF0aW5nIGNvbnRleHQKKyAgICBlbGlmICgKKyAgICAgICAgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuQ29tcGFyZSkKKyAgICAgICAgYW5kIGxlbihwYXJlbnQub3BzKSA9PSAxCisgICAgICAgIGFuZCBwYXJlbnQub3BzWzBdWzBdIGluIFsiaW4iLCAibm90IGluIl0KKyAgICApOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgICMgQWxzbyBpZiBpdCdzIGFuIGB5aWVsZCBmcm9tYCwgdGhhdCdzIGZhaXIKKyAgICBlbGlmIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLllpZWxkRnJvbSk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuU3RhcnJlZCk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9pc19jb25kaXRpb25hbF9pbXBvcnQobm9kZSk6CisgICAgIiIiQ2hlY2tzIGlmIGFuIGltcG9ydCBub2RlIGlzIGluIHRoZSBjb250ZXh0IG9mIGEgY29uZGl0aW9uYWwuIiIiCisgICAgcGFyZW50ID0gbm9kZS5wYXJlbnQKKyAgICByZXR1cm4gaXNpbnN0YW5jZSgKKyAgICAgICAgcGFyZW50LCAoYXN0cm9pZC5UcnlFeGNlcHQsIGFzdHJvaWQuRXhjZXB0SGFuZGxlciwgYXN0cm9pZC5JZiwgYXN0cm9pZC5JZkV4cCkKKyAgICApCisKKworQnJhbmNoID0gbmFtZWR0dXBsZSgiQnJhbmNoIiwgWyJub2RlIiwgImlzX3B5Ml9vbmx5Il0pCisKKworY2xhc3MgUHl0aG9uM0NoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorCisgICAgX19pbXBsZW1lbnRzX18gPSBpbnRlcmZhY2VzLklBc3Ryb2lkQ2hlY2tlcgorICAgIGVuYWJsZWQgPSBGYWxzZQorICAgIG5hbWUgPSAicHl0aG9uMyIKKworICAgIG1zZ3MgPSB7CisgICAgICAgICMgRXJyb3JzIGZvciB3aGF0IHdpbGwgc3ludGFjdGljYWxseSBicmVhayBpbiBQeXRob24gMywgd2FybmluZ3MgZm9yCisgICAgICAgICMgZXZlcnl0aGluZyBlbHNlLgorICAgICAgICAiRTE2MDEiOiAoCisgICAgICAgICAgICAicHJpbnQgc3RhdGVtZW50IHVzZWQiLAorICAgICAgICAgICAgInByaW50LXN0YXRlbWVudCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgcHJpbnQgc3RhdGVtZW50IGlzIHVzZWQgIgorICAgICAgICAgICAgIihgcHJpbnRgIGlzIGEgZnVuY3Rpb24gaW4gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUxNjAyIjogKAorICAgICAgICAgICAgIlBhcmFtZXRlciB1bnBhY2tpbmcgc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICJwYXJhbWV0ZXItdW5wYWNraW5nIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gcGFyYW1ldGVyIHVucGFja2luZyBpcyBzcGVjaWZpZWQgZm9yIGEgZnVuY3Rpb24iCisgICAgICAgICAgICAiKFB5dGhvbiAzIGRvZXNuJ3QgYWxsb3cgaXQpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUxNjAzIjogKAorICAgICAgICAgICAgIkltcGxpY2l0IHVucGFja2luZyBvZiBleGNlcHRpb25zIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDMiLAorICAgICAgICAgICAgInVucGFja2luZy1pbi1leGNlcHQiLAorICAgICAgICAgICAgIlB5dGhvbjMgd2lsbCBub3QgYWxsb3cgaW1wbGljaXQgdW5wYWNraW5nIG9mICIKKyAgICAgICAgICAgICJleGNlcHRpb25zIGluIGV4Y2VwdCBjbGF1c2VzLiAiCisgICAgICAgICAgICAiU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTMxMTAvIiwKKyAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiVzA3MTIiLCAib2xkLXVucGFja2luZy1pbi1leGNlcHQiKV19LAorICAgICAgICApLAorICAgICAgICAiRTE2MDQiOiAoCisgICAgICAgICAgICAiVXNlIHJhaXNlIEVycm9yQ2xhc3MoYXJncykgaW5zdGVhZCBvZiByYWlzZSBFcnJvckNsYXNzLCBhcmdzLiIsCisgICAgICAgICAgICAib2xkLXJhaXNlLXN5bnRheCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBhbHRlcm5hdGUgcmFpc2Ugc3ludGF4ICIKKyAgICAgICAgICAgICIncmFpc2UgZm9vLCBiYXInIGlzIHVzZWQgIgorICAgICAgICAgICAgImluc3RlYWQgb2YgJ3JhaXNlIGZvbyhiYXIpJy4iLAorICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMDEyMSIsICJvbGQtb2xkLXJhaXNlLXN5bnRheCIpXX0sCisgICAgICAgICksCisgICAgICAgICJFMTYwNSI6ICgKKyAgICAgICAgICAgICJVc2Ugb2YgdGhlIGBgIG9wZXJhdG9yIiwKKyAgICAgICAgICAgICJiYWNrdGljayIsCisgICAgICAgICAgICAnVXNlZCB3aGVuIHRoZSBkZXByZWNhdGVkICJgYCIgKGJhY2t0aWNrKSBvcGVyYXRvciBpcyB1c2VkICcKKyAgICAgICAgICAgICJpbnN0ZWFkICBvZiB0aGUgc3RyKCkgZnVuY3Rpb24uIiwKKyAgICAgICAgICAgIHsic2NvcGUiOiBXYXJuaW5nU2NvcGUuTk9ERSwgIm9sZF9uYW1lcyI6IFsoIlcwMzMzIiwgIm9sZC1iYWNrdGljayIpXX0sCisgICAgICAgICksCisgICAgICAgICJFMTYwOSI6ICgKKyAgICAgICAgICAgICJJbXBvcnQgKiBvbmx5IGFsbG93ZWQgYXQgbW9kdWxlIGxldmVsIiwKKyAgICAgICAgICAgICJpbXBvcnQtc3Rhci1tb2R1bGUtbGV2ZWwiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgaW1wb3J0IHN0YXIgc3ludGF4IGlzIHVzZWQgc29tZXdoZXJlICIKKyAgICAgICAgICAgICJlbHNlIHRoYW4gdGhlIG1vZHVsZSBsZXZlbC4iLAorICAgICAgICAgICAgeyJtYXh2ZXJzaW9uIjogKDMsIDApfSwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjAxIjogKAorICAgICAgICAgICAgImFwcGx5IGJ1aWx0LWluIHJlZmVyZW5jZWQiLAorICAgICAgICAgICAgImFwcGx5LWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgYXBwbHkgYnVpbHQtaW4gZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAiKG1pc3NpbmcgZnJvbSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MDIiOiAoCisgICAgICAgICAgICAiYmFzZXN0cmluZyBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJiYXNlc3RyaW5nLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgYmFzZXN0cmluZyBidWlsdC1pbiBmdW5jdGlvbiBpcyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICIobWlzc2luZyBmcm9tIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYwMyI6ICgKKyAgICAgICAgICAgICJidWZmZXIgYnVpbHQtaW4gcmVmZXJlbmNlZCIsCisgICAgICAgICAgICAiYnVmZmVyLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgYnVmZmVyIGJ1aWx0LWluIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgIgorICAgICAgICAgICAgIihtaXNzaW5nIGZyb20gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjA0IjogKAorICAgICAgICAgICAgImNtcCBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJjbXAtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBjbXAgYnVpbHQtaW4gZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAiKG1pc3NpbmcgZnJvbSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MDUiOiAoCisgICAgICAgICAgICAiY29lcmNlIGJ1aWx0LWluIHJlZmVyZW5jZWQiLAorICAgICAgICAgICAgImNvZXJjZS1idWlsdGluIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIGNvZXJjZSBidWlsdC1pbiBmdW5jdGlvbiBpcyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICIobWlzc2luZyBmcm9tIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYwNiI6ICgKKyAgICAgICAgICAgICJleGVjZmlsZSBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJleGVjZmlsZS1idWlsdGluIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIGV4ZWNmaWxlIGJ1aWx0LWluIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgIgorICAgICAgICAgICAgIihtaXNzaW5nIGZyb20gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjA3IjogKAorICAgICAgICAgICAgImZpbGUgYnVpbHQtaW4gcmVmZXJlbmNlZCIsCisgICAgICAgICAgICAiZmlsZS1idWlsdGluIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIGZpbGUgYnVpbHQtaW4gZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAiKG1pc3NpbmcgZnJvbSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MDgiOiAoCisgICAgICAgICAgICAibG9uZyBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJsb25nLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgbG9uZyBidWlsdC1pbiBmdW5jdGlvbiBpcyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICIobWlzc2luZyBmcm9tIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYwOSI6ICgKKyAgICAgICAgICAgICJyYXdfaW5wdXQgYnVpbHQtaW4gcmVmZXJlbmNlZCIsCisgICAgICAgICAgICAicmF3X2lucHV0LWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgcmF3X2lucHV0IGJ1aWx0LWluIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgIgorICAgICAgICAgICAgIihtaXNzaW5nIGZyb20gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjEwIjogKAorICAgICAgICAgICAgInJlZHVjZSBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJyZWR1Y2UtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSByZWR1Y2UgYnVpbHQtaW4gZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAiKG1pc3NpbmcgZnJvbSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MTEiOiAoCisgICAgICAgICAgICAiU3RhbmRhcmRFcnJvciBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJzdGFuZGFyZGVycm9yLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgU3RhbmRhcmRFcnJvciBidWlsdC1pbiBmdW5jdGlvbiBpcyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICIobWlzc2luZyBmcm9tIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYxMiI6ICgKKyAgICAgICAgICAgICJ1bmljb2RlIGJ1aWx0LWluIHJlZmVyZW5jZWQiLAorICAgICAgICAgICAgInVuaWNvZGUtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSB1bmljb2RlIGJ1aWx0LWluIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgIgorICAgICAgICAgICAgIihtaXNzaW5nIGZyb20gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjEzIjogKAorICAgICAgICAgICAgInhyYW5nZSBidWlsdC1pbiByZWZlcmVuY2VkIiwKKyAgICAgICAgICAgICJ4cmFuZ2UtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSB4cmFuZ2UgYnVpbHQtaW4gZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAiKG1pc3NpbmcgZnJvbSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MTQiOiAoCisgICAgICAgICAgICAiX19jb2VyY2VfXyBtZXRob2QgZGVmaW5lZCIsCisgICAgICAgICAgICAiY29lcmNlLW1ldGhvZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgX19jb2VyY2VfXyBtZXRob2QgaXMgZGVmaW5lZCAiCisgICAgICAgICAgICAiKG1ldGhvZCBpcyBub3QgdXNlZCBieSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MTUiOiAoCisgICAgICAgICAgICAiX19kZWxzbGljZV9fIG1ldGhvZCBkZWZpbmVkIiwKKyAgICAgICAgICAgICJkZWxzbGljZS1tZXRob2QiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fZGVsc2xpY2VfXyBtZXRob2QgaXMgZGVmaW5lZCAiCisgICAgICAgICAgICAiKG1ldGhvZCBpcyBub3QgdXNlZCBieSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MTYiOiAoCisgICAgICAgICAgICAiX19nZXRzbGljZV9fIG1ldGhvZCBkZWZpbmVkIiwKKyAgICAgICAgICAgICJnZXRzbGljZS1tZXRob2QiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fZ2V0c2xpY2VfXyBtZXRob2QgaXMgZGVmaW5lZCAiCisgICAgICAgICAgICAiKG1ldGhvZCBpcyBub3QgdXNlZCBieSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MTciOiAoCisgICAgICAgICAgICAiX19zZXRzbGljZV9fIG1ldGhvZCBkZWZpbmVkIiwKKyAgICAgICAgICAgICJzZXRzbGljZS1tZXRob2QiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fc2V0c2xpY2VfXyBtZXRob2QgaXMgZGVmaW5lZCAiCisgICAgICAgICAgICAiKG1ldGhvZCBpcyBub3QgdXNlZCBieSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MTgiOiAoCisgICAgICAgICAgICAiaW1wb3J0IG1pc3NpbmcgYGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0YCIsCisgICAgICAgICAgICAibm8tYWJzb2x1dGUtaW1wb3J0IiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gaW1wb3J0IGlzIG5vdCBhY2NvbXBhbmllZCBieSAiCisgICAgICAgICAgICAiYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydGBgICIKKyAgICAgICAgICAgICIoZGVmYXVsdCBiZWhhdmlvdXIgaW4gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjE5IjogKAorICAgICAgICAgICAgImRpdmlzaW9uIHcvbyBfX2Z1dHVyZV9fIHN0YXRlbWVudCIsCisgICAgICAgICAgICAib2xkLWRpdmlzaW9uIiwKKyAgICAgICAgICAgICJVc2VkIGZvciBub24tZmxvb3IgZGl2aXNpb24gdy9vIGEgZmxvYXQgbGl0ZXJhbCBvciAiCisgICAgICAgICAgICAiYGBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uYGAgIgorICAgICAgICAgICAgIihQeXRob24gMyByZXR1cm5zIGEgZmxvYXQgZm9yIGludCBkaXZpc2lvbiB1bmNvbmRpdGlvbmFsbHkpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjIwIjogKAorICAgICAgICAgICAgIkNhbGxpbmcgYSBkaWN0Lml0ZXIqKCkgbWV0aG9kIiwKKyAgICAgICAgICAgICJkaWN0LWl0ZXItbWV0aG9kIiwKKyAgICAgICAgICAgICJVc2VkIGZvciBjYWxscyB0byBkaWN0Lml0ZXJrZXlzKCksIGl0ZXJ2YWx1ZXMoKSBvciBpdGVyaXRlbXMoKSAiCisgICAgICAgICAgICAiKFB5dGhvbiAzIGxhY2tzIHRoZXNlIG1ldGhvZHMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjIxIjogKAorICAgICAgICAgICAgIkNhbGxpbmcgYSBkaWN0LnZpZXcqKCkgbWV0aG9kIiwKKyAgICAgICAgICAgICJkaWN0LXZpZXctbWV0aG9kIiwKKyAgICAgICAgICAgICJVc2VkIGZvciBjYWxscyB0byBkaWN0LnZpZXdrZXlzKCksIHZpZXd2YWx1ZXMoKSBvciB2aWV3aXRlbXMoKSAiCisgICAgICAgICAgICAiKFB5dGhvbiAzIGxhY2tzIHRoZXNlIG1ldGhvZHMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjIyIjogKAorICAgICAgICAgICAgIkNhbGxlZCBhIG5leHQoKSBtZXRob2Qgb24gYW4gb2JqZWN0IiwKKyAgICAgICAgICAgICJuZXh0LW1ldGhvZC1jYWxsZWQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBvYmplY3QncyBuZXh0KCkgbWV0aG9kIGlzIGNhbGxlZCAiCisgICAgICAgICAgICAiKFB5dGhvbiAzIHVzZXMgdGhlIG5leHQoKSBidWlsdC1pbiBmdW5jdGlvbikiLAorICAgICAgICApLAorICAgICAgICAiVzE2MjMiOiAoCisgICAgICAgICAgICAiQXNzaWduaW5nIHRvIGEgY2xhc3MncyBfX21ldGFjbGFzc19fIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAibWV0YWNsYXNzLWFzc2lnbm1lbnQiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIG1ldGFjbGFzcyBpcyBzcGVjaWZpZWQgYnkgYXNzaWduaW5nIHRvIF9fbWV0YWNsYXNzX18gIgorICAgICAgICAgICAgIihQeXRob24gMyBzcGVjaWZpZXMgdGhlIG1ldGFjbGFzcyBhcyBhIGNsYXNzIHN0YXRlbWVudCBhcmd1bWVudCkiLAorICAgICAgICApLAorICAgICAgICAiVzE2MjQiOiAoCisgICAgICAgICAgICAiSW5kZXhpbmcgZXhjZXB0aW9ucyB3aWxsIG5vdCB3b3JrIG9uIFB5dGhvbiAzIiwKKyAgICAgICAgICAgICJpbmRleGluZy1leGNlcHRpb24iLAorICAgICAgICAgICAgIkluZGV4aW5nIGV4Y2VwdGlvbnMgd2lsbCBub3Qgd29yayBvbiBQeXRob24gMy4gVXNlICIKKyAgICAgICAgICAgICJgZXhjZXB0aW9uLmFyZ3NbaW5kZXhdYCBpbnN0ZWFkLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcwNzEzIiwgIm9sZC1pbmRleGluZy1leGNlcHRpb24iKV19LAorICAgICAgICApLAorICAgICAgICAiVzE2MjUiOiAoCisgICAgICAgICAgICAiUmFpc2luZyBhIHN0cmluZyBleGNlcHRpb24iLAorICAgICAgICAgICAgInJhaXNpbmctc3RyaW5nIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBzdHJpbmcgZXhjZXB0aW9uIGlzIHJhaXNlZC4gVGhpcyB3aWxsIG5vdCAiCisgICAgICAgICAgICAid29yayBvbiBQeXRob24gMy4iLAorICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMDcwMSIsICJvbGQtcmFpc2luZy1zdHJpbmciKV19LAorICAgICAgICApLAorICAgICAgICAiVzE2MjYiOiAoCisgICAgICAgICAgICAicmVsb2FkIGJ1aWx0LWluIHJlZmVyZW5jZWQiLAorICAgICAgICAgICAgInJlbG9hZC1idWlsdGluIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIHJlbG9hZCBidWlsdC1pbiBmdW5jdGlvbiBpcyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICIobWlzc2luZyBmcm9tIFB5dGhvbiAzKS4gWW91IGNhbiB1c2UgaW5zdGVhZCBpbXAucmVsb2FkICIKKyAgICAgICAgICAgICJvciBpbXBvcnRsaWIucmVsb2FkLiIsCisgICAgICAgICksCisgICAgICAgICJXMTYyNyI6ICgKKyAgICAgICAgICAgICJfX29jdF9fIG1ldGhvZCBkZWZpbmVkIiwKKyAgICAgICAgICAgICJvY3QtbWV0aG9kIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gX19vY3RfXyBtZXRob2QgaXMgZGVmaW5lZCAiCisgICAgICAgICAgICAiKG1ldGhvZCBpcyBub3QgdXNlZCBieSBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MjgiOiAoCisgICAgICAgICAgICAiX19oZXhfXyBtZXRob2QgZGVmaW5lZCIsCisgICAgICAgICAgICAiaGV4LW1ldGhvZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgX19oZXhfXyBtZXRob2QgaXMgZGVmaW5lZCAobWV0aG9kIGlzIG5vdCB1c2VkIGJ5IFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYyOSI6ICgKKyAgICAgICAgICAgICJfX25vbnplcm9fXyBtZXRob2QgZGVmaW5lZCIsCisgICAgICAgICAgICAibm9uemVyby1tZXRob2QiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fbm9uemVyb19fIG1ldGhvZCBpcyBkZWZpbmVkICIKKyAgICAgICAgICAgICIobWV0aG9kIGlzIG5vdCB1c2VkIGJ5IFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYzMCI6ICgKKyAgICAgICAgICAgICJfX2NtcF9fIG1ldGhvZCBkZWZpbmVkIiwKKyAgICAgICAgICAgICJjbXAtbWV0aG9kIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBfX2NtcF9fIG1ldGhvZCBpcyBkZWZpbmVkIChtZXRob2QgaXMgbm90IHVzZWQgYnkgUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIyAnVzE2MzEnOiByZXBsYWNlZCBieSBXMTYzNgorICAgICAgICAiVzE2MzIiOiAoCisgICAgICAgICAgICAiaW5wdXQgYnVpbHQtaW4gcmVmZXJlbmNlZCIsCisgICAgICAgICAgICAiaW5wdXQtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBpbnB1dCBidWlsdC1pbiBpcyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICIoYmFja3dhcmRzLWluY29tcGF0aWJsZSBzZW1hbnRpY3MgaW4gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjMzIjogKAorICAgICAgICAgICAgInJvdW5kIGJ1aWx0LWluIHJlZmVyZW5jZWQiLAorICAgICAgICAgICAgInJvdW5kLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgcm91bmQgYnVpbHQtaW4gaXMgcmVmZXJlbmNlZCAiCisgICAgICAgICAgICAiKGJhY2t3YXJkcy1pbmNvbXBhdGlibGUgc2VtYW50aWNzIGluIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYzNCI6ICgKKyAgICAgICAgICAgICJpbnRlcm4gYnVpbHQtaW4gcmVmZXJlbmNlZCIsCisgICAgICAgICAgICAiaW50ZXJuLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgaW50ZXJuIGJ1aWx0LWluIGlzIHJlZmVyZW5jZWQgIgorICAgICAgICAgICAgIihNb3ZlZCB0byBzeXMuaW50ZXJuIGluIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYzNSI6ICgKKyAgICAgICAgICAgICJ1bmljaHIgYnVpbHQtaW4gcmVmZXJlbmNlZCIsCisgICAgICAgICAgICAidW5pY2hyLWJ1aWx0aW4iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgdW5pY2hyIGJ1aWx0LWluIGlzIHJlZmVyZW5jZWQgKFVzZSBjaHIgaW4gUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjM2IjogKAorICAgICAgICAgICAgIm1hcCBidWlsdC1pbiByZWZlcmVuY2VkIHdoZW4gbm90IGl0ZXJhdGluZyIsCisgICAgICAgICAgICAibWFwLWJ1aWx0aW4tbm90LWl0ZXJhdGluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSBtYXAgYnVpbHQtaW4gaXMgcmVmZXJlbmNlZCBpbiBhIG5vbi1pdGVyYXRpbmcgIgorICAgICAgICAgICAgImNvbnRleHQgKHJldHVybnMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMpIiwKKyAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiVzE2MzEiLCAiaW1wbGljaXQtbWFwLWV2YWx1YXRpb24iKV19LAorICAgICAgICApLAorICAgICAgICAiVzE2MzciOiAoCisgICAgICAgICAgICAiemlwIGJ1aWx0LWluIHJlZmVyZW5jZWQgd2hlbiBub3QgaXRlcmF0aW5nIiwKKyAgICAgICAgICAgICJ6aXAtYnVpbHRpbi1ub3QtaXRlcmF0aW5nIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIHppcCBidWlsdC1pbiBpcyByZWZlcmVuY2VkIGluIGEgbm9uLWl0ZXJhdGluZyAiCisgICAgICAgICAgICAiY29udGV4dCAocmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2MzgiOiAoCisgICAgICAgICAgICAicmFuZ2UgYnVpbHQtaW4gcmVmZXJlbmNlZCB3aGVuIG5vdCBpdGVyYXRpbmciLAorICAgICAgICAgICAgInJhbmdlLWJ1aWx0aW4tbm90LWl0ZXJhdGluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHRoZSByYW5nZSBidWlsdC1pbiBpcyByZWZlcmVuY2VkIGluIGEgbm9uLWl0ZXJhdGluZyAiCisgICAgICAgICAgICAiY29udGV4dCAocmV0dXJucyBhIHJhbmdlIGluIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTYzOSI6ICgKKyAgICAgICAgICAgICJmaWx0ZXIgYnVpbHQtaW4gcmVmZXJlbmNlZCB3aGVuIG5vdCBpdGVyYXRpbmciLAorICAgICAgICAgICAgImZpbHRlci1idWlsdGluLW5vdC1pdGVyYXRpbmciLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgZmlsdGVyIGJ1aWx0LWluIGlzIHJlZmVyZW5jZWQgaW4gYSBub24taXRlcmF0aW5nICIKKyAgICAgICAgICAgICJjb250ZXh0IChyZXR1cm5zIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTY0MCI6ICgKKyAgICAgICAgICAgICJVc2luZyB0aGUgY21wIGFyZ3VtZW50IGZvciBsaXN0LnNvcnQgLyBzb3J0ZWQiLAorICAgICAgICAgICAgInVzaW5nLWNtcC1hcmd1bWVudCIsCisgICAgICAgICAgICAiVXNpbmcgdGhlIGNtcCBhcmd1bWVudCBmb3IgbGlzdC5zb3J0IG9yIHRoZSBzb3J0ZWQgIgorICAgICAgICAgICAgImJ1aWx0aW4gc2hvdWxkIGJlIGF2b2lkZWQsIHNpbmNlIGl0IHdhcyByZW1vdmVkIGluICIKKyAgICAgICAgICAgICJQeXRob24gMy4gVXNpbmcgZWl0aGVyIGBrZXlgIG9yIGBmdW5jdG9vbHMuY21wX3RvX2tleWAgIgorICAgICAgICAgICAgInNob3VsZCBiZSBwcmVmZXJyZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjQxIjogKAorICAgICAgICAgICAgIkltcGxlbWVudGluZyBfX2VxX18gd2l0aG91dCBhbHNvIGltcGxlbWVudGluZyBfX2hhc2hfXyIsCisgICAgICAgICAgICAiZXEtd2l0aG91dC1oYXNoIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBjbGFzcyBpbXBsZW1lbnRzIF9fZXFfXyBidXQgbm90IF9faGFzaF9fLiAgSW4gUHl0aG9uIDIsIG9iamVjdHMgIgorICAgICAgICAgICAgImdldCBvYmplY3QuX19oYXNoX18gYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIGluIFB5dGhvbiAzIG9iamVjdHMgZ2V0ICIKKyAgICAgICAgICAgICJOb25lIGFzIHRoZWlyIGRlZmF1bHQgX19oYXNoX18gaW1wbGVtZW50YXRpb24gaWYgdGhleSBhbHNvIGltcGxlbWVudCBfX2VxX18uIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjQyIjogKAorICAgICAgICAgICAgIl9fZGl2X18gbWV0aG9kIGRlZmluZWQiLAorICAgICAgICAgICAgImRpdi1tZXRob2QiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIF9fZGl2X18gbWV0aG9kIGlzIGRlZmluZWQuICBVc2luZyBgX190cnVlZGl2X19gIGFuZCBzZXR0aW5nIgorICAgICAgICAgICAgIl9fZGl2X18gPSBfX3RydWVkaXZfXyBzaG91bGQgYmUgcHJlZmVycmVkLiIKKyAgICAgICAgICAgICIobWV0aG9kIGlzIG5vdCB1c2VkIGJ5IFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTY0MyI6ICgKKyAgICAgICAgICAgICJfX2lkaXZfXyBtZXRob2QgZGVmaW5lZCIsCisgICAgICAgICAgICAiaWRpdi1tZXRob2QiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBfX2lkaXZfXyBtZXRob2QgaXMgZGVmaW5lZC4gIFVzaW5nIGBfX2l0cnVlZGl2X19gIGFuZCBzZXR0aW5nIgorICAgICAgICAgICAgIl9faWRpdl9fID0gX19pdHJ1ZWRpdl9fIHNob3VsZCBiZSBwcmVmZXJyZWQuIgorICAgICAgICAgICAgIihtZXRob2QgaXMgbm90IHVzZWQgYnkgUHl0aG9uIDMpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjQ0IjogKAorICAgICAgICAgICAgIl9fcmRpdl9fIG1ldGhvZCBkZWZpbmVkIiwKKyAgICAgICAgICAgICJyZGl2LW1ldGhvZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgX19yZGl2X18gbWV0aG9kIGlzIGRlZmluZWQuICBVc2luZyBgX19ydHJ1ZWRpdl9fYCBhbmQgc2V0dGluZyIKKyAgICAgICAgICAgICJfX3JkaXZfXyA9IF9fcnRydWVkaXZfXyBzaG91bGQgYmUgcHJlZmVycmVkLiIKKyAgICAgICAgICAgICIobWV0aG9kIGlzIG5vdCB1c2VkIGJ5IFB5dGhvbiAzKSIsCisgICAgICAgICksCisgICAgICAgICJXMTY0NSI6ICgKKyAgICAgICAgICAgICJFeGNlcHRpb24ubWVzc2FnZSByZW1vdmVkIGluIFB5dGhvbiAzIiwKKyAgICAgICAgICAgICJleGNlcHRpb24tbWVzc2FnZS1hdHRyaWJ1dGUiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgb24gYW4gRXhjZXB0aW9uLiAgVXNlICIKKyAgICAgICAgICAgICJzdHIoZXhjZXB0aW9uKSBpbnN0ZWFkLiIsCisgICAgICAgICksCisgICAgICAgICJXMTY0NiI6ICgKKyAgICAgICAgICAgICJub24tdGV4dCBlbmNvZGluZyB1c2VkIGluIHN0ci5kZWNvZGUiLAorICAgICAgICAgICAgImludmFsaWQtc3RyLWNvZGVjIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdXNpbmcgc3RyLmVuY29kZSBvciBzdHIuZGVjb2RlIHdpdGggYSBub24tdGV4dCBlbmNvZGluZy4gIFVzZSAiCisgICAgICAgICAgICAiY29kZWNzIG1vZHVsZSB0byBoYW5kbGUgYXJiaXRyYXJ5IGNvZGVjcy4iLAorICAgICAgICApLAorICAgICAgICAiVzE2NDciOiAoCisgICAgICAgICAgICAic3lzLm1heGludCByZW1vdmVkIGluIFB5dGhvbiAzIiwKKyAgICAgICAgICAgICJzeXMtbWF4LWludCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFjY2Vzc2luZyBzeXMubWF4aW50LiAgVXNlIHN5cy5tYXhzaXplIGluc3RlYWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjQ4IjogKAorICAgICAgICAgICAgIk1vZHVsZSBtb3ZlZCBpbiBQeXRob24gMyIsCisgICAgICAgICAgICAiYmFkLXB5dGhvbjMtaW1wb3J0IiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gaW1wb3J0aW5nIGEgbW9kdWxlIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cyBpbiBQeXRob24gMy4iLAorICAgICAgICApLAorICAgICAgICAiVzE2NDkiOiAoCisgICAgICAgICAgICAiQWNjZXNzaW5nIGEgZGVwcmVjYXRlZCBmdW5jdGlvbiBvbiB0aGUgc3RyaW5nIG1vZHVsZSIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC1zdHJpbmctZnVuY3Rpb24iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhY2Nlc3NpbmcgYSBzdHJpbmcgZnVuY3Rpb24gdGhhdCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIFB5dGhvbiAzLiIsCisgICAgICAgICksCisgICAgICAgICJXMTY1MCI6ICgKKyAgICAgICAgICAgICJVc2luZyBzdHIudHJhbnNsYXRlIHdpdGggZGVwcmVjYXRlZCBkZWxldGVjaGFycyBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICJkZXByZWNhdGVkLXN0ci10cmFuc2xhdGUtY2FsbCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIHVzaW5nIHRoZSBkZXByZWNhdGVkIGRlbGV0ZWNoYXJzIHBhcmFtZXRlcnMgZnJvbSBzdHIudHJhbnNsYXRlLiAgVXNlICIKKyAgICAgICAgICAgICJyZS5zdWIgdG8gcmVtb3ZlIHRoZSBkZXNpcmVkIGNoYXJhY3RlcnMgIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjUxIjogKAorICAgICAgICAgICAgIkFjY2Vzc2luZyBhIGRlcHJlY2F0ZWQgZnVuY3Rpb24gb24gdGhlIGl0ZXJ0b29scyBtb2R1bGUiLAorICAgICAgICAgICAgImRlcHJlY2F0ZWQtaXRlcnRvb2xzLWZ1bmN0aW9uIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYWNjZXNzaW5nIGEgZnVuY3Rpb24gb24gaXRlcnRvb2xzIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4iLAorICAgICAgICApLAorICAgICAgICAiVzE2NTIiOiAoCisgICAgICAgICAgICAiQWNjZXNzaW5nIGEgZGVwcmVjYXRlZCBmaWVsZHMgb24gdGhlIHR5cGVzIG1vZHVsZSIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC10eXBlcy1maWVsZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFjY2Vzc2luZyBhIGZpZWxkIG9uIHR5cGVzIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4iLAorICAgICAgICApLAorICAgICAgICAiVzE2NTMiOiAoCisgICAgICAgICAgICAibmV4dCBtZXRob2QgZGVmaW5lZCIsCisgICAgICAgICAgICAibmV4dC1tZXRob2QtZGVmaW5lZCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgbmV4dCBtZXRob2QgaXMgZGVmaW5lZCB0aGF0IHdvdWxkIGJlIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAyIGJ1dCAiCisgICAgICAgICAgICAiaXMgdHJlYXRlZCBhcyBhIG5vcm1hbCBmdW5jdGlvbiBpbiBQeXRob24gMy4iLAorICAgICAgICApLAorICAgICAgICAiVzE2NTQiOiAoCisgICAgICAgICAgICAiZGljdC5pdGVtcyByZWZlcmVuY2VkIHdoZW4gbm90IGl0ZXJhdGluZyIsCisgICAgICAgICAgICAiZGljdC1pdGVtcy1ub3QtaXRlcmF0aW5nIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gZGljdC5pdGVtcyBpcyByZWZlcmVuY2VkIGluIGEgbm9uLWl0ZXJhdGluZyAiCisgICAgICAgICAgICAiY29udGV4dCAocmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2NTUiOiAoCisgICAgICAgICAgICAiZGljdC5rZXlzIHJlZmVyZW5jZWQgd2hlbiBub3QgaXRlcmF0aW5nIiwKKyAgICAgICAgICAgICJkaWN0LWtleXMtbm90LWl0ZXJhdGluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGRpY3Qua2V5cyBpcyByZWZlcmVuY2VkIGluIGEgbm9uLWl0ZXJhdGluZyAiCisgICAgICAgICAgICAiY29udGV4dCAocmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2NTYiOiAoCisgICAgICAgICAgICAiZGljdC52YWx1ZXMgcmVmZXJlbmNlZCB3aGVuIG5vdCBpdGVyYXRpbmciLAorICAgICAgICAgICAgImRpY3QtdmFsdWVzLW5vdC1pdGVyYXRpbmciLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBkaWN0LnZhbHVlcyBpcyByZWZlcmVuY2VkIGluIGEgbm9uLWl0ZXJhdGluZyAiCisgICAgICAgICAgICAiY29udGV4dCAocmV0dXJucyBhbiBpdGVyYXRvciBpbiBQeXRob24gMykiLAorICAgICAgICApLAorICAgICAgICAiVzE2NTciOiAoCisgICAgICAgICAgICAiQWNjZXNzaW5nIGEgcmVtb3ZlZCBhdHRyaWJ1dGUgb24gdGhlIG9wZXJhdG9yIG1vZHVsZSIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC1vcGVyYXRvci1mdW5jdGlvbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFjY2Vzc2luZyBhIGZpZWxkIG9uIG9wZXJhdG9yIG1vZHVsZSB0aGF0IGhhcyBiZWVuICIKKyAgICAgICAgICAgICJyZW1vdmVkIGluIFB5dGhvbiAzLiIsCisgICAgICAgICksCisgICAgICAgICJXMTY1OCI6ICgKKyAgICAgICAgICAgICJBY2Nlc3NpbmcgYSByZW1vdmVkIGF0dHJpYnV0ZSBvbiB0aGUgdXJsbGliIG1vZHVsZSIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC11cmxsaWItZnVuY3Rpb24iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhY2Nlc3NpbmcgYSBmaWVsZCBvbiB1cmxsaWIgbW9kdWxlIHRoYXQgaGFzIGJlZW4gIgorICAgICAgICAgICAgInJlbW92ZWQgb3IgbW92ZWQgaW4gUHl0aG9uIDMuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjU5IjogKAorICAgICAgICAgICAgIkFjY2Vzc2luZyBhIHJlbW92ZWQgeHJlYWRsaW5lcyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgInhyZWFkbGluZXMtYXR0cmlidXRlIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYWNjZXNzaW5nIHRoZSB4cmVhZGxpbmVzKCkgZnVuY3Rpb24gb24gYSBmaWxlIHN0cmVhbSwgIgorICAgICAgICAgICAgInJlbW92ZWQgaW4gUHl0aG9uIDMuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjYwIjogKAorICAgICAgICAgICAgIkFjY2Vzc2luZyBhIHJlbW92ZWQgYXR0cmlidXRlIG9uIHRoZSBzeXMgbW9kdWxlIiwKKyAgICAgICAgICAgICJkZXByZWNhdGVkLXN5cy1mdW5jdGlvbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFjY2Vzc2luZyBhIGZpZWxkIG9uIHN5cyBtb2R1bGUgdGhhdCBoYXMgYmVlbiAiCisgICAgICAgICAgICAicmVtb3ZlZCBpbiBQeXRob24gMy4iLAorICAgICAgICApLAorICAgICAgICAiVzE2NjEiOiAoCisgICAgICAgICAgICAiVXNpbmcgYW4gZXhjZXB0aW9uIG9iamVjdCB0aGF0IHdhcyBib3VuZCBieSBhbiBleGNlcHQgaGFuZGxlciIsCisgICAgICAgICAgICAiZXhjZXB0aW9uLWVzY2FwZSIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIHVzaW5nIGFuIGV4Y2VwdGlvbiwgdGhhdCB3YXMgYm91bmQgaW4gYW4gZXhjZXB0ICIKKyAgICAgICAgICAgICJoYW5kbGVyLCBvdXRzaWRlIG9mIHRoZSBleGNlcHQgaGFuZGxlci4gT24gUHl0aG9uIDMgdGhlc2UgIgorICAgICAgICAgICAgImV4Y2VwdGlvbnMgd2lsbCBiZSBkZWxldGVkIG9uY2UgdGhleSBnZXQgb3V0ICIKKyAgICAgICAgICAgICJvZiB0aGUgZXhjZXB0IGhhbmRsZXIuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNjYyIjogKAorICAgICAgICAgICAgIlVzaW5nIGEgdmFyaWFibGUgdGhhdCB3YXMgYm91bmQgaW5zaWRlIGEgY29tcHJlaGVuc2lvbiIsCisgICAgICAgICAgICAiY29tcHJlaGVuc2lvbi1lc2NhcGUiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiB1c2luZyBhIHZhcmlhYmxlLCB0aGF0IHdhcyBib3VuZCBpbiBhIGNvbXByZWhlbnNpb24gIgorICAgICAgICAgICAgImhhbmRsZXIsIG91dHNpZGUgb2YgdGhlIGNvbXByZWhlbnNpb24gaXRzZWxmLiBPbiBQeXRob24gMyB0aGVzZSAiCisgICAgICAgICAgICAidmFyaWFibGVzIHdpbGwgYmUgZGVsZXRlZCBvdXRzaWRlIG9mIHRoZSAiCisgICAgICAgICAgICAiY29tcHJlaGVuc2lvbi4iLAorICAgICAgICApLAorICAgIH0KKworICAgIF9iYWRfYnVpbHRpbnMgPSBmcm96ZW5zZXQoCisgICAgICAgIFsKKyAgICAgICAgICAgICJhcHBseSIsCisgICAgICAgICAgICAiYmFzZXN0cmluZyIsCisgICAgICAgICAgICAiYnVmZmVyIiwKKyAgICAgICAgICAgICJjbXAiLAorICAgICAgICAgICAgImNvZXJjZSIsCisgICAgICAgICAgICAiZXhlY2ZpbGUiLAorICAgICAgICAgICAgImZpbGUiLAorICAgICAgICAgICAgImlucHV0IiwgICMgTm90IG1pc3NpbmcsIGJ1dCBpbmNvbXBhdGlibGUgc2VtYW50aWNzCisgICAgICAgICAgICAiaW50ZXJuIiwKKyAgICAgICAgICAgICJsb25nIiwKKyAgICAgICAgICAgICJyYXdfaW5wdXQiLAorICAgICAgICAgICAgInJlZHVjZSIsCisgICAgICAgICAgICAicm91bmQiLCAgIyBOb3QgbWlzc2luZywgYnV0IGluY29tcGF0aWJsZSBzZW1hbnRpY3MKKyAgICAgICAgICAgICJTdGFuZGFyZEVycm9yIiwKKyAgICAgICAgICAgICJ1bmljaHIiLAorICAgICAgICAgICAgInVuaWNvZGUiLAorICAgICAgICAgICAgInhyYW5nZSIsCisgICAgICAgICAgICAicmVsb2FkIiwKKyAgICAgICAgXQorICAgICkKKworICAgIF91bnVzZWRfbWFnaWNfbWV0aG9kcyA9IGZyb3plbnNldCgKKyAgICAgICAgWworICAgICAgICAgICAgIl9fY29lcmNlX18iLAorICAgICAgICAgICAgIl9fZGVsc2xpY2VfXyIsCisgICAgICAgICAgICAiX19nZXRzbGljZV9fIiwKKyAgICAgICAgICAgICJfX3NldHNsaWNlX18iLAorICAgICAgICAgICAgIl9fb2N0X18iLAorICAgICAgICAgICAgIl9faGV4X18iLAorICAgICAgICAgICAgIl9fbm9uemVyb19fIiwKKyAgICAgICAgICAgICJfX2NtcF9fIiwKKyAgICAgICAgICAgICJfX2Rpdl9fIiwKKyAgICAgICAgICAgICJfX2lkaXZfXyIsCisgICAgICAgICAgICAiX19yZGl2X18iLAorICAgICAgICBdCisgICAgKQorCisgICAgX2ludmFsaWRfZW5jb2RpbmdzID0gZnJvemVuc2V0KAorICAgICAgICBbCisgICAgICAgICAgICAiYmFzZTY0X2NvZGVjIiwKKyAgICAgICAgICAgICJiYXNlNjQiLAorICAgICAgICAgICAgImJhc2VfNjQiLAorICAgICAgICAgICAgImJ6Ml9jb2RlYyIsCisgICAgICAgICAgICAiYnoyIiwKKyAgICAgICAgICAgICJoZXhfY29kZWMiLAorICAgICAgICAgICAgImhleCIsCisgICAgICAgICAgICAicXVvcHJpX2NvZGVjIiwKKyAgICAgICAgICAgICJxdW9wcmkiLAorICAgICAgICAgICAgInF1b3RlZHByaW50YWJsZSIsCisgICAgICAgICAgICAicXVvdGVkX3ByaW50YWJsZSIsCisgICAgICAgICAgICAidXVfY29kZWMiLAorICAgICAgICAgICAgInV1IiwKKyAgICAgICAgICAgICJ6bGliX2NvZGVjIiwKKyAgICAgICAgICAgICJ6bGliIiwKKyAgICAgICAgICAgICJ6aXAiLAorICAgICAgICAgICAgInJvdDEzIiwKKyAgICAgICAgICAgICJyb3RfMTMiLAorICAgICAgICBdCisgICAgKQorCisgICAgX2JhZF9weXRob24zX21vZHVsZV9tYXAgPSB7CisgICAgICAgICJzeXMtbWF4LWludCI6IHsic3lzIjogZnJvemVuc2V0KFsibWF4aW50Il0pfSwKKyAgICAgICAgImRlcHJlY2F0ZWQtaXRlcnRvb2xzLWZ1bmN0aW9uIjogeworICAgICAgICAgICAgIml0ZXJ0b29scyI6IGZyb3plbnNldCgKKyAgICAgICAgICAgICAgICBbIml6aXAiLCAiaWZpbHRlciIsICJpbWFwIiwgIml6aXBfbG9uZ2VzdCIsICJpZmlsdGVyZmFsc2UiXQorICAgICAgICAgICAgKQorICAgICAgICB9LAorICAgICAgICAiZGVwcmVjYXRlZC10eXBlcy1maWVsZCI6IHsKKyAgICAgICAgICAgICJ0eXBlcyI6IGZyb3plbnNldCgKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICJFbGxpcHNpc1R5cGUiLAorICAgICAgICAgICAgICAgICAgICAiWFJhbmdlVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJDb21wbGV4VHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJTdHJpbmdUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIlR5cGVUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkxvbmdUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIlVuaWNvZGVUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkNsYXNzVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJCdWZmZXJUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIlN0cmluZ1R5cGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIk5vdEltcGxlbWVudGVkVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJOb25lVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJJbnN0YW5jZVR5cGUiLAorICAgICAgICAgICAgICAgICAgICAiRmxvYXRUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIlNsaWNlVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJVbmJvdW5kTWV0aG9kVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICJPYmplY3RUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkludFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAiVHVwbGVUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkxpc3RUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkRpY3RUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkZpbGVUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkRpY3Rpb25hcnlUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW5UeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgIkRpY3RQcm94eVR5cGUiLAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICkKKyAgICAgICAgfSwKKyAgICAgICAgImJhZC1weXRob24zLWltcG9ydCI6IGZyb3plbnNldCgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiYW55ZGJtIiwKKyAgICAgICAgICAgICAgICAiQmFzZUhUVFBTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJfX2J1aWx0aW5fXyIsCisgICAgICAgICAgICAgICAgIkNHSUhUVFBTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJDb25maWdQYXJzZXIiLAorICAgICAgICAgICAgICAgICJjb3B5X3JlZyIsCisgICAgICAgICAgICAgICAgImNQaWNrbGUiLAorICAgICAgICAgICAgICAgICJjU3RyaW5nSU8iLAorICAgICAgICAgICAgICAgICJDb29raWUiLAorICAgICAgICAgICAgICAgICJjb29raWVsaWIiLAorICAgICAgICAgICAgICAgICJkYmhhc2giLAorICAgICAgICAgICAgICAgICJkdW1iZGJtIiwKKyAgICAgICAgICAgICAgICAiZHVtYmRiIiwKKyAgICAgICAgICAgICAgICAiRGlhbG9nIiwKKyAgICAgICAgICAgICAgICAiRG9jWE1MUlBDU2VydmVyIiwKKyAgICAgICAgICAgICAgICAiRmlsZURpYWxvZyIsCisgICAgICAgICAgICAgICAgIkZpeFRrIiwKKyAgICAgICAgICAgICAgICAiZ2RibSIsCisgICAgICAgICAgICAgICAgImh0bWxlbnRpdHlkZWZzIiwKKyAgICAgICAgICAgICAgICAiSFRNTFBhcnNlciIsCisgICAgICAgICAgICAgICAgImh0dHBsaWIiLAorICAgICAgICAgICAgICAgICJtYXJrdXBiYXNlIiwKKyAgICAgICAgICAgICAgICAiUXVldWUiLAorICAgICAgICAgICAgICAgICJyZXByIiwKKyAgICAgICAgICAgICAgICAicm9ib3RwYXJzZXIiLAorICAgICAgICAgICAgICAgICJTY3JvbGxlZFRleHQiLAorICAgICAgICAgICAgICAgICJTaW1wbGVEaWFsb2ciLAorICAgICAgICAgICAgICAgICJTaW1wbGVIVFRQU2VydmVyIiwKKyAgICAgICAgICAgICAgICAiU2ltcGxlWE1MUlBDU2VydmVyIiwKKyAgICAgICAgICAgICAgICAiU3RyaW5nSU8iLAorICAgICAgICAgICAgICAgICJkdW1teV90aHJlYWQiLAorICAgICAgICAgICAgICAgICJTb2NrZXRTZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJ0ZXN0LnRlc3Rfc3VwcG9ydCIsCisgICAgICAgICAgICAgICAgIlRraW50ZXIiLAorICAgICAgICAgICAgICAgICJUaXgiLAorICAgICAgICAgICAgICAgICJUa2NvbnN0YW50cyIsCisgICAgICAgICAgICAgICAgInRrQ29sb3JDaG9vc2VyIiwKKyAgICAgICAgICAgICAgICAidGtDb21tb25EaWFsb2ciLAorICAgICAgICAgICAgICAgICJUa2RuZCIsCisgICAgICAgICAgICAgICAgInRrRmlsZURpYWxvZyIsCisgICAgICAgICAgICAgICAgInRrRm9udCIsCisgICAgICAgICAgICAgICAgInRrTWVzc2FnZUJveCIsCisgICAgICAgICAgICAgICAgInRrU2ltcGxlRGlhbG9nIiwKKyAgICAgICAgICAgICAgICAiVXNlckxpc3QiLAorICAgICAgICAgICAgICAgICJVc2VyU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAid2hpY2hkYiIsCisgICAgICAgICAgICAgICAgIl93aW5yZWciLAorICAgICAgICAgICAgICAgICJ4bWxycGNsaWIiLAorICAgICAgICAgICAgICAgICJhdWRpb2RldiIsCisgICAgICAgICAgICAgICAgIkJhc3Rpb24iLAorICAgICAgICAgICAgICAgICJic2RkYjE4NSIsCisgICAgICAgICAgICAgICAgImJzZGRiMyIsCisgICAgICAgICAgICAgICAgIkNhbnZhcyIsCisgICAgICAgICAgICAgICAgImNmbWZpbGUiLAorICAgICAgICAgICAgICAgICJjbCIsCisgICAgICAgICAgICAgICAgImNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAiY29tcGlsZXIiLAorICAgICAgICAgICAgICAgICJkaXJjYWNoZSIsCisgICAgICAgICAgICAgICAgImRsIiwKKyAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAiZnBmb3JtYXQiLAorICAgICAgICAgICAgICAgICJodG1sbGliIiwKKyAgICAgICAgICAgICAgICAiaWhvb2tzIiwKKyAgICAgICAgICAgICAgICAiaW1hZ2VvcCIsCisgICAgICAgICAgICAgICAgImltcHV0aWwiLAorICAgICAgICAgICAgICAgICJsaW51eGF1ZGlvZGV2IiwKKyAgICAgICAgICAgICAgICAibWQ1IiwKKyAgICAgICAgICAgICAgICAibWhsaWIiLAorICAgICAgICAgICAgICAgICJtaW1ldG9vbHMiLAorICAgICAgICAgICAgICAgICJNaW1lV3JpdGVyIiwKKyAgICAgICAgICAgICAgICAibWltaWZ5IiwKKyAgICAgICAgICAgICAgICAibXVsdGlmaWxlIiwKKyAgICAgICAgICAgICAgICAibXV0ZXgiLAorICAgICAgICAgICAgICAgICJuZXciLAorICAgICAgICAgICAgICAgICJwb3BlbjIiLAorICAgICAgICAgICAgICAgICJwb3NpeGZpbGUiLAorICAgICAgICAgICAgICAgICJwdXJlIiwKKyAgICAgICAgICAgICAgICAicmV4ZWMiLAorICAgICAgICAgICAgICAgICJyZmM4MjIiLAorICAgICAgICAgICAgICAgICJzZXRzIiwKKyAgICAgICAgICAgICAgICAic2hhIiwKKyAgICAgICAgICAgICAgICAic2dtbGxpYiIsCisgICAgICAgICAgICAgICAgInNyZSIsCisgICAgICAgICAgICAgICAgInN0cmluZ29sZCIsCisgICAgICAgICAgICAgICAgInN1bmF1ZGlvIiwKKyAgICAgICAgICAgICAgICAic3YiLAorICAgICAgICAgICAgICAgICJ0ZXN0LnRlc3RhbGwiLAorICAgICAgICAgICAgICAgICJ0aHJlYWQiLAorICAgICAgICAgICAgICAgICJ0aW1pbmciLAorICAgICAgICAgICAgICAgICJ0b2FpZmYiLAorICAgICAgICAgICAgICAgICJ1c2VyIiwKKyAgICAgICAgICAgICAgICAidXJsbGliMiIsCisgICAgICAgICAgICAgICAgInVybHBhcnNlIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKSwKKyAgICAgICAgImRlcHJlY2F0ZWQtc3RyaW5nLWZ1bmN0aW9uIjogeworICAgICAgICAgICAgInN0cmluZyI6IGZyb3plbnNldCgKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICJtYWtldHJhbnMiLAorICAgICAgICAgICAgICAgICAgICAiYXRvZiIsCisgICAgICAgICAgICAgICAgICAgICJhdG9pIiwKKyAgICAgICAgICAgICAgICAgICAgImF0b2wiLAorICAgICAgICAgICAgICAgICAgICAiY2FwaXRhbGl6ZSIsCisgICAgICAgICAgICAgICAgICAgICJleHBhbmR0YWJzIiwKKyAgICAgICAgICAgICAgICAgICAgImZpbmQiLAorICAgICAgICAgICAgICAgICAgICAicmZpbmQiLAorICAgICAgICAgICAgICAgICAgICAiaW5kZXgiLAorICAgICAgICAgICAgICAgICAgICAicmluZGV4IiwKKyAgICAgICAgICAgICAgICAgICAgImNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgImxvd2VyIiwKKyAgICAgICAgICAgICAgICAgICAgImxldHRlcnMiLAorICAgICAgICAgICAgICAgICAgICAic3BsaXQiLAorICAgICAgICAgICAgICAgICAgICAicnNwbGl0IiwKKyAgICAgICAgICAgICAgICAgICAgInNwbGl0ZmllbGRzIiwKKyAgICAgICAgICAgICAgICAgICAgImpvaW4iLAorICAgICAgICAgICAgICAgICAgICAiam9pbmZpZWxkcyIsCisgICAgICAgICAgICAgICAgICAgICJsc3RyaXAiLAorICAgICAgICAgICAgICAgICAgICAicnN0cmlwIiwKKyAgICAgICAgICAgICAgICAgICAgInN0cmlwIiwKKyAgICAgICAgICAgICAgICAgICAgInN3YXBjYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgInRyYW5zbGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICJ1cHBlciIsCisgICAgICAgICAgICAgICAgICAgICJsanVzdCIsCisgICAgICAgICAgICAgICAgICAgICJyanVzdCIsCisgICAgICAgICAgICAgICAgICAgICJjZW50ZXIiLAorICAgICAgICAgICAgICAgICAgICAiemZpbGwiLAorICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICJsb3dlcmNhc2UiLAorICAgICAgICAgICAgICAgICAgICAibGV0dGVycyIsCisgICAgICAgICAgICAgICAgICAgICJ1cHBlcmNhc2UiLAorICAgICAgICAgICAgICAgICAgICAiYXRvbF9lcnJvciIsCisgICAgICAgICAgICAgICAgICAgICJhdG9mX2Vycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgImF0b2lfZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAiaW5kZXhfZXJyb3IiLAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICkKKyAgICAgICAgfSwKKyAgICAgICAgImRlcHJlY2F0ZWQtb3BlcmF0b3ItZnVuY3Rpb24iOiB7Im9wZXJhdG9yIjogZnJvemVuc2V0KHsiZGl2In0pfSwKKyAgICAgICAgImRlcHJlY2F0ZWQtdXJsbGliLWZ1bmN0aW9uIjogeworICAgICAgICAgICAgInVybGxpYiI6IGZyb3plbnNldCgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhZGRiYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgImFkZGNsb3NlaG9vayIsCisgICAgICAgICAgICAgICAgICAgICJhZGRpbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgImFkZGluZm91cmwiLAorICAgICAgICAgICAgICAgICAgICAiYWx3YXlzX3NhZmUiLAorICAgICAgICAgICAgICAgICAgICAiYmFzZWpvaW4iLAorICAgICAgICAgICAgICAgICAgICAiZnRwY2FjaGUiLAorICAgICAgICAgICAgICAgICAgICAiZnRwZXJyb3JzIiwKKyAgICAgICAgICAgICAgICAgICAgImZ0cHdyYXBwZXIiLAorICAgICAgICAgICAgICAgICAgICAiZ2V0cHJveGllcyIsCisgICAgICAgICAgICAgICAgICAgICJnZXRwcm94aWVzX2Vudmlyb25tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgImdldHByb3hpZXNfbWFjb3N4X3N5c2NvbmYiLAorICAgICAgICAgICAgICAgICAgICAibWFpbiIsCisgICAgICAgICAgICAgICAgICAgICJub2hlYWRlcnMiLAorICAgICAgICAgICAgICAgICAgICAicGF0aG5hbWUydXJsIiwKKyAgICAgICAgICAgICAgICAgICAgInByb3h5X2J5cGFzcyIsCisgICAgICAgICAgICAgICAgICAgICJwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQiLAorICAgICAgICAgICAgICAgICAgICAicHJveHlfYnlwYXNzX21hY29zeF9zeXNjb25mIiwKKyAgICAgICAgICAgICAgICAgICAgInF1b3RlIiwKKyAgICAgICAgICAgICAgICAgICAgInF1b3RlX3BsdXMiLAorICAgICAgICAgICAgICAgICAgICAicmVwb3J0aG9vayIsCisgICAgICAgICAgICAgICAgICAgICJzcGxpdGF0dHIiLAorICAgICAgICAgICAgICAgICAgICAic3BsaXRob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgInNwbGl0bnBvcnQiLAorICAgICAgICAgICAgICAgICAgICAic3BsaXRwYXNzd2QiLAorICAgICAgICAgICAgICAgICAgICAic3BsaXRwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgInNwbGl0cXVlcnkiLAorICAgICAgICAgICAgICAgICAgICAic3BsaXR0YWciLAorICAgICAgICAgICAgICAgICAgICAic3BsaXR0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgInNwbGl0dXNlciIsCisgICAgICAgICAgICAgICAgICAgICJzcGxpdHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgInVucXVvdGUiLAorICAgICAgICAgICAgICAgICAgICAidW5xdW90ZV9wbHVzIiwKKyAgICAgICAgICAgICAgICAgICAgInVud3JhcCIsCisgICAgICAgICAgICAgICAgICAgICJ1cmwycGF0aG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAidXJsY2xlYW51cCIsCisgICAgICAgICAgICAgICAgICAgICJ1cmxlbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICAidXJsb3BlbiIsCisgICAgICAgICAgICAgICAgICAgICJ1cmxyZXRyaWV2ZSIsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKQorICAgICAgICB9LAorICAgICAgICAiZGVwcmVjYXRlZC1zeXMtZnVuY3Rpb24iOiB7InN5cyI6IGZyb3plbnNldCh7ImV4Y19jbGVhciJ9KX0sCisgICAgfQorCisgICAgX2RlcHJlY2F0ZWRfYXR0cnMgPSBmcm96ZW5zZXQoCisgICAgICAgIGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKAorICAgICAgICAgICAgYXR0cgorICAgICAgICAgICAgZm9yIG1vZHVsZV9tYXAgaW4gX2JhZF9weXRob24zX21vZHVsZV9tYXAudmFsdWVzKCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlX21hcCwgZGljdCkKKyAgICAgICAgICAgIGZvciBhdHRyIGluIG1vZHVsZV9tYXAudmFsdWVzKCkKKyAgICAgICAgKQorICAgICkKKworICAgIF9yZWxldmFudF9jYWxsX2F0dHJzID0gKAorICAgICAgICBESUNUX01FVEhPRFMgfCBfZGVwcmVjYXRlZF9hdHRycyB8IHsiZW5jb2RlIiwgImRlY29kZSIsICJ0cmFuc2xhdGUifQorICAgICkKKworICAgIF9weXRob25fMl90ZXN0cyA9IGZyb3plbnNldCgKKyAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoeCkucmVwcl90cmVlKCkKKyAgICAgICAgZm9yIHggaW4gKAorICAgICAgICAgICAgInN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiIsCisgICAgICAgICAgICAic3lzLnZlcnNpb25faW5mb1swXSA8IDMiLAorICAgICAgICAgICAgInN5cy52ZXJzaW9uX2luZm8gPT0gKDIsIDcpIiwKKyAgICAgICAgICAgICJzeXMudmVyc2lvbl9pbmZvIDw9ICgyLCA3KSIsCisgICAgICAgICAgICAic3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKSIsCisgICAgICAgICkKKyAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fZnV0dXJlX2RpdmlzaW9uID0gRmFsc2UKKyAgICAgICAgc2VsZi5fZnV0dXJlX2Fic29sdXRlX2ltcG9ydCA9IEZhbHNlCisgICAgICAgIHNlbGYuX21vZHVsZXNfd2FybmVkX2Fib3V0ID0gc2V0KCkKKyAgICAgICAgc2VsZi5fYnJhbmNoX3N0YWNrID0gW10KKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisKKyAgICAjIHB5bGludDogZGlzYWJsZT1rZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnLCBhcmd1bWVudHMtZGlmZmVyCisgICAgZGVmIGFkZF9tZXNzYWdlKHNlbGYsIG1zZ19pZCwgYWx3YXlzX3dhcm49RmFsc2UsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGlmIGFsd2F5c193YXJuIG9yIG5vdCAoCisgICAgICAgICAgICBzZWxmLl9icmFuY2hfc3RhY2sgYW5kIHNlbGYuX2JyYW5jaF9zdGFja1stMV0uaXNfcHkyX29ubHkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHN1cGVyKCkuYWRkX21lc3NhZ2UobXNnX2lkLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgX2lzX3B5Ml90ZXN0KHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUudGVzdCwgYXN0cm9pZC5BdHRyaWJ1dGUpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgbm9kZS50ZXN0LmV4cHIsIGFzdHJvaWQuTmFtZQorICAgICAgICApOgorICAgICAgICAgICAgaWYgbm9kZS50ZXN0LmV4cHIubmFtZSA9PSAic2l4IiBhbmQgbm9kZS50ZXN0LmF0dHJuYW1lID09ICJQWTIiOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnRlc3QsIGFzdHJvaWQuQ29tcGFyZSkKKyAgICAgICAgICAgIGFuZCBub2RlLnRlc3QucmVwcl90cmVlKCkgaW4gc2VsZi5fcHl0aG9uXzJfdGVzdHMKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHZpc2l0X2lmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9icmFuY2hfc3RhY2suYXBwZW5kKEJyYW5jaChub2RlLCBzZWxmLl9pc19weTJfdGVzdChub2RlKSkpCisKKyAgICBkZWYgbGVhdmVfaWYoc2VsZiwgbm9kZSk6CisgICAgICAgIG5ld19ub2RlID0gc2VsZi5fYnJhbmNoX3N0YWNrLnBvcCgpLm5vZGUKKyAgICAgICAgYXNzZXJ0IG5ld19ub2RlID09IG5vZGUKKworICAgIGRlZiB2aXNpdF9pZmV4cChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fYnJhbmNoX3N0YWNrLmFwcGVuZChCcmFuY2gobm9kZSwgc2VsZi5faXNfcHkyX3Rlc3Qobm9kZSkpKQorCisgICAgZGVmIGxlYXZlX2lmZXhwKHNlbGYsIG5vZGUpOgorICAgICAgICBuZXdfbm9kZSA9IHNlbGYuX2JyYW5jaF9zdGFjay5wb3AoKQorICAgICAgICBhc3NlcnQgbmV3X25vZGUubm9kZSA9PSBub2RlCisKKyAgICBkZWYgdmlzaXRfbW9kdWxlKHNlbGYsIG5vZGUpOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgICIiIkNsZWFyIGNoZWNrZXIgc3RhdGUgYWZ0ZXIgcHJldmlvdXMgbW9kdWxlLiIiIgorICAgICAgICBzZWxmLl9mdXR1cmVfZGl2aXNpb24gPSBGYWxzZQorICAgICAgICBzZWxmLl9mdXR1cmVfYWJzb2x1dGVfaW1wb3J0ID0gRmFsc2UKKworICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZS5pc19tZXRob2QoKToKKyAgICAgICAgICAgIGlmIG5vZGUubmFtZSBpbiBzZWxmLl91bnVzZWRfbWFnaWNfbWV0aG9kczoKKyAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSA9IG5vZGUubmFtZQorICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZS5zdGFydHN3aXRoKCJfXyIpOgorICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSA9IG5vZGUubmFtZVsyOi0yXQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UobWV0aG9kX25hbWUgKyAiLW1ldGhvZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIGVsaWYgbm9kZS5uYW1lID09ICJuZXh0IjoKKyAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIGEgbWV0aG9kIG5hbWVkIGBuZXh0YCBkZWNsYXJlZCwgaWYgaXQgaXMgaW52b2thYmxlCisgICAgICAgICAgICAgICAgIyB3aXRoIHplcm8gYXJndW1lbnRzIHRoZW4gaXQgaW1wbGVtZW50cyB0aGUgSXRlcmF0b3IgcHJvdG9jb2wuCisgICAgICAgICAgICAgICAgIyBUaGlzIG1lYW5zIGlmIHRoZSBtZXRob2QgaXMgYW4gaW5zdGFuY2UgbWV0aG9kIG9yIGEKKyAgICAgICAgICAgICAgICAjIGNsYXNzbWV0aG9kIDEgYXJndW1lbnQgc2hvdWxkIGNhdXNlIGEgZmFpbHVyZSwgaWYgaXQgaXMgYQorICAgICAgICAgICAgICAgICMgc3RhdGljbWV0aG9kIDAgYXJndW1lbnRzIHNob3VsZCBjYXVzZSBhIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgZmFpbGluZ19hcmdfY291bnQgPSAxCisgICAgICAgICAgICAgICAgaWYgdXRpbHMuZGVjb3JhdGVkX3dpdGgoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIFthc3Ryb2lkLmJhc2VzLkJVSUxUSU5TICsgIi5zdGF0aWNtZXRob2QiXQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIGZhaWxpbmdfYXJnX2NvdW50ID0gMAorICAgICAgICAgICAgICAgIGlmIGxlbihub2RlLmFyZ3MuYXJncykgPT0gZmFpbGluZ19hcmdfY291bnQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5leHQtbWV0aG9kLWRlZmluZWQiLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInBhcmFtZXRlci11bnBhY2tpbmciKQorICAgIGRlZiB2aXNpdF9hcmd1bWVudHMoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBhcmcgaW4gbm9kZS5hcmdzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGFzdHJvaWQuVHVwbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInBhcmFtZXRlci11bnBhY2tpbmciLCBub2RlPWFyZykKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiY29tcHJlaGVuc2lvbi1lc2NhcGUiKQorICAgIGRlZiB2aXNpdF9saXN0Y29tcChzZWxmLCBub2RlKToKKyAgICAgICAgbmFtZXMgPSB7CisgICAgICAgICAgICBnZW5lcmF0b3IudGFyZ2V0Lm5hbWUKKyAgICAgICAgICAgIGZvciBnZW5lcmF0b3IgaW4gbm9kZS5nZW5lcmF0b3JzCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGdlbmVyYXRvci50YXJnZXQsIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgfQorICAgICAgICBzY29wZSA9IG5vZGUucGFyZW50LnNjb3BlKCkKKyAgICAgICAgc2NvcGVfbmFtZXMgPSBzY29wZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLk5hbWUsIHNraXBfa2xhc3M9YXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgaGFzX3JlZGVmaW5lZF9hc3NpZ25fbmFtZSA9IGFueSgKKyAgICAgICAgICAgIGFzc2lnbl9uYW1lCisgICAgICAgICAgICBmb3IgYXNzaWduX25hbWUgaW4gc2NvcGUubm9kZXNfb2ZfY2xhc3MoCisgICAgICAgICAgICAgICAgYXN0cm9pZC5Bc3NpZ25OYW1lLCBza2lwX2tsYXNzPWFzdHJvaWQuRnVuY3Rpb25EZWYKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGFzc2lnbl9uYW1lLm5hbWUgaW4gbmFtZXMgYW5kIGFzc2lnbl9uYW1lLmxpbmVubyA+IG5vZGUubGluZW5vCisgICAgICAgICkKKyAgICAgICAgaWYgaGFzX3JlZGVmaW5lZF9hc3NpZ25fbmFtZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGVtaXR0ZWRfZm9yX25hbWVzID0gc2V0KCkKKyAgICAgICAgc2NvcGVfbmFtZXMgPSBsaXN0KHNjb3BlX25hbWVzKQorICAgICAgICBmb3Igc2NvcGVfbmFtZSBpbiBzY29wZV9uYW1lczoKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBzY29wZV9uYW1lLm5hbWUgbm90IGluIG5hbWVzCisgICAgICAgICAgICAgICAgb3Igc2NvcGVfbmFtZS5saW5lbm8gPD0gbm9kZS5saW5lbm8KKyAgICAgICAgICAgICAgICBvciBzY29wZV9uYW1lLm5hbWUgaW4gZW1pdHRlZF9mb3JfbmFtZXMKKyAgICAgICAgICAgICAgICBvciBzY29wZV9uYW1lLnNjb3BlKCkgPT0gbm9kZQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBlbWl0dGVkX2Zvcl9uYW1lcy5hZGQoc2NvcGVfbmFtZS5uYW1lKQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29tcHJlaGVuc2lvbi1lc2NhcGUiLCBub2RlPXNjb3BlX25hbWUpCisKKyAgICBkZWYgdmlzaXRfbmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiRGV0ZWN0IHdoZW4gYSAiYmFkIiBidWlsdC1pbiBpcyByZWZlcmVuY2VkLiIiIgorICAgICAgICBmb3VuZF9ub2RlLCBfID0gbm9kZS5sb29rdXAobm9kZS5uYW1lKQorICAgICAgICBpZiBub3QgX2lzX2J1aWx0aW4oZm91bmRfbm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm9kZS5uYW1lIG5vdCBpbiBzZWxmLl9iYWRfYnVpbHRpbnM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm9kZV9pZ25vcmVzX2V4Y2VwdGlvbihub2RlKSBvciBpc2luc3RhbmNlKAorICAgICAgICAgICAgZmluZF90cnlfZXhjZXB0X3dyYXBwZXJfbm9kZShub2RlKSwgYXN0cm9pZC5FeGNlcHRIYW5kbGVyCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBtZXNzYWdlID0gbm9kZS5uYW1lLmxvd2VyKCkgKyAiLWJ1aWx0aW4iCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UobWVzc2FnZSwgbm9kZT1ub2RlKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJwcmludC1zdGF0ZW1lbnQiKQorICAgIGRlZiB2aXNpdF9wcmludChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgicHJpbnQtc3RhdGVtZW50Iiwgbm9kZT1ub2RlLCBhbHdheXNfd2Fybj1UcnVlKQorCisgICAgZGVmIF93YXJuX2lmX2RlcHJlY2F0ZWQoc2VsZiwgbm9kZSwgbW9kdWxlLCBhdHRyaWJ1dGVzLCByZXBvcnRfb25fbW9kdWxlcz1UcnVlKToKKyAgICAgICAgZm9yIG1lc3NhZ2UsIG1vZHVsZV9tYXAgaW4gc2VsZi5fYmFkX3B5dGhvbjNfbW9kdWxlX21hcC5pdGVtcygpOgorICAgICAgICAgICAgaWYgbW9kdWxlIGluIG1vZHVsZV9tYXAgYW5kIG1vZHVsZSBub3QgaW4gc2VsZi5fbW9kdWxlc193YXJuZWRfYWJvdXQ6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtb2R1bGVfbWFwLCBmcm96ZW5zZXQpOgorICAgICAgICAgICAgICAgICAgICBpZiByZXBvcnRfb25fbW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21vZHVsZXNfd2FybmVkX2Fib3V0LmFkZChtb2R1bGUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1lc3NhZ2UsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICBlbGlmIGF0dHJpYnV0ZXMgYW5kIG1vZHVsZV9tYXBbbW9kdWxlXS5pbnRlcnNlY3Rpb24oYXR0cmlidXRlcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UobWVzc2FnZSwgbm9kZT1ub2RlKQorCisgICAgZGVmIHZpc2l0X2ltcG9ydGZyb20oc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUubW9kbmFtZSA9PSAiX19mdXR1cmVfXyI6CisgICAgICAgICAgICBmb3IgbmFtZSwgXyBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gImRpdmlzaW9uIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnV0dXJlX2RpdmlzaW9uID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAiYWJzb2x1dGVfaW1wb3J0IjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnV0dXJlX2Fic29sdXRlX2ltcG9ydCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9mdXR1cmVfYWJzb2x1dGVfaW1wb3J0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgibm8tYWJzb2x1dGUtaW1wb3J0Iik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5vLWFic29sdXRlLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnV0dXJlX2Fic29sdXRlX2ltcG9ydCA9IFRydWUKKyAgICAgICAgICAgIGlmIG5vdCBfaXNfY29uZGl0aW9uYWxfaW1wb3J0KG5vZGUpIGFuZCBub3Qgbm9kZS5sZXZlbDoKKyAgICAgICAgICAgICAgICBzZWxmLl93YXJuX2lmX2RlcHJlY2F0ZWQobm9kZSwgbm9kZS5tb2RuYW1lLCB7eFswXSBmb3IgeCBpbiBub2RlLm5hbWVzfSkKKworICAgICAgICBpZiBub2RlLm5hbWVzWzBdWzBdID09ICIqIjoKKyAgICAgICAgICAgIGlmIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiaW1wb3J0LXN0YXItbW9kdWxlLWxldmVsIik6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS5zY29wZSgpLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImltcG9ydC1zdGFyLW1vZHVsZS1sZXZlbCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiB2aXNpdF9pbXBvcnQoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9mdXR1cmVfYWJzb2x1dGVfaW1wb3J0OgorICAgICAgICAgICAgaWYgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJuby1hYnNvbHV0ZS1pbXBvcnQiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJuby1hYnNvbHV0ZS1pbXBvcnQiLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fZnV0dXJlX2Fic29sdXRlX2ltcG9ydCA9IFRydWUKKyAgICAgICAgaWYgbm90IF9pc19jb25kaXRpb25hbF9pbXBvcnQobm9kZSk6CisgICAgICAgICAgICBmb3IgbmFtZSwgXyBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgICAgIHNlbGYuX3dhcm5faWZfZGVwcmVjYXRlZChub2RlLCBuYW1lLCBOb25lKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJtZXRhY2xhc3MtYXNzaWdubWVudCIpCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiAiX19tZXRhY2xhc3NfXyIgaW4gbm9kZS5sb2NhbHM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtZXRhY2xhc3MtYXNzaWdubWVudCIsIG5vZGU9bm9kZSkKKyAgICAgICAgbG9jYWxzX2FuZF9tZXRob2RzID0gc2V0KG5vZGUubG9jYWxzKS51bmlvbih4Lm5hbWUgZm9yIHggaW4gbm9kZS5teW1ldGhvZHMoKSkKKyAgICAgICAgaWYgIl9fZXFfXyIgaW4gbG9jYWxzX2FuZF9tZXRob2RzIGFuZCAiX19oYXNoX18iIG5vdCBpbiBsb2NhbHNfYW5kX21ldGhvZHM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJlcS13aXRob3V0LWhhc2giLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoIm9sZC1kaXZpc2lvbiIpCisgICAgZGVmIHZpc2l0X2Jpbm9wKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZnV0dXJlX2RpdmlzaW9uIGFuZCBub2RlLm9wID09ICIvIjoKKyAgICAgICAgICAgIGZvciBhcmcgaW4gKG5vZGUubGVmdCwgbm9kZS5yaWdodCk6CisgICAgICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKGFyZykKKyAgICAgICAgICAgICAgICAjIElmIHdlIGNhbiBpbmZlciB0aGUgb2JqZWN0IGFuZCB0aGF0IG9iamVjdCBpcyBub3QgYW4gaW50LCBiYWlsIG91dC4KKyAgICAgICAgICAgICAgICBpZiBpbmZlcnJlZCBhbmQgbm90ICgKKyAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5Db25zdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGluZmVycmVkLnZhbHVlLCBpbnQpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgb3IgKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5JbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmZlcnJlZC5uYW1lID09ICJpbnQiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJvbGQtZGl2aXNpb24iLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2NtcF9hcmd1bWVudChzZWxmLCBub2RlKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBgY21wYCBhcmd1bWVudCBpcyB1c2VkCisgICAgICAgIGt3YXJncyA9IFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5mdW5jLCBhc3Ryb2lkLkF0dHJpYnV0ZSkgYW5kIG5vZGUuZnVuYy5hdHRybmFtZSA9PSAic29ydCI6CisgICAgICAgICAgICBpbmZlcnJlZCA9IHV0aWxzLnNhZmVfaW5mZXIobm9kZS5mdW5jLmV4cHIpCisgICAgICAgICAgICBpZiBub3QgaW5mZXJyZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGJ1aWx0aW5zX2xpc3QgPSBmInthc3Ryb2lkLmJhc2VzLkJVSUxUSU5TfS5saXN0IgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5MaXN0KSBvciBpbmZlcnJlZC5xbmFtZSgpID09IGJ1aWx0aW5zX2xpc3Q6CisgICAgICAgICAgICAgICAga3dhcmdzID0gbm9kZS5rZXl3b3JkcworCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuTmFtZSkgYW5kIG5vZGUuZnVuYy5uYW1lID09ICJzb3J0ZWQiOgorICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKG5vZGUuZnVuYykKKyAgICAgICAgICAgIGlmIG5vdCBpbmZlcnJlZDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgYnVpbHRpbnNfc29ydGVkID0gZiJ7YXN0cm9pZC5iYXNlcy5CVUlMVElOU30uc29ydGVkIgorICAgICAgICAgICAgaWYgaW5mZXJyZWQucW5hbWUoKSA9PSBidWlsdGluc19zb3J0ZWQ6CisgICAgICAgICAgICAgICAga3dhcmdzID0gbm9kZS5rZXl3b3JkcworCisgICAgICAgIGZvciBrd2FyZyBpbiBrd2FyZ3Mgb3IgW106CisgICAgICAgICAgICBpZiBrd2FyZy5hcmcgPT0gImNtcCI6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidXNpbmctY21wLWFyZ3VtZW50Iiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfY29uc3RhbnRfc3RyaW5nX29yX25hbWUobm9kZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShub2RlLnZhbHVlLCBzdHIpCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuTmFtZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX25vbmUobm9kZSk6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ29uc3QpIGFuZCBub2RlLnZhbHVlIGlzIE5vbmUKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2hhc19vbmx5X25fcG9zaXRpb25hbF9hcmdzKG5vZGUsIG51bWJlcl9vZl9hcmdzKToKKyAgICAgICAgcmV0dXJuIGxlbihub2RlLmFyZ3MpID09IG51bWJlcl9vZl9hcmdzIGFuZCBhbGwobm9kZS5hcmdzKSBhbmQgbm90IG5vZGUua2V5d29yZHMKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NvdWxkX2JlX3N0cmluZyhpbmZlcnJlZF90eXBlcyk6CisgICAgICAgIGNvbmZpZGVuY2UgPSBJTkZFUkVOQ0UgaWYgaW5mZXJyZWRfdHlwZXMgZWxzZSBJTkZFUkVOQ0VfRkFJTFVSRQorICAgICAgICBmb3IgaW5mZXJyZWRfdHlwZSBpbiBpbmZlcnJlZF90eXBlczoKKyAgICAgICAgICAgIGlmIGluZmVycmVkX3R5cGUgaXMgYXN0cm9pZC5VbmluZmVyYWJsZToKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlID0gSU5GRVJFTkNFX0ZBSUxVUkUKKyAgICAgICAgICAgIGVsaWYgbm90ICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGluZmVycmVkX3R5cGUsIGFzdHJvaWQuQ29uc3QpCisgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoaW5mZXJyZWRfdHlwZS52YWx1ZSwgc3RyKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gY29uZmlkZW5jZQorCisgICAgZGVmIHZpc2l0X2NhbGwoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX2NtcF9hcmd1bWVudChub2RlKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5mdW5jLCBhc3Ryb2lkLkF0dHJpYnV0ZSk6CisgICAgICAgICAgICBpbmZlcnJlZF90eXBlcyA9IHNldCgpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgaW5mZXJyZWRfcmVjZWl2ZXIgaW4gX2luZmVyX2lmX3JlbGV2YW50X2F0dHIoCisgICAgICAgICAgICAgICAgICAgIG5vZGUuZnVuYywgc2VsZi5fcmVsZXZhbnRfY2FsbF9hdHRycworICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIGlmIGluZmVycmVkX3JlY2VpdmVyIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpbmZlcnJlZF90eXBlcy5hZGQoaW5mZXJyZWRfcmVjZWl2ZXIpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWRfcmVjZWl2ZXIsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dhcm5faWZfZGVwcmVjYXRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZmVycmVkX3JlY2VpdmVyLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge25vZGUuZnVuYy5hdHRybmFtZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X29uX21vZHVsZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbmZlcnJlZF92YWx1ZV9pc19kaWN0KGluZmVycmVkX3JlY2VpdmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vZGUuZnVuYy5hdHRybmFtZSBpbiBESUNUX01FVEhPRFMKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaW5faXRlcmF0aW5nX2NvbnRleHQobm9kZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlciA9IGYiZGljdC17bm9kZS5mdW5jLmF0dHJuYW1lfS1ub3QtaXRlcmF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoY2hlY2tlciwgbm9kZT1ub2RlKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbm9kZS5hcmdzOgorICAgICAgICAgICAgICAgIGlzX3N0cl9jb25maWRlbmNlID0gc2VsZi5fY291bGRfYmVfc3RyaW5nKGluZmVycmVkX3R5cGVzKQorICAgICAgICAgICAgICAgIGlmIGlzX3N0cl9jb25maWRlbmNlOgorICAgICAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZ1bmMuYXR0cm5hbWUgaW4gKCJlbmNvZGUiLCAiZGVjb2RlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBsZW4obm9kZS5hcmdzKSA+PSAxCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm9kZS5hcmdzWzBdCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9hcmcgPSBub2RlLmFyZ3NbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2VuY29kaW5nKGZpcnN0X2FyZywgbm9kZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mdW5jLmF0dHJuYW1lID09ICJ0cmFuc2xhdGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VsZi5faGFzX29ubHlfbl9wb3NpdGlvbmFsX2FyZ3Mobm9kZSwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9pc19ub25lKG5vZGUuYXJnc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLl9pc19jb25zdGFudF9zdHJpbmdfb3JfbmFtZShub2RlLmFyZ3NbMV0pCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBhYm92ZSBzdGF0ZW1lbnQgbG9va2luZyBmb3IgY2FsbHMgb2YgdGhlIGZvcm06CisgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAjIGZvby50cmFuc2xhdGUoTm9uZSwgJ2FiYzEyMycpCisgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAjIGZvby50cmFuc2xhdGUoTm9uZSwgc29tZV92YXJpYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBjaGVjayBpcyBzb21ld2hhdCBicm9hZCBhbmQgX21heV8gaGF2ZSBzb21lIGZhbHNlIHBvc2l0aXZlcywgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAjIGFmdGVyIGNoZWNraW5nIHNldmVyYWwgbGFyZ2UgY29kZWJhc2VzIGl0IGRpZCBub3QgaGF2ZSBhbnkgZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zaXRpdmVzIHdoaWxlIGZpbmRpbmcgc2V2ZXJhbCByZWFsIGlzc3Vlcy4gIFRoaXMgY2FsbCBwYXR0ZXJuIHNlZW1zCisgICAgICAgICAgICAgICAgICAgICAgICAjIHJhcmUgZW5vdWdoIHRoYXQgdGhlIHRyYWRlIG9mZiBpcyB3b3J0aCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcHJlY2F0ZWQtc3RyLXRyYW5zbGF0ZS1jYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1pc19zdHJfY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vZGUua2V5d29yZHM6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub2RlLmZ1bmMuYXR0cm5hbWUgPT0gIm5leHQiOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5leHQtbWV0aG9kLWNhbGxlZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIGVsaWYgbm9kZS5mdW5jLmF0dHJuYW1lIGluICgiaXRlcmtleXMiLCAiaXRlcnZhbHVlcyIsICJpdGVyaXRlbXMiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJkaWN0LWl0ZXItbWV0aG9kIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgZWxpZiBub2RlLmZ1bmMuYXR0cm5hbWUgaW4gKCJ2aWV3a2V5cyIsICJ2aWV3dmFsdWVzIiwgInZpZXdpdGVtcyIpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImRpY3Qtdmlldy1tZXRob2QiLCBub2RlPW5vZGUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICBmb3VuZF9ub2RlID0gbm9kZS5mdW5jLmxvb2t1cChub2RlLmZ1bmMubmFtZSlbMF0KKyAgICAgICAgICAgIGlmIF9pc19idWlsdGluKGZvdW5kX25vZGUpOgorICAgICAgICAgICAgICAgIGlmIG5vZGUuZnVuYy5uYW1lIGluICgiZmlsdGVyIiwgIm1hcCIsICJyYW5nZSIsICJ6aXAiKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9pbl9pdGVyYXRpbmdfY29udGV4dChub2RlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIgPSBmIntub2RlLmZ1bmMubmFtZX0tYnVpbHRpbi1ub3QtaXRlcmF0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZShjaGVja2VyLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgZWxpZiBub2RlLmZ1bmMubmFtZSA9PSAib3BlbiIgYW5kIG5vZGUua2V5d29yZHM6CisgICAgICAgICAgICAgICAgICAgIGt3YXJncyA9IG5vZGUua2V5d29yZHMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGt3YXJnIGluIGt3YXJncyBvciBbXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGt3YXJnLmFyZyA9PSAiZW5jb2RpbmciOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2VuY29kaW5nKGt3YXJnLnZhbHVlLCBub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgX3ZhbGlkYXRlX2VuY29kaW5nKHNlbGYsIGVuY29kaW5nLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShlbmNvZGluZywgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICB2YWx1ZSA9IGVuY29kaW5nLnZhbHVlCisgICAgICAgICAgICBpZiB2YWx1ZSBpbiBzZWxmLl9pbnZhbGlkX2VuY29kaW5nczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJpbnZhbGlkLXN0ci1jb2RlYyIsIG5vZGU9bm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiaW5kZXhpbmctZXhjZXB0aW9uIikKKyAgICBkZWYgdmlzaXRfc3Vic2NyaXB0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJMb29rIGZvciBpbmRleGluZyBleGNlcHRpb25zLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaW5mZXJyZWQgaW4gbm9kZS52YWx1ZS5pbmZlcigpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkluc3RhbmNlKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiB1dGlscy5pbmhlcml0X2Zyb21fc3RkX2V4KGluZmVycmVkKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW5kZXhpbmctZXhjZXB0aW9uIiwgbm9kZT1ub2RlKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIHZpc2l0X2Fzc2lnbmF0dHIoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5hc3NpZ25fdHlwZSgpLCBhc3Ryb2lkLkF1Z0Fzc2lnbik6CisgICAgICAgICAgICBzZWxmLnZpc2l0X2F0dHJpYnV0ZShub2RlKQorCisgICAgZGVmIHZpc2l0X2RlbGF0dHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImV4Y2VwdGlvbi1tZXNzYWdlLWF0dHJpYnV0ZSIsICJ4cmVhZGxpbmVzLWF0dHJpYnV0ZSIpCisgICAgZGVmIHZpc2l0X2F0dHJpYnV0ZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiTG9vayBmb3IgcmVtb3ZlZCBhdHRyaWJ1dGVzIiIiCisgICAgICAgIGlmIG5vZGUuYXR0cm5hbWUgPT0gInhyZWFkbGluZXMiOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgieHJlYWRsaW5lcy1hdHRyaWJ1dGUiLCBub2RlPW5vZGUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBleGNlcHRpb25fbWVzc2FnZSA9ICJtZXNzYWdlIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaW5mZXJyZWQgaW4gX2luZmVyX2lmX3JlbGV2YW50X2F0dHIoCisgICAgICAgICAgICAgICAgbm9kZSwgc2VsZi5fZGVwcmVjYXRlZF9hdHRycyB8IHtleGNlcHRpb25fbWVzc2FnZX0KKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5JbnN0YW5jZSkgYW5kIHV0aWxzLmluaGVyaXRfZnJvbV9zdGRfZXgoCisgICAgICAgICAgICAgICAgICAgIGluZmVycmVkCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5hdHRybmFtZSA9PSBleGNlcHRpb25fbWVzc2FnZToKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBFeGNlcHRpb25zIHdpdGggLm1lc3NhZ2UgY2xlYXJseSBkZWZpbmVkIGFyZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4Y2VwdGlvbl9tZXNzYWdlIGluIGluZmVycmVkLmluc3RhbmNlX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJleGNlcHRpb24tbWVzc2FnZS1hdHRyaWJ1dGUiLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5Nb2R1bGUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl93YXJuX2lmX2RlcHJlY2F0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLCBpbmZlcnJlZC5uYW1lLCB7bm9kZS5hdHRybmFtZX0sIHJlcG9ydF9vbl9tb2R1bGVzPUZhbHNlCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidW5wYWNraW5nLWluLWV4Y2VwdCIsICJjb21wcmVoZW5zaW9uLWVzY2FwZSIpCisgICAgZGVmIHZpc2l0X2V4Y2VwdGhhbmRsZXIoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlZpc2l0IGFuIGV4Y2VwdCBoYW5kbGVyIGJsb2NrIGFuZCBjaGVjayBmb3IgZXhjZXB0aW9uIHVucGFja2luZy4iIiIKKworICAgICAgICBkZWYgX2lzX3VzZWRfaW5fZXhjZXB0X2Jsb2NrKG5vZGUsIGJsb2NrKToKKyAgICAgICAgICAgIGN1cnJlbnQgPSBub2RlCisgICAgICAgICAgICB3aGlsZSBjdXJyZW50IGFuZCBjdXJyZW50IGlzIG5vdCBibG9jazoKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50IGlzIG5vdCBOb25lCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm5hbWUsIChhc3Ryb2lkLlR1cGxlLCBhc3Ryb2lkLkxpc3QpKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVucGFja2luZy1pbi1leGNlcHQiLCBub2RlPW5vZGUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3Qgbm9kZS5uYW1lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBGaW5kIGFueSBuYW1lcworICAgICAgICBzY29wZSA9IG5vZGUucGFyZW50LnNjb3BlKCkKKyAgICAgICAgc2NvcGVfbmFtZXMgPSBzY29wZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLk5hbWUsIHNraXBfa2xhc3M9YXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgc2NvcGVfbmFtZXMgPSBsaXN0KHNjb3BlX25hbWVzKQorICAgICAgICBwb3RlbnRpYWxfbGVha2VkX25hbWVzID0gWworICAgICAgICAgICAgc2NvcGVfbmFtZQorICAgICAgICAgICAgZm9yIHNjb3BlX25hbWUgaW4gc2NvcGVfbmFtZXMKKyAgICAgICAgICAgIGlmIHNjb3BlX25hbWUubmFtZSA9PSBub2RlLm5hbWUubmFtZQorICAgICAgICAgICAgYW5kIHNjb3BlX25hbWUubGluZW5vID4gbm9kZS5saW5lbm8KKyAgICAgICAgICAgIGFuZCBub3QgX2lzX3VzZWRfaW5fZXhjZXB0X2Jsb2NrKHNjb3BlX25hbWUsIG5vZGUpCisgICAgICAgIF0KKyAgICAgICAgcmVhc3NpZ25tZW50c19mb3Jfc2FtZV9uYW1lID0geworICAgICAgICAgICAgYXNzaWduX25hbWUubGluZW5vCisgICAgICAgICAgICBmb3IgYXNzaWduX25hbWUgaW4gc2NvcGUubm9kZXNfb2ZfY2xhc3MoCisgICAgICAgICAgICAgICAgYXN0cm9pZC5Bc3NpZ25OYW1lLCBza2lwX2tsYXNzPWFzdHJvaWQuRnVuY3Rpb25EZWYKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGFzc2lnbl9uYW1lLm5hbWUgPT0gbm9kZS5uYW1lLm5hbWUKKyAgICAgICAgfQorICAgICAgICBmb3IgbGVha2VkX25hbWUgaW4gcG90ZW50aWFsX2xlYWtlZF9uYW1lczoKKyAgICAgICAgICAgIGlmIGFueSgKKyAgICAgICAgICAgICAgICBub2RlLmxpbmVubyA8IGVsZW0gPCBsZWFrZWRfbmFtZS5saW5lbm8KKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiByZWFzc2lnbm1lbnRzX2Zvcl9zYW1lX25hbWUKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImV4Y2VwdGlvbi1lc2NhcGUiLCBub2RlPWxlYWtlZF9uYW1lKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJiYWNrdGljayIpCisgICAgZGVmIHZpc2l0X3JlcHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhY2t0aWNrIiwgbm9kZT1ub2RlKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJyYWlzaW5nLXN0cmluZyIsICJvbGQtcmFpc2Utc3ludGF4IikKKyAgICBkZWYgdmlzaXRfcmFpc2Uoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlZpc2l0IGEgcmFpc2Ugc3RhdGVtZW50IGFuZCBjaGVjayBmb3IgcmFpc2luZworICAgICAgICBzdHJpbmdzIG9yIG9sZC1yYWlzZS1zeW50YXguCisgICAgICAgICIiIgorCisgICAgICAgICMgSWdub3JlIGVtcHR5IHJhaXNlLgorICAgICAgICBpZiBub2RlLmV4YyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4cHIgPSBub2RlLmV4YworICAgICAgICBpZiBzZWxmLl9jaGVja19yYWlzZV92YWx1ZShub2RlLCBleHByKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IG5leHQoYXN0cm9pZC51bnBhY2tfaW5mZXIoZXhwcikpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NoZWNrX3JhaXNlX3ZhbHVlKG5vZGUsIHZhbHVlKQorCisgICAgZGVmIF9jaGVja19yYWlzZV92YWx1ZShzZWxmLCBub2RlLCBleHByKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHByLCBhc3Ryb2lkLkNvbnN0KToKKyAgICAgICAgICAgIHZhbHVlID0gZXhwci52YWx1ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJyYWlzaW5nLXN0cmluZyIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIFB5dGhvbjNUb2tlbkNoZWNrZXIoY2hlY2tlcnMuQmFzZVRva2VuQ2hlY2tlcik6CisgICAgX19pbXBsZW1lbnRzX18gPSBpbnRlcmZhY2VzLklUb2tlbkNoZWNrZXIKKyAgICBuYW1lID0gInB5dGhvbjMiCisgICAgZW5hYmxlZCA9IEZhbHNlCisKKyAgICBtc2dzID0geworICAgICAgICAiRTE2MDYiOiAoCisgICAgICAgICAgICAiVXNlIG9mIGxvbmcgc3VmZml4IiwKKyAgICAgICAgICAgICJsb25nLXN1ZmZpeCIsCisgICAgICAgICAgICAnVXNlZCB3aGVuICJsIiBvciAiTCIgaXMgdXNlZCB0byBtYXJrIGEgbG9uZyBpbnRlZ2VyLiAnCisgICAgICAgICAgICAiVGhpcyB3aWxsIG5vdCB3b3JrIGluIFB5dGhvbiAzLCBzaW5jZSBgaW50YCBhbmQgYGxvbmdgICIKKyAgICAgICAgICAgICJ0eXBlcyBoYXZlIG1lcmdlZC4iLAorICAgICAgICAgICAgeyJtYXh2ZXJzaW9uIjogKDMsIDApfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkUxNjA3IjogKAorICAgICAgICAgICAgIlVzZSBvZiB0aGUgPD4gb3BlcmF0b3IiLAorICAgICAgICAgICAgIm9sZC1uZS1vcGVyYXRvciIsCisgICAgICAgICAgICAnVXNlZCB3aGVuIHRoZSBkZXByZWNhdGVkICI8PiIgb3BlcmF0b3IgaXMgdXNlZCBpbnN0ZWFkICcKKyAgICAgICAgICAgICdvZiAiIT0iLiBUaGlzIGlzIHJlbW92ZWQgaW4gUHl0aG9uIDMuJywKKyAgICAgICAgICAgIHsibWF4dmVyc2lvbiI6ICgzLCAwKSwgIm9sZF9uYW1lcyI6IFsoIlcwMzMxIiwgIm9sZC1vbGQtbmUtb3BlcmF0b3IiKV19LAorICAgICAgICApLAorICAgICAgICAiRTE2MDgiOiAoCisgICAgICAgICAgICAiVXNlIG9mIG9sZCBvY3RhbCBsaXRlcmFsIiwKKyAgICAgICAgICAgICJvbGQtb2N0YWwtbGl0ZXJhbCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGVuY291bnRlcmluZyB0aGUgb2xkIG9jdGFsIHN5bnRheCwgIgorICAgICAgICAgICAgInJlbW92ZWQgaW4gUHl0aG9uIDMuIFRvIHVzZSB0aGUgbmV3IHN5bnRheCwgIgorICAgICAgICAgICAgInByZXBlbmQgMG8gb24gdGhlIG51bWJlci4iLAorICAgICAgICAgICAgeyJtYXh2ZXJzaW9uIjogKDMsIDApfSwKKyAgICAgICAgKSwKKyAgICAgICAgIkUxNjEwIjogKAorICAgICAgICAgICAgIk5vbi1hc2NpaSBieXRlcyBsaXRlcmFscyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCisgICAgICAgICAgICAibm9uLWFzY2lpLWJ5dGVzLWxpdGVyYWwiLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBub24tYXNjaWkgYnl0ZXMgbGl0ZXJhbHMgYXJlIGZvdW5kIGluIGEgcHJvZ3JhbS4gIgorICAgICAgICAgICAgIlRoZXkgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUHl0aG9uIDMuIiwKKyAgICAgICAgICAgIHsibWF4dmVyc2lvbiI6ICgzLCAwKX0sCisgICAgICAgICksCisgICAgfQorCisgICAgZGVmIHByb2Nlc3NfdG9rZW5zKHNlbGYsIHRva2Vucyk6CisgICAgICAgIGZvciBpZHgsICh0b2tfdHlwZSwgdG9rZW4sIHN0YXJ0LCBfLCBfKSBpbiBlbnVtZXJhdGUodG9rZW5zKToKKyAgICAgICAgICAgIGlmIHRva190eXBlID09IHRva2VuaXplLk5VTUJFUjoKKyAgICAgICAgICAgICAgICBpZiB0b2tlbi5sb3dlcigpLmVuZHN3aXRoKCJsIik6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBoYXMgYSBkaWZmZXJlbnQgc2VtYW50aWMgdGhhbiBsb3dlcmNhc2UtbC1zdWZmaXguCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImxvbmctc3VmZml4IiwgbGluZT1zdGFydFswXSkKKyAgICAgICAgICAgICAgICBlbGlmIF9pc19vbGRfb2N0YWwodG9rZW4pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJvbGQtb2N0YWwtbGl0ZXJhbCIsIGxpbmU9c3RhcnRbMF0pCisgICAgICAgICAgICBpZiB0b2tlbnNbaWR4XVsxXSA9PSAiPD4iOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm9sZC1uZS1vcGVyYXRvciIsIGxpbmU9dG9rZW5zW2lkeF1bMl1bMF0pCisgICAgICAgICAgICBpZiB0b2tfdHlwZSA9PSB0b2tlbml6ZS5TVFJJTkcgYW5kIHRva2VuLnN0YXJ0c3dpdGgoImIiKToKKyAgICAgICAgICAgICAgICBpZiBhbnkoZWxlbSBmb3IgZWxlbSBpbiB0b2tlbiBpZiBvcmQoZWxlbSkgPiAxMjcpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJub24tYXNjaWktYnl0ZXMtbGl0ZXJhbCIsIGxpbmU9c3RhcnRbMF0pCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoUHl0aG9uM0NoZWNrZXIobGludGVyKSkKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihQeXRob24zVG9rZW5DaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvcmF3X21ldHJpY3MucHkgYi9weWxpbnQvY2hlY2tlcnMvcmF3X21ldHJpY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9yYXdfbWV0cmljcy5weQpAQCAtMCwwICsxLDEyMiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAsIDIwMTMsIDIwMTUgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbGVubkBlLWRhZC5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMSBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCDosK3kuZ3pvI4gPDEwOTIyNDU3M0BxcS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IHRva2VuaXplCitmcm9tIHR5cGluZyBpbXBvcnQgQW55CisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlVG9rZW5DaGVja2VyCitmcm9tIHB5bGludC5leGNlcHRpb25zIGltcG9ydCBFbXB0eVJlcG9ydEVycm9yCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJVG9rZW5DaGVja2VyCitmcm9tIHB5bGludC5yZXBvcnRlcnMudXJlcG9ydHMubm9kZXMgaW1wb3J0IFRhYmxlCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgZGlmZl9zdHJpbmcKKworCitkZWYgcmVwb3J0X3Jhd19zdGF0cyhzZWN0LCBzdGF0cywgb2xkX3N0YXRzKToKKyAgICAiIiJjYWxjdWxhdGUgcGVyY2VudGFnZSBvZiBjb2RlIC8gZG9jIC8gY29tbWVudCAvIGVtcHR5IiIiCisgICAgdG90YWxfbGluZXMgPSBzdGF0c1sidG90YWxfbGluZXMiXQorICAgIGlmIG5vdCB0b3RhbF9saW5lczoKKyAgICAgICAgcmFpc2UgRW1wdHlSZXBvcnRFcnJvcigpCisgICAgc2VjdC5kZXNjcmlwdGlvbiA9ICIlcyBsaW5lcyBoYXZlIGJlZW4gYW5hbHl6ZWQiICUgdG90YWxfbGluZXMKKyAgICBsaW5lcyA9ICgidHlwZSIsICJudW1iZXIiLCAiJSIsICJwcmV2aW91cyIsICJkaWZmZXJlbmNlIikKKyAgICBmb3Igbm9kZV90eXBlIGluICgiY29kZSIsICJkb2NzdHJpbmciLCAiY29tbWVudCIsICJlbXB0eSIpOgorICAgICAgICBrZXkgPSBub2RlX3R5cGUgKyAiX2xpbmVzIgorICAgICAgICB0b3RhbCA9IHN0YXRzW2tleV0KKyAgICAgICAgcGVyY2VudCA9IGZsb2F0KHRvdGFsICogMTAwKSAvIHRvdGFsX2xpbmVzCisgICAgICAgIG9sZCA9IG9sZF9zdGF0cy5nZXQoa2V5LCBOb25lKQorICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkaWZmX3N0ciA9IGRpZmZfc3RyaW5nKG9sZCwgdG90YWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvbGQsIGRpZmZfc3RyID0gIk5DIiwgIk5DIgorICAgICAgICBsaW5lcyArPSAobm9kZV90eXBlLCBzdHIodG90YWwpLCAiJS4yZiIgJSBwZXJjZW50LCBzdHIob2xkKSwgZGlmZl9zdHIpCisgICAgc2VjdC5hcHBlbmQoVGFibGUoY2hpbGRyZW49bGluZXMsIGNvbHM9NSwgcmhlYWRlcnM9MSkpCisKKworY2xhc3MgUmF3TWV0cmljc0NoZWNrZXIoQmFzZVRva2VuQ2hlY2tlcik6CisgICAgIiIiZG9lcyBub3QgY2hlY2sgYW55dGhpbmcgYnV0IGdpdmVzIHNvbWUgcmF3IG1ldHJpY3MgOgorICAgICogdG90YWwgbnVtYmVyIG9mIGxpbmVzCisgICAgKiB0b3RhbCBudW1iZXIgb2YgY29kZSBsaW5lcworICAgICogdG90YWwgbnVtYmVyIG9mIGRvY3N0cmluZyBsaW5lcworICAgICogdG90YWwgbnVtYmVyIG9mIGNvbW1lbnRzIGxpbmVzCisgICAgKiB0b3RhbCBudW1iZXIgb2YgZW1wdHkgbGluZXMKKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElUb2tlbkNoZWNrZXIsKQorCisgICAgIyBjb25maWd1cmF0aW9uIHNlY3Rpb24gbmFtZQorICAgIG5hbWUgPSAibWV0cmljcyIKKyAgICAjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICAgIG9wdGlvbnMgPSAoKQorICAgICMgbWVzc2FnZXMKKyAgICBtc2dzOiBBbnkgPSB7fQorICAgICMgcmVwb3J0cworICAgIHJlcG9ydHMgPSAoKCJSUDA3MDEiLCAiUmF3IG1ldHJpY3MiLCByZXBvcnRfcmF3X3N0YXRzKSwpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGludGVyKToKKyAgICAgICAgQmFzZVRva2VuQ2hlY2tlci5fX2luaXRfXyhzZWxmLCBsaW50ZXIpCisgICAgICAgIHNlbGYuc3RhdHMgPSBOb25lCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIiIiaW5pdCBzdGF0aXN0aWNzIiIiCisgICAgICAgIHNlbGYuc3RhdHMgPSBzZWxmLmxpbnRlci5hZGRfc3RhdHMoCisgICAgICAgICAgICB0b3RhbF9saW5lcz0wLAorICAgICAgICAgICAgY29kZV9saW5lcz0wLAorICAgICAgICAgICAgZW1wdHlfbGluZXM9MCwKKyAgICAgICAgICAgIGRvY3N0cmluZ19saW5lcz0wLAorICAgICAgICAgICAgY29tbWVudF9saW5lcz0wLAorICAgICAgICApCisKKyAgICBkZWYgcHJvY2Vzc190b2tlbnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIiIidXBkYXRlIHN0YXRzIiIiCisgICAgICAgIGkgPSAwCisgICAgICAgIHRva2VucyA9IGxpc3QodG9rZW5zKQorICAgICAgICB3aGlsZSBpIDwgbGVuKHRva2Vucyk6CisgICAgICAgICAgICBpLCBsaW5lc19udW1iZXIsIGxpbmVfdHlwZSA9IGdldF90eXBlKHRva2VucywgaSkKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbInRvdGFsX2xpbmVzIl0gKz0gbGluZXNfbnVtYmVyCisgICAgICAgICAgICBzZWxmLnN0YXRzW2xpbmVfdHlwZV0gKz0gbGluZXNfbnVtYmVyCisKKworSlVOSyA9ICh0b2tlbml6ZS5OTCwgdG9rZW5pemUuSU5ERU5ULCB0b2tlbml6ZS5ORVdMSU5FLCB0b2tlbml6ZS5FTkRNQVJLRVIpCisKKworZGVmIGdldF90eXBlKHRva2Vucywgc3RhcnRfaW5kZXgpOgorICAgICIiInJldHVybiB0aGUgbGluZSB0eXBlIDogZG9jc3RyaW5nLCBjb21tZW50LCBjb2RlLCBlbXB0eSIiIgorICAgIGkgPSBzdGFydF9pbmRleAorICAgIHN0YXJ0ID0gdG9rZW5zW2ldWzJdCisgICAgcG9zID0gc3RhcnQKKyAgICBsaW5lX3R5cGUgPSBOb25lCisgICAgd2hpbGUgaSA8IGxlbih0b2tlbnMpIGFuZCB0b2tlbnNbaV1bMl1bMF0gPT0gc3RhcnRbMF06CisgICAgICAgIHRva190eXBlID0gdG9rZW5zW2ldWzBdCisgICAgICAgIHBvcyA9IHRva2Vuc1tpXVszXQorICAgICAgICBpZiBsaW5lX3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHRva190eXBlID09IHRva2VuaXplLlNUUklORzoKKyAgICAgICAgICAgICAgICBsaW5lX3R5cGUgPSAiZG9jc3RyaW5nX2xpbmVzIgorICAgICAgICAgICAgZWxpZiB0b2tfdHlwZSA9PSB0b2tlbml6ZS5DT01NRU5UOgorICAgICAgICAgICAgICAgIGxpbmVfdHlwZSA9ICJjb21tZW50X2xpbmVzIgorICAgICAgICAgICAgZWxpZiB0b2tfdHlwZSBpbiBKVU5LOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZV90eXBlID0gImNvZGVfbGluZXMiCisgICAgICAgIGkgKz0gMQorICAgIGlmIGxpbmVfdHlwZSBpcyBOb25lOgorICAgICAgICBsaW5lX3R5cGUgPSAiZW1wdHlfbGluZXMiCisgICAgZWxpZiBpIDwgbGVuKHRva2VucykgYW5kIHRva2Vuc1tpXVswXSA9PSB0b2tlbml6ZS5ORVdMSU5FOgorICAgICAgICBpICs9IDEKKyAgICByZXR1cm4gaSwgcG9zWzBdIC0gc3RhcnRbMF0gKyAxLCBsaW5lX3R5cGUKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihSYXdNZXRyaWNzQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2NoZWNrZXJzL3JlZmFjdG9yaW5nL19faW5pdF9fLnB5IGIvcHlsaW50L2NoZWNrZXJzL3JlZmFjdG9yaW5nL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzAwODQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3JpbmcvX19pbml0X18ucHkKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgTW9pc2VzIExvcGV6IDxtb3lsb3AyNjBAdmF1eG9vLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhhbmRlciBUb2Rvcm92IDxhdG9kb3JvdkBvdGIuYmc+CisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE4LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBIdWdvIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgxYF1a2FzeiBTem51ayA8bHNAcmRwcm9qZWt0LnBsPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgQWxleCBIZWFybiA8YWxleC5kLmhlYXJuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IEFudG9uaW8gT3NzYSA8YWFvc3NhQHVjLmNsPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEp1c3RpbiBMaSA8anVzdGlubmhsaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBKaW0gUm9iZXJ0c29uIDxqcm9iZXJ0c29uOThhdHhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVjYXMgQ2ltb24gPGx1Y2FzLmNpbW9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEJlbiBKYW1lcyA8YmVuamFtZXMxOTk5QGhvdG1haWwuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxOCBUb21lciBDaGFjaGFtdSA8dG9tZXIuY2hhY2hhbXVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTmljayBEcm96ZCA8bmljaG9sYXNkcm96ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBLb25zdGFudGluIE1hbm5hIDxLb25zdGFudGluQE1hbm5hLnVubz4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEtvbnN0YW50aW4gPEdpdGh1YkBwaGVhbmV4LmRlPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTWF0ZWogTWFydcWhw6FrIDxtYXJ1c2FrLm1hdGVqQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1yLiBTZW5rbyA8YXRvZG9yb3ZAbXJzZW5rby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgUsOpbWkgQ2FyZG9uYSA8cmVtaS5jYXJkb25hQHBvbHljb25zZWlsLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgUm9iZXJ0IFNjaHdlaXplciA8cm9iZXJ0X3NjaHdlaXplckBnbXguZGU+CisjIENvcHlyaWdodCAoYykgMjAxOSBQSGVhbkVYIDxnaXRodWJAcGhlYW5leC5kZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFBhdWwgUmVudm9pc2UgPFBhdWxSZW52b2lzZUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBldGhhbi1sZWJhIDxldGhhbmxlYmE1QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGxyamJhbGwgPDUwNTk5MTEwK2xyamJhbGxAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgWWFuZyBZYW5nIDx5NG45c3F1YXJlZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJMb29rcyBmb3IgY29kZSB3aGljaCBjYW4gYmUgcmVmYWN0b3JlZC4iIiIKKworCitmcm9tIHB5bGludC5jaGVja2Vycy5yZWZhY3RvcmluZy5sZW5fY2hlY2tlciBpbXBvcnQgTGVuQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMucmVmYWN0b3Jpbmcubm90X2NoZWNrZXIgaW1wb3J0IE5vdENoZWNrZXIKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnJlZmFjdG9yaW5nLnJlY29tbWVuZGF0aW9uX2NoZWNrZXIgaW1wb3J0IFJlY29tbWVuZGF0aW9uQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMucmVmYWN0b3JpbmcucmVmYWN0b3JpbmdfY2hlY2tlciBpbXBvcnQgUmVmYWN0b3JpbmdDaGVja2VyCisKK19fYWxsX18gPSBbIkxlbkNoZWNrZXIiLCAiTm90Q2hlY2tlciIsICJSZWNvbW1lbmRhdGlvbkNoZWNrZXIiLCAiUmVmYWN0b3JpbmdDaGVja2VyIl0KKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJSZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIuIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoUmVmYWN0b3JpbmdDaGVja2VyKGxpbnRlcikpCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoTm90Q2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFJlY29tbWVuZGF0aW9uQ2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKExlbkNoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9yZWZhY3RvcmluZy9sZW5fY2hlY2tlci5weSBiL3B5bGludC9jaGVja2Vycy9yZWZhY3RvcmluZy9sZW5fY2hlY2tlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTMyYTYzCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL3JlZmFjdG9yaW5nL2xlbl9jaGVja2VyLnB5CkBAIC0wLDAgKzEsMTIxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCitmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGludGVyZmFjZXMKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCB1dGlscworCisKK2NsYXNzIExlbkNoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrcyBmb3IgaW5jb3JyZWN0IHVzYWdlIG9mIGxlbigpIGluc2lkZSBjb25kaXRpb25zLgorICAgIFBlcDggc3RhdGVzOgorICAgIEZvciBzZXF1ZW5jZXMsIChzdHJpbmdzLCBsaXN0cywgdHVwbGVzKSwgdXNlIHRoZSBmYWN0IHRoYXQgZW1wdHkgc2VxdWVuY2VzIGFyZSBmYWxzZS4KKworICAgICAgICBZZXM6IGlmIG5vdCBzZXE6CisgICAgICAgICAgICAgaWYgc2VxOgorCisgICAgICAgIE5vOiBpZiBsZW4oc2VxKToKKyAgICAgICAgICAgIGlmIG5vdCBsZW4oc2VxKToKKworICAgIFByb2JsZW1zIGRldGVjdGVkOgorICAgICogaWYgbGVuKHNlcXVlbmNlKToKKyAgICAqIGlmIG5vdCBsZW4oc2VxdWVuY2UpOgorICAgICogZWxpZiBsZW4oc2VxdWVuY2UpOgorICAgICogZWxpZiBub3QgbGVuKHNlcXVlbmNlKToKKyAgICAqIHdoaWxlIGxlbihzZXF1ZW5jZSk6CisgICAgKiB3aGlsZSBub3QgbGVuKHNlcXVlbmNlKToKKyAgICAqIGFzc2VydCBsZW4oc2VxdWVuY2UpOgorICAgICogYXNzZXJ0IG5vdCBsZW4oc2VxdWVuY2UpOgorICAgICogYm9vbChsZW4oc2VxdWVuY2UpKQorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoaW50ZXJmYWNlcy5JQXN0cm9pZENoZWNrZXIsKQorCisgICAgIyBjb25maWd1cmF0aW9uIHNlY3Rpb24gbmFtZQorICAgIG5hbWUgPSAicmVmYWN0b3JpbmciCisgICAgbXNncyA9IHsKKyAgICAgICAgIkMxODAxIjogKAorICAgICAgICAgICAgIkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eSIsCisgICAgICAgICAgICAibGVuLWFzLWNvbmRpdGlvbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIFB5bGludCBkZXRlY3RzIHRoYXQgbGVuKHNlcXVlbmNlKSBpcyBiZWluZyB1c2VkICIKKyAgICAgICAgICAgICJ3aXRob3V0IGV4cGxpY2l0IGNvbXBhcmlzb24gaW5zaWRlIGEgY29uZGl0aW9uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5LiAiCisgICAgICAgICAgICAiSW5zdGVhZCBvZiBjb2VyY2luZyB0aGUgbGVuZ3RoIHRvIGEgYm9vbGVhbiwgZWl0aGVyICIKKyAgICAgICAgICAgICJyZWx5IG9uIHRoZSBmYWN0IHRoYXQgZW1wdHkgc2VxdWVuY2VzIGFyZSBmYWxzZSBvciAiCisgICAgICAgICAgICAiY29tcGFyZSB0aGUgbGVuZ3RoIGFnYWluc3QgYSBzY2FsYXIuIiwKKyAgICAgICAgKQorICAgIH0KKworICAgIHByaW9yaXR5ID0gLTIKKyAgICBvcHRpb25zID0gKCkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygibGVuLWFzLWNvbmRpdGlvbiIpCisgICAgZGVmIHZpc2l0X2NhbGwoc2VsZiwgbm9kZSk6CisgICAgICAgICMgYSBsZW4oUykgY2FsbCBpcyB1c2VkIGluc2lkZSBhIHRlc3QgY29uZGl0aW9uCisgICAgICAgICMgY291bGQgYmUgaWYsIHdoaWxlLCBhc3NlcnQgb3IgaWYgZXhwcmVzc2lvbiBzdGF0ZW1lbnQKKyAgICAgICAgIyBlLmcuIGBpZiBsZW4oUyk6YAorICAgICAgICBpZiBub3QgdXRpbHMuaXNfY2FsbF9vZl9uYW1lKG5vZGUsICJsZW4iKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIHRoZSBsZW4oKSBjYWxsIGNvdWxkIGFsc28gYmUgbmVzdGVkIHRvZ2V0aGVyIHdpdGggb3RoZXIKKyAgICAgICAgIyBib29sZWFuIG9wZXJhdGlvbnMsIGUuZy4gYGlmIHogb3IgbGVuKHgpOmAKKyAgICAgICAgcGFyZW50ID0gbm9kZS5wYXJlbnQKKyAgICAgICAgd2hpbGUgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuQm9vbE9wKToKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQKKyAgICAgICAgIyB3ZSdyZSBmaW5hbGx5IG91dCBvZiBhbnkgbmVzdGVkIGJvb2xlYW4gb3BlcmF0aW9ucyBzbyBjaGVjayBpZgorICAgICAgICAjIHRoaXMgbGVuKCkgY2FsbCBpcyBwYXJ0IG9mIGEgdGVzdCBjb25kaXRpb24KKyAgICAgICAgaWYgbm90IHV0aWxzLmlzX3Rlc3RfY29uZGl0aW9uKG5vZGUsIHBhcmVudCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbGVuX2FyZyA9IG5vZGUuYXJnc1swXQorICAgICAgICBnZW5lcmF0b3Jfb3JfY29tcHJlaGVuc2lvbiA9ICgKKyAgICAgICAgICAgIGFzdHJvaWQuTGlzdENvbXAsCisgICAgICAgICAgICBhc3Ryb2lkLlNldENvbXAsCisgICAgICAgICAgICBhc3Ryb2lkLkRpY3RDb21wLAorICAgICAgICAgICAgYXN0cm9pZC5HZW5lcmF0b3JFeHAsCisgICAgICAgICkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShsZW5fYXJnLCBnZW5lcmF0b3Jfb3JfY29tcHJlaGVuc2lvbik6CisgICAgICAgICAgICAjIFRoZSBub2RlIGlzIGEgZ2VuZXJhdG9yIG9yIGNvbXByZWhlbnNpb24gYXMgaW4gbGVuKFt4IGZvciB4IGluIC4uLl0pCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJsZW4tYXMtY29uZGl0aW9uIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGluc3RhbmNlID0gbmV4dChsZW5fYXJnLmluZmVyKCkpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgIyBQcm9iYWJseSB1bmRlZmluZWQtdmFyaWJsZSwgYWJvcnQgY2hlY2sKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtb3RoZXJfY2xhc3NlcyA9IHNlbGYuYmFzZV9jbGFzc2VzX29mX25vZGUoaW5zdGFuY2UpCisgICAgICAgIGFmZmVjdGVkX2J5X3BlcDggPSBhbnkoCisgICAgICAgICAgICB0IGluIG1vdGhlcl9jbGFzc2VzIGZvciB0IGluICgic3RyIiwgInR1cGxlIiwgImxpc3QiLCAic2V0IikKKyAgICAgICAgKQorICAgICAgICBpZiAicmFuZ2UiIGluIG1vdGhlcl9jbGFzc2VzIG9yICgKKyAgICAgICAgICAgIGFmZmVjdGVkX2J5X3BlcDggYW5kIG5vdCBzZWxmLmluc3RhbmNlX2hhc19ib29sKGluc3RhbmNlKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibGVuLWFzLWNvbmRpdGlvbiIsIG5vZGU9bm9kZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgaW5zdGFuY2VfaGFzX2Jvb2woY2xhc3NfZGVmOiBhc3Ryb2lkLkNsYXNzRGVmKSAtPiBib29sOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzc19kZWYuZ2V0YXR0cigiX19ib29sX18iKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuQXR0cmlidXRlSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAuLi4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImxlbi1hcy1jb25kaXRpb24iKQorICAgIGRlZiB2aXNpdF91bmFyeW9wKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJgbm90IGxlbihTKWAgbXVzdCBiZWNvbWUgYG5vdCBTYCByZWdhcmRsZXNzIGlmIHRoZSBwYXJlbnQgYmxvY2sKKyAgICAgICAgaXMgYSB0ZXN0IGNvbmRpdGlvbiBvciBzb21ldGhpbmcgZWxzZSAoYm9vbGVhbiBleHByZXNzaW9uKQorICAgICAgICBlLmcuIGBpZiBub3QgbGVuKFMpOmAiIiIKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLlVuYXJ5T3ApCisgICAgICAgICAgICBhbmQgbm9kZS5vcCA9PSAibm90IgorICAgICAgICAgICAgYW5kIHV0aWxzLmlzX2NhbGxfb2ZfbmFtZShub2RlLm9wZXJhbmQsICJsZW4iKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibGVuLWFzLWNvbmRpdGlvbiIsIG5vZGU9bm9kZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYmFzZV9jbGFzc2VzX29mX25vZGUoaW5zdGFuY2U6IGFzdHJvaWQubm9kZXMuQ2xhc3NEZWYpIC0+IExpc3RbYXN0cm9pZC5OYW1lXToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCB0aGUgY2xhc3NlcyBuYW1lcyB0aGF0IGEgQ2xhc3NEZWYgaW5oZXJpdCBmcm9tIGluY2x1ZGluZyAnb2JqZWN0Jy4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIFtpbnN0YW5jZS5uYW1lXSArIFt4Lm5hbWUgZm9yIHggaW4gaW5zdGFuY2UuYW5jZXN0b3JzKCldCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gW2luc3RhbmNlLm5hbWVdCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3Jpbmcvbm90X2NoZWNrZXIucHkgYi9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3Jpbmcvbm90X2NoZWNrZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzYmFlMwotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9yZWZhY3RvcmluZy9ub3RfY2hlY2tlci5weQpAQCAtMCwwICsxLDg3IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBidWlsdGlucworCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGludGVyZmFjZXMKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCB1dGlscworCisKK2NsYXNzIE5vdENoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorICAgICIiImNoZWNrcyBmb3IgdG9vIG1hbnkgbm90IGluIGNvbXBhcmlzb24gZXhwcmVzc2lvbnMKKworICAgIC0gIm5vdCBub3QiIHNob3VsZCB0cmlnZ2VyIGEgd2FybmluZworICAgIC0gIm5vdCIgZm9sbG93ZWQgYnkgYSBjb21wYXJpc29uIHNob3VsZCB0cmlnZ2VyIGEgd2FybmluZworICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoaW50ZXJmYWNlcy5JQXN0cm9pZENoZWNrZXIsKQorICAgIG1zZ3MgPSB7CisgICAgICAgICJDMDExMyI6ICgKKyAgICAgICAgICAgICdDb25zaWRlciBjaGFuZ2luZyAiJXMiIHRvICIlcyInLAorICAgICAgICAgICAgInVubmVlZGVkLW5vdCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgYm9vbGVhbiBleHByZXNzaW9uIGNvbnRhaW5zIGFuIHVubmVlZGVkIG5lZ2F0aW9uLiIsCisgICAgICAgICkKKyAgICB9CisgICAgbmFtZSA9ICJyZWZhY3RvcmluZyIKKyAgICByZXZlcnNlX29wID0geworICAgICAgICAiPCI6ICI+PSIsCisgICAgICAgICI8PSI6ICI+IiwKKyAgICAgICAgIj4iOiAiPD0iLAorICAgICAgICAiPj0iOiAiPCIsCisgICAgICAgICI9PSI6ICIhPSIsCisgICAgICAgICIhPSI6ICI9PSIsCisgICAgICAgICJpbiI6ICJub3QgaW4iLAorICAgICAgICAiaXMiOiAiaXMgbm90IiwKKyAgICB9CisgICAgIyBzZXRzIGFyZSBub3Qgb3JkZXJlZCwgc28gZm9yIGV4YW1wbGUgIm5vdCBzZXQoTEVGVF9WQUxTKSA8PSBzZXQoUklHSFRfVkFMUykiIGlzCisgICAgIyBub3QgZXF1aXZhbGVudCB0byAic2V0KExFRlRfVkFMUykgPiBzZXQoUklHSFRfVkFMUykiCisgICAgc2tpcHBlZF9ub2RlcyA9IChhc3Ryb2lkLlNldCwpCisgICAgIyAnYnVpbHRpbnMnIHB5MywgJ19fYnVpbHRpbl9fJyBweTIKKyAgICBza2lwcGVkX2NsYXNzbmFtZXMgPSBbCisgICAgICAgIGYie2J1aWx0aW5zLl9fbmFtZV9ffS57cW5hbWV9IiBmb3IgcW5hbWUgaW4gKCJzZXQiLCAiZnJvemVuc2V0IikKKyAgICBdCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInVubmVlZGVkLW5vdCIpCisgICAgZGVmIHZpc2l0X3VuYXJ5b3Aoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUub3AgIT0gIm5vdCI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb3BlcmFuZCA9IG5vZGUub3BlcmFuZAorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlcmFuZCwgYXN0cm9pZC5VbmFyeU9wKSBhbmQgb3BlcmFuZC5vcCA9PSAibm90IjoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInVubmVlZGVkLW5vdCIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KG5vZGUuYXNfc3RyaW5nKCksIG9wZXJhbmQub3BlcmFuZC5hc19zdHJpbmcoKSksCisgICAgICAgICAgICApCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvcGVyYW5kLCBhc3Ryb2lkLkNvbXBhcmUpOgorICAgICAgICAgICAgbGVmdCA9IG9wZXJhbmQubGVmdAorICAgICAgICAgICAgIyBpZ25vcmUgbXVsdGlwbGUgY29tcGFyaXNvbnMKKyAgICAgICAgICAgIGlmIGxlbihvcGVyYW5kLm9wcykgPiAxOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgb3BlcmF0b3IsIHJpZ2h0ID0gb3BlcmFuZC5vcHNbMF0KKyAgICAgICAgICAgIGlmIG9wZXJhdG9yIG5vdCBpbiBzZWxmLnJldmVyc2Vfb3A6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIElnbm9yZSBfX25lX18gYXMgZnVuY3Rpb24gb2YgX19lcV9fCisgICAgICAgICAgICBmcmFtZSA9IG5vZGUuZnJhbWUoKQorICAgICAgICAgICAgaWYgZnJhbWUubmFtZSA9PSAiX19uZV9fIiBhbmQgb3BlcmF0b3IgPT0gIj09IjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvciBfdHlwZSBpbiAodXRpbHMubm9kZV90eXBlKGxlZnQpLCB1dGlscy5ub2RlX3R5cGUocmlnaHQpKToKKyAgICAgICAgICAgICAgICBpZiBub3QgX3R5cGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX3R5cGUsIHNlbGYuc2tpcHBlZF9ub2Rlcyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShfdHlwZSwgYXN0cm9pZC5JbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIF90eXBlLnFuYW1lKCkgaW4gc2VsZi5za2lwcGVkX2NsYXNzbmFtZXMKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHN1Z2dlc3Rpb24gPSAie30ge30ge30iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBsZWZ0LmFzX3N0cmluZygpLAorICAgICAgICAgICAgICAgIHNlbGYucmV2ZXJzZV9vcFtvcGVyYXRvcl0sCisgICAgICAgICAgICAgICAgcmlnaHQuYXNfc3RyaW5nKCksCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1bm5lZWRlZC1ub3QiLCBub2RlPW5vZGUsIGFyZ3M9KG5vZGUuYXNfc3RyaW5nKCksIHN1Z2dlc3Rpb24pCisgICAgICAgICAgICApCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3JpbmcvcmVjb21tZW5kYXRpb25fY2hlY2tlci5weSBiL3B5bGludC9jaGVja2Vycy9yZWZhY3RvcmluZy9yZWNvbW1lbmRhdGlvbl9jaGVja2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTM4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3JpbmcvcmVjb21tZW5kYXRpb25fY2hlY2tlci5weQpAQCAtMCwwICsxLDI2MyBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorZnJvbSB0eXBpbmcgaW1wb3J0IGNhc3QKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzLCBpbnRlcmZhY2VzCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMKKworCitjbGFzcyBSZWNvbW1lbmRhdGlvbkNoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoaW50ZXJmYWNlcy5JQXN0cm9pZENoZWNrZXIsKQorICAgIG5hbWUgPSAicmVmYWN0b3JpbmciCisgICAgbXNncyA9IHsKKyAgICAgICAgIkMwMjAwIjogKAorICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nIGVudW1lcmF0ZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB3aXRoIHJhbmdlIGFuZCBsZW4iLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLWVudW1lcmF0ZSIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGNvZGUgdGhhdCBpdGVyYXRlcyB3aXRoIHJhbmdlIGFuZCBsZW4gaXMgIgorICAgICAgICAgICAgImVuY291bnRlcmVkLiBTdWNoIGNvZGUgY2FuIGJlIHNpbXBsaWZpZWQgYnkgdXNpbmcgdGhlICIKKyAgICAgICAgICAgICJlbnVtZXJhdGUgYnVpbHRpbi4iLAorICAgICAgICApLAorICAgICAgICAiQzAyMDEiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgaXRlcmF0aW5nIHRoZSBkaWN0aW9uYXJ5IGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZyAua2V5cygpIiwKKyAgICAgICAgICAgICJjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeSIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeSBhcmUgaXRlcmF0ZWQgdGhyb3VnaCB0aGUgLmtleXMoKSAiCisgICAgICAgICAgICAibWV0aG9kLiBJdCBpcyBlbm91Z2ggdG8ganVzdCBpdGVyYXRlIHRocm91Z2ggdGhlIGRpY3Rpb25hcnkgaXRzZWxmLCBhcyAiCisgICAgICAgICAgICAnaW4gImZvciBrZXkgaW4gZGljdGlvbmFyeSIuJywKKyAgICAgICAgKSwKKyAgICAgICAgIkMwMjA2IjogKAorICAgICAgICAgICAgIkNvbnNpZGVyIGl0ZXJhdGluZyB3aXRoIC5pdGVtcygpIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zIiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gaXRlcmF0aW5nIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0aW9uYXJ5IGFuZCBhY2Nlc3NpbmcgdGhlICIKKyAgICAgICAgICAgICJ2YWx1ZSBieSBpbmRleCBsb29rdXAuICIKKyAgICAgICAgICAgICJCb3RoIHRoZSBrZXkgYW5kIHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCBieSBpdGVyYXRpbmcgdXNpbmcgdGhlIC5pdGVtcygpICIKKyAgICAgICAgICAgICJtZXRob2Qgb2YgdGhlIGRpY3Rpb25hcnkgaW5zdGVhZC4iLAorICAgICAgICApLAorICAgICAgICAiQzAyMDciOiAoCisgICAgICAgICAgICAiVXNlICVzIGluc3RlYWQiLAorICAgICAgICAgICAgInVzZS1tYXhzcGxpdC1hcmciLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBhY2Nlc3Npbmcgb25seSB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mIHN0ci5zcGxpdCgpLiAiCisgICAgICAgICAgICAiVGhlIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnQgY2FuIGJlIGFjY2Vzc2VkIGJ5IHVzaW5nICIKKyAgICAgICAgICAgICJzdHIuc3BsaXQoc2VwLCBtYXhzcGxpdD0xKVswXSBvciBzdHIucnNwbGl0KHNlcCwgbWF4c3BsaXQ9MSlbLTFdICIKKyAgICAgICAgICAgICJpbnN0ZWFkLiIsCisgICAgICAgICksCisgICAgfQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfYnVpbHRpbihub2RlLCBmdW5jdGlvbik6CisgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihub2RlKQorICAgICAgICBpZiBub3QgaW5mZXJyZWQ6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHV0aWxzLmlzX2J1aWx0aW5fb2JqZWN0KGluZmVycmVkKSBhbmQgaW5mZXJyZWQubmFtZSA9PSBmdW5jdGlvbgorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeSIsICJ1c2UtbWF4c3BsaXQtYXJnIikKKyAgICBkZWYgdmlzaXRfY2FsbChzZWxmLCBub2RlOiBhc3Ryb2lkLkNhbGwpIC0+IE5vbmU6CisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnNpZGVyX2l0ZXJhdGluZ19kaWN0aW9uYXJ5KG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3VzZV9tYXhzcGxpdF9hcmcobm9kZSkKKworICAgIGRlZiBfY2hlY2tfY29uc2lkZXJfaXRlcmF0aW5nX2RpY3Rpb25hcnkoc2VsZiwgbm9kZTogYXN0cm9pZC5DYWxsKSAtPiBOb25lOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub2RlLmZ1bmMuYXR0cm5hbWUgIT0gImtleXMiOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUucGFyZW50LCAoYXN0cm9pZC5Gb3IsIGFzdHJvaWQuQ29tcHJlaGVuc2lvbikpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKG5vZGUuZnVuYykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuQm91bmRNZXRob2QpIG9yIG5vdCBpc2luc3RhbmNlKAorICAgICAgICAgICAgaW5mZXJyZWQuYm91bmQsIGFzdHJvaWQuRGljdAorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgKGFzdHJvaWQuRm9yLCBhc3Ryb2lkLkNvbXByZWhlbnNpb24pKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImNvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5Iiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja191c2VfbWF4c3BsaXRfYXJnKHNlbGYsIG5vZGU6IGFzdHJvaWQuQ2FsbCkgLT4gTm9uZToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2Ugd2hlbiBhY2Nlc3NpbmcgZmlyc3Qgb3IgbGFzdCBlbGVtZW50cyBvZiBhIHN0ci5zcGxpdCgpIG9yIHN0ci5yc3BsaXQoKS4iIiIKKworICAgICAgICAjIENoZWNrIGlmIGNhbGwgaXMgc3BsaXQoKSBvciByc3BsaXQoKQorICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5BdHRyaWJ1dGUpCisgICAgICAgICAgICBhbmQgbm9kZS5mdW5jLmF0dHJuYW1lIGluICgic3BsaXQiLCAicnNwbGl0IikKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHV0aWxzLnNhZmVfaW5mZXIobm9kZS5mdW5jKSwgYXN0cm9pZC5Cb3VuZE1ldGhvZCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1dGlscy5nZXRfYXJndW1lbnRfZnJvbV9jYWxsKG5vZGUsIDAsICJzZXAiKQorICAgICAgICAgICAgZXhjZXB0IHV0aWxzLk5vU3VjaEFyZ3VtZW50RXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIElnbm9yZSBpZiBtYXhzcGxpdCBhcmcgaGFzIGJlZW4gc2V0CisgICAgICAgICAgICAgICAgdXRpbHMuZ2V0X2FyZ3VtZW50X2Zyb21fY2FsbChub2RlLCAxLCAibWF4c3BsaXQiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHV0aWxzLk5vU3VjaEFyZ3VtZW50RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLlN1YnNjcmlwdCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRfdmFsdWUgPSB1dGlscy5nZXRfc3Vic2NyaXB0X2NvbnN0X3ZhbHVlKG5vZGUucGFyZW50KS52YWx1ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCB1dGlscy5JbmZlcnJlZFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICBpZiBzdWJzY3JpcHRfdmFsdWUgaW4gKC0xLCAwKToKKyAgICAgICAgICAgICAgICAgICAgZm5fbmFtZSA9IG5vZGUuZnVuYy5hdHRybmFtZQorICAgICAgICAgICAgICAgICAgICBuZXdfZm4gPSAicnNwbGl0IiBpZiBzdWJzY3JpcHRfdmFsdWUgPT0gLTEgZWxzZSAic3BsaXQiCisgICAgICAgICAgICAgICAgICAgIG5ld19uYW1lID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mdW5jLmFzX3N0cmluZygpLnJzcGxpdChmbl9uYW1lLCBtYXhzcGxpdD0xKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXdfZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICsgZiIoe25vZGUuYXJnc1swXS5hc19zdHJpbmcoKX0sIG1heHNwbGl0PTEpW3tzdWJzY3JpcHRfdmFsdWV9XSIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1c2UtbWF4c3BsaXQtYXJnIiwgbm9kZT1ub2RlLCBhcmdzPShuZXdfbmFtZSwpKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJjb25zaWRlci11c2luZy1lbnVtZXJhdGUiLCAiY29uc2lkZXItdXNpbmctZGljdC1pdGVtcyIpCisgICAgZGVmIHZpc2l0X2ZvcihzZWxmLCBub2RlOiBhc3Ryb2lkLkZvcikgLT4gTm9uZToKKyAgICAgICAgc2VsZi5fY2hlY2tfY29uc2lkZXJfdXNpbmdfZW51bWVyYXRlKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnNpZGVyX3VzaW5nX2RpY3RfaXRlbXMobm9kZSkKKworICAgIGRlZiBfY2hlY2tfY29uc2lkZXJfdXNpbmdfZW51bWVyYXRlKHNlbGYsIG5vZGU6IGFzdHJvaWQuRm9yKSAtPiBOb25lOgorICAgICAgICAiIiJFbWl0IGEgY29udmVudGlvbiB3aGVuZXZlciByYW5nZSBhbmQgbGVuIGFyZSB1c2VkIGZvciBpbmRleGluZy4iIiIKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB3ZSBoYXZlIGEgYHJhbmdlKFtzdGFydF0sIGxlbiguLi4pLCBbc3RvcF0pYCBjYWxsIGFuZAorICAgICAgICAjIHRoYXQgdGhlIG9iamVjdCB3aGljaCBpcyBpdGVyYXRlZCBpcyB1c2VkIGFzIGEgc3Vic2NyaXB0IGluIHRoZQorICAgICAgICAjIGJvZHkgb2YgdGhlIGZvci4KKworICAgICAgICAjIElzIGl0IGEgcHJvcGVyIHJhbmdlIGNhbGw/CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUuaXRlciwgYXN0cm9pZC5DYWxsKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc2VsZi5faXNfYnVpbHRpbihub2RlLml0ZXIuZnVuYywgInJhbmdlIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IG5vZGUuaXRlci5hcmdzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlzX2NvbnN0YW50X3plcm8gPSAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUuaXRlci5hcmdzWzBdLCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgYW5kIG5vZGUuaXRlci5hcmdzWzBdLnZhbHVlID09IDAKKyAgICAgICAgKQorICAgICAgICBpZiBsZW4obm9kZS5pdGVyLmFyZ3MpID09IDIgYW5kIG5vdCBpc19jb25zdGFudF96ZXJvOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGxlbihub2RlLml0ZXIuYXJncykgPiAyOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBJcyBpdCBhIHByb3BlciBsZW4gY2FsbD8KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS5pdGVyLmFyZ3NbLTFdLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlY29uZF9mdW5jID0gbm9kZS5pdGVyLmFyZ3NbLTFdLmZ1bmMKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX2J1aWx0aW4oc2Vjb25kX2Z1bmMsICJsZW4iKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBsZW5fYXJncyA9IG5vZGUuaXRlci5hcmdzWy0xXS5hcmdzCisgICAgICAgIGlmIG5vdCBsZW5fYXJncyBvciBsZW4obGVuX2FyZ3MpICE9IDE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaXRlcmF0aW5nX29iamVjdCA9IGxlbl9hcmdzWzBdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlcmF0aW5nX29iamVjdCwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIGV4cGVjdGVkX3N1YnNjcmlwdF92YWxfdHlwZSA9IGFzdHJvaWQuTmFtZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaXRlcmF0aW5nX29iamVjdCwgYXN0cm9pZC5BdHRyaWJ1dGUpOgorICAgICAgICAgICAgZXhwZWN0ZWRfc3Vic2NyaXB0X3ZhbF90eXBlID0gYXN0cm9pZC5BdHRyaWJ1dGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIElmIHdlJ3JlIGRlZmluaW5nIF9faXRlcl9fIG9uIHNlbGYsIGVudW1lcmF0ZSB3b24ndCB3b3JrCisgICAgICAgIHNjb3BlID0gbm9kZS5zY29wZSgpCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoaXRlcmF0aW5nX29iamVjdCwgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgYW5kIGl0ZXJhdGluZ19vYmplY3QubmFtZSA9PSAic2VsZiIKKyAgICAgICAgICAgIGFuZCBzY29wZS5uYW1lID09ICJfX2l0ZXJfXyIKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGJvZHkgb2YgdGhlIGZvciBsb29wIHVzZXMgYSBzdWJzY3JpcHQKKyAgICAgICAgIyB3aXRoIHRoZSBvYmplY3QgdGhhdCB3YXMgaXRlcmF0ZWQuIFRoaXMgdXNlcyBzb21lIGhldXJpc3RpY3MKKyAgICAgICAgIyBpbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2FtZSBvYmplY3QgaXMgdXNlZCBpbiB0aGUKKyAgICAgICAgIyBmb3IgYm9keS4KKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuYm9keToKKyAgICAgICAgICAgIGZvciBzdWJzY3JpcHQgaW4gY2hpbGQubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5TdWJzY3JpcHQpOgorICAgICAgICAgICAgICAgIHN1YnNjcmlwdCA9IGNhc3QoYXN0cm9pZC5TdWJzY3JpcHQsIHN1YnNjcmlwdCkKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzdWJzY3JpcHQudmFsdWUsIGV4cGVjdGVkX3N1YnNjcmlwdF92YWxfdHlwZSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHN1YnNjcmlwdC5zbGljZQorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHN1YnNjcmlwdC52YWx1ZS5zY29wZSgpICE9IG5vZGUuc2NvcGUoKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgdGhpcyBzdWJzY3JpcHQgaWYgaXQncyBub3QgaW4gdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgIyBzY29wZS4gVGhpcyBtZWFucyB0aGF0IGluIHRoZSBib2R5IG9mIHRoZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgIyBsb29wLCBhbm90aGVyIHNjb3BlIHdhcyBjcmVhdGVkLCB3aGVyZSB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAjIG5hbWUgZm9yIHRoZSBpdGVyYXRpbmcgb2JqZWN0IHdhcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHZhbHVlLm5hbWUgPT0gbm9kZS50YXJnZXQubmFtZSBhbmQgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHN1YnNjcmlwdC52YWx1ZSwgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgICAgICAgICBhbmQgaXRlcmF0aW5nX29iamVjdC5uYW1lID09IHN1YnNjcmlwdC52YWx1ZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIG9yIGlzaW5zdGFuY2Uoc3Vic2NyaXB0LnZhbHVlLCBhc3Ryb2lkLkF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGl0ZXJhdGluZ19vYmplY3QuYXR0cm5hbWUgPT0gc3Vic2NyaXB0LnZhbHVlLmF0dHJuYW1lCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29uc2lkZXItdXNpbmctZW51bWVyYXRlIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiBfY2hlY2tfY29uc2lkZXJfdXNpbmdfZGljdF9pdGVtcyhzZWxmLCBub2RlOiBhc3Ryb2lkLkZvcikgLT4gTm9uZToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2Ugd2hlbiBhY2Nlc3NpbmcgZGljdCB2YWx1ZXMgYnkgaW5kZXggbG9va3VwLiIiIgorICAgICAgICAjIFZlcmlmeSB0aGF0IHdlIGhhdmUgYSAua2V5cygpIGNhbGwgYW5kCisgICAgICAgICMgdGhhdCB0aGUgb2JqZWN0IHdoaWNoIGlzIGl0ZXJhdGVkIGlzIHVzZWQgYXMgYSBzdWJzY3JpcHQgaW4gdGhlCisgICAgICAgICMgYm9keSBvZiB0aGUgZm9yLgorCisgICAgICAgIGl0ZXJhdGluZ19vYmplY3RfbmFtZSA9IHV0aWxzLmdldF9pdGVyYXRpbmdfZGljdGlvbmFyeV9uYW1lKG5vZGUpCisgICAgICAgIGlmIGl0ZXJhdGluZ19vYmplY3RfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgYm9keSBvZiB0aGUgZm9yIGxvb3AgdXNlcyBhIHN1YnNjcmlwdAorICAgICAgICAjIHdpdGggdGhlIG9iamVjdCB0aGF0IHdhcyBpdGVyYXRlZC4gVGhpcyB1c2VzIHNvbWUgaGV1cmlzdGljcworICAgICAgICAjIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzYW1lIG9iamVjdCBpcyB1c2VkIGluIHRoZQorICAgICAgICAjIGZvciBib2R5LgorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5ib2R5OgorICAgICAgICAgICAgZm9yIHN1YnNjcmlwdCBpbiBjaGlsZC5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLlN1YnNjcmlwdCk6CisgICAgICAgICAgICAgICAgc3Vic2NyaXB0ID0gY2FzdChhc3Ryb2lkLlN1YnNjcmlwdCwgc3Vic2NyaXB0KQorCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3Vic2NyaXB0LnZhbHVlLCAoYXN0cm9pZC5OYW1lLCBhc3Ryb2lkLkF0dHJpYnV0ZSkpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzdWJzY3JpcHQuc2xpY2UKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICAgICAgICAgIG9yIHZhbHVlLm5hbWUgIT0gbm9kZS50YXJnZXQubmFtZQorICAgICAgICAgICAgICAgICAgICBvciBpdGVyYXRpbmdfb2JqZWN0X25hbWUgIT0gc3Vic2NyaXB0LnZhbHVlLmFzX3N0cmluZygpCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBsYXN0X2RlZmluaXRpb25fbGluZW5vID0gdmFsdWUubG9va3VwKHZhbHVlLm5hbWUpWzFdWy0xXS5saW5lbm8KKyAgICAgICAgICAgICAgICBpZiBsYXN0X2RlZmluaXRpb25fbGluZW5vID4gbm9kZS5saW5lbm86CisgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIHRoaXMgc3Vic2NyaXB0IGlmIGl0IGhhcyBiZWVuIHJlZGVmaW5lZCBhZnRlcgorICAgICAgICAgICAgICAgICAgICAjIHRoZSBmb3IgbG9vcC4gVGhpcyBjaGVja3MgZm9yIHRoZSBsaW5lIG51bWJlciB1c2luZyAubG9va3VwKCkKKyAgICAgICAgICAgICAgICAgICAgIyB0byBnZXQgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBpdGVyYXRpbmcgb2JqZWN0IHdhcyBsYXN0CisgICAgICAgICAgICAgICAgICAgICMgZGVmaW5lZCBhbmQgY29tcGFyZSB0aGF0IHRvIHRoZSBmb3IgbG9vcCdzIGxpbmUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHN1YnNjcmlwdC5wYXJlbnQsIGFzdHJvaWQuQXNzaWduKQorICAgICAgICAgICAgICAgICAgICBhbmQgc3Vic2NyaXB0IGluIHN1YnNjcmlwdC5wYXJlbnQudGFyZ2V0cworICAgICAgICAgICAgICAgICAgICBvciBpc2luc3RhbmNlKHN1YnNjcmlwdC5wYXJlbnQsIGFzdHJvaWQuQXVnQXNzaWduKQorICAgICAgICAgICAgICAgICAgICBhbmQgc3Vic2NyaXB0ID09IHN1YnNjcmlwdC5wYXJlbnQudGFyZ2V0CisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgdGhpcyBzdWJzY3JpcHQgaWYgaXQgaXMgdGhlIHRhcmdldCBvZiBhbiBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zIikKKyAgICBkZWYgdmlzaXRfY29tcHJlaGVuc2lvbihzZWxmLCBub2RlOiBhc3Ryb2lkLkNvbXByZWhlbnNpb24pIC0+IE5vbmU6CisgICAgICAgIGl0ZXJhdGluZ19vYmplY3RfbmFtZSA9IHV0aWxzLmdldF9pdGVyYXRpbmdfZGljdGlvbmFyeV9uYW1lKG5vZGUpCisgICAgICAgIGlmIGl0ZXJhdGluZ19vYmplY3RfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUucGFyZW50LmdldF9jaGlsZHJlbigpOgorICAgICAgICAgICAgZm9yIHN1YnNjcmlwdCBpbiBjaGlsZC5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLlN1YnNjcmlwdCk6CisgICAgICAgICAgICAgICAgc3Vic2NyaXB0ID0gY2FzdChhc3Ryb2lkLlN1YnNjcmlwdCwgc3Vic2NyaXB0KQorCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3Vic2NyaXB0LnZhbHVlLCAoYXN0cm9pZC5OYW1lLCBhc3Ryb2lkLkF0dHJpYnV0ZSkpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzdWJzY3JpcHQuc2xpY2UKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICAgICAgICAgIG9yIHZhbHVlLm5hbWUgIT0gbm9kZS50YXJnZXQubmFtZQorICAgICAgICAgICAgICAgICAgICBvciBpdGVyYXRpbmdfb2JqZWN0X25hbWUgIT0gc3Vic2NyaXB0LnZhbHVlLmFzX3N0cmluZygpCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImNvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXMiLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgcmV0dXJuCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3JpbmcvcmVmYWN0b3JpbmdfY2hlY2tlci5weSBiL3B5bGludC9jaGVja2Vycy9yZWZhY3RvcmluZy9yZWZhY3RvcmluZ19jaGVja2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzFkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvcmVmYWN0b3JpbmcvcmVmYWN0b3JpbmdfY2hlY2tlci5weQpAQCAtMCwwICsxLDE3NTAgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29weQoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHRva2VuaXplCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcmVkdWNlCitmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgT3B0aW9uYWwsIFR1cGxlLCBVbmlvbiwgY2FzdAorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGludGVyZmFjZXMKK2Zyb20gcHlsaW50IGltcG9ydCB1dGlscyBhcyBsaW50X3V0aWxzCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBub2RlX2ZyYW1lX2NsYXNzCisKK0tOT1dOX0lORklOSVRFX0lURVJBVE9SUyA9IHsiaXRlcnRvb2xzLmNvdW50In0KK0JVSUxUSU5fRVhJVF9GVU5DUyA9IGZyb3plbnNldCgoInF1aXQiLCAiZXhpdCIpKQorQ0FMTFNfVEhBVF9DT1VMRF9CRV9SRVBMQUNFRF9CWV9XSVRIID0gZnJvemVuc2V0KAorICAgICgKKyAgICAgICAgInRocmVhZGluZy5sb2NrLmFjcXVpcmUiLAorICAgICAgICAidGhyZWFkaW5nLl9STG9jay5hY3F1aXJlIiwKKyAgICAgICAgInRocmVhZGluZy5TZW1hcGhvcmUuYWNxdWlyZSIsCisgICAgICAgICJtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuQmFzZU1hbmFnZXIuc3RhcnQiLAorICAgICAgICAibXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLlN5bmNNYW5hZ2VyLnN0YXJ0IiwKKyAgICApCispCitDQUxMU19SRVRVUk5JTkdfQ09OVEVYVF9NQU5BR0VSUyA9IGZyb3plbnNldCgKKyAgICAoCisgICAgICAgICJfaW8ub3BlbiIsICAjIHJlZ3VsYXIgJ29wZW4oKScgY2FsbAorICAgICAgICAiY29kZWNzLm9wZW4iLAorICAgICAgICAidXJsbGliLnJlcXVlc3QudXJsb3BlbiIsCisgICAgICAgICJ0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUiLAorICAgICAgICAidGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUiLAorICAgICAgICAidGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5IiwKKyAgICAgICAgInppcGZpbGUuWmlwRmlsZSIsCisgICAgICAgICJ6aXBmaWxlLlB5WmlwRmlsZSIsCisgICAgICAgICJ6aXBmaWxlLlppcEZpbGUub3BlbiIsCisgICAgICAgICJ6aXBmaWxlLlB5WmlwRmlsZS5vcGVuIiwKKyAgICAgICAgInRhcmZpbGUuVGFyRmlsZSIsCisgICAgICAgICJ0YXJmaWxlLlRhckZpbGUub3BlbiIsCisgICAgICAgICJtdWx0aXByb2Nlc3NpbmcuY29udGV4dC5CYXNlQ29udGV4dC5Qb29sIiwKKyAgICAgICAgImNvbmN1cnJlbnQuZnV0dXJlcy50aHJlYWQuVGhyZWFkUG9vbEV4ZWN1dG9yIiwKKyAgICAgICAgImNvbmN1cnJlbnQuZnV0dXJlcy5wcm9jZXNzLlByb2Nlc3NQb29sRXhlY3V0b3IiLAorICAgICAgICAic3VicHJvY2Vzcy5Qb3BlbiIsCisgICAgKQorKQorCisKK2RlZiBfaWZfc3RhdGVtZW50X2lzX2Fsd2F5c19yZXR1cm5pbmcoaWZfbm9kZSwgcmV0dXJuaW5nX25vZGVfY2xhc3MpIC0+IGJvb2w6CisgICAgZm9yIG5vZGUgaW4gaWZfbm9kZS5ib2R5OgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHJldHVybmluZ19ub2RlX2NsYXNzKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9pc190cmFpbGluZ19jb21tYSh0b2tlbnM6IExpc3RbdG9rZW5pemUuVG9rZW5JbmZvXSwgaW5kZXg6IGludCkgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiB0aGUgZ2l2ZW4gdG9rZW4gaXMgYSB0cmFpbGluZyBjb21tYQorCisgICAgOnBhcmFtIHRva2VuczogU2VxdWVuY2Ugb2YgbW9kdWxlcyB0b2tlbnMKKyAgICA6dHlwZSB0b2tlbnM6IGxpc3RbdG9rZW5pemUuVG9rZW5JbmZvXQorICAgIDpwYXJhbSBpbnQgaW5kZXg6IEluZGV4IG9mIHRva2VuIHVuZGVyIGNoZWNrIGluIHRva2VucworICAgIDpyZXR1cm5zOiBUcnVlIGlmIHRoZSB0b2tlbiBpcyBhIGNvbW1hIHdoaWNoIHRyYWlscyBhbiBleHByZXNzaW9uCisgICAgOnJ0eXBlOiBib29sCisgICAgIiIiCisgICAgdG9rZW4gPSB0b2tlbnNbaW5kZXhdCisgICAgaWYgdG9rZW4uZXhhY3RfdHlwZSAhPSB0b2tlbml6ZS5DT01NQToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgIyBNdXN0IGhhdmUgcmVtYWluaW5nIHRva2VucyBvbiB0aGUgc2FtZSBsaW5lIHN1Y2ggYXMgTkVXTElORQorICAgIGxlZnRfdG9rZW5zID0gaXRlcnRvb2xzLmlzbGljZSh0b2tlbnMsIGluZGV4ICsgMSwgTm9uZSkKKworICAgIGRlZiBzYW1lX3N0YXJ0X3Rva2VuKAorICAgICAgICBvdGhlcl90b2tlbjogdG9rZW5pemUuVG9rZW5JbmZvLCBfdG9rZW46IHRva2VuaXplLlRva2VuSW5mbyA9IHRva2VuCisgICAgKSAtPiBib29sOgorICAgICAgICByZXR1cm4gb3RoZXJfdG9rZW4uc3RhcnRbMF0gPT0gX3Rva2VuLnN0YXJ0WzBdCisKKyAgICBzYW1lX2xpbmVfcmVtYWluaW5nX3Rva2VucyA9IGxpc3QoCisgICAgICAgIGl0ZXJ0b29scy50YWtld2hpbGUoc2FtZV9zdGFydF90b2tlbiwgbGVmdF90b2tlbnMpCisgICAgKQorICAgICMgTm90ZTogSWYgdGhlIG5ld2xpbmUgaXMgdG9rZW5pemUuTkVXTElORSBhbmQgbm90IHRva2VuaXplLk5MCisgICAgIyB0aGVuIHRoZSBuZXdsaW5lIGRlbm90ZXMgdGhlIGVuZCBvZiBleHByZXNzaW9uCisgICAgaXNfbGFzdF9lbGVtZW50ID0gYWxsKAorICAgICAgICBvdGhlcl90b2tlbi50eXBlIGluICh0b2tlbml6ZS5ORVdMSU5FLCB0b2tlbml6ZS5DT01NRU5UKQorICAgICAgICBmb3Igb3RoZXJfdG9rZW4gaW4gc2FtZV9saW5lX3JlbWFpbmluZ190b2tlbnMKKyAgICApCisgICAgaWYgbm90IHNhbWVfbGluZV9yZW1haW5pbmdfdG9rZW5zIG9yIG5vdCBpc19sYXN0X2VsZW1lbnQ6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdldF9jdXJsaW5lX2luZGV4X3N0YXJ0KCk6CisgICAgICAgICIiIkdldCB0aGUgaW5kZXggZGVub3RpbmcgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUiIiIKKyAgICAgICAgZm9yIHN1YmluZGV4LCB0b2tlbiBpbiBlbnVtZXJhdGUocmV2ZXJzZWQodG9rZW5zWzppbmRleF0pKToKKyAgICAgICAgICAgICMgU2VlIExpYi90b2tlbml6ZS5weSBhbmQgTGliL3Rva2VuLnB5IGluIGNweXRob24gZm9yIG1vcmUgaW5mbworICAgICAgICAgICAgaWYgdG9rZW4udHlwZSA9PSB0b2tlbml6ZS5ORVdMSU5FOgorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCAtIHN1YmluZGV4CisgICAgICAgIHJldHVybiAwCisKKyAgICBjdXJsaW5lX3N0YXJ0ID0gZ2V0X2N1cmxpbmVfaW5kZXhfc3RhcnQoKQorICAgIGV4cGVjdGVkX3Rva2VucyA9IHsicmV0dXJuIiwgInlpZWxkIn0KKyAgICBmb3IgcHJldnRva2VuIGluIHRva2Vuc1tjdXJsaW5lX3N0YXJ0OmluZGV4XToKKyAgICAgICAgaWYgIj0iIGluIHByZXZ0b2tlbi5zdHJpbmcgb3IgcHJldnRva2VuLnN0cmluZyBpbiBleHBlY3RlZF90b2tlbnM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBfaXNfaW5zaWRlX2NvbnRleHRfbWFuYWdlcihub2RlKToKKyAgICBmcmFtZSA9IG5vZGUuZnJhbWUoKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKAorICAgICAgICBmcmFtZSwgKGFzdHJvaWQuRnVuY3Rpb25EZWYsIGFzdHJvaWQuQm91bmRNZXRob2QsIGFzdHJvaWQuVW5ib3VuZE1ldGhvZCkKKyAgICApOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gZnJhbWUubmFtZSA9PSAiX19lbnRlcl9fIiBvciB1dGlscy5kZWNvcmF0ZWRfd2l0aCgKKyAgICAgICAgZnJhbWUsICJjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyIgorICAgICkKKworCitjbGFzcyBSZWZhY3RvcmluZ0NoZWNrZXIoY2hlY2tlcnMuQmFzZVRva2VuQ2hlY2tlcik6CisgICAgIiIiTG9va3MgZm9yIGNvZGUgd2hpY2ggY2FuIGJlIHJlZmFjdG9yZWQKKworICAgIFRoaXMgY2hlY2tlciBhbHNvIG1peGVzIHRoZSBhc3Ryb2lkIGFuZCB0aGUgdG9rZW4gYXBwcm9hY2hlcworICAgIGluIG9yZGVyIHRvIGNyZWF0ZSBrbm93bGVkZ2UgYWJvdXQgd2hldGhlciBhbiAiZWxzZSBpZiIgbm9kZQorICAgIGlzIGEgdHJ1ZSAiZWxzZSBpZiIgbm9kZSwgb3IgYW4gImVsaWYiIG5vZGUuCisgICAgIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChpbnRlcmZhY2VzLklUb2tlbkNoZWNrZXIsIGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyKQorCisgICAgbmFtZSA9ICJyZWZhY3RvcmluZyIKKworICAgIG1zZ3MgPSB7CisgICAgICAgICJSMTcwMSI6ICgKKyAgICAgICAgICAgICJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGlzaW5zdGFuY2UgY2FsbHMgdG8gaXNpbnN0YW5jZSglcywgKCVzKSkiLAorICAgICAgICAgICAgImNvbnNpZGVyLW1lcmdpbmctaXNpbnN0YW5jZSIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIG11bHRpcGxlIGNvbnNlY3V0aXZlIGlzaW5zdGFuY2UgY2FsbHMgY2FuIGJlIG1lcmdlZCBpbnRvIG9uZS4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MDYiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgdGVybmFyeSAoJXMpIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy10ZXJuYXJ5IiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gb25lIG9mIGtub3duIHByZS1weXRob24gMi41IHRlcm5hcnkgc3ludGF4IGlzIHVzZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzA5IjogKAorICAgICAgICAgICAgIkJvb2xlYW4gZXhwcmVzc2lvbiBtYXkgYmUgc2ltcGxpZmllZCB0byAlcyIsCisgICAgICAgICAgICAic2ltcGxpZnktYm9vbGVhbi1leHByZXNzaW9uIiwKKyAgICAgICAgICAgICJFbWl0dGVkIHdoZW4gcmVkdW5kYW50IHByZS1weXRob24gMi41IHRlcm5hcnkgc3ludGF4IGlzIHVzZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzI2IjogKAorICAgICAgICAgICAgIkJvb2xlYW4gY29uZGl0aW9uICclcycgbWF5IGJlIHNpbXBsaWZpZWQgdG8gJyVzJyIsCisgICAgICAgICAgICAic2ltcGxpZmlhYmxlLWNvbmRpdGlvbiIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGEgYm9vbGVhbiBjb25kaXRpb24gaXMgYWJsZSB0byBiZSBzaW1wbGlmaWVkLiIsCisgICAgICAgICksCisgICAgICAgICJSMTcyNyI6ICgKKyAgICAgICAgICAgICJCb29sZWFuIGNvbmRpdGlvbiAnJXMnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICclcyciLAorICAgICAgICAgICAgImNvbmRpdGlvbi1ldmFscy10by1jb25zdGFudCIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGEgYm9vbGVhbiBjb25kaXRpb24gY2FuIGJlIHNpbXBsaWZpZWQgdG8gYSBjb25zdGFudCB2YWx1ZS4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MDIiOiAoCisgICAgICAgICAgICAiVG9vIG1hbnkgbmVzdGVkIGJsb2NrcyAoJXMvJXMpIiwKKyAgICAgICAgICAgICJ0b28tbWFueS1uZXN0ZWQtYmxvY2tzIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBmdW5jdGlvbiBvciBhIG1ldGhvZCBoYXMgdG9vIG1hbnkgbmVzdGVkICIKKyAgICAgICAgICAgICJibG9ja3MuIFRoaXMgbWFrZXMgdGhlIGNvZGUgbGVzcyB1bmRlcnN0YW5kYWJsZSBhbmQgIgorICAgICAgICAgICAgIm1haW50YWluYWJsZS4iLAorICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJSMDEwMSIsICJvbGQtdG9vLW1hbnktbmVzdGVkLWJsb2NrcyIpXX0sCisgICAgICAgICksCisgICAgICAgICJSMTcwMyI6ICgKKyAgICAgICAgICAgICJUaGUgaWYgc3RhdGVtZW50IGNhbiBiZSByZXBsYWNlZCB3aXRoICVzIiwKKyAgICAgICAgICAgICJzaW1wbGlmaWFibGUtaWYtc3RhdGVtZW50IiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gaWYgc3RhdGVtZW50IGNhbiBiZSByZXBsYWNlZCB3aXRoICdib29sKHRlc3QpJy4gIiwKKyAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiUjAxMDIiLCAib2xkLXNpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnQiKV19LAorICAgICAgICApLAorICAgICAgICAiUjE3MDQiOiAoCisgICAgICAgICAgICAiUmVkZWZpbmluZyBhcmd1bWVudCB3aXRoIHRoZSBsb2NhbCBuYW1lICVyIiwKKyAgICAgICAgICAgICJyZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgbG9jYWwgbmFtZSBpcyByZWRlZmluaW5nIGFuIGFyZ3VtZW50LCB3aGljaCBtaWdodCAiCisgICAgICAgICAgICAic3VnZ2VzdCBhIHBvdGVudGlhbCBlcnJvci4gVGhpcyBpcyB0YWtlbiBpbiBhY2NvdW50IG9ubHkgZm9yICIKKyAgICAgICAgICAgICJhIGhhbmRmdWwgb2YgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMsIHN1Y2ggYXMgZm9yIGl0ZXJhdGlvbiwgIgorICAgICAgICAgICAgIndpdGggc3RhdGVtZW50IGFzc2lnbm1lbnQgYW5kIGV4Y2VwdGlvbiBoYW5kbGVyIGFzc2lnbm1lbnQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzA1IjogKAorICAgICAgICAgICAgJ1VubmVjZXNzYXJ5ICIlcyIgYWZ0ZXIgInJldHVybiInLAorICAgICAgICAgICAgIm5vLWVsc2UtcmV0dXJuIiwKKyAgICAgICAgICAgICJVc2VkIGluIG9yZGVyIHRvIGhpZ2hsaWdodCBhbiB1bm5lY2Vzc2FyeSBibG9jayBvZiAiCisgICAgICAgICAgICAiY29kZSBmb2xsb3dpbmcgYW4gaWYgY29udGFpbmluZyBhIHJldHVybiBzdGF0ZW1lbnQuICIKKyAgICAgICAgICAgICJBcyBzdWNoLCBpdCB3aWxsIHdhcm4gd2hlbiBpdCBlbmNvdW50ZXJzIGFuIGVsc2UgIgorICAgICAgICAgICAgImZvbGxvd2luZyBhIGNoYWluIG9mIGlmcywgYWxsIG9mIHRoZW0gY29udGFpbmluZyBhICIKKyAgICAgICAgICAgICJyZXR1cm4gc3RhdGVtZW50LiIsCisgICAgICAgICksCisgICAgICAgICJSMTcwNyI6ICgKKyAgICAgICAgICAgICJEaXNhbGxvdyB0cmFpbGluZyBjb21tYSB0dXBsZSIsCisgICAgICAgICAgICAidHJhaWxpbmctY29tbWEtdHVwbGUiLAorICAgICAgICAgICAgIkluIFB5dGhvbiwgYSB0dXBsZSBpcyBhY3R1YWxseSBjcmVhdGVkIGJ5IHRoZSBjb21tYSBzeW1ib2wsICIKKyAgICAgICAgICAgICJub3QgYnkgdGhlIHBhcmVudGhlc2VzLiBVbmZvcnR1bmF0ZWx5LCBvbmUgY2FuIGFjdHVhbGx5IGNyZWF0ZSBhICIKKyAgICAgICAgICAgICJ0dXBsZSBieSBtaXNwbGFjaW5nIGEgdHJhaWxpbmcgY29tbWEsIHdoaWNoIGNhbiBsZWFkIHRvIHBvdGVudGlhbCAiCisgICAgICAgICAgICAid2VpcmQgYnVncyBpbiB5b3VyIGNvZGUuIFlvdSBzaG91bGQgYWx3YXlzIHVzZSBwYXJlbnRoZXNlcyAiCisgICAgICAgICAgICAiZXhwbGljaXRseSBmb3IgY3JlYXRpbmcgYSB0dXBsZS4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MDgiOiAoCisgICAgICAgICAgICAiRG8gbm90IHJhaXNlIFN0b3BJdGVyYXRpb24gaW4gZ2VuZXJhdG9yLCB1c2UgcmV0dXJuIHN0YXRlbWVudCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICJzdG9wLWl0ZXJhdGlvbi1yZXR1cm4iLAorICAgICAgICAgICAgIkFjY29yZGluZyB0byBQRVA0NzksIHRoZSByYWlzZSBvZiBTdG9wSXRlcmF0aW9uIHRvIGVuZCB0aGUgbG9vcCBvZiAiCisgICAgICAgICAgICAiYSBnZW5lcmF0b3IgbWF5IGxlYWQgdG8gaGFyZCB0byBmaW5kIGJ1Z3MuIFRoaXMgUEVQIHNwZWNpZnkgdGhhdCAiCisgICAgICAgICAgICAicmFpc2UgU3RvcEl0ZXJhdGlvbiBoYXMgdG8gYmUgcmVwbGFjZWQgYnkgYSBzaW1wbGUgcmV0dXJuIHN0YXRlbWVudCIsCisgICAgICAgICksCisgICAgICAgICJSMTcxMCI6ICgKKyAgICAgICAgICAgICJFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCAiCisgICAgICAgICAgICAib3Igbm9uZSBvZiB0aGVtIHNob3VsZC4iLAorICAgICAgICAgICAgImluY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50cyIsCisgICAgICAgICAgICAiQWNjb3JkaW5nIHRvIFBFUDgsIGlmIGFueSByZXR1cm4gc3RhdGVtZW50IHJldHVybnMgYW4gZXhwcmVzc2lvbiwgIgorICAgICAgICAgICAgImFueSByZXR1cm4gc3RhdGVtZW50cyB3aGVyZSBubyB2YWx1ZSBpcyByZXR1cm5lZCBzaG91bGQgZXhwbGljaXRseSAiCisgICAgICAgICAgICAic3RhdGUgdGhpcyBhcyByZXR1cm4gTm9uZSwgYW5kIGFuIGV4cGxpY2l0IHJldHVybiBzdGF0ZW1lbnQgIgorICAgICAgICAgICAgInNob3VsZCBiZSBwcmVzZW50IGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIChpZiByZWFjaGFibGUpIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzExIjogKAorICAgICAgICAgICAgIlVzZWxlc3MgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiBvciBtZXRob2QiLAorICAgICAgICAgICAgInVzZWxlc3MtcmV0dXJuIiwKKyAgICAgICAgICAgICdFbWl0dGVkIHdoZW4gYSBzaW5nbGUgInJldHVybiIgb3IgInJldHVybiBOb25lIiBzdGF0ZW1lbnQgaXMgZm91bmQgJworICAgICAgICAgICAgImF0IHRoZSBlbmQgb2YgZnVuY3Rpb24gb3IgbWV0aG9kIGRlZmluaXRpb24uIFRoaXMgc3RhdGVtZW50IGNhbiBzYWZlbHkgYmUgIgorICAgICAgICAgICAgInJlbW92ZWQgYmVjYXVzZSBQeXRob24gd2lsbCBpbXBsaWNpdGx5IHJldHVybiBOb25lIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzEyIjogKAorICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nIHR1cGxlIHVucGFja2luZyBmb3Igc3dhcHBpbmcgdmFyaWFibGVzIiwKKyAgICAgICAgICAgICJjb25zaWRlci1zd2FwLXZhcmlhYmxlcyIsCisgICAgICAgICAgICAiWW91IGRvIG5vdCBoYXZlIHRvIHVzZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSBpbiBvcmRlciB0byAiCisgICAgICAgICAgICAnc3dhcCB2YXJpYWJsZXMuIFVzaW5nICJ0dXBsZSB1bnBhY2tpbmciIHRvIGRpcmVjdGx5IHN3YXAgJworICAgICAgICAgICAgInZhcmlhYmxlcyBtYWtlcyB0aGUgaW50ZW50aW9uIG1vcmUgY2xlYXIuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzEzIjogKAorICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nIHN0ci5qb2luKHNlcXVlbmNlKSBmb3IgY29uY2F0ZW5hdGluZyAiCisgICAgICAgICAgICAic3RyaW5ncyBmcm9tIGFuIGl0ZXJhYmxlIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy1qb2luIiwKKyAgICAgICAgICAgICJVc2luZyBzdHIuam9pbihzZXF1ZW5jZSkgaXMgZmFzdGVyLCB1c2VzIGxlc3MgbWVtb3J5ICIKKyAgICAgICAgICAgICJhbmQgaW5jcmVhc2VzIHJlYWRhYmlsaXR5IGNvbXBhcmVkIHRvIGZvci1sb29wIGl0ZXJhdGlvbi4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MTQiOiAoCisgICAgICAgICAgICAnQ29uc2lkZXIgbWVyZ2luZyB0aGVzZSBjb21wYXJpc29ucyB3aXRoICJpbiIgdG8gJXInLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLWluIiwKKyAgICAgICAgICAgICJUbyBjaGVjayBpZiBhIHZhcmlhYmxlIGlzIGVxdWFsIHRvIG9uZSBvZiBtYW55IHZhbHVlcywiCisgICAgICAgICAgICAnY29tYmluZSB0aGUgdmFsdWVzIGludG8gYSB0dXBsZSBhbmQgY2hlY2sgaWYgdGhlIHZhcmlhYmxlIGlzIGNvbnRhaW5lZCAiaW4iIGl0ICcKKyAgICAgICAgICAgICJpbnN0ZWFkIG9mIGNoZWNraW5nIGZvciBlcXVhbGl0eSBhZ2FpbnN0IGVhY2ggb2YgdGhlIHZhbHVlcy4iCisgICAgICAgICAgICAiVGhpcyBpcyBmYXN0ZXIgYW5kIGxlc3MgdmVyYm9zZS4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MTUiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgZGljdC5nZXQgZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gYSBkaWN0ICIKKyAgICAgICAgICAgICJpZiBhIGtleSBpcyBwcmVzZW50IG9yIGEgZGVmYXVsdCBpZiBub3QiLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLWdldCIsCisgICAgICAgICAgICAiVXNpbmcgdGhlIGJ1aWx0aW4gZGljdC5nZXQgZm9yIGdldHRpbmcgYSB2YWx1ZSBmcm9tIGEgZGljdGlvbmFyeSAiCisgICAgICAgICAgICAiaWYgYSBrZXkgaXMgcHJlc2VudCBvciBhIGRlZmF1bHQgaWYgbm90LCBpcyBzaW1wbGVyIGFuZCBjb25zaWRlcmVkICIKKyAgICAgICAgICAgICJtb3JlIGlkaW9tYXRpYywgYWx0aG91Z2ggc29tZXRpbWVzIGEgYml0IHNsb3dlciIsCisgICAgICAgICksCisgICAgICAgICJSMTcxNiI6ICgKKyAgICAgICAgICAgICJTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMiLAorICAgICAgICAgICAgImNoYWluZWQtY29tcGFyaXNvbiIsCisgICAgICAgICAgICAiVGhpcyBtZXNzYWdlIGlzIGVtaXR0ZWQgd2hlbiBweWxpbnQgZW5jb3VudGVycyBib29sZWFuIG9wZXJhdGlvbiBsaWtlIgorICAgICAgICAgICAgJyJhIDwgYiBhbmQgYiA8IGMiLCBzdWdnZXN0aW5nIGluc3RlYWQgdG8gcmVmYWN0b3IgaXQgdG8gImEgPCBiIDwgYyInLAorICAgICAgICApLAorICAgICAgICAiUjE3MTciOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgYSBkaWN0aW9uYXJ5IGNvbXByZWhlbnNpb24iLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLWRpY3QtY29tcHJlaGVuc2lvbiIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIHdlIGRldGVjdCB0aGUgY3JlYXRpb24gb2YgYSBkaWN0aW9uYXJ5ICIKKyAgICAgICAgICAgICJ1c2luZyB0aGUgZGljdCgpIGNhbGxhYmxlIGFuZCBhIHRyYW5zaWVudCBsaXN0LiAiCisgICAgICAgICAgICAiQWx0aG91Z2ggdGhlcmUgaXMgbm90aGluZyBzeW50YWN0aWNhbGx5IHdyb25nIHdpdGggdGhpcyBjb2RlLCAiCisgICAgICAgICAgICAiaXQgaXMgaGFyZCB0byByZWFkIGFuZCBjYW4gYmUgc2ltcGxpZmllZCB0byBhIGRpY3QgY29tcHJlaGVuc2lvbi4iCisgICAgICAgICAgICAiQWxzbyBpdCBpcyBmYXN0ZXIgc2luY2UgeW91IGRvbid0IG5lZWQgdG8gY3JlYXRlIGFub3RoZXIgIgorICAgICAgICAgICAgInRyYW5zaWVudCBsaXN0IiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzE4IjogKAorICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nIGEgc2V0IGNvbXByZWhlbnNpb24iLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLXNldC1jb21wcmVoZW5zaW9uIiwKKyAgICAgICAgICAgICJBbHRob3VnaCB0aGVyZSBpcyBub3RoaW5nIHN5bnRhY3RpY2FsbHkgd3Jvbmcgd2l0aCB0aGlzIGNvZGUsICIKKyAgICAgICAgICAgICJpdCBpcyBoYXJkIHRvIHJlYWQgYW5kIGNhbiBiZSBzaW1wbGlmaWVkIHRvIGEgc2V0IGNvbXByZWhlbnNpb24uIgorICAgICAgICAgICAgIkFsc28gaXQgaXMgZmFzdGVyIHNpbmNlIHlvdSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhbm90aGVyICIKKyAgICAgICAgICAgICJ0cmFuc2llbnQgbGlzdCIsCisgICAgICAgICksCisgICAgICAgICJSMTcxOSI6ICgKKyAgICAgICAgICAgICJUaGUgaWYgZXhwcmVzc2lvbiBjYW4gYmUgcmVwbGFjZWQgd2l0aCAlcyIsCisgICAgICAgICAgICAic2ltcGxpZmlhYmxlLWlmLWV4cHJlc3Npb24iLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhbiBpZiBleHByZXNzaW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoICdib29sKHRlc3QpJy4gIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzIwIjogKAorICAgICAgICAgICAgJ1VubmVjZXNzYXJ5ICIlcyIgYWZ0ZXIgInJhaXNlIicsCisgICAgICAgICAgICAibm8tZWxzZS1yYWlzZSIsCisgICAgICAgICAgICAiVXNlZCBpbiBvcmRlciB0byBoaWdobGlnaHQgYW4gdW5uZWNlc3NhcnkgYmxvY2sgb2YgIgorICAgICAgICAgICAgImNvZGUgZm9sbG93aW5nIGFuIGlmIGNvbnRhaW5pbmcgYSByYWlzZSBzdGF0ZW1lbnQuICIKKyAgICAgICAgICAgICJBcyBzdWNoLCBpdCB3aWxsIHdhcm4gd2hlbiBpdCBlbmNvdW50ZXJzIGFuIGVsc2UgIgorICAgICAgICAgICAgImZvbGxvd2luZyBhIGNoYWluIG9mIGlmcywgYWxsIG9mIHRoZW0gY29udGFpbmluZyBhICIKKyAgICAgICAgICAgICJyYWlzZSBzdGF0ZW1lbnQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzIxIjogKAorICAgICAgICAgICAgIlVubmVjZXNzYXJ5IHVzZSBvZiBhIGNvbXByZWhlbnNpb24sIHVzZSAlcyBpbnN0ZWFkLiIsCisgICAgICAgICAgICAidW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbiIsCisgICAgICAgICAgICAiSW5zdGVhZCBvZiB1c2luZyBhbiBpZGVudGl0eSBjb21wcmVoZW5zaW9uLCAiCisgICAgICAgICAgICAiY29uc2lkZXIgdXNpbmcgdGhlIGxpc3QsIGRpY3Qgb3Igc2V0IGNvbnN0cnVjdG9yLiAiCisgICAgICAgICAgICAiSXQgaXMgZmFzdGVyIGFuZCBzaW1wbGVyLiIsCisgICAgICAgICksCisgICAgICAgICJSMTcyMiI6ICgKKyAgICAgICAgICAgICJDb25zaWRlciB1c2luZyBzeXMuZXhpdCgpIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy1zeXMtZXhpdCIsCisgICAgICAgICAgICAiSW5zdGVhZCBvZiB1c2luZyBleGl0KCkgb3IgcXVpdCgpLCBjb25zaWRlciB1c2luZyB0aGUgc3lzLmV4aXQoKS4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MjMiOiAoCisgICAgICAgICAgICAnVW5uZWNlc3NhcnkgIiVzIiBhZnRlciAiYnJlYWsiJywKKyAgICAgICAgICAgICJuby1lbHNlLWJyZWFrIiwKKyAgICAgICAgICAgICJVc2VkIGluIG9yZGVyIHRvIGhpZ2hsaWdodCBhbiB1bm5lY2Vzc2FyeSBibG9jayBvZiAiCisgICAgICAgICAgICAiY29kZSBmb2xsb3dpbmcgYW4gaWYgY29udGFpbmluZyBhIGJyZWFrIHN0YXRlbWVudC4gIgorICAgICAgICAgICAgIkFzIHN1Y2gsIGl0IHdpbGwgd2FybiB3aGVuIGl0IGVuY291bnRlcnMgYW4gZWxzZSAiCisgICAgICAgICAgICAiZm9sbG93aW5nIGEgY2hhaW4gb2YgaWZzLCBhbGwgb2YgdGhlbSBjb250YWluaW5nIGEgIgorICAgICAgICAgICAgImJyZWFrIHN0YXRlbWVudC4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MjQiOiAoCisgICAgICAgICAgICAnVW5uZWNlc3NhcnkgIiVzIiBhZnRlciAiY29udGludWUiJywKKyAgICAgICAgICAgICJuby1lbHNlLWNvbnRpbnVlIiwKKyAgICAgICAgICAgICJVc2VkIGluIG9yZGVyIHRvIGhpZ2hsaWdodCBhbiB1bm5lY2Vzc2FyeSBibG9jayBvZiAiCisgICAgICAgICAgICAiY29kZSBmb2xsb3dpbmcgYW4gaWYgY29udGFpbmluZyBhIGNvbnRpbnVlIHN0YXRlbWVudC4gIgorICAgICAgICAgICAgIkFzIHN1Y2gsIGl0IHdpbGwgd2FybiB3aGVuIGl0IGVuY291bnRlcnMgYW4gZWxzZSAiCisgICAgICAgICAgICAiZm9sbG93aW5nIGEgY2hhaW4gb2YgaWZzLCBhbGwgb2YgdGhlbSBjb250YWluaW5nIGEgIgorICAgICAgICAgICAgImNvbnRpbnVlIHN0YXRlbWVudC4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MjUiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgUHl0aG9uIDMgc3R5bGUgc3VwZXIoKSB3aXRob3V0IGFyZ3VtZW50cyIsCisgICAgICAgICAgICAic3VwZXItd2l0aC1hcmd1bWVudHMiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBjYWxsaW5nIHRoZSBzdXBlcigpIGJ1aWx0aW4gd2l0aCB0aGUgY3VycmVudCBjbGFzcyAiCisgICAgICAgICAgICAiYW5kIGluc3RhbmNlLiBPbiBQeXRob24gMyB0aGVzZSBhcmd1bWVudHMgYXJlIHRoZSBkZWZhdWx0IGFuZCB0aGV5IGNhbiBiZSBvbWl0dGVkLiIsCisgICAgICAgICksCisgICAgICAgICJSMTcyOCI6ICgKKyAgICAgICAgICAgICJDb25zaWRlciB1c2luZyBhIGdlbmVyYXRvciBpbnN0ZWFkICclcyglcyknIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy1nZW5lcmF0b3IiLAorICAgICAgICAgICAgIklmIHlvdXIgY29udGFpbmVyIGNhbiBiZSBsYXJnZSB1c2luZyAiCisgICAgICAgICAgICAiYSBnZW5lcmF0b3Igd2lsbCBicmluZyBiZXR0ZXIgcGVyZm9ybWFuY2UuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzI5IjogKAorICAgICAgICAgICAgIlVzZSBhIGdlbmVyYXRvciBpbnN0ZWFkICclcyglcyknIiwKKyAgICAgICAgICAgICJ1c2UtYS1nZW5lcmF0b3IiLAorICAgICAgICAgICAgIkNvbXByZWhlbnNpb24gaW5zaWRlIG9mICdhbnknIG9yICdhbGwnIGlzIHVubmVjZXNzYXJ5LiAiCisgICAgICAgICAgICAiQSBnZW5lcmF0b3Igd291bGQgYmUgc3VmZmljaWVudCBhbmQgZmFzdGVyLiIsCisgICAgICAgICksCisgICAgICAgICJSMTczMCI6ICgKKyAgICAgICAgICAgICJDb25zaWRlciB1c2luZyAnJXMnIGluc3RlYWQgb2YgdW5uZWNlc3NhcnkgaWYgYmxvY2siLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLW1pbi1idWlsdGluIiwKKyAgICAgICAgICAgICJVc2luZyB0aGUgbWluIGJ1aWx0aW4gaW5zdGVhZCBvZiBhIGNvbmRpdGlvbmFsIGltcHJvdmVzIHJlYWRhYmlsaXR5IGFuZCBjb25jaXNlbmVzcy4iLAorICAgICAgICApLAorICAgICAgICAiUjE3MzEiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgJyVzJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy1tYXgtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNpbmcgdGhlIG1heCBidWlsdGluIGluc3RlYWQgb2YgYSBjb25kaXRpb25hbCBpbXByb3ZlcyByZWFkYWJpbGl0eSBhbmQgY29uY2lzZW5lc3MuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzMyIjogKAorICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nICd3aXRoJyBmb3IgcmVzb3VyY2UtYWxsb2NhdGluZyBvcGVyYXRpb25zIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy13aXRoIiwKKyAgICAgICAgICAgICJFbWl0dGVkIGlmIGEgcmVzb3VyY2UtYWxsb2NhdGluZyBhc3NpZ25tZW50IG9yIGNhbGwgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgJ3dpdGgnIGJsb2NrLiAiCisgICAgICAgICAgICAiQnkgdXNpbmcgJ3dpdGgnIHRoZSByZWxlYXNlIG9mIHRoZSBhbGxvY2F0ZWQgcmVzb3VyY2VzIGlzIGVuc3VyZWQgZXZlbiBpbiB0aGUgY2FzZSBvZiBhbiBleGNlcHRpb24uIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlIxNzMzIjogKAorICAgICAgICAgICAgIlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJyVzJyBpbnN0ZWFkIiwKKyAgICAgICAgICAgICJ1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cCIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGl0ZXJhdGluZyBvdmVyIHRoZSBkaWN0aW9uYXJ5IGl0ZW1zIChrZXktaXRlbSBwYWlycykgYW5kIGFjY2Vzc2luZyB0aGUgIgorICAgICAgICAgICAgInZhbHVlIGJ5IGluZGV4IGxvb2t1cC4gIgorICAgICAgICAgICAgIlRoZSB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgaW5zdGVhZC4iLAorICAgICAgICApLAorICAgIH0KKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAibWF4LW5lc3RlZC1ibG9ja3MiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogNSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgYmxvY2tzIGZvciBmdW5jdGlvbiAvIG1ldGhvZCBib2R5IiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJuZXZlci1yZXR1cm5pbmctZnVuY3Rpb25zIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgic3lzLmV4aXQiLCAiYXJncGFyc2UucGFyc2VfZXJyb3IiKSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkNvbXBsZXRlIG5hbWUgb2YgZnVuY3Rpb25zIHRoYXQgbmV2ZXIgcmV0dXJucy4gV2hlbiBjaGVja2luZyAiCisgICAgICAgICAgICAgICAgImZvciBpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHMgaWYgYSBuZXZlciByZXR1cm5pbmcgZnVuY3Rpb24gaXMgIgorICAgICAgICAgICAgICAgICJjYWxsZWQgdGhlbiBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgYW4gZXhwbGljaXQgcmV0dXJuIHN0YXRlbWVudCAiCisgICAgICAgICAgICAgICAgImFuZCBubyBtZXNzYWdlIHdpbGwgYmUgcHJpbnRlZC4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBwcmlvcml0eSA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXI9Tm9uZSk6CisgICAgICAgIGNoZWNrZXJzLkJhc2VUb2tlbkNoZWNrZXIuX19pbml0X18oc2VsZiwgbGludGVyKQorICAgICAgICBzZWxmLl9yZXR1cm5fbm9kZXMgPSB7fQorICAgICAgICBzZWxmLl9pbml0KCkKKyAgICAgICAgc2VsZi5fbmV2ZXJfcmV0dXJuaW5nX2Z1bmN0aW9ucyA9IE5vbmUKKworICAgIGRlZiBfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5fbmVzdGVkX2Jsb2NrcyA9IFtdCisgICAgICAgIHNlbGYuX2VsaWZzID0gW10KKyAgICAgICAgc2VsZi5fbmVzdGVkX2Jsb2Nrc19tc2cgPSBOb25lCisgICAgICAgIHNlbGYuX3JlcG9ydGVkX3N3YXBfbm9kZXMgPSBzZXQoKQorICAgICAgICBzZWxmLl9jYW5fc2ltcGxpZnlfYm9vbF9vcCA9IEZhbHNlCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIyBkbyB0aGlzIGluIG9wZW4gc2luY2UgY29uZmlnIG5vdCBmdWxseSBpbml0aWFsaXplZCBpbiBfX2luaXRfXworICAgICAgICBzZWxmLl9uZXZlcl9yZXR1cm5pbmdfZnVuY3Rpb25zID0gc2V0KHNlbGYuY29uZmlnLm5ldmVyX3JldHVybmluZ19mdW5jdGlvbnMpCisKKyAgICBAYXN0cm9pZC5kZWNvcmF0b3JzLmNhY2hlZHByb3BlcnR5CisgICAgZGVmIF9kdW1teV9yZ3goc2VsZik6CisgICAgICAgIHJldHVybiBsaW50X3V0aWxzLmdldF9nbG9iYWxfb3B0aW9uKHNlbGYsICJkdW1teS12YXJpYWJsZXMtcmd4IiwgZGVmYXVsdD1Ob25lKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfYm9vbF9jb25zdChub2RlKToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgICAgICBub2RlLnZhbHVlLnZhbHVlLCBib29sCisgICAgICAgICkKKworICAgIGRlZiBfaXNfYWN0dWFsX2VsaWYoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIGlmIHRoZSBnaXZlbiBub2RlIGlzIGFuIGFjdHVhbCBlbGlmCisKKyAgICAgICAgVGhpcyBpcyBhIHByb2JsZW0gd2UncmUgaGF2aW5nIHdpdGggdGhlIGJ1aWx0aW4gYXN0IG1vZHVsZSwKKyAgICAgICAgd2hpY2ggc3BsaXRzIGBlbGlmYCBicmFuY2hlcyBpbnRvIGEgc2VwYXJhdGUgaWYgc3RhdGVtZW50LgorICAgICAgICBVbmZvcnR1bmF0ZWx5IHdlIG5lZWQgdG8ga25vdyB0aGUgZXhhY3QgdHlwZSBpbiBjZXJ0YWluCisgICAgICAgIGNhc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5JZik6CisgICAgICAgICAgICBvcmVsc2UgPSBub2RlLnBhcmVudC5vcmVsc2UKKyAgICAgICAgICAgICMgY3VycmVudCBpZiBub2RlIG11c3QgZGlyZWN0bHkgZm9sbG93IGFuICJlbHNlIgorICAgICAgICAgICAgaWYgb3JlbHNlIGFuZCBvcmVsc2UgPT0gW25vZGVdOgorICAgICAgICAgICAgICAgIGlmIChub2RlLmxpbmVubywgbm9kZS5jb2xfb2Zmc2V0KSBpbiBzZWxmLl9lbGlmczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX2NoZWNrX3NpbXBsaWZpYWJsZV9pZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuIGlmIG5vZGUgY2FuIGJlIHNpbXBsaWZpZWQuCisKKyAgICAgICAgVGhlIGlmIHN0YXRlbWVudCBjYW4gYmUgcmVkdWNlZCB0byBhIGJvb2xlYW4gZXhwcmVzc2lvbgorICAgICAgICBpbiBzb21lIGNhc2VzLiBGb3IgaW5zdGFuY2UsIGlmIHRoZXJlIGFyZSB0d28gYnJhbmNoZXMKKyAgICAgICAgYW5kIGJvdGggb2YgdGhlbSByZXR1cm4gYSBib29sZWFuIHZhbHVlIHRoYXQgZGVwZW5kcyBvbgorICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBzdGF0ZW1lbnQncyB0ZXN0LCB0aGVuIHRoaXMgY2FuIGJlIHJlZHVjZWQKKyAgICAgICAgdG8gYGJvb2wodGVzdClgIHdpdGhvdXQgbG9zaW5nIGFueSBmdW5jdGlvbmFsaXR5LgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLl9pc19hY3R1YWxfZWxpZihub2RlKToKKyAgICAgICAgICAgICMgTm90IGludGVyZXN0ZWQgaW4gaWYgc3RhdGVtZW50cyB3aXRoIG11bHRpcGxlIGJyYW5jaGVzLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGxlbihub2RlLm9yZWxzZSkgIT0gMSBvciBsZW4obm9kZS5ib2R5KSAhPSAxOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBDaGVjayBpZiBib3RoIGJyYW5jaGVzIGNhbiBiZSByZWR1Y2VkLgorICAgICAgICBmaXJzdF9icmFuY2ggPSBub2RlLmJvZHlbMF0KKyAgICAgICAgZWxzZV9icmFuY2ggPSBub2RlLm9yZWxzZVswXQorICAgICAgICBpZiBpc2luc3RhbmNlKGZpcnN0X2JyYW5jaCwgYXN0cm9pZC5SZXR1cm4pOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxzZV9icmFuY2gsIGFzdHJvaWQuUmV0dXJuKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZpcnN0X2JyYW5jaF9pc19ib29sID0gc2VsZi5faXNfYm9vbF9jb25zdChmaXJzdF9icmFuY2gpCisgICAgICAgICAgICBlbHNlX2JyYW5jaF9pc19ib29sID0gc2VsZi5faXNfYm9vbF9jb25zdChlbHNlX2JyYW5jaCkKKyAgICAgICAgICAgIHJlZHVjZWRfdG8gPSAiJ3JldHVybiBib29sKHRlc3QpJyIKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpcnN0X2JyYW5jaCwgYXN0cm9pZC5Bc3NpZ24pOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxzZV9icmFuY2gsIGFzdHJvaWQuQXNzaWduKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBhc3NpZ24gdG8gdGhlIHNhbWUgdmFsdWUKKyAgICAgICAgICAgIGZpcnN0X2JyYW5jaF90YXJnZXRzID0gWworICAgICAgICAgICAgICAgIHRhcmdldC5uYW1lCisgICAgICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBmaXJzdF9icmFuY2gudGFyZ2V0cworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCBhc3Ryb2lkLkFzc2lnbk5hbWUpCisgICAgICAgICAgICBdCisgICAgICAgICAgICBlbHNlX2JyYW5jaF90YXJnZXRzID0gWworICAgICAgICAgICAgICAgIHRhcmdldC5uYW1lCisgICAgICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBlbHNlX2JyYW5jaC50YXJnZXRzCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0YXJnZXQsIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9icmFuY2hfdGFyZ2V0cyBvciBub3QgZWxzZV9icmFuY2hfdGFyZ2V0czoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNvcnRlZChmaXJzdF9icmFuY2hfdGFyZ2V0cykgIT0gc29ydGVkKGVsc2VfYnJhbmNoX3RhcmdldHMpOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBmaXJzdF9icmFuY2hfaXNfYm9vbCA9IHNlbGYuX2lzX2Jvb2xfY29uc3QoZmlyc3RfYnJhbmNoKQorICAgICAgICAgICAgZWxzZV9icmFuY2hfaXNfYm9vbCA9IHNlbGYuX2lzX2Jvb2xfY29uc3QoZWxzZV9icmFuY2gpCisgICAgICAgICAgICByZWR1Y2VkX3RvID0gIid2YXIgPSBib29sKHRlc3QpJyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBmaXJzdF9icmFuY2hfaXNfYm9vbCBvciBub3QgZWxzZV9icmFuY2hfaXNfYm9vbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgZmlyc3RfYnJhbmNoLnZhbHVlLnZhbHVlOgorICAgICAgICAgICAgIyBUaGlzIGlzIGEgY2FzZSB0aGF0IGNhbid0IGJlIGVhc2lseSBzaW1wbGlmaWVkIGFuZAorICAgICAgICAgICAgIyBpZiBpdCBjYW4gYmUgc2ltcGxpZmllZCwgaXQgd2lsbCB1c3VhbGx5IHJlc3VsdCBpbiBhCisgICAgICAgICAgICAjIGNvZGUgdGhhdCdzIGhhcmRlciB0byB1bmRlcnN0YW5kIGFuZCBjb21wcmVoZW5kLgorICAgICAgICAgICAgIyBMZXQncyB0YWtlIGZvciBpbnN0YW5jZSBgYXJnIGFuZCBhcmcgPD0gM2AuIFRoaXMgY291bGQgdGhlb3JldGljYWxseSBiZQorICAgICAgICAgICAgIyByZWR1Y2VkIHRvIGBub3QgYXJnIG9yIGFyZyA+IDNgLCBidXQgdGhlIG5ldCByZXN1bHQgaXMgdGhhdCBub3cgdGhlCisgICAgICAgICAgICAjIGNvbmRpdGlvbiBpcyBoYXJkZXIgdG8gdW5kZXJzdGFuZCwgYmVjYXVzZSBpdCByZXF1aXJlcyB1bmRlcnN0YW5kaW5nIG9mCisgICAgICAgICAgICAjIGFuIGV4dHJhIGNsYXVzZToKKyAgICAgICAgICAgICMgICAqIGZpcnN0LCB0aGVyZSBpcyB0aGUgbmVnYXRpb24gb2YgdHJ1dGhuZXNzIHdpdGggYG5vdCBhcmdgCisgICAgICAgICAgICAjICAgKiB0aGUgc2Vjb25kIGNsYXVzZSBpcyBgYXJnID4gM2AsIHdoaWNoIG9jY3VycyB3aGVuIGFyZyBoYXMgYQorICAgICAgICAgICAgIyAgICAgYSB0cnV0aCB2YWx1ZSwgYnV0IGl0IGltcGxpZXMgdGhhdCBgYXJnID4gM2AgaXMgZXF1aXZhbGVudAorICAgICAgICAgICAgIyAgICAgd2l0aCBgYXJnIGFuZCBhcmcgPiAzYCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdXNlciBtdXN0CisgICAgICAgICAgICAjICAgICB0aGluayBhYm91dCB0aGlzIGFzc3VtcHRpb24gd2hlbiBldmFsdWF0aW5nIGBhcmcgPiAzYC4KKyAgICAgICAgICAgICMgICAgIFRoZSBvcmlnaW5hbCBmb3JtIGlzIGVhc2llciB0byBncmFzcC4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInNpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnQiLCBub2RlPW5vZGUsIGFyZ3M9KHJlZHVjZWRfdG8sKSkKKworICAgIGRlZiBwcm9jZXNzX3Rva2VucyhzZWxmLCB0b2tlbnMpOgorICAgICAgICAjIFByb2Nlc3MgdG9rZW5zIGFuZCBsb29rIGZvciAnaWYnIG9yICdlbGlmJworICAgICAgICBmb3IgaW5kZXgsIHRva2VuIGluIGVudW1lcmF0ZSh0b2tlbnMpOgorICAgICAgICAgICAgdG9rZW5fc3RyaW5nID0gdG9rZW5bMV0KKyAgICAgICAgICAgIGlmIHRva2VuX3N0cmluZyA9PSAiZWxpZiI6CisgICAgICAgICAgICAgICAgIyBBU1QgZXhpc3RzIGJ5IHRoZSB0aW1lIHByb2Nlc3NfdG9rZW5zIGlzIGNhbGxlZCwgc28KKyAgICAgICAgICAgICAgICAjIGl0J3Mgc2FmZSB0byBhc3N1bWUgdG9rZW5zW2luZGV4KzFdCisgICAgICAgICAgICAgICAgIyBleGlzdHMuIHRva2Vuc1tpbmRleCsxXVsyXSBpcyB0aGUgZWxpZidzIHBvc2l0aW9uIGFzCisgICAgICAgICAgICAgICAgIyByZXBvcnRlZCBieSBDUHl0aG9uIGFuZCBQeVB5LAorICAgICAgICAgICAgICAgICMgdG9rZW5zW2luZGV4XVsyXSBpcyB0aGUgYWN0dWFsIHBvc2l0aW9uIGFuZCBhbHNvIGlzCisgICAgICAgICAgICAgICAgIyByZXBvcnRlZCBieSBJcm9uUHl0aG9uLgorICAgICAgICAgICAgICAgIHNlbGYuX2VsaWZzLmV4dGVuZChbdG9rZW5zW2luZGV4XVsyXSwgdG9rZW5zW2luZGV4ICsgMV1bMl1dKQorICAgICAgICAgICAgZWxpZiBfaXNfdHJhaWxpbmdfY29tbWEodG9rZW5zLCBpbmRleCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJ0cmFpbGluZy1jb21tYS10dXBsZSIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ0cmFpbGluZy1jb21tYS10dXBsZSIsIGxpbmU9dG9rZW4uc3RhcnRbMF0pCisKKyAgICBkZWYgbGVhdmVfbW9kdWxlKHNlbGYsIF8pOgorICAgICAgICBzZWxmLl9pbml0KCkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidG9vLW1hbnktbmVzdGVkLWJsb2NrcyIpCisgICAgZGVmIHZpc2l0X3RyeWV4Y2VwdChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbmVzdGVkX2Jsb2Nrcyhub2RlKQorCisgICAgdmlzaXRfdHJ5ZmluYWxseSA9IHZpc2l0X3RyeWV4Y2VwdAorICAgIHZpc2l0X3doaWxlID0gdmlzaXRfdHJ5ZXhjZXB0CisKKyAgICBkZWYgX2NoZWNrX3JlZGVmaW5lZF9hcmd1bWVudF9mcm9tX2xvY2FsKHNlbGYsIG5hbWVfbm9kZSk6CisgICAgICAgIGlmIHNlbGYuX2R1bW15X3JneCBhbmQgc2VsZi5fZHVtbXlfcmd4Lm1hdGNoKG5hbWVfbm9kZS5uYW1lKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgbmFtZV9ub2RlLmxpbmVubzoKKyAgICAgICAgICAgICMgVW5rbm93biBwb3NpdGlvbiwgbWF5YmUgaXQgaXMgYSBtYW51YWxseSBidWlsdCBBU1Q/CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzY29wZSA9IG5hbWVfbm9kZS5zY29wZSgpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNjb3BlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBkZWZpbmVkX2FyZ3VtZW50IGluIHNjb3BlLmFyZ3Mubm9kZXNfb2ZfY2xhc3MoCisgICAgICAgICAgICBhc3Ryb2lkLkFzc2lnbk5hbWUsIHNraXBfa2xhc3M9KGFzdHJvaWQuTGFtYmRhLCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIGlmIGRlZmluZWRfYXJndW1lbnQubmFtZSA9PSBuYW1lX25vZGUubmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAicmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWwiLAorICAgICAgICAgICAgICAgICAgICBub2RlPW5hbWVfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgYXJncz0obmFtZV9ub2RlLm5hbWUsKSwKKyAgICAgICAgICAgICAgICApCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJyZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbCIsCisgICAgICAgICJ0b28tbWFueS1uZXN0ZWQtYmxvY2tzIiwKKyAgICAgICAgInVubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwIiwKKyAgICApCisgICAgZGVmIHZpc2l0X2ZvcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbmVzdGVkX2Jsb2Nrcyhub2RlKQorICAgICAgICBzZWxmLl9jaGVja191bm5lY2Vzc2FyeV9kaWN0X2luZGV4X2xvb2t1cChub2RlKQorCisgICAgICAgIGZvciBuYW1lIGluIG5vZGUudGFyZ2V0Lm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQXNzaWduTmFtZSk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19yZWRlZmluZWRfYXJndW1lbnRfZnJvbV9sb2NhbChuYW1lKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJyZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbCIpCisgICAgZGVmIHZpc2l0X2V4Y2VwdGhhbmRsZXIoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUubmFtZSBhbmQgaXNpbnN0YW5jZShub2RlLm5hbWUsIGFzdHJvaWQuQXNzaWduTmFtZSk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19yZWRlZmluZWRfYXJndW1lbnRfZnJvbV9sb2NhbChub2RlLm5hbWUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInJlZGVmaW5lZC1hcmd1bWVudC1mcm9tLWxvY2FsIikKKyAgICBkZWYgdmlzaXRfd2l0aChzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIF8sIG5hbWVzIGluIG5vZGUuaXRlbXM6CisgICAgICAgICAgICBpZiBub3QgbmFtZXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQXNzaWduTmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfcmVkZWZpbmVkX2FyZ3VtZW50X2Zyb21fbG9jYWwobmFtZSkKKworICAgIGRlZiBfY2hlY2tfc3VwZXJmbHVvdXNfZWxzZShzZWxmLCBub2RlLCBtc2dfaWQsIHJldHVybmluZ19ub2RlX2NsYXNzKToKKyAgICAgICAgaWYgbm90IG5vZGUub3JlbHNlOgorICAgICAgICAgICAgIyBOb3QgaW50ZXJlc3RlZCBpbiBpZiBzdGF0ZW1lbnRzIHdpdGhvdXQgZWxzZS4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYuX2lzX2FjdHVhbF9lbGlmKG5vZGUpOgorICAgICAgICAgICAgIyBOb3QgaW50ZXJlc3RlZCBpbiBlbGlmIG5vZGVzOyBvbmx5IGlmCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBfaWZfc3RhdGVtZW50X2lzX2Fsd2F5c19yZXR1cm5pbmcobm9kZSwgcmV0dXJuaW5nX25vZGVfY2xhc3MpOgorICAgICAgICAgICAgb3JlbHNlID0gbm9kZS5vcmVsc2VbMF0KKyAgICAgICAgICAgIGZvbGxvd2VkX2J5X2VsaWYgPSAob3JlbHNlLmxpbmVubywgb3JlbHNlLmNvbF9vZmZzZXQpIGluIHNlbGYuX2VsaWZzCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZCwgbm9kZT1ub2RlLCBhcmdzPSJlbGlmIiBpZiBmb2xsb3dlZF9ieV9lbGlmIGVsc2UgImVsc2UiCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX3N1cGVyZmx1b3VzX2Vsc2VfcmV0dXJuKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tfc3VwZXJmbHVvdXNfZWxzZSgKKyAgICAgICAgICAgIG5vZGUsIG1zZ19pZD0ibm8tZWxzZS1yZXR1cm4iLCByZXR1cm5pbmdfbm9kZV9jbGFzcz1hc3Ryb2lkLlJldHVybgorICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX3N1cGVyZmx1b3VzX2Vsc2VfcmFpc2Uoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19zdXBlcmZsdW91c19lbHNlKAorICAgICAgICAgICAgbm9kZSwgbXNnX2lkPSJuby1lbHNlLXJhaXNlIiwgcmV0dXJuaW5nX25vZGVfY2xhc3M9YXN0cm9pZC5SYWlzZQorICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX3N1cGVyZmx1b3VzX2Vsc2VfYnJlYWsoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19zdXBlcmZsdW91c19lbHNlKAorICAgICAgICAgICAgbm9kZSwgbXNnX2lkPSJuby1lbHNlLWJyZWFrIiwgcmV0dXJuaW5nX25vZGVfY2xhc3M9YXN0cm9pZC5CcmVhaworICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX3N1cGVyZmx1b3VzX2Vsc2VfY29udGludWUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19zdXBlcmZsdW91c19lbHNlKAorICAgICAgICAgICAgbm9kZSwgbXNnX2lkPSJuby1lbHNlLWNvbnRpbnVlIiwgcmV0dXJuaW5nX25vZGVfY2xhc3M9YXN0cm9pZC5Db250aW51ZQorICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF90eXBlX2FuZF9uYW1lX2FyZV9lcXVhbChub2RlX2EsIG5vZGVfYik6CisgICAgICAgIGZvciBfdHlwZSBpbiAoYXN0cm9pZC5OYW1lLCBhc3Ryb2lkLkFzc2lnbk5hbWUpOgorICAgICAgICAgICAgaWYgYWxsKGlzaW5zdGFuY2UoX25vZGUsIF90eXBlKSBmb3IgX25vZGUgaW4gKG5vZGVfYSwgbm9kZV9iKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVfYS5uYW1lID09IG5vZGVfYi5uYW1lCisgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKF9ub2RlLCBhc3Ryb2lkLkNvbnN0KSBmb3IgX25vZGUgaW4gKG5vZGVfYSwgbm9kZV9iKSk6CisgICAgICAgICAgICByZXR1cm4gbm9kZV9hLnZhbHVlID09IG5vZGVfYi52YWx1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfaXNfZGljdF9nZXRfYmxvY2soc2VsZiwgbm9kZSk6CisKKyAgICAgICAgIyAiaWYgPGNvbXBhcmUgbm9kZT4iCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUudGVzdCwgYXN0cm9pZC5Db21wYXJlKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgRG9lcyBub3QgaGF2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQgaW4gdGhlIGd1YXJkJ3MgYm9keQorICAgICAgICBpZiBsZW4obm9kZS5ib2R5KSAhPSAxOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBMb29rIGZvciBhIHNpbmdsZSB2YXJpYWJsZSBhc3NpZ25tZW50IG9uIHRoZSBMSFMgYW5kIGEgc3Vic2NyaXB0IG9uIFJIUworICAgICAgICBzdG10ID0gbm9kZS5ib2R5WzBdCisgICAgICAgIGlmIG5vdCAoCisgICAgICAgICAgICBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuQXNzaWduKQorICAgICAgICAgICAgYW5kIGxlbihub2RlLmJvZHlbMF0udGFyZ2V0cykgPT0gMQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLnRhcmdldHNbMF0sIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHN0bXQudmFsdWUsIGFzdHJvaWQuU3Vic2NyaXB0KQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBUaGUgc3Vic2NyaXB0J3Mgc2xpY2UgbmVlZHMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHRlc3QgdmFyaWFibGUuCisgICAgICAgIHNsaWNlX3ZhbHVlID0gc3RtdC52YWx1ZS5zbGljZQorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgc2VsZi5fdHlwZV9hbmRfbmFtZV9hcmVfZXF1YWwoc3RtdC52YWx1ZS52YWx1ZSwgbm9kZS50ZXN0Lm9wc1swXVsxXSkKKyAgICAgICAgICAgIGFuZCBzZWxmLl90eXBlX2FuZF9uYW1lX2FyZV9lcXVhbChzbGljZV92YWx1ZSwgbm9kZS50ZXN0LmxlZnQpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIFRoZSBvYmplY3QgbmVlZHMgdG8gYmUgYSBkaWN0aW9uYXJ5IGluc3RhbmNlCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHV0aWxzLnNhZmVfaW5mZXIobm9kZS50ZXN0Lm9wc1swXVsxXSksIGFzdHJvaWQuRGljdCkKKworICAgIGRlZiBfY2hlY2tfY29uc2lkZXJfZ2V0KHNlbGYsIG5vZGUpOgorICAgICAgICBpZl9ibG9ja19vayA9IHNlbGYuX2lzX2RpY3RfZ2V0X2Jsb2NrKG5vZGUpCisgICAgICAgIGlmIGlmX2Jsb2NrX29rIGFuZCBub3Qgbm9kZS5vcmVsc2U6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb25zaWRlci11c2luZy1nZXQiLCBub2RlPW5vZGUpCisgICAgICAgIGVsaWYgKAorICAgICAgICAgICAgaWZfYmxvY2tfb2sKKyAgICAgICAgICAgIGFuZCBsZW4obm9kZS5vcmVsc2UpID09IDEKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUub3JlbHNlWzBdLCBhc3Ryb2lkLkFzc2lnbikKKyAgICAgICAgICAgIGFuZCBzZWxmLl90eXBlX2FuZF9uYW1lX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICBub2RlLm9yZWxzZVswXS50YXJnZXRzWzBdLCBub2RlLmJvZHlbMF0udGFyZ2V0c1swXQorICAgICAgICAgICAgKQorICAgICAgICAgICAgYW5kIGxlbihub2RlLm9yZWxzZVswXS50YXJnZXRzKSA9PSAxCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb25zaWRlci11c2luZy1nZXQiLCBub2RlPW5vZGUpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJ0b28tbWFueS1uZXN0ZWQtYmxvY2tzIiwKKyAgICAgICAgInNpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnQiLAorICAgICAgICAibm8tZWxzZS1yZXR1cm4iLAorICAgICAgICAibm8tZWxzZS1yYWlzZSIsCisgICAgICAgICJuby1lbHNlLWJyZWFrIiwKKyAgICAgICAgIm5vLWVsc2UtY29udGludWUiLAorICAgICAgICAiY29uc2lkZXItdXNpbmctZ2V0IiwKKyAgICApCisgICAgZGVmIHZpc2l0X2lmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19zaW1wbGlmaWFibGVfaWYobm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfbmVzdGVkX2Jsb2Nrcyhub2RlKQorICAgICAgICBzZWxmLl9jaGVja19zdXBlcmZsdW91c19lbHNlX3JldHVybihub2RlKQorICAgICAgICBzZWxmLl9jaGVja19zdXBlcmZsdW91c19lbHNlX3JhaXNlKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3N1cGVyZmx1b3VzX2Vsc2VfYnJlYWsobm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc3VwZXJmbHVvdXNfZWxzZV9jb250aW51ZShub2RlKQorICAgICAgICBzZWxmLl9jaGVja19jb25zaWRlcl9nZXQobm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29uc2lkZXJfdXNpbmdfbWluX21heF9idWlsdGluKG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2NvbnNpZGVyX3VzaW5nX21pbl9tYXhfYnVpbHRpbihzZWxmLCBub2RlOiBhc3Ryb2lkLklmKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuIGlmIG5vZGUgY2FuIGJlIHJlZmFjdG9yZWQgYXMgYW4gbWluL21heCBweXRob24gYnVpbHRpbi4iIiIKKyAgICAgICAgaWYgc2VsZi5faXNfYWN0dWFsX2VsaWYobm9kZSkgb3Igbm9kZS5vcmVsc2U6CisgICAgICAgICAgICAjIE5vdCBpbnRlcmVzdGVkIGluIGlmIHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSBicmFuY2hlcy4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGxlbihub2RlLmJvZHkpICE9IDE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBib2R5ID0gbm9kZS5ib2R5WzBdCisgICAgICAgICMgQ2hlY2sgaWYgY29uZGl0aW9uIGNhbiBiZSByZWR1Y2VkLgorICAgICAgICBpZiBub3QgaGFzYXR0cihib2R5LCAidGFyZ2V0cyIpIG9yIGxlbihib2R5LnRhcmdldHMpICE9IDE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0YXJnZXQgPSBib2R5LnRhcmdldHNbMF0KKyAgICAgICAgaWYgbm90ICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS50ZXN0LCBhc3Ryb2lkLkNvbXBhcmUpCisgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2UodGFyZ2V0LCBhc3Ryb2lkLlN1YnNjcmlwdCkKKyAgICAgICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShub2RlLnRlc3QubGVmdCwgYXN0cm9pZC5TdWJzY3JpcHQpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShib2R5LCBhc3Ryb2lkLkFzc2lnbikKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgYXNzaWduYXRpb24gaXMgb24gdGhlIHNhbWUgdmFyaWFibGUuCisgICAgICAgIGlmIGhhc2F0dHIobm9kZS50ZXN0LmxlZnQsICJuYW1lIik6CisgICAgICAgICAgICBsZWZ0X29wZXJhbmQgPSBub2RlLnRlc3QubGVmdC5uYW1lCisgICAgICAgIGVsaWYgaGFzYXR0cihub2RlLnRlc3QubGVmdCwgImF0dHJuYW1lIik6CisgICAgICAgICAgICBsZWZ0X29wZXJhbmQgPSBub2RlLnRlc3QubGVmdC5hdHRybmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaGFzYXR0cih0YXJnZXQsICJuYW1lIik6CisgICAgICAgICAgICB0YXJnZXRfYXNzaWduYXRpb24gPSB0YXJnZXQubmFtZQorICAgICAgICBlbGlmIGhhc2F0dHIodGFyZ2V0LCAiYXR0cm5hbWUiKToKKyAgICAgICAgICAgIHRhcmdldF9hc3NpZ25hdGlvbiA9IHRhcmdldC5hdHRybmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IChsZWZ0X29wZXJhbmQgPT0gdGFyZ2V0X2Fzc2lnbmF0aW9uKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGxlbihub2RlLnRlc3Qub3BzKSA+IDE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShib2R5LnZhbHVlLCAoYXN0cm9pZC5OYW1lLCBhc3Ryb2lkLkNvbnN0KSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBvcGVyYXRvciwgcmlnaHRfc3RhdGVtZW50ID0gbm9kZS50ZXN0Lm9wc1swXQorICAgICAgICBpZiBpc2luc3RhbmNlKGJvZHkudmFsdWUsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICBib2R5X3ZhbHVlID0gYm9keS52YWx1ZS5uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBib2R5X3ZhbHVlID0gYm9keS52YWx1ZS52YWx1ZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UocmlnaHRfc3RhdGVtZW50LCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgcmlnaHRfc3RhdGVtZW50X3ZhbHVlID0gcmlnaHRfc3RhdGVtZW50Lm5hbWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJpZ2h0X3N0YXRlbWVudCwgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICByaWdodF9zdGF0ZW1lbnRfdmFsdWUgPSByaWdodF9zdGF0ZW1lbnQudmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgVmVyaWZ5IHRoZSByaWdodCBwYXJ0IG9mIHRoZSBzdGF0ZW1lbnQgaXMgdGhlIHNhbWUuCisgICAgICAgIGlmIHJpZ2h0X3N0YXRlbWVudF92YWx1ZSAhPSBib2R5X3ZhbHVlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgb3BlcmF0b3IgaW4gKCI8IiwgIjw9Iik6CisgICAgICAgICAgICByZWR1Y2VkX3RvID0gInt0YXJnZXR9ID0gbWF4KHt0YXJnZXR9LCB7aXRlbX0pIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgdGFyZ2V0PXRhcmdldF9hc3NpZ25hdGlvbiwgaXRlbT1ib2R5X3ZhbHVlCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJjb25zaWRlci11c2luZy1tYXgtYnVpbHRpbiIsIG5vZGU9bm9kZSwgYXJncz0ocmVkdWNlZF90bywpCisgICAgICAgICAgICApCisgICAgICAgIGVsaWYgb3BlcmF0b3IgaW4gKCI+IiwgIj49Iik6CisgICAgICAgICAgICByZWR1Y2VkX3RvID0gInt0YXJnZXR9ID0gbWluKHt0YXJnZXR9LCB7aXRlbX0pIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgdGFyZ2V0PXRhcmdldF9hc3NpZ25hdGlvbiwgaXRlbT1ib2R5X3ZhbHVlCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJjb25zaWRlci11c2luZy1taW4tYnVpbHRpbiIsIG5vZGU9bm9kZSwgYXJncz0ocmVkdWNlZF90bywpCisgICAgICAgICAgICApCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInNpbXBsaWZpYWJsZS1pZi1leHByZXNzaW9uIikKKyAgICBkZWYgdmlzaXRfaWZleHAoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3NpbXBsaWZpYWJsZV9pZmV4cChub2RlKQorCisgICAgZGVmIF9jaGVja19zaW1wbGlmaWFibGVfaWZleHAoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUuYm9keSwgYXN0cm9pZC5Db25zdCkgb3Igbm90IGlzaW5zdGFuY2UoCisgICAgICAgICAgICBub2RlLm9yZWxzZSwgYXN0cm9pZC5Db25zdAorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS5ib2R5LnZhbHVlLCBib29sKSBvciBub3QgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUub3JlbHNlLnZhbHVlLCBib29sCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUudGVzdCwgYXN0cm9pZC5Db21wYXJlKToKKyAgICAgICAgICAgIHRlc3RfcmVkdWNlZF90byA9ICJ0ZXN0IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGVzdF9yZWR1Y2VkX3RvID0gImJvb2wodGVzdCkiCisKKyAgICAgICAgaWYgKG5vZGUuYm9keS52YWx1ZSwgbm9kZS5vcmVsc2UudmFsdWUpID09IChUcnVlLCBGYWxzZSk6CisgICAgICAgICAgICByZWR1Y2VkX3RvID0gZiIne3Rlc3RfcmVkdWNlZF90b30nIgorICAgICAgICBlbGlmIChub2RlLmJvZHkudmFsdWUsIG5vZGUub3JlbHNlLnZhbHVlKSA9PSAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgcmVkdWNlZF90byA9ICInbm90IHRlc3QnIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic2ltcGxpZmlhYmxlLWlmLWV4cHJlc3Npb24iLCBub2RlPW5vZGUsIGFyZ3M9KHJlZHVjZWRfdG8sKSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgInRvby1tYW55LW5lc3RlZC1ibG9ja3MiLCAiaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzIiwgInVzZWxlc3MtcmV0dXJuIgorICAgICkKKyAgICBkZWYgbGVhdmVfZnVuY3Rpb25kZWYoc2VsZiwgbm9kZSk6CisgICAgICAgICMgY2hlY2sgbGVmdC1vdmVyIG5lc3RlZCBibG9ja3Mgc3RhY2sKKyAgICAgICAgc2VsZi5fZW1pdF9uZXN0ZWRfYmxvY2tzX21lc3NhZ2VfaWZfbmVlZGVkKHNlbGYuX25lc3RlZF9ibG9ja3MpCisgICAgICAgICMgbmV3IHNjb3BlID0gcmVpbml0aWFsaXplIHRoZSBzdGFjayBvZiBuZXN0ZWQgYmxvY2tzCisgICAgICAgIHNlbGYuX25lc3RlZF9ibG9ja3MgPSBbXQorICAgICAgICAjIGNoZWNrIGNvbnNpc3RlbnQgcmV0dXJuIHN0YXRlbWVudHMKKyAgICAgICAgc2VsZi5fY2hlY2tfY29uc2lzdGVudF9yZXR1cm5zKG5vZGUpCisgICAgICAgICMgY2hlY2sgZm9yIHNpbmdsZSByZXR1cm4gb3IgcmV0dXJuIE5vbmUgYXQgdGhlIGVuZAorICAgICAgICBzZWxmLl9jaGVja19yZXR1cm5fYXRfdGhlX2VuZChub2RlKQorICAgICAgICBzZWxmLl9yZXR1cm5fbm9kZXNbbm9kZS5uYW1lXSA9IFtdCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoInN0b3AtaXRlcmF0aW9uLXJldHVybiIpCisgICAgZGVmIHZpc2l0X3JhaXNlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19zdG9wX2l0ZXJhdGlvbl9pbnNpZGVfZ2VuZXJhdG9yKG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3N0b3BfaXRlcmF0aW9uX2luc2lkZV9nZW5lcmF0b3Ioc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIGlmIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIFN0b3BJdGVyYXRpb24gaXMgcmFpc2VkIGluc2lkZSBhIGdlbmVyYXRvciIiIgorICAgICAgICBmcmFtZSA9IG5vZGUuZnJhbWUoKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmcmFtZSwgYXN0cm9pZC5GdW5jdGlvbkRlZikgb3Igbm90IGZyYW1lLmlzX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHV0aWxzLm5vZGVfaWdub3Jlc19leGNlcHRpb24obm9kZSwgU3RvcEl0ZXJhdGlvbik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IG5vZGUuZXhjOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4YyA9IHV0aWxzLnNhZmVfaW5mZXIobm9kZS5leGMpCisgICAgICAgIGlmIG5vdCBleGMgb3Igbm90IGlzaW5zdGFuY2UoZXhjLCAoYXN0cm9pZC5JbnN0YW5jZSwgYXN0cm9pZC5DbGFzc0RlZikpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuX2NoZWNrX2V4Y2VwdGlvbl9pbmhlcml0X2Zyb21fc3RvcGl0ZXJhdGlvbihleGMpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic3RvcC1pdGVyYXRpb24tcmV0dXJuIiwgbm9kZT1ub2RlKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY2hlY2tfZXhjZXB0aW9uX2luaGVyaXRfZnJvbV9zdG9waXRlcmF0aW9uKGV4Yyk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBleGNlcHRpb24gbm9kZSBpbiBhcmd1bWVudCBpbmhlcml0IGZyb20gU3RvcEl0ZXJhdGlvbiIiIgorICAgICAgICBzdG9waXRlcmF0aW9uX3FuYW1lID0gZiJ7dXRpbHMuRVhDRVBUSU9OU19NT0RVTEV9LlN0b3BJdGVyYXRpb24iCisgICAgICAgIHJldHVybiBhbnkoX2NsYXNzLnFuYW1lKCkgPT0gc3RvcGl0ZXJhdGlvbl9xbmFtZSBmb3IgX2NsYXNzIGluIGV4Yy5tcm8oKSkKKworICAgIGRlZiBfY2hlY2tfY29uc2lkZXJfdXNpbmdfY29tcHJlaGVuc2lvbl9jb25zdHJ1Y3RvcihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgIGFuZCBub2RlLmFyZ3MKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuYXJnc1swXSwgYXN0cm9pZC5MaXN0Q29tcCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIGlmIG5vZGUuZnVuYy5uYW1lID09ICJkaWN0IiBhbmQgbm90IGlzaW5zdGFuY2UoCisgICAgICAgICAgICAgICAgbm9kZS5hcmdzWzBdLmVsdCwgYXN0cm9pZC5DYWxsCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIG1lc3NhZ2VfbmFtZSA9ICJjb25zaWRlci11c2luZy1kaWN0LWNvbXByZWhlbnNpb24iCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZShtZXNzYWdlX25hbWUsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIGVsaWYgbm9kZS5mdW5jLm5hbWUgPT0gInNldCI6CisgICAgICAgICAgICAgICAgbWVzc2FnZV9uYW1lID0gImNvbnNpZGVyLXVzaW5nLXNldC1jb21wcmVoZW5zaW9uIgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UobWVzc2FnZV9uYW1lLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2NvbnNpZGVyX3VzaW5nX2dlbmVyYXRvcihzZWxmLCBub2RlKToKKyAgICAgICAgIyAnYW55JyBhbmQgJ2FsbCcgZGVmaW5pdGVseSBzaG91bGQgdXNlIGdlbmVyYXRvciwgd2hpbGUgJ2xpc3QnIGFuZCAndHVwbGUnIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBmaXJzdAorICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L3B1bGwvMzMwOSNkaXNjdXNzaW9uX3I1NzY2ODMxMDkKKyAgICAgICAgY2hlY2tlZF9jYWxsID0gWyJhbnkiLCAiYWxsIiwgImxpc3QiLCAidHVwbGUiXQorICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgICAgIGFuZCBub2RlLmZ1bmMKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgYW5kIG5vZGUuZnVuYy5uYW1lIGluIGNoZWNrZWRfY2FsbAorICAgICAgICApOgorICAgICAgICAgICAgIyBmdW5jdGlvbnMgaW4gY2hlY2tlZF9jYWxscyB0YWtlIGV4YWN0bHkgb25lIGFyZ3VtZW50CisgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGxpc3QgY29tcHJlaGVuc2lvbgorICAgICAgICAgICAgaWYgbGVuKG5vZGUuYXJncykgPT0gMSBhbmQgaXNpbnN0YW5jZShub2RlLmFyZ3NbMF0sIGFzdHJvaWQuTGlzdENvbXApOgorICAgICAgICAgICAgICAgICMgcmVtb3ZlIHNxdWFyZSBicmFja2V0cyAnW10nCisgICAgICAgICAgICAgICAgaW5zaWRlX2NvbXAgPSBub2RlLmFyZ3NbMF0uYXNfc3RyaW5nKClbMTotMV0KKyAgICAgICAgICAgICAgICBjYWxsX25hbWUgPSBub2RlLmZ1bmMubmFtZQorICAgICAgICAgICAgICAgIGlmIGNhbGxfbmFtZSBpbiBbImFueSIsICJhbGwiXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UtYS1nZW5lcmF0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oY2FsbF9uYW1lLCBpbnNpZGVfY29tcCksCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLWdlbmVyYXRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShjYWxsX25hbWUsIGluc2lkZV9jb21wKSwKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKAorICAgICAgICAic3RvcC1pdGVyYXRpb24tcmV0dXJuIiwKKyAgICAgICAgImNvbnNpZGVyLXVzaW5nLWRpY3QtY29tcHJlaGVuc2lvbiIsCisgICAgICAgICJjb25zaWRlci11c2luZy1zZXQtY29tcHJlaGVuc2lvbiIsCisgICAgICAgICJjb25zaWRlci11c2luZy1zeXMtZXhpdCIsCisgICAgICAgICJzdXBlci13aXRoLWFyZ3VtZW50cyIsCisgICAgICAgICJjb25zaWRlci11c2luZy1nZW5lcmF0b3IiLAorICAgICAgICAiY29uc2lkZXItdXNpbmctd2l0aCIsCisgICAgKQorICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19yYWlzaW5nX3N0b3BpdGVyYXRpb25faW5fZ2VuZXJhdG9yX25leHRfY2FsbChub2RlKQorICAgICAgICBzZWxmLl9jaGVja19jb25zaWRlcl91c2luZ19jb21wcmVoZW5zaW9uX2NvbnN0cnVjdG9yKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3F1aXRfZXhpdF9jYWxsKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3N1cGVyX3dpdGhfYXJndW1lbnRzKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnNpZGVyX3VzaW5nX2dlbmVyYXRvcihub2RlKQorICAgICAgICBzZWxmLl9jaGVja19jb25zaWRlcl91c2luZ193aXRoKG5vZGUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9oYXNfZXhpdF9pbl9zY29wZShzY29wZSk6CisgICAgICAgIGV4aXRfZnVuYyA9IHNjb3BlLmxvY2Fscy5nZXQoImV4aXQiKQorICAgICAgICByZXR1cm4gYm9vbCgKKyAgICAgICAgICAgIGV4aXRfZnVuYyBhbmQgaXNpbnN0YW5jZShleGl0X2Z1bmNbMF0sIChhc3Ryb2lkLkltcG9ydEZyb20sIGFzdHJvaWQuSW1wb3J0KSkKKyAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19xdWl0X2V4aXRfY2FsbChzZWxmLCBub2RlKToKKworICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5OYW1lKSBhbmQgbm9kZS5mdW5jLm5hbWUgaW4gQlVJTFRJTl9FWElUX0ZVTkNTOgorICAgICAgICAgICAgIyBJZiB3ZSBoYXZlIGBleGl0YCBpbXBvcnRlZCBmcm9tIGBzeXNgIGluIHRoZSBjdXJyZW50IG9yIGdsb2JhbCBzY29wZSwgZXhlbXB0IHRoaXMgaW5zdGFuY2UuCisgICAgICAgICAgICBsb2NhbF9zY29wZSA9IG5vZGUuc2NvcGUoKQorICAgICAgICAgICAgaWYgc2VsZi5faGFzX2V4aXRfaW5fc2NvcGUobG9jYWxfc2NvcGUpIG9yIHNlbGYuX2hhc19leGl0X2luX3Njb3BlKAorICAgICAgICAgICAgICAgIG5vZGUucm9vdCgpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29uc2lkZXItdXNpbmctc3lzLWV4aXQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3N1cGVyX3dpdGhfYXJndW1lbnRzKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuTmFtZSkgb3Igbm9kZS5mdW5jLm5hbWUgIT0gInN1cGVyIjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LWJvb2xlYW4tZXhwcmVzc2lvbnMKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgbGVuKG5vZGUuYXJncykgIT0gMgorICAgICAgICAgICAgb3Igbm90IGlzaW5zdGFuY2Uobm9kZS5hcmdzWzFdLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICBvciBub2RlLmFyZ3NbMV0ubmFtZSAhPSAic2VsZiIKKyAgICAgICAgICAgIG9yIG5vdCBpc2luc3RhbmNlKG5vZGUuYXJnc1swXSwgYXN0cm9pZC5OYW1lKQorICAgICAgICAgICAgb3Igbm90IGlzaW5zdGFuY2Uobm9kZS5hcmdzWzFdLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICBvciBub2RlX2ZyYW1lX2NsYXNzKG5vZGUpIGlzIE5vbmUKKyAgICAgICAgICAgIG9yIG5vZGUuYXJnc1swXS5uYW1lICE9IG5vZGVfZnJhbWVfY2xhc3Mobm9kZSkubmFtZQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic3VwZXItd2l0aC1hcmd1bWVudHMiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3JhaXNpbmdfc3RvcGl0ZXJhdGlvbl9pbl9nZW5lcmF0b3JfbmV4dF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayBpZiBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgY2FsbCB0byBuZXh0IGZ1bmN0aW9uCisKKyAgICAgICAgSWYgdGhlIG5leHQgdmFsdWUgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgdGhlbiBkbyBub3QgYWRkIG1lc3NhZ2UuCisKKyAgICAgICAgOnBhcmFtIG5vZGU6IENoZWNrIHRvIHNlZSBpZiB0aGlzIENhbGwgbm9kZSBpcyBhIG5leHQgZnVuY3Rpb24KKyAgICAgICAgOnR5cGUgbm9kZTogOmNsYXNzOmBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5DYWxsYAorICAgICAgICAiIiIKKworICAgICAgICBkZWYgX2xvb2tzX2xpa2VfaW5maW5pdGVfaXRlcmF0b3IocGFyYW0pOgorICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKHBhcmFtKQorICAgICAgICAgICAgaWYgaW5mZXJyZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZmVycmVkLnFuYW1lKCkgaW4gS05PV05fSU5GSU5JVEVfSVRFUkFUT1JTCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5BdHRyaWJ1dGUpOgorICAgICAgICAgICAgIyBBIG5leHQoKSBtZXRob2QsIHdoaWNoIGlzIG5vdyB3aGF0IHdlIHdhbnQuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbmZlcnJlZCA9IHV0aWxzLnNhZmVfaW5mZXIobm9kZS5mdW5jKQorICAgICAgICBpZiBnZXRhdHRyKGluZmVycmVkLCAibmFtZSIsICIiKSA9PSAibmV4dCI6CisgICAgICAgICAgICBmcmFtZSA9IG5vZGUuZnJhbWUoKQorICAgICAgICAgICAgIyBUaGUgbmV4dCBidWlsdGluIGNhbiBvbmx5IGhhdmUgdXAgdG8gdHdvCisgICAgICAgICAgICAjIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFuZCBubyBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICAgICAgaGFzX3NlbnRpbmVsX3ZhbHVlID0gbGVuKG5vZGUuYXJncykgPiAxCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShmcmFtZSwgYXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgICAgICAgICBhbmQgZnJhbWUuaXNfZ2VuZXJhdG9yKCkKKyAgICAgICAgICAgICAgICBhbmQgbm90IGhhc19zZW50aW5lbF92YWx1ZQorICAgICAgICAgICAgICAgIGFuZCBub3QgdXRpbHMubm9kZV9pZ25vcmVzX2V4Y2VwdGlvbihub2RlLCBTdG9wSXRlcmF0aW9uKQorICAgICAgICAgICAgICAgIGFuZCBub3QgX2xvb2tzX2xpa2VfaW5maW5pdGVfaXRlcmF0b3Iobm9kZS5hcmdzWzBdKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJzdG9wLWl0ZXJhdGlvbi1yZXR1cm4iLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX25lc3RlZF9ibG9ja3Moc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlVwZGF0ZSBhbmQgY2hlY2sgdGhlIG51bWJlciBvZiBuZXN0ZWQgYmxvY2tzIiIiCisgICAgICAgICMgb25seSBjaGVjayBibG9jayBsZXZlbHMgaW5zaWRlIGZ1bmN0aW9ucyBvciBtZXRob2RzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUuc2NvcGUoKSwgYXN0cm9pZC5GdW5jdGlvbkRlZik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBtZXNzYWdlcyBhcmUgdHJpZ2dlcmVkIG9uIGxlYXZpbmcgdGhlIG5lc3RlZCBibG9jay4gSGVyZSB3ZSBzYXZlIHRoZQorICAgICAgICAjIHN0YWNrIGluIGNhc2UgdGhlIGN1cnJlbnQgbm9kZSBpc24ndCBuZXN0ZWQgaW4gdGhlIHByZXZpb3VzIG9uZQorICAgICAgICBuZXN0ZWRfYmxvY2tzID0gc2VsZi5fbmVzdGVkX2Jsb2Nrc1s6XQorICAgICAgICBpZiBub2RlLnBhcmVudCA9PSBub2RlLnNjb3BlKCk6CisgICAgICAgICAgICBzZWxmLl9uZXN0ZWRfYmxvY2tzID0gW25vZGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGdvIHRocm91Z2ggYW5jZXN0b3JzIGZyb20gdGhlIG1vc3QgbmVzdGVkIHRvIHRoZSBsZXNzCisgICAgICAgICAgICBmb3IgYW5jZXN0b3Jfbm9kZSBpbiByZXZlcnNlZChzZWxmLl9uZXN0ZWRfYmxvY2tzKToKKyAgICAgICAgICAgICAgICBpZiBhbmNlc3Rvcl9ub2RlID09IG5vZGUucGFyZW50OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuX25lc3RlZF9ibG9ja3MucG9wKCkKKyAgICAgICAgICAgICMgaWYgdGhlIG5vZGUgaXMgYW4gZWxpZiwgdGhpcyBzaG91bGQgbm90IGJlIGFub3RoZXIgbmVzdGluZyBsZXZlbAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLklmKSBhbmQgc2VsZi5faXNfYWN0dWFsX2VsaWYobm9kZSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbmVzdGVkX2Jsb2NrczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbmVzdGVkX2Jsb2Nrcy5wb3AoKQorICAgICAgICAgICAgc2VsZi5fbmVzdGVkX2Jsb2Nrcy5hcHBlbmQobm9kZSkKKworICAgICAgICAjIHNlbmQgbWVzc2FnZSBvbmx5IG9uY2UgcGVyIGdyb3VwIG9mIG5lc3RlZCBibG9ja3MKKyAgICAgICAgaWYgbGVuKG5lc3RlZF9ibG9ja3MpID4gbGVuKHNlbGYuX25lc3RlZF9ibG9ja3MpOgorICAgICAgICAgICAgc2VsZi5fZW1pdF9uZXN0ZWRfYmxvY2tzX21lc3NhZ2VfaWZfbmVlZGVkKG5lc3RlZF9ibG9ja3MpCisKKyAgICBkZWYgX2VtaXRfbmVzdGVkX2Jsb2Nrc19tZXNzYWdlX2lmX25lZWRlZChzZWxmLCBuZXN0ZWRfYmxvY2tzKToKKyAgICAgICAgaWYgbGVuKG5lc3RlZF9ibG9ja3MpID4gc2VsZi5jb25maWcubWF4X25lc3RlZF9ibG9ja3M6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ0b28tbWFueS1uZXN0ZWQtYmxvY2tzIiwKKyAgICAgICAgICAgICAgICBub2RlPW5lc3RlZF9ibG9ja3NbMF0sCisgICAgICAgICAgICAgICAgYXJncz0obGVuKG5lc3RlZF9ibG9ja3MpLCBzZWxmLmNvbmZpZy5tYXhfbmVzdGVkX2Jsb2NrcyksCisgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9kdXBsaWNhdGVkX2lzaW5zdGFuY2VfdHlwZXMobm9kZSk6CisgICAgICAgICIiIkdldCB0aGUgZHVwbGljYXRlZCB0eXBlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGlzaW5zdGFuY2UgY2FsbHMuCisKKyAgICAgICAgOnBhcmFtIGFzdHJvaWQuQm9vbE9wIG5vZGU6IE5vZGUgd2hpY2ggc2hvdWxkIGNvbnRhaW4gYSBidW5jaCBvZiBpc2luc3RhbmNlIGNhbGxzLgorICAgICAgICA6cmV0dXJuczogRGljdGlvbmFyeSBvZiB0aGUgY29tcGFyaXNvbiBvYmplY3RzIGZyb20gdGhlIGlzaW5zdGFuY2UgY2FsbHMsCisgICAgICAgICAgICAgICAgICB0byBkdXBsaWNhdGUgdmFsdWVzIGZyb20gY29uc2VjdXRpdmUgY2FsbHMuCisgICAgICAgIDpydHlwZTogZGljdAorICAgICAgICAiIiIKKyAgICAgICAgZHVwbGljYXRlZF9vYmplY3RzID0gc2V0KCkKKyAgICAgICAgYWxsX3R5cGVzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Qoc2V0KQorCisgICAgICAgIGZvciBjYWxsIGluIG5vZGUudmFsdWVzOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FsbCwgYXN0cm9pZC5DYWxsKSBvciBsZW4oY2FsbC5hcmdzKSAhPSAyOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihjYWxsLmZ1bmMpCisgICAgICAgICAgICBpZiBub3QgaW5mZXJyZWQgb3Igbm90IHV0aWxzLmlzX2J1aWx0aW5fb2JqZWN0KGluZmVycmVkKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpbmZlcnJlZC5uYW1lICE9ICJpc2luc3RhbmNlIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpc2luc3RhbmNlX29iamVjdCA9IGNhbGwuYXJnc1swXS5hc19zdHJpbmcoKQorICAgICAgICAgICAgaXNpbnN0YW5jZV90eXBlcyA9IGNhbGwuYXJnc1sxXQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlX29iamVjdCBpbiBhbGxfdHlwZXM6CisgICAgICAgICAgICAgICAgZHVwbGljYXRlZF9vYmplY3RzLmFkZChpc2luc3RhbmNlX29iamVjdCkKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpc2luc3RhbmNlX3R5cGVzLCBhc3Ryb2lkLlR1cGxlKToKKyAgICAgICAgICAgICAgICBlbGVtcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NfdHlwZS5hc19zdHJpbmcoKSBmb3IgY2xhc3NfdHlwZSBpbiBpc2luc3RhbmNlX3R5cGVzLml0ZXJlZCgpCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbGVtcyA9IFtpc2luc3RhbmNlX3R5cGVzLmFzX3N0cmluZygpXQorICAgICAgICAgICAgYWxsX3R5cGVzW2lzaW5zdGFuY2Vfb2JqZWN0XS51cGRhdGUoZWxlbXMpCisKKyAgICAgICAgIyBSZW1vdmUgYWxsIGtleXMgd2hpY2ggbm90IGR1cGxpY2F0ZWQKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIGtleTogdmFsdWUgZm9yIGtleSwgdmFsdWUgaW4gYWxsX3R5cGVzLml0ZW1zKCkgaWYga2V5IGluIGR1cGxpY2F0ZWRfb2JqZWN0cworICAgICAgICB9CisKKyAgICBkZWYgX2NoZWNrX2NvbnNpZGVyX21lcmdpbmdfaXNpbnN0YW5jZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2hlY2sgaXNpbnN0YW5jZSBjYWxscyB3aGljaCBjYW4gYmUgbWVyZ2VkIHRvZ2V0aGVyLiIiIgorICAgICAgICBpZiBub2RlLm9wICE9ICJvciI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmaXJzdF9hcmdzID0gc2VsZi5fZHVwbGljYXRlZF9pc2luc3RhbmNlX3R5cGVzKG5vZGUpCisgICAgICAgIGZvciBkdXBsaWNhdGVkX25hbWUsIGNsYXNzX25hbWVzIGluIGZpcnN0X2FyZ3MuaXRlbXMoKToKKyAgICAgICAgICAgIG5hbWVzID0gc29ydGVkKG5hbWUgZm9yIG5hbWUgaW4gY2xhc3NfbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJjb25zaWRlci1tZXJnaW5nLWlzaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPShkdXBsaWNhdGVkX25hbWUsICIsICIuam9pbihuYW1lcykpLAorICAgICAgICAgICAgKQorCisgICAgZGVmIF9jaGVja19jb25zaWRlcl91c2luZ19pbihzZWxmLCBub2RlKToKKyAgICAgICAgYWxsb3dlZF9vcHMgPSB7Im9yIjogIj09IiwgImFuZCI6ICIhPSJ9CisKKyAgICAgICAgaWYgbm9kZS5vcCBub3QgaW4gYWxsb3dlZF9vcHMgb3IgbGVuKG5vZGUudmFsdWVzKSA8IDI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgdmFsdWUgaW4gbm9kZS52YWx1ZXM6CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuQ29tcGFyZSkKKyAgICAgICAgICAgICAgICBvciBsZW4odmFsdWUub3BzKSAhPSAxCisgICAgICAgICAgICAgICAgb3IgdmFsdWUub3BzWzBdWzBdIG5vdCBpbiBhbGxvd2VkX29wc1tub2RlLm9wXQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvciBjb21wYXJhYmxlIGluIHZhbHVlLmxlZnQsIHZhbHVlLm9wc1swXVsxXToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbXBhcmFibGUsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgR2F0aGVyIHZhcmlhYmxlcyBhbmQgdmFsdWVzIGZyb20gY29tcGFyaXNvbnMKKyAgICAgICAgdmFyaWFibGVzLCB2YWx1ZXMgPSBbXSwgW10KKyAgICAgICAgZm9yIHZhbHVlIGluIG5vZGUudmFsdWVzOgorICAgICAgICAgICAgdmFyaWFibGVfc2V0ID0gc2V0KCkKKyAgICAgICAgICAgIGZvciBjb21wYXJhYmxlIGluIHZhbHVlLmxlZnQsIHZhbHVlLm9wc1swXVsxXToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbXBhcmFibGUsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3NldC5hZGQoY29tcGFyYWJsZS5hc19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKGNvbXBhcmFibGUuYXNfc3RyaW5nKCkpCisgICAgICAgICAgICB2YXJpYWJsZXMuYXBwZW5kKHZhcmlhYmxlX3NldCkKKworICAgICAgICAjIExvb2sgZm9yIChjb21tb24tKXZhcmlhYmxlcyB0aGF0IG9jY3VyIGluIGFsbCBjb21wYXJpc29ucworICAgICAgICBjb21tb25fdmFyaWFibGVzID0gcmVkdWNlKGxhbWJkYSBhLCBiOiBhLmludGVyc2VjdGlvbihiKSwgdmFyaWFibGVzKQorCisgICAgICAgIGlmIG5vdCBjb21tb25fdmFyaWFibGVzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBHYXRoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzdWdnZXN0aW9uCisgICAgICAgIGNvbW1vbl92YXJpYWJsZSA9IHNvcnRlZChsaXN0KGNvbW1vbl92YXJpYWJsZXMpKVswXQorICAgICAgICBjb21wcmVoZW5zaW9uID0gImluIiBpZiBub2RlLm9wID09ICJvciIgZWxzZSAibm90IGluIgorICAgICAgICB2YWx1ZXMgPSBsaXN0KGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0LmZyb21rZXlzKHZhbHVlcykpCisgICAgICAgIHZhbHVlcy5yZW1vdmUoY29tbW9uX3ZhcmlhYmxlKQorICAgICAgICB2YWx1ZXNfc3RyaW5nID0gIiwgIi5qb2luKHZhbHVlcykgaWYgbGVuKHZhbHVlcykgIT0gMSBlbHNlIHZhbHVlc1swXSArICIsIgorICAgICAgICBzdWdnZXN0aW9uID0gZiJ7Y29tbW9uX3ZhcmlhYmxlfSB7Y29tcHJlaGVuc2lvbn0gKHt2YWx1ZXNfc3RyaW5nfSkiCisKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29uc2lkZXItdXNpbmctaW4iLCBub2RlPW5vZGUsIGFyZ3M9KHN1Z2dlc3Rpb24sKSkKKworICAgIGRlZiBfY2hlY2tfY2hhaW5lZF9jb21wYXJpc29uKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayBpZiB0aGVyZSBpcyBhbnkgY2hhaW5lZCBjb21wYXJpc29uIGluIHRoZSBleHByZXNzaW9uLgorCisgICAgICAgIEFkZCBhIHJlZmFjdG9yaW5nIG1lc3NhZ2UgaWYgYSBib29sT3AgY29udGFpbnMgY29tcGFyaXNvbiBsaWtlIGEgPCBiIGFuZCBiIDwgYywKKyAgICAgICAgd2hpY2ggY2FuIGJlIGNoYWluZWQgYXMgYSA8IGIgPCBjLgorCisgICAgICAgIENhcmUgaXMgdGFrZW4gdG8gYXZvaWQgc2ltcGxpZnlpbmcgYSA8IGIgPCBjIGFuZCBiIDwgZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vZGUub3AgIT0gImFuZCIgb3IgbGVuKG5vZGUudmFsdWVzKSA8IDI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBkZWYgX2ZpbmRfbG93ZXJfdXBwZXJfYm91bmRzKGNvbXBhcmlzb25fbm9kZSwgdXNlcyk6CisgICAgICAgICAgICBsZWZ0X29wZXJhbmQgPSBjb21wYXJpc29uX25vZGUubGVmdAorICAgICAgICAgICAgZm9yIG9wZXJhdG9yLCByaWdodF9vcGVyYW5kIGluIGNvbXBhcmlzb25fbm9kZS5vcHM6CisgICAgICAgICAgICAgICAgZm9yIG9wZXJhbmQgaW4gKGxlZnRfb3BlcmFuZCwgcmlnaHRfb3BlcmFuZCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9wZXJhbmQsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9wZXJhbmQubmFtZQorICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3BlcmFuZCwgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9wZXJhbmQudmFsdWUKKworICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBpZiBvcGVyYXRvciBpbiAoIjwiLCAiPD0iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wZXJhbmQgaXMgbGVmdF9vcGVyYW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXNbdmFsdWVdWyJsb3dlcl9ib3VuZCJdLmFkZChjb21wYXJpc29uX25vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG9wZXJhbmQgaXMgcmlnaHRfb3BlcmFuZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzW3ZhbHVlXVsidXBwZXJfYm91bmQiXS5hZGQoY29tcGFyaXNvbl9ub2RlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIG9wZXJhdG9yIGluICgiPiIsICI+PSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3BlcmFuZCBpcyBsZWZ0X29wZXJhbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlc1t2YWx1ZV1bInVwcGVyX2JvdW5kIl0uYWRkKGNvbXBhcmlzb25fbm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgb3BlcmFuZCBpcyByaWdodF9vcGVyYW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXNbdmFsdWVdWyJsb3dlcl9ib3VuZCJdLmFkZChjb21wYXJpc29uX25vZGUpCisgICAgICAgICAgICAgICAgbGVmdF9vcGVyYW5kID0gcmlnaHRfb3BlcmFuZAorCisgICAgICAgIHVzZXMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCgKKyAgICAgICAgICAgIGxhbWJkYTogeyJsb3dlcl9ib3VuZCI6IHNldCgpLCAidXBwZXJfYm91bmQiOiBzZXQoKX0KKyAgICAgICAgKQorICAgICAgICBmb3IgY29tcGFyaXNvbl9ub2RlIGluIG5vZGUudmFsdWVzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb21wYXJpc29uX25vZGUsIGFzdHJvaWQuQ29tcGFyZSk6CisgICAgICAgICAgICAgICAgX2ZpbmRfbG93ZXJfdXBwZXJfYm91bmRzKGNvbXBhcmlzb25fbm9kZSwgdXNlcykKKworICAgICAgICBmb3IgXywgYm91bmRzIGluIHVzZXMuaXRlbXMoKToKKyAgICAgICAgICAgIG51bV9zaGFyZWQgPSBsZW4oYm91bmRzWyJsb3dlcl9ib3VuZCJdLmludGVyc2VjdGlvbihib3VuZHNbInVwcGVyX2JvdW5kIl0pKQorICAgICAgICAgICAgbnVtX2xvd2VyX2JvdW5kcyA9IGxlbihib3VuZHNbImxvd2VyX2JvdW5kIl0pCisgICAgICAgICAgICBudW1fdXBwZXJfYm91bmRzID0gbGVuKGJvdW5kc1sidXBwZXJfYm91bmQiXSkKKyAgICAgICAgICAgIGlmIG51bV9zaGFyZWQgPCBudW1fbG93ZXJfYm91bmRzIGFuZCBudW1fc2hhcmVkIDwgbnVtX3VwcGVyX2JvdW5kczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjaGFpbmVkLWNvbXBhcmlzb24iLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2FwcGx5X2Jvb2xlYW5fc2ltcGxpZmljYXRpb25fcnVsZXMob3BlcmF0b3IsIHZhbHVlcyk6CisgICAgICAgICIiIlJlbW92ZXMgaXJyZWxldmFudCB2YWx1ZXMgb3IgcmV0dXJucyBzaG9ydGNpcmN1aXRpbmcgdmFsdWVzCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBhcHBsaWVzIHRoZSBmb2xsb3dpbmcgdHdvIHJ1bGVzOgorICAgICAgICAxKSBhbiBPUiBleHByZXNzaW9uIHdpdGggVHJ1ZSBpbiBpdCB3aWxsIGFsd2F5cyBiZSB0cnVlLCBhbmQgdGhlCisgICAgICAgICAgIHJldmVyc2UgZm9yIEFORAorCisgICAgICAgIDIpIEZhbHNlIHZhbHVlcyBpbiBPUiBleHByZXNzaW9ucyBhcmUgb25seSByZWxldmFudCBpZiBhbGwgdmFsdWVzIGFyZQorICAgICAgICAgICBmYWxzZSwgYW5kIHRoZSByZXZlcnNlIGZvciBBTkQiIiIKKyAgICAgICAgc2ltcGxpZmllZF92YWx1ZXMgPSBbXQorCisgICAgICAgIGZvciBzdWJub2RlIGluIHZhbHVlczoKKyAgICAgICAgICAgIGluZmVycmVkX2Jvb2wgPSBOb25lCisgICAgICAgICAgICBpZiBub3QgbmV4dChzdWJub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuTmFtZSksIEZhbHNlKToKKyAgICAgICAgICAgICAgICBpbmZlcnJlZCA9IHV0aWxzLnNhZmVfaW5mZXIoc3Vibm9kZSkKKyAgICAgICAgICAgICAgICBpZiBpbmZlcnJlZDoKKyAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWRfYm9vbCA9IGluZmVycmVkLmJvb2xfdmFsdWUoKQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZF9ib29sLCBib29sKToKKyAgICAgICAgICAgICAgICBzaW1wbGlmaWVkX3ZhbHVlcy5hcHBlbmQoc3Vibm9kZSkKKyAgICAgICAgICAgIGVsaWYgKG9wZXJhdG9yID09ICJvciIpID09IGluZmVycmVkX2Jvb2w6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtzdWJub2RlXQorCisgICAgICAgIHJldHVybiBzaW1wbGlmaWVkX3ZhbHVlcyBvciBbYXN0cm9pZC5Db25zdChvcGVyYXRvciA9PSAiYW5kIildCisKKyAgICBkZWYgX3NpbXBsaWZ5X2Jvb2xlYW5fb3BlcmF0aW9uKHNlbGYsIGJvb2xfb3ApOgorICAgICAgICAiIiJBdHRlbXB0cyB0byBzaW1wbGlmeSBhIGJvb2xlYW4gb3BlcmF0aW9uCisKKyAgICAgICAgUmVjdXJzaXZlbHkgYXBwbGllcyBzaW1wbGlmaWNhdGlvbiBvbiB0aGUgb3BlcmF0b3IgdGVybXMsCisgICAgICAgIGFuZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHJlZHVjdGlvbnMgaGF2ZSBiZWVuIG1hZGUuIiIiCisgICAgICAgIGNoaWxkcmVuID0gbGlzdChib29sX29wLmdldF9jaGlsZHJlbigpKQorICAgICAgICBpbnRlcm1lZGlhdGUgPSBbCisgICAgICAgICAgICBzZWxmLl9zaW1wbGlmeV9ib29sZWFuX29wZXJhdGlvbihjaGlsZCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIGFzdHJvaWQuQm9vbE9wKQorICAgICAgICAgICAgZWxzZSBjaGlsZAorICAgICAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuCisgICAgICAgIF0KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fYXBwbHlfYm9vbGVhbl9zaW1wbGlmaWNhdGlvbl9ydWxlcyhib29sX29wLm9wLCBpbnRlcm1lZGlhdGUpCisgICAgICAgIGlmIGxlbihyZXN1bHQpIDwgbGVuKGNoaWxkcmVuKToKKyAgICAgICAgICAgIHNlbGYuX2Nhbl9zaW1wbGlmeV9ib29sX29wID0gVHJ1ZQorICAgICAgICBpZiBsZW4ocmVzdWx0KSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFswXQorICAgICAgICBzaW1wbGlmaWVkX2Jvb2xfb3AgPSBjb3B5LmNvcHkoYm9vbF9vcCkKKyAgICAgICAgc2ltcGxpZmllZF9ib29sX29wLnBvc3Rpbml0KHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZpZWRfYm9vbF9vcAorCisgICAgZGVmIF9jaGVja19zaW1wbGlmaWFibGVfY29uZGl0aW9uKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayBpZiBhIGJvb2xlYW4gY29uZGl0aW9uIGNhbiBiZSBzaW1wbGlmaWVkLgorCisgICAgICAgIFZhcmlhYmxlcyB3aWxsIG5vdCBiZSBzaW1wbGlmaWVkLCBldmVuIGluIHRoZSB2YWx1ZSBjYW4gYmUgaW5mZXJyZWQsCisgICAgICAgIGFuZCBleHByZXNzaW9ucyBsaWtlICczICsgNCcgd2lsbCByZW1haW4gZXhwYW5kZWQuIiIiCisgICAgICAgIGlmIG5vdCB1dGlscy5pc190ZXN0X2NvbmRpdGlvbihub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX2Nhbl9zaW1wbGlmeV9ib29sX29wID0gRmFsc2UKKyAgICAgICAgc2ltcGxpZmllZF9leHByID0gc2VsZi5fc2ltcGxpZnlfYm9vbGVhbl9vcGVyYXRpb24obm9kZSkKKworICAgICAgICBpZiBub3Qgc2VsZi5fY2FuX3NpbXBsaWZ5X2Jvb2xfb3A6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgbmV4dChzaW1wbGlmaWVkX2V4cHIubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5OYW1lKSwgRmFsc2UpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50IiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0obm9kZS5hc19zdHJpbmcoKSwgc2ltcGxpZmllZF9leHByLmFzX3N0cmluZygpKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInNpbXBsaWZpYWJsZS1jb25kaXRpb24iLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPShub2RlLmFzX3N0cmluZygpLCBzaW1wbGlmaWVkX2V4cHIuYXNfc3RyaW5nKCkpLAorICAgICAgICAgICAgKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKAorICAgICAgICAiY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlIiwKKyAgICAgICAgImNvbnNpZGVyLXVzaW5nLWluIiwKKyAgICAgICAgImNoYWluZWQtY29tcGFyaXNvbiIsCisgICAgICAgICJzaW1wbGlmaWFibGUtY29uZGl0aW9uIiwKKyAgICAgICAgImNvbmRpdGlvbi1ldmFscy10by1jb25zdGFudCIsCisgICAgKQorICAgIGRlZiB2aXNpdF9ib29sb3Aoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnNpZGVyX21lcmdpbmdfaXNpbnN0YW5jZShub2RlKQorICAgICAgICBzZWxmLl9jaGVja19jb25zaWRlcl91c2luZ19pbihub2RlKQorICAgICAgICBzZWxmLl9jaGVja19jaGFpbmVkX2NvbXBhcmlzb24obm9kZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc2ltcGxpZmlhYmxlX2NvbmRpdGlvbihub2RlKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfc2ltcGxlX2Fzc2lnbm1lbnQobm9kZSk6CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQXNzaWduKQorICAgICAgICAgICAgYW5kIGxlbihub2RlLnRhcmdldHMpID09IDEKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUudGFyZ2V0c1swXSwgYXN0cm9pZC5ub2RlX2NsYXNzZXMuQXNzaWduTmFtZSkKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIGFzdHJvaWQubm9kZV9jbGFzc2VzLk5hbWUpCisgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfc3dhcF92YXJpYWJsZXMoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBub2RlLm5leHRfc2libGluZygpIG9yIG5vdCBub2RlLm5leHRfc2libGluZygpLm5leHRfc2libGluZygpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFzc2lnbm1lbnRzID0gW25vZGUsIG5vZGUubmV4dF9zaWJsaW5nKCksIG5vZGUubmV4dF9zaWJsaW5nKCkubmV4dF9zaWJsaW5nKCldCisgICAgICAgIGlmIG5vdCBhbGwoc2VsZi5faXNfc2ltcGxlX2Fzc2lnbm1lbnQobm9kZSkgZm9yIG5vZGUgaW4gYXNzaWdubWVudHMpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGFueShub2RlIGluIHNlbGYuX3JlcG9ydGVkX3N3YXBfbm9kZXMgZm9yIG5vZGUgaW4gYXNzaWdubWVudHMpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxlZnQgPSBbbm9kZS50YXJnZXRzWzBdLm5hbWUgZm9yIG5vZGUgaW4gYXNzaWdubWVudHNdCisgICAgICAgIHJpZ2h0ID0gW25vZGUudmFsdWUubmFtZSBmb3Igbm9kZSBpbiBhc3NpZ25tZW50c10KKyAgICAgICAgaWYgbGVmdFswXSA9PSByaWdodFstMV0gYW5kIGxlZnRbMTpdID09IHJpZ2h0WzotMV06CisgICAgICAgICAgICBzZWxmLl9yZXBvcnRlZF9zd2FwX25vZGVzLnVwZGF0ZShhc3NpZ25tZW50cykKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiY29uc2lkZXItc3dhcC12YXJpYWJsZXMiCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1lc3NhZ2UsIG5vZGU9bm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgInNpbXBsaWZ5LWJvb2xlYW4tZXhwcmVzc2lvbiIsCisgICAgICAgICJjb25zaWRlci11c2luZy10ZXJuYXJ5IiwKKyAgICAgICAgImNvbnNpZGVyLXN3YXAtdmFyaWFibGVzIiwKKyAgICApCisgICAgZGVmIHZpc2l0X2Fzc2lnbihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfc3dhcF92YXJpYWJsZXMobm9kZSkKKyAgICAgICAgaWYgc2VsZi5faXNfYW5kX29yX3Rlcm5hcnkobm9kZS52YWx1ZSk6CisgICAgICAgICAgICBjb25kLCB0cnV0aF92YWx1ZSwgZmFsc2VfdmFsdWUgPSBzZWxmLl9hbmRfb3JfdGVybmFyeV9hcmd1bWVudHMobm9kZS52YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGFsbCgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuQ29tcGFyZSkgZm9yIHZhbHVlIGluICh0cnV0aF92YWx1ZSwgZmFsc2VfdmFsdWUpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbmZlcnJlZF90cnV0aF92YWx1ZSA9IHV0aWxzLnNhZmVfaW5mZXIodHJ1dGhfdmFsdWUpCisgICAgICAgIGlmIGluZmVycmVkX3RydXRoX3ZhbHVlIGluIChOb25lLCBhc3Ryb2lkLlVuaW5mZXJhYmxlKToKKyAgICAgICAgICAgIHRydXRoX2Jvb2xlYW5fdmFsdWUgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnV0aF9ib29sZWFuX3ZhbHVlID0gdHJ1dGhfdmFsdWUuYm9vbF92YWx1ZSgpCisKKyAgICAgICAgaWYgdHJ1dGhfYm9vbGVhbl92YWx1ZSBpcyBGYWxzZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAic2ltcGxpZnktYm9vbGVhbi1leHByZXNzaW9uIgorICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IGZhbHNlX3ZhbHVlLmFzX3N0cmluZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXNzYWdlID0gImNvbnNpZGVyLXVzaW5nLXRlcm5hcnkiCisgICAgICAgICAgICBzdWdnZXN0aW9uID0gInt0cnV0aH0gaWYge2NvbmR9IGVsc2Uge2ZhbHNlfSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIHRydXRoPXRydXRoX3ZhbHVlLmFzX3N0cmluZygpLAorICAgICAgICAgICAgICAgIGNvbmQ9Y29uZC5hc19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBmYWxzZT1mYWxzZV92YWx1ZS5hc19zdHJpbmcoKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZShtZXNzYWdlLCBub2RlPW5vZGUsIGFyZ3M9KHN1Z2dlc3Rpb24sKSkKKworICAgIHZpc2l0X3JldHVybiA9IHZpc2l0X2Fzc2lnbgorCisgICAgZGVmIF9jaGVja19jb25zaWRlcl91c2luZ193aXRoKHNlbGYsIG5vZGU6IGFzdHJvaWQuQ2FsbCk6CisgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLmZ1bmMpCisgICAgICAgIGlmIG5vdCBpbmZlcnJlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjb3VsZF9iZV91c2VkX2luX3dpdGggPSAoCisgICAgICAgICAgICAjIHRoaW5ncyBsaWtlIGBgbG9jay5hY3F1aXJlKClgYAorICAgICAgICAgICAgaW5mZXJyZWQucW5hbWUoKSBpbiBDQUxMU19USEFUX0NPVUxEX0JFX1JFUExBQ0VEX0JZX1dJVEgKKyAgICAgICAgICAgIG9yICgKKyAgICAgICAgICAgICAgICAjIHRoaW5ncyBsaWtlIGBgb3BlbigiZm9vIilgYCB3aGljaCBhcmUgbm90IGFscmVhZHkgaW5zaWRlIGEgYGB3aXRoYGAgc3RhdGVtZW50CisgICAgICAgICAgICAgICAgaW5mZXJyZWQucW5hbWUoKSBpbiBDQUxMU19SRVRVUk5JTkdfQ09OVEVYVF9NQU5BR0VSUworICAgICAgICAgICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5XaXRoKQorICAgICAgICAgICAgKQorICAgICAgICApCisgICAgICAgIGlmIGNvdWxkX2JlX3VzZWRfaW5fd2l0aCBhbmQgbm90IF9pc19pbnNpZGVfY29udGV4dF9tYW5hZ2VyKG5vZGUpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29uc2lkZXItdXNpbmctd2l0aCIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfY29uc2lkZXJfdXNpbmdfam9pbihzZWxmLCBhdWdfYXNzaWduKToKKyAgICAgICAgIiIiCisgICAgICAgIFdlIHN0YXJ0IHdpdGggdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGFuZCB3b3JrIG91ciB3YXkgdXB3YXJkcy4KKyAgICAgICAgTmFtZXMgb2YgdmFyaWFibGVzIGZvciBub2RlcyBpZiBtYXRjaCBzdWNjZXNzZnVsOgorICAgICAgICByZXN1bHQgPSAnJyAgIyBhc3NpZ24KKyAgICAgICAgZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ10gICMgZm9yX2xvb3AKKyAgICAgICAgICAgIHJlc3VsdCArPSBudW1iZXIgICMgYXVnX2Fzc2lnbgorICAgICAgICAiIiIKKyAgICAgICAgZm9yX2xvb3AgPSBhdWdfYXNzaWduLnBhcmVudAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmb3JfbG9vcCwgYXN0cm9pZC5Gb3IpIG9yIGxlbihmb3JfbG9vcC5ib2R5KSA+IDE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYXNzaWduID0gZm9yX2xvb3AucHJldmlvdXNfc2libGluZygpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGFzc2lnbiwgYXN0cm9pZC5Bc3NpZ24pOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlc3VsdF9hc3NpZ25fbmFtZXMgPSB7CisgICAgICAgICAgICB0YXJnZXQubmFtZQorICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBhc3NpZ24udGFyZ2V0cworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0YXJnZXQsIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgfQorCisgICAgICAgIGlzX2NvbmNhdF9sb29wID0gKAorICAgICAgICAgICAgYXVnX2Fzc2lnbi5vcCA9PSAiKz0iCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShhdWdfYXNzaWduLnRhcmdldCwgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgYW5kIGxlbihmb3JfbG9vcC5ib2R5KSA9PSAxCisgICAgICAgICAgICBhbmQgYXVnX2Fzc2lnbi50YXJnZXQubmFtZSBpbiByZXN1bHRfYXNzaWduX25hbWVzCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShhc3NpZ24udmFsdWUsIGFzdHJvaWQuQ29uc3QpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShhc3NpZ24udmFsdWUudmFsdWUsIHN0cikKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGF1Z19hc3NpZ24udmFsdWUsIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgIGFuZCBhdWdfYXNzaWduLnZhbHVlLm5hbWUgPT0gZm9yX2xvb3AudGFyZ2V0Lm5hbWUKKyAgICAgICAgKQorICAgICAgICBpZiBpc19jb25jYXRfbG9vcDoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImNvbnNpZGVyLXVzaW5nLWpvaW4iLCBub2RlPWF1Z19hc3NpZ24pCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImNvbnNpZGVyLXVzaW5nLWpvaW4iKQorICAgIGRlZiB2aXNpdF9hdWdhc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnNpZGVyX3VzaW5nX2pvaW4obm9kZSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygidW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbiIsICJ1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cCIpCisgICAgZGVmIHZpc2l0X2NvbXByZWhlbnNpb24oc2VsZiwgbm9kZTogYXN0cm9pZC5Db21wcmVoZW5zaW9uKSAtPiBOb25lOgorICAgICAgICBzZWxmLl9jaGVja191bm5lY2Vzc2FyeV9jb21wcmVoZW5zaW9uKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX3VubmVjZXNzYXJ5X2RpY3RfaW5kZXhfbG9va3VwKG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3VubmVjZXNzYXJ5X2NvbXByZWhlbnNpb24oc2VsZiwgbm9kZTogYXN0cm9pZC5Db21wcmVoZW5zaW9uKSAtPiBOb25lOgorICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkdlbmVyYXRvckV4cCkKKyAgICAgICAgICAgIG9yIGxlbihub2RlLmlmcykgIT0gMAorICAgICAgICAgICAgb3IgbGVuKG5vZGUucGFyZW50LmdlbmVyYXRvcnMpICE9IDEKKyAgICAgICAgICAgIG9yIG5vZGUuaXNfYXN5bmMKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuRGljdENvbXApCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLnBhcmVudC5rZXksIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUucGFyZW50LnZhbHVlLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLnRhcmdldCwgYXN0cm9pZC5UdXBsZSkKKyAgICAgICAgICAgIGFuZCBhbGwoaXNpbnN0YW5jZShlbHQsIGFzdHJvaWQuQXNzaWduTmFtZSkgZm9yIGVsdCBpbiBub2RlLnRhcmdldC5lbHRzKQorICAgICAgICApOgorICAgICAgICAgICAgZXhwcl9saXN0ID0gW25vZGUucGFyZW50LmtleS5uYW1lLCBub2RlLnBhcmVudC52YWx1ZS5uYW1lXQorICAgICAgICAgICAgdGFyZ2V0X2xpc3QgPSBbZWx0Lm5hbWUgZm9yIGVsdCBpbiBub2RlLnRhcmdldC5lbHRzXQorCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgKGFzdHJvaWQuTGlzdENvbXAsIGFzdHJvaWQuU2V0Q29tcCkpOgorICAgICAgICAgICAgZXhwciA9IG5vZGUucGFyZW50LmVsdAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHByLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgICAgIGV4cHJfbGlzdCA9IGV4cHIubmFtZQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGV4cHIsIGFzdHJvaWQuVHVwbGUpOgorICAgICAgICAgICAgICAgIGlmIGFueShub3QgaXNpbnN0YW5jZShlbHQsIGFzdHJvaWQuTmFtZSkgZm9yIGVsdCBpbiBleHByLmVsdHMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBleHByX2xpc3QgPSBbZWx0Lm5hbWUgZm9yIGVsdCBpbiBleHByLmVsdHNdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cHJfbGlzdCA9IFtdCisgICAgICAgICAgICB0YXJnZXQgPSBub2RlLnBhcmVudC5nZW5lcmF0b3JzWzBdLnRhcmdldAorICAgICAgICAgICAgdGFyZ2V0X2xpc3QgPSAoCisgICAgICAgICAgICAgICAgdGFyZ2V0Lm5hbWUKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhcmdldCwgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgICAgIGVsc2UgKAorICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBlbHQubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVsdCBpbiB0YXJnZXQuZWx0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbHQsIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhcmdldCwgYXN0cm9pZC5UdXBsZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBbXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBleHByX2xpc3QgPT0gdGFyZ2V0X2xpc3QgIT0gW106CisgICAgICAgICAgICBhcmdzOiBPcHRpb25hbFtUdXBsZVtzdHJdXSA9IE5vbmUKKyAgICAgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLml0ZXIpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkRpY3RDb21wKSBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBpbmZlcnJlZCwgYXN0cm9pZC5vYmplY3RzLkRpY3RJdGVtcworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBhcmdzID0gKGYie25vZGUuaXRlci5mdW5jLmV4cHIuYXNfc3RyaW5nKCl9IiwpCisgICAgICAgICAgICBlbGlmICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkxpc3RDb21wKQorICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkxpc3QpCisgICAgICAgICAgICApIG9yICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLlNldENvbXApCisgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuU2V0KQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBhcmdzID0gKGYie25vZGUuaXRlci5hc19zdHJpbmcoKX0iLCkKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbiIsIG5vZGU9bm9kZSwgYXJncz1hcmdzKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkRpY3RDb21wKToKKyAgICAgICAgICAgICAgICBmdW5jID0gImRpY3QiCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuTGlzdENvbXApOgorICAgICAgICAgICAgICAgIGZ1bmMgPSAibGlzdCIKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5TZXRDb21wKToKKyAgICAgICAgICAgICAgICBmdW5jID0gInNldCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInVubmVjZXNzYXJ5LWNvbXByZWhlbnNpb24iLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPShmIntmdW5jfSh7bm9kZS5pdGVyLmFzX3N0cmluZygpfSkiLCksCisgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9pc19hbmRfb3JfdGVybmFyeShub2RlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzICdjb25kaXRpb24gYW5kIHRydWVfdmFsdWUgb3IgZmFsc2VfdmFsdWUnIGZvcm0uCisKKyAgICAgICAgQWxsIG9mOiBjb25kaXRpb24sIHRydWVfdmFsdWUgYW5kIGZhbHNlX3ZhbHVlIHNob3VsZCBub3QgYmUgYSBjb21wbGV4IGJvb2xlYW4gZXhwcmVzc2lvbgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Cb29sT3ApCisgICAgICAgICAgICBhbmQgbm9kZS5vcCA9PSAib3IiCisgICAgICAgICAgICBhbmQgbGVuKG5vZGUudmFsdWVzKSA9PSAyCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLnZhbHVlc1swXSwgYXN0cm9pZC5Cb29sT3ApCisgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uobm9kZS52YWx1ZXNbMV0sIGFzdHJvaWQuQm9vbE9wKQorICAgICAgICAgICAgYW5kIG5vZGUudmFsdWVzWzBdLm9wID09ICJhbmQiCisgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uobm9kZS52YWx1ZXNbMF0udmFsdWVzWzFdLCBhc3Ryb2lkLkJvb2xPcCkKKyAgICAgICAgICAgIGFuZCBsZW4obm9kZS52YWx1ZXNbMF0udmFsdWVzKSA9PSAyCisgICAgICAgICkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2FuZF9vcl90ZXJuYXJ5X2FyZ3VtZW50cyhub2RlKToKKyAgICAgICAgZmFsc2VfdmFsdWUgPSBub2RlLnZhbHVlc1sxXQorICAgICAgICBjb25kaXRpb24sIHRydWVfdmFsdWUgPSBub2RlLnZhbHVlc1swXS52YWx1ZXMKKyAgICAgICAgcmV0dXJuIGNvbmRpdGlvbiwgdHJ1ZV92YWx1ZSwgZmFsc2VfdmFsdWUKKworICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fcmV0dXJuX25vZGVzW25vZGUubmFtZV0gPSBsaXN0KAorICAgICAgICAgICAgbm9kZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLlJldHVybiwgc2tpcF9rbGFzcz1hc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX2NvbnNpc3RlbnRfcmV0dXJucyhzZWxmLCBub2RlOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSAtPiBOb25lOgorICAgICAgICAiIiJDaGVjayB0aGF0IGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbnNpZGUgYSBmdW5jdGlvbiBhcmUgY29uc2lzdGVudC4KKworICAgICAgICBSZXR1cm4gc3RhdGVtZW50cyBhcmUgY29uc2lzdGVudCBpZjoKKyAgICAgICAgICAgIC0gYWxsIHJldHVybnMgYXJlIGV4cGxpY2l0IGFuZCBpZiB0aGVyZSBpcyBubyBpbXBsaWNpdCByZXR1cm47CisgICAgICAgICAgICAtIGFsbCByZXR1cm5zIGFyZSBlbXB0eSBhbmQgaWYgdGhlcmUgaXMsIHBvc3NpYmx5LCBhbiBpbXBsaWNpdCByZXR1cm4uCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIG5vZGUgKGFzdHJvaWQuRnVuY3Rpb25EZWYpOiB0aGUgZnVuY3Rpb24gaG9sZGluZyB0aGUgcmV0dXJuIHN0YXRlbWVudHMuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgZXhwbGljaXQgcmV0dXJuIHN0YXRlbWVudHMgYXJlIHRob3NlIHdpdGggYSBub3QgTm9uZSB2YWx1ZQorICAgICAgICBleHBsaWNpdF9yZXR1cm5zID0gWworICAgICAgICAgICAgX25vZGUgZm9yIF9ub2RlIGluIHNlbGYuX3JldHVybl9ub2Rlc1tub2RlLm5hbWVdIGlmIF9ub2RlLnZhbHVlIGlzIG5vdCBOb25lCisgICAgICAgIF0KKyAgICAgICAgaWYgbm90IGV4cGxpY2l0X3JldHVybnM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbGVuKGV4cGxpY2l0X3JldHVybnMpID09IGxlbigKKyAgICAgICAgICAgIHNlbGYuX3JldHVybl9ub2Rlc1tub2RlLm5hbWVdCisgICAgICAgICkgYW5kIHNlbGYuX2lzX25vZGVfcmV0dXJuX2VuZGVkKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImluY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50cyIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfaXNfaWZfbm9kZV9yZXR1cm5fZW5kZWQoc2VsZiwgbm9kZTogYXN0cm9pZC5JZikgLT4gYm9vbDoKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIElmIG5vZGUgZW5kcyB3aXRoIGFuIGV4cGxpY2l0IHJldHVybiBzdGF0ZW1lbnQuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIG5vZGUgKGFzdHJvaWQuSWYpOiBJZiBub2RlIHRvIGJlIGNoZWNrZWQuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGJvb2w6IFRydWUgaWYgdGhlIG5vZGUgZW5kcyB3aXRoIGFuIGV4cGxpY2l0IHN0YXRlbWVudCwgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBEbyBub3QgY2hlY2sgaWYgaW5uZXIgZnVuY3Rpb24gZGVmaW5pdGlvbiBhcmUgcmV0dXJuIGVuZGVkLgorICAgICAgICBpc19pZl9yZXR1cm5pbmcgPSBhbnkoCisgICAgICAgICAgICBzZWxmLl9pc19ub2RlX3JldHVybl9lbmRlZChfaWZuKQorICAgICAgICAgICAgZm9yIF9pZm4gaW4gbm9kZS5ib2R5CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShfaWZuLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICApCisgICAgICAgIGlmIG5vdCBub2RlLm9yZWxzZToKKyAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm90IG9yZWxzZSBwYXJ0IHRoZW4gdGhlIGlmIHN0YXRlbWVudCBpcyByZXR1cm5pbmcgaWYgOgorICAgICAgICAgICAgIyAtIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZXR1cm4gc3RhdGVtZW50IGluIGl0cyBzaWJsaW5nczsKKyAgICAgICAgICAgICMgLSB0aGUgaWYgYm9keSBpcyBpdHNlbGYgcmV0dXJuaW5nLgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19yZXR1cm5faW5fc2libGluZ3Mobm9kZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gaXNfaWZfcmV0dXJuaW5nCisgICAgICAgICMgSWYgdGhlcmUgaXMgYW4gb3JlbHNlIHBhcnQgdGhlbiBib3RoIGlmIGJvZHkgYW5kIG9yZWxzZSBwYXJ0IHNob3VsZCByZXR1cm4uCisgICAgICAgIGlzX29yZWxzZV9yZXR1cm5pbmcgPSBhbnkoCisgICAgICAgICAgICBzZWxmLl9pc19ub2RlX3JldHVybl9lbmRlZChfb3JlKQorICAgICAgICAgICAgZm9yIF9vcmUgaW4gbm9kZS5vcmVsc2UKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKF9vcmUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGlzX2lmX3JldHVybmluZyBhbmQgaXNfb3JlbHNlX3JldHVybmluZworCisgICAgZGVmIF9pc19yYWlzZV9ub2RlX3JldHVybl9lbmRlZChzZWxmLCBub2RlOiBhc3Ryb2lkLlJhaXNlKSAtPiBib29sOgorICAgICAgICAiIiJDaGVjayBpZiB0aGUgUmFpc2Ugbm9kZSBlbmRzIHdpdGggYW4gZXhwbGljaXQgcmV0dXJuIHN0YXRlbWVudC4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgbm9kZSAoYXN0cm9pZC5SYWlzZSk6IFJhaXNlIG5vZGUgdG8gYmUgY2hlY2tlZC4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgYm9vbDogVHJ1ZSBpZiB0aGUgbm9kZSBlbmRzIHdpdGggYW4gZXhwbGljaXQgc3RhdGVtZW50LCBGYWxzZSBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICAjIGEgUmFpc2Ugc3RhdGVtZW50IGRvZXNuJ3QgbmVlZCB0byBlbmQgd2l0aCBhIHJldHVybiBzdGF0ZW1lbnQKKyAgICAgICAgIyBidXQgaWYgdGhlIGV4Y2VwdGlvbiByYWlzZWQgaXMgaGFuZGxlZCwgdGhlbiB0aGUgaGFuZGxlciBoYXMgdG8KKyAgICAgICAgIyBlbmRzIHdpdGggYSByZXR1cm4gc3RhdGVtZW50CisgICAgICAgIGlmIG5vdCBub2RlLmV4YzoKKyAgICAgICAgICAgICMgSWdub3JlIGJhcmUgcmFpc2VzCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBub3QgdXRpbHMuaXNfbm9kZV9pbnNpZGVfdHJ5X2V4Y2VwdChub2RlKToKKyAgICAgICAgICAgICMgSWYgdGhlIHJhaXNlIHN0YXRlbWVudCBpcyBub3QgaW5zaWRlIGEgdHJ5L2V4Y2VwdCBzdGF0ZW1lbnQKKyAgICAgICAgICAgICMgdGhlbiB0aGUgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgY2Fubm90IGJlIGNhdWdodC4gTm8gbmVlZAorICAgICAgICAgICAgIyB0byBpbmZlciBpdC4KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4YyA9IHV0aWxzLnNhZmVfaW5mZXIobm9kZS5leGMpCisgICAgICAgIGlmIGV4YyBpcyBOb25lIG9yIGV4YyBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlIG9yIG5vdCBoYXNhdHRyKGV4YywgInB5dHlwZSIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y19uYW1lID0gZXhjLnB5dHlwZSgpLnNwbGl0KCIuIilbLTFdCisgICAgICAgIGhhbmRsZXJzID0gdXRpbHMuZ2V0X2V4Y2VwdGlvbl9oYW5kbGVycyhub2RlLCBleGNfbmFtZSkKKyAgICAgICAgaGFuZGxlcnMgPSBsaXN0KGhhbmRsZXJzKSBpZiBoYW5kbGVycyBpcyBub3QgTm9uZSBlbHNlIFtdCisgICAgICAgIGlmIGhhbmRsZXJzOgorICAgICAgICAgICAgIyBhbW9uZyBhbGwgdGhlIGhhbmRsZXJzIGhhbmRsaW5nIHRoZSBleGNlcHRpb24gYXQgbGVhc3Qgb25lCisgICAgICAgICAgICAjIG11c3QgZW5kIHdpdGggYSByZXR1cm4gc3RhdGVtZW50CisgICAgICAgICAgICByZXR1cm4gYW55KHNlbGYuX2lzX25vZGVfcmV0dXJuX2VuZGVkKF9oYW5kbGVyKSBmb3IgX2hhbmRsZXIgaW4gaGFuZGxlcnMpCisgICAgICAgICMgaWYgbm8gaGFuZGxlcnMgaGFuZGxlIHRoZSBleGNlcHRpb24gdGhlbiBpdCdzIG9rCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX2lzX25vZGVfcmV0dXJuX2VuZGVkKHNlbGYsIG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIG5vZGUgZW5kcyB3aXRoIGFuIGV4cGxpY2l0IHJldHVybiBzdGF0ZW1lbnQuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIG5vZGUgKGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORyk6IG5vZGUgdG8gYmUgY2hlY2tlZC4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgYm9vbDogVHJ1ZSBpZiB0aGUgbm9kZSBlbmRzIHdpdGggYW4gZXhwbGljaXQgc3RhdGVtZW50LCBGYWxzZSBvdGhlcndpc2UuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgUmVjdXJzaW9uIGJhc2UgY2FzZQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuUmV0dXJuKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5DYWxsKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmdW5jZGVmX25vZGUgPSBub2RlLmZ1bmMuaW5mZXJyZWQoKVswXQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2Z1bmN0aW9uX2RlZl9uZXZlcl9yZXR1cm5pbmcoZnVuY2RlZl9ub2RlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBBdm9pZCB0aGUgY2hlY2sgaW5zaWRlIHdoaWxlIGxvb3AgYXMgd2UgZG9uJ3Qga25vdworICAgICAgICAjIGlmIHRoZXkgd2lsbCBiZSBjb21wbGV0ZWQKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLldoaWxlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5SYWlzZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faXNfcmFpc2Vfbm9kZV9yZXR1cm5fZW5kZWQobm9kZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLklmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pc19pZl9ub2RlX3JldHVybl9lbmRlZChub2RlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuVHJ5RXhjZXB0KToKKyAgICAgICAgICAgIGhhbmRsZXJzID0geworICAgICAgICAgICAgICAgIF9jaGlsZAorICAgICAgICAgICAgICAgIGZvciBfY2hpbGQgaW4gbm9kZS5nZXRfY2hpbGRyZW4oKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX2NoaWxkLCBhc3Ryb2lkLkV4Y2VwdEhhbmRsZXIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGxfYnV0X2hhbmRsZXIgPSBzZXQobm9kZS5nZXRfY2hpbGRyZW4oKSkgLSBoYW5kbGVycworICAgICAgICAgICAgcmV0dXJuIGFueSgKKyAgICAgICAgICAgICAgICBzZWxmLl9pc19ub2RlX3JldHVybl9lbmRlZChfY2hpbGQpIGZvciBfY2hpbGQgaW4gYWxsX2J1dF9oYW5kbGVyCisgICAgICAgICAgICApIGFuZCBhbGwoc2VsZi5faXNfbm9kZV9yZXR1cm5fZW5kZWQoX2NoaWxkKSBmb3IgX2NoaWxkIGluIGhhbmRsZXJzKQorICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQXNzZXJ0KQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS50ZXN0LCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgYW5kIG5vdCBub2RlLnRlc3QudmFsdWUKKyAgICAgICAgKToKKyAgICAgICAgICAgICMgY29uc2lkZXIgYXNzZXJ0IEZhbHNlIGFzIGEgcmV0dXJuIG5vZGUKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgcmVjdXJzZXMgb24gdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCisgICAgICAgIHJldHVybiBhbnkoc2VsZi5faXNfbm9kZV9yZXR1cm5fZW5kZWQoX2NoaWxkKSBmb3IgX2NoaWxkIGluIG5vZGUuZ2V0X2NoaWxkcmVuKCkpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9oYXNfcmV0dXJuX2luX3NpYmxpbmdzKG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgVHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcmV0dXJuIGluIHRoZSBub2RlJ3Mgc2libGluZ3MKKyAgICAgICAgIiIiCisgICAgICAgIG5leHRfc2libGluZyA9IG5vZGUubmV4dF9zaWJsaW5nKCkKKyAgICAgICAgd2hpbGUgbmV4dF9zaWJsaW5nOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXh0X3NpYmxpbmcsIGFzdHJvaWQuUmV0dXJuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgbmV4dF9zaWJsaW5nID0gbmV4dF9zaWJsaW5nLm5leHRfc2libGluZygpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9pc19mdW5jdGlvbl9kZWZfbmV2ZXJfcmV0dXJuaW5nKHNlbGYsIG5vZGU6IGFzdHJvaWQuRnVuY3Rpb25EZWYpIC0+IGJvb2w6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBmdW5jdGlvbiBuZXZlciByZXR1cm5zLiBGYWxzZSBvdGhlcndpc2UuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIG5vZGUgKGFzdHJvaWQuRnVuY3Rpb25EZWYpOiBmdW5jdGlvbiBkZWZpbml0aW9uIG5vZGUgdG8gYmUgYW5hbHl6ZWQuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIGJvb2w6IFRydWUgaWYgdGhlIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5GdW5jdGlvbkRlZikgYW5kIG5vZGUucmV0dXJuczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnJldHVybnMsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgICAgIGFuZCBub2RlLnJldHVybnMuYXR0cm5hbWUgPT0gIk5vUmV0dXJuIgorICAgICAgICAgICAgICAgIG9yIGlzaW5zdGFuY2Uobm9kZS5yZXR1cm5zLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICAgICAgYW5kIG5vZGUucmV0dXJucy5uYW1lID09ICJOb1JldHVybiIKKyAgICAgICAgICAgICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIG5vZGUucW5hbWUoKSBpbiBzZWxmLl9uZXZlcl9yZXR1cm5pbmdfZnVuY3Rpb25zCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfY2hlY2tfcmV0dXJuX2F0X3RoZV9lbmQoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIGZvciBwcmVzZW5jZSBvZiBhICpzaW5nbGUqIHJldHVybiBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiBhCisgICAgICAgIGZ1bmN0aW9uLiAicmV0dXJuIiBvciAicmV0dXJuIE5vbmUiIGFyZSB1c2VsZXNzIGJlY2F1c2UgTm9uZSBpcyB0aGUKKyAgICAgICAgZGVmYXVsdCByZXR1cm4gdHlwZSBpZiB0aGV5IGFyZSBtaXNzaW5nLgorCisgICAgICAgIE5PVEU6IHByb2R1Y2VzIGEgbWVzc2FnZSBvbmx5IGlmIHRoZXJlIGlzIGEgc2luZ2xlIHJldHVybiBzdGF0ZW1lbnQKKyAgICAgICAgaW4gdGhlIGZ1bmN0aW9uIGJvZHkuIE90aGVyd2lzZSBfY2hlY2tfY29uc2lzdGVudF9yZXR1cm5zKCkgaXMgY2FsbGVkIQorICAgICAgICBQZXIgaXRzIGltcGxlbWVudGF0aW9uIGFuZCBQRVA4IHdlIGNhbiBoYXZlIGEgInJldHVybiBOb25lIiBhdCB0aGUgZW5kCisgICAgICAgIG9mIHRoZSBmdW5jdGlvbiBib2R5IGlmIHRoZXJlIGFyZSBvdGhlciByZXR1cm4gc3RhdGVtZW50cyBiZWZvcmUgdGhhdCEKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihzZWxmLl9yZXR1cm5fbm9kZXNbbm9kZS5uYW1lXSkgPiAxOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGxlbihub2RlLmJvZHkpIDw9IDE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBsYXN0ID0gbm9kZS5ib2R5Wy0xXQorICAgICAgICBpZiBpc2luc3RhbmNlKGxhc3QsIGFzdHJvaWQuUmV0dXJuKToKKyAgICAgICAgICAgICMgZS5nLiAicmV0dXJuIgorICAgICAgICAgICAgaWYgbGFzdC52YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVzZWxlc3MtcmV0dXJuIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgIyByZXR1cm4gTm9uZSIKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShsYXN0LnZhbHVlLCBhc3Ryb2lkLkNvbnN0KSBhbmQgKGxhc3QudmFsdWUudmFsdWUgaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidXNlbGVzcy1yZXR1cm4iLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX3VubmVjZXNzYXJ5X2RpY3RfaW5kZXhfbG9va3VwKAorICAgICAgICBzZWxmLCBub2RlOiBVbmlvblthc3Ryb2lkLkZvciwgYXN0cm9pZC5Db21wcmVoZW5zaW9uXQorICAgICkgLT4gTm9uZToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2Ugd2hlbiBhY2Nlc3NpbmcgZGljdCB2YWx1ZXMgYnkgaW5kZXggbG9va3VwLiIiIgorICAgICAgICAjIFZlcmlmeSB0aGF0IHdlIGhhdmUgYSAuaXRlbXMoKSBjYWxsIGFuZAorICAgICAgICAjIHRoYXQgdGhlIG9iamVjdCB3aGljaCBpcyBpdGVyYXRlZCBpcyB1c2VkIGFzIGEgc3Vic2NyaXB0IGluIHRoZQorICAgICAgICAjIGJvZHkgb2YgdGhlIGZvci4KKyAgICAgICAgIyBJcyBpdCBhIHByb3BlciBpdGVtcyBjYWxsPworICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUuaXRlciwgYXN0cm9pZC5DYWxsKQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5pdGVyLmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgYW5kIG5vZGUuaXRlci5mdW5jLmF0dHJuYW1lID09ICJpdGVtcyIKKyAgICAgICAgKToKKyAgICAgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLml0ZXIuZnVuYykKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkJvdW5kTWV0aG9kKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGl0ZXJhdGluZ19vYmplY3RfbmFtZSA9IG5vZGUuaXRlci5mdW5jLmV4cHIuYXNfc3RyaW5nKCkKKworICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgYm9keSBvZiB0aGUgZm9yIGxvb3AgdXNlcyBhIHN1YnNjcmlwdAorICAgICAgICAgICAgIyB3aXRoIHRoZSBvYmplY3QgdGhhdCB3YXMgaXRlcmF0ZWQuIFRoaXMgdXNlcyBzb21lIGhldXJpc3RpY3MKKyAgICAgICAgICAgICMgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNhbWUgb2JqZWN0IGlzIHVzZWQgaW4gdGhlCisgICAgICAgICAgICAjIGZvciBib2R5LgorCisgICAgICAgICAgICBjaGlsZHJlbiA9ICgKKyAgICAgICAgICAgICAgICBub2RlLmJvZHkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuRm9yKQorICAgICAgICAgICAgICAgIGVsc2Ugbm9kZS5wYXJlbnQuZ2V0X2NoaWxkcmVuKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICBmb3Igc3Vic2NyaXB0IGluIGNoaWxkLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuU3Vic2NyaXB0KToKKyAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0ID0gY2FzdChhc3Ryb2lkLlN1YnNjcmlwdCwgc3Vic2NyaXB0KQorCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0LnZhbHVlLCAoYXN0cm9pZC5OYW1lLCBhc3Ryb2lkLkF0dHJpYnV0ZSkKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdWJzY3JpcHQuc2xpY2UKKworICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuRm9yKSBhbmQgKAorICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShzdWJzY3JpcHQucGFyZW50LCBhc3Ryb2lkLkFzc2lnbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzdWJzY3JpcHQgaW4gc3Vic2NyaXB0LnBhcmVudC50YXJnZXRzCisgICAgICAgICAgICAgICAgICAgICAgICBvciBpc2luc3RhbmNlKHN1YnNjcmlwdC5wYXJlbnQsIGFzdHJvaWQuQXVnQXNzaWduKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN1YnNjcmlwdCA9PSBzdWJzY3JpcHQucGFyZW50LnRhcmdldAorICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgdGhpcyBzdWJzY3JpcHQgaWYgaXQgaXMgdGhlIHRhcmdldCBvZiBhbiBhc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgICMgQ2FzZSB3aGVyZSAuaXRlbXMgaXMgYXNzaWduZWQgdG8gayx2IChpLmUuLCBmb3IgaywgdiBpbiBkLml0ZW1zKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2Uobm9kZS50YXJnZXQsIGFzdHJvaWQuVHVwbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdmFsdWUubmFtZSAhPSBub2RlLnRhcmdldC5lbHRzWzBdLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpdGVyYXRpbmdfb2JqZWN0X25hbWUgIT0gc3Vic2NyaXB0LnZhbHVlLmFzX3N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuRm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2YWx1ZS5sb29rdXAodmFsdWUubmFtZSlbMV1bLTFdLmxpbmVubyA+IG5vZGUubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIHRoaXMgc3Vic2NyaXB0IGlmIGl0IGhhcyBiZWVuIHJlZGVmaW5lZCBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZvciBsb29wLiBUaGlzIGNoZWNrcyBmb3IgdGhlIGxpbmUgbnVtYmVyIHVzaW5nIC5sb29rdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gZ2V0IHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgaXRlcmF0aW5nIG9iamVjdCB3YXMgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmaW5lZCBhbmQgY29tcGFyZSB0aGF0IHRvIHRoZSBmb3IgbG9vcCdzIGxpbmUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9c3Vic2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KG5vZGUudGFyZ2V0LmVsdHNbMV0uYXNfc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICAgICAgICAgICMgQ2FzZSB3aGVyZSAuaXRlbXMgaXMgYXNzaWduZWQgdG8gc2luZ2xlIHZhciAoaS5lLiwgZm9yIGl0ZW0gaW4gZC5pdGVtcygpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuU3Vic2NyaXB0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaXNpbnN0YW5jZShub2RlLnRhcmdldCwgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5vZGUudGFyZ2V0Lm5hbWUgIT0gdmFsdWUudmFsdWUubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGl0ZXJhdGluZ19vYmplY3RfbmFtZSAhPSBzdWJzY3JpcHQudmFsdWUuYXNfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Gb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlLnZhbHVlLmxvb2t1cCh2YWx1ZS52YWx1ZS5uYW1lKVsxXVstMV0ubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBub2RlLmxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSB0aGlzIHN1YnNjcmlwdCBpZiBpdCBoYXMgYmVlbiByZWRlZmluZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmb3IgbG9vcC4gVGhpcyBjaGVja3MgZm9yIHRoZSBsaW5lIG51bWJlciB1c2luZyAubG9va3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRvIGdldCB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGl0ZXJhdGluZyBvYmplY3Qgd2FzIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmluZWQgYW5kIGNvbXBhcmUgdGhhdCB0byB0aGUgZm9yIGxvb3AncyBsaW5lIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgc3Vic2NyaXB0ZWQgYnkgMCAoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKHZhbHVlLnNsaWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGluZmVycmVkLnZhbHVlICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlPXN1YnNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSgiMSIuam9pbih2YWx1ZS5hc19zdHJpbmcoKS5yc3BsaXQoIjAiLCBtYXhzcGxpdD0xKSksKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy9zaW1pbGFyLnB5IGIvcHlsaW50L2NoZWNrZXJzL3NpbWlsYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4YWJkMQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9zaW1pbGFyLnB5CkBAIC0wLDAgKzEsNTQ0IEBACisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOC0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIFJ5NGFuIEJyYXNlIDxyeTRhbi1oZ0ByeTRhbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxMiBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEFudGhvbnkgVkVSRVogPGFudGhvbnkudmVyZXouZXh0ZXJuYWxAY2Fzc2lkaWFuLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxNyBNaWtoYWlsIEZlc2Vua28gPHByb2dnZ2FAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU2NvdHQgV29ybGV5IDxzY290dHdvcmxleUBzY290dHdvcmxleS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSwgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgVGFld29uIEQuIEtpbSA8a2ltdDMzQG1jbWFzdGVyLmNhPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRnJhbmsgSGFycmlzb24gPGZyYW5rQGRvdWJsZXRoZWZpc2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRWxpIEZpbmUgPGVqZmluZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBTaGl2IFZlbmthdGFzdWJyYWhtYW55YW0gPHNodmVua2F0QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIGJvdCA8Ym90QG5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEFkaXR5YSBHdXB0YSA8YWRpdHlhZ3VwdGExMDg5QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtYnVpbHRpbgorIiIiYSBzaW1pbGFyaXRpZXMgLyBjb2RlIGR1cGxpY2F0aW9uIGNvbW1hbmQgbGluZSB0b29sIGFuZCBweWxpbnQgY2hlY2tlcgorIiIiCitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0Citmcm9tIGdldG9wdCBpbXBvcnQgZ2V0b3B0Citmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIGdyb3VwYnkKK2Zyb20gdHlwaW5nIGltcG9ydCBMaXN0CisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlciwgTWFwUmVkdWNlTWl4aW4sIHRhYmxlX2xpbmVzX2Zyb21fc3RhdHMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElSYXdDaGVja2VyCitmcm9tIHB5bGludC5yZXBvcnRlcnMudXJlcG9ydHMubm9kZXMgaW1wb3J0IFRhYmxlCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgZGVjb2Rpbmdfc3RyZWFtCisKK1JFR0VYX0ZPUl9MSU5FU19XSVRIX0NPTlRFTlQgPSByZS5jb21waWxlKHIiLipcdysiKQorCisKK2NsYXNzIFNpbWlsYXI6CisgICAgIiIiZmluZHMgY29weS1wYXN0ZWQgbGluZXMgb2YgY29kZSBpbiBhIHByb2plY3QiIiIKKworICAgIGRlZiBfX2luaXRfXygKKyAgICAgICAgc2VsZiwKKyAgICAgICAgbWluX2xpbmVzOiBpbnQgPSA0LAorICAgICAgICBpZ25vcmVfY29tbWVudHM6IGJvb2wgPSBGYWxzZSwKKyAgICAgICAgaWdub3JlX2RvY3N0cmluZ3M6IGJvb2wgPSBGYWxzZSwKKyAgICAgICAgaWdub3JlX2ltcG9ydHM6IGJvb2wgPSBGYWxzZSwKKyAgICAgICAgaWdub3JlX3NpZ25hdHVyZXM6IGJvb2wgPSBGYWxzZSwKKyAgICApIC0+IE5vbmU6CisgICAgICAgIHNlbGYubWluX2xpbmVzID0gbWluX2xpbmVzCisgICAgICAgIHNlbGYuaWdub3JlX2NvbW1lbnRzID0gaWdub3JlX2NvbW1lbnRzCisgICAgICAgIHNlbGYuaWdub3JlX2RvY3N0cmluZ3MgPSBpZ25vcmVfZG9jc3RyaW5ncworICAgICAgICBzZWxmLmlnbm9yZV9pbXBvcnRzID0gaWdub3JlX2ltcG9ydHMKKyAgICAgICAgc2VsZi5pZ25vcmVfc2lnbmF0dXJlcyA9IGlnbm9yZV9zaWduYXR1cmVzCisgICAgICAgIHNlbGYubGluZXNldHM6IExpc3RbIkxpbmVTZXQiXSA9IFtdCisKKyAgICBkZWYgYXBwZW5kX3N0cmVhbSgKKyAgICAgICAgc2VsZiwgc3RyZWFtaWQ6IHN0ciwgc3RyZWFtOiBUZXh0SU9XcmFwcGVyLCBlbmNvZGluZz1Ob25lCisgICAgKSAtPiBOb25lOgorICAgICAgICAiIiJhcHBlbmQgYSBmaWxlIHRvIHNlYXJjaCBmb3Igc2ltaWxhcml0aWVzIiIiCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICByZWFkbGluZXMgPSBzdHJlYW0ucmVhZGxpbmVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFkbGluZXMgPSBkZWNvZGluZ19zdHJlYW0oc3RyZWFtLCBlbmNvZGluZykucmVhZGxpbmVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubGluZXNldHMuYXBwZW5kKAorICAgICAgICAgICAgICAgIExpbmVTZXQoCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbWlkLAorICAgICAgICAgICAgICAgICAgICByZWFkbGluZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlX2RvY3N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlX2ltcG9ydHMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlX3NpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIic3RhcnQgbG9va2luZyBmb3Igc2ltaWxhcml0aWVzIGFuZCBkaXNwbGF5IHJlc3VsdHMgb24gc3Rkb3V0IiIiCisgICAgICAgIHNlbGYuX2Rpc3BsYXlfc2ltcyhzZWxmLl9jb21wdXRlX3NpbXMoKSkKKworICAgIGRlZiBfY29tcHV0ZV9zaW1zKHNlbGYpOgorICAgICAgICAiIiJjb21wdXRlIHNpbWlsYXJpdGllcyBpbiBhcHBlbmRlZCBmaWxlcyIiIgorICAgICAgICBub19kdXBsaWNhdGVzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgZm9yIG51bSwgbGluZXNldDEsIGlkeDEsIGxpbmVzZXQyLCBpZHgyIGluIHNlbGYuX2l0ZXJfc2ltcygpOgorICAgICAgICAgICAgZHVwbGljYXRlID0gbm9fZHVwbGljYXRlc1tudW1dCisgICAgICAgICAgICBmb3IgY291cGxlcyBpbiBkdXBsaWNhdGU6CisgICAgICAgICAgICAgICAgaWYgKGxpbmVzZXQxLCBpZHgxKSBpbiBjb3VwbGVzIG9yIChsaW5lc2V0MiwgaWR4MikgaW4gY291cGxlczoKKyAgICAgICAgICAgICAgICAgICAgY291cGxlcy5hZGQoKGxpbmVzZXQxLCBpZHgxKSkKKyAgICAgICAgICAgICAgICAgICAgY291cGxlcy5hZGQoKGxpbmVzZXQyLCBpZHgyKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZHVwbGljYXRlLmFwcGVuZCh7KGxpbmVzZXQxLCBpZHgxKSwgKGxpbmVzZXQyLCBpZHgyKX0pCisgICAgICAgIHNpbXMgPSBbXQorICAgICAgICBmb3IgbnVtLCBlbnNlbWJsZXMgaW4gbm9fZHVwbGljYXRlcy5pdGVtcygpOgorICAgICAgICAgICAgZm9yIGNvdXBsZXMgaW4gZW5zZW1ibGVzOgorICAgICAgICAgICAgICAgIHNpbXMuYXBwZW5kKChudW0sIGNvdXBsZXMpKQorICAgICAgICBzaW1zLnNvcnQoKQorICAgICAgICBzaW1zLnJldmVyc2UoKQorICAgICAgICByZXR1cm4gc2ltcworCisgICAgZGVmIF9kaXNwbGF5X3NpbXMoc2VsZiwgc2ltcyk6CisgICAgICAgICIiImRpc3BsYXkgY29tcHV0ZWQgc2ltaWxhcml0aWVzIG9uIHN0ZG91dCIiIgorICAgICAgICBuYl9saWduZXNfZHVwbGlxdWVlcyA9IDAKKyAgICAgICAgZm9yIG51bSwgY291cGxlcyBpbiBzaW1zOgorICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQobnVtLCAic2ltaWxhciBsaW5lcyBpbiIsIGxlbihjb3VwbGVzKSwgImZpbGVzIikKKyAgICAgICAgICAgIGNvdXBsZXMgPSBzb3J0ZWQoY291cGxlcykKKyAgICAgICAgICAgIGxpbmVzZXQgPSBpZHggPSBOb25lCisgICAgICAgICAgICBmb3IgbGluZXNldCwgaWR4IGluIGNvdXBsZXM6CisgICAgICAgICAgICAgICAgcHJpbnQoZiI9PXtsaW5lc2V0Lm5hbWV9OntpZHh9IikKKyAgICAgICAgICAgIGlmIGxpbmVzZXQ6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXNldC5fcmVhbF9saW5lc1tpZHggOiBpZHggKyBudW1dOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiICAiLCBsaW5lLnJzdHJpcCgpKQorICAgICAgICAgICAgbmJfbGlnbmVzX2R1cGxpcXVlZXMgKz0gbnVtICogKGxlbihjb3VwbGVzKSAtIDEpCisgICAgICAgIG5iX3RvdGFsX2xpZ25lcyA9IHN1bShsZW4obGluZXNldCkgZm9yIGxpbmVzZXQgaW4gc2VsZi5saW5lc2V0cykKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAiVE9UQUwgbGluZXM9JXMgZHVwbGljYXRlcz0lcyBwZXJjZW50PSUuMmYiCisgICAgICAgICAgICAlICgKKyAgICAgICAgICAgICAgICBuYl90b3RhbF9saWduZXMsCisgICAgICAgICAgICAgICAgbmJfbGlnbmVzX2R1cGxpcXVlZXMsCisgICAgICAgICAgICAgICAgbmJfbGlnbmVzX2R1cGxpcXVlZXMgKiAxMDAuMCAvIG5iX3RvdGFsX2xpZ25lcywKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorCisgICAgZGVmIF9maW5kX2NvbW1vbihzZWxmLCBsaW5lc2V0MSwgbGluZXNldDIpOgorICAgICAgICAiIiJmaW5kIHNpbWlsYXJpdGllcyBpbiB0aGUgdHdvIGdpdmVuIGxpbmVzZXRzIiIiCisgICAgICAgIGxpbmVzMSA9IGxpbmVzZXQxLmVudW1lcmF0ZV9zdHJpcHBlZAorICAgICAgICBsaW5lczIgPSBsaW5lc2V0Mi5lbnVtZXJhdGVfc3RyaXBwZWQKKyAgICAgICAgZmluZCA9IGxpbmVzZXQyLmZpbmQKKyAgICAgICAgaW5kZXgxID0gMAorICAgICAgICBtaW5fbGluZXMgPSBzZWxmLm1pbl9saW5lcworICAgICAgICB3aGlsZSBpbmRleDEgPCBsZW4obGluZXNldDEpOgorICAgICAgICAgICAgc2tpcCA9IDEKKyAgICAgICAgICAgIG51bSA9IDAKKyAgICAgICAgICAgIGZvciBpbmRleDIgaW4gZmluZChsaW5lc2V0MVtpbmRleDFdKToKKyAgICAgICAgICAgICAgICBudW1fbGluZXNfd2l0aF9jb250ZW50ID0gMAorICAgICAgICAgICAgICAgIGZvciBudW0sICgoXywgbGluZTEpLCAoXywgbGluZTIpKSBpbiBlbnVtZXJhdGUoCisgICAgICAgICAgICAgICAgICAgIHppcChsaW5lczEoaW5kZXgxKSwgbGluZXMyKGluZGV4MikpCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZTEgIT0gbGluZTI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBudW1fbGluZXNfd2l0aF9jb250ZW50ID4gbWluX2xpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIG51bSwgbGluZXNldDEsIGluZGV4MSwgbGluZXNldDIsIGluZGV4MgorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IG1heChza2lwLCBudW0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBpZiByZS5tYXRjaChSRUdFWF9GT1JfTElORVNfV0lUSF9DT05URU5ULCBsaW5lMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBudW1fbGluZXNfd2l0aF9jb250ZW50ICs9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIHdlIG1heSBoYXZlIHJlYWNoZWQgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICBudW0gKz0gMQorICAgICAgICAgICAgICAgICAgICBpZiBudW1fbGluZXNfd2l0aF9jb250ZW50ID4gbWluX2xpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbnVtLCBsaW5lc2V0MSwgaW5kZXgxLCBsaW5lc2V0MiwgaW5kZXgyCisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBtYXgoc2tpcCwgbnVtKQorICAgICAgICAgICAgaW5kZXgxICs9IHNraXAKKworICAgIGRlZiBfaXRlcl9zaW1zKHNlbGYpOgorICAgICAgICAiIiJpdGVyYXRlIG9uIHNpbWlsYXJpdGllcyBhbW9uZyBhbGwgZmlsZXMsIGJ5IG1ha2luZyBhIGNhcnRlc2lhbgorICAgICAgICBwcm9kdWN0CisgICAgICAgICIiIgorICAgICAgICBmb3IgaWR4LCBsaW5lc2V0IGluIGVudW1lcmF0ZShzZWxmLmxpbmVzZXRzWzotMV0pOgorICAgICAgICAgICAgZm9yIGxpbmVzZXQyIGluIHNlbGYubGluZXNldHNbaWR4ICsgMSA6XToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHNlbGYuX2ZpbmRfY29tbW9uKGxpbmVzZXQsIGxpbmVzZXQyKQorCisgICAgZGVmIGdldF9tYXBfZGF0YShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgZGF0YSB3ZSBjYW4gdXNlIGZvciBhIG1hcC9yZWR1Y2UgcHJvY2VzcworCisgICAgICAgIEluIHRoaXMgY2FzZSB3ZSBhcmUgcmV0dXJuaW5nIHRoaXMgaW5zdGFuY2UncyBMaW5lc2V0cywgdGhhdCBpcyBhbGwgZmlsZQorICAgICAgICBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgbGF0ZXIgYmUgdXNlZCBmb3IgdmVjdG9yaXNhdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxpbmVzZXRzCisKKyAgICBkZWYgY29tYmluZV9tYXByZWR1Y2VfZGF0YShzZWxmLCBsaW5lc2V0c19jb2xsZWN0aW9uKToKKyAgICAgICAgIiIiUmVkdWNlcyBhbmQgcmVjb21iaW5lcyBkYXRhIGludG8gYSBmb3JtYXQgdGhhdCB3ZSBjYW4gcmVwb3J0IG9uCisKKyAgICAgICAgVGhlIHBhcnRuZXIgZnVuY3Rpb24gb2YgZ2V0X21hcF9kYXRhKCkiIiIKKyAgICAgICAgc2VsZi5saW5lc2V0cyA9IFtsaW5lIGZvciBsaW5lc2V0IGluIGxpbmVzZXRzX2NvbGxlY3Rpb24gZm9yIGxpbmUgaW4gbGluZXNldF0KKworCitkZWYgc3RyaXBwZWRfbGluZXMoCisgICAgbGluZXMsCisgICAgaWdub3JlX2NvbW1lbnRzOiBib29sLAorICAgIGlnbm9yZV9kb2NzdHJpbmdzOiBib29sLAorICAgIGlnbm9yZV9pbXBvcnRzOiBib29sLAorICAgIGlnbm9yZV9zaWduYXR1cmVzOiBib29sLAorKToKKyAgICAiIiJyZXR1cm4gbGluZXMgd2l0aCBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIGFueSBpZ25vcmVkIGNvZGUKKyAgICBmZWF0dXJlcyByZW1vdmVkCisgICAgIiIiCisgICAgaWYgaWdub3JlX2ltcG9ydHMgb3IgaWdub3JlX3NpZ25hdHVyZXM6CisgICAgICAgIHRyZWUgPSBhc3Ryb2lkLnBhcnNlKCIiLmpvaW4obGluZXMpKQorICAgIGlmIGlnbm9yZV9pbXBvcnRzOgorICAgICAgICBub2RlX2lzX2ltcG9ydF9ieV9saW5lbm8gPSAoCisgICAgICAgICAgICAobm9kZS5saW5lbm8sIGlzaW5zdGFuY2Uobm9kZSwgKGFzdHJvaWQuSW1wb3J0LCBhc3Ryb2lkLkltcG9ydEZyb20pKSkKKyAgICAgICAgICAgIGZvciBub2RlIGluIHRyZWUuYm9keQorICAgICAgICApCisgICAgICAgIGxpbmVfYmVnaW5zX2ltcG9ydCA9IHsKKyAgICAgICAgICAgIGxpbmVubzogYWxsKGlzX2ltcG9ydCBmb3IgXywgaXNfaW1wb3J0IGluIG5vZGVfaXNfaW1wb3J0X2dyb3VwKQorICAgICAgICAgICAgZm9yIGxpbmVubywgbm9kZV9pc19pbXBvcnRfZ3JvdXAgaW4gZ3JvdXBieSgKKyAgICAgICAgICAgICAgICBub2RlX2lzX2ltcG9ydF9ieV9saW5lbm8sIGtleT1sYW1iZGEgeDogeFswXQorICAgICAgICAgICAgKQorICAgICAgICB9CisgICAgICAgIGN1cnJlbnRfbGluZV9pc19pbXBvcnQgPSBGYWxzZQorICAgIGlmIGlnbm9yZV9zaWduYXR1cmVzOgorICAgICAgICBmdW5jdGlvbnMgPSBbCisgICAgICAgICAgICBuCisgICAgICAgICAgICBmb3IgbiBpbiB0cmVlLmJvZHkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobiwgKGFzdHJvaWQuRnVuY3Rpb25EZWYsIGFzdHJvaWQuQXN5bmNGdW5jdGlvbkRlZikpCisgICAgICAgIF0KKyAgICAgICAgc2lnbmF0dXJlX2xpbmVzID0gc2V0KAorICAgICAgICAgICAgY2hhaW4oKihyYW5nZShmdW5jLmZyb21saW5lbm8sIGZ1bmMuYm9keVswXS5saW5lbm8pIGZvciBmdW5jIGluIGZ1bmN0aW9ucykpCisgICAgICAgICkKKworICAgIHN0cmlwcGVkbGluZXMgPSBbXQorICAgIGRvY3N0cmluZyA9IE5vbmUKKyAgICBmb3IgbGluZW5vLCBsaW5lIGluIGVudW1lcmF0ZShsaW5lcywgc3RhcnQ9MSk6CisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgaWYgaWdub3JlX2RvY3N0cmluZ3M6CisgICAgICAgICAgICBpZiBub3QgZG9jc3RyaW5nOgorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIiIiJykgb3IgbGluZS5zdGFydHN3aXRoKCInJyciKToKKyAgICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nID0gbGluZVs6M10KKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMzpdCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoJ3IiIiInKSBvciBsaW5lLnN0YXJ0c3dpdGgoInInJyciKToKKyAgICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nID0gbGluZVsxOjRdCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzQ6XQorICAgICAgICAgICAgaWYgZG9jc3RyaW5nOgorICAgICAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoZG9jc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nID0gTm9uZQorICAgICAgICAgICAgICAgIGxpbmUgPSAiIgorICAgICAgICBpZiBpZ25vcmVfaW1wb3J0czoKKyAgICAgICAgICAgIGN1cnJlbnRfbGluZV9pc19pbXBvcnQgPSBsaW5lX2JlZ2luc19pbXBvcnQuZ2V0KAorICAgICAgICAgICAgICAgIGxpbmVubywgY3VycmVudF9saW5lX2lzX2ltcG9ydAorICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgY3VycmVudF9saW5lX2lzX2ltcG9ydDoKKyAgICAgICAgICAgICAgICBsaW5lID0gIiIKKyAgICAgICAgaWYgaWdub3JlX2NvbW1lbnRzOgorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXQoIiMiLCAxKVswXS5zdHJpcCgpCisgICAgICAgIGlmIGlnbm9yZV9zaWduYXR1cmVzIGFuZCBsaW5lbm8gaW4gc2lnbmF0dXJlX2xpbmVzOgorICAgICAgICAgICAgbGluZSA9ICIiCisgICAgICAgIHN0cmlwcGVkbGluZXMuYXBwZW5kKGxpbmUpCisgICAgcmV0dXJuIHN0cmlwcGVkbGluZXMKKworCitAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCitjbGFzcyBMaW5lU2V0OgorICAgICIiIkhvbGRzIGFuZCBpbmRleGVzIGFsbCB0aGUgbGluZXMgb2YgYSBzaW5nbGUgc291cmNlIGZpbGUiIiIKKworICAgIGRlZiBfX2luaXRfXygKKyAgICAgICAgc2VsZiwKKyAgICAgICAgbmFtZSwKKyAgICAgICAgbGluZXMsCisgICAgICAgIGlnbm9yZV9jb21tZW50cz1GYWxzZSwKKyAgICAgICAgaWdub3JlX2RvY3N0cmluZ3M9RmFsc2UsCisgICAgICAgIGlnbm9yZV9pbXBvcnRzPUZhbHNlLAorICAgICAgICBpZ25vcmVfc2lnbmF0dXJlcz1GYWxzZSwKKyAgICApOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX3JlYWxfbGluZXMgPSBsaW5lcworICAgICAgICBzZWxmLl9zdHJpcHBlZF9saW5lcyA9IHN0cmlwcGVkX2xpbmVzKAorICAgICAgICAgICAgbGluZXMsIGlnbm9yZV9jb21tZW50cywgaWdub3JlX2RvY3N0cmluZ3MsIGlnbm9yZV9pbXBvcnRzLCBpZ25vcmVfc2lnbmF0dXJlcworICAgICAgICApCisgICAgICAgIHNlbGYuX2luZGV4ID0gc2VsZi5fbWtfaW5kZXgoKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPExpbmVzZXQgZm9yICVzPiIgJSBzZWxmLm5hbWUKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3JlYWxfbGluZXMpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3RyaXBwZWRfbGluZXNbaW5kZXhdCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSA8IG90aGVyLm5hbWUKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHNlbGYpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmVTZXQpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgICBkZWYgZW51bWVyYXRlX3N0cmlwcGVkKHNlbGYsIHN0YXJ0X2F0PTApOgorICAgICAgICAiIiJyZXR1cm4gYW4gaXRlcmF0b3Igb24gc3RyaXBwZWQgbGluZXMsIHN0YXJ0aW5nIGZyb20gYSBnaXZlbiBpbmRleAorICAgICAgICBpZiBzcGVjaWZpZWQsIGVsc2UgMAorICAgICAgICAiIiIKKyAgICAgICAgaWR4ID0gc3RhcnRfYXQKKyAgICAgICAgaWYgc3RhcnRfYXQ6CisgICAgICAgICAgICBsaW5lcyA9IHNlbGYuX3N0cmlwcGVkX2xpbmVzW3N0YXJ0X2F0Ol0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbmVzID0gc2VsZi5fc3RyaXBwZWRfbGluZXMKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAjIGlmIGxpbmU6CisgICAgICAgICAgICB5aWVsZCBpZHgsIGxpbmUKKyAgICAgICAgICAgIGlkeCArPSAxCisKKyAgICBkZWYgZmluZChzZWxmLCBzdHJpcHBlZF9saW5lKToKKyAgICAgICAgIiIicmV0dXJuIHBvc2l0aW9ucyBvZiB0aGUgZ2l2ZW4gc3RyaXBwZWQgbGluZSBpbiB0aGlzIHNldCIiIgorICAgICAgICByZXR1cm4gc2VsZi5faW5kZXguZ2V0KHN0cmlwcGVkX2xpbmUsICgpKQorCisgICAgZGVmIF9ta19pbmRleChzZWxmKToKKyAgICAgICAgIiIiY3JlYXRlIHRoZSBpbmRleCBmb3IgdGhpcyBzZXQiIiIKKyAgICAgICAgaW5kZXggPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBmb3IgbGluZV9ubywgbGluZSBpbiBlbnVtZXJhdGUoc2VsZi5fc3RyaXBwZWRfbGluZXMpOgorICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICBpbmRleFtsaW5lXS5hcHBlbmQobGluZV9ubykKKyAgICAgICAgcmV0dXJuIGluZGV4CisKKworTVNHUyA9IHsKKyAgICAiUjA4MDEiOiAoCisgICAgICAgICJTaW1pbGFyIGxpbmVzIGluICVzIGZpbGVzXG4lcyIsCisgICAgICAgICJkdXBsaWNhdGUtY29kZSIsCisgICAgICAgICJJbmRpY2F0ZXMgdGhhdCBhIHNldCBvZiBzaW1pbGFyIGxpbmVzIGhhcyBiZWVuIGRldGVjdGVkICIKKyAgICAgICAgImFtb25nIG11bHRpcGxlIGZpbGUuIFRoaXMgdXN1YWxseSBtZWFucyB0aGF0IHRoZSBjb2RlIHNob3VsZCAiCisgICAgICAgICJiZSByZWZhY3RvcmVkIHRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24uIiwKKyAgICApCit9CisKKworZGVmIHJlcG9ydF9zaW1pbGFyaXRpZXMoc2VjdCwgc3RhdHMsIG9sZF9zdGF0cyk6CisgICAgIiIibWFrZSBhIGxheW91dCB3aXRoIHNvbWUgc3RhdHMgYWJvdXQgZHVwbGljYXRpb24iIiIKKyAgICBsaW5lcyA9IFsiIiwgIm5vdyIsICJwcmV2aW91cyIsICJkaWZmZXJlbmNlIl0KKyAgICBsaW5lcyArPSB0YWJsZV9saW5lc19mcm9tX3N0YXRzKAorICAgICAgICBzdGF0cywgb2xkX3N0YXRzLCAoIm5iX2R1cGxpY2F0ZWRfbGluZXMiLCAicGVyY2VudF9kdXBsaWNhdGVkX2xpbmVzIikKKyAgICApCisgICAgc2VjdC5hcHBlbmQoVGFibGUoY2hpbGRyZW49bGluZXMsIGNvbHM9NCwgcmhlYWRlcnM9MSwgY2hlYWRlcnM9MSkpCisKKworIyB3cmFwcGVyIHRvIGdldCBhIHB5bGludCBjaGVja2VyIGZyb20gdGhlIHNpbWlsYXIgY2xhc3MKK2NsYXNzIFNpbWlsYXJDaGVja2VyKEJhc2VDaGVja2VyLCBTaW1pbGFyLCBNYXBSZWR1Y2VNaXhpbik6CisgICAgIiIiY2hlY2tzIGZvciBzaW1pbGFyaXRpZXMgYW5kIGR1cGxpY2F0ZWQgY29kZS4gVGhpcyBjb21wdXRhdGlvbiBtYXkgYmUKKyAgICBtZW1vcnkgLyBDUFUgaW50ZW5zaXZlLCBzbyB5b3Ugc2hvdWxkIGRpc2FibGUgaXQgaWYgeW91IGV4cGVyaW1lbnQgc29tZQorICAgIHByb2JsZW1zLgorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoSVJhd0NoZWNrZXIsKQorICAgICMgY29uZmlndXJhdGlvbiBzZWN0aW9uIG5hbWUKKyAgICBuYW1lID0gInNpbWlsYXJpdGllcyIKKyAgICAjIG1lc3NhZ2VzCisgICAgbXNncyA9IE1TR1MKKyAgICAjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICAgICMgZm9yIGF2YWlsYWJsZSBkaWN0IGtleXMvdmFsdWVzIHNlZSB0aGUgb3B0aWsgcGFyc2VyICdhZGRfb3B0aW9uJyBtZXRob2QKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAibWluLXNpbWlsYXJpdHktbGluZXMiLCAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQsCisgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8aW50PiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTWluaW11bSBsaW5lcyBudW1iZXIgb2YgYSBzaW1pbGFyaXR5LiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlLWNvbW1lbnRzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IFRydWUsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5IG9yIG4+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJJZ25vcmUgY29tbWVudHMgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlLWRvY3N0cmluZ3MiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHkgb3Igbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIklnbm9yZSBkb2NzdHJpbmdzIHdoZW4gY29tcHV0aW5nIHNpbWlsYXJpdGllcy4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImlnbm9yZS1pbXBvcnRzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IEZhbHNlLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eSBvciBuPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiSWdub3JlIGltcG9ydHMgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlLXNpZ25hdHVyZXMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogRmFsc2UsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5IG9yIG4+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJJZ25vcmUgZnVuY3Rpb24gc2lnbmF0dXJlcyB3aGVuIGNvbXB1dGluZyBzaW1pbGFyaXRpZXMuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorICAgICMgcmVwb3J0cworICAgIHJlcG9ydHMgPSAoKCJSUDA4MDEiLCAiRHVwbGljYXRpb24iLCByZXBvcnRfc2ltaWxhcml0aWVzKSwpICAjIHR5cGU6IGlnbm9yZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcj1Ob25lKToKKyAgICAgICAgQmFzZUNoZWNrZXIuX19pbml0X18oc2VsZiwgbGludGVyKQorICAgICAgICBTaW1pbGFyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgbWluX2xpbmVzPTQsIGlnbm9yZV9jb21tZW50cz1UcnVlLCBpZ25vcmVfZG9jc3RyaW5ncz1UcnVlCisgICAgICAgICkKKyAgICAgICAgc2VsZi5zdGF0cyA9IE5vbmUKKworICAgIGRlZiBzZXRfb3B0aW9uKHNlbGYsIG9wdG5hbWUsIHZhbHVlLCBhY3Rpb249Tm9uZSwgb3B0ZGljdD1Ob25lKToKKyAgICAgICAgIiIibWV0aG9kIGNhbGxlZCB0byBzZXQgYW4gb3B0aW9uIChyZWdpc3RlcmVkIGluIHRoZSBvcHRpb25zIGxpc3QpCisKKyAgICAgICAgT3ZlcnJpZGRlbiB0byByZXBvcnQgb3B0aW9ucyBzZXR0aW5nIHRvIFNpbWlsYXIKKyAgICAgICAgIiIiCisgICAgICAgIEJhc2VDaGVja2VyLnNldF9vcHRpb24oc2VsZiwgb3B0bmFtZSwgdmFsdWUsIGFjdGlvbiwgb3B0ZGljdCkKKyAgICAgICAgaWYgb3B0bmFtZSA9PSAibWluLXNpbWlsYXJpdHktbGluZXMiOgorICAgICAgICAgICAgc2VsZi5taW5fbGluZXMgPSBzZWxmLmNvbmZpZy5taW5fc2ltaWxhcml0eV9saW5lcworICAgICAgICBlbGlmIG9wdG5hbWUgPT0gImlnbm9yZS1jb21tZW50cyI6CisgICAgICAgICAgICBzZWxmLmlnbm9yZV9jb21tZW50cyA9IHNlbGYuY29uZmlnLmlnbm9yZV9jb21tZW50cworICAgICAgICBlbGlmIG9wdG5hbWUgPT0gImlnbm9yZS1kb2NzdHJpbmdzIjoKKyAgICAgICAgICAgIHNlbGYuaWdub3JlX2RvY3N0cmluZ3MgPSBzZWxmLmNvbmZpZy5pZ25vcmVfZG9jc3RyaW5ncworICAgICAgICBlbGlmIG9wdG5hbWUgPT0gImlnbm9yZS1pbXBvcnRzIjoKKyAgICAgICAgICAgIHNlbGYuaWdub3JlX2ltcG9ydHMgPSBzZWxmLmNvbmZpZy5pZ25vcmVfaW1wb3J0cworICAgICAgICBlbGlmIG9wdG5hbWUgPT0gImlnbm9yZS1zaWduYXR1cmVzIjoKKyAgICAgICAgICAgIHNlbGYuaWdub3JlX3NpZ25hdHVyZXMgPSBzZWxmLmNvbmZpZy5pZ25vcmVfc2lnbmF0dXJlcworCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgICIiImluaXQgdGhlIGNoZWNrZXJzOiByZXNldCBsaW5lc2V0cyBhbmQgc3RhdGlzdGljcyBpbmZvcm1hdGlvbiIiIgorICAgICAgICBzZWxmLmxpbmVzZXRzID0gW10KKyAgICAgICAgc2VsZi5zdGF0cyA9IHNlbGYubGludGVyLmFkZF9zdGF0cygKKyAgICAgICAgICAgIG5iX2R1cGxpY2F0ZWRfbGluZXM9MCwgcGVyY2VudF9kdXBsaWNhdGVkX2xpbmVzPTAKKyAgICAgICAgKQorCisgICAgZGVmIHByb2Nlc3NfbW9kdWxlKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJwcm9jZXNzIGEgbW9kdWxlCisKKyAgICAgICAgdGhlIG1vZHVsZSdzIGNvbnRlbnQgaXMgYWNjZXNzaWJsZSB2aWEgdGhlIHN0cmVhbSBvYmplY3QKKworICAgICAgICBzdHJlYW0gbXVzdCBpbXBsZW1lbnQgdGhlIHJlYWRsaW5lcyBtZXRob2QKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggbm9kZS5zdHJlYW0oKSBhcyBzdHJlYW06CisgICAgICAgICAgICBzZWxmLmFwcGVuZF9zdHJlYW0oc2VsZi5saW50ZXIuY3VycmVudF9uYW1lLCBzdHJlYW0sIG5vZGUuZmlsZV9lbmNvZGluZykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiY29tcHV0ZSBhbmQgZGlzcGxheSBzaW1pbGFyaXRpZXMgb24gY2xvc2luZyAoaS5lLiBlbmQgb2YgcGFyc2luZykiIiIKKyAgICAgICAgdG90YWwgPSBzdW0obGVuKGxpbmVzZXQpIGZvciBsaW5lc2V0IGluIHNlbGYubGluZXNldHMpCisgICAgICAgIGR1cGxpY2F0ZWQgPSAwCisgICAgICAgIHN0YXRzID0gc2VsZi5zdGF0cworICAgICAgICBmb3IgbnVtLCBjb3VwbGVzIGluIHNlbGYuX2NvbXB1dGVfc2ltcygpOgorICAgICAgICAgICAgbXNnID0gW10KKyAgICAgICAgICAgIGxpbmVzZXQgPSBpZHggPSBOb25lCisgICAgICAgICAgICBmb3IgbGluZXNldCwgaWR4IGluIGNvdXBsZXM6CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChmIj09e2xpbmVzZXQubmFtZX06e2lkeH0iKQorICAgICAgICAgICAgbXNnLnNvcnQoKQorCisgICAgICAgICAgICBpZiBsaW5lc2V0OgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzZXQuX3JlYWxfbGluZXNbaWR4IDogaWR4ICsgbnVtXToKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChsaW5lLnJzdHJpcCgpKQorCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJSMDgwMSIsIGFyZ3M9KGxlbihjb3VwbGVzKSwgIlxuIi5qb2luKG1zZykpKQorICAgICAgICAgICAgZHVwbGljYXRlZCArPSBudW0gKiAobGVuKGNvdXBsZXMpIC0gMSkKKyAgICAgICAgc3RhdHNbIm5iX2R1cGxpY2F0ZWRfbGluZXMiXSA9IGR1cGxpY2F0ZWQKKyAgICAgICAgc3RhdHNbInBlcmNlbnRfZHVwbGljYXRlZF9saW5lcyJdID0gdG90YWwgYW5kIGR1cGxpY2F0ZWQgKiAxMDAuMCAvIHRvdGFsCisKKyAgICBkZWYgZ2V0X21hcF9kYXRhKHNlbGYpOgorICAgICAgICAiIiJQYXNzdGhydSBvdmVycmlkZSIiIgorICAgICAgICByZXR1cm4gU2ltaWxhci5nZXRfbWFwX2RhdGEoc2VsZikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWR1Y2VfbWFwX2RhdGEoY2xzLCBsaW50ZXIsIGRhdGEpOgorICAgICAgICAiIiJSZWR1Y2VzIGFuZCByZWNvbWJpbmVzIGRhdGEgaW50byBhIGZvcm1hdCB0aGF0IHdlIGNhbiByZXBvcnQgb24KKworICAgICAgICBUaGUgcGFydG5lciBmdW5jdGlvbiBvZiBnZXRfbWFwX2RhdGEoKSIiIgorICAgICAgICByZWNvbWJpbmVkID0gU2ltaWxhckNoZWNrZXIobGludGVyKQorICAgICAgICByZWNvbWJpbmVkLm9wZW4oKQorICAgICAgICBTaW1pbGFyLmNvbWJpbmVfbWFwcmVkdWNlX2RhdGEocmVjb21iaW5lZCwgbGluZXNldHNfY29sbGVjdGlvbj1kYXRhKQorICAgICAgICByZWNvbWJpbmVkLmNsb3NlKCkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihTaW1pbGFyQ2hlY2tlcihsaW50ZXIpKQorCisKK2RlZiB1c2FnZShzdGF0dXM9MCk6CisgICAgIiIiZGlzcGxheSBjb21tYW5kIGxpbmUgdXNhZ2UgaW5mb3JtYXRpb24iIiIKKyAgICBwcmludCgiZmluZHMgY29weSBwYXN0ZWQgYmxvY2tzIGluIGEgc2V0IG9mIGZpbGVzIikKKyAgICBwcmludCgpCisgICAgcHJpbnQoCisgICAgICAgICJVc2FnZTogc3ltaWxhciBbLWR8LS1kdXBsaWNhdGVzIG1pbl9kdXBsaWNhdGVkX2xpbmVzXSBcCitbLWl8LS1pZ25vcmUtY29tbWVudHNdIFstLWlnbm9yZS1kb2NzdHJpbmdzXSBbLS1pZ25vcmUtaW1wb3J0c10gWy0taWdub3JlLXNpZ25hdHVyZXNdIGZpbGUxLi4uIgorICAgICkKKyAgICBzeXMuZXhpdChzdGF0dXMpCisKKworZGVmIFJ1bihhcmd2PU5vbmUpOgorICAgICIiInN0YW5kYWxvbmUgY29tbWFuZCBsaW5lIGFjY2VzcyBwb2ludCIiIgorICAgIGlmIGFyZ3YgaXMgTm9uZToKKyAgICAgICAgYXJndiA9IHN5cy5hcmd2WzE6XQorCisgICAgc19vcHRzID0gImhkaSIKKyAgICBsX29wdHMgPSAoCisgICAgICAgICJoZWxwIiwKKyAgICAgICAgImR1cGxpY2F0ZXM9IiwKKyAgICAgICAgImlnbm9yZS1jb21tZW50cyIsCisgICAgICAgICJpZ25vcmUtaW1wb3J0cyIsCisgICAgICAgICJpZ25vcmUtZG9jc3RyaW5ncyIsCisgICAgICAgICJpZ25vcmUtc2lnbmF0dXJlcyIsCisgICAgKQorICAgIG1pbl9saW5lcyA9IDQKKyAgICBpZ25vcmVfY29tbWVudHMgPSBGYWxzZQorICAgIGlnbm9yZV9kb2NzdHJpbmdzID0gRmFsc2UKKyAgICBpZ25vcmVfaW1wb3J0cyA9IEZhbHNlCisgICAgaWdub3JlX3NpZ25hdHVyZXMgPSBGYWxzZQorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQoYXJndiwgc19vcHRzLCBsX29wdHMpCisgICAgZm9yIG9wdCwgdmFsIGluIG9wdHM6CisgICAgICAgIGlmIG9wdCBpbiAoIi1kIiwgIi0tZHVwbGljYXRlcyIpOgorICAgICAgICAgICAgbWluX2xpbmVzID0gaW50KHZhbCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCItaCIsICItLWhlbHAiKToKKyAgICAgICAgICAgIHVzYWdlKCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCItaSIsICItLWlnbm9yZS1jb21tZW50cyIpOgorICAgICAgICAgICAgaWdub3JlX2NvbW1lbnRzID0gVHJ1ZQorICAgICAgICBlbGlmIG9wdCBpbiAoIi0taWdub3JlLWRvY3N0cmluZ3MiLCk6CisgICAgICAgICAgICBpZ25vcmVfZG9jc3RyaW5ncyA9IFRydWUKKyAgICAgICAgZWxpZiBvcHQgaW4gKCItLWlnbm9yZS1pbXBvcnRzIiwpOgorICAgICAgICAgICAgaWdub3JlX2ltcG9ydHMgPSBUcnVlCisgICAgICAgIGVsaWYgb3B0IGluICgiLS1pZ25vcmUtc2lnbmF0dXJlcyIsKToKKyAgICAgICAgICAgIGlnbm9yZV9zaWduYXR1cmVzID0gVHJ1ZQorICAgIGlmIG5vdCBhcmdzOgorICAgICAgICB1c2FnZSgxKQorICAgIHNpbSA9IFNpbWlsYXIoCisgICAgICAgIG1pbl9saW5lcywgaWdub3JlX2NvbW1lbnRzLCBpZ25vcmVfZG9jc3RyaW5ncywgaWdub3JlX2ltcG9ydHMsIGlnbm9yZV9zaWduYXR1cmVzCisgICAgKQorICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIHN0cmVhbToKKyAgICAgICAgICAgIHNpbS5hcHBlbmRfc3RyZWFtKGZpbGVuYW1lLCBzdHJlYW0pCisgICAgc2ltLnJ1bigpCisgICAgc3lzLmV4aXQoMCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIFJ1bigpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvc3BlbGxpbmcucHkgYi9weWxpbnQvY2hlY2tlcnMvc3BlbGxpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4ZDYwNwotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jaGVja2Vycy9zcGVsbGluZy5weQpAQCAtMCwwICsxLDQ3MyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IE1pY2hhbCBOb3dpa293c2tpIDxnb2RmcnlkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcsIDIwMjAgUGVkcm8gQWxnYXJ2aW8gPHBlZHJvQGFsZ2FydmlvLm1lPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFRvZG9yb3YgPGF0b2Rvcm92QG90Yi5iZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IE1pa2hhaWwgRmVzZW5rbyA8cHJvZ2dnYUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU3VzaG9iaGl0IDwzMTk4Nzc2OStzdXNob2JoaXQyN0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgUGV0ZXIgS29sYnVzIDxwZXRlci5rb2xidXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgYWd1dG9sZSA8dG9sZG9fY2FycEBob3RtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEdhbmRlbiBTY2hhZmZuZXIgPGdzY2hhZmZuZXJAcG0ubWU+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisjIENvcHlyaWdodCAoYykgMjAyMSBib3QgPGJvdEBub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbmRyZWFzIEZpbmtsZXIgPGFuZGkuZmlua2xlckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBFbGkgRmluZSA8ZWpmaW5lQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJDaGVja2VyIGZvciBzcGVsbGluZyBlcnJvcnMgaW4gY29tbWVudHMgYW5kIGRvY3N0cmluZ3MuCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgdG9rZW5pemUKK2Zyb20gdHlwaW5nIGltcG9ydCBQYXR0ZXJuCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlVG9rZW5DaGVja2VyCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElBc3Ryb2lkQ2hlY2tlciwgSVRva2VuQ2hlY2tlcgorCit0cnk6CisgICAgaW1wb3J0IGVuY2hhbnQKKyAgICBmcm9tIGVuY2hhbnQudG9rZW5pemUgaW1wb3J0ICgKKyAgICAgICAgQ2h1bmtlciwKKyAgICAgICAgRW1haWxGaWx0ZXIsCisgICAgICAgIEZpbHRlciwKKyAgICAgICAgVVJMRmlsdGVyLAorICAgICAgICBXaWtpV29yZEZpbHRlciwKKyAgICAgICAgZ2V0X3Rva2VuaXplciwKKyAgICApCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZW5jaGFudCA9IE5vbmUKKworICAgIGNsYXNzIEVtYWlsRmlsdGVyOiAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgLi4uCisKKyAgICBjbGFzcyBVUkxGaWx0ZXI6ICAjIHR5cGU6IGlnbm9yZQorICAgICAgICAuLi4KKworICAgIGNsYXNzIFdpa2lXb3JkRmlsdGVyOiAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgLi4uCisKKyAgICBjbGFzcyBGaWx0ZXI6ICAjIHR5cGU6IGlnbm9yZQorICAgICAgICBkZWYgX3NraXAoc2VsZiwgd29yZCk6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBjbGFzcyBDaHVua2VyOiAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgcGFzcworCisgICAgZGVmIGdldF90b2tlbml6ZXIoCisgICAgICAgIHRhZz1Ob25lLCBjaHVua2Vycz1Ob25lLCBmaWx0ZXJzPU5vbmUKKyAgICApOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgIHJldHVybiBGaWx0ZXIoKQorCisKK2lmIGVuY2hhbnQgaXMgbm90IE5vbmU6CisgICAgYnIgPSBlbmNoYW50LkJyb2tlcigpCisgICAgZGljdHMgPSBici5saXN0X2RpY3RzKCkKKyAgICBkaWN0X2Nob2ljZXMgPSBbIiJdICsgW2RbMF0gZm9yIGQgaW4gZGljdHNdCisgICAgZGljdHMgPSBbZiJ7ZFswXX0gKHtkWzFdLm5hbWV9KSIgZm9yIGQgaW4gZGljdHNdCisgICAgZGljdHMgPSAiLCAiLmpvaW4oZGljdHMpCisgICAgaW5zdHIgPSAiIgorZWxzZToKKyAgICBkaWN0cyA9ICJub25lIgorICAgIGRpY3RfY2hvaWNlcyA9IFsiIl0KKyAgICBpbnN0ciA9ICIgVG8gbWFrZSBpdCB3b3JrLCBpbnN0YWxsIHRoZSAncHl0aG9uLWVuY2hhbnQnIHBhY2thZ2UuIgorCisKK2NsYXNzIFdvcmRzV2l0aERpZ2l0c0ZpbHRlcihGaWx0ZXIpOgorICAgICIiIlNraXBzIHdvcmRzIHdpdGggZGlnaXRzLiIiIgorCisgICAgZGVmIF9za2lwKHNlbGYsIHdvcmQpOgorICAgICAgICBmb3IgY2hhciBpbiB3b3JkOgorICAgICAgICAgICAgaWYgY2hhci5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgV29yZHNXaXRoVW5kZXJzY29yZXMoRmlsdGVyKToKKyAgICAiIiJTa2lwcyB3b3JkcyB3aXRoIHVuZGVyc2NvcmVzLgorCisgICAgVGhleSBhcmUgcHJvYmFibHkgZnVuY3Rpb24gcGFyYW1ldGVyIG5hbWVzLgorICAgICIiIgorCisgICAgZGVmIF9za2lwKHNlbGYsIHdvcmQpOgorICAgICAgICByZXR1cm4gIl8iIGluIHdvcmQKKworCitjbGFzcyBSZWdFeEZpbHRlcihGaWx0ZXIpOgorICAgICIiIlBhcmVudCBjbGFzcyBmb3IgZmlsdGVycyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zLgorCisgICAgVGhpcyBmaWx0ZXIgc2tpcHMgYW55IHdvcmRzIHRoZSBtYXRjaCB0aGUgZXhwcmVzc2lvbgorICAgIGFzc2lnbmVkIHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUgYGBfcGF0dGVybmBgLgorCisgICAgIiIiCisKKyAgICBfcGF0dGVybjogUGF0dGVybltzdHJdCisKKyAgICBkZWYgX3NraXAoc2VsZiwgd29yZCkgLT4gYm9vbDoKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fcGF0dGVybi5tYXRjaCh3b3JkKSkKKworCitjbGFzcyBDYW1lbENhc2VkV29yZChSZWdFeEZpbHRlcik6CisgICAgciIiIkZpbHRlciBza2lwcGluZyBvdmVyIGNhbWVsQ2FzZWRXb3Jkcy4KKyAgICBUaGlzIGZpbHRlciBza2lwcyBhbnkgd29yZHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyByZWd1bGFyIGV4cHJlc3Npb246CisKKyAgICAgICAgICAgXihbYS16XVx3K1tBLVpdK1x3KykKKworICAgIFRoYXQgaXMsIGFueSB3b3JkcyB0aGF0IGFyZSBjYW1lbENhc2VkV29yZHMuCisgICAgIiIiCisgICAgX3BhdHRlcm4gPSByZS5jb21waWxlKHIiXihbYS16XSsoW1xkXXxbQS1aXSkoPzpcdyspPykiKQorCisKK2NsYXNzIFNwaGlueERpcmVjdGl2ZXMoUmVnRXhGaWx0ZXIpOgorICAgIHIiIiJGaWx0ZXIgc2tpcHBpbmcgb3ZlciBTcGhpbnggRGlyZWN0aXZlcy4KKyAgICBUaGlzIGZpbHRlciBza2lwcyBhbnkgd29yZHMgbWF0Y2hpbmcgdGhlIGZvbGxvd2luZyByZWd1bGFyIGV4cHJlc3Npb246CisKKyAgICAgICAgICAgXig6KFthLXpdKykpezEsMn06YChbXmBdKykoYCk/CisKKyAgICBUaGF0IGlzLCBmb3IgZXhhbXBsZSwgOmNsYXNzOmBCYXNlUXVlcnlgCisgICAgIiIiCisgICAgIyBUaGUgZmluYWwgYCBpbiB0aGUgcGF0dGVybiBpcyBvcHRpb25hbCBiZWNhdXNlIGVuY2hhbnQgc3RyaXBzIGl0IG91dAorICAgIF9wYXR0ZXJuID0gcmUuY29tcGlsZShyIl4oOihbYS16XSspKXsxLDJ9OmAoW15gXSspKGApPyIpCisKKworY2xhc3MgRm9yd2FyZFNsYXNoQ2h1bmtlcihDaHVua2VyKToKKyAgICAiIiIKKyAgICBUaGlzIGNodW5rZXIgYWxsb3dzIHNwbGl0dGluZyB3b3JkcyBsaWtlICdiZWZvcmUvYWZ0ZXInIGludG8gJ2JlZm9yZScgYW5kICdhZnRlcicKKyAgICAiIiIKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3RleHQ6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigpCisgICAgICAgICAgICBpZiAiLyIgbm90IGluIHNlbGYuX3RleHQ6CisgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYuX3RleHQKKyAgICAgICAgICAgICAgICBzZWxmLl9vZmZzZXQgPSAwCisgICAgICAgICAgICAgICAgc2VsZi5fdGV4dCA9ICIiCisgICAgICAgICAgICAgICAgcmV0dXJuICh0ZXh0LCAwKQorICAgICAgICAgICAgcHJlX3RleHQsIHBvc3RfdGV4dCA9IHNlbGYuX3RleHQuc3BsaXQoIi8iLCAxKQorICAgICAgICAgICAgc2VsZi5fdGV4dCA9IHBvc3RfdGV4dAorICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ID0gMAorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIG5vdCBwcmVfdGV4dAorICAgICAgICAgICAgICAgIG9yIG5vdCBwb3N0X3RleHQKKyAgICAgICAgICAgICAgICBvciBub3QgcHJlX3RleHRbLTFdLmlzYWxwaGEoKQorICAgICAgICAgICAgICAgIG9yIG5vdCBwb3N0X3RleHRbMF0uaXNhbHBoYSgpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuX3RleHQgPSAiIgorICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCA9IDAKKyAgICAgICAgICAgICAgICByZXR1cm4gKHByZV90ZXh0ICsgIi8iICsgcG9zdF90ZXh0LCAwKQorICAgICAgICAgICAgcmV0dXJuIChwcmVfdGV4dCwgMCkKKworICAgIGRlZiBfbmV4dChzZWxmKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmICIvIiBub3QgaW4gc2VsZi5fdGV4dDoKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuX3RleHQsIDApCisgICAgICAgICAgICBwcmVfdGV4dCwgcG9zdF90ZXh0ID0gc2VsZi5fdGV4dC5zcGxpdCgiLyIsIDEpCisgICAgICAgICAgICBpZiBub3QgcHJlX3RleHQgb3Igbm90IHBvc3RfdGV4dDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IHByZV90ZXh0Wy0xXS5pc2FscGhhKCkgb3Igbm90IHBvc3RfdGV4dFswXS5pc2FscGhhKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigpCisgICAgICAgICAgICBzZWxmLl90ZXh0ID0gcHJlX3RleHQgKyAiICIgKyBwb3N0X3RleHQKKyAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigpCisKKworQ09ERV9GTEFOS0VEX0lOX0JBQ0tUSUNLX1JFR0VYID0gcmUuY29tcGlsZShyIihcc3xeKShgezEsMn0pKFteYF0rKShcMikoW15gXXwkKSIpCisKKworZGVmIF9zdHJpcF9jb2RlX2ZsYW5rZWRfaW5fYmFja3RpY2tzKGxpbmU6IHN0cikgLT4gc3RyOgorICAgICIiIkFsdGVyIGxpbmUgc28gY29kZSBmbGFua2VkIGluIGJhY2t0aWNrcyBpcyBpZ25vcmVkLgorCisgICAgUHllbmNoYW50IGF1dG9tYXRpY2FsbHkgc3RyaXBzIGJhY2t0aWNrcyB3aGVuIHBhcnNpbmcgdG9rZW5zLAorICAgIHNvIHRoaXMgY2Fubm90IGJlIGRvbmUgYXQgdGhlIGluZGl2aWR1YWwgZmlsdGVyIGxldmVsLiIiIgorCisgICAgZGVmIHJlcGxhY2VfY29kZV9idXRfbGVhdmVfc3Vycm91bmRpbmdfY2hhcmFjdGVycyhtYXRjaF9vYmopIC0+IHN0cjoKKyAgICAgICAgcmV0dXJuIG1hdGNoX29iai5ncm91cCgxKSArIG1hdGNoX29iai5ncm91cCg1KQorCisgICAgcmV0dXJuIENPREVfRkxBTktFRF9JTl9CQUNLVElDS19SRUdFWC5zdWIoCisgICAgICAgIHJlcGxhY2VfY29kZV9idXRfbGVhdmVfc3Vycm91bmRpbmdfY2hhcmFjdGVycywgbGluZQorICAgICkKKworCitjbGFzcyBTcGVsbGluZ0NoZWNrZXIoQmFzZVRva2VuQ2hlY2tlcik6CisgICAgIiIiQ2hlY2sgc3BlbGxpbmcgaW4gY29tbWVudHMgYW5kIGRvY3N0cmluZ3MiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElUb2tlbkNoZWNrZXIsIElBc3Ryb2lkQ2hlY2tlcikKKyAgICBuYW1lID0gInNwZWxsaW5nIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJDMDQwMSI6ICgKKyAgICAgICAgICAgICJXcm9uZyBzcGVsbGluZyBvZiBhIHdvcmQgJyVzJyBpbiBhIGNvbW1lbnQ6XG4lc1xuIgorICAgICAgICAgICAgIiVzXG5EaWQgeW91IG1lYW46ICclcyc/IiwKKyAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1jb21tZW50IiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSB3b3JkIGluIGNvbW1lbnQgaXMgbm90IHNwZWxsZWQgY29ycmVjdGx5LiIsCisgICAgICAgICksCisgICAgICAgICJDMDQwMiI6ICgKKyAgICAgICAgICAgICJXcm9uZyBzcGVsbGluZyBvZiBhIHdvcmQgJyVzJyBpbiBhIGRvY3N0cmluZzpcbiVzXG4iCisgICAgICAgICAgICAiJXNcbkRpZCB5b3UgbWVhbjogJyVzJz8iLAorICAgICAgICAgICAgIndyb25nLXNwZWxsaW5nLWluLWRvY3N0cmluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgd29yZCBpbiBkb2NzdHJpbmcgaXMgbm90IHNwZWxsZWQgY29ycmVjdGx5LiIsCisgICAgICAgICksCisgICAgICAgICJDMDQwMyI6ICgKKyAgICAgICAgICAgICJJbnZhbGlkIGNoYXJhY3RlcnMgJXIgaW4gYSBkb2NzdHJpbmciLAorICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVycy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIHdvcmQgaW4gZG9jc3RyaW5nIGNhbm5vdCBiZSBjaGVja2VkIGJ5IGVuY2hhbnQuIiwKKyAgICAgICAgKSwKKyAgICB9CisgICAgb3B0aW9ucyA9ICgKKyAgICAgICAgKAorICAgICAgICAgICAgInNwZWxsaW5nLWRpY3QiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hvaWNlIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8ZGljdCBuYW1lPiIsCisgICAgICAgICAgICAgICAgImNob2ljZXMiOiBkaWN0X2Nob2ljZXMsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiU3BlbGxpbmcgZGljdGlvbmFyeSBuYW1lLiAiCisgICAgICAgICAgICAgICAgIkF2YWlsYWJsZSBkaWN0aW9uYXJpZXM6ICVzLiVzIiAlIChkaWN0cywgaW5zdHIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgInNwZWxsaW5nLWlnbm9yZS13b3JkcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiIiwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxjb21tYSBzZXBhcmF0ZWQgd29yZHM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJMaXN0IG9mIGNvbW1hIHNlcGFyYXRlZCB3b3JkcyB0aGF0IHNob3VsZCBub3QgYmUgY2hlY2tlZC4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgInNwZWxsaW5nLXByaXZhdGUtZGljdC1maWxlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICIiLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHBhdGggdG8gZmlsZT4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkEgcGF0aCB0byBhIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcHJpdmF0ZSAiCisgICAgICAgICAgICAgICAgImRpY3Rpb25hcnk7IG9uZSB3b3JkIHBlciBsaW5lLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAic3BlbGxpbmctc3RvcmUtdW5rbm93bi13b3JkcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAibiIsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5X29yX24+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJUZWxscyB3aGV0aGVyIHRvIHN0b3JlIHVua25vd24gd29yZHMgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAicHJpdmF0ZSBkaWN0aW9uYXJ5IChzZWUgdGhlICIKKyAgICAgICAgICAgICAgICAiLS1zcGVsbGluZy1wcml2YXRlLWRpY3QtZmlsZSBvcHRpb24pIGluc3RlYWQgb2YgIgorICAgICAgICAgICAgICAgICJyYWlzaW5nIGEgbWVzc2FnZS4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1heC1zcGVsbGluZy1zdWdnZXN0aW9ucyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiA0LAorICAgICAgICAgICAgICAgICJ0eXBlIjogImludCIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiTiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGltaXRzIGNvdW50IG9mIGVtaXR0ZWQgc3VnZ2VzdGlvbnMgZm9yIHNwZWxsaW5nIG1pc3Rha2VzLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAic3BlbGxpbmctaWdub3JlLWNvbW1lbnQtZGlyZWN0aXZlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiZm10OiBvbixmbXQ6IG9mZixub3FhOixub3FhLG5vc2VjLGlzb3J0OnNraXAsbXlweToiLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGNvbW1hIHNlcGFyYXRlZCB3b3Jkcz4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHdvcmRzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGlyZWN0aXZlcyBpZiB0aGV5IGFwcGVhciBhbmQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbW1lbnQgYW5kIHNob3VsZCBub3QgYmUgY2hlY2tlZC4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IEZhbHNlCisgICAgICAgIHNlbGYucHJpdmF0ZV9kaWN0X2ZpbGUgPSBOb25lCisKKyAgICAgICAgaWYgZW5jaGFudCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRpY3RfbmFtZSA9IHNlbGYuY29uZmlnLnNwZWxsaW5nX2RpY3QKKyAgICAgICAgaWYgbm90IGRpY3RfbmFtZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuaWdub3JlX2xpc3QgPSBbCisgICAgICAgICAgICB3LnN0cmlwKCkgZm9yIHcgaW4gc2VsZi5jb25maWcuc3BlbGxpbmdfaWdub3JlX3dvcmRzLnNwbGl0KCIsIikKKyAgICAgICAgXQorICAgICAgICAjICJwYXJhbSIgYXBwZWFycyBpbiBkb2NzdHJpbmcgaW4gcGFyYW0gZGVzY3JpcHRpb24gYW5kCisgICAgICAgICMgInB5bGludCIgYXBwZWFycyBpbiBjb21tZW50cyBpbiBweWxpbnQgcHJhZ21hcy4KKyAgICAgICAgc2VsZi5pZ25vcmVfbGlzdC5leHRlbmQoWyJwYXJhbSIsICJweWxpbnQiXSkKKworICAgICAgICBzZWxmLmlnbm9yZV9jb21tZW50X2RpcmVjdGl2ZV9saXN0ID0gWworICAgICAgICAgICAgdy5zdHJpcCgpIGZvciB3IGluIHNlbGYuY29uZmlnLnNwZWxsaW5nX2lnbm9yZV9jb21tZW50X2RpcmVjdGl2ZXMuc3BsaXQoIiwiKQorICAgICAgICBdCisKKyAgICAgICAgIyBFeHBhbmQgdGlsZGUgdG8gYWxsb3cgZS5nLiBzcGVsbGluZy1wcml2YXRlLWRpY3QtZmlsZSA9IH4vLnB5bGludGRpY3QKKyAgICAgICAgaWYgc2VsZi5jb25maWcuc3BlbGxpbmdfcHJpdmF0ZV9kaWN0X2ZpbGU6CisgICAgICAgICAgICBzZWxmLmNvbmZpZy5zcGVsbGluZ19wcml2YXRlX2RpY3RfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcigKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5zcGVsbGluZ19wcml2YXRlX2RpY3RfZmlsZQorICAgICAgICAgICAgKQorCisgICAgICAgIGlmIHNlbGYuY29uZmlnLnNwZWxsaW5nX3ByaXZhdGVfZGljdF9maWxlOgorICAgICAgICAgICAgc2VsZi5zcGVsbGluZ19kaWN0ID0gZW5jaGFudC5EaWN0V2l0aFBXTCgKKyAgICAgICAgICAgICAgICBkaWN0X25hbWUsIHNlbGYuY29uZmlnLnNwZWxsaW5nX3ByaXZhdGVfZGljdF9maWxlCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLnByaXZhdGVfZGljdF9maWxlID0gb3BlbiggICMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLXdpdGgKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5zcGVsbGluZ19wcml2YXRlX2RpY3RfZmlsZSwgImEiCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNwZWxsaW5nX2RpY3QgPSBlbmNoYW50LkRpY3QoZGljdF9uYW1lKQorCisgICAgICAgIGlmIHNlbGYuY29uZmlnLnNwZWxsaW5nX3N0b3JlX3Vua25vd25fd29yZHM6CisgICAgICAgICAgICBzZWxmLnVua25vd25fd29yZHMgPSBzZXQoKQorCisgICAgICAgIHNlbGYudG9rZW5pemVyID0gZ2V0X3Rva2VuaXplcigKKyAgICAgICAgICAgIGRpY3RfbmFtZSwKKyAgICAgICAgICAgIGNodW5rZXJzPVtGb3J3YXJkU2xhc2hDaHVua2VyXSwKKyAgICAgICAgICAgIGZpbHRlcnM9WworICAgICAgICAgICAgICAgIEVtYWlsRmlsdGVyLAorICAgICAgICAgICAgICAgIFVSTEZpbHRlciwKKyAgICAgICAgICAgICAgICBXaWtpV29yZEZpbHRlciwKKyAgICAgICAgICAgICAgICBXb3Jkc1dpdGhEaWdpdHNGaWx0ZXIsCisgICAgICAgICAgICAgICAgV29yZHNXaXRoVW5kZXJzY29yZXMsCisgICAgICAgICAgICAgICAgQ2FtZWxDYXNlZFdvcmQsCisgICAgICAgICAgICAgICAgU3BoaW54RGlyZWN0aXZlcywKKyAgICAgICAgICAgIF0sCisgICAgICAgICkKKyAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IFRydWUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wcml2YXRlX2RpY3RfZmlsZToKKyAgICAgICAgICAgIHNlbGYucHJpdmF0ZV9kaWN0X2ZpbGUuY2xvc2UoKQorCisgICAgZGVmIF9jaGVja19zcGVsbGluZyhzZWxmLCBtc2dpZCwgbGluZSwgbGluZV9udW0pOgorICAgICAgICBvcmlnaW5hbF9saW5lID0gbGluZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbml0aWFsX3NwYWNlID0gcmUuc2VhcmNoKHIiXlteXFNdXHMqIiwgbGluZSkucmVnc1swXVsxXQorICAgICAgICBleGNlcHQgKEluZGV4RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGluaXRpYWxfc3BhY2UgPSAwCisgICAgICAgIGlmIGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCIjIikgYW5kICJkb2NzdHJpbmciIG5vdCBpbiBtc2dpZDoKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKClbMTpdCisgICAgICAgICAgICAjIEEgYGBGaWx0ZXJgYCBjYW5ub3QgZGV0ZXJtaW5lIGlmIHRoZSBkaXJlY3RpdmUgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsCisgICAgICAgICAgICAjICAgbm9yIGRldGVybWluZSBpZiBhIGNvbG9uIGlzIHByZXNlbnQgb3Igbm90IChgYHB5ZW5jaGFudGBgIHN0cmlwcyB0cmFpbGluZyBjb2xvbnMpLgorICAgICAgICAgICAgIyAgIFNvIGltcGxlbWVudGluZyB0aGlzIGhlcmUuCisgICAgICAgICAgICBmb3IgaXRlcl9kaXJlY3RpdmUgaW4gc2VsZi5pZ25vcmVfY29tbWVudF9kaXJlY3RpdmVfbGlzdDoKKyAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiAiICsgaXRlcl9kaXJlY3RpdmUpOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsobGVuKGl0ZXJfZGlyZWN0aXZlKSArIDEpIDpdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzdGFydHNfd2l0aF9jb21tZW50ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhcnRzX3dpdGhfY29tbWVudCA9IEZhbHNlCisKKyAgICAgICAgbGluZSA9IF9zdHJpcF9jb2RlX2ZsYW5rZWRfaW5fYmFja3RpY2tzKGxpbmUpCisKKyAgICAgICAgZm9yIHdvcmQsIHdvcmRfc3RhcnRfYXQgaW4gc2VsZi50b2tlbml6ZXIobGluZS5zdHJpcCgpKToKKyAgICAgICAgICAgIHdvcmRfc3RhcnRfYXQgKz0gaW5pdGlhbF9zcGFjZQorICAgICAgICAgICAgbG93ZXJfY2FzZWRfd29yZCA9IHdvcmQuY2FzZWZvbGQoKQorCisgICAgICAgICAgICAjIFNraXAgd29yZHMgZnJvbSBpZ25vcmUgbGlzdC4KKyAgICAgICAgICAgIGlmIHdvcmQgaW4gc2VsZi5pZ25vcmVfbGlzdCBvciBsb3dlcl9jYXNlZF93b3JkIGluIHNlbGYuaWdub3JlX2xpc3Q6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBTdHJpcCBzdGFydGluZyB1JyBmcm9tIHVuaWNvZGUgbGl0ZXJhbHMgYW5kIHInIGZyb20gcmF3IHN0cmluZ3MuCisgICAgICAgICAgICBpZiB3b3JkLnN0YXJ0c3dpdGgoKCJ1JyIsICd1IicsICJyJyIsICdyIicpKSBhbmQgbGVuKHdvcmQpID4gMjoKKyAgICAgICAgICAgICAgICB3b3JkID0gd29yZFsyOl0KKyAgICAgICAgICAgICAgICBsb3dlcl9jYXNlZF93b3JkID0gbG93ZXJfY2FzZWRfd29yZFsyOl0KKworICAgICAgICAgICAgIyBJZiBpdCBpcyBhIGtub3duIHdvcmQsIHRoZW4gY29udGludWUuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zcGVsbGluZ19kaWN0LmNoZWNrKGxvd2VyX2Nhc2VkX3dvcmQpOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBsb3dlciBjYXNlZCB2ZXJzaW9uIG9mIHdvcmQgcGFzc2VkIHNwZWxsIGNoZWNraW5nCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAjIElmIHdlIHJlYWNoZWQgdGhpcyBmYXIsIGl0IG1lYW5zIHRoZXJlIHdhcyBhIHNwZWxsaW5nIG1pc3Rha2UuCisgICAgICAgICAgICAgICAgIyBMZXQncyByZXRyeSB3aXRoIHRoZSBvcmlnaW5hbCB3b3JrIGJlY2F1c2UgJ3VuaWNvZGUnIGlzIGEKKyAgICAgICAgICAgICAgICAjIHNwZWxsaW5nIG1pc3Rha2UgYnV0ICdVbmljb2RlJyBpcyBub3QKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNwZWxsaW5nX2RpY3QuY2hlY2sod29yZCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBleGNlcHQgZW5jaGFudC5lcnJvcnMuRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVycy1pbi1kb2NzdHJpbmciLCBsaW5lPWxpbmVfbnVtLCBhcmdzPSh3b3JkLCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBTdG9yZSB3b3JkIHRvIHByaXZhdGUgZGljdCBvciByYWlzZSBhIG1lc3NhZ2UuCisgICAgICAgICAgICBpZiBzZWxmLmNvbmZpZy5zcGVsbGluZ19zdG9yZV91bmtub3duX3dvcmRzOgorICAgICAgICAgICAgICAgIGlmIGxvd2VyX2Nhc2VkX3dvcmQgbm90IGluIHNlbGYudW5rbm93bl93b3JkczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcml2YXRlX2RpY3RfZmlsZS53cml0ZSgiJXNcbiIgJSBsb3dlcl9jYXNlZF93b3JkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fd29yZHMuYWRkKGxvd2VyX2Nhc2VkX3dvcmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgUHJlc2VudCB1cCB0byBOIHN1Z2dlc3Rpb25zLgorICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gc2VsZi5zcGVsbGluZ19kaWN0LnN1Z2dlc3Qod29yZCkKKyAgICAgICAgICAgICAgICBkZWwgc3VnZ2VzdGlvbnNbc2VsZi5jb25maWcubWF4X3NwZWxsaW5nX3N1Z2dlc3Rpb25zIDpdCisgICAgICAgICAgICAgICAgbGluZV9zZWdtZW50ID0gbGluZVt3b3JkX3N0YXJ0X2F0Ol0KKyAgICAgICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChyIihcV3xeKSglcykoXFd8JCkiICUgd29yZCwgbGluZV9zZWdtZW50KQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IHBvc2l0aW9uIG9mIHNlY29uZCBncm91cCBpbiByZWdleC4KKyAgICAgICAgICAgICAgICAgICAgY29sID0gbWF0Y2gucmVnc1syXVswXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbCA9IGxpbmVfc2VnbWVudC5pbmRleCh3b3JkKQorICAgICAgICAgICAgICAgIGNvbCArPSB3b3JkX3N0YXJ0X2F0CisgICAgICAgICAgICAgICAgaWYgc3RhcnRzX3dpdGhfY29tbWVudDoKKyAgICAgICAgICAgICAgICAgICAgY29sICs9IDEKKyAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPSAoIiAiICogY29sKSArICgiXiIgKiBsZW4od29yZCkpCisgICAgICAgICAgICAgICAgYWxsX3N1Z2dlc3Rpb24gPSAiJyBvciAnIi5qb2luKHN1Z2dlc3Rpb25zKQorICAgICAgICAgICAgICAgIGFyZ3MgPSAod29yZCwgb3JpZ2luYWxfbGluZSwgaW5kaWNhdG9yLCBmIid7YWxsX3N1Z2dlc3Rpb259JyIpCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZShtc2dpZCwgbGluZT1saW5lX251bSwgYXJncz1hcmdzKQorCisgICAgZGVmIHByb2Nlc3NfdG9rZW5zKHNlbGYsIHRva2Vucyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmluaXRpYWxpemVkOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBQcm9jZXNzIHRva2VucyBhbmQgbG9vayBmb3IgY29tbWVudHMuCisgICAgICAgIGZvciAodG9rX3R5cGUsIHRva2VuLCAoc3RhcnRfcm93LCBfKSwgXywgXykgaW4gdG9rZW5zOgorICAgICAgICAgICAgaWYgdG9rX3R5cGUgPT0gdG9rZW5pemUuQ09NTUVOVDoKKyAgICAgICAgICAgICAgICBpZiBzdGFydF9yb3cgPT0gMSBhbmQgdG9rZW4uc3RhcnRzd2l0aCgiIyEvIik6CisgICAgICAgICAgICAgICAgICAgICMgU2tpcCBzaGViYW5nIGxpbmVzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgdG9rZW4uc3RhcnRzd2l0aCgiIyBweWxpbnQ6Iik6CisgICAgICAgICAgICAgICAgICAgICMgU2tpcCBweWxpbnQgZW5hYmxlL2Rpc2FibGUgY29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19zcGVsbGluZygid3Jvbmctc3BlbGxpbmctaW4tY29tbWVudCIsIHRva2VuLCBzdGFydF9yb3cpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoIndyb25nLXNwZWxsaW5nLWluLWRvY3N0cmluZyIpCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IHNlbGYuaW5pdGlhbGl6ZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY2hlY2tfZG9jc3RyaW5nKG5vZGUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoIndyb25nLXNwZWxsaW5nLWluLWRvY3N0cmluZyIpCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jaGVja19kb2NzdHJpbmcobm9kZSkKKworICAgIEBjaGVja19tZXNzYWdlcygid3Jvbmctc3BlbGxpbmctaW4tZG9jc3RyaW5nIikKKyAgICBkZWYgdmlzaXRfZnVuY3Rpb25kZWYoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmluaXRpYWxpemVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NoZWNrX2RvY3N0cmluZyhub2RlKQorCisgICAgdmlzaXRfYXN5bmNmdW5jdGlvbmRlZiA9IHZpc2l0X2Z1bmN0aW9uZGVmCisKKyAgICBkZWYgX2NoZWNrX2RvY3N0cmluZyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgdGhlIG5vZGUgaGFzIGFueSBzcGVsbGluZyBlcnJvcnMiIiIKKyAgICAgICAgZG9jc3RyaW5nID0gbm9kZS5kb2MKKyAgICAgICAgaWYgbm90IGRvY3N0cmluZzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHN0YXJ0X2xpbmUgPSBub2RlLmxpbmVubyArIDEKKworICAgICAgICAjIEdvIHRocm91Z2ggbGluZXMgb2YgZG9jc3RyaW5nCisgICAgICAgIGZvciBpZHgsIGxpbmUgaW4gZW51bWVyYXRlKGRvY3N0cmluZy5zcGxpdGxpbmVzKCkpOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc3BlbGxpbmcoIndyb25nLXNwZWxsaW5nLWluLWRvY3N0cmluZyIsIGxpbmUsIHN0YXJ0X2xpbmUgKyBpZHgpCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIicmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoU3BlbGxpbmdDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvc3RkbGliLnB5IGIvcHlsaW50L2NoZWNrZXJzL3N0ZGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDUwZGJjCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NoZWNrZXJzL3N0ZGxpYi5weQpAQCAtMCwwICsxLDYzMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IENvc21pbiBQb2llYW5hIDxjbWluQHJvcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IFZsYWQgVGVtaWFuIDx2bGFkdGVtaWFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQ2V6YXIgPGNlbG5hemxpQGJpdGRlZmVuZGVyLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IENocmlzIFJlYmVydCA8Y29kZUByZWJlcnRpYS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEphcmVkIEdhcnN0IDxjdWx0b2ZqYXJlZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBSZW5hdCBHYWxpbW92IDxyZW5hdDIwMTdAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgTWFydGluIDxNYXJ0aW5CYXN0aUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBDaHJpc3RvcGhlciBadXJjaGVyIDx6dXJjaGVyQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1Y2FzIENpbW9uIDxsdWNhcy5jaW1vbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBCYW5qYW1pbiBGcmVlbWFuIDxiZWZyZWVtYW5AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggSW9hbmEgVGFnaXJ0YSA8aW9hbmEudGFnaXJ0YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSnVsaWVuIFBhbGFyZCA8anVsaWVuQHBhbGFyZC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IGxhaWtlOW0gPGxhaWtlOW1AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBSb2JlcnQgU2Nod2VpemVyIDxyb2JlcnRfc2Nod2VpemVyQGdteC5kZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IGZhZGVkRGV4b2ZhbiA8ZmFkZWREZXhvZmFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFNvcmluIFNiYXJuZWEgPHNzYmFybmVhQHJlZGhhdC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBGZWRlcmljbyBCb25kIDxmZWRlcmljb2JvbmRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAg6LCt5Lmd6byOIDwxMDkyMjQ1NzNAcXEuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXR1cyBWYWxvIDxtYXR1c3ZhbG9AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgdmljdG9yIDwxNjM1OTEzMStqaWFqdW5zdUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiQ2hlY2tlcnMgZm9yIHZhcmlvdXMgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMuIiIiCisKK2ltcG9ydCBzeXMKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBJdGVyYWJsZQorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIsIERlcHJlY2F0ZWRNaXhpbiwgdXRpbHMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElBc3Ryb2lkQ2hlY2tlcgorCitPUEVOX0ZJTEVTID0geyJvcGVuIiwgImZpbGUifQorVU5JVFRFU1RfQ0FTRSA9ICJ1bml0dGVzdC5jYXNlIgorVEhSRUFESU5HX1RIUkVBRCA9ICJ0aHJlYWRpbmcuVGhyZWFkIgorQ09QWV9DT1BZID0gImNvcHkuY29weSIKK09TX0VOVklST04gPSAib3MuX0Vudmlyb24iCitFTlZfR0VUVEVSUyA9IHsib3MuZ2V0ZW52In0KK1NVQlBST0NFU1NfUE9QRU4gPSAic3VicHJvY2Vzcy5Qb3BlbiIKK1NVQlBST0NFU1NfUlVOID0gInN1YnByb2Nlc3MucnVuIgorT1BFTl9NT0RVTEUgPSAiX2lvIgorCisKK0RFUFJFQ0FURURfTU9EVUxFUyA9IHsKKyAgICAoMCwgMCwgMCk6IHsidGtpbnRlci50aXgiLCAiZnBlY3RsIn0sCisgICAgKDMsIDIsIDApOiB7Im9wdHBhcnNlIn0sCisgICAgKDMsIDQsIDApOiB7ImltcCJ9LAorICAgICgzLCA1LCAwKTogeyJmb3JtYXR0ZXIifSwKKyAgICAoMywgNiwgMCk6IHsiYXN5bmNoYXQiLCAiYXN5bmNvcmUifSwKKyAgICAoMywgNywgMCk6IHsibWFjcGF0aCJ9LAorICAgICgzLCA5LCAwKTogeyJsaWIydG8zIiwgInBhcnNlciIsICJzeW1ib2wiLCAiYmluaGV4In0sCit9CisKK0RFUFJFQ0FURURfQVJHVU1FTlRTID0geworICAgICgwLCAwLCAwKTogeworICAgICAgICAiaW50IjogKChOb25lLCAieCIpLCksCisgICAgICAgICJib29sIjogKChOb25lLCAieCIpLCksCisgICAgICAgICJmbG9hdCI6ICgoTm9uZSwgIngiKSwpLAorICAgIH0sCisgICAgKDMsIDgsIDApOiB7CisgICAgICAgICJhc3luY2lvLnRhc2tzLnNsZWVwIjogKChOb25lLCAibG9vcCIpLCksCisgICAgICAgICJhc3luY2lvLnRhc2tzLmdhdGhlciI6ICgoTm9uZSwgImxvb3AiKSwpLAorICAgICAgICAiYXN5bmNpby50YXNrcy5zaGllbGQiOiAoKE5vbmUsICJsb29wIiksKSwKKyAgICAgICAgImFzeW5jaW8udGFza3Mud2FpdF9mb3IiOiAoKE5vbmUsICJsb29wIiksKSwKKyAgICAgICAgImFzeW5jaW8udGFza3Mud2FpdCI6ICgoTm9uZSwgImxvb3AiKSwpLAorICAgICAgICAiYXN5bmNpby50YXNrcy5hc19jb21wbGV0ZWQiOiAoKE5vbmUsICJsb29wIiksKSwKKyAgICAgICAgImFzeW5jaW8uc3VicHJvY2Vzcy5jcmVhdGVfc3VicHJvY2Vzc19leGVjIjogKChOb25lLCAibG9vcCIpLCksCisgICAgICAgICJhc3luY2lvLnN1YnByb2Nlc3MuY3JlYXRlX3N1YnByb2Nlc3Nfc2hlbGwiOiAoKDQsICJsb29wIiksKSwKKyAgICAgICAgImdldHRleHQudHJhbnNsYXRpb24iOiAoKDUsICJjb2Rlc2V0IiksKSwKKyAgICAgICAgImdldHRleHQuaW5zdGFsbCI6ICgoMiwgImNvZGVzZXQiKSwpLAorICAgICAgICAiZnVuY3Rvb2xzLnBhcnRpYWxtZXRob2QiOiAoKE5vbmUsICJmdW5jIiksKSwKKyAgICAgICAgIndlYWtyZWYuZmluYWxpemUiOiAoKE5vbmUsICJmdW5jIiksIChOb25lLCAib2JqIikpLAorICAgICAgICAicHJvZmlsZS5Qcm9maWxlLnJ1bmNhbGwiOiAoKE5vbmUsICJmdW5jIiksKSwKKyAgICAgICAgImNQcm9maWxlLlByb2ZpbGUucnVuY2FsbCI6ICgoTm9uZSwgImZ1bmMiKSwpLAorICAgICAgICAiYmRiLkJkYi5ydW5jYWxsIjogKChOb25lLCAiZnVuYyIpLCksCisgICAgICAgICJ0cmFjZS5UcmFjZS5ydW5mdW5jIjogKChOb25lLCAiZnVuYyIpLCksCisgICAgICAgICJjdXJzZXMud3JhcHBlciI6ICgoTm9uZSwgImZ1bmMiKSwpLAorICAgICAgICAidW5pdHRlc3QuY2FzZS5UZXN0Q2FzZS5hZGRDbGVhbnVwIjogKChOb25lLCAiZnVuY3Rpb24iKSwpLAorICAgICAgICAiY29uY3VycmVudC5mdXR1cmVzLnRocmVhZC5UaHJlYWRQb29sRXhlY3V0b3Iuc3VibWl0IjogKChOb25lLCAiZm4iKSwpLAorICAgICAgICAiY29uY3VycmVudC5mdXR1cmVzLnByb2Nlc3MuUHJvY2Vzc1Bvb2xFeGVjdXRvci5zdWJtaXQiOiAoKE5vbmUsICJmbiIpLCksCisgICAgICAgICJjb250ZXh0bGliLl9CYXNlRXhpdFN0YWNrLmNhbGxiYWNrIjogKChOb25lLCAiY2FsbGJhY2siKSwpLAorICAgICAgICAiY29udGV4dGxpYi5Bc3luY0V4aXRTdGFjay5wdXNoX2FzeW5jX2NhbGxiYWNrIjogKChOb25lLCAiY2FsbGJhY2siKSwpLAorICAgICAgICAibXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLlNlcnZlci5jcmVhdGUiOiAoKE5vbmUsICJjIiksIChOb25lLCAidHlwZWlkIikpLAorICAgICAgICAibXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLlNoYXJlZE1lbW9yeVNlcnZlci5jcmVhdGUiOiAoCisgICAgICAgICAgICAoTm9uZSwgImMiKSwKKyAgICAgICAgICAgIChOb25lLCAidHlwZWlkIiksCisgICAgICAgICksCisgICAgfSwKKyAgICAoMywgOSwgMCk6IHsicmFuZG9tLlJhbmRvbS5zaHVmZmxlIjogKCgxLCAicmFuZG9tIiksKX0sCit9CisKK0RFUFJFQ0FURURfREVDT1JBVE9SUyA9IHsKKyAgICAoMywgOCwgMCk6IHsiYXN5bmNpby5jb3JvdXRpbmUifSwKKyAgICAoMywgMywgMCk6IHsKKyAgICAgICAgImFiYy5hYnN0cmFjdGNsYXNzbWV0aG9kIiwKKyAgICAgICAgImFiYy5hYnN0cmFjdHN0YXRpY21ldGhvZCIsCisgICAgICAgICJhYmMuYWJzdHJhY3Rwcm9wZXJ0eSIsCisgICAgfSwKK30KKworCitERVBSRUNBVEVEX01FVEhPRFMgPSB7CisgICAgMDogeworICAgICAgICAiY2dpLnBhcnNlX3FzIiwKKyAgICAgICAgImNnaS5wYXJzZV9xc2wiLAorICAgICAgICAiY3R5cGVzLmNfYnVmZmVyIiwKKyAgICAgICAgImRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyLnJlZ2lzdGVyLmNoZWNrX21ldGFkYXRhIiwKKyAgICAgICAgImRpc3R1dGlscy5jb21tYW5kLnNkaXN0LnNkaXN0LmNoZWNrX21ldGFkYXRhIiwKKyAgICAgICAgInRraW50ZXIuTWlzYy50a19tZW51QmFyIiwKKyAgICAgICAgInRraW50ZXIuTWVudS50a19iaW5kRm9yVHJhdmVyc2FsIiwKKyAgICB9LAorICAgIDI6IHsKKyAgICAgICAgKDIsIDYsIDApOiB7CisgICAgICAgICAgICAiY29tbWFuZHMuZ2V0c3RhdHVzIiwKKyAgICAgICAgICAgICJvcy5wb3BlbjIiLAorICAgICAgICAgICAgIm9zLnBvcGVuMyIsCisgICAgICAgICAgICAib3MucG9wZW40IiwKKyAgICAgICAgICAgICJtYWNvc3Rvb2xzLnRvdWNoZWQiLAorICAgICAgICB9LAorICAgICAgICAoMiwgNywgMCk6IHsKKyAgICAgICAgICAgICJ1bml0dGVzdC5jYXNlLlRlc3RDYXNlLmFzc2VydEVxdWFscyIsCisgICAgICAgICAgICAidW5pdHRlc3QuY2FzZS5UZXN0Q2FzZS5hc3NlcnROb3RFcXVhbHMiLAorICAgICAgICAgICAgInVuaXR0ZXN0LmNhc2UuVGVzdENhc2UuYXNzZXJ0QWxtb3N0RXF1YWxzIiwKKyAgICAgICAgICAgICJ1bml0dGVzdC5jYXNlLlRlc3RDYXNlLmFzc2VydE5vdEFsbW9zdEVxdWFscyIsCisgICAgICAgICAgICAidW5pdHRlc3QuY2FzZS5UZXN0Q2FzZS5hc3NlcnRfIiwKKyAgICAgICAgICAgICJ4bWwuZXRyZWUuRWxlbWVudFRyZWUuRWxlbWVudC5nZXRjaGlsZHJlbiIsCisgICAgICAgICAgICAieG1sLmV0cmVlLkVsZW1lbnRUcmVlLkVsZW1lbnQuZ2V0aXRlcmF0b3IiLAorICAgICAgICAgICAgInhtbC5ldHJlZS5FbGVtZW50VHJlZS5YTUxQYXJzZXIuZ2V0aXRlcmF0b3IiLAorICAgICAgICAgICAgInhtbC5ldHJlZS5FbGVtZW50VHJlZS5YTUxQYXJzZXIuZG9jdHlwZSIsCisgICAgICAgIH0sCisgICAgfSwKKyAgICAzOiB7CisgICAgICAgICgzLCAwLCAwKTogeworICAgICAgICAgICAgImluc3BlY3QuZ2V0YXJnc3BlYyIsCisgICAgICAgICAgICAiZmFpbFVubGVzc0VxdWFsIiwKKyAgICAgICAgICAgICJhc3NlcnRFcXVhbHMiLAorICAgICAgICAgICAgImZhaWxJZkVxdWFsIiwKKyAgICAgICAgICAgICJhc3NlcnROb3RFcXVhbHMiLAorICAgICAgICAgICAgImZhaWxVbmxlc3NBbG1vc3RFcXVhbCIsCisgICAgICAgICAgICAiYXNzZXJ0QWxtb3N0RXF1YWxzIiwKKyAgICAgICAgICAgICJmYWlsSWZBbG1vc3RFcXVhbCIsCisgICAgICAgICAgICAiYXNzZXJ0Tm90QWxtb3N0RXF1YWxzIiwKKyAgICAgICAgICAgICJmYWlsVW5sZXNzIiwKKyAgICAgICAgICAgICJhc3NlcnRfIiwKKyAgICAgICAgICAgICJmYWlsVW5sZXNzUmFpc2VzIiwKKyAgICAgICAgICAgICJmYWlsSWYiLAorICAgICAgICAgICAgImFzc2VydFJhaXNlc1JlZ2V4cCIsCisgICAgICAgICAgICAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIsCisgICAgICAgICAgICAiYXNzZXJ0Tm90UmVnZXhwTWF0Y2hlcyIsCisgICAgICAgIH0sCisgICAgICAgICgzLCAxLCAwKTogeworICAgICAgICAgICAgImJhc2U2NC5lbmNvZGVzdHJpbmciLAorICAgICAgICAgICAgImJhc2U2NC5kZWNvZGVzdHJpbmciLAorICAgICAgICAgICAgIm50cGF0aC5zcGxpdHVuYyIsCisgICAgICAgICAgICAib3MucGF0aC5zcGxpdHVuYyIsCisgICAgICAgICAgICAib3Muc3RhdF9mbG9hdF90aW1lcyIsCisgICAgICAgIH0sCisgICAgICAgICgzLCAyLCAwKTogeworICAgICAgICAgICAgImNnaS5lc2NhcGUiLAorICAgICAgICAgICAgImNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIucmVhZGZwIiwKKyAgICAgICAgICAgICJ4bWwuZXRyZWUuRWxlbWVudFRyZWUuRWxlbWVudC5nZXRjaGlsZHJlbiIsCisgICAgICAgICAgICAieG1sLmV0cmVlLkVsZW1lbnRUcmVlLkVsZW1lbnQuZ2V0aXRlcmF0b3IiLAorICAgICAgICAgICAgInhtbC5ldHJlZS5FbGVtZW50VHJlZS5YTUxQYXJzZXIuZ2V0aXRlcmF0b3IiLAorICAgICAgICAgICAgInhtbC5ldHJlZS5FbGVtZW50VHJlZS5YTUxQYXJzZXIuZG9jdHlwZSIsCisgICAgICAgIH0sCisgICAgICAgICgzLCAzLCAwKTogeworICAgICAgICAgICAgImluc3BlY3QuZ2V0bW9kdWxlaW5mbyIsCisgICAgICAgICAgICAibG9nZ2luZy53YXJuIiwKKyAgICAgICAgICAgICJsb2dnaW5nLkxvZ2dlci53YXJuIiwKKyAgICAgICAgICAgICJsb2dnaW5nLkxvZ2dlckFkYXB0ZXIud2FybiIsCisgICAgICAgICAgICAibm50cGxpYi5fTk5UUEJhc2UueHBhdGgiLAorICAgICAgICAgICAgInBsYXRmb3JtLnBvcGVuIiwKKyAgICAgICAgfSwKKyAgICAgICAgKDMsIDQsIDApOiB7CisgICAgICAgICAgICAiaW1wb3J0bGliLmZpbmRfbG9hZGVyIiwKKyAgICAgICAgICAgICJwbGlzdGxpYi5yZWFkUGxpc3QiLAorICAgICAgICAgICAgInBsaXN0bGliLndyaXRlUGxpc3QiLAorICAgICAgICAgICAgInBsaXN0bGliLnJlYWRQbGlzdEZyb21CeXRlcyIsCisgICAgICAgICAgICAicGxpc3RsaWIud3JpdGVQbGlzdFRvQnl0ZXMiLAorICAgICAgICB9LAorICAgICAgICAoMywgNCwgNCk6IHsiYXN5bmNpby50YXNrcy5hc3luYyJ9LAorICAgICAgICAoMywgNSwgMCk6IHsKKyAgICAgICAgICAgICJmcmFjdGlvbnMuZ2NkIiwKKyAgICAgICAgICAgICJpbnNwZWN0LmZvcm1hdGFyZ3NwZWMiLAorICAgICAgICAgICAgImluc3BlY3QuZ2V0Y2FsbGFyZ3MiLAorICAgICAgICAgICAgInBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbiIsCisgICAgICAgICAgICAicGxhdGZvcm0uZGlzdCIsCisgICAgICAgIH0sCisgICAgICAgICgzLCA2LCAwKTogeyJpbXBvcnRsaWIuX2Jvb3RzdHJhcF9leHRlcm5hbC5GaWxlTG9hZGVyLmxvYWRfbW9kdWxlIn0sCisgICAgICAgICgzLCA3LCAwKTogeworICAgICAgICAgICAgInN5cy5zZXRfY29yb3V0aW5lX3dyYXBwZXIiLAorICAgICAgICAgICAgInN5cy5nZXRfY29yb3V0aW5lX3dyYXBwZXIiLAorICAgICAgICAgICAgImFpZmMub3BlbmZwIiwKKyAgICAgICAgICAgICJhc3luY2lvLlRhc2suY3VycmVudF90YXNrIiwKKyAgICAgICAgICAgICJhc3luY2lvLlRhc2suYWxsX3Rhc2siLAorICAgICAgICAgICAgImxvY2FsZS5mb3JtYXQiLAorICAgICAgICAgICAgInNzbC53cmFwX3NvY2tldCIsCisgICAgICAgICAgICAic3VuYXUub3BlbmZwIiwKKyAgICAgICAgICAgICJ3YXZlLm9wZW5mcCIsCisgICAgICAgIH0sCisgICAgICAgICgzLCA4LCAwKTogeworICAgICAgICAgICAgImdldHRleHQubGdldHRleHQiLAorICAgICAgICAgICAgImdldHRleHQubGRnZXR0ZXh0IiwKKyAgICAgICAgICAgICJnZXR0ZXh0LmxuZ2V0dGV4dCIsCisgICAgICAgICAgICAiZ2V0dGV4dC5sZG5nZXR0ZXh0IiwKKyAgICAgICAgICAgICJnZXR0ZXh0LmJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0IiwKKyAgICAgICAgICAgICJnZXR0ZXh0Lk51bGxUcmFuc2xhdGlvbnMub3V0cHV0X2NoYXJzZXQiLAorICAgICAgICAgICAgImdldHRleHQuTnVsbFRyYW5zbGF0aW9ucy5zZXRfb3V0cHV0X2NoYXJzZXQiLAorICAgICAgICAgICAgInRocmVhZGluZy5UaHJlYWQuaXNBbGl2ZSIsCisgICAgICAgIH0sCisgICAgICAgICgzLCA5LCAwKTogeworICAgICAgICAgICAgImJpbmFzY2lpLmIyYV9ocXgiLAorICAgICAgICAgICAgImJpbmFzY2lpLmEyYl9ocXgiLAorICAgICAgICAgICAgImJpbmFzY2lpLnJsZWNvZGVfaHF4IiwKKyAgICAgICAgICAgICJiaW5hc2NpaS5ybGVkZWNvZGVfaHF4IiwKKyAgICAgICAgfSwKKyAgICAgICAgKDMsIDEwLCAwKTogeworICAgICAgICAgICAgIl9zcWxpdGUzLmVuYWJsZV9zaGFyZWRfY2FjaGUiLAorICAgICAgICAgICAgInBhdGhsaWIuUGF0aC5saW5rX3RvIiwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisKK0RFUFJFQ0FURURfQ0xBU1NFUyA9IHsKKyAgICAoMywgMywgMCk6IHsKKyAgICAgICAgImltcG9ydGxpYi5hYmMiOiB7CisgICAgICAgICAgICAiRmluZGVyIiwKKyAgICAgICAgfSwKKyAgICAgICAgInBrZ3V0aWwiOiB7CisgICAgICAgICAgICAiSW1wSW1wb3J0ZXIiLAorICAgICAgICAgICAgIkltcExvYWRlciIsCisgICAgICAgIH0sCisgICAgICAgICJjb2xsZWN0aW9ucyI6IHsKKyAgICAgICAgICAgICJBd2FpdGFibGUiLAorICAgICAgICAgICAgIkNvcm91dGluZSIsCisgICAgICAgICAgICAiQXN5bmNJdGVyYWJsZSIsCisgICAgICAgICAgICAiQXN5bmNJdGVyYXRvciIsCisgICAgICAgICAgICAiQXN5bmNHZW5lcmF0b3IiLAorICAgICAgICAgICAgIkhhc2hhYmxlIiwKKyAgICAgICAgICAgICJJdGVyYWJsZSIsCisgICAgICAgICAgICAiSXRlcmF0b3IiLAorICAgICAgICAgICAgIkdlbmVyYXRvciIsCisgICAgICAgICAgICAiUmV2ZXJzaWJsZSIsCisgICAgICAgICAgICAiU2l6ZWQiLAorICAgICAgICAgICAgIkNvbnRhaW5lciIsCisgICAgICAgICAgICAiQ2FsbGFibGUiLAorICAgICAgICAgICAgIkNvbGxlY3Rpb24iLAorICAgICAgICAgICAgIlNldCIsCisgICAgICAgICAgICAiTXV0YWJsZVNldCIsCisgICAgICAgICAgICAiTWFwcGluZyIsCisgICAgICAgICAgICAiTXV0YWJsZU1hcHBpbmciLAorICAgICAgICAgICAgIk1hcHBpbmdWaWV3IiwKKyAgICAgICAgICAgICJLZXlzVmlldyIsCisgICAgICAgICAgICAiSXRlbXNWaWV3IiwKKyAgICAgICAgICAgICJWYWx1ZXNWaWV3IiwKKyAgICAgICAgICAgICJTZXF1ZW5jZSIsCisgICAgICAgICAgICAiTXV0YWJsZVNlcXVlbmNlIiwKKyAgICAgICAgICAgICJCeXRlU3RyaW5nIiwKKyAgICAgICAgfSwKKyAgICB9LAorICAgICgzLCA5LCAwKTogeworICAgICAgICAic210cGQiOiB7CisgICAgICAgICAgICAiTWFpbG1hblByb3h5IiwKKyAgICAgICAgfQorICAgIH0sCit9CisKKworZGVmIF9jaGVja19tb2RlX3N0cihtb2RlKToKKyAgICAjIGNoZWNrIHR5cGUKKyAgICBpZiBub3QgaXNpbnN0YW5jZShtb2RlLCBzdHIpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjIGNoZWNrIHN5bnRheAorICAgIG1vZGVzID0gc2V0KG1vZGUpCisgICAgX21vZGUgPSAicndhdGIrVXgiCisgICAgY3JlYXRpbmcgPSAieCIgaW4gbW9kZXMKKyAgICBpZiBtb2RlcyAtIHNldChfbW9kZSkgb3IgbGVuKG1vZGUpID4gbGVuKG1vZGVzKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgIyBjaGVjayBsb2dpYworICAgIHJlYWRpbmcgPSAiciIgaW4gbW9kZXMKKyAgICB3cml0aW5nID0gInciIGluIG1vZGVzCisgICAgYXBwZW5kaW5nID0gImEiIGluIG1vZGVzCisgICAgdGV4dCA9ICJ0IiBpbiBtb2RlcworICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlcworICAgIGlmICJVIiBpbiBtb2RlczoKKyAgICAgICAgaWYgd3JpdGluZyBvciBhcHBlbmRpbmcgb3IgY3JlYXRpbmc6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmVhZGluZyA9IFRydWUKKyAgICBpZiB0ZXh0IGFuZCBiaW5hcnk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHRvdGFsID0gcmVhZGluZyArIHdyaXRpbmcgKyBhcHBlbmRpbmcgKyBjcmVhdGluZworICAgIGlmIHRvdGFsID4gMToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbm90IChyZWFkaW5nIG9yIHdyaXRpbmcgb3IgYXBwZW5kaW5nIG9yIGNyZWF0aW5nKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBTdGRsaWJDaGVja2VyKERlcHJlY2F0ZWRNaXhpbiwgQmFzZUNoZWNrZXIpOgorICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisgICAgbmFtZSA9ICJzdGRsaWIiCisKKyAgICBtc2dzID0geworICAgICAgICAiVzE1MDEiOiAoCisgICAgICAgICAgICAnIiVzIiBpcyBub3QgYSB2YWxpZCBtb2RlIGZvciBvcGVuLicsCisgICAgICAgICAgICAiYmFkLW9wZW4tbW9kZSIsCisgICAgICAgICAgICAiUHl0aG9uIHN1cHBvcnRzOiByLCB3LCBhWywgeF0gbW9kZXMgd2l0aCBiLCArLCAiCisgICAgICAgICAgICAiYW5kIFUgKG9ubHkgd2l0aCByKSBvcHRpb25zLiAiCisgICAgICAgICAgICAiU2VlIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzIvbGlicmFyeS9mdW5jdGlvbnMuaHRtbCNvcGVuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNTAyIjogKAorICAgICAgICAgICAgIlVzaW5nIGRhdGV0aW1lLnRpbWUgaW4gYSBib29sZWFuIGNvbnRleHQuIiwKKyAgICAgICAgICAgICJib29sZWFuLWRhdGV0aW1lIiwKKyAgICAgICAgICAgICJVc2luZyBkYXRldGltZS50aW1lIGluIGEgYm9vbGVhbiBjb250ZXh0IGNhbiBoaWRlICIKKyAgICAgICAgICAgICJzdWJ0bGUgYnVncyB3aGVuIHRoZSB0aW1lIHRoZXkgcmVwcmVzZW50IG1hdGNoZXMgIgorICAgICAgICAgICAgIm1pZG5pZ2h0IFVUQy4gVGhpcyBiZWhhdmlvdXIgd2FzIGZpeGVkIGluIFB5dGhvbiAzLjUuICIKKyAgICAgICAgICAgICJTZWUgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMzkzNiBmb3IgcmVmZXJlbmNlLiIsCisgICAgICAgICAgICB7Im1heHZlcnNpb24iOiAoMywgNSl9LAorICAgICAgICApLAorICAgICAgICAiVzE1MDMiOiAoCisgICAgICAgICAgICAiUmVkdW5kYW50IHVzZSBvZiAlcyB3aXRoIGNvbnN0YW50IHZhbHVlICVyIiwKKyAgICAgICAgICAgICJyZWR1bmRhbnQtdW5pdHRlc3QtYXNzZXJ0IiwKKyAgICAgICAgICAgICJUaGUgZmlyc3QgYXJndW1lbnQgb2YgYXNzZXJ0VHJ1ZSBhbmQgYXNzZXJ0RmFsc2UgaXMgIgorICAgICAgICAgICAgImEgY29uZGl0aW9uLiBJZiBhIGNvbnN0YW50IGlzIHBhc3NlZCBhcyBwYXJhbWV0ZXIsIHRoYXQgIgorICAgICAgICAgICAgImNvbmRpdGlvbiB3aWxsIGJlIGFsd2F5cyB0cnVlLiBJbiB0aGlzIGNhc2UgYSB3YXJuaW5nICIKKyAgICAgICAgICAgICJzaG91bGQgYmUgZW1pdHRlZC4iLAorICAgICAgICApLAorICAgICAgICAiVzE1MDUiOiAoCisgICAgICAgICAgICAiVXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgJXMoKSIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC1tZXRob2QiLAorICAgICAgICAgICAgIlRoZSBtZXRob2QgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAiYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24uIENvbnNpZGVyIGxvb2tpbmcgZm9yIGFuICIKKyAgICAgICAgICAgICJhbHRlcm5hdGl2ZSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4iLAorICAgICAgICApLAorICAgICAgICAiVzE1MDYiOiAoCisgICAgICAgICAgICAidGhyZWFkaW5nLlRocmVhZCBuZWVkcyB0aGUgdGFyZ2V0IGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICJiYWQtdGhyZWFkLWluc3RhbnRpYXRpb24iLAorICAgICAgICAgICAgIlRoZSB3YXJuaW5nIGlzIGVtaXR0ZWQgd2hlbiBhIHRocmVhZGluZy5UaHJlYWQgY2xhc3MgIgorICAgICAgICAgICAgImlzIGluc3RhbnRpYXRlZCB3aXRob3V0IHRoZSB0YXJnZXQgZnVuY3Rpb24gYmVpbmcgcGFzc2VkLiAiCisgICAgICAgICAgICAiQnkgZGVmYXVsdCwgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZ3JvdXAgcGFyYW0sIG5vdCB0aGUgdGFyZ2V0IHBhcmFtLiAiLAorICAgICAgICApLAorICAgICAgICAiVzE1MDciOiAoCisgICAgICAgICAgICAiVXNpbmcgY29weS5jb3B5KG9zLmVudmlyb24pLiBVc2Ugb3MuZW52aXJvbi5jb3B5KCkgaW5zdGVhZC4gIiwKKyAgICAgICAgICAgICJzaGFsbG93LWNvcHktZW52aXJvbiIsCisgICAgICAgICAgICAib3MuZW52aXJvbiBpcyBub3QgYSBkaWN0IG9iamVjdCBidXQgcHJveHkgb2JqZWN0LCBzbyAiCisgICAgICAgICAgICAic2hhbGxvdyBjb3B5IGhhcyBzdGlsbCBlZmZlY3RzIG9uIG9yaWdpbmFsIG9iamVjdC4gIgorICAgICAgICAgICAgIlNlZSBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1MzczIGZvciByZWZlcmVuY2UuICIsCisgICAgICAgICksCisgICAgICAgICJFMTUwNyI6ICgKKyAgICAgICAgICAgICIlcyBkb2VzIG5vdCBzdXBwb3J0ICVzIHR5cGUgYXJndW1lbnQiLAorICAgICAgICAgICAgImludmFsaWQtZW52dmFyLXZhbHVlIiwKKyAgICAgICAgICAgICJFbnYgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBzdXBwb3J0IG9ubHkgc3RyaW5nIHR5cGUgYXJndW1lbnRzLiAiCisgICAgICAgICAgICAiU2VlIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9vcy5odG1sI29zLmdldGVudi4gIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNTA4IjogKAorICAgICAgICAgICAgIiVzIGRlZmF1bHQgdHlwZSBpcyAlcy4gRXhwZWN0ZWQgc3RyIG9yIE5vbmUuIiwKKyAgICAgICAgICAgICJpbnZhbGlkLWVudnZhci1kZWZhdWx0IiwKKyAgICAgICAgICAgICJFbnYgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyByZXR1cm4gTm9uZSBvciBzdHIgdmFsdWVzLiAiCisgICAgICAgICAgICAiU3VwcGx5aW5nIGFueXRoaW5nIGRpZmZlcmVudCBhcyBhIGRlZmF1bHQgbWF5IGNhdXNlIGJ1Z3MuICIKKyAgICAgICAgICAgICJTZWUgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L29zLmh0bWwjb3MuZ2V0ZW52LiAiLAorICAgICAgICApLAorICAgICAgICAiVzE1MDkiOiAoCisgICAgICAgICAgICAiVXNpbmcgcHJlZXhlY19mbiBrZXl3b3JkIHdoaWNoIG1heSBiZSB1bnNhZmUgaW4gdGhlIHByZXNlbmNlICIKKyAgICAgICAgICAgICJvZiB0aHJlYWRzIiwKKyAgICAgICAgICAgICJzdWJwcm9jZXNzLXBvcGVuLXByZWV4ZWMtZm4iLAorICAgICAgICAgICAgIlRoZSBwcmVleGVjX2ZuIHBhcmFtZXRlciBpcyBub3Qgc2FmZSB0byB1c2UgaW4gdGhlIHByZXNlbmNlICIKKyAgICAgICAgICAgICJvZiB0aHJlYWRzIGluIHlvdXIgYXBwbGljYXRpb24uIFRoZSBjaGlsZCBwcm9jZXNzIGNvdWxkICIKKyAgICAgICAgICAgICJkZWFkbG9jayBiZWZvcmUgZXhlYyBpcyBjYWxsZWQuIElmIHlvdSBtdXN0IHVzZSBpdCwga2VlcCBpdCAiCisgICAgICAgICAgICAidHJpdmlhbCEgTWluaW1pemUgdGhlIG51bWJlciBvZiBsaWJyYXJpZXMgeW91IGNhbGwgaW50by4iCisgICAgICAgICAgICAiaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3N1YnByb2Nlc3MuaHRtbCNwb3Blbi1jb25zdHJ1Y3RvciIsCisgICAgICAgICksCisgICAgICAgICJXMTUxMCI6ICgKKyAgICAgICAgICAgICJVc2luZyBzdWJwcm9jZXNzLnJ1biB3aXRob3V0IGV4cGxpY2l0bHkgc2V0IGBjaGVja2AgaXMgbm90IHJlY29tbWVuZGVkLiIsCisgICAgICAgICAgICAic3VicHJvY2Vzcy1ydW4tY2hlY2siLAorICAgICAgICAgICAgIlRoZSBjaGVjayBwYXJhbWV0ZXIgc2hvdWxkIGFsd2F5cyBiZSB1c2VkIHdpdGggZXhwbGljaXRseSBzZXQgIgorICAgICAgICAgICAgImBjaGVja2Aga2V5d29yZCB0byBtYWtlIGNsZWFyIHdoYXQgdGhlIGVycm9yLWhhbmRsaW5nIGJlaGF2aW9yIGlzLiIKKyAgICAgICAgICAgICJodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvc3VicHJvY2Vzcy5odG1sI3N1YnByb2Nlc3MucnVuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNTExIjogKAorICAgICAgICAgICAgIlVzaW5nIGRlcHJlY2F0ZWQgYXJndW1lbnQgJXMgb2YgbWV0aG9kICVzKCkiLAorICAgICAgICAgICAgImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgIlRoZSBhcmd1bWVudCBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNTEyIjogKAorICAgICAgICAgICAgIlVzaW5nIGRlcHJlY2F0ZWQgY2xhc3MgJXMgb2YgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICJkZXByZWNhdGVkLWNsYXNzIiwKKyAgICAgICAgICAgICJUaGUgY2xhc3MgaXMgbWFya2VkIGFzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiIsCisgICAgICAgICksCisgICAgICAgICJXMTUxMyI6ICgKKyAgICAgICAgICAgICJVc2luZyBkZXByZWNhdGVkIGRlY29yYXRvciAlcygpIiwKKyAgICAgICAgICAgICJkZXByZWNhdGVkLWRlY29yYXRvciIsCisgICAgICAgICAgICAiVGhlIGRlY29yYXRvciBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIiwKKyAgICAgICAgKSwKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGludGVyPU5vbmUpOgorICAgICAgICBCYXNlQ2hlY2tlci5fX2luaXRfXyhzZWxmLCBsaW50ZXIpCisgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfbWV0aG9kcyA9IHNldCgpCisgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfbWV0aG9kcy51cGRhdGUoREVQUkVDQVRFRF9NRVRIT0RTWzBdKQorICAgICAgICBmb3Igc2luY2VfdmVycywgZnVuY19saXN0IGluIERFUFJFQ0FURURfTUVUSE9EU1tzeXMudmVyc2lvbl9pbmZvWzBdXS5pdGVtcygpOgorICAgICAgICAgICAgaWYgc2luY2VfdmVycyA8PSBzeXMudmVyc2lvbl9pbmZvOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfbWV0aG9kcy51cGRhdGUoZnVuY19saXN0KQorICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2F0dHJpYnV0ZXMgPSBkaWN0KCkKKyAgICAgICAgZm9yIHNpbmNlX3ZlcnMsIGZ1bmNfbGlzdCBpbiBERVBSRUNBVEVEX0FSR1VNRU5UUy5pdGVtcygpOgorICAgICAgICAgICAgaWYgc2luY2VfdmVycyA8PSBzeXMudmVyc2lvbl9pbmZvOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXR0cmlidXRlcy51cGRhdGUoZnVuY19saXN0KQorICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2NsYXNzZXMgPSBkaWN0KCkKKyAgICAgICAgZm9yIHNpbmNlX3ZlcnMsIGNsYXNzX2xpc3QgaW4gREVQUkVDQVRFRF9DTEFTU0VTLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBzaW5jZV92ZXJzIDw9IHN5cy52ZXJzaW9uX2luZm86CisgICAgICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9jbGFzc2VzLnVwZGF0ZShjbGFzc19saXN0KQorICAgICAgICBzZWxmLl9kZXByZWNhdGVkX21vZHVsZXMgPSBzZXQoKQorICAgICAgICBmb3Igc2luY2VfdmVycywgbW9kX2xpc3QgaW4gREVQUkVDQVRFRF9NT0RVTEVTLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBzaW5jZV92ZXJzIDw9IHN5cy52ZXJzaW9uX2luZm86CisgICAgICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9tb2R1bGVzLnVwZGF0ZShtb2RfbGlzdCkKKyAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9kZWNvcmF0b3JzID0gc2V0KCkKKyAgICAgICAgZm9yIHNpbmNlX3ZlcnMsIGRlY29yYXRvcl9saXN0IGluIERFUFJFQ0FURURfREVDT1JBVE9SUy5pdGVtcygpOgorICAgICAgICAgICAgaWYgc2luY2VfdmVycyA8PSBzeXMudmVyc2lvbl9pbmZvOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfZGVjb3JhdG9ycy51cGRhdGUoZGVjb3JhdG9yX2xpc3QpCisKKyAgICBkZWYgX2NoZWNrX2JhZF90aHJlYWRfaW5zdGFudGlhdGlvbihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IG5vZGUua3dhcmdzIGFuZCBub3Qgbm9kZS5rZXl3b3JkcyBhbmQgbGVuKG5vZGUuYXJncykgPD0gMToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImJhZC10aHJlYWQtaW5zdGFudGlhdGlvbiIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfZm9yX3ByZWV4ZWNfZm5faW5fcG9wZW4oc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUua2V5d29yZHM6CisgICAgICAgICAgICBmb3Iga2V5d29yZCBpbiBub2RlLmtleXdvcmRzOgorICAgICAgICAgICAgICAgIGlmIGtleXdvcmQuYXJnID09ICJwcmVleGVjX2ZuIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic3VicHJvY2Vzcy1wb3Blbi1wcmVleGVjLWZuIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19mb3JfY2hlY2tfa3dfaW5fcnVuKHNlbGYsIG5vZGUpOgorICAgICAgICBrd2FyZ3MgPSB7a2V5d29yZC5hcmcgZm9yIGtleXdvcmQgaW4gKG5vZGUua2V5d29yZHMgb3IgKCkpfQorICAgICAgICBpZiAiY2hlY2siIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJzdWJwcm9jZXNzLXJ1bi1jaGVjayIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfc2hhbGxvd19jb3B5X2Vudmlyb24oc2VsZiwgbm9kZSk6CisgICAgICAgIGFyZyA9IHV0aWxzLmdldF9hcmd1bWVudF9mcm9tX2NhbGwobm9kZSwgcG9zaXRpb249MCkKKyAgICAgICAgZm9yIGluZmVycmVkIGluIGFyZy5pbmZlcnJlZCgpOgorICAgICAgICAgICAgaWYgaW5mZXJyZWQucW5hbWUoKSA9PSBPU19FTlZJUk9OOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInNoYWxsb3ctY29weS1lbnZpcm9uIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJiYWQtb3Blbi1tb2RlIiwKKyAgICAgICAgInJlZHVuZGFudC11bml0dGVzdC1hc3NlcnQiLAorICAgICAgICAiZGVwcmVjYXRlZC1tZXRob2QiLAorICAgICAgICAiZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICJiYWQtdGhyZWFkLWluc3RhbnRpYXRpb24iLAorICAgICAgICAic2hhbGxvdy1jb3B5LWVudmlyb24iLAorICAgICAgICAiaW52YWxpZC1lbnZ2YXItdmFsdWUiLAorICAgICAgICAiaW52YWxpZC1lbnZ2YXItZGVmYXVsdCIsCisgICAgICAgICJzdWJwcm9jZXNzLXBvcGVuLXByZWV4ZWMtZm4iLAorICAgICAgICAic3VicHJvY2Vzcy1ydW4tY2hlY2siLAorICAgICAgICAiZGVwcmVjYXRlZC1jbGFzcyIsCisgICAgKQorICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJWaXNpdCBhIENhbGwgbm9kZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jaGVja19kZXByZWNhdGVkX2NsYXNzX2luX2NhbGwobm9kZSkKKyAgICAgICAgICAgIGZvciBpbmZlcnJlZCBpbiBub2RlLmZ1bmMuaW5mZXIoKToKKyAgICAgICAgICAgICAgICBpZiBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGluZmVycmVkLnJvb3QoKS5uYW1lID09IE9QRU5fTU9EVUxFOgorICAgICAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKG5vZGUuZnVuYywgIm5hbWUiLCBOb25lKSBpbiBPUEVOX0ZJTEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfb3Blbl9tb2RlKG5vZGUpCisgICAgICAgICAgICAgICAgZWxpZiBpbmZlcnJlZC5yb290KCkubmFtZSA9PSBVTklUVEVTVF9DQVNFOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZWR1bmRhbnRfYXNzZXJ0KG5vZGUsIGluZmVycmVkKQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICAgICAgICAgIGlmIGluZmVycmVkLnFuYW1lKCkgPT0gVEhSRUFESU5HX1RIUkVBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2JhZF90aHJlYWRfaW5zdGFudGlhdGlvbihub2RlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGluZmVycmVkLnFuYW1lKCkgPT0gU1VCUFJPQ0VTU19QT1BFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2Zvcl9wcmVleGVjX2ZuX2luX3BvcGVuKG5vZGUpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGluZmVycmVkLnFuYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSBDT1BZX0NPUFk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19zaGFsbG93X2NvcHlfZW52aXJvbihub2RlKQorICAgICAgICAgICAgICAgICAgICBlbGlmIG5hbWUgaW4gRU5WX0dFVFRFUlM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19lbnZfZnVuY3Rpb24obm9kZSwgaW5mZXJyZWQpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSBTVUJQUk9DRVNTX1JVTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2Zvcl9jaGVja19rd19pbl9ydW4obm9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2RlcHJlY2F0ZWRfbWV0aG9kKG5vZGUsIGluZmVycmVkKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJib29sZWFuLWRhdGV0aW1lIikKKyAgICBkZWYgdmlzaXRfdW5hcnlvcChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZS5vcCA9PSAibm90IjoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2RhdGV0aW1lKG5vZGUub3BlcmFuZCkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiYm9vbGVhbi1kYXRldGltZSIpCisgICAgZGVmIHZpc2l0X2lmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19kYXRldGltZShub2RlLnRlc3QpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImJvb2xlYW4tZGF0ZXRpbWUiKQorICAgIGRlZiB2aXNpdF9pZmV4cChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZGF0ZXRpbWUobm9kZS50ZXN0KQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJib29sZWFuLWRhdGV0aW1lIikKKyAgICBkZWYgdmlzaXRfYm9vbG9wKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgdmFsdWUgaW4gbm9kZS52YWx1ZXM6CisgICAgICAgICAgICBzZWxmLl9jaGVja19kYXRldGltZSh2YWx1ZSkKKworICAgIGRlZiBfY2hlY2tfcmVkdW5kYW50X2Fzc2VydChzZWxmLCBub2RlLCBpbmZlcik6CisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoaW5mZXIsIGFzdHJvaWQuQm91bmRNZXRob2QpCisgICAgICAgICAgICBhbmQgbm9kZS5hcmdzCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmFyZ3NbMF0sIGFzdHJvaWQuQ29uc3QpCisgICAgICAgICAgICBhbmQgaW5mZXIubmFtZSBpbiBbImFzc2VydFRydWUiLCAiYXNzZXJ0RmFsc2UiXQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAicmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydCIsCisgICAgICAgICAgICAgICAgYXJncz0oaW5mZXIubmFtZSwgbm9kZS5hcmdzWzBdLnZhbHVlKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX2RhdGV0aW1lKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGEgZGF0ZXRpbWUgd2FzIGluZmVycmVkLgorICAgICAgICBJZiBzbywgZW1pdCBib29sZWFuLWRhdGV0aW1lIHdhcm5pbmcuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmZlcnJlZCA9IG5leHQobm9kZS5pbmZlcigpKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkluc3RhbmNlKQorICAgICAgICAgICAgYW5kIGluZmVycmVkLnFuYW1lKCkgPT0gImRhdGV0aW1lLnRpbWUiCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJib29sZWFuLWRhdGV0aW1lIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19vcGVuX21vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgdGhlIG1vZGUgYXJndW1lbnQgb2YgYW4gb3BlbiBvciBmaWxlIGNhbGwgaXMgdmFsaWQuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZGVfYXJnID0gdXRpbHMuZ2V0X2FyZ3VtZW50X2Zyb21fY2FsbChub2RlLCBwb3NpdGlvbj0xLCBrZXl3b3JkPSJtb2RlIikKKyAgICAgICAgZXhjZXB0IHV0aWxzLk5vU3VjaEFyZ3VtZW50RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbW9kZV9hcmc6CisgICAgICAgICAgICBtb2RlX2FyZyA9IHV0aWxzLnNhZmVfaW5mZXIobW9kZV9hcmcpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG1vZGVfYXJnLCBhc3Ryb2lkLkNvbnN0KSBhbmQgbm90IF9jaGVja19tb2RlX3N0cigKKyAgICAgICAgICAgICAgICBtb2RlX2FyZy52YWx1ZQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJiYWQtb3Blbi1tb2RlIiwgbm9kZT1ub2RlLCBhcmdzPW1vZGVfYXJnLnZhbHVlKQorCisgICAgZGVmIF9jaGVja19lbnZfZnVuY3Rpb24oc2VsZiwgbm9kZSwgaW5mZXIpOgorICAgICAgICBlbnZfbmFtZV9rd2FyZyA9ICJrZXkiCisgICAgICAgIGVudl92YWx1ZV9rd2FyZyA9ICJkZWZhdWx0IgorICAgICAgICBpZiBub2RlLmtleXdvcmRzOgorICAgICAgICAgICAga3dhcmdzID0ge2tleXdvcmQuYXJnOiBrZXl3b3JkLnZhbHVlIGZvciBrZXl3b3JkIGluIG5vZGUua2V5d29yZHN9CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrd2FyZ3MgPSBOb25lCisgICAgICAgIGlmIG5vZGUuYXJnczoKKyAgICAgICAgICAgIGVudl9uYW1lX2FyZyA9IG5vZGUuYXJnc1swXQorICAgICAgICBlbGlmIGt3YXJncyBhbmQgZW52X25hbWVfa3dhcmcgaW4ga3dhcmdzOgorICAgICAgICAgICAgZW52X25hbWVfYXJnID0ga3dhcmdzW2Vudl9uYW1lX2t3YXJnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52X25hbWVfYXJnID0gTm9uZQorCisgICAgICAgIGlmIGVudl9uYW1lX2FyZzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludmFsaWRfZW52dmFyX3ZhbHVlKAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbnZhbGlkLWVudnZhci12YWx1ZSIsCisgICAgICAgICAgICAgICAgY2FsbF9hcmc9dXRpbHMuc2FmZV9pbmZlcihlbnZfbmFtZV9hcmcpLAorICAgICAgICAgICAgICAgIGluZmVyPWluZmVyLAorICAgICAgICAgICAgICAgIGFsbG93X25vbmU9RmFsc2UsCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgbGVuKG5vZGUuYXJncykgPT0gMjoKKyAgICAgICAgICAgIGVudl92YWx1ZV9hcmcgPSBub2RlLmFyZ3NbMV0KKyAgICAgICAgZWxpZiBrd2FyZ3MgYW5kIGVudl92YWx1ZV9rd2FyZyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBlbnZfdmFsdWVfYXJnID0ga3dhcmdzW2Vudl92YWx1ZV9rd2FyZ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudl92YWx1ZV9hcmcgPSBOb25lCisKKyAgICAgICAgaWYgZW52X3ZhbHVlX2FyZzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludmFsaWRfZW52dmFyX3ZhbHVlKAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBpbmZlcj1pbmZlciwKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbnZhbGlkLWVudnZhci1kZWZhdWx0IiwKKyAgICAgICAgICAgICAgICBjYWxsX2FyZz11dGlscy5zYWZlX2luZmVyKGVudl92YWx1ZV9hcmcpLAorICAgICAgICAgICAgICAgIGFsbG93X25vbmU9VHJ1ZSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfaW52YWxpZF9lbnZ2YXJfdmFsdWUoc2VsZiwgbm9kZSwgaW5mZXIsIG1lc3NhZ2UsIGNhbGxfYXJnLCBhbGxvd19ub25lKToKKyAgICAgICAgaWYgY2FsbF9hcmcgaW4gKGFzdHJvaWQuVW5pbmZlcmFibGUsIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbmFtZSA9IGluZmVyLnFuYW1lKCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjYWxsX2FyZywgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICBlbWl0ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGNhbGxfYXJnLnZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZW1pdCA9IG5vdCBhbGxvd19ub25lCisgICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGNhbGxfYXJnLnZhbHVlLCBzdHIpOgorICAgICAgICAgICAgICAgIGVtaXQgPSBUcnVlCisgICAgICAgICAgICBpZiBlbWl0OgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UobWVzc2FnZSwgbm9kZT1ub2RlLCBhcmdzPShuYW1lLCBjYWxsX2FyZy5weXR5cGUoKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1lc3NhZ2UsIG5vZGU9bm9kZSwgYXJncz0obmFtZSwgY2FsbF9hcmcucHl0eXBlKCkpKQorCisgICAgZGVmIGRlcHJlY2F0ZWRfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgIiIiQ2FsbGJhY2sgcmV0dXJuaW5nIHRoZSBkZXByZWNhdGVkIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kZXByZWNhdGVkX21vZHVsZXMKKworICAgIGRlZiBkZXByZWNhdGVkX21ldGhvZHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZXByZWNhdGVkX21ldGhvZHMKKworICAgIGRlZiBkZXByZWNhdGVkX2FyZ3VtZW50cyhzZWxmLCBtZXRob2Q6IHN0cik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZXByZWNhdGVkX2F0dHJpYnV0ZXMuZ2V0KG1ldGhvZCwgKCkpCisKKyAgICBkZWYgZGVwcmVjYXRlZF9jbGFzc2VzKHNlbGYsIG1vZHVsZTogc3RyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlcHJlY2F0ZWRfY2xhc3Nlcy5nZXQobW9kdWxlLCAoKSkKKworICAgIGRlZiBkZXByZWNhdGVkX2RlY29yYXRvcnMoc2VsZikgLT4gSXRlcmFibGU6CisgICAgICAgIHJldHVybiBzZWxmLl9kZXByZWNhdGVkX2RlY29yYXRvcnMKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihTdGRsaWJDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY2hlY2tlcnMvc3RyaW5ncy5weSBiL3B5bGludC9jaGVja2Vycy9zdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzhjODgKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvc3RyaW5ncy5weQpAQCAtMCwwICsxLDk4MSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMCBEYW5pZWwgSGFyZGluZyA8ZGhhcmRpbmdAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFJlbmUgWmhhbmcgPHJ6OTlAY29ybmVsbC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IEpha3ViIFdpbGsgPGp3aWxrQGp3aWxrLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IFBldGVyIERhd3luZHQgPFBldGVyLkRhd3luZHRAVUdlbnQuYmU+CisjIENvcHlyaWdodCAoYykgMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgsIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEx1Y2FzIENpbW9uIDxsdWNhcy5jaW1vbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBbGFuIENoYW4gPGFjaGFuOTYxMTE3QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFl1cnkgR3JpYm92IDx0ZXRyYTIwMDVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTmljayBEcm96ZCA8bmljaG9sYXNkcm96ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgV2VzIFR1cm5lciA8d2VzdHVybmVyQGdvb2dsZS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBEamFpbGxhIDxiYXN0aWVuLnZhbGxldEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIE1hdHRoZXcgU3VvenpvIDxtc3VvenpvQGdvb2dsZS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCDosK3kuZ3pvI4gPDEwOTIyNDU3M0BxcS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IDx0YW5hbnRAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyYyBNdWVsbGVyIDwzMDEzMDM3MStjZGNlOHBAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgUGV0ZXIgS29sYnVzIDxwZXRlci5rb2xidXNAZ2FybWluLmNvbT4KKworCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIkNoZWNrZXIgZm9yIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbnMuCisiIiIKKworaW1wb3J0IGJ1aWx0aW5zCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBudW1iZXJzCitpbXBvcnQgcmUKK2ltcG9ydCB0b2tlbml6ZQorZnJvbSB0eXBpbmcgaW1wb3J0IFRZUEVfQ0hFQ0tJTkcsIEl0ZXJhYmxlCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlciwgQmFzZVRva2VuQ2hlY2tlciwgdXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBjaGVja19tZXNzYWdlcworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyLCBJUmF3Q2hlY2tlciwgSVRva2VuQ2hlY2tlcgorCitpZiBUWVBFX0NIRUNLSU5HOgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBDb3VudGVyICAjIHR5cGluZy5Db3VudGVyIGFkZGVkIGluIFB5dGhvbiAzLjYuMQorCitfQVNUX05PREVfU1RSX1RZUEVTID0gKCJfX2J1aWx0aW5fXy51bmljb2RlIiwgIl9fYnVpbHRpbl9fLnN0ciIsICJidWlsdGlucy5zdHIiKQorIyBQcmVmaXhlcyBmb3IgYm90aCBzdHJpbmdzIGFuZCBieXRlcyBsaXRlcmFscyBwZXIKKyMgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5odG1sI3N0cmluZy1hbmQtYnl0ZXMtbGl0ZXJhbHMKK19QUkVGSVhFUyA9IHsKKyAgICAiciIsCisgICAgInUiLAorICAgICJSIiwKKyAgICAiVSIsCisgICAgImYiLAorICAgICJGIiwKKyAgICAiZnIiLAorICAgICJGciIsCisgICAgImZSIiwKKyAgICAiRlIiLAorICAgICJyZiIsCisgICAgInJGIiwKKyAgICAiUmYiLAorICAgICJSRiIsCisgICAgImIiLAorICAgICJCIiwKKyAgICAiYnIiLAorICAgICJCciIsCisgICAgImJSIiwKKyAgICAiQlIiLAorICAgICJyYiIsCisgICAgInJCIiwKKyAgICAiUmIiLAorICAgICJSQiIsCit9CitTSU5HTEVfUVVPVEVEX1JFR0VYID0gcmUuY29tcGlsZSgiKCVzKT8nJyciICUgInwiLmpvaW4oX1BSRUZJWEVTKSkKK0RPVUJMRV9RVU9URURfUkVHRVggPSByZS5jb21waWxlKCcoJXMpPyIiIicgJSAifCIuam9pbihfUFJFRklYRVMpKQorUVVPVEVfREVMSU1JVEVSX1JFR0VYID0gcmUuY29tcGlsZSgiKCVzKT8oXCJ8JykiICUgInwiLmpvaW4oX1BSRUZJWEVTKSwgcmUuRE9UQUxMKQorCitNU0dTID0geyAgIyBweWxpbnQ6IGRpc2FibGU9Y29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3MKKyAgICAiRTEzMDAiOiAoCisgICAgICAgICJVbnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICVyICglIzAyeCkgYXQgaW5kZXggJWQiLAorICAgICAgICAiYmFkLWZvcm1hdC1jaGFyYWN0ZXIiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIHVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgaXMgdXNlZCBpbiBhIGZvcm1hdCBzdHJpbmcuIiwKKyAgICApLAorICAgICJFMTMwMSI6ICgKKyAgICAgICAgIkZvcm1hdCBzdHJpbmcgZW5kcyBpbiBtaWRkbGUgb2YgY29udmVyc2lvbiBzcGVjaWZpZXIiLAorICAgICAgICAidHJ1bmNhdGVkLWZvcm1hdC1zdHJpbmciLAorICAgICAgICAiVXNlZCB3aGVuIGEgZm9ybWF0IHN0cmluZyB0ZXJtaW5hdGVzIGJlZm9yZSB0aGUgZW5kIG9mIGEgIgorICAgICAgICAiY29udmVyc2lvbiBzcGVjaWZpZXIuIiwKKyAgICApLAorICAgICJFMTMwMiI6ICgKKyAgICAgICAgIk1peGluZyBuYW1lZCBhbmQgdW5uYW1lZCBjb252ZXJzaW9uIHNwZWNpZmllcnMgaW4gZm9ybWF0IHN0cmluZyIsCisgICAgICAgICJtaXhlZC1mb3JtYXQtc3RyaW5nIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYm90aCBuYW1lZCAoZS5nLiAnJShmb28pZCcpICIKKyAgICAgICAgImFuZCB1bm5hbWVkIChlLmcuICclZCcpIGNvbnZlcnNpb24gc3BlY2lmaWVycy4gIFRoaXMgaXMgYWxzbyAiCisgICAgICAgICJ1c2VkIHdoZW4gYSBuYW1lZCBjb252ZXJzaW9uIHNwZWNpZmllciBjb250YWlucyAqIGZvciB0aGUgIgorICAgICAgICAibWluaW11bSBmaWVsZCB3aWR0aCBhbmQvb3IgcHJlY2lzaW9uLiIsCisgICAgKSwKKyAgICAiRTEzMDMiOiAoCisgICAgICAgICJFeHBlY3RlZCBtYXBwaW5nIGZvciBmb3JtYXQgc3RyaW5nLCBub3QgJXMiLAorICAgICAgICAiZm9ybWF0LW5lZWRzLW1hcHBpbmciLAorICAgICAgICAiVXNlZCB3aGVuIGEgZm9ybWF0IHN0cmluZyB0aGF0IHVzZXMgbmFtZWQgY29udmVyc2lvbiBzcGVjaWZpZXJzICIKKyAgICAgICAgImlzIHVzZWQgd2l0aCBhbiBhcmd1bWVudCB0aGF0IGlzIG5vdCBhIG1hcHBpbmcuIiwKKyAgICApLAorICAgICJXMTMwMCI6ICgKKyAgICAgICAgIkZvcm1hdCBzdHJpbmcgZGljdGlvbmFyeSBrZXkgc2hvdWxkIGJlIGEgc3RyaW5nLCBub3QgJXMiLAorICAgICAgICAiYmFkLWZvcm1hdC1zdHJpbmcta2V5IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIG5hbWVkIGNvbnZlcnNpb24gc3BlY2lmaWVycyAiCisgICAgICAgICJpcyB1c2VkIHdpdGggYSBkaWN0aW9uYXJ5IHdob3NlIGtleXMgYXJlIG5vdCBhbGwgc3RyaW5ncy4iLAorICAgICksCisgICAgIlcxMzAxIjogKAorICAgICAgICAiVW51c2VkIGtleSAlciBpbiBmb3JtYXQgc3RyaW5nIGRpY3Rpb25hcnkiLAorICAgICAgICAidW51c2VkLWZvcm1hdC1zdHJpbmcta2V5IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIG5hbWVkIGNvbnZlcnNpb24gc3BlY2lmaWVycyAiCisgICAgICAgICJpcyB1c2VkIHdpdGggYSBkaWN0aW9uYXJ5IHRoYXQgY29udGFpbnMga2V5cyBub3QgcmVxdWlyZWQgYnkgdGhlICIKKyAgICAgICAgImZvcm1hdCBzdHJpbmcuIiwKKyAgICApLAorICAgICJFMTMwNCI6ICgKKyAgICAgICAgIk1pc3Npbmcga2V5ICVyIGluIGZvcm1hdCBzdHJpbmcgZGljdGlvbmFyeSIsCisgICAgICAgICJtaXNzaW5nLWZvcm1hdC1zdHJpbmcta2V5IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIG5hbWVkIGNvbnZlcnNpb24gc3BlY2lmaWVycyAiCisgICAgICAgICJpcyB1c2VkIHdpdGggYSBkaWN0aW9uYXJ5IHRoYXQgZG9lc24ndCBjb250YWluIGFsbCB0aGUga2V5cyAiCisgICAgICAgICJyZXF1aXJlZCBieSB0aGUgZm9ybWF0IHN0cmluZy4iLAorICAgICksCisgICAgIkUxMzA1IjogKAorICAgICAgICAiVG9vIG1hbnkgYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nIiwKKyAgICAgICAgInRvby1tYW55LWZvcm1hdC1hcmdzIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIHVubmFtZWQgY29udmVyc2lvbiAiCisgICAgICAgICJzcGVjaWZpZXJzIGlzIGdpdmVuIHRvbyBtYW55IGFyZ3VtZW50cy4iLAorICAgICksCisgICAgIkUxMzA2IjogKAorICAgICAgICAiTm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmciLAorICAgICAgICAidG9vLWZldy1mb3JtYXQtYXJncyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBmb3JtYXQgc3RyaW5nIHRoYXQgdXNlcyB1bm5hbWVkIGNvbnZlcnNpb24gIgorICAgICAgICAic3BlY2lmaWVycyBpcyBnaXZlbiB0b28gZmV3IGFyZ3VtZW50cyIsCisgICAgKSwKKyAgICAiRTEzMDciOiAoCisgICAgICAgICJBcmd1bWVudCAlciBkb2VzIG5vdCBtYXRjaCBmb3JtYXQgdHlwZSAlciIsCisgICAgICAgICJiYWQtc3RyaW5nLWZvcm1hdC10eXBlIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIHR5cGUgcmVxdWlyZWQgYnkgZm9ybWF0IHN0cmluZyAiCisgICAgICAgICJpcyBub3Qgc3VpdGFibGUgZm9yIGFjdHVhbCBhcmd1bWVudCB0eXBlIiwKKyAgICApLAorICAgICJFMTMxMCI6ICgKKyAgICAgICAgIlN1c3BpY2lvdXMgYXJndW1lbnQgaW4gJXMuJXMgY2FsbCIsCisgICAgICAgICJiYWQtc3RyLXN0cmlwLWNhbGwiLAorICAgICAgICAiVGhlIGFyZ3VtZW50IHRvIGEgc3RyLntsLHIsfXN0cmlwIGNhbGwgY29udGFpbnMgYSBkdXBsaWNhdGUgY2hhcmFjdGVyLCAiLAorICAgICksCisgICAgIlcxMzAyIjogKAorICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nIiwKKyAgICAgICAgImJhZC1mb3JtYXQtc3RyaW5nIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIFBFUCAzMTAxIGZvcm1hdCBzdHJpbmcgaXMgaW52YWxpZC4iLAorICAgICksCisgICAgIlcxMzAzIjogKAorICAgICAgICAiTWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50ICVyIGZvciBmb3JtYXQgc3RyaW5nIiwKKyAgICAgICAgIm1pc3NpbmctZm9ybWF0LWFyZ3VtZW50LWtleSIsCisgICAgICAgICJVc2VkIHdoZW4gYSBQRVAgMzEwMSBmb3JtYXQgc3RyaW5nIHRoYXQgdXNlcyBuYW1lZCBmaWVsZHMgIgorICAgICAgICAiZG9lc24ndCByZWNlaXZlIG9uZSBvciBtb3JlIHJlcXVpcmVkIGtleXdvcmRzLiIsCisgICAgKSwKKyAgICAiVzEzMDQiOiAoCisgICAgICAgICJVbnVzZWQgZm9ybWF0IGFyZ3VtZW50ICVyIiwKKyAgICAgICAgInVudXNlZC1mb3JtYXQtc3RyaW5nLWFyZ3VtZW50IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIFBFUCAzMTAxIGZvcm1hdCBzdHJpbmcgdGhhdCB1c2VzIG5hbWVkICIKKyAgICAgICAgImZpZWxkcyBpcyB1c2VkIHdpdGggYW4gYXJndW1lbnQgdGhhdCAiCisgICAgICAgICJpcyBub3QgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcuIiwKKyAgICApLAorICAgICJXMTMwNSI6ICgKKyAgICAgICAgIkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYm90aCBhdXRvbWF0aWMgZmllbGQgbnVtYmVyaW5nICIKKyAgICAgICAgImFuZCBtYW51YWwgZmllbGQgc3BlY2lmaWNhdGlvbiIsCisgICAgICAgICJmb3JtYXQtY29tYmluZWQtc3BlY2lmaWNhdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gYSBQRVAgMzEwMSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGJvdGggYXV0b21hdGljICIKKyAgICAgICAgImZpZWxkIG51bWJlcmluZyAoZS5nLiAne30nKSBhbmQgbWFudWFsIGZpZWxkICIKKyAgICAgICAgInNwZWNpZmljYXRpb24gKGUuZy4gJ3swfScpLiIsCisgICAgKSwKKyAgICAiVzEzMDYiOiAoCisgICAgICAgICJNaXNzaW5nIGZvcm1hdCBhdHRyaWJ1dGUgJXIgaW4gZm9ybWF0IHNwZWNpZmllciAlciIsCisgICAgICAgICJtaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGUiLAorICAgICAgICAiVXNlZCB3aGVuIGEgUEVQIDMxMDEgZm9ybWF0IHN0cmluZyB1c2VzIGFuICIKKyAgICAgICAgImF0dHJpYnV0ZSBzcGVjaWZpZXIgKHswLmxlbmd0aH0pLCBidXQgdGhlIGFyZ3VtZW50ICIKKyAgICAgICAgInBhc3NlZCBmb3IgZm9ybWF0dGluZyBkb2Vzbid0IGhhdmUgdGhhdCBhdHRyaWJ1dGUuIiwKKyAgICApLAorICAgICJXMTMwNyI6ICgKKyAgICAgICAgIlVzaW5nIGludmFsaWQgbG9va3VwIGtleSAlciBpbiBmb3JtYXQgc3BlY2lmaWVyICVyIiwKKyAgICAgICAgImludmFsaWQtZm9ybWF0LWluZGV4IiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIFBFUCAzMTAxIGZvcm1hdCBzdHJpbmcgdXNlcyBhIGxvb2t1cCBzcGVjaWZpZXIgIgorICAgICAgICAiKHthWzFdfSksIGJ1dCB0aGUgYXJndW1lbnQgcGFzc2VkIGZvciBmb3JtYXR0aW5nICIKKyAgICAgICAgImRvZXNuJ3QgY29udGFpbiBvciBkb2Vzbid0IGhhdmUgdGhhdCBrZXkgYXMgYW4gYXR0cmlidXRlLiIsCisgICAgKSwKKyAgICAiVzEzMDgiOiAoCisgICAgICAgICJEdXBsaWNhdGUgc3RyaW5nIGZvcm1hdHRpbmcgYXJndW1lbnQgJXIsIGNvbnNpZGVyIHBhc3NpbmcgYXMgbmFtZWQgYXJndW1lbnQiLAorICAgICAgICAiZHVwbGljYXRlLXN0cmluZy1mb3JtYXR0aW5nLWFyZ3VtZW50IiwKKyAgICAgICAgIlVzZWQgd2hlbiB3ZSBkZXRlY3QgdGhhdCBhIHN0cmluZyBmb3JtYXR0aW5nIGlzICIKKyAgICAgICAgInJlcGVhdGluZyBhbiBhcmd1bWVudCBpbnN0ZWFkIG9mIHVzaW5nIG5hbWVkIHN0cmluZyBhcmd1bWVudHMiLAorICAgICksCisgICAgIlcxMzA5IjogKAorICAgICAgICAiVXNpbmcgYW4gZi1zdHJpbmcgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBpbnRlcnBvbGF0ZWQgdmFyaWFibGVzIiwKKyAgICAgICAgImYtc3RyaW5nLXdpdGhvdXQtaW50ZXJwb2xhdGlvbiIsCisgICAgICAgICJVc2VkIHdoZW4gd2UgZGV0ZWN0IGFuIGYtc3RyaW5nIHRoYXQgZG9lcyBub3QgdXNlIGFueSBpbnRlcnBvbGF0aW9uIHZhcmlhYmxlcywgIgorICAgICAgICAiaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgZWl0aGVyIGEgbm9ybWFsIHN0cmluZyBvciBhIGJ1ZyBpbiB0aGUgY29kZS4iLAorICAgICksCit9CisKK09USEVSX05PREVTID0gKAorICAgIGFzdHJvaWQuQ29uc3QsCisgICAgYXN0cm9pZC5MaXN0LAorICAgIGFzdHJvaWQuTGFtYmRhLAorICAgIGFzdHJvaWQuRnVuY3Rpb25EZWYsCisgICAgYXN0cm9pZC5MaXN0Q29tcCwKKyAgICBhc3Ryb2lkLlNldENvbXAsCisgICAgYXN0cm9pZC5HZW5lcmF0b3JFeHAsCispCisKK0JVSUxUSU5TX1NUUiA9IGJ1aWx0aW5zLl9fbmFtZV9fICsgIi5zdHIiCitCVUlMVElOU19GTE9BVCA9IGJ1aWx0aW5zLl9fbmFtZV9fICsgIi5mbG9hdCIKK0JVSUxUSU5TX0lOVCA9IGJ1aWx0aW5zLl9fbmFtZV9fICsgIi5pbnQiCisKKworZGVmIGdldF9hY2Nlc3NfcGF0aChrZXksIHBhcnRzKToKKyAgICAiIiJHaXZlbiBhIGxpc3Qgb2YgZm9ybWF0IHNwZWNpZmllcnMsIHJldHVybnMKKyAgICB0aGUgZmluYWwgYWNjZXNzIHBhdGggKGUuZy4gYS5iLmNbMF1bMV0pLgorICAgICIiIgorICAgIHBhdGggPSBbXQorICAgIGZvciBpc19hdHRyaWJ1dGUsIHNwZWNpZmllciBpbiBwYXJ0czoKKyAgICAgICAgaWYgaXNfYXR0cmlidXRlOgorICAgICAgICAgICAgcGF0aC5hcHBlbmQoZiIue3NwZWNpZmllcn0iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aC5hcHBlbmQoZiJbe3NwZWNpZmllciFyfV0iKQorICAgIHJldHVybiBzdHIoa2V5KSArICIiLmpvaW4ocGF0aCkKKworCitkZWYgYXJnX21hdGNoZXNfZm9ybWF0X3R5cGUoYXJnX3R5cGUsIGZvcm1hdF90eXBlKToKKyAgICBpZiBmb3JtYXRfdHlwZSBpbiAic3IiOgorICAgICAgICAjIEFsbCB0eXBlcyBjYW4gYmUgcHJpbnRlZCB3aXRoICVzIGFuZCAlcgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIGlzaW5zdGFuY2UoYXJnX3R5cGUsIGFzdHJvaWQuSW5zdGFuY2UpOgorICAgICAgICBhcmdfdHlwZSA9IGFyZ190eXBlLnB5dHlwZSgpCisgICAgICAgIGlmIGFyZ190eXBlID09IEJVSUxUSU5TX1NUUjoKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdHlwZSA9PSAiYyIKKyAgICAgICAgaWYgYXJnX3R5cGUgPT0gQlVJTFRJTlNfRkxPQVQ6CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0X3R5cGUgaW4gImRlRWZGZ0duJSIKKyAgICAgICAgaWYgYXJnX3R5cGUgPT0gQlVJTFRJTlNfSU5UOgorICAgICAgICAgICAgIyBJbnRlZ2VycyBhbGxvdyBhbGwgdHlwZXMKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgU3RyaW5nRm9ybWF0Q2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgIiIiQ2hlY2tzIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgdG8gZW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcKKyAgICBpcyB2YWxpZCBhbmQgdGhlIGFyZ3VtZW50cyBtYXRjaCB0aGUgZm9ybWF0IHN0cmluZy4KKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisgICAgbmFtZSA9ICJzdHJpbmciCisgICAgbXNncyA9IE1TR1MKKworICAgICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LWJyYW5jaGVzCisgICAgQGNoZWNrX21lc3NhZ2VzKAorICAgICAgICAiYmFkLWZvcm1hdC1jaGFyYWN0ZXIiLAorICAgICAgICAidHJ1bmNhdGVkLWZvcm1hdC1zdHJpbmciLAorICAgICAgICAibWl4ZWQtZm9ybWF0LXN0cmluZyIsCisgICAgICAgICJiYWQtZm9ybWF0LXN0cmluZy1rZXkiLAorICAgICAgICAibWlzc2luZy1mb3JtYXQtc3RyaW5nLWtleSIsCisgICAgICAgICJ1bnVzZWQtZm9ybWF0LXN0cmluZy1rZXkiLAorICAgICAgICAiYmFkLXN0cmluZy1mb3JtYXQtdHlwZSIsCisgICAgICAgICJmb3JtYXQtbmVlZHMtbWFwcGluZyIsCisgICAgICAgICJ0b28tbWFueS1mb3JtYXQtYXJncyIsCisgICAgICAgICJ0b28tZmV3LWZvcm1hdC1hcmdzIiwKKyAgICAgICAgImJhZC1zdHJpbmctZm9ybWF0LXR5cGUiLAorICAgICkKKyAgICBkZWYgdmlzaXRfYmlub3Aoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUub3AgIT0gIiUiOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxlZnQgPSBub2RlLmxlZnQKKyAgICAgICAgYXJncyA9IG5vZGUucmlnaHQKKworICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UobGVmdCwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2UobGVmdC52YWx1ZSwgc3RyKSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IGxlZnQudmFsdWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIHJlcXVpcmVkX2tleXMsCisgICAgICAgICAgICAgICAgcmVxdWlyZWRfbnVtX2FyZ3MsCisgICAgICAgICAgICAgICAgcmVxdWlyZWRfa2V5X3R5cGVzLAorICAgICAgICAgICAgICAgIHJlcXVpcmVkX2FyZ190eXBlcywKKyAgICAgICAgICAgICkgPSB1dGlscy5wYXJzZV9mb3JtYXRfc3RyaW5nKGZvcm1hdF9zdHJpbmcpCisgICAgICAgIGV4Y2VwdCB1dGlscy5VbnN1cHBvcnRlZEZvcm1hdENoYXJhY3RlciBhcyBleGM6CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXRfc3RyaW5nW2V4Yy5pbmRleF0KKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgImJhZC1mb3JtYXQtY2hhcmFjdGVyIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0oZm9ybWF0dGVkLCBvcmQoZm9ybWF0dGVkKSwgZXhjLmluZGV4KSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgdXRpbHMuSW5jb21wbGV0ZUZvcm1hdFN0cmluZzoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInRydW5jYXRlZC1mb3JtYXQtc3RyaW5nIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHJlcXVpcmVkX2tleXMgYW5kIHJlcXVpcmVkX251bV9hcmdzOgorICAgICAgICAgICAgIyBUaGUgZm9ybWF0IHN0cmluZyB1c2VzIGJvdGggbmFtZWQgYW5kIHVubmFtZWQgZm9ybWF0CisgICAgICAgICAgICAjIHNwZWNpZmllcnMuCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtaXhlZC1mb3JtYXQtc3RyaW5nIiwgbm9kZT1ub2RlKQorICAgICAgICBlbGlmIHJlcXVpcmVkX2tleXM6CisgICAgICAgICAgICAjIFRoZSBmb3JtYXQgc3RyaW5nIHVzZXMgb25seSBuYW1lZCBmb3JtYXQgc3BlY2lmaWVycy4KKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgUkhTIG9mIHRoZSAlIG9wZXJhdG9yIGlzIGEgbWFwcGluZyBvYmplY3QKKyAgICAgICAgICAgICMgdGhhdCBjb250YWlucyBwcmVjaXNlbHkgdGhlIHNldCBvZiBrZXlzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAgICAgIyBmb3JtYXQgc3RyaW5nLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCBhc3Ryb2lkLkRpY3QpOgorICAgICAgICAgICAgICAgIGtleXMgPSBzZXQoKQorICAgICAgICAgICAgICAgIHVua25vd25fa2V5cyA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIGssIF8gaW4gYXJncy5pdGVtczoKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBhc3Ryb2lkLkNvbnN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGsudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZC1mb3JtYXQtc3RyaW5nLWtleSIsIG5vZGU9bm9kZSwgYXJncz1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE9uZSBvZiB0aGUga2V5cyB3YXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjb25zdGFudC4gIFNpbmNlIHdlIGNhbid0IHRlbGwgd2hhdCBpdCBpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3VwcHJlc3MgY2hlY2tzIGZvciBtaXNzaW5nIGtleXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRpY3Rpb25hcnkuCisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2tleXMgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbm90IHVua25vd25fa2V5czoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiByZXF1aXJlZF9rZXlzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBrZXlzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nLWZvcm1hdC1zdHJpbmcta2V5Iiwgbm9kZT1ub2RlLCBhcmdzPWtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gcmVxdWlyZWRfa2V5czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVudXNlZC1mb3JtYXQtc3RyaW5nLWtleSIsIG5vZGU9bm9kZSwgYXJncz1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCBhcmcgaW4gYXJncy5pdGVtczoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBhc3Ryb2lkLkNvbnN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdF90eXBlID0gcmVxdWlyZWRfa2V5X3R5cGVzLmdldChrZXkudmFsdWUsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlID0gdXRpbHMuc2FmZV9pbmZlcihhcmcpCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF90eXBlIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYXJnX3R5cGUgbm90IGluIChOb25lLCBhc3Ryb2lkLlVuaW5mZXJhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhcmdfbWF0Y2hlc19mb3JtYXRfdHlwZShhcmdfdHlwZSwgZm9ybWF0X3R5cGUpCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQtc3RyaW5nLWZvcm1hdC10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oYXJnX3R5cGUucHl0eXBlKCksIGZvcm1hdF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmdzLCAoT1RIRVJfTk9ERVMsIGFzdHJvaWQuVHVwbGUpKToKKyAgICAgICAgICAgICAgICB0eXBlX25hbWUgPSB0eXBlKGFyZ3MpLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZm9ybWF0LW5lZWRzLW1hcHBpbmciLCBub2RlPW5vZGUsIGFyZ3M9dHlwZV9uYW1lKQorICAgICAgICAgICAgIyBlbHNlOgorICAgICAgICAgICAgIyBUaGUgUkhTIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWVyIGlzIGEgbmFtZSBvcgorICAgICAgICAgICAgIyBleHByZXNzaW9uLiAgSXQgbWF5IGJlIGEgbWFwcGluZyBvYmplY3QsIHNvCisgICAgICAgICAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gY2hlY2suCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZSBmb3JtYXQgc3RyaW5nIHVzZXMgb25seSB1bm5hbWVkIGZvcm1hdCBzcGVjaWZpZXJzLgorICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgUkhTIG9mCisgICAgICAgICAgICAjIHRoZSAlIG9wZXJhdG9yIG1hdGNoZXMgdGhlIG51bWJlciByZXF1aXJlZCBieSB0aGUgZm9ybWF0CisgICAgICAgICAgICAjIHN0cmluZy4KKyAgICAgICAgICAgIGFyZ3NfZWx0cyA9ICgpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZ3MsIGFzdHJvaWQuVHVwbGUpOgorICAgICAgICAgICAgICAgIHJoc190dXBsZSA9IHV0aWxzLnNhZmVfaW5mZXIoYXJncykKKyAgICAgICAgICAgICAgICBudW1fYXJncyA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHJoc190dXBsZSwgImVsdHMiKToKKyAgICAgICAgICAgICAgICAgICAgYXJnc19lbHRzID0gcmhzX3R1cGxlLmVsdHMKKyAgICAgICAgICAgICAgICAgICAgbnVtX2FyZ3MgPSBsZW4oYXJnc19lbHRzKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZ3MsIChPVEhFUl9OT0RFUywgKGFzdHJvaWQuRGljdCwgYXN0cm9pZC5EaWN0Q29tcCkpKToKKyAgICAgICAgICAgICAgICBhcmdzX2VsdHMgPSBbYXJnc10KKyAgICAgICAgICAgICAgICBudW1fYXJncyA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGUgUkhTIG9mIHRoZSBmb3JtYXQgc3BlY2lmaWVyIGlzIGEgbmFtZSBvcgorICAgICAgICAgICAgICAgICMgZXhwcmVzc2lvbi4gIEl0IGNvdWxkIGJlIGEgdHVwbGUgb2YgdW5rbm93biBzaXplLCBzbworICAgICAgICAgICAgICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBjaGVjay4KKyAgICAgICAgICAgICAgICBudW1fYXJncyA9IE5vbmUKKyAgICAgICAgICAgIGlmIG51bV9hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIG51bV9hcmdzID4gcmVxdWlyZWRfbnVtX2FyZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInRvby1tYW55LWZvcm1hdC1hcmdzIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIGVsaWYgbnVtX2FyZ3MgPCByZXF1aXJlZF9udW1fYXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidG9vLWZldy1mb3JtYXQtYXJncyIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICBmb3IgYXJnLCBmb3JtYXRfdHlwZSBpbiB6aXAoYXJnc19lbHRzLCByZXF1aXJlZF9hcmdfdHlwZXMpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgYXJnOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYXJnX3R5cGUgPSB1dGlscy5zYWZlX2luZmVyKGFyZykKKyAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpbiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3Ryb2lkLlVuaW5mZXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhcmdfbWF0Y2hlc19mb3JtYXRfdHlwZShhcmdfdHlwZSwgZm9ybWF0X3R5cGUpCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQtc3RyaW5nLWZvcm1hdC10eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oYXJnX3R5cGUucHl0eXBlKCksIGZvcm1hdF90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIEBjaGVja19tZXNzYWdlcygiZi1zdHJpbmctd2l0aG91dC1pbnRlcnBvbGF0aW9uIikKKyAgICBkZWYgdmlzaXRfam9pbmVkc3RyKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkZvcm1hdHRlZFZhbHVlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgdmFsdWUgaW4gbm9kZS52YWx1ZXM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLkZvcm1hdHRlZFZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZi1zdHJpbmctd2l0aG91dC1pbnRlcnBvbGF0aW9uIiwgbm9kZT1ub2RlKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCpNU0dTKQorICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICBmdW5jID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLmZ1bmMpCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoZnVuYywgYXN0cm9pZC5Cb3VuZE1ldGhvZCkKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGZ1bmMuYm91bmQsIGFzdHJvaWQuSW5zdGFuY2UpCisgICAgICAgICAgICBhbmQgZnVuYy5ib3VuZC5uYW1lIGluICgic3RyIiwgInVuaWNvZGUiLCAiYnl0ZXMiKQorICAgICAgICApOgorICAgICAgICAgICAgaWYgZnVuYy5uYW1lIGluICgic3RyaXAiLCAibHN0cmlwIiwgInJzdHJpcCIpIGFuZCBub2RlLmFyZ3M6CisgICAgICAgICAgICAgICAgYXJnID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLmFyZ3NbMF0pCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXJnLCBhc3Ryb2lkLkNvbnN0KSBvciBub3QgaXNpbnN0YW5jZShhcmcudmFsdWUsIHN0cik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGlmIGxlbihhcmcudmFsdWUpICE9IGxlbihzZXQoYXJnLnZhbHVlKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkLXN0ci1zdHJpcC1jYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGZ1bmMuYm91bmQubmFtZSwgZnVuYy5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZWxpZiBmdW5jLm5hbWUgPT0gImZvcm1hdCI6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfbmV3X2Zvcm1hdChub2RlLCBmdW5jKQorCisgICAgZGVmIF9kZXRlY3RfdmFjdW91c19mb3JtYXR0aW5nKHNlbGYsIG5vZGUsIHBvc2l0aW9uYWxfYXJndW1lbnRzKToKKyAgICAgICAgY291bnRlciA9IGNvbGxlY3Rpb25zLkNvdW50ZXIoCisgICAgICAgICAgICBhcmcubmFtZSBmb3IgYXJnIGluIHBvc2l0aW9uYWxfYXJndW1lbnRzIGlmIGlzaW5zdGFuY2UoYXJnLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICkKKyAgICAgICAgZm9yIG5hbWUsIGNvdW50IGluIGNvdW50ZXIuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGNvdW50ID09IDE6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgImR1cGxpY2F0ZS1zdHJpbmctZm9ybWF0dGluZy1hcmd1bWVudCIsIG5vZGU9bm9kZSwgYXJncz0obmFtZSwpCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX25ld19mb3JtYXQoc2VsZiwgbm9kZSwgZnVuYyk6CisgICAgICAgICIiIkNoZWNrIHRoZSBuZXcgc3RyaW5nIGZvcm1hdHRpbmcuIiIiCisgICAgICAgICMgU2tpcCBmb3JtYXQgbm9kZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBleHBsaWNpdCBzdHJpbmcgb24gdGhlCisgICAgICAgICMgbGVmdCBzaWRlIG9mIHRoZSBmb3JtYXQgb3BlcmF0aW9uLgorICAgICAgICAjIFdlIGRvIHRoaXMgYmVjYXVzZSBvdXIgaW5mZXJlbmNlIGVuZ2luZSBjYW4ndCBwcm9wZXJseSBoYW5kbGUKKyAgICAgICAgIyByZWRlZmluaXRpb25zIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcuCisgICAgICAgICMgTm90ZSB0aGF0IHRoZXJlIG1heSBub3QgYmUgYW55IGxlZnQgc2lkZSBhdCBhbGwsIGlmIHRoZSBmb3JtYXQgbWV0aG9kCisgICAgICAgICMgaGFzIGJlZW4gYXNzaWduZWQgdG8gYW5vdGhlciB2YXJpYWJsZS4gU2VlIGlzc3VlIDM1MS4gRm9yIGV4YW1wbGU6CisgICAgICAgICMKKyAgICAgICAgIyAgICBmbXQgPSAnc29tZSBzdHJpbmcge30nLmZvcm1hdAorICAgICAgICAjICAgIGZtdCgnYXJnJykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKSBhbmQgbm90IGlzaW5zdGFuY2UoCisgICAgICAgICAgICBub2RlLmZ1bmMuZXhwciwgYXN0cm9pZC5Db25zdAorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vZGUuc3RhcmFyZ3Mgb3Igbm9kZS5rd2FyZ3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3Rybm9kZSA9IG5leHQoZnVuYy5ib3VuZC5pbmZlcigpKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2Uoc3Rybm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIGlzaW5zdGFuY2Uoc3Rybm9kZS52YWx1ZSwgc3RyKSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsbF9zaXRlID0gYXN0cm9pZC5hcmd1bWVudHMuQ2FsbFNpdGUuZnJvbV9jYWxsKG5vZGUpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmllbGRzLCBudW1fYXJncywgbWFudWFsX3BvcyA9IHV0aWxzLnBhcnNlX2Zvcm1hdF9tZXRob2Rfc3RyaW5nKAorICAgICAgICAgICAgICAgIHN0cm5vZGUudmFsdWUKKyAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IHV0aWxzLkluY29tcGxldGVGb3JtYXRTdHJpbmc6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJiYWQtZm9ybWF0LXN0cmluZyIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBvc2l0aW9uYWxfYXJndW1lbnRzID0gY2FsbF9zaXRlLnBvc2l0aW9uYWxfYXJndW1lbnRzCisgICAgICAgIG5hbWVkX2FyZ3VtZW50cyA9IGNhbGxfc2l0ZS5rZXl3b3JkX2FyZ3VtZW50cworICAgICAgICBuYW1lZF9maWVsZHMgPSB7ZmllbGRbMF0gZm9yIGZpZWxkIGluIGZpZWxkcyBpZiBpc2luc3RhbmNlKGZpZWxkWzBdLCBzdHIpfQorICAgICAgICBpZiBudW1fYXJncyBhbmQgbWFudWFsX3BvczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImZvcm1hdC1jb21iaW5lZC1zcGVjaWZpY2F0aW9uIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY2hlY2tfYXJncyA9IEZhbHNlCisgICAgICAgICMgQ29uc2lkZXIgIntbMF19IHtbMV19IiBhcyBudW1fYXJncy4KKyAgICAgICAgbnVtX2FyZ3MgKz0gc3VtKDEgZm9yIGZpZWxkIGluIG5hbWVkX2ZpZWxkcyBpZiBmaWVsZCA9PSAiIikKKyAgICAgICAgaWYgbmFtZWRfZmllbGRzOgorICAgICAgICAgICAgZm9yIGZpZWxkIGluIG5hbWVkX2ZpZWxkczoKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBhbmQgZmllbGQgbm90IGluIG5hbWVkX2FyZ3VtZW50czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXkiLCBub2RlPW5vZGUsIGFyZ3M9KGZpZWxkLCkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZm9yIGZpZWxkIGluIG5hbWVkX2FyZ3VtZW50czoKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBub3QgaW4gbmFtZWRfZmllbGRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgInVudXNlZC1mb3JtYXQtc3RyaW5nLWFyZ3VtZW50Iiwgbm9kZT1ub2RlLCBhcmdzPShmaWVsZCwpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICMgbnVtX2FyZ3MgY2FuIGJlIDAgaWYgbWFudWFsX3BvcyBpcyBub3QuCisgICAgICAgICAgICBudW1fYXJncyA9IG51bV9hcmdzIG9yIG1hbnVhbF9wb3MKKyAgICAgICAgICAgIGlmIHBvc2l0aW9uYWxfYXJndW1lbnRzIG9yIG51bV9hcmdzOgorICAgICAgICAgICAgICAgIGVtcHR5ID0gYW55KFRydWUgZm9yIGZpZWxkIGluIG5hbWVkX2ZpZWxkcyBpZiBmaWVsZCA9PSAiIikKKyAgICAgICAgICAgICAgICBpZiBuYW1lZF9hcmd1bWVudHMgb3IgZW1wdHk6CisgICAgICAgICAgICAgICAgICAgICMgVmVyaWZ5IHRoZSByZXF1aXJlZCBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGlmIHRoZSAuZm9ybWF0IGdvdCBhdCBsZWFzdCBvbmUga2V5d29yZCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmdzIGFjY2VwdHMgYm90aAorICAgICAgICAgICAgICAgICAgICAjIHBvc2l0aW9uYWwgYW5kIG5hbWVkIGZpZWxkcyBhbmQgd2Ugc2hvdWxkIHdhcm4KKyAgICAgICAgICAgICAgICAgICAgIyB3aGVuIG9uZSBvZiB0aGUgdGhlbSBpcyBtaXNzaW5nIG9yIGlzIGV4dHJhLgorICAgICAgICAgICAgICAgICAgICBjaGVja19hcmdzID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hlY2tfYXJncyA9IFRydWUKKyAgICAgICAgaWYgY2hlY2tfYXJnczoKKyAgICAgICAgICAgICMgbnVtX2FyZ3MgY2FuIGJlIDAgaWYgbWFudWFsX3BvcyBpcyBub3QuCisgICAgICAgICAgICBudW1fYXJncyA9IG51bV9hcmdzIG9yIG1hbnVhbF9wb3MKKyAgICAgICAgICAgIGlmIGxlbihwb3NpdGlvbmFsX2FyZ3VtZW50cykgPiBudW1fYXJnczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ0b28tbWFueS1mb3JtYXQtYXJncyIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIGVsaWYgbGVuKHBvc2l0aW9uYWxfYXJndW1lbnRzKSA8IG51bV9hcmdzOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInRvby1mZXctZm9ybWF0LWFyZ3MiLCBub2RlPW5vZGUpCisKKyAgICAgICAgc2VsZi5fZGV0ZWN0X3ZhY3VvdXNfZm9ybWF0dGluZyhub2RlLCBwb3NpdGlvbmFsX2FyZ3VtZW50cykKKyAgICAgICAgc2VsZi5fY2hlY2tfbmV3X2Zvcm1hdF9zcGVjaWZpZXJzKG5vZGUsIGZpZWxkcywgbmFtZWRfYXJndW1lbnRzKQorCisgICAgZGVmIF9jaGVja19uZXdfZm9ybWF0X3NwZWNpZmllcnMoc2VsZiwgbm9kZSwgZmllbGRzLCBuYW1lZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayBhdHRyaWJ1dGUgYW5kIGluZGV4IGFjY2VzcyBpbiB0aGUgZm9ybWF0CisgICAgICAgIHN0cmluZyAoInswLmF9IiBhbmQgInswW2FdfSIpLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGtleSwgc3BlY2lmaWVycyBpbiBmaWVsZHM6CisgICAgICAgICAgICAjIE9idGFpbiB0aGUgYXJndW1lbnQuIElmIGl0IGNhbid0IGJlIG9idGFpbmVkCisgICAgICAgICAgICAjIG9yIGluZmVycmVkLCBza2lwIHRoaXMgY2hlY2suCisgICAgICAgICAgICBpZiBrZXkgPT0gIiI6CisgICAgICAgICAgICAgICAgIyB7WzBdfSB3aWxsIGhhdmUgYW4gdW5uYW1lZCBhcmd1bWVudCwgZGVmYXVsdGluZworICAgICAgICAgICAgICAgICMgdG8gMC4gSXQgd2lsbCBub3QgYmUgcHJlc2VudCBpbiBgbmFtZWRgLCBzbyB1c2UgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgIyAwIGZvciBpdC4KKyAgICAgICAgICAgICAgICBrZXkgPSAwCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgbnVtYmVycy5OdW1iZXIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYXJnbmFtZSA9IHV0aWxzLmdldF9hcmd1bWVudF9mcm9tX2NhbGwobm9kZSwga2V5KQorICAgICAgICAgICAgICAgIGV4Y2VwdCB1dGlscy5Ob1N1Y2hBcmd1bWVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIG5hbWVkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGFyZ25hbWUgPSBuYW1lZFtrZXldCisgICAgICAgICAgICBpZiBhcmduYW1lIGluIChhc3Ryb2lkLlVuaW5mZXJhYmxlLCBOb25lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gdXRpbHMuc2FmZV9pbmZlcihhcmduYW1lKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBzcGVjaWZpZXJzIG9yIG5vdCBhcmd1bWVudDoKKyAgICAgICAgICAgICAgICAjIE5vIG5lZWQgdG8gY2hlY2sgdGhpcyBrZXkgaWYgaXQgZG9lc24ndAorICAgICAgICAgICAgICAgICMgdXNlIGF0dHJpYnV0ZSAvIGl0ZW0gYWNjZXNzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGFyZ3VtZW50LnBhcmVudCBhbmQgaXNpbnN0YW5jZShhcmd1bWVudC5wYXJlbnQsIGFzdHJvaWQuQXJndW1lbnRzKToKKyAgICAgICAgICAgICAgICAjIElnbm9yZSBhbnkgb2JqZWN0IGNvbWluZyBmcm9tIGFuIGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICMgYmVjYXVzZSB3ZSBjYW4ndCBpbmZlciBpdHMgdmFsdWUgcHJvcGVybHkuCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByZXZpb3VzID0gYXJndW1lbnQKKyAgICAgICAgICAgIHBhcnNlZCA9IFtdCisgICAgICAgICAgICBmb3IgaXNfYXR0cmlidXRlLCBzcGVjaWZpZXIgaW4gc3BlY2lmaWVyczoKKyAgICAgICAgICAgICAgICBpZiBwcmV2aW91cyBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHBhcnNlZC5hcHBlbmQoKGlzX2F0dHJpYnV0ZSwgc3BlY2lmaWVyKSkKKyAgICAgICAgICAgICAgICBpZiBpc19hdHRyaWJ1dGU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gcHJldmlvdXMuZ2V0YXR0cihzcGVjaWZpZXIpWzBdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzYXR0cihwcmV2aW91cywgImhhc19keW5hbWljX2dldGF0dHIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmV2aW91cy5oYXNfZHluYW1pY19nZXRhdHRyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCB3YXJuIGlmIHRoZSBvYmplY3QgaGFzIGEgY3VzdG9tIF9fZ2V0YXR0cl9fCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBnZXRfYWNjZXNzX3BhdGgoa2V5LCBwYXJzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNwZWNpZmllciwgcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB3YXJuX2Vycm9yID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihwcmV2aW91cywgImdldGl0ZW0iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IHByZXZpb3VzLmdldGl0ZW0oYXN0cm9pZC5Db25zdChzcGVjaWZpZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3Ryb2lkLkFzdHJvaWRJbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuQXN0cm9pZFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3Ryb2lkLkF0dHJpYnV0ZUluZmVyZW5jZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuX2Vycm9yID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIExvb2t1cCBfX2dldGl0ZW1fXyBpbiB0aGUgY3VycmVudCBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnV0IHNraXAgZnVydGhlciBjaGVja3MsIGJlY2F1c2Ugd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHJpZXZlIHRoZSBsb29rZWQgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuZ2V0YXR0cigiX19nZXRpdGVtX18iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5fZXJyb3IgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHdhcm5fZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gZ2V0X2FjY2Vzc19wYXRoKGtleSwgcGFyc2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1mb3JtYXQtaW5kZXgiLCBhcmdzPShzcGVjaWZpZXIsIHBhdGgpLCBub2RlPW5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbmV4dChwcmV2aW91cy5pbmZlcigpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGNhbid0IGNoZWNrIGZ1cnRoZXIgaWYgd2UgY2FuJ3QgaW5mZXIgaXQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworCitjbGFzcyBTdHJpbmdDb25zdGFudENoZWNrZXIoQmFzZVRva2VuQ2hlY2tlcik6CisgICAgIiIiQ2hlY2sgc3RyaW5nIGxpdGVyYWxzIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChJQXN0cm9pZENoZWNrZXIsIElUb2tlbkNoZWNrZXIsIElSYXdDaGVja2VyKQorICAgIG5hbWUgPSAic3RyaW5nIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJXMTQwMSI6ICgKKyAgICAgICAgICAgICJBbm9tYWxvdXMgYmFja3NsYXNoIGluIHN0cmluZzogJyVzJy4gIgorICAgICAgICAgICAgIlN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIsCisgICAgICAgICAgICAiYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmciLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIGJhY2tzbGFzaCBpcyBpbiBhIGxpdGVyYWwgc3RyaW5nIGJ1dCBub3QgYXMgYW4gZXNjYXBlLiIsCisgICAgICAgICksCisgICAgICAgICJXMTQwMiI6ICgKKyAgICAgICAgICAgICJBbm9tYWxvdXMgVW5pY29kZSBlc2NhcGUgaW4gYnl0ZSBzdHJpbmc6ICclcycuICIKKyAgICAgICAgICAgICJTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIG9yIHUgcHJlZml4LiIsCisgICAgICAgICAgICAiYW5vbWFsb3VzLXVuaWNvZGUtZXNjYXBlLWluLXN0cmluZyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGFuIGVzY2FwZSBsaWtlIFxcdSBpcyBlbmNvdW50ZXJlZCBpbiBhIGJ5dGUgIgorICAgICAgICAgICAgInN0cmluZyB3aGVyZSBpdCBoYXMgbm8gZWZmZWN0LiIsCisgICAgICAgICksCisgICAgICAgICJXMTQwNCI6ICgKKyAgICAgICAgICAgICJJbXBsaWNpdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3VuZCBpbiAlcyIsCisgICAgICAgICAgICAiaW1wbGljaXQtc3RyLWNvbmNhdCIsCisgICAgICAgICAgICAiU3RyaW5nIGxpdGVyYWxzIGFyZSBpbXBsaWNpdGx5IGNvbmNhdGVuYXRlZCBpbiBhICIKKyAgICAgICAgICAgICJsaXRlcmFsIGl0ZXJhYmxlIGRlZmluaXRpb24gOiAiCisgICAgICAgICAgICAibWF5YmUgYSBjb21tYSBpcyBtaXNzaW5nID8iLAorICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMTQwMyIsICJpbXBsaWNpdC1zdHItY29uY2F0LWluLXNlcXVlbmNlIildfSwKKyAgICAgICAgKSwKKyAgICAgICAgIlcxNDA1IjogKAorICAgICAgICAgICAgIlF1b3RlIGRlbGltaXRlciAlcyBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZmlsZSIsCisgICAgICAgICAgICAiaW5jb25zaXN0ZW50LXF1b3RlcyIsCisgICAgICAgICAgICAiUXVvdGUgZGVsaW1pdGVycyBhcmUgbm90IHVzZWQgY29uc2lzdGVudGx5IHRocm91Z2hvdXQgYSBtb2R1bGUgIgorICAgICAgICAgICAgIih3aXRoIGFsbG93YW5jZXMgbWFkZSBmb3IgYXZvaWRpbmcgdW5uZWNlc3NhcnkgZXNjYXBpbmcpLiIsCisgICAgICAgICksCisgICAgfQorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJjaGVjay1zdHItY29uY2F0LW92ZXItbGluZS1qdW1wcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHlfb3Jfbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIlRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIHRoZSAiCisgICAgICAgICAgICAgICAgImltcGxpY2l0LXN0ci1jb25jYXQgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyAiCisgICAgICAgICAgICAgICAgIm9uIGltcGxpY2l0IHN0cmluZyBjb25jYXRlbmF0aW9uIGluIHNlcXVlbmNlcyBkZWZpbmVkIG92ZXIgIgorICAgICAgICAgICAgICAgICJzZXZlcmFsIGxpbmVzLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiY2hlY2stcXVvdGUtY29uc2lzdGVuY3kiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogRmFsc2UsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5X29yX24+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBpbmNvbnNpc3RlbnQtcXVvdGVzIGdlbmVyYXRlcyBhICIKKyAgICAgICAgICAgICAgICAid2FybmluZyB3aGVuIHRoZSBjaGFyYWN0ZXIgdXNlZCBhcyBhIHF1b3RlIGRlbGltaXRlciBpcyB1c2VkICIKKyAgICAgICAgICAgICAgICAiaW5jb25zaXN0ZW50bHkgd2l0aGluIGEgbW9kdWxlLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgICMgQ2hhcmFjdGVycyB0aGF0IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgYWZ0ZXIgYSBiYWNrc2xhc2ggaW4gZWl0aGVyCisgICAgIyBVbmljb2RlIG9yIGJ5dGUgc3RyaW5ncy4KKyAgICBFU0NBUEVfQ0hBUkFDVEVSUyA9ICJhYmZucnR2eFxuXHJcdFxcJ1wiMDEyMzQ1NjciCisKKyAgICAjIENoYXJhY3RlcnMgdGhhdCBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGFmdGVyIGEgYmFja3NsYXNoIGJ1dCBvbmx5IGluCisgICAgIyBVbmljb2RlIHN0cmluZ3MuCisgICAgVU5JQ09ERV9FU0NBUEVfQ0hBUkFDVEVSUyA9ICJ1VU4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuc3RyaW5nX3Rva2VucyA9IHt9ICAjIHRva2VuIHBvc2l0aW9uIC0+ICh0b2tlbiB2YWx1ZSwgbmV4dCB0b2tlbikKKworICAgIGRlZiBwcm9jZXNzX21vZHVsZShzZWxmLCBtb2R1bGUpOgorICAgICAgICBzZWxmLl91bmljb2RlX2xpdGVyYWxzID0gInVuaWNvZGVfbGl0ZXJhbHMiIGluIG1vZHVsZS5mdXR1cmVfaW1wb3J0cworCisgICAgZGVmIHByb2Nlc3NfdG9rZW5zKHNlbGYsIHRva2Vucyk6CisgICAgICAgIGVuY29kaW5nID0gImFzY2lpIgorICAgICAgICBmb3IgaSwgKHRva190eXBlLCB0b2tlbiwgc3RhcnQsIF8sIGxpbmUpIGluIGVudW1lcmF0ZSh0b2tlbnMpOgorICAgICAgICAgICAgaWYgdG9rX3R5cGUgPT0gdG9rZW5pemUuRU5DT0RJTkc6CisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QgdG9rZW4gcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSB0b2tlbgorICAgICAgICAgICAgZWxpZiB0b2tfdHlwZSA9PSB0b2tlbml6ZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgIyAndG9rZW4nIGlzIHRoZSB3aG9sZSB1bi1wYXJzZWQgdG9rZW47IHdlIGNhbiBsb29rIGF0IHRoZSBzdGFydAorICAgICAgICAgICAgICAgICMgb2YgaXQgdG8gc2VlIHdoZXRoZXIgaXQncyBhIHJhdyBvciB1bmljb2RlIHN0cmluZyBldGMuCisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3N0cmluZ190b2tlbih0b2tlbiwgc3RhcnRbMF0sIHN0YXJ0WzFdKQorICAgICAgICAgICAgICAgICMgV2UgZmlndXJlIHRoZSBuZXh0IHRva2VuLCBpZ25vcmluZyBjb21tZW50cyAmIG5ld2xpbmVzOgorICAgICAgICAgICAgICAgIGogPSBpICsgMQorICAgICAgICAgICAgICAgIHdoaWxlIGogPCBsZW4odG9rZW5zKSBhbmQgdG9rZW5zW2pdLnR5cGUgaW4gKAorICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZS5ORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZS5OTCwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5pemUuQ09NTUVOVCwKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgICAgICAgICBuZXh0X3Rva2VuID0gdG9rZW5zW2pdIGlmIGogPCBsZW4odG9rZW5zKSBlbHNlIE5vbmUKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyAhPSAiYXNjaWkiOgorICAgICAgICAgICAgICAgICAgICAjIFdlIGNvbnZlcnQgYHRva2VuaXplYCBjaGFyYWN0ZXIgY291bnQgaW50byBhIGJ5dGUgY291bnQsCisgICAgICAgICAgICAgICAgICAgICMgdG8gbWF0Y2ggd2l0aCBhc3Ryb2lkIGAuY29sX29mZnNldGAKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAoc3RhcnRbMF0sIGxlbihsaW5lWzogc3RhcnRbMV1dLmVuY29kZShlbmNvZGluZykpKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyaW5nX3Rva2Vuc1tzdGFydF0gPSAoc3RyX2V2YWwodG9rZW4pLCBuZXh0X3Rva2VuKQorCisgICAgICAgIGlmIHNlbGYuY29uZmlnLmNoZWNrX3F1b3RlX2NvbnNpc3RlbmN5OgorICAgICAgICAgICAgc2VsZi5jaGVja19mb3JfY29uc2lzdGVudF9zdHJpbmdfZGVsaW1pdGVycyh0b2tlbnMpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoImltcGxpY2l0LXN0ci1jb25jYXQiKQorICAgIGRlZiB2aXNpdF9saXN0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9jb25jYXRlbmF0ZWRfc3RyaW5ncyhub2RlLmVsdHMsICJsaXN0IikKKworICAgIEBjaGVja19tZXNzYWdlcygiaW1wbGljaXQtc3RyLWNvbmNhdCIpCisgICAgZGVmIHZpc2l0X3NldChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfY29uY2F0ZW5hdGVkX3N0cmluZ3Mobm9kZS5lbHRzLCAic2V0IikKKworICAgIEBjaGVja19tZXNzYWdlcygiaW1wbGljaXQtc3RyLWNvbmNhdCIpCisgICAgZGVmIHZpc2l0X3R1cGxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9jb25jYXRlbmF0ZWRfc3RyaW5ncyhub2RlLmVsdHMsICJ0dXBsZSIpCisKKyAgICBkZWYgdmlzaXRfYXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUudmFsdWUsIGFzdHJvaWQuQ29uc3QpIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUudmFsdWUsIHN0cik6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2Zvcl9jb25jYXRlbmF0ZWRfc3RyaW5ncyhbbm9kZS52YWx1ZV0sICJhc3NpZ25tZW50IikKKworICAgIGRlZiBjaGVja19mb3JfY29uc2lzdGVudF9zdHJpbmdfZGVsaW1pdGVycygKKyAgICAgICAgc2VsZiwgdG9rZW5zOiBJdGVyYWJsZVt0b2tlbml6ZS5Ub2tlbkluZm9dCisgICAgKSAtPiBOb25lOgorICAgICAgICAiIiJBZGRzIGEgbWVzc2FnZSBmb3IgZWFjaCBzdHJpbmcgdXNpbmcgaW5jb25zaXN0ZW50IHF1b3RlIGRlbGltaXRlcnMuCisKKyAgICAgICAgUXVvdGUgZGVsaW1pdGVycyBhcmUgdXNlZCBpbmNvbnNpc3RlbnRseSBpZiAiIGFuZCAnIGFyZSBtaXhlZCBpbiBhIG1vZHVsZSdzCisgICAgICAgIHNob3J0c3RyaW5ncyB3aXRob3V0IGhhdmluZyBkb25lIHNvIHRvIGF2b2lkIGVzY2FwaW5nIGFuIGludGVybmFsIHF1b3RlCisgICAgICAgIGNoYXJhY3Rlci4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIHRva2VuczogVGhlIHRva2VucyB0byBiZSBjaGVja2VkIGFnYWluc3QgZm9yIGNvbnNpc3RlbnQgdXNhZ2UuCisgICAgICAgICIiIgorICAgICAgICAjIHR5cGluZy5Db3VudGVyIGFkZGVkIGluIFB5dGhvbiAzLjYuMSBzbyB0aGlzIHR5cGUgaGludCBtdXN0IGJlIGEgY29tbWVudAorICAgICAgICBzdHJpbmdfZGVsaW1pdGVycyA9IGNvbGxlY3Rpb25zLkNvdW50ZXIoKSAgIyB0eXBlOiBDb3VudGVyW3N0cl0KKworICAgICAgICAjIEZpcnN0LCBmaWd1cmUgb3V0IHdoaWNoIHF1b3RlIGNoYXJhY3RlciBwcmVkb21pbmF0ZXMgaW4gdGhlIG1vZHVsZQorICAgICAgICBmb3IgdG9rX3R5cGUsIHRva2VuLCBfLCBfLCBfIGluIHRva2VuczoKKyAgICAgICAgICAgIGlmIHRva190eXBlID09IHRva2VuaXplLlNUUklORyBhbmQgX2lzX3F1b3RlX2RlbGltaXRlcl9jaG9zZW5fZnJlZWx5KHRva2VuKToKKyAgICAgICAgICAgICAgICBzdHJpbmdfZGVsaW1pdGVyc1tfZ2V0X3F1b3RlX2RlbGltaXRlcih0b2tlbildICs9IDEKKworICAgICAgICBpZiBsZW4oc3RyaW5nX2RlbGltaXRlcnMpID4gMToKKyAgICAgICAgICAgICMgVGllcyBhcmUgYnJva2VuIGFyYml0cmFyaWx5CisgICAgICAgICAgICBtb3N0X2NvbW1vbl9kZWxpbWl0ZXIgPSBzdHJpbmdfZGVsaW1pdGVycy5tb3N0X2NvbW1vbigxKVswXVswXQorICAgICAgICAgICAgZm9yIHRva190eXBlLCB0b2tlbiwgc3RhcnQsIF8sIF8gaW4gdG9rZW5zOgorICAgICAgICAgICAgICAgIGlmIHRva190eXBlICE9IHRva2VuaXplLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBxdW90ZV9kZWxpbWl0ZXIgPSBfZ2V0X3F1b3RlX2RlbGltaXRlcih0b2tlbikKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIF9pc19xdW90ZV9kZWxpbWl0ZXJfY2hvc2VuX2ZyZWVseSh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgYW5kIHF1b3RlX2RlbGltaXRlciAhPSBtb3N0X2NvbW1vbl9kZWxpbWl0ZXIKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudC1xdW90ZXMiLCBsaW5lPXN0YXJ0WzBdLCBhcmdzPShxdW90ZV9kZWxpbWl0ZXIsKQorICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgY2hlY2tfZm9yX2NvbmNhdGVuYXRlZF9zdHJpbmdzKHNlbGYsIGVsZW1lbnRzLCBpdGVyYWJsZV90eXBlKToKKyAgICAgICAgZm9yIGVsdCBpbiBlbGVtZW50czoKKyAgICAgICAgICAgIGlmIG5vdCAoCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShlbHQsIGFzdHJvaWQuQ29uc3QpIGFuZCBlbHQucHl0eXBlKCkgaW4gX0FTVF9OT0RFX1NUUl9UWVBFUworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZWx0LmNvbF9vZmZzZXQgPCAwOgorICAgICAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGluIGNhc2Ugb2YgZXNjYXBlZCBuZXdsaW5lcworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAoZWx0LmxpbmVubywgZWx0LmNvbF9vZmZzZXQpIG5vdCBpbiBzZWxmLnN0cmluZ190b2tlbnM6CisgICAgICAgICAgICAgICAgIyBUaGlzIG1heSBoYXBwZW4gd2l0aCBMYXRpbjEgZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAjIGNmLiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8yNjEwCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG1hdGNoaW5nX3Rva2VuLCBuZXh0X3Rva2VuID0gc2VsZi5zdHJpbmdfdG9rZW5zWworICAgICAgICAgICAgICAgIChlbHQubGluZW5vLCBlbHQuY29sX29mZnNldCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICMgV2UgZGV0ZWN0IHN0cmluZyBjb25jYXRlbmF0aW9uOiB0aGUgQVNUIENvbnN0IGlzIHRoZQorICAgICAgICAgICAgIyBjb21iaW5hdGlvbiBvZiAyIHN0cmluZyB0b2tlbnMKKyAgICAgICAgICAgIGlmIG1hdGNoaW5nX3Rva2VuICE9IGVsdC52YWx1ZSBhbmQgbmV4dF90b2tlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBuZXh0X3Rva2VuLnR5cGUgPT0gdG9rZW5pemUuU1RSSU5HIGFuZCAoCisgICAgICAgICAgICAgICAgICAgIG5leHRfdG9rZW4uc3RhcnRbMF0gPT0gZWx0LmxpbmVubworICAgICAgICAgICAgICAgICAgICBvciBzZWxmLmNvbmZpZy5jaGVja19zdHJfY29uY2F0X292ZXJfbGluZV9qdW1wcworICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGljaXQtc3RyLWNvbmNhdCIsIGxpbmU9ZWx0LmxpbmVubywgYXJncz0oaXRlcmFibGVfdHlwZSwpCisgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBwcm9jZXNzX3N0cmluZ190b2tlbihzZWxmLCB0b2tlbiwgc3RhcnRfcm93LCBzdGFydF9jb2wpOgorICAgICAgICBxdW90ZV9jaGFyID0gTm9uZQorICAgICAgICBpbmRleCA9IE5vbmUKKyAgICAgICAgZm9yIGluZGV4LCBjaGFyIGluIGVudW1lcmF0ZSh0b2tlbik6CisgICAgICAgICAgICBpZiBjaGFyIGluICInXCIiOgorICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSBjaGFyCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgcXVvdGVfY2hhciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcHJlZml4ID0gdG9rZW5bOmluZGV4XS5sb3dlcigpICAjIG1hcmtlcnMgbGlrZSB1LCBiLCByLgorICAgICAgICBhZnRlcl9wcmVmaXggPSB0b2tlbltpbmRleDpdCisgICAgICAgICMgQ2hvcCBvZmYgcXVvdGVzCisgICAgICAgIHF1b3RlX2xlbmd0aCA9ICgKKyAgICAgICAgICAgIDMgaWYgYWZ0ZXJfcHJlZml4WzozXSA9PSBhZnRlcl9wcmVmaXhbLTM6XSA9PSAzICogcXVvdGVfY2hhciBlbHNlIDEKKyAgICAgICAgKQorICAgICAgICBzdHJpbmdfYm9keSA9IGFmdGVyX3ByZWZpeFtxdW90ZV9sZW5ndGg6LXF1b3RlX2xlbmd0aF0KKyAgICAgICAgIyBObyBzcGVjaWFsIGNoZWNrcyBvbiByYXcgc3RyaW5ncyBhdCB0aGUgbW9tZW50LgorICAgICAgICBpZiAiciIgbm90IGluIHByZWZpeDoKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19ub25fcmF3X3N0cmluZ190b2tlbigKKyAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgc3RyaW5nX2JvZHksCisgICAgICAgICAgICAgICAgc3RhcnRfcm93LAorICAgICAgICAgICAgICAgIHN0YXJ0X2NvbCArIGxlbihwcmVmaXgpICsgcXVvdGVfbGVuZ3RoLAorICAgICAgICAgICAgKQorCisgICAgZGVmIHByb2Nlc3Nfbm9uX3Jhd19zdHJpbmdfdG9rZW4oCisgICAgICAgIHNlbGYsIHByZWZpeCwgc3RyaW5nX2JvZHksIHN0YXJ0X3Jvdywgc3RyaW5nX3N0YXJ0X2NvbAorICAgICk6CisgICAgICAgICIiImNoZWNrIGZvciBiYWQgZXNjYXBlcyBpbiBhIG5vbi1yYXcgc3RyaW5nLgorCisgICAgICAgIHByZWZpeDogbG93ZXJjYXNlIHN0cmluZyBvZiBlZyAndXInIHN0cmluZyBwcmVmaXggbWFya2Vycy4KKyAgICAgICAgc3RyaW5nX2JvZHk6IHRoZSB1bi1wYXJzZWQgYm9keSBvZiB0aGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIHRoZSBxdW90ZQorICAgICAgICBtYXJrcy4KKyAgICAgICAgc3RhcnRfcm93OiBpbnRlZ2VyIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2UuCisgICAgICAgIHN0cmluZ19zdGFydF9jb2w6IGludGVnZXIgY29sIG51bWJlciBvZiB0aGUgc3RyaW5nIHN0YXJ0IGluIHRoZSBzb3VyY2UuCisgICAgICAgICIiIgorICAgICAgICAjIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nOyBpZiB3ZSBzZWUgYSBiYWNrc2xhc2ggdGhlbiBlc2NhcGUgdGhlIG5leHQKKyAgICAgICAgIyBjaGFyYWN0ZXIsIGFuZCBza2lwIG92ZXIgaXQuICBJZiB3ZSBzZWUgYSBub24tZXNjYXBlZCBjaGFyYWN0ZXIsCisgICAgICAgICMgYWxlcnQsIGFuZCBjb250aW51ZS4KKyAgICAgICAgIworICAgICAgICAjIEFjY2VwdCBhIGJhY2tzbGFzaCB3aGVuIGl0IGVzY2FwZXMgYSBiYWNrc2xhc2gsIG9yIGEgcXVvdGUsIG9yCisgICAgICAgICMgZW5kLW9mLWxpbmUsIG9yIG9uZSBvZiB0aGUgbGV0dGVycyB0aGF0IGludHJvZHVjZSBhIHNwZWNpYWwgZXNjYXBlCisgICAgICAgICMgc2VxdWVuY2UgPGh0dHBzOi8vZG9jcy5weXRob24ub3JnL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLmh0bWw+CisgICAgICAgICMKKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpbmRleCA9IHN0cmluZ19ib2R5LmZpbmQoIlxcIiwgaW5kZXgpCisgICAgICAgICAgICBpZiBpbmRleCA9PSAtMToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBUaGVyZSBtdXN0IGJlIGEgbmV4dCBjaGFyYWN0ZXI7IGhhdmluZyBhIGJhY2tzbGFzaCBhdCB0aGUgZW5kCisgICAgICAgICAgICAjIG9mIHRoZSBzdHJpbmcgd291bGQgYmUgYSBTeW50YXhFcnJvci4KKyAgICAgICAgICAgIG5leHRfY2hhciA9IHN0cmluZ19ib2R5W2luZGV4ICsgMV0KKyAgICAgICAgICAgIG1hdGNoID0gc3RyaW5nX2JvZHlbaW5kZXggOiBpbmRleCArIDJdCisgICAgICAgICAgICAjIFRoZSBjb2x1bW4gb2Zmc2V0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc3RyaW5nIHRva2VuCisgICAgICAgICAgICAjIGlzIGJyb2tlbiBhY3Jvc3MgbGluZXMuIENhbGN1bGF0ZSByZWxhdGl2ZSB0byB0aGUgbmVhcmVzdCBsaW5lCisgICAgICAgICAgICAjIGJyZWFrIG9yIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdG9rZW4ncyBsaW5lLgorICAgICAgICAgICAgbGFzdF9uZXdsaW5lID0gc3RyaW5nX2JvZHkucmZpbmQoIlxuIiwgMCwgaW5kZXgpCisgICAgICAgICAgICBpZiBsYXN0X25ld2xpbmUgPT0gLTE6CisgICAgICAgICAgICAgICAgbGluZSA9IHN0YXJ0X3JvdworICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPSBpbmRleCArIHN0cmluZ19zdGFydF9jb2wKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZSA9IHN0YXJ0X3JvdyArIHN0cmluZ19ib2R5LmNvdW50KCJcbiIsIDAsIGluZGV4KQorICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPSBpbmRleCAtIGxhc3RfbmV3bGluZSAtIDEKKyAgICAgICAgICAgIGlmIG5leHRfY2hhciBpbiBzZWxmLlVOSUNPREVfRVNDQVBFX0NIQVJBQ1RFUlM6CisgICAgICAgICAgICAgICAgaWYgInUiIGluIHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgImIiIG5vdCBpbiBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIHBhc3MgICMgdW5pY29kZSBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbm9tYWxvdXMtdW5pY29kZS1lc2NhcGUtaW4tc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KG1hdGNoLCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0PWNvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsaWYgbmV4dF9jaGFyIG5vdCBpbiBzZWxmLkVTQ0FQRV9DSEFSQUNURVJTOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJhbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgIGxpbmU9bGluZSwKKyAgICAgICAgICAgICAgICAgICAgYXJncz0obWF0Y2gsKSwKKyAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldD1jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICMgV2hldGhlciBpdCB3YXMgYSB2YWxpZCBlc2NhcGUgb3Igbm90LCBiYWNrc2xhc2ggZm9sbG93ZWQgYnkKKyAgICAgICAgICAgICMgYW5vdGhlciBjaGFyYWN0ZXIgY2FuIGFsd2F5cyBiZSBjb25zdW1lZCB3aG9sZTogdGhlIHNlY29uZAorICAgICAgICAgICAgIyBjaGFyYWN0ZXIgY2FuIG5ldmVyIGJlIHRoZSBzdGFydCBvZiBhIG5ldyBiYWNrc2xhc2ggZXNjYXBlLgorICAgICAgICAgICAgaW5kZXggKz0gMgorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiInJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlciIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFN0cmluZ0Zvcm1hdENoZWNrZXIobGludGVyKSkKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihTdHJpbmdDb25zdGFudENoZWNrZXIobGludGVyKSkKKworCitkZWYgc3RyX2V2YWwodG9rZW4pOgorICAgICIiIgorICAgIE1vc3RseSByZXBsaWNhdGUgYGFzdC5saXRlcmFsX2V2YWwodG9rZW4pYCBtYW51YWxseSB0byBhdm9pZCBhbnkgcGVyZm9ybWFuY2UgaGl0LgorICAgIFRoaXMgc3VwcG9ydHMgZi1zdHJpbmdzLCBjb250cmFyeSB0byBgYXN0LmxpdGVyYWxfZXZhbGAuCisgICAgV2UgaGF2ZSB0byBzdXBwb3J0IGFsbCBzdHJpbmcgbGl0ZXJhbCBub3RhdGlvbnM6CisgICAgaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5odG1sI3N0cmluZy1hbmQtYnl0ZXMtbGl0ZXJhbHMKKyAgICAiIiIKKyAgICBpZiB0b2tlblswOjJdLmxvd2VyKCkgaW4gKCJmciIsICJyZiIpOgorICAgICAgICB0b2tlbiA9IHRva2VuWzI6XQorICAgIGVsaWYgdG9rZW5bMF0ubG93ZXIoKSBpbiAoInIiLCAidSIsICJmIik6CisgICAgICAgIHRva2VuID0gdG9rZW5bMTpdCisgICAgaWYgdG9rZW5bMDozXSBpbiAoJyIiIicsICInJyciKToKKyAgICAgICAgcmV0dXJuIHRva2VuWzM6LTNdCisgICAgcmV0dXJuIHRva2VuWzE6LTFdCisKKworZGVmIF9pc19sb25nX3N0cmluZyhzdHJpbmdfdG9rZW46IHN0cikgLT4gYm9vbDoKKyAgICAiIiJJcyB0aGlzIHN0cmluZyB0b2tlbiBhICJsb25nc3RyaW5nIiAoaXMgaXQgdHJpcGxlLXF1b3RlZCk/CisKKyAgICBMb25nIHN0cmluZ3MgYXJlIHRyaXBsZS1xdW90ZWQgYXMgZGVmaW5lZCBpbgorICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMuaHRtbCNzdHJpbmctYW5kLWJ5dGVzLWxpdGVyYWxzCisKKyAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgY2hlY2tzIGNoYXJhY3RlcnMgdXAgdGhyb3VnaCB0aGUgb3BlbiBxdW90ZXMuICBCZWNhdXNlIGl0J3MgbWVhbnQKKyAgICB0byBiZSBhcHBsaWVkIG9ubHkgdG8gdG9rZW5zIHRoYXQgcmVwcmVzZW50IHN0cmluZyBsaXRlcmFscywgaXQgZG9lc24ndCBib3RoZXIgdG8KKyAgICBjaGVjayBmb3IgY2xvc2UtcXVvdGVzIChkZW1vbnN0cmF0aW5nIHRoYXQgdGhlIGxpdGVyYWwgaXMgYSB3ZWxsLWZvcm1lZCBzdHJpbmcpLgorCisgICAgQXJnczoKKyAgICAgICAgc3RyaW5nX3Rva2VuOiBUaGUgc3RyaW5nIHRva2VuIHRvIGJlIHBhcnNlZC4KKworICAgIFJldHVybnM6CisgICAgICAgIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhpcyB0b2tlbiBtYXRjaGVzIGEgbG9uZ3N0cmluZworICAgICAgICByZWdleC4KKyAgICAiIiIKKyAgICByZXR1cm4gYm9vbCgKKyAgICAgICAgU0lOR0xFX1FVT1RFRF9SRUdFWC5tYXRjaChzdHJpbmdfdG9rZW4pCisgICAgICAgIG9yIERPVUJMRV9RVU9URURfUkVHRVgubWF0Y2goc3RyaW5nX3Rva2VuKQorICAgICkKKworCitkZWYgX2dldF9xdW90ZV9kZWxpbWl0ZXIoc3RyaW5nX3Rva2VuOiBzdHIpIC0+IHN0cjoKKyAgICAiIiJSZXR1cm5zIHRoZSBxdW90ZSBjaGFyYWN0ZXIgdXNlZCB0byBkZWxpbWl0IHRoaXMgdG9rZW4gc3RyaW5nLgorCisgICAgVGhpcyBmdW5jdGlvbiBkb2VzIGxpdHRsZSBjaGVja2luZyBmb3Igd2hldGhlciB0aGUgdG9rZW4gaXMgYSB3ZWxsLWZvcm1lZAorICAgIHN0cmluZy4KKworICAgIEFyZ3M6CisgICAgICAgIHN0cmluZ190b2tlbjogVGhlIHRva2VuIHRvIGJlIHBhcnNlZC4KKworICAgIFJldHVybnM6CisgICAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgc29sZWx5IHRoZSBmaXJzdCBxdW90ZSBkZWxpbWl0ZXIgY2hhcmFjdGVyIGluIHRoZSBwYXNzZWQKKyAgICAgICAgc3RyaW5nLgorCisgICAgUmFpc2VzOgorICAgICAgVmFsdWVFcnJvcjogTm8gcXVvdGUgZGVsaW1pdGVyIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQuCisgICAgIiIiCisgICAgbWF0Y2ggPSBRVU9URV9ERUxJTUlURVJfUkVHRVgubWF0Y2goc3RyaW5nX3Rva2VuKQorICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RyaW5nIHRva2VuICVzIGlzIG5vdCBhIHdlbGwtZm9ybWVkIHN0cmluZyIgJSBzdHJpbmdfdG9rZW4pCisgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDIpCisKKworZGVmIF9pc19xdW90ZV9kZWxpbWl0ZXJfY2hvc2VuX2ZyZWVseShzdHJpbmdfdG9rZW46IHN0cikgLT4gYm9vbDoKKyAgICAiIiJXYXMgdGhlcmUgYSBub24tYXdrd2FyZCBvcHRpb24gZm9yIHRoZSBxdW90ZSBkZWxpbWl0ZXI/CisKKyAgICBBcmdzOgorICAgICAgICBzdHJpbmdfdG9rZW46IFRoZSBxdW90ZWQgc3RyaW5nIHdob3NlIGRlbGltaXRlcnMgYXJlIHRvIGJlIGNoZWNrZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBXaGV0aGVyIHRoZXJlIHdhcyBhIGNob2ljZSBpbiB0aGlzIHRva2VuJ3MgcXVvdGUgY2hhcmFjdGVyIHRoYXQgd291bGQKKyAgICAgICAgbm90IGhhdmUgaW52b2x2ZWQgYmFja3NsYXNoLWVzY2FwaW5nIGFuIGludGVyaW9yIHF1b3RlIGNoYXJhY3Rlci4gIExvbmcKKyAgICAgICAgc3RyaW5ncyBhcmUgZXhjZXB0ZWQgZnJvbSB0aGlzIGFuYWx5c2lzIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlaXIKKyAgICAgICAgcXVvdGUgY2hhcmFjdGVycyBhcmUgc2V0IGJ5IHBvbGljeS4KKyAgICAiIiIKKyAgICBxdW90ZV9kZWxpbWl0ZXIgPSBfZ2V0X3F1b3RlX2RlbGltaXRlcihzdHJpbmdfdG9rZW4pCisgICAgdW5jaG9zZW5fZGVsaW1pdGVyID0gJyInIGlmIHF1b3RlX2RlbGltaXRlciA9PSAiJyIgZWxzZSAiJyIKKyAgICByZXR1cm4gYm9vbCgKKyAgICAgICAgcXVvdGVfZGVsaW1pdGVyCisgICAgICAgIGFuZCBub3QgX2lzX2xvbmdfc3RyaW5nKHN0cmluZ190b2tlbikKKyAgICAgICAgYW5kIHVuY2hvc2VuX2RlbGltaXRlciBub3QgaW4gc3RyX2V2YWwoc3RyaW5nX3Rva2VuKQorICAgICkKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy90eXBlY2hlY2sucHkgYi9weWxpbnQvY2hlY2tlcnMvdHlwZWNoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTg4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvdHlwZWNoZWNrLnB5CkBAIC0wLDAgKzEsMTk3NSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAwOSBKYW1lcyBMaW5nYXJkIDxqY2hsQGFyaXN0YW5ldHdvcmtzLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgRGF2aWQgU2hlYSA8ZHNoZWFAcmVkaGF0LmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IFN0ZXZlbiBNeWludCA8aGdAc3RldmVubXlpbnQuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgSG9sZ2VyIFBldGVycyA8ZW1haWxAaG9sZ2VyLXBldGVycy5kZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQW5lbnRyb3BpYyA8ZWdvQGFuZW50cm9waWMuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRG1pdHJ5IFByaWJ5c2ggPGRtYW5kQHlhbmRleC5ydT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFJlbmUgWmhhbmcgPHJ6OTlAY29ybmVsbC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxNSBSYWR1IENpb3JiYSA8cmFkdUBkZXZyYW5kb20ucm8+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgVG9kb3JvdiA8YXRvZG9yb3ZAb3RiLmJnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgSsO8cmdlbiBIZXJtYW5uIDxqaEB3ZWIuZGU+CisjIENvcHlyaWdodCAoYykgMjAxNiBKYWt1YiBXaWxrIDxqd2lsa0Bqd2lsay5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNiBGaWxpcGUgQnJhbmRlbmJ1cmdlciA8ZmlsYnJhbmRlbkBnb29nbGUuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCwgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUGFibG8gR2FsaW5kbyA8UGFibG9nc2FsQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEppbSBSb2JlcnRzb24gPGpyb2JlcnRzb245OGF0eEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBMdWNhcyBDaW1vbiA8bHVjYXMuY2ltb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBCZW4gR3JlZW4gPGJlbmhncmVlbkBpY2xvdWQuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggS29uc3RhbnRpbiA8R2l0aHViQHBoZWFuZXguZGU+CisjIENvcHlyaWdodCAoYykgMjAxOCBKdXN0aW4gTGkgPGp1c3Rpbm5obGlAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQW5keSBQYWxtZXIgPDI1MTIzNzc5K25pbmV6ZXJvemVyb25pbmVAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgbWF0dGxiZWNrIDwxNzEwODc1MittYXR0bGJlY2tAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgTWFydGluIFZpZWxzbWFpZXIgPG1hcnRpbi52aWVsc21haWVyQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFNhbnRpYWdvIENhc3RybyA8YnJ5YW50QG1vbnRldmlkZW8uY29tLnV5PgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgeW9yeTggPDM5NzQ1MzY3K3lvcnk4QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEZlZGVyaWNvIEJvbmQgPGZlZGVyaWNvYm9uZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBQYXNjYWwgQ29ycGV0IDxwY29ycGV0QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFBldGVyIEtvbGJ1cyA8cGV0ZXIua29sYnVzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEp1bGllbiBQYWxhcmQgPGp1bGllbkBwYWxhcmQuZnI+CisjIENvcHlyaWdodCAoYykgMjAyMCBSYW0gUmFjaHVtIDxyYW1AcmFjaHVtLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW51YmhhdiA8MzU2MjE3NTkrYW51YmgtdkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSB5dXNoYW8yIDwzNjg0ODQ3Mit5dXNoYW8yQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEFuZHJldyBIYWlnaCA8bmVsZmluQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEplbnMgSC4gTmllbHNlbiA8SmVucy5OaWVsc2VuQG1pY3Jvc29mdC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBJa3JhZHV5YSBFZGlhbiA8aWtyYWR1eWFAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiInRyeSB0byBmaW5kIG1vcmUgYnVncyBpbiB0aGUgY29kZSB1c2luZyBhc3Ryb2lkIGluZmVyZW5jZSBjYXBhYmlsaXRpZXMKKyIiIgorCitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBmbm1hdGNoCitpbXBvcnQgaGVhcHEKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHJlCitpbXBvcnQgc2hsZXgKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTZXF1ZW5jZQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHNpbmdsZWRpc3BhdGNoCitmcm9tIHR5cGluZyBpbXBvcnQgUGF0dGVybiwgVHVwbGUKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyLCB1dGlscworZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0ICgKKyAgICBjaGVja19tZXNzYWdlcywKKyAgICBkZWNvcmF0ZWRfd2l0aCwKKyAgICBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eSwKKyAgICBoYXNfa25vd25fYmFzZXMsCisgICAgaXNfYnVpbHRpbl9vYmplY3QsCisgICAgaXNfY2xhc3NkZWZfdHlwZSwKKyAgICBpc19jb21wcmVoZW5zaW9uLAorICAgIGlzX2luc2lkZV9hYnN0cmFjdF9jbGFzcywKKyAgICBpc19pdGVyYWJsZSwKKyAgICBpc19tYXBwaW5nLAorICAgIGlzX292ZXJsb2FkX3N0dWIsCisgICAgaXNfcG9zdHBvbmVkX2V2YWx1YXRpb25fZW5hYmxlZCwKKyAgICBpc19zdXBlciwKKyAgICBub2RlX2lnbm9yZXNfZXhjZXB0aW9uLAorICAgIHNhZmVfaW5mZXIsCisgICAgc3VwcG9ydHNfZGVsaXRlbSwKKyAgICBzdXBwb3J0c19nZXRpdGVtLAorICAgIHN1cHBvcnRzX21lbWJlcnNoaXBfdGVzdCwKKyAgICBzdXBwb3J0c19zZXRpdGVtLAorKQorZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCBQWTMxMF9QTFVTCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJTkZFUkVOQ0UsIElBc3Ryb2lkQ2hlY2tlcgorZnJvbSBweWxpbnQudXRpbHMgaW1wb3J0IGdldF9nbG9iYWxfb3B0aW9uCisKK0JVSUxUSU5TID0gYnVpbHRpbnMuX19uYW1lX18KK1NUUl9GT1JNQVQgPSB7IiVzLnN0ci5mb3JtYXQiICUgQlVJTFRJTlN9CitBU1lOQ0lPX0NPUk9VVElORSA9ICJhc3luY2lvLmNvcm91dGluZXMuY29yb3V0aW5lIgorQlVJTFRJTl9UVVBMRSA9ICJidWlsdGlucy50dXBsZSIKK1RZUEVfQU5OT1RBVElPTl9OT0RFU19UWVBFUyA9ICgKKyAgICBhc3Ryb2lkLkFubkFzc2lnbiwKKyAgICBhc3Ryb2lkLkFyZ3VtZW50cywKKyAgICBhc3Ryb2lkLkZ1bmN0aW9uRGVmLAorKQorCisKK2RlZiBfdW5mbGF0dGVuKGl0ZXJhYmxlKToKKyAgICBmb3IgaW5kZXgsIGVsZW0gaW4gZW51bWVyYXRlKGl0ZXJhYmxlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShlbGVtLCBTZXF1ZW5jZSkgYW5kIG5vdCBpc2luc3RhbmNlKGVsZW0sIHN0cik6CisgICAgICAgICAgICB5aWVsZCBmcm9tIF91bmZsYXR0ZW4oZWxlbSkKKyAgICAgICAgZWxpZiBlbGVtIGFuZCBub3QgaW5kZXg6CisgICAgICAgICAgICAjIFdlJ3JlIGludGVyZXN0ZWQgb25seSBpbiB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICAgICAgICAgIHlpZWxkIGVsZW0KKworCitkZWYgX2ZsYXR0ZW5fY29udGFpbmVyKGl0ZXJhYmxlKToKKyAgICAjIEZsYXR0ZW4gbmVzdGVkIGNvbnRhaW5lcnMgaW50byBhIHNpbmdsZSBpdGVyYWJsZQorICAgIGZvciBpdGVtIGluIGl0ZXJhYmxlOgorICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIChsaXN0LCB0dXBsZSwgdHlwZXMuR2VuZXJhdG9yVHlwZSkpOgorICAgICAgICAgICAgeWllbGQgZnJvbSBfZmxhdHRlbl9jb250YWluZXIoaXRlbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworCitkZWYgX2lzX293bmVyX2lnbm9yZWQob3duZXIsIGF0dHJuYW1lLCBpZ25vcmVkX2NsYXNzZXMsIGlnbm9yZWRfbW9kdWxlcyk6CisgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuIG93bmVyIHNob3VsZCBiZSBpZ25vcmVkCisKKyAgICBUaGlzIHdpbGwgdmVyaWZ5IGlmIHRoZSBvd25lcidzIG1vZHVsZSBpcyBpbiAqaWdub3JlZF9tb2R1bGVzKgorICAgIG9yIHRoZSBvd25lcidzIG1vZHVsZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpcyBpbiAqaWdub3JlZF9tb2R1bGVzKgorICAgIG9yIGlmIHRoZSAqaWdub3JlZF9tb2R1bGVzKiBjb250YWlucyBhIHBhdHRlcm4gd2hpY2ggY2F0Y2hlcworICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbW9kdWxlLgorCisgICAgQWxzbywgc2ltaWxhciBjaGVja3MgYXJlIGRvbmUgZm9yIHRoZSBvd25lciBpdHNlbGYsIGlmIGl0cyBuYW1lCisgICAgbWF0Y2hlcyBhbnkgbmFtZSBmcm9tIHRoZSAqaWdub3JlZF9jbGFzc2VzKiBvciBpZiBpdHMgcXVhbGlmaWVkCisgICAgbmFtZSBjYW4gYmUgZm91bmQgaW4gKmlnbm9yZWRfY2xhc3NlcyouCisgICAgIiIiCisgICAgaWdub3JlZF9tb2R1bGVzID0gc2V0KGlnbm9yZWRfbW9kdWxlcykKKyAgICBtb2R1bGVfbmFtZSA9IG93bmVyLnJvb3QoKS5uYW1lCisgICAgbW9kdWxlX3FuYW1lID0gb3duZXIucm9vdCgpLnFuYW1lKCkKKworICAgIGZvciBpZ25vcmUgaW4gaWdub3JlZF9tb2R1bGVzOgorICAgICAgICAjIFRyeSB0byBtYXRjaCB0aGUgbW9kdWxlIG5hbWUgLyBmdWxseSBxdWFsaWZpZWQgbmFtZSBkaXJlY3RseQorICAgICAgICBpZiBtb2R1bGVfcW5hbWUgaW4gaWdub3JlZF9tb2R1bGVzIG9yIG1vZHVsZV9uYW1lIGluIGlnbm9yZWRfbW9kdWxlczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBUcnkgdG8gc2VlIGlmIHRoZSBpZ25vcmVzIHBhdHRlcm4gbWF0Y2ggYWdhaW5zdCB0aGUgbW9kdWxlIG5hbWUuCisgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaChtb2R1bGVfcW5hbWUsIGlnbm9yZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgT3RoZXJ3aXNlIHdlIG1pZ2h0IGhhdmUgYSByb290IG1vZHVsZSBuYW1lIGJlaW5nIGlnbm9yZWQsCisgICAgICAgICMgYW5kIHRoZSBxdWFsaWZpZWQgb3duZXIgaGFzIG1vcmUgbGV2ZWxzIG9mIGRlcHRoLgorICAgICAgICBwYXJ0cyA9IGRlcXVlKG1vZHVsZV9uYW1lLnNwbGl0KCIuIikpCisgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gIiIKKworICAgICAgICB3aGlsZSBwYXJ0czoKKyAgICAgICAgICAgIHBhcnQgPSBwYXJ0cy5wb3BsZWZ0KCkKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50X21vZHVsZToKKyAgICAgICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IHBhcnQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3VycmVudF9tb2R1bGUgKz0gZiIue3BhcnR9IgorICAgICAgICAgICAgaWYgY3VycmVudF9tb2R1bGUgaW4gaWdub3JlZF9tb2R1bGVzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIE1hdGNoIGFnYWluc3QgaWdub3JlZCBjbGFzc2VzLgorICAgIGlnbm9yZWRfY2xhc3NlcyA9IHNldChpZ25vcmVkX2NsYXNzZXMpCisgICAgaWYgaGFzYXR0cihvd25lciwgInFuYW1lIik6CisgICAgICAgIHFuYW1lID0gb3duZXIucW5hbWUoKQorICAgIGVsc2U6CisgICAgICAgIHFuYW1lID0gIiIKKyAgICByZXR1cm4gYW55KGlnbm9yZSBpbiAoYXR0cm5hbWUsIHFuYW1lKSBmb3IgaWdub3JlIGluIGlnbm9yZWRfY2xhc3NlcykKKworCitAc2luZ2xlZGlzcGF0Y2gKK2RlZiBfbm9kZV9uYW1lcyhub2RlKToKKyAgICBpZiBub3QgaGFzYXR0cihub2RlLCAibG9jYWxzIik6CisgICAgICAgIHJldHVybiBbXQorICAgIHJldHVybiBub2RlLmxvY2Fscy5rZXlzKCkKKworCitAX25vZGVfbmFtZXMucmVnaXN0ZXIoYXN0cm9pZC5DbGFzc0RlZikKK0Bfbm9kZV9uYW1lcy5yZWdpc3Rlcihhc3Ryb2lkLkluc3RhbmNlKQorZGVmIF8obm9kZSk6CisgICAgdmFsdWVzID0gaXRlcnRvb2xzLmNoYWluKG5vZGUuaW5zdGFuY2VfYXR0cnMua2V5cygpLCBub2RlLmxvY2Fscy5rZXlzKCkpCisKKyAgICB0cnk6CisgICAgICAgIG1ybyA9IG5vZGUubXJvKClbMTpdCisgICAgZXhjZXB0IChOb3RJbXBsZW1lbnRlZEVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBtcm8gPSBub2RlLmFuY2VzdG9ycygpCisKKyAgICBvdGhlcl92YWx1ZXMgPSBbdmFsdWUgZm9yIGNscyBpbiBtcm8gZm9yIHZhbHVlIGluIF9ub2RlX25hbWVzKGNscyldCisgICAgcmV0dXJuIGl0ZXJ0b29scy5jaGFpbih2YWx1ZXMsIG90aGVyX3ZhbHVlcykKKworCitkZWYgX3N0cmluZ19kaXN0YW5jZShzZXExLCBzZXEyKToKKyAgICBzZXEyX2xlbmd0aCA9IGxlbihzZXEyKQorCisgICAgcm93ID0gbGlzdChyYW5nZSgxLCBzZXEyX2xlbmd0aCArIDEpKSArIFswXQorICAgIGZvciBzZXExX2luZGV4LCBzZXExX2NoYXIgaW4gZW51bWVyYXRlKHNlcTEpOgorICAgICAgICBsYXN0X3JvdyA9IHJvdworICAgICAgICByb3cgPSBbMF0gKiBzZXEyX2xlbmd0aCArIFtzZXExX2luZGV4ICsgMV0KKworICAgICAgICBmb3Igc2VxMl9pbmRleCwgc2VxMl9jaGFyIGluIGVudW1lcmF0ZShzZXEyKToKKyAgICAgICAgICAgIHJvd1tzZXEyX2luZGV4XSA9IG1pbigKKyAgICAgICAgICAgICAgICBsYXN0X3Jvd1tzZXEyX2luZGV4XSArIDEsCisgICAgICAgICAgICAgICAgcm93W3NlcTJfaW5kZXggLSAxXSArIDEsCisgICAgICAgICAgICAgICAgbGFzdF9yb3dbc2VxMl9pbmRleCAtIDFdICsgKHNlcTFfY2hhciAhPSBzZXEyX2NoYXIpLAorICAgICAgICAgICAgKQorCisgICAgcmV0dXJuIHJvd1tzZXEyX2xlbmd0aCAtIDFdCisKKworZGVmIF9zaW1pbGFyX25hbWVzKG93bmVyLCBhdHRybmFtZSwgZGlzdGFuY2VfdGhyZXNob2xkLCBtYXhfY2hvaWNlcyk6CisgICAgIiIiR2l2ZW4gYW4gb3duZXIgYW5kIGEgbmFtZSwgdHJ5IHRvIGZpbmQgc2ltaWxhciBuYW1lcworCisgICAgVGhlIHNpbWlsYXIgbmFtZXMgYXJlIHNlYXJjaGVkIGdpdmVuIGEgZGlzdGFuY2UgbWV0cmljIGFuZCBvbmx5CisgICAgYSBnaXZlbiBudW1iZXIgb2YgY2hvaWNlcyB3aWxsIGJlIHJldHVybmVkLgorICAgICIiIgorICAgIHBvc3NpYmxlX25hbWVzID0gW10KKyAgICBuYW1lcyA9IF9ub2RlX25hbWVzKG93bmVyKQorCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIGlmIG5hbWUgPT0gYXR0cm5hbWU6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGRpc3RhbmNlID0gX3N0cmluZ19kaXN0YW5jZShhdHRybmFtZSwgbmFtZSkKKyAgICAgICAgaWYgZGlzdGFuY2UgPD0gZGlzdGFuY2VfdGhyZXNob2xkOgorICAgICAgICAgICAgcG9zc2libGVfbmFtZXMuYXBwZW5kKChuYW1lLCBkaXN0YW5jZSkpCisKKyAgICAjIE5vdyBnZXQgYmFjayB0aGUgdmFsdWVzIHdpdGggYSBtaW5pbXVtLCB1cCB0byB0aGUgZ2l2ZW4KKyAgICAjIGxpbWl0IG9yIGNob2ljZXMuCisgICAgcGlja2VkID0gWworICAgICAgICBuYW1lCisgICAgICAgIGZvciAobmFtZSwgXykgaW4gaGVhcHEubnNtYWxsZXN0KAorICAgICAgICAgICAgbWF4X2Nob2ljZXMsIHBvc3NpYmxlX25hbWVzLCBrZXk9b3BlcmF0b3IuaXRlbWdldHRlcigxKQorICAgICAgICApCisgICAgXQorICAgIHJldHVybiBzb3J0ZWQocGlja2VkKQorCisKK2RlZiBfbWlzc2luZ19tZW1iZXJfaGludChvd25lciwgYXR0cm5hbWUsIGRpc3RhbmNlX3RocmVzaG9sZCwgbWF4X2Nob2ljZXMpOgorICAgIG5hbWVzID0gX3NpbWlsYXJfbmFtZXMob3duZXIsIGF0dHJuYW1lLCBkaXN0YW5jZV90aHJlc2hvbGQsIG1heF9jaG9pY2VzKQorICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgIyBObyBzaW1pbGFyIG5hbWUuCisgICAgICAgIHJldHVybiAiIgorCisgICAgbmFtZXMgPSBbcmVwcihuYW1lKSBmb3IgbmFtZSBpbiBuYW1lc10KKyAgICBpZiBsZW4obmFtZXMpID09IDE6CisgICAgICAgIG5hbWVzID0gIiwgIi5qb2luKG5hbWVzKQorICAgIGVsc2U6CisgICAgICAgIG5hbWVzID0gIm9uZSBvZiB7fSBvciB7fSIuZm9ybWF0KCIsICIuam9pbihuYW1lc1s6LTFdKSwgbmFtZXNbLTFdKQorCisgICAgcmV0dXJuIGYiOyBtYXliZSB7bmFtZXN9PyIKKworCitNU0dTID0geworICAgICJFMTEwMSI6ICgKKyAgICAgICAgIiVzICVyIGhhcyBubyAlciBtZW1iZXIlcyIsCisgICAgICAgICJuby1tZW1iZXIiLAorICAgICAgICAiVXNlZCB3aGVuIGEgdmFyaWFibGUgaXMgYWNjZXNzZWQgZm9yIGFuIHVuZXhpc3RlbnQgbWVtYmVyLiIsCisgICAgICAgIHsib2xkX25hbWVzIjogWygiRTExMDMiLCAibWF5YmUtbm8tbWVtYmVyIildfSwKKyAgICApLAorICAgICJJMTEwMSI6ICgKKyAgICAgICAgIiVzICVyIGhhcyBubyAlciBtZW1iZXIlcywgYnV0IHNvdXJjZSBpcyB1bmF2YWlsYWJsZS4gQ29uc2lkZXIgIgorICAgICAgICAiYWRkaW5nIHRoaXMgbW9kdWxlIHRvIGV4dGVuc2lvbi1wa2ctYWxsb3ctbGlzdCBpZiB5b3Ugd2FudCAiCisgICAgICAgICJ0byBwZXJmb3JtIGFuYWx5c2lzIGJhc2VkIG9uIHJ1bi10aW1lIGludHJvc3BlY3Rpb24gb2YgbGl2aW5nIG9iamVjdHMuIiwKKyAgICAgICAgImMtZXh0ZW5zaW9uLW5vLW1lbWJlciIsCisgICAgICAgICJVc2VkIHdoZW4gYSB2YXJpYWJsZSBpcyBhY2Nlc3NlZCBmb3Igbm9uLWV4aXN0ZW50IG1lbWJlciBvZiBDICIKKyAgICAgICAgImV4dGVuc2lvbi4gRHVlIHRvIHVuYXZhaWxhYmlsaXR5IG9mIHNvdXJjZSBzdGF0aWMgYW5hbHlzaXMgaXMgaW1wb3NzaWJsZSwgIgorICAgICAgICAiYnV0IGl0IG1heSBiZSBwZXJmb3JtZWQgYnkgaW50cm9zcGVjdGluZyBsaXZpbmcgb2JqZWN0cyBpbiBydW4tdGltZS4iLAorICAgICksCisgICAgIkUxMTAyIjogKAorICAgICAgICAiJXMgaXMgbm90IGNhbGxhYmxlIiwKKyAgICAgICAgIm5vdC1jYWxsYWJsZSIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gb2JqZWN0IGJlaW5nIGNhbGxlZCBoYXMgYmVlbiBpbmZlcnJlZCB0byBhIG5vbiAiCisgICAgICAgICJjYWxsYWJsZSBvYmplY3QuIiwKKyAgICApLAorICAgICJFMTExMSI6ICgKKyAgICAgICAgIkFzc2lnbmluZyByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCB3aGVyZSB0aGUgZnVuY3Rpb24gaGFzIG5vIHJldHVybiIsCisgICAgICAgICJhc3NpZ25tZW50LWZyb20tbm8tcmV0dXJuIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBhc3NpZ25tZW50IGlzIGRvbmUgb24gYSBmdW5jdGlvbiBjYWxsIGJ1dCB0aGUgIgorICAgICAgICAiaW5mZXJyZWQgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gYW55dGhpbmcuIiwKKyAgICApLAorICAgICJFMTEyMCI6ICgKKyAgICAgICAgIk5vIHZhbHVlIGZvciBhcmd1bWVudCAlcyBpbiAlcyBjYWxsIiwKKyAgICAgICAgIm5vLXZhbHVlLWZvci1wYXJhbWV0ZXIiLAorICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gY2FsbCBwYXNzZXMgdG9vIGZldyBhcmd1bWVudHMuIiwKKyAgICApLAorICAgICJFMTEyMSI6ICgKKyAgICAgICAgIlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIGZvciAlcyBjYWxsIiwKKyAgICAgICAgInRvby1tYW55LWZ1bmN0aW9uLWFyZ3MiLAorICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gY2FsbCBwYXNzZXMgdG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMuIiwKKyAgICApLAorICAgICJFMTEyMyI6ICgKKyAgICAgICAgIlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAlciBpbiAlcyBjYWxsIiwKKyAgICAgICAgInVuZXhwZWN0ZWQta2V5d29yZC1hcmciLAorICAgICAgICAiVXNlZCB3aGVuIGEgZnVuY3Rpb24gY2FsbCBwYXNzZXMgYSBrZXl3b3JkIGFyZ3VtZW50IHRoYXQgIgorICAgICAgICAiZG9lc24ndCBjb3JyZXNwb25kIHRvIG9uZSBvZiB0aGUgZnVuY3Rpb24ncyBwYXJhbWV0ZXIgbmFtZXMuIiwKKyAgICApLAorICAgICJFMTEyNCI6ICgKKyAgICAgICAgIkFyZ3VtZW50ICVyIHBhc3NlZCBieSBwb3NpdGlvbiBhbmQga2V5d29yZCBpbiAlcyBjYWxsIiwKKyAgICAgICAgInJlZHVuZGFudC1rZXl3b3JkLWFyZyIsCisgICAgICAgICJVc2VkIHdoZW4gYSBmdW5jdGlvbiBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhc3NpZ25pbmcgbXVsdGlwbGUgIgorICAgICAgICAidmFsdWVzIHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyLCBvbmUgdmFsdWUgZnJvbSBhIHBvc2l0aW9uYWwgIgorICAgICAgICAiYXJndW1lbnQgYW5kIG9uZSBmcm9tIGEga2V5d29yZCBhcmd1bWVudC4iLAorICAgICksCisgICAgIkUxMTI1IjogKAorICAgICAgICAiTWlzc2luZyBtYW5kYXRvcnkga2V5d29yZCBhcmd1bWVudCAlciBpbiAlcyBjYWxsIiwKKyAgICAgICAgIm1pc3Npbmcta3dvYSIsCisgICAgICAgICgKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBmdW5jdGlvbiBjYWxsIGRvZXMgbm90IHBhc3MgYSBtYW5kYXRvcnkiCisgICAgICAgICAgICAiIGtleXdvcmQtb25seSBhcmd1bWVudC4iCisgICAgICAgICksCisgICAgKSwKKyAgICAiRTExMjYiOiAoCisgICAgICAgICJTZXF1ZW5jZSBpbmRleCBpcyBub3QgYW4gaW50LCBzbGljZSwgb3IgaW5zdGFuY2Ugd2l0aCBfX2luZGV4X18iLAorICAgICAgICAiaW52YWxpZC1zZXF1ZW5jZS1pbmRleCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBzZXF1ZW5jZSB0eXBlIGlzIGluZGV4ZWQgd2l0aCBhbiBpbnZhbGlkIHR5cGUuICIKKyAgICAgICAgIlZhbGlkIHR5cGVzIGFyZSBpbnRzLCBzbGljZXMsIGFuZCBvYmplY3RzIHdpdGggYW4gX19pbmRleF9fICIKKyAgICAgICAgIm1ldGhvZC4iLAorICAgICksCisgICAgIkUxMTI3IjogKAorICAgICAgICAiU2xpY2UgaW5kZXggaXMgbm90IGFuIGludCwgTm9uZSwgb3IgaW5zdGFuY2Ugd2l0aCBfX2luZGV4X18iLAorICAgICAgICAiaW52YWxpZC1zbGljZS1pbmRleCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBzbGljZSBpbmRleCBpcyBub3QgYW4gaW50ZWdlciwgTm9uZSwgb3IgYW4gb2JqZWN0ICIKKyAgICAgICAgIndpdGggYW4gX19pbmRleF9fIG1ldGhvZC4iLAorICAgICksCisgICAgIkUxMTI4IjogKAorICAgICAgICAiQXNzaWduaW5nIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHdoZXJlIHRoZSBmdW5jdGlvbiByZXR1cm5zIE5vbmUiLAorICAgICAgICAiYXNzaWdubWVudC1mcm9tLW5vbmUiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGFzc2lnbm1lbnQgaXMgZG9uZSBvbiBhIGZ1bmN0aW9uIGNhbGwgYnV0IHRoZSAiCisgICAgICAgICJpbmZlcnJlZCBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcgYnV0IE5vbmUuIiwKKyAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMTExMSIsICJvbGQtYXNzaWdubWVudC1mcm9tLW5vbmUiKV19LAorICAgICksCisgICAgIkUxMTI5IjogKAorICAgICAgICAiQ29udGV4dCBtYW5hZ2VyICclcycgZG9lc24ndCBpbXBsZW1lbnQgX19lbnRlcl9fIGFuZCBfX2V4aXRfXy4iLAorICAgICAgICAibm90LWNvbnRleHQtbWFuYWdlciIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW5zdGFuY2UgaW4gYSB3aXRoIHN0YXRlbWVudCBkb2Vzbid0IGltcGxlbWVudCAiCisgICAgICAgICJ0aGUgY29udGV4dCBtYW5hZ2VyIHByb3RvY29sKF9fZW50ZXJfXy9fX2V4aXRfXykuIiwKKyAgICApLAorICAgICJFMTEzMCI6ICgKKyAgICAgICAgIiVzIiwKKyAgICAgICAgImludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlIiwKKyAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIHVuYXJ5IG9wZXJhbmQgaXMgdXNlZCBvbiBhbiBvYmplY3Qgd2hpY2ggZG9lcyBub3QgIgorICAgICAgICAic3VwcG9ydCB0aGlzIHR5cGUgb2Ygb3BlcmF0aW9uLiIsCisgICAgKSwKKyAgICAiRTExMzEiOiAoCisgICAgICAgICIlcyIsCisgICAgICAgICJ1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uIiwKKyAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byAiCisgICAgICAgICJvcGVyYW5kcyBpcyBub3Qgc3VwcG9ydGVkLiIsCisgICAgKSwKKyAgICAiRTExMzIiOiAoCisgICAgICAgICJHb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICVyIGluIGZ1bmN0aW9uIGNhbGwiLAorICAgICAgICAicmVwZWF0ZWQta2V5d29yZCIsCisgICAgICAgICJFbWl0dGVkIHdoZW4gYSBmdW5jdGlvbiBjYWxsIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGEga2V5d29yZC4iLAorICAgICksCisgICAgIkUxMTM1IjogKAorICAgICAgICAiVmFsdWUgJyVzJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0IiwKKyAgICAgICAgInVuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdCIsCisgICAgICAgICJFbWl0dGVkIHdoZW4gYW4gaW5zdGFuY2UgaW4gbWVtYmVyc2hpcCB0ZXN0IGV4cHJlc3Npb24gZG9lc24ndCAiCisgICAgICAgICJpbXBsZW1lbnQgbWVtYmVyc2hpcCBwcm90b2NvbCAoX19jb250YWluc19fL19faXRlcl9fL19fZ2V0aXRlbV9fKS4iLAorICAgICksCisgICAgIkUxMTM2IjogKAorICAgICAgICAiVmFsdWUgJyVzJyBpcyB1bnN1YnNjcmlwdGFibGUiLAorICAgICAgICAidW5zdWJzY3JpcHRhYmxlLW9iamVjdCIsCisgICAgICAgICJFbWl0dGVkIHdoZW4gYSBzdWJzY3JpcHRlZCB2YWx1ZSBkb2Vzbid0IHN1cHBvcnQgc3Vic2NyaXB0aW9uICIKKyAgICAgICAgIihpLmUuIGRvZXNuJ3QgZGVmaW5lIF9fZ2V0aXRlbV9fIG1ldGhvZCBvciBfX2NsYXNzX2dldGl0ZW1fXyBmb3IgYSBjbGFzcykuIiwKKyAgICApLAorICAgICJFMTEzNyI6ICgKKyAgICAgICAgIiVyIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50IiwKKyAgICAgICAgInVuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uIiwKKyAgICAgICAgIkVtaXR0ZWQgd2hlbiBhbiBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQgIgorICAgICAgICAiKGkuZS4gZG9lc24ndCBkZWZpbmUgX19zZXRpdGVtX18gbWV0aG9kKS4iLAorICAgICksCisgICAgIkUxMTM4IjogKAorICAgICAgICAiJXIgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwKKyAgICAgICAgInVuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb24iLAorICAgICAgICAiRW1pdHRlZCB3aGVuIGFuIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24gIgorICAgICAgICAiKGkuZS4gZG9lc24ndCBkZWZpbmUgX19kZWxpdGVtX18gbWV0aG9kKS4iLAorICAgICksCisgICAgIkUxMTM5IjogKAorICAgICAgICAiSW52YWxpZCBtZXRhY2xhc3MgJXIgdXNlZCIsCisgICAgICAgICJpbnZhbGlkLW1ldGFjbGFzcyIsCisgICAgICAgICJFbWl0dGVkIHdoZW5ldmVyIHdlIGNhbiBkZXRlY3QgdGhhdCBhIGNsYXNzIGlzIHVzaW5nLCAiCisgICAgICAgICJhcyBhIG1ldGFjbGFzcywgc29tZXRoaW5nIHdoaWNoIG1pZ2h0IGJlIGludmFsaWQgZm9yIHVzaW5nIGFzICIKKyAgICAgICAgImEgbWV0YWNsYXNzLiIsCisgICAgKSwKKyAgICAiRTExNDAiOiAoCisgICAgICAgICJEaWN0IGtleSBpcyB1bmhhc2hhYmxlIiwKKyAgICAgICAgInVuaGFzaGFibGUtZGljdC1rZXkiLAorICAgICAgICAiRW1pdHRlZCB3aGVuIGEgZGljdCBrZXkgaXMgbm90IGhhc2hhYmxlICIKKyAgICAgICAgIihpLmUuIGRvZXNuJ3QgZGVmaW5lIF9faGFzaF9fIG1ldGhvZCkuIiwKKyAgICApLAorICAgICJFMTE0MSI6ICgKKyAgICAgICAgIlVucGFja2luZyBhIGRpY3Rpb25hcnkgaW4gaXRlcmF0aW9uIHdpdGhvdXQgY2FsbGluZyAuaXRlbXMoKSIsCisgICAgICAgICJkaWN0LWl0ZXItbWlzc2luZy1pdGVtcyIsCisgICAgICAgICJFbWl0dGVkIHdoZW4gdHJ5aW5nIHRvIGl0ZXJhdGUgdGhyb3VnaCBhIGRpY3Qgd2l0aG91dCBjYWxsaW5nIC5pdGVtcygpIiwKKyAgICApLAorICAgICJFMTE0MiI6ICgKKyAgICAgICAgIidhd2FpdCcgc2hvdWxkIGJlIHVzZWQgd2l0aGluIGFuIGFzeW5jIGZ1bmN0aW9uIiwKKyAgICAgICAgImF3YWl0LW91dHNpZGUtYXN5bmMiLAorICAgICAgICAiRW1pdHRlZCB3aGVuIGF3YWl0IGlzIHVzZWQgb3V0c2lkZSBhbiBhc3luYyBmdW5jdGlvbi4iLAorICAgICksCisgICAgIlcxMTEzIjogKAorICAgICAgICAiS2V5d29yZCBhcmd1bWVudCBiZWZvcmUgdmFyaWFibGUgcG9zaXRpb25hbCBhcmd1bWVudHMgbGlzdCAiCisgICAgICAgICJpbiB0aGUgZGVmaW5pdGlvbiBvZiAlcyBmdW5jdGlvbiIsCisgICAgICAgICJrZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnIiwKKyAgICAgICAgIldoZW4gZGVmaW5pbmcgYSBrZXl3b3JkIGFyZ3VtZW50IGJlZm9yZSB2YXJpYWJsZSBwb3NpdGlvbmFsIGFyZ3VtZW50cywgb25lIGNhbiAiCisgICAgICAgICJlbmQgdXAgaW4gaGF2aW5nIG11bHRpcGxlIHZhbHVlcyBwYXNzZWQgZm9yIHRoZSBhZm9yZW1lbnRpb25lZCBwYXJhbWV0ZXIgaW4gIgorICAgICAgICAiY2FzZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGtleXdvcmQgYXJndW1lbnRzLiIsCisgICAgKSwKKyAgICAiVzExMTQiOiAoCisgICAgICAgICJQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcHBlYXIgdG8gYmUgb3V0IG9mIG9yZGVyIiwKKyAgICAgICAgImFyZ3VtZW50cy1vdXQtb2Ytb3JkZXIiLAorICAgICAgICAiRW1pdHRlZCAgd2hlbiB0aGUgY2FsbGVyJ3MgYXJndW1lbnQgbmFtZXMgZnVsbHkgbWF0Y2ggdGhlIHBhcmFtZXRlciAiCisgICAgICAgICJuYW1lcyBpbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGJ1dCBkbyBub3QgaGF2ZSB0aGUgc2FtZSBvcmRlci4iLAorICAgICksCisgICAgIlcxMTE1IjogKAorICAgICAgICAiTm9uLXN0cmluZyB2YWx1ZSBhc3NpZ25lZCB0byBfX25hbWVfXyIsCisgICAgICAgICJub24tc3RyLWFzc2lnbm1lbnQtdG8tZHVuZGVyLW5hbWUiLAorICAgICAgICAiRW1pdHRlZCB3aGVuIGEgbm9uLXN0cmluZyB2YXVlIGlzIGFzc2lnbmVkIHRvIF9fbmFtZV9fIiwKKyAgICApLAorICAgICJXMTExNiI6ICgKKyAgICAgICAgIlNlY29uZCBhcmd1bWVudCBvZiBpc2luc3RhbmNlIGlzIG5vdCBhIHR5cGUiLAorICAgICAgICAiaXNpbnN0YW5jZS1zZWNvbmQtYXJndW1lbnQtbm90LXZhbGlkLXR5cGUiLAorICAgICAgICAiRW1pdHRlZCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgYW4gaXNpbnN0YW5jZSBjYWxsIGlzIG5vdCBhIHR5cGUuIiwKKyAgICApLAorfQorCisjIGJ1aWx0aW4gc2VxdWVuY2UgdHlwZXMgaW4gUHl0aG9uIDIgYW5kIDMuCitTRVFVRU5DRV9UWVBFUyA9IHsKKyAgICAic3RyIiwKKyAgICAidW5pY29kZSIsCisgICAgImxpc3QiLAorICAgICJ0dXBsZSIsCisgICAgImJ5dGVhcnJheSIsCisgICAgInhyYW5nZSIsCisgICAgInJhbmdlIiwKKyAgICAiYnl0ZXMiLAorICAgICJtZW1vcnl2aWV3IiwKK30KKworCitkZWYgX2VtaXRfbm9fbWVtYmVyKG5vZGUsIG93bmVyLCBvd25lcl9uYW1lLCBpZ25vcmVkX21peGlucz1UcnVlLCBpZ25vcmVkX25vbmU9VHJ1ZSk6CisgICAgIiIiVHJ5IHRvIHNlZSBpZiBuby1tZW1iZXIgc2hvdWxkIGJlIGVtaXR0ZWQgZm9yIHRoZSBnaXZlbiBvd25lci4KKworICAgIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGlnbm9yZWQ6CisKKyAgICAgICAgKiB0aGUgb3duZXIgaXMgYSBmdW5jdGlvbiBhbmQgaXQgaGFzIGRlY29yYXRvcnMuCisgICAgICAgICogdGhlIG93bmVyIGlzIGFuIGluc3RhbmNlIGFuZCBpdCBoYXMgX19nZXRhdHRyX18sIF9fZ2V0YXR0cmlidXRlX18gaW1wbGVtZW50ZWQKKyAgICAgICAgKiB0aGUgbW9kdWxlIGlzIGV4cGxpY2l0bHkgaWdub3JlZCBmcm9tIG5vLW1lbWJlciBjaGVja3MKKyAgICAgICAgKiB0aGUgb3duZXIgaXMgYSBjbGFzcyBhbmQgdGhlIG5hbWUgY2FuIGJlIGZvdW5kIGluIGl0cyBtZXRhY2xhc3MuCisgICAgICAgICogVGhlIGFjY2VzcyBub2RlIGlzIHByb3RlY3RlZCBieSBhbiBleGNlcHQgaGFuZGxlciwgd2hpY2ggaGFuZGxlcworICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBFeGNlcHRpb24gb3IgYmFyZSBleGNlcHQuCisgICAgIiIiCisgICAgIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktcmV0dXJuLXN0YXRlbWVudHMKKyAgICBpZiBub2RlX2lnbm9yZXNfZXhjZXB0aW9uKG5vZGUsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgaWdub3JlZF9ub25lIGFuZCBpc2luc3RhbmNlKG93bmVyLCBhc3Ryb2lkLkNvbnN0KSBhbmQgb3duZXIudmFsdWUgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgaXNfc3VwZXIob3duZXIpIG9yIGdldGF0dHIob3duZXIsICJ0eXBlIiwgTm9uZSkgPT0gIm1ldGFjbGFzcyI6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG93bmVyX25hbWUgYW5kIGlnbm9yZWRfbWl4aW5zIGFuZCBvd25lcl9uYW1lWy01Ol0ubG93ZXIoKSA9PSAibWl4aW4iOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBpc2luc3RhbmNlKG93bmVyLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSBhbmQgKAorICAgICAgICBvd25lci5kZWNvcmF0b3JzIG9yIG93bmVyLmlzX2Fic3RyYWN0KCkKKyAgICApOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBpc2luc3RhbmNlKG93bmVyLCAoYXN0cm9pZC5JbnN0YW5jZSwgYXN0cm9pZC5DbGFzc0RlZikpOgorICAgICAgICBpZiBvd25lci5oYXNfZHluYW1pY19nZXRhdHRyKCk6CisgICAgICAgICAgICAjIElzc3VlICMyNTY1OiBEb24ndCBpZ25vcmUgZW51bXMsIGFzIHRoZXkgaGF2ZSBhIGBfX2dldGF0dHJfX2AgYnV0IGl0J3Mgbm90CisgICAgICAgICAgICAjIGludm9rZWQgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXRhY2xhc3MgPSBvd25lci5tZXRhY2xhc3MoKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuTXJvRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiBtZXRhY2xhc3M6CisgICAgICAgICAgICAgICAgIyBSZW5hbWVkIGluIFB5dGhvbiAzLjEwIHRvIGBFbnVtVHlwZWAKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWNsYXNzLnFuYW1lKCkgaW4gKCJlbnVtLkVudW1NZXRhIiwgImVudW0uRW51bVR5cGUiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIG5vdCBoYXNfa25vd25fYmFzZXMob3duZXIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBFeGNsdWRlIHR5cGVkIGFubm90YXRpb25zLCBzaW5jZSB0aGVzZSBtaWdodCBhY3R1YWxseSBleGlzdAorICAgICAgICAjIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBydW50aW1lIG9mIHRoZSBwcm9ncmFtLgorICAgICAgICBpZiB1dGlscy5pc19hdHRyaWJ1dGVfdHlwZWRfYW5ub3RhdGlvbihvd25lciwgbm9kZS5hdHRybmFtZSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBpc2luc3RhbmNlKG93bmVyLCBhc3Ryb2lkLm9iamVjdHMuU3VwZXIpOgorICAgICAgICAjIFZlcmlmeSBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIGludmFsaWQgU3VwZXIgb2JqZWN0LgorICAgICAgICAjIElmIGl0IGlzIGludmFsaWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCBpbiBjaGVja2luZyB0aGF0CisgICAgICAgICMgaXQgaGFzIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUuIEFsc28sIGRvbid0IGZhaWwgaWYgdGhlCisgICAgICAgICMgTVJPIGlzIGludmFsaWQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG93bmVyLnN1cGVyX21ybygpCisgICAgICAgIGV4Y2VwdCAoYXN0cm9pZC5Ncm9FcnJvciwgYXN0cm9pZC5TdXBlckVycm9yKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBub3QgYWxsKGhhc19rbm93bl9iYXNlcyhiYXNlKSBmb3IgYmFzZSBpbiBvd25lci50eXBlLm1ybygpKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIGlzaW5zdGFuY2Uob3duZXIsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3duZXIuZ2V0YXR0cigiX19nZXRhdHRyX18iKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgaWYgb3duZXJfbmFtZSBhbmQgbm9kZS5hdHRybmFtZS5zdGFydHN3aXRoKCJfIiArIG93bmVyX25hbWUpOgorICAgICAgICAjIFRlc3QgaWYgYW4gYXR0cmlidXRlIGhhcyBiZWVuIG1hbmdsZWQgKCdwcml2YXRlJyBhdHRyaWJ1dGUpCisgICAgICAgIHVubWFuZ2xlZF9uYW1lID0gbm9kZS5hdHRybmFtZS5zcGxpdCgiXyIgKyBvd25lcl9uYW1lKVstMV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgb3duZXIuZ2V0YXR0cih1bm1hbmdsZWRfbmFtZSwgY29udGV4dD1Ob25lKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgKAorICAgICAgICBvd25lci5wYXJlbnQKKyAgICAgICAgYW5kIGlzaW5zdGFuY2Uob3duZXIucGFyZW50LCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICBhbmQgb3duZXIucGFyZW50Lm5hbWUgPT0gIkVudW1NZXRhIgorICAgICAgICBhbmQgb3duZXJfbmFtZSA9PSAiX19tZW1iZXJzX18iCisgICAgICAgIGFuZCBub2RlLmF0dHJuYW1lIGluIFsiaXRlbXMiLCAidmFsdWVzIiwgImtleXMiXQorICAgICk6CisgICAgICAgICMgQXZvaWQgZmFsc2UgcG9zaXRpdmUgb24gRW51bS5fX21lbWJlcnNfXy57aXRlbXMoKSwgdmFsdWVzLCBrZXlzfQorICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80MTIzCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgX2RldGVybWluZV9jYWxsYWJsZShjYWxsYWJsZV9vYmopOgorICAgICMgT3JkZXJpbmcgaXMgaW1wb3J0YW50LCBzaW5jZSBCb3VuZE1ldGhvZCBpcyBhIHN1YmNsYXNzIG9mIFVuYm91bmRNZXRob2QsCisgICAgIyBhbmQgRnVuY3Rpb24gaW5oZXJpdHMgTGFtYmRhLgorICAgIHBhcmFtZXRlcnMgPSAwCisgICAgaWYgaGFzYXR0cihjYWxsYWJsZV9vYmosICJpbXBsaWNpdF9wYXJhbWV0ZXJzIik6CisgICAgICAgIHBhcmFtZXRlcnMgPSBjYWxsYWJsZV9vYmouaW1wbGljaXRfcGFyYW1ldGVycygpCisgICAgaWYgaXNpbnN0YW5jZShjYWxsYWJsZV9vYmosIGFzdHJvaWQuQm91bmRNZXRob2QpOgorICAgICAgICAjIEJvdW5kIG1ldGhvZHMgaGF2ZSBhbiBleHRyYSBpbXBsaWNpdCAnc2VsZicgYXJndW1lbnQuCisgICAgICAgIHJldHVybiBjYWxsYWJsZV9vYmosIHBhcmFtZXRlcnMsIGNhbGxhYmxlX29iai50eXBlCisgICAgaWYgaXNpbnN0YW5jZShjYWxsYWJsZV9vYmosIGFzdHJvaWQuVW5ib3VuZE1ldGhvZCk6CisgICAgICAgIHJldHVybiBjYWxsYWJsZV9vYmosIHBhcmFtZXRlcnMsICJ1bmJvdW5kIG1ldGhvZCIKKyAgICBpZiBpc2luc3RhbmNlKGNhbGxhYmxlX29iaiwgYXN0cm9pZC5GdW5jdGlvbkRlZik6CisgICAgICAgIHJldHVybiBjYWxsYWJsZV9vYmosIHBhcmFtZXRlcnMsIGNhbGxhYmxlX29iai50eXBlCisgICAgaWYgaXNpbnN0YW5jZShjYWxsYWJsZV9vYmosIGFzdHJvaWQuTGFtYmRhKToKKyAgICAgICAgcmV0dXJuIGNhbGxhYmxlX29iaiwgcGFyYW1ldGVycywgImxhbWJkYSIKKyAgICBpZiBpc2luc3RhbmNlKGNhbGxhYmxlX29iaiwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICMgQ2xhc3MgaW5zdGFudGlhdGlvbiwgbG9va3VwIF9fbmV3X18gaW5zdGVhZC4KKyAgICAgICAgIyBJZiB3ZSBvbmx5IGZpbmQgb2JqZWN0Ll9fbmV3X18sIHdlIGNhbiBzYWZlbHkgY2hlY2sgX19pbml0X18KKyAgICAgICAgIyBpbnN0ZWFkLiBJZiBfX25ld19fIGJlbG9uZ3MgdG8gYnVpbHRpbnMsIHRoZW4gd2UgbG9vaworICAgICAgICAjIGFnYWluIGZvciBfX2luaXRfXyBpbiB0aGUgbG9jYWxzLCBzaW5jZSB3ZSB3b24ndCBoYXZlCisgICAgICAgICMgYXJndW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBidWlsdGluIF9fbmV3X18gZnVuY3Rpb24uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVXNlIHRoZSBsYXN0IGRlZmluaXRpb24gb2YgX19uZXdfXy4KKyAgICAgICAgICAgIG5ldyA9IGNhbGxhYmxlX29iai5sb2NhbF9hdHRyKCJfX25ld19fIilbLTFdCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBuZXcgPSBOb25lCisKKyAgICAgICAgZnJvbV9vYmplY3QgPSBuZXcgYW5kIG5ldy5wYXJlbnQuc2NvcGUoKS5uYW1lID09ICJvYmplY3QiCisgICAgICAgIGZyb21fYnVpbHRpbnMgPSBuZXcgYW5kIG5ldy5yb290KCkubmFtZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMKKworICAgICAgICBpZiBub3QgbmV3IG9yIGZyb21fb2JqZWN0IG9yIGZyb21fYnVpbHRpbnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBVc2UgdGhlIGxhc3QgZGVmaW5pdGlvbiBvZiBfX2luaXRfXy4KKyAgICAgICAgICAgICAgICBjYWxsYWJsZV9vYmogPSBjYWxsYWJsZV9vYmoubG9jYWxfYXR0cigiX19pbml0X18iKVstMV0KKyAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcsIGNvdmVyZWQgYnkgbm8taW5pdC4KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yIGZyb20gZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FsbGFibGVfb2JqID0gbmV3CisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2FsbGFibGVfb2JqLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgIyBib3RoIGhhdmUgYW4gZXh0cmEgaW1wbGljaXQgJ2NscycvJ3NlbGYnIGFyZ3VtZW50LgorICAgICAgICByZXR1cm4gY2FsbGFibGVfb2JqLCBwYXJhbWV0ZXJzLCAiY29uc3RydWN0b3IiCisKKyAgICByYWlzZSBWYWx1ZUVycm9yCisKKworZGVmIF9oYXNfcGFyZW50X29mX3R5cGUobm9kZSwgbm9kZV90eXBlLCBzdGF0ZW1lbnQpOgorICAgICIiIkNoZWNrIGlmIHRoZSBnaXZlbiBub2RlIGhhcyBhIHBhcmVudCBvZiB0aGUgZ2l2ZW4gdHlwZS4iIiIKKyAgICBwYXJlbnQgPSBub2RlLnBhcmVudAorICAgIHdoaWxlIG5vdCBpc2luc3RhbmNlKHBhcmVudCwgbm9kZV90eXBlKSBhbmQgc3RhdGVtZW50LnBhcmVudF9vZihwYXJlbnQpOgorICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50CisgICAgcmV0dXJuIGlzaW5zdGFuY2UocGFyZW50LCBub2RlX3R5cGUpCisKKworZGVmIF9ub19jb250ZXh0X3ZhcmlhZGljX2tleXdvcmRzKG5vZGUsIHNjb3BlKToKKyAgICBzdGF0ZW1lbnQgPSBub2RlLnN0YXRlbWVudCgpCisgICAgdmFyaWFkaWNzID0gKCkKKworICAgIGlmIGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuTGFtYmRhKSBhbmQgbm90IGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICB2YXJpYWRpY3MgPSBsaXN0KG5vZGUua2V5d29yZHMgb3IgW10pICsgbm9kZS5rd2FyZ3MKKyAgICBlbGlmIGlzaW5zdGFuY2UoCisgICAgICAgIHN0YXRlbWVudCwgKGFzdHJvaWQuUmV0dXJuLCBhc3Ryb2lkLkV4cHIsIGFzdHJvaWQuQXNzaWduKQorICAgICkgYW5kIGlzaW5zdGFuY2Uoc3RhdGVtZW50LnZhbHVlLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICBjYWxsID0gc3RhdGVtZW50LnZhbHVlCisgICAgICAgIHZhcmlhZGljcyA9IGxpc3QoY2FsbC5rZXl3b3JkcyBvciBbXSkgKyBjYWxsLmt3YXJncworCisgICAgcmV0dXJuIF9ub19jb250ZXh0X3ZhcmlhZGljKG5vZGUsIHNjb3BlLmFyZ3Mua3dhcmcsIGFzdHJvaWQuS2V5d29yZCwgdmFyaWFkaWNzKQorCisKK2RlZiBfbm9fY29udGV4dF92YXJpYWRpY19wb3NpdGlvbmFsKG5vZGUsIHNjb3BlKToKKyAgICB2YXJpYWRpY3MgPSAoKQorICAgIGlmIGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuTGFtYmRhKSBhbmQgbm90IGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICB2YXJpYWRpY3MgPSBub2RlLnN0YXJhcmdzICsgbm9kZS5rd2FyZ3MKKyAgICBlbHNlOgorICAgICAgICBzdGF0ZW1lbnQgPSBub2RlLnN0YXRlbWVudCgpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoCisgICAgICAgICAgICBzdGF0ZW1lbnQsIChhc3Ryb2lkLkV4cHIsIGFzdHJvaWQuUmV0dXJuLCBhc3Ryb2lkLkFzc2lnbikKKyAgICAgICAgKSBhbmQgaXNpbnN0YW5jZShzdGF0ZW1lbnQudmFsdWUsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgICAgICBjYWxsID0gc3RhdGVtZW50LnZhbHVlCisgICAgICAgICAgICB2YXJpYWRpY3MgPSBjYWxsLnN0YXJhcmdzICsgY2FsbC5rd2FyZ3MKKworICAgIHJldHVybiBfbm9fY29udGV4dF92YXJpYWRpYyhub2RlLCBzY29wZS5hcmdzLnZhcmFyZywgYXN0cm9pZC5TdGFycmVkLCB2YXJpYWRpY3MpCisKKworZGVmIF9ub19jb250ZXh0X3ZhcmlhZGljKG5vZGUsIHZhcmlhZGljX25hbWUsIHZhcmlhZGljX3R5cGUsIHZhcmlhZGljcyk6CisgICAgIiIiVmVyaWZ5IGlmIHRoZSBnaXZlbiBjYWxsIG5vZGUgaGFzIHZhcmlhZGljIG5vZGVzIHdpdGhvdXQgY29udGV4dAorCisgICAgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGhhbmRsaW5nIGNhc2VzIG9mIG5lc3RlZCBjYWxsIGZ1bmN0aW9ucworICAgIHdoaWNoIGRvbid0IGhhdmUgdGhlIHNwZWNpZmljIGNhbGwgY29udGV4dCBhdCBoYW5kLgorICAgIFZhcmlhZGljIGFyZ3VtZW50cyAodmFyaWFibGUgcG9zaXRpb25hbCBhcmd1bWVudHMgYW5kIHZhcmlhYmxlCisgICAga2V5d29yZCBhcmd1bWVudHMpIGFyZSBpbmZlcnJlZCwgaW5oZXJlbnRseSB3cm9uZywgYnkgYXN0cm9pZAorICAgIGFzIGEgVHVwbGUsIHJlc3BlY3RpdmVseSBhIERpY3Qgd2l0aCBlbXB0eSBlbGVtZW50cy4KKyAgICBUaGlzIGNhbiBsZWFkIHB5bGludCB0byBiZWxpZXZlIHRoYXQgYSBmdW5jdGlvbiBjYWxsIHJlY2VpdmVzCisgICAgdG9vIGZldyBhcmd1bWVudHMuCisgICAgIiIiCisgICAgc2NvcGUgPSBub2RlLnNjb3BlKCkKKyAgICBpc19pbl9sYW1iZGFfc2NvcGUgPSBub3QgaXNpbnN0YW5jZShzY29wZSwgYXN0cm9pZC5GdW5jdGlvbkRlZikgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgIHNjb3BlLCBhc3Ryb2lkLkxhbWJkYQorICAgICkKKyAgICBzdGF0ZW1lbnQgPSBub2RlLnN0YXRlbWVudCgpCisgICAgZm9yIG5hbWUgaW4gc3RhdGVtZW50Lm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuTmFtZSk6CisgICAgICAgIGlmIG5hbWUubmFtZSAhPSB2YXJpYWRpY19uYW1lOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIobmFtZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgKGFzdHJvaWQuTGlzdCwgYXN0cm9pZC5UdXBsZSkpOgorICAgICAgICAgICAgbGVuZ3RoID0gbGVuKGluZmVycmVkLmVsdHMpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5EaWN0KToKKyAgICAgICAgICAgIGxlbmd0aCA9IGxlbihpbmZlcnJlZC5pdGVtcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgaXNfaW5fbGFtYmRhX3Njb3BlIGFuZCBpc2luc3RhbmNlKGluZmVycmVkLnBhcmVudCwgYXN0cm9pZC5Bcmd1bWVudHMpOgorICAgICAgICAgICAgIyBUaGUgc3RhdGVtZW50IG9mIHRoZSB2YXJpYWRpYyB3aWxsIGJlIHRoZSBhc3NpZ25tZW50IGl0c2VsZiwKKyAgICAgICAgICAgICMgc28gd2UgbmVlZCB0byBnbyB0aGUgbGFtYmRhIGluc3RlYWQKKyAgICAgICAgICAgIGluZmVycmVkX3N0YXRlbWVudCA9IGluZmVycmVkLnBhcmVudC5wYXJlbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZmVycmVkX3N0YXRlbWVudCA9IGluZmVycmVkLnN0YXRlbWVudCgpCisKKyAgICAgICAgaWYgbm90IGxlbmd0aCBhbmQgaXNpbnN0YW5jZShpbmZlcnJlZF9zdGF0ZW1lbnQsIGFzdHJvaWQuTGFtYmRhKToKKyAgICAgICAgICAgIGlzX2luX3N0YXJyZWRfY29udGV4dCA9IF9oYXNfcGFyZW50X29mX3R5cGUobm9kZSwgdmFyaWFkaWNfdHlwZSwgc3RhdGVtZW50KQorICAgICAgICAgICAgdXNlZF9hc19zdGFycmVkX2FyZ3VtZW50ID0gYW55KAorICAgICAgICAgICAgICAgIHZhcmlhZGljLnZhbHVlID09IG5hbWUgb3IgdmFyaWFkaWMudmFsdWUucGFyZW50X29mKG5hbWUpCisgICAgICAgICAgICAgICAgZm9yIHZhcmlhZGljIGluIHZhcmlhZGljcworICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgaXNfaW5fc3RhcnJlZF9jb250ZXh0IG9yIHVzZWRfYXNfc3RhcnJlZF9hcmd1bWVudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBfaXNfaW52YWxpZF9tZXRhY2xhc3MobWV0YWNsYXNzKToKKyAgICB0cnk6CisgICAgICAgIG1ybyA9IG1ldGFjbGFzcy5tcm8oKQorICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAjIENhbm5vdCBoYXZlIGEgbWV0YWNsYXNzIHdoaWNoIGlzIG5vdCBhIG5ld3N0eWxlIGNsYXNzLgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIGlmIG5vdCBhbnkoaXNfYnVpbHRpbl9vYmplY3QoY2xzKSBhbmQgY2xzLm5hbWUgPT0gInR5cGUiIGZvciBjbHMgaW4gbXJvKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9pbmZlcl9mcm9tX21ldGFjbGFzc19jb25zdHJ1Y3RvcihjbHMsIGZ1bmMpOgorICAgICIiIlRyeSB0byBpbmZlciB3aGF0IHRoZSBnaXZlbiAqZnVuYyogY29uc3RydWN0b3IgaXMgYnVpbGRpbmcKKworICAgIDpwYXJhbSBhc3Ryb2lkLkZ1bmN0aW9uRGVmIGZ1bmM6CisgICAgICAgIEEgbWV0YWNsYXNzIGNvbnN0cnVjdG9yLiBNZXRhY2xhc3MgZGVmaW5pdGlvbnMgY2FuIGJlCisgICAgICAgIGZ1bmN0aW9ucywgd2hpY2ggc2hvdWxkIGFjY2VwdCB0aHJlZSBhcmd1bWVudHMsIHRoZSBuYW1lIG9mCisgICAgICAgIHRoZSBjbGFzcywgdGhlIGJhc2VzIG9mIHRoZSBjbGFzcyBhbmQgdGhlIGF0dHJpYnV0ZXMuCisgICAgICAgIFRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4gYW55dGhpbmcsIGJ1dCB1c3VhbGx5IGl0IHNob3VsZAorICAgICAgICBiZSBhIHByb3BlciBtZXRhY2xhc3MuCisgICAgOnBhcmFtIGFzdHJvaWQuQ2xhc3NEZWYgY2xzOgorICAgICAgICBUaGUgY2xhc3MgZm9yIHdoaWNoIHRoZSAqZnVuYyogcGFyYW1ldGVyIHNob3VsZCBnZW5lcmF0ZQorICAgICAgICBhIG1ldGFjbGFzcy4KKyAgICA6cmV0dXJuczoKKyAgICAgICAgVGhlIGNsYXNzIGdlbmVyYXRlZCBieSB0aGUgZnVuY3Rpb24gb3IgTm9uZSwKKyAgICAgICAgaWYgd2UgY291bGRuJ3QgaW5mZXIgaXQuCisgICAgOnJ0eXBlOiBhc3Ryb2lkLkNsYXNzRGVmCisgICAgIiIiCisgICAgY29udGV4dCA9IGFzdHJvaWQuY29udGV4dC5JbmZlcmVuY2VDb250ZXh0KCkKKworICAgIGNsYXNzX2Jhc2VzID0gYXN0cm9pZC5MaXN0KCkKKyAgICBjbGFzc19iYXNlcy5wb3N0aW5pdChlbHRzPWNscy5iYXNlcykKKworICAgIGF0dHJzID0gYXN0cm9pZC5EaWN0KCkKKyAgICBsb2NhbF9uYW1lcyA9IFsobmFtZSwgdmFsdWVzWy0xXSkgZm9yIG5hbWUsIHZhbHVlcyBpbiBjbHMubG9jYWxzLml0ZW1zKCldCisgICAgYXR0cnMucG9zdGluaXQobG9jYWxfbmFtZXMpCisKKyAgICBidWlsZGVyX2FyZ3MgPSBhc3Ryb2lkLlR1cGxlKCkKKyAgICBidWlsZGVyX2FyZ3MucG9zdGluaXQoW2Nscy5uYW1lLCBjbGFzc19iYXNlcywgYXR0cnNdKQorCisgICAgY29udGV4dC5jYWxsY29udGV4dCA9IGFzdHJvaWQuY29udGV4dC5DYWxsQ29udGV4dChidWlsZGVyX2FyZ3MpCisgICAgdHJ5OgorICAgICAgICBpbmZlcnJlZCA9IG5leHQoZnVuYy5pbmZlcl9jYWxsX3Jlc3VsdChmdW5jLCBjb250ZXh0KSwgTm9uZSkKKyAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gaW5mZXJyZWQgb3IgTm9uZQorCisKK2RlZiBfaXNfY19leHRlbnNpb24obW9kdWxlX25vZGUpOgorICAgIHJldHVybiAoCisgICAgICAgIG5vdCBhc3Ryb2lkLm1vZHV0aWxzLmlzX3N0YW5kYXJkX21vZHVsZShtb2R1bGVfbm9kZS5uYW1lKQorICAgICAgICBhbmQgbm90IG1vZHVsZV9ub2RlLmZ1bGx5X2RlZmluZWQoKQorICAgICkKKworCitkZWYgX2lzX2ludmFsaWRfaXNpbnN0YW5jZV90eXBlKGFyZyk6CisgICAgIyBSZXR1cm4gVHJ1ZSBpZiB3ZSBhcmUgc3VyZSB0aGF0IGFyZyBpcyBub3QgYSB0eXBlCisgICAgaW5mZXJyZWQgPSB1dGlscy5zYWZlX2luZmVyKGFyZykKKyAgICBpZiBub3QgaW5mZXJyZWQ6CisgICAgICAgICMgQ2Fubm90IGluZmVyIGl0IHNvIHNraXAgaXQuCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuVHVwbGUpOgorICAgICAgICByZXR1cm4gYW55KF9pc19pbnZhbGlkX2lzaW5zdGFuY2VfdHlwZShlbHQpIGZvciBlbHQgaW4gaW5mZXJyZWQuZWx0cykKKyAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNsYXNzRGVmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5JbnN0YW5jZSkgYW5kIGluZmVycmVkLnFuYW1lKCkgPT0gQlVJTFRJTl9UVVBMRToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBUeXBlQ2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgIiIidHJ5IHRvIGZpbmQgYnVncyBpbiB0aGUgY29kZSB1c2luZyB0eXBlIGluZmVyZW5jZSIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAoSUFzdHJvaWRDaGVja2VyLCkKKworICAgICMgY29uZmlndXJhdGlvbiBzZWN0aW9uIG5hbWUKKyAgICBuYW1lID0gInR5cGVjaGVjayIKKyAgICAjIG1lc3NhZ2VzCisgICAgbXNncyA9IE1TR1MKKyAgICBwcmlvcml0eSA9IC0xCisgICAgIyBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlLW9uLW9wYXF1ZS1pbmZlcmVuY2UiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHlfb3Jfbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIlRoaXMgZmxhZyBjb250cm9scyB3aGV0aGVyIHB5bGludCBzaG91bGQgd2FybiBhYm91dCAiCisgICAgICAgICAgICAgICAgIm5vLW1lbWJlciBhbmQgc2ltaWxhciBjaGVja3Mgd2hlbmV2ZXIgYW4gb3BhcXVlIG9iamVjdCAiCisgICAgICAgICAgICAgICAgImlzIHJldHVybmVkIHdoZW4gaW5mZXJyaW5nLiBUaGUgaW5mZXJlbmNlIGNhbiByZXR1cm4gIgorICAgICAgICAgICAgICAgICJtdWx0aXBsZSBwb3RlbnRpYWwgcmVzdWx0cyB3aGlsZSBldmFsdWF0aW5nIGEgUHl0aG9uIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICJidXQgc29tZSBicmFuY2hlcyBtaWdodCBub3QgYmUgZXZhbHVhdGVkLCB3aGljaCByZXN1bHRzIGluICIKKyAgICAgICAgICAgICAgICAicGFydGlhbCBpbmZlcmVuY2UuIEluIHRoYXQgY2FzZSwgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIHN0aWxsIGVtaXQgIgorICAgICAgICAgICAgICAgICJuby1tZW1iZXIgYW5kIG90aGVyIGNoZWNrcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGluZmVycmVkIG9iamVjdHMuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJpZ25vcmUtbWl4aW4tbWVtYmVycyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBUcnVlLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAnVGVsbHMgd2hldGhlciBtaXNzaW5nIG1lbWJlcnMgYWNjZXNzZWQgaW4gbWl4aW4gXAorY2xhc3Mgc2hvdWxkIGJlIGlnbm9yZWQuIEEgbWl4aW4gY2xhc3MgaXMgZGV0ZWN0ZWQgaWYgaXRzIG5hbWUgZW5kcyB3aXRoIFwKKyJtaXhpbiIgKGNhc2UgaW5zZW5zaXRpdmUpLicsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlLW5vbmUiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHlfb3Jfbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIlRlbGxzIHdoZXRoZXIgdG8gd2FybiBhYm91dCBtaXNzaW5nIG1lbWJlcnMgd2hlbiB0aGUgb3duZXIgIgorICAgICAgICAgICAgICAgICJvZiB0aGUgYXR0cmlidXRlIGlzIGluZmVycmVkIHRvIGJlIE5vbmUuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJpZ25vcmVkLW1vZHVsZXMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogKCksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bW9kdWxlIG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBtb2R1bGUgbmFtZXMgZm9yIHdoaWNoIG1lbWJlciBhdHRyaWJ1dGVzICIKKyAgICAgICAgICAgICAgICAic2hvdWxkIG5vdCBiZSBjaGVja2VkICh1c2VmdWwgZm9yIG1vZHVsZXMvcHJvamVjdHMgIgorICAgICAgICAgICAgICAgICJ3aGVyZSBuYW1lc3BhY2VzIGFyZSBtYW5pcHVsYXRlZCBkdXJpbmcgcnVudGltZSBhbmQgIgorICAgICAgICAgICAgICAgICJ0aHVzIGV4aXN0aW5nIG1lbWJlciBhdHRyaWJ1dGVzIGNhbm5vdCBiZSAiCisgICAgICAgICAgICAgICAgImRlZHVjZWQgYnkgc3RhdGljIGFuYWx5c2lzKS4gSXQgc3VwcG9ydHMgcXVhbGlmaWVkICIKKyAgICAgICAgICAgICAgICAibW9kdWxlIG5hbWVzLCBhcyB3ZWxsIGFzIFVuaXggcGF0dGVybiBtYXRjaGluZy4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgIyB0aGUgZGVmYXVsdHMgaGVyZSBhcmUgKnN0ZGxpYiogbmFtZXMgdGhhdCAoYWxtb3N0KSBhbHdheXMKKyAgICAgICAgIyBsZWFkIHRvIGZhbHNlIHBvc2l0aXZlcywgc2luY2UgdGhlaXIgaWRpb21hdGljIHVzZSBpcworICAgICAgICAjICd0b28gZHluYW1pYycgZm9yIHB5bGludCB0byBncm9rLgorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlZC1jbGFzc2VzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgib3B0cGFyc2UuVmFsdWVzIiwgInRocmVhZC5fbG9jYWwiLCAiX3RocmVhZC5fbG9jYWwiKSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtZW1iZXJzIG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBjbGFzcyBuYW1lcyBmb3Igd2hpY2ggbWVtYmVyIGF0dHJpYnV0ZXMgIgorICAgICAgICAgICAgICAgICJzaG91bGQgbm90IGJlIGNoZWNrZWQgKHVzZWZ1bCBmb3IgY2xhc3NlcyB3aXRoICIKKyAgICAgICAgICAgICAgICAiZHluYW1pY2FsbHkgc2V0IGF0dHJpYnV0ZXMpLiBUaGlzIHN1cHBvcnRzICIKKyAgICAgICAgICAgICAgICAidGhlIHVzZSBvZiBxdWFsaWZpZWQgbmFtZXMuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJnZW5lcmF0ZWQtbWVtYmVycyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoKSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtZW1iZXJzIG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBtZW1iZXJzIHdoaWNoIGFyZSBzZXQgZHluYW1pY2FsbHkgYW5kIFwKK21pc3NlZCBieSBweWxpbnQgaW5mZXJlbmNlIHN5c3RlbSwgYW5kIHNvIHNob3VsZG4ndCB0cmlnZ2VyIEUxMTAxIHdoZW4gXAorYWNjZXNzZWQuIFB5dGhvbiByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBhY2NlcHRlZC4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImNvbnRleHRtYW5hZ2VyLWRlY29yYXRvcnMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogWyJjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyIl0sCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8ZGVjb3JhdG9yIG5hbWVzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBkZWNvcmF0b3JzIHRoYXQgcHJvZHVjZSBjb250ZXh0IG1hbmFnZXJzLCAiCisgICAgICAgICAgICAgICAgInN1Y2ggYXMgY29udGV4dGxpYi5jb250ZXh0bWFuYWdlci4gQWRkIHRvIHRoaXMgbGlzdCAiCisgICAgICAgICAgICAgICAgInRvIHJlZ2lzdGVyIG90aGVyIGRlY29yYXRvcnMgdGhhdCBwcm9kdWNlIHZhbGlkICIKKyAgICAgICAgICAgICAgICAiY29udGV4dCBtYW5hZ2Vycy4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1pc3NpbmctbWVtYmVyLWhpbnQtZGlzdGFuY2UiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtZW1iZXIgaGludCBlZGl0IGRpc3RhbmNlPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiVGhlIG1pbmltdW0gZWRpdCBkaXN0YW5jZSBhIG5hbWUgc2hvdWxkIGhhdmUgaW4gb3JkZXIgIgorICAgICAgICAgICAgICAgICJ0byBiZSBjb25zaWRlcmVkIGEgc2ltaWxhciBtYXRjaCBmb3IgYSBtaXNzaW5nIG1lbWJlciBuYW1lLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAibWlzc2luZy1tZW1iZXItbWF4LWNob2ljZXMiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtZW1iZXIgaGludCBtYXggY2hvaWNlcz4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIlRoZSB0b3RhbCBudW1iZXIgb2Ygc2ltaWxhciBuYW1lcyB0aGF0IHNob3VsZCBiZSB0YWtlbiBpbiAiCisgICAgICAgICAgICAgICAgImNvbnNpZGVyYXRpb24gd2hlbiBzaG93aW5nIGEgaGludCBmb3IgYSBtaXNzaW5nIG1lbWJlci4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgIm1pc3NpbmctbWVtYmVyLWhpbnQiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG1pc3NpbmcgbWVtYmVyIGhpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJTaG93IGEgaGludCB3aXRoIHBvc3NpYmxlIG5hbWVzIHdoZW4gYSBtZW1iZXIgbmFtZSB3YXMgbm90ICIKKyAgICAgICAgICAgICAgICAiZm91bmQuIFRoZSBhc3BlY3Qgb2YgZmluZGluZyB0aGUgaGludCBpcyBiYXNlZCBvbiBlZGl0IGRpc3RhbmNlLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAic2lnbmF0dXJlLW11dGF0b3JzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IFtdLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGRlY29yYXRvciBuYW1lcz4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkxpc3Qgb2YgZGVjb3JhdG9ycyB0aGF0IGNoYW5nZSB0aGUgc2lnbmF0dXJlIG9mICIKKyAgICAgICAgICAgICAgICAiYSBkZWNvcmF0ZWQgZnVuY3Rpb24uIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgQGFzdHJvaWQuZGVjb3JhdG9ycy5jYWNoZWRwcm9wZXJ0eQorICAgIGRlZiBfc3VnZ2VzdGlvbl9tb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gZ2V0X2dsb2JhbF9vcHRpb24oc2VsZiwgInN1Z2dlc3Rpb24tbW9kZSIsIGRlZmF1bHQ9VHJ1ZSkKKworICAgIEBhc3Ryb2lkLmRlY29yYXRvcnMuY2FjaGVkcHJvcGVydHkKKyAgICBkZWYgX2NvbXBpbGVkX2dlbmVyYXRlZF9tZW1iZXJzKHNlbGYpIC0+IFR1cGxlW1BhdHRlcm4sIC4uLl06CisgICAgICAgICMgZG8gdGhpcyBsYXppbHkgc2luY2UgY29uZmlnIG5vdCBmdWxseSBpbml0aWFsaXplZCBpbiBfX2luaXRfXworICAgICAgICAjIGdlbmVyYXRlZF9tZW1iZXJzIG1heSBjb250YWluIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyAgICAgICAgIyAoc3Vycm91bmRlZCBieSBxdW90ZSBgImAgYW5kIGZvbGxvd2VkIGJ5IGEgY29tbWEgYCxgKQorICAgICAgICAjIFJFUVVFU1QsYXFfcGFyZW50LCJbYS16QS1aXStfc2V0ezEsMn0iJyA9PgorICAgICAgICAjICgnUkVRVUVTVCcsICdhcV9wYXJlbnQnLCAnW2EtekEtWl0rX3NldHsxLDJ9JykKKyAgICAgICAgZ2VuZXJhdGVkX21lbWJlcnMgPSBzZWxmLmNvbmZpZy5nZW5lcmF0ZWRfbWVtYmVycworICAgICAgICBpZiBpc2luc3RhbmNlKGdlbmVyYXRlZF9tZW1iZXJzLCBzdHIpOgorICAgICAgICAgICAgZ2VuID0gc2hsZXguc2hsZXgoZ2VuZXJhdGVkX21lbWJlcnMpCisgICAgICAgICAgICBnZW4ud2hpdGVzcGFjZSArPSAiLCIKKyAgICAgICAgICAgIGdlbi53b3JkY2hhcnMgKz0gciJbXS0rXC4qPygpfCIKKyAgICAgICAgICAgIGdlbmVyYXRlZF9tZW1iZXJzID0gdHVwbGUodG9rLnN0cmlwKCciJykgZm9yIHRvayBpbiBnZW4pCisgICAgICAgIHJldHVybiB0dXBsZShyZS5jb21waWxlKGV4cCkgZm9yIGV4cCBpbiBnZW5lcmF0ZWRfbWVtYmVycykKKworICAgIEBjaGVja19tZXNzYWdlcygia2V5d29yZC1hcmctYmVmb3JlLXZhcmFyZyIpCisgICAgZGVmIHZpc2l0X2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICAjIGNoZWNrIGZvciBrZXl3b3JkIGFyZyBiZWZvcmUgdmFyYXJncworICAgICAgICBpZiBub2RlLmFyZ3MudmFyYXJnIGFuZCBub2RlLmFyZ3MuZGVmYXVsdHM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJrZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnIiwgbm9kZT1ub2RlLCBhcmdzPShub2RlLm5hbWUpKQorCisgICAgdmlzaXRfYXN5bmNmdW5jdGlvbmRlZiA9IHZpc2l0X2Z1bmN0aW9uZGVmCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoImludmFsaWQtbWV0YWNsYXNzIikKKyAgICBkZWYgdmlzaXRfY2xhc3NkZWYoc2VsZiwgbm9kZSk6CisgICAgICAgIGRlZiBfbWV0YWNsYXNzX25hbWUobWV0YWNsYXNzKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobWV0YWNsYXNzLCAoYXN0cm9pZC5DbGFzc0RlZiwgYXN0cm9pZC5GdW5jdGlvbkRlZikpOgorICAgICAgICAgICAgICAgIHJldHVybiBtZXRhY2xhc3MubmFtZQorICAgICAgICAgICAgcmV0dXJuIG1ldGFjbGFzcy5hc19zdHJpbmcoKQorCisgICAgICAgIG1ldGFjbGFzcyA9IG5vZGUuZGVjbGFyZWRfbWV0YWNsYXNzKCkKKyAgICAgICAgaWYgbm90IG1ldGFjbGFzczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWV0YWNsYXNzLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgICMgVHJ5IHRvIGluZmVyIHRoZSByZXN1bHQuCisgICAgICAgICAgICBtZXRhY2xhc3MgPSBfaW5mZXJfZnJvbV9tZXRhY2xhc3NfY29uc3RydWN0b3Iobm9kZSwgbWV0YWNsYXNzKQorICAgICAgICAgICAgaWYgbm90IG1ldGFjbGFzczoKKyAgICAgICAgICAgICAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGNhbm5vdCBpbmZlciB0aGUgcmVzdWx0LgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWV0YWNsYXNzLCBhc3Ryb2lkLkNsYXNzRGVmKToKKyAgICAgICAgICAgIGlmIF9pc19pbnZhbGlkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkLW1ldGFjbGFzcyIsIG5vZGU9bm9kZSwgYXJncz0oX21ldGFjbGFzc19uYW1lKG1ldGFjbGFzcyksKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgImludmFsaWQtbWV0YWNsYXNzIiwgbm9kZT1ub2RlLCBhcmdzPShfbWV0YWNsYXNzX25hbWUobWV0YWNsYXNzKSwpCisgICAgICAgICAgICApCisKKyAgICBkZWYgdmlzaXRfYXNzaWduYXR0cihzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmFzc2lnbl90eXBlKCksIGFzdHJvaWQuQXVnQXNzaWduKToKKyAgICAgICAgICAgIHNlbGYudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBkZWYgdmlzaXRfZGVsYXR0cihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIEBjaGVja19tZXNzYWdlcygibm8tbWVtYmVyIiwgImMtZXh0ZW5zaW9uLW5vLW1lbWJlciIpCisgICAgZGVmIHZpc2l0X2F0dHJpYnV0ZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgdGhhdCB0aGUgYWNjZXNzZWQgYXR0cmlidXRlIGV4aXN0cworCisgICAgICAgIHRvIGF2b2lkIHRvbyBtdWNoIGZhbHNlIHBvc2l0aXZlcyBmb3Igbm93LCB3ZSdsbCBjb25zaWRlciB0aGUgY29kZSBhcworICAgICAgICBjb3JyZWN0IGlmIGEgc2luZ2xlIG9mIHRoZSBpbmZlcnJlZCBub2RlcyBoYXMgdGhlIGFjY2Vzc2VkIGF0dHJpYnV0ZS4KKworICAgICAgICBmdW5jdGlvbi9tZXRob2QsIHN1cGVyIGNhbGwgYW5kIG1ldGFjbGFzc2VzIGFyZSBpZ25vcmVkCisgICAgICAgICIiIgorICAgICAgICBpZiBhbnkoCisgICAgICAgICAgICBwYXR0ZXJuLm1hdGNoKG5hbWUpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiAobm9kZS5hdHRybmFtZSwgbm9kZS5hc19zdHJpbmcoKSkKKyAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYuX2NvbXBpbGVkX2dlbmVyYXRlZF9tZW1iZXJzCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmZlcnJlZCA9IGxpc3Qobm9kZS5leHByLmluZmVyKCkpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBsaXN0IG9mIChub2RlLCBub2RlbmFtZSkgd2hpY2ggYXJlIG1pc3NpbmcgdGhlIGF0dHJpYnV0ZQorICAgICAgICBtaXNzaW5nYXR0ciA9IHNldCgpCisKKyAgICAgICAgbm9uX29wYXF1ZV9pbmZlcmVuY2VfcmVzdWx0cyA9IFsKKyAgICAgICAgICAgIG93bmVyCisgICAgICAgICAgICBmb3Igb3duZXIgaW4gaW5mZXJyZWQKKyAgICAgICAgICAgIGlmIG93bmVyIGlzIG5vdCBhc3Ryb2lkLlVuaW5mZXJhYmxlCisgICAgICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uob3duZXIsIGFzdHJvaWQubm9kZXMuVW5rbm93bikKKyAgICAgICAgXQorICAgICAgICBpZiAoCisgICAgICAgICAgICBsZW4obm9uX29wYXF1ZV9pbmZlcmVuY2VfcmVzdWx0cykgIT0gbGVuKGluZmVycmVkKQorICAgICAgICAgICAgYW5kIHNlbGYuY29uZmlnLmlnbm9yZV9vbl9vcGFxdWVfaW5mZXJlbmNlCisgICAgICAgICk6CisgICAgICAgICAgICAjIFRoZXJlIGlzIGFuIGFtYmlndWl0eSBpbiB0aGUgaW5mZXJlbmNlLiBTaW5jZSB3ZSBjYW4ndAorICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCB3ZSB3b24ndCBlbWl0IGEgZmFsc2UgcG9zaXRpdmUsIHdlIGp1c3Qgc3RvcAorICAgICAgICAgICAgIyB3aGVuZXZlciB0aGUgaW5mZXJlbmNlIHJldHVybnMgYW4gb3BhcXVlIGluZmVyZW5jZSBvYmplY3QuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIG93bmVyIGluIG5vbl9vcGFxdWVfaW5mZXJlbmNlX3Jlc3VsdHM6CisgICAgICAgICAgICBuYW1lID0gZ2V0YXR0cihvd25lciwgIm5hbWUiLCBOb25lKQorICAgICAgICAgICAgaWYgX2lzX293bmVyX2lnbm9yZWQoCisgICAgICAgICAgICAgICAgb3duZXIsIG5hbWUsIHNlbGYuY29uZmlnLmlnbm9yZWRfY2xhc3Nlcywgc2VsZi5jb25maWcuaWdub3JlZF9tb2R1bGVzCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHF1YWxuYW1lID0gZiJ7b3duZXIucHl0eXBlKCl9Lntub2RlLmF0dHJuYW1lfSIKKyAgICAgICAgICAgIGlmIGFueSgKKyAgICAgICAgICAgICAgICBwYXR0ZXJuLm1hdGNoKHF1YWxuYW1lKSBmb3IgcGF0dGVybiBpbiBzZWxmLl9jb21waWxlZF9nZW5lcmF0ZWRfbWVtYmVycworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBbCisgICAgICAgICAgICAgICAgICAgIG4KKyAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gb3duZXIuZ2V0YXR0cihub2RlLmF0dHJuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuLnN0YXRlbWVudCgpLCBhc3Ryb2lkLkF1Z0Fzc2lnbikKKyAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgICAgICAgICBtaXNzaW5nYXR0ci5hZGQoKG93bmVyLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuRHVwbGljYXRlQmFzZXNFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgY2FuJ3QgYmUgbW92ZWQgYmVmb3JlIHRoZSBhY3R1YWwgLmdldGF0dHIgY2FsbCwKKyAgICAgICAgICAgICAgICAjIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1vcmUgdmFsdWVzIGluZmVycmVkIGFuZCB3ZSBhcmUKKyAgICAgICAgICAgICAgICAjIHN0b3BwaW5nIGFmdGVyIHRoZSBmaXJzdCBvbmUgd2hpY2ggaGFzIHRoZSBhdHRyaWJ1dGUgaW4gcXVlc3Rpb24uCisgICAgICAgICAgICAgICAgIyBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoZSBmaXJzdCBvbmUgaGFzIHRoZSBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgIyBidXQgd2UgY29udGludWUgdG8gdGhlIG5leHQgdmFsdWVzIHdoaWNoIGRvZXNuJ3QgaGF2ZSB0aGUKKyAgICAgICAgICAgICAgICAjIGF0dHJpYnV0ZSwgdGhlbiB3ZSdsbCBoYXZlIGEgZmFsc2UgcG9zaXRpdmUuCisgICAgICAgICAgICAgICAgIyBTbyBjYWxsIHRoaXMgb25seSBhZnRlciB0aGUgY2FsbCBoYXMgYmVlbiBtYWRlLgorICAgICAgICAgICAgICAgIGlmIG5vdCBfZW1pdF9ub19tZW1iZXIoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgIG93bmVyLAorICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICBpZ25vcmVkX21peGlucz1zZWxmLmNvbmZpZy5pZ25vcmVfbWl4aW5fbWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgaWdub3JlZF9ub25lPXNlbGYuY29uZmlnLmlnbm9yZV9ub25lLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbWlzc2luZ2F0dHIuYWRkKChvd25lciwgbmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgc3RvcCBvbiB0aGUgZmlyc3QgZm91bmQKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHdlIGhhdmUgbm90IGZvdW5kIGFueSBub2RlIHdpdGggdGhlIGF0dHJpYnV0ZXMsIGRpc3BsYXkgdGhlCisgICAgICAgICAgICAjIG1lc3NhZ2UgZm9yIGluZmVycmVkIG5vZGVzCisgICAgICAgICAgICBkb25lID0gc2V0KCkKKyAgICAgICAgICAgIGZvciBvd25lciwgbmFtZSBpbiBtaXNzaW5nYXR0cjoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG93bmVyLCBhc3Ryb2lkLkluc3RhbmNlKToKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gb3duZXIuX3Byb3hpZWQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBvd25lcgorICAgICAgICAgICAgICAgIGlmIGFjdHVhbCBpbiBkb25lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRvbmUuYWRkKGFjdHVhbCkKKworICAgICAgICAgICAgICAgIG1zZywgaGludCA9IHNlbGYuX2dldF9ub21lbWJlcl9tc2dpZF9oaW50KG5vZGUsIG93bmVyKQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICBhcmdzPShvd25lci5kaXNwbGF5X3R5cGUoKSwgbmFtZSwgbm9kZS5hdHRybmFtZSwgaGludCksCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9SU5GRVJFTkNFLAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBfZ2V0X25vbWVtYmVyX21zZ2lkX2hpbnQoc2VsZiwgbm9kZSwgb3duZXIpOgorICAgICAgICBzdWdnZXN0aW9uc19hcmVfcG9zc2libGUgPSBzZWxmLl9zdWdnZXN0aW9uX21vZGUgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgICAgICBvd25lciwgYXN0cm9pZC5Nb2R1bGUKKyAgICAgICAgKQorICAgICAgICBpZiBzdWdnZXN0aW9uc19hcmVfcG9zc2libGUgYW5kIF9pc19jX2V4dGVuc2lvbihvd25lcik6CisgICAgICAgICAgICBtc2cgPSAiYy1leHRlbnNpb24tbm8tbWVtYmVyIgorICAgICAgICAgICAgaGludCA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSAibm8tbWVtYmVyIgorICAgICAgICAgICAgaWYgc2VsZi5jb25maWcubWlzc2luZ19tZW1iZXJfaGludDoKKyAgICAgICAgICAgICAgICBoaW50ID0gX21pc3NpbmdfbWVtYmVyX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG93bmVyLAorICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJuYW1lLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5taXNzaW5nX21lbWJlcl9oaW50X2Rpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5taXNzaW5nX21lbWJlcl9tYXhfY2hvaWNlcywKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhpbnQgPSAiIgorICAgICAgICByZXR1cm4gbXNnLCBoaW50CisKKyAgICBAY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJhc3NpZ25tZW50LWZyb20tbm8tcmV0dXJuIiwKKyAgICAgICAgImFzc2lnbm1lbnQtZnJvbS1ub25lIiwKKyAgICAgICAgIm5vbi1zdHItYXNzaWdubWVudC10by1kdW5kZXItbmFtZSIsCisgICAgKQorICAgIGRlZiB2aXNpdF9hc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgICIiIgorICAgICAgICBQcm9jZXNzIGFzc2lnbm1lbnRzIGluIHRoZSBBU1QuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuX2NoZWNrX2Fzc2lnbm1lbnRfZnJvbV9mdW5jdGlvbl9jYWxsKG5vZGUpCisgICAgICAgIHNlbGYuX2NoZWNrX2R1bmRlcm5hbWVfaXNfc3RyaW5nKG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2Fzc2lnbm1lbnRfZnJvbV9mdW5jdGlvbl9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayB0aGF0IGlmIGFzc2lnbmluZyB0byBhIGZ1bmN0aW9uIGNhbGwsIHRoZSBmdW5jdGlvbiBpcworICAgICAgICBwb3NzaWJseSByZXR1cm5pbmcgc29tZXRoaW5nIHZhbHVhYmxlCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnVuY3Rpb25fbm9kZSA9IHNhZmVfaW5mZXIobm9kZS52YWx1ZS5mdW5jKQorICAgICAgICBmdW5jcyA9IChhc3Ryb2lkLkZ1bmN0aW9uRGVmLCBhc3Ryb2lkLlVuYm91bmRNZXRob2QsIGFzdHJvaWQuQm91bmRNZXRob2QpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZ1bmN0aW9uX25vZGUsIGZ1bmNzKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgVW53cmFwIHRvIGdldCB0aGUgYWN0dWFsIGZ1bmN0aW9uIG9iamVjdAorICAgICAgICBpZiBpc2luc3RhbmNlKGZ1bmN0aW9uX25vZGUsIGFzdHJvaWQuQm91bmRNZXRob2QpIGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgZnVuY3Rpb25fbm9kZS5fcHJveGllZCwgYXN0cm9pZC5VbmJvdW5kTWV0aG9kCisgICAgICAgICk6CisgICAgICAgICAgICBmdW5jdGlvbl9ub2RlID0gZnVuY3Rpb25fbm9kZS5fcHJveGllZC5fcHJveGllZAorCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaXQncyBhIHZhbGlkIGZ1bmN0aW9uIHRoYXQgd2UgY2FuIGFuYWx5emUuCisgICAgICAgICMgT3JkZXJlZCBmcm9tIGxlc3MgZXhwZW5zaXZlIHRvIG1vcmUgZXhwZW5zaXZlIGNoZWNrcy4KKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9ucworICAgICAgICBpZiAoCisgICAgICAgICAgICBub3QgZnVuY3Rpb25fbm9kZS5pc19mdW5jdGlvbgorICAgICAgICAgICAgb3IgaXNpbnN0YW5jZShmdW5jdGlvbl9ub2RlLCBhc3Ryb2lkLkFzeW5jRnVuY3Rpb25EZWYpCisgICAgICAgICAgICBvciBmdW5jdGlvbl9ub2RlLmRlY29yYXRvcnMKKyAgICAgICAgICAgIG9yIGZ1bmN0aW9uX25vZGUuaXNfZ2VuZXJhdG9yKCkKKyAgICAgICAgICAgIG9yIGZ1bmN0aW9uX25vZGUuaXNfYWJzdHJhY3QocGFzc19pc19hYnN0cmFjdD1GYWxzZSkKKyAgICAgICAgICAgIG9yIHV0aWxzLmlzX2Vycm9yKGZ1bmN0aW9uX25vZGUpCisgICAgICAgICAgICBvciBub3QgZnVuY3Rpb25fbm9kZS5yb290KCkuZnVsbHlfZGVmaW5lZCgpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICByZXR1cm5zID0gbGlzdCgKKyAgICAgICAgICAgIGZ1bmN0aW9uX25vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5SZXR1cm4sIHNraXBfa2xhc3M9YXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgKQorICAgICAgICBpZiBub3QgcmV0dXJuczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImFzc2lnbm1lbnQtZnJvbS1uby1yZXR1cm4iLCBub2RlPW5vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3Igcm5vZGUgaW4gcmV0dXJuczoKKyAgICAgICAgICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHJub2RlLnZhbHVlLCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgICAgICAgICBhbmQgcm5vZGUudmFsdWUudmFsdWUgaXMgTm9uZQorICAgICAgICAgICAgICAgICAgICBvciBybm9kZS52YWx1ZSBpcyBOb25lCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYXNzaWdubWVudC1mcm9tLW5vbmUiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2R1bmRlcm5hbWVfaXNfc3RyaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgYSBzdHJpbmcgaXMgYXNzaWduZWQgdG8gc2VsZi5fX25hbWVfXworICAgICAgICAiIiIKKworICAgICAgICAjIENoZWNrIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiB0aGUgYXNzaWdubWVudCBpcyA8c29tZXRoaW5nPi5fX25hbWVfXworICAgICAgICBsaHMgPSBub2RlLnRhcmdldHNbMF0KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobGhzLCBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Bc3NpZ25BdHRyKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgbGhzLmF0dHJuYW1lID09ICJfX25hbWVfXyI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIElmIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgbm90IGEgc3RyaW5nCisgICAgICAgIHJocyA9IG5vZGUudmFsdWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShyaHMsIGFzdHJvaWQuQ29uc3QpIGFuZCBpc2luc3RhbmNlKHJocy52YWx1ZSwgc3RyKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbmZlcnJlZCA9IHV0aWxzLnNhZmVfaW5mZXIocmhzKQorICAgICAgICBpZiBub3QgaW5mZXJyZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90ICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuQ29uc3QpIGFuZCBpc2luc3RhbmNlKGluZmVycmVkLnZhbHVlLCBzdHIpCisgICAgICAgICk6CisgICAgICAgICAgICAjIEFkZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja191bmluZmVyYWJsZV9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gdW5pbmZlcmFibGUgQ2FsbCBub2RlIGRvZXMgbm90CisgICAgICAgIGNhbGwgYW4gYWN0dWFsIGZ1bmN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS5mdW5jLCBhc3Ryb2lkLkF0dHJpYnV0ZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIExvb2sgZm9yIHByb3BlcnRpZXMuIEZpcnN0LCBvYnRhaW4KKyAgICAgICAgIyB0aGUgbGhzIG9mIHRoZSBBdHRyaWJ1dGUgbm9kZSBhbmQgc2VhcmNoIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgIyB0aGVyZS4gSWYgdGhhdCBhdHRyaWJ1dGUgaXMgYSBwcm9wZXJ0eSBvciBhIHN1YmNsYXNzIG9mIHByb3BlcnRpZXMsCisgICAgICAgICMgdGhlbiBtb3N0IGxpa2VseSBpdCdzIG5vdCBjYWxsYWJsZS4KKworICAgICAgICBleHByID0gbm9kZS5mdW5jLmV4cHIKKyAgICAgICAga2xhc3MgPSBzYWZlX2luZmVyKGV4cHIpCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGtsYXNzIGlzIE5vbmUKKyAgICAgICAgICAgIG9yIGtsYXNzIGlzIGFzdHJvaWQuVW5pbmZlcmFibGUKKyAgICAgICAgICAgIG9yIG5vdCBpc2luc3RhbmNlKGtsYXNzLCBhc3Ryb2lkLkluc3RhbmNlKQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXR0cnMgPSBrbGFzcy5fcHJveGllZC5nZXRhdHRyKG5vZGUuZnVuYy5hdHRybmFtZSkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgorICAgICAgICAgICAgaWYgYXR0ciBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhdHRyLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIERlY29yYXRlZCwgc2VlIGlmIGl0IGlzIGRlY29yYXRlZCB3aXRoIGEgcHJvcGVydHkuCisgICAgICAgICAgICAjIEFsc28sIGNoZWNrIHRoZSByZXR1cm5zIGFuZCBzZWUgaWYgdGhleSBhcmUgY2FsbGFibGUuCisgICAgICAgICAgICBpZiBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eShhdHRyKToKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYWxsX3JldHVybnNfYXJlX2NhbGxhYmxlID0gYWxsKAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX25vZGUuY2FsbGFibGUoKSBvciByZXR1cm5fbm9kZSBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmV0dXJuX25vZGUgaW4gYXR0ci5pbmZlcl9jYWxsX3Jlc3VsdChub2RlKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBub3QgYWxsX3JldHVybnNfYXJlX2NhbGxhYmxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdC1jYWxsYWJsZSIsIG5vZGU9bm9kZSwgYXJncz1ub2RlLmZ1bmMuYXNfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIF9jaGVja19hcmd1bWVudF9vcmRlcihzZWxmLCBub2RlLCBjYWxsX3NpdGUsIGNhbGxlZCwgY2FsbGVkX3BhcmFtX25hbWVzKToKKyAgICAgICAgIiIiTWF0Y2ggdGhlIHN1cHBsaWVkIGFyZ3VtZW50IG5hbWVzIGFnYWluc3QgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgIFdhcm4gaWYgc29tZSBhcmd1bWVudCBuYW1lcyBhcmUgbm90IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXJlIGluCisgICAgICAgIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUuCisgICAgICAgICIiIgorICAgICAgICAjIENoZWNrIGZvciBjYWxsZWQgZnVuY3Rpb24gYmVpbmcgYW4gb2JqZWN0IGluc3RhbmNlIGZ1bmN0aW9uCisgICAgICAgICMgSWYgc28sIGlnbm9yZSB0aGUgaW5pdGlhbCAnc2VsZicgYXJndW1lbnQgaW4gdGhlIHNpZ25hdHVyZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpc19jbGFzc2RlZiA9IGlzaW5zdGFuY2UoY2FsbGVkLnBhcmVudCwgYXN0cm9pZC5zY29wZWRfbm9kZXMuQ2xhc3NEZWYpCisgICAgICAgICAgICBpZiBpc19jbGFzc2RlZiBhbmQgY2FsbGVkX3BhcmFtX25hbWVzWzBdID09ICJzZWxmIjoKKyAgICAgICAgICAgICAgICBjYWxsZWRfcGFyYW1fbmFtZXMgPSBjYWxsZWRfcGFyYW1fbmFtZXNbMTpdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBleHRyYWN0IGFyZ3VtZW50IG5hbWVzLCBpZiB0aGV5IGhhdmUgbmFtZXMKKyAgICAgICAgICAgIGNhbGxpbmdfcGFyZ19uYW1lcyA9IFtwLm5hbWUgZm9yIHAgaW4gY2FsbF9zaXRlLnBvc2l0aW9uYWxfYXJndW1lbnRzXQorCisgICAgICAgICAgICAjIEFkZGl0aW9uYWxseSBnZXQgbmFtZXMgb2Yga2V5d29yZCBhcmd1bWVudHMgdG8gdXNlIGluIGEgZnVsbCBtYXRjaAorICAgICAgICAgICAgIyBhZ2FpbnN0IHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGNhbGxpbmdfa3dhcmdfbmFtZXMgPSBbCisgICAgICAgICAgICAgICAgYXJnLm5hbWUgZm9yIGFyZyBpbiBjYWxsX3NpdGUua2V5d29yZF9hcmd1bWVudHMudmFsdWVzKCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyB0aGUgdHlwZSBvZiBhcmcgZG9lcyBub3QgcHJvdmlkZSBhIGAubmFtZWAuIEluIHRoaXMgY2FzZSB3ZQorICAgICAgICAgICAgIyBzdG9wIGNoZWNraW5nIGZvciBvdXQtb2Ytb3JkZXIgYXJndW1lbnRzIGJlY2F1c2UgaXQgaXMgb25seSByZWxldmFudAorICAgICAgICAgICAgIyBmb3IgbmFtZWQgdmFyaWFibGVzLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBEb24ndCBjaGVjayBmb3Igb3JkZXJpbmcgaWYgdGhlcmUgaXMgYW4gdW5tYXRjaGVkIGFyZyBvciBwYXJhbQorICAgICAgICBhcmdfc2V0ID0gc2V0KGNhbGxpbmdfcGFyZ19uYW1lcykgfCBzZXQoY2FsbGluZ19rd2FyZ19uYW1lcykKKyAgICAgICAgcGFyYW1fc2V0ID0gc2V0KGNhbGxlZF9wYXJhbV9uYW1lcykKKyAgICAgICAgaWYgYXJnX3NldCAhPSBwYXJhbV9zZXQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFdhcm4gYmFzZWQgb24gdGhlIGVxdWFsaXR5IG9mIGFyZ3VtZW50IG9yZGVyaW5nCisgICAgICAgIGlmIGNhbGxpbmdfcGFyZ19uYW1lcyAhPSBjYWxsZWRfcGFyYW1fbmFtZXNbOiBsZW4oY2FsbGluZ19wYXJnX25hbWVzKV06CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJhcmd1bWVudHMtb3V0LW9mLW9yZGVyIiwgbm9kZT1ub2RlLCBhcmdzPSgpKQorCisgICAgZGVmIF9jaGVja19pc2luc3RhbmNlX2FyZ3Moc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIGxlbihub2RlLmFyZ3MpICE9IDI6CisgICAgICAgICAgICAjIGlzaW5zdGFuY2UgY2FsbGVkIHdpdGggd3JvbmcgbnVtYmVyIG9mIGFyZ3MKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlY29uZF9hcmcgPSBub2RlLmFyZ3NbMV0KKyAgICAgICAgaWYgX2lzX2ludmFsaWRfaXNpbnN0YW5jZV90eXBlKHNlY29uZF9hcmcpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaXNpbnN0YW5jZS1zZWNvbmQtYXJndW1lbnQtbm90LXZhbGlkLXR5cGUiLCBub2RlPW5vZGUpCisKKyAgICAjIHB5bGludDogZGlzYWJsZT10b28tbWFueS1icmFuY2hlcyx0b28tbWFueS1sb2NhbHMKKyAgICBAY2hlY2tfbWVzc2FnZXMoKihsaXN0KE1TR1Mua2V5cygpKSkpCisgICAgZGVmIHZpc2l0X2NhbGwoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIHRoYXQgY2FsbGVkIGZ1bmN0aW9ucy9tZXRob2RzIGFyZSBpbmZlcnJlZCB0byBjYWxsYWJsZSBvYmplY3RzLAorICAgICAgICBhbmQgdGhhdCB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gbWF0Y2ggdGhlIHBhcmFtZXRlcnMgaW4KKyAgICAgICAgdGhlIGluZmVycmVkIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgY2FsbGVkID0gc2FmZV9pbmZlcihub2RlLmZ1bmMpCisgICAgICAgICMgb25seSBmdW5jdGlvbiwgZ2VuZXJhdG9yIGFuZCBvYmplY3QgZGVmaW5pbmcgX19jYWxsX18gYXJlIGFsbG93ZWQKKyAgICAgICAgIyBJZ25vcmUgaW5zdGFuY2VzIG9mIGRlc2NyaXB0b3JzIHNpbmNlIGFzdHJvaWQgY2Fubm90IHByb3Blcmx5IGhhbmRsZSB0aGVtCisgICAgICAgICMgeWV0CisgICAgICAgIGlmIGNhbGxlZCBhbmQgbm90IGNhbGxlZC5jYWxsYWJsZSgpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjYWxsZWQsIGFzdHJvaWQuSW5zdGFuY2UpIGFuZCAoCisgICAgICAgICAgICAgICAgbm90IGhhc19rbm93bl9iYXNlcyhjYWxsZWQpCisgICAgICAgICAgICAgICAgb3IgKAorICAgICAgICAgICAgICAgICAgICBjYWxsZWQucGFyZW50IGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGNhbGxlZC5zY29wZSgpLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgICAgICAgICBhbmQgIl9fZ2V0X18iIGluIGNhbGxlZC5sb2NhbHMKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICMgRG9uJ3QgZW1pdCBpZiB3ZSBjYW4ndCBtYWtlIHN1cmUgdGhpcyBvYmplY3QgaXMgY2FsbGFibGUuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJub3QtY2FsbGFibGUiLCBub2RlPW5vZGUsIGFyZ3M9bm9kZS5mdW5jLmFzX3N0cmluZygpKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3VuaW5mZXJhYmxlX2NhbGwobm9kZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsbGVkLCBpbXBsaWNpdF9hcmdzLCBjYWxsYWJsZV9uYW1lID0gX2RldGVybWluZV9jYWxsYWJsZShjYWxsZWQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIyBBbnkgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGRldGVybWluaW5nIHRoZSBmdW5jdGlvbiB0eXBlLCBtb3N0IG9mCisgICAgICAgICAgICAjIHRob3NlIGVycm9ycyBhcmUgaGFuZGxlZCBieSBkaWZmZXJlbnQgd2FybmluZ3MuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBjYWxsZWQuYXJncy5hcmdzIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBjYWxsZWQubmFtZSA9PSAiaXNpbnN0YW5jZSI6CisgICAgICAgICAgICAgICAgIyBWZXJpZnkgd2hldGhlciBzZWNvbmQgYXJndW1lbnQgb2YgaXNpbnN0YW5jZSBpcyBhIHZhbGlkIHR5cGUKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19pc2luc3RhbmNlX2FyZ3Mobm9kZSkKKyAgICAgICAgICAgICMgQnVpbHQtaW4gZnVuY3Rpb25zIGhhdmUgbm8gYXJndW1lbnQgaW5mb3JtYXRpb24uCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBsZW4oY2FsbGVkLmFyZ25hbWVzKCkpICE9IGxlbihzZXQoY2FsbGVkLmFyZ25hbWVzKCkpKToKKyAgICAgICAgICAgICMgRHVwbGljYXRlIHBhcmFtZXRlciBuYW1lIChzZWUgZHVwbGljYXRlLWFyZ3VtZW50KS4gIFdlIGNhbid0IHJlYWxseQorICAgICAgICAgICAgIyBtYWtlIHNlbnNlIG9mIHRoZSBmdW5jdGlvbiBjYWxsIGluIHRoaXMgY2FzZSwgc28ganVzdCByZXR1cm4uCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEJ1aWxkIHRoZSBzZXQgb2Yga2V5d29yZCBhcmd1bWVudHMsIGNoZWNraW5nIGZvciBkdXBsaWNhdGUga2V5d29yZHMsCisgICAgICAgICMgYW5kIGNvdW50IHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KKyAgICAgICAgY2FsbF9zaXRlID0gYXN0cm9pZC5hcmd1bWVudHMuQ2FsbFNpdGUuZnJvbV9jYWxsKG5vZGUpCisKKyAgICAgICAgIyBXYXJuIGFib3V0IGR1cGxpY2F0ZWQga2V5d29yZCBhcmd1bWVudHMsIHN1Y2ggYXMgYGY9MjQsICoqeydmJzogMjR9YAorICAgICAgICBmb3Iga2V5d29yZCBpbiBjYWxsX3NpdGUuZHVwbGljYXRlZF9rZXl3b3JkczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJlcGVhdGVkLWtleXdvcmQiLCBub2RlPW5vZGUsIGFyZ3M9KGtleXdvcmQsKSkKKworICAgICAgICBpZiBjYWxsX3NpdGUuaGFzX2ludmFsaWRfYXJndW1lbnRzKCkgb3IgY2FsbF9zaXRlLmhhc19pbnZhbGlkX2tleXdvcmRzKCk6CisgICAgICAgICAgICAjIENhbid0IG1ha2Ugc2Vuc2Ugb2YgdGhpcy4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSGFzIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgY2hhbmdlZCBpbiB3YXlzIHdlIGNhbm5vdCByZWxpYWJseSBkZXRlY3Q/CisgICAgICAgIGlmIGhhc2F0dHIoY2FsbGVkLCAiZGVjb3JhdG9ycyIpIGFuZCBkZWNvcmF0ZWRfd2l0aCgKKyAgICAgICAgICAgIGNhbGxlZCwgc2VsZi5jb25maWcuc2lnbmF0dXJlX211dGF0b3JzCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBudW1fcG9zaXRpb25hbF9hcmdzID0gbGVuKGNhbGxfc2l0ZS5wb3NpdGlvbmFsX2FyZ3VtZW50cykKKyAgICAgICAga2V5d29yZF9hcmdzID0gbGlzdChjYWxsX3NpdGUua2V5d29yZF9hcmd1bWVudHMua2V5cygpKQorICAgICAgICBvdmVybG9hZF9mdW5jdGlvbiA9IGlzX292ZXJsb2FkX3N0dWIoY2FsbGVkKQorCisgICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIGRvbid0IGhhdmUgYSBjb250ZXh0IGZvciBvdXIgY2FsbCBhbmQgd2UgdXNlIHZhcmlhZGljcy4KKyAgICAgICAgbm9kZV9zY29wZSA9IG5vZGUuc2NvcGUoKQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGVfc2NvcGUsIChhc3Ryb2lkLkxhbWJkYSwgYXN0cm9pZC5GdW5jdGlvbkRlZikpOgorICAgICAgICAgICAgaGFzX25vX2NvbnRleHRfcG9zaXRpb25hbF92YXJpYWRpYyA9IF9ub19jb250ZXh0X3ZhcmlhZGljX3Bvc2l0aW9uYWwoCisgICAgICAgICAgICAgICAgbm9kZSwgbm9kZV9zY29wZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgaGFzX25vX2NvbnRleHRfa2V5d29yZHNfdmFyaWFkaWMgPSBfbm9fY29udGV4dF92YXJpYWRpY19rZXl3b3JkcygKKyAgICAgICAgICAgICAgICBub2RlLCBub2RlX3Njb3BlCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoYXNfbm9fY29udGV4dF9wb3NpdGlvbmFsX3ZhcmlhZGljID0gKAorICAgICAgICAgICAgICAgIGhhc19ub19jb250ZXh0X2tleXdvcmRzX3ZhcmlhZGljCisgICAgICAgICAgICApID0gRmFsc2UKKworICAgICAgICAjIFRoZXNlIGFyZSBjb21pbmcgZnJvbSB0aGUgZnVuY3Rvb2xzLnBhcnRpYWwgaW1wbGVtZW50YXRpb24gaW4gYXN0cm9pZAorICAgICAgICBhbHJlYWR5X2ZpbGxlZF9wb3NpdGlvbmFscyA9IGdldGF0dHIoY2FsbGVkLCAiZmlsbGVkX3Bvc2l0aW9uYWxzIiwgMCkKKyAgICAgICAgYWxyZWFkeV9maWxsZWRfa2V5d29yZHMgPSBnZXRhdHRyKGNhbGxlZCwgImZpbGxlZF9rZXl3b3JkcyIsIHt9KQorCisgICAgICAgIGtleXdvcmRfYXJncyArPSBsaXN0KGFscmVhZHlfZmlsbGVkX2tleXdvcmRzKQorICAgICAgICBudW1fcG9zaXRpb25hbF9hcmdzICs9IGltcGxpY2l0X2FyZ3MgKyBhbHJlYWR5X2ZpbGxlZF9wb3NpdGlvbmFscworCisgICAgICAgICMgQW5hbHl6ZSB0aGUgbGlzdCBvZiBmb3JtYWwgcGFyYW1ldGVycy4KKyAgICAgICAgYXJncyA9IGxpc3QoaXRlcnRvb2xzLmNoYWluKGNhbGxlZC5hcmdzLnBvc29ubHlhcmdzIG9yICgpLCBjYWxsZWQuYXJncy5hcmdzKSkKKyAgICAgICAgbnVtX21hbmRhdG9yeV9wYXJhbWV0ZXJzID0gbGVuKGFyZ3MpIC0gbGVuKGNhbGxlZC5hcmdzLmRlZmF1bHRzKQorICAgICAgICBwYXJhbWV0ZXJzID0gW10KKyAgICAgICAgcGFyYW1ldGVyX25hbWVfdG9faW5kZXggPSB7fQorICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBhc3Ryb2lkLlR1cGxlKToKKyAgICAgICAgICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICAgICAgICAgICMgRG9uJ3Qgc3RvcmUgYW55IHBhcmFtZXRlciBuYW1lcyB3aXRoaW4gdGhlIHR1cGxlLCBzaW5jZSB0aG9zZQorICAgICAgICAgICAgICAgICMgYXJlIG5vdCBhc3NpZ25hYmxlIGZyb20ga2V5d29yZCBhcmd1bWVudHMuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGFyZywgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgICAgICMgVGhpcyBvY2N1cnMgd2l0aDoKKyAgICAgICAgICAgICAgICAjICAgIGRlZiBmKCAoYSksIChiKSApOiBwYXNzCisgICAgICAgICAgICAgICAgbmFtZSA9IGFyZy5uYW1lCisgICAgICAgICAgICAgICAgcGFyYW1ldGVyX25hbWVfdG9faW5kZXhbbmFtZV0gPSBpCisgICAgICAgICAgICBpZiBpID49IG51bV9tYW5kYXRvcnlfcGFyYW1ldGVyczoKKyAgICAgICAgICAgICAgICBkZWZ2YWwgPSBjYWxsZWQuYXJncy5kZWZhdWx0c1tpIC0gbnVtX21hbmRhdG9yeV9wYXJhbWV0ZXJzXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWZ2YWwgPSBOb25lCisgICAgICAgICAgICBwYXJhbWV0ZXJzLmFwcGVuZChbKG5hbWUsIGRlZnZhbCksIEZhbHNlXSkKKworICAgICAgICBrd3BhcmFtcyA9IHt9CisgICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGNhbGxlZC5hcmdzLmt3b25seWFyZ3MpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGFzdHJvaWQuS2V5d29yZCk6CisgICAgICAgICAgICAgICAgbmFtZSA9IGFyZy5hcmcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYXJnLCBhc3Ryb2lkLkFzc2lnbk5hbWUpCisgICAgICAgICAgICAgICAgbmFtZSA9IGFyZy5uYW1lCisgICAgICAgICAgICBrd3BhcmFtc1tuYW1lXSA9IFtjYWxsZWQuYXJncy5rd19kZWZhdWx0c1tpXSwgRmFsc2VdCisKKyAgICAgICAgc2VsZi5fY2hlY2tfYXJndW1lbnRfb3JkZXIoCisgICAgICAgICAgICBub2RlLCBjYWxsX3NpdGUsIGNhbGxlZCwgW3BbMF1bMF0gZm9yIHAgaW4gcGFyYW1ldGVyc10KKyAgICAgICAgKQorCisgICAgICAgICMgMS4gTWF0Y2ggdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fcG9zaXRpb25hbF9hcmdzKToKKyAgICAgICAgICAgIGlmIGkgPCBsZW4ocGFyYW1ldGVycyk6CisgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tpXVsxXSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgY2FsbGVkLmFyZ3MudmFyYXJnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgVGhlIHJlbWFpbmluZyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBnZXQgYXNzaWduZWQgdG8gdGhlICphcmdzCisgICAgICAgICAgICAgICAgIyBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbm90IG92ZXJsb2FkX2Z1bmN0aW9uOgorICAgICAgICAgICAgICAgICMgVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMuCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgInRvby1tYW55LWZ1bmN0aW9uLWFyZ3MiLCBub2RlPW5vZGUsIGFyZ3M9KGNhbGxhYmxlX25hbWUsKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgMi4gTWF0Y2ggdGhlIGtleXdvcmQgYXJndW1lbnRzLgorICAgICAgICBmb3Iga2V5d29yZCBpbiBrZXl3b3JkX2FyZ3M6CisgICAgICAgICAgICBpZiBrZXl3b3JkIGluIHBhcmFtZXRlcl9uYW1lX3RvX2luZGV4OgorICAgICAgICAgICAgICAgIGkgPSBwYXJhbWV0ZXJfbmFtZV90b19pbmRleFtrZXl3b3JkXQorICAgICAgICAgICAgICAgIGlmIHBhcmFtZXRlcnNbaV1bMV06CisgICAgICAgICAgICAgICAgICAgICMgRHVwbGljYXRlIGRlZmluaXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVyLgorCisgICAgICAgICAgICAgICAgICAgICMgTWlnaHQgYmUgdG9vIGhhcmRjb2RlZCwgYnV0IHRoaXMgY2FuIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICMgaGFwcGVuIHdoZW4gdXNpbmcgc3RyLmZvcm1hdCBhbmQgYHNlbGZgIGlzIHBhc3NlZAorICAgICAgICAgICAgICAgICAgICAjIGJ5IGtleXdvcmQgYXJndW1lbnQsIGFzIGluIGAuZm9ybWF0KHNlbGY9c2VsZilgLgorICAgICAgICAgICAgICAgICAgICAjIEl0J3MgcGVyZmVjdGx5IHZhbGlkIHRvIHNvLCBzbyB3ZSdyZSBqdXN0IHNraXBwaW5nCisgICAgICAgICAgICAgICAgICAgICMgaXQgaWYgdGhhdCdzIHRoZSBjYXNlLgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgKGtleXdvcmQgPT0gInNlbGYiIGFuZCBjYWxsZWQucW5hbWUoKSBpbiBTVFJfRk9STUFUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZHVuZGFudC1rZXl3b3JkLWFyZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGtleXdvcmQsIGNhbGxhYmxlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNbaV1bMV0gPSBUcnVlCisgICAgICAgICAgICBlbGlmIGtleXdvcmQgaW4ga3dwYXJhbXM6CisgICAgICAgICAgICAgICAgaWYga3dwYXJhbXNba2V5d29yZF1bMV06CisgICAgICAgICAgICAgICAgICAgICMgRHVwbGljYXRlIGRlZmluaXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgInJlZHVuZGFudC1rZXl3b3JkLWFyZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShrZXl3b3JkLCBjYWxsYWJsZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGt3cGFyYW1zW2tleXdvcmRdWzFdID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBjYWxsZWQuYXJncy5rd2FyZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIFRoZSBrZXl3b3JkIGFyZ3VtZW50IGdldHMgYXNzaWduZWQgdG8gdGhlICoqa3dhcmdzIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIG5vdCBvdmVybG9hZF9mdW5jdGlvbjoKKyAgICAgICAgICAgICAgICAjIFVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1rZXl3b3JkLWFyZyIsIG5vZGU9bm9kZSwgYXJncz0oa2V5d29yZCwgY2FsbGFibGVfbmFtZSkKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgIyAzLiBNYXRjaCB0aGUgKiprd2FyZ3MsIGlmIGFueS4KKyAgICAgICAgaWYgbm9kZS5rd2FyZ3M6CisgICAgICAgICAgICBmb3IgaSwgWyhuYW1lLCBkZWZ2YWwpLCBhc3NpZ25lZF0gaW4gZW51bWVyYXRlKHBhcmFtZXRlcnMpOgorICAgICAgICAgICAgICAgICMgQXNzdW1lIHRoYXQgKmt3YXJncyBwcm92aWRlcyB2YWx1ZXMgZm9yIGFsbCByZW1haW5pbmcKKyAgICAgICAgICAgICAgICAjIHVuYXNzaWduZWQgbmFtZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldWzFdID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgKiprd2FyZ3MgY2FuJ3QgYXNzaWduIHRvIHR1cGxlcy4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQ2hlY2sgdGhhdCBhbnkgcGFyYW1ldGVycyB3aXRob3V0IGEgZGVmYXVsdCBoYXZlIGJlZW4gYXNzaWduZWQKKyAgICAgICAgIyB2YWx1ZXMuCisgICAgICAgIGZvciBbKG5hbWUsIGRlZnZhbCksIGFzc2lnbmVkXSBpbiBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgaWYgKGRlZnZhbCBpcyBOb25lKSBhbmQgbm90IGFzc2lnbmVkOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9uYW1lID0gIjx0dXBsZT4iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9uYW1lID0gcmVwcihuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNfbm9fY29udGV4dF9wb3NpdGlvbmFsX3ZhcmlhZGljIGFuZCBub3Qgb3ZlcmxvYWRfZnVuY3Rpb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAibm8tdmFsdWUtZm9yLXBhcmFtZXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkaXNwbGF5X25hbWUsIGNhbGxhYmxlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgZm9yIG5hbWUsIHZhbCBpbiBrd3BhcmFtcy5pdGVtcygpOgorICAgICAgICAgICAgZGVmdmFsLCBhc3NpZ25lZCA9IHZhbAorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGRlZnZhbCBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhc3NpZ25lZAorICAgICAgICAgICAgICAgIGFuZCBub3QgaGFzX25vX2NvbnRleHRfa2V5d29yZHNfdmFyaWFkaWMKKyAgICAgICAgICAgICAgICBhbmQgbm90IG92ZXJsb2FkX2Z1bmN0aW9uCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm1pc3Npbmcta3dvYSIsIG5vZGU9bm9kZSwgYXJncz0obmFtZSwgY2FsbGFibGVfbmFtZSkpCisKKyAgICBkZWYgX2NoZWNrX2ludmFsaWRfc2VxdWVuY2VfaW5kZXgoc2VsZiwgc3Vic2NyaXB0OiBhc3Ryb2lkLlN1YnNjcmlwdCk6CisgICAgICAgICMgTG9vayBmb3IgaW5kZXggb3BlcmF0aW9ucyB3aGVyZSB0aGUgcGFyZW50IGlzIGEgc2VxdWVuY2UgdHlwZS4KKyAgICAgICAgIyBJZiB0aGUgdHlwZXMgY2FuIGJlIGRldGVybWluZWQsIG9ubHkgYWxsb3cgaW5kaWNlcyB0byBiZSBpbnQsCisgICAgICAgICMgc2xpY2Ugb3IgaW5zdGFuY2VzIHdpdGggX19pbmRleF9fLgorICAgICAgICBwYXJlbnRfdHlwZSA9IHNhZmVfaW5mZXIoc3Vic2NyaXB0LnZhbHVlKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIHBhcmVudF90eXBlLCAoYXN0cm9pZC5DbGFzc0RlZiwgYXN0cm9pZC5JbnN0YW5jZSkKKyAgICAgICAgKSBvciBub3QgaGFzX2tub3duX2Jhc2VzKHBhcmVudF90eXBlKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBEZXRlcm1pbmUgd2hhdCBtZXRob2Qgb24gdGhlIHBhcmVudCB0aGlzIGluZGV4IHdpbGwgdXNlCisgICAgICAgICMgVGhlIHBhcmVudCBvZiB0aGlzIG5vZGUgd2lsbCBiZSBhIFN1YnNjcmlwdCwgYW5kIHRoZSBwYXJlbnQgb2YgdGhhdAorICAgICAgICAjIG5vZGUgZGV0ZXJtaW5lcyBpZiB0aGUgU3Vic2NyaXB0IGlzIGEgZ2V0LCBzZXQsIG9yIGRlbGV0ZSBvcGVyYXRpb24uCisgICAgICAgIGlmIHN1YnNjcmlwdC5jdHggaXMgYXN0cm9pZC5TdG9yZToKKyAgICAgICAgICAgIG1ldGhvZG5hbWUgPSAiX19zZXRpdGVtX18iCisgICAgICAgIGVsaWYgc3Vic2NyaXB0LmN0eCBpcyBhc3Ryb2lkLkRlbDoKKyAgICAgICAgICAgIG1ldGhvZG5hbWUgPSAiX19kZWxpdGVtX18iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXRob2RuYW1lID0gIl9fZ2V0aXRlbV9fIgorCisgICAgICAgICMgQ2hlY2sgaWYgdGhpcyBpbnN0YW5jZSdzIF9fZ2V0aXRlbV9fLCBfX3NldGl0ZW1fXywgb3IgX19kZWxpdGVtX18sIGFzCisgICAgICAgICMgYXBwcm9wcmlhdGUgdG8gdGhlIHN0YXRlbWVudCwgaXMgaW1wbGVtZW50ZWQgaW4gYSBidWlsdGluIHNlcXVlbmNlCisgICAgICAgICMgdHlwZS4gVGhpcyB3YXkgd2UgY2F0Y2ggc3ViY2xhc3NlcyBvZiBzZXF1ZW5jZSB0eXBlcyBidXQgc2tpcCBjbGFzc2VzCisgICAgICAgICMgdGhhdCBvdmVycmlkZSBfX2dldGl0ZW1fXyBhbmQgd2hpY2ggbWF5IGFsbG93IG5vbi1pbnRlZ2VyIGluZGljZXMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1ldGhvZHMgPSBhc3Ryb2lkLmludGVycHJldGVyLmR1bmRlcl9sb29rdXAubG9va3VwKHBhcmVudF90eXBlLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgaWYgbWV0aG9kcyBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBpdGVtbWV0aG9kID0gbWV0aG9kc1swXQorICAgICAgICBleGNlcHQgKAorICAgICAgICAgICAgYXN0cm9pZC5Ob3RGb3VuZEVycm9yLAorICAgICAgICAgICAgYXN0cm9pZC5BdHRyaWJ1dGVJbmZlcmVuY2VFcnJvciwKKyAgICAgICAgICAgIEluZGV4RXJyb3IsCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiAoCisgICAgICAgICAgICBub3QgaXNpbnN0YW5jZShpdGVtbWV0aG9kLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgb3IgaXRlbW1ldGhvZC5yb290KCkubmFtZSAhPSBCVUlMVElOUworICAgICAgICAgICAgb3Igbm90IGl0ZW1tZXRob2QucGFyZW50CisgICAgICAgICAgICBvciBpdGVtbWV0aG9kLnBhcmVudC5uYW1lIG5vdCBpbiBTRVFVRU5DRV9UWVBFUworICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIEZvciBFeHRTbGljZSBvYmplY3RzIGNvbWluZyBmcm9tIHZpc2l0X2V4dHNsaWNlLCBubyBmdXJ0aGVyCisgICAgICAgICMgaW5mZXJlbmNlIGlzIG5lY2Vzc2FyeSwgc2luY2UgaWYgd2UgZ290IHRoaXMgZmFyIHRoZSBFeHRTbGljZQorICAgICAgICAjIGlzIGFuIGVycm9yLgorICAgICAgICBpZiBpc2luc3RhbmNlKHN1YnNjcmlwdC52YWx1ZSwgYXN0cm9pZC5FeHRTbGljZSk6CisgICAgICAgICAgICBpbmRleF90eXBlID0gc3Vic2NyaXB0LnZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRleF90eXBlID0gc2FmZV9pbmZlcihzdWJzY3JpcHQuc2xpY2UpCisgICAgICAgIGlmIGluZGV4X3R5cGUgaXMgTm9uZSBvciBpbmRleF90eXBlIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIENvbnN0YW50cyBtdXN0IGJlIG9mIHR5cGUgaW50CisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXhfdHlwZSwgYXN0cm9pZC5Db25zdCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4X3R5cGUudmFsdWUsIGludCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBJbnN0YW5jZSB2YWx1ZXMgbXVzdCBiZSBpbnQsIHNsaWNlLCBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2QKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZGV4X3R5cGUsIGFzdHJvaWQuSW5zdGFuY2UpOgorICAgICAgICAgICAgaWYgaW5kZXhfdHlwZS5weXR5cGUoKSBpbiAoQlVJTFRJTlMgKyAiLmludCIsIEJVSUxUSU5TICsgIi5zbGljZSIpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5kZXhfdHlwZS5nZXRhdHRyKCJfX2luZGV4X18iKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluZGV4X3R5cGUsIGFzdHJvaWQuU2xpY2UpOgorICAgICAgICAgICAgIyBBIHNsaWNlIGNhbiBiZSBwcmVzZW50CisgICAgICAgICAgICAjIGhlcmUgYWZ0ZXIgaW5mZXJyaW5nIHRoZSBpbmRleCBub2RlLCB3aGljaCBjb3VsZAorICAgICAgICAgICAgIyBiZSBhIGBzbGljZSguLi4pYCBjYWxsIGZvciBpbnN0YW5jZS4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19pbnZhbGlkX3NsaWNlX2luZGV4KGluZGV4X3R5cGUpCisKKyAgICAgICAgIyBBbnl0aGluZyBlbHNlIGlzIGFuIGVycm9yCisgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImludmFsaWQtc2VxdWVuY2UtaW5kZXgiLCBub2RlPXN1YnNjcmlwdCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBjaGVja19tZXNzYWdlcygiaW52YWxpZC1zZXF1ZW5jZS1pbmRleCIpCisgICAgZGVmIHZpc2l0X2V4dHNsaWNlKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgbm9kZS5wYXJlbnQgb3Igbm90IGhhc2F0dHIobm9kZS5wYXJlbnQsICJ2YWx1ZSIpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBDaGVjayBleHRlbmRlZCBzbGljZSBvYmplY3RzIGFzIGlmIHRoZXkgd2VyZSB1c2VkIGFzIGEgc2VxdWVuY2UKKyAgICAgICAgIyBpbmRleCB0byBjaGVjayBpZiB0aGUgb2JqZWN0IGJlaW5nIHNsaWNlZCBjYW4gc3VwcG9ydCB0aGVtCisgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19pbnZhbGlkX3NlcXVlbmNlX2luZGV4KG5vZGUucGFyZW50KQorCisgICAgZGVmIF9jaGVja19pbnZhbGlkX3NsaWNlX2luZGV4KHNlbGYsIG5vZGUpOgorICAgICAgICAjIENoZWNrIHRoZSB0eXBlIG9mIGVhY2ggcGFydCBvZiB0aGUgc2xpY2UKKyAgICAgICAgaW52YWxpZF9zbGljZXMgPSAwCisgICAgICAgIGZvciBpbmRleCBpbiAobm9kZS5sb3dlciwgbm9kZS51cHBlciwgbm9kZS5zdGVwKToKKyAgICAgICAgICAgIGlmIGluZGV4IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaW5kZXhfdHlwZSA9IHNhZmVfaW5mZXIoaW5kZXgpCisgICAgICAgICAgICBpZiBpbmRleF90eXBlIGlzIE5vbmUgb3IgaW5kZXhfdHlwZSBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgQ29uc3RhbnRzIG11c3Qgb2YgdHlwZSBpbnQgb3IgTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmRleF90eXBlLCBhc3Ryb2lkLkNvbnN0KToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4X3R5cGUudmFsdWUsIChpbnQsIHR5cGUoTm9uZSkpKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgSW5zdGFuY2UgdmFsdWVzIG11c3QgYmUgb2YgdHlwZSBpbnQsIE5vbmUgb3IgYW4gb2JqZWN0CisgICAgICAgICAgICAjIHdpdGggX19pbmRleF9fCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5kZXhfdHlwZSwgYXN0cm9pZC5JbnN0YW5jZSk6CisgICAgICAgICAgICAgICAgaWYgaW5kZXhfdHlwZS5weXR5cGUoKSBpbiAoQlVJTFRJTlMgKyAiLmludCIsIEJVSUxUSU5TICsgIi5Ob25lVHlwZSIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbmRleF90eXBlLmdldGF0dHIoIl9faW5kZXhfXyIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGludmFsaWRfc2xpY2VzICs9IDEKKworICAgICAgICBpZiBub3QgaW52YWxpZF9zbGljZXM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IsIHVubGVzcyB0aGUgb2JqZWN0IHRoYXQgaXMgaW5kZXhlZAorICAgICAgICAjIGlzIGEgY3VzdG9tIG9iamVjdCwgd2hpY2gga25vd3MgaG93IHRvIGhhbmRsZSB0aGlzIGtpbmQgb2Ygc2xpY2VzCisgICAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLkV4dFNsaWNlKToKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuU3Vic2NyaXB0KToKKyAgICAgICAgICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihwYXJlbnQudmFsdWUpCisgICAgICAgICAgICBpZiBpbmZlcnJlZCBpcyBOb25lIG9yIGluZmVycmVkIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgIyBEb24ndCBrbm93IHdoYXQgdGhpcyBpcworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAga25vd25fb2JqZWN0cyA9ICgKKyAgICAgICAgICAgICAgICBhc3Ryb2lkLkxpc3QsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5EaWN0LAorICAgICAgICAgICAgICAgIGFzdHJvaWQuVHVwbGUsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5vYmplY3RzLkZyb3plblNldCwKKyAgICAgICAgICAgICAgICBhc3Ryb2lkLlNldCwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBrbm93bl9vYmplY3RzKToKKyAgICAgICAgICAgICAgICAjIE1pZ2h0IGJlIGFuIGluc3RhbmNlIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSB0aGlzIHNsaWNlIG9iamVjdAorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgXyBpbiByYW5nZShpbnZhbGlkX3NsaWNlcyk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJpbnZhbGlkLXNsaWNlLWluZGV4Iiwgbm9kZT1ub2RlKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJub3QtY29udGV4dC1tYW5hZ2VyIikKKyAgICBkZWYgdmlzaXRfd2l0aChzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIGN0eF9tZ3IsIF8gaW4gbm9kZS5pdGVtczoKKyAgICAgICAgICAgIGNvbnRleHQgPSBhc3Ryb2lkLmNvbnRleHQuSW5mZXJlbmNlQ29udGV4dCgpCisgICAgICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIoY3R4X21nciwgY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgaW5mZXJyZWQgaXMgTm9uZSBvciBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuYmFzZXMuR2VuZXJhdG9yKToKKyAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBmdW5jdGlvbiBkZWNvcmF0ZWQKKyAgICAgICAgICAgICAgICAjIHdpdGggY29udGV4dGxpYi5jb250ZXh0bWFuYWdlci4KKyAgICAgICAgICAgICAgICBpZiBkZWNvcmF0ZWRfd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWQucGFyZW50LCBzZWxmLmNvbmZpZy5jb250ZXh0bWFuYWdlcl9kZWNvcmF0b3JzCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBwYXJlbnQgb2YgdGhlIGdlbmVyYXRvciBpcyBub3QgdGhlIGNvbnRleHQgbWFuYWdlciBpdHNlbGYsCisgICAgICAgICAgICAgICAgIyB0aGF0IG1lYW5zIHRoYXQgaXQgY291bGQgaGF2ZSBiZWVuIHJldHVybmVkIGZyb20gYW5vdGhlcgorICAgICAgICAgICAgICAgICMgZnVuY3Rpb24gd2hpY2ggd2FzIHRoZSByZWFsIGNvbnRleHQgbWFuYWdlci4KKyAgICAgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgYXBwcm9hY2ggaXMgbW9yZSBvZiBhIGhhY2sgcmF0aGVyIHRoYW4gYSByZWFsCisgICAgICAgICAgICAgICAgIyBzb2x1dGlvbjogd2FsayBhbGwgdGhlIGluZmVycmVkIHN0YXRlbWVudHMgZm9yIHRoZQorICAgICAgICAgICAgICAgICMgZ2l2ZW4gKmN0eF9tZ3IqIGFuZCBpZiB5b3UgZmluZCBvbmUgZnVuY3Rpb24gc2NvcGUKKyAgICAgICAgICAgICAgICAjIHdoaWNoIGlzIGRlY29yYXRlZCwgY29uc2lkZXIgaXQgdG8gYmUgdGhlIHJlYWwKKyAgICAgICAgICAgICAgICAjIG1hbmFnZXIgYW5kIGdpdmUgdXAsIG90aGVyd2lzZSBlbWl0IG5vdC1jb250ZXh0LW1hbmFnZXIuCisgICAgICAgICAgICAgICAgIyBTZWUgdGhlIHRlc3QgZmlsZSBmb3Igbm90X2NvbnRleHRfbWFuYWdlciBmb3IgYSBjb3VwbGUKKyAgICAgICAgICAgICAgICAjIG9mIHNlbGYgZXhwbGFpbmluZyB0ZXN0cy4KKworICAgICAgICAgICAgICAgICMgUmV0cmlldmUgbm9kZSBmcm9tIGFsbCBwcmV2aXVzbHkgdmlzaXRlZCBub2RlcyBpbiB0aGUgdGhlIGluZmVyZW5jZSBoaXN0b3J5CisgICAgICAgICAgICAgICAgY29udGV4dF9wYXRoX25hbWVzID0gZmlsdGVyKE5vbmUsIF91bmZsYXR0ZW4oY29udGV4dC5wYXRoKSkKKyAgICAgICAgICAgICAgICBpbmZlcnJlZF9wYXRocyA9IF9mbGF0dGVuX2NvbnRhaW5lcigKKyAgICAgICAgICAgICAgICAgICAgc2FmZV9pbmZlcihwYXRoKSBmb3IgcGF0aCBpbiBjb250ZXh0X3BhdGhfbmFtZXMKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZm9yIGluZmVycmVkX3BhdGggaW4gaW5mZXJyZWRfcGF0aHM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpbmZlcnJlZF9wYXRoOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBpbmZlcnJlZF9wYXRoLnNjb3BlKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVjb3JhdGVkX3dpdGgoc2NvcGUsIHNlbGYuY29uZmlnLmNvbnRleHRtYW5hZ2VyX2RlY29yYXRvcnMpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdC1jb250ZXh0LW1hbmFnZXIiLCBub2RlPW5vZGUsIGFyZ3M9KGluZmVycmVkLm5hbWUsKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWQuZ2V0YXR0cigiX19lbnRlcl9fIikKKyAgICAgICAgICAgICAgICAgICAgaW5mZXJyZWQuZ2V0YXR0cigiX19leGl0X18iKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuSW5zdGFuY2UpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBkbyBub3Qga25vdyB0aGUgYmFzZXMgb2YgdGhpcyBjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICMganVzdCBza2lwIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGhhc19rbm93bl9iYXNlcyhpbmZlcnJlZCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSnVzdCBpZ25vcmUgbWl4aW4gY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY29uZmlnLmlnbm9yZV9taXhpbl9tZW1iZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluZmVycmVkLm5hbWVbLTU6XS5sb3dlcigpID09ICJtaXhpbiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QtY29udGV4dC1tYW5hZ2VyIiwgbm9kZT1ub2RlLCBhcmdzPShpbmZlcnJlZC5uYW1lLCkKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJpbnZhbGlkLXVuYXJ5LW9wZXJhbmQtdHlwZSIpCisgICAgZGVmIHZpc2l0X3VuYXJ5b3Aoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkRldGVjdCBUeXBlRXJyb3JzIGZvciB1bmFyeSBvcGVyYW5kcy4iIiIKKworICAgICAgICBmb3IgZXJyb3IgaW4gbm9kZS50eXBlX2Vycm9ycygpOgorICAgICAgICAgICAgIyBMZXQgdGhlIGVycm9yIGN1c3RvbWl6ZSBpdHMgb3V0cHV0LgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGUiLCBhcmdzPXN0cihlcnJvciksIG5vZGU9bm9kZSkKKworICAgIEBjaGVja19tZXNzYWdlcygidW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbiIpCisgICAgZGVmIHZpc2l0X2Jpbm9wKHNlbGYsIG5vZGU6IGFzdHJvaWQuQmluT3ApOgorICAgICAgICBpZiBub2RlLm9wID09ICJ8IjoKKyAgICAgICAgICAgIHNlbGYuX2RldGVjdF91bnN1cHBvcnRlZF9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXgobm9kZSkKKworICAgIGRlZiBfZGV0ZWN0X3Vuc3VwcG9ydGVkX2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheChzZWxmLCBub2RlOiBhc3Ryb2lkLkJpbk9wKSAtPiBOb25lOgorICAgICAgICAiIiJEZXRlY3QgaWYgdW5zdXBwb3J0ZWQgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IChQRVAgNjA0KSB3YXMgdXNlZC4iIiIKKyAgICAgICAgaWYgUFkzMTBfUExVUzogICMgMzEwKyBzdXBwb3J0cyB0aGUgbmV3IHN5bnRheAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUucGFyZW50LCBUWVBFX0FOTk9UQVRJT05fTk9ERVNfVFlQRVMKKyAgICAgICAgKSBhbmQgbm90IGlzX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2VuYWJsZWQobm9kZSk6CisgICAgICAgICAgICAjIFVzZSBpbiB0eXBlIGFubm90YXRpb25zIG9ubHkgYWxsb3dlZCBpZgorICAgICAgICAgICAgIyBwb3N0cG9uZWQgZXZhbHVhdGlvbiBpcyBlbmFibGVkLgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfdW5zdXBwb3J0ZWRfYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4KG5vZGUpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIG5vZGUucGFyZW50LAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGFzdHJvaWQuQXNzaWduLAorICAgICAgICAgICAgICAgIGFzdHJvaWQuQ2FsbCwKKyAgICAgICAgICAgICAgICBhc3Ryb2lkLktleXdvcmQsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5EaWN0LAorICAgICAgICAgICAgICAgIGFzdHJvaWQuVHVwbGUsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5TZXQsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5MaXN0LAorICAgICAgICAgICAgICAgIGFzdHJvaWQuQmluT3AsCisgICAgICAgICAgICApLAorICAgICAgICApOgorICAgICAgICAgICAgIyBDaGVjayBvdGhlciBjb250ZXh0cyB0aGUgc3ludGF4IG1pZ2h0IGFwcGVhciwgYnV0IGFyZSBpbnZhbGlkLgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgdG8gZmlsdGVyIGNvbnRleHQgaWYgcG9zdHBvbmVkIGV2YWx1YXRpb24gaXMgZW5hYmxlZAorICAgICAgICAgICAgIyBhbmQgcGFyZW50IGlzIGFsbG93ZWQgbm9kZSB0eXBlLgorICAgICAgICAgICAgYWxsb3dlZF9uZXN0ZWRfc3ludGF4ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIGlzX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2VuYWJsZWQobm9kZSk6CisgICAgICAgICAgICAgICAgcGFyZW50X25vZGUgPSBub2RlLnBhcmVudAorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyZW50X25vZGUsIFRZUEVfQU5OT1RBVElPTl9OT0RFU19UWVBFUyk6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkX25lc3RlZF9zeW50YXggPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZSA9IHBhcmVudF9ub2RlLnBhcmVudAorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmVudF9ub2RlLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IGFsbG93ZWRfbmVzdGVkX3N5bnRheDoKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja191bnN1cHBvcnRlZF9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXgobm9kZSkKKworICAgIGRlZiBfY2hlY2tfdW5zdXBwb3J0ZWRfYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4KHNlbGYsIG5vZGU6IGFzdHJvaWQuQmluT3ApIC0+IE5vbmU6CisgICAgICAgICIiIkNoZWNrIGlmIGxlZnQgb3IgcmlnaHQgbm9kZSBpcyBvZiB0eXBlIGB0eXBlYC4iIiIKKyAgICAgICAgbXNnID0gInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfCIKKyAgICAgICAgZm9yIG4gaW4gKG5vZGUubGVmdCwgbm9kZS5yaWdodCk6CisgICAgICAgICAgICBuID0gYXN0cm9pZC5oZWxwZXJzLm9iamVjdF90eXBlKG4pCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG4sIGFzdHJvaWQuQ2xhc3NEZWYpIGFuZCBpc19jbGFzc2RlZl90eXBlKG4pOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb24iLCBhcmdzPW1zZywgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoInVuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb24iKQorICAgIGRlZiBfdmlzaXRfYmlub3Aoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkRldGVjdCBUeXBlRXJyb3JzIGZvciBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYW5kcy4iIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfYmlub3BfZXJyb3JzKG5vZGUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoInVuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb24iKQorICAgIGRlZiBfdmlzaXRfYXVnYXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJEZXRlY3QgVHlwZUVycm9ycyBmb3IgYXVnbWVudGVkIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhbmRzLiIiIgorICAgICAgICBzZWxmLl9jaGVja19iaW5vcF9lcnJvcnMobm9kZSkKKworICAgIGRlZiBfY2hlY2tfYmlub3BfZXJyb3JzKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgZXJyb3IgaW4gbm9kZS50eXBlX2Vycm9ycygpOgorICAgICAgICAgICAgIyBMZXQgdGhlIGVycm9yIGN1c3RvbWl6ZSBpdHMgb3V0cHV0LgorICAgICAgICAgICAgaWYgYW55KAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uob2JqLCBhc3Ryb2lkLkNsYXNzRGVmKSBhbmQgbm90IGhhc19rbm93bl9iYXNlcyhvYmopCisgICAgICAgICAgICAgICAgZm9yIG9iaiBpbiAoZXJyb3IubGVmdF90eXBlLCBlcnJvci5yaWdodF90eXBlKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbiIsIGFyZ3M9c3RyKGVycm9yKSwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19tZW1iZXJzaGlwX3Rlc3Qoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIGlzX2luc2lkZV9hYnN0cmFjdF9jbGFzcyhub2RlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc19jb21wcmVoZW5zaW9uKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihub2RlKQorICAgICAgICBpZiBpbmZlcnJlZCBpcyBOb25lIG9yIGluZmVycmVkIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHN1cHBvcnRzX21lbWJlcnNoaXBfdGVzdChpbmZlcnJlZCk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3QiLCBhcmdzPW5vZGUuYXNfc3RyaW5nKCksIG5vZGU9bm9kZQorICAgICAgICAgICAgKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJ1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3QiKQorICAgIGRlZiB2aXNpdF9jb21wYXJlKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBsZW4obm9kZS5vcHMpICE9IDE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBvcCwgcmlnaHQgPSBub2RlLm9wc1swXQorICAgICAgICBpZiBvcCBpbiBbImluIiwgIm5vdCBpbiJdOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbWVtYmVyc2hpcF90ZXN0KHJpZ2h0KQorCisgICAgQGNoZWNrX21lc3NhZ2VzKAorICAgICAgICAidW5zdWJzY3JpcHRhYmxlLW9iamVjdCIsCisgICAgICAgICJ1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbiIsCisgICAgICAgICJ1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uIiwKKyAgICAgICAgInVuaGFzaGFibGUtZGljdC1rZXkiLAorICAgICAgICAiaW52YWxpZC1zZXF1ZW5jZS1pbmRleCIsCisgICAgICAgICJpbnZhbGlkLXNsaWNlLWluZGV4IiwKKyAgICApCisgICAgZGVmIHZpc2l0X3N1YnNjcmlwdChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfaW52YWxpZF9zZXF1ZW5jZV9pbmRleChub2RlKQorCisgICAgICAgIHN1cHBvcnRlZF9wcm90b2NvbCA9IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnZhbHVlLCAoYXN0cm9pZC5MaXN0Q29tcCwgYXN0cm9pZC5EaWN0Q29tcCkpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3Ryb2lkLkRpY3QpOgorICAgICAgICAgICAgIyBBc3NlcnQgZGljdCBrZXkgaXMgaGFzaGFibGUKKyAgICAgICAgICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihub2RlLnNsaWNlKQorICAgICAgICAgICAgaWYgaW5mZXJyZWQgbm90IGluIChOb25lLCBhc3Ryb2lkLlVuaW5mZXJhYmxlKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGhhc2hfZm4gPSBuZXh0KGluZmVycmVkLmlnZXRhdHRyKCJfX2hhc2hfXyIpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihoYXNoX2ZuLCAidmFsdWUiLCBUcnVlKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW5oYXNoYWJsZS1kaWN0LWtleSIsIG5vZGU9bm9kZS52YWx1ZSkKKworICAgICAgICBpZiBub2RlLmN0eCA9PSBhc3Ryb2lkLkxvYWQ6CisgICAgICAgICAgICBzdXBwb3J0ZWRfcHJvdG9jb2wgPSBzdXBwb3J0c19nZXRpdGVtCisgICAgICAgICAgICBtc2cgPSAidW5zdWJzY3JpcHRhYmxlLW9iamVjdCIKKyAgICAgICAgZWxpZiBub2RlLmN0eCA9PSBhc3Ryb2lkLlN0b3JlOgorICAgICAgICAgICAgc3VwcG9ydGVkX3Byb3RvY29sID0gc3VwcG9ydHNfc2V0aXRlbQorICAgICAgICAgICAgbXNnID0gInVuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uIgorICAgICAgICBlbGlmIG5vZGUuY3R4ID09IGFzdHJvaWQuRGVsOgorICAgICAgICAgICAgc3VwcG9ydGVkX3Byb3RvY29sID0gc3VwcG9ydHNfZGVsaXRlbQorICAgICAgICAgICAgbXNnID0gInVuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb24iCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnZhbHVlLCBhc3Ryb2lkLlNldENvbXApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZShtc2csIGFyZ3M9bm9kZS52YWx1ZS5hc19zdHJpbmcoKSwgbm9kZT1ub2RlLnZhbHVlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaXNfaW5zaWRlX2Fic3RyYWN0X2NsYXNzKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW5mZXJyZWQgPSBzYWZlX2luZmVyKG5vZGUudmFsdWUpCisKKyAgICAgICAgaWYgaW5mZXJyZWQgaXMgTm9uZSBvciBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgZ2V0YXR0cihpbmZlcnJlZCwgImRlY29yYXRvcnMiLCBOb25lKToKKyAgICAgICAgICAgIGZpcnN0X2RlY29yYXRvciA9IGFzdHJvaWQuaGVscGVycy5zYWZlX2luZmVyKGluZmVycmVkLmRlY29yYXRvcnMubm9kZXNbMF0pCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZpcnN0X2RlY29yYXRvciwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICAgICAgaW5mZXJyZWQgPSBmaXJzdF9kZWNvcmF0b3IuaW5zdGFudGlhdGVfY2xhc3MoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gICMgSXQgd291bGQgYmUgYmV0dGVyIHRvIGhhbmRsZSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICMgZGVjb3JhdG9ycywgYnV0IGxldCdzIHN0YXJ0IHNsb3cuCisKKyAgICAgICAgaWYgbm90IHN1cHBvcnRlZF9wcm90b2NvbChpbmZlcnJlZCwgbm9kZSk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1zZywgYXJncz1ub2RlLnZhbHVlLmFzX3N0cmluZygpLCBub2RlPW5vZGUudmFsdWUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoImRpY3QtaXRlbXMtbWlzc2luZy1pdGVyIikKKyAgICBkZWYgdmlzaXRfZm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLnRhcmdldCwgYXN0cm9pZC5ub2RlX2NsYXNzZXMuVHVwbGUpOgorICAgICAgICAgICAgIyB0YXJnZXQgaXMgbm90IGEgdHVwbGUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgbGVuKG5vZGUudGFyZ2V0LmVsdHMpID09IDI6CisgICAgICAgICAgICAjIHRhcmdldCBpcyBub3QgYSB0dXBsZSBvZiB0d28gZWxlbWVudHMKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGl0ZXJhYmxlID0gbm9kZS5pdGVyCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZXJhYmxlLCBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5OYW1lKToKKyAgICAgICAgICAgICMgaXQncyBub3QgYSBiYXJlIHZhcmlhYmxlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIoaXRlcmFibGUpCisgICAgICAgIGlmIG5vdCBpbmZlcnJlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5ub2RlX2NsYXNzZXMuRGljdCk6CisgICAgICAgICAgICAjIHRoZSBpdGVyYWJsZSBpcyBub3QgYSBkaWN0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJkaWN0LWl0ZXItbWlzc2luZy1pdGVtcyIsIG5vZGU9bm9kZSkKKworCitjbGFzcyBJdGVyYWJsZUNoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiIgorICAgIENoZWNrcyBmb3Igbm9uLWl0ZXJhYmxlcyB1c2VkIGluIGFuIGl0ZXJhYmxlIGNvbnRleHQuCisgICAgQ29udGV4dHMgaW5jbHVkZToKKyAgICAtIGZvci1zdGF0ZW1lbnQKKyAgICAtIHN0YXJhcmdzIGluIGZ1bmN0aW9uIGNhbGwKKyAgICAtIGB5aWVsZCBmcm9tYC1zdGF0ZW1lbnQKKyAgICAtIGxpc3QsIGRpY3QgYW5kIHNldCBjb21wcmVoZW5zaW9ucworICAgIC0gZ2VuZXJhdG9yIGV4cHJlc3Npb25zCisgICAgQWxzbyBjaGVja3MgZm9yIG5vbi1tYXBwaW5ncyBpbiBmdW5jdGlvbiBjYWxsIGt3YXJncy4KKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisgICAgbmFtZSA9ICJ0eXBlY2hlY2siCisKKyAgICBtc2dzID0geworICAgICAgICAiRTExMzMiOiAoCisgICAgICAgICAgICAiTm9uLWl0ZXJhYmxlIHZhbHVlICVzIGlzIHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQiLAorICAgICAgICAgICAgIm5vdC1hbi1pdGVyYWJsZSIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgbm9uLWl0ZXJhYmxlIHZhbHVlIGlzIHVzZWQgaW4gcGxhY2Ugd2hlcmUgIgorICAgICAgICAgICAgIml0ZXJhYmxlIGlzIGV4cGVjdGVkIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkUxMTM0IjogKAorICAgICAgICAgICAgIk5vbi1tYXBwaW5nIHZhbHVlICVzIGlzIHVzZWQgaW4gYSBtYXBwaW5nIGNvbnRleHQiLAorICAgICAgICAgICAgIm5vdC1hLW1hcHBpbmciLAorICAgICAgICAgICAgIlVzZWQgd2hlbiBhIG5vbi1tYXBwaW5nIHZhbHVlIGlzIHVzZWQgaW4gcGxhY2Ugd2hlcmUgIgorICAgICAgICAgICAgIm1hcHBpbmcgaXMgZXhwZWN0ZWQiLAorICAgICAgICApLAorICAgIH0KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2lzX2FzeW5jaW9fY29yb3V0aW5lKG5vZGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaW5mZXJyZWRfZnVuYyA9IHNhZmVfaW5mZXIobm9kZS5mdW5jKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZF9mdW5jLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBub3QgaW5mZXJyZWRfZnVuYy5kZWNvcmF0b3JzOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBkZWNvcmF0b3IgaW4gaW5mZXJyZWRfZnVuYy5kZWNvcmF0b3JzLm5vZGVzOgorICAgICAgICAgICAgaW5mZXJyZWRfZGVjb3JhdG9yID0gc2FmZV9pbmZlcihkZWNvcmF0b3IpCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZF9kZWNvcmF0b3IsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpbmZlcnJlZF9kZWNvcmF0b3IucW5hbWUoKSAhPSBBU1lOQ0lPX0NPUk9VVElORToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX2NoZWNrX2l0ZXJhYmxlKHNlbGYsIG5vZGUsIGNoZWNrX2FzeW5jPUZhbHNlKToKKyAgICAgICAgaWYgaXNfaW5zaWRlX2Fic3RyYWN0X2NsYXNzKG5vZGUpIG9yIGlzX2NvbXByZWhlbnNpb24obm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW5mZXJyZWQgPSBzYWZlX2luZmVyKG5vZGUpCisgICAgICAgIGlmIG5vdCBpbmZlcnJlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgaXNfaXRlcmFibGUoaW5mZXJyZWQsIGNoZWNrX2FzeW5jPWNoZWNrX2FzeW5jKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5vdC1hbi1pdGVyYWJsZSIsIGFyZ3M9bm9kZS5hc19zdHJpbmcoKSwgbm9kZT1ub2RlKQorCisgICAgZGVmIF9jaGVja19tYXBwaW5nKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc19pbnNpZGVfYWJzdHJhY3RfY2xhc3Mobm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkRpY3RDb21wKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIobm9kZSkKKyAgICAgICAgaWYgaW5mZXJyZWQgaXMgTm9uZSBvciBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBpc19tYXBwaW5nKGluZmVycmVkKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm5vdC1hLW1hcHBpbmciLCBhcmdzPW5vZGUuYXNfc3RyaW5nKCksIG5vZGU9bm9kZSkKKworICAgIEBjaGVja19tZXNzYWdlcygibm90LWFuLWl0ZXJhYmxlIikKKyAgICBkZWYgdmlzaXRfZm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19pdGVyYWJsZShub2RlLml0ZXIpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoIm5vdC1hbi1pdGVyYWJsZSIpCisgICAgZGVmIHZpc2l0X2FzeW5jZm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19pdGVyYWJsZShub2RlLml0ZXIsIGNoZWNrX2FzeW5jPVRydWUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoIm5vdC1hbi1pdGVyYWJsZSIpCisgICAgZGVmIHZpc2l0X3lpZWxkZnJvbShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgc2VsZi5faXNfYXN5bmNpb19jb3JvdXRpbmUobm9kZS52YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmFibGUobm9kZS52YWx1ZSkKKworICAgIEBjaGVja19tZXNzYWdlcygibm90LWFuLWl0ZXJhYmxlIiwgIm5vdC1hLW1hcHBpbmciKQorICAgIGRlZiB2aXNpdF9jYWxsKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3Igc3RhcmFyZyBpbiBub2RlLnN0YXJhcmdzOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmFibGUoc3RhcmFyZy52YWx1ZSkKKyAgICAgICAgZm9yIGt3YXJnIGluIG5vZGUua3dhcmdzOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbWFwcGluZyhrd2FyZy52YWx1ZSkKKworICAgIEBjaGVja19tZXNzYWdlcygibm90LWFuLWl0ZXJhYmxlIikKKyAgICBkZWYgdmlzaXRfbGlzdGNvbXAoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBnZW4gaW4gbm9kZS5nZW5lcmF0b3JzOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmFibGUoZ2VuLml0ZXIsIGNoZWNrX2FzeW5jPWdlbi5pc19hc3luYykKKworICAgIEBjaGVja19tZXNzYWdlcygibm90LWFuLWl0ZXJhYmxlIikKKyAgICBkZWYgdmlzaXRfZGljdGNvbXAoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBnZW4gaW4gbm9kZS5nZW5lcmF0b3JzOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmFibGUoZ2VuLml0ZXIsIGNoZWNrX2FzeW5jPWdlbi5pc19hc3luYykKKworICAgIEBjaGVja19tZXNzYWdlcygibm90LWFuLWl0ZXJhYmxlIikKKyAgICBkZWYgdmlzaXRfc2V0Y29tcChzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIGdlbiBpbiBub2RlLmdlbmVyYXRvcnM6CisgICAgICAgICAgICBzZWxmLl9jaGVja19pdGVyYWJsZShnZW4uaXRlciwgY2hlY2tfYXN5bmM9Z2VuLmlzX2FzeW5jKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJub3QtYW4taXRlcmFibGUiKQorICAgIGRlZiB2aXNpdF9nZW5lcmF0b3JleHAoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBnZW4gaW4gbm9kZS5nZW5lcmF0b3JzOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmFibGUoZ2VuLml0ZXIsIGNoZWNrX2FzeW5jPWdlbi5pc19hc3luYykKKworICAgIEBjaGVja19tZXNzYWdlcygiYXdhaXQtb3V0c2lkZS1hc3luYyIpCisgICAgZGVmIHZpc2l0X2F3YWl0KHNlbGYsIG5vZGU6IGFzdHJvaWQuQXdhaXQpIC0+IE5vbmU6CisgICAgICAgIHNlbGYuX2NoZWNrX2F3YWl0X291dHNpZGVfY29yb3V0aW5lKG5vZGUpCisKKyAgICBkZWYgX2NoZWNrX2F3YWl0X291dHNpZGVfY29yb3V0aW5lKHNlbGYsIG5vZGU6IGFzdHJvaWQuQXdhaXQpIC0+IE5vbmU6CisgICAgICAgIG5vZGVfc2NvcGUgPSBub2RlLnNjb3BlKCkKKyAgICAgICAgd2hpbGUgbm90IGlzaW5zdGFuY2Uobm9kZV9zY29wZSwgYXN0cm9pZC5Nb2R1bGUpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlX3Njb3BlLCBhc3Ryb2lkLkFzeW5jRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlX3Njb3BlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbm9kZV9zY29wZSA9IG5vZGVfc2NvcGUucGFyZW50LnNjb3BlKCkKKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYXdhaXQtb3V0c2lkZS1hc3luYyIsIG5vZGU9bm9kZSkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihUeXBlQ2hlY2tlcihsaW50ZXIpKQorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEl0ZXJhYmxlQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2NoZWNrZXJzL3V0aWxzLnB5IGIvcHlsaW50L2NoZWNrZXJzL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjU1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvdXRpbHMucHkKQEAgLTAsMCArMSwxNTEyIEBACisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA3LCAyMDA5LTIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMDkgTWFkcyBLaWlsZXJpY2ggPG1hZHNAa2lpbGVyaWNoLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEwIERhbmllbCBIYXJkaW5nIDxkaGFyZGluZ0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgRkVMRCBCb3JpcyA8bG90aGlyYWxkYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IFJpY2FyZG8gR2VtaWduYW5pIDxyaWNhcmRvLmdlbWlnbmFuaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IERtaXRyeSBQcmlieXNoIDxkbWFuZEB5YW5kZXgucnU+CisjIENvcHlyaWdodCAoYykgMjAxNSBGbG9yaWFuIEJydWhpbiA8bWVAdGhlLWNvbXBpbGVyLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFJhZHUgQ2lvcmJhIDxyYWR1QGRldnJhbmRvbS5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTgtMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IE1vaXNlcyBMb3BleiA8bW95bG9wMjYwQHZhdXhvby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBCcmlhbiBDLiBMYW5lIDxiY2xAcmVkaGF0LmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgdHRlbmhvZXZlLWFhIDx0dGVuaG9ldmVAYXBwYW5uaWUuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQWxhbiBDaGFuIDxhY2hhbjk2MTExN0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFl1cnkgR3JpYm92IDx0ZXRyYTIwMDVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQ2FpbyBDYXJyYXJhIDxjY2FycmFyYUByZWRoYXQuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5ndWludGFAcHJvdG9ubWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBCcnljZSBHdWludGEgPGJyeWNlLnBhdWwuZ3VpbnRhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOCBCcmlhbiBTaGFnaW5hdyA8YnJpYW4uc2hhZ2luYXdAd2FyYnlwYXJrZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE1hdHRoaWpzIEJsb20gPDE5ODE3OTYwK01hdHRoaWpzQmxvbUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBEamFpbGxhIDxiYXN0aWVuLnZhbGxldEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE5hdGhhbiBNYXJyb3cgPG5tYXJyb3dAZ29vZ2xlLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFN2ZXQgPHN2ZXRAaHlwZXJzY2llbmNlLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFBhc2NhbCBDb3JwZXQgPHBjb3JwZXRAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQmF0dWhhbiBUYXNrYXlhIDxiYXR1aGFub3NtYW50YXNrYXlhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEx1aWdpIDxsdWlnaS5jcmlzdG9mb2xpbmlAcS1jdHJsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGV0aGFuLWxlYmEgPGV0aGFubGViYTVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRGFtaWVuIEJhdHkgPGRhbWllbi5iYXR5QHBvbHljb25zZWlsLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW5kcmV3IFNpbW1vbnMgPGFuanNpbW1vQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFJhbSBSYWNodW0gPHJhbUByYWNodW0uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgU2xhdmZveCA8c2xhdmZveG1hbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIHl1c2hhbzIgPDM2ODQ4NDcyK3l1c2hhbzJAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiInNvbWUgZnVuY3Rpb25zIHRoYXQgbWF5IGJlIHVzZWZ1bCBmb3IgdmFyaW91cyBjaGVja2VycworIiIiCitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBudW1iZXJzCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBscnVfY2FjaGUsIHBhcnRpYWwKK2Zyb20gdHlwaW5nIGltcG9ydCAoCisgICAgQW55LAorICAgIENhbGxhYmxlLAorICAgIERpY3QsCisgICAgSXRlcmFibGUsCisgICAgTGlzdCwKKyAgICBNYXRjaCwKKyAgICBPcHRpb25hbCwKKyAgICBTZXQsCisgICAgVHVwbGUsCisgICAgVW5pb24sCispCisKK2ltcG9ydCBfc3RyaW5nCitpbXBvcnQgYXN0cm9pZAorCitCVUlMVElOU19OQU1FID0gYnVpbHRpbnMuX19uYW1lX18KK0NPTVBfTk9ERV9UWVBFUyA9ICgKKyAgICBhc3Ryb2lkLkxpc3RDb21wLAorICAgIGFzdHJvaWQuU2V0Q29tcCwKKyAgICBhc3Ryb2lkLkRpY3RDb21wLAorICAgIGFzdHJvaWQuR2VuZXJhdG9yRXhwLAorKQorRVhDRVBUSU9OU19NT0RVTEUgPSAiYnVpbHRpbnMiCitBQkNfTU9EVUxFUyA9IHsiYWJjIiwgIl9weV9hYmMifQorQUJDX01FVEhPRFMgPSB7CisgICAgImFiYy5hYnN0cmFjdHByb3BlcnR5IiwKKyAgICAiYWJjLmFic3RyYWN0bWV0aG9kIiwKKyAgICAiYWJjLmFic3RyYWN0Y2xhc3NtZXRob2QiLAorICAgICJhYmMuYWJzdHJhY3RzdGF0aWNtZXRob2QiLAorfQorVFlQSU5HX1BST1RPQ09MUyA9IGZyb3plbnNldCgKKyAgICB7InR5cGluZy5Qcm90b2NvbCIsICJ0eXBpbmdfZXh0ZW5zaW9ucy5Qcm90b2NvbCIsICIuUHJvdG9jb2wifQorKQorSVRFUl9NRVRIT0QgPSAiX19pdGVyX18iCitBSVRFUl9NRVRIT0QgPSAiX19haXRlcl9fIgorTkVYVF9NRVRIT0QgPSAiX19uZXh0X18iCitHRVRJVEVNX01FVEhPRCA9ICJfX2dldGl0ZW1fXyIKK0NMQVNTX0dFVElURU1fTUVUSE9EID0gIl9fY2xhc3NfZ2V0aXRlbV9fIgorU0VUSVRFTV9NRVRIT0QgPSAiX19zZXRpdGVtX18iCitERUxJVEVNX01FVEhPRCA9ICJfX2RlbGl0ZW1fXyIKK0NPTlRBSU5TX01FVEhPRCA9ICJfX2NvbnRhaW5zX18iCitLRVlTX01FVEhPRCA9ICJrZXlzIgorCisjIERpY3Rpb25hcnkgd2hpY2ggbWFwcyB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIHBhcmFtZXRlcnMgYQorIyBzcGVjaWFsIG1ldGhvZCBjYW4gaGF2ZSB0byBhIHNldCBvZiBzcGVjaWFsIG1ldGhvZHMuCisjIFRoZSBmb2xsb3dpbmcga2V5cyBhcmUgdXNlZCB0byBkZW5vdGUgdGhlIHBhcmFtZXRlcnMgcmVzdHJpY3Rpb25zOgorIworIyAqIE5vbmU6IHZhcmlhYmxlIG51bWJlciBvZiBwYXJhbWV0ZXJzCisjICogbnVtYmVyOiBleGFjdGx5IHRoYXQgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyMgKiB0dXBsZTogdGhpcyBhcmUgdGhlIG9kZCBvbmVzLiBCYXNpY2FsbHkgaXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24KKyMgICAgICAgICAgY2FuIHdvcmsgd2l0aCBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyBmcm9tIHRoYXQgdHVwbGUsCisjICAgICAgICAgIGFsdGhvdWdoIGl0J3MgYmVzdCB0byBpbXBsZW1lbnQgaXQgaW4gb3JkZXIgdG8gYWNjZXB0CisjICAgICAgICAgIGFsbCBvZiB0aGVtLgorX1NQRUNJQUxfTUVUSE9EU19QQVJBTVMgPSB7CisgICAgTm9uZTogKCJfX25ld19fIiwgIl9faW5pdF9fIiwgIl9fY2FsbF9fIiksCisgICAgMDogKAorICAgICAgICAiX19kZWxfXyIsCisgICAgICAgICJfX3JlcHJfXyIsCisgICAgICAgICJfX3N0cl9fIiwKKyAgICAgICAgIl9fYnl0ZXNfXyIsCisgICAgICAgICJfX2hhc2hfXyIsCisgICAgICAgICJfX2Jvb2xfXyIsCisgICAgICAgICJfX2Rpcl9fIiwKKyAgICAgICAgIl9fbGVuX18iLAorICAgICAgICAiX19sZW5ndGhfaGludF9fIiwKKyAgICAgICAgIl9faXRlcl9fIiwKKyAgICAgICAgIl9fcmV2ZXJzZWRfXyIsCisgICAgICAgICJfX25lZ19fIiwKKyAgICAgICAgIl9fcG9zX18iLAorICAgICAgICAiX19hYnNfXyIsCisgICAgICAgICJfX2ludmVydF9fIiwKKyAgICAgICAgIl9fY29tcGxleF9fIiwKKyAgICAgICAgIl9faW50X18iLAorICAgICAgICAiX19mbG9hdF9fIiwKKyAgICAgICAgIl9faW5kZXhfXyIsCisgICAgICAgICJfX3RydW5jX18iLAorICAgICAgICAiX19mbG9vcl9fIiwKKyAgICAgICAgIl9fY2VpbF9fIiwKKyAgICAgICAgIl9fZW50ZXJfXyIsCisgICAgICAgICJfX2FlbnRlcl9fIiwKKyAgICAgICAgIl9fZ2V0bmV3YXJnc19leF9fIiwKKyAgICAgICAgIl9fZ2V0bmV3YXJnc19fIiwKKyAgICAgICAgIl9fZ2V0c3RhdGVfXyIsCisgICAgICAgICJfX3JlZHVjZV9fIiwKKyAgICAgICAgIl9fY29weV9fIiwKKyAgICAgICAgIl9fdW5pY29kZV9fIiwKKyAgICAgICAgIl9fbm9uemVyb19fIiwKKyAgICAgICAgIl9fYXdhaXRfXyIsCisgICAgICAgICJfX2FpdGVyX18iLAorICAgICAgICAiX19hbmV4dF9fIiwKKyAgICAgICAgIl9fZnNwYXRoX18iLAorICAgICksCisgICAgMTogKAorICAgICAgICAiX19mb3JtYXRfXyIsCisgICAgICAgICJfX2x0X18iLAorICAgICAgICAiX19sZV9fIiwKKyAgICAgICAgIl9fZXFfXyIsCisgICAgICAgICJfX25lX18iLAorICAgICAgICAiX19ndF9fIiwKKyAgICAgICAgIl9fZ2VfXyIsCisgICAgICAgICJfX2dldGF0dHJfXyIsCisgICAgICAgICJfX2dldGF0dHJpYnV0ZV9fIiwKKyAgICAgICAgIl9fZGVsYXR0cl9fIiwKKyAgICAgICAgIl9fZGVsZXRlX18iLAorICAgICAgICAiX19pbnN0YW5jZWNoZWNrX18iLAorICAgICAgICAiX19zdWJjbGFzc2NoZWNrX18iLAorICAgICAgICAiX19nZXRpdGVtX18iLAorICAgICAgICAiX19taXNzaW5nX18iLAorICAgICAgICAiX19kZWxpdGVtX18iLAorICAgICAgICAiX19jb250YWluc19fIiwKKyAgICAgICAgIl9fYWRkX18iLAorICAgICAgICAiX19zdWJfXyIsCisgICAgICAgICJfX211bF9fIiwKKyAgICAgICAgIl9fdHJ1ZWRpdl9fIiwKKyAgICAgICAgIl9fZmxvb3JkaXZfXyIsCisgICAgICAgICJfX3JmbG9vcmRpdl9fIiwKKyAgICAgICAgIl9fbW9kX18iLAorICAgICAgICAiX19kaXZtb2RfXyIsCisgICAgICAgICJfX2xzaGlmdF9fIiwKKyAgICAgICAgIl9fcnNoaWZ0X18iLAorICAgICAgICAiX19hbmRfXyIsCisgICAgICAgICJfX3hvcl9fIiwKKyAgICAgICAgIl9fb3JfXyIsCisgICAgICAgICJfX3JhZGRfXyIsCisgICAgICAgICJfX3JzdWJfXyIsCisgICAgICAgICJfX3JtdWxfXyIsCisgICAgICAgICJfX3J0cnVlZGl2X18iLAorICAgICAgICAiX19ybW9kX18iLAorICAgICAgICAiX19yZGl2bW9kX18iLAorICAgICAgICAiX19ycG93X18iLAorICAgICAgICAiX19ybHNoaWZ0X18iLAorICAgICAgICAiX19ycnNoaWZ0X18iLAorICAgICAgICAiX19yYW5kX18iLAorICAgICAgICAiX19yeG9yX18iLAorICAgICAgICAiX19yb3JfXyIsCisgICAgICAgICJfX2lhZGRfXyIsCisgICAgICAgICJfX2lzdWJfXyIsCisgICAgICAgICJfX2ltdWxfXyIsCisgICAgICAgICJfX2l0cnVlZGl2X18iLAorICAgICAgICAiX19pZmxvb3JkaXZfXyIsCisgICAgICAgICJfX2ltb2RfXyIsCisgICAgICAgICJfX2lsc2hpZnRfXyIsCisgICAgICAgICJfX2lyc2hpZnRfXyIsCisgICAgICAgICJfX2lhbmRfXyIsCisgICAgICAgICJfX2l4b3JfXyIsCisgICAgICAgICJfX2lvcl9fIiwKKyAgICAgICAgIl9faXBvd19fIiwKKyAgICAgICAgIl9fc2V0c3RhdGVfXyIsCisgICAgICAgICJfX3JlZHVjZV9leF9fIiwKKyAgICAgICAgIl9fZGVlcGNvcHlfXyIsCisgICAgICAgICJfX2NtcF9fIiwKKyAgICAgICAgIl9fbWF0bXVsX18iLAorICAgICAgICAiX19ybWF0bXVsX18iLAorICAgICAgICAiX19pbWF0bXVsX18iLAorICAgICAgICAiX19kaXZfXyIsCisgICAgKSwKKyAgICAyOiAoIl9fc2V0YXR0cl9fIiwgIl9fZ2V0X18iLCAiX19zZXRfXyIsICJfX3NldGl0ZW1fXyIsICJfX3NldF9uYW1lX18iKSwKKyAgICAzOiAoIl9fZXhpdF9fIiwgIl9fYWV4aXRfXyIpLAorICAgICgwLCAxKTogKCJfX3JvdW5kX18iLCksCisgICAgKDEsIDIpOiAoIl9fcG93X18iLCksCit9CisKK1NQRUNJQUxfTUVUSE9EU19QQVJBTVMgPSB7CisgICAgbmFtZTogcGFyYW1zCisgICAgZm9yIHBhcmFtcywgbWV0aG9kcyBpbiBfU1BFQ0lBTF9NRVRIT0RTX1BBUkFNUy5pdGVtcygpCisgICAgZm9yIG5hbWUgaW4gbWV0aG9kcyAgIyB0eXBlOiBpZ25vcmUKK30KK1BZTUVUSE9EUyA9IHNldChTUEVDSUFMX01FVEhPRFNfUEFSQU1TKQorCitTVUJTQ1JJUFRBQkxFX0NMQVNTRVNfUEVQNTg1ID0gZnJvemVuc2V0KAorICAgICgKKyAgICAgICAgImJ1aWx0aW5zLnR1cGxlIiwKKyAgICAgICAgImJ1aWx0aW5zLmxpc3QiLAorICAgICAgICAiYnVpbHRpbnMuZGljdCIsCisgICAgICAgICJidWlsdGlucy5zZXQiLAorICAgICAgICAiYnVpbHRpbnMuZnJvemVuc2V0IiwKKyAgICAgICAgImJ1aWx0aW5zLnR5cGUiLAorICAgICAgICAiY29sbGVjdGlvbnMuZGVxdWUiLAorICAgICAgICAiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLAorICAgICAgICAiY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiLAorICAgICAgICAiY29sbGVjdGlvbnMuQ291bnRlciIsCisgICAgICAgICJjb2xsZWN0aW9ucy5DaGFpbk1hcCIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkF3YWl0YWJsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkNvcm91dGluZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkFzeW5jSXRlcmFibGUiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5Bc3luY0l0ZXJhdG9yIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuQXN5bmNHZW5lcmF0b3IiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5JdGVyYWJsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkl0ZXJhdG9yIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuR2VuZXJhdG9yIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuUmV2ZXJzaWJsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkNvbnRhaW5lciIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkNvbGxlY3Rpb24iLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5DYWxsYWJsZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLlNldCIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLk11dGFibGVTZXQiLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5NYXBwaW5nIiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuTXV0YWJsZU1hcHBpbmciLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5TZXF1ZW5jZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLk11dGFibGVTZXF1ZW5jZSIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLkJ5dGVTdHJpbmciLAorICAgICAgICAiX2NvbGxlY3Rpb25zX2FiYy5NYXBwaW5nVmlldyIsCisgICAgICAgICJfY29sbGVjdGlvbnNfYWJjLktleXNWaWV3IiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuSXRlbXNWaWV3IiwKKyAgICAgICAgIl9jb2xsZWN0aW9uc19hYmMuVmFsdWVzVmlldyIsCisgICAgICAgICJjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXIiLAorICAgICAgICAiY29udGV4dGxpYi5BYnN0cmFjdEFzeW5jQ29udGV4dE1hbmFnZXIiLAorICAgICAgICAicmUuUGF0dGVybiIsCisgICAgICAgICJyZS5NYXRjaCIsCisgICAgKQorKQorCisKK2NsYXNzIE5vU3VjaEFyZ3VtZW50RXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgSW5mZXJyZWRUeXBlRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworZGVmIGlzX2luc2lkZV9sYW1iZGEobm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgICIiIlJldHVybiB0cnVlIGlmIGdpdmVuIG5vZGUgaXMgaW5zaWRlIGxhbWJkYSIiIgorICAgIHBhcmVudCA9IG5vZGUucGFyZW50CisgICAgd2hpbGUgcGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmVudCwgYXN0cm9pZC5MYW1iZGEpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudAorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBnZXRfYWxsX2VsZW1lbnRzKAorICAgIG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORywKKykgLT4gSXRlcmFibGVbYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HXToKKyAgICAiIiJSZWN1cnNpdmVseSByZXR1cm5zIGFsbCBhdG9tcyBpbiBuZXN0ZWQgbGlzdHMgYW5kIHR1cGxlcy4iIiIKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUsIChhc3Ryb2lkLlR1cGxlLCBhc3Ryb2lkLkxpc3QpKToKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuZWx0czoKKyAgICAgICAgICAgIHlpZWxkIGZyb20gZ2V0X2FsbF9lbGVtZW50cyhjaGlsZCkKKyAgICBlbHNlOgorICAgICAgICB5aWVsZCBub2RlCisKKworZGVmIGlzX3N1cGVyKG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICAiIiJyZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyByZWZlcmVuY2luZyB0aGUgInN1cGVyIiBidWlsdGluIGZ1bmN0aW9uIiIiCisgICAgaWYgZ2V0YXR0cihub2RlLCAibmFtZSIsIE5vbmUpID09ICJzdXBlciIgYW5kIG5vZGUucm9vdCgpLm5hbWUgPT0gQlVJTFRJTlNfTkFNRToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgaXNfZXJyb3Iobm9kZTogYXN0cm9pZC5zY29wZWRfbm9kZXMuRnVuY3Rpb25EZWYpIC0+IGJvb2w6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIG5vZGUgb25seSByYWlzZXMgYW4gZXhjZXB0aW9uIiIiCisgICAgcmV0dXJuIGxlbihub2RlLmJvZHkpID09IDEgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLCBhc3Ryb2lkLlJhaXNlKQorCisKK2J1aWx0aW5zID0gYnVpbHRpbnMuX19kaWN0X18uY29weSgpICAjIHR5cGU6IGlnbm9yZQorU1BFQ0lBTF9CVUlMVElOUyA9ICgiX19idWlsdGluc19fIiwpICAjICdfX3BhdGhfXycsICdfX2ZpbGVfXycpCisKKworZGVmIGlzX2J1aWx0aW5fb2JqZWN0KG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlIGdpdmVuIG5vZGUgaXMgYW4gb2JqZWN0IGZyb20gdGhlIF9fYnVpbHRpbl9fIG1vZHVsZS4iIiIKKyAgICByZXR1cm4gbm9kZSBhbmQgbm9kZS5yb290KCkubmFtZSA9PSBCVUlMVElOU19OQU1FCisKKworZGVmIGlzX2J1aWx0aW4obmFtZTogc3RyKSAtPiBib29sOgorICAgICIiInJldHVybiB0cnVlIGlmIDxuYW1lPiBjb3VsZCBiZSBjb25zaWRlcmVkIGFzIGEgYnVpbHRpbiBkZWZpbmVkIGJ5IHB5dGhvbiIiIgorICAgIHJldHVybiBuYW1lIGluIGJ1aWx0aW5zIG9yIG5hbWUgaW4gU1BFQ0lBTF9CVUlMVElOUyAgIyB0eXBlOiBpZ25vcmUKKworCitkZWYgaXNfZGVmaW5lZF9pbl9zY29wZSgKKyAgICB2YXJfbm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLAorICAgIHZhcm5hbWU6IHN0ciwKKyAgICBzY29wZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLAorKSAtPiBib29sOgorICAgIGlmIGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuSWYpOgorICAgICAgICBmb3Igbm9kZSBpbiBzY29wZS5ib2R5OgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Bc3NpZ24pCisgICAgICAgICAgICAgICAgYW5kIGFueSgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh0YXJnZXQsIGFzdHJvaWQuQXNzaWduTmFtZSkgYW5kIHRhcmdldC5uYW1lID09IHZhcm5hbWUKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBub2RlLnRhcmdldHMKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApIG9yIChpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuTm9ubG9jYWwpIGFuZCB2YXJuYW1lIGluIG5vZGUubmFtZXMpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBpc2luc3RhbmNlKHNjb3BlLCAoQ09NUF9OT0RFX1RZUEVTLCBhc3Ryb2lkLkZvcikpOgorICAgICAgICBmb3IgYXNzX25vZGUgaW4gc2NvcGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5Bc3NpZ25OYW1lKToKKyAgICAgICAgICAgIGlmIGFzc19ub2RlLm5hbWUgPT0gdmFybmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsaWYgaXNpbnN0YW5jZShzY29wZSwgYXN0cm9pZC5XaXRoKToKKyAgICAgICAgZm9yIGV4cHIsIGlkcyBpbiBzY29wZS5pdGVtczoKKyAgICAgICAgICAgIGlmIGV4cHIucGFyZW50X29mKHZhcl9ub2RlKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgaWRzIGFuZCBpc2luc3RhbmNlKGlkcywgYXN0cm9pZC5Bc3NpZ25OYW1lKSBhbmQgaWRzLm5hbWUgPT0gdmFybmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsaWYgaXNpbnN0YW5jZShzY29wZSwgKGFzdHJvaWQuTGFtYmRhLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSk6CisgICAgICAgIGlmIHNjb3BlLmFyZ3MuaXNfYXJndW1lbnQodmFybmFtZSk6CisgICAgICAgICAgICAjIElmIHRoZSBuYW1lIGlzIGZvdW5kIGluc2lkZSBhIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgICMgb2YgYSBmdW5jdGlvbiwgdGhlbiBsZXQgdGhlIHNlYXJjaCBjb250aW51ZQorICAgICAgICAgICAgIyBpbiB0aGUgcGFyZW50J3MgdHJlZS4KKyAgICAgICAgICAgIGlmIHNjb3BlLmFyZ3MucGFyZW50X29mKHZhcl9ub2RlKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLmFyZ3MuZGVmYXVsdF92YWx1ZSh2YXJuYW1lKQorICAgICAgICAgICAgICAgICAgICBzY29wZSA9IHNjb3BlLnBhcmVudAorICAgICAgICAgICAgICAgICAgICBpc19kZWZpbmVkX2luX3Njb3BlKHZhcl9ub2RlLCB2YXJuYW1lLCBzY29wZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob0RlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGdldGF0dHIoc2NvcGUsICJuYW1lIiwgTm9uZSkgPT0gdmFybmFtZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBpc2luc3RhbmNlKHNjb3BlLCBhc3Ryb2lkLkV4Y2VwdEhhbmRsZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNjb3BlLm5hbWUsIGFzdHJvaWQuQXNzaWduTmFtZSk6CisgICAgICAgICAgICBhc3Nfbm9kZSA9IHNjb3BlLm5hbWUKKyAgICAgICAgICAgIGlmIGFzc19ub2RlLm5hbWUgPT0gdmFybmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpc19kZWZpbmVkX2JlZm9yZSh2YXJfbm9kZTogYXN0cm9pZC5OYW1lKSAtPiBib29sOgorICAgICIiIkNoZWNrIGlmIHRoZSBnaXZlbiB2YXJpYWJsZSBub2RlIGlzIGRlZmluZWQgYmVmb3JlCisKKyAgICBWZXJpZnkgdGhhdCB0aGUgdmFyaWFibGUgbm9kZSBpcyBkZWZpbmVkIGJ5IGEgcGFyZW50IG5vZGUKKyAgICAobGlzdCwgc2V0LCBkaWN0LCBvciBnZW5lcmF0b3IgY29tcHJlaGVuc2lvbiwgbGFtYmRhKQorICAgIG9yIGluIGEgcHJldmlvdXMgc2libGluZyBub2RlIG9uIHRoZSBzYW1lIGxpbmUKKyAgICAoc3RhdGVtZW50X2RlZmluaW5nIDsgc3RhdGVtZW50X3VzaW5nKS4KKyAgICAiIiIKKyAgICB2YXJuYW1lID0gdmFyX25vZGUubmFtZQorICAgIF9ub2RlID0gdmFyX25vZGUucGFyZW50CisgICAgd2hpbGUgX25vZGU6CisgICAgICAgIGlmIGlzX2RlZmluZWRfaW5fc2NvcGUodmFyX25vZGUsIHZhcm5hbWUsIF9ub2RlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIF9ub2RlID0gX25vZGUucGFyZW50CisgICAgIyBwb3NzaWJseSBtdWx0aXBsZSBzdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUgdXNpbmcgc2VtaSBjb2xvbiBzZXBhcmF0b3IKKyAgICBzdG10ID0gdmFyX25vZGUuc3RhdGVtZW50KCkKKyAgICBfbm9kZSA9IHN0bXQucHJldmlvdXNfc2libGluZygpCisgICAgbGluZW5vID0gc3RtdC5mcm9tbGluZW5vCisgICAgd2hpbGUgX25vZGUgYW5kIF9ub2RlLmZyb21saW5lbm8gPT0gbGluZW5vOgorICAgICAgICBmb3IgYXNzaWduX25vZGUgaW4gX25vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5Bc3NpZ25OYW1lKToKKyAgICAgICAgICAgIGlmIGFzc2lnbl9ub2RlLm5hbWUgPT0gdmFybmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmb3IgaW1wX25vZGUgaW4gX25vZGUubm9kZXNfb2ZfY2xhc3MoKGFzdHJvaWQuSW1wb3J0RnJvbSwgYXN0cm9pZC5JbXBvcnQpKToKKyAgICAgICAgICAgIGlmIHZhcm5hbWUgaW4gW25hbWVbMV0gb3IgbmFtZVswXSBmb3IgbmFtZSBpbiBpbXBfbm9kZS5uYW1lc106CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgX25vZGUgPSBfbm9kZS5wcmV2aW91c19zaWJsaW5nKCkKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgaXNfZGVmYXVsdF9hcmd1bWVudCgKKyAgICBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcsCisgICAgc2NvcGU6IE9wdGlvbmFsW2FzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVOR10gPSBOb25lLAorKSAtPiBib29sOgorICAgICIiInJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBOYW1lIG5vZGUgaXMgdXNlZCBpbiBmdW5jdGlvbiBvciBsYW1iZGEKKyAgICBkZWZhdWx0IGFyZ3VtZW50J3MgdmFsdWUKKyAgICAiIiIKKyAgICBpZiBub3Qgc2NvcGU6CisgICAgICAgIHNjb3BlID0gbm9kZS5zY29wZSgpCisgICAgaWYgaXNpbnN0YW5jZShzY29wZSwgKGFzdHJvaWQuRnVuY3Rpb25EZWYsIGFzdHJvaWQuTGFtYmRhKSk6CisgICAgICAgIGZvciBkZWZhdWx0X25vZGUgaW4gc2NvcGUuYXJncy5kZWZhdWx0czoKKyAgICAgICAgICAgIGZvciBkZWZhdWx0X25hbWVfbm9kZSBpbiBkZWZhdWx0X25vZGUubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgICAgICBpZiBkZWZhdWx0X25hbWVfbm9kZSBpcyBub2RlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpc19mdW5jX2RlY29yYXRvcihub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgIiIicmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgaXMgdXNlZCBpbiBmdW5jdGlvbiBkZWNvcmF0b3IiIiIKKyAgICBwYXJlbnQgPSBub2RlLnBhcmVudAorICAgIHdoaWxlIHBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuRGVjb3JhdG9ycyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBwYXJlbnQuaXNfc3RhdGVtZW50IG9yIGlzaW5zdGFuY2UoCisgICAgICAgICAgICBwYXJlbnQsCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgYXN0cm9pZC5MYW1iZGEsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5zY29wZWRfbm9kZXMuQ29tcHJlaGVuc2lvblNjb3BlLAorICAgICAgICAgICAgICAgIGFzdHJvaWQuc2NvcGVkX25vZGVzLkxpc3RDb21wLAorICAgICAgICAgICAgKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgaXNfYW5jZXN0b3JfbmFtZSgKKyAgICBmcmFtZTogYXN0cm9pZC5DbGFzc0RlZiwgbm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HCispIC0+IGJvb2w6CisgICAgIiIicmV0dXJuIFRydWUgaWYgYGZyYW1lYCBpcyBhbiBhc3Ryb2lkLkNsYXNzIG5vZGUgd2l0aCBgbm9kZWAgaW4gdGhlCisgICAgc3VidHJlZSBvZiBpdHMgYmFzZXMgYXR0cmlidXRlCisgICAgIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZnJhbWUsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBmb3IgYmFzZSBpbiBmcmFtZS5iYXNlczoKKyAgICAgICAgaWYgbm9kZSBpbiBiYXNlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBhc3NpZ25fcGFyZW50KG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HOgorICAgICIiInJldHVybiB0aGUgaGlnaGVyIHBhcmVudCB3aGljaCBpcyBub3QgYW4gQXNzaWduTmFtZSwgVHVwbGUgb3IgTGlzdCBub2RlIiIiCisgICAgd2hpbGUgbm9kZSBhbmQgaXNpbnN0YW5jZShub2RlLCAoYXN0cm9pZC5Bc3NpZ25OYW1lLCBhc3Ryb2lkLlR1cGxlLCBhc3Ryb2lkLkxpc3QpKToKKyAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgcmV0dXJuIG5vZGUKKworCitkZWYgb3ZlcnJpZGVzX2FfbWV0aG9kKGNsYXNzX25vZGU6IGFzdHJvaWQuQ2xhc3NEZWYsIG5hbWU6IHN0cikgLT4gYm9vbDoKKyAgICAiIiJyZXR1cm4gVHJ1ZSBpZiA8bmFtZT4gaXMgYSBtZXRob2Qgb3ZlcnJpZGRlbiBmcm9tIGFuIGFuY2VzdG9yIiIiCisgICAgZm9yIGFuY2VzdG9yIGluIGNsYXNzX25vZGUuYW5jZXN0b3JzKCk6CisgICAgICAgIGlmIG5hbWUgaW4gYW5jZXN0b3IgYW5kIGlzaW5zdGFuY2UoYW5jZXN0b3JbbmFtZV0sIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgY2hlY2tfbWVzc2FnZXMoKm1lc3NhZ2VzOiBzdHIpIC0+IENhbGxhYmxlOgorICAgICIiImRlY29yYXRvciB0byBzdG9yZSBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGJ5IGEgY2hlY2tlciBtZXRob2QiIiIKKworICAgIGRlZiBzdG9yZV9tZXNzYWdlcyhmdW5jKToKKyAgICAgICAgZnVuYy5jaGVja3NfbXNncyA9IG1lc3NhZ2VzCisgICAgICAgIHJldHVybiBmdW5jCisKKyAgICByZXR1cm4gc3RvcmVfbWVzc2FnZXMKKworCitjbGFzcyBJbmNvbXBsZXRlRm9ybWF0U3RyaW5nKEV4Y2VwdGlvbik6CisgICAgIiIiQSBmb3JtYXQgc3RyaW5nIGVuZGVkIGluIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlY2lmaWVyLiIiIgorCisKK2NsYXNzIFVuc3VwcG9ydGVkRm9ybWF0Q2hhcmFjdGVyKEV4Y2VwdGlvbik6CisgICAgIiIiQSBmb3JtYXQgY2hhcmFjdGVyIGluIGEgZm9ybWF0IHN0cmluZyBpcyBub3Qgb25lIG9mIHRoZSBzdXBwb3J0ZWQKKyAgICBmb3JtYXQgY2hhcmFjdGVycy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleCk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBpbmRleCkKKyAgICAgICAgc2VsZi5pbmRleCA9IGluZGV4CisKKworZGVmIHBhcnNlX2Zvcm1hdF9zdHJpbmcoCisgICAgZm9ybWF0X3N0cmluZzogc3RyLAorKSAtPiBUdXBsZVtTZXRbc3RyXSwgaW50LCBEaWN0W3N0ciwgc3RyXSwgTGlzdFtzdHJdXToKKyAgICAiIiJQYXJzZXMgYSBmb3JtYXQgc3RyaW5nLCByZXR1cm5pbmcgYSB0dXBsZSBvZiAoa2V5cywgbnVtX2FyZ3MpLCB3aGVyZSBrZXlzCisgICAgaXMgdGhlIHNldCBvZiBtYXBwaW5nIGtleXMgaW4gdGhlIGZvcm1hdCBzdHJpbmcsIGFuZCBudW1fYXJncyBpcyB0aGUgbnVtYmVyCisgICAgb2YgYXJndW1lbnRzIHJlcXVpcmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nLiAgUmFpc2VzCisgICAgSW5jb21wbGV0ZUZvcm1hdFN0cmluZyBvciBVbnN1cHBvcnRlZEZvcm1hdENoYXJhY3RlciBpZiBhCisgICAgcGFyc2UgZXJyb3Igb2NjdXJzLiIiIgorICAgIGtleXMgPSBzZXQoKQorICAgIGtleV90eXBlcyA9IGRpY3QoKQorICAgIHBvc190eXBlcyA9IFtdCisgICAgbnVtX2FyZ3MgPSAwCisKKyAgICBkZWYgbmV4dF9jaGFyKGkpOgorICAgICAgICBpICs9IDEKKyAgICAgICAgaWYgaSA9PSBsZW4oZm9ybWF0X3N0cmluZyk6CisgICAgICAgICAgICByYWlzZSBJbmNvbXBsZXRlRm9ybWF0U3RyaW5nCisgICAgICAgIHJldHVybiAoaSwgZm9ybWF0X3N0cmluZ1tpXSkKKworICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IGxlbihmb3JtYXRfc3RyaW5nKToKKyAgICAgICAgY2hhciA9IGZvcm1hdF9zdHJpbmdbaV0KKyAgICAgICAgaWYgY2hhciA9PSAiJSI6CisgICAgICAgICAgICBpLCBjaGFyID0gbmV4dF9jaGFyKGkpCisgICAgICAgICAgICAjIFBhcnNlIHRoZSBtYXBwaW5nIGtleSAob3B0aW9uYWwpLgorICAgICAgICAgICAga2V5ID0gTm9uZQorICAgICAgICAgICAgaWYgY2hhciA9PSAiKCI6CisgICAgICAgICAgICAgICAgZGVwdGggPSAxCisgICAgICAgICAgICAgICAgaSwgY2hhciA9IG5leHRfY2hhcihpKQorICAgICAgICAgICAgICAgIGtleV9zdGFydCA9IGkKKyAgICAgICAgICAgICAgICB3aGlsZSBkZXB0aCAhPSAwOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICIoIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDEKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjaGFyID09ICIpIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIC09IDEKKyAgICAgICAgICAgICAgICAgICAgaSwgY2hhciA9IG5leHRfY2hhcihpKQorICAgICAgICAgICAgICAgIGtleV9lbmQgPSBpIC0gMQorICAgICAgICAgICAgICAgIGtleSA9IGZvcm1hdF9zdHJpbmdba2V5X3N0YXJ0OmtleV9lbmRdCisKKyAgICAgICAgICAgICMgUGFyc2UgdGhlIGNvbnZlcnNpb24gZmxhZ3MgKG9wdGlvbmFsKS4KKyAgICAgICAgICAgIHdoaWxlIGNoYXIgaW4gIiMwLSArIjoKKyAgICAgICAgICAgICAgICBpLCBjaGFyID0gbmV4dF9jaGFyKGkpCisgICAgICAgICAgICAjIFBhcnNlIHRoZSBtaW5pbXVtIGZpZWxkIHdpZHRoIChvcHRpb25hbCkuCisgICAgICAgICAgICBpZiBjaGFyID09ICIqIjoKKyAgICAgICAgICAgICAgICBudW1fYXJncyArPSAxCisgICAgICAgICAgICAgICAgaSwgY2hhciA9IG5leHRfY2hhcihpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3aGlsZSBjaGFyIGluIHN0cmluZy5kaWdpdHM6CisgICAgICAgICAgICAgICAgICAgIGksIGNoYXIgPSBuZXh0X2NoYXIoaSkKKyAgICAgICAgICAgICMgUGFyc2UgdGhlIHByZWNpc2lvbiAob3B0aW9uYWwpLgorICAgICAgICAgICAgaWYgY2hhciA9PSAiLiI6CisgICAgICAgICAgICAgICAgaSwgY2hhciA9IG5leHRfY2hhcihpKQorICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIioiOgorICAgICAgICAgICAgICAgICAgICBudW1fYXJncyArPSAxCisgICAgICAgICAgICAgICAgICAgIGksIGNoYXIgPSBuZXh0X2NoYXIoaSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBjaGFyIGluIHN0cmluZy5kaWdpdHM6CisgICAgICAgICAgICAgICAgICAgICAgICBpLCBjaGFyID0gbmV4dF9jaGFyKGkpCisgICAgICAgICAgICAjIFBhcnNlIHRoZSBsZW5ndGggbW9kaWZpZXIgKG9wdGlvbmFsKS4KKyAgICAgICAgICAgIGlmIGNoYXIgaW4gImhsTCI6CisgICAgICAgICAgICAgICAgaSwgY2hhciA9IG5leHRfY2hhcihpKQorICAgICAgICAgICAgIyBQYXJzZSB0aGUgY29udmVyc2lvbiB0eXBlIChtYW5kYXRvcnkpLgorICAgICAgICAgICAgZmxhZ3MgPSAiZGlvdXhYZUVmRmdHY3JzJWEiCisgICAgICAgICAgICBpZiBjaGFyIG5vdCBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICByYWlzZSBVbnN1cHBvcnRlZEZvcm1hdENoYXJhY3RlcihpKQorICAgICAgICAgICAgaWYga2V5OgorICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSkKKyAgICAgICAgICAgICAgICBrZXlfdHlwZXNba2V5XSA9IGNoYXIKKyAgICAgICAgICAgIGVsaWYgY2hhciAhPSAiJSI6CisgICAgICAgICAgICAgICAgbnVtX2FyZ3MgKz0gMQorICAgICAgICAgICAgICAgIHBvc190eXBlcy5hcHBlbmQoY2hhcikKKyAgICAgICAgaSArPSAxCisgICAgcmV0dXJuIGtleXMsIG51bV9hcmdzLCBrZXlfdHlwZXMsIHBvc190eXBlcworCisKK2RlZiBzcGxpdF9mb3JtYXRfZmllbGRfbmFtZXMoZm9ybWF0X3N0cmluZykgLT4gVHVwbGVbc3RyLCBJdGVyYWJsZVtUdXBsZVtib29sLCBzdHJdXV06CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX3N0cmluZy5mb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdChmb3JtYXRfc3RyaW5nKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgIHJhaXNlIEluY29tcGxldGVGb3JtYXRTdHJpbmcoKSBmcm9tIGUKKworCitkZWYgY29sbGVjdF9zdHJpbmdfZmllbGRzKGZvcm1hdF9zdHJpbmcpIC0+IEl0ZXJhYmxlW09wdGlvbmFsW3N0cl1dOgorICAgICIiIkdpdmVuIGEgZm9ybWF0IHN0cmluZywgcmV0dXJuIGFuIGl0ZXJhdG9yCisgICAgb2YgYWxsIHRoZSB2YWxpZCBmb3JtYXQgZmllbGRzLiBJdCBoYW5kbGVzIG5lc3RlZCBmaWVsZHMKKyAgICBhcyB3ZWxsLgorICAgICIiIgorICAgIGZvcm1hdHRlciA9IHN0cmluZy5Gb3JtYXR0ZXIoKQorICAgIHRyeToKKyAgICAgICAgcGFyc2VpdGVyYXRvciA9IGZvcm1hdHRlci5wYXJzZShmb3JtYXRfc3RyaW5nKQorICAgICAgICBmb3IgcmVzdWx0IGluIHBhcnNlaXRlcmF0b3I6CisgICAgICAgICAgICBpZiBhbGwoaXRlbSBpcyBOb25lIGZvciBpdGVtIGluIHJlc3VsdFsxOl0pOgorICAgICAgICAgICAgICAgICMgbm90IGEgcmVwbGFjZW1lbnQgZm9ybWF0CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG5hbWUgPSByZXN1bHRbMV0KKyAgICAgICAgICAgIG5lc3RlZCA9IHJlc3VsdFsyXQorICAgICAgICAgICAgeWllbGQgbmFtZQorICAgICAgICAgICAgaWYgbmVzdGVkOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gY29sbGVjdF9zdHJpbmdfZmllbGRzKG5lc3RlZCkKKyAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBleGM6CisgICAgICAgICMgUHJvYmFibHkgdGhlIGZvcm1hdCBzdHJpbmcgaXMgaW52YWxpZC4KKyAgICAgICAgaWYgZXhjLmFyZ3NbMF0uc3RhcnRzd2l0aCgiY2Fubm90IHN3aXRjaCBmcm9tIG1hbnVhbCIpOgorICAgICAgICAgICAgIyBPbiBKeXRob24sIHBhcnNpbmcgYSBzdHJpbmcgd2l0aCBib3RoIG1hbnVhbAorICAgICAgICAgICAgIyBhbmQgYXV0b21hdGljIHBvc2l0aW9ucyB3aWxsIGZhaWwgd2l0aCBhIFZhbHVlRXJyb3IsCisgICAgICAgICAgICAjIHdoaWxlIG9uIENQeXRob24gaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBmaWVsZHMsCisgICAgICAgICAgICAjIHRoZSB2YWxpZGF0aW9uIGJlaW5nIGRvbmUgaW4gdGhlIGludGVycHJldGVyICg/KS4KKyAgICAgICAgICAgICMgV2UncmUganVzdCByZXR1cm5pbmcgdHdvIG1peGVkIGZpZWxkcyBpbiBvcmRlcgorICAgICAgICAgICAgIyB0byB0cmlnZ2VyIHRoZSBmb3JtYXQtY29tYmluZWQtc3BlY2lmaWNhdGlvbiBjaGVjay4KKyAgICAgICAgICAgIHlpZWxkICIiCisgICAgICAgICAgICB5aWVsZCAiMSIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByYWlzZSBJbmNvbXBsZXRlRm9ybWF0U3RyaW5nKGZvcm1hdF9zdHJpbmcpIGZyb20gZXhjCisKKworZGVmIHBhcnNlX2Zvcm1hdF9tZXRob2Rfc3RyaW5nKAorICAgIGZvcm1hdF9zdHJpbmc6IHN0ciwKKykgLT4gVHVwbGVbTGlzdFtUdXBsZVtzdHIsIExpc3RbVHVwbGVbYm9vbCwgc3RyXV1dXSwgaW50LCBpbnRdOgorICAgICIiIgorICAgIFBhcnNlcyBhIFBFUCAzMTAxIGZvcm1hdCBzdHJpbmcsIHJldHVybmluZyBhIHR1cGxlIG9mCisgICAgKGtleXdvcmRfYXJndW1lbnRzLCBpbXBsaWNpdF9wb3NfYXJnc19jbnQsIGV4cGxpY2l0X3Bvc19hcmdzKSwKKyAgICB3aGVyZSBrZXl3b3JkX2FyZ3VtZW50cyBpcyB0aGUgc2V0IG9mIG1hcHBpbmcga2V5cyBpbiB0aGUgZm9ybWF0IHN0cmluZywgaW1wbGljaXRfcG9zX2FyZ3NfY250CisgICAgaXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVxdWlyZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgYW5kCisgICAgZXhwbGljaXRfcG9zX2FyZ3MgaXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIHdpdGggdGhlIHBvc2l0aW9uLgorICAgICIiIgorICAgIGtleXdvcmRfYXJndW1lbnRzID0gW10KKyAgICBpbXBsaWNpdF9wb3NfYXJnc19jbnQgPSAwCisgICAgZXhwbGljaXRfcG9zX2FyZ3MgPSBzZXQoKQorICAgIGZvciBuYW1lIGluIGNvbGxlY3Rfc3RyaW5nX2ZpZWxkcyhmb3JtYXRfc3RyaW5nKToKKyAgICAgICAgaWYgbmFtZSBhbmQgc3RyKG5hbWUpLmlzZGlnaXQoKToKKyAgICAgICAgICAgIGV4cGxpY2l0X3Bvc19hcmdzLmFkZChzdHIobmFtZSkpCisgICAgICAgIGVsaWYgbmFtZToKKyAgICAgICAgICAgIGtleW5hbWUsIGZpZWxkaXRlcmF0b3IgPSBzcGxpdF9mb3JtYXRfZmllbGRfbmFtZXMobmFtZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5bmFtZSwgbnVtYmVycy5OdW1iZXIpOgorICAgICAgICAgICAgICAgIGV4cGxpY2l0X3Bvc19hcmdzLmFkZChzdHIoa2V5bmFtZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga2V5d29yZF9hcmd1bWVudHMuYXBwZW5kKChrZXluYW1lLCBsaXN0KGZpZWxkaXRlcmF0b3IpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgSW5jb21wbGV0ZUZvcm1hdFN0cmluZygpIGZyb20gZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1wbGljaXRfcG9zX2FyZ3NfY250ICs9IDEKKyAgICByZXR1cm4ga2V5d29yZF9hcmd1bWVudHMsIGltcGxpY2l0X3Bvc19hcmdzX2NudCwgbGVuKGV4cGxpY2l0X3Bvc19hcmdzKQorCisKK2RlZiBpc19hdHRyX3Byb3RlY3RlZChhdHRybmFtZTogc3RyKSAtPiBib29sOgorICAgICIiInJldHVybiBUcnVlIGlmIGF0dHJpYnV0ZSBuYW1lIGlzIHByb3RlY3RlZCAoc3RhcnQgd2l0aCBfIGFuZCBzb21lIG90aGVyCisgICAgZGV0YWlscyksIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICByZXR1cm4gKAorICAgICAgICBhdHRybmFtZVswXSA9PSAiXyIKKyAgICAgICAgYW5kIGF0dHJuYW1lICE9ICJfIgorICAgICAgICBhbmQgbm90IChhdHRybmFtZS5zdGFydHN3aXRoKCJfXyIpIGFuZCBhdHRybmFtZS5lbmRzd2l0aCgiX18iKSkKKyAgICApCisKKworZGVmIG5vZGVfZnJhbWVfY2xhc3Mobm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBPcHRpb25hbFthc3Ryb2lkLkNsYXNzRGVmXToKKyAgICAiIiJSZXR1cm4gdGhlIGNsYXNzIHRoYXQgaXMgd3JhcHBpbmcgdGhlIGdpdmVuIG5vZGUKKworICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgY2xhc3MgZm9yIGEgbWV0aG9kIG5vZGUgKG9yIGEgc3RhdGljbWV0aG9kIG9yIGEKKyAgICBjbGFzc21ldGhvZCksIG90aGVyd2lzZSBpdCByZXR1cm5zIGBOb25lYC4KKyAgICAiIiIKKyAgICBrbGFzcyA9IG5vZGUuZnJhbWUoKQorICAgIG5vZGVzX3RvX2NoZWNrID0gKAorICAgICAgICBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcsCisgICAgICAgIGFzdHJvaWQuVW5ib3VuZE1ldGhvZCwKKyAgICAgICAgYXN0cm9pZC5CYXNlSW5zdGFuY2UsCisgICAgKQorICAgIHdoaWxlICgKKyAgICAgICAga2xhc3MKKyAgICAgICAgYW5kIGlzaW5zdGFuY2Uoa2xhc3MsIG5vZGVzX3RvX2NoZWNrKQorICAgICAgICBhbmQgbm90IGlzaW5zdGFuY2Uoa2xhc3MsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgKToKKyAgICAgICAgaWYga2xhc3MucGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICBrbGFzcyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtsYXNzID0ga2xhc3MucGFyZW50LmZyYW1lKCkKKworICAgIHJldHVybiBrbGFzcworCisKK2RlZiBpc19hdHRyX3ByaXZhdGUoYXR0cm5hbWU6IHN0cikgLT4gT3B0aW9uYWxbTWF0Y2hbc3RyXV06CisgICAgIiIiQ2hlY2sgdGhhdCBhdHRyaWJ1dGUgbmFtZSBpcyBwcml2YXRlIChhdCBsZWFzdCB0d28gbGVhZGluZyB1bmRlcnNjb3JlcywKKyAgICBhdCBtb3N0IG9uZSB0cmFpbGluZyB1bmRlcnNjb3JlKQorICAgICIiIgorICAgIHJlZ2V4ID0gcmUuY29tcGlsZSgiXl97Mix9LipbXl9dK18/JCIpCisgICAgcmV0dXJuIHJlZ2V4Lm1hdGNoKGF0dHJuYW1lKQorCisKK2RlZiBnZXRfYXJndW1lbnRfZnJvbV9jYWxsKAorICAgIGNhbGxfbm9kZTogYXN0cm9pZC5DYWxsLCBwb3NpdGlvbjogaW50ID0gTm9uZSwga2V5d29yZDogc3RyID0gTm9uZQorKSAtPiBhc3Ryb2lkLk5hbWU6CisgICAgIiIiUmV0dXJucyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGZyb20gYSBmdW5jdGlvbiBjYWxsLgorCisgICAgOnBhcmFtIGFzdHJvaWQuQ2FsbCBjYWxsX25vZGU6IE5vZGUgcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gY2FsbCB0byBjaGVjay4KKyAgICA6cGFyYW0gaW50IHBvc2l0aW9uOiBwb3NpdGlvbiBvZiB0aGUgYXJndW1lbnQuCisgICAgOnBhcmFtIHN0ciBrZXl3b3JkOiB0aGUga2V5d29yZCBvZiB0aGUgYXJndW1lbnQuCisKKyAgICA6cmV0dXJuczogVGhlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBhcmd1bWVudCwgTm9uZSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGZvdW5kLgorICAgIDpydHlwZTogYXN0cm9pZC5OYW1lCisgICAgOnJhaXNlcyBWYWx1ZUVycm9yOiBpZiBib3RoIHBvc2l0aW9uIGFuZCBrZXl3b3JkIGFyZSBOb25lLgorICAgIDpyYWlzZXMgTm9TdWNoQXJndW1lbnRFcnJvcjogaWYgbm8gYXJndW1lbnQgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIG9yIHdpdGgKKyAgICB0aGUgcHJvdmlkZWQga2V5d29yZC4KKyAgICAiIiIKKyAgICBpZiBwb3NpdGlvbiBpcyBOb25lIGFuZCBrZXl3b3JkIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgb2Y6IHBvc2l0aW9uIG9yIGtleXdvcmQuIikKKyAgICBpZiBwb3NpdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGNhbGxfbm9kZS5hcmdzW3Bvc2l0aW9uXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBpZiBrZXl3b3JkIGFuZCBjYWxsX25vZGUua2V5d29yZHM6CisgICAgICAgIGZvciBhcmcgaW4gY2FsbF9ub2RlLmtleXdvcmRzOgorICAgICAgICAgICAgaWYgYXJnLmFyZyA9PSBrZXl3b3JkOgorICAgICAgICAgICAgICAgIHJldHVybiBhcmcudmFsdWUKKworICAgIHJhaXNlIE5vU3VjaEFyZ3VtZW50RXJyb3IKKworCitkZWYgaW5oZXJpdF9mcm9tX3N0ZF9leChub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgIiIiCisgICAgUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNsYXNzIG5vZGUgaXMgc3ViY2xhc3Mgb2YKKyAgICBleGNlcHRpb25zLkV4Y2VwdGlvbi4KKyAgICAiIiIKKyAgICBhbmNlc3RvcnMgPSBub2RlLmFuY2VzdG9ycygpIGlmIGhhc2F0dHIobm9kZSwgImFuY2VzdG9ycyIpIGVsc2UgW10KKyAgICBmb3IgYW5jZXN0b3IgaW4gaXRlcnRvb2xzLmNoYWluKFtub2RlXSwgYW5jZXN0b3JzKToKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgYW5jZXN0b3IubmFtZSBpbiAoIkV4Y2VwdGlvbiIsICJCYXNlRXhjZXB0aW9uIikKKyAgICAgICAgICAgIGFuZCBhbmNlc3Rvci5yb290KCkubmFtZSA9PSBFWENFUFRJT05TX01PRFVMRQorICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgZXJyb3Jfb2ZfdHlwZShoYW5kbGVyOiBhc3Ryb2lkLkV4Y2VwdEhhbmRsZXIsIGVycm9yX3R5cGUpIC0+IGJvb2w6CisgICAgIiIiCisgICAgQ2hlY2sgaWYgdGhlIGdpdmVuIGV4Y2VwdGlvbiBoYW5kbGVyIGNhdGNoZXMKKyAgICB0aGUgZ2l2ZW4gZXJyb3JfdHlwZS4KKworICAgIFRoZSAqaGFuZGxlciogcGFyYW1ldGVyIGlzIGEgbm9kZSwgcmVwcmVzZW50aW5nIGFuIEV4Y2VwdEhhbmRsZXIgbm9kZS4KKyAgICBUaGUgKmVycm9yX3R5cGUqIGNhbiBiZSBhbiBleGNlcHRpb24sIHN1Y2ggYXMgQXR0cmlidXRlRXJyb3IsCisgICAgdGhlIG5hbWUgb2YgYW4gZXhjZXB0aW9uLCBvciBpdCBjYW4gYmUgYSB0dXBsZSBvZiBlcnJvcnMuCisgICAgVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIFRydWUgaWYgdGhlIGhhbmRsZXIgY2F0Y2hlcyBhbnkgb2YgdGhlCisgICAgZ2l2ZW4gZXJyb3JzLgorICAgICIiIgorCisgICAgZGVmIHN0cmluZ2lmeV9lcnJvcihlcnJvcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGVycm9yLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIGVycm9yLl9fbmFtZV9fCisgICAgICAgIHJldHVybiBlcnJvcgorCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZXJyb3JfdHlwZSwgdHVwbGUpOgorICAgICAgICBlcnJvcl90eXBlID0gKGVycm9yX3R5cGUsKSAgIyB0eXBlOiBpZ25vcmUKKyAgICBleHBlY3RlZF9lcnJvcnMgPSB7c3RyaW5naWZ5X2Vycm9yKGVycm9yKSBmb3IgZXJyb3IgaW4gZXJyb3JfdHlwZX0gICMgdHlwZTogaWdub3JlCisgICAgaWYgbm90IGhhbmRsZXIudHlwZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIGhhbmRsZXIuY2F0Y2goZXhwZWN0ZWRfZXJyb3JzKQorCisKK2RlZiBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eShub2RlOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSAtPiBib29sOgorICAgICIiIkRldGVjdCBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gbm9kZSBpcyBkZWNvcmF0ZWQgd2l0aCBhIHByb3BlcnR5LiIiIgorICAgIGlmIG5vdCBub2RlLmRlY29yYXRvcnM6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZvciBkZWNvcmF0b3IgaW4gbm9kZS5kZWNvcmF0b3JzLm5vZGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBfaXNfcHJvcGVydHlfZGVjb3JhdG9yKGRlY29yYXRvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9pc19wcm9wZXJ0eV9raW5kKG5vZGUsICpraW5kcyk6CisgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgKGFzdHJvaWQuVW5ib3VuZE1ldGhvZCwgYXN0cm9pZC5GdW5jdGlvbkRlZikpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub2RlLmRlY29yYXRvcnM6CisgICAgICAgIGZvciBkZWNvcmF0b3IgaW4gbm9kZS5kZWNvcmF0b3JzLm5vZGVzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkZWNvcmF0b3IsIGFzdHJvaWQuQXR0cmlidXRlKSBhbmQgZGVjb3JhdG9yLmF0dHJuYW1lIGluIGtpbmRzOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIGlzX3Byb3BlcnR5X3NldHRlcihub2RlOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSAtPiBib29sOgorICAgICIiIkNoZWNrIGlmIHRoZSBnaXZlbiBub2RlIGlzIGEgcHJvcGVydHkgc2V0dGVyIiIiCisgICAgcmV0dXJuIF9pc19wcm9wZXJ0eV9raW5kKG5vZGUsICJzZXR0ZXIiKQorCisKK2RlZiBpc19wcm9wZXJ0eV9kZWxldGVyKG5vZGU6IGFzdHJvaWQuRnVuY3Rpb25EZWYpIC0+IGJvb2w6CisgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuIG5vZGUgaXMgYSBwcm9wZXJ0eSBkZWxldGVyIiIiCisgICAgcmV0dXJuIF9pc19wcm9wZXJ0eV9raW5kKG5vZGUsICJkZWxldGVyIikKKworCitkZWYgaXNfcHJvcGVydHlfc2V0dGVyX29yX2RlbGV0ZXIobm9kZTogYXN0cm9pZC5GdW5jdGlvbkRlZikgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBlaXRoZXIgYSBwcm9wZXJ0eSBzZXR0ZXIgb3IgYSBkZWxldGVyIiIiCisgICAgcmV0dXJuIF9pc19wcm9wZXJ0eV9raW5kKG5vZGUsICJzZXR0ZXIiLCAiZGVsZXRlciIpCisKKworZGVmIF9pc19wcm9wZXJ0eV9kZWNvcmF0b3IoZGVjb3JhdG9yOiBhc3Ryb2lkLk5hbWUpIC0+IGJvb2w6CisgICAgZm9yIGluZmVycmVkIGluIGRlY29yYXRvci5pbmZlcigpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNsYXNzRGVmKToKKyAgICAgICAgICAgIGlmIGluZmVycmVkLnFuYW1lKCkgaW4gKCJidWlsdGlucy5wcm9wZXJ0eSIsICJmdW5jdG9vbHMuY2FjaGVkX3Byb3BlcnR5Iik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGZvciBhbmNlc3RvciBpbiBpbmZlcnJlZC5hbmNlc3RvcnMoKToKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5hbWUgPT0gInByb3BlcnR5IgorICAgICAgICAgICAgICAgICAgICBhbmQgYW5jZXN0b3Iucm9vdCgpLm5hbWUgPT0gQlVJTFRJTlNfTkFNRQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIGRlY29yYXRlZF93aXRoKAorICAgIGZ1bmM6IFVuaW9uW2FzdHJvaWQuRnVuY3Rpb25EZWYsIGFzdHJvaWQuQm91bmRNZXRob2QsIGFzdHJvaWQuVW5ib3VuZE1ldGhvZF0sCisgICAgcW5hbWVzOiBJdGVyYWJsZVtzdHJdLAorKSAtPiBib29sOgorICAgICIiIkRldGVybWluZSBpZiB0aGUgYGZ1bmNgIG5vZGUgaGFzIGEgZGVjb3JhdG9yIHdpdGggdGhlIHF1YWxpZmllZCBuYW1lIGBxbmFtZWAuIiIiCisgICAgZGVjb3JhdG9ycyA9IGZ1bmMuZGVjb3JhdG9ycy5ub2RlcyBpZiBmdW5jLmRlY29yYXRvcnMgZWxzZSBbXQorICAgIGZvciBkZWNvcmF0b3Jfbm9kZSBpbiBkZWNvcmF0b3JzOgorICAgICAgICBpZiBpc2luc3RhbmNlKGRlY29yYXRvcl9ub2RlLCBhc3Ryb2lkLkNhbGwpOgorICAgICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gaW5mZXIgdGhlIGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgICAgIGRlY29yYXRvcl9ub2RlID0gZGVjb3JhdG9yX25vZGUuZnVuYworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBhbnkoCisgICAgICAgICAgICAgICAgaSBpcyBub3QgTm9uZSBhbmQgaS5xbmFtZSgpIGluIHFuYW1lcyBvciBpLm5hbWUgaW4gcW5hbWVzCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gZGVjb3JhdG9yX25vZGUuaW5mZXIoKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworQGxydV9jYWNoZShtYXhzaXplPTEwMjQpCitkZWYgdW5pbXBsZW1lbnRlZF9hYnN0cmFjdF9tZXRob2RzKAorICAgIG5vZGU6IGFzdHJvaWQuQ2xhc3NEZWYsIGlzX2Fic3RyYWN0X2NiOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmID0gTm9uZQorKSAtPiBEaWN0W3N0ciwgYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HXToKKyAgICAiIiIKKyAgICBHZXQgdGhlIHVuaW1wbGVtZW50ZWQgYWJzdHJhY3QgbWV0aG9kcyBmb3IgdGhlIGdpdmVuICpub2RlKi4KKworICAgIEEgbWV0aG9kIGNhbiBiZSBjb25zaWRlcmVkIGFic3RyYWN0IGlmIHRoZSBjYWxsYmFjayAqaXNfYWJzdHJhY3RfY2IqCisgICAgcmV0dXJucyBhIGBgVHJ1ZWBgIHZhbHVlLiBUaGUgY2hlY2sgZGVmYXVsdHMgdG8gdmVyaWZ5aW5nIHRoYXQKKyAgICBhIG1ldGhvZCBpcyBkZWNvcmF0ZWQgd2l0aCBhYnN0cmFjdCBtZXRob2RzLgorICAgIFRoZSBmdW5jdGlvbiB3aWxsIHdvcmsgb25seSBmb3IgbmV3LXN0eWxlIGNsYXNzZXMuIEZvciBvbGQtc3R5bGUKKyAgICBjbGFzc2VzLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gYW4gZW1wdHkgZGljdGlvbmFyeS4KKyAgICBGb3IgdGhlIHJlc3Qgb2YgdGhlbSwgaXQgd2lsbCByZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIGFic3RyYWN0IG1ldGhvZAorICAgIG5hbWVzIGFuZCB0aGVpciBpbmZlcnJlZCBvYmplY3RzLgorICAgICIiIgorICAgIGlmIGlzX2Fic3RyYWN0X2NiIGlzIE5vbmU6CisgICAgICAgIGlzX2Fic3RyYWN0X2NiID0gcGFydGlhbChkZWNvcmF0ZWRfd2l0aCwgcW5hbWVzPUFCQ19NRVRIT0RTKQorICAgIHZpc2l0ZWQ6IERpY3Rbc3RyLCBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkddID0ge30KKyAgICB0cnk6CisgICAgICAgIG1ybyA9IHJldmVyc2VkKG5vZGUubXJvKCkpCisgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICMgT2xkIHN0eWxlIGNsYXNzLCBpdCB3aWxsIG5vdCBoYXZlIGEgbXJvLgorICAgICAgICByZXR1cm4ge30KKyAgICBleGNlcHQgYXN0cm9pZC5SZXNvbHZlRXJyb3I6CisgICAgICAgICMgUHJvYmFibHkgaW5jb25zaXN0ZW50IGhpZXJhcmNoeSwgZG9uJ3RyeQorICAgICAgICAjIHRvIGZpZ3VyZSB0aGlzIG91dCBoZXJlLgorICAgICAgICByZXR1cm4ge30KKyAgICBmb3IgYW5jZXN0b3IgaW4gbXJvOgorICAgICAgICBmb3Igb2JqIGluIGFuY2VzdG9yLnZhbHVlcygpOgorICAgICAgICAgICAgaW5mZXJyZWQgPSBvYmoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBhc3Ryb2lkLkFzc2lnbk5hbWUpOgorICAgICAgICAgICAgICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihvYmopCisgICAgICAgICAgICAgICAgaWYgbm90IGluZmVycmVkOgorICAgICAgICAgICAgICAgICAgICAjIE1pZ2h0IGJlIGFuIGFic3RyYWN0IGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAjIGJ1dCBzaW5jZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAjIGluIG9yZGVyIHRvIHRha2UgdGhpcyBkZWNpc2lvbiwgd2UncmUgdGFraW5nCisgICAgICAgICAgICAgICAgICAgICMgdGhlICpzYWZlKiBkZWNpc2lvbiBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgICBpZiBvYmoubmFtZSBpbiB2aXNpdGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHZpc2l0ZWRbb2JqLm5hbWVdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgICAgICAgICBpZiBvYmoubmFtZSBpbiB2aXNpdGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHZpc2l0ZWRbb2JqLm5hbWVdCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgICAgICAjIEl0J3MgY3JpdGljYWwgdG8gdXNlIHRoZSBvcmlnaW5hbCBuYW1lLAorICAgICAgICAgICAgICAgICMgc2luY2UgYWZ0ZXIgaW5mZXJyaW5nLCBhbiBvYmplY3QgY2FuIGJlIHNvbWV0aGluZworICAgICAgICAgICAgICAgICMgZWxzZSB0aGFuIGV4cGVjdGVkLCBhcyBpbiB0aGUgY2FzZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAjIGZvbGxvd2luZyBhc3NpZ25tZW50LgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgIyAgICAgZGVmIGtleXMoc2VsZik6IHBhc3MKKyAgICAgICAgICAgICAgICAjICAgICBfX2l0ZXJfXyA9IGtleXMKKyAgICAgICAgICAgICAgICBhYnN0cmFjdCA9IGlzX2Fic3RyYWN0X2NiKGluZmVycmVkKQorICAgICAgICAgICAgICAgIGlmIGFic3RyYWN0OgorICAgICAgICAgICAgICAgICAgICB2aXNpdGVkW29iai5uYW1lXSA9IGluZmVycmVkCisgICAgICAgICAgICAgICAgZWxpZiBub3QgYWJzdHJhY3QgYW5kIG9iai5uYW1lIGluIHZpc2l0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGRlbCB2aXNpdGVkW29iai5uYW1lXQorICAgIHJldHVybiB2aXNpdGVkCisKKworZGVmIGZpbmRfdHJ5X2V4Y2VwdF93cmFwcGVyX25vZGUoCisgICAgbm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLAorKSAtPiBPcHRpb25hbFtVbmlvblthc3Ryb2lkLkV4Y2VwdEhhbmRsZXIsIGFzdHJvaWQuVHJ5RXhjZXB0XV06CisgICAgIiIiUmV0dXJuIHRoZSBFeGNlcHRIYW5kbGVyIG9yIHRoZSBUcnlFeGNlcHQgbm9kZSBpbiB3aGljaCB0aGUgbm9kZSBpcy4iIiIKKyAgICBjdXJyZW50ID0gbm9kZQorICAgIGlnbm9yZXMgPSAoYXN0cm9pZC5FeGNlcHRIYW5kbGVyLCBhc3Ryb2lkLlRyeUV4Y2VwdCkKKyAgICB3aGlsZSBjdXJyZW50IGFuZCBub3QgaXNpbnN0YW5jZShjdXJyZW50LnBhcmVudCwgaWdub3Jlcyk6CisgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudAorCisgICAgaWYgY3VycmVudCBhbmQgaXNpbnN0YW5jZShjdXJyZW50LnBhcmVudCwgaWdub3Jlcyk6CisgICAgICAgIHJldHVybiBjdXJyZW50LnBhcmVudAorICAgIHJldHVybiBOb25lCisKKworZGVmIGZpbmRfZXhjZXB0X3dyYXBwZXJfbm9kZV9pbl9zY29wZSgKKyAgICBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcsCispIC0+IE9wdGlvbmFsW1VuaW9uW2FzdHJvaWQuRXhjZXB0SGFuZGxlciwgYXN0cm9pZC5UcnlFeGNlcHRdXToKKyAgICAiIiJSZXR1cm4gdGhlIEV4Y2VwdEhhbmRsZXIgaW4gd2hpY2ggdGhlIG5vZGUgaXMsIHdpdGhvdXQgZ29pbmcgb3V0IG9mIHNjb3BlLiIiIgorICAgIGN1cnJlbnQgPSBub2RlCisgICAgd2hpbGUgY3VycmVudC5wYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudAorICAgICAgICBpZiBpc2luc3RhbmNlKGN1cnJlbnQsIGFzdHJvaWQuc2NvcGVkX25vZGVzLkxvY2Fsc0RpY3ROb2RlTkcpOgorICAgICAgICAgICAgIyBJZiB3ZSdyZSBpbnNpZGUgYSBmdW5jdGlvbi9jbGFzcyBkZWZpbml0aW9uLCB3ZSBkb24ndCB3YW50IHRvIGtlZXAgY2hlY2tpbmcKKyAgICAgICAgICAgICMgaGlnaGVyIGFuY2VzdG9ycyBmb3IgYGV4Y2VwdGAgY2xhdXNlcywgYmVjYXVzZSBpZiB0aGVzZSBleGlzdCwgaXQgbWVhbnMgb3VyCisgICAgICAgICAgICAjIGZ1bmN0aW9uL2NsYXNzIHdhcyBkZWZpbmVkIGluIGFuIGBleGNlcHRgIGNsYXVzZSwgcmF0aGVyIHRoYW4gdGhlIGN1cnJlbnQgY29kZQorICAgICAgICAgICAgIyBhY3R1YWxseSBydW5uaW5nIGluIGFuIGBleGNlcHRgIGNsYXVzZS4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UoY3VycmVudCwgYXN0cm9pZC5FeGNlcHRIYW5kbGVyKToKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50CisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgaXNfZnJvbV9mYWxsYmFja19ibG9jayhub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgIiIiQ2hlY2sgaWYgdGhlIGdpdmVuIG5vZGUgaXMgZnJvbSBhIGZhbGxiYWNrIGltcG9ydCBibG9jay4iIiIKKyAgICBjb250ZXh0ID0gZmluZF90cnlfZXhjZXB0X3dyYXBwZXJfbm9kZShub2RlKQorICAgIGlmIG5vdCBjb250ZXh0OgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIGlzaW5zdGFuY2UoY29udGV4dCwgYXN0cm9pZC5FeGNlcHRIYW5kbGVyKToKKyAgICAgICAgb3RoZXJfYm9keSA9IGNvbnRleHQucGFyZW50LmJvZHkKKyAgICAgICAgaGFuZGxlcnMgPSBjb250ZXh0LnBhcmVudC5oYW5kbGVycworICAgIGVsc2U6CisgICAgICAgIG90aGVyX2JvZHkgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZSgKKyAgICAgICAgICAgIGhhbmRsZXIuYm9keSBmb3IgaGFuZGxlciBpbiBjb250ZXh0LmhhbmRsZXJzCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlcnMgPSBjb250ZXh0LmhhbmRsZXJzCisKKyAgICBoYXNfZmFsbGJhY2tfaW1wb3J0cyA9IGFueSgKKyAgICAgICAgaXNpbnN0YW5jZShpbXBvcnRfbm9kZSwgKGFzdHJvaWQuSW1wb3J0RnJvbSwgYXN0cm9pZC5JbXBvcnQpKQorICAgICAgICBmb3IgaW1wb3J0X25vZGUgaW4gb3RoZXJfYm9keQorICAgICkKKyAgICBpZ25vcmVzX2ltcG9ydF9lcnJvciA9IF9leGNlcHRfaGFuZGxlcnNfaWdub3Jlc19leGNlcHRpb24oaGFuZGxlcnMsIEltcG9ydEVycm9yKQorICAgIHJldHVybiBpZ25vcmVzX2ltcG9ydF9lcnJvciBvciBoYXNfZmFsbGJhY2tfaW1wb3J0cworCisKK2RlZiBfZXhjZXB0X2hhbmRsZXJzX2lnbm9yZXNfZXhjZXB0aW9uKAorICAgIGhhbmRsZXJzOiBhc3Ryb2lkLkV4Y2VwdEhhbmRsZXIsIGV4Y2VwdGlvbgorKSAtPiBib29sOgorICAgIGZ1bmMgPSBwYXJ0aWFsKGVycm9yX29mX3R5cGUsIGVycm9yX3R5cGU9KGV4Y2VwdGlvbiwpKQorICAgIHJldHVybiBhbnkoZnVuYyhoYW5kbGVyKSBmb3IgaGFuZGxlciBpbiBoYW5kbGVycykKKworCitkZWYgZ2V0X2V4Y2VwdGlvbl9oYW5kbGVycygKKyAgICBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcsIGV4Y2VwdGlvbj1FeGNlcHRpb24KKykgLT4gT3B0aW9uYWxbTGlzdFthc3Ryb2lkLkV4Y2VwdEhhbmRsZXJdXToKKyAgICAiIiJSZXR1cm4gdGhlIGNvbGxlY3Rpb25zIG9mIGhhbmRsZXJzIGhhbmRsaW5nIHRoZSBleGNlcHRpb24gaW4gYXJndW1lbnRzLgorCisgICAgQXJnczoKKyAgICAgICAgbm9kZSAoYXN0cm9pZC5Ob2RlTkcpOiBBIG5vZGUgdGhhdCBpcyBwb3RlbnRpYWxseSB3cmFwcGVkIGluIGEgdHJ5IGV4Y2VwdC4KKyAgICAgICAgZXhjZXB0aW9uIChidWlsdGluLkV4Y2VwdGlvbiBvciBzdHIpOiBleGNlcHRpb24gb3IgbmFtZSBvZiB0aGUgZXhjZXB0aW9uLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgbGlzdDogdGhlIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMgdGhhdCBhcmUgaGFuZGxpbmcgdGhlIGV4Y2VwdGlvbiBvciBOb25lLgorCisgICAgIiIiCisgICAgY29udGV4dCA9IGZpbmRfdHJ5X2V4Y2VwdF93cmFwcGVyX25vZGUobm9kZSkKKyAgICBpZiBpc2luc3RhbmNlKGNvbnRleHQsIGFzdHJvaWQuVHJ5RXhjZXB0KToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIGhhbmRsZXIgZm9yIGhhbmRsZXIgaW4gY29udGV4dC5oYW5kbGVycyBpZiBlcnJvcl9vZl90eXBlKGhhbmRsZXIsIGV4Y2VwdGlvbikKKyAgICAgICAgXQorICAgIHJldHVybiBbXQorCisKK2RlZiBpc19ub2RlX2luc2lkZV90cnlfZXhjZXB0KG5vZGU6IGFzdHJvaWQuUmFpc2UpIC0+IGJvb2w6CisgICAgIiIiQ2hlY2sgaWYgdGhlIG5vZGUgaXMgZGlyZWN0bHkgdW5kZXIgYSBUcnkvRXhjZXB0IHN0YXRlbWVudC4KKyAgICAoYnV0IG5vdCB1bmRlciBhbiBFeGNlcHRIYW5kbGVyISkKKworICAgIEFyZ3M6CisgICAgICAgIG5vZGUgKGFzdHJvaWQuUmFpc2UpOiB0aGUgbm9kZSByYWlzaW5nIHRoZSBleGNlcHRpb24uCisKKyAgICBSZXR1cm5zOgorICAgICAgICBib29sOiBUcnVlIGlmIHRoZSBub2RlIGlzIGluc2lkZSBhIHRyeS9leGNlcHQgc3RhdGVtZW50LCBGYWxzZSBvdGhlcndpc2UuCisgICAgIiIiCisgICAgY29udGV4dCA9IGZpbmRfdHJ5X2V4Y2VwdF93cmFwcGVyX25vZGUobm9kZSkKKyAgICByZXR1cm4gaXNpbnN0YW5jZShjb250ZXh0LCBhc3Ryb2lkLlRyeUV4Y2VwdCkKKworCitkZWYgbm9kZV9pZ25vcmVzX2V4Y2VwdGlvbigKKyAgICBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcsIGV4Y2VwdGlvbj1FeGNlcHRpb24KKykgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiB0aGUgbm9kZSBpcyBpbiBhIFRyeUV4Y2VwdCB3aGljaCBoYW5kbGVzIHRoZSBnaXZlbiBleGNlcHRpb24uCisKKyAgICBJZiB0aGUgZXhjZXB0aW9uIGlzIG5vdCBnaXZlbiwgdGhlIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIGxvb2sgZm9yIGJhcmUKKyAgICBleGNlcHRzLgorICAgICIiIgorICAgIG1hbmFnaW5nX2hhbmRsZXJzID0gZ2V0X2V4Y2VwdGlvbl9oYW5kbGVycyhub2RlLCBleGNlcHRpb24pCisgICAgaWYgbm90IG1hbmFnaW5nX2hhbmRsZXJzOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gYW55KG1hbmFnaW5nX2hhbmRsZXJzKQorCisKK2RlZiBjbGFzc19pc19hYnN0cmFjdChub2RlOiBhc3Ryb2lkLkNsYXNzRGVmKSAtPiBib29sOgorICAgICIiInJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcyBub2RlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIGFuIGFic3RyYWN0CisgICAgY2xhc3MKKyAgICAiIiIKKyAgICAjIE9ubHkgY2hlY2sgZm9yIGV4cGxpY2l0IG1ldGFjbGFzcz1BQkNNZXRhIG9uIHRoaXMgc3BlY2lmaWMgY2xhc3MKKyAgICBtZXRhID0gbm9kZS5kZWNsYXJlZF9tZXRhY2xhc3MoKQorICAgIGlmIG1ldGEgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIG1ldGEubmFtZSA9PSAiQUJDTWV0YSIgYW5kIG1ldGEucm9vdCgpLm5hbWUgaW4gQUJDX01PRFVMRVM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZm9yIGFuY2VzdG9yIGluIG5vZGUuYW5jZXN0b3JzKCk6CisgICAgICAgIGlmIGFuY2VzdG9yLm5hbWUgPT0gIkFCQyIgYW5kIGFuY2VzdG9yLnJvb3QoKS5uYW1lIGluIEFCQ19NT0RVTEVTOgorICAgICAgICAgICAgIyBhYmMuQUJDIGluaGVyaXRhbmNlCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZm9yIG1ldGhvZCBpbiBub2RlLm1ldGhvZHMoKToKKyAgICAgICAgaWYgbWV0aG9kLnBhcmVudC5mcmFtZSgpIGlzIG5vZGU6CisgICAgICAgICAgICBpZiBtZXRob2QuaXNfYWJzdHJhY3QocGFzc19pc19hYnN0cmFjdD1GYWxzZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgX3N1cHBvcnRzX3Byb3RvY29sX21ldGhvZCh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLCBhdHRyOiBzdHIpIC0+IGJvb2w6CisgICAgdHJ5OgorICAgICAgICBhdHRyaWJ1dGVzID0gdmFsdWUuZ2V0YXR0cihhdHRyKQorICAgIGV4Y2VwdCBhc3Ryb2lkLk5vdEZvdW5kRXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZmlyc3QgPSBhdHRyaWJ1dGVzWzBdCisgICAgaWYgaXNpbnN0YW5jZShmaXJzdCwgYXN0cm9pZC5Bc3NpZ25OYW1lKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaXJzdC5wYXJlbnQudmFsdWUsIGFzdHJvaWQuQ29uc3QpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgaXNfY29tcHJlaGVuc2lvbihub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgY29tcHJlaGVuc2lvbnMgPSAoCisgICAgICAgIGFzdHJvaWQuTGlzdENvbXAsCisgICAgICAgIGFzdHJvaWQuU2V0Q29tcCwKKyAgICAgICAgYXN0cm9pZC5EaWN0Q29tcCwKKyAgICAgICAgYXN0cm9pZC5HZW5lcmF0b3JFeHAsCisgICAgKQorICAgIHJldHVybiBpc2luc3RhbmNlKG5vZGUsIGNvbXByZWhlbnNpb25zKQorCisKK2RlZiBfc3VwcG9ydHNfbWFwcGluZ19wcm90b2NvbCh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgIHJldHVybiBfc3VwcG9ydHNfcHJvdG9jb2xfbWV0aG9kKAorICAgICAgICB2YWx1ZSwgR0VUSVRFTV9NRVRIT0QKKyAgICApIGFuZCBfc3VwcG9ydHNfcHJvdG9jb2xfbWV0aG9kKHZhbHVlLCBLRVlTX01FVEhPRCkKKworCitkZWYgX3N1cHBvcnRzX21lbWJlcnNoaXBfdGVzdF9wcm90b2NvbCh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgIHJldHVybiBfc3VwcG9ydHNfcHJvdG9jb2xfbWV0aG9kKHZhbHVlLCBDT05UQUlOU19NRVRIT0QpCisKKworZGVmIF9zdXBwb3J0c19pdGVyYXRpb25fcHJvdG9jb2wodmFsdWU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICByZXR1cm4gX3N1cHBvcnRzX3Byb3RvY29sX21ldGhvZCh2YWx1ZSwgSVRFUl9NRVRIT0QpIG9yIF9zdXBwb3J0c19wcm90b2NvbF9tZXRob2QoCisgICAgICAgIHZhbHVlLCBHRVRJVEVNX01FVEhPRAorICAgICkKKworCitkZWYgX3N1cHBvcnRzX2FzeW5jX2l0ZXJhdGlvbl9wcm90b2NvbCh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgIHJldHVybiBfc3VwcG9ydHNfcHJvdG9jb2xfbWV0aG9kKHZhbHVlLCBBSVRFUl9NRVRIT0QpCisKKworZGVmIF9zdXBwb3J0c19nZXRpdGVtX3Byb3RvY29sKHZhbHVlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgcmV0dXJuIF9zdXBwb3J0c19wcm90b2NvbF9tZXRob2QodmFsdWUsIEdFVElURU1fTUVUSE9EKQorCisKK2RlZiBfc3VwcG9ydHNfc2V0aXRlbV9wcm90b2NvbCh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgIHJldHVybiBfc3VwcG9ydHNfcHJvdG9jb2xfbWV0aG9kKHZhbHVlLCBTRVRJVEVNX01FVEhPRCkKKworCitkZWYgX3N1cHBvcnRzX2RlbGl0ZW1fcHJvdG9jb2wodmFsdWU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICByZXR1cm4gX3N1cHBvcnRzX3Byb3RvY29sX21ldGhvZCh2YWx1ZSwgREVMSVRFTV9NRVRIT0QpCisKKworZGVmIF9pc19hYnN0cmFjdF9jbGFzc19uYW1lKG5hbWU6IHN0cikgLT4gYm9vbDoKKyAgICBsbmFtZSA9IG5hbWUubG93ZXIoKQorICAgIGlzX21peGluID0gbG5hbWUuZW5kc3dpdGgoIm1peGluIikKKyAgICBpc19hYnN0cmFjdCA9IGxuYW1lLnN0YXJ0c3dpdGgoImFic3RyYWN0IikKKyAgICBpc19iYXNlID0gbG5hbWUuc3RhcnRzd2l0aCgiYmFzZSIpIG9yIGxuYW1lLmVuZHN3aXRoKCJiYXNlIikKKyAgICByZXR1cm4gaXNfbWl4aW4gb3IgaXNfYWJzdHJhY3Qgb3IgaXNfYmFzZQorCisKK2RlZiBpc19pbnNpZGVfYWJzdHJhY3RfY2xhc3Mobm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgIHdoaWxlIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICBpZiBjbGFzc19pc19hYnN0cmFjdChub2RlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgbmFtZSA9IGdldGF0dHIobm9kZSwgIm5hbWUiLCBOb25lKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZSBhbmQgX2lzX2Fic3RyYWN0X2NsYXNzX25hbWUobmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIF9zdXBwb3J0c19wcm90b2NvbCgKKyAgICB2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLCBwcm90b2NvbF9jYWxsYmFjazogYXN0cm9pZC5GdW5jdGlvbkRlZgorKSAtPiBib29sOgorICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICBpZiBub3QgaGFzX2tub3duX2Jhc2VzKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgY2xhc3NvYmogY2FuIG9ubHkgYmUgaXRlcmFibGUgaWYgaXQgaGFzIGFuIGl0ZXJhYmxlIG1ldGFjbGFzcworICAgICAgICBtZXRhID0gdmFsdWUubWV0YWNsYXNzKCkKKyAgICAgICAgaWYgbWV0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHByb3RvY29sX2NhbGxiYWNrKG1ldGEpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYXN0cm9pZC5CYXNlSW5zdGFuY2UpOgorICAgICAgICBpZiBub3QgaGFzX2tub3duX2Jhc2VzKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIHZhbHVlLmhhc19keW5hbWljX2dldGF0dHIoKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIHByb3RvY29sX2NhbGxiYWNrKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBpZiAoCisgICAgICAgIGlzaW5zdGFuY2UodmFsdWUsIGFzdHJvaWQuYmFzZXMuUHJveHkpCisgICAgICAgIGFuZCBpc2luc3RhbmNlKHZhbHVlLl9wcm94aWVkLCBhc3Ryb2lkLkJhc2VJbnN0YW5jZSkKKyAgICAgICAgYW5kIGhhc19rbm93bl9iYXNlcyh2YWx1ZS5fcHJveGllZCkKKyAgICApOgorICAgICAgICB2YWx1ZSA9IHZhbHVlLl9wcm94aWVkCisgICAgICAgIHJldHVybiBwcm90b2NvbF9jYWxsYmFjayh2YWx1ZSkKKworICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpc19pdGVyYWJsZSh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLCBjaGVja19hc3luYzogYm9vbCA9IEZhbHNlKSAtPiBib29sOgorICAgIGlmIGNoZWNrX2FzeW5jOgorICAgICAgICBwcm90b2NvbF9jaGVjayA9IF9zdXBwb3J0c19hc3luY19pdGVyYXRpb25fcHJvdG9jb2wKKyAgICBlbHNlOgorICAgICAgICBwcm90b2NvbF9jaGVjayA9IF9zdXBwb3J0c19pdGVyYXRpb25fcHJvdG9jb2wKKyAgICByZXR1cm4gX3N1cHBvcnRzX3Byb3RvY29sKHZhbHVlLCBwcm90b2NvbF9jaGVjaykKKworCitkZWYgaXNfbWFwcGluZyh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgIHJldHVybiBfc3VwcG9ydHNfcHJvdG9jb2wodmFsdWUsIF9zdXBwb3J0c19tYXBwaW5nX3Byb3RvY29sKQorCisKK2RlZiBzdXBwb3J0c19tZW1iZXJzaGlwX3Rlc3QodmFsdWU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICBzdXBwb3J0ZWQgPSBfc3VwcG9ydHNfcHJvdG9jb2wodmFsdWUsIF9zdXBwb3J0c19tZW1iZXJzaGlwX3Rlc3RfcHJvdG9jb2wpCisgICAgcmV0dXJuIHN1cHBvcnRlZCBvciBpc19pdGVyYWJsZSh2YWx1ZSkKKworCitkZWYgc3VwcG9ydHNfZ2V0aXRlbSgKKyAgICB2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLCBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcKKykgLT4gYm9vbDoKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLkNsYXNzRGVmKToKKyAgICAgICAgaWYgX3N1cHBvcnRzX3Byb3RvY29sX21ldGhvZCh2YWx1ZSwgQ0xBU1NfR0VUSVRFTV9NRVRIT0QpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgaXNfY2xhc3Nfc3Vic2NyaXB0YWJsZV9wZXA1ODVfd2l0aF9wb3N0cG9uZWRfZXZhbHVhdGlvbl9lbmFibGVkKHZhbHVlLCBub2RlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIF9zdXBwb3J0c19wcm90b2NvbCh2YWx1ZSwgX3N1cHBvcnRzX2dldGl0ZW1fcHJvdG9jb2wpCisKKworZGVmIHN1cHBvcnRzX3NldGl0ZW0odmFsdWU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORywgKl86IEFueSkgLT4gYm9vbDoKKyAgICByZXR1cm4gX3N1cHBvcnRzX3Byb3RvY29sKHZhbHVlLCBfc3VwcG9ydHNfc2V0aXRlbV9wcm90b2NvbCkKKworCitkZWYgc3VwcG9ydHNfZGVsaXRlbSh2YWx1ZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLCAqXzogQW55KSAtPiBib29sOgorICAgIHJldHVybiBfc3VwcG9ydHNfcHJvdG9jb2wodmFsdWUsIF9zdXBwb3J0c19kZWxpdGVtX3Byb3RvY29sKQorCisKK2RlZiBfZ2V0X3B5dGhvbl90eXBlX29mX25vZGUobm9kZSk6CisgICAgcHl0eXBlID0gZ2V0YXR0cihub2RlLCAicHl0eXBlIiwgTm9uZSkKKyAgICBpZiBjYWxsYWJsZShweXR5cGUpOgorICAgICAgICByZXR1cm4gcHl0eXBlKCkKKyAgICByZXR1cm4gTm9uZQorCisKK0BscnVfY2FjaGUobWF4c2l6ZT0xMDI0KQorZGVmIHNhZmVfaW5mZXIoCisgICAgbm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLCBjb250ZXh0PU5vbmUKKykgLT4gT3B0aW9uYWxbYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HXToKKyAgICAiIiJSZXR1cm4gdGhlIGluZmVycmVkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbm9kZS4KKworICAgIFJldHVybiBOb25lIGlmIGluZmVyZW5jZSBmYWlsZWQgb3IgaWYgdGhlcmUgaXMgc29tZSBhbWJpZ3VpdHkgKG1vcmUgdGhhbgorICAgIG9uZSBub2RlIGhhcyBiZWVuIGluZmVycmVkIG9mIGRpZmZlcmVudCB0eXBlcykuCisgICAgIiIiCisgICAgaW5mZXJyZWRfdHlwZXMgPSBzZXQoKQorICAgIHRyeToKKyAgICAgICAgaW5mZXJfZ2VuID0gbm9kZS5pbmZlcihjb250ZXh0PWNvbnRleHQpCisgICAgICAgIHZhbHVlID0gbmV4dChpbmZlcl9nZW4pCisgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBpZiB2YWx1ZSBpcyBub3QgYXN0cm9pZC5VbmluZmVyYWJsZToKKyAgICAgICAgaW5mZXJyZWRfdHlwZXMuYWRkKF9nZXRfcHl0aG9uX3R5cGVfb2Zfbm9kZSh2YWx1ZSkpCisKKyAgICB0cnk6CisgICAgICAgIGZvciBpbmZlcnJlZCBpbiBpbmZlcl9nZW46CisgICAgICAgICAgICBpbmZlcnJlZF90eXBlID0gX2dldF9weXRob25fdHlwZV9vZl9ub2RlKGluZmVycmVkKQorICAgICAgICAgICAgaWYgaW5mZXJyZWRfdHlwZSBub3QgaW4gaW5mZXJyZWRfdHlwZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUgICMgSWYgdGhlcmUgaXMgYW1iaWd1aXR5IG9uIHRoZSBpbmZlcnJlZCBub2RlLgorICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZSAgIyBUaGVyZSBpcyBzb21lIGtpbmQgb2YgYW1iaWd1aXR5CisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgIHJldHVybiB2YWx1ZSBpZiBsZW4oaW5mZXJyZWRfdHlwZXMpIDw9IDEgZWxzZSBOb25lCisKKworZGVmIGhhc19rbm93bl9iYXNlcyhrbGFzczogYXN0cm9pZC5DbGFzc0RlZiwgY29udGV4dD1Ob25lKSAtPiBib29sOgorICAgICIiIlJldHVybiB0cnVlIGlmIGFsbCBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcyBjb3VsZCBiZSBpbmZlcnJlZC4iIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBrbGFzcy5fYWxsX2Jhc2VzX2tub3duCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZm9yIGJhc2UgaW4ga2xhc3MuYmFzZXM6CisgICAgICAgIHJlc3VsdCA9IHNhZmVfaW5mZXIoYmFzZSwgY29udGV4dD1jb250ZXh0KQorICAgICAgICBpZiAoCisgICAgICAgICAgICBub3QgaXNpbnN0YW5jZShyZXN1bHQsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICAgICBvciByZXN1bHQgaXMga2xhc3MKKyAgICAgICAgICAgIG9yIG5vdCBoYXNfa25vd25fYmFzZXMocmVzdWx0LCBjb250ZXh0PWNvbnRleHQpCisgICAgICAgICk6CisgICAgICAgICAgICBrbGFzcy5fYWxsX2Jhc2VzX2tub3duID0gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIGtsYXNzLl9hbGxfYmFzZXNfa25vd24gPSBUcnVlCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgaXNfbm9uZShub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgcmV0dXJuICgKKyAgICAgICAgbm9kZSBpcyBOb25lCisgICAgICAgIG9yIChpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ29uc3QpIGFuZCBub2RlLnZhbHVlIGlzIE5vbmUpCisgICAgICAgIG9yIChpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuTmFtZSkgYW5kIG5vZGUubmFtZSA9PSAiTm9uZSIpCisgICAgKQorCisKK2RlZiBub2RlX3R5cGUobm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBPcHRpb25hbFt0eXBlXToKKyAgICAiIiJSZXR1cm4gdGhlIGluZmVycmVkIHR5cGUgZm9yIGBub2RlYAorCisgICAgSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBwb3NzaWJsZSB0eXBlLCBvciBpZiBpbmZlcnJlZCB0eXBlIGlzIFVuaW5mZXJhYmxlIG9yIE5vbmUsCisgICAgcmV0dXJuIE5vbmUKKyAgICAiIiIKKyAgICAjIGNoZWNrIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIHR5cGUgZm9yIHRoZSBhc3NpZ24gbm9kZS4gRWxzZSB3ZQorICAgICMgZG9uJ3QgaGFuZGxlIGl0IGZvciBub3cKKyAgICB0eXBlcyA9IHNldCgpCisgICAgdHJ5OgorICAgICAgICBmb3IgdmFyX3R5cGUgaW4gbm9kZS5pbmZlcigpOgorICAgICAgICAgICAgaWYgdmFyX3R5cGUgPT0gYXN0cm9pZC5VbmluZmVyYWJsZSBvciBpc19ub25lKHZhcl90eXBlKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHlwZXMuYWRkKHZhcl90eXBlKQorICAgICAgICAgICAgaWYgbGVuKHR5cGVzKSA+IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gdHlwZXMucG9wKCkgaWYgdHlwZXMgZWxzZSBOb25lCisKKworZGVmIGlzX3JlZ2lzdGVyZWRfaW5fc2luZ2xlZGlzcGF0Y2hfZnVuY3Rpb24obm9kZTogYXN0cm9pZC5GdW5jdGlvbkRlZikgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gbm9kZSBpcyBhIHNpbmdsZWRpc3BhdGNoIGZ1bmN0aW9uLiIiIgorCisgICAgc2luZ2xlZGlzcGF0Y2hfcW5hbWVzID0gKAorICAgICAgICAiZnVuY3Rvb2xzLnNpbmdsZWRpc3BhdGNoIiwKKyAgICAgICAgInNpbmdsZWRpc3BhdGNoLnNpbmdsZWRpc3BhdGNoIiwKKyAgICApCisKKyAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWNvcmF0b3JzID0gbm9kZS5kZWNvcmF0b3JzLm5vZGVzIGlmIG5vZGUuZGVjb3JhdG9ycyBlbHNlIFtdCisgICAgZm9yIGRlY29yYXRvciBpbiBkZWNvcmF0b3JzOgorICAgICAgICAjIGZ1bmMucmVnaXN0ZXIgYXJlIGZ1bmN0aW9uIGNhbGxzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRlY29yYXRvciwgYXN0cm9pZC5DYWxsKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZnVuYyA9IGRlY29yYXRvci5mdW5jCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKSBvciBmdW5jLmF0dHJuYW1lICE9ICJyZWdpc3RlciI6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmNfZGVmID0gbmV4dChmdW5jLmV4cHIuaW5mZXIoKSkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZnVuY19kZWYsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cmVkdW5kYW50LWtleXdvcmQtYXJnOyBzb21lIGZsb3cgaW5mZXJlbmNlIGdvZXMgd3JvbmcgaGVyZQorICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRlZF93aXRoKGZ1bmNfZGVmLCBzaW5nbGVkaXNwYXRjaF9xbmFtZXMpCisKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBpbnQ6CisgICAgIiIiCisgICAgR2V0IHRoZSBsYXN0IGxpbmVubyBvZiB0aGUgZ2l2ZW4gbm9kZS4gRm9yIGEgc2ltcGxlIHN0YXRlbWVudCB0aGlzIHdpbGwganVzdCBiZSBub2RlLmxpbmVubywKKyAgICBidXQgZm9yIGEgbm9kZSB0aGF0IGhhcyBjaGlsZCBzdGF0ZW1lbnRzIChlLmcuIGEgbWV0aG9kKSB0aGlzIHdpbGwgYmUgdGhlIGxpbmVubyBvZiB0aGUgbGFzdAorICAgIGNoaWxkIHN0YXRlbWVudCByZWN1cnNpdmVseS4KKyAgICAiIiIKKyAgICAjICdmaW5hbGJvZHknIGlzIGFsd2F5cyB0aGUgbGFzdCBjbGF1c2UgaW4gYSB0cnkgc3RhdGVtZW50LCBpZiBwcmVzZW50CisgICAgaWYgZ2V0YXR0cihub2RlLCAiZmluYWxib2R5IiwgRmFsc2UpOgorICAgICAgICByZXR1cm4gZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZS5maW5hbGJvZHlbLTFdKQorICAgICMgRm9yIGlmLCB3aGlsZSwgYW5kIGZvciBzdGF0ZW1lbnRzICdvcmVsc2UnIGlzIGFsd2F5cyB0aGUgbGFzdCBjbGF1c2UuCisgICAgIyBGb3IgdHJ5IHN0YXRlbWVudHMgJ29yZWxzZScgaXMgdGhlIGxhc3QgaW4gdGhlIGFic2VuY2Ugb2YgYSAnZmluYWxib2R5JworICAgIGlmIGdldGF0dHIobm9kZSwgIm9yZWxzZSIsIEZhbHNlKToKKyAgICAgICAgcmV0dXJuIGdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUub3JlbHNlWy0xXSkKKyAgICAjIHRyeSBzdGF0ZW1lbnRzIGhhdmUgdGhlICdoYW5kbGVycycgbGFzdCBpZiB0aGVyZSBpcyBubyAnb3JlbHNlJyBvciAnZmluYWxib2R5JworICAgIGlmIGdldGF0dHIobm9kZSwgImhhbmRsZXJzIiwgRmFsc2UpOgorICAgICAgICByZXR1cm4gZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZS5oYW5kbGVyc1stMV0pCisgICAgIyBBbGwgY29tcG91bmQgc3RhdGVtZW50cyBoYXZlIGEgJ2JvZHknCisgICAgaWYgZ2V0YXR0cihub2RlLCAiYm9keSIsIEZhbHNlKToKKyAgICAgICAgcmV0dXJuIGdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUuYm9keVstMV0pCisgICAgIyBOb3QgYSBjb21wb3VuZCBzdGF0ZW1lbnQKKyAgICByZXR1cm4gbm9kZS5saW5lbm8KKworCitkZWYgaXNfcG9zdHBvbmVkX2V2YWx1YXRpb25fZW5hYmxlZChub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcpIC0+IGJvb2w6CisgICAgIiIiQ2hlY2sgaWYgdGhlIHBvc3Rwb25lZCBldmFsdWF0aW9uIG9mIGFubm90YXRpb25zIGlzIGVuYWJsZWQiIiIKKyAgICBtb2R1bGUgPSBub2RlLnJvb3QoKQorICAgIHJldHVybiAiYW5ub3RhdGlvbnMiIGluIG1vZHVsZS5mdXR1cmVfaW1wb3J0cworCisKK2RlZiBpc19jbGFzc19zdWJzY3JpcHRhYmxlX3BlcDU4NV93aXRoX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2VuYWJsZWQoCisgICAgdmFsdWU6IGFzdHJvaWQuQ2xhc3NEZWYsIG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORworKSAtPiBib29sOgorICAgICIiIkNoZWNrIGlmIGNsYXNzIGlzIHN1YnNjcmlwdGFibGUgd2l0aCBQRVAgNTg1IGFuZAorICAgIHBvc3Rwb25lZCBldmFsdWF0aW9uIGVuYWJsZWQuCisgICAgIiIiCisgICAgcmV0dXJuICgKKyAgICAgICAgaXNfcG9zdHBvbmVkX2V2YWx1YXRpb25fZW5hYmxlZChub2RlKQorICAgICAgICBhbmQgdmFsdWUucW5hbWUoKSBpbiBTVUJTQ1JJUFRBQkxFX0NMQVNTRVNfUEVQNTg1CisgICAgICAgIGFuZCBpc19ub2RlX2luX3R5cGVfYW5ub3RhdGlvbl9jb250ZXh0KG5vZGUpCisgICAgKQorCisKK2RlZiBpc19ub2RlX2luX3R5cGVfYW5ub3RhdGlvbl9jb250ZXh0KG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiBub2RlIGlzIGluIHR5cGUgYW5ub3RhdGlvbiBjb250ZXh0LgorCisgICAgQ2hlY2sgZm9yICdBbm5Bc3NpZ24nLCBmdW5jdGlvbiAnQXJndW1lbnRzJywKKyAgICBvciBwYXJ0IG9mIGZ1bmN0aW9uIHJldHVybiB0eXBlIGFubnRhdGlvbi4KKyAgICAiIiIKKyAgICAjIHB5bGludDogZGlzYWJsZT10b28tbWFueS1ib29sZWFuLWV4cHJlc3Npb25zCisgICAgY3VycmVudF9ub2RlLCBwYXJlbnRfbm9kZSA9IG5vZGUsIG5vZGUucGFyZW50CisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShwYXJlbnRfbm9kZSwgYXN0cm9pZC5Bbm5Bc3NpZ24pCisgICAgICAgICAgICBhbmQgcGFyZW50X25vZGUuYW5ub3RhdGlvbiA9PSBjdXJyZW50X25vZGUKKyAgICAgICAgICAgIG9yIGlzaW5zdGFuY2UocGFyZW50X25vZGUsIGFzdHJvaWQuQXJndW1lbnRzKQorICAgICAgICAgICAgYW5kIGN1cnJlbnRfbm9kZQorICAgICAgICAgICAgaW4gKAorICAgICAgICAgICAgICAgICpwYXJlbnRfbm9kZS5hbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAqcGFyZW50X25vZGUucG9zb25seWFyZ3NfYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgKnBhcmVudF9ub2RlLmt3b25seWFyZ3NfYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgcGFyZW50X25vZGUudmFyYXJnYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICBwYXJlbnRfbm9kZS5rd2FyZ2Fubm90YXRpb24sCisgICAgICAgICAgICApCisgICAgICAgICAgICBvciBpc2luc3RhbmNlKHBhcmVudF9ub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgYW5kIHBhcmVudF9ub2RlLnJldHVybnMgPT0gY3VycmVudF9ub2RlCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBjdXJyZW50X25vZGUsIHBhcmVudF9ub2RlID0gcGFyZW50X25vZGUsIHBhcmVudF9ub2RlLnBhcmVudAorICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmVudF9ub2RlLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgaXNfc3ViY2xhc3Nfb2YoY2hpbGQ6IGFzdHJvaWQuQ2xhc3NEZWYsIHBhcmVudDogYXN0cm9pZC5DbGFzc0RlZikgLT4gYm9vbDoKKyAgICAiIiIKKyAgICBDaGVjayBpZiBmaXJzdCBub2RlIGlzIGEgc3ViY2xhc3Mgb2Ygc2Vjb25kIG5vZGUuCisgICAgOnBhcmFtIGNoaWxkOiBOb2RlIHRvIGNoZWNrIGZvciBzdWJjbGFzcy4KKyAgICA6cGFyYW0gcGFyZW50OiBOb2RlIHRvIGNoZWNrIGZvciBzdXBlcmNsYXNzLgorICAgIDpyZXR1cm5zOiBUcnVlIGlmIGNoaWxkIGlzIGRlcml2ZWQgZnJvbSBwYXJlbnQuIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICBpZiBub3QgYWxsKGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5DbGFzc0RlZikgZm9yIG5vZGUgaW4gKGNoaWxkLCBwYXJlbnQpKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBmb3IgYW5jZXN0b3IgaW4gY2hpbGQuYW5jZXN0b3JzKCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGFzdHJvaWQuaGVscGVycy5pc19zdWJ0eXBlKGFuY2VzdG9yLCBwYXJlbnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLmV4Y2VwdGlvbnMuX05vbkRlZHVjaWJsZVR5cGVIaWVyYXJjaHk6CisgICAgICAgICAgICBjb250aW51ZQorICAgIHJldHVybiBGYWxzZQorCisKK0BscnVfY2FjaGUobWF4c2l6ZT0xMDI0KQorZGVmIGlzX292ZXJsb2FkX3N0dWIobm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HKSAtPiBib29sOgorICAgICIiIkNoZWNrIGlmIGEgbm9kZSBpZiBpcyBhIGZ1bmN0aW9uIHN0dWIgZGVjb3JhdGVkIHdpdGggdHlwaW5nLm92ZXJsb2FkLgorCisgICAgOnBhcmFtIG5vZGU6IE5vZGUgdG8gY2hlY2suCisgICAgOnJldHVybnM6IFRydWUgaWYgbm9kZSBpcyBhbiBvdmVybG9hZCBmdW5jdGlvbiBzdHViLiBGYWxzZSBvdGhlcndpc2UuCisgICAgIiIiCisgICAgZGVjb3JhdG9ycyA9IGdldGF0dHIobm9kZSwgImRlY29yYXRvcnMiLCBOb25lKQorICAgIHJldHVybiBib29sKGRlY29yYXRvcnMgYW5kIGRlY29yYXRlZF93aXRoKG5vZGUsIFsidHlwaW5nLm92ZXJsb2FkIiwgIm92ZXJsb2FkIl0pKQorCisKK2RlZiBpc19wcm90b2NvbF9jbGFzcyhjbHM6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORykgLT4gYm9vbDoKKyAgICAiIiJDaGVjayBpZiB0aGUgZ2l2ZW4gbm9kZSByZXByZXNlbnRzIGEgcHJvdG9jb2wgY2xhc3MKKworICAgIDpwYXJhbSBjbHM6IFRoZSBub2RlIHRvIGNoZWNrCisgICAgOnJldHVybnM6IFRydWUgaWYgdGhlIG5vZGUgaXMgYSB0eXBpbmcgcHJvdG9jb2wgY2xhc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShjbHMsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgVXNlIC5hbmNlc3RvcnMoKSBzaW5jZSBub3QgYWxsIHByb3RvY29sIGNsYXNzZXMgY2FuIGhhdmUKKyAgICAjIHRoZWlyIG1ybyBkZWR1Y2VkLgorICAgIHJldHVybiBhbnkocGFyZW50LnFuYW1lKCkgaW4gVFlQSU5HX1BST1RPQ09MUyBmb3IgcGFyZW50IGluIGNscy5hbmNlc3RvcnMoKSkKKworCitkZWYgaXNfY2FsbF9vZl9uYW1lKG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORywgbmFtZTogc3RyKSAtPiBib29sOgorICAgICIiIkNoZWNrcyBpZiBub2RlIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBnaXZlbiBuYW1lIiIiCisgICAgcmV0dXJuICgKKyAgICAgICAgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkNhbGwpCisgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuZnVuYywgYXN0cm9pZC5OYW1lKQorICAgICAgICBhbmQgbm9kZS5mdW5jLm5hbWUgPT0gbmFtZQorICAgICkKKworCitkZWYgaXNfdGVzdF9jb25kaXRpb24oCisgICAgbm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HLAorICAgIHBhcmVudDogT3B0aW9uYWxbYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HXSA9IE5vbmUsCispIC0+IGJvb2w6CisgICAgIiIiUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBub2RlIGlzIGJlaW5nIHRlc3RlZCBmb3IgdHJ1dGhpbmVzcyIiIgorICAgIHBhcmVudCA9IHBhcmVudCBvciBub2RlLnBhcmVudAorICAgIGlmIGlzaW5zdGFuY2UocGFyZW50LCAoYXN0cm9pZC5XaGlsZSwgYXN0cm9pZC5JZiwgYXN0cm9pZC5JZkV4cCwgYXN0cm9pZC5Bc3NlcnQpKToKKyAgICAgICAgcmV0dXJuIG5vZGUgaXMgcGFyZW50LnRlc3Qgb3IgcGFyZW50LnRlc3QucGFyZW50X29mKG5vZGUpCisgICAgaWYgaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuQ29tcHJlaGVuc2lvbik6CisgICAgICAgIHJldHVybiBub2RlIGluIHBhcmVudC5pZnMKKyAgICByZXR1cm4gaXNfY2FsbF9vZl9uYW1lKHBhcmVudCwgImJvb2wiKSBhbmQgcGFyZW50LnBhcmVudF9vZihub2RlKQorCisKK2RlZiBpc19jbGFzc2RlZl90eXBlKG5vZGU6IGFzdHJvaWQuQ2xhc3NEZWYpIC0+IGJvb2w6CisgICAgIiIiVGVzdCBpZiBDbGFzc0RlZiBub2RlIGlzIFR5cGUuIiIiCisgICAgaWYgbm9kZS5uYW1lID09ICJ0eXBlIjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBmb3IgYmFzZSBpbiBub2RlLmJhc2VzOgorICAgICAgICBpZiBpc2luc3RhbmNlKGJhc2UsIGFzdHJvaWQuTmFtZSkgYW5kIGJhc2UubmFtZSA9PSAidHlwZSI6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpc19hdHRyaWJ1dGVfdHlwZWRfYW5ub3RhdGlvbigKKyAgICBub2RlOiBVbmlvblthc3Ryb2lkLkNsYXNzRGVmLCBhc3Ryb2lkLkluc3RhbmNlXSwgYXR0cl9uYW1lOiBzdHIKKykgLT4gYm9vbDoKKyAgICAiIiJUZXN0IGlmIGF0dHJpYnV0ZSBpcyB0eXBlZCBhbm5vdGF0aW9uIGluIGN1cnJlbnQgbm9kZQorICAgIG9yIGFueSBiYXNlIG5vZGVzLgorICAgICIiIgorICAgIGF0dHJpYnV0ZSA9IG5vZGUubG9jYWxzLmdldChhdHRyX25hbWUsIFtOb25lXSlbMF0KKyAgICBpZiAoCisgICAgICAgIGF0dHJpYnV0ZQorICAgICAgICBhbmQgaXNpbnN0YW5jZShhdHRyaWJ1dGUsIGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgYW5kIGlzaW5zdGFuY2UoYXR0cmlidXRlLnBhcmVudCwgYXN0cm9pZC5Bbm5Bc3NpZ24pCisgICAgKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBmb3IgYmFzZSBpbiBub2RlLmJhc2VzOgorICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIoYmFzZSkKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaW5mZXJyZWQKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgYW5kIGlzX2F0dHJpYnV0ZV90eXBlZF9hbm5vdGF0aW9uKGluZmVycmVkLCBhdHRyX25hbWUpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBpc19hc3NpZ25fbmFtZV9hbm5vdGF0ZWRfd2l0aChub2RlOiBhc3Ryb2lkLkFzc2lnbk5hbWUsIHR5cGluZ19uYW1lOiBzdHIpIC0+IGJvb2w6CisgICAgIiIiVGVzdCBpZiBBc3NpZ25OYW1lIG5vZGUgaGFzIGB0eXBpbmdfbmFtZWAgYW5ub3RhdGlvbi4KKworICAgIEVzcGVjaWFsbHkgdXNlZnVsIHRvIGNoZWNrIGZvciBgdHlwaW5nLl9TcGVjaWFsRm9ybWAgaW5zdGFuY2VzCisgICAgbGlrZTogYFVuaW9uYCwgYE9wdGlvbmFsYCwgYExpdGVyYWxgLCBgQ2xhc3NWYXJgLCBgRmluYWxgLgorICAgICIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkFubkFzc2lnbik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGFubm90YXRpb24gPSBub2RlLnBhcmVudC5hbm5vdGF0aW9uCisgICAgaWYgaXNpbnN0YW5jZShhbm5vdGF0aW9uLCBhc3Ryb2lkLlN1YnNjcmlwdCk6CisgICAgICAgIGFubm90YXRpb24gPSBhbm5vdGF0aW9uLnZhbHVlCisgICAgaWYgKAorICAgICAgICBpc2luc3RhbmNlKGFubm90YXRpb24sIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgYW5kIGFubm90YXRpb24ubmFtZSA9PSB0eXBpbmdfbmFtZQorICAgICAgICBvciBpc2luc3RhbmNlKGFubm90YXRpb24sIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICBhbmQgYW5ub3RhdGlvbi5hdHRybmFtZSA9PSB0eXBpbmdfbmFtZQorICAgICk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIGdldF9pdGVyYXRpbmdfZGljdGlvbmFyeV9uYW1lKAorICAgIG5vZGU6IFVuaW9uW2FzdHJvaWQuRm9yLCBhc3Ryb2lkLkNvbXByZWhlbnNpb25dCispIC0+IE9wdGlvbmFsW3N0cl06CisgICAgIiIiR2V0IHRoZSBuYW1lIG9mIHRoZSBkaWN0aW9uYXJ5IHdoaWNoIGtleXMgYXJlIGJlaW5nIGl0ZXJhdGVkIG92ZXIgb24KKyAgICBhIGBhc3Ryb2lkLkZvcmAgb3IgYGFzdHJvaWQuQ29tcHJlaGVuc2lvbmAgbm9kZS4KKworICAgIElmIHRoZSBpdGVyYXRpbmcgb2JqZWN0IGlzIG5vdCBlaXRoZXIgdGhlIGtleXMgbWV0aG9kIG9mIGEgZGljdGlvbmFyeQorICAgIG9yIGEgZGljdGlvbmFyeSBpdHNlbGYsIHRoaXMgcmV0dXJucyBOb25lLgorICAgICIiIgorICAgICMgSXMgaXQgYSBwcm9wZXIga2V5cyBjYWxsPworICAgIGlmICgKKyAgICAgICAgaXNpbnN0YW5jZShub2RlLml0ZXIsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5pdGVyLmZ1bmMsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICBhbmQgbm9kZS5pdGVyLmZ1bmMuYXR0cm5hbWUgPT0gImtleXMiCisgICAgKToKKyAgICAgICAgaW5mZXJyZWQgPSBzYWZlX2luZmVyKG5vZGUuaXRlci5mdW5jKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5Cb3VuZE1ldGhvZCk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gbm9kZS5pdGVyLmFzX3N0cmluZygpLnJwYXJ0aXRpb24oIi5rZXlzIilbMF0KKworICAgICMgSXMgaXQgYSBkaWN0aW9uYXJ5PworICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5pdGVyLCAoYXN0cm9pZC5OYW1lLCBhc3Ryb2lkLkF0dHJpYnV0ZSkpOgorICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIobm9kZS5pdGVyKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5EaWN0KToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBub2RlLml0ZXIuYXNfc3RyaW5nKCkKKworICAgIHJldHVybiBOb25lCisKKworZGVmIGdldF9zdWJzY3JpcHRfY29uc3RfdmFsdWUobm9kZTogYXN0cm9pZC5TdWJzY3JpcHQpIC0+IGFzdHJvaWQuQ29uc3Q6CisgICAgIiIiCisgICAgUmV0dXJucyB0aGUgdmFsdWUgJ3N1YnNjcmlwdC5zbGljZScgb2YgYSBTdWJzY3JpcHQgbm9kZS4KKworICAgIDpwYXJhbSBub2RlOiBTdWJzY3JpcHQgTm9kZSB0byBleHRyYWN0IHZhbHVlIGZyb20KKyAgICA6cmV0dXJuczogQ29uc3QgTm9kZSBjb250YWluaW5nIHN1YnNjcmlwdCB2YWx1ZQorICAgIDpyYWlzZXMgSW5mZXJyZWRUeXBlRXJyb3I6IGlmIHRoZSBzdWJzY3JpcHQgbm9kZSBjYW5ub3QgYmUgaW5mZXJyZWQgYXMgYSBDb25zdAorICAgICIiIgorICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihub2RlLnNsaWNlKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNvbnN0KToKKyAgICAgICAgcmFpc2UgSW5mZXJyZWRUeXBlRXJyb3IoCisgICAgICAgICAgICAiU3Vic2NyaXB0LnNsaWNlIGNhbm5vdCBiZSBpbmZlcnJlZCBhcyBhbiBhc3Ryb2lkLkNvbnN0IgorICAgICAgICApCisKKyAgICByZXR1cm4gaW5mZXJyZWQKZGlmZiAtLWdpdCBhL3B5bGludC9jaGVja2Vycy92YXJpYWJsZXMucHkgYi9weWxpbnQvY2hlY2tlcnMvdmFyaWFibGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZGFmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY2hlY2tlcnMvdmFyaWFibGVzLnB5CkBAIC0wLDAgKzEsMjE1MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAwOSBNYWRzIEtpaWxlcmljaCA8bWFkc0BraWlsZXJpY2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTAgRGFuaWVsIEhhcmRpbmcgPGRoYXJkaW5nQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIDIwMTcgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMiBGRUxEIEJvcmlzIDxsb3RoaXJhbGRhbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxMy0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFsIE5vd2lrb3dza2kgPGdvZGZyeWRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgUmljYXJkbyBHZW1pZ25hbmkgPHJpY2FyZG8uZ2VtaWduYW5pQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRG1pdHJ5IFByaWJ5c2ggPGRtYW5kQHlhbmRleC5ydT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFJhZHUgQ2lvcmJhIDxyYWR1QGRldnJhbmRvbS5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFNpbXUgVG9uaSA8c2ltdXRvbmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOC0yMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBKYWt1YiBXaWxrIDxqd2lsa0Bqd2lsay5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBHcmFudCBXZWxjaCA8Z3dlbGNoOTI1K2dpdGh1YkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE4LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IERhbiBHYXJyZXR0ZSA8ZGhnYXJyZXR0ZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IEppbSBSb2JlcnRzb24gPGpyb2JlcnRzb245OGF0eEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBNaWtlIE1pbGxlciA8bXRtaWxsZXJAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTHVjYXMgQ2ltb24gPGx1Y2FzLmNpbW9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IERyZXcgPGRyZXdyaXNpbmdlckB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEJyeWNlIEd1aW50YSA8YnJ5Y2UuZ3VpbnRhQHByb3Rvbm1haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1hcmlhbm5hIFBvbGF0b2dsb3UgPG1wb2xhdG9nbG91QGJsb29tYmVyZy5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxOCBtYXItY2hpLXBhbiA8bWFyLnBvbGF0b2dsb3VAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgRGphaWxsYSA8YmFzdGllbi52YWxsZXRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbmRyZXcgU2ltbW9ucyA8YW5qc2ltbW9AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW5kcmV3IFNpbW1vbnMgPGEuc2ltbW9uc0BkZWFraW4uZWR1LmF1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMCBBc2hsZXkgV2hldHRlciA8YXNobGV5d0BhY3RpdmVzdGF0ZS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBoYWFzZWEgPDQ0Nzg3NjUwK2hhYXNlYUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbGV4YW5kZXIgS2Fwc2h1bmEgPGthcHNoQGthcC5zaD4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJ2YXJpYWJsZXMgY2hlY2tlcnMgZm9yIFB5dGhvbiBjb2RlCisiIiIKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGNvcHkKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBvcworaW1wb3J0IHJlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgbHJ1X2NhY2hlCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlciwgdXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBpc19wb3N0cG9uZWRfZXZhbHVhdGlvbl9lbmFibGVkCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IFBZMzlfUExVUworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSElHSCwgSU5GRVJFTkNFLCBJTkZFUkVOQ0VfRkFJTFVSRSwgSUFzdHJvaWRDaGVja2VyCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgZ2V0X2dsb2JhbF9vcHRpb24KKworU1BFQ0lBTF9PQkogPSByZS5jb21waWxlKCJeX3syfVthLXpdK197Mn0kIikKK0ZVVFVSRSA9ICJfX2Z1dHVyZV9fIgorIyByZWdleHAgZm9yIGlnbm9yZWQgYXJndW1lbnQgbmFtZQorSUdOT1JFRF9BUkdVTUVOVF9OQU1FUyA9IHJlLmNvbXBpbGUoIl8uKnxeaWdub3JlZF98XnVudXNlZF8iKQorIyBJbiBQeXRob24gMy43IGFiYyBoYXMgYSBQeXRob24gaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgcHJlZmVycmVkCisjIGJ5IGFzdHJvaWQuIFVuZm9ydHVuYXRlbHkgdGhpcyBhbHNvIG1lc3NlcyB1cCBvdXIgZXhwbGljaXQgY2hlY2tzCisjIGZvciBgYWJjYAorTUVUQUNMQVNTX05BTUVfVFJBTlNGT1JNUyA9IHsiX3B5X2FiYyI6ICJhYmMifQorVFlQSU5HX1RZUEVfQ0hFQ0tTX0dVQVJEUyA9IGZyb3plbnNldCh7InR5cGluZy5UWVBFX0NIRUNLSU5HIiwgIlRZUEVfQ0hFQ0tJTkcifSkKK0JVSUxUSU5fUkFOR0UgPSAiYnVpbHRpbnMucmFuZ2UiCitUWVBJTkdfTU9EVUxFID0gInR5cGluZyIKK1RZUElOR19OQU1FUyA9IGZyb3plbnNldCgKKyAgICB7CisgICAgICAgICJBbnkiLAorICAgICAgICAiQ2FsbGFibGUiLAorICAgICAgICAiQ2xhc3NWYXIiLAorICAgICAgICAiR2VuZXJpYyIsCisgICAgICAgICJPcHRpb25hbCIsCisgICAgICAgICJUdXBsZSIsCisgICAgICAgICJUeXBlIiwKKyAgICAgICAgIlR5cGVWYXIiLAorICAgICAgICAiVW5pb24iLAorICAgICAgICAiQWJzdHJhY3RTZXQiLAorICAgICAgICAiQnl0ZVN0cmluZyIsCisgICAgICAgICJDb250YWluZXIiLAorICAgICAgICAiQ29udGV4dE1hbmFnZXIiLAorICAgICAgICAiSGFzaGFibGUiLAorICAgICAgICAiSXRlbXNWaWV3IiwKKyAgICAgICAgIkl0ZXJhYmxlIiwKKyAgICAgICAgIkl0ZXJhdG9yIiwKKyAgICAgICAgIktleXNWaWV3IiwKKyAgICAgICAgIk1hcHBpbmciLAorICAgICAgICAiTWFwcGluZ1ZpZXciLAorICAgICAgICAiTXV0YWJsZU1hcHBpbmciLAorICAgICAgICAiTXV0YWJsZVNlcXVlbmNlIiwKKyAgICAgICAgIk11dGFibGVTZXQiLAorICAgICAgICAiU2VxdWVuY2UiLAorICAgICAgICAiU2l6ZWQiLAorICAgICAgICAiVmFsdWVzVmlldyIsCisgICAgICAgICJBd2FpdGFibGUiLAorICAgICAgICAiQXN5bmNJdGVyYXRvciIsCisgICAgICAgICJBc3luY0l0ZXJhYmxlIiwKKyAgICAgICAgIkNvcm91dGluZSIsCisgICAgICAgICJDb2xsZWN0aW9uIiwKKyAgICAgICAgIkFzeW5jR2VuZXJhdG9yIiwKKyAgICAgICAgIkFzeW5jQ29udGV4dE1hbmFnZXIiLAorICAgICAgICAiUmV2ZXJzaWJsZSIsCisgICAgICAgICJTdXBwb3J0c0FicyIsCisgICAgICAgICJTdXBwb3J0c0J5dGVzIiwKKyAgICAgICAgIlN1cHBvcnRzQ29tcGxleCIsCisgICAgICAgICJTdXBwb3J0c0Zsb2F0IiwKKyAgICAgICAgIlN1cHBvcnRzSW50IiwKKyAgICAgICAgIlN1cHBvcnRzUm91bmQiLAorICAgICAgICAiQ291bnRlciIsCisgICAgICAgICJEZXF1ZSIsCisgICAgICAgICJEaWN0IiwKKyAgICAgICAgIkRlZmF1bHREaWN0IiwKKyAgICAgICAgIkxpc3QiLAorICAgICAgICAiU2V0IiwKKyAgICAgICAgIkZyb3plblNldCIsCisgICAgICAgICJOYW1lZFR1cGxlIiwKKyAgICAgICAgIkdlbmVyYXRvciIsCisgICAgICAgICJBbnlTdHIiLAorICAgICAgICAiVGV4dCIsCisgICAgICAgICJQYXR0ZXJuIiwKKyAgICAgICAgIkJpbmFyeUlPIiwKKyAgICB9CispCisKKworZGVmIF9pc19mcm9tX2Z1dHVyZV9pbXBvcnQoc3RtdCwgbmFtZSk6CisgICAgIiIiQ2hlY2sgaWYgdGhlIG5hbWUgaXMgYSBmdXR1cmUgaW1wb3J0IGZyb20gYW5vdGhlciBtb2R1bGUuIiIiCisgICAgdHJ5OgorICAgICAgICBtb2R1bGUgPSBzdG10LmRvX2ltcG9ydF9tb2R1bGUoc3RtdC5tb2RuYW1lKQorICAgIGV4Y2VwdCBhc3Ryb2lkLkFzdHJvaWRCdWlsZGluZ0V4Y2VwdGlvbjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGZvciBsb2NhbF9ub2RlIGluIG1vZHVsZS5sb2NhbHMuZ2V0KG5hbWUsIFtdKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShsb2NhbF9ub2RlLCBhc3Ryb2lkLkltcG9ydEZyb20pIGFuZCBsb2NhbF9ub2RlLm1vZG5hbWUgPT0gRlVUVVJFOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiBpbl9mb3JfZWxzZV9icmFuY2gocGFyZW50LCBzdG10KToKKyAgICAiIiJSZXR1cm5zIFRydWUgaWYgc3RtdCBpbiBpbnNpZGUgdGhlIGVsc2UgYnJhbmNoIGZvciBhIHBhcmVudCBGb3Igc3RtdC4iIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZShwYXJlbnQsIGFzdHJvaWQuRm9yKSBhbmQgYW55KAorICAgICAgICBlbHNlX3N0bXQucGFyZW50X29mKHN0bXQpIG9yIGVsc2Vfc3RtdCA9PSBzdG10IGZvciBlbHNlX3N0bXQgaW4gcGFyZW50Lm9yZWxzZQorICAgICkKKworCitAbHJ1X2NhY2hlKG1heHNpemU9MTAwMCkKK2RlZiBvdmVycmlkZGVuX21ldGhvZChrbGFzcywgbmFtZSk6CisgICAgIiIiZ2V0IG92ZXJyaWRkZW4gbWV0aG9kIGlmIGFueSIiIgorICAgIHRyeToKKyAgICAgICAgcGFyZW50ID0gbmV4dChrbGFzcy5sb2NhbF9hdHRyX2FuY2VzdG9ycyhuYW1lKSkKKyAgICBleGNlcHQgKFN0b3BJdGVyYXRpb24sIEtleUVycm9yKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0cnk6CisgICAgICAgIG1ldGhfbm9kZSA9IHBhcmVudFtuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgIyBXZSBoYXZlIGZvdW5kIGFuIGFuY2VzdG9yIGRlZmluaW5nIDxuYW1lPiBidXQgaXQncyBub3QgaW4gdGhlIGxvY2FsCisgICAgICAgICMgZGljdGlvbmFyeS4gVGhpcyBtYXkgaGFwcGVuIHdpdGggYXN0cm9pZCBidWlsdCBmcm9tIGxpdmluZyBvYmplY3RzLgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIGlzaW5zdGFuY2UobWV0aF9ub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgcmV0dXJuIG1ldGhfbm9kZQorICAgIHJldHVybiBOb25lCisKKworZGVmIF9nZXRfdW5wYWNraW5nX2V4dHJhX2luZm8obm9kZSwgaW5mZXJyZWQpOgorICAgICIiInJldHVybiBleHRyYSBpbmZvcm1hdGlvbiB0byBhZGQgdG8gdGhlIG1lc3NhZ2UgZm9yIHVucGFja2luZy1ub24tc2VxdWVuY2UKKyAgICBhbmQgdW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmcgZXJyb3JzCisgICAgIiIiCisgICAgbW9yZSA9ICIiCisgICAgaW5mZXJyZWRfbW9kdWxlID0gaW5mZXJyZWQucm9vdCgpLm5hbWUKKyAgICBpZiBub2RlLnJvb3QoKS5uYW1lID09IGluZmVycmVkX21vZHVsZToKKyAgICAgICAgaWYgbm9kZS5saW5lbm8gPT0gaW5mZXJyZWQubGluZW5vOgorICAgICAgICAgICAgbW9yZSA9ICIgJXMiICUgaW5mZXJyZWQuYXNfc3RyaW5nKCkKKyAgICAgICAgZWxpZiBpbmZlcnJlZC5saW5lbm86CisgICAgICAgICAgICBtb3JlID0gIiBkZWZpbmVkIGF0IGxpbmUgJXMiICUgaW5mZXJyZWQubGluZW5vCisgICAgZWxpZiBpbmZlcnJlZC5saW5lbm86CisgICAgICAgIG1vcmUgPSBmIiBkZWZpbmVkIGF0IGxpbmUge2luZmVycmVkLmxpbmVub30gb2Yge2luZmVycmVkX21vZHVsZX0iCisgICAgcmV0dXJuIG1vcmUKKworCitkZWYgX2RldGVjdF9nbG9iYWxfc2NvcGUobm9kZSwgZnJhbWUsIGRlZmZyYW1lKToKKyAgICAiIiJEZXRlY3QgdGhhdCB0aGUgZ2l2ZW4gZnJhbWVzIHNoYXJlcyBhIGdsb2JhbAorICAgIHNjb3BlLgorCisgICAgVHdvIGZyYW1lcyBzaGFyZXMgYSBnbG9iYWwgc2NvcGUgd2hlbiBuZWl0aGVyCisgICAgb2YgdGhlbSBhcmUgaGlkZGVuIHVuZGVyIGEgZnVuY3Rpb24gc2NvcGUsIGFzIHdlbGwKKyAgICBhcyBhbnkgb2YgcGFyZW50IHNjb3BlIG9mIHRoZW0sIHVudGlsIHRoZSByb290IHNjb3BlLgorICAgIEluIHRoaXMgY2FzZSwgZGVwZW5kaW5nIGZyb20gc29tZXRoaW5nIGRlZmluZWQgbGF0ZXIgb24KKyAgICB3aWxsIG5vdCB3b3JrLCBiZWNhdXNlIGl0IGlzIHN0aWxsIHVuZGVmaW5lZC4KKworICAgIEV4YW1wbGU6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAjIEIgaGFzIHRoZSBzYW1lIGdsb2JhbCBzY29wZSBhcyBgQ2AsIGxlYWRpbmcgdG8gYSBOYW1lRXJyb3IuCisgICAgICAgICAgICBjbGFzcyBCKEMpOiAuLi4KKyAgICAgICAgY2xhc3MgQzogLi4uCisKKyAgICAiIiIKKyAgICBkZWZfc2NvcGUgPSBzY29wZSA9IE5vbmUKKyAgICBpZiBmcmFtZSBhbmQgZnJhbWUucGFyZW50OgorICAgICAgICBzY29wZSA9IGZyYW1lLnBhcmVudC5zY29wZSgpCisgICAgaWYgZGVmZnJhbWUgYW5kIGRlZmZyYW1lLnBhcmVudDoKKyAgICAgICAgZGVmX3Njb3BlID0gZGVmZnJhbWUucGFyZW50LnNjb3BlKCkKKyAgICBpZiBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgIyBJZiB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgaXMgYQorICAgICAgICAjIGZ1bmN0aW9uLCB0aGVuIGl0IGNhbiBiZSB1bmRlciBpdHMgc2NvcGUKKyAgICAgICAgIyAoZGVmaW5lZCBpbiwgd2hpY2ggZG9lc24ndCBjb25jZXJuIHVzKSBvcgorICAgICAgICAjIHRoZSBgLT5gIHBhcnQgb2YgYW5ub3RhdGlvbnMuIFRoZSBzYW1lIGdvZXMKKyAgICAgICAgIyBmb3IgYW5ub3RhdGlvbnMgb2YgZnVuY3Rpb24gYXJndW1lbnRzLCB0aGV5J2xsIGhhdmUKKyAgICAgICAgIyB0aGVpciBwYXJlbnQgdGhlIEFyZ3VtZW50cyBub2RlLgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgKGFzdHJvaWQuRnVuY3Rpb25EZWYsIGFzdHJvaWQuQXJndW1lbnRzKSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbGlmIGFueSgKKyAgICAgICAgbm90IGlzaW5zdGFuY2UoZiwgKGFzdHJvaWQuQ2xhc3NEZWYsIGFzdHJvaWQuTW9kdWxlKSkgZm9yIGYgaW4gKGZyYW1lLCBkZWZmcmFtZSkKKyAgICApOgorICAgICAgICAjIE5vdCBpbnRlcmVzdGVkIGluIG90aGVyIGZyYW1lcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeQorICAgICAgICAjIG5vdCBpbiBhIGdsb2JhbCBzY29wZS4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBicmVha19zY29wZXMgPSBbXQorICAgIGZvciBjdXJyZW50X3Njb3BlIGluIChzY29wZSwgZGVmX3Njb3BlKToKKyAgICAgICAgIyBMb29rIGZvciBwYXJlbnQgc2NvcGVzLiBJZiB0aGVyZSBpcyBhbnl0aGluZyBkaWZmZXJlbnQKKyAgICAgICAgIyB0aGFuIGEgbW9kdWxlIG9yIGEgY2xhc3Mgc2NvcGUsIHRoZW4gdGhleSBmcmFtZXMgZG9uJ3QKKyAgICAgICAgIyBzaGFyZSBhIGdsb2JhbCBzY29wZS4KKyAgICAgICAgcGFyZW50X3Njb3BlID0gY3VycmVudF9zY29wZQorICAgICAgICB3aGlsZSBwYXJlbnRfc2NvcGU6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXJlbnRfc2NvcGUsIChhc3Ryb2lkLkNsYXNzRGVmLCBhc3Ryb2lkLk1vZHVsZSkpOgorICAgICAgICAgICAgICAgIGJyZWFrX3Njb3Blcy5hcHBlbmQocGFyZW50X3Njb3BlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBwYXJlbnRfc2NvcGUucGFyZW50OgorICAgICAgICAgICAgICAgIHBhcmVudF9zY29wZSA9IHBhcmVudF9zY29wZS5wYXJlbnQuc2NvcGUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgIGlmIGJyZWFrX3Njb3BlcyBhbmQgbGVuKHNldChicmVha19zY29wZXMpKSAhPSAxOgorICAgICAgICAjIFN0b3JlIGRpZmZlcmVudCBzY29wZXMgdGhhbiBleHBlY3RlZC4KKyAgICAgICAgIyBJZiB0aGUgc3RvcmVkIHNjb3BlcyBhcmUsIGluIGZhY3QsIHRoZSB2ZXJ5IHNhbWUsIHRoZW4gaXQgbWVhbnMKKyAgICAgICAgIyB0aGF0IHRoZSB0d28gZnJhbWVzIChmcmFtZSBhbmQgZGVmZnJhbWUpIHNoYXJlcyB0aGUgc2FtZSBzY29wZSwKKyAgICAgICAgIyBhbmQgd2UgY291bGQgYXBwbHkgb3VyIGxpbmVubyBhbmFseXNpcyBvdmVyIHRoZW0uCisgICAgICAgICMgRm9yIGluc3RhbmNlLCB0aGlzIHdvcmtzIHdoZW4gdGhleSBhcmUgaW5zaWRlIGEgZnVuY3Rpb24sIHRoZSBub2RlCisgICAgICAgICMgdGhhdCB1c2VzIGEgZGVmaW5pdGlvbiBhbmQgdGhlIGRlZmluaXRpb24gaXRzZWxmLgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjIEF0IHRoaXMgcG9pbnQsIHdlIGFyZSBjZXJ0YWluIHRoYXQgZnJhbWUgYW5kIGRlZmZyYW1lIHNoYXJlcyBhIHNjb3BlCisgICAgIyBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZpcnN0IGRlcGVuZHMgb24gdGhlIHNlY29uZC4KKyAgICByZXR1cm4gZnJhbWUubGluZW5vIDwgZGVmZnJhbWUubGluZW5vCisKKworZGVmIF9pbmZlcl9uYW1lX21vZHVsZShub2RlLCBuYW1lKToKKyAgICBjb250ZXh0ID0gYXN0cm9pZC5jb250ZXh0LkluZmVyZW5jZUNvbnRleHQoKQorICAgIGNvbnRleHQubG9va3VwbmFtZSA9IG5hbWUKKyAgICByZXR1cm4gbm9kZS5pbmZlcihjb250ZXh0LCBhc25hbWU9RmFsc2UpCisKKworZGVmIF9maXhfZG90X2ltcG9ydHMobm90X2NvbnN1bWVkKToKKyAgICAiIiJUcnkgdG8gZml4IGltcG9ydHMgd2l0aCBtdWx0aXBsZSBkb3RzLCBieSByZXR1cm5pbmcgYSBkaWN0aW9uYXJ5CisgICAgd2l0aCB0aGUgaW1wb3J0IG5hbWVzIGV4cGFuZGVkLiBUaGUgZnVuY3Rpb24gdW5mbGF0dGVucyByb290IGltcG9ydHMsCisgICAgbGlrZSAneG1sJyAod2hlbiB3ZSBoYXZlIGJvdGggJ3htbC5ldHJlZScgYW5kICd4bWwuc2F4JyksIHRvICd4bWwuZXRyZWUnCisgICAgYW5kICd4bWwuc2F4JyByZXNwZWN0aXZlbHkuCisgICAgIiIiCisgICAgbmFtZXMgPSB7fQorICAgIGZvciBuYW1lLCBzdG10cyBpbiBub3RfY29uc3VtZWQuaXRlbXMoKToKKyAgICAgICAgaWYgYW55KAorICAgICAgICAgICAgaXNpbnN0YW5jZShzdG10LCBhc3Ryb2lkLkFzc2lnbk5hbWUpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzdG10LmFzc2lnbl90eXBlKCksIGFzdHJvaWQuQXVnQXNzaWduKQorICAgICAgICAgICAgZm9yIHN0bXQgaW4gc3RtdHMKKyAgICAgICAgKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBzdG10IGluIHN0bXRzOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3RtdCwgKGFzdHJvaWQuSW1wb3J0RnJvbSwgYXN0cm9pZC5JbXBvcnQpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGltcG9ydHMgaW4gc3RtdC5uYW1lczoKKyAgICAgICAgICAgICAgICBzZWNvbmRfbmFtZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpbXBvcnRfbW9kdWxlX25hbWUgPSBpbXBvcnRzWzBdCisgICAgICAgICAgICAgICAgaWYgaW1wb3J0X21vZHVsZV9uYW1lID09ICIqIjoKKyAgICAgICAgICAgICAgICAgICAgIyBJbiBjYXNlIG9mIHdpbGRjYXJkIGltcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICMgcGljayB0aGUgbmFtZSBmcm9tIGluc2lkZSB0aGUgaW1wb3J0ZWQgbW9kdWxlLgorICAgICAgICAgICAgICAgICAgICBzZWNvbmRfbmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuYW1lX21hdGNoZXNfZG90dGVkX2ltcG9ydCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9tb2R1bGVfbmFtZS5zdGFydHN3aXRoKG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaW1wb3J0X21vZHVsZV9uYW1lLmZpbmQoIi4iKSA+IC0xCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX21hdGNoZXNfZG90dGVkX2ltcG9ydCA9IFRydWUKKworICAgICAgICAgICAgICAgICAgICBpZiBuYW1lX21hdGNoZXNfZG90dGVkX2ltcG9ydCBvciBuYW1lIGluIGltcG9ydHM6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE1vc3QgbGlrZWx5IHNvbWV0aGluZyBsaWtlICd4bWwuZXRyZWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGljaCB3aWxsIGFwcGVhciBpbiB0aGUgLmxvY2FscyBhcyAneG1sJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgT25seSBwaWNrIHRoZSBuYW1lIGlmIGl0IHdhc24ndCBjb25zdW1lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9uYW1lID0gaW1wb3J0X21vZHVsZV9uYW1lCisgICAgICAgICAgICAgICAgaWYgc2Vjb25kX25hbWUgYW5kIHNlY29uZF9uYW1lIG5vdCBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNbc2Vjb25kX25hbWVdID0gc3RtdAorICAgIHJldHVybiBzb3J0ZWQobmFtZXMuaXRlbXMoKSwga2V5PWxhbWJkYSBhOiBhWzFdLmZyb21saW5lbm8pCisKKworZGVmIF9maW5kX2ZyYW1lX2ltcG9ydHMobmFtZSwgZnJhbWUpOgorICAgICIiIgorICAgIERldGVjdCBpbXBvcnRzIGluIHRoZSBmcmFtZSwgd2l0aCB0aGUgcmVxdWlyZWQKKyAgICAqbmFtZSouIFN1Y2ggaW1wb3J0cyBjYW4gYmUgY29uc2lkZXJlZCBhc3NpZ25tZW50cy4KKyAgICBSZXR1cm5zIFRydWUgaWYgYW4gaW1wb3J0IGZvciB0aGUgZ2l2ZW4gbmFtZSB3YXMgZm91bmQuCisgICAgIiIiCisgICAgaW1wb3J0cyA9IGZyYW1lLm5vZGVzX29mX2NsYXNzKChhc3Ryb2lkLkltcG9ydCwgYXN0cm9pZC5JbXBvcnRGcm9tKSkKKyAgICBmb3IgaW1wb3J0X25vZGUgaW4gaW1wb3J0czoKKyAgICAgICAgZm9yIGltcG9ydF9uYW1lLCBpbXBvcnRfYWxpYXMgaW4gaW1wb3J0X25vZGUubmFtZXM6CisgICAgICAgICAgICAjIElmIHRoZSBpbXBvcnQgdXNlcyBhbiBhbGlhcywgY2hlY2sgb25seSB0aGF0LgorICAgICAgICAgICAgIyBPdGhlcndpc2UsIGNoZWNrIG9ubHkgdGhlIGltcG9ydCBuYW1lLgorICAgICAgICAgICAgaWYgaW1wb3J0X2FsaWFzOgorICAgICAgICAgICAgICAgIGlmIGltcG9ydF9hbGlhcyA9PSBuYW1lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxpZiBpbXBvcnRfbmFtZSBhbmQgaW1wb3J0X25hbWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBOb25lCisKKworZGVmIF9pbXBvcnRfbmFtZV9pc19nbG9iYWwoc3RtdCwgZ2xvYmFsX25hbWVzKToKKyAgICBmb3IgaW1wb3J0X25hbWUsIGltcG9ydF9hbGlhcyBpbiBzdG10Lm5hbWVzOgorICAgICAgICAjIElmIHRoZSBpbXBvcnQgdXNlcyBhbiBhbGlhcywgY2hlY2sgb25seSB0aGF0LgorICAgICAgICAjIE90aGVyd2lzZSwgY2hlY2sgb25seSB0aGUgaW1wb3J0IG5hbWUuCisgICAgICAgIGlmIGltcG9ydF9hbGlhczoKKyAgICAgICAgICAgIGlmIGltcG9ydF9hbGlhcyBpbiBnbG9iYWxfbmFtZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxpZiBpbXBvcnRfbmFtZSBpbiBnbG9iYWxfbmFtZXM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBfZmxhdHRlbmVkX3Njb3BlX25hbWVzKGl0ZXJhdG9yKToKKyAgICB2YWx1ZXMgPSAoc2V0KHN0bXQubmFtZXMpIGZvciBzdG10IGluIGl0ZXJhdG9yKQorICAgIHJldHVybiBzZXQoaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUodmFsdWVzKSkKKworCitkZWYgX2Fzc2lnbmVkX2xvY2FsbHkobmFtZV9ub2RlKToKKyAgICAiIiIKKyAgICBDaGVja3MgaWYgbmFtZV9ub2RlIGhhcyBjb3JyZXNwb25kaW5nIGFzc2lnbiBzdGF0ZW1lbnQgaW4gc2FtZSBzY29wZQorICAgICIiIgorICAgIGFzc2lnbl9zdG10cyA9IG5hbWVfbm9kZS5zY29wZSgpLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICByZXR1cm4gYW55KGEubmFtZSA9PSBuYW1lX25vZGUubmFtZSBmb3IgYSBpbiBhc3NpZ25fc3RtdHMpCisKKworZGVmIF9pc190eXBlX2NoZWNraW5nX2ltcG9ydChub2RlKToKKyAgICBwYXJlbnQgPSBub2RlLnBhcmVudAorICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhcmVudCwgYXN0cm9pZC5JZik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHRlc3QgPSBwYXJlbnQudGVzdAorICAgIHJldHVybiB0ZXN0LmFzX3N0cmluZygpIGluIFRZUElOR19UWVBFX0NIRUNLU19HVUFSRFMKKworCitkZWYgX2hhc19sb2NhbHNfY2FsbF9hZnRlcl9ub2RlKHN0bXQsIHNjb3BlKToKKyAgICBza2lwX25vZGVzID0gKAorICAgICAgICBhc3Ryb2lkLkZ1bmN0aW9uRGVmLAorICAgICAgICBhc3Ryb2lkLkNsYXNzRGVmLAorICAgICAgICBhc3Ryb2lkLkltcG9ydCwKKyAgICAgICAgYXN0cm9pZC5JbXBvcnRGcm9tLAorICAgICkKKyAgICBmb3IgY2FsbCBpbiBzY29wZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkNhbGwsIHNraXBfa2xhc3M9c2tpcF9ub2Rlcyk6CisgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihjYWxsLmZ1bmMpCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIHV0aWxzLmlzX2J1aWx0aW5fb2JqZWN0KGluZmVycmVkKQorICAgICAgICAgICAgYW5kIGdldGF0dHIoaW5mZXJyZWQsICJuYW1lIiwgTm9uZSkgPT0gImxvY2FscyIKKyAgICAgICAgKToKKyAgICAgICAgICAgIGlmIHN0bXQubGluZW5vIDwgY2FsbC5saW5lbm86CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitNU0dTID0geworICAgICJFMDYwMSI6ICgKKyAgICAgICAgIlVzaW5nIHZhcmlhYmxlICVyIGJlZm9yZSBhc3NpZ25tZW50IiwKKyAgICAgICAgInVzZWQtYmVmb3JlLWFzc2lnbm1lbnQiLAorICAgICAgICAiVXNlZCB3aGVuIGEgbG9jYWwgdmFyaWFibGUgaXMgYWNjZXNzZWQgYmVmb3JlIGl0cyBhc3NpZ25tZW50LiIsCisgICAgKSwKKyAgICAiRTA2MDIiOiAoCisgICAgICAgICJVbmRlZmluZWQgdmFyaWFibGUgJXIiLAorICAgICAgICAidW5kZWZpbmVkLXZhcmlhYmxlIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiB1bmRlZmluZWQgdmFyaWFibGUgaXMgYWNjZXNzZWQuIiwKKyAgICApLAorICAgICJFMDYwMyI6ICgKKyAgICAgICAgIlVuZGVmaW5lZCB2YXJpYWJsZSBuYW1lICVyIGluIF9fYWxsX18iLAorICAgICAgICAidW5kZWZpbmVkLWFsbC12YXJpYWJsZSIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gdW5kZWZpbmVkIHZhcmlhYmxlIG5hbWUgaXMgcmVmZXJlbmNlZCBpbiBfX2FsbF9fLiIsCisgICAgKSwKKyAgICAiRTA2MDQiOiAoCisgICAgICAgICJJbnZhbGlkIG9iamVjdCAlciBpbiBfX2FsbF9fLCBtdXN0IGNvbnRhaW4gb25seSBzdHJpbmdzIiwKKyAgICAgICAgImludmFsaWQtYWxsLW9iamVjdCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW52YWxpZCAobm9uLXN0cmluZykgb2JqZWN0IG9jY3VycyBpbiBfX2FsbF9fLiIsCisgICAgKSwKKyAgICAiRTA2MDUiOiAoCisgICAgICAgICJJbnZhbGlkIGZvcm1hdCBmb3IgX19hbGxfXywgbXVzdCBiZSB0dXBsZSBvciBsaXN0IiwKKyAgICAgICAgImludmFsaWQtYWxsLWZvcm1hdCIsCisgICAgICAgICJVc2VkIHdoZW4gX19hbGxfXyBoYXMgYW4gaW52YWxpZCBmb3JtYXQuIiwKKyAgICApLAorICAgICJFMDYxMSI6ICgKKyAgICAgICAgIk5vIG5hbWUgJXIgaW4gbW9kdWxlICVyIiwKKyAgICAgICAgIm5vLW5hbWUtaW4tbW9kdWxlIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIG5hbWUgY2Fubm90IGJlIGZvdW5kIGluIGEgbW9kdWxlLiIsCisgICAgKSwKKyAgICAiVzA2MDEiOiAoCisgICAgICAgICJHbG9iYWwgdmFyaWFibGUgJXIgdW5kZWZpbmVkIGF0IHRoZSBtb2R1bGUgbGV2ZWwiLAorICAgICAgICAiZ2xvYmFsLXZhcmlhYmxlLXVuZGVmaW5lZCIsCisgICAgICAgICdVc2VkIHdoZW4gYSB2YXJpYWJsZSBpcyBkZWZpbmVkIHRocm91Z2ggdGhlICJnbG9iYWwiIHN0YXRlbWVudCAnCisgICAgICAgICJidXQgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBtb2R1bGUgc2NvcGUuIiwKKyAgICApLAorICAgICJXMDYwMiI6ICgKKyAgICAgICAgIlVzaW5nIGdsb2JhbCBmb3IgJXIgYnV0IG5vIGFzc2lnbm1lbnQgaXMgZG9uZSIsCisgICAgICAgICJnbG9iYWwtdmFyaWFibGUtbm90LWFzc2lnbmVkIiwKKyAgICAgICAgJ1VzZWQgd2hlbiBhIHZhcmlhYmxlIGlzIGRlZmluZWQgdGhyb3VnaCB0aGUgImdsb2JhbCIgc3RhdGVtZW50ICcKKyAgICAgICAgImJ1dCBubyBhc3NpZ25tZW50IHRvIHRoaXMgdmFyaWFibGUgaXMgZG9uZS4iLAorICAgICksCisgICAgIlcwNjAzIjogKAorICAgICAgICAiVXNpbmcgdGhlIGdsb2JhbCBzdGF0ZW1lbnQiLCAgIyBXMDEyMQorICAgICAgICAiZ2xvYmFsLXN0YXRlbWVudCIsCisgICAgICAgICdVc2VkIHdoZW4geW91IHVzZSB0aGUgImdsb2JhbCIgc3RhdGVtZW50IHRvIHVwZGF0ZSBhIGdsb2JhbCAnCisgICAgICAgICJ2YXJpYWJsZS4gUHlsaW50IGp1c3QgdHJ5IHRvIGRpc2NvdXJhZ2UgdGhpcyAiCisgICAgICAgICJ1c2FnZS4gVGhhdCBkb2Vzbid0IG1lYW4geW91IGNhbm5vdCB1c2UgaXQgISIsCisgICAgKSwKKyAgICAiVzA2MDQiOiAoCisgICAgICAgICJVc2luZyB0aGUgZ2xvYmFsIHN0YXRlbWVudCBhdCB0aGUgbW9kdWxlIGxldmVsIiwgICMgVzAxMDMKKyAgICAgICAgImdsb2JhbC1hdC1tb2R1bGUtbGV2ZWwiLAorICAgICAgICAnVXNlZCB3aGVuIHlvdSB1c2UgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBhdCB0aGUgbW9kdWxlIGxldmVsICcKKyAgICAgICAgInNpbmNlIGl0IGhhcyBubyBlZmZlY3QiLAorICAgICksCisgICAgIlcwNjExIjogKAorICAgICAgICAiVW51c2VkICVzIiwKKyAgICAgICAgInVudXNlZC1pbXBvcnQiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGltcG9ydGVkIG1vZHVsZSBvciB2YXJpYWJsZSBpcyBub3QgdXNlZC4iLAorICAgICksCisgICAgIlcwNjEyIjogKAorICAgICAgICAiVW51c2VkIHZhcmlhYmxlICVyIiwKKyAgICAgICAgInVudXNlZC12YXJpYWJsZSIsCisgICAgICAgICJVc2VkIHdoZW4gYSB2YXJpYWJsZSBpcyBkZWZpbmVkIGJ1dCBub3QgdXNlZC4iLAorICAgICksCisgICAgIlcwNjEzIjogKAorICAgICAgICAiVW51c2VkIGFyZ3VtZW50ICVyIiwKKyAgICAgICAgInVudXNlZC1hcmd1bWVudCIsCisgICAgICAgICJVc2VkIHdoZW4gYSBmdW5jdGlvbiBvciBtZXRob2QgYXJndW1lbnQgaXMgbm90IHVzZWQuIiwKKyAgICApLAorICAgICJXMDYxNCI6ICgKKyAgICAgICAgIlVudXNlZCBpbXBvcnQgJXMgZnJvbSB3aWxkY2FyZCBpbXBvcnQiLAorICAgICAgICAidW51c2VkLXdpbGRjYXJkLWltcG9ydCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gaW1wb3J0ZWQgbW9kdWxlIG9yIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGZyb20gYSAiCisgICAgICAgICJgJ2Zyb20gWCBpbXBvcnQgKidgIHN0eWxlIGltcG9ydC4iLAorICAgICksCisgICAgIlcwNjIxIjogKAorICAgICAgICAiUmVkZWZpbmluZyBuYW1lICVyIGZyb20gb3V0ZXIgc2NvcGUgKGxpbmUgJXMpIiwKKyAgICAgICAgInJlZGVmaW5lZC1vdXRlci1uYW1lIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhIHZhcmlhYmxlJ3MgbmFtZSBoaWRlcyBhIG5hbWUgZGVmaW5lZCBpbiB0aGUgb3V0ZXIgc2NvcGUuIiwKKyAgICApLAorICAgICJXMDYyMiI6ICgKKyAgICAgICAgIlJlZGVmaW5pbmcgYnVpbHQtaW4gJXIiLAorICAgICAgICAicmVkZWZpbmVkLWJ1aWx0aW4iLAorICAgICAgICAiVXNlZCB3aGVuIGEgdmFyaWFibGUgb3IgZnVuY3Rpb24gb3ZlcnJpZGUgYSBidWlsdC1pbi4iLAorICAgICksCisgICAgIlcwNjMxIjogKAorICAgICAgICAiVXNpbmcgcG9zc2libHkgdW5kZWZpbmVkIGxvb3AgdmFyaWFibGUgJXIiLAorICAgICAgICAidW5kZWZpbmVkLWxvb3AtdmFyaWFibGUiLAorICAgICAgICAiVXNlZCB3aGVuIGEgbG9vcCB2YXJpYWJsZSAoaS5lLiBkZWZpbmVkIGJ5IGEgZm9yIGxvb3Agb3IgIgorICAgICAgICAiYSBsaXN0IGNvbXByZWhlbnNpb24gb3IgYSBnZW5lcmF0b3IgZXhwcmVzc2lvbikgaXMgdXNlZCBvdXRzaWRlICIKKyAgICAgICAgInRoZSBsb29wLiIsCisgICAgKSwKKyAgICAiVzA2MzIiOiAoCisgICAgICAgICJQb3NzaWJsZSB1bmJhbGFuY2VkIHR1cGxlIHVucGFja2luZyB3aXRoICIKKyAgICAgICAgInNlcXVlbmNlJXM6ICIKKyAgICAgICAgImxlZnQgc2lkZSBoYXMgJWQgbGFiZWwocyksIHJpZ2h0IHNpZGUgaGFzICVkIHZhbHVlKHMpIiwKKyAgICAgICAgInVuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nIiwKKyAgICAgICAgIlVzZWQgd2hlbiB0aGVyZSBpcyBhbiB1bmJhbGFuY2VkIHR1cGxlIHVucGFja2luZyBpbiBhc3NpZ25tZW50IiwKKyAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJFMDYzMiIsICJvbGQtdW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmciKV19LAorICAgICksCisgICAgIkUwNjMzIjogKAorICAgICAgICAiQXR0ZW1wdGluZyB0byB1bnBhY2sgYSBub24tc2VxdWVuY2UlcyIsCisgICAgICAgICJ1bnBhY2tpbmctbm9uLXNlcXVlbmNlIiwKKyAgICAgICAgIlVzZWQgd2hlbiBzb21ldGhpbmcgd2hpY2ggaXMgbm90ICIKKyAgICAgICAgImEgc2VxdWVuY2UgaXMgdXNlZCBpbiBhbiB1bnBhY2sgYXNzaWdubWVudCIsCisgICAgICAgIHsib2xkX25hbWVzIjogWygiVzA2MzMiLCAib2xkLXVucGFja2luZy1ub24tc2VxdWVuY2UiKV19LAorICAgICksCisgICAgIlcwNjQwIjogKAorICAgICAgICAiQ2VsbCB2YXJpYWJsZSAlcyBkZWZpbmVkIGluIGxvb3AiLAorICAgICAgICAiY2VsbC12YXItZnJvbS1sb29wIiwKKyAgICAgICAgIkEgdmFyaWFibGUgdXNlZCBpbiBhIGNsb3N1cmUgaXMgZGVmaW5lZCBpbiBhIGxvb3AuICIKKyAgICAgICAgIlRoaXMgd2lsbCByZXN1bHQgaW4gYWxsIGNsb3N1cmVzIHVzaW5nIHRoZSBzYW1lIHZhbHVlIGZvciAiCisgICAgICAgICJ0aGUgY2xvc2VkLW92ZXIgdmFyaWFibGUuIiwKKyAgICApLAorICAgICJXMDY0MSI6ICgKKyAgICAgICAgIlBvc3NpYmx5IHVudXNlZCB2YXJpYWJsZSAlciIsCisgICAgICAgICJwb3NzaWJseS11bnVzZWQtdmFyaWFibGUiLAorICAgICAgICAiVXNlZCB3aGVuIGEgdmFyaWFibGUgaXMgZGVmaW5lZCBidXQgbWlnaHQgbm90IGJlIHVzZWQuICIKKyAgICAgICAgIlRoZSBwb3NzaWJpbGl0eSBjb21lcyBmcm9tIHRoZSBmYWN0IHRoYXQgbG9jYWxzKCkgbWlnaHQgYmUgdXNlZCwgIgorICAgICAgICAid2hpY2ggY291bGQgY29uc3VtZSBvciBub3QgdGhlIHNhaWQgdmFyaWFibGUiLAorICAgICksCisgICAgIlcwNjQyIjogKAorICAgICAgICAiSW52YWxpZCBhc3NpZ25tZW50IHRvICVzIGluIG1ldGhvZCIsCisgICAgICAgICJzZWxmLWNscy1hc3NpZ25tZW50IiwKKyAgICAgICAgIkludmFsaWQgYXNzaWdubWVudCB0byBzZWxmIG9yIGNscyBpbiBpbnN0YW5jZSBvciBjbGFzcyBtZXRob2QgIgorICAgICAgICAicmVzcGVjdGl2ZWx5LiIsCisgICAgKSwKK30KKworCitTY29wZUNvbnN1bWVyID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgKKyAgICAiU2NvcGVDb25zdW1lciIsICJ0b19jb25zdW1lIGNvbnN1bWVkIHNjb3BlX3R5cGUiCispCisKKworY2xhc3MgTmFtZXNDb25zdW1lcjoKKyAgICAiIiIKKyAgICBBIHNpbXBsZSBjbGFzcyB0byBoYW5kbGUgY29uc3VtZWQsIHRvIGNvbnN1bWUgYW5kIHNjb3BlIHR5cGUgaW5mbyBvZiBub2RlIGxvY2FscworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUsIHNjb3BlX3R5cGUpOgorICAgICAgICBzZWxmLl9hdG9taWMgPSBTY29wZUNvbnN1bWVyKGNvcHkuY29weShub2RlLmxvY2FscyksIHt9LCBzY29wZV90eXBlKQorICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHRvX2NvbnN1bWVzID0gW2Yie2t9LT57dn0iIGZvciBrLCB2IGluIHNlbGYuX2F0b21pYy50b19jb25zdW1lLml0ZW1zKCldCisgICAgICAgIGNvbnN1bWVkID0gW2Yie2t9LT57dn0iIGZvciBrLCB2IGluIHNlbGYuX2F0b21pYy5jb25zdW1lZC5pdGVtcygpXQorICAgICAgICB0b19jb25zdW1lcyA9ICIsICIuam9pbih0b19jb25zdW1lcykKKyAgICAgICAgY29uc3VtZWQgPSAiLCAiLmpvaW4oY29uc3VtZWQpCisgICAgICAgIHJldHVybiBmIiIiCit0b19jb25zdW1lIDoge3RvX2NvbnN1bWVzfQorY29uc3VtZWQgOiB7Y29uc3VtZWR9CitzY29wZV90eXBlIDoge3NlbGYuX2F0b21pYy5zY29wZV90eXBlfQorIiIiCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX2F0b21pYykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0b19jb25zdW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXRvbWljLnRvX2NvbnN1bWUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb25zdW1lZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0b21pYy5jb25zdW1lZAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNjb3BlX3R5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdG9taWMuc2NvcGVfdHlwZQorCisgICAgZGVmIG1hcmtfYXNfY29uc3VtZWQoc2VsZiwgbmFtZSwgbmV3X25vZGUpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFyayB0aGUgbmFtZSBhcyBjb25zdW1lZCBhbmQgZGVsZXRlIGl0IGZyb20KKyAgICAgICAgdGhlIHRvX2NvbnN1bWUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jb25zdW1lZFtuYW1lXSA9IG5ld19ub2RlCisgICAgICAgIGRlbCBzZWxmLnRvX2NvbnN1bWVbbmFtZV0KKworICAgIGRlZiBnZXRfbmV4dF90b19jb25zdW1lKHNlbGYsIG5vZGUpOgorICAgICAgICAjIEdldCB0aGUgZGVmaW5pdGlvbiBvZiBgbm9kZWAgZnJvbSB0aGlzIHNjb3BlCisgICAgICAgIG5hbWUgPSBub2RlLm5hbWUKKyAgICAgICAgcGFyZW50X25vZGUgPSBub2RlLnBhcmVudAorICAgICAgICBmb3VuZF9ub2RlID0gc2VsZi50b19jb25zdW1lLmdldChuYW1lKQorICAgICAgICBpZiAoCisgICAgICAgICAgICBmb3VuZF9ub2RlCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShwYXJlbnRfbm9kZSwgYXN0cm9pZC5Bc3NpZ24pCisgICAgICAgICAgICBhbmQgcGFyZW50X25vZGUgPT0gZm91bmRfbm9kZVswXS5wYXJlbnQKKyAgICAgICAgKToKKyAgICAgICAgICAgIGxocyA9IGZvdW5kX25vZGVbMF0ucGFyZW50LnRhcmdldHNbMF0KKyAgICAgICAgICAgIGlmIGxocy5uYW1lID09IG5hbWU6ICAjIHRoaXMgbmFtZSBpcyBkZWZpbmVkIGluIHRoaXMgdmVyeSBzdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICBmb3VuZF9ub2RlID0gTm9uZQorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGZvdW5kX25vZGUKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHBhcmVudF9ub2RlLCBhc3Ryb2lkLkZvcikKKyAgICAgICAgICAgIGFuZCBwYXJlbnRfbm9kZS5pdGVyID09IG5vZGUKKyAgICAgICAgICAgIGFuZCBwYXJlbnRfbm9kZS50YXJnZXQgaW4gZm91bmRfbm9kZQorICAgICAgICApOgorICAgICAgICAgICAgZm91bmRfbm9kZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGZvdW5kX25vZGUKKworCisjIHB5bGludDogZGlzYWJsZT10b28tbWFueS1wdWJsaWMtbWV0aG9kcworY2xhc3MgVmFyaWFibGVzQ2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgIiIiY2hlY2tzIGZvcgorICAgICogdW51c2VkIHZhcmlhYmxlcyAvIGltcG9ydHMKKyAgICAqIHVuZGVmaW5lZCB2YXJpYWJsZXMKKyAgICAqIHJlZGVmaW5pdGlvbiBvZiB2YXJpYWJsZSBmcm9tIGJ1aWx0aW5zIG9yIGZyb20gYW4gb3V0ZXIgc2NvcGUKKyAgICAqIHVzZSBvZiB2YXJpYWJsZSBiZWZvcmUgYXNzaWdubWVudAorICAgICogX19hbGxfXyBjb25zaXN0ZW5jeQorICAgICogc2VsZi9jbHMgYXNzaWdubWVudAorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJQXN0cm9pZENoZWNrZXIKKworICAgIG5hbWUgPSAidmFyaWFibGVzIgorICAgIG1zZ3MgPSBNU0dTCisgICAgcHJpb3JpdHkgPSAtMQorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJpbml0LWltcG9ydCIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAwLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiVGVsbHMgd2hldGhlciB3ZSBzaG91bGQgY2hlY2sgZm9yIHVudXNlZCBpbXBvcnQgaW4gIgorICAgICAgICAgICAgICAgICJfX2luaXRfXyBmaWxlcy4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImR1bW15LXZhcmlhYmxlcy1yZ3giLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIl8rJHwoX1thLXpBLVowLTlfXSpbYS16QS1aMC05XSs/JCl8ZHVtbXl8Xmlnbm9yZWRffF51bnVzZWRfIiwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJyZWdleHAiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxyZWdleHA+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyB0aGUgbmFtZSBvZiBkdW1teSAiCisgICAgICAgICAgICAgICAgInZhcmlhYmxlcyAoaS5lLiBleHBlY3RlZCB0byBub3QgYmUgdXNlZCkuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJhZGRpdGlvbmFsLWJ1aWx0aW5zIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgpLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGNvbW1hIHNlcGFyYXRlZCBsaXN0PiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBhZGRpdGlvbmFsIG5hbWVzIHN1cHBvc2VkIHRvIGJlIGRlZmluZWQgaW4gIgorICAgICAgICAgICAgICAgICJidWlsdGlucy4gUmVtZW1iZXIgdGhhdCB5b3Ugc2hvdWxkIGF2b2lkIGRlZmluaW5nIG5ldyBidWlsdGlucyAiCisgICAgICAgICAgICAgICAgIndoZW4gcG9zc2libGUuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJjYWxsYmFja3MiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogKCJjYl8iLCAiX2NiIiksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8Y2FsbGJhY2tzPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBzdHJpbmdzIHdoaWNoIGNhbiBpZGVudGlmeSBhIGNhbGxiYWNrICIKKyAgICAgICAgICAgICAgICAiZnVuY3Rpb24gYnkgbmFtZS4gQSBjYWxsYmFjayBuYW1lIG11c3Qgc3RhcnQgb3IgIgorICAgICAgICAgICAgICAgICJlbmQgd2l0aCBvbmUgb2YgdGhvc2Ugc3RyaW5ncy4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgInJlZGVmaW5pbmctYnVpbHRpbnMtbW9kdWxlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoCisgICAgICAgICAgICAgICAgICAgICJzaXgubW92ZXMiLAorICAgICAgICAgICAgICAgICAgICAicGFzdC5idWlsdGlucyIsCisgICAgICAgICAgICAgICAgICAgICJmdXR1cmUuYnVpbHRpbnMiLAorICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbnMiLAorICAgICAgICAgICAgICAgICAgICAiaW8iLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgInR5cGUiOiAiY3N2IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8Y29tbWEgc2VwYXJhdGVkIGxpc3Q+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJMaXN0IG9mIHF1YWxpZmllZCBtb2R1bGUgbmFtZXMgd2hpY2ggY2FuIGhhdmUgb2JqZWN0cyAiCisgICAgICAgICAgICAgICAgInRoYXQgY2FuIHJlZGVmaW5lIGJ1aWx0aW5zLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiaWdub3JlZC1hcmd1bWVudC1uYW1lcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBJR05PUkVEX0FSR1VNRU5UX05BTUVTLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInJlZ2V4cCIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHJlZ2V4cD4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIkFyZ3VtZW50IG5hbWVzIHRoYXQgbWF0Y2ggdGhpcyBleHByZXNzaW9uIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICJpZ25vcmVkLiBEZWZhdWx0IHRvIG5hbWUgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmUuIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICJhbGxvdy1nbG9iYWwtdW51c2VkLXZhcmlhYmxlcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBUcnVlLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiVGVsbHMgd2hldGhlciB1bnVzZWQgZ2xvYmFsIHZhcmlhYmxlcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHZpb2xhdGlvbi4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImFsbG93ZWQtcmVkZWZpbmVkLWJ1aWx0aW5zIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgpLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGNvbW1hIHNlcGFyYXRlZCBsaXN0PiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTGlzdCBvZiBuYW1lcyBhbGxvd2VkIHRvIHNoYWRvdyBidWlsdGlucyIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXI9Tm9uZSk6CisgICAgICAgIEJhc2VDaGVja2VyLl9faW5pdF9fKHNlbGYsIGxpbnRlcikKKyAgICAgICAgc2VsZi5fdG9fY29uc3VtZSA9ICgKKyAgICAgICAgICAgIE5vbmUgICMgbGlzdCBvZiB0dXBsZXM6ICh0b19jb25zdW1lOmRpY3QsIGNvbnN1bWVkOmRpY3QsIHNjb3BlX3R5cGU6c3RyKQorICAgICAgICApCisgICAgICAgIHNlbGYuX2NoZWNraW5nX21vZF9hdHRyID0gTm9uZQorICAgICAgICBzZWxmLl9sb29wX3ZhcmlhYmxlcyA9IFtdCisgICAgICAgIHNlbGYuX3R5cGVfYW5ub3RhdGlvbl9uYW1lcyA9IFtdCisgICAgICAgIHNlbGYuX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2VuYWJsZWQgPSBGYWxzZQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJyZWRlZmluZWQtb3V0ZXItbmFtZSIpCisgICAgZGVmIHZpc2l0X2ZvcihzZWxmLCBub2RlKToKKyAgICAgICAgYXNzaWduZWRfdG8gPSBbCisgICAgICAgICAgICB2YXIubmFtZSBmb3IgdmFyIGluIG5vZGUudGFyZ2V0Lm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuQXNzaWduTmFtZSkKKyAgICAgICAgXQorCisgICAgICAgICMgT25seSBjaGVjayB2YXJpYWJsZXMgdGhhdCBhcmUgdXNlZAorICAgICAgICBkdW1teV9yZ3ggPSBzZWxmLmNvbmZpZy5kdW1teV92YXJpYWJsZXNfcmd4CisgICAgICAgIGFzc2lnbmVkX3RvID0gW3ZhciBmb3IgdmFyIGluIGFzc2lnbmVkX3RvIGlmIG5vdCBkdW1teV9yZ3gubWF0Y2godmFyKV0KKworICAgICAgICBmb3IgdmFyaWFibGUgaW4gYXNzaWduZWRfdG86CisgICAgICAgICAgICBmb3Igb3V0ZXJfZm9yLCBvdXRlcl92YXJpYWJsZXMgaW4gc2VsZi5fbG9vcF92YXJpYWJsZXM6CisgICAgICAgICAgICAgICAgaWYgdmFyaWFibGUgaW4gb3V0ZXJfdmFyaWFibGVzIGFuZCBub3QgaW5fZm9yX2Vsc2VfYnJhbmNoKAorICAgICAgICAgICAgICAgICAgICBvdXRlcl9mb3IsIG5vZGUKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgInJlZGVmaW5lZC1vdXRlci1uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHZhcmlhYmxlLCBvdXRlcl9mb3IuZnJvbWxpbmVubyksCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBzZWxmLl9sb29wX3ZhcmlhYmxlcy5hcHBlbmQoKG5vZGUsIGFzc2lnbmVkX3RvKSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygicmVkZWZpbmVkLW91dGVyLW5hbWUiKQorICAgIGRlZiBsZWF2ZV9mb3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX2xvb3BfdmFyaWFibGVzLnBvcCgpCisgICAgICAgIHNlbGYuX3N0b3JlX3R5cGVfYW5ub3RhdGlvbl9uYW1lcyhub2RlKQorCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgbW9kdWxlIDogdXBkYXRlIGNvbnN1bXB0aW9uIGFuYWx5c2lzIHZhcmlhYmxlCisgICAgICAgIGNoZWNrcyBnbG9iYWxzIGRvZXNuJ3Qgb3ZlcnJpZGVzIGJ1aWx0aW5zCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl90b19jb25zdW1lID0gW05hbWVzQ29uc3VtZXIobm9kZSwgIm1vZHVsZSIpXQorICAgICAgICBzZWxmLl9wb3N0cG9uZWRfZXZhbHVhdGlvbl9lbmFibGVkID0gaXNfcG9zdHBvbmVkX2V2YWx1YXRpb25fZW5hYmxlZChub2RlKQorCisgICAgICAgIGZvciBuYW1lLCBzdG10cyBpbiBub2RlLmxvY2Fscy5pdGVtcygpOgorICAgICAgICAgICAgaWYgdXRpbHMuaXNfYnVpbHRpbihuYW1lKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zaG91bGRfaWdub3JlX3JlZGVmaW5lZF9idWlsdGluKHN0bXRzWzBdKSBvciBuYW1lID09ICJfX2RvY19fIjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJyZWRlZmluZWQtYnVpbHRpbiIsIGFyZ3M9bmFtZSwgbm9kZT1zdG10c1swXSkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgInVudXNlZC1pbXBvcnQiLAorICAgICAgICAidW51c2VkLXdpbGRjYXJkLWltcG9ydCIsCisgICAgICAgICJyZWRlZmluZWQtYnVpbHRpbiIsCisgICAgICAgICJ1bmRlZmluZWQtYWxsLXZhcmlhYmxlIiwKKyAgICAgICAgImludmFsaWQtYWxsLW9iamVjdCIsCisgICAgICAgICJpbnZhbGlkLWFsbC1mb3JtYXQiLAorICAgICAgICAidW51c2VkLXZhcmlhYmxlIiwKKyAgICApCisgICAgZGVmIGxlYXZlX21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIibGVhdmUgbW9kdWxlOiBjaGVjayBnbG9iYWxzIiIiCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5fdG9fY29uc3VtZSkgPT0gMQorCisgICAgICAgIHNlbGYuX2NoZWNrX21ldGFjbGFzc2VzKG5vZGUpCisgICAgICAgIG5vdF9jb25zdW1lZCA9IHNlbGYuX3RvX2NvbnN1bWUucG9wKCkudG9fY29uc3VtZQorICAgICAgICAjIGF0dGVtcHQgdG8gY2hlY2sgZm9yIF9fYWxsX18gaWYgZGVmaW5lZAorICAgICAgICBpZiAiX19hbGxfXyIgaW4gbm9kZS5sb2NhbHM6CisgICAgICAgICAgICBzZWxmLl9jaGVja19hbGwobm9kZSwgbm90X2NvbnN1bWVkKQorCisgICAgICAgICMgY2hlY2sgZm9yIHVudXNlZCBnbG9iYWxzCisgICAgICAgIHNlbGYuX2NoZWNrX2dsb2JhbHMobm90X2NvbnN1bWVkKQorCisgICAgICAgICMgZG9uJ3QgY2hlY2sgdW51c2VkIGltcG9ydHMgaW4gX19pbml0X18gZmlsZXMKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlnLmluaXRfaW1wb3J0IGFuZCBub2RlLnBhY2thZ2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9jaGVja19pbXBvcnRzKG5vdF9jb25zdW1lZCkKKworICAgIGRlZiB2aXNpdF9jbGFzc2RlZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgY2xhc3M6IHVwZGF0ZSBjb25zdW1wdGlvbiBhbmFseXNpcyB2YXJpYWJsZSIiIgorICAgICAgICBzZWxmLl90b19jb25zdW1lLmFwcGVuZChOYW1lc0NvbnN1bWVyKG5vZGUsICJjbGFzcyIpKQorCisgICAgZGVmIGxlYXZlX2NsYXNzZGVmKHNlbGYsIF8pOgorICAgICAgICAiIiJsZWF2ZSBjbGFzczogdXBkYXRlIGNvbnN1bXB0aW9uIGFuYWx5c2lzIHZhcmlhYmxlIiIiCisgICAgICAgICMgZG8gbm90IGNoZWNrIGZvciBub3QgdXNlZCBsb2NhbHMgaGVyZSAobm8gc2Vuc2UpCisgICAgICAgIHNlbGYuX3RvX2NvbnN1bWUucG9wKCkKKworICAgIGRlZiB2aXNpdF9sYW1iZGEoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IGxhbWJkYTogdXBkYXRlIGNvbnN1bXB0aW9uIGFuYWx5c2lzIHZhcmlhYmxlIiIiCisgICAgICAgIHNlbGYuX3RvX2NvbnN1bWUuYXBwZW5kKE5hbWVzQ29uc3VtZXIobm9kZSwgImxhbWJkYSIpKQorCisgICAgZGVmIGxlYXZlX2xhbWJkYShzZWxmLCBfKToKKyAgICAgICAgIiIibGVhdmUgbGFtYmRhOiB1cGRhdGUgY29uc3VtcHRpb24gYW5hbHlzaXMgdmFyaWFibGUiIiIKKyAgICAgICAgIyBkbyBub3QgY2hlY2sgZm9yIG5vdCB1c2VkIGxvY2FscyBoZXJlCisgICAgICAgIHNlbGYuX3RvX2NvbnN1bWUucG9wKCkKKworICAgIGRlZiB2aXNpdF9nZW5lcmF0b3JleHAoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IGdlbmV4cHI6IHVwZGF0ZSBjb25zdW1wdGlvbiBhbmFseXNpcyB2YXJpYWJsZSIiIgorICAgICAgICBzZWxmLl90b19jb25zdW1lLmFwcGVuZChOYW1lc0NvbnN1bWVyKG5vZGUsICJjb21wcmVoZW5zaW9uIikpCisKKyAgICBkZWYgbGVhdmVfZ2VuZXJhdG9yZXhwKHNlbGYsIF8pOgorICAgICAgICAiIiJsZWF2ZSBnZW5leHByOiB1cGRhdGUgY29uc3VtcHRpb24gYW5hbHlzaXMgdmFyaWFibGUiIiIKKyAgICAgICAgIyBkbyBub3QgY2hlY2sgZm9yIG5vdCB1c2VkIGxvY2FscyBoZXJlCisgICAgICAgIHNlbGYuX3RvX2NvbnN1bWUucG9wKCkKKworICAgIGRlZiB2aXNpdF9kaWN0Y29tcChzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgZGljdGNvbXA6IHVwZGF0ZSBjb25zdW1wdGlvbiBhbmFseXNpcyB2YXJpYWJsZSIiIgorICAgICAgICBzZWxmLl90b19jb25zdW1lLmFwcGVuZChOYW1lc0NvbnN1bWVyKG5vZGUsICJjb21wcmVoZW5zaW9uIikpCisKKyAgICBkZWYgbGVhdmVfZGljdGNvbXAoc2VsZiwgXyk6CisgICAgICAgICIiImxlYXZlIGRpY3Rjb21wOiB1cGRhdGUgY29uc3VtcHRpb24gYW5hbHlzaXMgdmFyaWFibGUiIiIKKyAgICAgICAgIyBkbyBub3QgY2hlY2sgZm9yIG5vdCB1c2VkIGxvY2FscyBoZXJlCisgICAgICAgIHNlbGYuX3RvX2NvbnN1bWUucG9wKCkKKworICAgIGRlZiB2aXNpdF9zZXRjb21wKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBzZXRjb21wOiB1cGRhdGUgY29uc3VtcHRpb24gYW5hbHlzaXMgdmFyaWFibGUiIiIKKyAgICAgICAgc2VsZi5fdG9fY29uc3VtZS5hcHBlbmQoTmFtZXNDb25zdW1lcihub2RlLCAiY29tcHJlaGVuc2lvbiIpKQorCisgICAgZGVmIGxlYXZlX3NldGNvbXAoc2VsZiwgXyk6CisgICAgICAgICIiImxlYXZlIHNldGNvbXA6IHVwZGF0ZSBjb25zdW1wdGlvbiBhbmFseXNpcyB2YXJpYWJsZSIiIgorICAgICAgICAjIGRvIG5vdCBjaGVjayBmb3Igbm90IHVzZWQgbG9jYWxzIGhlcmUKKyAgICAgICAgc2VsZi5fdG9fY29uc3VtZS5wb3AoKQorCisgICAgZGVmIHZpc2l0X2Z1bmN0aW9uZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBmdW5jdGlvbjogdXBkYXRlIGNvbnN1bXB0aW9uIGFuYWx5c2lzIHZhcmlhYmxlIGFuZCBjaGVjayBsb2NhbHMiIiIKKyAgICAgICAgc2VsZi5fdG9fY29uc3VtZS5hcHBlbmQoTmFtZXNDb25zdW1lcihub2RlLCAiZnVuY3Rpb24iKSkKKyAgICAgICAgaWYgbm90ICgKKyAgICAgICAgICAgIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgicmVkZWZpbmVkLW91dGVyLW5hbWUiKQorICAgICAgICAgICAgb3Igc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJyZWRlZmluZWQtYnVpbHRpbiIpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZ2xvYnMgPSBub2RlLnJvb3QoKS5nbG9iYWxzCisgICAgICAgIGZvciBuYW1lLCBzdG10IGluIG5vZGUuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZ2xvYnMgYW5kIG5vdCBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuR2xvYmFsKToKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gZ2xvYnNbbmFtZV1bMF0KKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGVmaW5pdGlvbiwgYXN0cm9pZC5JbXBvcnRGcm9tKQorICAgICAgICAgICAgICAgICAgICBhbmQgZGVmaW5pdGlvbi5tb2RuYW1lID09IEZVVFVSRQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICMgSXQgaXMgYSBfX2Z1dHVyZV9fIGRpcmVjdGl2ZSwgbm90IGEgc3ltYm9sLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgIyBEbyBub3QgdGFrZSBpbiBhY2NvdW50IHJlZGVmaW5lZCBuYW1lcyBmb3IgdGhlIHB1cnBvc2UKKyAgICAgICAgICAgICAgICAjIG9mIHR5cGUgY2hlY2tpbmcuOgorICAgICAgICAgICAgICAgIGlmIGFueSgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkZWZpbml0aW9uLnBhcmVudCwgYXN0cm9pZC5JZikKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlZmluaXRpb24ucGFyZW50LnRlc3QuYXNfc3RyaW5nKCkgaW4gVFlQSU5HX1RZUEVfQ0hFQ0tTX0dVQVJEUworICAgICAgICAgICAgICAgICAgICBmb3IgZGVmaW5pdGlvbiBpbiBnbG9ic1tuYW1lXQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBsaW5lID0gZGVmaW5pdGlvbi5mcm9tbGluZW5vCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX25hbWVfaWdub3JlZChzdG10LCBuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWRlZmluZWQtb3V0ZXItbmFtZSIsIGFyZ3M9KG5hbWUsIGxpbmUpLCBub2RlPXN0bXQKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICBlbGlmICgKKyAgICAgICAgICAgICAgICB1dGlscy5pc19idWlsdGluKG5hbWUpCisgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLl9hbGxvd2VkX3JlZGVmaW5lZF9idWlsdGluKG5hbWUpCisgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLl9zaG91bGRfaWdub3JlX3JlZGVmaW5lZF9idWlsdGluKHN0bXQpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICMgZG8gbm90IHByaW50IFJlZGVmaW5pbmcgYnVpbHRpbiBmb3IgYWRkaXRpb25hbCBidWlsdGlucworICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJlZGVmaW5lZC1idWlsdGluIiwgYXJncz1uYW1lLCBub2RlPXN0bXQpCisKKyAgICBkZWYgbGVhdmVfZnVuY3Rpb25kZWYoc2VsZiwgbm9kZSk6CisgICAgICAgICIiImxlYXZlIGZ1bmN0aW9uOiBjaGVjayBmdW5jdGlvbidzIGxvY2FscyBhcmUgY29uc3VtZWQiIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfbWV0YWNsYXNzZXMobm9kZSkKKworICAgICAgICBpZiBub2RlLnR5cGVfY29tbWVudF9yZXR1cm5zOgorICAgICAgICAgICAgc2VsZi5fc3RvcmVfdHlwZV9hbm5vdGF0aW9uX25vZGUobm9kZS50eXBlX2NvbW1lbnRfcmV0dXJucykKKyAgICAgICAgaWYgbm9kZS50eXBlX2NvbW1lbnRfYXJnczoKKyAgICAgICAgICAgIGZvciBhcmd1bWVudF9hbm5vdGF0aW9uIGluIG5vZGUudHlwZV9jb21tZW50X2FyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5fc3RvcmVfdHlwZV9hbm5vdGF0aW9uX25vZGUoYXJndW1lbnRfYW5ub3RhdGlvbikKKworICAgICAgICBub3RfY29uc3VtZWQgPSBzZWxmLl90b19jb25zdW1lLnBvcCgpLnRvX2NvbnN1bWUKKyAgICAgICAgaWYgbm90ICgKKyAgICAgICAgICAgIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgidW51c2VkLXZhcmlhYmxlIikKKyAgICAgICAgICAgIG9yIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgicG9zc2libHktdW51c2VkLXZhcmlhYmxlIikKKyAgICAgICAgICAgIG9yIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgidW51c2VkLWFyZ3VtZW50IikKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRG9uJ3QgY2hlY2sgYXJndW1lbnRzIG9mIGZ1bmN0aW9uIHdoaWNoIGFyZSBvbmx5IHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorICAgICAgICBpZiB1dGlscy5pc19lcnJvcihub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRG9uJ3QgY2hlY2sgYXJndW1lbnRzIG9mIGFic3RyYWN0IG1ldGhvZHMgb3Igd2l0aGluIGFuIGludGVyZmFjZS4KKyAgICAgICAgaXNfbWV0aG9kID0gbm9kZS5pc19tZXRob2QoKQorICAgICAgICBpZiBpc19tZXRob2QgYW5kIG5vZGUuaXNfYWJzdHJhY3QoKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGdsb2JhbF9uYW1lcyA9IF9mbGF0dGVuZWRfc2NvcGVfbmFtZXMobm9kZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLkdsb2JhbCkpCisgICAgICAgIG5vbmxvY2FsX25hbWVzID0gX2ZsYXR0ZW5lZF9zY29wZV9uYW1lcyhub2RlLm5vZGVzX29mX2NsYXNzKGFzdHJvaWQuTm9ubG9jYWwpKQorICAgICAgICBmb3IgbmFtZSwgc3RtdHMgaW4gbm90X2NvbnN1bWVkLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19pc191bnVzZWQobmFtZSwgbm9kZSwgc3RtdHNbMF0sIGdsb2JhbF9uYW1lcywgbm9ubG9jYWxfbmFtZXMpCisKKyAgICB2aXNpdF9hc3luY2Z1bmN0aW9uZGVmID0gdmlzaXRfZnVuY3Rpb25kZWYKKyAgICBsZWF2ZV9hc3luY2Z1bmN0aW9uZGVmID0gbGVhdmVfZnVuY3Rpb25kZWYKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygKKyAgICAgICAgImdsb2JhbC12YXJpYWJsZS11bmRlZmluZWQiLAorICAgICAgICAiZ2xvYmFsLXZhcmlhYmxlLW5vdC1hc3NpZ25lZCIsCisgICAgICAgICJnbG9iYWwtc3RhdGVtZW50IiwKKyAgICAgICAgImdsb2JhbC1hdC1tb2R1bGUtbGV2ZWwiLAorICAgICAgICAicmVkZWZpbmVkLWJ1aWx0aW4iLAorICAgICkKKyAgICBkZWYgdmlzaXRfZ2xvYmFsKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayBuYW1lcyBpbXBvcnRlZCBleGlzdHMgaW4gdGhlIGdsb2JhbCBzY29wZSIiIgorICAgICAgICBmcmFtZSA9IG5vZGUuZnJhbWUoKQorICAgICAgICBpZiBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLk1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJnbG9iYWwtYXQtbW9kdWxlLWxldmVsIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbW9kdWxlID0gZnJhbWUucm9vdCgpCisgICAgICAgIGRlZmF1bHRfbWVzc2FnZSA9IFRydWUKKyAgICAgICAgbG9jYWxzXyA9IG5vZGUuc2NvcGUoKS5sb2NhbHMKKyAgICAgICAgZm9yIG5hbWUgaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhc3NpZ25fbm9kZXMgPSBtb2R1bGUuZ2V0YXR0cihuYW1lKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHVuYXNzaWduZWQgZ2xvYmFsLCBza2lwCisgICAgICAgICAgICAgICAgYXNzaWduX25vZGVzID0gW10KKworICAgICAgICAgICAgbm90X2RlZmluZWRfbG9jYWxseV9ieV9pbXBvcnQgPSBub3QgYW55KAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UobG9jYWwsIGFzdHJvaWQubm9kZV9jbGFzc2VzLkltcG9ydCkKKyAgICAgICAgICAgICAgICBmb3IgbG9jYWwgaW4gbG9jYWxzXy5nZXQobmFtZSwgKCkpCisgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBub3QgYXNzaWduX25vZGVzIGFuZCBub3RfZGVmaW5lZF9sb2NhbGx5X2J5X2ltcG9ydDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJnbG9iYWwtdmFyaWFibGUtbm90LWFzc2lnbmVkIiwgYXJncz1uYW1lLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgZGVmYXVsdF9tZXNzYWdlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmb3IgYW5vZGUgaW4gYXNzaWduX25vZGVzOgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShhbm9kZSwgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgICAgICAgICBhbmQgYW5vZGUubmFtZSBpbiBtb2R1bGUuc3BlY2lhbF9hdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgicmVkZWZpbmVkLWJ1aWx0aW4iLCBhcmdzPW5hbWUsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBhbm9kZS5mcmFtZSgpIGlzIG1vZHVsZToKKyAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGUgbGV2ZWwgYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3RfZGVmaW5lZF9sb2NhbGx5X2J5X2ltcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgIyBnbG9iYWwgdW5kZWZpbmVkIGF0IHRoZSBtb2R1bGUgc2NvcGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZ2xvYmFsLXZhcmlhYmxlLXVuZGVmaW5lZCIsIGFyZ3M9bmFtZSwgbm9kZT1ub2RlKQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X21lc3NhZ2UgPSBGYWxzZQorCisgICAgICAgIGlmIGRlZmF1bHRfbWVzc2FnZToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImdsb2JhbC1zdGF0ZW1lbnQiLCBub2RlPW5vZGUpCisKKyAgICBkZWYgdmlzaXRfYXNzaWdubmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLmFzc2lnbl90eXBlKCksIGFzdHJvaWQuQXVnQXNzaWduKToKKyAgICAgICAgICAgIHNlbGYudmlzaXRfbmFtZShub2RlKQorCisgICAgZGVmIHZpc2l0X2RlbG5hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXRfbmFtZShub2RlKQorCisgICAgZGVmIHZpc2l0X25hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgYSBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUiIiIKKyAgICAgICAgc3RtdCA9IG5vZGUuc3RhdGVtZW50KCkKKyAgICAgICAgaWYgc3RtdC5mcm9tbGluZW5vIGlzIE5vbmU6CisgICAgICAgICAgICAjIG5hbWUgbm9kZSBmcm9tIGFuIGFzdHJvaWQgYnVpbHQgZnJvbSBsaXZlIGNvZGUsIHNraXAKKyAgICAgICAgICAgIGFzc2VydCBub3Qgc3RtdC5yb290KCkuZmlsZS5lbmRzd2l0aCgiLnB5IikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG5hbWUgPSBub2RlLm5hbWUKKyAgICAgICAgZnJhbWUgPSBzdG10LnNjb3BlKCkKKyAgICAgICAgc3RhcnRfaW5kZXggPSBsZW4oc2VsZi5fdG9fY29uc3VtZSkgLSAxCisKKyAgICAgICAgdW5kZWZpbmVkX3ZhcmlhYmxlX2lzX2VuYWJsZWQgPSBzZWxmLmxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoCisgICAgICAgICAgICAidW5kZWZpbmVkLXZhcmlhYmxlIgorICAgICAgICApCisgICAgICAgIHVzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfaXNfZW5hYmxlZCA9IHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgKKyAgICAgICAgICAgICJ1c2VkLWJlZm9yZS1hc3NpZ25tZW50IgorICAgICAgICApCisKKyAgICAgICAgIyBpdGVyYXRlcyB0aHJvdWdoIHBhcmVudCBzY29wZXMsIGZyb20gdGhlIGlubmVyIHRvIHRoZSBvdXRlcgorICAgICAgICBiYXNlX3Njb3BlX3R5cGUgPSBzZWxmLl90b19jb25zdW1lW3N0YXJ0X2luZGV4XS5zY29wZV90eXBlCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LW5lc3RlZC1ibG9ja3M7IHJlZmFjdG9yaW5nIHRoaXMgYmxvY2sgaXMgYSBwYWluLgorICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFydF9pbmRleCwgLTEsIC0xKToKKyAgICAgICAgICAgIGN1cnJlbnRfY29uc3VtZXIgPSBzZWxmLl90b19jb25zdW1lW2ldCisKKyAgICAgICAgICAgICMgVGhlIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzIG5vdCBwYXJ0CisgICAgICAgICAgICAjIG9mIHRoZSBjbGFzcyBib2R5LgorICAgICAgICAgICAgIyBJZiB0aGUgY3VycmVudCBzY29wZSBpcyBhIGNsYXNzIHNjb3BlIGJ1dCBpdCdzIG5vdCB0aGUgaW5uZXIKKyAgICAgICAgICAgICMgc2NvcGUsIGlnbm9yZSBpdC4gVGhpcyBwcmV2ZW50cyB0byBhY2Nlc3MgdGhpcyBzY29wZSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAjIHRoZSBnbG9iYWxzIG9uZSBpbiBmdW5jdGlvbiBtZW1iZXJzIHdoZW4gdGhlcmUgYXJlIHNvbWUgY29tbW9uCisgICAgICAgICAgICAjIG5hbWVzLgorICAgICAgICAgICAgaWYgY3VycmVudF9jb25zdW1lci5zY29wZV90eXBlID09ICJjbGFzcyIgYW5kICgKKyAgICAgICAgICAgICAgICB1dGlscy5pc19hbmNlc3Rvcl9uYW1lKGN1cnJlbnRfY29uc3VtZXIubm9kZSwgbm9kZSkKKyAgICAgICAgICAgICAgICBvciAoaSAhPSBzdGFydF9pbmRleCBhbmQgc2VsZi5faWdub3JlX2NsYXNzX3Njb3BlKG5vZGUpKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIElnbm9yZSBpbm5lciBjbGFzcyBzY29wZSBmb3Iga2V5d29yZHMgaW4gY2xhc3MgZGVmaW5pdGlvbgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGN1cnJlbnRfY29uc3VtZXIuc2NvcGVfdHlwZSA9PSAiY2xhc3MiCisgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuS2V5d29yZCkKKyAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLnBhcmVudC5wYXJlbnQsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgaWYgdGhlIG5hbWUgbm9kZSBpcyB1c2VkIGFzIGEgZnVuY3Rpb24gZGVmYXVsdCBhcmd1bWVudCdzIHZhbHVlIG9yIGFzCisgICAgICAgICAgICAjIGEgZGVjb3JhdG9yLCB0aGVuIHN0YXJ0IGZyb20gdGhlIHBhcmVudCBmcmFtZSBvZiB0aGUgZnVuY3Rpb24gaW5zdGVhZAorICAgICAgICAgICAgIyBvZiB0aGUgZnVuY3Rpb24gZnJhbWUgLSBhbmQgdGh1cyBvcGVuIGFuIGlubmVyIGNsYXNzIHNjb3BlCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgY3VycmVudF9jb25zdW1lci5zY29wZV90eXBlID09ICJmdW5jdGlvbiIKKyAgICAgICAgICAgICAgICBhbmQgc2VsZi5fZGVmaW5lZF9pbl9mdW5jdGlvbl9kZWZpbml0aW9uKG5vZGUsIGN1cnJlbnRfY29uc3VtZXIubm9kZSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgZnVuY3Rpb24gc2NvcGUgaWYgaXMgYW4gYW5ub3RhdGlvbi9kZWZhdWx0L2RlY29yYXRvciwgYXMgbm90IGluIHRoZSBib2R5CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY3VycmVudF9jb25zdW1lci5zY29wZV90eXBlID09ICJsYW1iZGEiIGFuZCB1dGlscy5pc19kZWZhdWx0X2FyZ3VtZW50KAorICAgICAgICAgICAgICAgIG5vZGUsIGN1cnJlbnRfY29uc3VtZXIubm9kZQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIHRoZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQsIG9ubHkgY2hlY2sgaXQncyBub3QgYSBsb29wCisgICAgICAgICAgICAjIHZhcmlhYmxlIHVzZWQgb3V0c2lkZSB0aGUgbG9vcAorICAgICAgICAgICAgIyBhdm9pZCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgaG9tb255bXMgaW5zaWRlIGZ1bmN0aW9uIHNjb3BlIGFuZAorICAgICAgICAgICAgIyBjb21wcmVoZW5zaW9uIGN1cnJlbnQgc2NvcGUgKGF2b2lkIGJ1ZyAjMTczMSkKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gY3VycmVudF9jb25zdW1lci5jb25zdW1lZCBhbmQgbm90ICgKKyAgICAgICAgICAgICAgICBjdXJyZW50X2NvbnN1bWVyLnNjb3BlX3R5cGUgPT0gImNvbXByZWhlbnNpb24iCisgICAgICAgICAgICAgICAgYW5kIHNlbGYuX2hhc19ob21vbnltX2luX3VwcGVyX2Z1bmN0aW9uX3Njb3BlKG5vZGUsIGkpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGRlZm5vZGUgPSB1dGlscy5hc3NpZ25fcGFyZW50KGN1cnJlbnRfY29uc3VtZXIuY29uc3VtZWRbbmFtZV1bMF0pCisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfbGF0ZV9iaW5kaW5nX2Nsb3N1cmUobm9kZSwgZGVmbm9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9sb29wdmFyX25hbWUobm9kZSwgbmFtZSkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBmb3VuZF9ub2RlID0gY3VycmVudF9jb25zdW1lci5nZXRfbmV4dF90b19jb25zdW1lKG5vZGUpCisgICAgICAgICAgICBpZiBmb3VuZF9ub2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBjaGVja3MgZm9yIHVzZSBiZWZvcmUgYXNzaWdubWVudAorICAgICAgICAgICAgZGVmbm9kZSA9IHV0aWxzLmFzc2lnbl9wYXJlbnQoY3VycmVudF9jb25zdW1lci50b19jb25zdW1lW25hbWVdWzBdKQorCisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgdW5kZWZpbmVkX3ZhcmlhYmxlX2lzX2VuYWJsZWQgb3IgdXNlZF9iZWZvcmVfYXNzaWdubWVudF9pc19lbmFibGVkCisgICAgICAgICAgICApIGFuZCBkZWZub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2xhdGVfYmluZGluZ19jbG9zdXJlKG5vZGUsIGRlZm5vZGUpCisgICAgICAgICAgICAgICAgZGVmc3RtdCA9IGRlZm5vZGUuc3RhdGVtZW50KCkKKyAgICAgICAgICAgICAgICBkZWZmcmFtZSA9IGRlZnN0bXQuZnJhbWUoKQorICAgICAgICAgICAgICAgICMgVGhlIGNsYXNzIHJldXNlcyBpdHNlbGYgaW4gdGhlIGNsYXNzIHNjb3BlLgorICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZV9rbGFzcyA9ICgKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXMgZGVmZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRlZmZyYW1lLnBhcmVudF9vZihub2RlKQorICAgICAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShkZWZmcmFtZSwgYXN0cm9pZC5DbGFzc0RlZikKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vZGUubmFtZSA9PSBkZWZmcmFtZS5uYW1lCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVfa2xhc3MKKyAgICAgICAgICAgICAgICAgICAgYW5kIHV0aWxzLmlzX2luc2lkZV9sYW1iZGEobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgYW5kICgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCB1dGlscy5pc19kZWZhdWx0X2FyZ3VtZW50KG5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBvciBub2RlLnNjb3BlKCkucGFyZW50LnNjb3BlKCkgaXMgbm90IGRlZmZyYW1lCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAjIFNlbGYtcmVmZXJlbnRpYWwgY2xhc3MgcmVmZXJlbmNlcyBhcmUgZmluZSBpbiBsYW1iZGEncyAtLQorICAgICAgICAgICAgICAgICAgICAjIEFzIGxvbmcgYXMgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgYXJndW1lbnQgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgIyB1bmRlciB0aGUgc2NvcGUgb2YgdGhlIHBhcmVudCBzZWxmLXJlZmVycmluZyBjbGFzcy4KKyAgICAgICAgICAgICAgICAgICAgIyBFeGFtcGxlIG9mIHZhbGlkIGRlZmF1bHQgYXJndW1lbnQ6CisgICAgICAgICAgICAgICAgICAgICMgY2xhc3MgTXlOYW1lMzoKKyAgICAgICAgICAgICAgICAgICAgIyAgICAgbXlhdHRyID0gMQorICAgICAgICAgICAgICAgICAgICAjICAgICBteWxhbWJkYTMgPSBsYW1iZGE6IGxhbWJkYSBhPU15TmFtZTM6IGEKKyAgICAgICAgICAgICAgICAgICAgIyBFeGFtcGxlIG9mIGludmFsaWQgZGVmYXVsdCBhcmd1bWVudDoKKyAgICAgICAgICAgICAgICAgICAgIyBjbGFzcyBNeU5hbWU0OgorICAgICAgICAgICAgICAgICAgICAjICAgICBteWF0dHIgPSAxCisgICAgICAgICAgICAgICAgICAgICMgICAgIG15bGFtYmRhNCA9IGxhbWJkYSBhPU15TmFtZTQ6IGxhbWJkYTogYQorCisgICAgICAgICAgICAgICAgICAgICMgSWYgdGhlIGFib3ZlIGNvbmRpdGlvbmFsIGlzIFRydWUsCisgICAgICAgICAgICAgICAgICAgICMgdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgdW5kZWZpbmVkLXZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICMgQWxzbyBkbyBub3QgY29uc3VtZSBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgICAgICMgKHNpbmNlIGNvbnN1bWluZyBibG9ja3Mgc3Vic2VxdWVudCBjaGVja3MpCisgICAgICAgICAgICAgICAgICAgICMgLS0gcXVpdAorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBtYXliZWUwNjAxLAorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgdXNlX291dGVyX2RlZmluaXRpb24sCisgICAgICAgICAgICAgICAgKSA9IHNlbGYuX2lzX3ZhcmlhYmxlX3Zpb2xhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGVmbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgc3RtdCwKKyAgICAgICAgICAgICAgICAgICAgZGVmc3RtdCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIGRlZmZyYW1lLAorICAgICAgICAgICAgICAgICAgICBiYXNlX3Njb3BlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZV9rbGFzcywKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgICBpZiB1c2Vfb3V0ZXJfZGVmaW5pdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgbWF5YmVlMDYwMQorICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHV0aWxzLmlzX2RlZmluZWRfYmVmb3JlKG5vZGUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgYXN0cm9pZC5hcmVfZXhjbHVzaXZlKHN0bXQsIGRlZnN0bXQsICgiTmFtZUVycm9yIiwpKQorICAgICAgICAgICAgICAgICk6CisKKyAgICAgICAgICAgICAgICAgICAgIyBVc2VkIGFuZCBkZWZpbmVkIGluIHRoZSBzYW1lIHBsYWNlLCBlLmcgYHggKz0gMWAgYW5kIGBkZWwgeGAKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lZF9ieV9zdG10ID0gZGVmc3RtdCBpcyBzdG10IGFuZCBpc2luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwgKGFzdHJvaWQuRGVsTmFtZSwgYXN0cm9pZC5Bc3NpZ25OYW1lKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZV9rbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGVmaW5lZF9ieV9zdG10CisgICAgICAgICAgICAgICAgICAgICAgICBvciBhbm5vdGF0aW9uX3JldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgb3IgaXNpbnN0YW5jZShkZWZzdG10LCBhc3Ryb2lkLkRlbGV0ZSkKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB1dGlscy5ub2RlX2lnbm9yZXNfZXhjZXB0aW9uKG5vZGUsIE5hbWVFcnJvcik6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBwb3N0cG9uZWQgZXZhbHVhdGlvbiBvZiBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2VuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuQW5uQXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuRnVuY3Rpb25EZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0cm9pZC5Bcmd1bWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lIGluIG5vZGUucm9vdCgpLmxvY2FscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkLXZhcmlhYmxlIiwgYXJncz1uYW1lLCBub2RlPW5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGJhc2Vfc2NvcGVfdHlwZSAhPSAibGFtYmRhIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRTA2MDEgbWF5ICpub3QqIG9jY3VycyBpbiBsYW1iZGEgc2NvcGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIHBvc3Rwb25lZCBldmFsdWF0aW9uIG9mIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2VuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RtdCwgKGFzdHJvaWQuQW5uQXNzaWduLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZWQtYmVmb3JlLWFzc2lnbm1lbnQiLCBhcmdzPW5hbWUsIG5vZGU9bm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBiYXNlX3Njb3BlX3R5cGUgPT0gImxhbWJkYSI6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEUwNjAxIGNhbiBvY2N1ciBpbiBjbGFzcy1sZXZlbCBzY29wZSBpbiBsYW1iZGFzLCBhcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgICAgICAjICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICB4ID0gbGFtYmRhIGF0dHI6IGYgKyBhdHRyCisgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgZiA9IDQyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkNsYXNzRGVmKSBhbmQgbmFtZSBpbiBmcmFtZS5sb2NhbHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5Bcmd1bWVudHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdG10LmZyb21saW5lbm8gPD0gZGVmc3RtdC5mcm9tbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEb2luZyB0aGUgZm9sbG93aW5nIGlzIGZpbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICB4ID0gNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICB5ID0gbGFtYmRhIGF0dHI9eDogYXR0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlZC1iZWZvcmUtYXNzaWdubWVudCIsIGFyZ3M9bmFtZSwgbm9kZT1ub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQtdmFyaWFibGUiLCBhcmdzPW5hbWUsIG5vZGU9bm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGN1cnJlbnRfY29uc3VtZXIuc2NvcGVfdHlwZSA9PSAibGFtYmRhIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bmRlZmluZWQtdmFyaWFibGUiLCBub2RlPW5vZGUsIGFyZ3M9bmFtZSkKKworICAgICAgICAgICAgY3VycmVudF9jb25zdW1lci5tYXJrX2FzX2NvbnN1bWVkKG5hbWUsIGZvdW5kX25vZGUpCisgICAgICAgICAgICAjIGNoZWNrIGl0J3Mgbm90IGEgbG9vcCB2YXJpYWJsZSB1c2VkIG91dHNpZGUgdGhlIGxvb3AKKyAgICAgICAgICAgIHNlbGYuX2xvb3B2YXJfbmFtZShub2RlLCBuYW1lKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgd2UgaGF2ZSBub3QgZm91bmQgdGhlIG5hbWUsIGlmIGl0IGlzbid0IGEgYnVpbHRpbiwgdGhhdCdzIGFuCisgICAgICAgICAgICAjIHVuZGVmaW5lZCBuYW1lICEKKyAgICAgICAgICAgIGlmIHVuZGVmaW5lZF92YXJpYWJsZV9pc19lbmFibGVkIGFuZCBub3QgKAorICAgICAgICAgICAgICAgIG5hbWUgaW4gYXN0cm9pZC5Nb2R1bGUuc2NvcGVfYXR0cnMKKyAgICAgICAgICAgICAgICBvciB1dGlscy5pc19idWlsdGluKG5hbWUpCisgICAgICAgICAgICAgICAgb3IgbmFtZSBpbiBzZWxmLmNvbmZpZy5hZGRpdGlvbmFsX2J1aWx0aW5zCisgICAgICAgICAgICAgICAgb3IgKAorICAgICAgICAgICAgICAgICAgICBuYW1lID09ICJfX2NsYXNzX18iCisgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgICAgICAgICBhbmQgZnJhbWUuaXNfbWV0aG9kKCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGlmIG5vdCB1dGlscy5ub2RlX2lnbm9yZXNfZXhjZXB0aW9uKG5vZGUsIE5hbWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVuZGVmaW5lZC12YXJpYWJsZSIsIGFyZ3M9bmFtZSwgbm9kZT1ub2RlKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJuby1uYW1lLWluLW1vZHVsZSIpCisgICAgZGVmIHZpc2l0X2ltcG9ydChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiY2hlY2sgbW9kdWxlcyBhdHRyaWJ1dGUgYWNjZXNzZXMiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2FuYWx5c2VfZmFsbGJhY2tfYmxvY2tzIGFuZCB1dGlscy5pc19mcm9tX2ZhbGxiYWNrX2Jsb2NrKG5vZGUpOgorICAgICAgICAgICAgIyBObyBuZWVkIHRvIHZlcmlmeSB0aGlzLCBzaW5jZSBJbXBvcnRFcnJvciBpcyBhbHJlYWR5CisgICAgICAgICAgICAjIGhhbmRsZWQgYnkgdGhlIGNsaWVudCBjb2RlLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIG5hbWUsIF8gaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIHBhcnRzID0gbmFtZS5zcGxpdCgiLiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gbmV4dChfaW5mZXJfbmFtZV9tb2R1bGUobm9kZSwgcGFydHNbMF0pKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuUmVzb2x2ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShtb2R1bGUsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbW9kdWxlX2F0dHJzKG5vZGUsIG1vZHVsZSwgcGFydHNbMTpdKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKCJuby1uYW1lLWluLW1vZHVsZSIpCisgICAgZGVmIHZpc2l0X2ltcG9ydGZyb20oc2VsZiwgbm9kZSk6CisgICAgICAgICIiImNoZWNrIG1vZHVsZXMgYXR0cmlidXRlIGFjY2Vzc2VzIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9hbmFseXNlX2ZhbGxiYWNrX2Jsb2NrcyBhbmQgdXRpbHMuaXNfZnJvbV9mYWxsYmFja19ibG9jayhub2RlKToKKyAgICAgICAgICAgICMgTm8gbmVlZCB0byB2ZXJpZnkgdGhpcywgc2luY2UgSW1wb3J0RXJyb3IgaXMgYWxyZWFkeQorICAgICAgICAgICAgIyBoYW5kbGVkIGJ5IHRoZSBjbGllbnQgY29kZS4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG5hbWVfcGFydHMgPSBub2RlLm1vZG5hbWUuc3BsaXQoIi4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2R1bGUgPSBub2RlLmRvX2ltcG9ydF9tb2R1bGUobmFtZV9wYXJ0c1swXSkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuQXN0cm9pZEJ1aWxkaW5nRXhjZXB0aW9uOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG1vZHVsZSA9IHNlbGYuX2NoZWNrX21vZHVsZV9hdHRycyhub2RlLCBtb2R1bGUsIG5hbWVfcGFydHNbMTpdKQorICAgICAgICBpZiBub3QgbW9kdWxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBuYW1lLCBfIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBpZiBuYW1lID09ICIqIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbW9kdWxlX2F0dHJzKG5vZGUsIG1vZHVsZSwgbmFtZS5zcGxpdCgiLiIpKQorCisgICAgQHV0aWxzLmNoZWNrX21lc3NhZ2VzKAorICAgICAgICAidW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmciLCAidW5wYWNraW5nLW5vbi1zZXF1ZW5jZSIsICJzZWxmLWNscy1hc3NpZ25tZW50IgorICAgICkKKyAgICBkZWYgdmlzaXRfYXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayB1bmJhbGFuY2VkIHR1cGxlIHVucGFja2luZyBmb3IgYXNzaWdubWVudHMKKyAgICAgICAgYW5kIHVucGFja2luZyBub24tc2VxdWVuY2VzIGFzIHdlbGwgYXMgaW4gY2FzZSBzZWxmL2NscworICAgICAgICBnZXQgYXNzaWduZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVja19zZWxmX2Nsc19hc3NpZ24obm9kZSkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS50YXJnZXRzWzBdLCAoYXN0cm9pZC5UdXBsZSwgYXN0cm9pZC5MaXN0KSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0YXJnZXRzID0gbm9kZS50YXJnZXRzWzBdLml0ZXJlZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGluZmVycmVkID0gdXRpbHMuc2FmZV9pbmZlcihub2RlLnZhbHVlKQorICAgICAgICAgICAgaWYgaW5mZXJyZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfdW5wYWNraW5nKGluZmVycmVkLCBub2RlLCB0YXJnZXRzKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBsaXN0Y29tcCBoYXZlIG5vdyBhbHNvIHRoZWlyIHNjb3BlCisgICAgZGVmIHZpc2l0X2xpc3Rjb21wKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBkaWN0Y29tcDogdXBkYXRlIGNvbnN1bXB0aW9uIGFuYWx5c2lzIHZhcmlhYmxlIiIiCisgICAgICAgIHNlbGYuX3RvX2NvbnN1bWUuYXBwZW5kKE5hbWVzQ29uc3VtZXIobm9kZSwgImNvbXByZWhlbnNpb24iKSkKKworICAgIGRlZiBsZWF2ZV9saXN0Y29tcChzZWxmLCBfKToKKyAgICAgICAgIiIibGVhdmUgZGljdGNvbXA6IHVwZGF0ZSBjb25zdW1wdGlvbiBhbmFseXNpcyB2YXJpYWJsZSIiIgorICAgICAgICAjIGRvIG5vdCBjaGVjayBmb3Igbm90IHVzZWQgbG9jYWxzIGhlcmUKKyAgICAgICAgc2VsZi5fdG9fY29uc3VtZS5wb3AoKQorCisgICAgZGVmIGxlYXZlX2Fzc2lnbihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fc3RvcmVfdHlwZV9hbm5vdGF0aW9uX25hbWVzKG5vZGUpCisKKyAgICBkZWYgbGVhdmVfd2l0aChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fc3RvcmVfdHlwZV9hbm5vdGF0aW9uX25hbWVzKG5vZGUpCisKKyAgICBkZWYgdmlzaXRfYXJndW1lbnRzKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgYW5ub3RhdGlvbiBpbiBub2RlLnR5cGVfY29tbWVudF9hcmdzOgorICAgICAgICAgICAgc2VsZi5fc3RvcmVfdHlwZV9hbm5vdGF0aW9uX25vZGUoYW5ub3RhdGlvbikKKworICAgICMgUmVseWluZyBvbiBvdGhlciBjaGVja2VyJ3Mgb3B0aW9ucywgd2hpY2ggbWlnaHQgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCisgICAgQGFzdHJvaWQuZGVjb3JhdG9ycy5jYWNoZWRwcm9wZXJ0eQorICAgIGRlZiBfYW5hbHlzZV9mYWxsYmFja19ibG9ja3Moc2VsZik6CisgICAgICAgIHJldHVybiBnZXRfZ2xvYmFsX29wdGlvbihzZWxmLCAiYW5hbHlzZS1mYWxsYmFjay1ibG9ja3MiLCBkZWZhdWx0PUZhbHNlKQorCisgICAgQGFzdHJvaWQuZGVjb3JhdG9ycy5jYWNoZWRwcm9wZXJ0eQorICAgIGRlZiBfaWdub3JlZF9tb2R1bGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gZ2V0X2dsb2JhbF9vcHRpb24oc2VsZiwgImlnbm9yZWQtbW9kdWxlcyIsIGRlZmF1bHQ9W10pCisKKyAgICBAYXN0cm9pZC5kZWNvcmF0b3JzLmNhY2hlZHByb3BlcnR5CisgICAgZGVmIF9hbGxvd19nbG9iYWxfdW51c2VkX3ZhcmlhYmxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGdldF9nbG9iYWxfb3B0aW9uKHNlbGYsICJhbGxvdy1nbG9iYWwtdW51c2VkLXZhcmlhYmxlcyIsIGRlZmF1bHQ9VHJ1ZSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2RlZmluZWRfaW5fZnVuY3Rpb25fZGVmaW5pdGlvbihub2RlLCBmcmFtZSk6CisgICAgICAgIGluX2Fubm90YXRpb25fb3JfZGVmYXVsdF9vcl9kZWNvcmF0b3IgPSBGYWxzZQorICAgICAgICBpZiBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSBhbmQgbm9kZS5zdGF0ZW1lbnQoKSBpcyBmcmFtZToKKyAgICAgICAgICAgIGluX2Fubm90YXRpb25fb3JfZGVmYXVsdF9vcl9kZWNvcmF0b3IgPSAoCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBub2RlIGluIGZyYW1lLmFyZ3MuYW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgb3Igbm9kZSBpbiBmcmFtZS5hcmdzLnBvc29ubHlhcmdzX2Fubm90YXRpb25zCisgICAgICAgICAgICAgICAgICAgIG9yIG5vZGUgaW4gZnJhbWUuYXJncy5rd29ubHlhcmdzX2Fubm90YXRpb25zCisgICAgICAgICAgICAgICAgICAgIG9yIG5vZGUgaXMgZnJhbWUuYXJncy52YXJhcmdhbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIG9yIG5vZGUgaXMgZnJhbWUuYXJncy5rd2FyZ2Fubm90YXRpb24KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgb3IgZnJhbWUuYXJncy5wYXJlbnRfb2Yobm9kZSkKKyAgICAgICAgICAgICAgICBvciAoZnJhbWUuZGVjb3JhdG9ycyBhbmQgZnJhbWUuZGVjb3JhdG9ycy5wYXJlbnRfb2Yobm9kZSkpCisgICAgICAgICAgICAgICAgb3IgKAorICAgICAgICAgICAgICAgICAgICBmcmFtZS5yZXR1cm5zCisgICAgICAgICAgICAgICAgICAgIGFuZCAobm9kZSBpcyBmcmFtZS5yZXR1cm5zIG9yIGZyYW1lLnJldHVybnMucGFyZW50X29mKG5vZGUpKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGluX2Fubm90YXRpb25fb3JfZGVmYXVsdF9vcl9kZWNvcmF0b3IKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2luX2xhbWJkYV9vcl9jb21wcmVoZW5zaW9uX2JvZHkoCisgICAgICAgIG5vZGU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORywgZnJhbWU6IGFzdHJvaWQubm9kZV9jbGFzc2VzLk5vZGVORworICAgICkgLT4gYm9vbDoKKyAgICAgICAgIiIicmV0dXJuIFRydWUgaWYgbm9kZSB3aXRoaW4gYSBsYW1iZGEvY29tcHJlaGVuc2lvbiBib2R5IChvciBzaW1pbGFyKSBhbmQgdGh1cyBzaG91bGQgbm90IGhhdmUgYWNjZXNzIHRvIGNsYXNzIGF0dHJpYnV0ZXMgaW4gZnJhbWUiIiIKKyAgICAgICAgY2hpbGQgPSBub2RlCisgICAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50CisgICAgICAgIHdoaWxlIHBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHBhcmVudCBpcyBmcmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLkxhbWJkYSkgYW5kIGNoaWxkIGlzIG5vdCBwYXJlbnQuYXJnczoKKyAgICAgICAgICAgICAgICAjIEJvZHkgb2YgbGFtYmRhIHNob3VsZCBub3QgaGF2ZSBhY2Nlc3MgdG8gY2xhc3MgYXR0cmlidXRlcy4KKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Db21wcmVoZW5zaW9uKQorICAgICAgICAgICAgICAgIGFuZCBjaGlsZCBpcyBub3QgcGFyZW50Lml0ZXIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyBPbmx5IGl0ZXIgb2YgbGlzdC9zZXQvZGljdC9nZW5lcmF0b3IgY29tcHJlaGVuc2lvbiBzaG91bGQgaGF2ZSBhY2Nlc3MuCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyZW50LCBhc3Ryb2lkLnNjb3BlZF9ub2Rlcy5Db21wcmVoZW5zaW9uU2NvcGUpIGFuZCBub3QgKAorICAgICAgICAgICAgICAgIHBhcmVudC5nZW5lcmF0b3JzIGFuZCBjaGlsZCBpcyBwYXJlbnQuZ2VuZXJhdG9yc1swXQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAjIEJvZHkgb2YgbGlzdC9zZXQvZGljdC9nZW5lcmF0b3IgY29tcHJlaGVuc2lvbiBzaG91bGQgbm90IGhhdmUgYWNjZXNzIHRvIGNsYXNzIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICAgICAgIyBGdXJ0aGVybW9yZSwgb25seSB0aGUgZmlyc3QgZ2VuZXJhdG9yIChpZiBtdWx0aXBsZSkgaW4gY29tcHJlaGVuc2lvbiBzaG91bGQgaGF2ZSBhY2Nlc3MuCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGNoaWxkID0gcGFyZW50CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfdmFyaWFibGVfdmlvbGF0aW9uKAorICAgICAgICBub2RlLAorICAgICAgICBuYW1lLAorICAgICAgICBkZWZub2RlLAorICAgICAgICBzdG10LAorICAgICAgICBkZWZzdG10LAorICAgICAgICBmcmFtZSwKKyAgICAgICAgZGVmZnJhbWUsCisgICAgICAgIGJhc2Vfc2NvcGVfdHlwZSwKKyAgICAgICAgcmVjdXJzaXZlX2tsYXNzLAorICAgICk6CisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LW5lc3RlZC1ibG9ja3MKKyAgICAgICAgIyBub2RlOiBOb2RlIHRvIGNoZWNrIGZvciB2aW9sYXRpb24KKyAgICAgICAgIyBuYW1lOiBuYW1lIG9mIG5vZGUgdG8gY2hlY2sgdmlvbGF0aW9uIGZvcgorICAgICAgICAjIGZyYW1lOiBTY29wZSBvZiBzdGF0ZW1lbnQgb2Ygbm9kZQorICAgICAgICAjIGJhc2Vfc2NvcGVfdHlwZTogbG9jYWwgc2NvcGUgdHlwZQorICAgICAgICBtYXliZWUwNjAxID0gVHJ1ZQorICAgICAgICBhbm5vdGF0aW9uX3JldHVybiA9IEZhbHNlCisgICAgICAgIHVzZV9vdXRlcl9kZWZpbml0aW9uID0gRmFsc2UKKyAgICAgICAgaWYgZnJhbWUgaXMgbm90IGRlZmZyYW1lOgorICAgICAgICAgICAgbWF5YmVlMDYwMSA9IF9kZXRlY3RfZ2xvYmFsX3Njb3BlKG5vZGUsIGZyYW1lLCBkZWZmcmFtZSkKKyAgICAgICAgZWxpZiBkZWZmcmFtZS5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICMgd2UgYXJlIGF0IHRoZSBtb2R1bGUgbGV2ZWwsIGNoZWNrIHRoZSBuYW1lIGlzIG5vdAorICAgICAgICAgICAgIyBkZWZpbmVkIGluIGJ1aWx0aW5zCisgICAgICAgICAgICBpZiBuYW1lIGluIGRlZmZyYW1lLnNjb3BlX2F0dHJzIG9yIGFzdHJvaWQuYnVpbHRpbl9sb29rdXAobmFtZSlbMV06CisgICAgICAgICAgICAgICAgbWF5YmVlMDYwMSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHdlIGFyZSBpbiBhIGxvY2FsIHNjb3BlLCBjaGVjayB0aGUgbmFtZSBpcyBub3QKKyAgICAgICAgICAgICMgZGVmaW5lZCBpbiBnbG9iYWwgb3IgYnVpbHRpbiBzY29wZQorICAgICAgICAgICAgIyBza2lwIHRoaXMgbG9va3VwIGlmIG5hbWUgaXMgYXNzaWduZWQgbGF0ZXIgaW4gZnVuY3Rpb24gc2NvcGUvbGFtYmRhCisgICAgICAgICAgICAjIE5vdGU6IHRoZSBub2RlLmZyYW1lKCkgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBgZnJhbWVgIGFyZ3VtZW50IHdoaWNoIGlzCisgICAgICAgICAgICAjIGVxdWl2YWxlbnQgdG8gZnJhbWUuc3RhdGVtZW50KCkuc2NvcGUoKQorICAgICAgICAgICAgZm9yYmlkX2xvb2t1cCA9ICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgICAgIG9yIGlzaW5zdGFuY2Uobm9kZS5mcmFtZSgpLCBhc3Ryb2lkLkxhbWJkYSkKKyAgICAgICAgICAgICkgYW5kIF9hc3NpZ25lZF9sb2NhbGx5KG5vZGUpCisgICAgICAgICAgICBpZiBub3QgZm9yYmlkX2xvb2t1cCBhbmQgZGVmZnJhbWUucm9vdCgpLmxvb2t1cChuYW1lKVsxXToKKyAgICAgICAgICAgICAgICBtYXliZWUwNjAxID0gRmFsc2UKKyAgICAgICAgICAgICAgICB1c2Vfb3V0ZXJfZGVmaW5pdGlvbiA9IHN0bXQgPT0gZGVmc3RtdCBhbmQgbm90IGlzaW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGRlZm5vZGUsIGFzdHJvaWQubm9kZV9jbGFzc2VzLkNvbXByZWhlbnNpb24KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAjIGNoZWNrIGlmIHdlIGhhdmUgYSBub25sb2NhbAorICAgICAgICAgICAgZWxpZiBuYW1lIGluIGRlZmZyYW1lLmxvY2FsczoKKyAgICAgICAgICAgICAgICBtYXliZWUwNjAxID0gbm90IGFueSgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShjaGlsZCwgYXN0cm9pZC5Ob25sb2NhbCkgYW5kIG5hbWUgaW4gY2hpbGQubmFtZXMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGRlZmZyYW1lLmdldF9jaGlsZHJlbigpCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGJhc2Vfc2NvcGVfdHlwZSA9PSAibGFtYmRhIgorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoZnJhbWUsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICAgICBhbmQgbmFtZSBpbiBmcmFtZS5sb2NhbHMKKyAgICAgICAgKToKKworICAgICAgICAgICAgIyBUaGlzIHJ1bGUgdmVyaWZpZXMgdGhhdCBpZiB0aGUgZGVmaW5pdGlvbiBub2RlIG9mIHRoZQorICAgICAgICAgICAgIyBjaGVja2VkIG5hbWUgaXMgYW4gQXJndW1lbnRzIG5vZGUgYW5kIGlmIHRoZSBuYW1lCisgICAgICAgICAgICAjIGlzIHVzZWQgYSBkZWZhdWx0IHZhbHVlIGluIHRoZSBhcmd1bWVudHMgZGVmYXVsdHMKKyAgICAgICAgICAgICMgYW5kIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgdmFyaWFibGUgbGFiZWwKKyAgICAgICAgICAgICMgaXMgaGFwcGVuaW5nIGJlZm9yZSB0aGUgQXJndW1lbnRzIGRlZmluaXRpb24uCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIGJhciA9IE5vbmUKKyAgICAgICAgICAgICMgZm9vID0gbGFtYmRhIGJhcj1iYXI6IGJhcgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBJbiB0aGlzIGNhc2UsIG1heWJlZTA2MDEgc2hvdWxkIGJlIEZhbHNlLCBvdGhlcndpc2UKKyAgICAgICAgICAgICMgaXQgc2hvdWxkIGJlIFRydWUuCisgICAgICAgICAgICBtYXliZWUwNjAxID0gbm90ICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRlZm5vZGUsIGFzdHJvaWQuQXJndW1lbnRzKQorICAgICAgICAgICAgICAgIGFuZCBub2RlIGluIGRlZm5vZGUuZGVmYXVsdHMKKyAgICAgICAgICAgICAgICBhbmQgZnJhbWUubG9jYWxzW25hbWVdWzBdLmZyb21saW5lbm8gPCBkZWZzdG10LmZyb21saW5lbm8KKyAgICAgICAgICAgICkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRlZmZyYW1lLCBhc3Ryb2lkLkNsYXNzRGVmKSBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgIGZyYW1lLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmCisgICAgICAgICk6CisgICAgICAgICAgICAjIFNwZWNpYWwgcnVsZSBmb3IgZnVuY3Rpb24gcmV0dXJuIGFubm90YXRpb25zLAorICAgICAgICAgICAgIyB3aGljaCB1c2VzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGNsYXNzIHdoZXJlCisgICAgICAgICAgICAjIHRoZSBmdW5jdGlvbiBsaXZlcy4KKyAgICAgICAgICAgIGlmIG5vZGUgaXMgZnJhbWUucmV0dXJucyBhbmQgZGVmZnJhbWUucGFyZW50X29mKGZyYW1lLnJldHVybnMpOgorICAgICAgICAgICAgICAgIG1heWJlZTA2MDEgPSBhbm5vdGF0aW9uX3JldHVybiA9IFRydWUKKworICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIG1heWJlZTA2MDEKKyAgICAgICAgICAgICAgICBhbmQgZGVmZnJhbWUubmFtZSBpbiBkZWZmcmFtZS5sb2NhbHMKKyAgICAgICAgICAgICAgICBhbmQgZGVmZnJhbWUubG9jYWxzW25hbWVdWzBdLmxpbmVubyA8IGZyYW1lLmxpbmVubworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAjIERldGVjdCBjbGFzcyBhc3NpZ25tZW50cyB3aXRoIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgIyBuYW1lIGFzIHRoZSBjbGFzcy4gSW4gdGhpcyBjYXNlLCBubyB3YXJuaW5nCisgICAgICAgICAgICAgICAgIyBzaG91bGQgYmUgcmFpc2VkLgorICAgICAgICAgICAgICAgIG1heWJlZTA2MDEgPSBGYWxzZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5Bcmd1bWVudHMpOgorICAgICAgICAgICAgICAgIG1heWJlZTA2MDEgPSBzdG10LmZyb21saW5lbm8gPD0gZGVmc3RtdC5mcm9tbGluZW5vCisgICAgICAgIGVsaWYgcmVjdXJzaXZlX2tsYXNzOgorICAgICAgICAgICAgbWF5YmVlMDYwMSA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1heWJlZTA2MDEgPSBtYXliZWUwNjAxIGFuZCBzdG10LmZyb21saW5lbm8gPD0gZGVmc3RtdC5mcm9tbGluZW5vCisgICAgICAgICAgICBpZiBtYXliZWUwNjAxIGFuZCBzdG10LmZyb21saW5lbm8gPT0gZGVmc3RtdC5mcm9tbGluZW5vOgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkZWZmcmFtZSwgYXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgICAgICAgICAgICAgYW5kIGZyYW1lIGlzIGRlZmZyYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBkZWZmcmFtZS5wYXJlbnRfb2Yobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIHN0bXQgaXMgbm90IGRlZnN0bXQKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAjIFNpbmdsZSBzdGF0ZW1lbnQgZnVuY3Rpb24sIHdpdGggdGhlIHN0YXRlbWVudCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBzYW1lIGxpbmUgYXMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAgICAgICAgICAgICAgICAgICAgbWF5YmVlMDYwMSA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxpZiAoCisgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZzdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuQXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuQW5uQXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuQXVnQXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoZGVmc3RtdC52YWx1ZSwgYXN0cm9pZC5JZkV4cCkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGZyYW1lIGlzIGRlZmZyYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBkZWZmcmFtZS5wYXJlbnRfb2Yobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIHN0bXQgaXMgZGVmc3RtdAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICMgU2luZ2xlIHN0YXRlbWVudCBpZiwgd2l0aCBhc3NpbmdtZW50IGV4cHJlc3Npb24gb24gc2FtZQorICAgICAgICAgICAgICAgICAgICAjIGxpbmUgYXMgYXNzaWdtZW50CisgICAgICAgICAgICAgICAgICAgICMgeCA9IGIgaWYgKGIgOj0gVHJ1ZSkgZWxzZSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBtYXliZWUwNjAxID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlbGlmICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSggICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LWJvb2xlYW4tZXhwcmVzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZm5vZGUsIGFzdHJvaWQuTmFtZWRFeHByCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGZyYW1lIGlzIGRlZmZyYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBkZWZmcmFtZS5wYXJlbnRfb2Yoc3RtdCkKKyAgICAgICAgICAgICAgICAgICAgYW5kIHN0bXQgaXMgZGVmc3RtdAorICAgICAgICAgICAgICAgICAgICBhbmQgKAorICAgICAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZm5vZGUubGluZW5vID09IG5vZGUubGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRlZm5vZGUuY29sX29mZnNldCA8IG5vZGUuY29sX29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3IgKGRlZm5vZGUubGluZW5vIDwgbm9kZS5saW5lbm8pCisgICAgICAgICAgICAgICAgICAgICAgICBvciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJc3N1ZSBpbiB0aGUgYGFzdGAgbW9kdWxlIHVudGlsIHB5MzkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vZGVzIGluIGEgbXVsdGlsaW5lIHN0cmluZyBoYXZlIHRoZSBzYW1lIGxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ291bGQgYmUgZmFsc2UtcG9zaXRpdmUgd2l0aG91dCBjaGVjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBQWTM5X1BMVVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGVmbm9kZS5saW5lbm8gPT0gbm9kZS5saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmc3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0cm9pZC5Bc3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3Ryb2lkLkFubkFzc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdHJvaWQuQXVnQXNzaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0cm9pZC5SZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKGRlZnN0bXQudmFsdWUsIGFzdHJvaWQuSm9pbmVkU3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgIyBFeHByZXNzaW9ucywgd2l0aCBhc3NpZ25tZW50IGV4cHJlc3Npb25zCisgICAgICAgICAgICAgICAgICAgICMgVXNlIG9ubHkgYWZ0ZXIgYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAjIGIgPSAoYyA6PSAyKSBhbmQgYworICAgICAgICAgICAgICAgICAgICBtYXliZWUwNjAxID0gRmFsc2UKKworICAgICAgICAgICAgIyBMb29rIGZvciB0eXBlIGNoZWNraW5nIGRlZmluaXRpb25zIGluc2lkZSBhIHR5cGUgY2hlY2tpbmcgZ3VhcmQuCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRlZnN0bXQsIChhc3Ryb2lkLkltcG9ydCwgYXN0cm9pZC5JbXBvcnRGcm9tKSk6CisgICAgICAgICAgICAgICAgZGVmc3RtdF9wYXJlbnQgPSBkZWZzdG10LnBhcmVudAorCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRlZnN0bXRfcGFyZW50LCBhc3Ryb2lkLklmKQorICAgICAgICAgICAgICAgICAgICBhbmQgZGVmc3RtdF9wYXJlbnQudGVzdC5hc19zdHJpbmcoKSBpbiBUWVBJTkdfVFlQRV9DSEVDS1NfR1VBUkRTCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgIyBFeGVtcHQgdGhvc2UgZGVmaW5pdGlvbnMgdGhhdCBhcmUgdXNlZCBpbnNpZGUgdGhlIHR5cGUgY2hlY2tpbmcKKyAgICAgICAgICAgICAgICAgICAgIyBndWFyZCBvciB0aGF0IGFyZSBkZWZpbmVkIGluIGJvdGggdHlwZSBjaGVja2luZyBndWFyZCBicmFuY2hlcy4KKyAgICAgICAgICAgICAgICAgICAgdXNlZF9pbl9icmFuY2ggPSBkZWZzdG10X3BhcmVudC5wYXJlbnRfb2Yobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lZF9pbl9vcl9lbHNlID0gRmFsc2UKKworICAgICAgICAgICAgICAgICAgICBmb3IgZGVmaW5pdGlvbiBpbiBkZWZzdG10X3BhcmVudC5vcmVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRlZmluaXRpb24sIGFzdHJvaWQuQXNzaWduKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkX2luX29yX2Vsc2UgPSBhbnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5uYW1lID09IG5hbWUgZm9yIHRhcmdldCBpbiBkZWZpbml0aW9uLnRhcmdldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZF9pbl9vcl9lbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB1c2VkX2luX2JyYW5jaCBhbmQgbm90IGRlZmluZWRfaW5fb3JfZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlZTA2MDEgPSBUcnVlCisKKyAgICAgICAgcmV0dXJuIG1heWJlZTA2MDEsIGFubm90YXRpb25fcmV0dXJuLCB1c2Vfb3V0ZXJfZGVmaW5pdGlvbgorCisgICAgZGVmIF9pZ25vcmVfY2xhc3Nfc2NvcGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBpbiBhIGxvY2FsIGNsYXNzIHNjb3BlLCBhcyBhbiBhc3NpZ25tZW50LgorCisgICAgICAgIDpwYXJhbSBub2RlOiBOb2RlIGNvbnNpZGVyZWQKKyAgICAgICAgOnR5cGUgbm9kZTogYXN0cm9pZC5Ob2RlCisgICAgICAgIDpyZXR1cm46IFRydWUgaWYgdGhlIG5vZGUgaXMgaW4gYSBsb2NhbCBjbGFzcyBzY29wZSwgYXMgYW4gYXNzaWdubWVudC4gRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICA6cnR5cGU6IGJvb2wKKyAgICAgICAgIiIiCisgICAgICAgICMgRGV0ZWN0IGlmIHdlIGFyZSBpbiBhIGxvY2FsIGNsYXNzIHNjb3BlLCBhcyBhbiBhc3NpZ25tZW50LgorICAgICAgICAjIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGlzIGZhaXIgZ2FtZS4KKyAgICAgICAgIworICAgICAgICAjIGNsYXNzIEE6CisgICAgICAgICMgICAgYiA9IDEKKyAgICAgICAgIyAgICBjID0gbGFtYmRhIGI9YjogYiAqIGIKKyAgICAgICAgIworICAgICAgICAjIGNsYXNzIEI6CisgICAgICAgICMgICAgdHAgPSAxCisgICAgICAgICMgICAgZGVmIGZ1bmMoc2VsZiwgYXJnOiB0cCk6CisgICAgICAgICMgICAgICAgIC4uLgorICAgICAgICAjIGNsYXNzIEM6CisgICAgICAgICMgICAgdHAgPSAyCisgICAgICAgICMgICAgZGVmIGZ1bmMoc2VsZiwgYXJnPXRwKToKKyAgICAgICAgIyAgICAgICAgLi4uCisgICAgICAgICMgY2xhc3MgQzoKKyAgICAgICAgIyAgICBjbGFzcyBUcDoKKyAgICAgICAgIyAgICAgICAgcGFzcworICAgICAgICAjICAgIGNsYXNzIEQoVHApOgorICAgICAgICAjICAgICAgICAuLi4KKworICAgICAgICBuYW1lID0gbm9kZS5uYW1lCisgICAgICAgIGZyYW1lID0gbm9kZS5zdGF0ZW1lbnQoKS5zY29wZSgpCisgICAgICAgIGluX2Fubm90YXRpb25fb3JfZGVmYXVsdF9vcl9kZWNvcmF0b3IgPSBzZWxmLl9kZWZpbmVkX2luX2Z1bmN0aW9uX2RlZmluaXRpb24oCisgICAgICAgICAgICBub2RlLCBmcmFtZQorICAgICAgICApCisgICAgICAgIGluX2FuY2VzdG9yX2xpc3QgPSB1dGlscy5pc19hbmNlc3Rvcl9uYW1lKGZyYW1lLCBub2RlKQorICAgICAgICBpZiBpbl9hbm5vdGF0aW9uX29yX2RlZmF1bHRfb3JfZGVjb3JhdG9yIG9yIGluX2FuY2VzdG9yX2xpc3Q6CisgICAgICAgICAgICBmcmFtZV9sb2NhbHMgPSBmcmFtZS5wYXJlbnQuc2NvcGUoKS5sb2NhbHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyYW1lX2xvY2FscyA9IGZyYW1lLmxvY2FscworICAgICAgICByZXR1cm4gbm90ICgKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGZyYW1lLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgICAgIG9yIGluX2Fubm90YXRpb25fb3JfZGVmYXVsdF9vcl9kZWNvcmF0b3IKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5faW5fbGFtYmRhX29yX2NvbXByZWhlbnNpb25fYm9keShub2RlLCBmcmFtZSkKKyAgICAgICAgICAgIGFuZCBuYW1lIGluIGZyYW1lX2xvY2FscworICAgICAgICApCisKKyAgICBkZWYgX2xvb3B2YXJfbmFtZShzZWxmLCBub2RlLCBuYW1lKToKKyAgICAgICAgIyBmaWx0ZXIgdmFyaWFibGVzIGFjY29yZGluZyB0byBub2RlJ3Mgc2NvcGUKKyAgICAgICAgaWYgbm90IHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgidW5kZWZpbmVkLWxvb3AtdmFyaWFibGUiKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhc3RtdHMgPSBbc3RtdCBmb3Igc3RtdCBpbiBub2RlLmxvb2t1cChuYW1lKVsxXSBpZiBoYXNhdHRyKHN0bXQsICJhc3NpZ25fdHlwZSIpXQorICAgICAgICAjIElmIHRoaXMgdmFyaWFibGUgdXNhZ2UgZXhpc3RzIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAgICAgICAgIyB0aGF0IGV4aXN0cyBpbiB0aGUgc2FtZSBsb29wLAorICAgICAgICAjIHRoZSB1c2FnZSBpcyBzYWZlIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGRlZmluZWQgZWl0aGVyIGlmCisgICAgICAgICMgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLgorICAgICAgICBzY29wZSA9IG5vZGUuc2NvcGUoKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNjb3BlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKSBhbmQgYW55KAorICAgICAgICAgICAgYXNtdC5zdGF0ZW1lbnQoKS5wYXJlbnRfb2Yoc2NvcGUpIGZvciBhc210IGluIGFzdG10cworICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBmaWx0ZXIgdmFyaWFibGVzIGFjY29yZGluZyB0aGVpciByZXNwZWN0aXZlIHNjb3BlIHRlc3QgaXNfc3RhdGVtZW50CisgICAgICAgICMgYW5kIHBhcmVudCB0byBhdm9pZCAjNzQ3NDcuIFRoaXMgaXMgbm90IGEgdG90YWwgZml4LCB3aGljaCB3b3VsZAorICAgICAgICAjIGludHJvZHVjZSBhIG1lY2hhbmlzbSBzaW1pbGFyIHRvIHNwZWNpYWwgYXR0cmlidXRlIGxvb2t1cCBpbgorICAgICAgICAjIG1vZHVsZXMuIEFsc28sIGluIG9yZGVyIHRvIGdldCBjb3JyZWN0IGluZmVyZW5jZSBpbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICAjIHNjb3BlIGxvb2t1cCBydWxlcyB3b3VsZCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gcmV0dXJuIHRoZSBpbml0aWFsCisgICAgICAgICMgYXNzaWdubWVudCAod2hpY2ggZG9lcyBub3QgZXhpc3QgaW4gY29kZSBwZXIgc2UpIGFzIHdlbGwgYXMgYW55IGxhdGVyCisgICAgICAgICMgbW9kaWZpY2F0aW9ucy4KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgbm90IGFzdG10cworICAgICAgICAgICAgb3IgKGFzdG10c1swXS5pc19zdGF0ZW1lbnQgb3IgYXN0bXRzWzBdLnBhcmVudCkKKyAgICAgICAgICAgIGFuZCBhc3RtdHNbMF0uc3RhdGVtZW50KCkucGFyZW50X29mKG5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBfYXN0bXRzID0gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9hc3RtdHMgPSBhc3RtdHNbOjFdCisgICAgICAgIGZvciBpLCBzdG10IGluIGVudW1lcmF0ZShhc3RtdHNbMTpdKToKKyAgICAgICAgICAgIGlmIGFzdG10c1tpXS5zdGF0ZW1lbnQoKS5wYXJlbnRfb2Yoc3RtdCkgYW5kIG5vdCBpbl9mb3JfZWxzZV9icmFuY2goCisgICAgICAgICAgICAgICAgYXN0bXRzW2ldLnN0YXRlbWVudCgpLCBzdG10CisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBfYXN0bXRzLmFwcGVuZChzdG10KQorICAgICAgICBhc3RtdHMgPSBfYXN0bXRzCisgICAgICAgIGlmIGxlbihhc3RtdHMpICE9IDE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBhc3NpZ24gPSBhc3RtdHNbMF0uYXNzaWduX3R5cGUoKQorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBhc3NpZ24sIChhc3Ryb2lkLkZvciwgYXN0cm9pZC5Db21wcmVoZW5zaW9uLCBhc3Ryb2lkLkdlbmVyYXRvckV4cCkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGFuZCBhc3NpZ24uc3RhdGVtZW50KCkgaXMgbm90IG5vZGUuc3RhdGVtZW50KCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRm9yIGZ1bmN0aW9ucyB3ZSBjYW4gZG8gbW9yZSBieSBpbmZlcnJpbmcgdGhlIGxlbmd0aCBvZiB0aGUgaXRlcmVkIG9iamVjdAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3NpZ24sIGFzdHJvaWQuRm9yKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVuZGVmaW5lZC1sb29wLXZhcmlhYmxlIiwgYXJncz1uYW1lLCBub2RlPW5vZGUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmZlcnJlZCA9IG5leHQoYXNzaWduLml0ZXIuaW5mZXIoKSkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bmRlZmluZWQtbG9vcC12YXJpYWJsZSIsIGFyZ3M9bmFtZSwgbm9kZT1ub2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuSW5zdGFuY2UpCisgICAgICAgICAgICAgICAgYW5kIGluZmVycmVkLnFuYW1lKCkgPT0gQlVJTFRJTl9SQU5HRQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAjIENvbnNpZGVyIHJhbmdlKCkgb2JqZWN0cyBzYWZlLCBldmVuIGlmIHRoZXkgbWlnaHQgbm90IHlpZWxkIGFueSByZXN1bHRzLgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIENvbnNpZGVyIHNlcXVlbmNlcy4KKyAgICAgICAgICAgIHNlcXVlbmNlcyA9ICgKKyAgICAgICAgICAgICAgICBhc3Ryb2lkLkxpc3QsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5UdXBsZSwKKyAgICAgICAgICAgICAgICBhc3Ryb2lkLkRpY3QsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5TZXQsCisgICAgICAgICAgICAgICAgYXN0cm9pZC5vYmplY3RzLkZyb3plblNldCwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZmVycmVkLCBzZXF1ZW5jZXMpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVuZGVmaW5lZC1sb29wLXZhcmlhYmxlIiwgYXJncz1uYW1lLCBub2RlPW5vZGUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGVsZW1lbnRzID0gZ2V0YXR0cihpbmZlcnJlZCwgImVsdHMiLCBnZXRhdHRyKGluZmVycmVkLCAiaXRlbXMiLCBbXSkpCisgICAgICAgICAgICBpZiBub3QgZWxlbWVudHM6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW5kZWZpbmVkLWxvb3AtdmFyaWFibGUiLCBhcmdzPW5hbWUsIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfaXNfdW51c2VkKHNlbGYsIG5hbWUsIG5vZGUsIHN0bXQsIGdsb2JhbF9uYW1lcywgbm9ubG9jYWxfbmFtZXMpOgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT10b28tbWFueS1icmFuY2hlcworICAgICAgICAjIElnbm9yZSBzb21lIHNwZWNpYWwgbmFtZXMgc3BlY2lmaWVkIGJ5IHVzZXIgY29uZmlndXJhdGlvbi4KKyAgICAgICAgaWYgc2VsZi5faXNfbmFtZV9pZ25vcmVkKHN0bXQsIG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgSWdub3JlIG5hbWVzIHRoYXQgd2VyZSBhZGRlZCBkeW5hbWljYWxseSB0byB0aGUgRnVuY3Rpb24gc2NvcGUKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgYW5kIG5hbWUgPT0gIl9fY2xhc3NfXyIKKyAgICAgICAgICAgIGFuZCBsZW4obm9kZS5sb2NhbHNbIl9fY2xhc3NfXyJdKSA9PSAxCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmxvY2Fsc1siX19jbGFzc19fIl1bMF0sIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIElnbm9yZSBuYW1lcyBpbXBvcnRlZCBieSB0aGUgZ2xvYmFsIHN0YXRlbWVudC4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCAoYXN0cm9pZC5HbG9iYWwsIGFzdHJvaWQuSW1wb3J0LCBhc3Ryb2lkLkltcG9ydEZyb20pKToKKyAgICAgICAgICAgICMgRGV0ZWN0IGltcG9ydHMsIGFzc2lnbmVkIHRvIGdsb2JhbCBzdGF0ZW1lbnRzLgorICAgICAgICAgICAgaWYgZ2xvYmFsX25hbWVzIGFuZCBfaW1wb3J0X25hbWVfaXNfZ2xvYmFsKHN0bXQsIGdsb2JhbF9uYW1lcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYXJnbmFtZXMgPSBsaXN0KAorICAgICAgICAgICAgaXRlcnRvb2xzLmNoYWluKG5vZGUuYXJnbmFtZXMoKSwgW2FyZy5uYW1lIGZvciBhcmcgaW4gbm9kZS5hcmdzLmt3b25seWFyZ3NdKQorICAgICAgICApCisgICAgICAgICMgQ2FyZSBhYm91dCBmdW5jdGlvbnMgd2l0aCB1bmtub3duIGFyZ3VtZW50IChidWlsdGlucykKKyAgICAgICAgaWYgbmFtZSBpbiBhcmduYW1lczoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3VudXNlZF9hcmd1bWVudHMobmFtZSwgbm9kZSwgc3RtdCwgYXJnbmFtZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzdG10LnBhcmVudCBhbmQgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBzdG10LnBhcmVudCwgKGFzdHJvaWQuQXNzaWduLCBhc3Ryb2lkLkFubkFzc2lnbikKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBub25sb2NhbF9uYW1lczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHFuYW1lID0gYXNuYW1lID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCAoYXN0cm9pZC5JbXBvcnQsIGFzdHJvaWQuSW1wb3J0RnJvbSkpOgorICAgICAgICAgICAgICAgICMgTmVlZCB0aGUgY29tcGxldGUgbmFtZSwgd2hpY2ggd2UgZG9uJ3QgaGF2ZSBpbiAubG9jYWxzLgorICAgICAgICAgICAgICAgIGlmIGxlbihzdG10Lm5hbWVzKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydF9uYW1lcyA9IG5leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAobmFtZXMgZm9yIG5hbWVzIGluIHN0bXQubmFtZXMgaWYgbmFtZSBpbiBuYW1lcyksIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydF9uYW1lcyA9IHN0bXQubmFtZXNbMF0KKyAgICAgICAgICAgICAgICBpZiBpbXBvcnRfbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIHFuYW1lLCBhc25hbWUgPSBpbXBvcnRfbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFzbmFtZSBvciBxbmFtZQorCisgICAgICAgICAgICBpZiBfaGFzX2xvY2Fsc19jYWxsX2FmdGVyX25vZGUoc3RtdCwgbm9kZS5zY29wZSgpKToKKyAgICAgICAgICAgICAgICBtZXNzYWdlX25hbWUgPSAicG9zc2libHktdW51c2VkLXZhcmlhYmxlIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuSW1wb3J0KToKKyAgICAgICAgICAgICAgICAgICAgaWYgYXNuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gZiJ7cW5hbWV9IGltcG9ydGVkIGFzIHthc25hbWV9IgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gImltcG9ydCAlcyIgJSBuYW1lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVudXNlZC1pbXBvcnQiLCBhcmdzPW1zZywgbm9kZT1zdG10KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuSW1wb3J0RnJvbSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFzbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGYie3FuYW1lfSBpbXBvcnRlZCBmcm9tIHtzdG10Lm1vZG5hbWV9IGFzIHthc25hbWV9IgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gZiJ7bmFtZX0gaW1wb3J0ZWQgZnJvbSB7c3RtdC5tb2RuYW1lfSIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgidW51c2VkLWltcG9ydCIsIGFyZ3M9bXNnLCBub2RlPXN0bXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIG1lc3NhZ2VfbmFtZSA9ICJ1bnVzZWQtdmFyaWFibGUiCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgYXN0cm9pZC5GdW5jdGlvbkRlZikgYW5kIHN0bXQuZGVjb3JhdG9yczoKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBEb24ndCBjaGVjayBmdW5jdGlvbiBzdHVicyBjcmVhdGVkIG9ubHkgZm9yIHR5cGUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGlmIHV0aWxzLmlzX292ZXJsb2FkX3N0dWIobm9kZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UobWVzc2FnZV9uYW1lLCBhcmdzPW5hbWUsIG5vZGU9c3RtdCkKKworICAgIGRlZiBfaXNfbmFtZV9pZ25vcmVkKHNlbGYsIHN0bXQsIG5hbWUpOgorICAgICAgICBhdXRob3JpemVkX3JneCA9IHNlbGYuY29uZmlnLmR1bW15X3ZhcmlhYmxlc19yZ3gKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShzdG10LCBhc3Ryb2lkLkFzc2lnbk5hbWUpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzdG10LnBhcmVudCwgYXN0cm9pZC5Bcmd1bWVudHMpCisgICAgICAgICAgICBvciBpc2luc3RhbmNlKHN0bXQsIGFzdHJvaWQuQXJndW1lbnRzKQorICAgICAgICApOgorICAgICAgICAgICAgcmVnZXggPSBzZWxmLmNvbmZpZy5pZ25vcmVkX2FyZ3VtZW50X25hbWVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWdleCA9IGF1dGhvcml6ZWRfcmd4CisgICAgICAgIHJldHVybiByZWdleCBhbmQgcmVnZXgubWF0Y2gobmFtZSkKKworICAgIGRlZiBfY2hlY2tfdW51c2VkX2FyZ3VtZW50cyhzZWxmLCBuYW1lLCBub2RlLCBzdG10LCBhcmduYW1lcyk6CisgICAgICAgIGlzX21ldGhvZCA9IG5vZGUuaXNfbWV0aG9kKCkKKyAgICAgICAga2xhc3MgPSBub2RlLnBhcmVudC5mcmFtZSgpCisgICAgICAgIGlmIGlzX21ldGhvZCBhbmQgaXNpbnN0YW5jZShrbGFzcywgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICBjb25maWRlbmNlID0gKAorICAgICAgICAgICAgICAgIElORkVSRU5DRSBpZiB1dGlscy5oYXNfa25vd25fYmFzZXMoa2xhc3MpIGVsc2UgSU5GRVJFTkNFX0ZBSUxVUkUKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBISUdICisKKyAgICAgICAgaWYgaXNfbWV0aG9kOgorICAgICAgICAgICAgIyBEb24ndCB3YXJuIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgb2YgYSAobm9uIHN0YXRpYykgbWV0aG9kCisgICAgICAgICAgICBpZiBub2RlLnR5cGUgIT0gInN0YXRpY21ldGhvZCIgYW5kIG5hbWUgPT0gYXJnbmFtZXNbMF06CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIERvbid0IHdhcm4gZm9yIGFyZ3VtZW50IG9mIGFuIG92ZXJyaWRkZW4gbWV0aG9kCisgICAgICAgICAgICBvdmVycmlkZGVuID0gb3ZlcnJpZGRlbl9tZXRob2Qoa2xhc3MsIG5vZGUubmFtZSkKKyAgICAgICAgICAgIGlmIG92ZXJyaWRkZW4gaXMgbm90IE5vbmUgYW5kIG5hbWUgaW4gb3ZlcnJpZGRlbi5hcmduYW1lcygpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbm9kZS5uYW1lIGluIHV0aWxzLlBZTUVUSE9EUyBhbmQgbm9kZS5uYW1lIG5vdCBpbiAoCisgICAgICAgICAgICAgICAgIl9faW5pdF9fIiwKKyAgICAgICAgICAgICAgICAiX19uZXdfXyIsCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIERvbid0IGNoZWNrIGNhbGxiYWNrIGFyZ3VtZW50cworICAgICAgICBpZiBhbnkoCisgICAgICAgICAgICBub2RlLm5hbWUuc3RhcnRzd2l0aChjYikgb3Igbm9kZS5uYW1lLmVuZHN3aXRoKGNiKQorICAgICAgICAgICAgZm9yIGNiIGluIHNlbGYuY29uZmlnLmNhbGxiYWNrcworICAgICAgICApOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgRG9uJ3QgY2hlY2sgYXJndW1lbnRzIG9mIHNpbmdsZWRpc3BhdGNoLnJlZ2lzdGVyIGZ1bmN0aW9uLgorICAgICAgICBpZiB1dGlscy5pc19yZWdpc3RlcmVkX2luX3NpbmdsZWRpc3BhdGNoX2Z1bmN0aW9uKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBEb24ndCBjaGVjayBmdW5jdGlvbiBzdHVicyBjcmVhdGVkIG9ubHkgZm9yIHR5cGUgaW5mb3JtYXRpb24KKyAgICAgICAgaWYgdXRpbHMuaXNfb3ZlcmxvYWRfc3R1Yihub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRG9uJ3QgY2hlY2sgcHJvdG9jb2wgY2xhc3NlcworICAgICAgICBpZiB1dGlscy5pc19wcm90b2NvbF9jbGFzcyhrbGFzcyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bnVzZWQtYXJndW1lbnQiLCBhcmdzPW5hbWUsIG5vZGU9c3RtdCwgY29uZmlkZW5jZT1jb25maWRlbmNlKQorCisgICAgZGVmIF9jaGVja19sYXRlX2JpbmRpbmdfY2xvc3VyZShzZWxmLCBub2RlLCBhc3NpZ25tZW50X25vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5saW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJjZWxsLXZhci1mcm9tLWxvb3AiKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZiBfaXNfZGlyZWN0X2xhbWJkYV9jYWxsKCk6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZV9zY29wZS5wYXJlbnQsIGFzdHJvaWQuQ2FsbCkKKyAgICAgICAgICAgICAgICBhbmQgbm9kZV9zY29wZS5wYXJlbnQuZnVuYyBpcyBub2RlX3Njb3BlCisgICAgICAgICAgICApCisKKyAgICAgICAgbm9kZV9zY29wZSA9IG5vZGUuc2NvcGUoKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlX3Njb3BlLCAoYXN0cm9pZC5MYW1iZGEsIGFzdHJvaWQuRnVuY3Rpb25EZWYpKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLkFyZ3VtZW50cyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBpc2luc3RhbmNlKGFzc2lnbm1lbnRfbm9kZSwgYXN0cm9pZC5Db21wcmVoZW5zaW9uKToKKyAgICAgICAgICAgIGlmIGFzc2lnbm1lbnRfbm9kZS5wYXJlbnQucGFyZW50X29mKG5vZGUuc2NvcGUoKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY2VsbC12YXItZnJvbS1sb29wIiwgbm9kZT1ub2RlLCBhcmdzPW5vZGUubmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2lnbl9zY29wZSA9IGFzc2lnbm1lbnRfbm9kZS5zY29wZSgpCisgICAgICAgICAgICBtYXliZV9mb3IgPSBhc3NpZ25tZW50X25vZGUKKyAgICAgICAgICAgIHdoaWxlIG1heWJlX2ZvciBhbmQgbm90IGlzaW5zdGFuY2UobWF5YmVfZm9yLCBhc3Ryb2lkLkZvcik6CisgICAgICAgICAgICAgICAgaWYgbWF5YmVfZm9yIGlzIGFzc2lnbl9zY29wZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBtYXliZV9mb3IgPSBtYXliZV9mb3IucGFyZW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgbWF5YmVfZm9yCisgICAgICAgICAgICAgICAgICAgIGFuZCBtYXliZV9mb3IucGFyZW50X29mKG5vZGVfc2NvcGUpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgX2lzX2RpcmVjdF9sYW1iZGFfY2FsbCgpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShub2RlX3Njb3BlLnN0YXRlbWVudCgpLCBhc3Ryb2lkLlJldHVybikKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjZWxsLXZhci1mcm9tLWxvb3AiLCBub2RlPW5vZGUsIGFyZ3M9bm9kZS5uYW1lKQorCisgICAgZGVmIF9zaG91bGRfaWdub3JlX3JlZGVmaW5lZF9idWlsdGluKHNlbGYsIHN0bXQpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzdG10LCBhc3Ryb2lkLkltcG9ydEZyb20pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzdG10Lm1vZG5hbWUgaW4gc2VsZi5jb25maWcucmVkZWZpbmluZ19idWlsdGluc19tb2R1bGVzCisKKyAgICBkZWYgX2FsbG93ZWRfcmVkZWZpbmVkX2J1aWx0aW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuY29uZmlnLmFsbG93ZWRfcmVkZWZpbmVkX2J1aWx0aW5zCisKKyAgICBkZWYgX2hhc19ob21vbnltX2luX3VwcGVyX2Z1bmN0aW9uX3Njb3BlKHNlbGYsIG5vZGUsIGluZGV4KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgbm9kZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHRvX2NvbnN1bWUgZGljdCBvZiBhbiB1cHBlciBzY29wZQorICAgICAgICBhbmQgaWYgdGhhdCBzY29wZSBpcyBhIGZ1bmN0aW9uCisKKyAgICAgICAgOnBhcmFtIG5vZGU6IG5vZGUgdG8gY2hlY2sgZm9yCisgICAgICAgIDp0eXBlIG5vZGU6IGFzdHJvaWQuTm9kZQorICAgICAgICA6cGFyYW0gaW5kZXg6IGluZGV4IG9mIHRoZSBjdXJyZW50IGNvbnN1bWVyIGluc2lkZSBzZWxmLl90b19jb25zdW1lCisgICAgICAgIDp0eXBlIGluZGV4OiBpbnQKKyAgICAgICAgOnJldHVybjogVHJ1ZSBpZiB0aGVyZSBpcyBhIG5vZGUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSB0b19jb25zdW1lIGRpY3Qgb2YgYW4gdXBwZXIgc2NvcGUKKyAgICAgICAgICAgICAgICAgYW5kIGlmIHRoYXQgc2NvcGUgaXMgYSBmdW5jdGlvbgorICAgICAgICA6cnR5cGU6IGJvb2wKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBfY29uc3VtZXIgaW4gc2VsZi5fdG9fY29uc3VtZVtpbmRleCAtIDEgOjogLTFdOgorICAgICAgICAgICAgaWYgX2NvbnN1bWVyLnNjb3BlX3R5cGUgPT0gImZ1bmN0aW9uIiBhbmQgbm9kZS5uYW1lIGluIF9jb25zdW1lci50b19jb25zdW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9zdG9yZV90eXBlX2Fubm90YXRpb25fbm9kZShzZWxmLCB0eXBlX2Fubm90YXRpb24pOgorICAgICAgICAiIiJHaXZlbiBhIHR5cGUgYW5ub3RhdGlvbiwgc3RvcmUgYWxsIHRoZSBuYW1lIG5vZGVzIGl0IHJlZmVycyB0byIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHR5cGVfYW5ub3RhdGlvbiwgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgIHNlbGYuX3R5cGVfYW5ub3RhdGlvbl9uYW1lcy5hcHBlbmQodHlwZV9hbm5vdGF0aW9uLm5hbWUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0eXBlX2Fubm90YXRpb24sIGFzdHJvaWQuU3Vic2NyaXB0KToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UodHlwZV9hbm5vdGF0aW9uLnZhbHVlLCBhc3Ryb2lkLkF0dHJpYnV0ZSkKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKHR5cGVfYW5ub3RhdGlvbi52YWx1ZS5leHByLCBhc3Ryb2lkLk5hbWUpCisgICAgICAgICAgICBhbmQgdHlwZV9hbm5vdGF0aW9uLnZhbHVlLmV4cHIubmFtZSA9PSBUWVBJTkdfTU9EVUxFCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLl90eXBlX2Fubm90YXRpb25fbmFtZXMuYXBwZW5kKFRZUElOR19NT0RVTEUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl90eXBlX2Fubm90YXRpb25fbmFtZXMuZXh0ZW5kKAorICAgICAgICAgICAgYW5ub3RhdGlvbi5uYW1lCisgICAgICAgICAgICBmb3IgYW5ub3RhdGlvbiBpbiB0eXBlX2Fubm90YXRpb24ubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5OYW1lKQorICAgICAgICApCisKKyAgICBkZWYgX3N0b3JlX3R5cGVfYW5ub3RhdGlvbl9uYW1lcyhzZWxmLCBub2RlKToKKyAgICAgICAgdHlwZV9hbm5vdGF0aW9uID0gbm9kZS50eXBlX2Fubm90YXRpb24KKyAgICAgICAgaWYgbm90IHR5cGVfYW5ub3RhdGlvbjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9zdG9yZV90eXBlX2Fubm90YXRpb25fbm9kZShub2RlLnR5cGVfYW5ub3RhdGlvbikKKworICAgIGRlZiBfY2hlY2tfc2VsZl9jbHNfYXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHNlbGYvY2xzIGRvbid0IGdldCBhc3NpZ25lZCIiIgorICAgICAgICBhc3NpZ25fbmFtZXMgPSB7CisgICAgICAgICAgICB0YXJnZXQubmFtZQorICAgICAgICAgICAgZm9yIHRhcmdldCBpbiBub2RlLnRhcmdldHMKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCBhc3Ryb2lkLkFzc2lnbk5hbWUpCisgICAgICAgIH0KKyAgICAgICAgc2NvcGUgPSBub2RlLnNjb3BlKCkKKyAgICAgICAgbm9ubG9jYWxzX3dpdGhfc2FtZV9uYW1lID0gYW55KAorICAgICAgICAgICAgY2hpbGQKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBzY29wZS5ib2R5CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCBhc3Ryb2lkLk5vbmxvY2FsKSBhbmQgYXNzaWduX25hbWVzICYgc2V0KGNoaWxkLm5hbWVzKQorICAgICAgICApCisgICAgICAgIGlmIG5vbmxvY2Fsc193aXRoX3NhbWVfbmFtZToKKyAgICAgICAgICAgIHNjb3BlID0gbm9kZS5zY29wZSgpLnBhcmVudC5zY29wZSgpCisKKyAgICAgICAgaWYgbm90ICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2Uoc2NvcGUsIGFzdHJvaWQuc2NvcGVkX25vZGVzLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgYW5kIHNjb3BlLmlzX21ldGhvZCgpCisgICAgICAgICAgICBhbmQgImJ1aWx0aW5zLnN0YXRpY21ldGhvZCIgbm90IGluIHNjb3BlLmRlY29yYXRvcm5hbWVzKCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhcmd1bWVudF9uYW1lcyA9IHNjb3BlLmFyZ25hbWVzKCkKKyAgICAgICAgaWYgbm90IGFyZ3VtZW50X25hbWVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGZfY2xzX25hbWUgPSBhcmd1bWVudF9uYW1lc1swXQorICAgICAgICB0YXJnZXRfYXNzaWduX25hbWVzID0gKAorICAgICAgICAgICAgdGFyZ2V0Lm5hbWUKKyAgICAgICAgICAgIGZvciB0YXJnZXQgaW4gbm9kZS50YXJnZXRzCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhcmdldCwgYXN0cm9pZC5ub2RlX2NsYXNzZXMuQXNzaWduTmFtZSkKKyAgICAgICAgKQorICAgICAgICBpZiBzZWxmX2Nsc19uYW1lIGluIHRhcmdldF9hc3NpZ25fbmFtZXM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJzZWxmLWNscy1hc3NpZ25tZW50Iiwgbm9kZT1ub2RlLCBhcmdzPShzZWxmX2Nsc19uYW1lLCkpCisKKyAgICBkZWYgX2NoZWNrX3VucGFja2luZyhzZWxmLCBpbmZlcnJlZCwgbm9kZSwgdGFyZ2V0cyk6CisgICAgICAgICIiIkNoZWNrIGZvciB1bmJhbGFuY2VkIHR1cGxlIHVucGFja2luZworICAgICAgICBhbmQgdW5wYWNraW5nIG5vbiBzZXF1ZW5jZXMuCisgICAgICAgICIiIgorICAgICAgICBpZiB1dGlscy5pc19pbnNpZGVfYWJzdHJhY3RfY2xhc3Mobm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgdXRpbHMuaXNfY29tcHJlaGVuc2lvbihub2RlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpbmZlcnJlZCBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoaW5mZXJyZWQucGFyZW50LCBhc3Ryb2lkLkFyZ3VtZW50cykKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgICAgIGFuZCBub2RlLnZhbHVlLm5hbWUgPT0gaW5mZXJyZWQucGFyZW50LnZhcmFyZworICAgICAgICApOgorICAgICAgICAgICAgIyBWYXJpYWJsZS1sZW5ndGggYXJndW1lbnQsIHdlIGNhbid0IGRldGVybWluZSB0aGUgbGVuZ3RoLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mZXJyZWQsIChhc3Ryb2lkLlR1cGxlLCBhc3Ryb2lkLkxpc3QpKToKKyAgICAgICAgICAgICMgYXR0ZW1wdCB0byBjaGVjayB1bnBhY2tpbmcgaXMgcHJvcGVybHkgYmFsYW5jZWQKKyAgICAgICAgICAgIHZhbHVlcyA9IGluZmVycmVkLml0ZXJlZCgpCisgICAgICAgICAgICBpZiBsZW4odGFyZ2V0cykgIT0gbGVuKHZhbHVlcyk6CisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBoYXZlIHN0YXJyZWQgbm9kZXMuCisgICAgICAgICAgICAgICAgaWYgYW55KGlzaW5zdGFuY2UodGFyZ2V0LCBhc3Ryb2lkLlN0YXJyZWQpIGZvciB0YXJnZXQgaW4gdGFyZ2V0cyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJ1bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZyIsCisgICAgICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICAgICBfZ2V0X3VucGFja2luZ19leHRyYV9pbmZvKG5vZGUsIGluZmVycmVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbih0YXJnZXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbih2YWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgIyBhdHRlbXB0IHRvIGNoZWNrIHVucGFja2luZyBtYXkgYmUgcG9zc2libGUgKGllIFJIUyBpcyBpdGVyYWJsZSkKKyAgICAgICAgZWxpZiBub3QgdXRpbHMuaXNfaXRlcmFibGUoaW5mZXJyZWQpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAidW5wYWNraW5nLW5vbi1zZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KF9nZXRfdW5wYWNraW5nX2V4dHJhX2luZm8obm9kZSwgaW5mZXJyZWQpLCksCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX21vZHVsZV9hdHRycyhzZWxmLCBub2RlLCBtb2R1bGUsIG1vZHVsZV9uYW1lcyk6CisgICAgICAgICIiImNoZWNrIHRoYXQgbW9kdWxlX25hbWVzIChsaXN0IG9mIHN0cmluZykgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUKKyAgICAgICAgZ2l2ZW4gbW9kdWxlCisgICAgICAgIGlmIHRoZSBsYXRlc3QgYWNjZXNzIG5hbWUgY29ycmVzcG9uZHMgdG8gYSBtb2R1bGUsIHJldHVybiBpdAorICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgbmFtZSA9IG1vZHVsZV9uYW1lcy5wb3AoMCkKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gIl9fZGljdF9fIjoKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBOb25lCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBuZXh0KG1vZHVsZS5nZXRhdHRyKG5hbWUpWzBdLmluZmVyKCkpCisgICAgICAgICAgICAgICAgaWYgbW9kdWxlIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5Ob3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIGlmIG1vZHVsZS5uYW1lIGluIHNlbGYuX2lnbm9yZWRfbW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAibm8tbmFtZS1pbi1tb2R1bGUiLCBhcmdzPShuYW1lLCBtb2R1bGUubmFtZSksIG5vZGU9bm9kZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgbW9kbmFtZSA9IG1vZHVsZS5uYW1lIGlmIG1vZHVsZSBlbHNlICJfX2RpY3RfXyIKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgIm5vLW5hbWUtaW4tbW9kdWxlIiwgbm9kZT1ub2RlLCBhcmdzPSgiLiIuam9pbihtb2R1bGVfbmFtZXMpLCBtb2RuYW1lKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsIGFzdHJvaWQuTW9kdWxlKToKKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfY2hlY2tfYWxsKHNlbGYsIG5vZGUsIG5vdF9jb25zdW1lZCk6CisgICAgICAgIGFzc2lnbmVkID0gbmV4dChub2RlLmlnZXRhdHRyKCJfX2FsbF9fIikpCisgICAgICAgIGlmIGFzc2lnbmVkIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3NpZ25lZCwgKGFzdHJvaWQuVHVwbGUsIGFzdHJvaWQuTGlzdCkpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1hbGwtZm9ybWF0Iiwgbm9kZT1hc3NpZ25lZCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBlbHQgaW4gZ2V0YXR0cihhc3NpZ25lZCwgImVsdHMiLCAoKSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZWx0X25hbWUgPSBuZXh0KGVsdC5pbmZlcigpKQorICAgICAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGVsdF9uYW1lIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBlbHRfbmFtZS5wYXJlbnQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWx0X25hbWUsIGFzdHJvaWQuQ29uc3QpIG9yIG5vdCBpc2luc3RhbmNlKAorICAgICAgICAgICAgICAgIGVsdF9uYW1lLnZhbHVlLCBzdHIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiaW52YWxpZC1hbGwtb2JqZWN0IiwgYXJncz1lbHQuYXNfc3RyaW5nKCksIG5vZGU9ZWx0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGVsdF9uYW1lID0gZWx0X25hbWUudmFsdWUKKyAgICAgICAgICAgICMgSWYgZWx0IGlzIGluIG5vdF9jb25zdW1lZCwgcmVtb3ZlIGl0IGZyb20gbm90X2NvbnN1bWVkCisgICAgICAgICAgICBpZiBlbHRfbmFtZSBpbiBub3RfY29uc3VtZWQ6CisgICAgICAgICAgICAgICAgZGVsIG5vdF9jb25zdW1lZFtlbHRfbmFtZV0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBlbHRfbmFtZSBub3QgaW4gbm9kZS5sb2NhbHM6CisgICAgICAgICAgICAgICAgaWYgbm90IG5vZGUucGFja2FnZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQtYWxsLXZhcmlhYmxlIiwgYXJncz0oZWx0X25hbWUsKSwgbm9kZT1lbHQKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdGV4dChub2RlLmZpbGUpWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUoYmFzZW5hbWUpID09ICJfX2luaXRfXyI6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9kZS5uYW1lICsgIi4iICsgZWx0X25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3Ryb2lkLm1vZHV0aWxzLmZpbGVfZnJvbV9tb2RwYXRoKG5hbWUuc3BsaXQoIi4iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5kZWZpbmVkLWFsbC12YXJpYWJsZSIsIGFyZ3M9KGVsdF9uYW1lLCksIG5vZGU9ZWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgeWllbGQgYSBzeW50YXgtZXJyb3Igd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaXQgd2lsbCBiZSBsYXRlciB5aWVsZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVuIHRoZSBmaWxlIHdpbGwgYmUgY2hlY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfY2hlY2tfZ2xvYmFscyhzZWxmLCBub3RfY29uc3VtZWQpOgorICAgICAgICBpZiBzZWxmLl9hbGxvd19nbG9iYWxfdW51c2VkX3ZhcmlhYmxlczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgbmFtZSwgbm9kZXMgaW4gbm90X2NvbnN1bWVkLml0ZW1zKCk6CisgICAgICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bnVzZWQtdmFyaWFibGUiLCBhcmdzPShuYW1lLCksIG5vZGU9bm9kZSkKKworICAgIGRlZiBfY2hlY2tfaW1wb3J0cyhzZWxmLCBub3RfY29uc3VtZWQpOgorICAgICAgICBsb2NhbF9uYW1lcyA9IF9maXhfZG90X2ltcG9ydHMobm90X2NvbnN1bWVkKQorICAgICAgICBjaGVja2VkID0gc2V0KCkKKyAgICAgICAgZm9yIG5hbWUsIHN0bXQgaW4gbG9jYWxfbmFtZXM6CisgICAgICAgICAgICBmb3IgaW1wb3J0cyBpbiBzdG10Lm5hbWVzOgorICAgICAgICAgICAgICAgIHJlYWxfbmFtZSA9IGltcG9ydGVkX25hbWUgPSBpbXBvcnRzWzBdCisgICAgICAgICAgICAgICAgaWYgaW1wb3J0ZWRfbmFtZSA9PSAiKiI6CisgICAgICAgICAgICAgICAgICAgIHJlYWxfbmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICBhc19uYW1lID0gaW1wb3J0c1sxXQorICAgICAgICAgICAgICAgIGlmIHJlYWxfbmFtZSBpbiBjaGVja2VkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIChyZWFsX25hbWUsIGFzX25hbWUpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGNoZWNrZWQuYWRkKHJlYWxfbmFtZSkKKworICAgICAgICAgICAgICAgIGlzX3R5cGVfYW5ub3RhdGlvbl9pbXBvcnQgPSAoCisgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkX25hbWUgaW4gc2VsZi5fdHlwZV9hbm5vdGF0aW9uX25hbWVzCisgICAgICAgICAgICAgICAgICAgIG9yIGFzX25hbWUgaW4gc2VsZi5fdHlwZV9hbm5vdGF0aW9uX25hbWVzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgYXN0cm9pZC5JbXBvcnQpIG9yICgKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShzdG10LCBhc3Ryb2lkLkltcG9ydEZyb20pIGFuZCBub3Qgc3RtdC5tb2RuYW1lCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCBhc3Ryb2lkLkltcG9ydEZyb20pIGFuZCBTUEVDSUFMX09CSi5zZWFyY2goCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZF9uYW1lCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEZpbHRlciBzcGVjaWFsIG9iamVjdHMgKF9fZG9jX18sIF9fYWxsX18pIGV0Yy4sCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgdGhleSBjYW4gYmUgaW1wb3J0ZWQgZm9yIGV4cG9ydGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNfdHlwZV9hbm5vdGF0aW9uX2ltcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTW9zdCBsaWtlbHkgYSB0eXBpbmcgaW1wb3J0IGlmIGl0IHdhc24ndCB1c2VkIHNvIGZhci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgYXNfbmFtZSA9PSAiXyI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBhc19uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiaW1wb3J0ICVzIiAlIGltcG9ydGVkX25hbWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IGYie2ltcG9ydGVkX25hbWV9IGltcG9ydGVkIGFzIHthc19uYW1lfSIKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9pc190eXBlX2NoZWNraW5nX2ltcG9ydChzdG10KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVudXNlZC1pbXBvcnQiLCBhcmdzPW1zZywgbm9kZT1zdG10KQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzdG10LCBhc3Ryb2lkLkltcG9ydEZyb20pIGFuZCBzdG10Lm1vZG5hbWUgIT0gRlVUVVJFOgorICAgICAgICAgICAgICAgICAgICBpZiBTUEVDSUFMX09CSi5zZWFyY2goaW1wb3J0ZWRfbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEZpbHRlciBzcGVjaWFsIG9iamVjdHMgKF9fZG9jX18sIF9fYWxsX18pIGV0Yy4sCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgdGhleSBjYW4gYmUgaW1wb3J0ZWQgZm9yIGV4cG9ydGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgX2lzX2Zyb21fZnV0dXJlX2ltcG9ydChzdG10LCBuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIG5hbWUgaXMgaW4gZmFjdCBsb2FkZWQgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAjIF9fZnV0dXJlX18gaW1wb3J0IGluIGFub3RoZXIgbW9kdWxlLgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBpZiBpc190eXBlX2Fubm90YXRpb25faW1wb3J0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBNb3N0IGxpa2VseSBhIHR5cGluZyBpbXBvcnQgaWYgaXQgd2Fzbid0IHVzZWQgc28gZmFyLgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBpZiBpbXBvcnRlZF9uYW1lID09ICIqIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVudXNlZC13aWxkY2FyZC1pbXBvcnQiLCBhcmdzPW5hbWUsIG5vZGU9c3RtdCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFzX25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBmIntpbXBvcnRlZF9uYW1lfSBpbXBvcnRlZCBmcm9tIHtzdG10Lm1vZG5hbWV9IgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgPSAoaW1wb3J0ZWRfbmFtZSwgc3RtdC5tb2RuYW1lLCBhc19uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICIlcyBpbXBvcnRlZCBmcm9tICVzIGFzICVzIiAlIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9pc190eXBlX2NoZWNraW5nX2ltcG9ydChzdG10KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJ1bnVzZWQtaW1wb3J0IiwgYXJncz1tc2csIG5vZGU9c3RtdCkKKyAgICAgICAgZGVsIHNlbGYuX3RvX2NvbnN1bWUKKworICAgIGRlZiBfY2hlY2tfbWV0YWNsYXNzZXMoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlVwZGF0ZSBjb25zdW1wdGlvbiBhbmFseXNpcyBmb3IgbWV0YWNsYXNzZXMuIiIiCisgICAgICAgIGNvbnN1bWVkID0gW10gICMgWyhzY29wZV9sb2NhbHMsIGNvbnN1bWVkX2tleSldCisKKyAgICAgICAgZm9yIGNoaWxkX25vZGUgaW4gbm9kZS5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGRfbm9kZSwgYXN0cm9pZC5DbGFzc0RlZik6CisgICAgICAgICAgICAgICAgY29uc3VtZWQuZXh0ZW5kKHNlbGYuX2NoZWNrX2NsYXNzZGVmX21ldGFjbGFzc2VzKGNoaWxkX25vZGUsIG5vZGUpKQorCisgICAgICAgICMgUG9wIHRoZSBjb25zdW1lZCBpdGVtcywgaW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nCisgICAgICAgICMgdW51c2VkLWltcG9ydCBhbmQgdW51c2VkLXZhcmlhYmxlIGZhbHNlIHBvc2l0aXZlcworICAgICAgICBmb3Igc2NvcGVfbG9jYWxzLCBuYW1lIGluIGNvbnN1bWVkOgorICAgICAgICAgICAgc2NvcGVfbG9jYWxzLnBvcChuYW1lLCBOb25lKQorCisgICAgZGVmIF9jaGVja19jbGFzc2RlZl9tZXRhY2xhc3NlcyhzZWxmLCBrbGFzcywgcGFyZW50X25vZGUpOgorICAgICAgICBpZiBub3Qga2xhc3MuX21ldGFjbGFzczoKKyAgICAgICAgICAgICMgU2tpcCBpZiB0aGlzIGNsYXNzIGRvZXNuJ3QgdXNlIGV4cGxpY2l0bHkgYSBtZXRhY2xhc3MsIGJ1dCBpbmhlcml0cyBpdCBmcm9tIGFuY2VzdG9ycworICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgY29uc3VtZWQgPSBbXSAgIyBbKHNjb3BlX2xvY2FscywgY29uc3VtZWRfa2V5KV0KKyAgICAgICAgbWV0YWNsYXNzID0ga2xhc3MubWV0YWNsYXNzKCkKKworICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKGtsYXNzLl9tZXRhY2xhc3MsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICBuYW1lID0ga2xhc3MuX21ldGFjbGFzcy5uYW1lCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShrbGFzcy5fbWV0YWNsYXNzLCBhc3Ryb2lkLkF0dHJpYnV0ZSkgYW5kIGtsYXNzLl9tZXRhY2xhc3MuZXhwcjoKKyAgICAgICAgICAgIGF0dHIgPSBrbGFzcy5fbWV0YWNsYXNzLmV4cHIKKyAgICAgICAgICAgIHdoaWxlIG5vdCBpc2luc3RhbmNlKGF0dHIsIGFzdHJvaWQuTmFtZSk6CisgICAgICAgICAgICAgICAgYXR0ciA9IGF0dHIuZXhwcgorICAgICAgICAgICAgbmFtZSA9IGF0dHIubmFtZQorICAgICAgICBlbGlmIG1ldGFjbGFzczoKKyAgICAgICAgICAgIG5hbWUgPSBtZXRhY2xhc3Mucm9vdCgpLm5hbWUKKworICAgICAgICBmb3VuZCA9IE5vbmUKKyAgICAgICAgbmFtZSA9IE1FVEFDTEFTU19OQU1FX1RSQU5TRk9STVMuZ2V0KG5hbWUsIG5hbWUpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICAjIGNoZWNrIGVuY2xvc2luZyBzY29wZXMgc3RhcnRpbmcgZnJvbSBtb3N0IGxvY2FsCisgICAgICAgICAgICBmb3Igc2NvcGVfbG9jYWxzLCBfLCBfIGluIHNlbGYuX3RvX2NvbnN1bWVbOjotMV06CisgICAgICAgICAgICAgICAgZm91bmQgPSBzY29wZV9sb2NhbHMuZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkLmFwcGVuZCgoc2NvcGVfbG9jYWxzLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBmb3VuZCBpcyBOb25lIGFuZCBub3QgbWV0YWNsYXNzOgorICAgICAgICAgICAgbmFtZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2xhc3MuX21ldGFjbGFzcywgYXN0cm9pZC5OYW1lKToKKyAgICAgICAgICAgICAgICBuYW1lID0ga2xhc3MuX21ldGFjbGFzcy5uYW1lCisgICAgICAgICAgICBlbGlmICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGtsYXNzLl9tZXRhY2xhc3MsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgICAgIGFuZCBrbGFzcy5fbWV0YWNsYXNzLmV4cHIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgbmFtZSA9IGtsYXNzLl9tZXRhY2xhc3MuZXhwci5uYW1lCisKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbm90ICgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSBpbiBhc3Ryb2lkLk1vZHVsZS5zY29wZV9hdHRycworICAgICAgICAgICAgICAgICAgICBvciB1dGlscy5pc19idWlsdGluKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIG9yIG5hbWUgaW4gc2VsZi5jb25maWcuYWRkaXRpb25hbF9idWlsdGlucworICAgICAgICAgICAgICAgICAgICBvciBuYW1lIGluIHBhcmVudF9ub2RlLmxvY2FscworICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInVuZGVmaW5lZC12YXJpYWJsZSIsIG5vZGU9a2xhc3MsIGFyZ3M9KG5hbWUsKSkKKworICAgICAgICByZXR1cm4gY29uc3VtZWQKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJyZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihWYXJpYWJsZXNDaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvY29uZmlnL19faW5pdF9fLnB5IGIvcHlsaW50L2NvbmZpZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI0NmUyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NvbmZpZy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDExOSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMCwgMjAxMi0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDA4IHB5dmVzQGNyYXRlci5sb2dpbGFiLmZyIDxweXZlc0BjcmF0ZXIubG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEzIEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTMgSm9obiBNY0dlaGVlIDxqbWNnZWhlZUBhbHRlcmEuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQXJ1IFNhaG5pIDxhcnVzYWhuaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBKb2huIEtpcmtoYW0gPGpha2lya2hhbUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEVyaWsgPGVyaWsuZXJpa3Nzb25AeWFob28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFRvZG9yb3YgPGF0b2Rvcm92QG90Yi5iZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IE1vaXNlcyBMb3BleiA8bW95bG9wMjYwQHZhdXhvby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNywgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE5IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxNyBhaGlybmlzaCA8YWhpcm5pc2hAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgsIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOCBKaW0gUm9iZXJ0c29uIDxqcm9iZXJ0c29uOThhdHhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEdhcnkgVHlsZXIgTWNMZW9kIDxtYWlsQGdhcnl0eWxlci5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBLb25zdGFudGluIDxHaXRodWJAcGhlYW5leC5kZT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEphbm5lIFLDtm5ra8O2IDxqYW5uZXJvQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgb3MKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCBzeXMKKworZnJvbSBweWxpbnQuY29uZmlnLmNvbmZpZ3VyYXRpb25fbWl4aW4gaW1wb3J0IENvbmZpZ3VyYXRpb25NaXhJbgorZnJvbSBweWxpbnQuY29uZmlnLmZpbmRfZGVmYXVsdF9jb25maWdfZmlsZXMgaW1wb3J0IGZpbmRfZGVmYXVsdF9jb25maWdfZmlsZXMKK2Zyb20gcHlsaW50LmNvbmZpZy5tYW5faGVscF9mb3JtYXR0ZXIgaW1wb3J0IF9NYW5IZWxwRm9ybWF0dGVyCitmcm9tIHB5bGludC5jb25maWcub3B0aW9uIGltcG9ydCBPcHRpb24KK2Zyb20gcHlsaW50LmNvbmZpZy5vcHRpb25fbWFuYWdlcl9taXhpbiBpbXBvcnQgT3B0aW9uc01hbmFnZXJNaXhJbgorZnJvbSBweWxpbnQuY29uZmlnLm9wdGlvbl9wYXJzZXIgaW1wb3J0IE9wdGlvblBhcnNlcgorZnJvbSBweWxpbnQuY29uZmlnLm9wdGlvbnNfcHJvdmlkZXJfbWl4aW4gaW1wb3J0IE9wdGlvbnNQcm92aWRlck1peEluLCBVbnN1cHBvcnRlZEFjdGlvbgorCitfX2FsbF9fID0gWworICAgICJDb25maWd1cmF0aW9uTWl4SW4iLAorICAgICJmaW5kX2RlZmF1bHRfY29uZmlnX2ZpbGVzIiwKKyAgICAiX01hbkhlbHBGb3JtYXR0ZXIiLAorICAgICJPcHRpb24iLAorICAgICJPcHRpb25zTWFuYWdlck1peEluIiwKKyAgICAiT3B0aW9uUGFyc2VyIiwKKyAgICAiT3B0aW9uc1Byb3ZpZGVyTWl4SW4iLAorICAgICJVbnN1cHBvcnRlZEFjdGlvbiIsCitdCisKK1VTRVJfSE9NRSA9IG9zLnBhdGguZXhwYW5kdXNlcigifiIpCitpZiAiUFlMSU5USE9NRSIgaW4gb3MuZW52aXJvbjoKKyAgICBQWUxJTlRfSE9NRSA9IG9zLmVudmlyb25bIlBZTElOVEhPTUUiXQorICAgIGlmIFVTRVJfSE9NRSA9PSAifiI6CisgICAgICAgIFVTRVJfSE9NRSA9IG9zLnBhdGguZGlybmFtZShQWUxJTlRfSE9NRSkKK2VsaWYgVVNFUl9IT01FID09ICJ+IjoKKyAgICBQWUxJTlRfSE9NRSA9ICIucHlsaW50LmQiCitlbHNlOgorICAgIFBZTElOVF9IT01FID0gb3MucGF0aC5qb2luKFVTRVJfSE9NRSwgIi5weWxpbnQuZCIpCisKKworZGVmIF9nZXRfcGRhdGFfcGF0aChiYXNlX25hbWUsIHJlY3Vycyk6CisgICAgYmFzZV9uYW1lID0gYmFzZV9uYW1lLnJlcGxhY2Uob3Muc2VwLCAiXyIpCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihQWUxJTlRfSE9NRSwgZiJ7YmFzZV9uYW1lfXtyZWN1cnN9LnN0YXRzIikKKworCitkZWYgbG9hZF9yZXN1bHRzKGJhc2UpOgorICAgIGRhdGFfZmlsZSA9IF9nZXRfcGRhdGFfcGF0aChiYXNlLCAxKQorICAgIHRyeToKKyAgICAgICAgd2l0aCBvcGVuKGRhdGFfZmlsZSwgInJiIikgYXMgc3RyZWFtOgorICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkKHN0cmVhbSkKKyAgICBleGNlcHQgRXhjZXB0aW9uOiAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CisgICAgICAgIHJldHVybiB7fQorCisKK2RlZiBzYXZlX3Jlc3VsdHMocmVzdWx0cywgYmFzZSk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFBZTElOVF9IT01FKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubWtkaXIoUFlMSU5UX0hPTUUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcHJpbnQoIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5ICVzIiAlIFBZTElOVF9IT01FLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgZGF0YV9maWxlID0gX2dldF9wZGF0YV9wYXRoKGJhc2UsIDEpCisgICAgdHJ5OgorICAgICAgICB3aXRoIG9wZW4oZGF0YV9maWxlLCAid2IiKSBhcyBzdHJlYW06CisgICAgICAgICAgICBwaWNrbGUuZHVtcChyZXN1bHRzLCBzdHJlYW0pCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXg6CisgICAgICAgIHByaW50KGYiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIHtkYXRhX2ZpbGV9OiB7ZXh9IiwgZmlsZT1zeXMuc3RkZXJyKQorCisKK2RlZiBmaW5kX3B5bGludHJjKCk6CisgICAgIiIic2VhcmNoIHRoZSBweWxpbnQgcmMgZmlsZSBhbmQgcmV0dXJuIGl0cyBwYXRoIGlmIGl0IGZpbmQgaXQsIGVsc2UgTm9uZSIiIgorICAgIGZvciBjb25maWdfZmlsZSBpbiBmaW5kX2RlZmF1bHRfY29uZmlnX2ZpbGVzKCk6CisgICAgICAgIGlmIGNvbmZpZ19maWxlLmVuZHN3aXRoKCJweWxpbnRyYyIpOgorICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ19maWxlCisKKyAgICByZXR1cm4gTm9uZQorCisKK1BZTElOVFJDID0gZmluZF9weWxpbnRyYygpCisKK0VOVl9IRUxQID0gKAorICAgICIiIgorVGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHVzZWQ6CisgICAgKiBQWUxJTlRIT01FCisgICAgUGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHBlcnNpc3RlbnQgZGF0YSBmb3IgdGhlIHJ1biB3aWxsIGJlIHN0b3JlZC4gSWYKK25vdCBmb3VuZCwgaXQgZGVmYXVsdHMgdG8gfi8ucHlsaW50LmQvIG9yIC5weWxpbnQuZCAoaW4gdGhlIGN1cnJlbnQgd29ya2luZworZGlyZWN0b3J5KS4KKyAgICAqIFBZTElOVFJDCisgICAgUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBtZXRob2QgdXNlZAordG8gc2VhcmNoIGZvciBjb25maWd1cmF0aW9uIGZpbGUuCisiIiIKKyAgICAlIGdsb2JhbHMoKSAgIyB0eXBlOiBpZ25vcmUKKykKZGlmZiAtLWdpdCBhL3B5bGludC9jb25maWcvY29uZmlndXJhdGlvbl9taXhpbi5weSBiL3B5bGludC9jb25maWcvY29uZmlndXJhdGlvbl9taXhpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg0MDJiCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NvbmZpZy9jb25maWd1cmF0aW9uX21peGluLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworZnJvbSBweWxpbnQuY29uZmlnLm9wdGlvbl9tYW5hZ2VyX21peGluIGltcG9ydCBPcHRpb25zTWFuYWdlck1peEluCitmcm9tIHB5bGludC5jb25maWcub3B0aW9uc19wcm92aWRlcl9taXhpbiBpbXBvcnQgT3B0aW9uc1Byb3ZpZGVyTWl4SW4KKworCitjbGFzcyBDb25maWd1cmF0aW9uTWl4SW4oT3B0aW9uc01hbmFnZXJNaXhJbiwgT3B0aW9uc1Byb3ZpZGVyTWl4SW4pOgorICAgICIiImJhc2ljIG1peGluIGZvciBzaW1wbGUgY29uZmlndXJhdGlvbnMgd2hpY2ggZG9uJ3QgbmVlZCB0aGUKKyAgICBtYW5hZ2VyIC8gcHJvdmlkZXJzIG1vZGVsIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgidXNhZ2UiLCAiIikKKyAgICAgICAgT3B0aW9uc01hbmFnZXJNaXhJbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIE9wdGlvbnNQcm92aWRlck1peEluLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYsICJvcHRpb25fZ3JvdXBzIiwgTm9uZSk6CisgICAgICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMgPSBbXQorICAgICAgICAgICAgZm9yIF8sIG9wdGRpY3QgaW4gc2VsZi5vcHRpb25zOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZ2RlZiA9IChvcHRkaWN0WyJncm91cCJdLnVwcGVyKCksICIiKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBnZGVmIG5vdCBpbiBzZWxmLm9wdGlvbl9ncm91cHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uX2dyb3Vwcy5hcHBlbmQoZ2RlZikKKyAgICAgICAgc2VsZi5yZWdpc3Rlcl9vcHRpb25zX3Byb3ZpZGVyKHNlbGYsIG93bl9ncm91cD1GYWxzZSkKZGlmZiAtLWdpdCBhL3B5bGludC9jb25maWcvZmluZF9kZWZhdWx0X2NvbmZpZ19maWxlcy5weSBiL3B5bGludC9jb25maWcvZmluZF9kZWZhdWx0X2NvbmZpZ19maWxlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk0ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2NvbmZpZy9maW5kX2RlZmF1bHRfY29uZmlnX2ZpbGVzLnB5CkBAIC0wLDAgKzEsNjkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbmZpZ3BhcnNlcgoraW1wb3J0IG9zCisKK2ltcG9ydCB0b21sCitmcm9tIHRvbWwuZGVjb2RlciBpbXBvcnQgVG9tbERlY29kZUVycm9yCisKKworZGVmIF90b21sX2hhc19jb25maWcocGF0aCk6CisgICAgd2l0aCBvcGVuKHBhdGgpIGFzIHRvbWxfaGFuZGxlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gdG9tbC5sb2FkKHRvbWxfaGFuZGxlKQorICAgICAgICBleGNlcHQgVG9tbERlY29kZUVycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgcHJpbnQoZiJGYWlsZWQgdG8gbG9hZCAne3BhdGh9Jzoge2Vycm9yfSIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50WyJ0b29sIl1bInB5bGludCJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgX2NmZ19oYXNfY29uZmlnKHBhdGgpOgorICAgIHBhcnNlciA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQorICAgIHBhcnNlci5yZWFkKHBhdGgsIGVuY29kaW5nPSJ1dGYtOCIpCisgICAgcmV0dXJuIGFueShzZWN0aW9uLnN0YXJ0c3dpdGgoInB5bGludC4iKSBmb3Igc2VjdGlvbiBpbiBwYXJzZXIuc2VjdGlvbnMoKSkKKworCitkZWYgZmluZF9kZWZhdWx0X2NvbmZpZ19maWxlcygpOgorICAgICIiIkZpbmQgYWxsIHBvc3NpYmxlIGNvbmZpZyBmaWxlcy4iIiIKKyAgICByY19uYW1lcyA9ICgicHlsaW50cmMiLCAiLnB5bGludHJjIikKKyAgICBjb25maWdfbmFtZXMgPSByY19uYW1lcyArICgicHlwcm9qZWN0LnRvbWwiLCAic2V0dXAuY2ZnIikKKyAgICBmb3IgY29uZmlnX25hbWUgaW4gY29uZmlnX25hbWVzOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjb25maWdfbmFtZSk6CisgICAgICAgICAgICBpZiBjb25maWdfbmFtZS5lbmRzd2l0aCgiLnRvbWwiKSBhbmQgbm90IF90b21sX2hhc19jb25maWcoY29uZmlnX25hbWUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjb25maWdfbmFtZS5lbmRzd2l0aCgiLmNmZyIpIGFuZCBub3QgX2NmZ19oYXNfY29uZmlnKGNvbmZpZ19uYW1lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmFic3BhdGgoY29uZmlnX25hbWUpCisKKyAgICBpZiBvcy5wYXRoLmlzZmlsZSgiX19pbml0X18ucHkiKToKKyAgICAgICAgY3VyZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLmdldGN3ZCgpKQorICAgICAgICB3aGlsZSBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oY3VyZGlyLCAiX19pbml0X18ucHkiKSk6CisgICAgICAgICAgICBjdXJkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGN1cmRpciwgIi4uIikpCisgICAgICAgICAgICBmb3IgcmNfbmFtZSBpbiByY19uYW1lczoKKyAgICAgICAgICAgICAgICByY19wYXRoID0gb3MucGF0aC5qb2luKGN1cmRpciwgcmNfbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyY19wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcmNfcGF0aAorCisgICAgaWYgIlBZTElOVFJDIiBpbiBvcy5lbnZpcm9uIGFuZCBvcy5wYXRoLmV4aXN0cyhvcy5lbnZpcm9uWyJQWUxJTlRSQyJdKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUob3MuZW52aXJvblsiUFlMSU5UUkMiXSk6CisgICAgICAgICAgICB5aWVsZCBvcy5lbnZpcm9uWyJQWUxJTlRSQyJdCisgICAgZWxzZToKKyAgICAgICAgdXNlcl9ob21lID0gb3MucGF0aC5leHBhbmR1c2VyKCJ+IikKKyAgICAgICAgaWYgdXNlcl9ob21lIG5vdCBpbiAoIn4iLCAiL3Jvb3QiKToKKyAgICAgICAgICAgIGhvbWVfcmMgPSBvcy5wYXRoLmpvaW4odXNlcl9ob21lLCAiLnB5bGludHJjIikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGhvbWVfcmMpOgorICAgICAgICAgICAgICAgIHlpZWxkIGhvbWVfcmMKKyAgICAgICAgICAgIGhvbWVfcmMgPSBvcy5wYXRoLmpvaW4odXNlcl9ob21lLCAiLmNvbmZpZyIsICJweWxpbnRyYyIpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShob21lX3JjKToKKyAgICAgICAgICAgICAgICB5aWVsZCBob21lX3JjCisKKyAgICBpZiBvcy5wYXRoLmlzZmlsZSgiL2V0Yy9weWxpbnRyYyIpOgorICAgICAgICB5aWVsZCAiL2V0Yy9weWxpbnRyYyIKZGlmZiAtLWdpdCBhL3B5bGludC9jb25maWcvbWFuX2hlbHBfZm9ybWF0dGVyLnB5IGIvcHlsaW50L2NvbmZpZy9tYW5faGVscF9mb3JtYXR0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiMjI3MgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jb25maWcvbWFuX2hlbHBfZm9ybWF0dGVyLnB5CkBAIC0wLDAgKzEsMTE1IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBvcHRwYXJzZSAgIyBweWxpbnQ6IGRpc2FibGU9ZGVwcmVjYXRlZC1tb2R1bGUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKKworIyBweWxpbnQ6IGRpc2FibGU9YWJzdHJhY3QtbWV0aG9kOyBieSBkZXNpZ24/CitjbGFzcyBfTWFuSGVscEZvcm1hdHRlcihvcHRwYXJzZS5IZWxwRm9ybWF0dGVyKToKKyAgICBkZWYgX19pbml0X18oCisgICAgICAgIHNlbGYsIGluZGVudF9pbmNyZW1lbnQ9MCwgbWF4X2hlbHBfcG9zaXRpb249MjQsIHdpZHRoPTc5LCBzaG9ydF9maXJzdD0wCisgICAgKToKKyAgICAgICAgb3B0cGFyc2UuSGVscEZvcm1hdHRlci5fX2luaXRfXygKKyAgICAgICAgICAgIHNlbGYsIGluZGVudF9pbmNyZW1lbnQsIG1heF9oZWxwX3Bvc2l0aW9uLCB3aWR0aCwgc2hvcnRfZmlyc3QKKyAgICAgICAgKQorCisgICAgZGVmIGZvcm1hdF9oZWFkaW5nKHNlbGYsIGhlYWRpbmcpOgorICAgICAgICByZXR1cm4gIi5TSCAlc1xuIiAlIGhlYWRpbmcudXBwZXIoKQorCisgICAgZGVmIGZvcm1hdF9kZXNjcmlwdGlvbihzZWxmLCBkZXNjcmlwdGlvbik6CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbgorCisgICAgZGVmIGZvcm1hdF9vcHRpb24oc2VsZiwgb3B0aW9uKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0c3RyaW5nID0gb3B0aW9uLm9wdGlvbl9zdHJpbmdzCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIG9wdHN0cmluZyA9IHNlbGYuZm9ybWF0X29wdGlvbl9zdHJpbmdzKG9wdGlvbikKKyAgICAgICAgaWYgb3B0aW9uLmhlbHA6CisgICAgICAgICAgICBoZWxwX3RleHQgPSBzZWxmLmV4cGFuZF9kZWZhdWx0KG9wdGlvbikKKyAgICAgICAgICAgIGhlbHBfc3RyaW5nID0gIiAiLmpvaW4obGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGhlbHBfdGV4dC5zcGxpdGxpbmVzKCkpCisgICAgICAgICAgICBoZWxwX3N0cmluZyA9IGhlbHBfc3RyaW5nLnJlcGxhY2UoIlxcIiwgIlxcXFwiKQorICAgICAgICAgICAgaGVscF9zdHJpbmcgPSBoZWxwX3N0cmluZy5yZXBsYWNlKCJbY3VycmVudDoiLCAiW2RlZmF1bHQ6IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhlbHBfc3RyaW5nID0gIiIKKyAgICAgICAgcmV0dXJuIGYiIiIuSVAgIntvcHRzdHJpbmd9Igore2hlbHBfc3RyaW5nfQorIiIiCisKKyAgICBkZWYgZm9ybWF0X2hlYWQoc2VsZiwgb3B0cGFyc2VyLCBwa2dpbmZvLCBzZWN0aW9uPTEpOgorICAgICAgICBsb25nX2Rlc2MgPSAiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwZ20gPSBvcHRwYXJzZXIuX2dldF9wcm9nX25hbWUoKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHB5ID49IDIuNC5YIChkdW5ubyB3aGljaCBYIGV4YWN0bHksIGF0IGxlYXN0IDIpCisgICAgICAgICAgICBwZ20gPSBvcHRwYXJzZXIuZ2V0X3Byb2dfbmFtZSgpCisgICAgICAgIHNob3J0X2Rlc2MgPSBzZWxmLmZvcm1hdF9zaG9ydF9kZXNjcmlwdGlvbihwZ20sIHBrZ2luZm8uZGVzY3JpcHRpb24pCisgICAgICAgIGlmIGhhc2F0dHIocGtnaW5mbywgImxvbmdfZGVzYyIpOgorICAgICAgICAgICAgbG9uZ19kZXNjID0gc2VsZi5mb3JtYXRfbG9uZ19kZXNjcmlwdGlvbihwZ20sIHBrZ2luZm8ubG9uZ19kZXNjKQorICAgICAgICByZXR1cm4gZiIiIntzZWxmLmZvcm1hdF90aXRsZShwZ20sIHNlY3Rpb24pfQore3Nob3J0X2Rlc2N9Cit7c2VsZi5mb3JtYXRfc3lub3BzaXMocGdtKX0KK3tsb25nX2Rlc2N9IiIiCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF90aXRsZShwZ20sIHNlY3Rpb24pOgorICAgICAgICBkYXRlID0gIiVkLSUwMmQtJTAyZCIgJSB0aW1lLmxvY2FsdGltZSgpWzozXQorICAgICAgICByZXR1cm4gZicuVEgge3BnbX0ge3NlY3Rpb259ICJ7ZGF0ZX0iIHtwZ219JworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfc2hvcnRfZGVzY3JpcHRpb24ocGdtLCBzaG9ydF9kZXNjKToKKyAgICAgICAgcmV0dXJuIGYiIiIuU0ggTkFNRQorLkIge3BnbX0KK1xcLSB7c2hvcnRfZGVzYy5zdHJpcCgpfQorIiIiCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9zeW5vcHNpcyhwZ20pOgorICAgICAgICByZXR1cm4gZiIiIi5TSCBTWU5PUFNJUworLkIgIHtwZ219CitbCisuSSBPUFRJT05TCitdIFsKKy5JIDxhcmd1bWVudHM+CitdCisiIiIKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2xvbmdfZGVzY3JpcHRpb24ocGdtLCBsb25nX2Rlc2MpOgorICAgICAgICBsb25nX2Rlc2MgPSAiXG4iLmpvaW4obGluZS5sc3RyaXAoKSBmb3IgbGluZSBpbiBsb25nX2Rlc2Muc3BsaXRsaW5lcygpKQorICAgICAgICBsb25nX2Rlc2MgPSBsb25nX2Rlc2MucmVwbGFjZSgiXG4uXG4iLCAiXG5cbiIpCisgICAgICAgIGlmIGxvbmdfZGVzYy5sb3dlcigpLnN0YXJ0c3dpdGgocGdtKToKKyAgICAgICAgICAgIGxvbmdfZGVzYyA9IGxvbmdfZGVzY1tsZW4ocGdtKSA6XQorICAgICAgICByZXR1cm4gZiIiIi5TSCBERVNDUklQVElPTgorLkIge3BnbX0KK3tsb25nX2Rlc2Muc3RyaXAoKX0KKyIiIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfdGFpbChwa2dpbmZvKToKKyAgICAgICAgdGFpbCA9IGYiIiIuU0ggU0VFIEFMU08KKy91c3Ivc2hhcmUvZG9jL3B5dGhvblguWS17Z2V0YXR0cihwa2dpbmZvLCAiZGViaWFuX25hbWUiLCAicHlsaW50Iil9LworCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBidWdzIG9uIHRoZSBwcm9qZWN0XCdzIG1haWxpbmcgbGlzdDoKK3twa2dpbmZvLm1haWxpbmdsaXN0fQorCisuU0ggQVVUSE9SCit7cGtnaW5mby5hdXRob3J9IDx7cGtnaW5mby5hdXRob3JfZW1haWx9PgorIiIiCisgICAgICAgIGlmIGhhc2F0dHIocGtnaW5mbywgImNvcHlyaWdodCIpOgorICAgICAgICAgICAgdGFpbCArPSBmIiIiCisuU0ggQ09QWVJJR0hUCit7cGtnaW5mby5jb3B5cmlnaHR9CisiIiIKKyAgICAgICAgcmV0dXJuIHRhaWwKKworCitkZWYgX2dlbmVyYXRlX21hbnBhZ2Uob3B0cGFyc2VyLCBwa2dpbmZvLCBzZWN0aW9uPTEsIHN0cmVhbT1zeXMuc3Rkb3V0LCBsZXZlbD0wKToKKyAgICBmb3JtYXR0ZXIgPSBfTWFuSGVscEZvcm1hdHRlcigpCisgICAgZm9ybWF0dGVyLm91dHB1dF9sZXZlbCA9IGxldmVsCisgICAgZm9ybWF0dGVyLnBhcnNlciA9IG9wdHBhcnNlcgorICAgIHByaW50KGZvcm1hdHRlci5mb3JtYXRfaGVhZChvcHRwYXJzZXIsIHBrZ2luZm8sIHNlY3Rpb24pLCBmaWxlPXN0cmVhbSkKKyAgICBwcmludChvcHRwYXJzZXIuZm9ybWF0X29wdGlvbl9oZWxwKGZvcm1hdHRlciksIGZpbGU9c3RyZWFtKQorICAgIHByaW50KGZvcm1hdHRlci5mb3JtYXRfdGFpbChwa2dpbmZvKSwgZmlsZT1zdHJlYW0pCmRpZmYgLS1naXQgYS9weWxpbnQvY29uZmlnL29wdGlvbi5weSBiL3B5bGludC9jb25maWcvb3B0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTNhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY29uZmlnL29wdGlvbi5weQpAQCAtMCwwICsxLDE3NiBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgY29weQoraW1wb3J0IG9wdHBhcnNlICAjIHB5bGludDogZGlzYWJsZT1kZXByZWNhdGVkLW1vZHVsZQoraW1wb3J0IHJlCisKK2Zyb20gcHlsaW50IGltcG9ydCB1dGlscworCisKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorZGVmIF9jc3ZfdmFsaWRhdG9yKF8sIG5hbWUsIHZhbHVlKToKKyAgICByZXR1cm4gdXRpbHMuX2NoZWNrX2Nzdih2YWx1ZSkKKworCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKK2RlZiBfcmVnZXhwX3ZhbGlkYXRvcihfLCBuYW1lLCB2YWx1ZSk6CisgICAgaWYgaGFzYXR0cih2YWx1ZSwgInBhdHRlcm4iKToKKyAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgcmV0dXJuIHJlLmNvbXBpbGUodmFsdWUpCisKKworIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CitkZWYgX3JlZ2V4cF9jc3ZfdmFsaWRhdG9yKF8sIG5hbWUsIHZhbHVlKToKKyAgICByZXR1cm4gW19yZWdleHBfdmFsaWRhdG9yKF8sIG5hbWUsIHZhbCkgZm9yIHZhbCBpbiBfY3N2X3ZhbGlkYXRvcihfLCBuYW1lLCB2YWx1ZSldCisKKworZGVmIF9jaG9pY2VfdmFsaWRhdG9yKGNob2ljZXMsIG5hbWUsIHZhbHVlKToKKyAgICBpZiB2YWx1ZSBub3QgaW4gY2hvaWNlczoKKyAgICAgICAgbXNnID0gIm9wdGlvbiAlczogaW52YWxpZCB2YWx1ZTogJXIsIHNob3VsZCBiZSBpbiAlcyIKKyAgICAgICAgcmFpc2Ugb3B0cGFyc2UuT3B0aW9uVmFsdWVFcnJvcihtc2cgJSAobmFtZSwgdmFsdWUsIGNob2ljZXMpKQorICAgIHJldHVybiB2YWx1ZQorCisKK2RlZiBfeW5fdmFsaWRhdG9yKG9wdCwgXywgdmFsdWUpOgorICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6CisgICAgICAgIHJldHVybiBib29sKHZhbHVlKQorICAgIGlmIHZhbHVlIGluICgieSIsICJ5ZXMiKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiB2YWx1ZSBpbiAoIm4iLCAibm8iKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgbXNnID0gIm9wdGlvbiAlczogaW52YWxpZCB5biB2YWx1ZSAlciwgc2hvdWxkIGJlIGluICh5LCB5ZXMsIG4sIG5vKSIKKyAgICByYWlzZSBvcHRwYXJzZS5PcHRpb25WYWx1ZUVycm9yKG1zZyAlIChvcHQsIHZhbHVlKSkKKworCitkZWYgX211bHRpcGxlX2Nob2ljZV92YWxpZGF0b3IoY2hvaWNlcywgbmFtZSwgdmFsdWUpOgorICAgIHZhbHVlcyA9IHV0aWxzLl9jaGVja19jc3YodmFsdWUpCisgICAgZm9yIGNzdl92YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgIGlmIGNzdl92YWx1ZSBub3QgaW4gY2hvaWNlczoKKyAgICAgICAgICAgIG1zZyA9ICJvcHRpb24gJXM6IGludmFsaWQgdmFsdWU6ICVyLCBzaG91bGQgYmUgaW4gJXMiCisgICAgICAgICAgICByYWlzZSBvcHRwYXJzZS5PcHRpb25WYWx1ZUVycm9yKG1zZyAlIChuYW1lLCBjc3ZfdmFsdWUsIGNob2ljZXMpKQorICAgIHJldHVybiB2YWx1ZXMKKworCitkZWYgX25vbl9lbXB0eV9zdHJpbmdfdmFsaWRhdG9yKG9wdCwgXywgdmFsdWUpOgorICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgbXNnID0gImluZGVudCBzdHJpbmcgY2FuJ3QgYmUgZW1wdHkuIgorICAgICAgICByYWlzZSBvcHRwYXJzZS5PcHRpb25WYWx1ZUVycm9yKG1zZykKKyAgICByZXR1cm4gdXRpbHMuX3VucXVvdGUodmFsdWUpCisKKworZGVmIF9tdWx0aXBsZV9jaG9pY2VzX3ZhbGlkYXRpbmdfb3B0aW9uKG9wdCwgbmFtZSwgdmFsdWUpOgorICAgIHJldHVybiBfbXVsdGlwbGVfY2hvaWNlX3ZhbGlkYXRvcihvcHQuY2hvaWNlcywgbmFtZSwgdmFsdWUpCisKKworZGVmIF9weV92ZXJzaW9uX3ZhbGlkYXRvcihfLCBuYW1lLCB2YWx1ZSk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSB0dXBsZShpbnQodmFsKSBmb3IgdmFsIGluIHZhbHVlLnNwbGl0KCIuIikpCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgcmFpc2Ugb3B0cGFyc2UuT3B0aW9uVmFsdWVFcnJvcihmIkludmFsaWQgZm9ybWF0IGZvciB7bmFtZX0iKSBmcm9tIE5vbmUKKyAgICByZXR1cm4gdmFsdWUKKworCitWQUxJREFUT1JTID0geworICAgICJzdHJpbmciOiB1dGlscy5fdW5xdW90ZSwKKyAgICAiaW50IjogaW50LAorICAgICJmbG9hdCI6IGZsb2F0LAorICAgICJyZWdleHAiOiByZS5jb21waWxlLAorICAgICJyZWdleHBfY3N2IjogX3JlZ2V4cF9jc3ZfdmFsaWRhdG9yLAorICAgICJjc3YiOiBfY3N2X3ZhbGlkYXRvciwKKyAgICAieW4iOiBfeW5fdmFsaWRhdG9yLAorICAgICJjaG9pY2UiOiBsYW1iZGEgb3B0LCBuYW1lLCB2YWx1ZTogX2Nob2ljZV92YWxpZGF0b3Iob3B0WyJjaG9pY2VzIl0sIG5hbWUsIHZhbHVlKSwKKyAgICAibXVsdGlwbGVfY2hvaWNlIjogbGFtYmRhIG9wdCwgbmFtZSwgdmFsdWU6IF9tdWx0aXBsZV9jaG9pY2VfdmFsaWRhdG9yKAorICAgICAgICBvcHRbImNob2ljZXMiXSwgbmFtZSwgdmFsdWUKKyAgICApLAorICAgICJub25fZW1wdHlfc3RyaW5nIjogX25vbl9lbXB0eV9zdHJpbmdfdmFsaWRhdG9yLAorICAgICJweV92ZXJzaW9uIjogX3B5X3ZlcnNpb25fdmFsaWRhdG9yLAorfQorCisKK2RlZiBfY2FsbF92YWxpZGF0b3Iob3B0dHlwZSwgb3B0ZGljdCwgb3B0aW9uLCB2YWx1ZSk6CisgICAgaWYgb3B0dHlwZSBub3QgaW4gVkFMSURBVE9SUzoKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdVbnN1cHBvcnRlZCB0eXBlICIlcyInICUgb3B0dHlwZSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBWQUxJREFUT1JTW29wdHR5cGVdKG9wdGRpY3QsIG9wdGlvbiwgdmFsdWUpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIFZBTElEQVRPUlNbb3B0dHlwZV0odmFsdWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHJhaXNlIG9wdHBhcnNlLk9wdGlvblZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgZiJ7b3B0aW9ufSB2YWx1ZSAoe3ZhbHVlIXJ9KSBzaG91bGQgYmUgb2YgdHlwZSB7b3B0dHlwZX0iCisgICAgICAgICAgICApIGZyb20gZQorCisKK2RlZiBfdmFsaWRhdGUodmFsdWUsIG9wdGRpY3QsIG5hbWU9IiIpOgorICAgICIiInJldHVybiBhIHZhbGlkYXRlZCB2YWx1ZSBmb3IgYW4gb3B0aW9uIGFjY29yZGluZyB0byBpdHMgdHlwZQorCisgICAgb3B0aW9uYWwgYXJndW1lbnQgbmFtZSBpcyBvbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2UgZm9ybWF0dGluZworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgX3R5cGUgPSBvcHRkaWN0WyJ0eXBlIl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgIHJldHVybiBfY2FsbF92YWxpZGF0b3IoX3R5cGUsIG9wdGRpY3QsIG5hbWUsIHZhbHVlKQorCisKKyMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgorY2xhc3MgT3B0aW9uKG9wdHBhcnNlLk9wdGlvbik6CisgICAgVFlQRVMgPSBvcHRwYXJzZS5PcHRpb24uVFlQRVMgKyAoCisgICAgICAgICJyZWdleHAiLAorICAgICAgICAicmVnZXhwX2NzdiIsCisgICAgICAgICJjc3YiLAorICAgICAgICAieW4iLAorICAgICAgICAibXVsdGlwbGVfY2hvaWNlIiwKKyAgICAgICAgIm5vbl9lbXB0eV9zdHJpbmciLAorICAgICAgICAicHlfdmVyc2lvbiIsCisgICAgKQorICAgIEFUVFJTID0gb3B0cGFyc2UuT3B0aW9uLkFUVFJTICsgWyJoaWRlIiwgImxldmVsIl0KKyAgICBUWVBFX0NIRUNLRVIgPSBjb3B5LmNvcHkob3B0cGFyc2UuT3B0aW9uLlRZUEVfQ0hFQ0tFUikKKyAgICBUWVBFX0NIRUNLRVJbInJlZ2V4cCJdID0gX3JlZ2V4cF92YWxpZGF0b3IKKyAgICBUWVBFX0NIRUNLRVJbInJlZ2V4cF9jc3YiXSA9IF9yZWdleHBfY3N2X3ZhbGlkYXRvcgorICAgIFRZUEVfQ0hFQ0tFUlsiY3N2Il0gPSBfY3N2X3ZhbGlkYXRvcgorICAgIFRZUEVfQ0hFQ0tFUlsieW4iXSA9IF95bl92YWxpZGF0b3IKKyAgICBUWVBFX0NIRUNLRVJbIm11bHRpcGxlX2Nob2ljZSJdID0gX211bHRpcGxlX2Nob2ljZXNfdmFsaWRhdGluZ19vcHRpb24KKyAgICBUWVBFX0NIRUNLRVJbIm5vbl9lbXB0eV9zdHJpbmciXSA9IF9ub25fZW1wdHlfc3RyaW5nX3ZhbGlkYXRvcgorICAgIFRZUEVfQ0hFQ0tFUlsicHlfdmVyc2lvbiJdID0gX3B5X3ZlcnNpb25fdmFsaWRhdG9yCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKm9wdHMsICoqYXR0cnMpOgorICAgICAgICBvcHRwYXJzZS5PcHRpb24uX19pbml0X18oc2VsZiwgKm9wdHMsICoqYXR0cnMpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgImhpZGUiKSBhbmQgc2VsZi5oaWRlOgorICAgICAgICAgICAgc2VsZi5oZWxwID0gb3B0cGFyc2UuU1VQUFJFU1NfSEVMUAorCisgICAgZGVmIF9jaGVja19jaG9pY2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYudHlwZSBpbiAoImNob2ljZSIsICJtdWx0aXBsZV9jaG9pY2UiKToKKyAgICAgICAgICAgIGlmIHNlbGYuY2hvaWNlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIG9wdHBhcnNlLk9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAibXVzdCBzdXBwbHkgYSBsaXN0IG9mIGNob2ljZXMgZm9yIHR5cGUgJ2Nob2ljZSciLCBzZWxmCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5jaG9pY2VzLCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgICAgICAgICByYWlzZSBvcHRwYXJzZS5PcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImNob2ljZXMgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoJyVzJyBzdXBwbGllZCkiCisgICAgICAgICAgICAgICAgICAgICUgc3RyKHR5cGUoc2VsZi5jaG9pY2VzKSkuc3BsaXQoIiciKVsxXSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGVsaWYgc2VsZi5jaG9pY2VzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2Ugb3B0cGFyc2UuT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIm11c3Qgbm90IHN1cHBseSBjaG9pY2VzIGZvciB0eXBlICVyIiAlIHNlbGYudHlwZSwgc2VsZgorICAgICAgICAgICAgKQorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9dW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb24KKyAgICBvcHRwYXJzZS5PcHRpb24uQ0hFQ0tfTUVUSE9EU1syXSA9IF9jaGVja19jaG9pY2UgICMgdHlwZTogaWdub3JlCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcik6CisgICAgICAgICMgRmlyc3QsIGNvbnZlcnQgdGhlIHZhbHVlKHMpIHRvIHRoZSByaWdodCB0eXBlLiAgSG93bCBpZiBhbnkKKyAgICAgICAgIyB2YWx1ZShzKSBhcmUgYm9ndXMuCisgICAgICAgIHZhbHVlID0gc2VsZi5jb252ZXJ0X3ZhbHVlKG9wdCwgdmFsdWUpCisgICAgICAgIGlmIHNlbGYudHlwZSA9PSAibmFtZWQiOgorICAgICAgICAgICAgZXhpc3RlbnQgPSBnZXRhdHRyKHZhbHVlcywgc2VsZi5kZXN0KQorICAgICAgICAgICAgaWYgZXhpc3RlbnQ6CisgICAgICAgICAgICAgICAgZXhpc3RlbnQudXBkYXRlKHZhbHVlKQorICAgICAgICAgICAgICAgIHZhbHVlID0gZXhpc3RlbnQKKyAgICAgICAgIyBBbmQgdGhlbiB0YWtlIHdoYXRldmVyIGFjdGlvbiBpcyBleHBlY3RlZCBvZiB1cy4KKyAgICAgICAgIyBUaGlzIGlzIGEgc2VwYXJhdGUgbWV0aG9kIHRvIG1ha2UgbGlmZSBlYXNpZXIgZm9yCisgICAgICAgICMgc3ViY2xhc3NlcyB0byBhZGQgbmV3IGFjdGlvbnMuCisgICAgICAgIHJldHVybiBzZWxmLnRha2VfYWN0aW9uKHNlbGYuYWN0aW9uLCBzZWxmLmRlc3QsIG9wdCwgdmFsdWUsIHZhbHVlcywgcGFyc2VyKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2NvbmZpZy9vcHRpb25fbWFuYWdlcl9taXhpbi5weSBiL3B5bGludC9jb25maWcvb3B0aW9uX21hbmFnZXJfbWl4aW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jb25maWcvb3B0aW9uX21hbmFnZXJfbWl4aW4ucHkKQEAgLTAsMCArMSwzNjYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBjb25maWdwYXJzZXIKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgY29weQoraW1wb3J0IGZ1bmN0b29scworaW1wb3J0IG9wdHBhcnNlICAjIHB5bGludDogZGlzYWJsZT1kZXByZWNhdGVkLW1vZHVsZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2ltcG9ydCB0b21sCisKK2Zyb20gcHlsaW50IGltcG9ydCB1dGlscworZnJvbSBweWxpbnQuY29uZmlnLm1hbl9oZWxwX2Zvcm1hdHRlciBpbXBvcnQgX01hbkhlbHBGb3JtYXR0ZXIKK2Zyb20gcHlsaW50LmNvbmZpZy5vcHRpb24gaW1wb3J0IE9wdGlvbgorZnJvbSBweWxpbnQuY29uZmlnLm9wdGlvbl9wYXJzZXIgaW1wb3J0IE9wdGlvblBhcnNlcgorCisKK2RlZiBfZXhwYW5kX2RlZmF1bHQoc2VsZiwgb3B0aW9uKToKKyAgICAiIiJQYXRjaCBPcHRpb25QYXJzZXIuZXhwYW5kX2RlZmF1bHQgd2l0aCBjdXN0b20gYmVoYXZpb3VyCisKKyAgICBUaGlzIHdpbGwgaGFuZGxlIGRlZmF1bHRzIHRvIGF2b2lkIG92ZXJyaWRpbmcgdmFsdWVzIGluIHRoZQorICAgIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAiIiIKKyAgICBpZiBzZWxmLnBhcnNlciBpcyBOb25lIG9yIG5vdCBzZWxmLmRlZmF1bHRfdGFnOgorICAgICAgICByZXR1cm4gb3B0aW9uLmhlbHAKKyAgICBvcHRuYW1lID0gb3B0aW9uLl9sb25nX29wdHNbMF1bMjpdCisgICAgdHJ5OgorICAgICAgICBwcm92aWRlciA9IHNlbGYucGFyc2VyLm9wdGlvbnNfbWFuYWdlci5fYWxsX29wdGlvbnNbb3B0bmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHZhbHVlID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIG9wdGRpY3QgPSBwcm92aWRlci5nZXRfb3B0aW9uX2RlZihvcHRuYW1lKQorICAgICAgICBvcHRuYW1lID0gcHJvdmlkZXIub3B0aW9uX2F0dHJuYW1lKG9wdG5hbWUsIG9wdGRpY3QpCisgICAgICAgIHZhbHVlID0gZ2V0YXR0cihwcm92aWRlci5jb25maWcsIG9wdG5hbWUsIG9wdGRpY3QpCisgICAgICAgIHZhbHVlID0gdXRpbHMuX2Zvcm1hdF9vcHRpb25fdmFsdWUob3B0ZGljdCwgdmFsdWUpCisgICAgaWYgdmFsdWUgaXMgb3B0cGFyc2UuTk9fREVGQVVMVCBvciBub3QgdmFsdWU6CisgICAgICAgIHZhbHVlID0gc2VsZi5OT19ERUZBVUxUX1ZBTFVFCisgICAgcmV0dXJuIG9wdGlvbi5oZWxwLnJlcGxhY2Uoc2VsZi5kZWZhdWx0X3RhZywgc3RyKHZhbHVlKSkKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIF9wYXRjaF9vcHRwYXJzZSgpOgorICAgIG9yaWdfZGVmYXVsdCA9IG9wdHBhcnNlLkhlbHBGb3JtYXR0ZXIKKyAgICB0cnk6CisgICAgICAgIG9wdHBhcnNlLkhlbHBGb3JtYXR0ZXIuZXhwYW5kX2RlZmF1bHQgPSBfZXhwYW5kX2RlZmF1bHQKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBvcHRwYXJzZS5IZWxwRm9ybWF0dGVyLmV4cGFuZF9kZWZhdWx0ID0gb3JpZ19kZWZhdWx0CisKKworY2xhc3MgT3B0aW9uc01hbmFnZXJNaXhJbjoKKyAgICAiIiJIYW5kbGUgY29uZmlndXJhdGlvbiBmcm9tIGJvdGggYSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGNvbW1hbmQgbGluZSBvcHRpb25zIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXNhZ2UsIGNvbmZpZ19maWxlPU5vbmUpOgorICAgICAgICBzZWxmLmNvbmZpZ19maWxlID0gY29uZmlnX2ZpbGUKKyAgICAgICAgc2VsZi5yZXNldF9wYXJzZXJzKHVzYWdlKQorICAgICAgICAjIGxpc3Qgb2YgcmVnaXN0ZXJlZCBvcHRpb25zIHByb3ZpZGVycworICAgICAgICBzZWxmLm9wdGlvbnNfcHJvdmlkZXJzID0gW10KKyAgICAgICAgIyBkaWN0aW9uYXJ5IGFzc29jaWF0aW5nIG9wdGlvbiBuYW1lIHRvIGNoZWNrZXIKKyAgICAgICAgc2VsZi5fYWxsX29wdGlvbnMgPSBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpCisgICAgICAgIHNlbGYuX3Nob3J0X29wdGlvbnMgPSB7fQorICAgICAgICBzZWxmLl9ub2NhbGxiYWNrX29wdGlvbnMgPSB7fQorICAgICAgICBzZWxmLl9teWdyb3VwcyA9IHt9CisgICAgICAgICMgdmVyYm9zaXR5CisgICAgICAgIHNlbGYuX21heGxldmVsID0gMAorCisgICAgZGVmIHJlc2V0X3BhcnNlcnMoc2VsZiwgdXNhZ2U9IiIpOgorICAgICAgICAjIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIKKyAgICAgICAgc2VsZi5jZmdmaWxlX3BhcnNlciA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoCisgICAgICAgICAgICBpbmxpbmVfY29tbWVudF9wcmVmaXhlcz0oIiMiLCAiOyIpCisgICAgICAgICkKKyAgICAgICAgIyBjb21tYW5kIGxpbmUgcGFyc2VyCisgICAgICAgIHNlbGYuY21kbGluZV9wYXJzZXIgPSBPcHRpb25QYXJzZXIoT3B0aW9uLCB1c2FnZT11c2FnZSkKKyAgICAgICAgc2VsZi5jbWRsaW5lX3BhcnNlci5vcHRpb25zX21hbmFnZXIgPSBzZWxmCisgICAgICAgIHNlbGYuX29wdGlrX29wdGlvbl9hdHRycyA9IHNldChzZWxmLmNtZGxpbmVfcGFyc2VyLm9wdGlvbl9jbGFzcy5BVFRSUykKKworICAgIGRlZiByZWdpc3Rlcl9vcHRpb25zX3Byb3ZpZGVyKHNlbGYsIHByb3ZpZGVyLCBvd25fZ3JvdXA9VHJ1ZSk6CisgICAgICAgICIiInJlZ2lzdGVyIGFuIG9wdGlvbnMgcHJvdmlkZXIiIiIKKyAgICAgICAgYXNzZXJ0IHByb3ZpZGVyLnByaW9yaXR5IDw9IDAsICJwcm92aWRlcidzIHByaW9yaXR5IGNhbid0IGJlID49IDAiCisgICAgICAgIGZvciBpLCBvcHRpb25zX3Byb3ZpZGVyIGluIGVudW1lcmF0ZShzZWxmLm9wdGlvbnNfcHJvdmlkZXJzKToKKyAgICAgICAgICAgIGlmIHByb3ZpZGVyLnByaW9yaXR5ID4gb3B0aW9uc19wcm92aWRlci5wcmlvcml0eToKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnNfcHJvdmlkZXJzLmluc2VydChpLCBwcm92aWRlcikKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vcHRpb25zX3Byb3ZpZGVycy5hcHBlbmQocHJvdmlkZXIpCisgICAgICAgIG5vbl9ncm91cF9zcGVjX29wdGlvbnMgPSBbCisgICAgICAgICAgICBvcHRpb24gZm9yIG9wdGlvbiBpbiBwcm92aWRlci5vcHRpb25zIGlmICJncm91cCIgbm90IGluIG9wdGlvblsxXQorICAgICAgICBdCisgICAgICAgIGdyb3VwcyA9IGdldGF0dHIocHJvdmlkZXIsICJvcHRpb25fZ3JvdXBzIiwgKCkpCisgICAgICAgIGlmIG93bl9ncm91cCBhbmQgbm9uX2dyb3VwX3NwZWNfb3B0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYWRkX29wdGlvbl9ncm91cCgKKyAgICAgICAgICAgICAgICBwcm92aWRlci5uYW1lLnVwcGVyKCksCisgICAgICAgICAgICAgICAgcHJvdmlkZXIuX19kb2NfXywKKyAgICAgICAgICAgICAgICBub25fZ3JvdXBfc3BlY19vcHRpb25zLAorICAgICAgICAgICAgICAgIHByb3ZpZGVyLAorICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIG9wdCwgb3B0ZGljdCBpbiBub25fZ3JvdXBfc3BlY19vcHRpb25zOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX29wdGlrX29wdGlvbihwcm92aWRlciwgc2VsZi5jbWRsaW5lX3BhcnNlciwgb3B0LCBvcHRkaWN0KQorICAgICAgICBmb3IgZ25hbWUsIGdkb2MgaW4gZ3JvdXBzOgorICAgICAgICAgICAgZ25hbWUgPSBnbmFtZS51cHBlcigpCisgICAgICAgICAgICBnb3B0aW9ucyA9IFsKKyAgICAgICAgICAgICAgICBvcHRpb24KKyAgICAgICAgICAgICAgICBmb3Igb3B0aW9uIGluIHByb3ZpZGVyLm9wdGlvbnMKKyAgICAgICAgICAgICAgICBpZiBvcHRpb25bMV0uZ2V0KCJncm91cCIsICIiKS51cHBlcigpID09IGduYW1lCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzZWxmLmFkZF9vcHRpb25fZ3JvdXAoZ25hbWUsIGdkb2MsIGdvcHRpb25zLCBwcm92aWRlcikKKworICAgIGRlZiBhZGRfb3B0aW9uX2dyb3VwKHNlbGYsIGdyb3VwX25hbWUsIF8sIG9wdGlvbnMsIHByb3ZpZGVyKToKKyAgICAgICAgIyBhZGQgb3B0aW9uIGdyb3VwIHRvIHRoZSBjb21tYW5kIGxpbmUgcGFyc2VyCisgICAgICAgIGlmIGdyb3VwX25hbWUgaW4gc2VsZi5fbXlncm91cHM6CisgICAgICAgICAgICBncm91cCA9IHNlbGYuX215Z3JvdXBzW2dyb3VwX25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncm91cCA9IG9wdHBhcnNlLk9wdGlvbkdyb3VwKAorICAgICAgICAgICAgICAgIHNlbGYuY21kbGluZV9wYXJzZXIsIHRpdGxlPWdyb3VwX25hbWUuY2FwaXRhbGl6ZSgpCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmNtZGxpbmVfcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ3JvdXApCisgICAgICAgICAgICBncm91cC5sZXZlbCA9IHByb3ZpZGVyLmxldmVsCisgICAgICAgICAgICBzZWxmLl9teWdyb3Vwc1tncm91cF9uYW1lXSA9IGdyb3VwCisgICAgICAgICAgICAjIGFkZCBzZWN0aW9uIHRvIHRoZSBjb25maWcgZmlsZQorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGdyb3VwX25hbWUgIT0gIkRFRkFVTFQiCisgICAgICAgICAgICAgICAgYW5kIGdyb3VwX25hbWUgbm90IGluIHNlbGYuY2ZnZmlsZV9wYXJzZXIuX3NlY3Rpb25zCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuY2ZnZmlsZV9wYXJzZXIuYWRkX3NlY3Rpb24oZ3JvdXBfbmFtZSkKKyAgICAgICAgIyBhZGQgcHJvdmlkZXIncyBzcGVjaWZpYyBvcHRpb25zCisgICAgICAgIGZvciBvcHQsIG9wdGRpY3QgaW4gb3B0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYWRkX29wdGlrX29wdGlvbihwcm92aWRlciwgZ3JvdXAsIG9wdCwgb3B0ZGljdCkKKworICAgIGRlZiBhZGRfb3B0aWtfb3B0aW9uKHNlbGYsIHByb3ZpZGVyLCBvcHRpa2NvbnRhaW5lciwgb3B0LCBvcHRkaWN0KToKKyAgICAgICAgYXJncywgb3B0ZGljdCA9IHNlbGYub3B0aWtfb3B0aW9uKHByb3ZpZGVyLCBvcHQsIG9wdGRpY3QpCisgICAgICAgIG9wdGlvbiA9IG9wdGlrY29udGFpbmVyLmFkZF9vcHRpb24oKmFyZ3MsICoqb3B0ZGljdCkKKyAgICAgICAgc2VsZi5fYWxsX29wdGlvbnNbb3B0XSA9IHByb3ZpZGVyCisgICAgICAgIHNlbGYuX21heGxldmVsID0gbWF4KHNlbGYuX21heGxldmVsLCBvcHRpb24ubGV2ZWwgb3IgMCkKKworICAgIGRlZiBvcHRpa19vcHRpb24oc2VsZiwgcHJvdmlkZXIsIG9wdCwgb3B0ZGljdCk6CisgICAgICAgICIiImdldCBvdXIgcGVyc29uYWwgb3B0aW9uIGRlZmluaXRpb24gYW5kIHJldHVybiBhIHN1aXRhYmxlIGZvcm0gZm9yCisgICAgICAgIHVzZSB3aXRoIG9wdGlrL29wdHBhcnNlCisgICAgICAgICIiIgorICAgICAgICBvcHRkaWN0ID0gY29weS5jb3B5KG9wdGRpY3QpCisgICAgICAgIGlmICJhY3Rpb24iIGluIG9wdGRpY3Q6CisgICAgICAgICAgICBzZWxmLl9ub2NhbGxiYWNrX29wdGlvbnNbcHJvdmlkZXJdID0gb3B0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHRkaWN0WyJhY3Rpb24iXSA9ICJjYWxsYmFjayIKKyAgICAgICAgICAgIG9wdGRpY3RbImNhbGxiYWNrIl0gPSBzZWxmLmNiX3NldF9wcm92aWRlcl9vcHRpb24KKyAgICAgICAgIyBkZWZhdWx0IGlzIGhhbmRsZWQgaGVyZSBhbmQgKm11c3Qgbm90KiBiZSBnaXZlbiB0byBvcHRpayBpZiB5b3UKKyAgICAgICAgIyB3YW50IHRoZSB3aG9sZSBtYWNoaW5lcnkgdG8gd29yaworICAgICAgICBpZiAiZGVmYXVsdCIgaW4gb3B0ZGljdDoKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAiaGVscCIgaW4gb3B0ZGljdAorICAgICAgICAgICAgICAgIGFuZCBvcHRkaWN0LmdldCgiZGVmYXVsdCIpIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgYW5kIG9wdGRpY3RbImFjdGlvbiJdIG5vdCBpbiAoInN0b3JlX3RydWUiLCAic3RvcmVfZmFsc2UiKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBvcHRkaWN0WyJoZWxwIl0gKz0gIiBbY3VycmVudDogJWRlZmF1bHRdIgorICAgICAgICAgICAgZGVsIG9wdGRpY3RbImRlZmF1bHQiXQorICAgICAgICBhcmdzID0gWyItLSIgKyBzdHIob3B0KV0KKyAgICAgICAgaWYgInNob3J0IiBpbiBvcHRkaWN0OgorICAgICAgICAgICAgc2VsZi5fc2hvcnRfb3B0aW9uc1tvcHRkaWN0WyJzaG9ydCJdXSA9IG9wdAorICAgICAgICAgICAgYXJncy5hcHBlbmQoIi0iICsgb3B0ZGljdFsic2hvcnQiXSkKKyAgICAgICAgICAgIGRlbCBvcHRkaWN0WyJzaG9ydCJdCisgICAgICAgICMgY2xlYW51cCBvcHRpb24gZGVmaW5pdGlvbiBkaWN0IGJlZm9yZSBnaXZpbmcgaXQgdG8gb3B0aWsKKyAgICAgICAgZm9yIGtleSBpbiBsaXN0KG9wdGRpY3Qua2V5cygpKToKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5fb3B0aWtfb3B0aW9uX2F0dHJzOgorICAgICAgICAgICAgICAgIG9wdGRpY3QucG9wKGtleSkKKyAgICAgICAgcmV0dXJuIGFyZ3MsIG9wdGRpY3QKKworICAgIGRlZiBjYl9zZXRfcHJvdmlkZXJfb3B0aW9uKHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyKToKKyAgICAgICAgIiIib3B0aWsgY2FsbGJhY2sgZm9yIG9wdGlvbiBzZXR0aW5nIiIiCisgICAgICAgIGlmIG9wdC5zdGFydHN3aXRoKCItLSIpOgorICAgICAgICAgICAgIyByZW1vdmUgLS0gb24gbG9uZyBvcHRpb24KKyAgICAgICAgICAgIG9wdCA9IG9wdFsyOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgc2hvcnQgb3B0aW9uLCBnZXQgaXRzIGxvbmcgZXF1aXZhbGVudAorICAgICAgICAgICAgb3B0ID0gc2VsZi5fc2hvcnRfb3B0aW9uc1tvcHRbMTpdXQorICAgICAgICAjIHRyaWNrIHNpbmNlIHdlIGNhbid0IHNldCBhY3Rpb249J3N0b3JlX3RydWUnIG9uIG9wdGlvbnMKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIHZhbHVlID0gMQorICAgICAgICBzZWxmLmdsb2JhbF9zZXRfb3B0aW9uKG9wdCwgdmFsdWUpCisKKyAgICBkZWYgZ2xvYmFsX3NldF9vcHRpb24oc2VsZiwgb3B0LCB2YWx1ZSk6CisgICAgICAgICIiInNldCBvcHRpb24gb24gdGhlIGNvcnJlY3Qgb3B0aW9uIHByb3ZpZGVyIiIiCisgICAgICAgIHNlbGYuX2FsbF9vcHRpb25zW29wdF0uc2V0X29wdGlvbihvcHQsIHZhbHVlKQorCisgICAgZGVmIGdlbmVyYXRlX2NvbmZpZyhzZWxmLCBzdHJlYW09Tm9uZSwgc2tpcHNlY3Rpb25zPSgpKToKKyAgICAgICAgIiIid3JpdGUgYSBjb25maWd1cmF0aW9uIGZpbGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgaW50byB0aGUgZ2l2ZW4gc3RyZWFtIG9yIHN0ZG91dAorICAgICAgICAiIiIKKyAgICAgICAgb3B0aW9uc19ieV9zZWN0aW9uID0ge30KKyAgICAgICAgc2VjdGlvbnMgPSBbXQorICAgICAgICBmb3IgcHJvdmlkZXIgaW4gc2VsZi5vcHRpb25zX3Byb3ZpZGVyczoKKyAgICAgICAgICAgIGZvciBzZWN0aW9uLCBvcHRpb25zIGluIHByb3ZpZGVyLm9wdGlvbnNfYnlfc2VjdGlvbigpOgorICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IHByb3ZpZGVyLm5hbWUKKyAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIGluIHNraXBzZWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gWworICAgICAgICAgICAgICAgICAgICAobiwgZCwgdikKKyAgICAgICAgICAgICAgICAgICAgZm9yIChuLCBkLCB2KSBpbiBvcHRpb25zCisgICAgICAgICAgICAgICAgICAgIGlmIGQuZ2V0KCJ0eXBlIikgaXMgbm90IE5vbmUgYW5kIG5vdCBkLmdldCgiZGVwcmVjYXRlZCIpCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcHRpb25zOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gbm90IGluIHNlY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBzZWN0aW9ucy5hcHBlbmQoc2VjdGlvbikKKyAgICAgICAgICAgICAgICBhbGxvcHRpb25zID0gb3B0aW9uc19ieV9zZWN0aW9uLnNldGRlZmF1bHQoc2VjdGlvbiwgW10pCisgICAgICAgICAgICAgICAgYWxsb3B0aW9ucyArPSBvcHRpb25zCisgICAgICAgIHN0cmVhbSA9IHN0cmVhbSBvciBzeXMuc3Rkb3V0CisgICAgICAgIHByaW50ZWQgPSBGYWxzZQorICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKKyAgICAgICAgICAgIGlmIHByaW50ZWQ6CisgICAgICAgICAgICAgICAgcHJpbnQoIlxuIiwgZmlsZT1zdHJlYW0pCisgICAgICAgICAgICB1dGlscy5mb3JtYXRfc2VjdGlvbigKKyAgICAgICAgICAgICAgICBzdHJlYW0sIHNlY3Rpb24udXBwZXIoKSwgc29ydGVkKG9wdGlvbnNfYnlfc2VjdGlvbltzZWN0aW9uXSkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHByaW50ZWQgPSBUcnVlCisKKyAgICBkZWYgZ2VuZXJhdGVfbWFucGFnZShzZWxmLCBwa2dpbmZvLCBzZWN0aW9uPTEsIHN0cmVhbT1zeXMuc3Rkb3V0KToKKyAgICAgICAgd2l0aCBfcGF0Y2hfb3B0cGFyc2UoKToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IF9NYW5IZWxwRm9ybWF0dGVyKCkKKyAgICAgICAgICAgIGZvcm1hdHRlci5vdXRwdXRfbGV2ZWwgPSBzZWxmLl9tYXhsZXZlbAorICAgICAgICAgICAgZm9ybWF0dGVyLnBhcnNlciA9IHNlbGYuY21kbGluZV9wYXJzZXIKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgIGZvcm1hdHRlci5mb3JtYXRfaGVhZChzZWxmLmNtZGxpbmVfcGFyc2VyLCBwa2dpbmZvLCBzZWN0aW9uKSwKKyAgICAgICAgICAgICAgICBmaWxlPXN0cmVhbSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHByaW50KHNlbGYuY21kbGluZV9wYXJzZXIuZm9ybWF0X29wdGlvbl9oZWxwKGZvcm1hdHRlciksIGZpbGU9c3RyZWFtKQorICAgICAgICAgICAgcHJpbnQoZm9ybWF0dGVyLmZvcm1hdF90YWlsKHBrZ2luZm8pLCBmaWxlPXN0cmVhbSkKKworICAgIGRlZiBsb2FkX3Byb3ZpZGVyX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICAiIiJpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gdXNpbmcgZGVmYXVsdCB2YWx1ZXMiIiIKKyAgICAgICAgZm9yIHByb3ZpZGVyIGluIHNlbGYub3B0aW9uc19wcm92aWRlcnM6CisgICAgICAgICAgICBwcm92aWRlci5sb2FkX2RlZmF1bHRzKCkKKworICAgIGRlZiByZWFkX2NvbmZpZ19maWxlKHNlbGYsIGNvbmZpZ19maWxlPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBidXQgZG8gbm90IGxvYWQgaXQgKGkuZS4gZGlzcGF0Y2hpbmcKKyAgICAgICAgdmFsdWVzIHRvIGVhY2ggb3B0aW9ucyBwcm92aWRlcikKKyAgICAgICAgIiIiCisgICAgICAgIGhlbHBfbGV2ZWwgPSAxCisgICAgICAgIHdoaWxlIGhlbHBfbGV2ZWwgPD0gc2VsZi5fbWF4bGV2ZWw6CisgICAgICAgICAgICBvcHQgPSAiLSIuam9pbihbImxvbmciXSAqIGhlbHBfbGV2ZWwpICsgIi1oZWxwIgorICAgICAgICAgICAgaWYgb3B0IGluIHNlbGYuX2FsbF9vcHRpb25zOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGFscmVhZHkgcHJvY2Vzc2VkCisgICAgICAgICAgICBoZWxwX2Z1bmN0aW9uID0gZnVuY3Rvb2xzLnBhcnRpYWwoc2VsZi5oZWxwZnVuYywgbGV2ZWw9aGVscF9sZXZlbCkKKyAgICAgICAgICAgIGhlbHBfbXNnID0gIiVzIHZlcmJvc2UgaGVscC4iICUgIiAiLmpvaW4oWyJtb3JlIl0gKiBoZWxwX2xldmVsKQorICAgICAgICAgICAgb3B0ZGljdCA9IHsKKyAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBoZWxwX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICJoZWxwIjogaGVscF9tc2csCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm92aWRlciA9IHNlbGYub3B0aW9uc19wcm92aWRlcnNbMF0KKyAgICAgICAgICAgIHNlbGYuYWRkX29wdGlrX29wdGlvbihwcm92aWRlciwgc2VsZi5jbWRsaW5lX3BhcnNlciwgb3B0LCBvcHRkaWN0KQorICAgICAgICAgICAgcHJvdmlkZXIub3B0aW9ucyArPSAoKG9wdCwgb3B0ZGljdCksKQorICAgICAgICAgICAgaGVscF9sZXZlbCArPSAxCisgICAgICAgIGlmIGNvbmZpZ19maWxlIGlzIE5vbmU6CisgICAgICAgICAgICBjb25maWdfZmlsZSA9IHNlbGYuY29uZmlnX2ZpbGUKKyAgICAgICAgaWYgY29uZmlnX2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb25maWdfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcihjb25maWdfZmlsZSkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjb25maWdfZmlsZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihmIlRoZSBjb25maWcgZmlsZSB7Y29uZmlnX2ZpbGV9IGRvZXNuJ3QgZXhpc3QhIikKKworICAgICAgICB1c2VfY29uZmlnX2ZpbGUgPSBjb25maWdfZmlsZSBhbmQgb3MucGF0aC5leGlzdHMoY29uZmlnX2ZpbGUpCisgICAgICAgIGlmIHVzZV9jb25maWdfZmlsZTogICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LW5lc3RlZC1ibG9ja3MKKyAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuY2ZnZmlsZV9wYXJzZXIKKworICAgICAgICAgICAgaWYgY29uZmlnX2ZpbGUuZW5kc3dpdGgoIi50b21sIik6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbmZpZ19maWxlKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IHRvbWwubG9hZChmcCkKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnNfdmFsdWVzID0gY29udGVudFsidG9vbCJdWyJweWxpbnQiXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciBzZWN0aW9uLCB2YWx1ZXMgaW4gc2VjdGlvbnNfdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRPTUwgaGFzIHJpY2ggdHlwZXMsIGNvbnZlcnQgdmFsdWVzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZ3MgYXMgQ29uZmlnUGFyc2VyIGV4cGVjdHMuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igb3B0aW9uLCB2YWx1ZSBpbiB2YWx1ZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW29wdGlvbl0gPSAieWVzIiBpZiB2YWx1ZSBlbHNlICJubyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGZsb2F0KSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tvcHRpb25dID0gc3RyKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tvcHRpb25dID0gIiwiLmpvaW4odmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuX3NlY3Rpb25zW3NlY3Rpb24udXBwZXIoKV0gPSB2YWx1ZXMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBVc2UgdGhpcyBlbmNvZGluZyBpbiBvcmRlciB0byBzdHJpcCB0aGUgQk9NIG1hcmtlciwgaWYgYW55LgorICAgICAgICAgICAgICAgIHdpdGggb3Blbihjb25maWdfZmlsZSwgZW5jb2Rpbmc9InV0Zl84X3NpZyIpIGFzIGZwOgorICAgICAgICAgICAgICAgICAgICBwYXJzZXIucmVhZF9maWxlKGZwKQorCisgICAgICAgICAgICAgICAgIyBub3JtYWxpemUgc2VjdGlvbnMndGl0bGUKKyAgICAgICAgICAgICAgICBmb3Igc2VjdCwgdmFsdWVzIGluIGxpc3QocGFyc2VyLl9zZWN0aW9ucy5pdGVtcygpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VjdC5zdGFydHN3aXRoKCJweWxpbnQuIik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWN0ID0gc2VjdFtsZW4oInB5bGludC4iKSA6XQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VjdC5pc3VwcGVyKCkgYW5kIHZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5fc2VjdGlvbnNbc2VjdC51cHBlcigpXSA9IHZhbHVlcworICAgICAgICBpZiBub3QgdmVyYm9zZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB1c2VfY29uZmlnX2ZpbGU6CisgICAgICAgICAgICBtc2cgPSBmIlVzaW5nIGNvbmZpZyBmaWxlIHtvcy5wYXRoLmFic3BhdGgoY29uZmlnX2ZpbGUpfSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9ICJObyBjb25maWcgZmlsZSBmb3VuZCwgdXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIgorICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKKworICAgIGRlZiBsb2FkX2NvbmZpZ19maWxlKHNlbGYpOgorICAgICAgICAiIiJEaXNwYXRjaCB2YWx1ZXMgcHJldmlvdXNseSByZWFkIGZyb20gYSBjb25maWd1cmF0aW9uIGZpbGUgdG8gZWFjaAorICAgICAgICBvcHRpb25zIHByb3ZpZGVyKSIiIgorICAgICAgICBwYXJzZXIgPSBzZWxmLmNmZ2ZpbGVfcGFyc2VyCisgICAgICAgIGZvciBzZWN0aW9uIGluIHBhcnNlci5zZWN0aW9ucygpOgorICAgICAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gcGFyc2VyLml0ZW1zKHNlY3Rpb24pOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nbG9iYWxfc2V0X29wdGlvbihvcHRpb24sIHZhbHVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsIG9wdHBhcnNlLk9wdGlvbkVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgIGRlZiBsb2FkX2NvbmZpZ3VyYXRpb24oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICAiIiJvdmVycmlkZSBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byBnaXZlbiBwYXJhbWV0ZXJzIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxvYWRfY29uZmlndXJhdGlvbl9mcm9tX2NvbmZpZyhrd2FyZ3MpCisKKyAgICBkZWYgbG9hZF9jb25maWd1cmF0aW9uX2Zyb21fY29uZmlnKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGZvciBvcHQsIG9wdF92YWx1ZSBpbiBjb25maWcuaXRlbXMoKToKKyAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCJfIiwgIi0iKQorICAgICAgICAgICAgcHJvdmlkZXIgPSBzZWxmLl9hbGxfb3B0aW9uc1tvcHRdCisgICAgICAgICAgICBwcm92aWRlci5zZXRfb3B0aW9uKG9wdCwgb3B0X3ZhbHVlKQorCisgICAgZGVmIGxvYWRfY29tbWFuZF9saW5lX2NvbmZpZ3VyYXRpb24oc2VsZiwgYXJncz1Ob25lKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKKworICAgICAgICByZXR1cm4gYWRkaXRpb25hbCBhcmd1bWVudHMKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggX3BhdGNoX29wdHBhcnNlKCk6CisgICAgICAgICAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdzID0gbGlzdChhcmdzKQorICAgICAgICAgICAgKG9wdGlvbnMsIGFyZ3MpID0gc2VsZi5jbWRsaW5lX3BhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncykKKyAgICAgICAgICAgIGZvciBwcm92aWRlciBpbiBzZWxmLl9ub2NhbGxiYWNrX29wdGlvbnM6CisgICAgICAgICAgICAgICAgY29uZmlnID0gcHJvdmlkZXIuY29uZmlnCisgICAgICAgICAgICAgICAgZm9yIGF0dHIgaW4gY29uZmlnLl9fZGljdF9fLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9wdGlvbnMsIGF0dHIsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbmZpZywgYXR0ciwgdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gYXJncworCisgICAgZGVmIGFkZF9oZWxwX3NlY3Rpb24oc2VsZiwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsZXZlbD0wKToKKyAgICAgICAgIiIiYWRkIGEgZHVtbXkgb3B0aW9uIHNlY3Rpb24gZm9yIGhlbHAgcHVycG9zZSIiIgorICAgICAgICBncm91cCA9IG9wdHBhcnNlLk9wdGlvbkdyb3VwKAorICAgICAgICAgICAgc2VsZi5jbWRsaW5lX3BhcnNlciwgdGl0bGU9dGl0bGUuY2FwaXRhbGl6ZSgpLCBkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbgorICAgICAgICApCisgICAgICAgIGdyb3VwLmxldmVsID0gbGV2ZWwKKyAgICAgICAgc2VsZi5fbWF4bGV2ZWwgPSBtYXgoc2VsZi5fbWF4bGV2ZWwsIGxldmVsKQorICAgICAgICBzZWxmLmNtZGxpbmVfcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ3JvdXApCisKKyAgICBkZWYgaGVscChzZWxmLCBsZXZlbD0wKToKKyAgICAgICAgIiIicmV0dXJuIHRoZSB1c2FnZSBzdHJpbmcgZm9yIGF2YWlsYWJsZSBvcHRpb25zIiIiCisgICAgICAgIHNlbGYuY21kbGluZV9wYXJzZXIuZm9ybWF0dGVyLm91dHB1dF9sZXZlbCA9IGxldmVsCisgICAgICAgIHdpdGggX3BhdGNoX29wdHBhcnNlKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jbWRsaW5lX3BhcnNlci5mb3JtYXRfaGVscCgpCisKKyAgICBkZWYgaGVscGZ1bmMoc2VsZiwgb3B0aW9uLCBvcHQsIHZhbCwgcCwgbGV2ZWwpOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgIHByaW50KHNlbGYuaGVscChsZXZlbCkpCisgICAgICAgIHN5cy5leGl0KDApCmRpZmYgLS1naXQgYS9weWxpbnQvY29uZmlnL29wdGlvbl9wYXJzZXIucHkgYi9weWxpbnQvY29uZmlnL29wdGlvbl9wYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzMTc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jb25maWcvb3B0aW9uX3BhcnNlci5weQpAQCAtMCwwICsxLDQ3IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBvcHRwYXJzZSAgIyBweWxpbnQ6IGRpc2FibGU9ZGVwcmVjYXRlZC1tb2R1bGUKKworZnJvbSBweWxpbnQuY29uZmlnLm9wdGlvbiBpbXBvcnQgT3B0aW9uCisKKworZGVmIF9sZXZlbF9vcHRpb25zKGdyb3VwLCBvdXRwdXRsZXZlbCk6CisgICAgcmV0dXJuIFsKKyAgICAgICAgb3B0aW9uCisgICAgICAgIGZvciBvcHRpb24gaW4gZ3JvdXAub3B0aW9uX2xpc3QKKyAgICAgICAgaWYgKGdldGF0dHIob3B0aW9uLCAibGV2ZWwiLCAwKSBvciAwKSA8PSBvdXRwdXRsZXZlbAorICAgICAgICBhbmQgb3B0aW9uLmhlbHAgaXMgbm90IG9wdHBhcnNlLlNVUFBSRVNTX0hFTFAKKyAgICBdCisKKworY2xhc3MgT3B0aW9uUGFyc2VyKG9wdHBhcnNlLk9wdGlvblBhcnNlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbl9jbGFzcywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgb3B0cGFyc2UuT3B0aW9uUGFyc2VyLl9faW5pdF9fKHNlbGYsIG9wdGlvbl9jbGFzcz1PcHRpb24sICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBmb3JtYXRfb3B0aW9uX2hlbHAoc2VsZiwgZm9ybWF0dGVyPU5vbmUpOgorICAgICAgICBpZiBmb3JtYXR0ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuZm9ybWF0dGVyCisgICAgICAgIG91dHB1dGxldmVsID0gZ2V0YXR0cihmb3JtYXR0ZXIsICJvdXRwdXRfbGV2ZWwiLCAwKQorICAgICAgICBmb3JtYXR0ZXIuc3RvcmVfb3B0aW9uX3N0cmluZ3Moc2VsZikKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXR0ZXIuZm9ybWF0X2hlYWRpbmcoIk9wdGlvbnMiKSkKKyAgICAgICAgZm9ybWF0dGVyLmluZGVudCgpCisgICAgICAgIGlmIHNlbGYub3B0aW9uX2xpc3Q6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG9wdHBhcnNlLk9wdGlvbkNvbnRhaW5lci5mb3JtYXRfb3B0aW9uX2hlbHAoc2VsZiwgZm9ybWF0dGVyKSkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIikKKyAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYub3B0aW9uX2dyb3VwczoKKyAgICAgICAgICAgIGlmIGdyb3VwLmxldmVsIDw9IG91dHB1dGxldmVsIGFuZCAoCisgICAgICAgICAgICAgICAgZ3JvdXAuZGVzY3JpcHRpb24gb3IgX2xldmVsX29wdGlvbnMoZ3JvdXAsIG91dHB1dGxldmVsKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdyb3VwLmZvcm1hdF9oZWxwKGZvcm1hdHRlcikpCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKQorICAgICAgICBmb3JtYXR0ZXIuZGVkZW50KCkKKyAgICAgICAgIyBEcm9wIHRoZSBsYXN0ICJcbiIsIG9yIHRoZSBoZWFkZXIgaWYgbm8gb3B0aW9ucyBvciBvcHRpb24gZ3JvdXBzOgorICAgICAgICByZXR1cm4gIiIuam9pbihyZXN1bHRbOi0xXSkKKworICAgIGRlZiBfbWF0Y2hfbG9uZ19vcHQoc2VsZiwgb3B0KToKKyAgICAgICAgIiIiRGlzYWJsZSBhYmJyZXZpYXRpb25zLiIiIgorICAgICAgICBpZiBvcHQgbm90IGluIHNlbGYuX2xvbmdfb3B0OgorICAgICAgICAgICAgcmFpc2Ugb3B0cGFyc2UuQmFkT3B0aW9uRXJyb3Iob3B0KQorICAgICAgICByZXR1cm4gb3B0CmRpZmYgLS1naXQgYS9weWxpbnQvY29uZmlnL29wdGlvbnNfcHJvdmlkZXJfbWl4aW4ucHkgYi9weWxpbnQvY29uZmlnL29wdGlvbnNfcHJvdmlkZXJfbWl4aW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjZTNhNQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9jb25maWcvb3B0aW9uc19wcm92aWRlcl9taXhpbi5weQpAQCAtMCwwICsxLDExMSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisKK2ltcG9ydCBvcHRwYXJzZSAgIyBweWxpbnQ6IGRpc2FibGU9ZGVwcmVjYXRlZC1tb2R1bGUKK2Zyb20gdHlwaW5nIGltcG9ydCBBbnksIERpY3QsIFR1cGxlCisKK2Zyb20gcHlsaW50LmNvbmZpZy5vcHRpb24gaW1wb3J0IF92YWxpZGF0ZQorCisKK2NsYXNzIFVuc3VwcG9ydGVkQWN0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIicmFpc2VkIGJ5IHNldF9vcHRpb24gd2hlbiBpdCBkb2Vzbid0IGtub3cgd2hhdCB0byBkbyBmb3IgYW4gYWN0aW9uIiIiCisKKworY2xhc3MgT3B0aW9uc1Byb3ZpZGVyTWl4SW46CisgICAgIiIiTWl4aW4gdG8gcHJvdmlkZSBvcHRpb25zIHRvIGFuIE9wdGlvbnNNYW5hZ2VyIiIiCisKKyAgICAjIHRob3NlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBwcmlvcml0eSA9IC0xCisgICAgbmFtZSA9ICJkZWZhdWx0IgorICAgIG9wdGlvbnM6IFR1cGxlW1R1cGxlW3N0ciwgRGljdFtzdHIsIEFueV1dLCAuLi5dID0gKCkKKyAgICBsZXZlbCA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25maWcgPSBvcHRwYXJzZS5WYWx1ZXMoKQorICAgICAgICBzZWxmLmxvYWRfZGVmYXVsdHMoKQorCisgICAgZGVmIGxvYWRfZGVmYXVsdHMoc2VsZik6CisgICAgICAgICIiImluaXRpYWxpemUgdGhlIHByb3ZpZGVyIHVzaW5nIGRlZmF1bHQgdmFsdWVzIiIiCisgICAgICAgIGZvciBvcHQsIG9wdGRpY3QgaW4gc2VsZi5vcHRpb25zOgorICAgICAgICAgICAgYWN0aW9uID0gb3B0ZGljdC5nZXQoImFjdGlvbiIpCisgICAgICAgICAgICBpZiBhY3Rpb24gIT0gImNhbGxiYWNrIjoKKyAgICAgICAgICAgICAgICAjIGNhbGxiYWNrIGFjdGlvbiBoYXZlIG5vIGRlZmF1bHQKKyAgICAgICAgICAgICAgICBpZiBvcHRkaWN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9wdGRpY3QgPSBzZWxmLmdldF9vcHRpb25fZGVmKG9wdCkKKyAgICAgICAgICAgICAgICBkZWZhdWx0ID0gb3B0ZGljdC5nZXQoImRlZmF1bHQiKQorICAgICAgICAgICAgICAgIHNlbGYuc2V0X29wdGlvbihvcHQsIGRlZmF1bHQsIGFjdGlvbiwgb3B0ZGljdCkKKworICAgIGRlZiBvcHRpb25fYXR0cm5hbWUoc2VsZiwgb3B0LCBvcHRkaWN0PU5vbmUpOgorICAgICAgICAiIiJnZXQgdGhlIGNvbmZpZyBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byBvcHQiIiIKKyAgICAgICAgaWYgb3B0ZGljdCBpcyBOb25lOgorICAgICAgICAgICAgb3B0ZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kZWYob3B0KQorICAgICAgICByZXR1cm4gb3B0ZGljdC5nZXQoImRlc3QiLCBvcHQucmVwbGFjZSgiLSIsICJfIikpCisKKyAgICBkZWYgb3B0aW9uX3ZhbHVlKHNlbGYsIG9wdCk6CisgICAgICAgICIiImdldCB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGdpdmVuIG9wdGlvbiIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmNvbmZpZywgc2VsZi5vcHRpb25fYXR0cm5hbWUob3B0KSwgTm9uZSkKKworICAgIGRlZiBzZXRfb3B0aW9uKHNlbGYsIG9wdG5hbWUsIHZhbHVlLCBhY3Rpb249Tm9uZSwgb3B0ZGljdD1Ob25lKToKKyAgICAgICAgIiIibWV0aG9kIGNhbGxlZCB0byBzZXQgYW4gb3B0aW9uIChyZWdpc3RlcmVkIGluIHRoZSBvcHRpb25zIGxpc3QpIiIiCisgICAgICAgIGlmIG9wdGRpY3QgaXMgTm9uZToKKyAgICAgICAgICAgIG9wdGRpY3QgPSBzZWxmLmdldF9vcHRpb25fZGVmKG9wdG5hbWUpCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdmFsdWUgPSBfdmFsaWRhdGUodmFsdWUsIG9wdGRpY3QsIG9wdG5hbWUpCisgICAgICAgIGlmIGFjdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgYWN0aW9uID0gb3B0ZGljdC5nZXQoImFjdGlvbiIsICJzdG9yZSIpCisgICAgICAgIGlmIGFjdGlvbiA9PSAic3RvcmUiOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLmNvbmZpZywgc2VsZi5vcHRpb25fYXR0cm5hbWUob3B0bmFtZSwgb3B0ZGljdCksIHZhbHVlKQorICAgICAgICBlbGlmIGFjdGlvbiBpbiAoInN0b3JlX3RydWUiLCAiY291bnQiKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZi5jb25maWcsIHNlbGYub3B0aW9uX2F0dHJuYW1lKG9wdG5hbWUsIG9wdGRpY3QpLCAwKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAic3RvcmVfZmFsc2UiOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLmNvbmZpZywgc2VsZi5vcHRpb25fYXR0cm5hbWUob3B0bmFtZSwgb3B0ZGljdCksIDEpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJhcHBlbmQiOgorICAgICAgICAgICAgb3B0bmFtZSA9IHNlbGYub3B0aW9uX2F0dHJuYW1lKG9wdG5hbWUsIG9wdGRpY3QpCisgICAgICAgICAgICBfbGlzdCA9IGdldGF0dHIoc2VsZi5jb25maWcsIG9wdG5hbWUsIE5vbmUpCisgICAgICAgICAgICBpZiBfbGlzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgICAgICAgICBfbGlzdCA9IHZhbHVlCisgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgX2xpc3QgPSBbXQorICAgICAgICAgICAgICAgICAgICBfbGlzdC5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLmNvbmZpZywgb3B0bmFtZSwgX2xpc3QpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoX2xpc3QsIHR1cGxlKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYuY29uZmlnLCBvcHRuYW1lLCBfbGlzdCArICh2YWx1ZSwpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBfbGlzdC5hcHBlbmQodmFsdWUpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJjYWxsYmFjayI6CisgICAgICAgICAgICBvcHRkaWN0WyJjYWxsYmFjayJdKE5vbmUsIG9wdG5hbWUsIHZhbHVlLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRBY3Rpb24oYWN0aW9uKQorCisgICAgZGVmIGdldF9vcHRpb25fZGVmKHNlbGYsIG9wdCk6CisgICAgICAgICIiInJldHVybiB0aGUgZGljdGlvbmFyeSBkZWZpbmluZyBhbiBvcHRpb24gZ2l2ZW4gaXRzIG5hbWUiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYub3B0aW9ucworICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYub3B0aW9uczoKKyAgICAgICAgICAgIGlmIG9wdGlvblswXSA9PSBvcHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvblsxXQorICAgICAgICByYWlzZSBvcHRwYXJzZS5PcHRpb25FcnJvcigKKyAgICAgICAgICAgIGYibm8gc3VjaCBvcHRpb24ge29wdH0gaW4gc2VjdGlvbiB7c2VsZi5uYW1lIXJ9Iiwgb3B0CisgICAgICAgICkKKworICAgIGRlZiBvcHRpb25zX2J5X3NlY3Rpb24oc2VsZik6CisgICAgICAgICIiInJldHVybiBhbiBpdGVyYXRvciBvbiBvcHRpb25zIGdyb3VwZWQgYnkgc2VjdGlvbgorCisgICAgICAgIChzZWN0aW9uLCBbbGlzdCBvZiAob3B0bmFtZSwgb3B0ZGljdCwgb3B0dmFsdWUpXSkKKyAgICAgICAgIiIiCisgICAgICAgIHNlY3Rpb25zID0ge30KKyAgICAgICAgZm9yIG9wdG5hbWUsIG9wdGRpY3QgaW4gc2VsZi5vcHRpb25zOgorICAgICAgICAgICAgc2VjdGlvbnMuc2V0ZGVmYXVsdChvcHRkaWN0LmdldCgiZ3JvdXAiKSwgW10pLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAob3B0bmFtZSwgb3B0ZGljdCwgc2VsZi5vcHRpb25fdmFsdWUob3B0bmFtZSkpCisgICAgICAgICAgICApCisgICAgICAgIGlmIE5vbmUgaW4gc2VjdGlvbnM6CisgICAgICAgICAgICB5aWVsZCBOb25lLCBzZWN0aW9ucy5wb3AoTm9uZSkKKyAgICAgICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc29ydGVkKHNlY3Rpb25zLml0ZW1zKCkpOgorICAgICAgICAgICAgeWllbGQgc2VjdGlvbi51cHBlcigpLCBvcHRpb25zCisKKyAgICBkZWYgb3B0aW9uc19hbmRfdmFsdWVzKHNlbGYsIG9wdGlvbnM9Tm9uZSk6CisgICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLm9wdGlvbnMKKyAgICAgICAgZm9yIG9wdG5hbWUsIG9wdGRpY3QgaW4gb3B0aW9uczoKKyAgICAgICAgICAgIHlpZWxkIChvcHRuYW1lLCBvcHRkaWN0LCBzZWxmLm9wdGlvbl92YWx1ZShvcHRuYW1lKSkKZGlmZiAtLWdpdCBhL3B5bGludC9jb25zdGFudHMucHkgYi9weWxpbnQvY29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWQ3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvY29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IHN5cworCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5fX3BrZ2luZm9fXyBpbXBvcnQgX192ZXJzaW9uX18KKworUFkzOF9QTFVTID0gc3lzLnZlcnNpb25faW5mb1s6Ml0gPj0gKDMsIDgpCitQWTM5X1BMVVMgPSBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMywgOSkKK1BZMzEwX1BMVVMgPSBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMywgMTApCisKKworUFlfRVhUUyA9ICgiLnB5IiwgIi5weWMiLCAiLnB5byIsICIucHl3IiwgIi5zbyIsICIuZGxsIikKKworTVNHX1NUQVRFX0NPTkZJREVOQ0UgPSAyCitfTVNHX09SREVSID0gIkVXUkNJRiIKK01TR19TVEFURV9TQ09QRV9DT05GSUcgPSAwCitNU0dfU1RBVEVfU0NPUEVfTU9EVUxFID0gMQorCisjIFRoZSBsaW5lL25vZGUgZGlzdGluY3Rpb24gZG9lcyBub3QgYXBwbHkgdG8gZmF0YWwgZXJyb3JzIGFuZCByZXBvcnRzLgorX1NDT1BFX0VYRU1QVCA9ICJGUiIKKworTVNHX1RZUEVTID0geworICAgICJJIjogImluZm8iLAorICAgICJDIjogImNvbnZlbnRpb24iLAorICAgICJSIjogInJlZmFjdG9yIiwKKyAgICAiVyI6ICJ3YXJuaW5nIiwKKyAgICAiRSI6ICJlcnJvciIsCisgICAgIkYiOiAiZmF0YWwiLAorfQorTVNHX1RZUEVTX0xPTkcgPSB7djogayBmb3IgaywgdiBpbiBNU0dfVFlQRVMuaXRlbXMoKX0KKworTVNHX1RZUEVTX1NUQVRVUyA9IHsiSSI6IDAsICJDIjogMTYsICJSIjogOCwgIlciOiA0LCAiRSI6IDIsICJGIjogMX0KKworIyBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIE1BSU5fQ0hFQ0tFUl9OQU1FCisjIFRoaXMgd291bGQgYWZmZWN0IHJjZmlsZSBnZW5lcmF0aW9uIGFuZCByZXRyby1jb21wYXRpYmlsaXR5CisjIG9uIGFsbCBwcm9qZWN0IHVzaW5nIFtNQVNURVJdIGluIHRoZWlyIHJjZmlsZS4KK01BSU5fQ0hFQ0tFUl9OQU1FID0gIm1hc3RlciIKKworCitjbGFzcyBXYXJuaW5nU2NvcGU6CisgICAgTElORSA9ICJsaW5lLWJhc2VkLW1zZyIKKyAgICBOT0RFID0gIm5vZGUtYmFzZWQtbXNnIgorCisKK2Z1bGxfdmVyc2lvbiA9IGYiIiJweWxpbnQge19fdmVyc2lvbl9ffQorYXN0cm9pZCB7YXN0cm9pZC5fX3ZlcnNpb25fX30KK1B5dGhvbiB7c3lzLnZlcnNpb259IiIiCmRpZmYgLS1naXQgYS9weWxpbnQvZXB5bGludC5weSBiL3B5bGludC9lcHlsaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyZjU0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXB5bGludC5weQpAQCAtMCwwICsxLDIwMyBAQAorIyBtb2RlOiBweXRob247IHRhYi13aWR0aDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjLWJhc2ljLW9mZnNldDogNAorIyAtKi0gdmltOmZlbmM9dXRmLTg6ZnQ9cHl0aG9uOmV0OnN3PTQ6dHM9NDpzdHM9NAorCisjIENvcHlyaWdodCAoYykgMjAwOC0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEpha29iIE5vcm1hcmsgPGpha29ibm9ybWFya0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBNYW51ZWwgVsOhenF1ZXogQWNvc3RhIDxtdmEubGVkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IERlcmVrIEhhcmxhbmQgPGRlcmVrLmhhcmxhbmRAZmlucS5jby5uej4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IE1paGFpIEJhbGludCA8YmFsaW50Lm1paGFpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgRGFuaWVsYSBQbGFzY2VuY2lhIDxkYXBsYXNjZW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU3VzaG9iaGl0IDwzMTk4Nzc2OStzdXNob2JoaXQyN0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBSeWFuIE1jR3VpcmUgPHJ5YW5AZW5pZ21hY3VycnkuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggdGhlcm5zdGlnIDwzMDgyNzIzOCt0aGVybnN0aWdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUmFkb3N0aW4gU3RveWFub3YgPHJzdDBnaXRAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgQW5kcmVhcyBGaW5rbGVyIDxhbmRpLmZpbmtsZXJAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIkVtYWNzIGFuZCBGbHltYWtlIGNvbXBhdGlibGUgUHlsaW50LgorCitUaGlzIHNjcmlwdCBpcyBmb3IgaW50ZWdyYXRpb24gd2l0aCBlbWFjcyBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIGZseW1ha2UgbW9kZS4KKworZXB5bGludCB3YWxrcyBvdXQgb2YgcHl0aG9uIHBhY2thZ2VzIGJlZm9yZSBpbnZva2luZyBweWxpbnQuIFRoaXMgYXZvaWRzCityZXBvcnRpbmcgaW1wb3J0IGVycm9ycyB0aGF0IG9jY3VyIHdoZW4gYSBtb2R1bGUgd2l0aGluIGEgcGFja2FnZSB1c2VzIHRoZQorYWJzb2x1dGUgaW1wb3J0IHBhdGggdG8gZ2V0IGFub3RoZXIgbW9kdWxlIHdpdGhpbiB0aGlzIHBhY2thZ2UuCisKK0ZvciBleGFtcGxlOgorICAgIC0gU3VwcG9zZSBhIHBhY2thZ2UgaXMgc3RydWN0dXJlZCBhcworCisgICAgICAgIGEvX19pbml0X18ucHkKKyAgICAgICAgYS9iL3gucHkKKyAgICAgICAgYS9jL3kucHkKKworICAgLSBUaGVuIGlmIHkucHkgaW1wb3J0cyB4IGFzICJmcm9tIGEuYiBpbXBvcnQgeCIgdGhlIGZvbGxvd2luZyBwcm9kdWNlcyBweWxpbnQKKyAgICAgZXJyb3JzCisKKyAgICAgICBjZCBhL2M7IHB5bGludCB5LnB5CisKKyAgIC0gVGhlIGZvbGxvd2luZyBvYnZpb3VzbHkgZG9lc24ndAorCisgICAgICAgcHlsaW50IGEvYy95LnB5CisKKyAgIC0gQXMgdGhpcyBzY3JpcHQgd2lsbCBiZSBpbnZva2VkIGJ5IGVtYWNzIHdpdGhpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBmaWxlCisgICAgIHdlIGFyZSBjaGVja2luZyB3ZSBuZWVkIHRvIGdvIG91dCBvZiBpdCB0byBhdm9pZCB0aGVzZSBmYWxzZSBwb3NpdGl2ZXMuCisKKworWW91IG1heSBhbHNvIHVzZSBweV9ydW4gdG8gcnVuIHB5bGludCB3aXRoIGRlc2lyZWQgb3B0aW9ucyBhbmQgZ2V0IGJhY2sgKG9yIG5vdCkKK2l0cyBvdXRwdXQuCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHNobGV4CitpbXBvcnQgc3lzCitmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQSVBFLCBQb3BlbgorCisKK2RlZiBfZ2V0X2VudigpOgorICAgICIiIkV4dHJhY3RzIHRoZSBlbnZpcm9ubWVudCBQWVRIT05QQVRIIGFuZCBhcHBlbmRzIHRoZSBjdXJyZW50IHN5cy5wYXRoIHRvCisgICAgdGhvc2UuIiIiCisgICAgZW52ID0gZGljdChvcy5lbnZpcm9uKQorICAgIGVudlsiUFlUSE9OUEFUSCJdID0gb3MucGF0aHNlcC5qb2luKHN5cy5wYXRoKQorICAgIHJldHVybiBlbnYKKworCitkZWYgbGludChmaWxlbmFtZSwgb3B0aW9ucz0oKSk6CisgICAgIiIiUHlsaW50IHRoZSBnaXZlbiBmaWxlLgorCisgICAgV2hlbiBydW4gZnJvbSBlbWFjcyB3ZSB3aWxsIGJlIGluIHRoZSBkaXJlY3Rvcnkgb2YgYSBmaWxlLCBhbmQgcGFzc2VkIGl0cworICAgIGZpbGVuYW1lLiAgSWYgdGhpcyBmaWxlIGlzIHBhcnQgb2YgYSBwYWNrYWdlIGFuZCBpcyB0cnlpbmcgdG8gaW1wb3J0IG90aGVyCisgICAgbW9kdWxlcyBmcm9tIHdpdGhpbiBpdHMgb3duIHBhY2thZ2Ugb3IgYW5vdGhlciBwYWNrYWdlIHJvb3RlZCBpbiBhIGRpcmVjdG9yeQorICAgIGJlbG93IGl0LCBweWxpbnQgd2lsbCBjbGFzc2lmeSBpdCBhcyBhIGZhaWxlZCBpbXBvcnQuCisKKyAgICBUbyBnZXQgYXJvdW5kIHRoaXMsIHdlIHRyYXZlcnNlIGRvd24gdGhlIGRpcmVjdG9yeSB0cmVlIHRvIGZpbmQgdGhlIHJvb3Qgb2YKKyAgICB0aGUgcGFja2FnZSB0aGlzIG1vZHVsZSBpcyBpbi4gIFdlIHRoZW4gaW52b2tlIHB5bGludCBmcm9tIHRoaXMgZGlyZWN0b3J5LgorCisgICAgRmluYWxseSwgd2UgbXVzdCBjb3JyZWN0IHRoZSBmaWxlbmFtZXMgaW4gdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgcHlsaW50IHNvCisgICAgRW1hY3MgZG9lc24ndCBiZWNvbWUgY29uZnVzZWQgKGl0IHdpbGwgZXhwZWN0IGp1c3QgdGhlIG9yaWdpbmFsIGZpbGVuYW1lLAorICAgIHdoaWxlIHB5bGludCBtYXkgZXh0ZW5kIGl0IHdpdGggZXh0cmEgZGlyZWN0b3JpZXMgaWYgd2UndmUgdHJhdmVyc2VkIGRvd24KKyAgICB0aGUgdHJlZSkKKyAgICAiIiIKKyAgICAjIHRyYXZlcnNlIGRvd253YXJkcyB1bnRpbCB3ZSBhcmUgb3V0IG9mIGEgcHl0aG9uIHBhY2thZ2UKKyAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpCisgICAgcGFyZW50X3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZnVsbF9wYXRoKQorICAgIGNoaWxkX3BhdGggPSBvcy5wYXRoLmJhc2VuYW1lKGZ1bGxfcGF0aCkKKworICAgIHdoaWxlIHBhcmVudF9wYXRoICE9ICIvIiBhbmQgb3MucGF0aC5leGlzdHMoCisgICAgICAgIG9zLnBhdGguam9pbihwYXJlbnRfcGF0aCwgIl9faW5pdF9fLnB5IikKKyAgICApOgorICAgICAgICBjaGlsZF9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguYmFzZW5hbWUocGFyZW50X3BhdGgpLCBjaGlsZF9wYXRoKQorICAgICAgICBwYXJlbnRfcGF0aCA9IG9zLnBhdGguZGlybmFtZShwYXJlbnRfcGF0aCkKKworICAgICMgU3RhcnQgcHlsaW50CisgICAgIyBFbnN1cmUgd2UgdXNlIHRoZSBweXRob24gYW5kIHB5bGludCBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1bm5pbmcgZXB5bGludAorICAgIHJ1bl9jbWQgPSAiaW1wb3J0IHN5czsgZnJvbSBweWxpbnQubGludCBpbXBvcnQgUnVuOyBSdW4oc3lzLmFyZ3ZbMTpdKSIKKyAgICBjbWQgPSAoCisgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgcnVuX2NtZF0KKyAgICAgICAgKyBbCisgICAgICAgICAgICAiLS1tc2ctdGVtcGxhdGUiLAorICAgICAgICAgICAgIntwYXRofTp7bGluZX06IHtjYXRlZ29yeX0gKHttc2dfaWR9LCB7c3ltYm9sfSwge29ian0pIHttc2d9IiwKKyAgICAgICAgICAgICItciIsCisgICAgICAgICAgICAibiIsCisgICAgICAgICAgICBjaGlsZF9wYXRoLAorICAgICAgICBdCisgICAgICAgICsgbGlzdChvcHRpb25zKQorICAgICkKKworICAgIHdpdGggUG9wZW4oCisgICAgICAgIGNtZCwgc3Rkb3V0PVBJUEUsIGN3ZD1wYXJlbnRfcGF0aCwgZW52PV9nZXRfZW52KCksIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlCisgICAgKSBhcyBwcm9jZXNzOgorCisgICAgICAgIGZvciBsaW5lIGluIHByb2Nlc3Muc3Rkb3V0OgorICAgICAgICAgICAgIyByZW1vdmUgcHlsaW50cmMgd2FybmluZworICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJObyBjb25maWcgZmlsZSBmb3VuZCIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgbW9kaWZ5IHRoZSBmaWxlIG5hbWUgdGhhdHMgb3V0cHV0IHRvIHJldmVyc2UgdGhlIHBhdGggdHJhdmVyc2FsIHdlIG1hZGUKKyAgICAgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgiOiIpCisgICAgICAgICAgICBpZiBwYXJ0cyBhbmQgcGFydHNbMF0gPT0gY2hpbGRfcGF0aDoKKyAgICAgICAgICAgICAgICBsaW5lID0gIjoiLmpvaW4oW2ZpbGVuYW1lXSArIHBhcnRzWzE6XSkKKyAgICAgICAgICAgIHByaW50KGxpbmUsIGVuZD0iICIpCisKKyAgICAgICAgcHJvY2Vzcy53YWl0KCkKKyAgICAgICAgcmV0dXJuIHByb2Nlc3MucmV0dXJuY29kZQorCisKK2RlZiBweV9ydW4oY29tbWFuZF9vcHRpb25zPSIiLCByZXR1cm5fc3RkPUZhbHNlLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUpOgorICAgICIiIlJ1biBweWxpbnQgZnJvbSBweXRob24KKworICAgIGBgY29tbWFuZF9vcHRpb25zYGAgaXMgYSBzdHJpbmcgY29udGFpbmluZyBgYHB5bGludGBgIGNvbW1hbmQgbGluZSBvcHRpb25zOworICAgIGBgcmV0dXJuX3N0ZGBgIChib29sZWFuKSBpbmRpY2F0ZXMgcmV0dXJuIG9mIGNyZWF0ZWQgc3RhbmRhcmQgb3V0cHV0CisgICAgYW5kIGVycm9yIChzZWUgYmVsb3cpOworICAgIGBgc3Rkb3V0YGAgYW5kIGBgc3RkZXJyYGAgYXJlICdmaWxlLWxpa2UnIG9iamVjdHMgaW4gd2hpY2ggc3RhbmRhcmQgb3V0cHV0CisgICAgY291bGQgYmUgd3JpdHRlbi4KKworICAgIENhbGxpbmcgYWdlbnQgaXMgcmVzcG9uc2libGUgZm9yIHN0ZG91dC9lcnIgbWFuYWdlbWVudCAoY3JlYXRpb24sIGNsb3NlKS4KKyAgICBEZWZhdWx0IHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IgYXJlIHRob3NlIGZyb20gc3lzLAorICAgIG9yIHN0YW5kYWxvbmUgb25lcyAoYGBzdWJwcm9jZXNzLlBJUEVgYCkgYXJlIHVzZWQKKyAgICBpZiB0aGV5IGFyZSBub3Qgc2V0IGFuZCBgYHJldHVybl9zdGRgYC4KKworICAgIElmIGBgcmV0dXJuX3N0ZGBgIGlzIHNldCB0byBgYFRydWVgYCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgMi11cGxlCisgICAgY29udGFpbmluZyBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIHJlbGF0ZWQgdG8gY3JlYXRlZCBwcm9jZXNzLAorICAgIGFzIGZvbGxvd3M6IGBgKHN0ZG91dCwgc3RkZXJyKWBgLgorCisgICAgVG8gc2lsZW50bHkgcnVuIFB5bGludCBvbiBhIG1vZHVsZSwgYW5kIGdldCBpdHMgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvcjoKKyAgICAgICAgPj4+IChweWxpbnRfc3Rkb3V0LCBweWxpbnRfc3RkZXJyKSA9IHB5X3J1biggJ21vZHVsZV9uYW1lLnB5JywgVHJ1ZSkKKyAgICAiIiIKKyAgICAjIERldGVjdCBpZiB3ZSB1c2UgUHl0aG9uIGFzIGV4ZWN1dGFibGUgb3Igbm90LCBlbHNlIGRlZmF1bHQgdG8gYHB5dGhvbmAKKyAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUgaWYgInB5dGhvbiIgaW4gc3lzLmV4ZWN1dGFibGUgZWxzZSAicHl0aG9uIgorCisgICAgIyBDcmVhdGUgY29tbWFuZCBsaW5lIHRvIGNhbGwgcHlsaW50CisgICAgZXB5bGludF9wYXJ0ID0gW2V4ZWN1dGFibGUsICItYyIsICJmcm9tIHB5bGludCBpbXBvcnQgZXB5bGludDtlcHlsaW50LlJ1bigpIl0KKyAgICBvcHRpb25zID0gc2hsZXguc3BsaXQoY29tbWFuZF9vcHRpb25zLCBwb3NpeD1ub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpKQorICAgIGNsaSA9IGVweWxpbnRfcGFydCArIG9wdGlvbnMKKworICAgICMgUHJvdmlkaW5nIHN0YW5kYXJkIG91dHB1dCBhbmQvb3IgZXJyb3IgaWYgbm90IHNldAorICAgIGlmIHN0ZG91dCBpcyBOb25lOgorICAgICAgICBpZiByZXR1cm5fc3RkOgorICAgICAgICAgICAgc3Rkb3V0ID0gUElQRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgIGlmIHN0ZGVyciBpcyBOb25lOgorICAgICAgICBpZiByZXR1cm5fc3RkOgorICAgICAgICAgICAgc3RkZXJyID0gUElQRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICMgQ2FsbCBweWxpbnQgaW4gYSBzdWJwcm9jZXNzCisgICAgd2l0aCBQb3BlbigKKyAgICAgICAgY2xpLAorICAgICAgICBzaGVsbD1GYWxzZSwKKyAgICAgICAgc3Rkb3V0PXN0ZG91dCwKKyAgICAgICAgc3RkZXJyPXN0ZGVyciwKKyAgICAgICAgZW52PV9nZXRfZW52KCksCisgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICkgYXMgcHJvY2VzczoKKyAgICAgICAgcHJvY19zdGRvdXQsIHByb2Nfc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgICMgUmV0dXJuIHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IKKyAgICAgICAgaWYgcmV0dXJuX3N0ZDoKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdJTyhwcm9jX3N0ZG91dCksIFN0cmluZ0lPKHByb2Nfc3RkZXJyKQorICAgICAgICByZXR1cm4gTm9uZQorCisKK2RlZiBSdW4oKToKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6CisgICAgICAgIHByaW50KCJVc2FnZTogJXMgPGZpbGVuYW1lPiBbb3B0aW9uc10iICUgc3lzLmFyZ3ZbMF0pCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMoc3lzLmFyZ3ZbMV0pOgorICAgICAgICBwcmludCgiJXMgZG9lcyBub3QgZXhpc3QiICUgc3lzLmFyZ3ZbMV0pCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZWxzZToKKyAgICAgICAgc3lzLmV4aXQobGludChzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMjpdKSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIFJ1bigpCmRpZmYgLS1naXQgYS9weWxpbnQvZXhjZXB0aW9ucy5weSBiL3B5bGludC9leGNlcHRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTlmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXhjZXB0aW9ucy5weQpAQCAtMCwwICsxLDMyIEBACisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOSBUaG9tYXMgSGlzY2ggPHQuaGlzY2hAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiRXhjZXB0aW9uIGNsYXNzZXMgcmFpc2VkIGJ5IHZhcmlvdXMgb3BlcmF0aW9ucyB3aXRoaW4gcHlsaW50LiIiIgorCisKK2NsYXNzIEludmFsaWRNZXNzYWdlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJyYWlzZWQgd2hlbiBhIG1lc3NhZ2UgY3JlYXRpb24sIHJlZ2lzdHJhdGlvbiBvciBhZGRpdGlvbiBpcyByZWplY3RlZCIiIgorCisKK2NsYXNzIFVua25vd25NZXNzYWdlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJyYWlzZWQgd2hlbiBhbiB1bnJlZ2lzdGVyZWQgbWVzc2FnZSBpZCBpcyBlbmNvdW50ZXJlZCIiIgorCisKK2NsYXNzIEVtcHR5UmVwb3J0RXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJyYWlzZWQgd2hlbiBhIHJlcG9ydCBpcyBlbXB0eSBhbmQgc28gc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQiIiIKKworCitjbGFzcyBJbnZhbGlkUmVwb3J0ZXJFcnJvcihFeGNlcHRpb24pOgorICAgICIiInJhaXNlZCB3aGVuIHNlbGVjdGVkIHJlcG9ydGVyIGlzIGludmFsaWQgKGUuZy4gbm90IGZvdW5kKSIiIgorCisKK2NsYXNzIEludmFsaWRBcmdzRXJyb3IoVmFsdWVFcnJvcik6CisgICAgIiIicmFpc2VkIHdoZW4gcGFzc2VkIGFyZ3VtZW50cyBhcmUgaW52YWxpZCwgZS5nLiwgaGF2ZSB0aGUgd3JvbmcgbGVuZ3RoIiIiCmRpZmYgLS1naXQgYS9weWxpbnQvZXh0ZW5zaW9ucy9fX2luaXRfXy5weSBiL3B5bGludC9leHRlbnNpb25zL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvX2NoZWNrX2RvY3NfdXRpbHMucHkgYi9weWxpbnQvZXh0ZW5zaW9ucy9fY2hlY2tfZG9jc191dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc4NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2V4dGVuc2lvbnMvX2NoZWNrX2RvY3NfdXRpbHMucHkKQEAgLTAsMCArMSw4MTAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiBZdXJpIEJvY2hrYXJldiA8YmFsdGF6YXIuYnpAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IE1vaXNlcyBMb3BleiA8bW95bG9wMjYwQHZhdXhvby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNywgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBNaXRhciA8bWl0YXIuZ2l0aHViQHRub2RlLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LCAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTggSmltIFJvYmVydHNvbiA8anJvYmVydHNvbjk4YXR4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1pdGNoZWxsIFQuSC4gWW91bmcgPG1pdGNoZWxseUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBZHJpYW4gQ2hpcmllYWMgPGNoaXJpZWFjYW1AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBEYW5ueSBIZXJtZXMgPGRhbmllbC5qLmhlcm1lc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBaZWIgTmljaG9sbHMgPHplYmVkZWUubmljaG9sbHNAY2xpbWF0ZS1lbmVyZ3ktY29sbGVnZS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJVdGlsaXR5IG1ldGhvZHMgZm9yIGRvY3N0cmluZyBjaGVja2luZy4iIiIKKworaW1wb3J0IHJlCitmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMKKworCitkZWYgc3BhY2VfaW5kZW50YXRpb24ocyk6CisgICAgIiIiVGhlIG51bWJlciBvZiBsZWFkaW5nIHNwYWNlcyBpbiBhIHN0cmluZworCisgICAgOnBhcmFtIHN0ciBzOiBpbnB1dCBzdHJpbmcKKworICAgIDpydHlwZTogaW50CisgICAgOnJldHVybjogbnVtYmVyIG9mIGxlYWRpbmcgc3BhY2VzCisgICAgIiIiCisgICAgcmV0dXJuIGxlbihzKSAtIGxlbihzLmxzdHJpcCgiICIpKQorCisKK2RlZiBnZXRfc2V0dGVyc19wcm9wZXJ0eV9uYW1lKG5vZGUpOgorICAgICIiIkdldCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB0aGUgZ2l2ZW4gbm9kZSBpcyBhIHNldHRlciBmb3IuCisKKyAgICA6cGFyYW0gbm9kZTogVGhlIG5vZGUgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBuYW1lIGZvci4KKyAgICA6dHlwZSBub2RlOiBzdHIKKworICAgIDpydHlwZTogc3RyIG9yIE5vbmUKKyAgICA6cmV0dXJuczogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgdGhlIG5vZGUgaXMgYSBzZXR0ZXIgZm9yLAorICAgICAgICBvciBOb25lIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQuCisgICAgIiIiCisgICAgZGVjb3JhdG9ycyA9IG5vZGUuZGVjb3JhdG9ycy5ub2RlcyBpZiBub2RlLmRlY29yYXRvcnMgZWxzZSBbXQorICAgIGZvciBkZWNvcmF0b3IgaW4gZGVjb3JhdG9yczoKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShkZWNvcmF0b3IsIGFzdHJvaWQuQXR0cmlidXRlKQorICAgICAgICAgICAgYW5kIGRlY29yYXRvci5hdHRybmFtZSA9PSAic2V0dGVyIgorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UoZGVjb3JhdG9yLmV4cHIsIGFzdHJvaWQuTmFtZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3IuZXhwci5uYW1lCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgZ2V0X3NldHRlcnNfcHJvcGVydHkobm9kZSk6CisgICAgIiIiR2V0IHRoZSBwcm9wZXJ0eSBub2RlIGZvciB0aGUgZ2l2ZW4gc2V0dGVyIG5vZGUuCisKKyAgICA6cGFyYW0gbm9kZTogVGhlIG5vZGUgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBmb3IuCisgICAgOnR5cGUgbm9kZTogYXN0cm9pZC5GdW5jdGlvbkRlZgorCisgICAgOnJ0eXBlOiBhc3Ryb2lkLkZ1bmN0aW9uRGVmIG9yIE5vbmUKKyAgICA6cmV0dXJuczogVGhlIG5vZGUgcmVsYXRpbmcgdG8gdGhlIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBzZXR0ZXIgbm9kZSwKKyAgICAgICAgb3IgTm9uZSBpZiBvbmUgY291bGQgbm90IGJlIGZvdW5kLgorICAgICIiIgorICAgIHByb3BlcnR5XyA9IE5vbmUKKworICAgIHByb3BlcnR5X25hbWUgPSBnZXRfc2V0dGVyc19wcm9wZXJ0eV9uYW1lKG5vZGUpCisgICAgY2xhc3Nfbm9kZSA9IHV0aWxzLm5vZGVfZnJhbWVfY2xhc3Mobm9kZSkKKyAgICBpZiBwcm9wZXJ0eV9uYW1lIGFuZCBjbGFzc19ub2RlOgorICAgICAgICBjbGFzc19hdHRycyA9IGNsYXNzX25vZGUuZ2V0YXR0cihub2RlLm5hbWUpCisgICAgICAgIGZvciBhdHRyIGluIGNsYXNzX2F0dHJzOgorICAgICAgICAgICAgaWYgdXRpbHMuZGVjb3JhdGVkX3dpdGhfcHJvcGVydHkoYXR0cik6CisgICAgICAgICAgICAgICAgcHJvcGVydHlfID0gYXR0cgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gcHJvcGVydHlfCisKKworZGVmIHJldHVybnNfc29tZXRoaW5nKHJldHVybl9ub2RlKToKKyAgICAiIiJDaGVjayBpZiBhIHJldHVybiBub2RlIHJldHVybnMgYSB2YWx1ZSBvdGhlciB0aGFuIE5vbmUuCisKKyAgICA6cGFyYW0gcmV0dXJuX25vZGU6IFRoZSByZXR1cm4gbm9kZSB0byBjaGVjay4KKyAgICA6dHlwZSByZXR1cm5fbm9kZTogYXN0cm9pZC5SZXR1cm4KKworICAgIDpydHlwZTogYm9vbAorICAgIDpyZXR1cm46IFRydWUgaWYgdGhlIHJldHVybiBub2RlIHJldHVybnMgYSB2YWx1ZSBvdGhlciB0aGFuIE5vbmUsCisgICAgICAgIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICByZXR1cm5zID0gcmV0dXJuX25vZGUudmFsdWUKKworICAgIGlmIHJldHVybnMgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICByZXR1cm4gbm90IChpc2luc3RhbmNlKHJldHVybnMsIGFzdHJvaWQuQ29uc3QpIGFuZCByZXR1cm5zLnZhbHVlIGlzIE5vbmUpCisKKworZGVmIF9nZXRfcmFpc2VfdGFyZ2V0KG5vZGUpOgorICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5leGMsIGFzdHJvaWQuQ2FsbCk6CisgICAgICAgIGZ1bmMgPSBub2RlLmV4Yy5mdW5jCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZnVuYywgKGFzdHJvaWQuTmFtZSwgYXN0cm9pZC5BdHRyaWJ1dGUpKToKKyAgICAgICAgICAgIHJldHVybiB1dGlscy5zYWZlX2luZmVyKGZ1bmMpCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgX3NwbGl0X211bHRpcGxlX2V4Y190eXBlcyh0YXJnZXQ6IHN0cikgLT4gTGlzdFtzdHJdOgorICAgIGRlbGltaXRlcnMgPSByIihccyosKD86XHMqb3Jccyk/XHMqfFxzK29yXHMrKSIKKyAgICByZXR1cm4gcmUuc3BsaXQoZGVsaW1pdGVycywgdGFyZ2V0KQorCisKK2RlZiBwb3NzaWJsZV9leGNfdHlwZXMobm9kZSk6CisgICAgIiIiCisgICAgR2V0cyBhbGwgb2YgdGhlIHBvc3NpYmxlIHJhaXNlZCBleGNlcHRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiByYWlzZSBub2RlLgorCisgICAgLi4gbm90ZTo6CisKKyAgICAgICAgQ2F1Z2h0IGV4Y2VwdGlvbiB0eXBlcyBhcmUgaWdub3JlZC4KKworCisgICAgOnBhcmFtIG5vZGU6IFRoZSByYWlzZSBub2RlIHRvIGZpbmQgZXhjZXB0aW9uIHR5cGVzIGZvci4KKyAgICA6dHlwZSBub2RlOiBhc3Ryb2lkLm5vZGVfY2xhc3Nlcy5Ob2RlTkcKKworICAgIDpyZXR1cm5zOiBBIGxpc3Qgb2YgZXhjZXB0aW9uIHR5cGVzIHBvc3NpYmx5IHJhaXNlZCBieSA6cGFyYW06YG5vZGVgLgorICAgIDpydHlwZTogc2V0KHN0cikKKyAgICAiIiIKKyAgICBleGNzID0gW10KKyAgICBpZiBpc2luc3RhbmNlKG5vZGUuZXhjLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICBpbmZlcnJlZCA9IHV0aWxzLnNhZmVfaW5mZXIobm9kZS5leGMpCisgICAgICAgIGlmIGluZmVycmVkOgorICAgICAgICAgICAgZXhjcyA9IFtpbmZlcnJlZC5uYW1lXQorICAgIGVsaWYgbm9kZS5leGMgaXMgTm9uZToKKyAgICAgICAgaGFuZGxlciA9IG5vZGUucGFyZW50CisgICAgICAgIHdoaWxlIGhhbmRsZXIgYW5kIG5vdCBpc2luc3RhbmNlKGhhbmRsZXIsIGFzdHJvaWQuRXhjZXB0SGFuZGxlcik6CisgICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlci5wYXJlbnQKKworICAgICAgICBpZiBoYW5kbGVyIGFuZCBoYW5kbGVyLnR5cGU6CisgICAgICAgICAgICBpbmZlcnJlZF9leGNzID0gYXN0cm9pZC51bnBhY2tfaW5mZXIoaGFuZGxlci50eXBlKQorICAgICAgICAgICAgZXhjcyA9IChleGMubmFtZSBmb3IgZXhjIGluIGluZmVycmVkX2V4Y3MgaWYgZXhjIGlzIG5vdCBhc3Ryb2lkLlVuaW5mZXJhYmxlKQorICAgIGVsc2U6CisgICAgICAgIHRhcmdldCA9IF9nZXRfcmFpc2VfdGFyZ2V0KG5vZGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCBhc3Ryb2lkLkNsYXNzRGVmKToKKyAgICAgICAgICAgIGV4Y3MgPSBbdGFyZ2V0Lm5hbWVdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0YXJnZXQsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgZm9yIHJldCBpbiB0YXJnZXQubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5SZXR1cm4pOgorICAgICAgICAgICAgICAgIGlmIHJldC5mcmFtZSgpICE9IHRhcmdldDoKKyAgICAgICAgICAgICAgICAgICAgIyByZXR1cm4gZnJvbSBpbm5lciBmdW5jdGlvbiAtIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdmFsID0gdXRpbHMuc2FmZV9pbmZlcihyZXQudmFsdWUpCisgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICB2YWwKKyAgICAgICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2UodmFsLCAoYXN0cm9pZC5JbnN0YW5jZSwgYXN0cm9pZC5DbGFzc0RlZikpCisgICAgICAgICAgICAgICAgICAgIGFuZCB1dGlscy5pbmhlcml0X2Zyb21fc3RkX2V4KHZhbCkKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICBleGNzLmFwcGVuZCh2YWwubmFtZSkKKworICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHtleGMgZm9yIGV4YyBpbiBleGNzIGlmIG5vdCB1dGlscy5ub2RlX2lnbm9yZXNfZXhjZXB0aW9uKG5vZGUsIGV4Yyl9CisgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgIHJldHVybiBzZXQoKQorCisKK2RlZiBkb2NzdHJpbmdpZnkoZG9jc3RyaW5nLCBkZWZhdWx0X3R5cGU9ImRlZmF1bHQiKToKKyAgICBmb3IgZG9jc3RyaW5nX3R5cGUgaW4gKAorICAgICAgICBTcGhpbnhEb2NzdHJpbmcsCisgICAgICAgIEVweXRleHREb2NzdHJpbmcsCisgICAgICAgIEdvb2dsZURvY3N0cmluZywKKyAgICAgICAgTnVtcHlEb2NzdHJpbmcsCisgICAgKToKKyAgICAgICAgaW5zdGFuY2UgPSBkb2NzdHJpbmdfdHlwZShkb2NzdHJpbmcpCisgICAgICAgIGlmIGluc3RhbmNlLmlzX3ZhbGlkKCk6CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UKKworICAgIGRvY3N0cmluZ190eXBlID0gRE9DU1RSSU5HX1RZUEVTLmdldChkZWZhdWx0X3R5cGUsIERvY3N0cmluZykKKyAgICByZXR1cm4gZG9jc3RyaW5nX3R5cGUoZG9jc3RyaW5nKQorCisKK2NsYXNzIERvY3N0cmluZzoKKyAgICByZV9mb3JfcGFyYW1ldGVyc19zZWUgPSByZS5jb21waWxlKAorICAgICAgICByIiIiCisgICAgICAgIEZvclxzK3RoZVxzKyhvdGhlcik/XHMqcGFyYW1ldGVyc1xzKixccytzZWUKKyAgICAgICAgIiIiLAorICAgICAgICByZS5YIHwgcmUuUywKKyAgICApCisKKyAgICBzdXBwb3J0c195aWVsZHM6IGJvb2wgPSBGYWxzZQorICAgICIiIlRydWUgaWYgdGhlIGRvY3N0cmluZyBzdXBwb3J0cyBhICJ5aWVsZCIgc2VjdGlvbi4KKworICAgIEZhbHNlIGlmIHRoZSBkb2NzdHJpbmcgdXNlcyB0aGUgcmV0dXJucyBzZWN0aW9uIHRvIGRvY3VtZW50IGdlbmVyYXRvcnMuCisgICAgIiIiCisKKyAgICAjIFRoZXNlIG1ldGhvZHMgYXJlIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4KKyAgICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkb2MpOgorICAgICAgICBkb2MgPSBkb2Mgb3IgIiIKKyAgICAgICAgc2VsZi5kb2MgPSBkb2MuZXhwYW5kdGFicygpCisKKyAgICBkZWYgaXNfdmFsaWQoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGV4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZXQoKQorCisgICAgZGVmIGhhc19wYXJhbXMoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhc19yZXR1cm5zKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBoYXNfcnR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhc19wcm9wZXJ0eV9yZXR1cm5zKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBoYXNfcHJvcGVydHlfdHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaGFzX3lpZWxkcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaGFzX3lpZWxkc190eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBtYXRjaF9wYXJhbV9kb2NzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2V0KCksIHNldCgpCisKKyAgICBkZWYgcGFyYW1zX2RvY3VtZW50ZWRfZWxzZXdoZXJlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZV9mb3JfcGFyYW1ldGVyc19zZWUuc2VhcmNoKHNlbGYuZG9jKSBpcyBub3QgTm9uZQorCisKK2NsYXNzIFNwaGlueERvY3N0cmluZyhEb2NzdHJpbmcpOgorICAgIHJlX3R5cGUgPSByIiIiCisgICAgICAgIFt+IS5dPyAgICAgICAgICAgICAgICMgT3B0aW9uYWwgbGluayBzdHlsZSBwcmVmaXgKKyAgICAgICAgXHcoPzpcd3xcLlteXC5dKSogICAgIyBWYWxpZCBweXRob24gbmFtZQorICAgICAgICAiIiIKKworICAgIHJlX3NpbXBsZV9jb250YWluZXJfdHlwZSA9IHIiIiIKKyAgICAgICAge3R5cGV9ICAgICAgICAgICAgICAgICAgICAgICAgIyBhIGNvbnRhaW5lciB0eXBlCisgICAgICAgIFtcKFxbXSBbXlxuXHNdKyBbXClcXV0gICAgICAgICMgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lcgorICAgICIiIi5mb3JtYXQoCisgICAgICAgIHR5cGU9cmVfdHlwZQorICAgICkKKworICAgIHJlX211bHRpcGxlX3NpbXBsZV90eXBlID0gciIiIgorICAgICAgICAoPzp7Y29udGFpbmVyX3R5cGV9fHt0eXBlfSkKKyAgICAgICAgKD86KD86XHMrKD86b2Z8b3IpXHMrfFxzKixccyopKD86e2NvbnRhaW5lcl90eXBlfXx7dHlwZX0pKSoKKyAgICAiIiIuZm9ybWF0KAorICAgICAgICB0eXBlPXJlX3R5cGUsIGNvbnRhaW5lcl90eXBlPXJlX3NpbXBsZV9jb250YWluZXJfdHlwZQorICAgICkKKworICAgIHJlX3hyZWYgPSByIiIiCisgICAgICAgICg/Ojpcdys6KT8gICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgdGFnCisgICAgICAgIGB7fWAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGF0IHRvIHJlZmVyZW5jZQorICAgICAgICAiIiIuZm9ybWF0KAorICAgICAgICByZV90eXBlCisgICAgKQorCisgICAgcmVfcGFyYW1fcmF3ID0gciIiIgorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAjIGluaXRpYWwgY29sb24KKyAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgIyBTcGhpbngga2V5d29yZHMKKyAgICAgICAgcGFyYW18cGFyYW1ldGVyfAorICAgICAgICBhcmd8YXJndW1lbnR8CisgICAgICAgIGtleXxrZXl3b3JkCisgICAgICAgICkKKyAgICAgICAgXHMrICAgICAgICAgICAgICAgICAgICAgIyB3aGl0ZXNwYWNlCisKKyAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB0eXBlIGRlY2xhcmF0aW9uCisgICAgICAgICh7dHlwZX18e2NvbnRhaW5lcl90eXBlfSkKKyAgICAgICAgXHMrCisgICAgICAgICk/CisKKyAgICAgICAgKFx3KykgICAgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXIgbmFtZQorICAgICAgICBccyogICAgICAgICAgICAgICAgICAgICAjIHdoaXRlc3BhY2UKKyAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgIyBmaW5hbCBjb2xvbgorICAgICAgICAiIiIuZm9ybWF0KAorICAgICAgICB0eXBlPXJlX3R5cGUsIGNvbnRhaW5lcl90eXBlPXJlX3NpbXBsZV9jb250YWluZXJfdHlwZQorICAgICkKKyAgICByZV9wYXJhbV9pbl9kb2NzdHJpbmcgPSByZS5jb21waWxlKHJlX3BhcmFtX3JhdywgcmUuWCB8IHJlLlMpCisKKyAgICByZV90eXBlX3JhdyA9IHIiIiIKKyAgICAgICAgOnR5cGUgICAgICAgICAgICAgICAgICAgIyBTcGhpbngga2V5d29yZAorICAgICAgICBccysgICAgICAgICAgICAgICAgICAgICAjIHdoaXRlc3BhY2UKKyAgICAgICAgKHt0eXBlfSkgICAgICAgICAgICAgICAgIyBQYXJhbWV0ZXIgbmFtZQorICAgICAgICBccyogICAgICAgICAgICAgICAgICAgICAjIHdoaXRlc3BhY2UKKyAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgIyBmaW5hbCBjb2xvbgorICAgICAgICAiIiIuZm9ybWF0KAorICAgICAgICB0eXBlPXJlX211bHRpcGxlX3NpbXBsZV90eXBlCisgICAgKQorICAgIHJlX3R5cGVfaW5fZG9jc3RyaW5nID0gcmUuY29tcGlsZShyZV90eXBlX3JhdywgcmUuWCB8IHJlLlMpCisKKyAgICByZV9wcm9wZXJ0eV90eXBlX3JhdyA9IHIiIiIKKyAgICAgICAgOnR5cGU6ICAgICAgICAgICAgICAgICAgIyBTcGhpbngga2V5d29yZAorICAgICAgICBccysgICAgICAgICAgICAgICAgICAgICAjIHdoaXRlc3BhY2UKKyAgICAgICAge3R5cGV9ICAgICAgICAgICAgICAgICAgIyB0eXBlIGRlY2xhcmF0aW9uCisgICAgICAgICIiIi5mb3JtYXQoCisgICAgICAgIHR5cGU9cmVfbXVsdGlwbGVfc2ltcGxlX3R5cGUKKyAgICApCisgICAgcmVfcHJvcGVydHlfdHlwZV9pbl9kb2NzdHJpbmcgPSByZS5jb21waWxlKHJlX3Byb3BlcnR5X3R5cGVfcmF3LCByZS5YIHwgcmUuUykKKworICAgIHJlX3JhaXNlX3JhdyA9IHIiIiIKKyAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgIyBpbml0aWFsIGNvbG9uCisgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICMgU3BoaW54IGtleXdvcmQKKyAgICAgICAgcmFpc2VzP3wKKyAgICAgICAgZXhjZXB0fGV4Y2VwdGlvbgorICAgICAgICApCisgICAgICAgIFxzKyAgICAgICAgICAgICAgICAgICAgICMgd2hpdGVzcGFjZQorICAgICAgICAoe3R5cGV9KSAgICAgICAgICAgICAgICAjIGV4Y2VwdGlvbiB0eXBlCisgICAgICAgIFxzKiAgICAgICAgICAgICAgICAgICAgICMgd2hpdGVzcGFjZQorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAjIGZpbmFsIGNvbG9uCisgICAgICAgICIiIi5mb3JtYXQoCisgICAgICAgIHR5cGU9cmVfbXVsdGlwbGVfc2ltcGxlX3R5cGUKKyAgICApCisgICAgcmVfcmFpc2VfaW5fZG9jc3RyaW5nID0gcmUuY29tcGlsZShyZV9yYWlzZV9yYXcsIHJlLlggfCByZS5TKQorCisgICAgcmVfcnR5cGVfaW5fZG9jc3RyaW5nID0gcmUuY29tcGlsZShyIjpydHlwZToiKQorCisgICAgcmVfcmV0dXJuc19pbl9kb2NzdHJpbmcgPSByZS5jb21waWxlKHIiOnJldHVybnM/OiIpCisKKyAgICBzdXBwb3J0c195aWVsZHMgPSBGYWxzZQorCisgICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbCgKKyAgICAgICAgICAgIHNlbGYucmVfcGFyYW1faW5fZG9jc3RyaW5nLnNlYXJjaChzZWxmLmRvYykKKyAgICAgICAgICAgIG9yIHNlbGYucmVfcmFpc2VfaW5fZG9jc3RyaW5nLnNlYXJjaChzZWxmLmRvYykKKyAgICAgICAgICAgIG9yIHNlbGYucmVfcnR5cGVfaW5fZG9jc3RyaW5nLnNlYXJjaChzZWxmLmRvYykKKyAgICAgICAgICAgIG9yIHNlbGYucmVfcmV0dXJuc19pbl9kb2NzdHJpbmcuc2VhcmNoKHNlbGYuZG9jKQorICAgICAgICAgICAgb3Igc2VsZi5yZV9wcm9wZXJ0eV90eXBlX2luX2RvY3N0cmluZy5zZWFyY2goc2VsZi5kb2MpCisgICAgICAgICkKKworICAgIGRlZiBleGNlcHRpb25zKHNlbGYpOgorICAgICAgICB0eXBlcyA9IHNldCgpCisKKyAgICAgICAgZm9yIG1hdGNoIGluIHJlLmZpbmRpdGVyKHNlbGYucmVfcmFpc2VfaW5fZG9jc3RyaW5nLCBzZWxmLmRvYyk6CisgICAgICAgICAgICByYWlzZV90eXBlID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIHR5cGVzLnVwZGF0ZShfc3BsaXRfbXVsdGlwbGVfZXhjX3R5cGVzKHJhaXNlX3R5cGUpKQorCisgICAgICAgIHJldHVybiB0eXBlcworCisgICAgZGVmIGhhc19wYXJhbXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvYzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBzZWxmLnJlX3BhcmFtX2luX2RvY3N0cmluZy5zZWFyY2goc2VsZi5kb2MpIGlzIG5vdCBOb25lCisKKyAgICBkZWYgaGFzX3JldHVybnMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvYzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBib29sKHNlbGYucmVfcmV0dXJuc19pbl9kb2NzdHJpbmcuc2VhcmNoKHNlbGYuZG9jKSkKKworICAgIGRlZiBoYXNfcnR5cGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvYzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBib29sKHNlbGYucmVfcnR5cGVfaW5fZG9jc3RyaW5nLnNlYXJjaChzZWxmLmRvYykpCisKKyAgICBkZWYgaGFzX3Byb3BlcnR5X3JldHVybnMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvYzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgVGhlIHN1bW1hcnkgbGluZSBpcyB0aGUgcmV0dXJuIGRvYywKKyAgICAgICAgIyBzbyB0aGUgZmlyc3QgbGluZSBtdXN0IG5vdCBiZSBhIGtub3duIGRpcmVjdGl2ZS4KKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmRvYy5sc3RyaXAoKS5zdGFydHN3aXRoKCI6IikKKworICAgIGRlZiBoYXNfcHJvcGVydHlfdHlwZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZG9jOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5yZV9wcm9wZXJ0eV90eXBlX2luX2RvY3N0cmluZy5zZWFyY2goc2VsZi5kb2MpKQorCisgICAgZGVmIG1hdGNoX3BhcmFtX2RvY3Moc2VsZik6CisgICAgICAgIHBhcmFtc193aXRoX2RvYyA9IHNldCgpCisgICAgICAgIHBhcmFtc193aXRoX3R5cGUgPSBzZXQoKQorCisgICAgICAgIGZvciBtYXRjaCBpbiByZS5maW5kaXRlcihzZWxmLnJlX3BhcmFtX2luX2RvY3N0cmluZywgc2VsZi5kb2MpOgorICAgICAgICAgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBwYXJhbXNfd2l0aF9kb2MuYWRkKG5hbWUpCisgICAgICAgICAgICBwYXJhbV90eXBlID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIHBhcmFtX3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcGFyYW1zX3dpdGhfdHlwZS5hZGQobmFtZSkKKworICAgICAgICBwYXJhbXNfd2l0aF90eXBlLnVwZGF0ZShyZS5maW5kYWxsKHNlbGYucmVfdHlwZV9pbl9kb2NzdHJpbmcsIHNlbGYuZG9jKSkKKyAgICAgICAgcmV0dXJuIHBhcmFtc193aXRoX2RvYywgcGFyYW1zX3dpdGhfdHlwZQorCisKK2NsYXNzIEVweXRleHREb2NzdHJpbmcoU3BoaW54RG9jc3RyaW5nKToKKyAgICAiIiIKKyAgICBFcHl0ZXh0IGlzIHNpbWlsYXIgdG8gU3BoaW54LiBTZWUgdGhlIGRvY3M6CisgICAgICAgIGh0dHA6Ly9lcHlkb2Muc291cmNlZm9yZ2UubmV0L2VweXRleHQuaHRtbAorICAgICAgICBodHRwOi8vZXB5ZG9jLnNvdXJjZWZvcmdlLm5ldC9maWVsZHMuaHRtbCNmaWVsZHMKKworICAgIEl0J3MgdXNlZCBpbiBQeUNoYXJtOgorICAgICAgICBodHRwczovL3d3dy5qZXRicmFpbnMuY29tL2hlbHAvcHljaGFybS8yMDE2LjEvY3JlYXRpbmctZG9jdW1lbnRhdGlvbi1jb21tZW50cy5odG1sI2Q4NDgyMDNlMzE0CisgICAgICAgIGh0dHBzOi8vd3d3LmpldGJyYWlucy5jb20vaGVscC9weWNoYXJtLzIwMTYuMS91c2luZy1kb2NzdHJpbmdzLXRvLXNwZWNpZnktdHlwZXMuaHRtbAorICAgICIiIgorCisgICAgcmVfcGFyYW1faW5fZG9jc3RyaW5nID0gcmUuY29tcGlsZSgKKyAgICAgICAgU3BoaW54RG9jc3RyaW5nLnJlX3BhcmFtX3Jhdy5yZXBsYWNlKCI6IiwgIkAiLCAxKSwgcmUuWCB8IHJlLlMKKyAgICApCisKKyAgICByZV90eXBlX2luX2RvY3N0cmluZyA9IHJlLmNvbXBpbGUoCisgICAgICAgIFNwaGlueERvY3N0cmluZy5yZV90eXBlX3Jhdy5yZXBsYWNlKCI6IiwgIkAiLCAxKSwgcmUuWCB8IHJlLlMKKyAgICApCisKKyAgICByZV9wcm9wZXJ0eV90eXBlX2luX2RvY3N0cmluZyA9IHJlLmNvbXBpbGUoCisgICAgICAgIFNwaGlueERvY3N0cmluZy5yZV9wcm9wZXJ0eV90eXBlX3Jhdy5yZXBsYWNlKCI6IiwgIkAiLCAxKSwgcmUuWCB8IHJlLlMKKyAgICApCisKKyAgICByZV9yYWlzZV9pbl9kb2NzdHJpbmcgPSByZS5jb21waWxlKAorICAgICAgICBTcGhpbnhEb2NzdHJpbmcucmVfcmFpc2VfcmF3LnJlcGxhY2UoIjoiLCAiQCIsIDEpLCByZS5YIHwgcmUuUworICAgICkKKworICAgIHJlX3J0eXBlX2luX2RvY3N0cmluZyA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiIiIKKyAgICAgICAgQCAgICAgICAgICAgICAgICAgICAgICAgIyBpbml0aWFsICJhdCIgc3ltYm9sCisgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICMgRXB5dGV4dCBrZXl3b3JkCisgICAgICAgIHJ0eXBlfHJldHVybnR5cGUKKyAgICAgICAgKQorICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAjIGZpbmFsIGNvbG9uCisgICAgICAgICIiIiwKKyAgICAgICAgcmUuWCB8IHJlLlMsCisgICAgKQorCisgICAgcmVfcmV0dXJuc19pbl9kb2NzdHJpbmcgPSByZS5jb21waWxlKHIiQHJldHVybnM/OiIpCisKKyAgICBkZWYgaGFzX3Byb3BlcnR5X3JldHVybnMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvYzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgSWYgdGhpcyBpcyBhIHByb3BlcnR5IGRvY3N0cmluZywgdGhlIHN1bW1hcnkgaXMgdGhlIHJldHVybiBkb2MuCisgICAgICAgIGlmIHNlbGYuaGFzX3Byb3BlcnR5X3R5cGUoKToKKyAgICAgICAgICAgICMgVGhlIHN1bW1hcnkgbGluZSBpcyB0aGUgcmV0dXJuIGRvYywKKyAgICAgICAgICAgICMgc28gdGhlIGZpcnN0IGxpbmUgbXVzdCBub3QgYmUgYSBrbm93biBkaXJlY3RpdmUuCisgICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuZG9jLmxzdHJpcCgpLnN0YXJ0c3dpdGgoIkAiKQorCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIEdvb2dsZURvY3N0cmluZyhEb2NzdHJpbmcpOgorICAgIHJlX3R5cGUgPSBTcGhpbnhEb2NzdHJpbmcucmVfdHlwZQorCisgICAgcmVfeHJlZiA9IFNwaGlueERvY3N0cmluZy5yZV94cmVmCisKKyAgICByZV9jb250YWluZXJfdHlwZSA9IHIiIiIKKyAgICAgICAgKD86e3R5cGV9fHt4cmVmfSkgICAgICAgICAgICAgIyBhIGNvbnRhaW5lciB0eXBlCisgICAgICAgIFtcKFxbXSBbXlxuXSsgW1wpXF1dICAgICAgICAgICMgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lcgorICAgICIiIi5mb3JtYXQoCisgICAgICAgIHR5cGU9cmVfdHlwZSwgeHJlZj1yZV94cmVmCisgICAgKQorCisgICAgcmVfbXVsdGlwbGVfdHlwZSA9IHIiIiIKKyAgICAgICAgKD86e2NvbnRhaW5lcl90eXBlfXx7dHlwZX18e3hyZWZ9KQorICAgICAgICAoPzooPzpccysoPzpvZnxvcilccyt8XHMqLFxzKikoPzp7Y29udGFpbmVyX3R5cGV9fHt0eXBlfXx7eHJlZn0pKSoKKyAgICAiIiIuZm9ybWF0KAorICAgICAgICB0eXBlPXJlX3R5cGUsIHhyZWY9cmVfeHJlZiwgY29udGFpbmVyX3R5cGU9cmVfY29udGFpbmVyX3R5cGUKKyAgICApCisKKyAgICBfcmVfc2VjdGlvbl90ZW1wbGF0ZSA9IHIiIiIKKyAgICAgICAgXihbIF0qKSAgIHswfSBccyo6ICAgXHMqJCAgICAgIyBHb29nbGUgcGFyYW1ldGVyIGhlYWRlcgorICAgICAgICAoICAuKiApICAgICAgICAgICAgICAgICAgICAgICAjIHNlY3Rpb24KKyAgICAgICAgIiIiCisKKyAgICByZV9wYXJhbV9zZWN0aW9uID0gcmUuY29tcGlsZSgKKyAgICAgICAgX3JlX3NlY3Rpb25fdGVtcGxhdGUuZm9ybWF0KHIiKD86QXJnc3xBcmd1bWVudHN8UGFyYW1ldGVycykiKSwKKyAgICAgICAgcmUuWCB8IHJlLlMgfCByZS5NLAorICAgICkKKworICAgIHJlX2tleXdvcmRfcGFyYW1fc2VjdGlvbiA9IHJlLmNvbXBpbGUoCisgICAgICAgIF9yZV9zZWN0aW9uX3RlbXBsYXRlLmZvcm1hdChyIktleXdvcmRccyg/OkFyZ3N8QXJndW1lbnRzfFBhcmFtZXRlcnMpIiksCisgICAgICAgIHJlLlggfCByZS5TIHwgcmUuTSwKKyAgICApCisKKyAgICByZV9wYXJhbV9saW5lID0gcmUuY29tcGlsZSgKKyAgICAgICAgciIiIgorICAgICAgICBccyogIFwqe3swLDJ9fShcdyspICAgICAgICAgICAgICMgaWRlbnRpZmllciBwb3RlbnRpYWxseSB3aXRoIGFzdGVyaXNrcworICAgICAgICBccyogICggWyhdCisgICAgICAgICAgICB7dHlwZX0KKyAgICAgICAgICAgICg/OixccytvcHRpb25hbCk/CisgICAgICAgICAgICBbKV0gKT8gXHMqIDogICAgICAgICAgICAgICAgIyBvcHRpb25hbCB0eXBlIGRlY2xhcmF0aW9uCisgICAgICAgIFxzKiAgKC4qKSAgICAgICAgICAgICAgICAgICAgICAgIyBiZWdpbm5pbmcgb2Ygb3B0aW9uYWwgZGVzY3JpcHRpb24KKyAgICAiIiIuZm9ybWF0KAorICAgICAgICAgICAgdHlwZT1yZV9tdWx0aXBsZV90eXBlCisgICAgICAgICksCisgICAgICAgIHJlLlggfCByZS5TIHwgcmUuTSwKKyAgICApCisKKyAgICByZV9yYWlzZV9zZWN0aW9uID0gcmUuY29tcGlsZSgKKyAgICAgICAgX3JlX3NlY3Rpb25fdGVtcGxhdGUuZm9ybWF0KHIiUmFpc2VzIiksIHJlLlggfCByZS5TIHwgcmUuTQorICAgICkKKworICAgIHJlX3JhaXNlX2xpbmUgPSByZS5jb21waWxlKAorICAgICAgICByIiIiCisgICAgICAgIFxzKiAgKHt0eXBlfSkgXHMqIDogICAgICAgICAgICAgICMgaWRlbnRpZmllcgorICAgICAgICBccyogICguKikgICAgICAgICAgICAgICAgICAgICAgICAjIGJlZ2lubmluZyBvZiBvcHRpb25hbCBkZXNjcmlwdGlvbgorICAgICIiIi5mb3JtYXQoCisgICAgICAgICAgICB0eXBlPXJlX211bHRpcGxlX3R5cGUKKyAgICAgICAgKSwKKyAgICAgICAgcmUuWCB8IHJlLlMgfCByZS5NLAorICAgICkKKworICAgIHJlX3JldHVybnNfc2VjdGlvbiA9IHJlLmNvbXBpbGUoCisgICAgICAgIF9yZV9zZWN0aW9uX3RlbXBsYXRlLmZvcm1hdChyIlJldHVybnM/IiksIHJlLlggfCByZS5TIHwgcmUuTQorICAgICkKKworICAgIHJlX3JldHVybnNfbGluZSA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiIiIKKyAgICAgICAgXHMqICh7dHlwZX06KT8gICAgICAgICAgICAgICAgICAgICMgaWRlbnRpZmllcgorICAgICAgICBccyogKC4qKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWdpbm5pbmcgb2YgZGVzY3JpcHRpb24KKyAgICAiIiIuZm9ybWF0KAorICAgICAgICAgICAgdHlwZT1yZV9tdWx0aXBsZV90eXBlCisgICAgICAgICksCisgICAgICAgIHJlLlggfCByZS5TIHwgcmUuTSwKKyAgICApCisKKyAgICByZV9wcm9wZXJ0eV9yZXR1cm5zX2xpbmUgPSByZS5jb21waWxlKAorICAgICAgICByIiIiCisgICAgICAgIF57dHlwZX06ICAgICAgICAgICAgICAgICAgICAgICAjIGluZGVudGlmaWVyCisgICAgICAgIFxzKiAoLiopICAgICAgICAgICAgICAgICAgICAgICAjIFN1bW1hcnkgbGluZSAvIGRlc2NyaXB0aW9uCisgICAgIiIiLmZvcm1hdCgKKyAgICAgICAgICAgIHR5cGU9cmVfbXVsdGlwbGVfdHlwZQorICAgICAgICApLAorICAgICAgICByZS5YIHwgcmUuUyB8IHJlLk0sCisgICAgKQorCisgICAgcmVfeWllbGRzX3NlY3Rpb24gPSByZS5jb21waWxlKAorICAgICAgICBfcmVfc2VjdGlvbl90ZW1wbGF0ZS5mb3JtYXQociJZaWVsZHM/IiksIHJlLlggfCByZS5TIHwgcmUuTQorICAgICkKKworICAgIHJlX3lpZWxkc19saW5lID0gcmVfcmV0dXJuc19saW5lCisKKyAgICBzdXBwb3J0c195aWVsZHMgPSBUcnVlCisKKyAgICBkZWYgaXNfdmFsaWQoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKAorICAgICAgICAgICAgc2VsZi5yZV9wYXJhbV9zZWN0aW9uLnNlYXJjaChzZWxmLmRvYykKKyAgICAgICAgICAgIG9yIHNlbGYucmVfcmFpc2Vfc2VjdGlvbi5zZWFyY2goc2VsZi5kb2MpCisgICAgICAgICAgICBvciBzZWxmLnJlX3JldHVybnNfc2VjdGlvbi5zZWFyY2goc2VsZi5kb2MpCisgICAgICAgICAgICBvciBzZWxmLnJlX3lpZWxkc19zZWN0aW9uLnNlYXJjaChzZWxmLmRvYykKKyAgICAgICAgICAgIG9yIHNlbGYucmVfcHJvcGVydHlfcmV0dXJuc19saW5lLnNlYXJjaChzZWxmLl9maXJzdF9saW5lKCkpCisgICAgICAgICkKKworICAgIGRlZiBoYXNfcGFyYW1zKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5kb2M6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICByZXR1cm4gc2VsZi5yZV9wYXJhbV9zZWN0aW9uLnNlYXJjaChzZWxmLmRvYykgaXMgbm90IE5vbmUKKworICAgIGRlZiBoYXNfcmV0dXJucyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZG9jOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZW50cmllcyA9IHNlbGYuX3BhcnNlX3NlY3Rpb24oc2VsZi5yZV9yZXR1cm5zX3NlY3Rpb24pCisgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLnJlX3JldHVybnNfbGluZS5tYXRjaChlbnRyeSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICByZXR1cm5fZGVzYyA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBpZiByZXR1cm5fZGVzYzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhc19ydHlwZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZG9jOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZW50cmllcyA9IHNlbGYuX3BhcnNlX3NlY3Rpb24oc2VsZi5yZV9yZXR1cm5zX3NlY3Rpb24pCisgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLnJlX3JldHVybnNfbGluZS5tYXRjaChlbnRyeSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICByZXR1cm5fdHlwZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgICAgICBpZiByZXR1cm5fdHlwZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhc19wcm9wZXJ0eV9yZXR1cm5zKHNlbGYpOgorICAgICAgICAjIFRoZSBzdW1tYXJ5IGxpbmUgaXMgdGhlIHJldHVybiBkb2MsCisgICAgICAgICMgc28gdGhlIGZpcnN0IGxpbmUgbXVzdCBub3QgYmUgYSBrbm93biBkaXJlY3RpdmUuCisgICAgICAgIGZpcnN0X2xpbmUgPSBzZWxmLl9maXJzdF9saW5lKCkKKyAgICAgICAgcmV0dXJuIG5vdCBib29sKAorICAgICAgICAgICAgc2VsZi5yZV9wYXJhbV9zZWN0aW9uLnNlYXJjaChmaXJzdF9saW5lKQorICAgICAgICAgICAgb3Igc2VsZi5yZV9yYWlzZV9zZWN0aW9uLnNlYXJjaChmaXJzdF9saW5lKQorICAgICAgICAgICAgb3Igc2VsZi5yZV9yZXR1cm5zX3NlY3Rpb24uc2VhcmNoKGZpcnN0X2xpbmUpCisgICAgICAgICAgICBvciBzZWxmLnJlX3lpZWxkc19zZWN0aW9uLnNlYXJjaChmaXJzdF9saW5lKQorICAgICAgICApCisKKyAgICBkZWYgaGFzX3Byb3BlcnR5X3R5cGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvYzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBib29sKHNlbGYucmVfcHJvcGVydHlfcmV0dXJuc19saW5lLm1hdGNoKHNlbGYuX2ZpcnN0X2xpbmUoKSkpCisKKyAgICBkZWYgaGFzX3lpZWxkcyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZG9jOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZW50cmllcyA9IHNlbGYuX3BhcnNlX3NlY3Rpb24oc2VsZi5yZV95aWVsZHNfc2VjdGlvbikKKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICBtYXRjaCA9IHNlbGYucmVfeWllbGRzX2xpbmUubWF0Y2goZW50cnkpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgeWllbGRfZGVzYyA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBpZiB5aWVsZF9kZXNjOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaGFzX3lpZWxkc190eXBlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5kb2M6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBlbnRyaWVzID0gc2VsZi5fcGFyc2Vfc2VjdGlvbihzZWxmLnJlX3lpZWxkc19zZWN0aW9uKQorICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgIG1hdGNoID0gc2VsZi5yZV95aWVsZHNfbGluZS5tYXRjaChlbnRyeSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB5aWVsZF90eXBlID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIHlpZWxkX3R5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBleGNlcHRpb25zKHNlbGYpOgorICAgICAgICB0eXBlcyA9IHNldCgpCisKKyAgICAgICAgZW50cmllcyA9IHNlbGYuX3BhcnNlX3NlY3Rpb24oc2VsZi5yZV9yYWlzZV9zZWN0aW9uKQorICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgIG1hdGNoID0gc2VsZi5yZV9yYWlzZV9saW5lLm1hdGNoKGVudHJ5KQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGV4Y190eXBlID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIGV4Y19kZXNjID0gbWF0Y2guZ3JvdXAoMikKKyAgICAgICAgICAgIGlmIGV4Y19kZXNjOgorICAgICAgICAgICAgICAgIHR5cGVzLnVwZGF0ZShfc3BsaXRfbXVsdGlwbGVfZXhjX3R5cGVzKGV4Y190eXBlKSkKKworICAgICAgICByZXR1cm4gdHlwZXMKKworICAgIGRlZiBtYXRjaF9wYXJhbV9kb2NzKHNlbGYpOgorICAgICAgICBwYXJhbXNfd2l0aF9kb2MgPSBzZXQoKQorICAgICAgICBwYXJhbXNfd2l0aF90eXBlID0gc2V0KCkKKworICAgICAgICBlbnRyaWVzID0gc2VsZi5fcGFyc2Vfc2VjdGlvbihzZWxmLnJlX3BhcmFtX3NlY3Rpb24pCisgICAgICAgIGVudHJpZXMuZXh0ZW5kKHNlbGYuX3BhcnNlX3NlY3Rpb24oc2VsZi5yZV9rZXl3b3JkX3BhcmFtX3NlY3Rpb24pKQorICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgIG1hdGNoID0gc2VsZi5yZV9wYXJhbV9saW5lLm1hdGNoKGVudHJ5KQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHBhcmFtX25hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgcGFyYW1fdHlwZSA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgICAgICBwYXJhbV9kZXNjID0gbWF0Y2guZ3JvdXAoMykKKyAgICAgICAgICAgIGlmIHBhcmFtX3R5cGU6CisgICAgICAgICAgICAgICAgcGFyYW1zX3dpdGhfdHlwZS5hZGQocGFyYW1fbmFtZSkKKworICAgICAgICAgICAgaWYgcGFyYW1fZGVzYzoKKyAgICAgICAgICAgICAgICBwYXJhbXNfd2l0aF9kb2MuYWRkKHBhcmFtX25hbWUpCisKKyAgICAgICAgcmV0dXJuIHBhcmFtc193aXRoX2RvYywgcGFyYW1zX3dpdGhfdHlwZQorCisgICAgZGVmIF9maXJzdF9saW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kb2MubHN0cmlwKCkuc3BsaXQoIlxuIiwgMSlbMF0KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbWluX3NlY3Rpb25faW5kZW50KHNlY3Rpb25fbWF0Y2gpOgorICAgICAgICByZXR1cm4gbGVuKHNlY3Rpb25fbWF0Y2guZ3JvdXAoMSkpICsgMQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfc2VjdGlvbl9oZWFkZXIoXyk6CisgICAgICAgICMgR29vZ2xlIHBhcnNpbmcgZG9lcyBub3QgbmVlZCB0byBkZXRlY3Qgc2VjdGlvbiBoZWFkZXJzLAorICAgICAgICAjIGJlY2F1c2UgaXQgd29ya3Mgb2ZmIG9mIGluZGVudGF0aW9uIGxldmVsIG9ubHkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX3BhcnNlX3NlY3Rpb24oc2VsZiwgc2VjdGlvbl9yZSk6CisgICAgICAgIHNlY3Rpb25fbWF0Y2ggPSBzZWN0aW9uX3JlLnNlYXJjaChzZWxmLmRvYykKKyAgICAgICAgaWYgc2VjdGlvbl9tYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgbWluX2luZGVudGF0aW9uID0gc2VsZi5taW5fc2VjdGlvbl9pbmRlbnQoc2VjdGlvbl9tYXRjaCkKKworICAgICAgICBlbnRyaWVzID0gW10KKyAgICAgICAgZW50cnkgPSBbXQorICAgICAgICBpc19maXJzdCA9IFRydWUKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VjdGlvbl9tYXRjaC5ncm91cCgyKS5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICBpZiBub3QgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpbmRlbnRhdGlvbiA9IHNwYWNlX2luZGVudGF0aW9uKGxpbmUpCisgICAgICAgICAgICBpZiBpbmRlbnRhdGlvbiA8IG1pbl9pbmRlbnRhdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIFRoZSBmaXJzdCBsaW5lIGFmdGVyIHRoZSBoZWFkZXIgZGVmaW5lcyB0aGUgbWluaW11bQorICAgICAgICAgICAgIyBpbmRlbnRhdGlvbi4KKyAgICAgICAgICAgIGlmIGlzX2ZpcnN0OgorICAgICAgICAgICAgICAgIG1pbl9pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uCisgICAgICAgICAgICAgICAgaXNfZmlyc3QgPSBGYWxzZQorCisgICAgICAgICAgICBpZiBpbmRlbnRhdGlvbiA9PSBtaW5faW5kZW50YXRpb246CisgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfc2VjdGlvbl9oZWFkZXIobGluZSk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgIyBMaW5lcyB3aXRoIG1pbmltdW0gaW5kZW50YXRpb24gbXVzdCBjb250YWluIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgICAjIG9mIGEgbmV3IHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLgorICAgICAgICAgICAgICAgIGlmIGVudHJ5OgorICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZCgiXG4iLmpvaW4oZW50cnkpKQorICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IFtdCisKKyAgICAgICAgICAgIGVudHJ5LmFwcGVuZChsaW5lKQorCisgICAgICAgIGlmIGVudHJ5OgorICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoIlxuIi5qb2luKGVudHJ5KSkKKworICAgICAgICByZXR1cm4gZW50cmllcworCisKK2NsYXNzIE51bXB5RG9jc3RyaW5nKEdvb2dsZURvY3N0cmluZyk6CisgICAgX3JlX3NlY3Rpb25fdGVtcGxhdGUgPSByIiIiCisgICAgICAgIF4oWyBdKikgICB7MH0gICBccyo/JCAgICAgICAgICAjIE51bXB5IHBhcmFtZXRlcnMgaGVhZGVyCisgICAgICAgIFxzKiAgICAgWy09XSsgICBccyo/JCAgICAgICAgICAjIHVuZGVybGluZQorICAgICAgICAoICAuKiApICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWN0aW9uCisgICAgIiIiCisKKyAgICByZV9wYXJhbV9zZWN0aW9uID0gcmUuY29tcGlsZSgKKyAgICAgICAgX3JlX3NlY3Rpb25fdGVtcGxhdGUuZm9ybWF0KHIiKD86QXJnc3xBcmd1bWVudHN8UGFyYW1ldGVycykiKSwKKyAgICAgICAgcmUuWCB8IHJlLlMgfCByZS5NLAorICAgICkKKworICAgIHJlX3BhcmFtX2xpbmUgPSByZS5jb21waWxlKAorICAgICAgICByIiIiCisgICAgICAgIFxzKiAgKFx3KykgICAgICAgICAgICAgICAgICAgICAgIyBpZGVudGlmaWVyCisgICAgICAgIFxzKiAgOgorICAgICAgICBccyogICg/Oih7dHlwZX0pKD86LFxzK29wdGlvbmFsKT8pPyAjIG9wdGlvbmFsIHR5cGUgZGVjbGFyYXRpb24KKyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlc2NyaXB0aW9uIHN0YXJ0cyBvbiBhIG5ldyBsaW5lCisgICAgICAgIFxzKiAoLiopICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXNjcmlwdGlvbgorICAgICIiIi5mb3JtYXQoCisgICAgICAgICAgICB0eXBlPUdvb2dsZURvY3N0cmluZy5yZV9tdWx0aXBsZV90eXBlCisgICAgICAgICksCisgICAgICAgIHJlLlggfCByZS5TLAorICAgICkKKworICAgIHJlX3JhaXNlX3NlY3Rpb24gPSByZS5jb21waWxlKAorICAgICAgICBfcmVfc2VjdGlvbl90ZW1wbGF0ZS5mb3JtYXQociJSYWlzZXMiKSwgcmUuWCB8IHJlLlMgfCByZS5NCisgICAgKQorCisgICAgcmVfcmFpc2VfbGluZSA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiIiIKKyAgICAgICAgXHMqICh7dHlwZX0pJCAgICMgdHlwZSBkZWNsYXJhdGlvbgorICAgICAgICBccyogKC4qKSAgICAgICAgIyBvcHRpb25hbCBkZXNjcmlwdGlvbgorICAgICIiIi5mb3JtYXQoCisgICAgICAgICAgICB0eXBlPUdvb2dsZURvY3N0cmluZy5yZV90eXBlCisgICAgICAgICksCisgICAgICAgIHJlLlggfCByZS5TIHwgcmUuTSwKKyAgICApCisKKyAgICByZV9yZXR1cm5zX3NlY3Rpb24gPSByZS5jb21waWxlKAorICAgICAgICBfcmVfc2VjdGlvbl90ZW1wbGF0ZS5mb3JtYXQociJSZXR1cm5zPyIpLCByZS5YIHwgcmUuUyB8IHJlLk0KKyAgICApCisKKyAgICByZV9yZXR1cm5zX2xpbmUgPSByZS5jb21waWxlKAorICAgICAgICByIiIiCisgICAgICAgIFxzKiAoPzpcdytccys6XHMrKT8gIyBvcHRpb25hbCBuYW1lCisgICAgICAgICh7dHlwZX0pJCAgICAgICAgICAgICAgICAgICAgICAgICAjIHR5cGUgZGVjbGFyYXRpb24KKyAgICAgICAgXHMqICguKikgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgZGVzY3JpcHRpb24KKyAgICAiIiIuZm9ybWF0KAorICAgICAgICAgICAgdHlwZT1Hb29nbGVEb2NzdHJpbmcucmVfbXVsdGlwbGVfdHlwZQorICAgICAgICApLAorICAgICAgICByZS5YIHwgcmUuUyB8IHJlLk0sCisgICAgKQorCisgICAgcmVfeWllbGRzX3NlY3Rpb24gPSByZS5jb21waWxlKAorICAgICAgICBfcmVfc2VjdGlvbl90ZW1wbGF0ZS5mb3JtYXQociJZaWVsZHM/IiksIHJlLlggfCByZS5TIHwgcmUuTQorICAgICkKKworICAgIHJlX3lpZWxkc19saW5lID0gcmVfcmV0dXJuc19saW5lCisKKyAgICBzdXBwb3J0c195aWVsZHMgPSBUcnVlCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG1pbl9zZWN0aW9uX2luZGVudChzZWN0aW9uX21hdGNoKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWN0aW9uX21hdGNoLmdyb3VwKDEpKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaXNfc2VjdGlvbl9oZWFkZXIobGluZSk6CisgICAgICAgIHJldHVybiBib29sKHJlLm1hdGNoKHIiXHMqLSskIiwgbGluZSkpCisKKworRE9DU1RSSU5HX1RZUEVTID0geworICAgICJzcGhpbngiOiBTcGhpbnhEb2NzdHJpbmcsCisgICAgImVweXRleHQiOiBFcHl0ZXh0RG9jc3RyaW5nLAorICAgICJnb29nbGUiOiBHb29nbGVEb2NzdHJpbmcsCisgICAgIm51bXB5IjogTnVtcHlEb2NzdHJpbmcsCisgICAgImRlZmF1bHQiOiBEb2NzdHJpbmcsCit9CisiIiJBIG1hcCBvZiB0aGUgbmFtZSBvZiB0aGUgZG9jc3RyaW5nIHR5cGUgdG8gaXRzIGNsYXNzLgorCis6dHlwZTogZGljdChzdHIsIHR5cGUpCisiIiIKZGlmZiAtLWdpdCBhL3B5bGludC9leHRlbnNpb25zL2JhZF9idWlsdGluLnB5IGIvcHlsaW50L2V4dGVuc2lvbnMvYmFkX2J1aWx0aW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyMDkwMQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL2JhZF9idWlsdGluLnB5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIFBldGVyIEtvbGJ1cyA8cGV0ZXIua29sYnVzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJDaGVja2VyIGZvciBkZXByZWNhdGVkIGJ1aWx0aW5zLiIiIgoraW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElBc3Ryb2lkQ2hlY2tlcgorCitCQURfRlVOQ1RJT05TID0gWyJtYXAiLCAiZmlsdGVyIl0KKyMgU29tZSBoaW50cyByZWdhcmRpbmcgdGhlIHVzZSBvZiBiYWQgYnVpbHRpbnMuCitCVUlMVElOX0hJTlRTID0geyJtYXAiOiAiVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb24gY2FuIGJlIGNsZWFyZXIuIn0KK0JVSUxUSU5fSElOVFNbImZpbHRlciJdID0gQlVJTFRJTl9ISU5UU1sibWFwIl0KKworCitjbGFzcyBCYWRCdWlsdGluQ2hlY2tlcihCYXNlQ2hlY2tlcik6CisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChJQXN0cm9pZENoZWNrZXIsKQorICAgIG5hbWUgPSAiZGVwcmVjYXRlZF9idWlsdGlucyIKKyAgICBtc2dzID0geworICAgICAgICAiVzAxNDEiOiAoCisgICAgICAgICAgICAiVXNlZCBidWlsdGluIGZ1bmN0aW9uICVzIiwKKyAgICAgICAgICAgICJiYWQtYnVpbHRpbiIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgZGlzYWxsb3dlZCBidWlsdGluIGZ1bmN0aW9uIGlzIHVzZWQgKHNlZSB0aGUgIgorICAgICAgICAgICAgImJhZC1mdW5jdGlvbiBvcHRpb24pLiBVc3VhbCBkaXNhbGxvd2VkIGZ1bmN0aW9ucyBhcmUgdGhlIG9uZXMgIgorICAgICAgICAgICAgImxpa2UgbWFwLCBvciBmaWx0ZXIgLCB3aGVyZSBQeXRob24gb2ZmZXJzIG5vdyBzb21lIGNsZWFuZXIgIgorICAgICAgICAgICAgImFsdGVybmF0aXZlIGxpa2UgbGlzdCBjb21wcmVoZW5zaW9uLiIsCisgICAgICAgICkKKyAgICB9CisKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAiYmFkLWZ1bmN0aW9ucyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBCQURfRlVOQ1RJT05TLAorICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGJ1aWx0aW4gZnVuY3Rpb24gbmFtZXM+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJMaXN0IG9mIGJ1aWx0aW5zIGZ1bmN0aW9uIG5hbWVzIHRoYXQgc2hvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICAgInVzZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hIiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJiYWQtYnVpbHRpbiIpCisgICAgZGVmIHZpc2l0X2NhbGwoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5mdW5jLCBhc3Ryb2lkLk5hbWUpOgorICAgICAgICAgICAgbmFtZSA9IG5vZGUuZnVuYy5uYW1lCisgICAgICAgICAgICAjIGlnbm9yZSB0aGUgbmFtZSBpZiBpdCdzIG5vdCBhIGJ1aWx0aW4gKGkuZS4gbm90IGRlZmluZWQgaW4gdGhlCisgICAgICAgICAgICAjIGxvY2FscyBub3IgZ2xvYmFscyBzY29wZSkKKyAgICAgICAgICAgIGlmIG5vdCAobmFtZSBpbiBub2RlLmZyYW1lKCkgb3IgbmFtZSBpbiBub2RlLnJvb3QoKSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLmNvbmZpZy5iYWRfZnVuY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBoaW50ID0gQlVJTFRJTl9ISU5UUy5nZXQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaGludDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBmIntuYW1lIXJ9LiB7aGludH0iCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gcmVwcihuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJiYWQtYnVpbHRpbiIsIG5vZGU9bm9kZSwgYXJncz1hcmdzKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiIlJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlci4KKworICAgIDpwYXJhbSBsaW50ZXI6IE1haW4gaW50ZXJmYWNlIG9iamVjdCBmb3IgUHlsaW50IHBsdWdpbnMKKyAgICA6dHlwZSBsaW50ZXI6IFB5bGludCBvYmplY3QKKyAgICAiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihCYWRCdWlsdGluQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvYmFkX2J1aWx0aW4ucnN0IGIvcHlsaW50L2V4dGVuc2lvbnMvYmFkX2J1aWx0aW4ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4N2U2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9iYWRfYnVpbHRpbi5yc3QKQEAgLTAsMCArMSw5IEBACitUaGlzIHVzZWQgdG8gYmUgdGhlIGBgYmFkLWJ1aWx0aW5gYCBjb3JlIGNoZWNrZXIsIGJ1dCBpdCB3YXMgbW92ZWQgdG8KK2FuIGV4dGVuc2lvbiBpbnN0ZWFkLiBJdCBjYW4gYmUgdXNlZCBmb3IgZmluZGluZyBwcm9oaWJpdGVkIHVzZWQgYnVpbHRpbnMsCitzdWNoIGFzIGBgbWFwYGAgb3IgYGBmaWx0ZXJgYCwgZm9yIHdoaWNoIG90aGVyIGFsdGVybmF0aXZlcyBleGlzdHMuCisKK0lmIHlvdSB3YW50IHRvIGNvbnRyb2wgZm9yIHdoYXQgYnVpbHRpbnMgdGhlIGNoZWNrZXIgc2hvdWxkIHdhcm4gYWJvdXQsCit5b3UgY2FuIHVzZSB0aGUgYGBiYWQtZnVuY3Rpb25zYGAgb3B0aW9uOjoKKworICAgICQgcHlsaW50IGEucHkgLS1sb2FkLXBsdWdpbnM9cHlsaW50LmV4dGVuc2lvbnMuYmFkX2J1aWx0aW4gLS1iYWQtZnVuY3Rpb25zPWFwcGx5LHJlZHVjZQorICAgIC4uLgpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvYnJvYWRfdHJ5X2NsYXVzZS5weSBiL3B5bGludC9leHRlbnNpb25zL2Jyb2FkX3RyeV9jbGF1c2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxNGM5OQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL2Jyb2FkX3RyeV9jbGF1c2UucHkKQEAgLTAsMCArMSw3NiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjAgVHlsZXIgVGhpZWRpbmcgPHR5bGVyQHRoaWVkaW5nLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiTG9va3MgZm9yIHRyeS9leGNlcHQgc3RhdGVtZW50cyB3aXRoIHRvbyBtdWNoIGNvZGUgaW4gdGhlIHRyeSBjbGF1c2UuIiIiCisKK2Zyb20gYXN0cm9pZC5ub2RlX2NsYXNzZXMgaW1wb3J0IEZvciwgSWYsIFdoaWxlLCBXaXRoCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycywgaW50ZXJmYWNlcworCisKK2NsYXNzIEJyb2FkVHJ5Q2xhdXNlQ2hlY2tlcihjaGVja2Vycy5CYXNlQ2hlY2tlcik6CisgICAgIiIiQ2hlY2tzIGZvciB0cnkgY2xhdXNlcyB3aXRoIHRvbyBtYW55IGxpbmVzLgorCisgICAgQWNjb3JkaW5nIHRvIFBFUCA4LCBgYHRyeWBgIGNsYXVzZXMgc2hhbGwgY29udGFpbiB0aGUgYWJzb2x1dGUgbWluaW11bQorICAgIGFtb3VudCBvZiBjb2RlLiBUaGlzIGNoZWNrZXIgZW5mb3JjZXMgYSBtYXhpbXVtIG51bWJlciBvZiBzdGF0ZW1lbnRzIHdpdGhpbgorICAgIGBgdHJ5YGAgY2xhdXNlcy4KKworICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBpbnRlcmZhY2VzLklBc3Ryb2lkQ2hlY2tlcgorCisgICAgIyBjb25maWd1cmF0aW9uIHNlY3Rpb24gbmFtZQorICAgIG5hbWUgPSAiYnJvYWRfdHJ5X2NsYXVzZSIKKyAgICBtc2dzID0geworICAgICAgICAiVzA3MTciOiAoCisgICAgICAgICAgICAiJXMiLAorICAgICAgICAgICAgInRvby1tYW55LXRyeS1zdGF0ZW1lbnRzIiwKKyAgICAgICAgICAgICJUcnkgY2xhdXNlIGNvbnRhaW5zIHRvbyBtYW55IHN0YXRlbWVudHMuIiwKKyAgICAgICAgKQorICAgIH0KKworICAgIHByaW9yaXR5ID0gLTIKKyAgICBvcHRpb25zID0gKAorICAgICAgICAoCisgICAgICAgICAgICAibWF4LXRyeS1zdGF0ZW1lbnRzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEsCisgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50IiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8aW50PiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiTWF4aW11bSBudW1iZXIgb2Ygc3RhdGVtZW50cyBhbGxvd2VkIGluIGEgdHJ5IGNsYXVzZSIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIGRlZiBfY291bnRfc3RhdGVtZW50cyhzZWxmLCB0cnlfbm9kZSk6CisgICAgICAgIHN0YXRlbWVudF9jb3VudCA9IGxlbih0cnlfbm9kZS5ib2R5KQorCisgICAgICAgIGZvciBib2R5X25vZGUgaW4gdHJ5X25vZGUuYm9keToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9keV9ub2RlLCAoRm9yLCBJZiwgV2hpbGUsIFdpdGgpKToKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnRfY291bnQgKz0gc2VsZi5fY291bnRfc3RhdGVtZW50cyhib2R5X25vZGUpCisKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudF9jb3VudAorCisgICAgZGVmIHZpc2l0X3RyeWV4Y2VwdChzZWxmLCBub2RlKToKKyAgICAgICAgdHJ5X2NsYXVzZV9zdGF0ZW1lbnRzID0gc2VsZi5fY291bnRfc3RhdGVtZW50cyhub2RlKQorICAgICAgICBpZiB0cnlfY2xhdXNlX3N0YXRlbWVudHMgPiBzZWxmLmNvbmZpZy5tYXhfdHJ5X3N0YXRlbWVudHM6CisgICAgICAgICAgICBtc2cgPSAidHJ5IGNsYXVzZSBjb250YWlucyB7fSBzdGF0ZW1lbnRzLCBleHBlY3RlZCBhdCBtb3N0IHt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgdHJ5X2NsYXVzZV9zdGF0ZW1lbnRzLCBzZWxmLmNvbmZpZy5tYXhfdHJ5X3N0YXRlbWVudHMKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgInRvby1tYW55LXRyeS1zdGF0ZW1lbnRzIiwgbm9kZS5saW5lbm8sIG5vZGU9bm9kZSwgYXJncz1tc2cKKyAgICAgICAgICAgICkKKworICAgIGRlZiB2aXNpdF90cnlmaW5hbGx5KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnZpc2l0X3RyeWV4Y2VwdChub2RlKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiIlJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlci4iIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihCcm9hZFRyeUNsYXVzZUNoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9leHRlbnNpb25zL2NoZWNrX2RvY3MucHkgYi9weWxpbnQvZXh0ZW5zaW9ucy9jaGVja19kb2NzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzRiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9jaGVja19kb2NzLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgQnJ1bm8gRGFuaWVsIDxicnVuby5kYW5pZWxAYmx1ZS15b25kZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBweWxpbnQuZXh0ZW5zaW9ucyBpbXBvcnQgZG9jcGFyYW1zCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIiUmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyLgorCisgICAgOnBhcmFtIGxpbnRlcjogTWFpbiBpbnRlcmZhY2Ugb2JqZWN0IGZvciBQeWxpbnQgcGx1Z2lucworICAgIDp0eXBlIGxpbnRlcjogUHlsaW50IG9iamVjdAorICAgICIiIgorICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICJUaGlzIHBsdWdpbiBpcyBkZXByZWNhdGVkLCB1c2UgcHlsaW50LmV4dGVuc2lvbnMuZG9jcGFyYW1zIGluc3RlYWQuIiwKKyAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICkKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihkb2NwYXJhbXMuRG9jc3RyaW5nUGFyYW1ldGVyQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvY2hlY2tfZWxpZi5weSBiL3B5bGludC9leHRlbnNpb25zL2NoZWNrX2VsaWYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzZjE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL2NoZWNrX2VsaWYucHkKQEAgLTAsMCArMSw3OCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbG1hdHRoZUBjaXNjby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlVG9rZW5DaGVja2VyCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElBc3Ryb2lkQ2hlY2tlciwgSVRva2VuQ2hlY2tlcgorCisKK2NsYXNzIEVsc2VpZlVzZWRDaGVja2VyKEJhc2VUb2tlbkNoZWNrZXIpOgorICAgICIiIkNoZWNrcyBmb3IgdXNlIG9mICJlbHNlIGlmIiB3aGVuIGFuICJlbGlmIiBjb3VsZCBiZSB1c2VkIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChJVG9rZW5DaGVja2VyLCBJQXN0cm9pZENoZWNrZXIpCisgICAgbmFtZSA9ICJlbHNlX2lmX3VzZWQiCisgICAgbXNncyA9IHsKKyAgICAgICAgIlI1NTAxIjogKAorICAgICAgICAgICAgJ0NvbnNpZGVyIHVzaW5nICJlbGlmIiBpbnN0ZWFkIG9mICJlbHNlIGlmIicsCisgICAgICAgICAgICAiZWxzZS1pZi11c2VkIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gZWxzZSBzdGF0ZW1lbnQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgIgorICAgICAgICAgICAgImFuIGlmIHN0YXRlbWVudCBhbmQgZG9lcyBub3QgY29udGFpbiBzdGF0ZW1lbnRzIHRoYXQgIgorICAgICAgICAgICAgIndvdWxkIGJlIHVucmVsYXRlZCB0byBpdC4iLAorICAgICAgICApCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcj1Ob25lKToKKyAgICAgICAgQmFzZVRva2VuQ2hlY2tlci5fX2luaXRfXyhzZWxmLCBsaW50ZXIpCisgICAgICAgIHNlbGYuX2luaXQoKQorCisgICAgZGVmIF9pbml0KHNlbGYpOgorICAgICAgICBzZWxmLl9lbGlmcyA9IFtdCisgICAgICAgIHNlbGYuX2lmX2NvdW50ZXIgPSAwCisKKyAgICBkZWYgcHJvY2Vzc190b2tlbnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIyBQcm9jZXNzIHRva2VucyBhbmQgbG9vayBmb3IgJ2lmJyBvciAnZWxpZicKKyAgICAgICAgZm9yIF8sIHRva2VuLCBfLCBfLCBfIGluIHRva2VuczoKKyAgICAgICAgICAgIGlmIHRva2VuID09ICJlbGlmIjoKKyAgICAgICAgICAgICAgICBzZWxmLl9lbGlmcy5hcHBlbmQoVHJ1ZSkKKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gImlmIjoKKyAgICAgICAgICAgICAgICBzZWxmLl9lbGlmcy5hcHBlbmQoRmFsc2UpCisKKyAgICBkZWYgbGVhdmVfbW9kdWxlKHNlbGYsIF8pOgorICAgICAgICBzZWxmLl9pbml0KCkKKworICAgIGRlZiB2aXNpdF9pZmV4cChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5Gb3JtYXR0ZWRWYWx1ZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5faWZfY291bnRlciArPSAxCisKKyAgICBkZWYgdmlzaXRfY29tcHJlaGVuc2lvbihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5faWZfY291bnRlciArPSBsZW4obm9kZS5pZnMpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoImVsc2UtaWYtdXNlZCIpCisgICAgZGVmIHZpc2l0X2lmKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUucGFyZW50LCBhc3Ryb2lkLklmKToKKyAgICAgICAgICAgIG9yZWxzZSA9IG5vZGUucGFyZW50Lm9yZWxzZQorICAgICAgICAgICAgIyBjdXJyZW50IGlmIG5vZGUgbXVzdCBkaXJlY3RseSBmb2xsb3cgYW4gImVsc2UiCisgICAgICAgICAgICBpZiBvcmVsc2UgYW5kIG9yZWxzZSA9PSBbbm9kZV06CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsaWZzW3NlbGYuX2lmX2NvdW50ZXJdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJlbHNlLWlmLXVzZWQiLCBub2RlPW5vZGUpCisgICAgICAgIHNlbGYuX2lmX2NvdW50ZXIgKz0gMQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiIlJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlci4KKworICAgIDpwYXJhbSBsaW50ZXI6IE1haW4gaW50ZXJmYWNlIG9iamVjdCBmb3IgUHlsaW50IHBsdWdpbnMKKyAgICA6dHlwZSBsaW50ZXI6IFB5bGludCBvYmplY3QKKyAgICAiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihFbHNlaWZVc2VkQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvY29kZV9zdHlsZS5weSBiL3B5bGludC9leHRlbnNpb25zL2NvZGVfc3R5bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzOGYzOAotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL2NvZGVfc3R5bGUucHkKQEAgLTAsMCArMSwxNDYgQEAKK2Zyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBTZXQsIFR1cGxlLCBUeXBlLCBVbmlvbgorCitpbXBvcnQgYXN0cm9pZAorZnJvbSBhc3Ryb2lkLm5vZGVfY2xhc3NlcyBpbXBvcnQgTm9kZU5HCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlciwgdXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBjaGVja19tZXNzYWdlcywgc2FmZV9pbmZlcgorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyCitmcm9tIHB5bGludC5saW50IGltcG9ydCBQeUxpbnRlcgorCisKK2NsYXNzIENvZGVTdHlsZUNoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrZXJzIHRoYXQgY2FuIGltcHJvdmUgY29kZSBjb25zaXN0ZW5jeS4KKworICAgIEFzIHN1Y2ggdGhleSBkb24ndCBuZWNlc3NhcmlseSBwcm92aWRlIGEgcGVyZm9ybWFuY2UgYmVuZWZpdCBhbmQKKyAgICBhcmUgb2Z0ZW4gdGltZXMgb3BpbmlvbmF0ZWQuCisKKyAgICBCZWZvcmUgYWRkaW5nIGFub3RoZXIgY2hlY2tlciBoZXJlLCBjb25zaWRlciB0aGlzOgorICAgIDEuIERvZXMgdGhlIGNoZWNrZXIgcHJvdmlkZSBhIGNsZWFyIGJlbmVmaXQsCisgICAgICAgaS5lLiBkZXRlY3QgYSBjb21tb24gaXNzdWUgb3IgaW1wcm92ZSBwZXJmb3JtYW5jZQorICAgICAgID0+IGl0IHNob3VsZCBwcm9iYWJseSBiZSBwYXJ0IG9mIHRoZSBjb3JlIGNoZWNrZXIgY2xhc3NlcworICAgIDIuIElzIGl0IHNvbWV0aGluZyB0aGF0IHdvdWxkIGltcHJvdmUgY29kZSBjb25zaXN0ZW5jeSwKKyAgICAgICBtYXliZSBiZWNhdXNlIGl0J3Mgc2xpZ2h0bHkgYmV0dGVyIHdpdGggcmVnYXJkcyB0byBwZXJmb3JtYW5jZQorICAgICAgIGFuZCB0aGVyZWZvcmUgcHJlZmVycmVkID0+IHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlCisgICAgMy4gRXZlcnl0aGluZyBlbHNlIHNob3VsZCBnbyBpbnRvIGFub3RoZXIgZXh0ZW5zaW9uCisgICAgIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChJQXN0cm9pZENoZWNrZXIsKQorCisgICAgbmFtZSA9ICJjb2RlX3N0eWxlIgorICAgIHByaW9yaXR5ID0gLTEKKyAgICBtc2dzID0geworICAgICAgICAiUjYxMDEiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgbmFtZWR0dXBsZSBvciBkYXRhY2xhc3MgZm9yIGRpY3Rpb25hcnkgdmFsdWVzIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy1uYW1lZHR1cGxlLW9yLWRhdGFjbGFzcyIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGRpY3Rpb25hcnkgdmFsdWVzIGNhbiBiZSByZXBsYWNlZCBieSBuYW1lZHR1cGxlcyBvciBkYXRhY2xhc3MgaW5zdGFuY2VzLiIsCisgICAgICAgICksCisgICAgICAgICJSNjEwMiI6ICgKKyAgICAgICAgICAgICJDb25zaWRlciB1c2luZyBhbiBpbi1wbGFjZSB0dXBsZSVzIiwKKyAgICAgICAgICAgICJjb25zaWRlci11c2luZy10dXBsZSIsCisgICAgICAgICAgICAiRW1pdHRlZCB3aGVuIGFuIGluLXBsYWNlIGRlZmluZWQgbGlzdCBvciBzZXQgY2FuIGJlICIKKyAgICAgICAgICAgICJyZXBsYWNlZCBieSBhIHNsaWdodGx5IGZhc3RlciB0dXBsZS4iLAorICAgICAgICApLAorICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXI6IFB5TGludGVyKSAtPiBOb25lOgorICAgICAgICAiIiJJbml0aWFsaXplIGNoZWNrZXIgaW5zdGFuY2UuIiIiCisgICAgICAgIHN1cGVyKCkuX19pbml0X18obGludGVyPWxpbnRlcikKKworICAgIEBjaGVja19tZXNzYWdlcygiY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3MiKQorICAgIGRlZiB2aXNpdF9kaWN0KHNlbGYsIG5vZGU6IGFzdHJvaWQuRGljdCkgLT4gTm9uZToKKyAgICAgICAgc2VsZi5fY2hlY2tfZGljdF9jb25zaWRlcl9uYW1lZHR1cGxlX2RhdGFjbGFzcyhub2RlKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJjb25zaWRlci11c2luZy10dXBsZSIpCisgICAgZGVmIHZpc2l0X2ZvcihzZWxmLCBub2RlOiBhc3Ryb2lkLkZvcikgLT4gTm9uZToKKyAgICAgICAgc2VsZi5fY2hlY2tfaW5wbGFjZV9kZWZpbmVkX2xpc3Rfc2V0KG5vZGUpCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoImNvbnNpZGVyLXVzaW5nLXR1cGxlIikKKyAgICBkZWYgdmlzaXRfY29tcHJlaGVuc2lvbihzZWxmLCBub2RlOiBhc3Ryb2lkLkNvbXByZWhlbnNpb24pIC0+IE5vbmU6CisgICAgICAgIHNlbGYuX2NoZWNrX2lucGxhY2VfZGVmaW5lZF9saXN0X3NldChub2RlKQorCisgICAgZGVmIF9jaGVja19kaWN0X2NvbnNpZGVyX25hbWVkdHVwbGVfZGF0YWNsYXNzKHNlbGYsIG5vZGU6IGFzdHJvaWQuRGljdCkgLT4gTm9uZToKKyAgICAgICAgIiIiQ2hlY2sgaWYgZGljdGlvbmFyeSB2YWx1ZXMgY2FuIGJlIHJlcGxhY2VkIGJ5IE5hbWVkdHVwbGUgb3IgRGF0YWNsYXNzLiIiIgorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgKGFzdHJvaWQuQXNzaWduLCBhc3Ryb2lkLkFubkFzc2lnbikpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLnBhcmVudC5wYXJlbnQsIGFzdHJvaWQuTW9kdWxlKQorICAgICAgICAgICAgb3IgaXNpbnN0YW5jZShub2RlLnBhcmVudCwgYXN0cm9pZC5Bbm5Bc3NpZ24pCisgICAgICAgICAgICBhbmQgdXRpbHMuaXNfYXNzaWduX25hbWVfYW5ub3RhdGVkX3dpdGgobm9kZS5wYXJlbnQudGFyZ2V0LCAiRmluYWwiKQorICAgICAgICApOgorICAgICAgICAgICAgIyBJZiBkaWN0IGlzIG5vdCBwYXJ0IG9mIGFuICdBc3NpZ24nIG9yICdBbm5Bc3NpZ24nIG5vZGUgaW4KKyAgICAgICAgICAgICMgYSBtb2R1bGUgY29udGV4dCBPUiAnQW5uQXNzaWduJyB3aXRoICdGaW5hbCcgYW5ub3RhdGlvbiwgc2tpcCBjaGVjay4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQWxsIGRpY3RfdmFsdWVzIGFyZSBpdHNlbGYgZGljdCBub2RlcworICAgICAgICBpZiBsZW4obm9kZS5pdGVtcykgPiAxIGFuZCBhbGwoCisgICAgICAgICAgICBpc2luc3RhbmNlKGRpY3RfdmFsdWUsIGFzdHJvaWQuRGljdCkgZm9yIF8sIGRpY3RfdmFsdWUgaW4gbm9kZS5pdGVtcworICAgICAgICApOgorICAgICAgICAgICAgS2V5VHVwbGVUID0gVHVwbGVbVHlwZVtOb2RlTkddLCBzdHJdCisKKyAgICAgICAgICAgICMgTWFrZXMgc3VyZSBhbGwga2V5cyBhcmUgJ0NvbnN0JyBzdHJpbmcgbm9kZXMKKyAgICAgICAgICAgIGtleXNfY2hlY2tlZDogU2V0W0tleVR1cGxlVF0gPSBzZXQoKQorICAgICAgICAgICAgZm9yIF8sIGRpY3RfdmFsdWUgaW4gbm9kZS5pdGVtczoKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCBfIGluIGRpY3RfdmFsdWUuaXRlbXM6CisgICAgICAgICAgICAgICAgICAgIGtleV90dXBsZSA9ICh0eXBlKGtleSksIGtleS5hc19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgaWYga2V5X3R1cGxlIGluIGtleXNfY2hlY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihrZXkpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoCisgICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLkNvbnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluZmVycmVkLnB5dHlwZSgpID09ICJidWlsdGlucy5zdHIiCisgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAga2V5c19jaGVja2VkLmFkZChrZXlfdHVwbGUpCisKKyAgICAgICAgICAgICMgTWFrZXMgc3VyZSBhbGwgc3ViZGljdHMgaGF2ZSBhdCBsZWFzdCAxIGNvbW1vbiBrZXkKKyAgICAgICAgICAgIGtleV90dXBsZXM6IExpc3RbVHVwbGVbS2V5VHVwbGVULCAuLi5dXSA9IFtdCisgICAgICAgICAgICBmb3IgXywgZGljdF92YWx1ZSBpbiBub2RlLml0ZW1zOgorICAgICAgICAgICAgICAgIGtleV90dXBsZXMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICB0dXBsZSgodHlwZShrZXkpLCBrZXkuYXNfc3RyaW5nKCkpIGZvciBrZXksIF8gaW4gZGljdF92YWx1ZS5pdGVtcykKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBrZXlzX2ludGVyc2VjdGlvbjogU2V0W0tleVR1cGxlVF0gPSBzZXQoa2V5X3R1cGxlc1swXSkKKyAgICAgICAgICAgIGZvciBzdWJfa2V5X3R1cGxlcyBpbiBrZXlfdHVwbGVzWzE6XToKKyAgICAgICAgICAgICAgICBrZXlzX2ludGVyc2VjdGlvbi5pbnRlcnNlY3Rpb25fdXBkYXRlKHN1Yl9rZXlfdHVwbGVzKQorICAgICAgICAgICAgaWYgbm90IGtleXNfaW50ZXJzZWN0aW9uOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb25zaWRlci11c2luZy1uYW1lZHR1cGxlLW9yLWRhdGFjbGFzcyIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQWxsIGRpY3RfdmFsdWVzIGFyZSBpdHNlbGYgZWl0aGVyIGxpc3Qgb3IgdHVwbGUgbm9kZXMKKyAgICAgICAgaWYgbGVuKG5vZGUuaXRlbXMpID4gMSBhbmQgYWxsKAorICAgICAgICAgICAgaXNpbnN0YW5jZShkaWN0X3ZhbHVlLCAoYXN0cm9pZC5MaXN0LCBhc3Ryb2lkLlR1cGxlKSkKKyAgICAgICAgICAgIGZvciBfLCBkaWN0X3ZhbHVlIGluIG5vZGUuaXRlbXMKKyAgICAgICAgKToKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIGFsbCBzdWJsaXN0cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCA+IDAKKyAgICAgICAgICAgIGxpc3RfbGVuZ3RoID0gbGVuKG5vZGUuaXRlbXNbMF1bMV0uZWx0cykKKyAgICAgICAgICAgIGlmIGxpc3RfbGVuZ3RoID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmb3IgXywgZGljdF92YWx1ZSBpbiBub2RlLml0ZW1zWzE6XToKKyAgICAgICAgICAgICAgICBpZiBsZW4oZGljdF92YWx1ZS5lbHRzKSAhPSBsaXN0X2xlbmd0aDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIGF0IGxlYXN0IG9uZSBsaXN0IGVudHJ5IGlzbid0IGEgZGljdAorICAgICAgICAgICAgZm9yIF8sIGRpY3RfdmFsdWUgaW4gbm9kZS5pdGVtczoKKyAgICAgICAgICAgICAgICBpZiBhbGwoaXNpbnN0YW5jZShlbnRyeSwgYXN0cm9pZC5EaWN0KSBmb3IgZW50cnkgaW4gZGljdF92YWx1ZS5lbHRzKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImNvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX2NoZWNrX2lucGxhY2VfZGVmaW5lZF9saXN0X3NldCgKKyAgICAgICAgc2VsZiwgbm9kZTogVW5pb25bYXN0cm9pZC5Gb3IsIGFzdHJvaWQuQ29tcHJlaGVuc2lvbl0KKyAgICApIC0+IE5vbmU6CisgICAgICAgICIiIkNoZWNrIGlmIGlucGxhY2UgZGVmaW5lZCBsaXN0IC8gc2V0IGNhbiBiZSByZXBsYWNlZCBieSBhIHR1cGxlLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUuaXRlciwgKGFzdHJvaWQuTGlzdCwgYXN0cm9pZC5TZXQpKSBhbmQgbm90IGFueSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoaXRlbSwgYXN0cm9pZC5TdGFycmVkKSBmb3IgaXRlbSBpbiBub2RlLml0ZXIuZWx0cworICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiY29uc2lkZXItdXNpbmctdHVwbGUiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZS5pdGVyLAorICAgICAgICAgICAgICAgIGFyZ3M9KGYiIGluc3RlYWQgb2Yge25vZGUuaXRlci5fX2NsYXNzX18uX19xdWFsbmFtZV9fLmxvd2VyKCl9IiksCisgICAgICAgICAgICApCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcjogUHlMaW50ZXIpIC0+IE5vbmU6CisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoQ29kZVN0eWxlQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvY29kZV9zdHlsZS5yc3QgYi9weWxpbnQvZXh0ZW5zaW9ucy9jb2RlX3N0eWxlLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZmNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2V4dGVuc2lvbnMvY29kZV9zdHlsZS5yc3QKQEAgLTAsMCArMSwzIEBACitDaGVja2VycyB0aGF0IGNhbiBpbXByb3ZlIGNvZGUgY29uc2lzdGVuY3kuCitBcyBzdWNoIHRoZXkgZG9uJ3QgbmVjZXNzYXJpbHkgcHJvdmlkZSBhIHBlcmZvcm1hbmNlIGJlbmVmaXQgYW5kCithcmUgb2Z0ZW4gdGltZXMgb3BpbmlvbmF0ZWQuCmRpZmYgLS1naXQgYS9weWxpbnQvZXh0ZW5zaW9ucy9jb21wYXJldG96ZXJvLnB5IGIvcHlsaW50L2V4dGVuc2lvbnMvY29tcGFyZXRvemVyby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZiNzNlCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2V4dGVuc2lvbnMvY29tcGFyZXRvemVyby5weQpAQCAtMCwwICsxLDc3IEBACisjIENvcHlyaWdodCAoYykgMjAxNiBBbGV4YW5kZXIgVG9kb3JvdiA8YXRvZG9yb3ZAb3RiLmJnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LCAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMSBiZXJuaWUgZ3JheSA8YmZncmF5M0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiTG9va3MgZm9yIGNvbXBhcmlzb25zIHRvIHplcm8uIiIiCisKK2ltcG9ydCBpdGVydG9vbHMKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzLCBpbnRlcmZhY2VzCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMKKworCitkZWYgX2lzX2NvbnN0YW50X3plcm8obm9kZSk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIG5vZGUudmFsdWUgPT0gMAorCisKK2NsYXNzIENvbXBhcmVUb1plcm9DaGVja2VyKGNoZWNrZXJzLkJhc2VDaGVja2VyKToKKyAgICAiIiJDaGVja3MgZm9yIGNvbXBhcmlzb25zIHRvIHplcm8uCisgICAgTW9zdCBvZiB0aGUgdGltZXMgeW91IHNob3VsZCB1c2UgdGhlIGZhY3QgdGhhdCBpbnRlZ2VycyB3aXRoIGEgdmFsdWUgb2YgMCBhcmUgZmFsc2UuCisgICAgQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB3aGVuIDAgaXMgYWxsb3dlZCBpbiB0aGUgcHJvZ3JhbSBhbmQgaGFzIGEKKyAgICBkaWZmZXJlbnQgbWVhbmluZyB0aGFuIE5vbmUhCisgICAgIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChpbnRlcmZhY2VzLklBc3Ryb2lkQ2hlY2tlciwpCisKKyAgICAjIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lCisgICAgbmFtZSA9ICJjb21wYXJlLXRvLXplcm8iCisgICAgbXNncyA9IHsKKyAgICAgICAgIkMyMDAxIjogKAorICAgICAgICAgICAgIkF2b2lkIGNvbXBhcmlzb25zIHRvIHplcm8iLAorICAgICAgICAgICAgImNvbXBhcmUtdG8temVybyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIFB5bGludCBkZXRlY3RzIGNvbXBhcmlzb24gdG8gYSAwIGNvbnN0YW50LiIsCisgICAgICAgICkKKyAgICB9CisKKyAgICBwcmlvcml0eSA9IC0yCisgICAgb3B0aW9ucyA9ICgpCisKKyAgICBAdXRpbHMuY2hlY2tfbWVzc2FnZXMoImNvbXBhcmUtdG8temVybyIpCisgICAgZGVmIHZpc2l0X2NvbXBhcmUoc2VsZiwgbm9kZSk6CisgICAgICAgIF9vcGVyYXRvcnMgPSBbIiE9IiwgIj09IiwgImlzIG5vdCIsICJpcyJdCisgICAgICAgICMgbm90ZTogYXN0cm9pZC5Db21wYXJlIGhhcyB0aGUgbGVmdCBtb3N0IG9wZXJhbmQgaW4gbm9kZS5sZWZ0CisgICAgICAgICMgd2hpbGUgdGhlIHJlc3QgYXJlIGEgbGlzdCBvZiB0dXBsZXMgaW4gbm9kZS5vcHMKKyAgICAgICAgIyB0aGUgZm9ybWF0IG9mIHRoZSB0dXBsZSBpcyAoJ2NvbXBhcmUgb3BlcmF0b3Igc2lnbicsIG5vZGUpCisgICAgICAgICMgaGVyZSB3ZSBzcXVhc2ggZXZlcnl0aGluZyBpbnRvIGBvcHNgIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBwcm9jZXNzaW5nIGxhdGVyCisgICAgICAgIG9wcyA9IFsoIiIsIG5vZGUubGVmdCldCisgICAgICAgIG9wcy5leHRlbmQobm9kZS5vcHMpCisgICAgICAgIG9wcyA9IGxpc3QoaXRlcnRvb2xzLmNoYWluKCpvcHMpKQorCisgICAgICAgIGZvciBvcHNfaWR4IGluIHJhbmdlKGxlbihvcHMpIC0gMik6CisgICAgICAgICAgICBvcF8xID0gb3BzW29wc19pZHhdCisgICAgICAgICAgICBvcF8yID0gb3BzW29wc19pZHggKyAxXQorICAgICAgICAgICAgb3BfMyA9IG9wc1tvcHNfaWR4ICsgMl0KKyAgICAgICAgICAgIGVycm9yX2RldGVjdGVkID0gRmFsc2UKKworICAgICAgICAgICAgIyAwID8/IFgKKyAgICAgICAgICAgIGlmIF9pc19jb25zdGFudF96ZXJvKG9wXzEpIGFuZCBvcF8yIGluIF9vcGVyYXRvcnM6CisgICAgICAgICAgICAgICAgZXJyb3JfZGV0ZWN0ZWQgPSBUcnVlCisgICAgICAgICAgICAjIFggPz8gMAorICAgICAgICAgICAgZWxpZiBvcF8yIGluIF9vcGVyYXRvcnMgYW5kIF9pc19jb25zdGFudF96ZXJvKG9wXzMpOgorICAgICAgICAgICAgICAgIGVycm9yX2RldGVjdGVkID0gVHJ1ZQorCisgICAgICAgICAgICBpZiBlcnJvcl9kZXRlY3RlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJjb21wYXJlLXRvLXplcm8iLCBub2RlPW5vZGUpCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIiUmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyLiIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKENvbXBhcmVUb1plcm9DaGVja2VyKGxpbnRlcikpCmRpZmYgLS1naXQgYS9weWxpbnQvZXh0ZW5zaW9ucy9jb25mdXNpbmdfZWxpZi5weSBiL3B5bGludC9leHRlbnNpb25zL2NvbmZ1c2luZ19lbGlmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjZjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9jb25mdXNpbmdfZWxpZi5weQpAQCAtMCwwICsxLDU2IEBACisjIENvcHlyaWdodCAoYykgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEFuZHJlYXMgRmlua2xlciA8YW5kaS5maW5rbGVyQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBjaGVja19tZXNzYWdlcworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyCitmcm9tIHB5bGludC5saW50IGltcG9ydCBQeUxpbnRlcgorCisKK2NsYXNzIENvbmZ1c2luZ0NvbnNlY3V0aXZlRWxpZkNoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrcyBpZiAiZWxpZiIgaXMgdXNlZCByaWdodCBhZnRlciBhbiBpbmRlbnRlZCBibG9jayB0aGF0IGZpbmlzaGVzIHdpdGggImlmIiBvciAiZWxpZiIgaXRzZWxmLiIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJQXN0cm9pZENoZWNrZXIKKworICAgIG5hbWUgPSAiY29uZnVzaW5nLWVsaWYtY2hlY2tlciIKKyAgICBwcmlvcml0eSA9IC0xCisgICAgbXNncyA9IHsKKyAgICAgICAgIlI1NjAxIjogKAorICAgICAgICAgICAgIkNvbnNlY3V0aXZlIGVsaWYgd2l0aCBkaWZmZXJpbmcgaW5kZW50YXRpb24gbGV2ZWwsIGNvbnNpZGVyIGNyZWF0aW5nIGEgZnVuY3Rpb24gdG8gc2VwYXJhdGUgdGhlIGlubmVyIGVsaWYiLAorICAgICAgICAgICAgImNvbmZ1c2luZy1jb25zZWN1dGl2ZS1lbGlmIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYW4gZWxpZiBzdGF0ZW1lbnQgZm9sbG93cyByaWdodCBhZnRlciBhbiBpbmRlbnRlZCBibG9jayB3aGljaCBpdHNlbGYgZW5kcyB3aXRoIGlmIG9yIGVsaWYuICIKKyAgICAgICAgICAgICJJdCBtYXkgbm90IGJlIG92aW91cyBpZiB0aGUgZWxpZiBzdGF0ZW1lbnQgd2FzIHdpbGxpbmdseSBvciBtaXN0YWtlbmx5IHVuaW5kZW50ZWQuICIKKyAgICAgICAgICAgICJFeHRyYWN0aW5nIHRoZSBpbmRlbnRlZCBpZiBzdGF0ZW1lbnQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIG1pZ2h0IGF2b2lkIGNvbmZ1c2lvbiBhbmQgcHJldmVudCBlcnJvcnMuIiwKKyAgICAgICAgKQorICAgIH0KKworICAgIEBjaGVja19tZXNzYWdlcygiY29uZnVzaW5nLWNvbnNlY3V0aXZlLWVsaWYiKQorICAgIGRlZiB2aXNpdF9pZihzZWxmLCBub2RlOiBhc3Ryb2lkLklmKToKKyAgICAgICAgYm9keV9lbmRzX3dpdGhfaWYgPSBpc2luc3RhbmNlKAorICAgICAgICAgICAgbm9kZS5ib2R5Wy0xXSwgYXN0cm9pZC5JZgorICAgICAgICApIGFuZCBzZWxmLl9oYXNfbm9fZWxzZV9jbGF1c2Uobm9kZS5ib2R5Wy0xXSkKKyAgICAgICAgaWYgbm9kZS5oYXNfZWxpZl9ibG9jaygpIGFuZCBib2R5X2VuZHNfd2l0aF9pZjoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImNvbmZ1c2luZy1jb25zZWN1dGl2ZS1lbGlmIiwgbm9kZT1ub2RlLm9yZWxzZVswXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2hhc19ub19lbHNlX2NsYXVzZShub2RlOiBhc3Ryb2lkLklmKToKKyAgICAgICAgb3JlbHNlID0gbm9kZS5vcmVsc2UKKyAgICAgICAgd2hpbGUgb3JlbHNlIGFuZCBpc2luc3RhbmNlKG9yZWxzZVswXSwgYXN0cm9pZC5JZik6CisgICAgICAgICAgICBvcmVsc2UgPSBvcmVsc2VbMF0ub3JlbHNlCisgICAgICAgIGlmIG5vdCBvcmVsc2Ugb3IgaXNpbnN0YW5jZShvcmVsc2VbMF0sIGFzdHJvaWQuSWYpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcjogUHlMaW50ZXIpOgorICAgICIiIlRoaXMgcmVxdWlyZWQgbWV0aG9kIGF1dG8gcmVnaXN0ZXJzIHRoZSBjaGVja2VyLgorCisgICAgOnBhcmFtIGxpbnRlcjogVGhlIGxpbnRlciB0byByZWdpc3RlciB0aGUgY2hlY2tlciB0by4KKyAgICA6dHlwZSBsaW50ZXI6IHB5bGludC5saW50LlB5TGludGVyCisgICAgIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoQ29uZnVzaW5nQ29uc2VjdXRpdmVFbGlmQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvZG9jcGFyYW1zLnB5IGIvcHlsaW50L2V4dGVuc2lvbnMvZG9jcGFyYW1zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzgwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9kb2NwYXJhbXMucHkKQEAgLTAsMCArMSw2MjggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgQnJ1bm8gRGFuaWVsIDxicnVuby5kYW5pZWxAYmx1ZS15b25kZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbGVubkBlLWRhZC5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNiBHbGVubiBNYXR0aGV3cyA8Z2xtYXR0aGVAY2lzY28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgTW9pc2VzIExvcGV6IDxtb3lsb3AyNjBAdmF1eG9vLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxNyBKb2huIFBhcmFza2V2b3BvdWxvcyA8aW8ucGFyYXNrZXZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgsIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOCBKaW0gUm9iZXJ0c29uIDxqcm9iZXJ0c29uOThhdHhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU3VzaG9iaGl0IDwzMTk4Nzc2OStzdXNob2JoaXQyN0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBZGFtIERhbmdvb3IgPGFkYW1kYW5nb29yQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LCAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBMdWlnaSA8bHVpZ2kuY3Jpc3RvZm9saW5pQHEtY3RybC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisjIENvcHlyaWdodCAoYykgMjAyMSBMb2dhbiBNaWxsZXIgPDE0MzE5MTc5K2tvbW9kbzQ3MkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiUHlsaW50IHBsdWdpbiBmb3IgY2hlY2tpbmcgaW4gU3BoaW54LCBHb29nbGUsIG9yIE51bXB5IHN0eWxlIGRvY3N0cmluZ3MKKyIiIgoraW1wb3J0IHJlCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IHV0aWxzIGFzIGNoZWNrZXJfdXRpbHMKK2Zyb20gcHlsaW50LmV4dGVuc2lvbnMgaW1wb3J0IF9jaGVja19kb2NzX3V0aWxzIGFzIHV0aWxzCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJQXN0cm9pZENoZWNrZXIKK2Zyb20gcHlsaW50LnV0aWxzIGltcG9ydCBnZXRfZ2xvYmFsX29wdGlvbgorCisKK2NsYXNzIERvY3N0cmluZ1BhcmFtZXRlckNoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrZXIgZm9yIFNwaGlueCwgR29vZ2xlLCBvciBOdW1weSBzdHlsZSBkb2NzdHJpbmdzCisKKyAgICAqIENoZWNrIHRoYXQgYWxsIGZ1bmN0aW9uLCBtZXRob2QgYW5kIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgYXJlIG1lbnRpb25lZAorICAgICAgaW4gdGhlIHBhcmFtcyBhbmQgdHlwZXMgcGFydCBvZiB0aGUgZG9jc3RyaW5nLiAgQ29uc3RydWN0b3IgcGFyYW1ldGVycworICAgICAgY2FuIGJlIGRvY3VtZW50ZWQgaW4gZWl0aGVyIHRoZSBjbGFzcyBkb2NzdHJpbmcgb3IgYGBfX2luaXRfX2BgIGRvY3N0cmluZywKKyAgICAgIGJ1dCBub3QgYm90aC4KKyAgICAqIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIG5hbWluZyBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgc2lnbmF0dXJlIGFuZAorICAgICAgdGhlIGRvY3VtZW50YXRpb24sIGkuZS4gYWxzbyByZXBvcnQgZG9jdW1lbnRlZCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG1pc3NpbmcKKyAgICAgIGluIHRoZSBzaWduYXR1cmUuIFRoaXMgaXMgaW1wb3J0YW50IHRvIGZpbmQgY2FzZXMgd2hlcmUgcGFyYW1ldGVycyBhcmUKKyAgICAgIHJlbmFtZWQgb25seSBpbiB0aGUgY29kZSwgbm90IGluIHRoZSBkb2N1bWVudGF0aW9uLgorICAgICogQ2hlY2sgdGhhdCBhbGwgZXhwbGljaXRseSByYWlzZWQgZXhjZXB0aW9ucyBpbiBhIGZ1bmN0aW9uIGFyZSBkb2N1bWVudGVkCisgICAgICBpbiB0aGUgZnVuY3Rpb24gZG9jc3RyaW5nLiBDYXVnaHQgZXhjZXB0aW9ucyBhcmUgaWdub3JlZC4KKworICAgIEFjdGl2YXRlIHRoaXMgY2hlY2tlciBieSBhZGRpbmcgdGhlIGxpbmU6OgorCisgICAgICAgIGxvYWQtcGx1Z2lucz1weWxpbnQuZXh0ZW5zaW9ucy5kb2NwYXJhbXMKKworICAgIHRvIHRoZSBgYE1BU1RFUmBgIHNlY3Rpb24gb2YgeW91ciBgYC5weWxpbnRyY2BgLgorCisgICAgOnBhcmFtIGxpbnRlcjogbGludGVyIG9iamVjdAorICAgIDp0eXBlIGxpbnRlcjogOmNsYXNzOmBweWxpbnQubGludC5QeUxpbnRlcmAKKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gSUFzdHJvaWRDaGVja2VyCisKKyAgICBuYW1lID0gInBhcmFtZXRlcl9kb2N1bWVudGF0aW9uIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJXOTAwNSI6ICgKKyAgICAgICAgICAgICciJXMiIGhhcyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGRvY3VtZW50ZWQgaW4gY2xhc3MgYW5kIF9faW5pdF9fJywKKyAgICAgICAgICAgICJtdWx0aXBsZS1jb25zdHJ1Y3Rvci1kb2MiLAorICAgICAgICAgICAgIlBsZWFzZSByZW1vdmUgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3Mgb3IgY29uc3RydWN0b3IuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlc5MDA2IjogKAorICAgICAgICAgICAgJyIlcyIgbm90IGRvY3VtZW50ZWQgYXMgYmVpbmcgcmFpc2VkJywKKyAgICAgICAgICAgICJtaXNzaW5nLXJhaXNlcy1kb2MiLAorICAgICAgICAgICAgIlBsZWFzZSBkb2N1bWVudCBleGNlcHRpb25zIGZvciBhbGwgcmFpc2VkIGV4Y2VwdGlvbiB0eXBlcy4iLAorICAgICAgICApLAorICAgICAgICAiVzkwMDgiOiAoCisgICAgICAgICAgICAiUmVkdW5kYW50IHJldHVybnMgZG9jdW1lbnRhdGlvbiIsCisgICAgICAgICAgICAicmVkdW5kYW50LXJldHVybnMtZG9jIiwKKyAgICAgICAgICAgICJQbGVhc2UgcmVtb3ZlIHRoZSByZXR1cm4vcnR5cGUgZG9jdW1lbnRhdGlvbiBmcm9tIHRoaXMgbWV0aG9kLiIsCisgICAgICAgICksCisgICAgICAgICJXOTAxMCI6ICgKKyAgICAgICAgICAgICJSZWR1bmRhbnQgeWllbGRzIGRvY3VtZW50YXRpb24iLAorICAgICAgICAgICAgInJlZHVuZGFudC15aWVsZHMtZG9jIiwKKyAgICAgICAgICAgICJQbGVhc2UgcmVtb3ZlIHRoZSB5aWVsZHMgZG9jdW1lbnRhdGlvbiBmcm9tIHRoaXMgbWV0aG9kLiIsCisgICAgICAgICksCisgICAgICAgICJXOTAxMSI6ICgKKyAgICAgICAgICAgICJNaXNzaW5nIHJldHVybiBkb2N1bWVudGF0aW9uIiwKKyAgICAgICAgICAgICJtaXNzaW5nLXJldHVybi1kb2MiLAorICAgICAgICAgICAgIlBsZWFzZSBhZGQgZG9jdW1lbnRhdGlvbiBhYm91dCB3aGF0IHRoaXMgbWV0aG9kIHJldHVybnMuIiwKKyAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiVzkwMDciLCAib2xkLW1pc3NpbmctcmV0dXJucy1kb2MiKV19LAorICAgICAgICApLAorICAgICAgICAiVzkwMTIiOiAoCisgICAgICAgICAgICAiTWlzc2luZyByZXR1cm4gdHlwZSBkb2N1bWVudGF0aW9uIiwKKyAgICAgICAgICAgICJtaXNzaW5nLXJldHVybi10eXBlLWRvYyIsCisgICAgICAgICAgICAiUGxlYXNlIGRvY3VtZW50IHRoZSB0eXBlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiIsCisgICAgICAgICAgICAjIHdlIGNhbid0IHVzZSB0aGUgc2FtZSBvbGRfbmFtZSBmb3IgdHdvIGRpZmZlcmVudCB3YXJuaW5ncworICAgICAgICAgICAgIyB7J29sZF9uYW1lcyc6IFsoJ1c5MDA3JywgJ21pc3NpbmctcmV0dXJucy1kb2MnKV19LAorICAgICAgICApLAorICAgICAgICAiVzkwMTMiOiAoCisgICAgICAgICAgICAiTWlzc2luZyB5aWVsZCBkb2N1bWVudGF0aW9uIiwKKyAgICAgICAgICAgICJtaXNzaW5nLXlpZWxkLWRvYyIsCisgICAgICAgICAgICAiUGxlYXNlIGFkZCBkb2N1bWVudGF0aW9uIGFib3V0IHdoYXQgdGhpcyBnZW5lcmF0b3IgeWllbGRzLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlc5MDA5IiwgIm9sZC1taXNzaW5nLXlpZWxkcy1kb2MiKV19LAorICAgICAgICApLAorICAgICAgICAiVzkwMTQiOiAoCisgICAgICAgICAgICAiTWlzc2luZyB5aWVsZCB0eXBlIGRvY3VtZW50YXRpb24iLAorICAgICAgICAgICAgIm1pc3NpbmcteWllbGQtdHlwZS1kb2MiLAorICAgICAgICAgICAgIlBsZWFzZSBkb2N1bWVudCB0aGUgdHlwZSB5aWVsZGVkIGJ5IHRoaXMgbWV0aG9kLiIsCisgICAgICAgICAgICAjIHdlIGNhbid0IHVzZSB0aGUgc2FtZSBvbGRfbmFtZSBmb3IgdHdvIGRpZmZlcmVudCB3YXJuaW5ncworICAgICAgICAgICAgIyB7J29sZF9uYW1lcyc6IFsoJ1c5MDA5JywgJ21pc3NpbmcteWllbGRzLWRvYycpXX0sCisgICAgICAgICksCisgICAgICAgICJXOTAxNSI6ICgKKyAgICAgICAgICAgICciJXMiIG1pc3NpbmcgaW4gcGFyYW1ldGVyIGRvY3VtZW50YXRpb24nLAorICAgICAgICAgICAgIm1pc3NpbmctcGFyYW0tZG9jIiwKKyAgICAgICAgICAgICJQbGVhc2UgYWRkIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMgZm9yIGFsbCBwYXJhbWV0ZXJzLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlc5MDAzIiwgIm9sZC1taXNzaW5nLXBhcmFtLWRvYyIpXX0sCisgICAgICAgICksCisgICAgICAgICJXOTAxNiI6ICgKKyAgICAgICAgICAgICciJXMiIG1pc3NpbmcgaW4gcGFyYW1ldGVyIHR5cGUgZG9jdW1lbnRhdGlvbicsCisgICAgICAgICAgICAibWlzc2luZy10eXBlLWRvYyIsCisgICAgICAgICAgICAiUGxlYXNlIGFkZCBwYXJhbWV0ZXIgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGFsbCBwYXJhbWV0ZXJzLiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlc5MDA0IiwgIm9sZC1taXNzaW5nLXR5cGUtZG9jIildfSwKKyAgICAgICAgKSwKKyAgICAgICAgIlc5MDE3IjogKAorICAgICAgICAgICAgJyIlcyIgZGlmZmVyaW5nIGluIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uJywKKyAgICAgICAgICAgICJkaWZmZXJpbmctcGFyYW0tZG9jIiwKKyAgICAgICAgICAgICJQbGVhc2UgY2hlY2sgcGFyYW1ldGVyIG5hbWVzIGluIGRlY2xhcmF0aW9ucy4iLAorICAgICAgICApLAorICAgICAgICAiVzkwMTgiOiAoCisgICAgICAgICAgICAnIiVzIiBkaWZmZXJpbmcgaW4gcGFyYW1ldGVyIHR5cGUgZG9jdW1lbnRhdGlvbicsCisgICAgICAgICAgICAiZGlmZmVyaW5nLXR5cGUtZG9jIiwKKyAgICAgICAgICAgICJQbGVhc2UgY2hlY2sgcGFyYW1ldGVyIG5hbWVzIGluIHR5cGUgZGVjbGFyYXRpb25zLiIsCisgICAgICAgICksCisgICAgICAgICJXOTAxOSI6ICgKKyAgICAgICAgICAgICciJXMiIHVzZWxlc3MgaWdub3JlZCBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbicsCisgICAgICAgICAgICAidXNlbGVzcy1wYXJhbS1kb2MiLAorICAgICAgICAgICAgIlBsZWFzZSByZW1vdmUgdGhlIGlnbm9yZWQgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24uIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlc5MDIwIjogKAorICAgICAgICAgICAgJyIlcyIgdXNlbGVzcyBpZ25vcmVkIHBhcmFtZXRlciB0eXBlIGRvY3VtZW50YXRpb24nLAorICAgICAgICAgICAgInVzZWxlc3MtdHlwZS1kb2MiLAorICAgICAgICAgICAgIlBsZWFzZSByZW1vdmUgdGhlIGlnbm9yZWQgcGFyYW1ldGVyIHR5cGUgZG9jdW1lbnRhdGlvbi4iLAorICAgICAgICApLAorICAgIH0KKworICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJhY2NlcHQtbm8tcGFyYW0tZG9jIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IFRydWUsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5IG9yIG4+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJXaGV0aGVyIHRvIGFjY2VwdCB0b3RhbGx5IG1pc3NpbmcgcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAiZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jc3RyaW5nIG9mIGEgZnVuY3Rpb24gdGhhdCBoYXMgIgorICAgICAgICAgICAgICAgICJwYXJhbWV0ZXJzLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiYWNjZXB0LW5vLXJhaXNlLWRvYyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBUcnVlLAorICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eSBvciBuPiIsCisgICAgICAgICAgICAgICAgImhlbHAiOiAiV2hldGhlciB0byBhY2NlcHQgdG90YWxseSBtaXNzaW5nIHJhaXNlcyAiCisgICAgICAgICAgICAgICAgImRvY3VtZW50YXRpb24gaW4gdGhlIGRvY3N0cmluZyBvZiBhIGZ1bmN0aW9uIHRoYXQgIgorICAgICAgICAgICAgICAgICJyYWlzZXMgYW4gZXhjZXB0aW9uLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiYWNjZXB0LW5vLXJldHVybi1kb2MiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJ5biIsCisgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHkgb3Igbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogIldoZXRoZXIgdG8gYWNjZXB0IHRvdGFsbHkgbWlzc2luZyByZXR1cm4gIgorICAgICAgICAgICAgICAgICJkb2N1bWVudGF0aW9uIGluIHRoZSBkb2NzdHJpbmcgb2YgYSBmdW5jdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAicmV0dXJucyBhIHN0YXRlbWVudC4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgImFjY2VwdC1uby15aWVsZHMtZG9jIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IFRydWUsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5IG9yIG4+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJXaGV0aGVyIHRvIGFjY2VwdCB0b3RhbGx5IG1pc3NpbmcgeWllbGRzICIKKyAgICAgICAgICAgICAgICAiZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jc3RyaW5nIG9mIGEgZ2VuZXJhdG9yLiIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICAiZGVmYXVsdC1kb2NzdHJpbmctdHlwZSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAiY2hvaWNlIiwKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAiY2hvaWNlcyI6IGxpc3QodXRpbHMuRE9DU1RSSU5HX1RZUEVTKSwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJJZiB0aGUgZG9jc3RyaW5nIHR5cGUgY2Fubm90IGJlIGd1ZXNzZWQgIgorICAgICAgICAgICAgICAgICJ0aGUgc3BlY2lmaWVkIGRvY3N0cmluZyB0eXBlIHdpbGwgYmUgdXNlZC4iLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBwcmlvcml0eSA9IC0yCisKKyAgICBjb25zdHJ1Y3Rvcl9uYW1lcyA9IHsiX19pbml0X18iLCAiX19uZXdfXyJ9CisgICAgbm90X25lZWRlZF9wYXJhbV9pbl9kb2NzdHJpbmcgPSB7InNlbGYiLCAiY2xzIn0KKworICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2FsbGVkIGZvciBmdW5jdGlvbiBhbmQgbWV0aG9kIGRlZmluaXRpb25zIChkZWYpLgorCisgICAgICAgIDpwYXJhbSBub2RlOiBOb2RlIGZvciBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBkZWZpbml0aW9uIGluIHRoZSBBU1QKKyAgICAgICAgOnR5cGUgbm9kZTogOmNsYXNzOmBhc3Ryb2lkLnNjb3BlZF9ub2Rlcy5GdW5jdGlvbmAKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGVfZG9jID0gdXRpbHMuZG9jc3RyaW5naWZ5KG5vZGUuZG9jLCBzZWxmLmNvbmZpZy5kZWZhdWx0X2RvY3N0cmluZ190eXBlKQorCisgICAgICAgICMgc2tpcCBmdW5jdGlvbnMgdGhhdCBtYXRjaCB0aGUgJ25vLWRvY3N0cmluZy1yZ3gnIGNvbmZpZyBvcHRpb24KKyAgICAgICAgbm9fZG9jc3RyaW5nX3JneCA9IGdldF9nbG9iYWxfb3B0aW9uKHNlbGYsICJuby1kb2NzdHJpbmctcmd4IikKKyAgICAgICAgaWYgbm9fZG9jc3RyaW5nX3JneCBhbmQgcmUubWF0Y2gobm9fZG9jc3RyaW5nX3JneCwgbm9kZS5uYW1lKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgc2tpcCBmdW5jdGlvbnMgc21hbGxlciB0aGFuICdkb2NzdHJpbmctbWluLWxlbmd0aCcKKyAgICAgICAgbGluZXMgPSBjaGVja2VyX3V0aWxzLmdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUpIC0gbm9kZS5saW5lbm8KKyAgICAgICAgbWF4X2xpbmVzID0gZ2V0X2dsb2JhbF9vcHRpb24oc2VsZiwgImRvY3N0cmluZy1taW4tbGVuZ3RoIikKKyAgICAgICAgaWYgbWF4X2xpbmVzID4gLTEgYW5kIGxpbmVzIDwgbWF4X2xpbmVzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5jaGVja19mdW5jdGlvbmRlZl9wYXJhbXMobm9kZSwgbm9kZV9kb2MpCisgICAgICAgIHNlbGYuY2hlY2tfZnVuY3Rpb25kZWZfcmV0dXJucyhub2RlLCBub2RlX2RvYykKKyAgICAgICAgc2VsZi5jaGVja19mdW5jdGlvbmRlZl95aWVsZHMobm9kZSwgbm9kZV9kb2MpCisKKyAgICBkZWYgY2hlY2tfZnVuY3Rpb25kZWZfcGFyYW1zKHNlbGYsIG5vZGUsIG5vZGVfZG9jKToKKyAgICAgICAgbm9kZV9hbGxvd19ub19wYXJhbSA9IE5vbmUKKyAgICAgICAgaWYgbm9kZS5uYW1lIGluIHNlbGYuY29uc3RydWN0b3JfbmFtZXM6CisgICAgICAgICAgICBjbGFzc19ub2RlID0gY2hlY2tlcl91dGlscy5ub2RlX2ZyYW1lX2NsYXNzKG5vZGUpCisgICAgICAgICAgICBpZiBjbGFzc19ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNsYXNzX2RvYyA9IHV0aWxzLmRvY3N0cmluZ2lmeSgKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nfbm9kZS5kb2MsIHNlbGYuY29uZmlnLmRlZmF1bHRfZG9jc3RyaW5nX3R5cGUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zaW5nbGVfY29uc3RydWN0b3JfcGFyYW1zKGNsYXNzX2RvYywgbm9kZV9kb2MsIGNsYXNzX25vZGUpCisKKyAgICAgICAgICAgICAgICAjIF9faW5pdF9fIG9yIGNsYXNzIGRvY3N0cmluZ3MgY2FuIGhhdmUgbm8gcGFyYW1ldGVycyBkb2N1bWVudGVkCisgICAgICAgICAgICAgICAgIyBhcyBsb25nIGFzIHRoZSBvdGhlciBkb2N1bWVudHMgdGhlbS4KKyAgICAgICAgICAgICAgICBub2RlX2FsbG93X25vX3BhcmFtID0gKAorICAgICAgICAgICAgICAgICAgICBjbGFzc19kb2MuaGFzX3BhcmFtcygpCisgICAgICAgICAgICAgICAgICAgIG9yIGNsYXNzX2RvYy5wYXJhbXNfZG9jdW1lbnRlZF9lbHNld2hlcmUoKQorICAgICAgICAgICAgICAgICAgICBvciBOb25lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGNsYXNzX2FsbG93X25vX3BhcmFtID0gKAorICAgICAgICAgICAgICAgICAgICBub2RlX2RvYy5oYXNfcGFyYW1zKCkKKyAgICAgICAgICAgICAgICAgICAgb3Igbm9kZV9kb2MucGFyYW1zX2RvY3VtZW50ZWRfZWxzZXdoZXJlKCkKKyAgICAgICAgICAgICAgICAgICAgb3IgTm9uZQorICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfYXJndW1lbnRzX2luX2RvY3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NfZG9jLCBub2RlLmFyZ3MsIGNsYXNzX25vZGUsIGNsYXNzX2FsbG93X25vX3BhcmFtCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuY2hlY2tfYXJndW1lbnRzX2luX2RvY3N0cmluZygKKyAgICAgICAgICAgIG5vZGVfZG9jLCBub2RlLmFyZ3MsIG5vZGUsIG5vZGVfYWxsb3dfbm9fcGFyYW0KKyAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX2Z1bmN0aW9uZGVmX3JldHVybnMoc2VsZiwgbm9kZSwgbm9kZV9kb2MpOgorICAgICAgICBpZiAobm90IG5vZGVfZG9jLnN1cHBvcnRzX3lpZWxkcyBhbmQgbm9kZS5pc19nZW5lcmF0b3IoKSkgb3Igbm9kZS5pc19hYnN0cmFjdCgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcmV0dXJuX25vZGVzID0gbm9kZS5ub2Rlc19vZl9jbGFzcyhhc3Ryb2lkLlJldHVybikKKyAgICAgICAgaWYgKG5vZGVfZG9jLmhhc19yZXR1cm5zKCkgb3Igbm9kZV9kb2MuaGFzX3J0eXBlKCkpIGFuZCBub3QgYW55KAorICAgICAgICAgICAgdXRpbHMucmV0dXJuc19zb21ldGhpbmcocmV0X25vZGUpIGZvciByZXRfbm9kZSBpbiByZXR1cm5fbm9kZXMKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJlZHVuZGFudC1yZXR1cm5zLWRvYyIsIG5vZGU9bm9kZSkKKworICAgIGRlZiBjaGVja19mdW5jdGlvbmRlZl95aWVsZHMoc2VsZiwgbm9kZSwgbm9kZV9kb2MpOgorICAgICAgICBpZiBub3Qgbm9kZV9kb2Muc3VwcG9ydHNfeWllbGRzIG9yIG5vZGUuaXNfYWJzdHJhY3QoKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIG5vZGVfZG9jLmhhc195aWVsZHMoKSBvciBub2RlX2RvYy5oYXNfeWllbGRzX3R5cGUoKQorICAgICAgICApIGFuZCBub3Qgbm9kZS5pc19nZW5lcmF0b3IoKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJlZHVuZGFudC15aWVsZHMtZG9jIiwgbm9kZT1ub2RlKQorCisgICAgZGVmIHZpc2l0X3JhaXNlKHNlbGYsIG5vZGUpOgorICAgICAgICBmdW5jX25vZGUgPSBub2RlLmZyYW1lKCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZnVuY19ub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGV4cGVjdGVkX2V4Y3MgPSB1dGlscy5wb3NzaWJsZV9leGNfdHlwZXMobm9kZSkKKworICAgICAgICBpZiBub3QgZXhwZWN0ZWRfZXhjczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBmdW5jX25vZGUuZG9jOgorICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGEgcHJvcGVydHkgc2V0dGVyLAorICAgICAgICAgICAgIyB0aGUgcHJvcGVydHkgc2hvdWxkIGhhdmUgdGhlIGRvY3N0cmluZyBpbnN0ZWFkLgorICAgICAgICAgICAgcHJvcGVydHlfID0gdXRpbHMuZ2V0X3NldHRlcnNfcHJvcGVydHkoZnVuY19ub2RlKQorICAgICAgICAgICAgaWYgcHJvcGVydHlfOgorICAgICAgICAgICAgICAgIGZ1bmNfbm9kZSA9IHByb3BlcnR5XworCisgICAgICAgIGRvYyA9IHV0aWxzLmRvY3N0cmluZ2lmeShmdW5jX25vZGUuZG9jLCBzZWxmLmNvbmZpZy5kZWZhdWx0X2RvY3N0cmluZ190eXBlKQorICAgICAgICBpZiBub3QgZG9jLmlzX3ZhbGlkKCk6CisgICAgICAgICAgICBpZiBkb2MuZG9jOgorICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9ub19yYWlzZV9kb2MoZXhwZWN0ZWRfZXhjcywgZnVuY19ub2RlKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm91bmRfZXhjc19mdWxsX25hbWVzID0gZG9jLmV4Y2VwdGlvbnMoKQorCisgICAgICAgICMgRXh0cmFjdCBqdXN0IHRoZSBjbGFzcyBuYW1lLCBlLmcuICJlcnJvciIgZnJvbSAicmUuZXJyb3IiCisgICAgICAgIGZvdW5kX2V4Y3NfY2xhc3NfbmFtZXMgPSB7ZXhjLnNwbGl0KCIuIilbLTFdIGZvciBleGMgaW4gZm91bmRfZXhjc19mdWxsX25hbWVzfQorICAgICAgICBtaXNzaW5nX2V4Y3MgPSBleHBlY3RlZF9leGNzIC0gZm91bmRfZXhjc19jbGFzc19uYW1lcworICAgICAgICBzZWxmLl9hZGRfcmFpc2VfbWVzc2FnZShtaXNzaW5nX2V4Y3MsIGZ1bmNfbm9kZSkKKworICAgIGRlZiB2aXNpdF9yZXR1cm4oc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCB1dGlscy5yZXR1cm5zX3NvbWV0aGluZyhub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZ1bmNfbm9kZSA9IG5vZGUuZnJhbWUoKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jX25vZGUsIGFzdHJvaWQuRnVuY3Rpb25EZWYpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZG9jID0gdXRpbHMuZG9jc3RyaW5naWZ5KGZ1bmNfbm9kZS5kb2MsIHNlbGYuY29uZmlnLmRlZmF1bHRfZG9jc3RyaW5nX3R5cGUpCisgICAgICAgIGlmIG5vdCBkb2MuaXNfdmFsaWQoKSBhbmQgc2VsZi5jb25maWcuYWNjZXB0X25vX3JldHVybl9kb2M6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpc19wcm9wZXJ0eSA9IGNoZWNrZXJfdXRpbHMuZGVjb3JhdGVkX3dpdGhfcHJvcGVydHkoZnVuY19ub2RlKQorCisgICAgICAgIGlmIG5vdCAoZG9jLmhhc19yZXR1cm5zKCkgb3IgKGRvYy5oYXNfcHJvcGVydHlfcmV0dXJucygpIGFuZCBpc19wcm9wZXJ0eSkpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgibWlzc2luZy1yZXR1cm4tZG9jIiwgbm9kZT1mdW5jX25vZGUpCisKKyAgICAgICAgaWYgZnVuY19ub2RlLnJldHVybnM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgKGRvYy5oYXNfcnR5cGUoKSBvciAoZG9jLmhhc19wcm9wZXJ0eV90eXBlKCkgYW5kIGlzX3Byb3BlcnR5KSk6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJtaXNzaW5nLXJldHVybi10eXBlLWRvYyIsIG5vZGU9ZnVuY19ub2RlKQorCisgICAgZGVmIHZpc2l0X3lpZWxkKHNlbGYsIG5vZGUpOgorICAgICAgICBmdW5jX25vZGUgPSBub2RlLmZyYW1lKCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZnVuY19ub2RlLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRvYyA9IHV0aWxzLmRvY3N0cmluZ2lmeShmdW5jX25vZGUuZG9jLCBzZWxmLmNvbmZpZy5kZWZhdWx0X2RvY3N0cmluZ190eXBlKQorICAgICAgICBpZiBub3QgZG9jLmlzX3ZhbGlkKCkgYW5kIHNlbGYuY29uZmlnLmFjY2VwdF9ub195aWVsZHNfZG9jOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgZG9jLnN1cHBvcnRzX3lpZWxkczoKKyAgICAgICAgICAgIGRvY19oYXNfeWllbGRzID0gZG9jLmhhc195aWVsZHMoKQorICAgICAgICAgICAgZG9jX2hhc195aWVsZHNfdHlwZSA9IGRvYy5oYXNfeWllbGRzX3R5cGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jX2hhc195aWVsZHMgPSBkb2MuaGFzX3JldHVybnMoKQorICAgICAgICAgICAgZG9jX2hhc195aWVsZHNfdHlwZSA9IGRvYy5oYXNfcnR5cGUoKQorCisgICAgICAgIGlmIG5vdCBkb2NfaGFzX3lpZWxkczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm1pc3NpbmcteWllbGQtZG9jIiwgbm9kZT1mdW5jX25vZGUpCisKKyAgICAgICAgaWYgbm90IChkb2NfaGFzX3lpZWxkc190eXBlIG9yIGZ1bmNfbm9kZS5yZXR1cm5zKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoIm1pc3NpbmcteWllbGQtdHlwZS1kb2MiLCBub2RlPWZ1bmNfbm9kZSkKKworICAgIGRlZiB2aXNpdF95aWVsZGZyb20oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXRfeWllbGQobm9kZSkKKworICAgIGRlZiBfY29tcGFyZV9taXNzaW5nX2FyZ3MoCisgICAgICAgIHNlbGYsCisgICAgICAgIGZvdW5kX2FyZ3VtZW50X25hbWVzLAorICAgICAgICBtZXNzYWdlX2lkLAorICAgICAgICBub3RfbmVlZGVkX25hbWVzLAorICAgICAgICBleHBlY3RlZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgd2FybmluZ19ub2RlLAorICAgICk6CisgICAgICAgICIiIkNvbXBhcmUgdGhlIGZvdW5kIGFyZ3VtZW50IG5hbWVzIHdpdGggdGhlIGV4cGVjdGVkIG9uZXMgYW5kCisgICAgICAgIGdlbmVyYXRlIGEgbWVzc2FnZSBpZiB0aGVyZSBhcmUgYXJndW1lbnRzIG1pc3NpbmcuCisKKyAgICAgICAgOnBhcmFtIGZvdW5kX2FyZ3VtZW50X25hbWVzOiBhcmd1bWVudCBuYW1lcyBmb3VuZCBpbiB0aGUgZG9jc3RyaW5nCisgICAgICAgIDp0eXBlIGZvdW5kX2FyZ3VtZW50X25hbWVzOiBzZXQKKworICAgICAgICA6cGFyYW0gbWVzc2FnZV9pZDogcHlsaW50IG1lc3NhZ2UgaWQKKyAgICAgICAgOnR5cGUgbWVzc2FnZV9pZDogc3RyCisKKyAgICAgICAgOnBhcmFtIG5vdF9uZWVkZWRfbmFtZXM6IG5hbWVzIHRoYXQgbWF5IGJlIG9taXR0ZWQKKyAgICAgICAgOnR5cGUgbm90X25lZWRlZF9uYW1lczogc2V0CisKKyAgICAgICAgOnBhcmFtIGV4cGVjdGVkX2FyZ3VtZW50X25hbWVzOiBFeHBlY3RlZCBhcmd1bWVudCBuYW1lcworICAgICAgICA6dHlwZSBleHBlY3RlZF9hcmd1bWVudF9uYW1lczogc2V0CisKKyAgICAgICAgOnBhcmFtIHdhcm5pbmdfbm9kZTogVGhlIG5vZGUgdG8gYmUgYW5hbHl6ZWQKKyAgICAgICAgOnR5cGUgd2FybmluZ19ub2RlOiA6Y2xhc3M6YGFzdHJvaWQuc2NvcGVkX25vZGVzLk5vZGVgCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nX2FyZ3VtZW50X25hbWVzID0gKAorICAgICAgICAgICAgZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXMgLSBmb3VuZF9hcmd1bWVudF9uYW1lcworICAgICAgICApIC0gbm90X25lZWRlZF9uYW1lcworICAgICAgICBpZiBtaXNzaW5nX2FyZ3VtZW50X25hbWVzOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlX2lkLAorICAgICAgICAgICAgICAgIGFyZ3M9KCIsICIuam9pbihzb3J0ZWQobWlzc2luZ19hcmd1bWVudF9uYW1lcykpLCksCisgICAgICAgICAgICAgICAgbm9kZT13YXJuaW5nX25vZGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NvbXBhcmVfZGlmZmVyZW50X2FyZ3MoCisgICAgICAgIHNlbGYsCisgICAgICAgIGZvdW5kX2FyZ3VtZW50X25hbWVzLAorICAgICAgICBtZXNzYWdlX2lkLAorICAgICAgICBub3RfbmVlZGVkX25hbWVzLAorICAgICAgICBleHBlY3RlZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgd2FybmluZ19ub2RlLAorICAgICk6CisgICAgICAgICIiIkNvbXBhcmUgdGhlIGZvdW5kIGFyZ3VtZW50IG5hbWVzIHdpdGggdGhlIGV4cGVjdGVkIG9uZXMgYW5kCisgICAgICAgIGdlbmVyYXRlIGEgbWVzc2FnZSBpZiB0aGVyZSBhcmUgZXh0cmEgYXJndW1lbnRzIGZvdW5kLgorCisgICAgICAgIDpwYXJhbSBmb3VuZF9hcmd1bWVudF9uYW1lczogYXJndW1lbnQgbmFtZXMgZm91bmQgaW4gdGhlIGRvY3N0cmluZworICAgICAgICA6dHlwZSBmb3VuZF9hcmd1bWVudF9uYW1lczogc2V0CisKKyAgICAgICAgOnBhcmFtIG1lc3NhZ2VfaWQ6IHB5bGludCBtZXNzYWdlIGlkCisgICAgICAgIDp0eXBlIG1lc3NhZ2VfaWQ6IHN0cgorCisgICAgICAgIDpwYXJhbSBub3RfbmVlZGVkX25hbWVzOiBuYW1lcyB0aGF0IG1heSBiZSBvbWl0dGVkCisgICAgICAgIDp0eXBlIG5vdF9uZWVkZWRfbmFtZXM6IHNldAorCisgICAgICAgIDpwYXJhbSBleHBlY3RlZF9hcmd1bWVudF9uYW1lczogRXhwZWN0ZWQgYXJndW1lbnQgbmFtZXMKKyAgICAgICAgOnR5cGUgZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXM6IHNldAorCisgICAgICAgIDpwYXJhbSB3YXJuaW5nX25vZGU6IFRoZSBub2RlIHRvIGJlIGFuYWx5emVkCisgICAgICAgIDp0eXBlIHdhcm5pbmdfbm9kZTogOmNsYXNzOmBhc3Ryb2lkLnNjb3BlZF9ub2Rlcy5Ob2RlYAorICAgICAgICAiIiIKKyAgICAgICAgZGlmZmVyaW5nX2FyZ3VtZW50X25hbWVzID0gKAorICAgICAgICAgICAgKGV4cGVjdGVkX2FyZ3VtZW50X25hbWVzIF4gZm91bmRfYXJndW1lbnRfbmFtZXMpCisgICAgICAgICAgICAtIG5vdF9uZWVkZWRfbmFtZXMKKyAgICAgICAgICAgIC0gZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXMKKyAgICAgICAgKQorCisgICAgICAgIGlmIGRpZmZlcmluZ19hcmd1bWVudF9uYW1lczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZV9pZCwKKyAgICAgICAgICAgICAgICBhcmdzPSgiLCAiLmpvaW4oc29ydGVkKGRpZmZlcmluZ19hcmd1bWVudF9uYW1lcykpLCksCisgICAgICAgICAgICAgICAgbm9kZT13YXJuaW5nX25vZGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgX2NvbXBhcmVfaWdub3JlZF9hcmdzKAorICAgICAgICBzZWxmLAorICAgICAgICBmb3VuZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgbWVzc2FnZV9pZCwKKyAgICAgICAgaWdub3JlZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgd2FybmluZ19ub2RlLAorICAgICk6CisgICAgICAgICIiIkNvbXBhcmUgdGhlIGZvdW5kIGFyZ3VtZW50IG5hbWVzIHdpdGggdGhlIGlnbm9yZWQgb25lcyBhbmQKKyAgICAgICAgZ2VuZXJhdGUgYSBtZXNzYWdlIGlmIHRoZXJlIGFyZSBpZ25vcmVkIGFyZ3VtZW50cyBmb3VuZC4KKworICAgICAgICA6cGFyYW0gZm91bmRfYXJndW1lbnRfbmFtZXM6IGFyZ3VtZW50IG5hbWVzIGZvdW5kIGluIHRoZSBkb2NzdHJpbmcKKyAgICAgICAgOnR5cGUgZm91bmRfYXJndW1lbnRfbmFtZXM6IHNldAorCisgICAgICAgIDpwYXJhbSBtZXNzYWdlX2lkOiBweWxpbnQgbWVzc2FnZSBpZAorICAgICAgICA6dHlwZSBtZXNzYWdlX2lkOiBzdHIKKworICAgICAgICA6cGFyYW0gaWdub3JlZF9hcmd1bWVudF9uYW1lczogRXhwZWN0ZWQgYXJndW1lbnQgbmFtZXMKKyAgICAgICAgOnR5cGUgaWdub3JlZF9hcmd1bWVudF9uYW1lczogc2V0CisKKyAgICAgICAgOnBhcmFtIHdhcm5pbmdfbm9kZTogVGhlIG5vZGUgdG8gYmUgYW5hbHl6ZWQKKyAgICAgICAgOnR5cGUgd2FybmluZ19ub2RlOiA6Y2xhc3M6YGFzdHJvaWQuc2NvcGVkX25vZGVzLk5vZGVgCisgICAgICAgICIiIgorICAgICAgICBleGlzdGluZ19pZ25vcmVkX2FyZ3VtZW50X25hbWVzID0gaWdub3JlZF9hcmd1bWVudF9uYW1lcyAmIGZvdW5kX2FyZ3VtZW50X25hbWVzCisKKyAgICAgICAgaWYgZXhpc3RpbmdfaWdub3JlZF9hcmd1bWVudF9uYW1lczoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZV9pZCwKKyAgICAgICAgICAgICAgICBhcmdzPSgiLCAiLmpvaW4oc29ydGVkKGV4aXN0aW5nX2lnbm9yZWRfYXJndW1lbnRfbmFtZXMpKSwpLAorICAgICAgICAgICAgICAgIG5vZGU9d2FybmluZ19ub2RlLAorICAgICAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX2FyZ3VtZW50c19pbl9kb2NzdHJpbmcoCisgICAgICAgIHNlbGYsIGRvYywgYXJndW1lbnRzX25vZGUsIHdhcm5pbmdfbm9kZSwgYWNjZXB0X25vX3BhcmFtX2RvYz1Ob25lCisgICAgKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhbGwgcGFyYW1ldGVycyBpbiBhIGZ1bmN0aW9uLCBtZXRob2Qgb3IgY2xhc3MgY29uc3RydWN0b3IKKyAgICAgICAgb24gdGhlIG9uZSBoYW5kIGFuZCB0aGUgcGFyYW1ldGVycyBtZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlcgorICAgICAgICBkb2N1bWVudGF0aW9uIChlLmcuIHRoZSBTcGhpbnggdGFncyAncGFyYW0nIGFuZCAndHlwZScpIG9uIHRoZSBvdGhlcgorICAgICAgICBoYW5kIGFyZSBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4KKworICAgICAgICAqIFVuZG9jdW1lbnRlZCBwYXJhbWV0ZXJzIGV4Y2VwdCAnc2VsZicgYXJlIG5vdGljZWQuCisgICAgICAgICogVW5kb2N1bWVudGVkIHBhcmFtZXRlciB0eXBlcyBleGNlcHQgZm9yICdzZWxmJyBhbmQgdGhlIGBgKjxhcmdzPmBgCisgICAgICAgICAgYW5kIGBgKio8a3dhcmdzPmBgIHBhcmFtZXRlcnMgYXJlIG5vdGljZWQuCisgICAgICAgICogUGFyYW1ldGVycyBtZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uIHRoYXQgZG9uJ3Qgb3Igbm8KKyAgICAgICAgICBsb25nZXIgZXhpc3QgaW4gdGhlIGZ1bmN0aW9uIHBhcmFtZXRlciBsaXN0IGFyZSBub3RpY2VkLgorICAgICAgICAqIElmIHRoZSB0ZXh0ICJGb3IgdGhlIHBhcmFtZXRlcnMsIHNlZSIgb3IgIkZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywKKyAgICAgICAgICBzZWUiIChpZ25vcmluZyBhZGRpdGlvbmFsIHdoaXRlc3BhY2UpIGlzIG1lbnRpb25lZCBpbiB0aGUgZG9jc3RyaW5nLAorICAgICAgICAgIG1pc3NpbmcgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24gaXMgdG9sZXJhdGVkLgorICAgICAgICAqIElmIHRoZXJlJ3Mgbm8gU3BoaW54IHN0eWxlLCBHb29nbGUgc3R5bGUgb3IgTnVtUHkgc3R5bGUgcGFyYW1ldGVyCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiBhdCBhbGwsIGkuZS4gYGA6cGFyYW1gYCBpcyBuZXZlciBtZW50aW9uZWQgZXRjLiwgdGhlCisgICAgICAgICAgY2hlY2tlciBhc3N1bWVzIHRoYXQgdGhlIHBhcmFtZXRlcnMgYXJlIGRvY3VtZW50ZWQgaW4gYW5vdGhlciBmb3JtYXQKKyAgICAgICAgICBhbmQgdGhlIGFic2VuY2UgaXMgdG9sZXJhdGVkLgorCisgICAgICAgIDpwYXJhbSBkb2M6IERvY3N0cmluZyBmb3IgdGhlIGZ1bmN0aW9uLCBtZXRob2Qgb3IgY2xhc3MuCisgICAgICAgIDp0eXBlIGRvYzogOmNsYXNzOmBEb2NzdHJpbmdgCisKKyAgICAgICAgOnBhcmFtIGFyZ3VtZW50c19ub2RlOiBBcmd1bWVudHMgbm9kZSBmb3IgdGhlIGZ1bmN0aW9uLCBtZXRob2Qgb3IKKyAgICAgICAgICAgIGNsYXNzIGNvbnN0cnVjdG9yLgorICAgICAgICA6dHlwZSBhcmd1bWVudHNfbm9kZTogOmNsYXNzOmBhc3Ryb2lkLnNjb3BlZF9ub2Rlcy5Bcmd1bWVudHNgCisKKyAgICAgICAgOnBhcmFtIHdhcm5pbmdfbm9kZTogVGhlIG5vZGUgdG8gYXNzaWduIHRoZSB3YXJuaW5ncyB0bworICAgICAgICA6dHlwZSB3YXJuaW5nX25vZGU6IDpjbGFzczpgYXN0cm9pZC5zY29wZWRfbm9kZXMuTm9kZWAKKworICAgICAgICA6cGFyYW0gYWNjZXB0X25vX3BhcmFtX2RvYzogV2hldGhlciBvciBub3QgdG8gYWxsb3cgbm8gcGFyYW1ldGVycworICAgICAgICAgICAgdG8gYmUgZG9jdW1lbnRlZC4KKyAgICAgICAgICAgIElmIE5vbmUgdGhlbiB0aGlzIHZhbHVlIGlzIHJlYWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgOnR5cGUgYWNjZXB0X25vX3BhcmFtX2RvYzogYm9vbCBvciBOb25lCisgICAgICAgICIiIgorICAgICAgICAjIFRvbGVyYXRlIG1pc3NpbmcgcGFyYW0gb3IgdHlwZSBkZWNsYXJhdGlvbnMgaWYgdGhlcmUgaXMgYSBsaW5rIHRvCisgICAgICAgICMgYW5vdGhlciBtZXRob2QgY2FycnlpbmcgdGhlIHNhbWUgbmFtZS4KKyAgICAgICAgaWYgbm90IGRvYy5kb2M6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBhY2NlcHRfbm9fcGFyYW1fZG9jIGlzIE5vbmU6CisgICAgICAgICAgICBhY2NlcHRfbm9fcGFyYW1fZG9jID0gc2VsZi5jb25maWcuYWNjZXB0X25vX3BhcmFtX2RvYworICAgICAgICB0b2xlcmF0ZV9taXNzaW5nX3BhcmFtcyA9IGRvYy5wYXJhbXNfZG9jdW1lbnRlZF9lbHNld2hlcmUoKQorCisgICAgICAgICMgQ29sbGVjdCB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLgorICAgICAgICBleHBlY3RlZF9hcmd1bWVudF9uYW1lcyA9IHthcmcubmFtZSBmb3IgYXJnIGluIGFyZ3VtZW50c19ub2RlLmFyZ3N9CisgICAgICAgIGV4cGVjdGVkX2FyZ3VtZW50X25hbWVzLnVwZGF0ZShhcmcubmFtZSBmb3IgYXJnIGluIGFyZ3VtZW50c19ub2RlLmt3b25seWFyZ3MpCisgICAgICAgIG5vdF9uZWVkZWRfdHlwZV9pbl9kb2NzdHJpbmcgPSBzZWxmLm5vdF9uZWVkZWRfcGFyYW1faW5fZG9jc3RyaW5nLmNvcHkoKQorCisgICAgICAgIGV4cGVjdGVkX2J1dF9pZ25vcmVkX2FyZ3VtZW50X25hbWVzID0gc2V0KCkKKyAgICAgICAgaWdub3JlZF9hcmd1bWVudF9uYW1lcyA9IGdldF9nbG9iYWxfb3B0aW9uKHNlbGYsICJpZ25vcmVkLWFyZ3VtZW50LW5hbWVzIikKKyAgICAgICAgaWYgaWdub3JlZF9hcmd1bWVudF9uYW1lczoKKyAgICAgICAgICAgIGV4cGVjdGVkX2J1dF9pZ25vcmVkX2FyZ3VtZW50X25hbWVzID0geworICAgICAgICAgICAgICAgIGFyZworICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXMKKyAgICAgICAgICAgICAgICBpZiBpZ25vcmVkX2FyZ3VtZW50X25hbWVzLm1hdGNoKGFyZykKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiBhcmd1bWVudHNfbm9kZS52YXJhcmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBleHBlY3RlZF9hcmd1bWVudF9uYW1lcy5hZGQoYXJndW1lbnRzX25vZGUudmFyYXJnKQorICAgICAgICAgICAgbm90X25lZWRlZF90eXBlX2luX2RvY3N0cmluZy5hZGQoYXJndW1lbnRzX25vZGUudmFyYXJnKQorICAgICAgICBpZiBhcmd1bWVudHNfbm9kZS5rd2FyZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGV4cGVjdGVkX2FyZ3VtZW50X25hbWVzLmFkZChhcmd1bWVudHNfbm9kZS5rd2FyZykKKyAgICAgICAgICAgIG5vdF9uZWVkZWRfdHlwZV9pbl9kb2NzdHJpbmcuYWRkKGFyZ3VtZW50c19ub2RlLmt3YXJnKQorICAgICAgICBwYXJhbXNfd2l0aF9kb2MsIHBhcmFtc193aXRoX3R5cGUgPSBkb2MubWF0Y2hfcGFyYW1fZG9jcygpCisKKyAgICAgICAgIyBUb2xlcmF0ZSBubyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiBhdCBhbGwuCisgICAgICAgIGlmIG5vdCBwYXJhbXNfd2l0aF9kb2MgYW5kIG5vdCBwYXJhbXNfd2l0aF90eXBlIGFuZCBhY2NlcHRfbm9fcGFyYW1fZG9jOgorICAgICAgICAgICAgdG9sZXJhdGVfbWlzc2luZ19wYXJhbXMgPSBUcnVlCisKKyAgICAgICAgaWYgbm90IHRvbGVyYXRlX21pc3NpbmdfcGFyYW1zOgorICAgICAgICAgICAgc2VsZi5fY29tcGFyZV9taXNzaW5nX2FyZ3MoCisgICAgICAgICAgICAgICAgcGFyYW1zX3dpdGhfZG9jLAorICAgICAgICAgICAgICAgICJtaXNzaW5nLXBhcmFtLWRvYyIsCisgICAgICAgICAgICAgICAgc2VsZi5ub3RfbmVlZGVkX3BhcmFtX2luX2RvY3N0cmluZworICAgICAgICAgICAgICAgIHwgZXhwZWN0ZWRfYnV0X2lnbm9yZWRfYXJndW1lbnRfbmFtZXMsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXMsCisgICAgICAgICAgICAgICAgd2FybmluZ19ub2RlLAorICAgICAgICAgICAgKQorCisgICAgICAgIGZvciBpbmRleCwgYXJnX25hbWUgaW4gZW51bWVyYXRlKGFyZ3VtZW50c19ub2RlLmFyZ3MpOgorICAgICAgICAgICAgaWYgYXJndW1lbnRzX25vZGUuYW5ub3RhdGlvbnNbaW5kZXhdOgorICAgICAgICAgICAgICAgIHBhcmFtc193aXRoX3R5cGUuYWRkKGFyZ19uYW1lLm5hbWUpCisgICAgICAgIGZvciBpbmRleCwgYXJnX25hbWUgaW4gZW51bWVyYXRlKGFyZ3VtZW50c19ub2RlLmt3b25seWFyZ3MpOgorICAgICAgICAgICAgaWYgYXJndW1lbnRzX25vZGUua3dvbmx5YXJnc19hbm5vdGF0aW9uc1tpbmRleF06CisgICAgICAgICAgICAgICAgcGFyYW1zX3dpdGhfdHlwZS5hZGQoYXJnX25hbWUubmFtZSkKKworICAgICAgICBpZiBub3QgdG9sZXJhdGVfbWlzc2luZ19wYXJhbXM6CisgICAgICAgICAgICBzZWxmLl9jb21wYXJlX21pc3NpbmdfYXJncygKKyAgICAgICAgICAgICAgICBwYXJhbXNfd2l0aF90eXBlLAorICAgICAgICAgICAgICAgICJtaXNzaW5nLXR5cGUtZG9jIiwKKyAgICAgICAgICAgICAgICBub3RfbmVlZGVkX3R5cGVfaW5fZG9jc3RyaW5nIHwgZXhwZWN0ZWRfYnV0X2lnbm9yZWRfYXJndW1lbnRfbmFtZXMsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXMsCisgICAgICAgICAgICAgICAgd2FybmluZ19ub2RlLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX2NvbXBhcmVfZGlmZmVyZW50X2FyZ3MoCisgICAgICAgICAgICBwYXJhbXNfd2l0aF9kb2MsCisgICAgICAgICAgICAiZGlmZmVyaW5nLXBhcmFtLWRvYyIsCisgICAgICAgICAgICBzZWxmLm5vdF9uZWVkZWRfcGFyYW1faW5fZG9jc3RyaW5nLAorICAgICAgICAgICAgZXhwZWN0ZWRfYXJndW1lbnRfbmFtZXMsCisgICAgICAgICAgICB3YXJuaW5nX25vZGUsCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fY29tcGFyZV9kaWZmZXJlbnRfYXJncygKKyAgICAgICAgICAgIHBhcmFtc193aXRoX3R5cGUsCisgICAgICAgICAgICAiZGlmZmVyaW5nLXR5cGUtZG9jIiwKKyAgICAgICAgICAgIG5vdF9uZWVkZWRfdHlwZV9pbl9kb2NzdHJpbmcsCisgICAgICAgICAgICBleHBlY3RlZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgICAgIHdhcm5pbmdfbm9kZSwKKyAgICAgICAgKQorICAgICAgICBzZWxmLl9jb21wYXJlX2lnbm9yZWRfYXJncygKKyAgICAgICAgICAgIHBhcmFtc193aXRoX2RvYywKKyAgICAgICAgICAgICJ1c2VsZXNzLXBhcmFtLWRvYyIsCisgICAgICAgICAgICBleHBlY3RlZF9idXRfaWdub3JlZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgICAgIHdhcm5pbmdfbm9kZSwKKyAgICAgICAgKQorICAgICAgICBzZWxmLl9jb21wYXJlX2lnbm9yZWRfYXJncygKKyAgICAgICAgICAgIHBhcmFtc193aXRoX3R5cGUsCisgICAgICAgICAgICAidXNlbGVzcy10eXBlLWRvYyIsCisgICAgICAgICAgICBleHBlY3RlZF9idXRfaWdub3JlZF9hcmd1bWVudF9uYW1lcywKKyAgICAgICAgICAgIHdhcm5pbmdfbm9kZSwKKyAgICAgICAgKQorCisgICAgZGVmIGNoZWNrX3NpbmdsZV9jb25zdHJ1Y3Rvcl9wYXJhbXMoc2VsZiwgY2xhc3NfZG9jLCBpbml0X2RvYywgY2xhc3Nfbm9kZSk6CisgICAgICAgIGlmIGNsYXNzX2RvYy5oYXNfcGFyYW1zKCkgYW5kIGluaXRfZG9jLmhhc19wYXJhbXMoKToKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgIm11bHRpcGxlLWNvbnN0cnVjdG9yLWRvYyIsIGFyZ3M9KGNsYXNzX25vZGUubmFtZSwpLCBub2RlPWNsYXNzX25vZGUKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfaGFuZGxlX25vX3JhaXNlX2RvYyhzZWxmLCBleGNzLCBub2RlKToKKyAgICAgICAgaWYgc2VsZi5jb25maWcuYWNjZXB0X25vX3JhaXNlX2RvYzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX2FkZF9yYWlzZV9tZXNzYWdlKGV4Y3MsIG5vZGUpCisKKyAgICBkZWYgX2FkZF9yYWlzZV9tZXNzYWdlKHNlbGYsIG1pc3NpbmdfZXhjcywgbm9kZSk6CisgICAgICAgICIiIgorICAgICAgICBBZGRzIGEgbWVzc2FnZSBvbiA6cGFyYW06YG5vZGVgIGZvciB0aGUgbWlzc2luZyBleGNlcHRpb24gdHlwZS4KKworICAgICAgICA6cGFyYW0gbWlzc2luZ19leGNzOiBBIGxpc3Qgb2YgbWlzc2luZyBleGNlcHRpb24gdHlwZXMuCisgICAgICAgIDp0eXBlIG1pc3NpbmdfZXhjczogc2V0KHN0cikKKworICAgICAgICA6cGFyYW0gbm9kZTogVGhlIG5vZGUgc2hvdyB0aGUgbWVzc2FnZSBvbi4KKyAgICAgICAgOnR5cGUgbm9kZTogYXN0cm9pZC5ub2RlX2NsYXNzZXMuTm9kZU5HCisgICAgICAgICIiIgorICAgICAgICBpZiBub2RlLmlzX2Fic3RyYWN0KCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWlzc2luZ19leGNzLnJlbW92ZSgiTm90SW1wbGVtZW50ZWRFcnJvciIpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIG5vdCBtaXNzaW5nX2V4Y3M6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgIm1pc3NpbmctcmFpc2VzLWRvYyIsIGFyZ3M9KCIsICIuam9pbihzb3J0ZWQobWlzc2luZ19leGNzKSksKSwgbm9kZT1ub2RlCisgICAgICAgICkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJSZXF1aXJlZCBtZXRob2QgdG8gYXV0byByZWdpc3RlciB0aGlzIGNoZWNrZXIuCisKKyAgICA6cGFyYW0gbGludGVyOiBNYWluIGludGVyZmFjZSBvYmplY3QgZm9yIFB5bGludCBwbHVnaW5zCisgICAgOnR5cGUgbGludGVyOiBQeWxpbnQgb2JqZWN0CisgICAgIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoRG9jc3RyaW5nUGFyYW1ldGVyQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvZG9jcGFyYW1zLnJzdCBiL3B5bGludC9leHRlbnNpb25zL2RvY3BhcmFtcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2YzRkYwotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL2RvY3BhcmFtcy5yc3QKQEAgLTAsMCArMSwxNTIgQEAKK0lmIHlvdSBkb2N1bWVudCB0aGUgcGFyYW1ldGVycyBvZiB5b3VyIGZ1bmN0aW9ucywgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIGFuZAordGhlaXIgdHlwZXMgc3lzdGVtYXRpY2FsbHkgaW4geW91ciBjb2RlIHRoaXMgb3B0aW9uYWwgY29tcG9uZW50IG1pZ2h0CitiZSB1c2VmdWwgZm9yIHlvdS4gU3BoaW54IHN0eWxlLCBHb29nbGUgc3R5bGUsIGFuZCBOdW1weSBzdHlsZSBhcmUgc3VwcG9ydGVkLgorKEZvciBzb21lIGV4YW1wbGVzLCBzZWUgaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9zcGhpbnhjb250cmliLW5hcG9sZW9uIC4pCisKK1lvdSBjYW4gYWN0aXZhdGUgdGhpcyBjaGVja2VyIGJ5IGFkZGluZyB0aGUgbGluZTo6CisKKyAgICBsb2FkLXBsdWdpbnM9cHlsaW50LmV4dGVuc2lvbnMuZG9jcGFyYW1zCisKK3RvIHRoZSBgYE1BU1RFUmBgIHNlY3Rpb24gb2YgeW91ciBgYC5weWxpbnRyY2BgLgorCitUaGlzIGNoZWNrZXIgdmVyaWZpZXMgdGhhdCBhbGwgZnVuY3Rpb24sIG1ldGhvZCwgYW5kIGNvbnN0cnVjdG9yIGRvY3N0cmluZ3MKK2luY2x1ZGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUKKworKiBwYXJhbWV0ZXJzIGFuZCB0aGVpciB0eXBlcworKiByZXR1cm4gdmFsdWUgYW5kIGl0cyB0eXBlCisqIGV4Y2VwdGlvbnMgcmFpc2VkCisKK2FuZCBjYW4gaGFuZGxlIGRvY3N0cmluZ3MgaW4KKworKiBTcGhpbnggc3R5bGUgKGBgcGFyYW1gYCwgYGB0eXBlYGAsIGBgcmV0dXJuYGAsIGBgcnR5cGVgYCwKKyAgYGByYWlzZWBgIC8gYGBleGNlcHRgYCk6OgorCisgICBkZWYgZnVuY3Rpb25fZm9vKHgsIHksIHopOgorICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgIDpwYXJhbSB4OiBibGEgeAorICAgICAgIDp0eXBlIHg6IGludAorCisgICAgICAgOnBhcmFtIHk6IGJsYSB5CisgICAgICAgOnR5cGUgeTogZmxvYXQKKworICAgICAgIDpwYXJhbSBpbnQgejogYmxhIHoKKworICAgICAgIDpyZXR1cm46IHN1bQorICAgICAgIDpydHlwZTogZmxvYXQKKworICAgICAgIDpyYWlzZXMgT1NFcnJvcjogYmxhCisgICAgICAgJycnCisgICAgICAgcmV0dXJuIHggKyB5ICsgegorCisqIG9yIHRoZSBHb29nbGUgc3R5bGUgKGBgQXJnczpgYCwgYGBSZXR1cm5zOmBgLCBgYFJhaXNlczpgYCk6OgorCisgICBkZWYgZnVuY3Rpb25fZm9vKHgsIHksIHopOgorICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgIEFyZ3M6CisgICAgICAgICAgIHggKGludCk6IGJsYSB4CisgICAgICAgICAgIHkgKGZsb2F0KTogYmxhIHkKKworICAgICAgICAgICB6IChpbnQpOiBibGEgegorCisgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgZmxvYXQ6IHN1bQorCisgICAgICAgUmFpc2VzOgorICAgICAgICAgICBPU0Vycm9yOiBibGEKKyAgICAgICAnJycKKyAgICAgICByZXR1cm4geCArIHkgKyB6CisKKyogb3IgdGhlIE51bXB5IHN0eWxlIChgYFBhcmFtZXRlcnNgYCwgYGBSZXR1cm5zYGAsIGBgUmFpc2VzYGApOjoKKworICAgZGVmIGZ1bmN0aW9uX2Zvbyh4LCB5LCB6KToKKyAgICAgICAnJydmdW5jdGlvbiBmb28gLi4uCisKKyAgICAgICBQYXJhbWV0ZXJzCisgICAgICAgLS0tLS0tLS0tLQorICAgICAgIHg6IGludAorICAgICAgICAgICBibGEgeAorICAgICAgIHk6IGZsb2F0CisgICAgICAgICAgIGJsYSB5CisKKyAgICAgICB6OiBpbnQKKyAgICAgICAgICAgYmxhIHoKKworICAgICAgIFJldHVybnMKKyAgICAgICAtLS0tLS0tCisgICAgICAgZmxvYXQKKyAgICAgICAgICAgc3VtCisKKyAgICAgICBSYWlzZXMKKyAgICAgICAtLS0tLS0KKyAgICAgICBPU0Vycm9yCisgICAgICAgICAgIGJsYQorICAgICAgICcnJworICAgICAgIHJldHVybiB4ICsgeSArIHoKKworCitZb3UnbGwgYmUgbm90aWZpZWQgb2YgKiptaXNzaW5nIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uKiogYnV0IGFsc28gb2YKKyoqbmFtaW5nIGluY29uc2lzdGVuY2llcyoqIGJldHdlZW4gdGhlIHNpZ25hdHVyZSBhbmQgdGhlIGRvY3VtZW50YXRpb24gd2hpY2gKK29mdGVuIGFyaXNlIHdoZW4gcGFyYW1ldGVycyBhcmUgcmVuYW1lZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBjb2RlLCBidXQgbm90IGluCit0aGUgZG9jdW1lbnRhdGlvbi4KKworQ29uc3RydWN0b3IgcGFyYW1ldGVycyBjYW4gYmUgZG9jdW1lbnRlZCBpbiBlaXRoZXIgdGhlIGNsYXNzIGRvY3N0cmluZyBvcgordGhlIGBgX19pbml0X19gYCBkb2NzdHJpbmcsIGJ1dCBub3QgYm90aDo6CisKKyAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAnJydTcGhpbnggc3R5bGUgZG9jc3RyaW5nIGZvbworCisgICAgICAgIDpwYXJhbSBmbG9hdCB4OiBibGEgeAorCisgICAgICAgIDpwYXJhbSB5OiBibGEgeQorICAgICAgICA6dHlwZSB5OiBpbnQKKyAgICAgICAgJycnCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGNsYXNzIENsYXNzQmFyKG9iamVjdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKKyAgICAgICAgICAgICcnJ0dvb2dsZSBzdHlsZSBkb2NzdHJpbmcgYmFyCisKKyAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgeCAoZmxvYXQpOiBibGEgeAorICAgICAgICAgICAgICAgIHkgKGludCk6IGJsYSB5CisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHBhc3MKKworSW4gc29tZSBjYXNlcywgaGF2aW5nIHRvIGRvY3VtZW50IGFsbCBwYXJhbWV0ZXJzIGlzIGEgbnVpc2FuY2UsIGZvciBpbnN0YW5jZSBpZgorbWFueSBvZiB5b3VyIGZ1bmN0aW9ucyBvciBtZXRob2RzIGp1c3QgZm9sbG93IGEgKipjb21tb24gaW50ZXJmYWNlKiouIFRvIHJlbW92ZQordGhpcyBidXJkZW4sIHRoZSBjaGVja2VyIGFjY2VwdHMgbWlzc2luZyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiBpZiBvbmUgb2YgdGhlCitmb2xsb3dpbmcgcGhyYXNlcyBpcyBmb3VuZCBpbiB0aGUgZG9jc3RyaW5nOgorCisqIEZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywgc2VlCisqIEZvciB0aGUgcGFyYW1ldGVycywgc2VlCisKKyh3aXRoIGFyYml0cmFyeSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIHdvcmRzKS4gUGxlYXNlIGFkZCBhIGxpbmsgdG8gdGhlCitkb2NzdHJpbmcgZGVmaW5pbmcgdGhlIGludGVyZmFjZSwgZS5nLiBhIHN1cGVyY2xhc3MgbWV0aG9kLCBhZnRlciAic2VlIjo6CisKKyAgIGRlZiBjYWxsYmFjayh4LCB5LCB6KToKKyAgICAgICAnJydTcGhpbnggc3R5bGUgZG9jc3RyaW5nIGZvciBjYWxsYmFjayAuLi4KKworICAgICAgIDpwYXJhbSB4OiBibGEgeAorICAgICAgIDp0eXBlIHg6IGludAorCisgICAgICAgRm9yIHRoZSBvdGhlciBwYXJhbWV0ZXJzLCBzZWUKKyAgICAgICA6Y2xhc3M6YE15RnJhbWV3b3JrVXNpbmdBbmREZWZpbmluZ0NhbGxiYWNrYAorICAgICAgICcnJworICAgICAgIHJldHVybiB4ICsgeSArIHoKKworICAgZGVmIGNhbGxiYWNrKHgsIHksIHopOgorICAgICAgICcnJ0dvb2dsZSBzdHlsZSBkb2NzdHJpbmcgZm9yIGNhbGxiYWNrIC4uLgorCisgICAgICAgQXJnczoKKyAgICAgICAgICAgeCAoaW50KTogYmxhIHgKKworICAgICAgIEZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywgc2VlCisgICAgICAgOmNsYXNzOmBNeUZyYW1ld29ya1VzaW5nQW5kRGVmaW5pbmdDYWxsYmFja2AKKyAgICAgICAnJycKKyAgICAgICByZXR1cm4geCArIHkgKyB6CisKK05hbWluZyBpbmNvbnNpc3RlbmNpZXMgaW4gZXhpc3RpbmcgcGFyYW1ldGVyIGFuZCB0aGVpciB0eXBlIGRvY3VtZW50YXRpb25zIGFyZQorc3RpbGwgZGV0ZWN0ZWQuCmRpZmYgLS1naXQgYS9weWxpbnQvZXh0ZW5zaW9ucy9kb2NzdHlsZS5weSBiL3B5bGludC9leHRlbnNpb25zL2RvY3N0eWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMGU1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9kb2NzdHlsZS5weQpAQCAtMCwwICsxLDkxIEBACisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpcyBFc2NvYmFyIDxsZXNjb2JhckB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgbGluZWNhY2hlCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycworZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0IGNoZWNrX21lc3NhZ2VzCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBISUdILCBJQXN0cm9pZENoZWNrZXIKKworCitjbGFzcyBEb2NTdHJpbmdTdHlsZUNoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrcyBmb3JtYXQgb2YgZG9jc3RyaW5ncyBiYXNlZCBvbiBQRVAgMDI1NyIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJQXN0cm9pZENoZWNrZXIKKyAgICBuYW1lID0gImRvY3N0eWxlIgorCisgICAgbXNncyA9IHsKKyAgICAgICAgIkMwMTk4IjogKAorICAgICAgICAgICAgJ0JhZCBkb2NzdHJpbmcgcXVvdGVzIGluICVzLCBleHBlY3RlZCAiIiIsIGdpdmVuICVzJywKKyAgICAgICAgICAgICJiYWQtZG9jc3RyaW5nLXF1b3RlcyIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgZG9jc3RyaW5nIGRvZXMgbm90IGhhdmUgdHJpcGxlIGRvdWJsZSBxdW90ZXMuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIkMwMTk5IjogKAorICAgICAgICAgICAgIkZpcnN0IGxpbmUgZW1wdHkgaW4gJXMgZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICJkb2NzdHJpbmctZmlyc3QtbGluZS1lbXB0eSIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGEgYmxhbmsgbGluZSBpcyBmb3VuZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZG9jc3RyaW5nLiIsCisgICAgICAgICksCisgICAgfQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJkb2NzdHJpbmctZmlyc3QtbGluZS1lbXB0eSIsICJiYWQtZG9jc3RyaW5nLXF1b3RlcyIpCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZG9jc3RyaW5nKCJtb2R1bGUiLCBub2RlKQorCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl9jaGVja19kb2NzdHJpbmcoImNsYXNzIiwgbm9kZSkKKworICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgZnR5cGUgPSAibWV0aG9kIiBpZiBub2RlLmlzX21ldGhvZCgpIGVsc2UgImZ1bmN0aW9uIgorICAgICAgICBzZWxmLl9jaGVja19kb2NzdHJpbmcoZnR5cGUsIG5vZGUpCisKKyAgICB2aXNpdF9hc3luY2Z1bmN0aW9uZGVmID0gdmlzaXRfZnVuY3Rpb25kZWYKKworICAgIGRlZiBfY2hlY2tfZG9jc3RyaW5nKHNlbGYsIG5vZGVfdHlwZSwgbm9kZSk6CisgICAgICAgIGRvY3N0cmluZyA9IG5vZGUuZG9jCisgICAgICAgIGlmIGRvY3N0cmluZyBhbmQgZG9jc3RyaW5nWzBdID09ICJcbiI6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJkb2NzdHJpbmctZmlyc3QtbGluZS1lbXB0eSIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KG5vZGVfdHlwZSwpLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9SElHSCwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIFVzZSAibGluZWNhY2hlIiwgaW5zdGVhZCBvZiBub2RlLmFzX3N0cmluZygpLCBiZWNhdXNlIHRoZSBsYXR0ZXIKKyAgICAgICAgIyBsb29zZXMgdGhlIG9yaWdpbmFsIGZvcm0gb2YgdGhlIGRvY3N0cmluZ3MuCisKKyAgICAgICAgaWYgZG9jc3RyaW5nOgorICAgICAgICAgICAgbGluZW5vID0gbm9kZS5mcm9tbGluZW5vICsgMQorICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKG5vZGUucm9vdCgpLmZpbGUsIGxpbmVubykubHN0cmlwKCkKKyAgICAgICAgICAgIGlmIGxpbmUgYW5kIGxpbmUuZmluZCgnIiIiJykgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGxpbmUgYW5kICInJyciIGluIGxpbmU6CisgICAgICAgICAgICAgICAgcXVvdGVzID0gIicnJyIKKyAgICAgICAgICAgIGVsaWYgbGluZSBhbmQgbGluZVswXSA9PSAnIic6CisgICAgICAgICAgICAgICAgcXVvdGVzID0gJyInCisgICAgICAgICAgICBlbGlmIGxpbmUgYW5kIGxpbmVbMF0gPT0gIiciOgorICAgICAgICAgICAgICAgIHF1b3RlcyA9ICInIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBxdW90ZXMgPSBGYWxzZQorICAgICAgICAgICAgaWYgcXVvdGVzOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJiYWQtZG9jc3RyaW5nLXF1b3RlcyIsCisgICAgICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICAgICAgYXJncz0obm9kZV90eXBlLCBxdW90ZXMpLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlPUhJR0gsCisgICAgICAgICAgICAgICAgKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiIlJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlci4KKworICAgIDpwYXJhbSBsaW50ZXI6IE1haW4gaW50ZXJmYWNlIG9iamVjdCBmb3IgUHlsaW50IHBsdWdpbnMKKyAgICA6dHlwZSBsaW50ZXI6IFB5bGludCBvYmplY3QKKyAgICAiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihEb2NTdHJpbmdTdHlsZUNoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9leHRlbnNpb25zL2VtcHR5X2NvbW1lbnQucHkgYi9weWxpbnQvZXh0ZW5zaW9ucy9lbXB0eV9jb21tZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjJlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9lbXB0eV9jb21tZW50LnB5CkBAIC0wLDAgKzEsNTYgQEAKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSVJhd0NoZWNrZXIKKworCitkZWYgaXNfbGluZV9jb21tZW50ZWQobGluZSk6CisgICAgIiIiQ2hlY2tzIGlmIGEgYCMgc3ltYm9sIHRoYXQgaXMgbm90IHBhcnQgb2YgYSBzdHJpbmcgd2FzIGZvdW5kIGluIGxpbmUiIiIKKworICAgIGNvbW1lbnRfaWR4ID0gbGluZS5maW5kKGIiIyIpCisgICAgaWYgY29tbWVudF9pZHggPT0gLTE6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIGNvbW1lbnRfcGFydF9vZl9zdHJpbmcobGluZSwgY29tbWVudF9pZHgpOgorICAgICAgICByZXR1cm4gaXNfbGluZV9jb21tZW50ZWQobGluZVs6Y29tbWVudF9pZHhdICsgbGluZVtjb21tZW50X2lkeCArIDEgOl0pCisgICAgcmV0dXJuIFRydWUKKworCitkZWYgY29tbWVudF9wYXJ0X29mX3N0cmluZyhsaW5lLCBjb21tZW50X2lkeCk6CisgICAgIiIiY2hlY2tzIGlmIHRoZSBzeW1ib2wgYXQgY29tbWVudF9pZHggaXMgcGFydCBvZiBhIHN0cmluZyIiIgorCisgICAgaWYgKAorICAgICAgICBsaW5lWzpjb21tZW50X2lkeF0uY291bnQoYiInIikgJSAyID09IDEKKyAgICAgICAgYW5kIGxpbmVbY29tbWVudF9pZHg6XS5jb3VudChiIiciKSAlIDIgPT0gMQorICAgICkgb3IgKAorICAgICAgICBsaW5lWzpjb21tZW50X2lkeF0uY291bnQoYiciJykgJSAyID09IDEKKyAgICAgICAgYW5kIGxpbmVbY29tbWVudF9pZHg6XS5jb3VudChiJyInKSAlIDIgPT0gMQorICAgICk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgQ29tbWVudENoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgIF9faW1wbGVtZW50c19fID0gSVJhd0NoZWNrZXIKKworICAgIG5hbWUgPSAicmVmYWN0b3JpbmciCisgICAgbXNncyA9IHsKKyAgICAgICAgIlIyMDQ0IjogKAorICAgICAgICAgICAgIkxpbmUgd2l0aCBlbXB0eSBjb21tZW50IiwKKyAgICAgICAgICAgICJlbXB0eS1jb21tZW50IiwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiVXNlZCB3aGVuIGEgIyBzeW1ib2wgYXBwZWFycyBvbiBhIGxpbmUgbm90IGZvbGxvd2VkIGJ5IGFuIGFjdHVhbCBjb21tZW50IgorICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgIH0KKyAgICBvcHRpb25zID0gKCkKKyAgICBwcmlvcml0eSA9IC0xICAjIGxvdyBwcmlvcml0eQorCisgICAgZGVmIHByb2Nlc3NfbW9kdWxlKHNlbGYsIG5vZGUpOgorICAgICAgICB3aXRoIG5vZGUuc3RyZWFtKCkgYXMgc3RyZWFtOgorICAgICAgICAgICAgZm9yIChsaW5lX251bSwgbGluZSkgaW4gZW51bWVyYXRlKHN0cmVhbSk6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKGIiIyIpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNfbGluZV9jb21tZW50ZWQobGluZVs6LTFdKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImVtcHR5LWNvbW1lbnQiLCBsaW5lPWxpbmVfbnVtICsgMSkKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihDb21tZW50Q2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvZW1wdHlzdHJpbmcucHkgYi9weWxpbnQvZXh0ZW5zaW9ucy9lbXB0eXN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmExYTVmCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2V4dGVuc2lvbnMvZW1wdHlzdHJpbmcucHkKQEAgLTAsMCArMSw3NiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFRvZG9yb3YgPGF0b2Rvcm92QG90Yi5iZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSwgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIkxvb2tzIGZvciAgY29tcGFyaXNvbnMgdG8gZW1wdHkgc3RyaW5nLiIiIgorCitpbXBvcnQgaXRlcnRvb2xzCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycywgaW50ZXJmYWNlcworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IHV0aWxzCisKKworZGVmIF9pc19jb25zdGFudF9lbXB0eV9zdHIobm9kZSk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5Db25zdCkgYW5kIG5vZGUudmFsdWUgPT0gIiIKKworCitjbGFzcyBDb21wYXJlVG9FbXB0eVN0cmluZ0NoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorICAgICIiIkNoZWNrcyBmb3IgY29tcGFyaXNvbnMgdG8gZW1wdHkgc3RyaW5nLgorICAgIE1vc3Qgb2YgdGhlIHRpbWVzIHlvdSBzaG91bGQgdXNlIHRoZSBmYWN0IHRoYXQgZW1wdHkgc3RyaW5ncyBhcmUgZmFsc2UuCisgICAgQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB3aGVuIGFuIGVtcHR5IHN0cmluZyB2YWx1ZSBpcyBhbGxvd2VkIGluIHRoZSBwcm9ncmFtCisgICAgYW5kIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIHRoYW4gTm9uZSEKKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyLCkKKworICAgICMgY29uZmlndXJhdGlvbiBzZWN0aW9uIG5hbWUKKyAgICBuYW1lID0gImNvbXBhcmUtdG8tZW1wdHktc3RyaW5nIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJDMTkwMSI6ICgKKyAgICAgICAgICAgICJBdm9pZCBjb21wYXJpc29ucyB0byBlbXB0eSBzdHJpbmciLAorICAgICAgICAgICAgImNvbXBhcmUtdG8tZW1wdHktc3RyaW5nIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gUHlsaW50IGRldGVjdHMgY29tcGFyaXNvbiB0byBhbiBlbXB0eSBzdHJpbmcgY29uc3RhbnQuIiwKKyAgICAgICAgKQorICAgIH0KKworICAgIHByaW9yaXR5ID0gLTIKKyAgICBvcHRpb25zID0gKCkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygiY29tcGFyZS10by1lbXB0eS1zdHJpbmciKQorICAgIGRlZiB2aXNpdF9jb21wYXJlKHNlbGYsIG5vZGUpOgorICAgICAgICBfb3BlcmF0b3JzID0gWyIhPSIsICI9PSIsICJpcyBub3QiLCAiaXMiXQorICAgICAgICAjIG5vdGU6IGFzdHJvaWQuQ29tcGFyZSBoYXMgdGhlIGxlZnQgbW9zdCBvcGVyYW5kIGluIG5vZGUubGVmdAorICAgICAgICAjIHdoaWxlIHRoZSByZXN0IGFyZSBhIGxpc3Qgb2YgdHVwbGVzIGluIG5vZGUub3BzCisgICAgICAgICMgdGhlIGZvcm1hdCBvZiB0aGUgdHVwbGUgaXMgKCdjb21wYXJlIG9wZXJhdG9yIHNpZ24nLCBub2RlKQorICAgICAgICAjIGhlcmUgd2Ugc3F1YXNoIGV2ZXJ5dGhpbmcgaW50byBgb3BzYCB0byBtYWtlIGl0IGVhc2llciBmb3IgcHJvY2Vzc2luZyBsYXRlcgorICAgICAgICBvcHMgPSBbKCIiLCBub2RlLmxlZnQpXQorICAgICAgICBvcHMuZXh0ZW5kKG5vZGUub3BzKQorICAgICAgICBvcHMgPSBsaXN0KGl0ZXJ0b29scy5jaGFpbigqb3BzKSkKKworICAgICAgICBmb3Igb3BzX2lkeCBpbiByYW5nZShsZW4ob3BzKSAtIDIpOgorICAgICAgICAgICAgb3BfMSA9IG9wc1tvcHNfaWR4XQorICAgICAgICAgICAgb3BfMiA9IG9wc1tvcHNfaWR4ICsgMV0KKyAgICAgICAgICAgIG9wXzMgPSBvcHNbb3BzX2lkeCArIDJdCisgICAgICAgICAgICBlcnJvcl9kZXRlY3RlZCA9IEZhbHNlCisKKyAgICAgICAgICAgICMgeCA/PyAiIgorICAgICAgICAgICAgaWYgX2lzX2NvbnN0YW50X2VtcHR5X3N0cihvcF8xKSBhbmQgb3BfMiBpbiBfb3BlcmF0b3JzOgorICAgICAgICAgICAgICAgIGVycm9yX2RldGVjdGVkID0gVHJ1ZQorICAgICAgICAgICAgIyAnJyA/PyBYCisgICAgICAgICAgICBlbGlmIG9wXzIgaW4gX29wZXJhdG9ycyBhbmQgX2lzX2NvbnN0YW50X2VtcHR5X3N0cihvcF8zKToKKyAgICAgICAgICAgICAgICBlcnJvcl9kZXRlY3RlZCA9IFRydWUKKworICAgICAgICAgICAgaWYgZXJyb3JfZGV0ZWN0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiY29tcGFyZS10by1lbXB0eS1zdHJpbmciLCBub2RlPW5vZGUpCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIiUmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyLiIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKENvbXBhcmVUb0VtcHR5U3RyaW5nQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvbWNjYWJlLnB5IGIvcHlsaW50L2V4dGVuc2lvbnMvbWNjYWJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDFkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9tY2NhYmUucHkKQEAgLTAsMCArMSwxOTkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBNb2lzZXMgTG9wZXogPG1veWxvcDI2MEB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIk1vZHVsZSB0byBhZGQgTWNDYWJlIGNoZWNrZXIgY2xhc3MgZm9yIHB5bGludC4gIiIiCisKK2Zyb20gbWNjYWJlIGltcG9ydCBQYXRoR3JhcGggYXMgTWNjYWJlX1BhdGhHcmFwaAorZnJvbSBtY2NhYmUgaW1wb3J0IFBhdGhHcmFwaGluZ0FzdFZpc2l0b3IgYXMgTWNjYWJlX1BhdGhHcmFwaGluZ0FzdFZpc2l0b3IKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IEhJR0gsIElBc3Ryb2lkQ2hlY2tlcgorCisKK2NsYXNzIFBhdGhHcmFwaChNY2NhYmVfUGF0aEdyYXBoKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT0iIiwgZW50aXR5PSIiLCBsaW5lbm89MSkKKyAgICAgICAgc2VsZi5yb290ID0gbm9kZQorCisKK2NsYXNzIFBhdGhHcmFwaGluZ0FzdFZpc2l0b3IoTWNjYWJlX1BhdGhHcmFwaGluZ0FzdFZpc2l0b3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuX2JvdHRvbV9jb3VudGVyID0gMAorCisgICAgZGVmIGRlZmF1bHQoc2VsZiwgbm9kZSwgKmFyZ3MpOgorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2goY2hpbGQsICphcmdzKQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIG5vZGUsICphcmdzKToKKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICBrbGFzcyA9IG5vZGUuX19jbGFzc19fCisgICAgICAgIG1ldGggPSBzZWxmLl9jYWNoZS5nZXQoa2xhc3MpCisgICAgICAgIGlmIG1ldGggaXMgTm9uZToKKyAgICAgICAgICAgIGNsYXNzX25hbWUgPSBrbGFzcy5fX25hbWVfXworICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZi52aXNpdG9yLCAidmlzaXQiICsgY2xhc3NfbmFtZSwgc2VsZi5kZWZhdWx0KQorICAgICAgICAgICAgc2VsZi5fY2FjaGVba2xhc3NdID0gbWV0aAorICAgICAgICByZXR1cm4gbWV0aChub2RlLCAqYXJncykKKworICAgIGRlZiB2aXNpdEZ1bmN0aW9uRGVmKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBzZWxmLmdyYXBoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBjbG9zdXJlCisgICAgICAgICAgICBwYXRobm9kZSA9IHNlbGYuX2FwcGVuZF9ub2RlKG5vZGUpCisgICAgICAgICAgICBzZWxmLnRhaWwgPSBwYXRobm9kZQorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaF9saXN0KG5vZGUuYm9keSkKKyAgICAgICAgICAgIGJvdHRvbSA9ICIlcyIgJSBzZWxmLl9ib3R0b21fY291bnRlcgorICAgICAgICAgICAgc2VsZi5fYm90dG9tX2NvdW50ZXIgKz0gMQorICAgICAgICAgICAgc2VsZi5ncmFwaC5jb25uZWN0KHNlbGYudGFpbCwgYm90dG9tKQorICAgICAgICAgICAgc2VsZi5ncmFwaC5jb25uZWN0KG5vZGUsIGJvdHRvbSkKKyAgICAgICAgICAgIHNlbGYudGFpbCA9IGJvdHRvbQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ncmFwaCA9IFBhdGhHcmFwaChub2RlKQorICAgICAgICAgICAgc2VsZi50YWlsID0gbm9kZQorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaF9saXN0KG5vZGUuYm9keSkKKyAgICAgICAgICAgIHNlbGYuZ3JhcGhzW2Yie3NlbGYuY2xhc3NuYW1lfXtub2RlLm5hbWV9Il0gPSBzZWxmLmdyYXBoCisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIHZpc2l0QXN5bmNGdW5jdGlvbkRlZiA9IHZpc2l0RnVuY3Rpb25EZWYKKworICAgIGRlZiB2aXNpdFNpbXBsZVN0YXRlbWVudChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fYXBwZW5kX25vZGUobm9kZSkKKworICAgIHZpc2l0QXNzZXJ0ID0gKAorICAgICAgICB2aXNpdEFzc2lnbgorICAgICkgPSAoCisgICAgICAgIHZpc2l0QXVnQXNzaWduCisgICAgKSA9ICgKKyAgICAgICAgdmlzaXREZWxldGUKKyAgICApID0gKAorICAgICAgICB2aXNpdFByaW50CisgICAgKSA9ICgKKyAgICAgICAgdmlzaXRSYWlzZQorICAgICkgPSAoCisgICAgICAgIHZpc2l0WWllbGQKKyAgICApID0gKAorICAgICAgICB2aXNpdEltcG9ydAorICAgICkgPSAoCisgICAgICAgIHZpc2l0Q2FsbAorICAgICkgPSAoCisgICAgICAgIHZpc2l0U3Vic2NyaXB0CisgICAgKSA9ICgKKyAgICAgICAgdmlzaXRQYXNzCisgICAgKSA9ICgKKyAgICAgICAgdmlzaXRDb250aW51ZQorICAgICkgPSAoCisgICAgICAgIHZpc2l0QnJlYWsKKyAgICApID0gdmlzaXRHbG9iYWwgPSB2aXNpdFJldHVybiA9IHZpc2l0RXhwciA9IHZpc2l0QXdhaXQgPSB2aXNpdFNpbXBsZVN0YXRlbWVudAorCisgICAgZGVmIHZpc2l0V2l0aChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fYXBwZW5kX25vZGUobm9kZSkKKyAgICAgICAgc2VsZi5kaXNwYXRjaF9saXN0KG5vZGUuYm9keSkKKworICAgIHZpc2l0QXN5bmNXaXRoID0gdmlzaXRXaXRoCisKKyAgICBkZWYgX2FwcGVuZF9ub2RlKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi50YWlsOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5ncmFwaC5jb25uZWN0KHNlbGYudGFpbCwgbm9kZSkKKyAgICAgICAgc2VsZi50YWlsID0gbm9kZQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIF9zdWJncmFwaChzZWxmLCBub2RlLCBuYW1lLCBleHRyYV9ibG9ja3M9KCkpOgorICAgICAgICAiIiJjcmVhdGUgdGhlIHN1YmdyYXBocyByZXByZXNlbnRpbmcgYW55IGBpZmAgYW5kIGBmb3JgIHN0YXRlbWVudHMiIiIKKyAgICAgICAgaWYgc2VsZi5ncmFwaCBpcyBOb25lOgorICAgICAgICAgICAgIyBnbG9iYWwgbG9vcAorICAgICAgICAgICAgc2VsZi5ncmFwaCA9IFBhdGhHcmFwaChub2RlKQorICAgICAgICAgICAgc2VsZi5fc3ViZ3JhcGhfcGFyc2Uobm9kZSwgbm9kZSwgZXh0cmFfYmxvY2tzKQorICAgICAgICAgICAgc2VsZi5ncmFwaHNbZiJ7c2VsZi5jbGFzc25hbWV9e25hbWV9Il0gPSBzZWxmLmdyYXBoCisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2FwcGVuZF9ub2RlKG5vZGUpCisgICAgICAgICAgICBzZWxmLl9zdWJncmFwaF9wYXJzZShub2RlLCBub2RlLCBleHRyYV9ibG9ja3MpCisKKyAgICBkZWYgX3N1YmdyYXBoX3BhcnNlKHNlbGYsIG5vZGUsIHBhdGhub2RlLCBleHRyYV9ibG9ja3MpOgorICAgICAgICAiIiJwYXJzZSB0aGUgYm9keSBhbmQgYW55IGBlbHNlYCBibG9jayBvZiBgaWZgIGFuZCBgZm9yYCBzdGF0ZW1lbnRzIiIiCisgICAgICAgIGxvb3NlX2VuZHMgPSBbXQorICAgICAgICBzZWxmLnRhaWwgPSBub2RlCisgICAgICAgIHNlbGYuZGlzcGF0Y2hfbGlzdChub2RlLmJvZHkpCisgICAgICAgIGxvb3NlX2VuZHMuYXBwZW5kKHNlbGYudGFpbCkKKyAgICAgICAgZm9yIGV4dHJhIGluIGV4dHJhX2Jsb2NrczoKKyAgICAgICAgICAgIHNlbGYudGFpbCA9IG5vZGUKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hfbGlzdChleHRyYS5ib2R5KQorICAgICAgICAgICAgbG9vc2VfZW5kcy5hcHBlbmQoc2VsZi50YWlsKQorICAgICAgICBpZiBub2RlLm9yZWxzZToKKyAgICAgICAgICAgIHNlbGYudGFpbCA9IG5vZGUKKyAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hfbGlzdChub2RlLm9yZWxzZSkKKyAgICAgICAgICAgIGxvb3NlX2VuZHMuYXBwZW5kKHNlbGYudGFpbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvb3NlX2VuZHMuYXBwZW5kKG5vZGUpCisgICAgICAgIGlmIG5vZGU6CisgICAgICAgICAgICBib3R0b20gPSAiJXMiICUgc2VsZi5fYm90dG9tX2NvdW50ZXIKKyAgICAgICAgICAgIHNlbGYuX2JvdHRvbV9jb3VudGVyICs9IDEKKyAgICAgICAgICAgIGZvciBlbmQgaW4gbG9vc2VfZW5kczoKKyAgICAgICAgICAgICAgICBzZWxmLmdyYXBoLmNvbm5lY3QoZW5kLCBib3R0b20pCisgICAgICAgICAgICBzZWxmLnRhaWwgPSBib3R0b20KKworCitjbGFzcyBNY0NhYmVNZXRob2RDaGVja2VyKGNoZWNrZXJzLkJhc2VDaGVja2VyKToKKyAgICAiIiJDaGVja3MgTWNDYWJlIGNvbXBsZXhpdHkgY3ljbG9tYXRpYyB0aHJlc2hvbGQgaW4gbWV0aG9kcyBhbmQgZnVuY3Rpb25zCisgICAgdG8gdmFsaWRhdGUgYSB0b28gY29tcGxleCBjb2RlLgorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJQXN0cm9pZENoZWNrZXIKKyAgICBuYW1lID0gImRlc2lnbiIKKworICAgIG1zZ3MgPSB7CisgICAgICAgICJSMTI2MCI6ICgKKyAgICAgICAgICAgICIlcyBpcyB0b28gY29tcGxleC4gVGhlIE1jQ2FiZSByYXRpbmcgaXMgJWQiLAorICAgICAgICAgICAgInRvby1jb21wbGV4IiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gYSBtZXRob2Qgb3IgZnVuY3Rpb24gaXMgdG9vIGNvbXBsZXggYmFzZWQgb24gIgorICAgICAgICAgICAgIk1jQ2FiZSBDb21wbGV4aXR5IEN5Y2xvbWF0aWMiLAorICAgICAgICApCisgICAgfQorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJtYXgtY29tcGxleGl0eSIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAxMCwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICJNY0NhYmUgY29tcGxleGl0eSBjeWNsb21hdGljIHRocmVzaG9sZCIsCisgICAgICAgICAgICB9LAorICAgICAgICApLAorICAgICkKKworICAgIEBjaGVja19tZXNzYWdlcygidG9vLWNvbXBsZXgiKQorICAgIGRlZiB2aXNpdF9tb2R1bGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IGFuIGFzdHJvaWQuTW9kdWxlIG5vZGUgdG8gY2hlY2sgdG9vIGNvbXBsZXggcmF0aW5nIGFuZAorICAgICAgICBhZGQgbWVzc2FnZSBpZiBpcyBncmVhdGhlciB0aGFuIG1heF9jb21wbGV4aXR5IHN0b3JlZCBmcm9tIG9wdGlvbnMiIiIKKyAgICAgICAgdmlzaXRvciA9IFBhdGhHcmFwaGluZ0FzdFZpc2l0b3IoKQorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5ib2R5OgorICAgICAgICAgICAgdmlzaXRvci5wcmVvcmRlcihjaGlsZCwgdmlzaXRvcikKKyAgICAgICAgZm9yIGdyYXBoIGluIHZpc2l0b3IuZ3JhcGhzLnZhbHVlcygpOgorICAgICAgICAgICAgY29tcGxleGl0eSA9IGdyYXBoLmNvbXBsZXhpdHkoKQorICAgICAgICAgICAgbm9kZSA9IGdyYXBoLnJvb3QKKyAgICAgICAgICAgIGlmIGhhc2F0dHIobm9kZSwgIm5hbWUiKToKKyAgICAgICAgICAgICAgICBub2RlX25hbWUgPSAiJyVzJyIgJSBub2RlLm5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbm9kZV9uYW1lID0gIlRoaXMgJyVzJyIgJSBub2RlLl9fY2xhc3NfXy5fX25hbWVfXy5sb3dlcigpCisgICAgICAgICAgICBpZiBjb21wbGV4aXR5IDw9IHNlbGYuY29uZmlnLm1heF9jb21wbGV4aXR5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJ0b28tY29tcGxleCIsIG5vZGU9bm9kZSwgY29uZmlkZW5jZT1ISUdILCBhcmdzPShub2RlX25hbWUsIGNvbXBsZXhpdHkpCisgICAgICAgICAgICApCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIiUmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyLgorCisgICAgOnBhcmFtIGxpbnRlcjogTWFpbiBpbnRlcmZhY2Ugb2JqZWN0IGZvciBQeWxpbnQgcGx1Z2lucworICAgIDp0eXBlIGxpbnRlcjogUHlsaW50IG9iamVjdAorICAgICIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKE1jQ2FiZU1ldGhvZENoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9leHRlbnNpb25zL21jY2FiZS5yc3QgYi9weWxpbnQvZXh0ZW5zaW9ucy9tY2NhYmUucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2M2Q1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy9tY2NhYmUucnN0CkBAIC0wLDAgKzEsMzcgQEAKK1lvdSBjYW4gbm93IHVzZSB0aGlzIHBsdWdpbiBmb3IgZmluZGluZyBjb21wbGV4aXR5IGlzc3VlcyBpbiB5b3VyIGNvZGUgYmFzZS4KKworQWN0aXZhdGUgaXQgdGhyb3VnaCBgYHB5bGludCAtLWxvYWQtcGx1Z2lucz1weWxpbnQuZXh0ZW5zaW9ucy5tY2NhYmVgYC4gSXQgaW50cm9kdWNlcworYSBuZXcgd2FybmluZywgYGB0b28tY29tcGxleGBgLCB3aGljaCBpcyBlbWl0dGVkIHdoZW4gYSBjb2RlIGJsb2NrIGhhcyBhIGNvbXBsZXhpdHkKK2hpZ2hlciB0aGFuIGEgcHJlZXN0YWJsaXNoZWQgdmFsdWUsIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggdGhlCitgYG1heC1jb21wbGV4aXR5YGAgb3B0aW9uLCBzdWNoIGFzIGluIHRoaXMgZXhhbXBsZTo6CisKKyAgICAkIGNhdCBhLnB5CisgICAgZGVmIGYxMCgpOgorICAgICAgICAiIiJNY0NhYmUgcmF0aW5nOiAxMSIiIgorICAgICAgICBteWludCA9IDIKKyAgICAgICAgaWYgbXlpbnQgPT0gNToKKyAgICAgICAgICAgIHJldHVybiBteWludAorICAgICAgICBlbGlmIG15aW50ID09IDY6CisgICAgICAgICAgICByZXR1cm4gbXlpbnQKKyAgICAgICAgZWxpZiBteWludCA9PSA3OgorICAgICAgICAgICAgcmV0dXJuIG15aW50CisgICAgICAgIGVsaWYgbXlpbnQgPT0gODoKKyAgICAgICAgICAgIHJldHVybiBteWludAorICAgICAgICBlbGlmIG15aW50ID09IDk6CisgICAgICAgICAgICByZXR1cm4gbXlpbnQKKyAgICAgICAgZWxpZiBteWludCA9PSAxMDoKKyAgICAgICAgICAgIGlmIG15aW50ID09IDg6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsaWYgbXlpbnQgPT0gODoKKyAgICAgICAgICAgICAgICB3aXRoIG15aW50OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gOAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbXlpbnQgPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbXlpbnQKKyAgICAgICAgICAgIHJldHVybiBteWludAorICAgICAgICByZXR1cm4gbXlpbnQKKyAgICAkIHB5bGludCBhLnB5IC0tbG9hZC1wbHVnaW5zPXB5bGludC5leHRlbnNpb25zLm1jY2FiZQorICAgIFI6MTogJ2YxMCcgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDExICh0b28tY29tcGxleCkKKyAgICAkIHB5bGludCBhLnB5IC0tbG9hZC1wbHVnaW5zPXB5bGludC5leHRlbnNpb25zLm1jY2FiZSAtLW1heC1jb21wbGV4aXR5PTUwCisgICAgJApkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvb3ZlcmxhcHBpbmdfZXhjZXB0aW9ucy5weSBiL3B5bGludC9leHRlbnNpb25zL292ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ZjQxYgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL292ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw4NiBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJMb29rcyBmb3Igb3ZlcmxhcHBpbmcgZXhjZXB0aW9ucy4iIiIKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzLCBpbnRlcmZhY2VzCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzLmV4Y2VwdGlvbnMgaW1wb3J0IF9hbm5vdGF0ZWRfdW5wYWNrX2luZmVyCisKKworY2xhc3MgT3ZlcmxhcHBpbmdFeGNlcHRpb25zQ2hlY2tlcihjaGVja2Vycy5CYXNlQ2hlY2tlcik6CisgICAgIiIiQ2hlY2tzIGZvciB0d28gb3IgbW9yZSBleGNlcHRpb25zIGluIHRoZSBzYW1lIGV4Y2VwdGlvbiBoYW5kbGVyCisgICAgY2xhdXNlIHRoYXQgYXJlIGlkZW50aWNhbCBvciBwYXJ0cyBvZiB0aGUgc2FtZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAgICAoaS5lLiBvdmVybGFwcGluZykuIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyCisKKyAgICBuYW1lID0gIm92ZXJsYXAtZXhjZXB0IgorICAgIG1zZ3MgPSB7CisgICAgICAgICJXMDcxNCI6ICgKKyAgICAgICAgICAgICJPdmVybGFwcGluZyBleGNlcHRpb25zICglcykiLAorICAgICAgICAgICAgIm92ZXJsYXBwaW5nLWV4Y2VwdCIsCisgICAgICAgICAgICAiVXNlZCB3aGVuIGV4Y2VwdGlvbnMgaW4gaGFuZGxlciBvdmVybGFwIG9yIGFyZSBpZGVudGljYWwiLAorICAgICAgICApCisgICAgfQorICAgIHByaW9yaXR5ID0gLTIKKyAgICBvcHRpb25zID0gKCkKKworICAgIEB1dGlscy5jaGVja19tZXNzYWdlcygib3ZlcmxhcHBpbmctZXhjZXB0IikKKyAgICBkZWYgdmlzaXRfdHJ5ZXhjZXB0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJjaGVjayBmb3IgZW1wdHkgZXhjZXB0IiIiCisgICAgICAgIGZvciBoYW5kbGVyIGluIG5vZGUuaGFuZGxlcnM6CisgICAgICAgICAgICBpZiBoYW5kbGVyLnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShoYW5kbGVyLnR5cGUsIGFzdHJvaWQuQm9vbE9wKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV4Y3MgPSBsaXN0KF9hbm5vdGF0ZWRfdW5wYWNrX2luZmVyKGhhbmRsZXIudHlwZSkpCisgICAgICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBoYW5kbGVkX2luX2NsYXVzZSA9IFtdCisgICAgICAgICAgICBmb3IgcGFydCwgZXhjIGluIGV4Y3M6CisgICAgICAgICAgICAgICAgaWYgZXhjIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleGMsIGFzdHJvaWQuSW5zdGFuY2UpIGFuZCB1dGlscy5pbmhlcml0X2Zyb21fc3RkX2V4KGV4Yyk6CisgICAgICAgICAgICAgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgZXhjID0gZXhjLl9wcm94aWVkCisKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgZXhjX2FuY2VzdG9ycyA9IFsKKyAgICAgICAgICAgICAgICAgICAgYW5jIGZvciBhbmMgaW4gZXhjLmFuY2VzdG9ycygpIGlmIGlzaW5zdGFuY2UoYW5jLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgICAgIF0KKworICAgICAgICAgICAgICAgIGZvciBwcmV2X3BhcnQsIHByZXZfZXhjIGluIGhhbmRsZWRfaW5fY2xhdXNlOgorICAgICAgICAgICAgICAgICAgICBwcmV2X2V4Y19hbmNlc3RvcnMgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICBhbmMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbmMgaW4gcHJldl9leGMuYW5jZXN0b3JzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYW5jLCBhc3Ryb2lkLkNsYXNzRGVmKQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgICAgIGlmIGV4YyA9PSBwcmV2X2V4YzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm92ZXJsYXBwaW5nLWV4Y2VwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZT1oYW5kbGVyLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0iJXMgYW5kICVzIGFyZSB0aGUgc2FtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwcmV2X3BhcnQuYXNfc3RyaW5nKCksIHBhcnQuYXNfc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHByZXZfZXhjIGluIGV4Y19hbmNlc3RvcnMgb3IgZXhjIGluIHByZXZfZXhjX2FuY2VzdG9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gcGFydCBpZiBleGMgaW4gcHJldl9leGNfYW5jZXN0b3JzIGVsc2UgcHJldl9wYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50ID0gcGFydCBpZiBwcmV2X2V4YyBpbiBleGNfYW5jZXN0b3JzIGVsc2UgcHJldl9wYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdmVybGFwcGluZy1leGNlcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU9aGFuZGxlci50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9IiVzIGlzIGFuIGFuY2VzdG9yIGNsYXNzIG9mICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGFuY2VzdG9yLmFzX3N0cmluZygpLCBkZXNjZW5kYW50LmFzX3N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBoYW5kbGVkX2luX2NsYXVzZSArPSBbKHBhcnQsIGV4YyldCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgIiIiUmVxdWlyZWQgbWV0aG9kIHRvIGF1dG8gcmVnaXN0ZXIgdGhpcyBjaGVja2VyLiIiIgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKE92ZXJsYXBwaW5nRXhjZXB0aW9uc0NoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9leHRlbnNpb25zL3JlZGVmaW5lZF92YXJpYWJsZV90eXBlLnB5IGIvcHlsaW50L2V4dGVuc2lvbnMvcmVkZWZpbmVkX3ZhcmlhYmxlX3R5cGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmYTFhZAotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9leHRlbnNpb25zL3JlZGVmaW5lZF92YXJpYWJsZV90eXBlLnB5CkBAIC0wLDAgKzEsMTE4IEBACisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsbWF0dGhlQGNpc2NvLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LCAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMsIGlzX25vbmUsIG5vZGVfdHlwZQorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSUFzdHJvaWRDaGVja2VyCisKK0JVSUxUSU5TID0gImJ1aWx0aW5zIgorCisKK2NsYXNzIE11bHRpcGxlVHlwZXNDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAiIiJDaGVja3MgZm9yIHZhcmlhYmxlIHR5cGUgcmVkZWZpbml0aW9ucyAoTm9uZVR5cGUgZXhjZXB0ZWQpCisKKyAgICBBdCBhIGZ1bmN0aW9uLCBtZXRob2QsIGNsYXNzIG9yIG1vZHVsZSBzY29wZQorCisgICAgVGhpcyBydWxlIGNvdWxkIGJlIGltcHJvdmVkOgorCisgICAgLSBDdXJyZW50bHksIGlmIGFuIGF0dHJpYnV0ZSBpcyBzZXQgdG8gZGlmZmVyZW50IHR5cGVzIGluIDIgbWV0aG9kcyBvZiBhCisgICAgICBzYW1lIGNsYXNzLCBpdCB3b24ndCBiZSBkZXRlY3RlZCAoc2VlIGZ1bmN0aW9uYWwgdGVzdCkKKyAgICAtIE9uZSBjb3VsZCBpbXByb3ZlIHRoZSBzdXBwb3J0IGZvciBpbmZlcmVuY2Ugb24gYXNzaWdubWVudCB3aXRoIHR1cGxlcywKKyAgICAgIGlmZXhwciwgZXRjLiBBbHNvIGl0IHdvdWxkIGJlIGdyZWF0IHRvIGhhdmUgc3VwcG9ydCBmb3IgaW5mZXJlbmNlIG9uCisgICAgICBzdHIuc3BsaXQoKQorICAgICIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSBJQXN0cm9pZENoZWNrZXIKKworICAgIG5hbWUgPSAibXVsdGlwbGVfdHlwZXMiCisgICAgbXNncyA9IHsKKyAgICAgICAgIlIwMjA0IjogKAorICAgICAgICAgICAgIlJlZGVmaW5pdGlvbiBvZiAlcyB0eXBlIGZyb20gJXMgdG8gJXMiLAorICAgICAgICAgICAgInJlZGVmaW5lZC12YXJpYWJsZS10eXBlIiwKKyAgICAgICAgICAgICJVc2VkIHdoZW4gdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBjaGFuZ2VzIGluc2lkZSBhICIKKyAgICAgICAgICAgICJtZXRob2Qgb3IgYSBmdW5jdGlvbi4iLAorICAgICAgICApCisgICAgfQorCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIF8pOgorICAgICAgICBzZWxmLl9hc3NpZ25zLmFwcGVuZCh7fSkKKworICAgIEBjaGVja19tZXNzYWdlcygicmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUiKQorICAgIGRlZiBsZWF2ZV9jbGFzc2RlZihzZWxmLCBfKToKKyAgICAgICAgc2VsZi5fY2hlY2tfYW5kX2FkZF9tZXNzYWdlcygpCisKKyAgICB2aXNpdF9mdW5jdGlvbmRlZiA9IHZpc2l0X2NsYXNzZGVmCisgICAgbGVhdmVfZnVuY3Rpb25kZWYgPSBsZWF2ZV9tb2R1bGUgPSBsZWF2ZV9jbGFzc2RlZgorCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBfKToKKyAgICAgICAgc2VsZi5fYXNzaWducyA9IFt7fV0KKworICAgIGRlZiBfY2hlY2tfYW5kX2FkZF9tZXNzYWdlcyhzZWxmKToKKyAgICAgICAgYXNzaWducyA9IHNlbGYuX2Fzc2lnbnMucG9wKCkKKyAgICAgICAgZm9yIG5hbWUsIGFyZ3MgaW4gYXNzaWducy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpIDw9IDE6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG9yaWdfbm9kZSwgb3JpZ190eXBlID0gYXJnc1swXQorICAgICAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIHR5cGUgaW4gdGhlIGZvbGxvd2luZyBub2RlcyB0aGF0IHdvdWxkIGJlCisgICAgICAgICAgICAjIGRpZmZlcmVudCBmcm9tIG9yaWdfdHlwZS4KKyAgICAgICAgICAgIGZvciByZWRlZl9ub2RlLCByZWRlZl90eXBlIGluIGFyZ3NbMTpdOgorICAgICAgICAgICAgICAgIGlmIHJlZGVmX3R5cGUgPT0gb3JpZ190eXBlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgaWYgYSB2YXJpYWJsZSBpcyBkZWZpbmVkIHRvIHNldmVyYWwgdHlwZXMgaW4gYW4gaWYgbm9kZSwKKyAgICAgICAgICAgICAgICAjIHRoaXMgaXMgbm90IGFjdHVhbGx5IHJlZGVmaW5pbmcuCisgICAgICAgICAgICAgICAgb3JpZ19wYXJlbnQgPSBvcmlnX25vZGUucGFyZW50CisgICAgICAgICAgICAgICAgcmVkZWZfcGFyZW50ID0gcmVkZWZfbm9kZS5wYXJlbnQKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9yaWdfcGFyZW50LCBhc3Ryb2lkLklmKToKKyAgICAgICAgICAgICAgICAgICAgaWYgb3JpZ19wYXJlbnQgPT0gcmVkZWZfcGFyZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGVmX25vZGUgaW4gb3JpZ19wYXJlbnQub3JlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9yaWdfbm9kZSBub3QgaW4gb3JpZ19wYXJlbnQub3JlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdfbm9kZSwgb3JpZ190eXBlID0gcmVkZWZfbm9kZSwgcmVkZWZfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZGVmX3BhcmVudCwgYXN0cm9pZC5JZgorICAgICAgICAgICAgICAgICAgICApIGFuZCByZWRlZl9wYXJlbnQgaW4gb3JpZ19wYXJlbnQubm9kZXNfb2ZfY2xhc3MoYXN0cm9pZC5JZik6CisgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX25vZGUsIG9yaWdfdHlwZSA9IHJlZGVmX25vZGUsIHJlZGVmX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgb3JpZ190eXBlID0gb3JpZ190eXBlLnJlcGxhY2UoQlVJTFRJTlMgKyAiLiIsICIiKQorICAgICAgICAgICAgICAgIHJlZGVmX3R5cGUgPSByZWRlZl90eXBlLnJlcGxhY2UoQlVJTFRJTlMgKyAiLiIsICIiKQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJyZWRlZmluZWQtdmFyaWFibGUtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgIG5vZGU9cmVkZWZfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgYXJncz0obmFtZSwgb3JpZ190eXBlLCByZWRlZl90eXBlKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiB2aXNpdF9hc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgICMgd2UgZG9uJ3QgaGFuZGxlIG11bHRpcGxlIGFzc2lnbm1lbnQgbm9yIHNsaWNlIGFzc2lnbm1lbnQKKyAgICAgICAgdGFyZ2V0ID0gbm9kZS50YXJnZXRzWzBdCisgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCAoYXN0cm9pZC5UdXBsZSwgYXN0cm9pZC5TdWJzY3JpcHQpKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIGlnbm9yZSBOb25lVHlwZQorICAgICAgICBpZiBpc19ub25lKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIF90eXBlID0gbm9kZV90eXBlKG5vZGUudmFsdWUpCisgICAgICAgIGlmIF90eXBlOgorICAgICAgICAgICAgc2VsZi5fYXNzaWduc1stMV0uc2V0ZGVmYXVsdCh0YXJnZXQuYXNfc3RyaW5nKCksIFtdKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgKG5vZGUsIF90eXBlLnB5dHlwZSgpKQorICAgICAgICAgICAgKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXIpOgorICAgICIiIlJlcXVpcmVkIG1ldGhvZCB0byBhdXRvIHJlZ2lzdGVyIHRoaXMgY2hlY2tlci4KKworICAgIDpwYXJhbSBsaW50ZXI6IE1haW4gaW50ZXJmYWNlIG9iamVjdCBmb3IgUHlsaW50IHBsdWdpbnMKKyAgICA6dHlwZSBsaW50ZXI6IFB5bGludCBvYmplY3QKKyAgICAiIiIKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihNdWx0aXBsZVR5cGVzQ2hlY2tlcihsaW50ZXIpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2V4dGVuc2lvbnMvdHlwaW5nLnB5IGIvcHlsaW50L2V4dGVuc2lvbnMvdHlwaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYmEyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy90eXBpbmcucHkKQEAgLTAsMCArMSwzMTggQEAKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBscnVfY2FjaGUKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBOYW1lZFR1cGxlLCBTZXQsIFVuaW9uCisKK2ltcG9ydCBhc3Ryb2lkCitpbXBvcnQgYXN0cm9pZC5iYXNlcworaW1wb3J0IGFzdHJvaWQubm9kZV9jbGFzc2VzCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0ICgKKyAgICBjaGVja19tZXNzYWdlcywKKyAgICBpc19ub2RlX2luX3R5cGVfYW5ub3RhdGlvbl9jb250ZXh0LAorICAgIHNhZmVfaW5mZXIsCispCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJQXN0cm9pZENoZWNrZXIKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IFB5TGludGVyCisKKworY2xhc3MgVHlwaW5nQWxpYXMoTmFtZWRUdXBsZSk6CisgICAgbmFtZTogc3RyCisgICAgbmFtZV9jb2xsaXNpb246IGJvb2wKKworCitERVBSRUNBVEVEX1RZUElOR19BTElBU0VTOiBEaWN0W3N0ciwgVHlwaW5nQWxpYXNdID0geworICAgICJ0eXBpbmcuVHVwbGUiOiBUeXBpbmdBbGlhcygidHVwbGUiLCBGYWxzZSksCisgICAgInR5cGluZy5MaXN0IjogVHlwaW5nQWxpYXMoImxpc3QiLCBGYWxzZSksCisgICAgInR5cGluZy5EaWN0IjogVHlwaW5nQWxpYXMoImRpY3QiLCBGYWxzZSksCisgICAgInR5cGluZy5TZXQiOiBUeXBpbmdBbGlhcygic2V0IiwgRmFsc2UpLAorICAgICJ0eXBpbmcuRnJvemVuU2V0IjogVHlwaW5nQWxpYXMoImZyb3plbnNldCIsIEZhbHNlKSwKKyAgICAidHlwaW5nLlR5cGUiOiBUeXBpbmdBbGlhcygidHlwZSIsIEZhbHNlKSwKKyAgICAidHlwaW5nLkRlcXVlIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmRlcXVlIiwgVHJ1ZSksCisgICAgInR5cGluZy5EZWZhdWx0RGljdCI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCIsIFRydWUpLAorICAgICJ0eXBpbmcuT3JkZXJlZERpY3QiOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiLCBUcnVlKSwKKyAgICAidHlwaW5nLkNvdW50ZXIiOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuQ291bnRlciIsIFRydWUpLAorICAgICJ0eXBpbmcuQ2hhaW5NYXAiOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuQ2hhaW5NYXAiLCBUcnVlKSwKKyAgICAidHlwaW5nLkF3YWl0YWJsZSI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlIiwgVHJ1ZSksCisgICAgInR5cGluZy5Db3JvdXRpbmUiOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuYWJjLkNvcm91dGluZSIsIFRydWUpLAorICAgICJ0eXBpbmcuQXN5bmNJdGVyYWJsZSI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYWJsZSIsIFRydWUpLAorICAgICJ0eXBpbmcuQXN5bmNJdGVyYXRvciI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYXRvciIsIFRydWUpLAorICAgICJ0eXBpbmcuQXN5bmNHZW5lcmF0b3IiOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuYWJjLkFzeW5jR2VuZXJhdG9yIiwgVHJ1ZSksCisgICAgInR5cGluZy5JdGVyYWJsZSI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGUiLCBUcnVlKSwKKyAgICAidHlwaW5nLkl0ZXJhdG9yIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5JdGVyYXRvciIsIFRydWUpLAorICAgICJ0eXBpbmcuR2VuZXJhdG9yIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5HZW5lcmF0b3IiLCBUcnVlKSwKKyAgICAidHlwaW5nLlJldmVyc2libGUiOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuYWJjLlJldmVyc2libGUiLCBUcnVlKSwKKyAgICAidHlwaW5nLkNvbnRhaW5lciI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyIiwgVHJ1ZSksCisgICAgInR5cGluZy5Db2xsZWN0aW9uIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uIiwgVHJ1ZSksCisgICAgInR5cGluZy5DYWxsYWJsZSI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuQ2FsbGFibGUiLCBUcnVlKSwKKyAgICAidHlwaW5nLkFic3RyYWN0U2V0IjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5TZXQiLCBGYWxzZSksCisgICAgInR5cGluZy5NdXRhYmxlU2V0IjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0IiwgVHJ1ZSksCisgICAgInR5cGluZy5NYXBwaW5nIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nIiwgVHJ1ZSksCisgICAgInR5cGluZy5NdXRhYmxlTWFwcGluZyI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmciLCBUcnVlKSwKKyAgICAidHlwaW5nLlNlcXVlbmNlIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIsIFRydWUpLAorICAgICJ0eXBpbmcuTXV0YWJsZVNlcXVlbmNlIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiLCBUcnVlKSwKKyAgICAidHlwaW5nLkJ5dGVTdHJpbmciOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmciLCBUcnVlKSwKKyAgICAidHlwaW5nLk1hcHBpbmdWaWV3IjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nVmlldyIsIFRydWUpLAorICAgICJ0eXBpbmcuS2V5c1ZpZXciOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuYWJjLktleXNWaWV3IiwgVHJ1ZSksCisgICAgInR5cGluZy5JdGVtc1ZpZXciOiBUeXBpbmdBbGlhcygiY29sbGVjdGlvbnMuYWJjLkl0ZW1zVmlldyIsIFRydWUpLAorICAgICJ0eXBpbmcuVmFsdWVzVmlldyI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlldyIsIFRydWUpLAorICAgICJ0eXBpbmcuQ29udGV4dE1hbmFnZXIiOiBUeXBpbmdBbGlhcygiY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyIiwgRmFsc2UpLAorICAgICJ0eXBpbmcuQXN5bmNDb250ZXh0TWFuYWdlciI6IFR5cGluZ0FsaWFzKAorICAgICAgICAiY29udGV4dGxpYi5BYnN0cmFjdEFzeW5jQ29udGV4dE1hbmFnZXIiLCBGYWxzZQorICAgICksCisgICAgInR5cGluZy5QYXR0ZXJuIjogVHlwaW5nQWxpYXMoInJlLlBhdHRlcm4iLCBUcnVlKSwKKyAgICAidHlwaW5nLk1hdGNoIjogVHlwaW5nQWxpYXMoInJlLk1hdGNoIiwgVHJ1ZSksCisgICAgInR5cGluZy5IYXNoYWJsZSI6IFR5cGluZ0FsaWFzKCJjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUiLCBUcnVlKSwKKyAgICAidHlwaW5nLlNpemVkIjogVHlwaW5nQWxpYXMoImNvbGxlY3Rpb25zLmFiYy5TaXplZCIsIFRydWUpLAorfQorCitBTElBU19OQU1FUyA9IGZyb3plbnNldChrZXkuc3BsaXQoIi4iKVsxXSBmb3Iga2V5IGluIERFUFJFQ0FURURfVFlQSU5HX0FMSUFTRVMpCitVTklPTl9OQU1FUyA9ICgiT3B0aW9uYWwiLCAiVW5pb24iKQorCisKK2NsYXNzIERlcHJlY2F0ZWRUeXBpbmdBbGlhc01zZyhOYW1lZFR1cGxlKToKKyAgICBub2RlOiBVbmlvblthc3Ryb2lkLk5hbWUsIGFzdHJvaWQuQXR0cmlidXRlXQorICAgIHFuYW1lOiBzdHIKKyAgICBhbGlhczogc3RyCisgICAgcGFyZW50X3N1YnNjcmlwdDogYm9vbAorCisKK2NsYXNzIFR5cGluZ0NoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiIkZpbmQgaXNzdWUgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdHlwZSBhbm5vdGF0aW9ucy4iIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKElBc3Ryb2lkQ2hlY2tlciwpCisKKyAgICBuYW1lID0gInR5cGluZyIKKyAgICBwcmlvcml0eSA9IC0xCisgICAgbXNncyA9IHsKKyAgICAgICAgIlc2MDAxIjogKAorICAgICAgICAgICAgIiclcycgaXMgZGVwcmVjYXRlZCwgdXNlICclcycgaW5zdGVhZCIsCisgICAgICAgICAgICAiZGVwcmVjYXRlZC10eXBpbmctYWxpYXMiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiBhIGRlcHJlY2F0ZWQgdHlwaW5nIGFsaWFzIGlzIHVzZWQuIiwKKyAgICAgICAgKSwKKyAgICAgICAgIlI2MDAyIjogKAorICAgICAgICAgICAgIiclcycgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJyVzJyBpbnN0ZWFkJXMiLAorICAgICAgICAgICAgImNvbnNpZGVyLXVzaW5nLWFsaWFzIiwKKyAgICAgICAgICAgICJPbmx5IGVtaXR0ZWQgaWYgJ3J1bnRpbWUtdHlwaW5nPW5vJyBhbmQgYSBkZXByZWNhdGVkICIKKyAgICAgICAgICAgICJ0eXBpbmcgYWxpYXMgaXMgdXNlZCBpbiBhIHR5cGUgYW5ub3RhdGlvbiBjb250ZXh0IGluICIKKyAgICAgICAgICAgICJQeXRob24gMy43IG9yIDMuOC4iLAorICAgICAgICApLAorICAgICAgICAiUjYwMDMiOiAoCisgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJyVzJyVzIiwKKyAgICAgICAgICAgICJjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXgiLAorICAgICAgICAgICAgIkVtaXR0ZWQgd2hlbiAndHlwaW5nLlVuaW9uJyBvciAndHlwaW5nLk9wdGlvbmFsJyBpcyB1c2VkICIKKyAgICAgICAgICAgICJpbnN0ZWFkIG9mIHRoZSBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggJ2ludCB8IE5vbmUnLiIsCisgICAgICAgICksCisgICAgfQorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJweS12ZXJzaW9uIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgzLCA3KSwKKyAgICAgICAgICAgICAgICAidHlwZSI6ICJweV92ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8cHlfdmVyc2lvbj4iLAorICAgICAgICAgICAgICAgICJoZWxwIjogKAorICAgICAgICAgICAgICAgICAgICAiTWluIFB5dGhvbiB2ZXJzaW9uIHRvIHVzZSBmb3IgdHlwaW5nIHJlbGF0ZWQgY2hlY2tzLCAiCisgICAgICAgICAgICAgICAgICAgICJlLmcuIGBgMy43YGAuIFRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBtaW4gc3VwcG9ydGVkIFB5dGhvbiAiCisgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0LiIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgInJ1bnRpbWUtdHlwaW5nIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IFRydWUsCisgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjx5X29yX24+IiwKKyAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgIlNldCB0byBgYG5vYGAgaWYgdGhlIGFwcCAvIGxpYnJhcnkgZG9lcyAqKk5PVCoqIG5lZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgdHlwZSBhbm5vdGF0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAiSWYgeW91IHVzZSB0eXBlIGFubm90YXRpb25zICoqZXhjbHVzaXZlbHkqKiBmb3IgdHlwZSBjaGVja2luZyAiCisgICAgICAgICAgICAgICAgICAgICJvZiBhbiBhcHBsaWNhdGlvbiwgeW91J3JlIHByb2JhYmx5IGZpbmUuIEZvciBsaWJyYXJpZXMsICIKKyAgICAgICAgICAgICAgICAgICAgImV2YWx1YXRlIGlmIHNvbWUgdXNlcnMgd2hhdCB0byBhY2Nlc3MgdGhlIHR5cGUgaGludHMgIgorICAgICAgICAgICAgICAgICAgICAiYXQgcnVudGltZSBmaXJzdCwgZS5nLiwgdGhyb3VnaCBgYHR5cGluZy5nZXRfdHlwZV9oaW50c2BgLiAiCisgICAgICAgICAgICAgICAgICAgICJBcHBsaWVzIHRvIFB5dGhvbiB2ZXJzaW9ucyAzLjcgLSAzLjkiCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICksCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbnRlcjogUHlMaW50ZXIpIC0+IE5vbmU6CisgICAgICAgICIiIkluaXRpYWxpemUgY2hlY2tlciBpbnN0YW5jZS4iIiIKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhsaW50ZXI9bGludGVyKQorICAgICAgICBzZWxmLl9hbGlhc19uYW1lX2NvbGxpc2lvbnM6IFNldFtzdHJdID0gc2V0KCkKKyAgICAgICAgc2VsZi5fY29uc2lkZXJfdXNpbmdfYWxpYXNfbXNnczogTGlzdFtEZXByZWNhdGVkVHlwaW5nQWxpYXNNc2ddID0gW10KKworICAgIEBscnVfY2FjaGUoKQorICAgIGRlZiBfcHkzN19wbHVzKHNlbGYpIC0+IGJvb2w6CisgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZy5weV92ZXJzaW9uID49ICgzLCA3KQorCisgICAgQGxydV9jYWNoZSgpCisgICAgZGVmIF9weTM5X3BsdXMoc2VsZikgLT4gYm9vbDoKKyAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLnB5X3ZlcnNpb24gPj0gKDMsIDkpCisKKyAgICBAbHJ1X2NhY2hlKCkKKyAgICBkZWYgX3B5MzEwX3BsdXMoc2VsZikgLT4gYm9vbDoKKyAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLnB5X3ZlcnNpb24gPj0gKDMsIDEwKQorCisgICAgQGxydV9jYWNoZSgpCisgICAgZGVmIF9zaG91bGRfY2hlY2tfdHlwaW5nX2FsaWFzKHNlbGYpIC0+IGJvb2w6CisgICAgICAgICIiIlRoZSB1c2Ugb2YgdHlwZSBhbGlhc2VzIChQRVAgNTg1KSByZXF1aXJlcyBQeXRob24gMy45CisgICAgICAgIG9yIFB5dGhvbiAzLjcrIHdpdGggcG9zdHBvbmVkIGV2YWx1YXRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgc2VsZi5fcHkzOV9wbHVzKCkKKyAgICAgICAgICAgIG9yIHNlbGYuX3B5MzdfcGx1cygpCisgICAgICAgICAgICBhbmQgc2VsZi5jb25maWcucnVudGltZV90eXBpbmcgaXMgRmFsc2UKKyAgICAgICAgKQorCisgICAgQGxydV9jYWNoZSgpCisgICAgZGVmIF9zaG91bGRfY2hlY2tfYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4KHNlbGYpIC0+IGJvb2w6CisgICAgICAgICIiIlRoZSB1c2Ugb2YgYWx0ZXJuYXRpdmUgdW5pb24gc3ludGF4IChQRVAgNjA0KSByZXF1aXJlcyBQeXRob24gMy4xMAorICAgICAgICBvciBQeXRob24gMy43KyB3aXRoIHBvc3Rwb25lZCBldmFsdWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgIHNlbGYuX3B5MzEwX3BsdXMoKQorICAgICAgICAgICAgb3Igc2VsZi5fcHkzN19wbHVzKCkKKyAgICAgICAgICAgIGFuZCBzZWxmLmNvbmZpZy5ydW50aW1lX3R5cGluZyBpcyBGYWxzZQorICAgICAgICApCisKKyAgICBkZWYgX21zZ19wb3N0cG9uZWRfZXZhbF9oaW50KHNlbGYsIG5vZGUpIC0+IHN0cjoKKyAgICAgICAgIiIiTWVzc2FnZSBoaW50IGlmIHBvc3Rwb25lZCBldmFsdWF0aW9uIGlzbid0IGVuYWJsZWQuIiIiCisgICAgICAgIGlmIHNlbGYuX3B5MzEwX3BsdXMoKSBvciAiYW5ub3RhdGlvbnMiIGluIG5vZGUucm9vdCgpLmZ1dHVyZV9pbXBvcnRzOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHJldHVybiAiLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwiCisKKyAgICBAY2hlY2tfbWVzc2FnZXMoCisgICAgICAgICJkZXByZWNhdGVkLXR5cGluZy1hbGlhcyIsCisgICAgICAgICJjb25zaWRlci11c2luZy1hbGlhcyIsCisgICAgICAgICJjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXgiLAorICAgICkKKyAgICBkZWYgdmlzaXRfbmFtZShzZWxmLCBub2RlOiBhc3Ryb2lkLk5hbWUpIC0+IE5vbmU6CisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF9jaGVja190eXBpbmdfYWxpYXMoKSBhbmQgbm9kZS5uYW1lIGluIEFMSUFTX05BTUVTOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfZm9yX3R5cGluZ19hbGlhcyhub2RlKQorICAgICAgICBpZiBzZWxmLl9zaG91bGRfY2hlY2tfYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4KCkgYW5kIG5vZGUubmFtZSBpbiBVTklPTl9OQU1FUzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2Zvcl9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXgobm9kZSwgbm9kZS5uYW1lKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKAorICAgICAgICAiZGVwcmVjYXRlZC10eXBpbmctYWxpYXMiLAorICAgICAgICAiY29uc2lkZXItdXNpbmctYWxpYXMiLAorICAgICAgICAiY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4IiwKKyAgICApCisgICAgZGVmIHZpc2l0X2F0dHJpYnV0ZShzZWxmLCBub2RlOiBhc3Ryb2lkLkF0dHJpYnV0ZSk6CisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF9jaGVja190eXBpbmdfYWxpYXMoKSBhbmQgbm9kZS5hdHRybmFtZSBpbiBBTElBU19OQU1FUzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2Zvcl90eXBpbmdfYWxpYXMobm9kZSkKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgc2VsZi5fc2hvdWxkX2NoZWNrX2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheCgpCisgICAgICAgICAgICBhbmQgbm9kZS5hdHRybmFtZSBpbiBVTklPTl9OQU1FUworICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfZm9yX2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheChub2RlLCBub2RlLmF0dHJuYW1lKQorCisgICAgZGVmIF9jaGVja19mb3JfYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4KAorICAgICAgICBzZWxmLAorICAgICAgICBub2RlOiBVbmlvblthc3Ryb2lkLk5hbWUsIGFzdHJvaWQuQXR0cmlidXRlXSwKKyAgICAgICAgbmFtZTogc3RyLAorICAgICkgLT4gTm9uZToKKyAgICAgICAgIiIiQ2hlY2sgaWYgYWx0ZXJuYXRpdmUgdW5pb24gc3ludGF4IGNvdWxkIGJlIHVzZWQuCisKKyAgICAgICAgUmVxdWlyZXMKKyAgICAgICAgLSBQeXRob24gMy4xMAorICAgICAgICAtIE9SOiBQeXRob24gMy43KyB3aXRoIHBvc3Rwb25lZCBldmFsdWF0aW9uIGluCisgICAgICAgICAgICAgIGEgdHlwZSBhbm5vdGF0aW9uIGNvbnRleHQKKyAgICAgICAgIiIiCisgICAgICAgIGluZmVycmVkID0gc2FmZV9pbmZlcihub2RlKQorICAgICAgICBpZiBub3QgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShpbmZlcnJlZCwgYXN0cm9pZC5GdW5jdGlvbkRlZikKKyAgICAgICAgICAgIGFuZCBpbmZlcnJlZC5xbmFtZSgpCisgICAgICAgICAgICBpbiAoCisgICAgICAgICAgICAgICAgInR5cGluZy5PcHRpb25hbCIsCisgICAgICAgICAgICAgICAgInR5cGluZy5VbmlvbiIsCisgICAgICAgICAgICApCisgICAgICAgICAgICBvciBpc2luc3RhbmNlKGluZmVycmVkLCBhc3Ryb2lkLmJhc2VzLkluc3RhbmNlKQorICAgICAgICAgICAgYW5kIGluZmVycmVkLnFuYW1lKCkgPT0gInR5cGluZy5fU3BlY2lhbEZvcm0iCisgICAgICAgICk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IChzZWxmLl9weTMxMF9wbHVzKCkgb3IgaXNfbm9kZV9pbl90eXBlX2Fubm90YXRpb25fY29udGV4dChub2RlKSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICJjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXgiLAorICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgYXJncz0obmFtZSwgc2VsZi5fbXNnX3Bvc3Rwb25lZF9ldmFsX2hpbnQobm9kZSkpLAorICAgICAgICApCisKKyAgICBkZWYgX2NoZWNrX2Zvcl90eXBpbmdfYWxpYXMoCisgICAgICAgIHNlbGYsCisgICAgICAgIG5vZGU6IFVuaW9uW2FzdHJvaWQuTmFtZSwgYXN0cm9pZC5BdHRyaWJ1dGVdLAorICAgICkgLT4gTm9uZToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdHlwaW5nIGFsaWFzIGlzIGRlcGVjYXRlZCBvciBjb3VsZCBiZSByZXBsYWNlZC4KKworICAgICAgICBSZXF1aXJlcworICAgICAgICAtIFB5dGhvbiAzLjkKKyAgICAgICAgLSBPUjogUHl0aG9uIDMuNysgd2l0aCBwb3N0cG9uZWQgZXZhbHVhdGlvbiBpbgorICAgICAgICAgICAgICBhIHR5cGUgYW5ub3RhdGlvbiBjb250ZXh0CisKKyAgICAgICAgRm9yIFB5dGhvbiAzLjcrOiBPbmx5IGVtaXR0IG1lc3NhZ2UgaWYgY2hhbmdlIGRvZXNuJ3QgY3JlYXRlCisgICAgICAgICAgICBhbnkgbmFtZSBjb2xsaXNpb25zLCBvbmx5IGV2ZXIgdXNlZCBpbiBhIHR5cGUgYW5ub3RhdGlvbgorICAgICAgICAgICAgY29udGV4dCwgYW5kIGNhbiBzYWZlbHkgYmUgcmVwbGFjZWQuCisgICAgICAgICIiIgorICAgICAgICBpbmZlcnJlZCA9IHNhZmVfaW5mZXIobm9kZSkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5mZXJyZWQsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFsaWFzID0gREVQUkVDQVRFRF9UWVBJTkdfQUxJQVNFUy5nZXQoaW5mZXJyZWQucW5hbWUoKSwgTm9uZSkKKyAgICAgICAgaWYgYWxpYXMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYuX3B5MzlfcGx1cygpOgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZC10eXBpbmctYWxpYXMiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPShpbmZlcnJlZC5xbmFtZSgpLCBhbGlhcy5uYW1lKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgRm9yIFBZMzcrLCBjaGVjayBmb3IgdHlwZSBhbm5vdGF0aW9uIGNvbnRleHQgZmlyc3QKKyAgICAgICAgaWYgbm90IGlzX25vZGVfaW5fdHlwZV9hbm5vdGF0aW9uX2NvbnRleHQobm9kZSkgYW5kIGlzaW5zdGFuY2UoCisgICAgICAgICAgICBub2RlLnBhcmVudCwgYXN0cm9pZC5TdWJzY3JpcHQKKyAgICAgICAgKToKKyAgICAgICAgICAgIGlmIGFsaWFzLm5hbWVfY29sbGlzaW9uIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5fYWxpYXNfbmFtZV9jb2xsaXNpb25zLmFkZChpbmZlcnJlZC5xbmFtZSgpKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NvbnNpZGVyX3VzaW5nX2FsaWFzX21zZ3MuYXBwZW5kKAorICAgICAgICAgICAgRGVwcmVjYXRlZFR5cGluZ0FsaWFzTXNnKAorICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgaW5mZXJyZWQucW5hbWUoKSwKKyAgICAgICAgICAgICAgICBhbGlhcy5uYW1lLAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5wYXJlbnQsIGFzdHJvaWQuU3Vic2NyaXB0KSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorCisgICAgQGNoZWNrX21lc3NhZ2VzKCJjb25zaWRlci11c2luZy1hbGlhcyIpCisgICAgZGVmIGxlYXZlX21vZHVsZShzZWxmLCBub2RlOiBhc3Ryb2lkLk1vZHVsZSkgLT4gTm9uZToKKyAgICAgICAgIiIiQWZ0ZXIgcGFyc2luZyBvZiBtb2R1bGUgaXMgY29tcGxldGUsIGFkZCBtZXNzYWdlcyBmb3IKKyAgICAgICAgJ2NvbnNpZGVyLXVzaW5nLWFsaWFzJyBjaGVjay4gTWFrZSBzdXJlIHJlc3VsdHMgYXJlIHNhZmUKKyAgICAgICAgdG8gcmVjb21tZW5kIC8gY29sbGlzaW9uIGZyZWUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9weTM3X3BsdXMoKSBhbmQgbm90IHNlbGYuX3B5MzlfcGx1cygpOgorICAgICAgICAgICAgbXNnX2Z1dHVyZV9pbXBvcnQgPSBzZWxmLl9tc2dfcG9zdHBvbmVkX2V2YWxfaGludChub2RlKQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYuX2NvbnNpZGVyX3VzaW5nX2FsaWFzX21zZ3MucG9wKDApCisgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbXNnLnFuYW1lIGluIHNlbGYuX2FsaWFzX25hbWVfY29sbGlzaW9uczoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAiY29uc2lkZXItdXNpbmctYWxpYXMiLAorICAgICAgICAgICAgICAgICAgICBub2RlPW1zZy5ub2RlLAorICAgICAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5xbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19mdXR1cmVfaW1wb3J0IGlmIG1zZy5wYXJlbnRfc3Vic2NyaXB0IGVsc2UgIiIsCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAjIENsZWFyIGFsbCBtb2R1bGUgY2FjaGUgdmFyaWFibGVzCisgICAgICAgIHNlbGYuX2FsaWFzX25hbWVfY29sbGlzaW9ucy5jbGVhcigpCisgICAgICAgIHNlbGYuX2NvbnNpZGVyX3VzaW5nX2FsaWFzX21zZ3MuY2xlYXIoKQorCisKK2RlZiByZWdpc3RlcihsaW50ZXI6IFB5TGludGVyKSAtPiBOb25lOgorICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFR5cGluZ0NoZWNrZXIobGludGVyKSkKZGlmZiAtLWdpdCBhL3B5bGludC9leHRlbnNpb25zL3R5cGluZy5yc3QgYi9weWxpbnQvZXh0ZW5zaW9ucy90eXBpbmcucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvZXh0ZW5zaW9ucy90eXBpbmcucnN0CkBAIC0wLDAgKzEgQEAKK0ZpbmQgaXNzdWUgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdHlwZSBhbm5vdGF0aW9ucy4KZGlmZiAtLWdpdCBhL3B5bGludC9ncmFwaC5weSBiL3B5bGludC9ncmFwaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjYyMDZhCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2dyYXBoLnB5CkBAIC0wLDAgKzEsMjA3IEBACisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNiBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBOaWNrIERyb3pkIDxuaWNob2xhc2Ryb3pkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIOiwreS5nem8jiA8MTA5MjI0NTczQHFxLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEJlbmphbWluIEdyYWhhbSA8YmVud2lsbGlhbWdyYWhhbUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbmRyZWFzIEZpbmtsZXIgPGFuZGkuZmlua2xlckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbmRyZXcgSG93ZSA8aG93ZWFqQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJHcmFwaCBtYW5pcHVsYXRpb24gdXRpbGl0aWVzLgorCisoZG90IGdlbmVyYXRpb24gYWRhcHRlZCBmcm9tIHB5cHkvdHJhbnNsYXRvci90b29sL21ha2VfZG90LnB5KQorIiIiCitpbXBvcnQgY29kZWNzCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworCitkZWYgdGFyZ2V0X2luZm9fZnJvbV9maWxlbmFtZShmaWxlbmFtZSk6CisgICAgIiIiVHJhbnNmb3JtcyAvc29tZS9wYXRoL2Zvby5wbmcgaW50byAoJy9zb21lL3BhdGgnLCAnZm9vLnBuZycsICdwbmcnKS4iIiIKKyAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgc3RvcmVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkKKyAgICB0YXJnZXQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVstMV1bMTpdCisgICAgcmV0dXJuIHN0b3JlZGlyLCBiYXNlbmFtZSwgdGFyZ2V0CisKKworY2xhc3MgRG90QmFja2VuZDoKKyAgICAiIiJEb3QgRmlsZSBiYWNrZW5kLiIiIgorCisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLAorICAgICAgICBncmFwaG5hbWUsCisgICAgICAgIHJhbmtkaXI9Tm9uZSwKKyAgICAgICAgc2l6ZT1Ob25lLAorICAgICAgICByYXRpbz1Ob25lLAorICAgICAgICBjaGFyc2V0PSJ1dGYtOCIsCisgICAgICAgIHJlbmRlcmVyPSJkb3QiLAorICAgICAgICBhZGRpdGlvbmFsX3BhcmFtPU5vbmUsCisgICAgKToKKyAgICAgICAgaWYgYWRkaXRpb25hbF9wYXJhbSBpcyBOb25lOgorICAgICAgICAgICAgYWRkaXRpb25hbF9wYXJhbSA9IHt9CisgICAgICAgIHNlbGYuZ3JhcGhuYW1lID0gZ3JhcGhuYW1lCisgICAgICAgIHNlbGYucmVuZGVyZXIgPSByZW5kZXJlcgorICAgICAgICBzZWxmLmxpbmVzID0gW10KKyAgICAgICAgc2VsZi5fc291cmNlID0gTm9uZQorICAgICAgICBzZWxmLmVtaXQoImRpZ3JhcGggJXMgeyIgJSBub3JtYWxpemVfbm9kZV9pZChncmFwaG5hbWUpKQorICAgICAgICBpZiByYW5rZGlyOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJyYW5rZGlyPSVzIiAlIHJhbmtkaXIpCisgICAgICAgIGlmIHJhdGlvOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJyYXRpbz0lcyIgJSByYXRpbykKKyAgICAgICAgaWYgc2l6ZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnc2l6ZT0iJXMiJyAlIHNpemUpCisgICAgICAgIGlmIGNoYXJzZXQ6CisgICAgICAgICAgICBhc3NlcnQgY2hhcnNldC5sb3dlcigpIGluICgidXRmLTgiLCAiaXNvLTg4NTktMSIsICJsYXRpbjEiKSwgKAorICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBjaGFyc2V0ICVzIiAlIGNoYXJzZXQKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnY2hhcnNldD0iJXMiJyAlIGNoYXJzZXQpCisgICAgICAgIGZvciBwYXJhbSBpbiBhZGRpdGlvbmFsX3BhcmFtLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmVtaXQoIj0iLmpvaW4ocGFyYW0pKQorCisgICAgZGVmIGdldF9zb3VyY2Uoc2VsZik6CisgICAgICAgICIiInJldHVybnMgc2VsZi5fc291cmNlIiIiCisgICAgICAgIGlmIHNlbGYuX3NvdXJjZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJ9XG4iKQorICAgICAgICAgICAgc2VsZi5fc291cmNlID0gIlxuIi5qb2luKHNlbGYubGluZXMpCisgICAgICAgICAgICBkZWwgc2VsZi5saW5lcworICAgICAgICByZXR1cm4gc2VsZi5fc291cmNlCisKKyAgICBzb3VyY2UgPSBwcm9wZXJ0eShnZXRfc291cmNlKQorCisgICAgZGVmIGdlbmVyYXRlKHNlbGYsIG91dHB1dGZpbGU6IHN0ciA9IE5vbmUsIG1hcGZpbGU6IHN0ciA9IE5vbmUpIC0+IHN0cjoKKyAgICAgICAgIiIiR2VuZXJhdGVzIGEgZ3JhcGggZmlsZS4KKworICAgICAgICA6cGFyYW0gc3RyIG91dHB1dGZpbGU6IGZpbGVuYW1lIGFuZCBwYXRoIFtkZWZhdWx0cyB0byBncmFwaG5hbWUucG5nXQorICAgICAgICA6cGFyYW0gc3RyIG1hcGZpbGU6IGZpbGVuYW1lIGFuZCBwYXRoCisKKyAgICAgICAgOnJ0eXBlOiBzdHIKKyAgICAgICAgOnJldHVybjogYSBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZQorICAgICAgICA6cmFpc2VzIFJ1bnRpbWVFcnJvcjogaWYgdGhlIGV4ZWN1dGFibGUgZm9yIHJlbmRlcmluZyB3YXMgbm90IGZvdW5kCisgICAgICAgICIiIgorICAgICAgICBncmFwaHZpel9leHRlbnNpb25zID0gKCJkb3QiLCAiZ3YiKQorICAgICAgICBuYW1lID0gc2VsZi5ncmFwaG5hbWUKKyAgICAgICAgaWYgb3V0cHV0ZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgdGFyZ2V0ID0gInBuZyIKKyAgICAgICAgICAgIHBkb3QsIGRvdF9zb3VyY2VwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgiLmd2IiwgbmFtZSkKKyAgICAgICAgICAgIHBwbmcsIG91dHB1dGZpbGUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCIucG5nIiwgbmFtZSkKKyAgICAgICAgICAgIG9zLmNsb3NlKHBkb3QpCisgICAgICAgICAgICBvcy5jbG9zZShwcG5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgXywgXywgdGFyZ2V0ID0gdGFyZ2V0X2luZm9fZnJvbV9maWxlbmFtZShvdXRwdXRmaWxlKQorICAgICAgICAgICAgaWYgbm90IHRhcmdldDoKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSAicG5nIgorICAgICAgICAgICAgICAgIG91dHB1dGZpbGUgPSBvdXRwdXRmaWxlICsgIi4iICsgdGFyZ2V0CisgICAgICAgICAgICBpZiB0YXJnZXQgbm90IGluIGdyYXBodml6X2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgcGRvdCwgZG90X3NvdXJjZXBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCIuZ3YiLCBuYW1lKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKHBkb3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRvdF9zb3VyY2VwYXRoID0gb3V0cHV0ZmlsZQorICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKGRvdF9zb3VyY2VwYXRoLCAidyIsIGVuY29kaW5nPSJ1dGY4IikgYXMgcGRvdDogICMgdHlwZTogaWdub3JlCisgICAgICAgICAgICBwZG90LndyaXRlKHNlbGYuc291cmNlKSAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgaWYgdGFyZ2V0IG5vdCBpbiBncmFwaHZpel9leHRlbnNpb25zOgorICAgICAgICAgICAgaWYgc2h1dGlsLndoaWNoKHNlbGYucmVuZGVyZXIpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAgICAgICBmIkNhbm5vdCBnZW5lcmF0ZSBge291dHB1dGZpbGV9YCBiZWNhdXNlICd7c2VsZi5yZW5kZXJlcn0nICIKKyAgICAgICAgICAgICAgICAgICAgImV4ZWN1dGFibGUgbm90IGZvdW5kLiBJbnN0YWxsIGdyYXBodml6LCBvciBzcGVjaWZ5IGEgYC5ndmAgIgorICAgICAgICAgICAgICAgICAgICAib3V0cHV0ZmlsZSB0byBwcm9kdWNlIHRoZSBET1Qgc291cmNlIGNvZGUuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHVzZV9zaGVsbCA9IHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiCisgICAgICAgICAgICBpZiBtYXBmaWxlOgorICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2FsbCgKKyAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICItVGNtYXB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICItbyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIi1UIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdF9zb3VyY2VwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIi1vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dGZpbGUsCisgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgIHNoZWxsPXVzZV9zaGVsbCwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2FsbCgKKyAgICAgICAgICAgICAgICAgICAgW3NlbGYucmVuZGVyZXIsICItVCIsIHRhcmdldCwgZG90X3NvdXJjZXBhdGgsICItbyIsIG91dHB1dGZpbGVdLAorICAgICAgICAgICAgICAgICAgICBzaGVsbD11c2Vfc2hlbGwsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgb3MudW5saW5rKGRvdF9zb3VyY2VwYXRoKQorICAgICAgICByZXR1cm4gb3V0cHV0ZmlsZQorCisgICAgZGVmIGVtaXQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkFkZHMgPGxpbmU+IHRvIGZpbmFsIG91dHB1dC4iIiIKKyAgICAgICAgc2VsZi5saW5lcy5hcHBlbmQobGluZSkKKworICAgIGRlZiBlbWl0X2VkZ2Uoc2VsZiwgbmFtZTEsIG5hbWUyLCAqKnByb3BzKToKKyAgICAgICAgIiIiZW1pdCBhbiBlZGdlIGZyb20gPG5hbWUxPiB0byA8bmFtZTI+LgorICAgICAgICBlZGdlIHByb3BlcnRpZXM6IHNlZSBodHRwczovL3d3dy5ncmFwaHZpei5vcmcvZG9jL2luZm8vYXR0cnMuaHRtbAorICAgICAgICAiIiIKKyAgICAgICAgYXR0cnMgPSBbZid7cHJvcH09Int2YWx1ZX0iJyBmb3IgcHJvcCwgdmFsdWUgaW4gcHJvcHMuaXRlbXMoKV0KKyAgICAgICAgbl9mcm9tLCBuX3RvID0gbm9ybWFsaXplX25vZGVfaWQobmFtZTEpLCBub3JtYWxpemVfbm9kZV9pZChuYW1lMikKKyAgICAgICAgc2VsZi5lbWl0KCJ7fSAtPiB7fSBbe31dOyIuZm9ybWF0KG5fZnJvbSwgbl90bywgIiwgIi5qb2luKHNvcnRlZChhdHRycykpKSkKKworICAgIGRlZiBlbWl0X25vZGUoc2VsZiwgbmFtZSwgKipwcm9wcyk6CisgICAgICAgICIiImVtaXQgYSBub2RlIHdpdGggZ2l2ZW4gcHJvcGVydGllcy4KKyAgICAgICAgbm9kZSBwcm9wZXJ0aWVzOiBzZWUgaHR0cHM6Ly93d3cuZ3JhcGh2aXoub3JnL2RvYy9pbmZvL2F0dHJzLmh0bWwKKyAgICAgICAgIiIiCisgICAgICAgIGF0dHJzID0gW2Yne3Byb3B9PSJ7dmFsdWV9IicgZm9yIHByb3AsIHZhbHVlIGluIHByb3BzLml0ZW1zKCldCisgICAgICAgIHNlbGYuZW1pdCgie30gW3t9XTsiLmZvcm1hdChub3JtYWxpemVfbm9kZV9pZChuYW1lKSwgIiwgIi5qb2luKHNvcnRlZChhdHRycykpKSkKKworCitkZWYgbm9ybWFsaXplX25vZGVfaWQobmlkKToKKyAgICAiIiJSZXR1cm5zIGEgc3VpdGFibGUgRE9UIG5vZGUgaWQgZm9yIGBuaWRgLiIiIgorICAgIHJldHVybiAnIiVzIicgJSBuaWQKKworCitkZWYgZ2V0X2N5Y2xlcyhncmFwaF9kaWN0LCB2ZXJ0aWNlcz1Ob25lKToKKyAgICAiIiJnaXZlbiBhIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIGFuIG9yZGVyZWQgZ3JhcGggKGkuZS4ga2V5IGFyZSB2ZXJ0aWNlcworICAgIGFuZCB2YWx1ZXMgaXMgYSBsaXN0IG9mIGRlc3RpbmF0aW9uIHZlcnRpY2VzIHJlcHJlc2VudGluZyBlZGdlcyksIHJldHVybiBhCisgICAgbGlzdCBvZiBkZXRlY3RlZCBjeWNsZXMKKyAgICAiIiIKKyAgICBpZiBub3QgZ3JhcGhfZGljdDoKKyAgICAgICAgcmV0dXJuICgpCisgICAgcmVzdWx0ID0gW10KKyAgICBpZiB2ZXJ0aWNlcyBpcyBOb25lOgorICAgICAgICB2ZXJ0aWNlcyA9IGdyYXBoX2RpY3Qua2V5cygpCisgICAgZm9yIHZlcnRpY2UgaW4gdmVydGljZXM6CisgICAgICAgIF9nZXRfY3ljbGVzKGdyYXBoX2RpY3QsIFtdLCBzZXQoKSwgcmVzdWx0LCB2ZXJ0aWNlKQorICAgIHJldHVybiByZXN1bHQKKworCitkZWYgX2dldF9jeWNsZXMoZ3JhcGhfZGljdCwgcGF0aCwgdmlzaXRlZCwgcmVzdWx0LCB2ZXJ0aWNlKToKKyAgICAiIiJyZWN1cnNpdmUgZnVuY3Rpb24gZG9pbmcgdGhlIHJlYWwgd29yayBmb3IgZ2V0X2N5Y2xlcyIiIgorICAgIGlmIHZlcnRpY2UgaW4gcGF0aDoKKyAgICAgICAgY3ljbGUgPSBbdmVydGljZV0KKyAgICAgICAgZm9yIG5vZGUgaW4gcGF0aFs6Oi0xXToKKyAgICAgICAgICAgIGlmIG5vZGUgPT0gdmVydGljZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY3ljbGUuaW5zZXJ0KDAsIG5vZGUpCisgICAgICAgICMgbWFrZSBhIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbgorICAgICAgICBzdGFydF9mcm9tID0gbWluKGN5Y2xlKQorICAgICAgICBpbmRleCA9IGN5Y2xlLmluZGV4KHN0YXJ0X2Zyb20pCisgICAgICAgIGN5Y2xlID0gY3ljbGVbaW5kZXg6XSArIGN5Y2xlWzA6aW5kZXhdCisgICAgICAgICMgYXBwZW5kIGl0IHRvIHJlc3VsdCBpZiBub3QgYWxyZWFkeSBpbgorICAgICAgICBpZiBjeWNsZSBub3QgaW4gcmVzdWx0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjeWNsZSkKKyAgICAgICAgcmV0dXJuCisgICAgcGF0aC5hcHBlbmQodmVydGljZSkKKyAgICB0cnk6CisgICAgICAgIGZvciBub2RlIGluIGdyYXBoX2RpY3RbdmVydGljZV06CisgICAgICAgICAgICAjIGRvbid0IGNoZWNrIGFscmVhZHkgdmlzaXRlZCBub2RlcyBhZ2FpbgorICAgICAgICAgICAgaWYgbm9kZSBub3QgaW4gdmlzaXRlZDoKKyAgICAgICAgICAgICAgICBfZ2V0X2N5Y2xlcyhncmFwaF9kaWN0LCBwYXRoLCB2aXNpdGVkLCByZXN1bHQsIG5vZGUpCisgICAgICAgICAgICAgICAgdmlzaXRlZC5hZGQobm9kZSkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBwYXRoLnBvcCgpCmRpZmYgLS1naXQgYS9weWxpbnQvaW50ZXJmYWNlcy5weSBiL3B5bGludC9pbnRlcmZhY2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvaW50ZXJmYWNlcy5weQpAQCAtMCwwICsxLDEwMSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgMjAxMi0yMDEzIExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWwgTm93aWtvd3NraSA8Z29kZnJ5ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBGbG9yaWFuIEJydWhpbiA8bWVAdGhlLWNvbXBpbGVyLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJJbnRlcmZhY2VzIGZvciBQeWxpbnQgb2JqZWN0cyIiIgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorCitDb25maWRlbmNlID0gbmFtZWR0dXBsZSgiQ29uZmlkZW5jZSIsIFsibmFtZSIsICJkZXNjcmlwdGlvbiJdKQorIyBXYXJuaW5nIENlcnRhaW50aWVzCitISUdIID0gQ29uZmlkZW5jZSgiSElHSCIsICJObyBmYWxzZSBwb3NpdGl2ZSBwb3NzaWJsZS4iKQorSU5GRVJFTkNFID0gQ29uZmlkZW5jZSgiSU5GRVJFTkNFIiwgIldhcm5pbmcgYmFzZWQgb24gaW5mZXJlbmNlIHJlc3VsdC4iKQorSU5GRVJFTkNFX0ZBSUxVUkUgPSBDb25maWRlbmNlKAorICAgICJJTkZFUkVOQ0VfRkFJTFVSRSIsICJXYXJuaW5nIGJhc2VkIG9uIGluZmVyZW5jZSB3aXRoIGZhaWx1cmVzLiIKKykKK1VOREVGSU5FRCA9IENvbmZpZGVuY2UoIlVOREVGSU5FRCIsICJXYXJuaW5nIHdpdGhvdXQgYW55IGFzc29jaWF0ZWQgY29uZmlkZW5jZSBsZXZlbC4iKQorCitDT05GSURFTkNFX0xFVkVMUyA9IFtISUdILCBJTkZFUkVOQ0UsIElORkVSRU5DRV9GQUlMVVJFLCBVTkRFRklORURdCisKKworY2xhc3MgSW50ZXJmYWNlOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGludGVyZmFjZXMuIiIiCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgaXNfaW1wbGVtZW50ZWRfYnkoY2xzLCBpbnN0YW5jZSk6CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRzKGluc3RhbmNlLCBjbHMpCisKKworZGVmIGltcGxlbWVudHMob2JqLCBpbnRlcmZhY2UpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBnaXZlIG9iamVjdCAobWF5YmUgYW4gaW5zdGFuY2Ugb3IgY2xhc3MpIGltcGxlbWVudHMKKyAgICB0aGUgaW50ZXJmYWNlLgorICAgICIiIgorICAgIGtpbXBsZW1lbnRzID0gZ2V0YXR0cihvYmosICJfX2ltcGxlbWVudHNfXyIsICgpKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGtpbXBsZW1lbnRzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAga2ltcGxlbWVudHMgPSAoa2ltcGxlbWVudHMsKQorICAgIGZvciBpbXBsZW1lbnRlZGludGVyZmFjZSBpbiBraW1wbGVtZW50czoKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhpbXBsZW1lbnRlZGludGVyZmFjZSwgaW50ZXJmYWNlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgSUNoZWNrZXIoSW50ZXJmYWNlKToKKyAgICAiIiJUaGlzIGlzIGEgYmFzZSBpbnRlcmZhY2UsIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIGVsc2V3aGVyZSB0aGFuIGZvcgorICAgIHN1YiBpbnRlcmZhY2VzIGRlZmluaXRpb24uCisgICAgIiIiCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgIiIiY2FsbGVkIGJlZm9yZSB2aXNpdGluZyBwcm9qZWN0IChpLmUgc2V0IG9mIG1vZHVsZXMpIiIiCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiImNhbGxlZCBhZnRlciB2aXNpdGluZyBwcm9qZWN0IChpLmUgc2V0IG9mIG1vZHVsZXMpIiIiCisKKworY2xhc3MgSVJhd0NoZWNrZXIoSUNoZWNrZXIpOgorICAgICIiImludGVyZmFjZSBmb3IgY2hlY2tlciB3aGljaCBuZWVkIHRvIHBhcnNlIHRoZSByYXcgZmlsZSIiIgorCisgICAgZGVmIHByb2Nlc3NfbW9kdWxlKHNlbGYsIGFzdHJvaWQpOgorICAgICAgICAiIiJwcm9jZXNzIGEgbW9kdWxlCisKKyAgICAgICAgdGhlIG1vZHVsZSdzIGNvbnRlbnQgaXMgYWNjZXNzaWJsZSB2aWEgYXN0cm9pZC5zdHJlYW0KKyAgICAgICAgIiIiCisKKworY2xhc3MgSVRva2VuQ2hlY2tlcihJQ2hlY2tlcik6CisgICAgIiIiSW50ZXJmYWNlIGZvciBjaGVja2VycyB0aGF0IG5lZWQgYWNjZXNzIHRvIHRoZSB0b2tlbiBsaXN0LiIiIgorCisgICAgZGVmIHByb2Nlc3NfdG9rZW5zKHNlbGYsIHRva2Vucyk6CisgICAgICAgICIiIlByb2Nlc3MgYSBtb2R1bGUuCisKKyAgICAgICAgdG9rZW5zIGlzIGEgbGlzdCBvZiBhbGwgc291cmNlIGNvZGUgdG9rZW5zIGluIHRoZSBmaWxlLgorICAgICAgICAiIiIKKworCitjbGFzcyBJQXN0cm9pZENoZWNrZXIoSUNoZWNrZXIpOgorICAgICIiImludGVyZmFjZSBmb3IgY2hlY2tlciB3aGljaCBwcmVmZXJzIHJlY2VpdmUgZXZlbnRzIGFjY29yZGluZyB0bworICAgIHN0YXRlbWVudCB0eXBlCisgICAgIiIiCisKKworY2xhc3MgSVJlcG9ydGVyKEludGVyZmFjZSk6CisgICAgIiIicmVwb3J0ZXIgY29sbGVjdCBtZXNzYWdlcyBhbmQgZGlzcGxheSByZXN1bHRzIGVuY2Fwc3VsYXRlZCBpbiBhIGxheW91dCIiIgorCisgICAgZGVmIGhhbmRsZV9tZXNzYWdlKHNlbGYsIG1zZykgLT4gTm9uZToKKyAgICAgICAgIiIiSGFuZGxlIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC4iIiIKKworICAgIGRlZiBkaXNwbGF5X3JlcG9ydHMoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgIiIiZGlzcGxheSByZXN1bHRzIGVuY2Fwc3VsYXRlZCBpbiB0aGUgbGF5b3V0IHRyZWUiIiIKKworCitfX2FsbF9fID0gKCJJUmF3Q2hlY2tlciIsICJJQXN0cm9pZENoZWNrZXIiLCAiSVRva2VuQ2hlY2tlciIsICJJUmVwb3J0ZXIiKQpkaWZmIC0tZ2l0IGEvcHlsaW50L2xpbnQvX19pbml0X18ucHkgYi9weWxpbnQvbGludC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M1MGYzCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2xpbnQvX19pbml0X18ucHkKQEAgLTAsMCArMSwxMDQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMDggRmFicmljZSBEb3VjaGFudCA8RmFicmljZS5Eb3VjaGFudEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMDkgVmluY2VudAorIyBDb3B5cmlnaHQgKGMpIDIwMDkgTWFkcyBLaWlsZXJpY2ggPG1hZHNAa2lpbGVyaWNoLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMiBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQHNvbnltb2JpbGUuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgS2V2aW4gSmluZyBRaXUgPGtldmluLmppbmcucWl1QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEZFTEQgQm9yaXMgPGxvdGhpcmFsZGFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEpUIE9sZHMgPGp0b2xkc0B4bmV0NS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBNaWNoYWwgTm93aWtvd3NraSA8Z29kZnJ5ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBbGV4YW5kcnUgQ29tYW4gPGZjb21hbkBiaXRkZWZlbmRlci5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBEYW5pZWwgSGFyZGluZyA8ZGhhcmRpbmdAbGl2aW5nMTgwLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgRGFuIEdvbGRzbWl0aCA8ZGpnb2xkc21pdGhAZ29vZ2xlbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IEZsb3JpYW4gQnJ1aGluIDxtZUB0aGUtY29tcGlsZXIub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQXJ1IFNhaG5pIDxhcnVzYWhuaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBTdGV2ZW4gTXlpbnQgPGhnQHN0ZXZlbm15aW50LmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFNpbXUgVG9uaSA8c2ltdXRvbmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgTWloYWkgQmFsaW50IDxiYWxpbnQubWloYWlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbGVubkBlLWRhZC5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNiBBbGFuIEV2YW5nZWxpc3RhIDxhbGFub2VAbGludXgudm5ldC5pYm0uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOSBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxNyBEYW5pZWwgTWlsbGVyIDxtaWxsZXJkZXZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgUm9tYW4gSXZhbm92IDxtZUByb2l2YW5vdi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBOZWQgQmF0Y2hlbGRlciA8bmVkQG5lZGJhdGNoZWxkZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LCAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBOaWNrIERyb3pkIDxuaWNob2xhc2Ryb3pkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1hdHVzIFZhbG8gPG1hdHVzdmFsb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBMdWNhcyBDaW1vbiA8bHVjYXMuY2ltb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUmFuZGFsbCBMZWVkcyA8cmFuZGFsbEBibGVlZHMuaW5mbz4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU3VzaG9iaGl0IDwzMTk4Nzc2OStzdXNob2JoaXQyN0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBKYXNvbiBPd2VuIDxqYXNvbi5hLm93ZW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggR2FyeSBUeWxlciBNY0xlb2QgPG1haWxAZ2FyeXR5bGVyLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFl1dmFsIExhbmdlciA8eXV2YWxsYW5nZXJAbWFpbC50YXUuYWMuaWw+CisjIENvcHlyaWdodCAoYykgMjAxOCBrYXBzaCA8a2Fwc2hAa2FwLnNoPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgc3l1dGJhaSA8c3l1dGJhaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBUaG9tYXMgSGlzY2ggPHQuaGlzY2hAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVndWVzIDxodWd1ZXMuYnJ1YW50QGFmZmlybS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBKYW5uZSBSw7Zua2vDtiA8amFubmVyb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgVHJldm9yIEJla29sYXkgPHRiZWtvbGF5QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgUm9iZXJ0IFNjaHdlaXplciA8cm9iZXJ0X3NjaHdlaXplckBnbXguZGU+CisjIENvcHlyaWdodCAoYykgMjAxOSBBbmRyZXMgUGVyZXogSG9ydGFsIDxhbmRyZXNwZXJlemNiYUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBQZXRlciBLb2xidXMgPHBldGVyLmtvbGJ1c0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBOaWNvbGFzIERpY2tyZXV0ZXIgPGRpY2tyZXV0ZXJAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRnJhbmsgSGFycmlzb24gPGZyYW5rQGRvdWJsZXRoZWZpc2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgYW51YmgtdiA8YW51YmhhdkB1Lm51cy5lZHU+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiIHB5bGludCBbb3B0aW9uc10gbW9kdWxlc19vcl9wYWNrYWdlcworCisgIENoZWNrIHRoYXQgbW9kdWxlKHMpIHNhdGlzZnkgYSBjb2Rpbmcgc3RhbmRhcmQgKGFuZCBtb3JlICEpLgorCisgICAgcHlsaW50IC0taGVscAorCisgIERpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKyAgICBweWxpbnQgLS1oZWxwLW1zZyA8bXNnLWlkPlssPG1zZy1pZD5dCisKKyAgRGlzcGxheSBoZWxwIG1lc3NhZ2VzIGFib3V0IGdpdmVuIG1lc3NhZ2UgaWRlbnRpZmllcnMgYW5kIGV4aXQuCisiIiIKK2ltcG9ydCBzeXMKKworZnJvbSBweWxpbnQubGludC5wYXJhbGxlbCBpbXBvcnQgY2hlY2tfcGFyYWxsZWwKK2Zyb20gcHlsaW50LmxpbnQucHlsaW50ZXIgaW1wb3J0IFB5TGludGVyCitmcm9tIHB5bGludC5saW50LnJlcG9ydF9mdW5jdGlvbnMgaW1wb3J0ICgKKyAgICByZXBvcnRfbWVzc2FnZXNfYnlfbW9kdWxlX3N0YXRzLAorICAgIHJlcG9ydF9tZXNzYWdlc19zdGF0cywKKyAgICByZXBvcnRfdG90YWxfbWVzc2FnZXNfc3RhdHMsCispCitmcm9tIHB5bGludC5saW50LnJ1biBpbXBvcnQgUnVuCitmcm9tIHB5bGludC5saW50LnV0aWxzIGltcG9ydCAoCisgICAgQXJndW1lbnRQcmVwcm9jZXNzaW5nRXJyb3IsCisgICAgX3BhdGNoX3N5c19wYXRoLAorICAgIGZpeF9pbXBvcnRfcGF0aCwKKyAgICBwcmVwcm9jZXNzX29wdGlvbnMsCispCisKK19fYWxsX18gPSBbCisgICAgImNoZWNrX3BhcmFsbGVsIiwKKyAgICAiUHlMaW50ZXIiLAorICAgICJyZXBvcnRfbWVzc2FnZXNfYnlfbW9kdWxlX3N0YXRzIiwKKyAgICAicmVwb3J0X21lc3NhZ2VzX3N0YXRzIiwKKyAgICAicmVwb3J0X3RvdGFsX21lc3NhZ2VzX3N0YXRzIiwKKyAgICAiUnVuIiwKKyAgICAiQXJndW1lbnRQcmVwcm9jZXNzaW5nRXJyb3IiLAorICAgICJfcGF0Y2hfc3lzX3BhdGgiLAorICAgICJmaXhfaW1wb3J0X3BhdGgiLAorICAgICJwcmVwcm9jZXNzX29wdGlvbnMiLAorXQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIFJ1bihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS9weWxpbnQvbGludC9leHBhbmRfbW9kdWxlcy5weSBiL3B5bGludC9saW50L2V4cGFuZF9tb2R1bGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTI3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvbGludC9leHBhbmRfbW9kdWxlcy5weQpAQCAtMCwwICsxLDE0MCBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgUGF0dGVybiwgVHVwbGUKKworZnJvbSBhc3Ryb2lkIGltcG9ydCBtb2R1dGlscworCisKK2RlZiBfbW9kcGF0aF9mcm9tX2ZpbGUoZmlsZW5hbWUsIGlzX25hbWVzcGFjZSwgcGF0aD1Ob25lKToKKyAgICBkZWYgX2lzX3BhY2thZ2VfY2IocGF0aCwgcGFydHMpOgorICAgICAgICByZXR1cm4gbW9kdXRpbHMuY2hlY2tfbW9kcGF0aF9oYXNfaW5pdChwYXRoLCBwYXJ0cykgb3IgaXNfbmFtZXNwYWNlCisKKyAgICByZXR1cm4gbW9kdXRpbHMubW9kcGF0aF9mcm9tX2ZpbGVfd2l0aF9jYWxsYmFjaygKKyAgICAgICAgZmlsZW5hbWUsIHBhdGg9cGF0aCwgaXNfcGFja2FnZV9jYj1faXNfcGFja2FnZV9jYgorICAgICkKKworCitkZWYgZ2V0X3B5dGhvbl9wYXRoKGZpbGVwYXRoOiBzdHIpIC0+IHN0cjoKKyAgICAiIiJUT0RPIFRoaXMgZ2V0IHRoZSBweXRob24gcGF0aCB3aXRoIHRoZSAoYmFkKSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgaXMgYWx3YXlzCisgICAgYW4gX19pbml0X18ucHkuIFRoaXMgaXMgbm90IHRydWUgc2luY2UgcHl0aG9uIDMuMyBhbmQgaXMgY2F1c2luZyBwcm9ibGVtLiIiIgorICAgIGRpcm5hbWUgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZXhwYW5kdXNlcihmaWxlcGF0aCkpCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CisgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoZGlybmFtZSkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGRpcm5hbWUsICJfX2luaXRfXy5weSIpKToKKyAgICAgICAgICAgIHJldHVybiBkaXJuYW1lCisgICAgICAgIG9sZF9kaXJuYW1lID0gZGlybmFtZQorICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGRpcm5hbWUpCisgICAgICAgIGlmIG9sZF9kaXJuYW1lID09IGRpcm5hbWU6CisgICAgICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKKworCitkZWYgX2lzX2luX2lnbm9yZV9saXN0X3JlKGVsZW1lbnQ6IHN0ciwgaWdub3JlX2xpc3RfcmU6IExpc3RbUGF0dGVybl0pIC0+IGJvb2w6CisgICAgIiIiZGV0ZXJtaW5lcyBpZiB0aGUgZWxlbWVudCBpcyBtYXRjaGVkIGluIGEgcmVnZXggaWdub3JlLWxpc3QiIiIKKyAgICBmb3IgZmlsZV9wYXR0ZXJuIGluIGlnbm9yZV9saXN0X3JlOgorICAgICAgICBpZiBmaWxlX3BhdHRlcm4ubWF0Y2goZWxlbWVudCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBleHBhbmRfbW9kdWxlcygKKyAgICBmaWxlc19vcl9tb2R1bGVzOiBMaXN0W3N0cl0sCisgICAgaWdub3JlX2xpc3Q6IExpc3Rbc3RyXSwKKyAgICBpZ25vcmVfbGlzdF9yZTogTGlzdFtQYXR0ZXJuXSwKKyAgICBpZ25vcmVfbGlzdF9wYXRoc19yZTogTGlzdFtQYXR0ZXJuXSwKKykgLT4gVHVwbGVbTGlzdFtkaWN0XSwgTGlzdFtkaWN0XV06CisgICAgIiIidGFrZSBhIGxpc3Qgb2YgZmlsZXMvbW9kdWxlcy9wYWNrYWdlcyBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIHR1cGxlCisgICAgKGZpbGUsIG1vZHVsZSBuYW1lKSB3aGljaCBoYXZlIHRvIGJlIGFjdHVhbGx5IGNoZWNrZWQKKyAgICAiIiIKKyAgICByZXN1bHQgPSBbXQorICAgIGVycm9ycyA9IFtdCisgICAgcGF0aCA9IHN5cy5wYXRoLmNvcHkoKQorCisgICAgZm9yIHNvbWV0aGluZyBpbiBmaWxlc19vcl9tb2R1bGVzOgorICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc29tZXRoaW5nKQorICAgICAgICBpZiAoCisgICAgICAgICAgICBiYXNlbmFtZSBpbiBpZ25vcmVfbGlzdAorICAgICAgICAgICAgb3IgX2lzX2luX2lnbm9yZV9saXN0X3JlKG9zLnBhdGguYmFzZW5hbWUoc29tZXRoaW5nKSwgaWdub3JlX2xpc3RfcmUpCisgICAgICAgICAgICBvciBfaXNfaW5faWdub3JlX2xpc3RfcmUoc29tZXRoaW5nLCBpZ25vcmVfbGlzdF9wYXRoc19yZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG1vZHVsZV9wYXRoID0gZ2V0X3B5dGhvbl9wYXRoKHNvbWV0aGluZykKKyAgICAgICAgYWRkaXRpb25hbF9zZWFyY2hfcGF0aCA9IFsiLiIsIG1vZHVsZV9wYXRoXSArIHBhdGgKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc29tZXRoaW5nKToKKyAgICAgICAgICAgICMgdGhpcyBpcyBhIGZpbGUgb3IgYSBkaXJlY3RvcnkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gIi4iLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIG1vZHV0aWxzLm1vZHBhdGhfZnJvbV9maWxlKHNvbWV0aGluZywgcGF0aD1hZGRpdGlvbmFsX3NlYXJjaF9wYXRoKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc29tZXRoaW5nKToKKyAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihzb21ldGhpbmcsICJfX2luaXRfXy5weSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gc29tZXRoaW5nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHN1cHBvc2UgaXQncyBhIG1vZHVsZSBvciBwYWNrYWdlCisgICAgICAgICAgICBtb2RuYW1lID0gc29tZXRoaW5nCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZXBhdGggPSBtb2R1dGlscy5maWxlX2Zyb21fbW9kcGF0aCgKKyAgICAgICAgICAgICAgICAgICAgbW9kbmFtZS5zcGxpdCgiLiIpLCBwYXRoPWFkZGl0aW9uYWxfc2VhcmNoX3BhdGgKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgaWYgZmlsZXBhdGggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIFN5bnRheEVycm9yKSBhcyBleDoKKyAgICAgICAgICAgICAgICAjIFRoZSBTeW50YXhFcnJvciBpcyBhIFB5dGhvbiBidWcgYW5kIHNob3VsZCBiZQorICAgICAgICAgICAgICAgICMgcmVtb3ZlZCBvbmNlIHdlIG1vdmUgYXdheSBmcm9tIGltcC5maW5kX21vZHVsZTogaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDU4OAorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoeyJrZXkiOiAiZmF0YWwiLCAibW9kIjogbW9kbmFtZSwgImV4IjogZXh9KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5ub3JtcGF0aChmaWxlcGF0aCkKKyAgICAgICAgbW9kcGFydHMgPSAobW9kbmFtZSBvciBzb21ldGhpbmcpLnNwbGl0KCIuIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3BlYyA9IG1vZHV0aWxzLmZpbGVfaW5mb19mcm9tX21vZHBhdGgoCisgICAgICAgICAgICAgICAgbW9kcGFydHMsIHBhdGg9YWRkaXRpb25hbF9zZWFyY2hfcGF0aAorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIE1pZ2h0IG5vdCBiZSBhY2NlcHRhYmxlLCBkb24ndCBjcmFzaC4KKyAgICAgICAgICAgIGlzX25hbWVzcGFjZSA9IEZhbHNlCisgICAgICAgICAgICBpc19kaXJlY3RvcnkgPSBvcy5wYXRoLmlzZGlyKHNvbWV0aGluZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlzX25hbWVzcGFjZSA9IG1vZHV0aWxzLmlzX25hbWVzcGFjZShzcGVjKQorICAgICAgICAgICAgaXNfZGlyZWN0b3J5ID0gbW9kdXRpbHMuaXNfZGlyZWN0b3J5KHNwZWMpCisgICAgICAgIGlmIG5vdCBpc19uYW1lc3BhY2U6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInBhdGgiOiBmaWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBtb2RuYW1lLAorICAgICAgICAgICAgICAgICAgICAiaXNhcmciOiBUcnVlLAorICAgICAgICAgICAgICAgICAgICAiYmFzZXBhdGgiOiBmaWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgImJhc2VuYW1lIjogbW9kbmFtZSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApCisgICAgICAgIGhhc19pbml0ID0gKAorICAgICAgICAgICAgbm90IChtb2RuYW1lLmVuZHN3aXRoKCIuX19pbml0X18iKSBvciBtb2RuYW1lID09ICJfX2luaXRfXyIpCisgICAgICAgICAgICBhbmQgb3MucGF0aC5iYXNlbmFtZShmaWxlcGF0aCkgPT0gIl9faW5pdF9fLnB5IgorICAgICAgICApCisgICAgICAgIGlmIGhhc19pbml0IG9yIGlzX25hbWVzcGFjZSBvciBpc19kaXJlY3Rvcnk6CisgICAgICAgICAgICBmb3Igc3ViZmlsZXBhdGggaW4gbW9kdXRpbHMuZ2V0X21vZHVsZV9maWxlcygKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZmlsZXBhdGgpLCBpZ25vcmVfbGlzdCwgbGlzdF9hbGw9aXNfbmFtZXNwYWNlCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGlmIGZpbGVwYXRoID09IHN1YmZpbGVwYXRoOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIF9pc19pbl9pZ25vcmVfbGlzdF9yZSgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShzdWJmaWxlcGF0aCksIGlnbm9yZV9saXN0X3JlCisgICAgICAgICAgICAgICAgKSBvciBfaXNfaW5faWdub3JlX2xpc3RfcmUoc3ViZmlsZXBhdGgsIGlnbm9yZV9saXN0X3BhdGhzX3JlKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIG1vZHBhdGggPSBfbW9kcGF0aF9mcm9tX2ZpbGUoCisgICAgICAgICAgICAgICAgICAgIHN1YmZpbGVwYXRoLCBpc19uYW1lc3BhY2UsIHBhdGg9YWRkaXRpb25hbF9zZWFyY2hfcGF0aAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBzdWJtb2RuYW1lID0gIi4iLmpvaW4obW9kcGF0aCkKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAicGF0aCI6IHN1YmZpbGVwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzdWJtb2RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgImlzYXJnIjogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZXBhdGgiOiBmaWxlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlbmFtZSI6IG1vZG5hbWUsCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICApCisgICAgcmV0dXJuIHJlc3VsdCwgZXJyb3JzCmRpZmYgLS1naXQgYS9weWxpbnQvbGludC9wYXJhbGxlbC5weSBiL3B5bGludC9saW50L3BhcmFsbGVsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzM1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvbGludC9wYXJhbGxlbC5weQpAQCAtMCwwICsxLDE2OCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBmdW5jdG9vbHMKKworZnJvbSBweWxpbnQgaW1wb3J0IHJlcG9ydGVycworZnJvbSBweWxpbnQubGludC51dGlscyBpbXBvcnQgX3BhdGNoX3N5c19wYXRoCitmcm9tIHB5bGludC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKK3RyeToKKyAgICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbXVsdGlwcm9jZXNzaW5nID0gTm9uZSAgIyB0eXBlOiBpZ25vcmUKKworIyBQeUxpbnRlciBvYmplY3QgdXNlZCBieSB3b3JrZXIgcHJvY2Vzc2VzIHdoZW4gY2hlY2tpbmcgZmlsZXMgdXNpbmcgbXVsdGlwcm9jZXNzaW5nCisjIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIHdvcmtlciBwcm9jZXNzZXMKK193b3JrZXJfbGludGVyID0gTm9uZQorCisKK2RlZiBfZ2V0X25ld19hcmdzKG1lc3NhZ2UpOgorICAgIGxvY2F0aW9uID0gKAorICAgICAgICBtZXNzYWdlLmFic3BhdGgsCisgICAgICAgIG1lc3NhZ2UucGF0aCwKKyAgICAgICAgbWVzc2FnZS5tb2R1bGUsCisgICAgICAgIG1lc3NhZ2Uub2JqLAorICAgICAgICBtZXNzYWdlLmxpbmUsCisgICAgICAgIG1lc3NhZ2UuY29sdW1uLAorICAgICkKKyAgICByZXR1cm4gKG1lc3NhZ2UubXNnX2lkLCBtZXNzYWdlLnN5bWJvbCwgbG9jYXRpb24sIG1lc3NhZ2UubXNnLCBtZXNzYWdlLmNvbmZpZGVuY2UpCisKKworZGVmIF9tZXJnZV9zdGF0cyhzdGF0cyk6CisgICAgbWVyZ2VkID0ge30KKyAgICBieV9tc2cgPSBjb2xsZWN0aW9ucy5Db3VudGVyKCkKKyAgICBmb3Igc3RhdCBpbiBzdGF0czoKKyAgICAgICAgbWVzc2FnZV9zdGF0cyA9IHN0YXQucG9wKCJieV9tc2ciLCB7fSkKKyAgICAgICAgYnlfbXNnLnVwZGF0ZShtZXNzYWdlX3N0YXRzKQorCisgICAgICAgIGZvciBrZXksIGl0ZW0gaW4gc3RhdC5pdGVtcygpOgorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBtZXJnZWQ6CisgICAgICAgICAgICAgICAgbWVyZ2VkW2tleV0gPSBpdGVtCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaXRlbSwgZGljdCk6CisgICAgICAgICAgICAgICAgbWVyZ2VkW2tleV0udXBkYXRlKGl0ZW0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lcmdlZFtrZXldID0gbWVyZ2VkW2tleV0gKyBpdGVtCisKKyAgICBtZXJnZWRbImJ5X21zZyJdID0gYnlfbXNnCisgICAgcmV0dXJuIG1lcmdlZAorCisKK2RlZiBfd29ya2VyX2luaXRpYWxpemUobGludGVyLCBhcmd1bWVudHM9Tm9uZSk6CisgICAgZ2xvYmFsIF93b3JrZXJfbGludGVyICAjIHB5bGludDogZGlzYWJsZT1nbG9iYWwtc3RhdGVtZW50CisgICAgX3dvcmtlcl9saW50ZXIgPSBsaW50ZXIKKworICAgICMgT24gdGhlIHdvcmtlciBwcm9jZXNzIHNpZGUgdGhlIG1lc3NhZ2VzIGFyZSBqdXN0IGNvbGxlY3RlZCBhbmQgcGFzc2VkIGJhY2sgdG8KKyAgICAjIHBhcmVudCBwcm9jZXNzIGFzIF93b3JrZXJfY2hlY2tfZmlsZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZQorICAgIF93b3JrZXJfbGludGVyLnNldF9yZXBvcnRlcihyZXBvcnRlcnMuQ29sbGVjdGluZ1JlcG9ydGVyKCkpCisgICAgX3dvcmtlcl9saW50ZXIub3BlbigpCisKKyAgICAjIFBhdGNoIHN5cy5wYXRoIHNvIHRoYXQgZWFjaCBhcmd1bWVudCBpcyBpbXBvcnRhYmxlIGp1c3QgbGlrZSBpbiBzaW5nbGUgam9iIG1vZGUKKyAgICBfcGF0Y2hfc3lzX3BhdGgoYXJndW1lbnRzIG9yICgpKQorCisKK2RlZiBfd29ya2VyX2NoZWNrX3NpbmdsZV9maWxlKGZpbGVfaXRlbSk6CisgICAgbmFtZSwgZmlsZXBhdGgsIG1vZG5hbWUgPSBmaWxlX2l0ZW0KKworICAgIF93b3JrZXJfbGludGVyLm9wZW4oKQorICAgIF93b3JrZXJfbGludGVyLmNoZWNrX3NpbmdsZV9maWxlKG5hbWUsIGZpbGVwYXRoLCBtb2RuYW1lKQorICAgIG1hcHJlZHVjZV9kYXRhID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICBmb3IgY2hlY2tlciBpbiBfd29ya2VyX2xpbnRlci5nZXRfY2hlY2tlcnMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGNoZWNrZXIuZ2V0X21hcF9kYXRhKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbWFwcmVkdWNlX2RhdGFbY2hlY2tlci5uYW1lXS5hcHBlbmQoZGF0YSkKKyAgICBtc2dzID0gW19nZXRfbmV3X2FyZ3MobSkgZm9yIG0gaW4gX3dvcmtlcl9saW50ZXIucmVwb3J0ZXIubWVzc2FnZXNdCisgICAgX3dvcmtlcl9saW50ZXIucmVwb3J0ZXIucmVzZXQoKQorICAgIHJldHVybiAoCisgICAgICAgIGlkKG11bHRpcHJvY2Vzc2luZy5jdXJyZW50X3Byb2Nlc3MoKSksCisgICAgICAgIF93b3JrZXJfbGludGVyLmN1cnJlbnRfbmFtZSwKKyAgICAgICAgZmlsZXBhdGgsCisgICAgICAgIF93b3JrZXJfbGludGVyLmZpbGVfc3RhdGUuYmFzZV9uYW1lLAorICAgICAgICBtc2dzLAorICAgICAgICBfd29ya2VyX2xpbnRlci5zdGF0cywKKyAgICAgICAgX3dvcmtlcl9saW50ZXIubXNnX3N0YXR1cywKKyAgICAgICAgbWFwcmVkdWNlX2RhdGEsCisgICAgKQorCisKK2RlZiBfbWVyZ2VfbWFwcmVkdWNlX2RhdGEobGludGVyLCBhbGxfbWFwcmVkdWNlX2RhdGEpOgorICAgICIiIk1lcmdlcyBtYXAvcmVkdWNlIGRhdGEgYWNyb3NzIHdvcmtlcnMsIGludm9raW5nIHJlbGV2YW50IEFQSXMgb24gY2hlY2tlcnMiIiIKKyAgICAjIEZpcnN0IGNvbGxhdGUgdGhlIGRhdGEsIHByZXBhcmluZyBpdCBzbyB3ZSBjYW4gc2VuZCBpdCB0byB0aGUgY2hlY2tlcnMgZm9yCisgICAgIyB2YWxpZGF0aW9uLiBUaGUgaW50ZW50IGhlcmUgaXMgdG8gY29sbGVjdCBhbGwgdGhlIG1hcHJlZHVjZSBkYXRhIGZvciBhbGwgY2hlY2tlci0KKyAgICAjIHJ1bnMgYWNyb3NzIHByb2Nlc3NlcyAtIHRoYXQgd2lsbCB0aGVuIGJlIHBhc3NlZCB0byBhIHN0YXRpYyBtZXRob2Qgb24gdGhlCisgICAgIyBjaGVja2VycyB0byBiZSByZWR1Y2VkIGFuZCBmdXJ0aGVyIHByb2Nlc3NlZC4KKyAgICBjb2xsYXRlZF9tYXBfcmVkdWNlX2RhdGEgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorICAgIGZvciBsaW50ZXJfZGF0YSBpbiBhbGxfbWFwcmVkdWNlX2RhdGEudmFsdWVzKCk6CisgICAgICAgIGZvciBydW5fZGF0YSBpbiBsaW50ZXJfZGF0YToKKyAgICAgICAgICAgIGZvciBjaGVja2VyX25hbWUsIGRhdGEgaW4gcnVuX2RhdGEuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBjb2xsYXRlZF9tYXBfcmVkdWNlX2RhdGFbY2hlY2tlcl9uYW1lXS5leHRlbmQoZGF0YSkKKworICAgICMgU2VuZCB0aGUgZGF0YSB0byBjaGVja2VycyB0aGF0IHN1cHBvcnQvcmVxdWlyZSBjb25zb2xpZGF0ZWQgZGF0YQorICAgIG9yaWdpbmFsX2NoZWNrZXJzID0gbGludGVyLmdldF9jaGVja2VycygpCisgICAgZm9yIGNoZWNrZXIgaW4gb3JpZ2luYWxfY2hlY2tlcnM6CisgICAgICAgIGlmIGNoZWNrZXIubmFtZSBpbiBjb2xsYXRlZF9tYXBfcmVkdWNlX2RhdGE6CisgICAgICAgICAgICAjIEFzc3VtZSB0aGF0IGlmIHRoZSBjaGVjayBoYXMgcmV0dXJuZWQgbWFwL3JlZHVjZSBkYXRhIHRoYXQgaXQgaGFzIHRoZQorICAgICAgICAgICAgIyByZWR1Y2VyIGZ1bmN0aW9uCisgICAgICAgICAgICBjaGVja2VyLnJlZHVjZV9tYXBfZGF0YShsaW50ZXIsIGNvbGxhdGVkX21hcF9yZWR1Y2VfZGF0YVtjaGVja2VyLm5hbWVdKQorCisKK2RlZiBjaGVja19wYXJhbGxlbChsaW50ZXIsIGpvYnMsIGZpbGVzLCBhcmd1bWVudHM9Tm9uZSk6CisgICAgIiIiVXNlIHRoZSBnaXZlbiBsaW50ZXIgdG8gbGludCB0aGUgZmlsZXMgd2l0aCBnaXZlbiBhbW91bnQgb2Ygd29ya2VycyAoam9icykKKyAgICBUaGlzIHNwbGl0cyB0aGUgd29yayBmaWxlc3RyZWFtLWJ5LWZpbGVzdHJlYW0uIElmIHlvdSBuZWVkIHRvIGRvIHdvcmsgYWNyb3NzCisgICAgbXVsdGlwbGUgZmlsZXMsIGFzIGluIHRoZSBzaW1pbGFyaXR5LWNoZWNrZXIsIHRoZW4gaW5oZXJpdCBmcm9tIE1hcFJlZHVjZU1peGluIGFuZAorICAgIGltcGxlbWVudCB0aGUgbWFwL3JlZHVjZSBtaXhpbiBmdW5jdGlvbmFsaXR5IiIiCisgICAgIyBUaGUgcmVwb3J0ZXIgZG9lcyBub3QgbmVlZCB0byBiZSBwYXNzZWQgdG8gd29ya2VyIHByb2Nlc3NlcywgaS5lLiB0aGUgcmVwb3J0ZXIgZG9lcworICAgIG9yaWdpbmFsX3JlcG9ydGVyID0gbGludGVyLnJlcG9ydGVyCisgICAgbGludGVyLnJlcG9ydGVyID0gTm9uZQorCisgICAgIyBUaGUgbGludGVyIGlzIGluaGVyaXRlZCBieSBhbGwgdGhlIHBvb2wncyB3b3JrZXJzLCBpLmUuIHRoZSBsaW50ZXIKKyAgICAjIGlzIGlkZW50aWNhbCB0byB0aGUgbGludGVyIG9iamVjdCBoZXJlLiBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQKKyAgICAjIGEgY3VzdG9tIFB5TGludGVyIG9iamVjdCBjYW4gYmUgdXNlZC4KKyAgICBpbml0aWFsaXplciA9IGZ1bmN0b29scy5wYXJ0aWFsKF93b3JrZXJfaW5pdGlhbGl6ZSwgYXJndW1lbnRzPWFyZ3VtZW50cykKKyAgICBwb29sID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woICAjIHB5bGludDogZGlzYWJsZT1jb25zaWRlci11c2luZy13aXRoCisgICAgICAgIGpvYnMsIGluaXRpYWxpemVyPWluaXRpYWxpemVyLCBpbml0YXJncz1bbGludGVyXQorICAgICkKKyAgICAjIC4uYW5kIG5vdyB3aGVuIHRoZSB3b3JrZXJzIGhhdmUgaW5oZXJpdGVkIHRoZSBsaW50ZXIsIHRoZSBhY3R1YWwgcmVwb3J0ZXIKKyAgICAjIGNhbiBiZSBzZXQgYmFjayBoZXJlIG9uIHRoZSBwYXJlbnQgcHJvY2VzcyBzbyB0aGF0IHJlc3VsdHMgZ2V0IHN0b3JlZCBpbnRvCisgICAgIyBjb3JyZWN0IHJlcG9ydGVyCisgICAgbGludGVyLnNldF9yZXBvcnRlcihvcmlnaW5hbF9yZXBvcnRlcikKKyAgICBsaW50ZXIub3BlbigpCisgICAgdHJ5OgorICAgICAgICBhbGxfc3RhdHMgPSBbXQorICAgICAgICBhbGxfbWFwcmVkdWNlX2RhdGEgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorCisgICAgICAgICMgTWFwcyBlYWNoIGZpbGUgdG8gYmUgd29ya2VkIG9uIGJ5IGEgc2luZ2xlIF93b3JrZXJfY2hlY2tfc2luZ2xlX2ZpbGUoKSBjYWxsLAorICAgICAgICAjIGNvbGxlY3RpbmcgYW55IG1hcC9yZWR1Y2UgZGF0YSBieSBjaGVja2VyIG1vZHVsZSBzbyB0aGF0IHdlIGNhbiAncmVkdWNlJyBpdAorICAgICAgICAjIGxhdGVyLgorICAgICAgICBmb3IgKAorICAgICAgICAgICAgd29ya2VyX2lkeCwgICMgdXNlZCB0byBtZXJnZSBtYXAvcmVkdWNlIGRhdGEgYWNyb3NzIHdvcmtlcnMKKyAgICAgICAgICAgIG1vZHVsZSwKKyAgICAgICAgICAgIGZpbGVfcGF0aCwKKyAgICAgICAgICAgIGJhc2VfbmFtZSwKKyAgICAgICAgICAgIG1lc3NhZ2VzLAorICAgICAgICAgICAgc3RhdHMsCisgICAgICAgICAgICBtc2dfc3RhdHVzLAorICAgICAgICAgICAgbWFwcmVkdWNlX2RhdGEsCisgICAgICAgICkgaW4gcG9vbC5pbWFwX3Vub3JkZXJlZChfd29ya2VyX2NoZWNrX3NpbmdsZV9maWxlLCBmaWxlcyk6CisgICAgICAgICAgICBsaW50ZXIuZmlsZV9zdGF0ZS5iYXNlX25hbWUgPSBiYXNlX25hbWUKKyAgICAgICAgICAgIGxpbnRlci5zZXRfY3VycmVudF9tb2R1bGUobW9kdWxlLCBmaWxlX3BhdGgpCisgICAgICAgICAgICBmb3IgbXNnIGluIG1lc3NhZ2VzOgorICAgICAgICAgICAgICAgIG1zZyA9IE1lc3NhZ2UoKm1zZykKKyAgICAgICAgICAgICAgICBsaW50ZXIucmVwb3J0ZXIuaGFuZGxlX21lc3NhZ2UobXNnKQorICAgICAgICAgICAgYWxsX3N0YXRzLmFwcGVuZChzdGF0cykKKyAgICAgICAgICAgIGFsbF9tYXByZWR1Y2VfZGF0YVt3b3JrZXJfaWR4XS5hcHBlbmQobWFwcmVkdWNlX2RhdGEpCisgICAgICAgICAgICBsaW50ZXIubXNnX3N0YXR1cyB8PSBtc2dfc3RhdHVzCisgICAgZmluYWxseToKKyAgICAgICAgcG9vbC5jbG9zZSgpCisgICAgICAgIHBvb2wuam9pbigpCisKKyAgICBfbWVyZ2VfbWFwcmVkdWNlX2RhdGEobGludGVyLCBhbGxfbWFwcmVkdWNlX2RhdGEpCisgICAgbGludGVyLnN0YXRzID0gX21lcmdlX3N0YXRzKGFsbF9zdGF0cykKKworICAgICMgSW5zZXJ0IHN0YXRzIGRhdGEgdG8gbG9jYWwgY2hlY2tlcnMuCisgICAgZm9yIGNoZWNrZXIgaW4gbGludGVyLmdldF9jaGVja2VycygpOgorICAgICAgICBpZiBjaGVja2VyIGlzIG5vdCBsaW50ZXI6CisgICAgICAgICAgICBjaGVja2VyLnN0YXRzID0gbGludGVyLnN0YXRzCmRpZmYgLS1naXQgYS9weWxpbnQvbGludC9weWxpbnRlci5weSBiL3B5bGludC9saW50L3B5bGludGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2Q5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvbGludC9weWxpbnRlci5weQpAQCAtMCwwICsxLDEyODYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGZ1bmN0b29scworaW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0b2tlbml6ZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycywgY29uZmlnLCBleGNlcHRpb25zLCBpbnRlcmZhY2VzLCByZXBvcnRlcnMKK2Zyb20gcHlsaW50LmNvbnN0YW50cyBpbXBvcnQgTUFJTl9DSEVDS0VSX05BTUUsIE1TR19UWVBFUworZnJvbSBweWxpbnQubGludC5leHBhbmRfbW9kdWxlcyBpbXBvcnQgZXhwYW5kX21vZHVsZXMKK2Zyb20gcHlsaW50LmxpbnQucGFyYWxsZWwgaW1wb3J0IGNoZWNrX3BhcmFsbGVsCitmcm9tIHB5bGludC5saW50LnJlcG9ydF9mdW5jdGlvbnMgaW1wb3J0ICgKKyAgICByZXBvcnRfbWVzc2FnZXNfYnlfbW9kdWxlX3N0YXRzLAorICAgIHJlcG9ydF9tZXNzYWdlc19zdGF0cywKKyAgICByZXBvcnRfdG90YWxfbWVzc2FnZXNfc3RhdHMsCispCitmcm9tIHB5bGludC5saW50LnV0aWxzIGltcG9ydCBmaXhfaW1wb3J0X3BhdGgKK2Zyb20gcHlsaW50Lm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2VEZWZpbml0aW9uU3RvcmUsIE1lc3NhZ2VzSGFuZGxlck1peEluCitmcm9tIHB5bGludC5yZXBvcnRlcnMudXJlcG9ydHMgaW1wb3J0IG5vZGVzIGFzIHJlcG9ydF9ub2RlcworZnJvbSBweWxpbnQudXRpbHMgaW1wb3J0IEFTVFdhbGtlciwgRmlsZVN0YXRlLCB1dGlscworZnJvbSBweWxpbnQudXRpbHMucHJhZ21hX3BhcnNlciBpbXBvcnQgKAorICAgIE9QVElPTl9QTywKKyAgICBJbnZhbGlkUHJhZ21hRXJyb3IsCisgICAgVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IsCisgICAgcGFyc2VfcHJhZ21hLAorKQorCitNQU5BR0VSID0gYXN0cm9pZC5NQU5BR0VSCisKKworZGVmIF9yZWFkX3N0ZGluKCk6CisgICAgIyBodHRwczovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWxpc3QvMjAxMi1Ob3ZlbWJlci82MzQ0MjQuaHRtbAorICAgIHN5cy5zdGRpbiA9IFRleHRJT1dyYXBwZXIoc3lzLnN0ZGluLmRldGFjaCgpLCBlbmNvZGluZz0idXRmLTgiKQorICAgIHJldHVybiBzeXMuc3RkaW4ucmVhZCgpCisKKworZGVmIF9sb2FkX3JlcG9ydGVyX2J5X2NsYXNzKHJlcG9ydGVyX2NsYXNzOiBzdHIpIC0+IHR5cGU6CisgICAgcW5hbWUgPSByZXBvcnRlcl9jbGFzcworICAgIG1vZHVsZV9wYXJ0ID0gYXN0cm9pZC5tb2R1dGlscy5nZXRfbW9kdWxlX3BhcnQocW5hbWUpCisgICAgbW9kdWxlID0gYXN0cm9pZC5tb2R1dGlscy5sb2FkX21vZHVsZV9mcm9tX25hbWUobW9kdWxlX3BhcnQpCisgICAgY2xhc3NfbmFtZSA9IHFuYW1lLnNwbGl0KCIuIilbLTFdCisgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBjbGFzc19uYW1lKQorCisKKyMgUHl0aG9uIExpbnRlciBjbGFzcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTVNHUyA9IHsKKyAgICAiRjAwMDEiOiAoCisgICAgICAgICIlcyIsCisgICAgICAgICJmYXRhbCIsCisgICAgICAgICJVc2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgcHJldmVudGluZyB0aGUgYW5hbHlzaXMgb2YgYSBcCisgICAgICAgICAgICAgIG1vZHVsZSAodW5hYmxlIHRvIGZpbmQgaXQgZm9yIGluc3RhbmNlKS4iLAorICAgICksCisgICAgIkYwMDAyIjogKAorICAgICAgICAiJXM6ICVzIiwKKyAgICAgICAgImFzdHJvaWQtZXJyb3IiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlICIKKyAgICAgICAgIkFzdHJvaWQgIHJlcHJlc2VudGF0aW9uLiBUaGlzIGlzIHVzdWFsbHkgYWNjb21wYW5pZWQgYnkgYSAiCisgICAgICAgICJ0cmFjZWJhY2suIFBsZWFzZSByZXBvcnQgc3VjaCBlcnJvcnMgISIsCisgICAgKSwKKyAgICAiRjAwMTAiOiAoCisgICAgICAgICJlcnJvciB3aGlsZSBjb2RlIHBhcnNpbmc6ICVzIiwKKyAgICAgICAgInBhcnNlLWVycm9yIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIEFzdHJvaWQgIgorICAgICAgICAicmVwcmVzZW50YXRpb24gd2hpY2ggY291bGQgYmUgaGFuZGxlZCBieSBhc3Ryb2lkLiIsCisgICAgKSwKKyAgICAiSTAwMDEiOiAoCisgICAgICAgICJVbmFibGUgdG8gcnVuIHJhdyBjaGVja2VycyBvbiBidWlsdC1pbiBtb2R1bGUgJXMiLAorICAgICAgICAicmF3LWNoZWNrZXItZmFpbGVkIiwKKyAgICAgICAgIlVzZWQgdG8gaW5mb3JtIHRoYXQgYSBidWlsdC1pbiBtb2R1bGUgaGFzIG5vdCBiZWVuIGNoZWNrZWQgIgorICAgICAgICAidXNpbmcgdGhlIHJhdyBjaGVja2Vycy4iLAorICAgICksCisgICAgIkkwMDEwIjogKAorICAgICAgICAiVW5hYmxlIHRvIGNvbnNpZGVyIGlubGluZSBvcHRpb24gJXIiLAorICAgICAgICAiYmFkLWlubGluZS1vcHRpb24iLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGlubGluZSBvcHRpb24gaXMgZWl0aGVyIGJhZGx5IGZvcm1hdHRlZCBvciBjYW4ndCAiCisgICAgICAgICJiZSB1c2VkIGluc2lkZSBtb2R1bGVzLiIsCisgICAgKSwKKyAgICAiSTAwMTEiOiAoCisgICAgICAgICJMb2NhbGx5IGRpc2FibGluZyAlcyAoJXMpIiwKKyAgICAgICAgImxvY2FsbHktZGlzYWJsZWQiLAorICAgICAgICAiVXNlZCB3aGVuIGFuIGlubGluZSBvcHRpb24gZGlzYWJsZXMgYSBtZXNzYWdlIG9yIGEgbWVzc2FnZXMgY2F0ZWdvcnkuIiwKKyAgICApLAorICAgICJJMDAxMyI6ICgKKyAgICAgICAgIklnbm9yaW5nIGVudGlyZSBmaWxlIiwKKyAgICAgICAgImZpbGUtaWdub3JlZCIsCisgICAgICAgICJVc2VkIHRvIGluZm9ybSB0aGF0IHRoZSBmaWxlIHdpbGwgbm90IGJlIGNoZWNrZWQiLAorICAgICksCisgICAgIkkwMDIwIjogKAorICAgICAgICAiU3VwcHJlc3NlZCAlcyAoZnJvbSBsaW5lICVkKSIsCisgICAgICAgICJzdXBwcmVzc2VkLW1lc3NhZ2UiLAorICAgICAgICAiQSBtZXNzYWdlIHdhcyB0cmlnZ2VyZWQgb24gYSBsaW5lLCBidXQgc3VwcHJlc3NlZCBleHBsaWNpdGx5ICIKKyAgICAgICAgImJ5IGEgZGlzYWJsZT0gY29tbWVudCBpbiB0aGUgZmlsZS4gVGhpcyBtZXNzYWdlIGlzIG5vdCAiCisgICAgICAgICJnZW5lcmF0ZWQgZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIGlnbm9yZWQgZHVlIHRvIGNvbmZpZ3VyYXRpb24gIgorICAgICAgICAic2V0dGluZ3MuIiwKKyAgICApLAorICAgICJJMDAyMSI6ICgKKyAgICAgICAgIlVzZWxlc3Mgc3VwcHJlc3Npb24gb2YgJXMiLAorICAgICAgICAidXNlbGVzcy1zdXBwcmVzc2lvbiIsCisgICAgICAgICJSZXBvcnRlZCB3aGVuIGEgbWVzc2FnZSBpcyBleHBsaWNpdGx5IGRpc2FibGVkIGZvciBhIGxpbmUgb3IgIgorICAgICAgICAiYSBibG9jayBvZiBjb2RlLCBidXQgbmV2ZXIgdHJpZ2dlcmVkLiIsCisgICAgKSwKKyAgICAiSTAwMjIiOiAoCisgICAgICAgICdQcmFnbWEgIiVzIiBpcyBkZXByZWNhdGVkLCB1c2UgIiVzIiBpbnN0ZWFkJywKKyAgICAgICAgImRlcHJlY2F0ZWQtcHJhZ21hIiwKKyAgICAgICAgIlNvbWUgaW5saW5lIHB5bGludCBvcHRpb25zIGhhdmUgYmVlbiByZW5hbWVkIG9yIHJld29ya2VkLCAiCisgICAgICAgICJvbmx5IHRoZSBtb3N0IHJlY2VudCBmb3JtIHNob3VsZCBiZSB1c2VkLiAiCisgICAgICAgICJOT1RFOnNraXAtYWxsIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggcHlsaW50ID49IDAuMjYiLAorICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIkkwMDE0IiwgImRlcHJlY2F0ZWQtZGlzYWJsZS1hbGwiKV19LAorICAgICksCisgICAgIkUwMDAxIjogKCIlcyIsICJzeW50YXgtZXJyb3IiLCAiVXNlZCB3aGVuIGEgc3ludGF4IGVycm9yIGlzIHJhaXNlZCBmb3IgYSBtb2R1bGUuIiksCisgICAgIkUwMDExIjogKAorICAgICAgICAiVW5yZWNvZ25pemVkIGZpbGUgb3B0aW9uICVyIiwKKyAgICAgICAgInVucmVjb2duaXplZC1pbmxpbmUtb3B0aW9uIiwKKyAgICAgICAgIlVzZWQgd2hlbiBhbiB1bmtub3duIGlubGluZSBvcHRpb24gaXMgZW5jb3VudGVyZWQuIiwKKyAgICApLAorICAgICJFMDAxMiI6ICgKKyAgICAgICAgIkJhZCBvcHRpb24gdmFsdWUgJXIiLAorICAgICAgICAiYmFkLW9wdGlvbi12YWx1ZSIsCisgICAgICAgICJVc2VkIHdoZW4gYSBiYWQgdmFsdWUgZm9yIGFuIGlubGluZSBvcHRpb24gaXMgZW5jb3VudGVyZWQuIiwKKyAgICApLAorICAgICJFMDAxMyI6ICgKKyAgICAgICAgIlBsdWdpbiAnJXMnIGlzIGltcG9zc2libGUgdG8gbG9hZCwgaXMgaXQgaW5zdGFsbGVkID8gKCclcycpIiwKKyAgICAgICAgImJhZC1wbHVnaW4tdmFsdWUiLAorICAgICAgICAiVXNlZCB3aGVuIGEgYmFkIHZhbHVlIGlzIHVzZWQgaW4gJ2xvYWQtcGx1Z2lucycuIiwKKyAgICApLAorfQorCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LWluc3RhbmNlLWF0dHJpYnV0ZXMsdG9vLW1hbnktcHVibGljLW1ldGhvZHMKK2NsYXNzIFB5TGludGVyKAorICAgIGNvbmZpZy5PcHRpb25zTWFuYWdlck1peEluLAorICAgIE1lc3NhZ2VzSGFuZGxlck1peEluLAorICAgIHJlcG9ydGVycy5SZXBvcnRzSGFuZGxlck1peEluLAorICAgIGNoZWNrZXJzLkJhc2VUb2tlbkNoZWNrZXIsCispOgorICAgICIiImxpbnQgUHl0aG9uIG1vZHVsZXMgdXNpbmcgZXh0ZXJuYWwgY2hlY2tlcnMuCisKKyAgICBUaGlzIGlzIHRoZSBtYWluIGNoZWNrZXIgY29udHJvbGxpbmcgdGhlIG90aGVyIG9uZXMgYW5kIHRoZSByZXBvcnRzCisgICAgZ2VuZXJhdGlvbi4gSXQgaXMgaXRzZWxmIGJvdGggYSByYXcgY2hlY2tlciBhbmQgYW4gYXN0cm9pZCBjaGVja2VyIGluIG9yZGVyCisgICAgdG86CisgICAgKiBoYW5kbGUgbWVzc2FnZSBhY3RpdmF0aW9uIC8gZGVhY3RpdmF0aW9uIGF0IHRoZSBtb2R1bGUgbGV2ZWwKKyAgICAqIGhhbmRsZSBzb21lIGJhc2ljIGJ1dCBuZWNlc3Nhcnkgc3RhdHMnZGF0YSAobnVtYmVyIG9mIGNsYXNzZXMsIG1ldGhvZHMuLi4pCisKKyAgICBJREUgcGx1Z2luIGRldmVsb3BlcnM6IHlvdSBtYXkgaGF2ZSB0byBjYWxsCisgICAgYGFzdHJvaWQuYnVpbGRlci5NQU5BR0VSLmFzdHJvaWRfY2FjaGUuY2xlYXIoKWAgYWNyb3NzIHJ1bnMgaWYgeW91IHdhbnQKKyAgICB0byBlbnN1cmUgdGhlIGxhdGVzdCBjb2RlIHZlcnNpb24gaXMgYWN0dWFsbHkgY2hlY2tlZC4KKworICAgIFRoaXMgY2xhc3MgbmVlZHMgdG8gc3VwcG9ydCBwaWNrbGluZyBmb3IgcGFyYWxsZWwgbGludGluZyB0byB3b3JrLiBUaGUgZXhjZXB0aW9uCisgICAgaXMgcmVwb3J0ZXIgbWVtYmVyOyBzZWUgY2hlY2tfcGFyYWxsZWwgZnVuY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKGludGVyZmFjZXMuSVRva2VuQ2hlY2tlciwpCisKKyAgICBuYW1lID0gTUFJTl9DSEVDS0VSX05BTUUKKyAgICBwcmlvcml0eSA9IDAKKyAgICBsZXZlbCA9IDAKKyAgICBtc2dzID0gTVNHUworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBtYWtlX29wdGlvbnMoKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxmaWxlPlssPGZpbGU+Li4uXSIsCisgICAgICAgICAgICAgICAgICAgICJkZXN0IjogImJsYWNrX2xpc3QiLAorICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgiQ1ZTIiwpLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJGaWxlcyBvciBkaXJlY3RvcmllcyB0byBiZSBza2lwcGVkLiAiCisgICAgICAgICAgICAgICAgICAgICJUaGV5IHNob3VsZCBiZSBiYXNlIG5hbWVzLCBub3QgcGF0aHMuIiwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiaWdub3JlLXBhdHRlcm5zIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInJlZ2V4cF9jc3YiLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8cGF0dGVybj5bLDxwYXR0ZXJuPi4uLl0iLAorICAgICAgICAgICAgICAgICAgICAiZGVzdCI6ICJibGFja19saXN0X3JlIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoKSwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiRmlsZXMgb3IgZGlyZWN0b3JpZXMgbWF0Y2hpbmcgdGhlIHJlZ2V4IHBhdHRlcm5zIGFyZSIKKyAgICAgICAgICAgICAgICAgICAgIiBza2lwcGVkLiBUaGUgcmVnZXggbWF0Y2hlcyBhZ2FpbnN0IGJhc2UgbmFtZXMsIG5vdCBwYXRocy4iLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJpZ25vcmUtcGF0aHMiLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAicmVnZXhwX2NzdiIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxwYXR0ZXJuPlssPHBhdHRlcm4+Li4uXSIsCisgICAgICAgICAgICAgICAgICAgICJkZXN0IjogImlnbm9yZV9saXN0X3BhdGhzX3JlIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAoKSwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiQWRkIGZpbGVzIG9yIGRpcmVjdG9yaWVzIG1hdGNoaW5nIHRoZSByZWdleCBwYXR0ZXJucyB0byB0aGUiCisgICAgICAgICAgICAgICAgICAgICIgaWdub3JlLWxpc3QuIFRoZSByZWdleCBtYXRjaGVzIGFnYWluc3QgcGF0aHMuIiwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAicGVyc2lzdGVudCIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IFRydWUsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHlfb3Jfbj4iLAorICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAxLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJQaWNrbGUgY29sbGVjdGVkIGRhdGEgZm9yIGxhdGVyIGNvbXBhcmlzb25zLiIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImxvYWQtcGx1Z2lucyIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bW9kdWxlcz4iLAorICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6ICgpLAorICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAxLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJMaXN0IG9mIHBsdWdpbnMgKGFzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMgb2YgIgorICAgICAgICAgICAgICAgICAgICAicHl0aG9uIG1vZHVsZSBuYW1lcykgdG8gbG9hZCwgdXN1YWxseSB0byByZWdpc3RlciAiCisgICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsIGNoZWNrZXJzLiIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgIm91dHB1dC1mb3JtYXQiLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAidGV4dCIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxmb3JtYXQ+IiwKKyAgICAgICAgICAgICAgICAgICAgInNob3J0IjogImYiLAorICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiOiAiUmVwb3J0cyIsCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIlNldCB0aGUgb3V0cHV0IGZvcm1hdC4gQXZhaWxhYmxlIGZvcm1hdHMgYXJlIHRleHQsIgorICAgICAgICAgICAgICAgICAgICAiIHBhcnNlYWJsZSwgY29sb3JpemVkLCBqc29uIGFuZCBtc3ZzICh2aXN1YWwgc3R1ZGlvKS4iCisgICAgICAgICAgICAgICAgICAgICIgWW91IGNhbiBhbHNvIGdpdmUgYSByZXBvcnRlciBjbGFzcywgZS5nLiBteXBhY2thZ2UubXltb2R1bGUuIgorICAgICAgICAgICAgICAgICAgICAiTXlSZXBvcnRlckNsYXNzLiIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgInJlcG9ydHMiLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgICAgICJzaG9ydCI6ICJyIiwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIlJlcG9ydHMiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJUZWxscyB3aGV0aGVyIHRvIGRpc3BsYXkgYSBmdWxsIHJlcG9ydCBvciBvbmx5IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlcy4iLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJldmFsdWF0aW9uIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxweXRob25fZXhwcmVzc2lvbj4iLAorICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiOiAiUmVwb3J0cyIsCisgICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIjEwLjAgLSAoKGZsb2F0KDUgKiBlcnJvciArIHdhcm5pbmcgKyByZWZhY3RvciArICIKKyAgICAgICAgICAgICAgICAgICAgImNvbnZlbnRpb24pIC8gc3RhdGVtZW50KSAqIDEwKSIsCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIlB5dGhvbiBleHByZXNzaW9uIHdoaWNoIHNob3VsZCByZXR1cm4gYSBzY29yZSBsZXNzICIKKyAgICAgICAgICAgICAgICAgICAgInRoYW4gb3IgZXF1YWwgdG8gMTAuIFlvdSBoYXZlIGFjY2VzcyB0byB0aGUgdmFyaWFibGVzICIKKyAgICAgICAgICAgICAgICAgICAgIidlcnJvcicsICd3YXJuaW5nJywgJ3JlZmFjdG9yJywgYW5kICdjb252ZW50aW9uJyB3aGljaCAiCisgICAgICAgICAgICAgICAgICAgICJjb250YWluIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gZWFjaCBjYXRlZ29yeSwgYXMgd2VsbCBhcyAiCisgICAgICAgICAgICAgICAgICAgICInc3RhdGVtZW50JyB3aGljaCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHN0YXRlbWVudHMgIgorICAgICAgICAgICAgICAgICAgICAiYW5hbHl6ZWQuIFRoaXMgc2NvcmUgaXMgdXNlZCBieSB0aGUgZ2xvYmFsICIKKyAgICAgICAgICAgICAgICAgICAgImV2YWx1YXRpb24gcmVwb3J0IChSUDAwMDQpLiIsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgInNjb3JlIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAieW4iLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8eV9vcl9uPiIsCisgICAgICAgICAgICAgICAgICAgICJzaG9ydCI6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIlJlcG9ydHMiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJBY3RpdmF0ZSB0aGUgZXZhbHVhdGlvbiBzY29yZS4iLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJmYWlsLXVuZGVyIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogMTAsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImZsb2F0IiwKKyAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHNjb3JlPiIsCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIlNwZWNpZnkgYSBzY29yZSB0aHJlc2hvbGQgdG8gYmUgZXhjZWVkZWQgYmVmb3JlIHByb2dyYW0gZXhpdHMgd2l0aCBlcnJvci4iLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJmYWlsLW9uIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtc2cgaWRzPiIsCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIlJldHVybiBub24temVybyBleGl0IGNvZGUgaWYgYW55IG9mIHRoZXNlIG1lc3NhZ2VzL2NhdGVnb3JpZXMgYXJlIGRldGVjdGVkLCIKKyAgICAgICAgICAgICAgICAgICAgIiBldmVuIGlmIHNjb3JlIGlzIGFib3ZlIC0tZmFpbC11bmRlciB2YWx1ZS4gU3ludGF4IHNhbWUgYXMgZW5hYmxlLiIKKyAgICAgICAgICAgICAgICAgICAgIiBNZXNzYWdlcyBzcGVjaWZpZWQgYXJlIGVuYWJsZWQsIHdoaWxlIGNhdGVnb3JpZXMgb25seSBjaGVjayBhbHJlYWR5LWVuYWJsZWQgbWVzc2FnZXMuIiwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29uZmlkZW5jZSIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJtdWx0aXBsZV9jaG9pY2UiLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bGV2ZWxzPiIsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAgICAgICAgICJjaG9pY2VzIjogW2MubmFtZSBmb3IgYyBpbiBpbnRlcmZhY2VzLkNPTkZJREVOQ0VfTEVWRUxTXSwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIk1lc3NhZ2VzIGNvbnRyb2wiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJPbmx5IHNob3cgd2FybmluZ3Mgd2l0aCB0aGUgbGlzdGVkIGNvbmZpZGVuY2UgbGV2ZWxzLiIKKyAgICAgICAgICAgICAgICAgICAgIiBMZWF2ZSBlbXB0eSB0byBzaG93IGFsbC4gVmFsaWQgbGV2ZWxzOiAlcy4iCisgICAgICAgICAgICAgICAgICAgICUgKCIsICIuam9pbihjLm5hbWUgZm9yIGMgaW4gaW50ZXJmYWNlcy5DT05GSURFTkNFX0xFVkVMUyksKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiZW5hYmxlIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtc2cgaWRzPiIsCisgICAgICAgICAgICAgICAgICAgICJzaG9ydCI6ICJlIiwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIk1lc3NhZ2VzIGNvbnRyb2wiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJFbmFibGUgdGhlIG1lc3NhZ2UsIHJlcG9ydCwgY2F0ZWdvcnkgb3IgY2hlY2tlciB3aXRoIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpZChzKS4gWW91IGNhbiBlaXRoZXIgZ2l2ZSBtdWx0aXBsZSBpZGVudGlmaWVyICIKKyAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRlZCBieSBjb21tYSAoLCkgb3IgcHV0IHRoaXMgb3B0aW9uIG11bHRpcGxlIHRpbWUgIgorICAgICAgICAgICAgICAgICAgICAiKG9ubHkgb24gdGhlIGNvbW1hbmQgbGluZSwgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAid2hlcmUgaXQgc2hvdWxkIGFwcGVhciBvbmx5IG9uY2UpLiAiCisgICAgICAgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgIi0tZGlzYWJsZSIgb3B0aW9uIGZvciBleGFtcGxlcy4nLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJkaXNhYmxlIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtc2cgaWRzPiIsCisgICAgICAgICAgICAgICAgICAgICJzaG9ydCI6ICJkIiwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIk1lc3NhZ2VzIGNvbnRyb2wiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJEaXNhYmxlIHRoZSBtZXNzYWdlLCByZXBvcnQsIGNhdGVnb3J5IG9yIGNoZWNrZXIgIgorICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGUgZ2l2ZW4gaWQocykuIFlvdSBjYW4gZWl0aGVyIGdpdmUgbXVsdGlwbGUgaWRlbnRpZmllcnMgIgorICAgICAgICAgICAgICAgICAgICAic2VwYXJhdGVkIGJ5IGNvbW1hICgsKSBvciBwdXQgdGhpcyBvcHRpb24gbXVsdGlwbGUgdGltZXMgIgorICAgICAgICAgICAgICAgICAgICAiKG9ubHkgb24gdGhlIGNvbW1hbmQgbGluZSwgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAid2hlcmUgaXQgc2hvdWxkIGFwcGVhciBvbmx5IG9uY2UpLiAiCisgICAgICAgICAgICAgICAgICAgICdZb3UgY2FuIGFsc28gdXNlICItLWRpc2FibGU9YWxsIiB0byBkaXNhYmxlIGV2ZXJ5dGhpbmcgZmlyc3QgJworICAgICAgICAgICAgICAgICAgICAiYW5kIHRoZW4gcmVlbmFibGUgc3BlY2lmaWMgY2hlY2tzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgIgorICAgICAgICAgICAgICAgICAgICAidG8gcnVuIG9ubHkgdGhlIHNpbWlsYXJpdGllcyBjaGVja2VyLCB5b3UgY2FuIHVzZSAiCisgICAgICAgICAgICAgICAgICAgICciLS1kaXNhYmxlPWFsbCAtLWVuYWJsZT1zaW1pbGFyaXRpZXMiLiAnCisgICAgICAgICAgICAgICAgICAgICJJZiB5b3Ugd2FudCB0byBydW4gb25seSB0aGUgY2xhc3NlcyBjaGVja2VyLCBidXQgaGF2ZSBubyAiCisgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nIGxldmVsIG1lc3NhZ2VzIGRpc3BsYXllZCwgdXNlICIKKyAgICAgICAgICAgICAgICAgICAgJyItLWRpc2FibGU9YWxsIC0tZW5hYmxlPWNsYXNzZXMgLS1kaXNhYmxlPVciLicsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgIm1zZy10ZW1wbGF0ZSIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8dGVtcGxhdGU+IiwKKyAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIlJlcG9ydHMiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wbGF0ZSB1c2VkIHRvIGRpc3BsYXkgbWVzc2FnZXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgcHl0aG9uIG5ldy1zdHlsZSBmb3JtYXQgc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VkIHRvIGZvcm1hdCB0aGUgbWVzc2FnZSBpbmZvcm1hdGlvbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlNlZSBkb2MgZm9yIGFsbCBkZXRhaWxzLiIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiam9icyIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bi1wcm9jZXNzZXM+IiwKKyAgICAgICAgICAgICAgICAgICAgInNob3J0IjogImoiLAorICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDEsCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIlVzZSBtdWx0aXBsZSBwcm9jZXNzZXMgdG8gc3BlZWQgdXAgUHlsaW50LiBTcGVjaWZ5aW5nIDAgd2lsbCAiCisgICAgICAgICAgICAgICAgICAgICJhdXRvLWRldGVjdCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgYXZhaWxhYmxlIHRvIHVzZS4iLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJ1bnNhZmUtbG9hZC1hbnktZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHluPiIsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICJoaWRlIjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb3cgbG9hZGluZyBvZiBhcmJpdHJhcnkgQyBleHRlbnNpb25zLiBFeHRlbnNpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhcmUgaW1wb3J0ZWQgaW50byB0aGUgYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1heSBydW4gYXJiaXRyYXJ5IGNvZGUuIgorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJsaW1pdC1pbmZlcmVuY2UtcmVzdWx0cyIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnQiLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bnVtYmVyLW9mLXJlc3VsdHM+IiwKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAxMDAsCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRyb2wgdGhlIGFtb3VudCBvZiBwb3RlbnRpYWwgaW5mZXJyZWQgdmFsdWVzIHdoZW4gaW5mZXJyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhIHNpbmdsZSBvYmplY3QuIFRoaXMgY2FuIGhlbHAgdGhlIHBlcmZvcm1hbmNlIHdoZW4gZGVhbGluZyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJsYXJnZSBmdW5jdGlvbnMgb3IgY29tcGxleCwgbmVzdGVkIGNvbmRpdGlvbnMuICIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uLXBrZy1hbGxvdy1saXN0IiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImNzdiIsCisgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxwa2dbLHBrZ10+IiwKKyAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBbXSwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlIG9yIG1vZHVsZSBuYW1lcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSB3aGVyZSBDIGV4dGVuc2lvbnMgbWF5IGJlIGxvYWRlZC4gRXh0ZW5zaW9ucyBhcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGxvYWRpbmcgaW50byB0aGUgYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlciBhbmQgbWF5IHJ1biIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYXJiaXRyYXJ5IGNvZGUuIgorICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJleHRlbnNpb24tcGtnLXdoaXRlbGlzdCIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8cGtnWyxwa2ddPiIsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogW10sCisgICAgICAgICAgICAgICAgICAgICJoZWxwIjogKAorICAgICAgICAgICAgICAgICAgICAgICAgIkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZSBvciBtb2R1bGUgbmFtZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gd2hlcmUgQyBleHRlbnNpb25zIG1heSBiZSBsb2FkZWQuIEV4dGVuc2lvbnMgYXJlIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2FkaW5nIGludG8gdGhlIGFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIG1heSBydW4iCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFyYml0cmFyeSBjb2RlLiAoVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIHRvIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBleHRlbnNpb24tcGtnLWFsbG93LWxpc3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuKSIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAic3VnZ2VzdGlvbi1tb2RlIiwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInluIiwKKyAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHluPiIsCisgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICAgICAiV2hlbiBlbmFibGVkLCBweWxpbnQgd291bGQgYXR0ZW1wdCB0byBndWVzcyBjb21tb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgIm1pc2NvbmZpZ3VyYXRpb24gYW5kIGVtaXQgdXNlci1mcmllbmRseSBoaW50cyBpbnN0ZWFkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZiBmYWxzZS1wb3NpdGl2ZSBlcnJvciBtZXNzYWdlcy4iCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImV4aXQtemVybyIsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogInN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICJBbHdheXMgcmV0dXJuIGEgMCAobm9uLWVycm9yKSBzdGF0dXMgY29kZSwgZXZlbiBpZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAibGludCBlcnJvcnMgYXJlIGZvdW5kLiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRpbnVvdXMgaW50ZWdyYXRpb24gc2NyaXB0cy4iCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImZyb20tc3RkaW4iLAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAoCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJwcmV0IHRoZSBzdGRpbiBhcyBhIHB5dGhvbiBzY3JpcHQsIHdob3NlIGZpbGVuYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcyB0byBiZSBwYXNzZWQgYXMgdGhlIG1vZHVsZV9vcl9wYWNrYWdlIGFyZ3VtZW50LiIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgKQorCisgICAgb3B0aW9uX2dyb3VwcyA9ICgKKyAgICAgICAgKCJNZXNzYWdlcyBjb250cm9sIiwgIk9wdGlvbnMgY29udHJvbGxpbmcgYW5hbHlzaXMgbWVzc2FnZXMiKSwKKyAgICAgICAgKCJSZXBvcnRzIiwgIk9wdGlvbnMgcmVsYXRlZCB0byBvdXRwdXQgZm9ybWF0dGluZyBhbmQgcmVwb3J0aW5nIiksCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnM9KCksIHJlcG9ydGVyPU5vbmUsIG9wdGlvbl9ncm91cHM9KCksIHB5bGludHJjPU5vbmUpOgorICAgICAgICAiIiJTb21lIHN0dWZmIGhhcyB0byBiZSBkb25lIGJlZm9yZSBhbmNlc3RvcnMgaW5pdGlhbGl6YXRpb24uLi4KKyAgICAgICAgbWVzc2FnZXMgc3RvcmUgLyBjaGVja2VycyAvIHJlcG9ydGVyIC8gYXN0cm9pZCBtYW5hZ2VyIiIiCisgICAgICAgIHNlbGYubXNnc19zdG9yZSA9IE1lc3NhZ2VEZWZpbml0aW9uU3RvcmUoKQorICAgICAgICBzZWxmLnJlcG9ydGVyID0gTm9uZQorICAgICAgICBzZWxmLl9yZXBvcnRlcl9uYW1lcyA9IE5vbmUKKyAgICAgICAgc2VsZi5fcmVwb3J0ZXJzID0ge30KKyAgICAgICAgc2VsZi5fY2hlY2tlcnMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBzZWxmLl9wcmFnbWFfbGluZW5vID0ge30KKyAgICAgICAgc2VsZi5faWdub3JlX2ZpbGUgPSBGYWxzZQorICAgICAgICAjIHZpc2l0IHZhcmlhYmxlcworICAgICAgICBzZWxmLmZpbGVfc3RhdGUgPSBGaWxlU3RhdGUoKQorICAgICAgICBzZWxmLmN1cnJlbnRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5jdXJyZW50X2ZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuc3RhdHMgPSBOb25lCisgICAgICAgIHNlbGYuZmFpbF9vbl9zeW1ib2xzID0gW10KKyAgICAgICAgIyBpbml0IG9wdGlvbnMKKyAgICAgICAgc2VsZi5fZXh0ZXJuYWxfb3B0cyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucyArIFB5TGludGVyLm1ha2Vfb3B0aW9ucygpCisgICAgICAgIHNlbGYub3B0aW9uX2dyb3VwcyA9IG9wdGlvbl9ncm91cHMgKyBQeUxpbnRlci5vcHRpb25fZ3JvdXBzCisgICAgICAgIHNlbGYuX29wdGlvbnNfbWV0aG9kcyA9IHsiZW5hYmxlIjogc2VsZi5lbmFibGUsICJkaXNhYmxlIjogc2VsZi5kaXNhYmxlfQorICAgICAgICBzZWxmLl9id19vcHRpb25zX21ldGhvZHMgPSB7CisgICAgICAgICAgICAiZGlzYWJsZS1tc2ciOiBzZWxmLl9vcHRpb25zX21ldGhvZHNbImRpc2FibGUiXSwKKyAgICAgICAgICAgICJlbmFibGUtbXNnIjogc2VsZi5fb3B0aW9uc19tZXRob2RzWyJlbmFibGUiXSwKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlc0hhbmRsZXJNaXhJbi5fX2luaXRfXyhzZWxmKQorICAgICAgICByZXBvcnRlcnMuUmVwb3J0c0hhbmRsZXJNaXhJbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzdXBlcigpLl9faW5pdF9fKAorICAgICAgICAgICAgdXNhZ2U9X19kb2NfXywKKyAgICAgICAgICAgIGNvbmZpZ19maWxlPXB5bGludHJjIG9yIG5leHQoY29uZmlnLmZpbmRfZGVmYXVsdF9jb25maWdfZmlsZXMoKSwgTm9uZSksCisgICAgICAgICkKKyAgICAgICAgY2hlY2tlcnMuQmFzZVRva2VuQ2hlY2tlci5fX2luaXRfXyhzZWxmKQorICAgICAgICAjIHByb3ZpZGVkIHJlcG9ydHMKKyAgICAgICAgc2VsZi5yZXBvcnRzID0gKAorICAgICAgICAgICAgKCJSUDAwMDEiLCAiTWVzc2FnZXMgYnkgY2F0ZWdvcnkiLCByZXBvcnRfdG90YWxfbWVzc2FnZXNfc3RhdHMpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJSUDAwMDIiLAorICAgICAgICAgICAgICAgICIlIGVycm9ycyAvIHdhcm5pbmdzIGJ5IG1vZHVsZSIsCisgICAgICAgICAgICAgICAgcmVwb3J0X21lc3NhZ2VzX2J5X21vZHVsZV9zdGF0cywKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIlJQMDAwMyIsICJNZXNzYWdlcyIsIHJlcG9ydF9tZXNzYWdlc19zdGF0cyksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5yZWdpc3Rlcl9jaGVja2VyKHNlbGYpCisgICAgICAgIHNlbGYuX2R5bmFtaWNfcGx1Z2lucyA9IHNldCgpCisgICAgICAgIHNlbGYuX3B5dGhvbjNfcG9ydGluZ19tb2RlID0gRmFsc2UKKyAgICAgICAgc2VsZi5fZXJyb3JfbW9kZSA9IEZhbHNlCisgICAgICAgIHNlbGYubG9hZF9wcm92aWRlcl9kZWZhdWx0cygpCisgICAgICAgIGlmIHJlcG9ydGVyOgorICAgICAgICAgICAgc2VsZi5zZXRfcmVwb3J0ZXIocmVwb3J0ZXIpCisKKyAgICBkZWYgbG9hZF9kZWZhdWx0X3BsdWdpbnMoc2VsZik6CisgICAgICAgIGNoZWNrZXJzLmluaXRpYWxpemUoc2VsZikKKyAgICAgICAgcmVwb3J0ZXJzLmluaXRpYWxpemUoc2VsZikKKyAgICAgICAgIyBNYWtlIHN1cmUgdG8gbG9hZCB0aGUgZGVmYXVsdCByZXBvcnRlciwgYmVjYXVzZQorICAgICAgICAjIHRoZSBvcHRpb24gaGFzIGJlZW4gc2V0IGJlZm9yZSB0aGUgcGx1Z2lucyBoYWQgYmVlbiBsb2FkZWQuCisgICAgICAgIGlmIG5vdCBzZWxmLnJlcG9ydGVyOgorICAgICAgICAgICAgc2VsZi5fbG9hZF9yZXBvcnRlcnMoKQorCisgICAgZGVmIGxvYWRfcGx1Z2luX21vZHVsZXMoc2VsZiwgbW9kbmFtZXMpOgorICAgICAgICAiIiJ0YWtlIGEgbGlzdCBvZiBtb2R1bGUgbmFtZXMgd2hpY2ggYXJlIHB5bGludCBwbHVnaW5zIGFuZCBsb2FkCisgICAgICAgIGFuZCByZWdpc3RlciB0aGVtCisgICAgICAgICIiIgorICAgICAgICBmb3IgbW9kbmFtZSBpbiBtb2RuYW1lczoKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgaW4gc2VsZi5fZHluYW1pY19wbHVnaW5zOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLl9keW5hbWljX3BsdWdpbnMuYWRkKG1vZG5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5tb2R1dGlscy5sb2FkX21vZHVsZV9mcm9tX25hbWUobW9kbmFtZSkKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVnaXN0ZXIoc2VsZikKKyAgICAgICAgICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBsb2FkX3BsdWdpbl9jb25maWd1cmF0aW9uKHNlbGYpOgorICAgICAgICAiIiJDYWxsIHRoZSBjb25maWd1cmF0aW9uIGhvb2sgZm9yIHBsdWdpbnMKKworICAgICAgICBUaGlzIHdhbGtzIHRocm91Z2ggdGhlIGxpc3Qgb2YgcGx1Z2lucywgZ3JhYnMgdGhlICJsb2FkX2NvbmZpZ3VyYXRpb24iCisgICAgICAgIGhvb2ssIGlmIGV4cG9zZWQsIGFuZCBjYWxscyBpdCB0byBhbGxvdyBwbHVnaW5zIHRvIGNvbmZpZ3VyZSBzcGVjaWZpYworICAgICAgICBzZXR0aW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2R5bmFtaWNfcGx1Z2luczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLm1vZHV0aWxzLmxvYWRfbW9kdWxlX2Zyb21fbmFtZShtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAibG9hZF9jb25maWd1cmF0aW9uIik6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5sb2FkX2NvbmZpZ3VyYXRpb24oc2VsZikKKyAgICAgICAgICAgIGV4Y2VwdCBNb2R1bGVOb3RGb3VuZEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiYmFkLXBsdWdpbi12YWx1ZSIsIGFyZ3M9KG1vZG5hbWUsIGUpLCBsaW5lPTApCisKKyAgICBkZWYgX2xvYWRfcmVwb3J0ZXJzKHNlbGYpIC0+IE5vbmU6CisgICAgICAgIHN1Yl9yZXBvcnRlcnMgPSBbXQorICAgICAgICBvdXRwdXRfZmlsZXMgPSBbXQorICAgICAgICB3aXRoIGNvbnRleHRsaWIuRXhpdFN0YWNrKCkgYXMgc3RhY2s6CisgICAgICAgICAgICBmb3IgcmVwb3J0ZXJfbmFtZSBpbiBzZWxmLl9yZXBvcnRlcl9uYW1lcy5zcGxpdCgiLCIpOgorICAgICAgICAgICAgICAgIHJlcG9ydGVyX25hbWUsICpyZXBvcnRlcl9vdXRwdXQgPSByZXBvcnRlcl9uYW1lLnNwbGl0KCI6IiwgMSkKKworICAgICAgICAgICAgICAgIHJlcG9ydGVyID0gc2VsZi5fbG9hZF9yZXBvcnRlcl9ieV9uYW1lKHJlcG9ydGVyX25hbWUpCisgICAgICAgICAgICAgICAgc3ViX3JlcG9ydGVycy5hcHBlbmQocmVwb3J0ZXIpCisKKyAgICAgICAgICAgICAgICBpZiByZXBvcnRlcl9vdXRwdXQ6CisgICAgICAgICAgICAgICAgICAgIChyZXBvcnRlcl9vdXRwdXQsKSA9IHJlcG9ydGVyX291dHB1dAorCisgICAgICAgICAgICAgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLXdpdGgKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGUgPSBzdGFjay5lbnRlcl9jb250ZXh0KG9wZW4ocmVwb3J0ZXJfb3V0cHV0LCAidyIpKQorCisgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVyLnNldF9vdXRwdXQob3V0cHV0X2ZpbGUpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlcy5hcHBlbmQob3V0cHV0X2ZpbGUpCisKKyAgICAgICAgICAgICMgRXh0ZW5kIHRoZSBsaWZldGltZSBvZiBhbGwgb3BlbmVkIG91dHB1dCBmaWxlcworICAgICAgICAgICAgY2xvc2Vfb3V0cHV0X2ZpbGVzID0gc3RhY2sucG9wX2FsbCgpLmNsb3NlCisKKyAgICAgICAgaWYgbGVuKHN1Yl9yZXBvcnRlcnMpID4gMSBvciBvdXRwdXRfZmlsZXM6CisgICAgICAgICAgICBzZWxmLnNldF9yZXBvcnRlcigKKyAgICAgICAgICAgICAgICByZXBvcnRlcnMuTXVsdGlSZXBvcnRlcigKKyAgICAgICAgICAgICAgICAgICAgc3ViX3JlcG9ydGVycywKKyAgICAgICAgICAgICAgICAgICAgY2xvc2Vfb3V0cHV0X2ZpbGVzLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2V0X3JlcG9ydGVyKHN1Yl9yZXBvcnRlcnNbMF0pCisKKyAgICBkZWYgX2xvYWRfcmVwb3J0ZXJfYnlfbmFtZShzZWxmLCByZXBvcnRlcl9uYW1lOiBzdHIpIC0+IHJlcG9ydGVycy5CYXNlUmVwb3J0ZXI6CisgICAgICAgIG5hbWUgPSByZXBvcnRlcl9uYW1lLmxvd2VyKCkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9yZXBvcnRlcnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVwb3J0ZXJzW25hbWVdKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXBvcnRlcl9jbGFzcyA9IF9sb2FkX3JlcG9ydGVyX2J5X2NsYXNzKHJlcG9ydGVyX25hbWUpCisgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgorICAgICAgICAgICAgcmFpc2UgZXhjZXB0aW9ucy5JbnZhbGlkUmVwb3J0ZXJFcnJvcihuYW1lKSBmcm9tIGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByZXBvcnRlcl9jbGFzcygpCisKKyAgICBkZWYgc2V0X3JlcG9ydGVyKHNlbGYsIHJlcG9ydGVyKToKKyAgICAgICAgIiIic2V0IHRoZSByZXBvcnRlciB1c2VkIHRvIGRpc3BsYXkgbWVzc2FnZXMgYW5kIHJlcG9ydHMiIiIKKyAgICAgICAgc2VsZi5yZXBvcnRlciA9IHJlcG9ydGVyCisgICAgICAgIHJlcG9ydGVyLmxpbnRlciA9IHNlbGYKKworICAgIGRlZiBzZXRfb3B0aW9uKHNlbGYsIG9wdG5hbWUsIHZhbHVlLCBhY3Rpb249Tm9uZSwgb3B0ZGljdD1Ob25lKToKKyAgICAgICAgIiIib3ZlcnJpZGRlbiBmcm9tIGNvbmZpZy5PcHRpb25zUHJvdmlkZXJNaXhpbiB0byBoYW5kbGUgc29tZQorICAgICAgICBzcGVjaWFsIG9wdGlvbnMKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG9wdG5hbWUgaW4gc2VsZi5fb3B0aW9uc19tZXRob2RzIG9yIG9wdG5hbWUgaW4gc2VsZi5fYndfb3B0aW9uc19tZXRob2RzOgorICAgICAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtZXRoID0gc2VsZi5fb3B0aW9uc19tZXRob2RzW29wdG5hbWVdCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBtZXRoID0gc2VsZi5fYndfb3B0aW9uc19tZXRob2RzW29wdG5hbWVdCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaXMgZGVwcmVjYXRlZCwgcmVwbGFjZSBpdCBieSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKG9wdG5hbWUsIG9wdG5hbWUuc3BsaXQoIi0iKVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHV0aWxzLl9jaGVja19jc3YodmFsdWUpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICAgICAgICAgIGZvciBfaWQgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRoKF9pZCwgaWdub3JlX3Vua25vd249VHJ1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtZXRoKHZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiAgIyBubyBuZWVkIHRvIGNhbGwgc2V0X29wdGlvbiwgZGlzYWJsZS9lbmFibGUgbWV0aG9kcyBkbyBpdAorICAgICAgICBlbGlmIG9wdG5hbWUgPT0gIm91dHB1dC1mb3JtYXQiOgorICAgICAgICAgICAgc2VsZi5fcmVwb3J0ZXJfbmFtZXMgPSB2YWx1ZQorICAgICAgICAgICAgIyBJZiB0aGUgcmVwb3J0ZXJzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSwgbG9hZAorICAgICAgICAgICAgIyB0aGUgcmVwb3J0ZXIgY2xhc3MuCisgICAgICAgICAgICBpZiBzZWxmLl9yZXBvcnRlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5fbG9hZF9yZXBvcnRlcnMoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoZWNrZXJzLkJhc2VUb2tlbkNoZWNrZXIuc2V0X29wdGlvbihzZWxmLCBvcHRuYW1lLCB2YWx1ZSwgYWN0aW9uLCBvcHRkaWN0KQorICAgICAgICBleGNlcHQgY29uZmlnLlVuc3VwcG9ydGVkQWN0aW9uOgorICAgICAgICAgICAgcHJpbnQoIm9wdGlvbiAlcyBjYW4ndCBiZSByZWFkIGZyb20gY29uZmlnIGZpbGUiICUgb3B0bmFtZSwgZmlsZT1zeXMuc3RkZXJyKQorCisgICAgZGVmIHJlZ2lzdGVyX3JlcG9ydGVyKHNlbGYsIHJlcG9ydGVyX2NsYXNzKToKKyAgICAgICAgc2VsZi5fcmVwb3J0ZXJzW3JlcG9ydGVyX2NsYXNzLm5hbWVdID0gcmVwb3J0ZXJfY2xhc3MKKworICAgIGRlZiByZXBvcnRfb3JkZXIoc2VsZik6CisgICAgICAgIHJlcG9ydHMgPSBzb3J0ZWQoc2VsZi5fcmVwb3J0cywga2V5PWxhbWJkYSB4OiBnZXRhdHRyKHgsICJuYW1lIiwgIiIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFJlbW92ZSB0aGUgY3VycmVudCByZXBvcnRlciBhbmQgYWRkIGl0CisgICAgICAgICAgICAjIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgICAgICAgICAgICByZXBvcnRzLnBvcChyZXBvcnRzLmluZGV4KHNlbGYpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcG9ydHMuYXBwZW5kKHNlbGYpCisgICAgICAgIHJldHVybiByZXBvcnRzCisKKyAgICAjIGNoZWNrZXJzIG1hbmlwdWxhdGlvbiBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICBkZWYgcmVnaXN0ZXJfY2hlY2tlcihzZWxmLCBjaGVja2VyKToKKyAgICAgICAgIiIicmVnaXN0ZXIgYSBuZXcgY2hlY2tlcgorCisgICAgICAgIGNoZWNrZXIgaXMgYW4gb2JqZWN0IGltcGxlbWVudGluZyBJUmF3Q2hlY2tlciBvciAvIGFuZCBJQXN0cm9pZENoZWNrZXIKKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBjaGVja2VyLnByaW9yaXR5IDw9IDAsICJjaGVja2VyIHByaW9yaXR5IGNhbid0IGJlID49IDAiCisgICAgICAgIHNlbGYuX2NoZWNrZXJzW2NoZWNrZXIubmFtZV0uYXBwZW5kKGNoZWNrZXIpCisgICAgICAgIGZvciByX2lkLCByX3RpdGxlLCByX2NiIGluIGNoZWNrZXIucmVwb3J0czoKKyAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJfcmVwb3J0KHJfaWQsIHJfdGl0bGUsIHJfY2IsIGNoZWNrZXIpCisgICAgICAgIHNlbGYucmVnaXN0ZXJfb3B0aW9uc19wcm92aWRlcihjaGVja2VyKQorICAgICAgICBpZiBoYXNhdHRyKGNoZWNrZXIsICJtc2dzIik6CisgICAgICAgICAgICBzZWxmLm1zZ3Nfc3RvcmUucmVnaXN0ZXJfbWVzc2FnZXNfZnJvbV9jaGVja2VyKGNoZWNrZXIpCisgICAgICAgIGNoZWNrZXIubG9hZF9kZWZhdWx0cygpCisKKyAgICAgICAgIyBSZWdpc3RlciB0aGUgY2hlY2tlciwgYnV0IGRpc2FibGUgYWxsIG9mIGl0cyBtZXNzYWdlcy4KKyAgICAgICAgaWYgbm90IGdldGF0dHIoY2hlY2tlciwgImVuYWJsZWQiLCBUcnVlKToKKyAgICAgICAgICAgIHNlbGYuZGlzYWJsZShjaGVja2VyLm5hbWUpCisKKyAgICBkZWYgZW5hYmxlX2ZhaWxfb25fbWVzc2FnZXMoc2VsZik6CisgICAgICAgICIiImVuYWJsZSAnZmFpbCBvbicgbXNncworCisgICAgICAgIENvbnZlcnQgdmFsdWVzIGluIGNvbmZpZy5mYWlsX29uICh3aGljaCBtaWdodCBiZSBtc2cgY2F0ZWdvcnksIG1zZyBpZCwKKyAgICAgICAgb3Igc3ltYm9sKSB0byBzcGVjaWZpYyBtc2dzLCB0aGVuIGVuYWJsZSBhbmQgZmxhZyB0aGVtIGZvciBsYXRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGZhaWxfb25fdmFscyA9IHNlbGYuY29uZmlnLmZhaWxfb24KKyAgICAgICAgaWYgbm90IGZhaWxfb25fdmFsczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZhaWxfb25fY2F0cyA9IHNldCgpCisgICAgICAgIGZhaWxfb25fbXNncyA9IHNldCgpCisgICAgICAgIGZvciB2YWwgaW4gZmFpbF9vbl92YWxzOgorICAgICAgICAgICAgIyBJZiB2YWx1ZSBpcyBhIGNhdGVvZ3J5LCBhZGQgY2F0ZWdvcnksIGVsc2UgYWRkIG1lc3NhZ2UKKyAgICAgICAgICAgIGlmIHZhbCBpbiBNU0dfVFlQRVM6CisgICAgICAgICAgICAgICAgZmFpbF9vbl9jYXRzLmFkZCh2YWwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZhaWxfb25fbXNncy5hZGQodmFsKQorCisgICAgICAgICMgRm9yIGV2ZXJ5IG1lc3NhZ2UgaW4gZXZlcnkgY2hlY2tlciwgaWYgY2F0IG9yIG1zZyBmbGFnZ2VkLCBlbmFibGUgY2hlY2sKKyAgICAgICAgZm9yIGFsbF9jaGVja2VycyBpbiBzZWxmLl9jaGVja2Vycy52YWx1ZXMoKToKKyAgICAgICAgICAgIGZvciBjaGVja2VyIGluIGFsbF9jaGVja2VyczoKKyAgICAgICAgICAgICAgICBmb3IgbXNnIGluIGNoZWNrZXIubWVzc2FnZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG1zZy5tc2dpZCBpbiBmYWlsX29uX21zZ3Mgb3IgbXNnLnN5bWJvbCBpbiBmYWlsX29uX21zZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG1lc3NhZ2UgaWQvc3ltYm9sIG1hdGNoZWQsIGVuYWJsZSBhbmQgZmxhZyBpdAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmFibGUobXNnLm1zZ2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsX29uX3N5bWJvbHMuYXBwZW5kKG1zZy5zeW1ib2wpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbXNnLm1zZ2lkWzBdIGluIGZhaWxfb25fY2F0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZSBzdGFydHMgd2l0aCBhIGNhdGVvZ3J5IHZhbHVlLCBmbGFnIChidXQgZG8gbm90IGVuYWJsZSkgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbF9vbl9zeW1ib2xzLmFwcGVuZChtc2cuc3ltYm9sKQorCisgICAgZGVmIGFueV9mYWlsX29uX2lzc3VlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGFueSh4IGluIHNlbGYuZmFpbF9vbl9zeW1ib2xzIGZvciB4IGluIHNlbGYuc3RhdHNbImJ5X21zZyJdKQorCisgICAgZGVmIGRpc2FibGVfbm9lcnJvcl9tZXNzYWdlcyhzZWxmKToKKyAgICAgICAgZm9yIG1zZ2NhdCwgbXNnaWRzIGluIHNlbGYubXNnc19zdG9yZS5fbXNnc19ieV9jYXRlZ29yeS5pdGVtcygpOgorICAgICAgICAgICAgIyBlbmFibGUgb25seSBtZXNzYWdlcyB3aXRoICdlcnJvcicgc2V2ZXJpdHkgYW5kIGFib3ZlICgnZmF0YWwnKQorICAgICAgICAgICAgaWYgbXNnY2F0IGluIFsiRSIsICJGIl06CisgICAgICAgICAgICAgICAgZm9yIG1zZ2lkIGluIG1zZ2lkczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmFibGUobXNnaWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBtc2dpZCBpbiBtc2dpZHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzYWJsZShtc2dpZCkKKworICAgIGRlZiBkaXNhYmxlX3JlcG9ydGVycyhzZWxmKToKKyAgICAgICAgIiIiZGlzYWJsZSBhbGwgcmVwb3J0ZXJzIiIiCisgICAgICAgIGZvciBfcmVwb3J0ZXJzIGluIHNlbGYuX3JlcG9ydHMudmFsdWVzKCk6CisgICAgICAgICAgICBmb3IgcmVwb3J0X2lkLCBfLCBfIGluIF9yZXBvcnRlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlX3JlcG9ydChyZXBvcnRfaWQpCisKKyAgICBkZWYgZXJyb3JfbW9kZShzZWxmKToKKyAgICAgICAgIiIiZXJyb3IgbW9kZTogZW5hYmxlIG9ubHkgZXJyb3JzOyBubyByZXBvcnRzLCBubyBwZXJzaXN0ZW50IiIiCisgICAgICAgIHNlbGYuX2Vycm9yX21vZGUgPSBUcnVlCisgICAgICAgIHNlbGYuZGlzYWJsZV9ub2Vycm9yX21lc3NhZ2VzKCkKKyAgICAgICAgc2VsZi5kaXNhYmxlKCJtaXNjZWxsYW5lb3VzIikKKyAgICAgICAgaWYgc2VsZi5fcHl0aG9uM19wb3J0aW5nX21vZGU6CisgICAgICAgICAgICBzZWxmLmRpc2FibGUoImFsbCIpCisgICAgICAgICAgICBmb3IgbXNnX2lkIGluIHNlbGYuX2NoZWNrZXJfbWVzc2FnZXMoInB5dGhvbjMiKToKKyAgICAgICAgICAgICAgICBpZiBtc2dfaWQuc3RhcnRzd2l0aCgiRSIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVuYWJsZShtc2dfaWQpCisgICAgICAgICAgICBjb25maWdfcGFyc2VyID0gc2VsZi5jZmdmaWxlX3BhcnNlcgorICAgICAgICAgICAgaWYgY29uZmlnX3BhcnNlci5oYXNfb3B0aW9uKCJNRVNTQUdFUyBDT05UUk9MIiwgImRpc2FibGUiKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbmZpZ19wYXJzZXIuZ2V0KCJNRVNTQUdFUyBDT05UUk9MIiwgImRpc2FibGUiKQorICAgICAgICAgICAgICAgIHNlbGYuZ2xvYmFsX3NldF9vcHRpb24oImRpc2FibGUiLCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgicHl0aG9uMyIpCisgICAgICAgIHNlbGYuc2V0X29wdGlvbigicmVwb3J0cyIsIEZhbHNlKQorICAgICAgICBzZWxmLnNldF9vcHRpb24oInBlcnNpc3RlbnQiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5zZXRfb3B0aW9uKCJzY29yZSIsIEZhbHNlKQorCisgICAgZGVmIHB5dGhvbjNfcG9ydGluZ19tb2RlKHNlbGYpOgorICAgICAgICAiIiJEaXNhYmxlIGFsbCBvdGhlciBjaGVja2VycyBhbmQgZW5hYmxlIFB5dGhvbiAzIHdhcm5pbmdzLiIiIgorICAgICAgICBzZWxmLmRpc2FibGUoImFsbCIpCisgICAgICAgICMgcmUtZW5hYmxlIHNvbWUgZXJyb3JzLCBvciAncHJpbnQnLCAncmFpc2UnLCAnYXN5bmMnLCAnYXdhaXQnIHdpbGwgbWlzdGFrZW5seSBsaW50IGZpbmUKKyAgICAgICAgc2VsZi5lbmFibGUoImZhdGFsIikgICMgRjAwMDEKKyAgICAgICAgc2VsZi5lbmFibGUoImFzdHJvaWQtZXJyb3IiKSAgIyBGMDAwMgorICAgICAgICBzZWxmLmVuYWJsZSgicGFyc2UtZXJyb3IiKSAgIyBGMDAxMAorICAgICAgICBzZWxmLmVuYWJsZSgic3ludGF4LWVycm9yIikgICMgRTAwMDEKKyAgICAgICAgc2VsZi5lbmFibGUoInB5dGhvbjMiKQorICAgICAgICBpZiBzZWxmLl9lcnJvcl9tb2RlOgorICAgICAgICAgICAgIyBUaGUgZXJyb3IgbW9kZSB3YXMgYWN0aXZhdGVkLCB1c2luZyB0aGUgLUUgZmxhZy4KKyAgICAgICAgICAgICMgU28gd2UnbGwgbmVlZCB0byBlbmFibGUgb25seSB0aGUgZXJyb3JzIGZyb20gdGhlCisgICAgICAgICAgICAjIFB5dGhvbiAzIHBvcnRpbmcgY2hlY2tlci4KKyAgICAgICAgICAgIGZvciBtc2dfaWQgaW4gc2VsZi5fY2hlY2tlcl9tZXNzYWdlcygicHl0aG9uMyIpOgorICAgICAgICAgICAgICAgIGlmIG1zZ19pZC5zdGFydHN3aXRoKCJFIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5hYmxlKG1zZ19pZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc2FibGUobXNnX2lkKQorICAgICAgICBjb25maWdfcGFyc2VyID0gc2VsZi5jZmdmaWxlX3BhcnNlcgorICAgICAgICBpZiBjb25maWdfcGFyc2VyLmhhc19vcHRpb24oIk1FU1NBR0VTIENPTlRST0wiLCAiZGlzYWJsZSIpOgorICAgICAgICAgICAgdmFsdWUgPSBjb25maWdfcGFyc2VyLmdldCgiTUVTU0FHRVMgQ09OVFJPTCIsICJkaXNhYmxlIikKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFsX3NldF9vcHRpb24oImRpc2FibGUiLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5fcHl0aG9uM19wb3J0aW5nX21vZGUgPSBUcnVlCisKKyAgICBkZWYgbGlzdF9tZXNzYWdlc19lbmFibGVkKHNlbGYpOgorICAgICAgICBlbmFibGVkID0gWworICAgICAgICAgICAgZiIgIHttZXNzYWdlLnN5bWJvbH0gKHttZXNzYWdlLm1zZ2lkfSkiCisgICAgICAgICAgICBmb3IgbWVzc2FnZSBpbiBzZWxmLm1zZ3Nfc3RvcmUubWVzc2FnZXMKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfbWVzc2FnZV9lbmFibGVkKG1lc3NhZ2UubXNnaWQpCisgICAgICAgIF0KKyAgICAgICAgZGlzYWJsZWQgPSBbCisgICAgICAgICAgICBmIiAge21lc3NhZ2Uuc3ltYm9sfSAoe21lc3NhZ2UubXNnaWR9KSIKKyAgICAgICAgICAgIGZvciBtZXNzYWdlIGluIHNlbGYubXNnc19zdG9yZS5tZXNzYWdlcworICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfbWVzc2FnZV9lbmFibGVkKG1lc3NhZ2UubXNnaWQpCisgICAgICAgIF0KKyAgICAgICAgcHJpbnQoIkVuYWJsZWQgbWVzc2FnZXM6IikKKyAgICAgICAgZm9yIG1zZyBpbiBzb3J0ZWQoZW5hYmxlZCk6CisgICAgICAgICAgICBwcmludChtc2cpCisgICAgICAgIHByaW50KCJcbkRpc2FibGVkIG1lc3NhZ2VzOiIpCisgICAgICAgIGZvciBtc2cgaW4gc29ydGVkKGRpc2FibGVkKToKKyAgICAgICAgICAgIHByaW50KG1zZykKKyAgICAgICAgcHJpbnQoIiIpCisKKyAgICAjIGJsb2NrIGxldmVsIG9wdGlvbiBoYW5kbGluZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIHNlZSBmdW5jX2Jsb2NrX2Rpc2FibGVfbXNnLnB5IHRlc3QgY2FzZSBmb3IgZXhwZWN0ZWQgYmVoYXZpb3VyCisKKyAgICBkZWYgcHJvY2Vzc190b2tlbnMoc2VsZiwgdG9rZW5zKToKKyAgICAgICAgIiIiUHJvY2VzcyB0b2tlbnMgZnJvbSB0aGUgY3VycmVudCBtb2R1bGUgdG8gc2VhcmNoIGZvciBtb2R1bGUvYmxvY2sgbGV2ZWwKKyAgICAgICAgb3B0aW9ucy4iIiIKKyAgICAgICAgY29udHJvbF9wcmFnbWFzID0geyJkaXNhYmxlIiwgImVuYWJsZSJ9CisgICAgICAgIHByZXZfbGluZSA9IE5vbmUKKyAgICAgICAgc2F3X25ld2xpbmUgPSBUcnVlCisgICAgICAgIHNlZW5fbmV3bGluZSA9IFRydWUKKyAgICAgICAgZm9yICh0b2tfdHlwZSwgY29udGVudCwgc3RhcnQsIF8sIF8pIGluIHRva2VuczoKKyAgICAgICAgICAgIGlmIHByZXZfbGluZSBhbmQgcHJldl9saW5lICE9IHN0YXJ0WzBdOgorICAgICAgICAgICAgICAgIHNhd19uZXdsaW5lID0gc2Vlbl9uZXdsaW5lCisgICAgICAgICAgICAgICAgc2Vlbl9uZXdsaW5lID0gRmFsc2UKKworICAgICAgICAgICAgcHJldl9saW5lID0gc3RhcnRbMF0KKyAgICAgICAgICAgIGlmIHRva190eXBlIGluICh0b2tlbml6ZS5OTCwgdG9rZW5pemUuTkVXTElORSk6CisgICAgICAgICAgICAgICAgc2Vlbl9uZXdsaW5lID0gVHJ1ZQorCisgICAgICAgICAgICBpZiB0b2tfdHlwZSAhPSB0b2tlbml6ZS5DT01NRU5UOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29udGVudCkKKyAgICAgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgcHJhZ21hX3JlcHIgaW4gcGFyc2VfcHJhZ21hKG1hdGNoLmdyb3VwKDIpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJhZ21hX3JlcHIuYWN0aW9uIGluICgiZGlzYWJsZS1hbGwiLCAic2tpcC1maWxlIik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcmFnbWFfcmVwci5hY3Rpb24gPT0gImRpc2FibGUtYWxsIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZC1wcmFnbWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPXN0YXJ0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSgiZGlzYWJsZS1hbGwiLCAic2tpcC1maWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgiZmlsZS1pZ25vcmVkIiwgbGluZT1zdGFydFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lnbm9yZV9maWxlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGggPSBzZWxmLl9vcHRpb25zX21ldGhvZHNbcHJhZ21hX3JlcHIuYWN0aW9uXQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRoID0gc2VsZi5fYndfb3B0aW9uc19tZXRob2RzW3ByYWdtYV9yZXByLmFjdGlvbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgZm91bmQgYSAiKGRpc3xlbilhYmxlLW1zZyIgcHJhZ21hIGRlcHJlY2F0ZWQgc3VwcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcHJlY2F0ZWQtcHJhZ21hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPXN0YXJ0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmFnbWFfcmVwci5hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByYWdtYV9yZXByLmFjdGlvbi5yZXBsYWNlKCItbXNnIiwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGZvciBtc2dpZCBpbiBwcmFnbWFfcmVwci5tZXNzYWdlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIHRoZSBsaW5lIHdoZXJlIGEgY29udHJvbCBwcmFnbWEgd2FzIGVuY291bnRlcmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJhZ21hX3JlcHIuYWN0aW9uIGluIGNvbnRyb2xfcHJhZ21hczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmFnbWFfbGluZW5vW21zZ2lkXSA9IHN0YXJ0WzBdCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmFnbWFfcmVwci5hY3Rpb24sIG1zZ2lkKSA9PSAoImRpc2FibGUiLCAiYWxsIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcHJlY2F0ZWQtcHJhZ21hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1zdGFydFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oImRpc2FibGU9YWxsIiwgInNraXAtZmlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJmaWxlLWlnbm9yZWQiLCBsaW5lPXN0YXJ0WzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lnbm9yZV9maWxlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgd2UgZGlkIG5vdCBzZWUgYSBuZXdsaW5lIGJldHdlZW4gdGhlIHByZXZpb3VzIGxpbmUgYW5kIG5vdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlIHNhdyBhIGJhY2tzbGFzaCBzbyB0cmVhdCB0aGUgdHdvIGxpbmVzIGFzIG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnQgPSBzdGFydFswXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNhd19uZXdsaW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnQgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGgobXNnaWQsICJtb2R1bGUiLCBsX3N0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGV4Y2VwdGlvbnMuVW5rbm93bk1lc3NhZ2VFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkLW9wdGlvbi12YWx1ZSIsIGFyZ3M9bXNnaWQsIGxpbmU9c3RhcnRbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQgVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQtaW5saW5lLW9wdGlvbiIsIGFyZ3M9ZXJyLnRva2VuLCBsaW5lPXN0YXJ0WzBdCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBleGNlcHQgSW52YWxpZFByYWdtYUVycm9yIGFzIGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKCJiYWQtaW5saW5lLW9wdGlvbiIsIGFyZ3M9ZXJyLnRva2VuLCBsaW5lPXN0YXJ0WzBdKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAjIGNvZGUgY2hlY2tpbmcgbWV0aG9kcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiBnZXRfY2hlY2tlcnMoc2VsZik6CisgICAgICAgICIiInJldHVybiBhbGwgYXZhaWxhYmxlIGNoZWNrZXJzIGFzIGEgbGlzdCIiIgorICAgICAgICByZXR1cm4gW3NlbGZdICsgWworICAgICAgICAgICAgYworICAgICAgICAgICAgZm9yIF9jaGVja2VycyBpbiBzZWxmLl9jaGVja2Vycy52YWx1ZXMoKQorICAgICAgICAgICAgZm9yIGMgaW4gX2NoZWNrZXJzCisgICAgICAgICAgICBpZiBjIGlzIG5vdCBzZWxmCisgICAgICAgIF0KKworICAgIGRlZiBnZXRfY2hlY2tlcl9uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiR2V0IGFsbCB0aGUgY2hlY2tlciBuYW1lcyB0aGF0IHRoaXMgbGludGVyIGtub3dzIGFib3V0LiIiIgorICAgICAgICBjdXJyZW50X2NoZWNrZXJzID0gc2VsZi5nZXRfY2hlY2tlcnMoKQorICAgICAgICByZXR1cm4gc29ydGVkKAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoZWNrZXIubmFtZQorICAgICAgICAgICAgICAgIGZvciBjaGVja2VyIGluIGN1cnJlbnRfY2hlY2tlcnMKKyAgICAgICAgICAgICAgICBpZiBjaGVja2VyLm5hbWUgIT0gTUFJTl9DSEVDS0VSX05BTUUKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorCisgICAgZGVmIHByZXBhcmVfY2hlY2tlcnMoc2VsZik6CisgICAgICAgICIiInJldHVybiBjaGVja2VycyBuZWVkZWQgZm9yIGFjdGl2YXRlZCBtZXNzYWdlcyBhbmQgcmVwb3J0cyIiIgorICAgICAgICBpZiBub3Qgc2VsZi5jb25maWcucmVwb3J0czoKKyAgICAgICAgICAgIHNlbGYuZGlzYWJsZV9yZXBvcnRlcnMoKQorICAgICAgICAjIGdldCBuZWVkZWQgY2hlY2tlcnMKKyAgICAgICAgbmVlZGVkX2NoZWNrZXJzID0gW3NlbGZdCisgICAgICAgIGZvciBjaGVja2VyIGluIHNlbGYuZ2V0X2NoZWNrZXJzKClbMTpdOgorICAgICAgICAgICAgbWVzc2FnZXMgPSB7bXNnIGZvciBtc2cgaW4gY2hlY2tlci5tc2dzIGlmIHNlbGYuaXNfbWVzc2FnZV9lbmFibGVkKG1zZyl9CisgICAgICAgICAgICBpZiBtZXNzYWdlcyBvciBhbnkoc2VsZi5yZXBvcnRfaXNfZW5hYmxlZChyWzBdKSBmb3IgciBpbiBjaGVja2VyLnJlcG9ydHMpOgorICAgICAgICAgICAgICAgIG5lZWRlZF9jaGVja2Vycy5hcHBlbmQoY2hlY2tlcikKKyAgICAgICAgIyBTb3J0IGNoZWNrZXJzIGJ5IHByaW9yaXR5CisgICAgICAgIG5lZWRlZF9jaGVja2VycyA9IHNvcnRlZCgKKyAgICAgICAgICAgIG5lZWRlZF9jaGVja2Vycywga2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoInByaW9yaXR5IiksIHJldmVyc2U9VHJ1ZQorICAgICAgICApCisgICAgICAgIHJldHVybiBuZWVkZWRfY2hlY2tlcnMKKworICAgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc2hvdWxkX2FuYWx5emVfZmlsZShtb2RuYW1lLCBwYXRoLCBpc19hcmd1bWVudD1GYWxzZSk6CisgICAgICAgICIiIlJldHVybnMgd2hldGhlciBvciBub3QgYSBtb2R1bGUgc2hvdWxkIGJlIGNoZWNrZWQuCisKKyAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIFRydWUgZm9yIGFsbCBweXRob24gc291cmNlIGZpbGUsIGluZGljYXRpbmcKKyAgICAgICAgdGhhdCBhbGwgZmlsZXMgc2hvdWxkIGJlIGxpbnRlZC4KKworICAgICAgICBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGF0IG1vZHVsZXMgc2F0aXNmeWluZworICAgICAgICBjZXJ0YWluIGNvbmRpdGlvbnMgc2hvdWxkIG5vdCBiZSBsaW50ZWQuCisKKyAgICAgICAgOnBhcmFtIHN0ciBtb2RuYW1lOiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGJlIGNoZWNrZWQuCisgICAgICAgIDpwYXJhbSBzdHIgcGF0aDogVGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIG1vZHVsZS4KKyAgICAgICAgOnBhcmFtIGJvb2wgaXNfYXJndW1lbnQ6IFdoZXRoZXIgdGhlIGZpbGUgaXMgYW4gYXJndW1lbnQgdG8gcHlsaW50IG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzIHdoaWNoIHJlc3BlY3QgdGhpcyBwcm9wZXJ0eSBhcmUgYWx3YXlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkLCBzaW5jZSB0aGUgdXNlciByZXF1ZXN0ZWQgaXQgZXhwbGljaXRseS4KKyAgICAgICAgOnJldHVybnM6IFRydWUgaWYgdGhlIG1vZHVsZSBzaG91bGQgYmUgY2hlY2tlZC4KKyAgICAgICAgOnJ0eXBlOiBib29sCisgICAgICAgICIiIgorICAgICAgICBpZiBpc19hcmd1bWVudDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBwYXRoLmVuZHN3aXRoKCIucHkiKQorCisgICAgIyBweWxpbnQ6IGVuYWJsZT11bnVzZWQtYXJndW1lbnQKKworICAgIGRlZiBpbml0aWFsaXplKHNlbGYpOgorICAgICAgICAiIiJJbml0aWFsaXplIGxpbnRlciBmb3IgbGludGluZworCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYW55IGxpbnRpbmcgaXMgZG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgaW5pdGlhbGl6ZSBtc2dzX3N0YXRlIG5vdyB0aGF0IGFsbCBtZXNzYWdlcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBpbnRvCisgICAgICAgICMgdGhlIHN0b3JlCisgICAgICAgIGZvciBtc2cgaW4gc2VsZi5tc2dzX3N0b3JlLm1lc3NhZ2VzOgorICAgICAgICAgICAgaWYgbm90IG1zZy5tYXlfYmVfZW1pdHRlZCgpOgorICAgICAgICAgICAgICAgIHNlbGYuX21zZ3Nfc3RhdGVbbXNnLm1zZ2lkXSA9IEZhbHNlCisKKyAgICBkZWYgY2hlY2soc2VsZiwgZmlsZXNfb3JfbW9kdWxlcyk6CisgICAgICAgICIiIm1haW4gY2hlY2tpbmcgZW50cnk6IGNoZWNrIGEgbGlzdCBvZiBmaWxlcyBvciBtb2R1bGVzIGZyb20gdGhlaXIgbmFtZS4KKworICAgICAgICBmaWxlc19vcl9tb2R1bGVzIGlzIGVpdGhlciBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgcHJlc2VudGluZyBtb2R1bGVzIHRvIGNoZWNrLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmluaXRpYWxpemUoKQorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpbGVzX29yX21vZHVsZXMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgZmlsZXNfb3JfbW9kdWxlcyA9IChmaWxlc19vcl9tb2R1bGVzLCkKKworICAgICAgICBpZiBzZWxmLmNvbmZpZy5mcm9tX3N0ZGluOgorICAgICAgICAgICAgaWYgbGVuKGZpbGVzX29yX21vZHVsZXMpICE9IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgZXhjZXB0aW9ucy5JbnZhbGlkQXJnc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBmaWxlbmFtZSByZXF1aXJlZCBmb3IgLS1mcm9tLXN0ZGluIgorICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgZmlsZXBhdGggPSBmaWxlc19vcl9tb2R1bGVzWzBdCisgICAgICAgICAgICB3aXRoIGZpeF9pbXBvcnRfcGF0aChmaWxlc19vcl9tb2R1bGVzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19maWxlcygKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rvb2xzLnBhcnRpYWwoc2VsZi5nZXRfYXN0LCBkYXRhPV9yZWFkX3N0ZGluKCkpLAorICAgICAgICAgICAgICAgICAgICBbc2VsZi5fZ2V0X2ZpbGVfZGVzY3JfZnJvbV9zdGRpbihmaWxlcGF0aCldLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxpZiBzZWxmLmNvbmZpZy5qb2JzID09IDE6CisgICAgICAgICAgICB3aXRoIGZpeF9pbXBvcnRfcGF0aChmaWxlc19vcl9tb2R1bGVzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19maWxlcygKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfYXN0LCBzZWxmLl9pdGVyYXRlX2ZpbGVfZGVzY3JzKGZpbGVzX29yX21vZHVsZXMpCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hlY2tfcGFyYWxsZWwoCisgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5qb2JzLAorICAgICAgICAgICAgICAgIHNlbGYuX2l0ZXJhdGVfZmlsZV9kZXNjcnMoZmlsZXNfb3JfbW9kdWxlcyksCisgICAgICAgICAgICAgICAgZmlsZXNfb3JfbW9kdWxlcywKKyAgICAgICAgICAgICkKKworICAgIGRlZiBjaGVja19zaW5nbGVfZmlsZShzZWxmLCBuYW1lLCBmaWxlcGF0aCwgbW9kbmFtZSk6CisgICAgICAgICIiIkNoZWNrIHNpbmdsZSBmaWxlCisKKyAgICAgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgdGhhdCBhcmUgZG9jdW1lbnRlZCBpbiBfY2hlY2tfZmlsZXMKKworICAgICAgICBUaGUgaW5pdGlhbGl6ZSgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kCisgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYuX2FzdHJvaWRfbW9kdWxlX2NoZWNrZXIoKSBhcyBjaGVja19hc3Ryb2lkX21vZHVsZToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ZpbGUoCisgICAgICAgICAgICAgICAgc2VsZi5nZXRfYXN0LCBjaGVja19hc3Ryb2lkX21vZHVsZSwgbmFtZSwgZmlsZXBhdGgsIG1vZG5hbWUKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfY2hlY2tfZmlsZXMoc2VsZiwgZ2V0X2FzdCwgZmlsZV9kZXNjcnMpOgorICAgICAgICAiIiJDaGVjayBhbGwgZmlsZXMgZnJvbSBmaWxlX2Rlc2NycworCisgICAgICAgIFRoZSBmaWxlX2Rlc2NycyBzaG91bGQgYmUgaXRlcmFibGUgb2YgdHVwbGUgKG5hbWUsIGZpbGVwYXRoLCBtb2RuYW1lKQorICAgICAgICB3aGVyZQorICAgICAgICAtIG5hbWU6IGZ1bGwgbmFtZSBvZiB0aGUgbW9kdWxlCisgICAgICAgIC0gZmlsZXBhdGg6IHBhdGggb2YgdGhlIGZpbGUKKyAgICAgICAgLSBtb2RuYW1lOiBtb2R1bGUgbmFtZQorICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLl9hc3Ryb2lkX21vZHVsZV9jaGVja2VyKCkgYXMgY2hlY2tfYXN0cm9pZF9tb2R1bGU6CisgICAgICAgICAgICBmb3IgbmFtZSwgZmlsZXBhdGgsIG1vZG5hbWUgaW4gZmlsZV9kZXNjcnM6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfZmlsZShnZXRfYXN0LCBjaGVja19hc3Ryb2lkX21vZHVsZSwgbmFtZSwgZmlsZXBhdGgsIG1vZG5hbWUpCisKKyAgICBkZWYgX2NoZWNrX2ZpbGUoc2VsZiwgZ2V0X2FzdCwgY2hlY2tfYXN0cm9pZF9tb2R1bGUsIG5hbWUsIGZpbGVwYXRoLCBtb2RuYW1lKToKKyAgICAgICAgIiIiQ2hlY2sgYSBmaWxlIHVzaW5nIHRoZSBwYXNzZWQgdXRpbGl0eSBmdW5jdGlvbnMgKGdldF9hc3QgYW5kIGNoZWNrX2FzdHJvaWRfbW9kdWxlKQorCisgICAgICAgIDpwYXJhbSBjYWxsYWJsZSBnZXRfYXN0OiBjYWxsYWJsZSByZXR1cm5pbmcgQVNUIGZyb20gZGVmaW5lZCBmaWxlIHRha2luZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cworICAgICAgICAtIGZpbGVwYXRoOiBwYXRoIHRvIHRoZSBmaWxlIHRvIGNoZWNrCisgICAgICAgIC0gbmFtZTogUHl0aG9uIG1vZHVsZSBuYW1lCisgICAgICAgIDpwYXJhbSBjYWxsYWJsZSBjaGVja19hc3Ryb2lkX21vZHVsZTogY2FsbGFibGUgY2hlY2tpbmcgYW4gQVNUIHRha2luZyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cworICAgICAgICAtIGFzdDogQVNUIG9mIHRoZSBtb2R1bGUKKyAgICAgICAgOnBhcmFtIHN0ciBuYW1lOiBmdWxsIG5hbWUgb2YgdGhlIG1vZHVsZQorICAgICAgICA6cGFyYW0gc3RyIGZpbGVwYXRoOiBwYXRoIHRvIGNoZWNrZWQgZmlsZQorICAgICAgICA6cGFyYW0gc3RyIG1vZG5hbWU6IG5hbWUgb2YgdGhlIGNoZWNrZWQgUHl0aG9uIG1vZHVsZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zZXRfY3VycmVudF9tb2R1bGUobmFtZSwgZmlsZXBhdGgpCisgICAgICAgICMgZ2V0IHRoZSBtb2R1bGUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgYXN0X25vZGUgPSBnZXRfYXN0KGZpbGVwYXRoLCBuYW1lKQorICAgICAgICBpZiBhc3Rfbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5faWdub3JlX2ZpbGUgPSBGYWxzZQorCisgICAgICAgIHNlbGYuZmlsZV9zdGF0ZSA9IEZpbGVTdGF0ZShtb2RuYW1lKQorICAgICAgICAjIGZpeCB0aGUgY3VycmVudCBmaWxlIChpZiB0aGUgc291cmNlIGZpbGUgd2FzIG5vdCBhdmFpbGFibGUgb3IKKyAgICAgICAgIyBpZiBpdCdzIGFjdHVhbGx5IGEgYyBleHRlbnNpb24pCisgICAgICAgIHNlbGYuY3VycmVudF9maWxlID0gYXN0X25vZGUuZmlsZSAgIyBweWxpbnQ6IGRpc2FibGU9bWF5YmUtbm8tbWVtYmVyCisgICAgICAgIGNoZWNrX2FzdHJvaWRfbW9kdWxlKGFzdF9ub2RlKQorICAgICAgICAjIHdhcm4gYWJvdXQgc3B1cmlvdXMgaW5saW5lIG1lc3NhZ2VzIGhhbmRsaW5nCisgICAgICAgIHNwdXJpb3VzX21lc3NhZ2VzID0gc2VsZi5maWxlX3N0YXRlLml0ZXJfc3B1cmlvdXNfc3VwcHJlc3Npb25fbWVzc2FnZXMoCisgICAgICAgICAgICBzZWxmLm1zZ3Nfc3RvcmUKKyAgICAgICAgKQorICAgICAgICBmb3IgbXNnaWQsIGxpbmUsIGFyZ3MgaW4gc3B1cmlvdXNfbWVzc2FnZXM6CisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKG1zZ2lkLCBsaW5lLCBOb25lLCBhcmdzKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZ2V0X2ZpbGVfZGVzY3JfZnJvbV9zdGRpbihmaWxlcGF0aCk6CisgICAgICAgICIiIlJldHVybiBmaWxlIGRlc2NyaXB0aW9uICh0dXBsZSBvZiBtb2R1bGUgbmFtZSwgZmlsZSBwYXRoLCBiYXNlIG5hbWUpIGZyb20gZ2l2ZW4gZmlsZSBwYXRoCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgY3JlYXRpbmcgc3VpdGFibGUgZmlsZSBkZXNjcmlwdGlvbiBmb3IgX2NoZWNrX2ZpbGVzIHdoZW4gdGhlCisgICAgICAgIHNvdXJjZSBpcyBzdGFuZGFyZCBpbnB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVhbGx5IHBlcmZvcm0gYW4KKyAgICAgICAgICAgICMgX19pbXBvcnRfXyBidXQgbWF5IHJhaXNlIGFuIEltcG9ydEVycm9yIGV4Y2VwdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICMgd2Ugd2FudCB0byBjYXRjaCBoZXJlLgorICAgICAgICAgICAgbW9kbmFtZSA9ICIuIi5qb2luKGFzdHJvaWQubW9kdXRpbHMubW9kcGF0aF9mcm9tX2ZpbGUoZmlsZXBhdGgpKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBtb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZpbGVwYXRoKSlbMF0KKworICAgICAgICByZXR1cm4gKG1vZG5hbWUsIGZpbGVwYXRoLCBmaWxlcGF0aCkKKworICAgIGRlZiBfaXRlcmF0ZV9maWxlX2Rlc2NycyhzZWxmLCBmaWxlc19vcl9tb2R1bGVzKToKKyAgICAgICAgIiIiUmV0dXJuIGdlbmVyYXRvciB5aWVsZGluZyBmaWxlIGRlc2NyaXB0aW9ucyAodHVwbGVzIG9mIG1vZHVsZSBuYW1lLCBmaWxlIHBhdGgsIGJhc2UgbmFtZSkKKworICAgICAgICBUaGUgcmV0dXJuZWQgZ2VuZXJhdG9yIHlpZWxkIG9uZSBpdGVtIGZvciBlYWNoIFB5dGhvbiBtb2R1bGUgdGhhdCBzaG91bGQgYmUgbGludGVkLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGRlc2NyIGluIHNlbGYuX2V4cGFuZF9maWxlcyhmaWxlc19vcl9tb2R1bGVzKToKKyAgICAgICAgICAgIG5hbWUsIGZpbGVwYXRoLCBpc19hcmcgPSBkZXNjclsibmFtZSJdLCBkZXNjclsicGF0aCJdLCBkZXNjclsiaXNhcmciXQorICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfYW5hbHl6ZV9maWxlKG5hbWUsIGZpbGVwYXRoLCBpc19hcmd1bWVudD1pc19hcmcpOgorICAgICAgICAgICAgICAgIHlpZWxkIChuYW1lLCBmaWxlcGF0aCwgZGVzY3JbImJhc2VuYW1lIl0pCisKKyAgICBkZWYgX2V4cGFuZF9maWxlcyhzZWxmLCBtb2R1bGVzKToKKyAgICAgICAgIiIiZ2V0IG1vZHVsZXMgYW5kIGVycm9ycyBmcm9tIGEgbGlzdCBvZiBtb2R1bGVzIGFuZCBoYW5kbGUgZXJyb3JzIiIiCisgICAgICAgIHJlc3VsdCwgZXJyb3JzID0gZXhwYW5kX21vZHVsZXMoCisgICAgICAgICAgICBtb2R1bGVzLAorICAgICAgICAgICAgc2VsZi5jb25maWcuYmxhY2tfbGlzdCwKKyAgICAgICAgICAgIHNlbGYuY29uZmlnLmJsYWNrX2xpc3RfcmUsCisgICAgICAgICAgICBzZWxmLmNvbmZpZy5pZ25vcmVfbGlzdF9wYXRoc19yZSwKKyAgICAgICAgKQorICAgICAgICBmb3IgZXJyb3IgaW4gZXJyb3JzOgorICAgICAgICAgICAgbWVzc2FnZSA9IG1vZG5hbWUgPSBlcnJvclsibW9kIl0KKyAgICAgICAgICAgIGtleSA9IGVycm9yWyJrZXkiXQorICAgICAgICAgICAgc2VsZi5zZXRfY3VycmVudF9tb2R1bGUobW9kbmFtZSkKKyAgICAgICAgICAgIGlmIGtleSA9PSAiZmF0YWwiOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzdHIoZXJyb3JbImV4Il0pLnJlcGxhY2Uob3MuZ2V0Y3dkKCkgKyBvcy5zZXAsICIiKQorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZShrZXksIGFyZ3M9bWVzc2FnZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHNldF9jdXJyZW50X21vZHVsZShzZWxmLCBtb2RuYW1lLCBmaWxlcGF0aD1Ob25lKToKKyAgICAgICAgIiIic2V0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYW5hbHl6ZWQgbW9kdWxlIGFuZAorICAgICAgICBpbml0IHN0YXRpc3RpY3MgZm9yIGl0CisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgbW9kbmFtZSBhbmQgZmlsZXBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnJlcG9ydGVyLm9uX3NldF9jdXJyZW50X21vZHVsZShtb2RuYW1lLCBmaWxlcGF0aCkKKyAgICAgICAgc2VsZi5jdXJyZW50X25hbWUgPSBtb2RuYW1lCisgICAgICAgIHNlbGYuY3VycmVudF9maWxlID0gZmlsZXBhdGggb3IgbW9kbmFtZQorICAgICAgICBzZWxmLnN0YXRzWyJieV9tb2R1bGUiXVttb2RuYW1lXSA9IHt9CisgICAgICAgIHNlbGYuc3RhdHNbImJ5X21vZHVsZSJdW21vZG5hbWVdWyJzdGF0ZW1lbnQiXSA9IDAKKyAgICAgICAgZm9yIG1zZ19jYXQgaW4gTVNHX1RZUEVTLnZhbHVlcygpOgorICAgICAgICAgICAgc2VsZi5zdGF0c1siYnlfbW9kdWxlIl1bbW9kbmFtZV1bbXNnX2NhdF0gPSAwCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfYXN0cm9pZF9tb2R1bGVfY2hlY2tlcihzZWxmKToKKyAgICAgICAgIiIiQ29udGV4dCBtYW5hZ2VyIGZvciBjaGVja2luZyBBU1RzCisKKyAgICAgICAgVGhlIHZhbHVlIGluIHRoZSBjb250ZXh0IGlzIGNhbGxhYmxlIGFjY2VwdGluZyBBU1QgYXMgaXRzIG9ubHkgYXJndW1lbnQuCisgICAgICAgICIiIgorICAgICAgICB3YWxrZXIgPSBBU1RXYWxrZXIoc2VsZikKKyAgICAgICAgX2NoZWNrZXJzID0gc2VsZi5wcmVwYXJlX2NoZWNrZXJzKCkKKyAgICAgICAgdG9rZW5jaGVja2VycyA9IFsKKyAgICAgICAgICAgIGMKKyAgICAgICAgICAgIGZvciBjIGluIF9jaGVja2VycworICAgICAgICAgICAgaWYgaW50ZXJmYWNlcy5pbXBsZW1lbnRzKGMsIGludGVyZmFjZXMuSVRva2VuQ2hlY2tlcikgYW5kIGMgaXMgbm90IHNlbGYKKyAgICAgICAgXQorICAgICAgICByYXdjaGVja2VycyA9IFsKKyAgICAgICAgICAgIGMgZm9yIGMgaW4gX2NoZWNrZXJzIGlmIGludGVyZmFjZXMuaW1wbGVtZW50cyhjLCBpbnRlcmZhY2VzLklSYXdDaGVja2VyKQorICAgICAgICBdCisgICAgICAgICMgbm90aWZ5IGdsb2JhbCBiZWdpbgorICAgICAgICBmb3IgY2hlY2tlciBpbiBfY2hlY2tlcnM6CisgICAgICAgICAgICBjaGVja2VyLm9wZW4oKQorICAgICAgICAgICAgaWYgaW50ZXJmYWNlcy5pbXBsZW1lbnRzKGNoZWNrZXIsIGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyKToKKyAgICAgICAgICAgICAgICB3YWxrZXIuYWRkX2NoZWNrZXIoY2hlY2tlcikKKworICAgICAgICB5aWVsZCBmdW5jdG9vbHMucGFydGlhbCgKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfYXN0cm9pZF9tb2R1bGUsCisgICAgICAgICAgICB3YWxrZXI9d2Fsa2VyLAorICAgICAgICAgICAgdG9rZW5jaGVja2Vycz10b2tlbmNoZWNrZXJzLAorICAgICAgICAgICAgcmF3Y2hlY2tlcnM9cmF3Y2hlY2tlcnMsCisgICAgICAgICkKKworICAgICAgICAjIG5vdGlmeSBnbG9iYWwgZW5kCisgICAgICAgIHNlbGYuc3RhdHNbInN0YXRlbWVudCJdID0gd2Fsa2VyLm5ic3RhdGVtZW50cworICAgICAgICBmb3IgY2hlY2tlciBpbiByZXZlcnNlZChfY2hlY2tlcnMpOgorICAgICAgICAgICAgY2hlY2tlci5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X2FzdChzZWxmLCBmaWxlcGF0aCwgbW9kbmFtZSwgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGFzdChyb2lkKSByZXByZXNlbnRhdGlvbiBvZiBhIG1vZHVsZSBvciBhIHN0cmluZy4KKworICAgICAgICA6cGFyYW0gc3RyIGZpbGVwYXRoOiBwYXRoIHRvIGNoZWNrZWQgZmlsZS4KKyAgICAgICAgOnBhcmFtIHN0ciBtb2RuYW1lOiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGJlIGNoZWNrZWQuCisgICAgICAgIDpwYXJhbSBzdHIgZGF0YTogb3B0aW9uYWwgY29udGVudHMgb2YgdGhlIGNoZWNrZWQgZmlsZS4KKyAgICAgICAgOnJldHVybnM6IHRoZSBBU1QKKyAgICAgICAgOnJ0eXBlOiBhc3Ryb2lkLm5vZGVzLk1vZHVsZQorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBNQU5BR0VSLmFzdF9mcm9tX2ZpbGUoZmlsZXBhdGgsIG1vZG5hbWUsIHNvdXJjZT1UcnVlKQorICAgICAgICAgICAgcmV0dXJuIGFzdHJvaWQuYnVpbGRlci5Bc3Ryb2lkQnVpbGRlcihNQU5BR0VSKS5zdHJpbmdfYnVpbGQoCisgICAgICAgICAgICAgICAgZGF0YSwgbW9kbmFtZSwgZmlsZXBhdGgKKyAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuQXN0cm9pZFN5bnRheEVycm9yIGFzIGV4OgorICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCisgICAgICAgICAgICBzZWxmLmFkZF9tZXNzYWdlKAorICAgICAgICAgICAgICAgICJzeW50YXgtZXJyb3IiLAorICAgICAgICAgICAgICAgIGxpbmU9Z2V0YXR0cihleC5lcnJvciwgImxpbmVubyIsIDApLAorICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQ9Z2V0YXR0cihleC5lcnJvciwgIm9mZnNldCIsIE5vbmUpLAorICAgICAgICAgICAgICAgIGFyZ3M9c3RyKGV4LmVycm9yKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuQXN0cm9pZEJ1aWxkaW5nRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgicGFyc2UtZXJyb3IiLCBhcmdzPWV4KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OiAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoImFzdHJvaWQtZXJyb3IiLCBhcmdzPShleC5fX2NsYXNzX18sIGV4KSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBjaGVja19hc3Ryb2lkX21vZHVsZShzZWxmLCBhc3Rfbm9kZSwgd2Fsa2VyLCByYXdjaGVja2VycywgdG9rZW5jaGVja2Vycyk6CisgICAgICAgICIiIkNoZWNrIGEgbW9kdWxlIGZyb20gaXRzIGFzdHJvaWQgcmVwcmVzZW50YXRpb24uCisKKyAgICAgICAgRm9yIHJldHVybiB2YWx1ZSBzZWUgX2NoZWNrX2FzdHJvaWRfbW9kdWxlCisgICAgICAgICIiIgorICAgICAgICBiZWZvcmVfY2hlY2tfc3RhdGVtZW50cyA9IHdhbGtlci5uYnN0YXRlbWVudHMKKworICAgICAgICByZXR2YWwgPSBzZWxmLl9jaGVja19hc3Ryb2lkX21vZHVsZSgKKyAgICAgICAgICAgIGFzdF9ub2RlLCB3YWxrZXIsIHJhd2NoZWNrZXJzLCB0b2tlbmNoZWNrZXJzCisgICAgICAgICkKKworICAgICAgICBzZWxmLnN0YXRzWyJieV9tb2R1bGUiXVtzZWxmLmN1cnJlbnRfbmFtZV1bInN0YXRlbWVudCJdID0gKAorICAgICAgICAgICAgd2Fsa2VyLm5ic3RhdGVtZW50cyAtIGJlZm9yZV9jaGVja19zdGF0ZW1lbnRzCisgICAgICAgICkKKworICAgICAgICByZXR1cm4gcmV0dmFsCisKKyAgICBkZWYgX2NoZWNrX2FzdHJvaWRfbW9kdWxlKHNlbGYsIGFzdF9ub2RlLCB3YWxrZXIsIHJhd2NoZWNrZXJzLCB0b2tlbmNoZWNrZXJzKToKKyAgICAgICAgIiIiQ2hlY2sgZ2l2ZW4gQVNUIG5vZGUgd2l0aCBnaXZlbiB3YWxrZXIgYW5kIGNoZWNrZXJzCisKKyAgICAgICAgOnBhcmFtIGFzdHJvaWQubm9kZXMuTW9kdWxlIGFzdF9ub2RlOiBBU1Qgbm9kZSBvZiB0aGUgbW9kdWxlIHRvIGNoZWNrCisgICAgICAgIDpwYXJhbSBweWxpbnQudXRpbHMuYXN0X3dhbGtlci5BU1RXYWxrZXIgd2Fsa2VyOiBBU1Qgd2Fsa2VyCisgICAgICAgIDpwYXJhbSBsaXN0IHJhd2NoZWNrZXJzOiBMaXN0IG9mIHRva2VuIGNoZWNrZXJzIHRvIHVzZQorICAgICAgICA6cGFyYW0gbGlzdCB0b2tlbmNoZWNrZXJzOiBMaXN0IG9mIHJhdyBjaGVja2VycyB0byB1c2UKKworICAgICAgICA6cmV0dXJuczogVHJ1ZSBpZiB0aGUgbW9kdWxlIHdhcyBjaGVja2VkLCBGYWxzZSBpZiBpZ25vcmVkLAorICAgICAgICAgICAgTm9uZSBpZiB0aGUgbW9kdWxlIGNvbnRlbnRzIGNvdWxkIG5vdCBiZSBwYXJzZWQKKyAgICAgICAgOnJ0eXBlOiBib29sCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2tlbnMgPSB1dGlscy50b2tlbml6ZV9tb2R1bGUoYXN0X25vZGUpCisgICAgICAgIGV4Y2VwdCB0b2tlbml6ZS5Ub2tlbkVycm9yIGFzIGV4OgorICAgICAgICAgICAgc2VsZi5hZGRfbWVzc2FnZSgic3ludGF4LWVycm9yIiwgbGluZT1leC5hcmdzWzFdWzBdLCBhcmdzPWV4LmFyZ3NbMF0pCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGlmIG5vdCBhc3Rfbm9kZS5wdXJlX3B5dGhvbjoKKyAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoInJhdy1jaGVja2VyLWZhaWxlZCIsIGFyZ3M9YXN0X25vZGUubmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYXNzZXJ0IGFzdHJvaWQuZmlsZS5lbmRzd2l0aCgnLnB5JykKKyAgICAgICAgICAgICMgaW52b2tlIElUb2tlbkNoZWNrZXIgaW50ZXJmYWNlIG9uIHNlbGYgdG8gZmV0Y2ggbW9kdWxlL2Jsb2NrCisgICAgICAgICAgICAjIGxldmVsIG9wdGlvbnMKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc190b2tlbnModG9rZW5zKQorICAgICAgICAgICAgaWYgc2VsZi5faWdub3JlX2ZpbGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAjIHdhbGsgYXN0IHRvIGNvbGxlY3QgbGluZSBudW1iZXJzCisgICAgICAgICAgICBzZWxmLmZpbGVfc3RhdGUuY29sbGVjdF9ibG9ja19saW5lcyhzZWxmLm1zZ3Nfc3RvcmUsIGFzdF9ub2RlKQorICAgICAgICAgICAgIyBydW4gcmF3IGFuZCB0b2tlbnMgY2hlY2tlcnMKKyAgICAgICAgICAgIGZvciBjaGVja2VyIGluIHJhd2NoZWNrZXJzOgorICAgICAgICAgICAgICAgIGNoZWNrZXIucHJvY2Vzc19tb2R1bGUoYXN0X25vZGUpCisgICAgICAgICAgICBmb3IgY2hlY2tlciBpbiB0b2tlbmNoZWNrZXJzOgorICAgICAgICAgICAgICAgIGNoZWNrZXIucHJvY2Vzc190b2tlbnModG9rZW5zKQorICAgICAgICAjIGdlbmVyYXRlIGV2ZW50cyB0byBhc3Ryb2lkIGNoZWNrZXJzCisgICAgICAgIHdhbGtlci53YWxrKGFzdF9ub2RlKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBJQXN0cm9pZENoZWNrZXIgaW50ZXJmYWNlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICAiIiJpbml0aWFsaXplIGNvdW50ZXJzIiIiCisgICAgICAgIHNlbGYuc3RhdHMgPSB7ImJ5X21vZHVsZSI6IHt9LCAiYnlfbXNnIjoge319CisgICAgICAgIE1BTkFHRVIuYWx3YXlzX2xvYWRfZXh0ZW5zaW9ucyA9IHNlbGYuY29uZmlnLnVuc2FmZV9sb2FkX2FueV9leHRlbnNpb24KKyAgICAgICAgTUFOQUdFUi5tYXhfaW5mZXJhYmxlX3ZhbHVlcyA9IHNlbGYuY29uZmlnLmxpbWl0X2luZmVyZW5jZV9yZXN1bHRzCisgICAgICAgIE1BTkFHRVIuZXh0ZW5zaW9uX3BhY2thZ2Vfd2hpdGVsaXN0LnVwZGF0ZShzZWxmLmNvbmZpZy5leHRlbnNpb25fcGtnX2FsbG93X2xpc3QpCisgICAgICAgIGlmIHNlbGYuY29uZmlnLmV4dGVuc2lvbl9wa2dfd2hpdGVsaXN0OgorICAgICAgICAgICAgTUFOQUdFUi5leHRlbnNpb25fcGFja2FnZV93aGl0ZWxpc3QudXBkYXRlKAorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLmV4dGVuc2lvbl9wa2dfd2hpdGVsaXN0CisgICAgICAgICAgICApCisgICAgICAgIGZvciBtc2dfY2F0IGluIE1TR19UWVBFUy52YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbbXNnX2NhdF0gPSAwCisKKyAgICBkZWYgZ2VuZXJhdGVfcmVwb3J0cyhzZWxmKToKKyAgICAgICAgIiIiY2xvc2UgdGhlIHdob2xlIHBhY2thZ2UgL21vZHVsZSwgaXQncyB0aW1lIHRvIG1ha2UgcmVwb3J0cyAhCisKKyAgICAgICAgaWYgcGVyc2lzdGVudCBydW4sIHBpY2tsZSByZXN1bHRzIGZvciBsYXRlciBjb21wYXJpc29uCisgICAgICAgICIiIgorICAgICAgICAjIERpc3BsYXkgd2hhdGV2ZXIgbWVzc2FnZXMgYXJlIGxlZnQgb24gdGhlIHJlcG9ydGVyLgorICAgICAgICBzZWxmLnJlcG9ydGVyLmRpc3BsYXlfbWVzc2FnZXMocmVwb3J0X25vZGVzLlNlY3Rpb24oKSkKKworICAgICAgICBpZiBzZWxmLmZpbGVfc3RhdGUuYmFzZV9uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBsb2FkIHByZXZpb3VzIHJlc3VsdHMgaWYgYW55CisgICAgICAgICAgICBwcmV2aW91c19zdGF0cyA9IGNvbmZpZy5sb2FkX3Jlc3VsdHMoc2VsZi5maWxlX3N0YXRlLmJhc2VfbmFtZSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0ZXIub25fY2xvc2Uoc2VsZi5zdGF0cywgcHJldmlvdXNfc3RhdHMpCisgICAgICAgICAgICBpZiBzZWxmLmNvbmZpZy5yZXBvcnRzOgorICAgICAgICAgICAgICAgIHNlY3QgPSBzZWxmLm1ha2VfcmVwb3J0cyhzZWxmLnN0YXRzLCBwcmV2aW91c19zdGF0cykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VjdCA9IHJlcG9ydF9ub2Rlcy5TZWN0aW9uKCkKKworICAgICAgICAgICAgaWYgc2VsZi5jb25maWcucmVwb3J0czoKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGVyLmRpc3BsYXlfcmVwb3J0cyhzZWN0KQorICAgICAgICAgICAgc2NvcmVfdmFsdWUgPSBzZWxmLl9yZXBvcnRfZXZhbHVhdGlvbigpCisgICAgICAgICAgICAjIHNhdmUgcmVzdWx0cyBpZiBwZXJzaXN0ZW50IHJ1bgorICAgICAgICAgICAgaWYgc2VsZi5jb25maWcucGVyc2lzdGVudDoKKyAgICAgICAgICAgICAgICBjb25maWcuc2F2ZV9yZXN1bHRzKHNlbGYuc3RhdHMsIHNlbGYuZmlsZV9zdGF0ZS5iYXNlX25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlcG9ydGVyLm9uX2Nsb3NlKHNlbGYuc3RhdHMsIHt9KQorICAgICAgICAgICAgc2NvcmVfdmFsdWUgPSBOb25lCisgICAgICAgIHJldHVybiBzY29yZV92YWx1ZQorCisgICAgZGVmIF9yZXBvcnRfZXZhbHVhdGlvbihzZWxmKToKKyAgICAgICAgIiIibWFrZSB0aGUgZ2xvYmFsIGV2YWx1YXRpb24gcmVwb3J0IiIiCisgICAgICAgICMgY2hlY2sgd2l0aCBhdCBsZWFzdCBjaGVjayAxIHN0YXRlbWVudHMgKHVzdWFsbHkgMCB3aGVuIHRoZXJlIGlzIGEKKyAgICAgICAgIyBzeW50YXggZXJyb3IgcHJldmVudGluZyBweWxpbnQgZnJvbSBmdXJ0aGVyIHByb2Nlc3NpbmcpCisgICAgICAgIG5vdGUgPSBOb25lCisgICAgICAgIHByZXZpb3VzX3N0YXRzID0gY29uZmlnLmxvYWRfcmVzdWx0cyhzZWxmLmZpbGVfc3RhdGUuYmFzZV9uYW1lKQorICAgICAgICBpZiBzZWxmLnN0YXRzWyJzdGF0ZW1lbnQiXSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIG5vdGUKKworICAgICAgICAjIGdldCBhIGdsb2JhbCBub3RlIGZvciB0aGUgY29kZQorICAgICAgICBldmFsdWF0aW9uID0gc2VsZi5jb25maWcuZXZhbHVhdGlvbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBub3RlID0gZXZhbChldmFsdWF0aW9uLCB7fSwgc2VsZi5zdGF0cykgICMgcHlsaW50OiBkaXNhYmxlPWV2YWwtdXNlZAorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OiAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CisgICAgICAgICAgICBtc2cgPSAiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJhdGluZzogJXMiICUgZXgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbImdsb2JhbF9ub3RlIl0gPSBub3RlCisgICAgICAgICAgICBtc2cgPSAiWW91ciBjb2RlIGhhcyBiZWVuIHJhdGVkIGF0ICUuMmYvMTAiICUgbm90ZQorICAgICAgICAgICAgcG5vdGUgPSBwcmV2aW91c19zdGF0cy5nZXQoImdsb2JhbF9ub3RlIikKKyAgICAgICAgICAgIGlmIHBub3RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG1zZyArPSBmIiAocHJldmlvdXMgcnVuOiB7cG5vdGU6LjJmfS8xMCwge25vdGUgLSBwbm90ZTorLjJmfSkiCisKKyAgICAgICAgaWYgc2VsZi5jb25maWcuc2NvcmU6CisgICAgICAgICAgICBzZWN0ID0gcmVwb3J0X25vZGVzLkV2YWx1YXRpb25TZWN0aW9uKG1zZykKKyAgICAgICAgICAgIHNlbGYucmVwb3J0ZXIuZGlzcGxheV9yZXBvcnRzKHNlY3QpCisgICAgICAgIHJldHVybiBub3RlCmRpZmYgLS1naXQgYS9weWxpbnQvbGludC9yZXBvcnRfZnVuY3Rpb25zLnB5IGIvcHlsaW50L2xpbnQvcmVwb3J0X2Z1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E4OGExCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2xpbnQvcmVwb3J0X2Z1bmN0aW9ucy5weQpAQCAtMCwwICsxLDc0IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBjb2xsZWN0aW9ucworCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGV4Y2VwdGlvbnMKK2Zyb20gcHlsaW50LnJlcG9ydGVycy51cmVwb3J0cyBpbXBvcnQgbm9kZXMgYXMgcmVwb3J0X25vZGVzCisKKworZGVmIHJlcG9ydF90b3RhbF9tZXNzYWdlc19zdGF0cyhzZWN0LCBzdGF0cywgcHJldmlvdXNfc3RhdHMpOgorICAgICIiIm1ha2UgdG90YWwgZXJyb3JzIC8gd2FybmluZ3MgcmVwb3J0IiIiCisgICAgbGluZXMgPSBbInR5cGUiLCAibnVtYmVyIiwgInByZXZpb3VzIiwgImRpZmZlcmVuY2UiXQorICAgIGxpbmVzICs9IGNoZWNrZXJzLnRhYmxlX2xpbmVzX2Zyb21fc3RhdHMoCisgICAgICAgIHN0YXRzLCBwcmV2aW91c19zdGF0cywgKCJjb252ZW50aW9uIiwgInJlZmFjdG9yIiwgIndhcm5pbmciLCAiZXJyb3IiKQorICAgICkKKyAgICBzZWN0LmFwcGVuZChyZXBvcnRfbm9kZXMuVGFibGUoY2hpbGRyZW49bGluZXMsIGNvbHM9NCwgcmhlYWRlcnM9MSkpCisKKworZGVmIHJlcG9ydF9tZXNzYWdlc19zdGF0cyhzZWN0LCBzdGF0cywgXyk6CisgICAgIiIibWFrZSBtZXNzYWdlcyB0eXBlIHJlcG9ydCIiIgorICAgIGlmIG5vdCBzdGF0c1siYnlfbXNnIl06CisgICAgICAgICMgZG9uJ3QgcHJpbnQgdGhpcyByZXBvcnQgd2hlbiB3ZSBkaWRuJ3QgZGV0ZWN0ZWQgYW55IGVycm9ycworICAgICAgICByYWlzZSBleGNlcHRpb25zLkVtcHR5UmVwb3J0RXJyb3IoKQorICAgIGluX29yZGVyID0gc29ydGVkKAorICAgICAgICAodmFsdWUsIG1zZ19pZCkKKyAgICAgICAgZm9yIG1zZ19pZCwgdmFsdWUgaW4gc3RhdHNbImJ5X21zZyJdLml0ZW1zKCkKKyAgICAgICAgaWYgbm90IG1zZ19pZC5zdGFydHN3aXRoKCJJIikKKyAgICApCisgICAgaW5fb3JkZXIucmV2ZXJzZSgpCisgICAgbGluZXMgPSAoIm1lc3NhZ2UgaWQiLCAib2NjdXJyZW5jZXMiKQorICAgIGZvciB2YWx1ZSwgbXNnX2lkIGluIGluX29yZGVyOgorICAgICAgICBsaW5lcyArPSAobXNnX2lkLCBzdHIodmFsdWUpKQorICAgIHNlY3QuYXBwZW5kKHJlcG9ydF9ub2Rlcy5UYWJsZShjaGlsZHJlbj1saW5lcywgY29scz0yLCByaGVhZGVycz0xKSkKKworCitkZWYgcmVwb3J0X21lc3NhZ2VzX2J5X21vZHVsZV9zdGF0cyhzZWN0LCBzdGF0cywgXyk6CisgICAgIiIibWFrZSBlcnJvcnMgLyB3YXJuaW5ncyBieSBtb2R1bGVzIHJlcG9ydCIiIgorICAgIGlmIGxlbihzdGF0c1siYnlfbW9kdWxlIl0pID09IDE6CisgICAgICAgICMgZG9uJ3QgcHJpbnQgdGhpcyByZXBvcnQgd2hlbiB3ZSBhcmUgYW5hbHlzaW5nIGEgc2luZ2xlIG1vZHVsZQorICAgICAgICByYWlzZSBleGNlcHRpb25zLkVtcHR5UmVwb3J0RXJyb3IoKQorICAgIGJ5X21vZCA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KGRpY3QpCisgICAgZm9yIG1fdHlwZSBpbiAoImZhdGFsIiwgImVycm9yIiwgIndhcm5pbmciLCAicmVmYWN0b3IiLCAiY29udmVudGlvbiIpOgorICAgICAgICB0b3RhbCA9IHN0YXRzW21fdHlwZV0KKyAgICAgICAgZm9yIG1vZHVsZSBpbiBzdGF0c1siYnlfbW9kdWxlIl0ua2V5cygpOgorICAgICAgICAgICAgbW9kX3RvdGFsID0gc3RhdHNbImJ5X21vZHVsZSJdW21vZHVsZV1bbV90eXBlXQorICAgICAgICAgICAgaWYgdG90YWwgPT0gMDoKKyAgICAgICAgICAgICAgICBwZXJjZW50ID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwZXJjZW50ID0gZmxvYXQoKG1vZF90b3RhbCkgKiAxMDApIC8gdG90YWwKKyAgICAgICAgICAgIGJ5X21vZFttb2R1bGVdW21fdHlwZV0gPSBwZXJjZW50CisgICAgc29ydGVkX3Jlc3VsdCA9IFtdCisgICAgZm9yIG1vZHVsZSwgbW9kX2luZm8gaW4gYnlfbW9kLml0ZW1zKCk6CisgICAgICAgIHNvcnRlZF9yZXN1bHQuYXBwZW5kKAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIG1vZF9pbmZvWyJlcnJvciJdLAorICAgICAgICAgICAgICAgIG1vZF9pbmZvWyJ3YXJuaW5nIl0sCisgICAgICAgICAgICAgICAgbW9kX2luZm9bInJlZmFjdG9yIl0sCisgICAgICAgICAgICAgICAgbW9kX2luZm9bImNvbnZlbnRpb24iXSwKKyAgICAgICAgICAgICAgICBtb2R1bGUsCisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICBzb3J0ZWRfcmVzdWx0LnNvcnQoKQorICAgIHNvcnRlZF9yZXN1bHQucmV2ZXJzZSgpCisgICAgbGluZXMgPSBbIm1vZHVsZSIsICJlcnJvciIsICJ3YXJuaW5nIiwgInJlZmFjdG9yIiwgImNvbnZlbnRpb24iXQorICAgIGZvciBsaW5lIGluIHNvcnRlZF9yZXN1bHQ6CisgICAgICAgICMgRG9uJ3QgcmVwb3J0IGNsZWFuIG1vZHVsZXMuCisgICAgICAgIGlmIGFsbChlbnRyeSA9PSAwIGZvciBlbnRyeSBpbiBsaW5lWzotMV0pOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbGluZXMuYXBwZW5kKGxpbmVbLTFdKQorICAgICAgICBmb3IgdmFsIGluIGxpbmVbOi0xXToKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiJS4yZiIgJSB2YWwpCisgICAgaWYgbGVuKGxpbmVzKSA9PSA1OgorICAgICAgICByYWlzZSBleGNlcHRpb25zLkVtcHR5UmVwb3J0RXJyb3IoKQorICAgIHNlY3QuYXBwZW5kKHJlcG9ydF9ub2Rlcy5UYWJsZShjaGlsZHJlbj1saW5lcywgY29scz01LCByaGVhZGVycz0xKSkKZGlmZiAtLWdpdCBhL3B5bGludC9saW50L3J1bi5weSBiL3B5bGludC9saW50L3J1bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdjNDBjCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L2xpbnQvcnVuLnB5CkBAIC0wLDAgKzEsNDc4IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gcHlsaW50IGltcG9ydCBfX3BrZ2luZm9fXywgY29uZmlnLCBleHRlbnNpb25zLCBpbnRlcmZhY2VzCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IGZ1bGxfdmVyc2lvbgorZnJvbSBweWxpbnQubGludC5weWxpbnRlciBpbXBvcnQgUHlMaW50ZXIKK2Zyb20gcHlsaW50LmxpbnQudXRpbHMgaW1wb3J0IEFyZ3VtZW50UHJlcHJvY2Vzc2luZ0Vycm9yLCBwcmVwcm9jZXNzX29wdGlvbnMKK2Zyb20gcHlsaW50LnV0aWxzIGltcG9ydCB1dGlscworCit0cnk6CisgICAgaW1wb3J0IG11bHRpcHJvY2Vzc2luZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIG11bHRpcHJvY2Vzc2luZyA9IE5vbmUgICMgdHlwZTogaWdub3JlCisKKworZGVmIF9jcHVfY291bnQoKSAtPiBpbnQ6CisgICAgIiIiVXNlIHNjaGVkX2FmZmluaXR5IGlmIGF2YWlsYWJsZSBmb3IgdmlydHVhbGl6ZWQgb3IgY29udGFpbmVyaXplZCBlbnZpcm9ubWVudHMuIiIiCisgICAgc2NoZWRfZ2V0YWZmaW5pdHkgPSBnZXRhdHRyKG9zLCAic2NoZWRfZ2V0YWZmaW5pdHkiLCBOb25lKQorICAgICMgcHlsaW50OiBkaXNhYmxlPW5vdC1jYWxsYWJsZSx1c2luZy1jb25zdGFudC10ZXN0CisgICAgaWYgc2NoZWRfZ2V0YWZmaW5pdHk6CisgICAgICAgIHJldHVybiBsZW4oc2NoZWRfZ2V0YWZmaW5pdHkoMCkpCisgICAgaWYgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICByZXR1cm4gbXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpCisgICAgcmV0dXJuIDEKKworCitkZWYgY2JfbGlzdF9leHRlbnNpb25zKG9wdGlvbiwgb3B0bmFtZSwgdmFsdWUsIHBhcnNlcik6CisgICAgIiIiTGlzdCBhbGwgdGhlIGV4dGVuc2lvbnMgdW5kZXIgcHlsaW50LmV4dGVuc2lvbnMiIiIKKworICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKG9zLnBhdGguZGlybmFtZShleHRlbnNpb25zLl9fZmlsZV9fKSk6CisgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIucHkiKSBhbmQgbm90IGZpbGVuYW1lLnN0YXJ0c3dpdGgoIl8iKToKKyAgICAgICAgICAgIGV4dGVuc2lvbl9uYW1lLCBfLCBfID0gZmlsZW5hbWUucGFydGl0aW9uKCIuIikKKyAgICAgICAgICAgIHByaW50KGYicHlsaW50LmV4dGVuc2lvbnMue2V4dGVuc2lvbl9uYW1lfSIpCisgICAgc3lzLmV4aXQoMCkKKworCitkZWYgY2JfbGlzdF9jb25maWRlbmNlX2xldmVscyhvcHRpb24sIG9wdG5hbWUsIHZhbHVlLCBwYXJzZXIpOgorICAgIGZvciBsZXZlbCBpbiBpbnRlcmZhY2VzLkNPTkZJREVOQ0VfTEVWRUxTOgorICAgICAgICBwcmludCgiJS0xOHM6ICVzIiAlIGxldmVsKQorICAgIHN5cy5leGl0KDApCisKKworZGVmIGNiX2luaXRfaG9vayhvcHRuYW1lLCB2YWx1ZSk6CisgICAgIiIiZXhlYyBhcmJpdHJhcnkgY29kZSB0byBzZXQgc3lzLnBhdGggZm9yIGluc3RhbmNlIiIiCisgICAgZXhlYyh2YWx1ZSkgICMgcHlsaW50OiBkaXNhYmxlPWV4ZWMtdXNlZAorCisKK1VOVVNFRF9QQVJBTV9TRU5USU5FTCA9IG9iamVjdCgpCisKKworY2xhc3MgUnVuOgorICAgICIiImhlbHBlciBjbGFzcyB0byB1c2UgYXMgbWFpbiBmb3IgcHlsaW50IDoKKworICAgIHJ1bigqc3lzLmFyZ3ZbMTpdKQorICAgICIiIgorCisgICAgTGludGVyQ2xhc3MgPSBQeUxpbnRlcgorICAgIG9wdGlvbl9ncm91cHMgPSAoCisgICAgICAgICgKKyAgICAgICAgICAgICJDb21tYW5kcyIsCisgICAgICAgICAgICAiT3B0aW9ucyB3aGljaCBhcmUgYWN0dWFsbHkgY29tbWFuZHMuIE9wdGlvbnMgaW4gdGhpcyBcCitncm91cCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiIsCisgICAgICAgICksCisgICAgKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfcmV0dXJuX29uZSgqYXJncyk6ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBfX2luaXRfXygKKyAgICAgICAgc2VsZiwKKyAgICAgICAgYXJncywKKyAgICAgICAgcmVwb3J0ZXI9Tm9uZSwKKyAgICAgICAgZXhpdD1UcnVlLAorICAgICAgICBkb19leGl0PVVOVVNFRF9QQVJBTV9TRU5USU5FTCwKKyAgICApOiAgIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLWJ1aWx0aW4KKyAgICAgICAgc2VsZi5fcmNmaWxlID0gTm9uZQorICAgICAgICBzZWxmLl9vdXRwdXQgPSBOb25lCisgICAgICAgIHNlbGYuX3ZlcnNpb25fYXNrZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9wbHVnaW5zID0gW10KKyAgICAgICAgc2VsZi52ZXJib3NlID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmVwcm9jZXNzX29wdGlvbnMoCisgICAgICAgICAgICAgICAgYXJncywKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uOiAoY2FsbGJhY2ssIHRha2VhcmcpCisgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogKHNlbGYudmVyc2lvbl9hc2tlZCwgRmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAiaW5pdC1ob29rIjogKGNiX2luaXRfaG9vaywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICJyY2ZpbGUiOiAoc2VsZi5jYl9zZXRfcmNmaWxlLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgImxvYWQtcGx1Z2lucyI6IChzZWxmLmNiX2FkZF9wbHVnaW5zLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgInZlcmJvc2UiOiAoc2VsZi5jYl92ZXJib3NlX21vZGUsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgIm91dHB1dCI6IChzZWxmLmNiX3NldF9vdXRwdXQsIFRydWUpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBBcmd1bWVudFByZXByb2Nlc3NpbmdFcnJvciBhcyBleDoKKyAgICAgICAgICAgIHByaW50KGV4LCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBzeXMuZXhpdCgzMikKKworICAgICAgICBzZWxmLmxpbnRlciA9IGxpbnRlciA9IHNlbGYuTGludGVyQ2xhc3MoCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAicmNmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBSdW4uX3JldHVybl9vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiOiAiQ29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxmaWxlPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGxvYWQuIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgIm91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIjogUnVuLl9yZXR1cm5fb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIkNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8ZmlsZT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiU3BlY2lmeSBhbiBvdXRwdXQgZmlsZS4iLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAiaW5pdC1ob29rIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBSdW4uX3JldHVybl9vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGNvZGU+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJQeXRob24gY29kZSB0byBleGVjdXRlLCB1c3VhbGx5IGZvciBzeXMucGF0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibWFuaXB1bGF0aW9uIHN1Y2ggYXMgcHlndGsucmVxdWlyZSgpLiIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICJoZWxwLW1zZyIsCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtc2ctaWQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayI6IHNlbGYuY2JfaGVscF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIkNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIkRpc3BsYXkgYSBoZWxwIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBtZXNzYWdlIGlkIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhpdC4gVGhlIHZhbHVlIG1heSBiZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1lc3NhZ2UgaWRzLiIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICJsaXN0LW1zZ3MiLAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxtc2ctaWQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayI6IHNlbGYuY2JfbGlzdF9tZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCI6ICJDb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiR2VuZXJhdGUgcHlsaW50J3MgbWVzc2FnZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgImxpc3QtbXNncy1lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bXNnLWlkPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBzZWxmLmNiX2xpc3RfbWVzc2FnZXNfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCI6ICJDb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiRGlzcGxheSBhIGxpc3Qgb2Ygd2hhdCBtZXNzYWdlcyBhcmUgZW5hYmxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGRpc2FibGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgImxpc3QtZ3JvdXBzIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0YXZhciI6ICI8bXNnLWlkPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBzZWxmLmNiX2xpc3RfZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIkNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJMaXN0IHB5bGludCdzIG1lc3NhZ2UgZ3JvdXBzLiIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICJsaXN0LWNvbmYtbGV2ZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBjYl9saXN0X2NvbmZpZGVuY2VfbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIjogIkNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbCI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJHZW5lcmF0ZSBweWxpbnQncyBjb25maWRlbmNlIGxldmVscy4iLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAibGlzdC1leHRlbnNpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBjYl9saXN0X2V4dGVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiOiAiQ29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIkxpc3QgYXZhaWxhYmxlIGV4dGVuc2lvbnMuIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgImZ1bGwtZG9jdW1lbnRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG1zZy1pZD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIjogc2VsZi5jYl9mdWxsX2RvY3VtZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiOiAiQ29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsIjogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIkdlbmVyYXRlIHB5bGludCdzIGZ1bGwgZG9jdW1lbnRhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGUtcmNmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBzZWxmLmNiX2dlbmVyYXRlX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCI6ICJDb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJHZW5lcmF0ZSBhIHNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgYWNjb3JkaW5nIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBZb3UgY2FuIHB1dCBvdGhlciBvcHRpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmUgdGhpcyBvbmUgdG8gZ2V0IHRoZW0gaW4gdGhlIGdlbmVyYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGUtbWFuIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBzZWxmLmNiX2dlbmVyYXRlX21hbnBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiOiAiQ29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiR2VuZXJhdGUgcHlsaW50J3MgbWFuIHBhZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoaWRlIjogVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgImVycm9ycy1vbmx5IiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBzZWxmLmNiX2Vycm9yX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiOiAiRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJJbiBlcnJvciBtb2RlLCBjaGVja2VycyB3aXRob3V0IGVycm9yIG1lc3NhZ2VzIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQgYW5kIGZvciBvdGhlcnMsIG9ubHkgdGhlIEVSUk9SIG1lc3NhZ2VzIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheWVkLCBhbmQgbm8gcmVwb3J0cyBhcmUgZG9uZSBieSBkZWZhdWx0LiIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICJweTNrIiwKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2siOiBzZWxmLmNiX3B5dGhvbjNfcG9ydGluZ19tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgImhlbHAiOiAiSW4gUHl0aG9uIDMgcG9ydGluZyBtb2RlLCBhbGwgY2hlY2tlcnMgd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQgYW5kIG9ubHkgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgcG9ydGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlciB3aWxsIGJlIGRpc3BsYXllZC4iLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICAidmVyYm9zZSIsCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIjogc2VsZi5jYl92ZXJib3NlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiOiAidiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCI6ICJJbiB2ZXJib3NlIG1vZGUsIGV4dHJhIG5vbi1jaGVja2VyLXJlbGF0ZWQgaW5mbyAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2lsbCBiZSBkaXNwbGF5ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIG9wdGlvbl9ncm91cHM9c2VsZi5vcHRpb25fZ3JvdXBzLAorICAgICAgICAgICAgcHlsaW50cmM9c2VsZi5fcmNmaWxlLAorICAgICAgICApCisgICAgICAgICMgcmVnaXN0ZXIgc3RhbmRhcmQgY2hlY2tlcnMKKyAgICAgICAgaWYgc2VsZi5fdmVyc2lvbl9hc2tlZDoKKyAgICAgICAgICAgIHByaW50KGZ1bGxfdmVyc2lvbikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGxpbnRlci5sb2FkX2RlZmF1bHRfcGx1Z2lucygpCisgICAgICAgICMgbG9hZCBjb21tYW5kIGxpbmUgcGx1Z2lucworICAgICAgICBsaW50ZXIubG9hZF9wbHVnaW5fbW9kdWxlcyhzZWxmLl9wbHVnaW5zKQorICAgICAgICAjIGFkZCBzb21lIGhlbHAgc2VjdGlvbgorICAgICAgICBsaW50ZXIuYWRkX2hlbHBfc2VjdGlvbigiRW52aXJvbm1lbnQgdmFyaWFibGVzIiwgY29uZmlnLkVOVl9IRUxQLCBsZXZlbD0xKQorICAgICAgICBsaW50ZXIuYWRkX2hlbHBfc2VjdGlvbigKKyAgICAgICAgICAgICJPdXRwdXQiLAorICAgICAgICAgICAgIlVzaW5nIHRoZSBkZWZhdWx0IHRleHQgb3V0cHV0LCB0aGUgbWVzc2FnZSBmb3JtYXQgaXMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICIgICAgICAgIE1FU1NBR0VfVFlQRTogTElORV9OVU06W09CSkVDVDpdIE1FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAiVGhlcmUgYXJlIDUga2luZCBvZiBtZXNzYWdlIHR5cGVzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICIgICAgKiAoQykgY29udmVudGlvbiwgZm9yIHByb2dyYW1taW5nIHN0YW5kYXJkIHZpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiAgICAqIChSKSByZWZhY3RvciwgZm9yIGJhZCBjb2RlIHNtZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAiICAgICogKFcpIHdhcm5pbmcsIGZvciBweXRob24gc3BlY2lmaWMgcHJvYmxlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICIgICAgKiAoRSkgZXJyb3IsIGZvciBwcm9iYWJsZSBidWdzIGluIHRoZSBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiAgICAqIChGKSBmYXRhbCwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpY2ggcHJldmVudGVkIHB5bGludCBmcm9tIGRvaW5nIGZ1cnRoZXJcbiIKKyAgICAgICAgICAgICJwcm9jZXNzaW5nLlxuIiwKKyAgICAgICAgICAgIGxldmVsPTEsCisgICAgICAgICkKKyAgICAgICAgbGludGVyLmFkZF9oZWxwX3NlY3Rpb24oCisgICAgICAgICAgICAiT3V0cHV0IHN0YXR1cyBjb2RlIiwKKyAgICAgICAgICAgICJQeWxpbnQgc2hvdWxkIGxlYXZlIHdpdGggZm9sbG93aW5nIHN0YXR1cyBjb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiAgICAqIDAgaWYgZXZlcnl0aGluZyB3ZW50IGZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAiICAgICogMSBpZiBhIGZhdGFsIG1lc3NhZ2Ugd2FzIGlzc3VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICIgICAgKiAyIGlmIGFuIGVycm9yIG1lc3NhZ2Ugd2FzIGlzc3VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiAgICAqIDQgaWYgYSB3YXJuaW5nIG1lc3NhZ2Ugd2FzIGlzc3VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAiICAgICogOCBpZiBhIHJlZmFjdG9yIG1lc3NhZ2Ugd2FzIGlzc3VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICIgICAgKiAxNiBpZiBhIGNvbnZlbnRpb24gbWVzc2FnZSB3YXMgaXNzdWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgIiAgICAqIDMyIG9uIHVzYWdlIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgICAgICJzdGF0dXMgMSB0byAxNiB3aWxsIGJlIGJpdC1PUmVkIHNvIHlvdSBjYW4ga25vdyB3aGljaCBkaWZmZXJlbnQgY2F0ZWdvcmllcyBoYXNcbiIKKyAgICAgICAgICAgICJiZWVuIGlzc3VlZCBieSBhbmFseXNpbmcgcHlsaW50IG91dHB1dCBzdGF0dXMgY29kZVxuIiwKKyAgICAgICAgICAgIGxldmVsPTEsCisgICAgICAgICkKKyAgICAgICAgIyByZWFkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgbGludGVyLmRpc2FibGUoIkkiKQorICAgICAgICBsaW50ZXIuZW5hYmxlKCJjLWV4dGVuc2lvbi1uby1tZW1iZXIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW50ZXIucmVhZF9jb25maWdfZmlsZSh2ZXJib3NlPXNlbGYudmVyYm9zZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXg6CisgICAgICAgICAgICBwcmludChleCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgc3lzLmV4aXQoMzIpCisKKyAgICAgICAgY29uZmlnX3BhcnNlciA9IGxpbnRlci5jZmdmaWxlX3BhcnNlcgorICAgICAgICAjIHJ1biBpbml0IGhvb2ssIGlmIHByZXNlbnQsIGJlZm9yZSBsb2FkaW5nIHBsdWdpbnMKKyAgICAgICAgaWYgY29uZmlnX3BhcnNlci5oYXNfb3B0aW9uKCJNQVNURVIiLCAiaW5pdC1ob29rIik6CisgICAgICAgICAgICBjYl9pbml0X2hvb2soCisgICAgICAgICAgICAgICAgImluaXQtaG9vayIsIHV0aWxzLl91bnF1b3RlKGNvbmZpZ19wYXJzZXIuZ2V0KCJNQVNURVIiLCAiaW5pdC1ob29rIikpCisgICAgICAgICAgICApCisgICAgICAgICMgaXMgdGhlcmUgc29tZSBhZGRpdGlvbmFsIHBsdWdpbnMgaW4gdGhlIGZpbGUgY29uZmlndXJhdGlvbiwgaW4KKyAgICAgICAgaWYgY29uZmlnX3BhcnNlci5oYXNfb3B0aW9uKCJNQVNURVIiLCAibG9hZC1wbHVnaW5zIik6CisgICAgICAgICAgICBwbHVnaW5zID0gdXRpbHMuX3NwbGl0c3RyaXAoY29uZmlnX3BhcnNlci5nZXQoIk1BU1RFUiIsICJsb2FkLXBsdWdpbnMiKSkKKyAgICAgICAgICAgIGxpbnRlci5sb2FkX3BsdWdpbl9tb2R1bGVzKHBsdWdpbnMpCisgICAgICAgICMgbm93IHdlIGNhbiBsb2FkIGZpbGUgY29uZmlnIGFuZCBjb21tYW5kIGxpbmUsIHBsdWdpbnMgKHdoaWNoIGNhbgorICAgICAgICAjIHByb3ZpZGUgb3B0aW9ucykgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQKKyAgICAgICAgbGludGVyLmxvYWRfY29uZmlnX2ZpbGUoKQorCisgICAgICAgIGlmIHJlcG9ydGVyOgorICAgICAgICAgICAgIyBpZiBhIGN1c3RvbSByZXBvcnRlciBpcyBwcm92aWRlZCBhcyBhcmd1bWVudCwgaXQgbWF5IGJlIG92ZXJyaWRkZW4KKyAgICAgICAgICAgICMgYnkgZmlsZSBwYXJhbWV0ZXJzLCBzbyByZS1zZXQgaXQgaGVyZSwgYnV0IGJlZm9yZSBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgICMgcGFyc2luZyBzbyBpdCdzIHN0aWxsIG92ZXJyaWRlYWJsZSBieSBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgICAgICAgICBsaW50ZXIuc2V0X3JlcG9ydGVyKHJlcG9ydGVyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhcmdzID0gbGludGVyLmxvYWRfY29tbWFuZF9saW5lX2NvbmZpZ3VyYXRpb24oYXJncykKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjLmNvZGUgPT0gMjogICMgYmFkIG9wdGlvbnMKKyAgICAgICAgICAgICAgICBleGMuY29kZSA9IDMyCisgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIHByaW50KGxpbnRlci5oZWxwKCkpCisgICAgICAgICAgICBzeXMuZXhpdCgzMikKKworICAgICAgICBpZiBsaW50ZXIuY29uZmlnLmpvYnMgPCAwOgorICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgIkpvYnMgbnVtYmVyICglZCkgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIgorICAgICAgICAgICAgICAgICUgbGludGVyLmNvbmZpZy5qb2JzLAorICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHN5cy5leGl0KDMyKQorICAgICAgICBpZiBsaW50ZXIuY29uZmlnLmpvYnMgPiAxIG9yIGxpbnRlci5jb25maWcuam9icyA9PSAwOgorICAgICAgICAgICAgaWYgbXVsdGlwcm9jZXNzaW5nIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICJNdWx0aXByb2Nlc3NpbmcgbGlicmFyeSBpcyBtaXNzaW5nLCBmYWxsYmFjayB0byBzaW5nbGUgcHJvY2VzcyIsCisgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgbGludGVyLnNldF9vcHRpb24oImpvYnMiLCAxKQorICAgICAgICAgICAgZWxpZiBsaW50ZXIuY29uZmlnLmpvYnMgPT0gMDoKKyAgICAgICAgICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSBfY3B1X2NvdW50KCkKKworICAgICAgICAjIFdlIGhhdmUgbG9hZGVkIGNvbmZpZ3VyYXRpb24gZnJvbSBjb25maWcgZmlsZSBhbmQgY29tbWFuZCBsaW5lLiBOb3csIHdlIGNhbgorICAgICAgICAjIGxvYWQgcGx1Z2luIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgICAgIGxpbnRlci5sb2FkX3BsdWdpbl9jb25maWd1cmF0aW9uKCkKKworICAgICAgICAjIE5vdyB0aGF0IHBsdWdpbnMgYXJlIGxvYWRlZCwgZ2V0IGxpc3Qgb2YgYWxsIGZhaWxfb24gbWVzc2FnZXMsIGFuZCBlbmFibGUgdGhlbQorICAgICAgICBsaW50ZXIuZW5hYmxlX2ZhaWxfb25fbWVzc2FnZXMoKQorCisgICAgICAgIGlmIHNlbGYuX291dHB1dDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5fb3V0cHV0LCAidyIpIGFzIG91dHB1dDoKKyAgICAgICAgICAgICAgICAgICAgbGludGVyLnJlcG9ydGVyLnNldF9vdXRwdXQob3V0cHV0KQorICAgICAgICAgICAgICAgICAgICBsaW50ZXIuY2hlY2soYXJncykKKyAgICAgICAgICAgICAgICAgICAgc2NvcmVfdmFsdWUgPSBsaW50ZXIuZ2VuZXJhdGVfcmVwb3J0cygpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleDoKKyAgICAgICAgICAgICAgICBwcmludChleCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIHN5cy5leGl0KDMyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGludGVyLmNoZWNrKGFyZ3MpCisgICAgICAgICAgICBzY29yZV92YWx1ZSA9IGxpbnRlci5nZW5lcmF0ZV9yZXBvcnRzKCkKKworICAgICAgICBpZiBkb19leGl0IGlzIG5vdCBVTlVTRURfUEFSQU1fU0VOVElORUw6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJkb19leGl0IGlzIGRlcHJlY2F0ZWQgYW5kIGl0IGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4iLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4aXQgPSBkb19leGl0CisKKyAgICAgICAgaWYgZXhpdDoKKyAgICAgICAgICAgIGlmIGxpbnRlci5jb25maWcuZXhpdF96ZXJvOgorICAgICAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgc2NvcmVfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNjb3JlX3ZhbHVlID49IGxpbnRlci5jb25maWcuZmFpbF91bmRlcgorICAgICAgICAgICAgICAgICAgICAjIGRldGVjdGVkIG1lc3NhZ2VzIGZsYWdnZWQgYnkgLS1mYWlsLW9uIHByZXZlbnQgbm9uLXplcm8gZXhpdCBjb2RlCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgbGludGVyLmFueV9mYWlsX29uX2lzc3VlcygpCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgICAgICAgICBzeXMuZXhpdChzZWxmLmxpbnRlci5tc2dfc3RhdHVzKQorCisgICAgZGVmIHZlcnNpb25fYXNrZWQoc2VsZiwgXywgX18pOgorICAgICAgICAiIiJjYWxsYmFjayBmb3IgdmVyc2lvbiAoaS5lLiBiZWZvcmUgb3B0aW9uIHBhcnNpbmcpIiIiCisgICAgICAgIHNlbGYuX3ZlcnNpb25fYXNrZWQgPSBUcnVlCisKKyAgICBkZWYgY2Jfc2V0X3JjZmlsZShzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICIiImNhbGxiYWNrIGZvciBvcHRpb24gcHJlcHJvY2Vzc2luZyAoaS5lLiBiZWZvcmUgb3B0aW9uIHBhcnNpbmcpIiIiCisgICAgICAgIHNlbGYuX3JjZmlsZSA9IHZhbHVlCisKKyAgICBkZWYgY2Jfc2V0X291dHB1dChzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICIiImNhbGxiYWNrIGZvciBvcHRpb24gcHJlcHJvY2Vzc2luZyAoaS5lLiBiZWZvcmUgb3B0aW9uIHBhcnNpbmcpIiIiCisgICAgICAgIHNlbGYuX291dHB1dCA9IHZhbHVlCisKKyAgICBkZWYgY2JfYWRkX3BsdWdpbnMoc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICAiIiJjYWxsYmFjayBmb3Igb3B0aW9uIHByZXByb2Nlc3NpbmcgKGkuZS4gYmVmb3JlIG9wdGlvbiBwYXJzaW5nKSIiIgorICAgICAgICBzZWxmLl9wbHVnaW5zLmV4dGVuZCh1dGlscy5fc3BsaXRzdHJpcCh2YWx1ZSkpCisKKyAgICBkZWYgY2JfZXJyb3JfbW9kZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJlcnJvciBtb2RlOgorICAgICAgICAqIGRpc2FibGUgYWxsIGJ1dCBlcnJvciBtZXNzYWdlcworICAgICAgICAqIGRpc2FibGUgdGhlICdtaXNjZWxsYW5lb3VzJyBjaGVja2VyIHdoaWNoIGNhbiBiZSBzYWZlbHkgZGVhY3RpdmF0ZWQgaW4KKyAgICAgICAgICBkZWJ1ZworICAgICAgICAqIGRpc2FibGUgcmVwb3J0cworICAgICAgICAqIGRvIG5vdCBzYXZlIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5saW50ZXIuZXJyb3JfbW9kZSgpCisKKyAgICBkZWYgY2JfZ2VuZXJhdGVfY29uZmlnKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIm9wdGlrIGNhbGxiYWNrIGZvciBzYW1wbGUgY29uZmlnIGZpbGUgZ2VuZXJhdGlvbiIiIgorICAgICAgICBzZWxmLmxpbnRlci5nZW5lcmF0ZV9jb25maWcoc2tpcHNlY3Rpb25zPSgiQ09NTUFORFMiLCkpCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICBkZWYgY2JfZ2VuZXJhdGVfbWFucGFnZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJvcHRpayBjYWxsYmFjayBmb3Igc2FtcGxlIGNvbmZpZyBmaWxlIGdlbmVyYXRpb24iIiIKKyAgICAgICAgc2VsZi5saW50ZXIuZ2VuZXJhdGVfbWFucGFnZShfX3BrZ2luZm9fXykKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIGRlZiBjYl9oZWxwX21lc3NhZ2Uoc2VsZiwgb3B0aW9uLCBvcHRuYW1lLCB2YWx1ZSwgcGFyc2VyKToKKyAgICAgICAgIiIib3B0aWsgY2FsbGJhY2sgZm9yIHByaW50aW5nIHNvbWUgaGVscCBhYm91dCBhIHBhcnRpY3VsYXIgbWVzc2FnZSIiIgorICAgICAgICBzZWxmLmxpbnRlci5tc2dzX3N0b3JlLmhlbHBfbWVzc2FnZSh1dGlscy5fc3BsaXRzdHJpcCh2YWx1ZSkpCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICBkZWYgY2JfZnVsbF9kb2N1bWVudGF0aW9uKHNlbGYsIG9wdGlvbiwgb3B0bmFtZSwgdmFsdWUsIHBhcnNlcik6CisgICAgICAgICIiIm9wdGlrIGNhbGxiYWNrIGZvciBwcmludGluZyBmdWxsIGRvY3VtZW50YXRpb24iIiIKKyAgICAgICAgc2VsZi5saW50ZXIucHJpbnRfZnVsbF9kb2N1bWVudGF0aW9uKCkKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIGRlZiBjYl9saXN0X21lc3NhZ2VzKHNlbGYsIG9wdGlvbiwgb3B0bmFtZSwgdmFsdWUsIHBhcnNlcik6CisgICAgICAgICIiIm9wdGlrIGNhbGxiYWNrIGZvciBwcmludGluZyBhdmFpbGFibGUgbWVzc2FnZXMiIiIKKyAgICAgICAgc2VsZi5saW50ZXIubXNnc19zdG9yZS5saXN0X21lc3NhZ2VzKCkKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIGRlZiBjYl9saXN0X21lc3NhZ2VzX2VuYWJsZWQoc2VsZiwgb3B0aW9uLCBvcHRuYW1lLCB2YWx1ZSwgcGFyc2VyKToKKyAgICAgICAgIiIib3B0aWsgY2FsbGJhY2sgZm9yIHByaW50aW5nIGF2YWlsYWJsZSBtZXNzYWdlcyIiIgorICAgICAgICBzZWxmLmxpbnRlci5saXN0X21lc3NhZ2VzX2VuYWJsZWQoKQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgZGVmIGNiX2xpc3RfZ3JvdXBzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkxpc3QgYWxsIHRoZSBjaGVjayBncm91cHMgdGhhdCBweWxpbnQga25vd3MgYWJvdXQKKworICAgICAgICBUaGVzZSBzaG91bGQgYmUgdXNlZnVsIHRvIGtub3cgd2hhdCBjaGVjayBncm91cHMgc29tZW9uZSBjYW4gZGlzYWJsZQorICAgICAgICBvciBlbmFibGUuCisgICAgICAgICIiIgorICAgICAgICBmb3IgY2hlY2sgaW4gc2VsZi5saW50ZXIuZ2V0X2NoZWNrZXJfbmFtZXMoKToKKyAgICAgICAgICAgIHByaW50KGNoZWNrKQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgZGVmIGNiX3B5dGhvbjNfcG9ydGluZ19tb2RlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkFjdGl2YXRlIG9ubHkgdGhlIHB5dGhvbjMgcG9ydGluZyBjaGVja2VyLiIiIgorICAgICAgICBzZWxmLmxpbnRlci5weXRob24zX3BvcnRpbmdfbW9kZSgpCisKKyAgICBkZWYgY2JfdmVyYm9zZV9tb2RlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYudmVyYm9zZSA9IFRydWUKZGlmZiAtLWdpdCBhL3B5bGludC9saW50L3V0aWxzLnB5IGIvcHlsaW50L2xpbnQvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkwYWJmYgotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9saW50L3V0aWxzLnB5CkBAIC0wLDAgKzEsNzYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBzeXMKKworZnJvbSBweWxpbnQubGludC5leHBhbmRfbW9kdWxlcyBpbXBvcnQgZ2V0X3B5dGhvbl9wYXRoCisKKworY2xhc3MgQXJndW1lbnRQcmVwcm9jZXNzaW5nRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJSYWlzZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBhcmd1bWVudCBwcmVwcm9jZXNzaW5nLiIiIgorCisKK2RlZiBwcmVwcm9jZXNzX29wdGlvbnMoYXJncywgc2VhcmNoX2Zvcik6CisgICAgIiIibG9vayBmb3Igc29tZSBvcHRpb25zIChrZXlzIG9mIDxzZWFyY2hfZm9yPikgd2hpY2ggaGF2ZSB0byBiZSBwcm9jZXNzZWQKKyAgICBiZWZvcmUgb3RoZXJzCisKKyAgICB2YWx1ZXMgb2YgPHNlYXJjaF9mb3I+IGFyZSBjYWxsYmFjayBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIHRoZSBvcHRpb24gaXMKKyAgICBmb3VuZAorICAgICIiIgorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IGxlbihhcmdzKToKKyAgICAgICAgYXJnID0gYXJnc1tpXQorICAgICAgICBpZiBhcmcuc3RhcnRzd2l0aCgiLS0iKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcHRpb24sIHZhbCA9IGFyZ1syOl0uc3BsaXQoIj0iLCAxKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgb3B0aW9uLCB2YWwgPSBhcmdbMjpdLCBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2IsIHRha2VhcmcgPSBzZWFyY2hfZm9yW29wdGlvbl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsIGFyZ3NbaV0KKyAgICAgICAgICAgICAgICBpZiB0YWtlYXJnIGFuZCB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgaSA+PSBsZW4oYXJncykgb3IgYXJnc1tpXS5zdGFydHN3aXRoKCItIik6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiT3B0aW9uICVzIGV4cGVjdHMgYSB2YWx1ZSIgJSBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50UHJlcHJvY2Vzc2luZ0Vycm9yKG1zZykKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gYXJnc1tpXQorICAgICAgICAgICAgICAgICAgICBkZWwgYXJnc1tpXQorICAgICAgICAgICAgICAgIGVsaWYgbm90IHRha2VhcmcgYW5kIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIk9wdGlvbiAlcyBkb2Vzbid0IGV4cGVjdHMgYSB2YWx1ZSIgJSBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRQcmVwcm9jZXNzaW5nRXJyb3IobXNnKQorICAgICAgICAgICAgICAgIGNiKG9wdGlvbiwgdmFsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSArPSAxCisKKworZGVmIF9wYXRjaF9zeXNfcGF0aChhcmdzKToKKyAgICBvcmlnaW5hbCA9IGxpc3Qoc3lzLnBhdGgpCisgICAgY2hhbmdlcyA9IFtdCisgICAgc2VlbiA9IHNldCgpCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICBwYXRoID0gZ2V0X3B5dGhvbl9wYXRoKGFyZykKKyAgICAgICAgaWYgcGF0aCBub3QgaW4gc2VlbjoKKyAgICAgICAgICAgIGNoYW5nZXMuYXBwZW5kKHBhdGgpCisgICAgICAgICAgICBzZWVuLmFkZChwYXRoKQorCisgICAgc3lzLnBhdGhbOl0gPSBjaGFuZ2VzICsgc3lzLnBhdGgKKyAgICByZXR1cm4gb3JpZ2luYWwKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGZpeF9pbXBvcnRfcGF0aChhcmdzKToKKyAgICAiIiJQcmVwYXJlIHN5cy5wYXRoIGZvciBydW5uaW5nIHRoZSBsaW50ZXIgY2hlY2tzLgorCisgICAgV2l0aGluIHRoaXMgY29udGV4dCwgZWFjaCBvZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGlzIGltcG9ydGFibGUuCisgICAgUGF0aHMgYXJlIGFkZGVkIHRvIHN5cy5wYXRoIGluIGNvcnJlc3BvbmRpbmcgb3JkZXIgdG8gdGhlIGFyZ3VtZW50cy4KKyAgICBXZSBhdm9pZCBhZGRpbmcgZHVwbGljYXRlIGRpcmVjdG9yaWVzIHRvIHN5cy5wYXRoLgorICAgIGBzeXMucGF0aGAgaXMgcmVzZXQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIHVwb24gZXhpdGluZyB0aGlzIGNvbnRleHQuCisgICAgIiIiCisgICAgb3JpZ2luYWwgPSBfcGF0Y2hfc3lzX3BhdGgoYXJncykKKyAgICB0cnk6CisgICAgICAgIHlpZWxkCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBvcmlnaW5hbApkaWZmIC0tZ2l0IGEvcHlsaW50L21lc3NhZ2UvX19pbml0X18ucHkgYi9weWxpbnQvbWVzc2FnZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQwM2JjCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L21lc3NhZ2UvX19pbml0X18ucHkKQEAgLTAsMCArMSw1MyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAwOSBWaW5jZW50CisjIENvcHlyaWdodCAoYykgMjAwOSBNYWRzIEtpaWxlcmljaCA8bWFkc0BraWlsZXJpY2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IE1pY2hhbCBOb3dpa293c2tpIDxnb2RmcnlkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IExDRCA0NyA8bGNkMDQ3QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgRGFtaWVuIE5vemF5IDxkYW1pZW4ubm96YXlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgQXJ1IFNhaG5pIDxhcnVzYWhuaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBGbG9yaWFuIEJydWhpbiA8bWVAdGhlLWNvbXBpbGVyLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFNpbXUgVG9uaSA8c2ltdXRvbmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBNb2lzZXMgTG9wZXogPG1veWxvcDI2MEB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbG1hdHRoZUBjaXNjby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgeG1vLW9kb28gPHhtby1vZG9vQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE4LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBCcnljZSBHdWludGEgPGJyeWNlLnBhdWwuZ3VpbnRhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IENocmlzIExhbWIgPGNocmlzQGNocmlzLWxhbWIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNyBUaG9tYXMgSGlzY2ggPHQuaGlzY2hAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgTWlraGFpbCBGZXNlbmtvIDxwcm9nZ2dhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IENyYWlnIENpdHJvIDxjcmFpZ2NpdHJvQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBCcnljZSBHdWludGEgPGJyeWNlLmd1aW50YUBwcm90b25tYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUmV2ZXJiIEMgPHJldmVyYmNAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTmljayBEcm96ZCA8bmljaG9sYXNkcm96ZEBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiQWxsIHRoZSBjbGFzc2VzIHJlbGF0ZWQgdG8gTWVzc2FnZSBoYW5kbGluZy4iIiIKKworZnJvbSBweWxpbnQubWVzc2FnZS5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIHB5bGludC5tZXNzYWdlLm1lc3NhZ2VfZGVmaW5pdGlvbiBpbXBvcnQgTWVzc2FnZURlZmluaXRpb24KK2Zyb20gcHlsaW50Lm1lc3NhZ2UubWVzc2FnZV9kZWZpbml0aW9uX3N0b3JlIGltcG9ydCBNZXNzYWdlRGVmaW5pdGlvblN0b3JlCitmcm9tIHB5bGludC5tZXNzYWdlLm1lc3NhZ2VfaGFuZGxlcl9taXhfaW4gaW1wb3J0IE1lc3NhZ2VzSGFuZGxlck1peEluCitmcm9tIHB5bGludC5tZXNzYWdlLm1lc3NhZ2VfaWRfc3RvcmUgaW1wb3J0IE1lc3NhZ2VJZFN0b3JlCisKK19fYWxsX18gPSBbCisgICAgIk1lc3NhZ2UiLAorICAgICJNZXNzYWdlRGVmaW5pdGlvbiIsCisgICAgIk1lc3NhZ2VEZWZpbml0aW9uU3RvcmUiLAorICAgICJNZXNzYWdlc0hhbmRsZXJNaXhJbiIsCisgICAgIk1lc3NhZ2VJZFN0b3JlIiwKK10KZGlmZiAtLWdpdCBhL3B5bGludC9tZXNzYWdlL21lc3NhZ2UucHkgYi9weWxpbnQvbWVzc2FnZS9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTY3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvbWVzc2FnZS9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsNDkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworCitpbXBvcnQgY29sbGVjdGlvbnMKKworZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCBNU0dfVFlQRVMKKworX01zZ0Jhc2UgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAorICAgICJfTXNnQmFzZSIsCisgICAgWworICAgICAgICAibXNnX2lkIiwKKyAgICAgICAgInN5bWJvbCIsCisgICAgICAgICJtc2ciLAorICAgICAgICAiQyIsCisgICAgICAgICJjYXRlZ29yeSIsCisgICAgICAgICJjb25maWRlbmNlIiwKKyAgICAgICAgImFic3BhdGgiLAorICAgICAgICAicGF0aCIsCisgICAgICAgICJtb2R1bGUiLAorICAgICAgICAib2JqIiwKKyAgICAgICAgImxpbmUiLAorICAgICAgICAiY29sdW1uIiwKKyAgICBdLAorKQorCisKK2NsYXNzIE1lc3NhZ2UoX01zZ0Jhc2UpOgorICAgICIiIlRoaXMgY2xhc3MgcmVwcmVzZW50IGEgbWVzc2FnZSB0byBiZSBpc3N1ZWQgYnkgdGhlIHJlcG9ydGVycyIiIgorCisgICAgZGVmIF9fbmV3X18oY2xzLCBtc2dfaWQsIHN5bWJvbCwgbG9jYXRpb24sIG1zZywgY29uZmlkZW5jZSk6CisgICAgICAgIHJldHVybiBfTXNnQmFzZS5fX25ld19fKAorICAgICAgICAgICAgY2xzLAorICAgICAgICAgICAgbXNnX2lkLAorICAgICAgICAgICAgc3ltYm9sLAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgbXNnX2lkWzBdLAorICAgICAgICAgICAgTVNHX1RZUEVTW21zZ19pZFswXV0sCisgICAgICAgICAgICBjb25maWRlbmNlLAorICAgICAgICAgICAgKmxvY2F0aW9uCisgICAgICAgICkKKworICAgIGRlZiBmb3JtYXQoc2VsZiwgdGVtcGxhdGU6IHN0cikgLT4gc3RyOgorICAgICAgICAiIiJGb3JtYXQgdGhlIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB0ZW1wbGF0ZS4KKworICAgICAgICBUaGUgdGVtcGxhdGUgZm9ybWF0IGlzIHRoZSBvbmUgb2YgdGhlIGZvcm1hdCBtZXRob2QgOgorICAgICAgICBjZi4gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3N0cmluZy5odG1sI2Zvcm1hdHN0cmluZ3MKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5mb3JtYXQoKipzZWxmLl9hc2RpY3QoKSkKZGlmZiAtLWdpdCBhL3B5bGludC9tZXNzYWdlL21lc3NhZ2VfZGVmaW5pdGlvbi5weSBiL3B5bGludC9tZXNzYWdlL21lc3NhZ2VfZGVmaW5pdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThjNTNlCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L21lc3NhZ2UvbWVzc2FnZV9kZWZpbml0aW9uLnB5CkBAIC0wLDAgKzEsODcgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IHN5cworZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIE9wdGlvbmFsLCBUdXBsZQorCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IE1TR19UWVBFUworZnJvbSBweWxpbnQuZXhjZXB0aW9ucyBpbXBvcnQgSW52YWxpZE1lc3NhZ2VFcnJvcgorZnJvbSBweWxpbnQudXRpbHMgaW1wb3J0IG5vcm1hbGl6ZV90ZXh0CisKKworY2xhc3MgTWVzc2FnZURlZmluaXRpb246CisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLAorICAgICAgICBjaGVja2VyLCAgIyBCYXNlQ2hlY2tlcgorICAgICAgICBtc2dpZDogc3RyLAorICAgICAgICBtc2c6IHN0ciwKKyAgICAgICAgZGVzY3JpcHRpb246IHN0ciwKKyAgICAgICAgc3ltYm9sOiBzdHIsCisgICAgICAgIHNjb3BlOiBzdHIsCisgICAgICAgIG1pbnZlcnNpb246IE9wdGlvbmFsW1R1cGxlW2ludCwgaW50LCBpbnQsIHN0ciwgaW50XV0gPSBOb25lLAorICAgICAgICBtYXh2ZXJzaW9uOiBPcHRpb25hbFtUdXBsZVtpbnQsIGludCwgaW50LCBzdHIsIGludF1dID0gTm9uZSwKKyAgICAgICAgb2xkX25hbWVzOiBMaXN0W1R1cGxlW3N0ciwgc3RyXV0gPSBOb25lLAorICAgICk6CisgICAgICAgIHNlbGYuY2hlY2tlcl9uYW1lID0gY2hlY2tlci5uYW1lCisgICAgICAgIHNlbGYuY2hlY2tfbXNnaWQobXNnaWQpCisgICAgICAgIHNlbGYubXNnaWQgPSBtc2dpZAorICAgICAgICBzZWxmLnN5bWJvbCA9IHN5bWJvbAorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5zY29wZSA9IHNjb3BlCisgICAgICAgIHNlbGYubWludmVyc2lvbiA9IG1pbnZlcnNpb24KKyAgICAgICAgc2VsZi5tYXh2ZXJzaW9uID0gbWF4dmVyc2lvbgorICAgICAgICBzZWxmLm9sZF9uYW1lczogTGlzdFtUdXBsZVtzdHIsIHN0cl1dID0gW10KKyAgICAgICAgaWYgb2xkX25hbWVzOgorICAgICAgICAgICAgZm9yIG9sZF9tc2dpZCwgb2xkX3N5bWJvbCBpbiBvbGRfbmFtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19tc2dpZChvbGRfbXNnaWQpCisgICAgICAgICAgICAgICAgc2VsZi5vbGRfbmFtZXMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAob2xkX21zZ2lkLCBvbGRfc3ltYm9sKSwKKyAgICAgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGNoZWNrX21zZ2lkKG1zZ2lkOiBzdHIpIC0+IE5vbmU6CisgICAgICAgIGlmIGxlbihtc2dpZCkgIT0gNToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRNZXNzYWdlRXJyb3IoZiJJbnZhbGlkIG1lc3NhZ2UgaWQge21zZ2lkIXJ9IikKKyAgICAgICAgaWYgbXNnaWRbMF0gbm90IGluIE1TR19UWVBFUzoKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRNZXNzYWdlRXJyb3IoZiJCYWQgbWVzc2FnZSB0eXBlIHttc2dpZFswXX0gaW4ge21zZ2lkIXJ9IikKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGYiTWVzc2FnZURlZmluaXRpb246e3NlbGYuc3ltYm9sfSAoe3NlbGYubXNnaWR9KSIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gZiJ7cmVwcihzZWxmKX06XG57c2VsZi5tc2d9IHtzZWxmLmRlc2NyaXB0aW9ufSIKKworICAgIGRlZiBtYXlfYmVfZW1pdHRlZChzZWxmKSAtPiBib29sOgorICAgICAgICAiIiJyZXR1cm4gVHJ1ZSBpZiBtZXNzYWdlIG1heSBiZSBlbWl0dGVkIHVzaW5nIHRoZSBjdXJyZW50IGludGVycHJldGVyIiIiCisgICAgICAgIGlmIHNlbGYubWludmVyc2lvbiBpcyBub3QgTm9uZSBhbmQgc2VsZi5taW52ZXJzaW9uID4gc3lzLnZlcnNpb25faW5mbzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLm1heHZlcnNpb24gaXMgbm90IE5vbmUgYW5kIHNlbGYubWF4dmVyc2lvbiA8PSBzeXMudmVyc2lvbl9pbmZvOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZm9ybWF0X2hlbHAoc2VsZiwgY2hlY2tlcnJlZjogYm9vbCA9IEZhbHNlKSAtPiBzdHI6CisgICAgICAgICIiInJldHVybiB0aGUgaGVscCBzdHJpbmcgZm9yIHRoZSBnaXZlbiBtZXNzYWdlIGlkIiIiCisgICAgICAgIGRlc2MgPSBzZWxmLmRlc2NyaXB0aW9uCisgICAgICAgIGlmIGNoZWNrZXJyZWY6CisgICAgICAgICAgICBkZXNjICs9ICIgVGhpcyBtZXNzYWdlIGJlbG9uZ3MgdG8gdGhlICVzIGNoZWNrZXIuIiAlIHNlbGYuY2hlY2tlcl9uYW1lCisgICAgICAgIHRpdGxlID0gc2VsZi5tc2cKKyAgICAgICAgaWYgc2VsZi5taW52ZXJzaW9uIG9yIHNlbGYubWF4dmVyc2lvbjoKKyAgICAgICAgICAgIHJlc3RyID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYubWludmVyc2lvbjoKKyAgICAgICAgICAgICAgICByZXN0ci5hcHBlbmQoIjwgJXMiICUgIi4iLmpvaW4oc3RyKG4pIGZvciBuIGluIHNlbGYubWludmVyc2lvbikpCisgICAgICAgICAgICBpZiBzZWxmLm1heHZlcnNpb246CisgICAgICAgICAgICAgICAgcmVzdHIuYXBwZW5kKCI+PSAlcyIgJSAiLiIuam9pbihzdHIobikgZm9yIG4gaW4gc2VsZi5tYXh2ZXJzaW9uKSkKKyAgICAgICAgICAgIHJlc3RyaWN0aW9uID0gIiBvciAiLmpvaW4ocmVzdHIpCisgICAgICAgICAgICBpZiBjaGVja2VycmVmOgorICAgICAgICAgICAgICAgIGRlc2MgKz0gIiBJdCBjYW4ndCBiZSBlbWl0dGVkIHdoZW4gdXNpbmcgUHl0aG9uICVzLiIgJSByZXN0cmljdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXNjICs9ICgKKyAgICAgICAgICAgICAgICAgICAgIiBUaGlzIG1lc3NhZ2UgY2FuJ3QgYmUgZW1pdHRlZCB3aGVuIHVzaW5nIFB5dGhvbiAlcy4iICUgcmVzdHJpY3Rpb24KKyAgICAgICAgICAgICAgICApCisgICAgICAgIG1zZ19oZWxwID0gbm9ybWFsaXplX3RleHQoIiAiLmpvaW4oZGVzYy5zcGxpdCgpKSwgaW5kZW50PSIgICIpCisgICAgICAgIG1lc3NhZ2VfaWQgPSBmIntzZWxmLnN5bWJvbH0gKHtzZWxmLm1zZ2lkfSkiCisgICAgICAgIGlmIHRpdGxlICE9ICIlcyI6CisgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgcmV0dXJuICI6e306ICp7fSpcbnt9Ii5mb3JtYXQobWVzc2FnZV9pZCwgdGl0bGUucnN0cmlwKCIgIiksIG1zZ19oZWxwKQorICAgICAgICByZXR1cm4gZiI6e21lc3NhZ2VfaWR9Olxue21zZ19oZWxwfSIKZGlmZiAtLWdpdCBhL3B5bGludC9tZXNzYWdlL21lc3NhZ2VfZGVmaW5pdGlvbl9zdG9yZS5weSBiL3B5bGludC9tZXNzYWdlL21lc3NhZ2VfZGVmaW5pdGlvbl9zdG9yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJiMDkwCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L21lc3NhZ2UvbWVzc2FnZV9kZWZpbml0aW9uX3N0b3JlLnB5CkBAIC0wLDAgKzEsODEgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbGxlY3Rpb25zCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgVmFsdWVzVmlldworCitmcm9tIHB5bGludC5leGNlcHRpb25zIGltcG9ydCBVbmtub3duTWVzc2FnZUVycm9yCitmcm9tIHB5bGludC5tZXNzYWdlLm1lc3NhZ2VfZGVmaW5pdGlvbiBpbXBvcnQgTWVzc2FnZURlZmluaXRpb24KK2Zyb20gcHlsaW50Lm1lc3NhZ2UubWVzc2FnZV9pZF9zdG9yZSBpbXBvcnQgTWVzc2FnZUlkU3RvcmUKKworCitjbGFzcyBNZXNzYWdlRGVmaW5pdGlvblN0b3JlOgorCisgICAgIiIiVGhlIG1lc3NhZ2VzIHN0b3JlIGtub3dzIGluZm9ybWF0aW9uIGFib3V0IGV2ZXJ5IHBvc3NpYmxlIG1lc3NhZ2UgZGVmaW5pdGlvbiBidXQgaGFzCisgICAgbm8gcGFydGljdWxhciBzdGF0ZSBkdXJpbmcgYW5hbHlzaXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubWVzc2FnZV9pZF9zdG9yZTogTWVzc2FnZUlkU3RvcmUgPSBNZXNzYWdlSWRTdG9yZSgpCisgICAgICAgICMgUHJpbWFyeSByZWdpc3RyeSBmb3IgYWxsIGFjdGl2ZSBtZXNzYWdlcyBkZWZpbml0aW9ucy4KKyAgICAgICAgIyBJdCBjb250YWlucyB0aGUgMToxIG1hcHBpbmcgZnJvbSBtc2dpZCB0byBNZXNzYWdlRGVmaW5pdGlvbi4KKyAgICAgICAgIyBLZXlzIGFyZSBtc2dpZCwgdmFsdWVzIGFyZSBNZXNzYWdlRGVmaW5pdGlvbgorICAgICAgICBzZWxmLl9tZXNzYWdlc19kZWZpbml0aW9uczogRGljdFtzdHIsIE1lc3NhZ2VEZWZpbml0aW9uXSA9IHt9CisgICAgICAgICMgTWVzc2FnZURlZmluaXRpb24ga2VwdCBieSBjYXRlZ29yeQorICAgICAgICBzZWxmLl9tc2dzX2J5X2NhdGVnb3J5OiBEaWN0W3N0ciwgTGlzdFtzdHJdXSA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KGxpc3QpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbWVzc2FnZXMoc2VsZikgLT4gVmFsdWVzVmlld1tNZXNzYWdlRGVmaW5pdGlvbl06CisgICAgICAgICIiIlRoZSBsaXN0IG9mIGFsbCBhY3RpdmUgbWVzc2FnZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9tZXNzYWdlc19kZWZpbml0aW9ucy52YWx1ZXMoKQorCisgICAgZGVmIHJlZ2lzdGVyX21lc3NhZ2VzX2Zyb21fY2hlY2tlcihzZWxmLCBjaGVja2VyKSAtPiBOb25lOgorICAgICAgICAiIiJSZWdpc3RlciBhbGwgbWVzc2FnZXMgZGVmaW5pdGlvbnMgZnJvbSBhIGNoZWNrZXIuIiIiCisgICAgICAgIGNoZWNrZXIuY2hlY2tfY29uc2lzdGVuY3koKQorICAgICAgICBmb3IgbWVzc2FnZSBpbiBjaGVja2VyLm1lc3NhZ2VzOgorICAgICAgICAgICAgc2VsZi5yZWdpc3Rlcl9tZXNzYWdlKG1lc3NhZ2UpCisKKyAgICBkZWYgcmVnaXN0ZXJfbWVzc2FnZShzZWxmLCBtZXNzYWdlOiBNZXNzYWdlRGVmaW5pdGlvbikgLT4gTm9uZToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYSBNZXNzYWdlRGVmaW5pdGlvbiB3aXRoIGNvbnNpc3RlbmN5IGluIG1pbmQuIiIiCisgICAgICAgIHNlbGYubWVzc2FnZV9pZF9zdG9yZS5yZWdpc3Rlcl9tZXNzYWdlX2RlZmluaXRpb24oCisgICAgICAgICAgICBtZXNzYWdlLm1zZ2lkLCBtZXNzYWdlLnN5bWJvbCwgbWVzc2FnZS5vbGRfbmFtZXMKKyAgICAgICAgKQorICAgICAgICBzZWxmLl9tZXNzYWdlc19kZWZpbml0aW9uc1ttZXNzYWdlLm1zZ2lkXSA9IG1lc3NhZ2UKKyAgICAgICAgc2VsZi5fbXNnc19ieV9jYXRlZ29yeVttZXNzYWdlLm1zZ2lkWzBdXS5hcHBlbmQobWVzc2FnZS5tc2dpZCkKKworICAgIGRlZiBnZXRfbWVzc2FnZV9kZWZpbml0aW9ucyhzZWxmLCBtc2dpZF9vcl9zeW1ib2w6IHN0cikgLT4gTGlzdFtNZXNzYWdlRGVmaW5pdGlvbl06CisgICAgICAgICIiIlJldHVybnMgdGhlIE1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgZWl0aGVyIGEgbnVtZXJpYyBvciBzeW1ib2xpYyBpZC4iIiIKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIHNlbGYuX21lc3NhZ2VzX2RlZmluaXRpb25zW21dCisgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLm1lc3NhZ2VfaWRfc3RvcmUuZ2V0X2FjdGl2ZV9tc2dpZHMobXNnaWRfb3Jfc3ltYm9sKQorICAgICAgICBdCisKKyAgICBkZWYgZ2V0X21zZ19kaXNwbGF5X3N0cmluZyhzZWxmLCBtc2dpZF9vcl9zeW1ib2w6IHN0cikgLT4gc3RyOgorICAgICAgICAiIiJHZW5lcmF0ZXMgYSB1c2VyLWNvbnN1bWFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBtZXNzYWdlLiIiIgorICAgICAgICBtZXNzYWdlX2RlZmluaXRpb25zID0gc2VsZi5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucyhtc2dpZF9vcl9zeW1ib2wpCisgICAgICAgIGlmIGxlbihtZXNzYWdlX2RlZmluaXRpb25zKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHJlcHIobWVzc2FnZV9kZWZpbml0aW9uc1swXS5zeW1ib2wpCisgICAgICAgIHJldHVybiByZXByKFttZC5zeW1ib2wgZm9yIG1kIGluIG1lc3NhZ2VfZGVmaW5pdGlvbnNdKQorCisgICAgZGVmIGhlbHBfbWVzc2FnZShzZWxmLCBtc2dpZHNfb3Jfc3ltYm9sczogTGlzdFtzdHJdKSAtPiBOb25lOgorICAgICAgICAiIiJEaXNwbGF5IGhlbHAgbWVzc2FnZXMgZm9yIHRoZSBnaXZlbiBtZXNzYWdlIGlkZW50aWZpZXJzIiIiCisgICAgICAgIGZvciBtc2dpZHNfb3Jfc3ltYm9sIGluIG1zZ2lkc19vcl9zeW1ib2xzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvciBtZXNzYWdlX2RlZmluaXRpb24gaW4gc2VsZi5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgbXNnaWRzX29yX3N5bWJvbAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgICAgIHByaW50KG1lc3NhZ2VfZGVmaW5pdGlvbi5mb3JtYXRfaGVscChjaGVja2VycmVmPVRydWUpKQorICAgICAgICAgICAgICAgICAgICBwcmludCgiIikKKyAgICAgICAgICAgIGV4Y2VwdCBVbmtub3duTWVzc2FnZUVycm9yIGFzIGV4OgorICAgICAgICAgICAgICAgIHByaW50KGV4KQorICAgICAgICAgICAgICAgIHByaW50KCIiKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICBkZWYgbGlzdF9tZXNzYWdlcyhzZWxmKSAtPiBOb25lOgorICAgICAgICAiIiJPdXRwdXQgZnVsbCBtZXNzYWdlcyBsaXN0IGRvY3VtZW50YXRpb24gaW4gUmVTVCBmb3JtYXQuIiIiCisgICAgICAgIG1lc3NhZ2VzID0gc29ydGVkKHNlbGYuX21lc3NhZ2VzX2RlZmluaXRpb25zLnZhbHVlcygpLCBrZXk9bGFtYmRhIG06IG0ubXNnaWQpCisgICAgICAgIGZvciBtZXNzYWdlIGluIG1lc3NhZ2VzOgorICAgICAgICAgICAgaWYgbm90IG1lc3NhZ2UubWF5X2JlX2VtaXR0ZWQoKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJpbnQobWVzc2FnZS5mb3JtYXRfaGVscChjaGVja2VycmVmPUZhbHNlKSkKKyAgICAgICAgcHJpbnQoIiIpCmRpZmYgLS1naXQgYS9weWxpbnQvbWVzc2FnZS9tZXNzYWdlX2hhbmRsZXJfbWl4X2luLnB5IGIvcHlsaW50L21lc3NhZ2UvbWVzc2FnZV9oYW5kbGVyX21peF9pbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQ2OGVlCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L21lc3NhZ2UvbWVzc2FnZV9oYW5kbGVyX21peF9pbi5weQpAQCAtMCwwICsxLDM5MiBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgc3lzCitmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgVHVwbGUKKworZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCAoCisgICAgX1NDT1BFX0VYRU1QVCwKKyAgICBNQUlOX0NIRUNLRVJfTkFNRSwKKyAgICBNU0dfU1RBVEVfQ09ORklERU5DRSwKKyAgICBNU0dfU1RBVEVfU0NPUEVfQ09ORklHLAorICAgIE1TR19TVEFURV9TQ09QRV9NT0RVTEUsCisgICAgTVNHX1RZUEVTLAorICAgIE1TR19UWVBFU19MT05HLAorICAgIE1TR19UWVBFU19TVEFUVVMsCisgICAgV2FybmluZ1Njb3BlLAorKQorZnJvbSBweWxpbnQuZXhjZXB0aW9ucyBpbXBvcnQgSW52YWxpZE1lc3NhZ2VFcnJvciwgVW5rbm93bk1lc3NhZ2VFcnJvcgorZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgVU5ERUZJTkVECitmcm9tIHB5bGludC5tZXNzYWdlLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKK2Zyb20gcHlsaW50LnV0aWxzIGltcG9ydCBnZXRfbW9kdWxlX2FuZF9mcmFtZWlkLCBnZXRfcnN0X3NlY3Rpb24sIGdldF9yc3RfdGl0bGUKKworCitjbGFzcyBNZXNzYWdlc0hhbmRsZXJNaXhJbjoKKyAgICAiIiJBIG1peC1pbiBjbGFzcyBjb250YWluaW5nIGFsbCB0aGUgbWVzc2FnZXMgcmVsYXRlZCBtZXRob2RzIGZvciB0aGUgbWFpbiBsaW50IGNsYXNzLiIiIgorCisgICAgX19ieV9pZF9tYW5hZ2VkX21zZ3M6IExpc3RbVHVwbGVbc3RyLCBzdHIsIHN0ciwgaW50LCBib29sXV0gPSBbXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9tc2dzX3N0YXRlID0ge30KKyAgICAgICAgc2VsZi5tc2dfc3RhdHVzID0gMAorCisgICAgZGVmIF9jaGVja2VyX21lc3NhZ2VzKHNlbGYsIGNoZWNrZXIpOgorICAgICAgICBmb3Iga25vd25fY2hlY2tlciBpbiBzZWxmLl9jaGVja2Vyc1tjaGVja2VyLmxvd2VyKCldOgorICAgICAgICAgICAgeWllbGQgZnJvbSBrbm93bl9jaGVja2VyLm1zZ3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjbGVhcl9ieV9pZF9tYW5hZ2VkX21zZ3MoY2xzKToKKyAgICAgICAgY2xzLl9fYnlfaWRfbWFuYWdlZF9tc2dzLmNsZWFyKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnZXRfYnlfaWRfbWFuYWdlZF9tc2dzKGNscyk6CisgICAgICAgIHJldHVybiBjbHMuX19ieV9pZF9tYW5hZ2VkX21zZ3MKKworICAgIGRlZiBfcmVnaXN0ZXJfYnlfaWRfbWFuYWdlZF9tc2coc2VsZiwgbXNnaWRfb3Jfc3ltYm9sOiBzdHIsIGxpbmUsIGlzX2Rpc2FibGVkPVRydWUpOgorICAgICAgICAiIiJJZiB0aGUgbXNnaWQgaXMgYSBudW1lcmljIG9uZSwgdGhlbiByZWdpc3RlciBpdCB0byBpbmZvcm0gdGhlIHVzZXIKKyAgICAgICAgaXQgY291bGQgZnVybmlzaCBpbnN0ZWFkIGEgc3ltYm9saWMgbXNnaWQuIiIiCisgICAgICAgIGlmIG1zZ2lkX29yX3N5bWJvbFsxOl0uaXNkaWdpdCgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5bWJvbCA9IHNlbGYubXNnc19zdG9yZS5tZXNzYWdlX2lkX3N0b3JlLmdldF9zeW1ib2wobXNnaWQ9bXNnaWRfb3Jfc3ltYm9sKSAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgICAgIGV4Y2VwdCBVbmtub3duTWVzc2FnZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbWFuYWdlZCA9IChzZWxmLmN1cnJlbnRfbmFtZSwgbXNnaWRfb3Jfc3ltYm9sLCBzeW1ib2wsIGxpbmUsIGlzX2Rpc2FibGVkKSAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgICAgIE1lc3NhZ2VzSGFuZGxlck1peEluLl9fYnlfaWRfbWFuYWdlZF9tc2dzLmFwcGVuZChtYW5hZ2VkKQorCisgICAgZGVmIGRpc2FibGUoc2VsZiwgbXNnaWQsIHNjb3BlPSJwYWNrYWdlIiwgbGluZT1Ob25lLCBpZ25vcmVfdW5rbm93bj1GYWxzZSk6CisgICAgICAgIHNlbGYuX3NldF9tc2dfc3RhdHVzKAorICAgICAgICAgICAgbXNnaWQsIGVuYWJsZT1GYWxzZSwgc2NvcGU9c2NvcGUsIGxpbmU9bGluZSwgaWdub3JlX3Vua25vd249aWdub3JlX3Vua25vd24KKyAgICAgICAgKQorICAgICAgICBzZWxmLl9yZWdpc3Rlcl9ieV9pZF9tYW5hZ2VkX21zZyhtc2dpZCwgbGluZSkKKworICAgIGRlZiBlbmFibGUoc2VsZiwgbXNnaWQsIHNjb3BlPSJwYWNrYWdlIiwgbGluZT1Ob25lLCBpZ25vcmVfdW5rbm93bj1GYWxzZSk6CisgICAgICAgIHNlbGYuX3NldF9tc2dfc3RhdHVzKAorICAgICAgICAgICAgbXNnaWQsIGVuYWJsZT1UcnVlLCBzY29wZT1zY29wZSwgbGluZT1saW5lLCBpZ25vcmVfdW5rbm93bj1pZ25vcmVfdW5rbm93bgorICAgICAgICApCisgICAgICAgIHNlbGYuX3JlZ2lzdGVyX2J5X2lkX21hbmFnZWRfbXNnKG1zZ2lkLCBsaW5lLCBpc19kaXNhYmxlZD1GYWxzZSkKKworICAgIGRlZiBfc2V0X21zZ19zdGF0dXMoCisgICAgICAgIHNlbGYsIG1zZ2lkLCBlbmFibGUsIHNjb3BlPSJwYWNrYWdlIiwgbGluZT1Ob25lLCBpZ25vcmVfdW5rbm93bj1GYWxzZQorICAgICk6CisgICAgICAgIGFzc2VydCBzY29wZSBpbiAoInBhY2thZ2UiLCAibW9kdWxlIikKKyAgICAgICAgaWYgbXNnaWQgPT0gImFsbCI6CisgICAgICAgICAgICBmb3IgX21zZ2lkIGluIE1TR19UWVBFUzoKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXRfbXNnX3N0YXR1cyhfbXNnaWQsIGVuYWJsZSwgc2NvcGUsIGxpbmUsIGlnbm9yZV91bmtub3duKQorICAgICAgICAgICAgaWYgZW5hYmxlIGFuZCBub3Qgc2VsZi5fcHl0aG9uM19wb3J0aW5nX21vZGU6CisgICAgICAgICAgICAgICAgIyBEb24ndCBhY3RpdmF0ZSB0aGUgcHl0aG9uIDMgcG9ydGluZyBjaGVja2VyIGlmIGl0IHdhc24ndCBhY3RpdmF0ZWQgZXhwbGljaXRseS4KKyAgICAgICAgICAgICAgICBzZWxmLmRpc2FibGUoInB5dGhvbjMiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBtc2dpZCBpcyBhIGNhdGVnb3J5PworICAgICAgICBjYXRlZ29yeV9pZCA9IG1zZ2lkLnVwcGVyKCkKKyAgICAgICAgaWYgY2F0ZWdvcnlfaWQgbm90IGluIE1TR19UWVBFUzoKKyAgICAgICAgICAgIGNhdGVnb3J5X2lkID0gTVNHX1RZUEVTX0xPTkcuZ2V0KGNhdGVnb3J5X2lkKQorICAgICAgICBpZiBjYXRlZ29yeV9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBfbXNnaWQgaW4gc2VsZi5tc2dzX3N0b3JlLl9tc2dzX2J5X2NhdGVnb3J5LmdldChjYXRlZ29yeV9pZCk6CisgICAgICAgICAgICAgICAgc2VsZi5fc2V0X21zZ19zdGF0dXMoX21zZ2lkLCBlbmFibGUsIHNjb3BlLCBsaW5lKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBtc2dpZCBpcyBhIGNoZWNrZXIgbmFtZT8KKyAgICAgICAgaWYgbXNnaWQubG93ZXIoKSBpbiBzZWxmLl9jaGVja2VyczoKKyAgICAgICAgICAgIGZvciBjaGVja2VyIGluIHNlbGYuX2NoZWNrZXJzW21zZ2lkLmxvd2VyKCldOgorICAgICAgICAgICAgICAgIGZvciBfbXNnaWQgaW4gY2hlY2tlci5tc2dzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZXRfbXNnX3N0YXR1cyhfbXNnaWQsIGVuYWJsZSwgc2NvcGUsIGxpbmUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIG1zZ2lkIGlzIHJlcG9ydCBpZD8KKyAgICAgICAgaWYgbXNnaWQubG93ZXIoKS5zdGFydHN3aXRoKCJycCIpOgorICAgICAgICAgICAgaWYgZW5hYmxlOgorICAgICAgICAgICAgICAgIHNlbGYuZW5hYmxlX3JlcG9ydChtc2dpZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kaXNhYmxlX3JlcG9ydChtc2dpZCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbXNnaWQgaXMgYSBzeW1ib2xpYyBvciBudW1lcmljIG1zZ2lkLgorICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9ucyA9IHNlbGYubXNnc19zdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucyhtc2dpZCkKKyAgICAgICAgZXhjZXB0IFVua25vd25NZXNzYWdlRXJyb3I6CisgICAgICAgICAgICBpZiBpZ25vcmVfdW5rbm93bjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGZvciBtZXNzYWdlX2RlZmluaXRpb24gaW4gbWVzc2FnZV9kZWZpbml0aW9uczoKKyAgICAgICAgICAgIHNlbGYuX3NldF9vbmVfbXNnX3N0YXR1cyhzY29wZSwgbWVzc2FnZV9kZWZpbml0aW9uLCBsaW5lLCBlbmFibGUpCisKKyAgICBkZWYgX3NldF9vbmVfbXNnX3N0YXR1cyhzZWxmLCBzY29wZSwgbXNnLCBsaW5lLCBlbmFibGUpOgorICAgICAgICBpZiBzY29wZSA9PSAibW9kdWxlIjoKKyAgICAgICAgICAgIHNlbGYuZmlsZV9zdGF0ZS5zZXRfbXNnX3N0YXR1cyhtc2csIGxpbmUsIGVuYWJsZSkKKyAgICAgICAgICAgIGlmIG5vdCBlbmFibGUgYW5kIG1zZy5zeW1ib2wgIT0gImxvY2FsbHktZGlzYWJsZWQiOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICJsb2NhbGx5LWRpc2FibGVkIiwgbGluZT1saW5lLCBhcmdzPShtc2cuc3ltYm9sLCBtc2cubXNnaWQpCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNncyA9IHNlbGYuX21zZ3Nfc3RhdGUKKyAgICAgICAgICAgIG1zZ3NbbXNnLm1zZ2lkXSA9IGVuYWJsZQorICAgICAgICAgICAgIyBzeW5jIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICAgICAgICBzZWxmLmNvbmZpZy5lbmFibGUgPSBbCisgICAgICAgICAgICAgICAgc2VsZi5fbWVzc2FnZV9zeW1ib2wobWlkKSBmb3IgbWlkLCB2YWwgaW4gc29ydGVkKG1zZ3MuaXRlbXMoKSkgaWYgdmFsCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzZWxmLmNvbmZpZy5kaXNhYmxlID0gWworICAgICAgICAgICAgICAgIHNlbGYuX21lc3NhZ2Vfc3ltYm9sKG1pZCkKKyAgICAgICAgICAgICAgICBmb3IgbWlkLCB2YWwgaW4gc29ydGVkKG1zZ3MuaXRlbXMoKSkKKyAgICAgICAgICAgICAgICBpZiBub3QgdmFsCisgICAgICAgICAgICBdCisKKyAgICBkZWYgX21lc3NhZ2Vfc3ltYm9sKHNlbGYsIG1zZ2lkKToKKyAgICAgICAgIiIiR2V0IHRoZSBtZXNzYWdlIHN5bWJvbCBvZiB0aGUgZ2l2ZW4gbWVzc2FnZSBpZAorCisgICAgICAgIFJldHVybiB0aGUgb3JpZ2luYWwgbWVzc2FnZSBpZCBpZiB0aGUgbWVzc2FnZSBkb2VzIG5vdAorICAgICAgICBleGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBbbWQuc3ltYm9sIGZvciBtZCBpbiBzZWxmLm1zZ3Nfc3RvcmUuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbnMobXNnaWQpXQorICAgICAgICBleGNlcHQgVW5rbm93bk1lc3NhZ2VFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBtc2dpZAorCisgICAgZGVmIGdldF9tZXNzYWdlX3N0YXRlX3Njb3BlKHNlbGYsIG1zZ2lkLCBsaW5lPU5vbmUsIGNvbmZpZGVuY2U9VU5ERUZJTkVEKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc2NvcGUgYXQgd2hpY2ggYSBtZXNzYWdlIHdhcyBlbmFibGVkL2Rpc2FibGVkLiIiIgorICAgICAgICBpZiBzZWxmLmNvbmZpZy5jb25maWRlbmNlIGFuZCBjb25maWRlbmNlLm5hbWUgbm90IGluIHNlbGYuY29uZmlnLmNvbmZpZGVuY2U6CisgICAgICAgICAgICByZXR1cm4gTVNHX1NUQVRFX0NPTkZJREVOQ0UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbGluZSBpbiBzZWxmLmZpbGVfc3RhdGUuX21vZHVsZV9tc2dzX3N0YXRlW21zZ2lkXToKKyAgICAgICAgICAgICAgICByZXR1cm4gTVNHX1NUQVRFX1NDT1BFX01PRFVMRQorICAgICAgICBleGNlcHQgKEtleUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgcmV0dXJuIE1TR19TVEFURV9TQ09QRV9DT05GSUcKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBpc19tZXNzYWdlX2VuYWJsZWQoc2VsZiwgbXNnX2Rlc2NyLCBsaW5lPU5vbmUsIGNvbmZpZGVuY2U9Tm9uZSk6CisgICAgICAgICIiInJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIG1lc3NhZ2UgaWQgaXMKKyAgICAgICAgZW5hYmxlZAorCisgICAgICAgIG1zZ2lkIG1heSBiZSBlaXRoZXIgYSBudW1lcmljIG9yIHN5bWJvbGljIG1lc3NhZ2UgaWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNvbmZpZy5jb25maWRlbmNlIGFuZCBjb25maWRlbmNlOgorICAgICAgICAgICAgaWYgY29uZmlkZW5jZS5uYW1lIG5vdCBpbiBzZWxmLmNvbmZpZy5jb25maWRlbmNlOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb25zID0gc2VsZi5tc2dzX3N0b3JlLmdldF9tZXNzYWdlX2RlZmluaXRpb25zKG1zZ19kZXNjcikKKyAgICAgICAgICAgIG1zZ2lkcyA9IFttZC5tc2dpZCBmb3IgbWQgaW4gbWVzc2FnZV9kZWZpbml0aW9uc10KKyAgICAgICAgZXhjZXB0IFVua25vd25NZXNzYWdlRXJyb3I6CisgICAgICAgICAgICAjIFRoZSBsaW50ZXIgY2hlY2tzIGZvciBtZXNzYWdlcyB0aGF0IGFyZSBub3QgcmVnaXN0ZXJlZAorICAgICAgICAgICAgIyBkdWUgdG8gdmVyc2lvbiBtaXNtYXRjaCwganVzdCB0cmVhdCB0aGVtIGFzIG1lc3NhZ2UgSURzCisgICAgICAgICAgICAjIGZvciBub3cuCisgICAgICAgICAgICBtc2dpZHMgPSBbbXNnX2Rlc2NyXQorICAgICAgICBmb3IgbXNnaWQgaW4gbXNnaWRzOgorICAgICAgICAgICAgaWYgc2VsZi5pc19vbmVfbWVzc2FnZV9lbmFibGVkKG1zZ2lkLCBsaW5lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpc19vbmVfbWVzc2FnZV9lbmFibGVkKHNlbGYsIG1zZ2lkLCBsaW5lKToKKyAgICAgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21zZ3Nfc3RhdGUuZ2V0KG1zZ2lkLCBUcnVlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlX3N0YXRlLl9tb2R1bGVfbXNnc19zdGF0ZVttc2dpZF1bbGluZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgbWVzc2FnZSdzIGxpbmUgaXMgYWZ0ZXIgdGhlIG1heGltdW0gbGluZSBleGlzdGluZyBpbiBhc3QgdHJlZS4KKyAgICAgICAgICAgICMgVGhpcyBsaW5lIHdvbid0IGFwcGVhciBpbiB0aGUgYXN0IHRyZWUgYW5kIHdvbid0IGJlIHJlZmVycmVkIGluCisgICAgICAgICAgICAjIHNlbGYuZmlsZV9zdGF0ZS5fbW9kdWxlX21zZ3Nfc3RhdGUKKyAgICAgICAgICAgICMgVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIHdpdGggYSBjb21tZW50ZWQgbGluZSBhdCB0aGUgZW5kIG9mIGEgbW9kdWxlLgorICAgICAgICAgICAgbWF4X2xpbmVfbnVtYmVyID0gc2VsZi5maWxlX3N0YXRlLmdldF9lZmZlY3RpdmVfbWF4X2xpbmVfbnVtYmVyKCkKKyAgICAgICAgICAgIGlmIG1heF9saW5lX251bWJlciBhbmQgbGluZSA+IG1heF9saW5lX251bWJlcjoKKyAgICAgICAgICAgICAgICBmYWxsYmFjayA9IFRydWUKKyAgICAgICAgICAgICAgICBsaW5lcyA9IHNlbGYuZmlsZV9zdGF0ZS5fcmF3X21vZHVsZV9tc2dzX3N0YXRlLmdldChtc2dpZCwge30pCisKKyAgICAgICAgICAgICAgICAjIERvZXNuJ3QgY29uc2lkZXIgc2NvcGVzLCBhcyBhIGRpc2FibGUgY2FuIGJlIGluIGEgZGlmZmVyZW50IHNjb3BlCisgICAgICAgICAgICAgICAgIyB0aGFuIHRoYXQgb2YgdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAgICAgICBjbG9zZXN0X2xpbmVzID0gcmV2ZXJzZWQoCisgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlX2xpbmUsIGVuYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtZXNzYWdlX2xpbmUsIGVuYWJsZSBpbiBsaW5lcy5pdGVtcygpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBtZXNzYWdlX2xpbmUgPD0gbGluZQorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGxhc3RfbGluZSwgaXNfZW5hYmxlZCA9IG5leHQoY2xvc2VzdF9saW5lcywgKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIGlmIGxhc3RfbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBpc19lbmFibGVkCisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fbXNnc19zdGF0ZS5nZXQobXNnaWQsIGZhbGxiYWNrKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21zZ3Nfc3RhdGUuZ2V0KG1zZ2lkLCBUcnVlKQorCisgICAgZGVmIGFkZF9tZXNzYWdlKAorICAgICAgICBzZWxmLCBtc2dpZCwgbGluZT1Ob25lLCBub2RlPU5vbmUsIGFyZ3M9Tm9uZSwgY29uZmlkZW5jZT1Ob25lLCBjb2xfb2Zmc2V0PU5vbmUKKyAgICApOgorICAgICAgICAiIiJBZGRzIGEgbWVzc2FnZSBnaXZlbiBieSBJRCBvciBuYW1lLgorCisgICAgICAgIElmIHByb3ZpZGVkLCB0aGUgbWVzc2FnZSBzdHJpbmcgaXMgZXhwYW5kZWQgdXNpbmcgYXJncy4KKworICAgICAgICBBU1QgY2hlY2tlcnMgbXVzdCBwcm92aWRlIHRoZSBub2RlIGFyZ3VtZW50IChidXQgbWF5IG9wdGlvbmFsbHkKKyAgICAgICAgcHJvdmlkZSBsaW5lIGlmIHRoZSBsaW5lIG51bWJlciBpcyBkaWZmZXJlbnQpLCByYXcgYW5kIHRva2VuIGNoZWNrZXJzCisgICAgICAgIG11c3QgcHJvdmlkZSB0aGUgbGluZSBhcmd1bWVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNvbmZpZGVuY2UgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBVTkRFRklORUQKKyAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9ucyA9IHNlbGYubXNnc19zdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucyhtc2dpZCkKKyAgICAgICAgZm9yIG1lc3NhZ2VfZGVmaW5pdGlvbiBpbiBtZXNzYWdlX2RlZmluaXRpb25zOgorICAgICAgICAgICAgc2VsZi5hZGRfb25lX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uLCBsaW5lLCBub2RlLCBhcmdzLCBjb25maWRlbmNlLCBjb2xfb2Zmc2V0CisgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGNoZWNrX21lc3NhZ2VfZGVmaW5pdGlvbihtZXNzYWdlX2RlZmluaXRpb24sIGxpbmUsIG5vZGUpOgorICAgICAgICBpZiBtZXNzYWdlX2RlZmluaXRpb24ubXNnaWRbMF0gbm90IGluIF9TQ09QRV9FWEVNUFQ6CisgICAgICAgICAgICAjIEZhdGFsIG1lc3NhZ2VzIGFuZCByZXBvcnRzIGFyZSBzcGVjaWFsLCB0aGUgbm9kZS9zY29wZSBkaXN0aW5jdGlvbgorICAgICAgICAgICAgIyBkb2VzIG5vdCBhcHBseSB0byB0aGVtLgorICAgICAgICAgICAgaWYgbWVzc2FnZV9kZWZpbml0aW9uLnNjb3BlID09IFdhcm5pbmdTY29wZS5MSU5FOgorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1lc3NhZ2VFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlICVzIG11c3QgcHJvdmlkZSBsaW5lLCBnb3QgTm9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkTWVzc2FnZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgJXMgbXVzdCBvbmx5IHByb3ZpZGUgbGluZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImdvdCBsaW5lPSVzLCBub2RlPSVzIiAlIChtZXNzYWdlX2RlZmluaXRpb24ubXNnaWQsIGxpbmUsIG5vZGUpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsaWYgbWVzc2FnZV9kZWZpbml0aW9uLnNjb3BlID09IFdhcm5pbmdTY29wZS5OT0RFOgorICAgICAgICAgICAgICAgICMgTm9kZS1iYXNlZCB3YXJuaW5ncyBtYXkgcHJvdmlkZSBhbiBvdmVycmlkZSBsaW5lLgorICAgICAgICAgICAgICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1lc3NhZ2VFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlICVzIG11c3QgcHJvdmlkZSBOb2RlLCBnb3QgTm9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkCisgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBhZGRfb25lX21lc3NhZ2UoCisgICAgICAgIHNlbGYsIG1lc3NhZ2VfZGVmaW5pdGlvbiwgbGluZSwgbm9kZSwgYXJncywgY29uZmlkZW5jZSwgY29sX29mZnNldAorICAgICk6CisgICAgICAgIHNlbGYuY2hlY2tfbWVzc2FnZV9kZWZpbml0aW9uKG1lc3NhZ2VfZGVmaW5pdGlvbiwgbGluZSwgbm9kZSkKKyAgICAgICAgaWYgbGluZSBpcyBOb25lIGFuZCBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZSA9IG5vZGUuZnJvbWxpbmVubworICAgICAgICBpZiBjb2xfb2Zmc2V0IGlzIE5vbmUgYW5kIGhhc2F0dHIobm9kZSwgImNvbF9vZmZzZXQiKToKKyAgICAgICAgICAgIGNvbF9vZmZzZXQgPSBub2RlLmNvbF9vZmZzZXQKKworICAgICAgICAjIHNob3VsZCB0aGlzIG1lc3NhZ2UgYmUgZGlzcGxheWVkCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX21lc3NhZ2VfZW5hYmxlZChtZXNzYWdlX2RlZmluaXRpb24ubXNnaWQsIGxpbmUsIGNvbmZpZGVuY2UpOgorICAgICAgICAgICAgc2VsZi5maWxlX3N0YXRlLmhhbmRsZV9pZ25vcmVkX21lc3NhZ2UoCisgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWVzc2FnZV9zdGF0ZV9zY29wZSgKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkLCBsaW5lLCBjb25maWRlbmNlCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24ubXNnaWQsCisgICAgICAgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgICAgICBub2RlLAorICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIHVwZGF0ZSBzdGF0cworICAgICAgICBtc2dfY2F0ID0gTVNHX1RZUEVTW21lc3NhZ2VfZGVmaW5pdGlvbi5tc2dpZFswXV0KKyAgICAgICAgc2VsZi5tc2dfc3RhdHVzIHw9IE1TR19UWVBFU19TVEFUVVNbbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkWzBdXQorICAgICAgICBpZiBzZWxmLnN0YXRzIGlzIE5vbmU6CisgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1maXhtZQorICAgICAgICAgICAgIyBUT0RPIHNlbGYuc3RhdHMgc2hvdWxkIG1ha2Ugc2Vuc2UsCisgICAgICAgICAgICAjIGNsYXNzIHNob3VsZCBtYWtlIHNlbnNlIGFzIHNvb24gYXMgaW5zdGFudGlhdGVkCisgICAgICAgICAgICAjIFRoaXMgaXMgbm90IHRydWUgZm9yIExpbnRlciBhbmQgUmVwb3J0ZXIgYXQgbGVhc3QKKyAgICAgICAgICAgICMgcHlsaW50OiBlbmFibGU9Zml4bWUKKyAgICAgICAgICAgIHNlbGYuc3RhdHMgPSB7CisgICAgICAgICAgICAgICAgbXNnX2NhdDogMCwKKyAgICAgICAgICAgICAgICAiYnlfbW9kdWxlIjoge3NlbGYuY3VycmVudF9uYW1lOiB7bXNnX2NhdDogMH19LAorICAgICAgICAgICAgICAgICJieV9tc2ciOiB7fSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgc2VsZi5zdGF0c1ttc2dfY2F0XSArPSAxCisgICAgICAgIHNlbGYuc3RhdHNbImJ5X21vZHVsZSJdW3NlbGYuY3VycmVudF9uYW1lXVttc2dfY2F0XSArPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbImJ5X21zZyJdW21lc3NhZ2VfZGVmaW5pdGlvbi5zeW1ib2xdICs9IDEKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5zdGF0c1siYnlfbXNnIl1bbWVzc2FnZV9kZWZpbml0aW9uLnN5bWJvbF0gPSAxCisgICAgICAgICMgZXhwYW5kIG1lc3NhZ2UgPworICAgICAgICBtc2cgPSBtZXNzYWdlX2RlZmluaXRpb24ubXNnCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBtc2cgJT0gYXJncworICAgICAgICAjIGdldCBtb2R1bGUgYW5kIG9iamVjdAorICAgICAgICBpZiBub2RlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2R1bGUsIG9iaiA9IHNlbGYuY3VycmVudF9uYW1lLCAiIgorICAgICAgICAgICAgYWJzcGF0aCA9IHNlbGYuY3VycmVudF9maWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2R1bGUsIG9iaiA9IGdldF9tb2R1bGVfYW5kX2ZyYW1laWQobm9kZSkKKyAgICAgICAgICAgIGFic3BhdGggPSBub2RlLnJvb3QoKS5maWxlCisgICAgICAgIGlmIGFic3BhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwYXRoID0gYWJzcGF0aC5yZXBsYWNlKHNlbGYucmVwb3J0ZXIucGF0aF9zdHJpcF9wcmVmaXgsICIiLCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9ICJjb25maWd1cmF0aW9uIgorICAgICAgICAjIGFkZCB0aGUgbWVzc2FnZQorICAgICAgICBzZWxmLnJlcG9ydGVyLmhhbmRsZV9tZXNzYWdlKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24ubXNnaWQsCisgICAgICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uLnN5bWJvbCwKKyAgICAgICAgICAgICAgICAoYWJzcGF0aCwgcGF0aCwgbW9kdWxlLCBvYmosIGxpbmUgb3IgMSwgY29sX29mZnNldCBvciAwKSwKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorCisgICAgZGVmIF9nZXRfY2hlY2tlcnNfaW5mb3Moc2VsZik6CisgICAgICAgIGJ5X2NoZWNrZXIgPSB7fQorICAgICAgICBmb3IgY2hlY2tlciBpbiBzZWxmLmdldF9jaGVja2VycygpOgorICAgICAgICAgICAgbmFtZSA9IGNoZWNrZXIubmFtZQorICAgICAgICAgICAgaWYgbmFtZSAhPSAibWFzdGVyIjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGJ5X2NoZWNrZXJbbmFtZV1bImNoZWNrZXIiXSA9IGNoZWNrZXIKKyAgICAgICAgICAgICAgICAgICAgYnlfY2hlY2tlcltuYW1lXVsib3B0aW9ucyJdICs9IGNoZWNrZXIub3B0aW9uc19hbmRfdmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgYnlfY2hlY2tlcltuYW1lXVsibXNncyJdLnVwZGF0ZShjaGVja2VyLm1zZ3MpCisgICAgICAgICAgICAgICAgICAgIGJ5X2NoZWNrZXJbbmFtZV1bInJlcG9ydHMiXSArPSBjaGVja2VyLnJlcG9ydHMKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJ5X2NoZWNrZXJbbmFtZV0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tlciI6IGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9ucyI6IGxpc3QoY2hlY2tlci5vcHRpb25zX2FuZF92YWx1ZXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAibXNncyI6IGRpY3QoY2hlY2tlci5tc2dzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBvcnRzIjogbGlzdChjaGVja2VyLnJlcG9ydHMpLAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIHJldHVybiBieV9jaGVja2VyCisKKyAgICBkZWYgZ2V0X2NoZWNrZXJzX2RvY3VtZW50YXRpb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IGdldF9yc3RfdGl0bGUoIlB5bGludCBnbG9iYWwgb3B0aW9ucyBhbmQgc3dpdGNoZXMiLCAiLSIpCisgICAgICAgIHJlc3VsdCArPSAiIiIKK1B5bGludCBwcm92aWRlcyBnbG9iYWwgb3B0aW9ucyBhbmQgc3dpdGNoZXMuCisKKyIiIgorICAgICAgICBmb3IgY2hlY2tlciBpbiBzZWxmLmdldF9jaGVja2VycygpOgorICAgICAgICAgICAgbmFtZSA9IGNoZWNrZXIubmFtZQorICAgICAgICAgICAgaWYgbmFtZSA9PSBNQUlOX0NIRUNLRVJfTkFNRToKKyAgICAgICAgICAgICAgICBpZiBjaGVja2VyLm9wdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIGZvciBzZWN0aW9uLCBvcHRpb25zIGluIGNoZWNrZXIub3B0aW9uc19ieV9zZWN0aW9uKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiR2VuZXJhbCBvcHRpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIlcyBvcHRpb25zIiAlIHNlY3Rpb24uY2FwaXRhbGl6ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZ2V0X3JzdF90aXRsZSh0aXRsZSwgIn4iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIlc1xuIiAlIGdldF9yc3Rfc2VjdGlvbihOb25lLCBvcHRpb25zKQorICAgICAgICByZXN1bHQgKz0gZ2V0X3JzdF90aXRsZSgiUHlsaW50IGNoZWNrZXJzJyBvcHRpb25zIGFuZCBzd2l0Y2hlcyIsICItIikKKyAgICAgICAgcmVzdWx0ICs9ICIiIlwKKworUHlsaW50IGNoZWNrZXJzIGNhbiBwcm92aWRlIHRocmVlIHNldCBvZiBmZWF0dXJlczoKKworKiBvcHRpb25zIHRoYXQgY29udHJvbCB0aGVpciBleGVjdXRpb24sCisqIG1lc3NhZ2VzIHRoYXQgdGhleSBjYW4gcmFpc2UsCisqIHJlcG9ydHMgdGhhdCB0aGV5IGNhbiBnZW5lcmF0ZS4KKworQmVsb3cgaXMgYSBsaXN0IG9mIGFsbCBjaGVja2VycyBhbmQgdGhlaXIgZmVhdHVyZXMuCisKKyIiIgorICAgICAgICBieV9jaGVja2VyID0gc2VsZi5fZ2V0X2NoZWNrZXJzX2luZm9zKCkKKyAgICAgICAgZm9yIGNoZWNrZXIgaW4gc29ydGVkKGJ5X2NoZWNrZXIpOgorICAgICAgICAgICAgaW5mb3JtYXRpb24gPSBieV9jaGVja2VyW2NoZWNrZXJdCisgICAgICAgICAgICBjaGVja2VyID0gaW5mb3JtYXRpb25bImNoZWNrZXIiXQorICAgICAgICAgICAgZGVsIGluZm9ybWF0aW9uWyJjaGVja2VyIl0KKyAgICAgICAgICAgIHJlc3VsdCArPSBjaGVja2VyLmdldF9mdWxsX2RvY3VtZW50YXRpb24oKippbmZvcm1hdGlvbikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHByaW50X2Z1bGxfZG9jdW1lbnRhdGlvbihzZWxmLCBzdHJlYW09Tm9uZSk6CisgICAgICAgICIiIm91dHB1dCBhIGZ1bGwgZG9jdW1lbnRhdGlvbiBpbiBSZVNUIGZvcm1hdCIiIgorICAgICAgICBpZiBub3Qgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtID0gc3lzLnN0ZG91dAorICAgICAgICBwcmludChzZWxmLmdldF9jaGVja2Vyc19kb2N1bWVudGF0aW9uKClbOi0xXSwgZmlsZT1zdHJlYW0pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9wcmludF9jaGVja2VyX2RvYyhpbmZvcm1hdGlvbiwgc3RyZWFtPU5vbmUpOgorICAgICAgICAiIiJIZWxwZXIgbWV0aG9kIGZvciBwcmludF9mdWxsX2RvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWxzbyB1c2VkIGJ5IGRvYy9leHRzL3B5bGludF9leHRlbnNpb25zLnB5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHN0cmVhbToKKyAgICAgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRvdXQKKyAgICAgICAgY2hlY2tlciA9IGluZm9ybWF0aW9uWyJjaGVja2VyIl0KKyAgICAgICAgZGVsIGluZm9ybWF0aW9uWyJjaGVja2VyIl0KKyAgICAgICAgcHJpbnQoY2hlY2tlci5nZXRfZnVsbF9kb2N1bWVudGF0aW9uKCoqaW5mb3JtYXRpb24pWzotMV0sIGZpbGU9c3RyZWFtKQpkaWZmIC0tZ2l0IGEvcHlsaW50L21lc3NhZ2UvbWVzc2FnZV9pZF9zdG9yZS5weSBiL3B5bGludC9tZXNzYWdlL21lc3NhZ2VfaWRfc3RvcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkZDBhNQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9tZXNzYWdlL21lc3NhZ2VfaWRfc3RvcmUucHkKQEAgLTAsMCArMSwxMTcgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVHVwbGUKKworZnJvbSBweWxpbnQuZXhjZXB0aW9ucyBpbXBvcnQgSW52YWxpZE1lc3NhZ2VFcnJvciwgVW5rbm93bk1lc3NhZ2VFcnJvcgorCisKK2NsYXNzIE1lc3NhZ2VJZFN0b3JlOgorCisgICAgIiIiVGhlIE1lc3NhZ2VJZFN0b3JlIHN0b3JlIE1lc3NhZ2VJZCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYSAxLTEgcmVsYXRpb24gYmV0d2VlbiBtc2dpZCBhbmQgc3ltYm9sLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9fbXNnaWRfdG9fc3ltYm9sOiBEaWN0W3N0ciwgc3RyXSA9IHt9CisgICAgICAgIHNlbGYuX19zeW1ib2xfdG9fbXNnaWQ6IERpY3Rbc3RyLCBzdHJdID0ge30KKyAgICAgICAgc2VsZi5fX29sZF9uYW1lczogRGljdFtzdHIsIExpc3Rbc3RyXV0gPSB7fQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fX21zZ2lkX3RvX3N5bWJvbCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gIk1lc3NhZ2VJZFN0b3JlOiBbXG4iCisgICAgICAgIGZvciBtc2dpZCwgc3ltYm9sIGluIHNlbGYuX19tc2dpZF90b19zeW1ib2wuaXRlbXMoKToKKyAgICAgICAgICAgIHJlc3VsdCArPSBmIiAgLSB7bXNnaWR9ICh7c3ltYm9sfSlcbiIKKyAgICAgICAgcmVzdWx0ICs9ICJdIgorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0X3N5bWJvbChzZWxmLCBtc2dpZDogc3RyKSAtPiBzdHI6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbXNnaWRfdG9fc3ltYm9sW21zZ2lkXQorICAgICAgICBleGNlcHQgS2V5RXJyb3IgYXMgZToKKyAgICAgICAgICAgIG1zZyA9IGYiJ3ttc2dpZH0nIGlzIG5vdCBzdG9yZWQgaW4gdGhlIG1lc3NhZ2Ugc3RvcmUuIgorICAgICAgICAgICAgcmFpc2UgVW5rbm93bk1lc3NhZ2VFcnJvcihtc2cpIGZyb20gZQorCisgICAgZGVmIGdldF9tc2dpZChzZWxmLCBzeW1ib2w6IHN0cikgLT4gc3RyOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3N5bWJvbF90b19tc2dpZFtzeW1ib2xdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBlOgorICAgICAgICAgICAgbXNnID0gZiIne3N5bWJvbH0nIGlzIG5vdCBzdG9yZWQgaW4gdGhlIG1lc3NhZ2Ugc3RvcmUuIgorICAgICAgICAgICAgcmFpc2UgVW5rbm93bk1lc3NhZ2VFcnJvcihtc2cpIGZyb20gZQorCisgICAgZGVmIHJlZ2lzdGVyX21lc3NhZ2VfZGVmaW5pdGlvbigKKyAgICAgICAgc2VsZiwgbXNnaWQ6IHN0ciwgc3ltYm9sOiBzdHIsIG9sZF9uYW1lczogTGlzdFtUdXBsZVtzdHIsIHN0cl1dCisgICAgKToKKyAgICAgICAgc2VsZi5jaGVja19tc2dpZF9hbmRfc3ltYm9sKG1zZ2lkLCBzeW1ib2wpCisgICAgICAgIHNlbGYuYWRkX21zZ2lkX2FuZF9zeW1ib2wobXNnaWQsIHN5bWJvbCkKKyAgICAgICAgZm9yIG9sZF9tc2dpZCwgb2xkX3N5bWJvbCBpbiBvbGRfbmFtZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrX21zZ2lkX2FuZF9zeW1ib2wob2xkX21zZ2lkLCBvbGRfc3ltYm9sKQorICAgICAgICAgICAgc2VsZi5hZGRfbGVnYWN5X21zZ2lkX2FuZF9zeW1ib2wob2xkX21zZ2lkLCBvbGRfc3ltYm9sLCBtc2dpZCkKKworICAgIGRlZiBhZGRfbXNnaWRfYW5kX3N5bWJvbChzZWxmLCBtc2dpZDogc3RyLCBzeW1ib2w6IHN0cikgLT4gTm9uZToKKyAgICAgICAgIiIiQWRkIHZhbGlkIG1lc3NhZ2UgaWQuCisKKyAgICAgICAgVGhlcmUgaXMgYSBsaXR0bGUgZHVwbGljYXRpb24gd2l0aCBhZGRfbGVnYWN5X21zZ2lkX2FuZF9zeW1ib2wgdG8gYXZvaWQgYSBmdW5jdGlvbiBjYWxsLAorICAgICAgICB0aGlzIGlzIGNhbGxlZCBhIGxvdCBhdCBpbml0aWFsaXphdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fX21zZ2lkX3RvX3N5bWJvbFttc2dpZF0gPSBzeW1ib2wKKyAgICAgICAgc2VsZi5fX3N5bWJvbF90b19tc2dpZFtzeW1ib2xdID0gbXNnaWQKKworICAgIGRlZiBhZGRfbGVnYWN5X21zZ2lkX2FuZF9zeW1ib2woCisgICAgICAgIHNlbGYsIG1zZ2lkOiBzdHIsIHN5bWJvbDogc3RyLCBuZXdfbXNnaWQ6IHN0cgorICAgICkgLT4gTm9uZToKKyAgICAgICAgIiIiQWRkIHZhbGlkIGxlZ2FjeSBtZXNzYWdlIGlkLgorCisgICAgICAgIFRoZXJlIGlzIGEgbGl0dGxlIGR1cGxpY2F0aW9uIHdpdGggYWRkX21zZ2lkX2FuZF9zeW1ib2wgdG8gYXZvaWQgYSBmdW5jdGlvbiBjYWxsLAorICAgICAgICB0aGlzIGlzIGNhbGxlZCBhIGxvdCBhdCBpbml0aWFsaXphdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fX21zZ2lkX3RvX3N5bWJvbFttc2dpZF0gPSBzeW1ib2wKKyAgICAgICAgc2VsZi5fX3N5bWJvbF90b19tc2dpZFtzeW1ib2xdID0gbXNnaWQKKyAgICAgICAgZXhpc3Rpbmdfb2xkX25hbWVzID0gc2VsZi5fX29sZF9uYW1lcy5nZXQobXNnaWQsIFtdKQorICAgICAgICBleGlzdGluZ19vbGRfbmFtZXMuYXBwZW5kKG5ld19tc2dpZCkKKyAgICAgICAgc2VsZi5fX29sZF9uYW1lc1ttc2dpZF0gPSBleGlzdGluZ19vbGRfbmFtZXMKKworICAgIGRlZiBjaGVja19tc2dpZF9hbmRfc3ltYm9sKHNlbGYsIG1zZ2lkOiBzdHIsIHN5bWJvbDogc3RyKSAtPiBOb25lOgorICAgICAgICBleGlzdGluZ19tc2dpZDogT3B0aW9uYWxbc3RyXSA9IHNlbGYuX19zeW1ib2xfdG9fbXNnaWQuZ2V0KHN5bWJvbCkKKyAgICAgICAgZXhpc3Rpbmdfc3ltYm9sOiBPcHRpb25hbFtzdHJdID0gc2VsZi5fX21zZ2lkX3RvX3N5bWJvbC5nZXQobXNnaWQpCisgICAgICAgIGlmIGV4aXN0aW5nX3N5bWJvbCBpcyBOb25lIGFuZCBleGlzdGluZ19tc2dpZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICAjIGJvdGggc3ltYm9sIGFuZCBtc2dpZCBhcmUgdXNhYmxlCisgICAgICAgIGlmIGV4aXN0aW5nX21zZ2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgZXhpc3RpbmdfbXNnaWQgIT0gbXNnaWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcmFpc2VfZHVwbGljYXRlX21zZ2lkKHN5bWJvbCwgbXNnaWQsIGV4aXN0aW5nX21zZ2lkKQorICAgICAgICBpZiBleGlzdGluZ19zeW1ib2wgIT0gc3ltYm9sOgorICAgICAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9teXB5L2lzc3Vlcy8xMDU1OQorICAgICAgICAgICAgc2VsZi5fcmFpc2VfZHVwbGljYXRlX3N5bWJvbChtc2dpZCwgc3ltYm9sLCBleGlzdGluZ19zeW1ib2wpICAjIHR5cGU6IGlnbm9yZQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfcmFpc2VfZHVwbGljYXRlX3N5bWJvbChtc2dpZDogc3RyLCBzeW1ib2w6IHN0ciwgb3RoZXJfc3ltYm9sOiBzdHIpOgorICAgICAgICAiIiJSYWlzZSBhbiBlcnJvciB3aGVuIGEgc3ltYm9sIGlzIGR1cGxpY2F0ZWQuIiIiCisgICAgICAgIHN5bWJvbHMgPSBbc3ltYm9sLCBvdGhlcl9zeW1ib2xdCisgICAgICAgIHN5bWJvbHMuc29ydCgpCisgICAgICAgIGVycm9yX21lc3NhZ2UgPSBmIk1lc3NhZ2UgaWQgJ3ttc2dpZH0nIGNhbm5vdCBoYXZlIGJvdGggIgorICAgICAgICBlcnJvcl9tZXNzYWdlICs9IGYiJ3tzeW1ib2xzWzBdfScgYW5kICd7c3ltYm9sc1sxXX0nIGFzIHN5bWJvbGljIG5hbWUuIgorICAgICAgICByYWlzZSBJbnZhbGlkTWVzc2FnZUVycm9yKGVycm9yX21lc3NhZ2UpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9yYWlzZV9kdXBsaWNhdGVfbXNnaWQoc3ltYm9sOiBzdHIsIG1zZ2lkOiBzdHIsIG90aGVyX21zZ2lkOiBzdHIpIC0+IE5vbmU6CisgICAgICAgICIiIlJhaXNlIGFuIGVycm9yIHdoZW4gYSBtc2dpZCBpcyBkdXBsaWNhdGVkLiIiIgorICAgICAgICBtc2dpZHMgPSBbbXNnaWQsIG90aGVyX21zZ2lkXQorICAgICAgICBtc2dpZHMuc29ydCgpCisgICAgICAgIGVycm9yX21lc3NhZ2UgPSAoCisgICAgICAgICAgICBmIk1lc3NhZ2Ugc3ltYm9sICd7c3ltYm9sfScgY2Fubm90IGJlIHVzZWQgZm9yICIKKyAgICAgICAgICAgIGYiJ3ttc2dpZHNbMF19JyBhbmQgJ3ttc2dpZHNbMV19JyBhdCB0aGUgc2FtZSB0aW1lLiIKKyAgICAgICAgICAgIGYiIElmIHlvdSdyZSBjcmVhdGluZyBhbiAnb2xkX25hbWVzJyB1c2UgJ29sZC17c3ltYm9sfScgYXMgdGhlIG9sZCBzeW1ib2wuIgorICAgICAgICApCisgICAgICAgIHJhaXNlIEludmFsaWRNZXNzYWdlRXJyb3IoZXJyb3JfbWVzc2FnZSkKKworICAgIGRlZiBnZXRfYWN0aXZlX21zZ2lkcyhzZWxmLCBtc2dpZF9vcl9zeW1ib2w6IHN0cikgLT4gTGlzdFtzdHJdOgorICAgICAgICAiIiJSZXR1cm4gbXNnaWRzIGJ1dCB0aGUgaW5wdXQgY2FuIGJlIGEgc3ltYm9sLiIiIgorICAgICAgICAjIE9ubHkgbXNnaWQgY2FuIGhhdmUgYSBkaWdpdCBhcyBzZWNvbmQgbGV0dGVyCisgICAgICAgIGlzX21zZ2lkOiBib29sID0gbXNnaWRfb3Jfc3ltYm9sWzE6XS5pc2RpZ2l0KCkKKyAgICAgICAgaWYgaXNfbXNnaWQ6CisgICAgICAgICAgICBtc2dpZCA9IG1zZ2lkX29yX3N5bWJvbC51cHBlcigpCisgICAgICAgICAgICBzeW1ib2wgPSBzZWxmLl9fbXNnaWRfdG9fc3ltYm9sLmdldChtc2dpZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZ2lkID0gc2VsZi5fX3N5bWJvbF90b19tc2dpZC5nZXQobXNnaWRfb3Jfc3ltYm9sKSAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICAgICAgIHN5bWJvbCA9IG1zZ2lkX29yX3N5bWJvbAorICAgICAgICBpZiBtc2dpZCBpcyBOb25lIG9yIHN5bWJvbCBpcyBOb25lIG9yIG5vdCBtc2dpZCBvciBub3Qgc3ltYm9sOgorICAgICAgICAgICAgZXJyb3JfbXNnID0gZiJObyBzdWNoIG1lc3NhZ2UgaWQgb3Igc3ltYm9sICd7bXNnaWRfb3Jfc3ltYm9sfScuIgorICAgICAgICAgICAgcmFpc2UgVW5rbm93bk1lc3NhZ2VFcnJvcihlcnJvcl9tc2cpCisgICAgICAgIHJldHVybiBzZWxmLl9fb2xkX25hbWVzLmdldChtc2dpZCwgW21zZ2lkXSkKZGlmZiAtLWdpdCBhL3B5bGludC9weXJldmVyc2UvX19pbml0X18ucHkgYi9weWxpbnQvcHlyZXZlcnNlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTc2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcHlyZXZlcnNlL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsOCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiIKK3B5cmV2ZXJzZS5leHRlbnNpb25zCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCAkIgpkaWZmIC0tZ2l0IGEvcHlsaW50L3B5cmV2ZXJzZS9kaWFkZWZzbGliLnB5IGIvcHlsaW50L3B5cmV2ZXJzZS9kaWFkZWZzbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODAzYzkKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcHlyZXZlcnNlL2RpYWRlZnNsaWIucHkKQEAgLTAsMCArMSwyMzkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBGbG9yaWFuIEJydWhpbiA8bWVAdGhlLWNvbXBpbGVyLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJoYW5kbGUgZGlhZ3JhbSBnZW5lcmF0aW9uIG9wdGlvbnMgZm9yIGNsYXNzIGRpYWdyYW0gb3IgZGVmYXVsdCBkaWFncmFtcworIiIiCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LnB5cmV2ZXJzZS5kaWFncmFtcyBpbXBvcnQgQ2xhc3NEaWFncmFtLCBQYWNrYWdlRGlhZ3JhbQorZnJvbSBweWxpbnQucHlyZXZlcnNlLnV0aWxzIGltcG9ydCBMb2NhbHNWaXNpdG9yCisKK0JVSUxUSU5TX05BTUUgPSAiYnVpbHRpbnMiCisKKyMgZGlhZ3JhbSBnZW5lcmF0b3JzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitjbGFzcyBEaWFEZWZHZW5lcmF0b3I6CisgICAgIiIiaGFuZGxlIGRpYWdyYW0gZ2VuZXJhdGlvbiBvcHRpb25zIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGlua2VyLCBoYW5kbGVyKToKKyAgICAgICAgIiIiY29tbW9uIERpYWdyYW0gSGFuZGxlciBpbml0aWFsaXphdGlvbiIiIgorICAgICAgICBzZWxmLmNvbmZpZyA9IGhhbmRsZXIuY29uZmlnCisgICAgICAgIHNlbGYuX3NldF9kZWZhdWx0X29wdGlvbnMoKQorICAgICAgICBzZWxmLmxpbmtlciA9IGxpbmtlcgorICAgICAgICBzZWxmLmNsYXNzZGlhZ3JhbSA9IE5vbmUgICMgZGVmaW5lZCBieSBzdWJjbGFzc2VzCisKKyAgICBkZWYgZ2V0X3RpdGxlKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJnZXQgdGl0bGUgZm9yIG9iamVjdHMiIiIKKyAgICAgICAgdGl0bGUgPSBub2RlLm5hbWUKKyAgICAgICAgaWYgc2VsZi5tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICB0aXRsZSA9IGYie25vZGUucm9vdCgpLm5hbWV9Lnt0aXRsZX0iCisgICAgICAgIHJldHVybiB0aXRsZQorCisgICAgZGVmIF9zZXRfb3B0aW9uKHNlbGYsIG9wdGlvbik6CisgICAgICAgICIiImFjdGl2YXRlIHNvbWUgb3B0aW9ucyBpZiBub3QgZXhwbGljaXRseSBkZWFjdGl2YXRlZCIiIgorICAgICAgICAjIGlmIHdlIGhhdmUgYSBjbGFzcyBkaWFncmFtLCB3ZSB3YW50IG1vcmUgaW5mb3JtYXRpb24gYnkgZGVmYXVsdDsKKyAgICAgICAgIyBzbyBpZiB0aGUgb3B0aW9uIGlzIE5vbmUsIHdlIHJldHVybiBUcnVlCisgICAgICAgIGlmIG9wdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5jb25maWcuY2xhc3NlcykKKyAgICAgICAgcmV0dXJuIG9wdGlvbgorCisgICAgZGVmIF9zZXRfZGVmYXVsdF9vcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJzZXQgZGlmZmVyZW50IGRlZmF1bHQgb3B0aW9ucyB3aXRoIF9kZWZhdWx0IGRpY3Rpb25hcnkiIiIKKyAgICAgICAgc2VsZi5tb2R1bGVfbmFtZXMgPSBzZWxmLl9zZXRfb3B0aW9uKHNlbGYuY29uZmlnLm1vZHVsZV9uYW1lcykKKyAgICAgICAgYWxsX2FuY2VzdG9ycyA9IHNlbGYuX3NldF9vcHRpb24oc2VsZi5jb25maWcuYWxsX2FuY2VzdG9ycykKKyAgICAgICAgYWxsX2Fzc29jaWF0ZWQgPSBzZWxmLl9zZXRfb3B0aW9uKHNlbGYuY29uZmlnLmFsbF9hc3NvY2lhdGVkKQorICAgICAgICBhbmNfbGV2ZWwsIGFzc29jaWF0aW9uX2xldmVsID0gKDAsIDApCisgICAgICAgIGlmIGFsbF9hbmNlc3RvcnM6CisgICAgICAgICAgICBhbmNfbGV2ZWwgPSAtMQorICAgICAgICBpZiBhbGxfYXNzb2NpYXRlZDoKKyAgICAgICAgICAgIGFzc29jaWF0aW9uX2xldmVsID0gLTEKKyAgICAgICAgaWYgc2VsZi5jb25maWcuc2hvd19hbmNlc3RvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhbmNfbGV2ZWwgPSBzZWxmLmNvbmZpZy5zaG93X2FuY2VzdG9ycworICAgICAgICBpZiBzZWxmLmNvbmZpZy5zaG93X2Fzc29jaWF0ZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NvY2lhdGlvbl9sZXZlbCA9IHNlbGYuY29uZmlnLnNob3dfYXNzb2NpYXRlZAorICAgICAgICBzZWxmLmFuY19sZXZlbCwgc2VsZi5hc3NvY2lhdGlvbl9sZXZlbCA9IGFuY19sZXZlbCwgYXNzb2NpYXRpb25fbGV2ZWwKKworICAgIGRlZiBfZ2V0X2xldmVscyhzZWxmKToKKyAgICAgICAgIiIiaGVscCBmdW5jdGlvbiBmb3Igc2VhcmNoIGxldmVscyIiIgorICAgICAgICByZXR1cm4gc2VsZi5hbmNfbGV2ZWwsIHNlbGYuYXNzb2NpYXRpb25fbGV2ZWwKKworICAgIGRlZiBzaG93X25vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInRydWUgaWYgYnVpbHRpbnMgYW5kIG5vdCBzaG93X2J1aWx0aW5zIiIiCisgICAgICAgIGlmIHNlbGYuY29uZmlnLnNob3dfYnVpbHRpbjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBub2RlLnJvb3QoKS5uYW1lICE9IEJVSUxUSU5TX05BTUUKKworICAgIGRlZiBhZGRfY2xhc3Moc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IG9uZSBjbGFzcyBhbmQgYWRkIGl0IHRvIGRpYWdyYW0iIiIKKyAgICAgICAgc2VsZi5saW5rZXIudmlzaXQobm9kZSkKKyAgICAgICAgc2VsZi5jbGFzc2RpYWdyYW0uYWRkX29iamVjdChzZWxmLmdldF90aXRsZShub2RlKSwgbm9kZSkKKworICAgIGRlZiBnZXRfYW5jZXN0b3JzKHNlbGYsIG5vZGUsIGxldmVsKToKKyAgICAgICAgIiIicmV0dXJuIGFuY2VzdG9yIG5vZGVzIG9mIGEgY2xhc3Mgbm9kZSIiIgorICAgICAgICBpZiBsZXZlbCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBhbmNlc3RvciBpbiBub2RlLmFuY2VzdG9ycyhyZWN1cnM9RmFsc2UpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuc2hvd19ub2RlKGFuY2VzdG9yKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWllbGQgYW5jZXN0b3IKKworICAgIGRlZiBnZXRfYXNzb2NpYXRlZChzZWxmLCBrbGFzc19ub2RlLCBsZXZlbCk6CisgICAgICAgICIiInJldHVybiBhc3NvY2lhdGVkIG5vZGVzIG9mIGEgY2xhc3Mgbm9kZSIiIgorICAgICAgICBpZiBsZXZlbCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBhc3NvY2lhdGlvbl9ub2RlcyBpbiBsaXN0KGtsYXNzX25vZGUuaW5zdGFuY2VfYXR0cnNfdHlwZS52YWx1ZXMoKSkgKyBsaXN0KAorICAgICAgICAgICAga2xhc3Nfbm9kZS5sb2NhbHNfdHlwZS52YWx1ZXMoKQorICAgICAgICApOgorICAgICAgICAgICAgZm9yIG5vZGUgaW4gYXNzb2NpYXRpb25fbm9kZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3Ryb2lkLkluc3RhbmNlKToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuX3Byb3hpZWQKKyAgICAgICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5DbGFzc0RlZikgYW5kIHNlbGYuc2hvd19ub2RlKG5vZGUpKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB5aWVsZCBub2RlCisKKyAgICBkZWYgZXh0cmFjdF9jbGFzc2VzKHNlbGYsIGtsYXNzX25vZGUsIGFuY19sZXZlbCwgYXNzb2NpYXRpb25fbGV2ZWwpOgorICAgICAgICAiIiJleHRyYWN0IHJlY3Vyc2l2ZWx5IGNsYXNzZXMgcmVsYXRlZCB0byBrbGFzc19ub2RlIiIiCisgICAgICAgIGlmIHNlbGYuY2xhc3NkaWFncmFtLmhhc19ub2RlKGtsYXNzX25vZGUpIG9yIG5vdCBzZWxmLnNob3dfbm9kZShrbGFzc19ub2RlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFkZF9jbGFzcyhrbGFzc19ub2RlKQorCisgICAgICAgIGZvciBhbmNlc3RvciBpbiBzZWxmLmdldF9hbmNlc3RvcnMoa2xhc3Nfbm9kZSwgYW5jX2xldmVsKToKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdF9jbGFzc2VzKGFuY2VzdG9yLCBhbmNfbGV2ZWwgLSAxLCBhc3NvY2lhdGlvbl9sZXZlbCkKKworICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLmdldF9hc3NvY2lhdGVkKGtsYXNzX25vZGUsIGFzc29jaWF0aW9uX2xldmVsKToKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdF9jbGFzc2VzKG5vZGUsIGFuY19sZXZlbCwgYXNzb2NpYXRpb25fbGV2ZWwgLSAxKQorCisKK2NsYXNzIERlZmF1bHREaWFkZWZHZW5lcmF0b3IoTG9jYWxzVmlzaXRvciwgRGlhRGVmR2VuZXJhdG9yKToKKyAgICAiIiJnZW5lcmF0ZSBtaW5pbXVtIGRpYWdyYW0gZGVmaW5pdGlvbiBmb3IgdGhlIHByb2plY3QgOgorCisgICAgKiBhIHBhY2thZ2UgZGlhZ3JhbSBpbmNsdWRpbmcgcHJvamVjdCdzIG1vZHVsZXMKKyAgICAqIGEgY2xhc3MgZGlhZ3JhbSBpbmNsdWRpbmcgcHJvamVjdCdzIGNsYXNzZXMKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5rZXIsIGhhbmRsZXIpOgorICAgICAgICBEaWFEZWZHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgbGlua2VyLCBoYW5kbGVyKQorICAgICAgICBMb2NhbHNWaXNpdG9yLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgdmlzaXRfcHJvamVjdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgYSBweXJldmVyc2UudXRpbHMuUHJvamVjdCBub2RlCisKKyAgICAgICAgY3JlYXRlIGEgZGlhZ3JhbSBkZWZpbml0aW9uIGZvciBwYWNrYWdlcworICAgICAgICAiIiIKKyAgICAgICAgbW9kZSA9IHNlbGYuY29uZmlnLm1vZGUKKyAgICAgICAgaWYgbGVuKG5vZGUubW9kdWxlcykgPiAxOgorICAgICAgICAgICAgc2VsZi5wa2dkaWFncmFtID0gUGFja2FnZURpYWdyYW0oInBhY2thZ2VzICVzIiAlIG5vZGUubmFtZSwgbW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGtnZGlhZ3JhbSA9IE5vbmUKKyAgICAgICAgc2VsZi5jbGFzc2RpYWdyYW0gPSBDbGFzc0RpYWdyYW0oImNsYXNzZXMgJXMiICUgbm9kZS5uYW1lLCBtb2RlKQorCisgICAgZGVmIGxlYXZlX3Byb2plY3Qoc2VsZiwgbm9kZSk6ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgIiIibGVhdmUgdGhlIHB5cmV2ZXJzZS51dGlscy5Qcm9qZWN0IG5vZGUKKworICAgICAgICByZXR1cm4gdGhlIGdlbmVyYXRlZCBkaWFncmFtIGRlZmluaXRpb24KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYucGtnZGlhZ3JhbToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBrZ2RpYWdyYW0sIHNlbGYuY2xhc3NkaWFncmFtCisgICAgICAgIHJldHVybiAoc2VsZi5jbGFzc2RpYWdyYW0sKQorCisgICAgZGVmIHZpc2l0X21vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgYW4gYXN0cm9pZC5Nb2R1bGUgbm9kZQorCisgICAgICAgIGFkZCB0aGlzIGNsYXNzIHRvIHRoZSBwYWNrYWdlIGRpYWdyYW0gZGVmaW5pdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5wa2dkaWFncmFtOgorICAgICAgICAgICAgc2VsZi5saW5rZXIudmlzaXQobm9kZSkKKyAgICAgICAgICAgIHNlbGYucGtnZGlhZ3JhbS5hZGRfb2JqZWN0KG5vZGUubmFtZSwgbm9kZSkKKworICAgIGRlZiB2aXNpdF9jbGFzc2RlZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgYW4gYXN0cm9pZC5DbGFzcyBub2RlCisKKyAgICAgICAgYWRkIHRoaXMgY2xhc3MgdG8gdGhlIGNsYXNzIGRpYWdyYW0gZGVmaW5pdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgYW5jX2xldmVsLCBhc3NvY2lhdGlvbl9sZXZlbCA9IHNlbGYuX2dldF9sZXZlbHMoKQorICAgICAgICBzZWxmLmV4dHJhY3RfY2xhc3Nlcyhub2RlLCBhbmNfbGV2ZWwsIGFzc29jaWF0aW9uX2xldmVsKQorCisgICAgZGVmIHZpc2l0X2ltcG9ydGZyb20oc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IGFzdHJvaWQuSW1wb3J0RnJvbSAgYW5kIGNhdGNoIG1vZHVsZXMgZm9yIHBhY2thZ2UgZGlhZ3JhbSIiIgorICAgICAgICBpZiBzZWxmLnBrZ2RpYWdyYW06CisgICAgICAgICAgICBzZWxmLnBrZ2RpYWdyYW0uYWRkX2Zyb21fZGVwZW5kKG5vZGUsIG5vZGUubW9kbmFtZSkKKworCitjbGFzcyBDbGFzc0RpYWRlZkdlbmVyYXRvcihEaWFEZWZHZW5lcmF0b3IpOgorICAgICIiImdlbmVyYXRlIGEgY2xhc3MgZGlhZ3JhbSBkZWZpbml0aW9uIGluY2x1ZGluZyBhbGwgY2xhc3NlcyByZWxhdGVkIHRvIGEKKyAgICBnaXZlbiBjbGFzcworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmtlciwgaGFuZGxlcik6CisgICAgICAgIERpYURlZkdlbmVyYXRvci5fX2luaXRfXyhzZWxmLCBsaW5rZXIsIGhhbmRsZXIpCisKKyAgICBkZWYgY2xhc3NfZGlhZ3JhbShzZWxmLCBwcm9qZWN0LCBrbGFzcyk6CisgICAgICAgICIiInJldHVybiBhIGNsYXNzIGRpYWdyYW0gZGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIGtsYXNzIGFuZCBpdHMKKyAgICAgICAgcmVsYXRlZCBrbGFzc2VzCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuY2xhc3NkaWFncmFtID0gQ2xhc3NEaWFncmFtKGtsYXNzLCBzZWxmLmNvbmZpZy5tb2RlKQorICAgICAgICBpZiBsZW4ocHJvamVjdC5tb2R1bGVzKSA+IDE6CisgICAgICAgICAgICBtb2R1bGUsIGtsYXNzID0ga2xhc3MucnNwbGl0KCIuIiwgMSkKKyAgICAgICAgICAgIG1vZHVsZSA9IHByb2plY3QuZ2V0X21vZHVsZShtb2R1bGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2R1bGUgPSBwcm9qZWN0Lm1vZHVsZXNbMF0KKyAgICAgICAgICAgIGtsYXNzID0ga2xhc3Muc3BsaXQoIi4iKVstMV0KKyAgICAgICAga2xhc3MgPSBuZXh0KG1vZHVsZS5pbG9va3VwKGtsYXNzKSkKKworICAgICAgICBhbmNfbGV2ZWwsIGFzc29jaWF0aW9uX2xldmVsID0gc2VsZi5fZ2V0X2xldmVscygpCisgICAgICAgIHNlbGYuZXh0cmFjdF9jbGFzc2VzKGtsYXNzLCBhbmNfbGV2ZWwsIGFzc29jaWF0aW9uX2xldmVsKQorICAgICAgICByZXR1cm4gc2VsZi5jbGFzc2RpYWdyYW0KKworCisjIGRpYWdyYW0gaGFuZGxlciAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgRGlhZGVmc0hhbmRsZXI6CisgICAgIiIiaGFuZGxlIGRpYWdyYW0gZGVmaW5pdGlvbnMgOgorCisgICAgZ2V0IGl0IGZyb20gdXNlciAoaS5lLiB4bWwgZmlsZXMpIG9yIGdlbmVyYXRlIHRoZW0KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgorICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZworCisgICAgZGVmIGdldF9kaWFkZWZzKHNlbGYsIHByb2plY3QsIGxpbmtlcik6CisgICAgICAgICIiIkdldCB0aGUgZGlhZ3JhbXMgY29uZmlndXJhdGlvbiBkYXRhCisKKyAgICAgICAgOnBhcmFtIHByb2plY3Q6VGhlIHB5cmV2ZXJzZSBwcm9qZWN0CisgICAgICAgIDp0eXBlIHByb2plY3Q6IHB5cmV2ZXJzZS51dGlscy5Qcm9qZWN0CisgICAgICAgIDpwYXJhbSBsaW5rZXI6IFRoZSBsaW5rZXIKKyAgICAgICAgOnR5cGUgbGlua2VyOiBweXJldmVyc2UuaW5zcGVjdG9yLkxpbmtlcihJZEdlbmVyYXRvck1peEluLCBMb2NhbHNWaXNpdG9yKQorCisgICAgICAgIDpyZXR1cm5zOiBUaGUgbGlzdCBvZiBkaWFncmFtIGRlZmluaXRpb25zCisgICAgICAgIDpydHlwZTogbGlzdCg6Y2xhc3M6YHB5bGludC5weXJldmVyc2UuZGlhZ3JhbXMuQ2xhc3NEaWFncmFtYCkKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyAgcmVhZCBhbmQgaW50ZXJwcmV0IGRpYWdyYW0gZGVmaW5pdGlvbnMgKERpYWRlZnMpCisgICAgICAgIGRpYWdyYW1zID0gW10KKyAgICAgICAgZ2VuZXJhdG9yID0gQ2xhc3NEaWFkZWZHZW5lcmF0b3IobGlua2VyLCBzZWxmKQorICAgICAgICBmb3Iga2xhc3MgaW4gc2VsZi5jb25maWcuY2xhc3NlczoKKyAgICAgICAgICAgIGRpYWdyYW1zLmFwcGVuZChnZW5lcmF0b3IuY2xhc3NfZGlhZ3JhbShwcm9qZWN0LCBrbGFzcykpCisgICAgICAgIGlmIG5vdCBkaWFncmFtczoKKyAgICAgICAgICAgIGRpYWdyYW1zID0gRGVmYXVsdERpYWRlZkdlbmVyYXRvcihsaW5rZXIsIHNlbGYpLnZpc2l0KHByb2plY3QpCisgICAgICAgIGZvciBkaWFncmFtIGluIGRpYWdyYW1zOgorICAgICAgICAgICAgZGlhZ3JhbS5leHRyYWN0X3JlbGF0aW9uc2hpcHMoKQorICAgICAgICByZXR1cm4gZGlhZ3JhbXMKZGlmZiAtLWdpdCBhL3B5bGludC9weXJldmVyc2UvZGlhZ3JhbXMucHkgYi9weWxpbnQvcHlyZXZlcnNlL2RpYWdyYW1zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOWY2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcHlyZXZlcnNlL2RpYWdyYW1zLnB5CkBAIC0wLDAgKzEsMjU1IEBACisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOC0yMDEwLCAyMDEyLTIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiImRpYWdyYW0gb2JqZWN0cworIiIiCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzLnV0aWxzIGltcG9ydCBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eQorZnJvbSBweWxpbnQucHlyZXZlcnNlLnV0aWxzIGltcG9ydCBGaWx0ZXJNaXhJbiwgaXNfaW50ZXJmYWNlCisKKworY2xhc3MgRmlndXJlOgorICAgICIiImJhc2UgY2xhc3MgZm9yIGNvdW50ZXIgaGFuZGxpbmciIiIKKworCitjbGFzcyBSZWxhdGlvbnNoaXAoRmlndXJlKToKKyAgICAiIiJhIHJlbGF0aW9uIHNoaXAgZnJvbSBhbiBvYmplY3QgaW4gdGhlIGRpYWdyYW0gdG8gYW5vdGhlciIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZyb21fb2JqZWN0LCB0b19vYmplY3QsIHJlbGF0aW9uX3R5cGUsIG5hbWU9Tm9uZSk6CisgICAgICAgIEZpZ3VyZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmZyb21fb2JqZWN0ID0gZnJvbV9vYmplY3QKKyAgICAgICAgc2VsZi50b19vYmplY3QgPSB0b19vYmplY3QKKyAgICAgICAgc2VsZi50eXBlID0gcmVsYXRpb25fdHlwZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKworY2xhc3MgRGlhZ3JhbUVudGl0eShGaWd1cmUpOgorICAgICIiImEgZGlhZ3JhbSBvYmplY3QsIGkuZS4gYSBsYWJlbCBhc3NvY2lhdGVkIHRvIGFuIGFzdHJvaWQgbm9kZSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdGxlPSJObyBuYW1lIiwgbm9kZT1Ob25lKToKKyAgICAgICAgRmlndXJlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisKKworY2xhc3MgQ2xhc3NEaWFncmFtKEZpZ3VyZSwgRmlsdGVyTWl4SW4pOgorICAgICIiIm1haW4gY2xhc3MgZGlhZ3JhbSBoYW5kbGluZyIiIgorCisgICAgVFlQRSA9ICJjbGFzcyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgbW9kZSk6CisgICAgICAgIEZpbHRlck1peEluLl9faW5pdF9fKHNlbGYsIG1vZGUpCisgICAgICAgIEZpZ3VyZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi5vYmplY3RzID0gW10KKyAgICAgICAgc2VsZi5yZWxhdGlvbnNoaXBzID0ge30KKyAgICAgICAgc2VsZi5fbm9kZXMgPSB7fQorICAgICAgICBzZWxmLmRlcGVuZHMgPSBbXQorCisgICAgZGVmIGdldF9yZWxhdGlvbnNoaXBzKHNlbGYsIHJvbGUpOgorICAgICAgICAjIHNvcnRlZCB0byBnZXQgcHJlZGljdGFibGUgKGhlbmNlIHRlc3RhYmxlKSByZXN1bHRzCisgICAgICAgIHJldHVybiBzb3J0ZWQoCisgICAgICAgICAgICBzZWxmLnJlbGF0aW9uc2hpcHMuZ2V0KHJvbGUsICgpKSwKKyAgICAgICAgICAgIGtleT1sYW1iZGEgeDogKHguZnJvbV9vYmplY3QuZmlnX2lkLCB4LnRvX29iamVjdC5maWdfaWQpLAorICAgICAgICApCisKKyAgICBkZWYgYWRkX3JlbGF0aW9uc2hpcChzZWxmLCBmcm9tX29iamVjdCwgdG9fb2JqZWN0LCByZWxhdGlvbl90eXBlLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJjcmVhdGUgYSByZWxhdGlvbiBzaGlwIiIiCisgICAgICAgIHJlbCA9IFJlbGF0aW9uc2hpcChmcm9tX29iamVjdCwgdG9fb2JqZWN0LCByZWxhdGlvbl90eXBlLCBuYW1lKQorICAgICAgICBzZWxmLnJlbGF0aW9uc2hpcHMuc2V0ZGVmYXVsdChyZWxhdGlvbl90eXBlLCBbXSkuYXBwZW5kKHJlbCkKKworICAgIGRlZiBnZXRfcmVsYXRpb25zaGlwKHNlbGYsIGZyb21fb2JqZWN0LCByZWxhdGlvbl90eXBlKToKKyAgICAgICAgIiIicmV0dXJuIGEgcmVsYXRpb24gc2hpcCBvciBOb25lIiIiCisgICAgICAgIGZvciByZWwgaW4gc2VsZi5yZWxhdGlvbnNoaXBzLmdldChyZWxhdGlvbl90eXBlLCAoKSk6CisgICAgICAgICAgICBpZiByZWwuZnJvbV9vYmplY3QgaXMgZnJvbV9vYmplY3Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbAorICAgICAgICByYWlzZSBLZXlFcnJvcihyZWxhdGlvbl90eXBlKQorCisgICAgZGVmIGdldF9hdHRycyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIicmV0dXJuIHZpc2libGUgYXR0cmlidXRlcywgcG9zc2libHkgd2l0aCBjbGFzcyBuYW1lIiIiCisgICAgICAgIGF0dHJzID0gW10KKyAgICAgICAgcHJvcGVydGllcyA9IFsKKyAgICAgICAgICAgIChuLCBtKQorICAgICAgICAgICAgZm9yIG4sIG0gaW4gbm9kZS5pdGVtcygpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG0sIGFzdHJvaWQuRnVuY3Rpb25EZWYpIGFuZCBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eShtKQorICAgICAgICBdCisgICAgICAgIGZvciBub2RlX25hbWUsIGFzc29jaWF0ZWRfbm9kZXMgaW4gKAorICAgICAgICAgICAgbGlzdChub2RlLmluc3RhbmNlX2F0dHJzX3R5cGUuaXRlbXMoKSkKKyAgICAgICAgICAgICsgbGlzdChub2RlLmxvY2Fsc190eXBlLml0ZW1zKCkpCisgICAgICAgICAgICArIHByb3BlcnRpZXMKKyAgICAgICAgKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNob3dfYXR0cihub2RlX25hbWUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBuYW1lcyA9IHNlbGYuY2xhc3NfbmFtZXMoYXNzb2NpYXRlZF9ub2RlcykKKyAgICAgICAgICAgIGlmIG5hbWVzOgorICAgICAgICAgICAgICAgIG5vZGVfbmFtZSA9ICJ7fSA6IHt9Ii5mb3JtYXQobm9kZV9uYW1lLCAiLCAiLmpvaW4obmFtZXMpKQorICAgICAgICAgICAgYXR0cnMuYXBwZW5kKG5vZGVfbmFtZSkKKyAgICAgICAgcmV0dXJuIHNvcnRlZChhdHRycykKKworICAgIGRlZiBnZXRfbWV0aG9kcyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIicmV0dXJuIHZpc2libGUgbWV0aG9kcyIiIgorICAgICAgICBtZXRob2RzID0gWworICAgICAgICAgICAgbQorICAgICAgICAgICAgZm9yIG0gaW4gbm9kZS52YWx1ZXMoKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtLCBhc3Ryb2lkLkZ1bmN0aW9uRGVmKQorICAgICAgICAgICAgYW5kIG5vdCBkZWNvcmF0ZWRfd2l0aF9wcm9wZXJ0eShtKQorICAgICAgICAgICAgYW5kIHNlbGYuc2hvd19hdHRyKG0ubmFtZSkKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gc29ydGVkKG1ldGhvZHMsIGtleT1sYW1iZGEgbjogbi5uYW1lKQorCisgICAgZGVmIGFkZF9vYmplY3Qoc2VsZiwgdGl0bGUsIG5vZGUpOgorICAgICAgICAiIiJjcmVhdGUgYSBkaWFncmFtIG9iamVjdCIiIgorICAgICAgICBhc3NlcnQgbm9kZSBub3QgaW4gc2VsZi5fbm9kZXMKKyAgICAgICAgZW50ID0gRGlhZ3JhbUVudGl0eSh0aXRsZSwgbm9kZSkKKyAgICAgICAgc2VsZi5fbm9kZXNbbm9kZV0gPSBlbnQKKyAgICAgICAgc2VsZi5vYmplY3RzLmFwcGVuZChlbnQpCisKKyAgICBkZWYgY2xhc3NfbmFtZXMoc2VsZiwgbm9kZXMpOgorICAgICAgICAiIiJyZXR1cm4gY2xhc3MgbmFtZXMgaWYgbmVlZGVkIGluIGRpYWdyYW0iIiIKKyAgICAgICAgbmFtZXMgPSBbXQorICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0cm9pZC5JbnN0YW5jZSk6CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuX3Byb3hpZWQKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUsIGFzdHJvaWQuQ2xhc3NEZWYpCisgICAgICAgICAgICAgICAgYW5kIGhhc2F0dHIobm9kZSwgIm5hbWUiKQorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5oYXNfbm9kZShub2RlKQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgbm90IGluIG5hbWVzOgorICAgICAgICAgICAgICAgICAgICBub2RlX25hbWUgPSBub2RlLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMuYXBwZW5kKG5vZGVfbmFtZSkKKyAgICAgICAgcmV0dXJuIG5hbWVzCisKKyAgICBkZWYgbm9kZXMoc2VsZik6CisgICAgICAgICIiInJldHVybiB0aGUgbGlzdCBvZiB1bmRlcmx5aW5nIG5vZGVzIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9ub2Rlcy5rZXlzKCkKKworICAgIGRlZiBoYXNfbm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIicmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5vZGUgaXMgaW5jbHVkZWQgaW4gdGhlIGRpYWdyYW0iIiIKKyAgICAgICAgcmV0dXJuIG5vZGUgaW4gc2VsZi5fbm9kZXMKKworICAgIGRlZiBvYmplY3RfZnJvbV9ub2RlKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJyZXR1cm4gdGhlIGRpYWdyYW0gb2JqZWN0IG1hcHBlZCB0byBub2RlIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9ub2Rlc1tub2RlXQorCisgICAgZGVmIGNsYXNzZXMoc2VsZik6CisgICAgICAgICIiInJldHVybiBhbGwgY2xhc3Mgbm9kZXMgaW4gdGhlIGRpYWdyYW0iIiIKKyAgICAgICAgcmV0dXJuIFtvIGZvciBvIGluIHNlbGYub2JqZWN0cyBpZiBpc2luc3RhbmNlKG8ubm9kZSwgYXN0cm9pZC5DbGFzc0RlZildCisKKyAgICBkZWYgY2xhc3NlKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJyZXR1cm4gYSBjbGFzcyBieSBpdHMgbmFtZSwgcmFpc2UgS2V5RXJyb3IgaWYgbm90IGZvdW5kIiIiCisgICAgICAgIGZvciBrbGFzcyBpbiBzZWxmLmNsYXNzZXMoKToKKyAgICAgICAgICAgIGlmIGtsYXNzLm5vZGUubmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBrbGFzcworICAgICAgICByYWlzZSBLZXlFcnJvcihuYW1lKQorCisgICAgZGVmIGV4dHJhY3RfcmVsYXRpb25zaGlwcyhzZWxmKToKKyAgICAgICAgIiIiZXh0cmFjdCByZWxhdGlvbiBzaGlwcyBiZXR3ZWVuIG5vZGVzIGluIHRoZSBkaWFncmFtIiIiCisgICAgICAgIGZvciBvYmogaW4gc2VsZi5jbGFzc2VzKCk6CisgICAgICAgICAgICBub2RlID0gb2JqLm5vZGUKKyAgICAgICAgICAgIG9iai5hdHRycyA9IHNlbGYuZ2V0X2F0dHJzKG5vZGUpCisgICAgICAgICAgICBvYmoubWV0aG9kcyA9IHNlbGYuZ2V0X21ldGhvZHMobm9kZSkKKyAgICAgICAgICAgICMgc2hhcGUKKyAgICAgICAgICAgIGlmIGlzX2ludGVyZmFjZShub2RlKToKKyAgICAgICAgICAgICAgICBvYmouc2hhcGUgPSAiaW50ZXJmYWNlIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvYmouc2hhcGUgPSAiY2xhc3MiCisgICAgICAgICAgICAjIGluaGVyaXRhbmNlIGxpbmsKKyAgICAgICAgICAgIGZvciBwYXJfbm9kZSBpbiBub2RlLmFuY2VzdG9ycyhyZWN1cnM9RmFsc2UpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGFyX29iaiA9IHNlbGYub2JqZWN0X2Zyb21fbm9kZShwYXJfbm9kZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGRfcmVsYXRpb25zaGlwKG9iaiwgcGFyX29iaiwgInNwZWNpYWxpemF0aW9uIikKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIGltcGxlbWVudHMgbGluaworICAgICAgICAgICAgZm9yIGltcGxfbm9kZSBpbiBub2RlLmltcGxlbWVudHM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbXBsX29iaiA9IHNlbGYub2JqZWN0X2Zyb21fbm9kZShpbXBsX25vZGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX3JlbGF0aW9uc2hpcChvYmosIGltcGxfb2JqLCAiaW1wbGVtZW50cyIpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBhc3NvY2lhdGlvbnMgbGluaworICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlcyBpbiBsaXN0KG5vZGUuaW5zdGFuY2VfYXR0cnNfdHlwZS5pdGVtcygpKSArIGxpc3QoCisgICAgICAgICAgICAgICAgbm9kZS5sb2NhbHNfdHlwZS5pdGVtcygpCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIGFzdHJvaWQuVW5pbmZlcmFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBhc3Ryb2lkLkluc3RhbmNlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuX3Byb3hpZWQKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZF9vYmogPSBzZWxmLm9iamVjdF9mcm9tX25vZGUodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9yZWxhdGlvbnNoaXAoYXNzb2NpYXRlZF9vYmosIG9iaiwgImFzc29jaWF0aW9uIiwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworCitjbGFzcyBQYWNrYWdlRGlhZ3JhbShDbGFzc0RpYWdyYW0pOgorICAgICIiInBhY2thZ2UgZGlhZ3JhbSBoYW5kbGluZyIiIgorCisgICAgVFlQRSA9ICJwYWNrYWdlIgorCisgICAgZGVmIG1vZHVsZXMoc2VsZik6CisgICAgICAgICIiInJldHVybiBhbGwgbW9kdWxlIG5vZGVzIGluIHRoZSBkaWFncmFtIiIiCisgICAgICAgIHJldHVybiBbbyBmb3IgbyBpbiBzZWxmLm9iamVjdHMgaWYgaXNpbnN0YW5jZShvLm5vZGUsIGFzdHJvaWQuTW9kdWxlKV0KKworICAgIGRlZiBtb2R1bGUoc2VsZiwgbmFtZSk6CisgICAgICAgICIiInJldHVybiBhIG1vZHVsZSBieSBpdHMgbmFtZSwgcmFpc2UgS2V5RXJyb3IgaWYgbm90IGZvdW5kIiIiCisgICAgICAgIGZvciBtb2QgaW4gc2VsZi5tb2R1bGVzKCk6CisgICAgICAgICAgICBpZiBtb2Qubm9kZS5uYW1lID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZAorICAgICAgICByYWlzZSBLZXlFcnJvcihuYW1lKQorCisgICAgZGVmIGdldF9tb2R1bGUoc2VsZiwgbmFtZSwgbm9kZSk6CisgICAgICAgICIiInJldHVybiBhIG1vZHVsZSBieSBpdHMgbmFtZSwgbG9va2luZyBhbHNvIGZvciByZWxhdGl2ZSBpbXBvcnRzOworICAgICAgICByYWlzZSBLZXlFcnJvciBpZiBub3QgZm91bmQKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBtb2QgaW4gc2VsZi5tb2R1bGVzKCk6CisgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZC5ub2RlLm5hbWUKKyAgICAgICAgICAgIGlmIG1vZF9uYW1lID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZAorICAgICAgICAgICAgIyBzZWFyY2ggZm9yIGZ1bGxuYW1lIG9mIHJlbGF0aXZlIGltcG9ydCBtb2R1bGVzCisgICAgICAgICAgICBwYWNrYWdlID0gbm9kZS5yb290KCkubmFtZQorICAgICAgICAgICAgaWYgbW9kX25hbWUgPT0gZiJ7cGFja2FnZX0ue25hbWV9IjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kCisgICAgICAgICAgICBpZiBtb2RfbmFtZSA9PSAie30ue30iLmZvcm1hdChwYWNrYWdlLnJzcGxpdCgiLiIsIDEpWzBdLCBuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kCisgICAgICAgIHJhaXNlIEtleUVycm9yKG5hbWUpCisKKyAgICBkZWYgYWRkX2Zyb21fZGVwZW5kKHNlbGYsIG5vZGUsIGZyb21fbW9kdWxlKToKKyAgICAgICAgIiIiYWRkIGRlcGVuZGVuY2llcyBjcmVhdGVkIGJ5IGZyb20taW1wb3J0cyIiIgorICAgICAgICBtb2RfbmFtZSA9IG5vZGUucm9vdCgpLm5hbWUKKyAgICAgICAgb2JqID0gc2VsZi5tb2R1bGUobW9kX25hbWUpCisgICAgICAgIGlmIGZyb21fbW9kdWxlIG5vdCBpbiBvYmoubm9kZS5kZXBlbmRzOgorICAgICAgICAgICAgb2JqLm5vZGUuZGVwZW5kcy5hcHBlbmQoZnJvbV9tb2R1bGUpCisKKyAgICBkZWYgZXh0cmFjdF9yZWxhdGlvbnNoaXBzKHNlbGYpOgorICAgICAgICAiIiJleHRyYWN0IHJlbGF0aW9uIHNoaXBzIGJldHdlZW4gbm9kZXMgaW4gdGhlIGRpYWdyYW0iIiIKKyAgICAgICAgQ2xhc3NEaWFncmFtLmV4dHJhY3RfcmVsYXRpb25zaGlwcyhzZWxmKQorICAgICAgICBmb3Igb2JqIGluIHNlbGYuY2xhc3NlcygpOgorICAgICAgICAgICAgIyBvd25lcnNoaXAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2QgPSBzZWxmLm9iamVjdF9mcm9tX25vZGUob2JqLm5vZGUucm9vdCgpKQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX3JlbGF0aW9uc2hpcChvYmosIG1vZCwgIm93bmVyc2hpcCIpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIG9iaiBpbiBzZWxmLm1vZHVsZXMoKToKKyAgICAgICAgICAgIG9iai5zaGFwZSA9ICJwYWNrYWdlIgorICAgICAgICAgICAgIyBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGZvciBkZXBfbmFtZSBpbiBvYmoubm9kZS5kZXBlbmRzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGVwID0gc2VsZi5nZXRfbW9kdWxlKGRlcF9uYW1lLCBvYmoubm9kZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfcmVsYXRpb25zaGlwKG9iaiwgZGVwLCAiZGVwZW5kcyIpCmRpZmYgLS1naXQgYS9weWxpbnQvcHlyZXZlcnNlL2luc3BlY3Rvci5weSBiL3B5bGludC9weXJldmVyc2UvaW5zcGVjdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTEyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcHlyZXZlcnNlL2luc3BlY3Rvci5weQpAQCAtMCwwICsxLDM1NSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiIKK1Zpc2l0b3IgZG9pbmcgc29tZSBwb3N0cHJvY2Vzc2luZyBvbiB0aGUgYXN0cm9pZCB0cmVlLgorVHJ5IHRvIHJlc29sdmUgZGVmaW5pdGlvbnMgKG5hbWVzcGFjZSkgZGljdGlvbmFyeSwgcmVsYXRpb25zaGlwLi4uCisiIiIKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IG9zCitpbXBvcnQgdHJhY2ViYWNrCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LnB5cmV2ZXJzZSBpbXBvcnQgdXRpbHMKKworCitkZWYgX2lmYWNlX2hkbHIoXyk6CisgICAgIiIiSGFuZGxlciB1c2VkIGJ5IGludGVyZmFjZXMgdG8gaGFuZGxlIHN1c3BpY2lvdXMgaW50ZXJmYWNlIG5vZGVzLiIiIgorICAgIHJldHVybiBUcnVlCisKKworZGVmIF9hc3Ryb2lkX3dyYXBwZXIoZnVuYywgbW9kbmFtZSk6CisgICAgcHJpbnQoInBhcnNpbmcgJXMuLi4iICUgbW9kbmFtZSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBmdW5jKG1vZG5hbWUpCisgICAgZXhjZXB0IGFzdHJvaWQuZXhjZXB0aW9ucy5Bc3Ryb2lkQnVpbGRpbmdFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICBwcmludChleGMpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgcHlsaW50OiBkaXNhYmxlPWJyb2FkLWV4Y2VwdAorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiBpbnRlcmZhY2VzKG5vZGUsIGhlcml0ZWQ9VHJ1ZSwgaGFuZGxlcl9mdW5jPV9pZmFjZV9oZGxyKToKKyAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb24gaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGUgZ2l2ZW4gY2xhc3Mgbm9kZS4iIiIKKyAgICB0cnk6CisgICAgICAgIGltcGxlbWVudHMgPSBhc3Ryb2lkLmJhc2VzLkluc3RhbmNlKG5vZGUpLmdldGF0dHIoIl9faW1wbGVtZW50c19fIilbMF0KKyAgICBleGNlcHQgYXN0cm9pZC5leGNlcHRpb25zLk5vdEZvdW5kRXJyb3I6CisgICAgICAgIHJldHVybgorICAgIGlmIG5vdCBoZXJpdGVkIGFuZCBpbXBsZW1lbnRzLmZyYW1lKCkgaXMgbm90IG5vZGU6CisgICAgICAgIHJldHVybgorICAgIGZvdW5kID0gc2V0KCkKKyAgICBtaXNzaW5nID0gRmFsc2UKKyAgICBmb3IgaWZhY2UgaW4gYXN0cm9pZC5ub2RlX2NsYXNzZXMudW5wYWNrX2luZmVyKGltcGxlbWVudHMpOgorICAgICAgICBpZiBpZmFjZSBpcyBhc3Ryb2lkLlVuaW5mZXJhYmxlOgorICAgICAgICAgICAgbWlzc2luZyA9IFRydWUKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGlmYWNlIG5vdCBpbiBmb3VuZCBhbmQgaGFuZGxlcl9mdW5jKGlmYWNlKToKKyAgICAgICAgICAgIGZvdW5kLmFkZChpZmFjZSkKKyAgICAgICAgICAgIHlpZWxkIGlmYWNlCisgICAgaWYgbWlzc2luZzoKKyAgICAgICAgcmFpc2UgYXN0cm9pZC5leGNlcHRpb25zLkluZmVyZW5jZUVycm9yKCkKKworCitjbGFzcyBJZEdlbmVyYXRvck1peEluOgorICAgICIiIk1peGluIGFkZGluZyB0aGUgYWJpbGl0eSB0byBnZW5lcmF0ZSBpbnRlZ2VyIHVpZC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydF92YWx1ZT0wKToKKyAgICAgICAgc2VsZi5pZF9jb3VudCA9IHN0YXJ0X3ZhbHVlCisKKyAgICBkZWYgaW5pdF9jb3VudGVyKHNlbGYsIHN0YXJ0X3ZhbHVlPTApOgorICAgICAgICAiIiJpbml0IHRoZSBpZCBjb3VudGVyIiIiCisgICAgICAgIHNlbGYuaWRfY291bnQgPSBzdGFydF92YWx1ZQorCisgICAgZGVmIGdlbmVyYXRlX2lkKHNlbGYpOgorICAgICAgICAiIiJnZW5lcmF0ZSBhIG5ldyBpZGVudGlmaWVyIiIiCisgICAgICAgIHNlbGYuaWRfY291bnQgKz0gMQorICAgICAgICByZXR1cm4gc2VsZi5pZF9jb3VudAorCisKK2NsYXNzIExpbmtlcihJZEdlbmVyYXRvck1peEluLCB1dGlscy5Mb2NhbHNWaXNpdG9yKToKKyAgICAiIiJXYWxrIG9uIHRoZSBwcm9qZWN0IHRyZWUgYW5kIHJlc29sdmUgcmVsYXRpb25zaGlwcy4KKworICAgIEFjY29yZGluZyB0byBvcHRpb25zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBtYXkgYmUKKyAgICBhZGRlZCB0byB2aXNpdGVkIG5vZGVzOgorCisgICAgKiB1aWQsCisgICAgICBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbm9kZSAob24gYXN0cm9pZC5Qcm9qZWN0LCBhc3Ryb2lkLk1vZHVsZSwKKyAgICAgIGFzdHJvaWQuQ2xhc3MgYW5kIGFzdHJvaWQubG9jYWxzX3R5cGUpLiBPbmx5IGlmIHRoZSBsaW5rZXIKKyAgICAgIGhhcyBiZWVuIGluc3RhbnRpYXRlZCB3aXRoIHRhZz1UcnVlIHBhcmFtZXRlciAoRmFsc2UgYnkgZGVmYXVsdCkuCisKKyAgICAqIEZ1bmN0aW9uCisgICAgICBhIG1hcHBpbmcgZnJvbSBsb2NhbHMgbmFtZXMgdG8gdGhlaXIgYm91bmRlZCB2YWx1ZSwgd2hpY2ggbWF5IGJlIGEKKyAgICAgIGNvbnN0YW50IGxpa2UgYSBzdHJpbmcgb3IgYW4gaW50ZWdlciwgb3IgYW4gYXN0cm9pZCBub2RlCisgICAgICAob24gYXN0cm9pZC5Nb2R1bGUsIGFzdHJvaWQuQ2xhc3MgYW5kIGFzdHJvaWQuRnVuY3Rpb24pLgorCisgICAgKiBpbnN0YW5jZV9hdHRyc190eXBlCisgICAgICBhcyBsb2NhbHNfdHlwZSBidXQgZm9yIGtsYXNzIG1lbWJlciBhdHRyaWJ1dGVzIChvbmx5IG9uIGFzdHJvaWQuQ2xhc3MpCisKKyAgICAqIGltcGxlbWVudHMsCisgICAgICBsaXN0IG9mIGltcGxlbWVudGVkIGludGVyZmFjZSBfb2JqZWN0c18gKG9ubHkgb24gYXN0cm9pZC5DbGFzcyBub2RlcykKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9qZWN0LCBpbmhlcml0ZWRfaW50ZXJmYWNlcz0wLCB0YWc9RmFsc2UpOgorICAgICAgICBJZEdlbmVyYXRvck1peEluLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHV0aWxzLkxvY2Fsc1Zpc2l0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgIyB0YWtlIGluaGVyaXRlZCBpbnRlcmZhY2UgaW4gY29uc2lkZXJhdGlvbiBvciBub3QKKyAgICAgICAgc2VsZi5pbmhlcml0ZWRfaW50ZXJmYWNlcyA9IGluaGVyaXRlZF9pbnRlcmZhY2VzCisgICAgICAgICMgdGFnIG5vZGVzIG9yIG5vdAorICAgICAgICBzZWxmLnRhZyA9IHRhZworICAgICAgICAjIHZpc2l0ZWQgcHJvamVjdAorICAgICAgICBzZWxmLnByb2plY3QgPSBwcm9qZWN0CisKKyAgICBkZWYgdmlzaXRfcHJvamVjdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgYSBweXJldmVyc2UudXRpbHMuUHJvamVjdCBub2RlCisKKyAgICAgICAgKiBvcHRpb25hbGx5IHRhZyB0aGUgbm9kZSB3aXRoIGEgdW5pcXVlIGlkCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnRhZzoKKyAgICAgICAgICAgIG5vZGUudWlkID0gc2VsZi5nZW5lcmF0ZV9pZCgpCisgICAgICAgIGZvciBtb2R1bGUgaW4gbm9kZS5tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi52aXNpdChtb2R1bGUpCisKKyAgICBkZWYgdmlzaXRfcGFja2FnZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgYW4gYXN0cm9pZC5QYWNrYWdlIG5vZGUKKworICAgICAgICAqIG9wdGlvbmFsbHkgdGFnIHRoZSBub2RlIHdpdGggYSB1bmlxdWUgaWQKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudGFnOgorICAgICAgICAgICAgbm9kZS51aWQgPSBzZWxmLmdlbmVyYXRlX2lkKCkKKyAgICAgICAgZm9yIHN1YmVsbXQgaW4gbm9kZS52YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYudmlzaXQoc3ViZWxtdCkKKworICAgIGRlZiB2aXNpdF9tb2R1bGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IGFuIGFzdHJvaWQuTW9kdWxlIG5vZGUKKworICAgICAgICAqIHNldCB0aGUgbG9jYWxzX3R5cGUgbWFwcGluZworICAgICAgICAqIHNldCB0aGUgZGVwZW5kcyBtYXBwaW5nCisgICAgICAgICogb3B0aW9uYWxseSB0YWcgdGhlIG5vZGUgd2l0aCBhIHVuaXF1ZSBpZAorICAgICAgICAiIiIKKyAgICAgICAgaWYgaGFzYXR0cihub2RlLCAibG9jYWxzX3R5cGUiKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBub2RlLmxvY2Fsc190eXBlID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgbm9kZS5kZXBlbmRzID0gW10KKyAgICAgICAgaWYgc2VsZi50YWc6CisgICAgICAgICAgICBub2RlLnVpZCA9IHNlbGYuZ2VuZXJhdGVfaWQoKQorCisgICAgZGVmIHZpc2l0X2NsYXNzZGVmKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBhbiBhc3Ryb2lkLkNsYXNzIG5vZGUKKworICAgICAgICAqIHNldCB0aGUgbG9jYWxzX3R5cGUgYW5kIGluc3RhbmNlX2F0dHJzX3R5cGUgbWFwcGluZ3MKKyAgICAgICAgKiBzZXQgdGhlIGltcGxlbWVudHMgbGlzdCBhbmQgYnVpbGQgaXQKKyAgICAgICAgKiBvcHRpb25hbGx5IHRhZyB0aGUgbm9kZSB3aXRoIGEgdW5pcXVlIGlkCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKG5vZGUsICJsb2NhbHNfdHlwZSIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5vZGUubG9jYWxzX3R5cGUgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBpZiBzZWxmLnRhZzoKKyAgICAgICAgICAgIG5vZGUudWlkID0gc2VsZi5nZW5lcmF0ZV9pZCgpCisgICAgICAgICMgcmVzb2x2ZSBhbmNlc3RvcnMKKyAgICAgICAgZm9yIGJhc2VvYmogaW4gbm9kZS5hbmNlc3RvcnMocmVjdXJzPUZhbHNlKToKKyAgICAgICAgICAgIHNwZWNpYWxpemF0aW9ucyA9IGdldGF0dHIoYmFzZW9iaiwgInNwZWNpYWxpemF0aW9ucyIsIFtdKQorICAgICAgICAgICAgc3BlY2lhbGl6YXRpb25zLmFwcGVuZChub2RlKQorICAgICAgICAgICAgYmFzZW9iai5zcGVjaWFsaXphdGlvbnMgPSBzcGVjaWFsaXphdGlvbnMKKyAgICAgICAgIyByZXNvbHZlIGluc3RhbmNlIGF0dHJpYnV0ZXMKKyAgICAgICAgbm9kZS5pbnN0YW5jZV9hdHRyc190eXBlID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgZm9yIGFzc2lnbmF0dHJzIGluIG5vZGUuaW5zdGFuY2VfYXR0cnMudmFsdWVzKCk6CisgICAgICAgICAgICBmb3IgYXNzaWduYXR0ciBpbiBhc3NpZ25hdHRyczoKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3NpZ25hdHRyLCBhc3Ryb2lkLlVua25vd24pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9hc3NpZ25hdHRyX3R5cGUoYXNzaWduYXR0ciwgbm9kZSkKKyAgICAgICAgIyByZXNvbHZlIGltcGxlbWVudGVkIGludGVyZmFjZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBub2RlLmltcGxlbWVudHMgPSBsaXN0KGludGVyZmFjZXMobm9kZSwgc2VsZi5pbmhlcml0ZWRfaW50ZXJmYWNlcykpCisgICAgICAgIGV4Y2VwdCBhc3Ryb2lkLkluZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgbm9kZS5pbXBsZW1lbnRzID0gKCkKKworICAgIGRlZiB2aXNpdF9mdW5jdGlvbmRlZihzZWxmLCBub2RlKToKKyAgICAgICAgIiIidmlzaXQgYW4gYXN0cm9pZC5GdW5jdGlvbiBub2RlCisKKyAgICAgICAgKiBzZXQgdGhlIGxvY2Fsc190eXBlIG1hcHBpbmcKKyAgICAgICAgKiBvcHRpb25hbGx5IHRhZyB0aGUgbm9kZSB3aXRoIGEgdW5pcXVlIGlkCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKG5vZGUsICJsb2NhbHNfdHlwZSIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5vZGUubG9jYWxzX3R5cGUgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBpZiBzZWxmLnRhZzoKKyAgICAgICAgICAgIG5vZGUudWlkID0gc2VsZi5nZW5lcmF0ZV9pZCgpCisKKyAgICBsaW5rX3Byb2plY3QgPSB2aXNpdF9wcm9qZWN0CisgICAgbGlua19tb2R1bGUgPSB2aXNpdF9tb2R1bGUKKyAgICBsaW5rX2NsYXNzID0gdmlzaXRfY2xhc3NkZWYKKyAgICBsaW5rX2Z1bmN0aW9uID0gdmlzaXRfZnVuY3Rpb25kZWYKKworICAgIGRlZiB2aXNpdF9hc3NpZ25uYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBhbiBhc3Ryb2lkLkFzc2lnbk5hbWUgbm9kZQorCisgICAgICAgIGhhbmRsZSBsb2NhbHNfdHlwZQorICAgICAgICAiIiIKKyAgICAgICAgIyBhdm9pZCBkb3VibGUgcGFyc2luZyBkb25lIGJ5IGRpZmZlcmVudCBMaW5rZXJzLnZpc2l0CisgICAgICAgICMgcnVubmluZyBvdmVyIHRoZSBzYW1lIHByb2plY3Q6CisgICAgICAgIGlmIGhhc2F0dHIobm9kZSwgIl9oYW5kbGVkIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbm9kZS5faGFuZGxlZCA9IFRydWUKKyAgICAgICAgaWYgbm9kZS5uYW1lIGluIG5vZGUuZnJhbWUoKToKKyAgICAgICAgICAgIGZyYW1lID0gbm9kZS5mcmFtZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBuYW1lIGhhcyBiZWVuIGRlZmluZWQgYXMgJ2dsb2JhbCcgaW4gdGhlIGZyYW1lIGFuZCBiZWxvbmdzCisgICAgICAgICAgICAjIHRoZXJlLgorICAgICAgICAgICAgZnJhbWUgPSBub2RlLnJvb3QoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihmcmFtZSwgImxvY2Fsc190eXBlIik6CisgICAgICAgICAgICAgICAgIyBJZiB0aGUgZnJhbWUgZG9lc24ndCBoYXZlIGEgbG9jYWxzX3R5cGUgeWV0LAorICAgICAgICAgICAgICAgICMgaXQgbWVhbnMgaXQgd2Fzbid0IHlldCB2aXNpdGVkLiBWaXNpdCBpdCBub3cKKyAgICAgICAgICAgICAgICAjIHRvIGFkZCB3aGF0J3MgbWlzc2luZyBmcm9tIGl0LgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnJhbWUsIGFzdHJvaWQuQ2xhc3NEZWYpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnZpc2l0X2NsYXNzZGVmKGZyYW1lKQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmcmFtZSwgYXN0cm9pZC5GdW5jdGlvbkRlZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmlzaXRfZnVuY3Rpb25kZWYoZnJhbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52aXNpdF9tb2R1bGUoZnJhbWUpCisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBmcmFtZS5sb2NhbHNfdHlwZVtub2RlLm5hbWVdCisgICAgICAgICAgICB2YWx1ZXMgPSBzZXQobm9kZS5pbmZlcigpKQorICAgICAgICAgICAgZnJhbWUubG9jYWxzX3R5cGVbbm9kZS5uYW1lXSA9IGxpc3Qoc2V0KGN1cnJlbnQpIHwgdmFsdWVzKQorICAgICAgICBleGNlcHQgYXN0cm9pZC5JbmZlcmVuY2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgaGFuZGxlX2Fzc2lnbmF0dHJfdHlwZShub2RlLCBwYXJlbnQpOgorICAgICAgICAiIiJoYW5kbGUgYW4gYXN0cm9pZC5hc3NpZ25hdHRyIG5vZGUKKworICAgICAgICBoYW5kbGUgaW5zdGFuY2VfYXR0cnNfdHlwZQorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWVzID0gc2V0KG5vZGUuaW5mZXIoKSkKKyAgICAgICAgICAgIGN1cnJlbnQgPSBzZXQocGFyZW50Lmluc3RhbmNlX2F0dHJzX3R5cGVbbm9kZS5hdHRybmFtZV0pCisgICAgICAgICAgICBwYXJlbnQuaW5zdGFuY2VfYXR0cnNfdHlwZVtub2RlLmF0dHJuYW1lXSA9IGxpc3QoY3VycmVudCB8IHZhbHVlcykKKyAgICAgICAgZXhjZXB0IGFzdHJvaWQuSW5mZXJlbmNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdmlzaXRfaW1wb3J0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJ2aXNpdCBhbiBhc3Ryb2lkLkltcG9ydCBub2RlCisKKyAgICAgICAgcmVzb2x2ZSBtb2R1bGUgZGVwZW5kZW5jaWVzCisgICAgICAgICIiIgorICAgICAgICBjb250ZXh0X2ZpbGUgPSBub2RlLnJvb3QoKS5maWxlCisgICAgICAgIGZvciBuYW1lIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICByZWxhdGl2ZSA9IGFzdHJvaWQubW9kdXRpbHMuaXNfcmVsYXRpdmUobmFtZVswXSwgY29udGV4dF9maWxlKQorICAgICAgICAgICAgc2VsZi5faW1wb3J0ZWRfbW9kdWxlKG5vZGUsIG5hbWVbMF0sIHJlbGF0aXZlKQorCisgICAgZGVmIHZpc2l0X2ltcG9ydGZyb20oc2VsZiwgbm9kZSk6CisgICAgICAgICIiInZpc2l0IGFuIGFzdHJvaWQuSW1wb3J0RnJvbSBub2RlCisKKyAgICAgICAgcmVzb2x2ZSBtb2R1bGUgZGVwZW5kZW5jaWVzCisgICAgICAgICIiIgorICAgICAgICBiYXNlbmFtZSA9IG5vZGUubW9kbmFtZQorICAgICAgICBjb250ZXh0X2ZpbGUgPSBub2RlLnJvb3QoKS5maWxlCisgICAgICAgIGlmIGNvbnRleHRfZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlbGF0aXZlID0gYXN0cm9pZC5tb2R1dGlscy5pc19yZWxhdGl2ZShiYXNlbmFtZSwgY29udGV4dF9maWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVsYXRpdmUgPSBGYWxzZQorICAgICAgICBmb3IgbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgaWYgbmFtZVswXSA9PSAiKiI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgYW5hbHl6ZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gZiJ7YmFzZW5hbWV9LntuYW1lWzBdfSIKKyAgICAgICAgICAgIGlmIGZ1bGxuYW1lLmZpbmQoIi4iKSA+IC0xOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBhc3Ryb2lkLm1vZHV0aWxzLmdldF9tb2R1bGVfcGFydChmdWxsbmFtZSwgY29udGV4dF9maWxlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZ1bGxuYW1lICE9IGJhc2VuYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuX2ltcG9ydGVkX21vZHVsZShub2RlLCBmdWxsbmFtZSwgcmVsYXRpdmUpCisKKyAgICBkZWYgY29tcHV0ZV9tb2R1bGUoc2VsZiwgY29udGV4dF9uYW1lLCBtb2RfcGF0aCk6CisgICAgICAgICIiInJldHVybiB0cnVlIGlmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGFkZGVkIHRvIGRlcGVuZGVuY2llcyIiIgorICAgICAgICBwYWNrYWdlX2RpciA9IG9zLnBhdGguZGlybmFtZShzZWxmLnByb2plY3QucGF0aCkKKyAgICAgICAgaWYgY29udGV4dF9uYW1lID09IG1vZF9wYXRoOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgYXN0cm9pZC5tb2R1dGlscy5pc19zdGFuZGFyZF9tb2R1bGUobW9kX3BhdGgsIChwYWNrYWdlX2RpciwpKToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX2ltcG9ydGVkX21vZHVsZShzZWxmLCBub2RlLCBtb2RfcGF0aCwgcmVsYXRpdmUpOgorICAgICAgICAiIiJOb3RpZnkgYW4gaW1wb3J0ZWQgbW9kdWxlLCB1c2VkIHRvIGFuYWx5emUgZGVwZW5kZW5jaWVzIiIiCisgICAgICAgIG1vZHVsZSA9IG5vZGUucm9vdCgpCisgICAgICAgIGNvbnRleHRfbmFtZSA9IG1vZHVsZS5uYW1lCisgICAgICAgIGlmIHJlbGF0aXZlOgorICAgICAgICAgICAgbW9kX3BhdGggPSAie30ue30iLmZvcm1hdCgiLiIuam9pbihjb250ZXh0X25hbWUuc3BsaXQoIi4iKVs6LTFdKSwgbW9kX3BhdGgpCisgICAgICAgIGlmIHNlbGYuY29tcHV0ZV9tb2R1bGUoY29udGV4dF9uYW1lLCBtb2RfcGF0aCk6CisgICAgICAgICAgICAjIGhhbmRsZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKG1vZHVsZSwgImRlcGVuZHMiKToKKyAgICAgICAgICAgICAgICBtb2R1bGUuZGVwZW5kcyA9IFtdCisgICAgICAgICAgICBtb2RfcGF0aHMgPSBtb2R1bGUuZGVwZW5kcworICAgICAgICAgICAgaWYgbW9kX3BhdGggbm90IGluIG1vZF9wYXRoczoKKyAgICAgICAgICAgICAgICBtb2RfcGF0aHMuYXBwZW5kKG1vZF9wYXRoKQorCisKK2NsYXNzIFByb2plY3Q6CisgICAgIiIiYSBwcm9qZWN0IGhhbmRsZSBhIHNldCBvZiBtb2R1bGVzIC8gcGFja2FnZXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSIiKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnBhdGggPSBOb25lCisgICAgICAgIHNlbGYubW9kdWxlcyA9IFtdCisgICAgICAgIHNlbGYubG9jYWxzID0ge30KKyAgICAgICAgc2VsZi5fX2dldGl0ZW1fXyA9IHNlbGYubG9jYWxzLl9fZ2V0aXRlbV9fCisgICAgICAgIHNlbGYuX19pdGVyX18gPSBzZWxmLmxvY2Fscy5fX2l0ZXJfXworICAgICAgICBzZWxmLnZhbHVlcyA9IHNlbGYubG9jYWxzLnZhbHVlcworICAgICAgICBzZWxmLmtleXMgPSBzZWxmLmxvY2Fscy5rZXlzCisgICAgICAgIHNlbGYuaXRlbXMgPSBzZWxmLmxvY2Fscy5pdGVtcworCisgICAgZGVmIGFkZF9tb2R1bGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubG9jYWxzW25vZGUubmFtZV0gPSBub2RlCisgICAgICAgIHNlbGYubW9kdWxlcy5hcHBlbmQobm9kZSkKKworICAgIGRlZiBnZXRfbW9kdWxlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2NhbHNbbmFtZV0KKworICAgIGRlZiBnZXRfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1vZHVsZXMKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGYiPFByb2plY3Qge3NlbGYubmFtZSFyfSBhdCB7aWQoc2VsZil9ICh7bGVuKHNlbGYubW9kdWxlcyl9IG1vZHVsZXMpPiIKKworCitkZWYgcHJvamVjdF9mcm9tX2ZpbGVzKAorICAgIGZpbGVzLCBmdW5jX3dyYXBwZXI9X2FzdHJvaWRfd3JhcHBlciwgcHJvamVjdF9uYW1lPSJubyBuYW1lIiwgYmxhY2tfbGlzdD0oIkNWUyIsKQorKToKKyAgICAiIiJyZXR1cm4gYSBQcm9qZWN0IGZyb20gYSBsaXN0IG9mIGZpbGVzIG9yIG1vZHVsZXMiIiIKKyAgICAjIGJ1aWxkIHRoZSBwcm9qZWN0IHJlcHJlc2VudGF0aW9uCisgICAgYXN0cm9pZF9tYW5hZ2VyID0gYXN0cm9pZC5tYW5hZ2VyLkFzdHJvaWRNYW5hZ2VyKCkKKyAgICBwcm9qZWN0ID0gUHJvamVjdChwcm9qZWN0X25hbWUpCisgICAgZm9yIHNvbWV0aGluZyBpbiBmaWxlczoKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvbWV0aGluZyk6CisgICAgICAgICAgICBmcGF0aCA9IGFzdHJvaWQubW9kdXRpbHMuZmlsZV9mcm9tX21vZHBhdGgoc29tZXRoaW5nLnNwbGl0KCIuIikpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2Rpcihzb21ldGhpbmcpOgorICAgICAgICAgICAgZnBhdGggPSBvcy5wYXRoLmpvaW4oc29tZXRoaW5nLCAiX19pbml0X18ucHkiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnBhdGggPSBzb21ldGhpbmcKKyAgICAgICAgYXN0ID0gZnVuY193cmFwcGVyKGFzdHJvaWRfbWFuYWdlci5hc3RfZnJvbV9maWxlLCBmcGF0aCkKKyAgICAgICAgaWYgYXN0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBwcm9qZWN0LnBhdGggPSBwcm9qZWN0LnBhdGggb3IgYXN0LmZpbGUKKyAgICAgICAgcHJvamVjdC5hZGRfbW9kdWxlKGFzdCkKKyAgICAgICAgYmFzZV9uYW1lID0gYXN0Lm5hbWUKKyAgICAgICAgIyByZWN1cnNlIGluIHBhY2thZ2UgZXhjZXB0IGlmIF9faW5pdF9fIHdhcyBleHBsaWNpdGx5IGdpdmVuCisgICAgICAgIGlmIGFzdC5wYWNrYWdlIGFuZCBzb21ldGhpbmcuZmluZCgiX19pbml0X18iKSA9PSAtMToKKyAgICAgICAgICAgICMgcmVjdXJzZSBvbiBvdGhlcnMgcGFja2FnZXMgLyBtb2R1bGVzIGlmIHRoaXMgaXMgYSBwYWNrYWdlCisgICAgICAgICAgICBmb3IgZnBhdGggaW4gYXN0cm9pZC5tb2R1dGlscy5nZXRfbW9kdWxlX2ZpbGVzKAorICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShhc3QuZmlsZSksIGJsYWNrX2xpc3QKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgYXN0ID0gZnVuY193cmFwcGVyKGFzdHJvaWRfbWFuYWdlci5hc3RfZnJvbV9maWxlLCBmcGF0aCkKKyAgICAgICAgICAgICAgICBpZiBhc3QgaXMgTm9uZSBvciBhc3QubmFtZSA9PSBiYXNlX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcHJvamVjdC5hZGRfbW9kdWxlKGFzdCkKKyAgICByZXR1cm4gcHJvamVjdApkaWZmIC0tZ2l0IGEvcHlsaW50L3B5cmV2ZXJzZS9tYWluLnB5IGIvcHlsaW50L3B5cmV2ZXJzZS9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmExYzIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcHlyZXZlcnNlL21haW4ucHkKQEAgLTAsMCArMSwyMzEgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAsIDIwMTItMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhhbmRlciBQZXJ2YWtvdiA8ZnJvc3QubnpjcjRAamFnbW9ydC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSwgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgUGV0ZXIgS29sYnVzIDxwZXRlci5rb2xidXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyayBCeXJuZSA8bWJ5cm5lcHIyQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiIKKyAgJXByb2cgW29wdGlvbnNdIDxwYWNrYWdlcz4KKworICBjcmVhdGUgVU1MIGRpYWdyYW1zIGZvciBjbGFzc2VzIGFuZCBtb2R1bGVzIGluIDxwYWNrYWdlcz4KKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCitmcm9tIHB5bGludC5jb25maWcgaW1wb3J0IENvbmZpZ3VyYXRpb25NaXhJbgorZnJvbSBweWxpbnQucHlyZXZlcnNlIGltcG9ydCB3cml0ZXIKK2Zyb20gcHlsaW50LnB5cmV2ZXJzZS5kaWFkZWZzbGliIGltcG9ydCBEaWFkZWZzSGFuZGxlcgorZnJvbSBweWxpbnQucHlyZXZlcnNlLmluc3BlY3RvciBpbXBvcnQgTGlua2VyLCBwcm9qZWN0X2Zyb21fZmlsZXMKK2Zyb20gcHlsaW50LnB5cmV2ZXJzZS51dGlscyBpbXBvcnQgaW5zZXJ0X2RlZmF1bHRfb3B0aW9ucworCitPUFRJT05TID0gKAorICAgICgKKyAgICAgICAgImZpbHRlci1tb2RlIiwKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIHNob3J0PSJmIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9IlBVQl9PTkxZIiwKKyAgICAgICAgICAgIGRlc3Q9Im1vZGUiLAorICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgbWV0YXZhcj0iPG1vZGU+IiwKKyAgICAgICAgICAgIGhlbHA9IiIiZmlsdGVyIGF0dHJpYnV0ZXMgYW5kIGZ1bmN0aW9ucyBhY2NvcmRpbmcgdG8KKyAgICA8bW9kZT4uIENvcnJlY3QgbW9kZXMgYXJlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUFVCX09OTFknIGZpbHRlciBhbGwgbm9uIHB1YmxpYyBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUZBVUxUXSwgZXF1aXZhbGVudCB0byBQUklWQVRFK1NQRUNJQUxfQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBTEwnIG5vIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTUEVDSUFMJyBmaWx0ZXIgUHl0aG9uIHNwZWNpYWwgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPVEhFUicgZmlsdGVyIHByb3RlY3RlZCBhbmQgcHJpdmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIiIiLAorICAgICAgICApLAorICAgICksCisgICAgKAorICAgICAgICAiY2xhc3MiLAorICAgICAgICBkaWN0KAorICAgICAgICAgICAgc2hvcnQ9ImMiLAorICAgICAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAorICAgICAgICAgICAgbWV0YXZhcj0iPGNsYXNzPiIsCisgICAgICAgICAgICBkZXN0PSJjbGFzc2VzIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBoZWxwPSJjcmVhdGUgYSBjbGFzcyBkaWFncmFtIHdpdGggYWxsIGNsYXNzZXMgcmVsYXRlZCB0byA8Y2xhc3M+O1wKKyB0aGlzIHVzZXMgYnkgZGVmYXVsdCB0aGUgb3B0aW9ucyAtQVNteSIsCisgICAgICAgICksCisgICAgKSwKKyAgICAoCisgICAgICAgICJzaG93LWFuY2VzdG9ycyIsCisgICAgICAgIGRpY3QoCisgICAgICAgICAgICBzaG9ydD0iYSIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IjxhbmNlc3Rvcj4iLAorICAgICAgICAgICAgdHlwZT0iaW50IiwKKyAgICAgICAgICAgIGhlbHA9InNob3cgPGFuY2VzdG9yPiBnZW5lcmF0aW9ucyBvZiBhbmNlc3RvciBjbGFzc2VzIG5vdCBpbiA8cHJvamVjdHM+IiwKKyAgICAgICAgKSwKKyAgICApLAorICAgICgKKyAgICAgICAgImFsbC1hbmNlc3RvcnMiLAorICAgICAgICBkaWN0KAorICAgICAgICAgICAgc2hvcnQ9IkEiLAorICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgaGVscD0ic2hvdyBhbGwgYW5jZXN0b3JzIG9mZiBhbGwgY2xhc3NlcyBpbiA8cHJvamVjdHM+IiwKKyAgICAgICAgKSwKKyAgICApLAorICAgICgKKyAgICAgICAgInNob3ctYXNzb2NpYXRlZCIsCisgICAgICAgIGRpY3QoCisgICAgICAgICAgICBzaG9ydD0icyIsCisgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgIG1ldGF2YXI9Ijxhc3NvY2lhdGlvbl9sZXZlbD4iLAorICAgICAgICAgICAgdHlwZT0iaW50IiwKKyAgICAgICAgICAgIGhlbHA9InNob3cgPGFzc29jaWF0aW9uX2xldmVsPiBsZXZlbHMgb2YgYXNzb2NpYXRlZCBjbGFzc2VzIG5vdCBpbiA8cHJvamVjdHM+IiwKKyAgICAgICAgKSwKKyAgICApLAorICAgICgKKyAgICAgICAgImFsbC1hc3NvY2lhdGVkIiwKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIHNob3J0PSJTIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgIGhlbHA9InNob3cgcmVjdXJzaXZlbHkgYWxsIGFzc29jaWF0ZWQgb2ZmIGFsbCBhc3NvY2lhdGVkIGNsYXNzZXMiLAorICAgICAgICApLAorICAgICksCisgICAgKAorICAgICAgICAic2hvdy1idWlsdGluIiwKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIHNob3J0PSJiIiwKKyAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgaGVscD0iaW5jbHVkZSBidWlsdGluIG9iamVjdHMgaW4gcmVwcmVzZW50YXRpb24gb2YgY2xhc3NlcyIsCisgICAgICAgICksCisgICAgKSwKKyAgICAoCisgICAgICAgICJtb2R1bGUtbmFtZXMiLAorICAgICAgICBkaWN0KAorICAgICAgICAgICAgc2hvcnQ9Im0iLAorICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgdHlwZT0ieW4iLAorICAgICAgICAgICAgbWV0YXZhcj0iW3luXSIsCisgICAgICAgICAgICBoZWxwPSJpbmNsdWRlIG1vZHVsZSBuYW1lIGluIHJlcHJlc2VudGF0aW9uIG9mIGNsYXNzZXMiLAorICAgICAgICApLAorICAgICksCisgICAgKAorICAgICAgICAib25seS1jbGFzc25hbWVzIiwKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIHNob3J0PSJrIiwKKyAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgaGVscD0iZG9uJ3Qgc2hvdyBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIGluIHRoZSBjbGFzcyBib3hlczsgXAordGhpcyBkaXNhYmxlcyAtZiB2YWx1ZXMiLAorICAgICAgICApLAorICAgICksCisgICAgKAorICAgICAgICAib3V0cHV0IiwKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIHNob3J0PSJvIiwKKyAgICAgICAgICAgIGRlc3Q9Im91dHB1dF9mb3JtYXQiLAorICAgICAgICAgICAgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICBkZWZhdWx0PSJkb3QiLAorICAgICAgICAgICAgbWV0YXZhcj0iPGZvcm1hdD4iLAorICAgICAgICAgICAgaGVscD0iY3JlYXRlIGEgKi48Zm9ybWF0PiBvdXRwdXQgZmlsZSBpZiBmb3JtYXQgYXZhaWxhYmxlLiIsCisgICAgICAgICksCisgICAgKSwKKyAgICAoCisgICAgICAgICJpZ25vcmUiLAorICAgICAgICB7CisgICAgICAgICAgICAidHlwZSI6ICJjc3YiLAorICAgICAgICAgICAgIm1ldGF2YXIiOiAiPGZpbGVbLGZpbGUuLi5dPiIsCisgICAgICAgICAgICAiZGVzdCI6ICJpZ25vcmVfbGlzdCIsCisgICAgICAgICAgICAiZGVmYXVsdCI6ICgiQ1ZTIiwpLAorICAgICAgICAgICAgImhlbHAiOiAiRmlsZXMgb3IgZGlyZWN0b3JpZXMgdG8gYmUgc2tpcHBlZC4gVGhleSAiCisgICAgICAgICAgICAic2hvdWxkIGJlIGJhc2UgbmFtZXMsIG5vdCBwYXRocy4iLAorICAgICAgICB9LAorICAgICksCisgICAgKAorICAgICAgICAicHJvamVjdCIsCisgICAgICAgIHsKKyAgICAgICAgICAgICJkZWZhdWx0IjogIiIsCisgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAorICAgICAgICAgICAgInNob3J0IjogInAiLAorICAgICAgICAgICAgIm1ldGF2YXIiOiAiPHByb2plY3QgbmFtZT4iLAorICAgICAgICAgICAgImhlbHAiOiAic2V0IHRoZSBwcm9qZWN0IG5hbWUuIiwKKyAgICAgICAgfSwKKyAgICApLAorICAgICgKKyAgICAgICAgIm91dHB1dC1kaXJlY3RvcnkiLAorICAgICAgICB7CisgICAgICAgICAgICAiZGVmYXVsdCI6ICIiLAorICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKKyAgICAgICAgICAgICJzaG9ydCI6ICJkIiwKKyAgICAgICAgICAgICJhY3Rpb24iOiAic3RvcmUiLAorICAgICAgICAgICAgIm1ldGF2YXIiOiAiPG91dHB1dF9kaXJlY3Rvcnk+IiwKKyAgICAgICAgICAgICJoZWxwIjogInNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBwYXRoLiIsCisgICAgICAgIH0sCisgICAgKSwKKykKKworCitkZWYgX2NoZWNrX2dyYXBodml6X2F2YWlsYWJsZShvdXRwdXRfZm9ybWF0KToKKyAgICAiIiJjaGVjayBpZiB3ZSBuZWVkIGdyYXBodml6IGZvciBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdCIiIgorICAgIHRyeToKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFsiZG90IiwgIi1WIl0sIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHByaW50KAorICAgICAgICAgICAgIlRoZSBvdXRwdXQgZm9ybWF0ICclcycgaXMgY3VycmVudGx5IG5vdCBhdmFpbGFibGUuXG4iCisgICAgICAgICAgICAiUGxlYXNlIGluc3RhbGwgJ0dyYXBodml6JyB0byBoYXZlIG90aGVyIG91dHB1dCBmb3JtYXRzICIKKyAgICAgICAgICAgICJ0aGFuICdkb3QnIG9yICd2Y2cnLiIgJSBvdXRwdXRfZm9ybWF0CisgICAgICAgICkKKyAgICAgICAgc3lzLmV4aXQoMzIpCisKKworY2xhc3MgUnVuKENvbmZpZ3VyYXRpb25NaXhJbik6CisgICAgIiIiYmFzZSBjbGFzcyBwcm92aWRpbmcgY29tbW9uIGJlaGF2aW91ciBmb3IgcHlyZXZlcnNlIGNvbW1hbmRzIiIiCisKKyAgICBvcHRpb25zID0gT1BUSU9OUyAgIyB0eXBlOiBpZ25vcmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzKToKKyAgICAgICAgQ29uZmlndXJhdGlvbk1peEluLl9faW5pdF9fKHNlbGYsIHVzYWdlPV9fZG9jX18pCisgICAgICAgIGluc2VydF9kZWZhdWx0X29wdGlvbnMoKQorICAgICAgICBhcmdzID0gc2VsZi5sb2FkX2NvbW1hbmRfbGluZV9jb25maWd1cmF0aW9uKCkKKyAgICAgICAgaWYgc2VsZi5jb25maWcub3V0cHV0X2Zvcm1hdCBub3QgaW4gKCJkb3QiLCAidmNnIik6CisgICAgICAgICAgICBfY2hlY2tfZ3JhcGh2aXpfYXZhaWxhYmxlKHNlbGYuY29uZmlnLm91dHB1dF9mb3JtYXQpCisKKyAgICAgICAgc3lzLmV4aXQoc2VsZi5ydW4oYXJncykpCisKKyAgICBkZWYgcnVuKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJjaGVja2luZyBhcmd1bWVudHMgYW5kIHJ1biBwcm9qZWN0IiIiCisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgcHJpbnQoc2VsZi5oZWxwKCkpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAjIGluc2VydCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBweXRob24gcGF0aCB0byByZWNvZ25pemUKKyAgICAgICAgIyBkZXBlbmRlbmNpZXMgdG8gbG9jYWwgbW9kdWxlcyBldmVuIGlmIGN3ZCBpcyBub3QgaW4gdGhlIFBZVEhPTlBBVEgKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmdldGN3ZCgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9qZWN0ID0gcHJvamVjdF9mcm9tX2ZpbGVzKAorICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lPXNlbGYuY29uZmlnLnByb2plY3QsCisgICAgICAgICAgICAgICAgYmxhY2tfbGlzdD1zZWxmLmNvbmZpZy5pZ25vcmVfbGlzdCwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGxpbmtlciA9IExpbmtlcihwcm9qZWN0LCB0YWc9VHJ1ZSkKKyAgICAgICAgICAgIGhhbmRsZXIgPSBEaWFkZWZzSGFuZGxlcihzZWxmLmNvbmZpZykKKyAgICAgICAgICAgIGRpYWRlZnMgPSBoYW5kbGVyLmdldF9kaWFkZWZzKHByb2plY3QsIGxpbmtlcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5wYXRoLnBvcCgwKQorCisgICAgICAgIGlmIHNlbGYuY29uZmlnLm91dHB1dF9mb3JtYXQgPT0gInZjZyI6CisgICAgICAgICAgICB3cml0ZXIuVkNHV3JpdGVyKHNlbGYuY29uZmlnKS53cml0ZShkaWFkZWZzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGVyLkRvdFdyaXRlcihzZWxmLmNvbmZpZykud3JpdGUoZGlhZGVmcykKKyAgICAgICAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIFJ1bihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS9weWxpbnQvcHlyZXZlcnNlL3V0aWxzLnB5IGIvcHlsaW50L3B5cmV2ZXJzZS91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRkMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3B5cmV2ZXJzZS91dGlscy5weQpAQCAtMCwwICsxLDIxNSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDgsIDIwMTAsIDIwMTMtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxNCBCcmV0dCBDYW5ub24gPGJyZXR0QHB5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIHlldGluZyBsaSA8bGl5dEBpb3MuYWMuY24+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGJlcm5pZSBncmF5IDxiZmdyYXkzQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEFuZHJlYXMgRmlua2xlciA8YW5kaS5maW5rbGVyQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJHZW5lcmljIGNsYXNzZXMvZnVuY3Rpb25zIGZvciBweXJldmVyc2UgY29yZS9leHRlbnNpb25zLiAiIiIKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK1JDRklMRSA9ICIucHlyZXZlcnNlcmMiCisKKworZGVmIGdldF9kZWZhdWx0X29wdGlvbnMoKToKKyAgICAiIiJSZWFkIGNvbmZpZyBmaWxlIGFuZCByZXR1cm4gbGlzdCBvZiBvcHRpb25zLiIiIgorICAgIG9wdGlvbnMgPSBbXQorICAgIGhvbWUgPSBvcy5lbnZpcm9uLmdldCgiSE9NRSIsICIiKQorICAgIGlmIGhvbWU6CisgICAgICAgIHJjZmlsZSA9IG9zLnBhdGguam9pbihob21lLCBSQ0ZJTEUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3BlbihyY2ZpbGUpIGFzIGZpbGVfaGFuZGxlOgorICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBmaWxlX2hhbmRsZS5yZWFkKCkuc3BsaXQoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgICMgaWdub3JlIGlmIG5vIGNvbmZpZyBmaWxlIGZvdW5kCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitkZWYgaW5zZXJ0X2RlZmF1bHRfb3B0aW9ucygpOgorICAgICIiImluc2VydCBkZWZhdWx0IG9wdGlvbnMgdG8gc3lzLmFyZ3YiIiIKKyAgICBvcHRpb25zID0gZ2V0X2RlZmF1bHRfb3B0aW9ucygpCisgICAgb3B0aW9ucy5yZXZlcnNlKCkKKyAgICBmb3IgYXJnIGluIG9wdGlvbnM6CisgICAgICAgIHN5cy5hcmd2Lmluc2VydCgxLCBhcmcpCisKKworIyBhc3Ryb2lkIHV0aWxpdGllcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworU1BFQ0lBTCA9IHJlLmNvbXBpbGUociJeX18oW15cV19dXyopK19fJCIpCitQUklWQVRFID0gcmUuY29tcGlsZShyIl5fXyhfKlteXFdfXSkrXz8kIikKK1BST1RFQ1RFRCA9IHJlLmNvbXBpbGUociJeX1x3KiQiKQorCisKK2RlZiBnZXRfdmlzaWJpbGl0eShuYW1lKToKKyAgICAiIiJyZXR1cm4gdGhlIHZpc2liaWxpdHkgZnJvbSBhIG5hbWU6IHB1YmxpYywgcHJvdGVjdGVkLCBwcml2YXRlIG9yIHNwZWNpYWwiIiIKKyAgICBpZiBTUEVDSUFMLm1hdGNoKG5hbWUpOgorICAgICAgICB2aXNpYmlsaXR5ID0gInNwZWNpYWwiCisgICAgZWxpZiBQUklWQVRFLm1hdGNoKG5hbWUpOgorICAgICAgICB2aXNpYmlsaXR5ID0gInByaXZhdGUiCisgICAgZWxpZiBQUk9URUNURUQubWF0Y2gobmFtZSk6CisgICAgICAgIHZpc2liaWxpdHkgPSAicHJvdGVjdGVkIgorCisgICAgZWxzZToKKyAgICAgICAgdmlzaWJpbGl0eSA9ICJwdWJsaWMiCisgICAgcmV0dXJuIHZpc2liaWxpdHkKKworCitBQlNUUkFDVCA9IHJlLmNvbXBpbGUociJeLipBYnN0cmFjdC4qIikKK0ZJTkFMID0gcmUuY29tcGlsZShyIl5bXlxXXGRhLXpdKiQiKQorCisKK2RlZiBpc19hYnN0cmFjdChub2RlKToKKyAgICAiIiJyZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2xhc3Mgbm9kZSBjb3JyZXNwb25kIHRvIGFuIGFic3RyYWN0IGNsYXNzCisgICAgZGVmaW5pdGlvbgorICAgICIiIgorICAgIHJldHVybiBBQlNUUkFDVC5tYXRjaChub2RlLm5hbWUpCisKKworZGVmIGlzX2ZpbmFsKG5vZGUpOgorICAgICIiInJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjbGFzcy9mdW5jdGlvbiBub2RlIGNvcnJlc3BvbmQgdG8gZmluYWwKKyAgICBkZWZpbml0aW9uCisgICAgIiIiCisgICAgcmV0dXJuIEZJTkFMLm1hdGNoKG5vZGUubmFtZSkKKworCitkZWYgaXNfaW50ZXJmYWNlKG5vZGUpOgorICAgICMgYncgY29tcGF0CisgICAgcmV0dXJuIG5vZGUudHlwZSA9PSAiaW50ZXJmYWNlIgorCisKK2RlZiBpc19leGNlcHRpb24obm9kZSk6CisgICAgIyBidyBjb21wYXQKKyAgICByZXR1cm4gbm9kZS50eXBlID09ICJleGNlcHRpb24iCisKKworIyBIZWxwZXJzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitfQ09OU1RSVUNUT1IgPSAxCitfU1BFQ0lBTCA9IDIKK19QUk9URUNURUQgPSA0CitfUFJJVkFURSA9IDgKK01PREVTID0geworICAgICJBTEwiOiAwLAorICAgICJQVUJfT05MWSI6IF9TUEVDSUFMICsgX1BST1RFQ1RFRCArIF9QUklWQVRFLAorICAgICJTUEVDSUFMIjogX1NQRUNJQUwsCisgICAgIk9USEVSIjogX1BST1RFQ1RFRCArIF9QUklWQVRFLAorfQorVklTX01PRCA9IHsKKyAgICAic3BlY2lhbCI6IF9TUEVDSUFMLAorICAgICJwcm90ZWN0ZWQiOiBfUFJPVEVDVEVELAorICAgICJwcml2YXRlIjogX1BSSVZBVEUsCisgICAgInB1YmxpYyI6IDAsCit9CisKKworY2xhc3MgRmlsdGVyTWl4SW46CisgICAgIiIiZmlsdGVyIG5vZGVzIGFjY29yZGluZyB0byBhIG1vZGUgYW5kIG5vZGVzJyB2aXNpYmlsaXR5IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kZSk6CisgICAgICAgICJpbml0IGZpbHRlciBtb2RlcyIKKyAgICAgICAgX19tb2RlID0gMAorICAgICAgICBmb3IgbnVtbW9kIGluIG1vZGUuc3BsaXQoIisiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX21vZGUgKz0gTU9ERVNbbnVtbW9kXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGV4OgorICAgICAgICAgICAgICAgIHByaW50KCJVbmtub3duIGZpbHRlciBtb2RlICVzIiAlIGV4LCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHNlbGYuX19tb2RlID0gX19tb2RlCisKKyAgICBkZWYgc2hvd19hdHRyKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJyZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCIiIgorICAgICAgICB2aXNpYmlsaXR5ID0gZ2V0X3Zpc2liaWxpdHkoZ2V0YXR0cihub2RlLCAibmFtZSIsIG5vZGUpKQorICAgICAgICByZXR1cm4gbm90IHNlbGYuX19tb2RlICYgVklTX01PRFt2aXNpYmlsaXR5XQorCisKK2NsYXNzIEFTVFdhbGtlcjoKKyAgICAiIiJhIHdhbGtlciB2aXNpdGluZyBhIHRyZWUgaW4gcHJlb3JkZXIsIGNhbGxpbmcgb24gdGhlIGhhbmRsZXI6CisKKyAgICAqIHZpc2l0XzxjbGFzcyBuYW1lPiBvbiBlbnRlcmluZyBhIG5vZGUsIHdoZXJlIGNsYXNzIG5hbWUgaXMgdGhlIGNsYXNzIG9mCisgICAgdGhlIG5vZGUgaW4gbG93ZXIgY2FzZQorCisgICAgKiBsZWF2ZV88Y2xhc3MgbmFtZT4gb24gbGVhdmluZyBhIG5vZGUsIHdoZXJlIGNsYXNzIG5hbWUgaXMgdGhlIGNsYXNzIG9mCisgICAgdGhlIG5vZGUgaW4gbG93ZXIgY2FzZQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgIHNlbGYuX2NhY2hlID0ge30KKworICAgIGRlZiB3YWxrKHNlbGYsIG5vZGUsIF9kb25lPU5vbmUpOgorICAgICAgICAiIiJ3YWxrIG9uIHRoZSB0cmVlIGZyb20gPG5vZGU+LCBnZXR0aW5nIGNhbGxiYWNrcyBmcm9tIGhhbmRsZXIiIiIKKyAgICAgICAgaWYgX2RvbmUgaXMgTm9uZToKKyAgICAgICAgICAgIF9kb25lID0gc2V0KCkKKyAgICAgICAgaWYgbm9kZSBpbiBfZG9uZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKChpZChub2RlKSwgbm9kZSwgbm9kZS5wYXJlbnQpKQorICAgICAgICBfZG9uZS5hZGQobm9kZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlKQorICAgICAgICBmb3IgY2hpbGRfbm9kZSBpbiBub2RlLmdldF9jaGlsZHJlbigpOgorICAgICAgICAgICAgYXNzZXJ0IGNoaWxkX25vZGUgaXMgbm90IG5vZGUKKyAgICAgICAgICAgIHNlbGYud2FsayhjaGlsZF9ub2RlLCBfZG9uZSkKKyAgICAgICAgc2VsZi5sZWF2ZShub2RlKQorICAgICAgICBhc3NlcnQgbm9kZS5wYXJlbnQgaXMgbm90IG5vZGUKKworICAgIGRlZiBnZXRfY2FsbGJhY2tzKHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJnZXQgY2FsbGJhY2tzIGZyb20gaGFuZGxlciBmb3IgdGhlIHZpc2l0ZWQgbm9kZSIiIgorICAgICAgICBrbGFzcyA9IG5vZGUuX19jbGFzc19fCisgICAgICAgIG1ldGhvZHMgPSBzZWxmLl9jYWNoZS5nZXQoa2xhc3MpCisgICAgICAgIGlmIG1ldGhvZHMgaXMgTm9uZToKKyAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmhhbmRsZXIKKyAgICAgICAgICAgIGtpZCA9IGtsYXNzLl9fbmFtZV9fLmxvd2VyKCkKKyAgICAgICAgICAgIGVfbWV0aG9kID0gZ2V0YXR0cigKKyAgICAgICAgICAgICAgICBoYW5kbGVyLCAidmlzaXRfJXMiICUga2lkLCBnZXRhdHRyKGhhbmRsZXIsICJ2aXNpdF9kZWZhdWx0IiwgTm9uZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGxfbWV0aG9kID0gZ2V0YXR0cigKKyAgICAgICAgICAgICAgICBoYW5kbGVyLCAibGVhdmVfJXMiICUga2lkLCBnZXRhdHRyKGhhbmRsZXIsICJsZWF2ZV9kZWZhdWx0IiwgTm9uZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuX2NhY2hlW2tsYXNzXSA9IChlX21ldGhvZCwgbF9tZXRob2QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlX21ldGhvZCwgbF9tZXRob2QgPSBtZXRob2RzCisgICAgICAgIHJldHVybiBlX21ldGhvZCwgbF9tZXRob2QKKworICAgIGRlZiB2aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIid2FsayBvbiB0aGUgdHJlZSBmcm9tIDxub2RlPiwgZ2V0dGluZyBjYWxsYmFja3MgZnJvbSBoYW5kbGVyIiIiCisgICAgICAgIG1ldGhvZCA9IHNlbGYuZ2V0X2NhbGxiYWNrcyhub2RlKVswXQorICAgICAgICBpZiBtZXRob2QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtZXRob2Qobm9kZSkKKworICAgIGRlZiBsZWF2ZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIid2FsayBvbiB0aGUgdHJlZSBmcm9tIDxub2RlPiwgZ2V0dGluZyBjYWxsYmFja3MgZnJvbSBoYW5kbGVyIiIiCisgICAgICAgIG1ldGhvZCA9IHNlbGYuZ2V0X2NhbGxiYWNrcyhub2RlKVsxXQorICAgICAgICBpZiBtZXRob2QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtZXRob2Qobm9kZSkKKworCitjbGFzcyBMb2NhbHNWaXNpdG9yKEFTVFdhbGtlcik6CisgICAgIiIidmlzaXQgYSBwcm9qZWN0IGJ5IHRyYXZlcnNpbmcgdGhlIGxvY2FscyBkaWN0aW9uYXJ5IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEFTVFdhbGtlci5fX2luaXRfXyhzZWxmLCBzZWxmKQorICAgICAgICBzZWxmLl92aXNpdGVkID0gc2V0KCkKKworICAgIGRlZiB2aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIibGF1bmNoIHRoZSB2aXNpdCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBub2RlIiIiCisgICAgICAgIGlmIG5vZGUgaW4gc2VsZi5fdmlzaXRlZDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgc2VsZi5fdmlzaXRlZC5hZGQobm9kZSkKKyAgICAgICAgbWV0aG9kcyA9IHNlbGYuZ2V0X2NhbGxiYWNrcyhub2RlKQorICAgICAgICBpZiBtZXRob2RzWzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbWV0aG9kc1swXShub2RlKQorICAgICAgICBpZiBoYXNhdHRyKG5vZGUsICJsb2NhbHMiKTogICMgc2tpcCBJbnN0YW5jZSBhbmQgb3RoZXIgcHJveHkKKyAgICAgICAgICAgIGZvciBsb2NhbF9ub2RlIGluIG5vZGUudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChsb2NhbF9ub2RlKQorICAgICAgICBpZiBtZXRob2RzWzFdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHNbMV0obm9kZSkKKyAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL3B5bGludC9weXJldmVyc2UvdmNndXRpbHMucHkgYi9weWxpbnQvcHlyZXZlcnNlL3ZjZ3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTkzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcHlyZXZlcnNlL3ZjZ3V0aWxzLnB5CkBAIC0wLDAgKzEsMjI0IEBACisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxOCBzc29sYW5raSA8c3VzaG9iaGl0c29sYW5raUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgUmFtIFJhY2h1bSA8cmFtQHJhY2h1bS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCDosK3kuZ3pvI4gPDEwOTIyNDU3M0BxcS5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJGdW5jdGlvbnMgdG8gZ2VuZXJhdGUgZmlsZXMgcmVhZGFibGUgd2l0aCBHZW9yZyBTYW5kZXIncyB2Y2cKKyhWaXN1YWxpemF0aW9uIG9mIENvbXBpbGVyIEdyYXBocykuCisKK1lvdSBjYW4gZG93bmxvYWQgdmNnIGF0IGh0dHBzOi8vcnc0LmNzLnVuaS1zYi5kZS9+c2FuZGVyL2h0bWwvZ3Nob21lLmh0bWwKK05vdGUgdGhhdCB2Y2cgZXhpc3RzIGFzIGEgZGViaWFuIHBhY2thZ2UuCisKK1NlZSB2Y2cncyBkb2N1bWVudGF0aW9uIGZvciBleHBsYW5hdGlvbiBhYm91dCB0aGUgZGlmZmVyZW50IHZhbHVlcyB0aGF0CittYXliZSB1c2VkIGZvciB0aGUgZnVuY3Rpb25zIHBhcmFtZXRlcnMuCisiIiIKKworQVRUUlNfVkFMID0geworICAgICJhbGdvcyI6ICgKKyAgICAgICAgImRmcyIsCisgICAgICAgICJ0cmVlIiwKKyAgICAgICAgIm1pbmJhY2t3YXJkIiwKKyAgICAgICAgImxlZnRfdG9fcmlnaHQiLAorICAgICAgICAicmlnaHRfdG9fbGVmdCIsCisgICAgICAgICJ0b3BfdG9fYm90dG9tIiwKKyAgICAgICAgImJvdHRvbV90b190b3AiLAorICAgICAgICAibWF4ZGVwdGgiLAorICAgICAgICAibWF4ZGVwdGhzbG93IiwKKyAgICAgICAgIm1pbmRlcHRoIiwKKyAgICAgICAgIm1pbmRlcHRoc2xvdyIsCisgICAgICAgICJtaW5kZWdyZWUiLAorICAgICAgICAibWluaW5kZWdyZWUiLAorICAgICAgICAibWlub3V0ZGVncmVlIiwKKyAgICAgICAgIm1heGRlZ3JlZSIsCisgICAgICAgICJtYXhpbmRlZ3JlZSIsCisgICAgICAgICJtYXhvdXRkZWdyZWUiLAorICAgICksCisgICAgImJvb2xlYW5zIjogKCJ5ZXMiLCAibm8iKSwKKyAgICAiY29sb3JzIjogKAorICAgICAgICAiYmxhY2siLAorICAgICAgICAid2hpdGUiLAorICAgICAgICAiYmx1ZSIsCisgICAgICAgICJyZWQiLAorICAgICAgICAiZ3JlZW4iLAorICAgICAgICAieWVsbG93IiwKKyAgICAgICAgIm1hZ2VudGEiLAorICAgICAgICAibGlnaHRncmV5IiwKKyAgICAgICAgImN5YW4iLAorICAgICAgICAiZGFya2dyZXkiLAorICAgICAgICAiZGFya2JsdWUiLAorICAgICAgICAiZGFya3JlZCIsCisgICAgICAgICJkYXJrZ3JlZW4iLAorICAgICAgICAiZGFya3llbGxvdyIsCisgICAgICAgICJkYXJrbWFnZW50YSIsCisgICAgICAgICJkYXJrY3lhbiIsCisgICAgICAgICJnb2xkIiwKKyAgICAgICAgImxpZ2h0Ymx1ZSIsCisgICAgICAgICJsaWdodHJlZCIsCisgICAgICAgICJsaWdodGdyZWVuIiwKKyAgICAgICAgImxpZ2h0eWVsbG93IiwKKyAgICAgICAgImxpZ2h0bWFnZW50YSIsCisgICAgICAgICJsaWdodGN5YW4iLAorICAgICAgICAibGlsYWMiLAorICAgICAgICAidHVycXVvaXNlIiwKKyAgICAgICAgImFxdWFtYXJpbmUiLAorICAgICAgICAia2hha2kiLAorICAgICAgICAicHVycGxlIiwKKyAgICAgICAgInllbGxvd2dyZWVuIiwKKyAgICAgICAgInBpbmsiLAorICAgICAgICAib3JhbmdlIiwKKyAgICAgICAgIm9yY2hpZCIsCisgICAgKSwKKyAgICAic2hhcGVzIjogKCJib3giLCAiZWxsaXBzZSIsICJyaG9tYiIsICJ0cmlhbmdsZSIpLAorICAgICJ0ZXh0bW9kZXMiOiAoImNlbnRlciIsICJsZWZ0X2p1c3RpZnkiLCAicmlnaHRfanVzdGlmeSIpLAorICAgICJhcnJvd3N0eWxlcyI6ICgic29saWQiLCAibGluZSIsICJub25lIiksCisgICAgImxpbmVzdHlsZXMiOiAoImNvbnRpbnVvdXMiLCAiZGFzaGVkIiwgImRvdHRlZCIsICJpbnZpc2libGUiKSwKK30KKworIyBtZWFuaW5nIG9mIHBvc3NpYmxlIHZhbHVlczoKKyMgICBPICAgIC0+IHN0cmluZworIyAgIDEgICAgLT4gaW50CisjICAgbGlzdCAtPiB2YWx1ZSBpbiBsaXN0CitHUkFQSF9BVFRSUyA9IHsKKyAgICAidGl0bGUiOiAwLAorICAgICJsYWJlbCI6IDAsCisgICAgImNvbG9yIjogQVRUUlNfVkFMWyJjb2xvcnMiXSwKKyAgICAidGV4dGNvbG9yIjogQVRUUlNfVkFMWyJjb2xvcnMiXSwKKyAgICAiYm9yZGVyY29sb3IiOiBBVFRSU19WQUxbImNvbG9ycyJdLAorICAgICJ3aWR0aCI6IDEsCisgICAgImhlaWdodCI6IDEsCisgICAgImJvcmRlcndpZHRoIjogMSwKKyAgICAidGV4dG1vZGUiOiBBVFRSU19WQUxbInRleHRtb2RlcyJdLAorICAgICJzaGFwZSI6IEFUVFJTX1ZBTFsic2hhcGVzIl0sCisgICAgInNocmluayI6IDEsCisgICAgInN0cmV0Y2giOiAxLAorICAgICJvcmllbnRhdGlvbiI6IEFUVFJTX1ZBTFsiYWxnb3MiXSwKKyAgICAidmVydGljYWxfb3JkZXIiOiAxLAorICAgICJob3Jpem9udGFsX29yZGVyIjogMSwKKyAgICAieHNwYWNlIjogMSwKKyAgICAieXNwYWNlIjogMSwKKyAgICAibGF5b3V0YWxnb3JpdGhtIjogQVRUUlNfVkFMWyJhbGdvcyJdLAorICAgICJsYXRlX2VkZ2VfbGFiZWxzIjogQVRUUlNfVkFMWyJib29sZWFucyJdLAorICAgICJkaXNwbGF5X2VkZ2VfbGFiZWxzIjogQVRUUlNfVkFMWyJib29sZWFucyJdLAorICAgICJkaXJ0eV9lZGdlX2xhYmVscyI6IEFUVFJTX1ZBTFsiYm9vbGVhbnMiXSwKKyAgICAiZmluZXR1bmluZyI6IEFUVFJTX1ZBTFsiYm9vbGVhbnMiXSwKKyAgICAibWFuaGF0dGFuX2VkZ2VzIjogQVRUUlNfVkFMWyJib29sZWFucyJdLAorICAgICJzbWFuaGF0dGFuX2VkZ2VzIjogQVRUUlNfVkFMWyJib29sZWFucyJdLAorICAgICJwb3J0X3NoYXJpbmciOiBBVFRSU19WQUxbImJvb2xlYW5zIl0sCisgICAgImVkZ2VzIjogQVRUUlNfVkFMWyJib29sZWFucyJdLAorICAgICJub2RlcyI6IEFUVFJTX1ZBTFsiYm9vbGVhbnMiXSwKKyAgICAic3BsaW5lcyI6IEFUVFJTX1ZBTFsiYm9vbGVhbnMiXSwKK30KK05PREVfQVRUUlMgPSB7CisgICAgInRpdGxlIjogMCwKKyAgICAibGFiZWwiOiAwLAorICAgICJjb2xvciI6IEFUVFJTX1ZBTFsiY29sb3JzIl0sCisgICAgInRleHRjb2xvciI6IEFUVFJTX1ZBTFsiY29sb3JzIl0sCisgICAgImJvcmRlcmNvbG9yIjogQVRUUlNfVkFMWyJjb2xvcnMiXSwKKyAgICAid2lkdGgiOiAxLAorICAgICJoZWlnaHQiOiAxLAorICAgICJib3JkZXJ3aWR0aCI6IDEsCisgICAgInRleHRtb2RlIjogQVRUUlNfVkFMWyJ0ZXh0bW9kZXMiXSwKKyAgICAic2hhcGUiOiBBVFRSU19WQUxbInNoYXBlcyJdLAorICAgICJzaHJpbmsiOiAxLAorICAgICJzdHJldGNoIjogMSwKKyAgICAidmVydGljYWxfb3JkZXIiOiAxLAorICAgICJob3Jpem9udGFsX29yZGVyIjogMSwKK30KK0VER0VfQVRUUlMgPSB7CisgICAgInNvdXJjZW5hbWUiOiAwLAorICAgICJ0YXJnZXRuYW1lIjogMCwKKyAgICAibGFiZWwiOiAwLAorICAgICJsaW5lc3R5bGUiOiBBVFRSU19WQUxbImxpbmVzdHlsZXMiXSwKKyAgICAiY2xhc3MiOiAxLAorICAgICJ0aGlja25lc3MiOiAwLAorICAgICJjb2xvciI6IEFUVFJTX1ZBTFsiY29sb3JzIl0sCisgICAgInRleHRjb2xvciI6IEFUVFJTX1ZBTFsiY29sb3JzIl0sCisgICAgImFycm93Y29sb3IiOiBBVFRSU19WQUxbImNvbG9ycyJdLAorICAgICJiYWNrYXJyb3djb2xvciI6IEFUVFJTX1ZBTFsiY29sb3JzIl0sCisgICAgImFycm93c2l6ZSI6IDEsCisgICAgImJhY2thcnJvd3NpemUiOiAxLAorICAgICJhcnJvd3N0eWxlIjogQVRUUlNfVkFMWyJhcnJvd3N0eWxlcyJdLAorICAgICJiYWNrYXJyb3dzdHlsZSI6IEFUVFJTX1ZBTFsiYXJyb3dzdHlsZXMiXSwKKyAgICAidGV4dG1vZGUiOiBBVFRSU19WQUxbInRleHRtb2RlcyJdLAorICAgICJwcmlvcml0eSI6IDEsCisgICAgImFuY2hvciI6IDEsCisgICAgImhvcml6b250YWxfb3JkZXIiOiAxLAorfQorCisKKyMgTWlzYyB1dGlsaXRpZXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgVkNHUHJpbnRlcjoKKyAgICAiIiJBIHZjZyBncmFwaCB3cml0ZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0cHV0X3N0cmVhbSk6CisgICAgICAgIHNlbGYuX3N0cmVhbSA9IG91dHB1dF9zdHJlYW0KKyAgICAgICAgc2VsZi5faW5kZW50ID0gIiIKKworICAgIGRlZiBvcGVuX2dyYXBoKHNlbGYsICoqYXJncyk6CisgICAgICAgICIiIm9wZW4gYSB2Y2cgZ3JhcGgiIiIKKyAgICAgICAgc2VsZi5fc3RyZWFtLndyaXRlKCIlc2dyYXBoOntcbiIgJSBzZWxmLl9pbmRlbnQpCisgICAgICAgIHNlbGYuX2luY19pbmRlbnQoKQorICAgICAgICBzZWxmLl93cml0ZV9hdHRyaWJ1dGVzKEdSQVBIX0FUVFJTLCAqKmFyZ3MpCisKKyAgICBkZWYgY2xvc2VfZ3JhcGgoc2VsZik6CisgICAgICAgICIiImNsb3NlIGEgdmNnIGdyYXBoIiIiCisgICAgICAgIHNlbGYuX2RlY19pbmRlbnQoKQorICAgICAgICBzZWxmLl9zdHJlYW0ud3JpdGUoIiVzfVxuIiAlIHNlbGYuX2luZGVudCkKKworICAgIGRlZiBub2RlKHNlbGYsIHRpdGxlLCAqKmFyZ3MpOgorICAgICAgICAiIiJkcmF3IGEgbm9kZSIiIgorICAgICAgICBzZWxmLl9zdHJlYW0ud3JpdGUoZid7c2VsZi5faW5kZW50fW5vZGU6IHt7dGl0bGU6Int0aXRsZX0iJykKKyAgICAgICAgc2VsZi5fd3JpdGVfYXR0cmlidXRlcyhOT0RFX0FUVFJTLCAqKmFyZ3MpCisgICAgICAgIHNlbGYuX3N0cmVhbS53cml0ZSgifVxuIikKKworICAgIGRlZiBlZGdlKHNlbGYsIGZyb21fbm9kZSwgdG9fbm9kZSwgZWRnZV90eXBlPSIiLCAqKmFyZ3MpOgorICAgICAgICAiIiJkcmF3IGFuIGVkZ2UgZnJvbSBhIG5vZGUgdG8gYW5vdGhlci4iIiIKKyAgICAgICAgc2VsZi5fc3RyZWFtLndyaXRlKAorICAgICAgICAgICAgJyVzJXNlZGdlOiB7c291cmNlbmFtZToiJXMiIHRhcmdldG5hbWU6IiVzIicKKyAgICAgICAgICAgICUgKHNlbGYuX2luZGVudCwgZWRnZV90eXBlLCBmcm9tX25vZGUsIHRvX25vZGUpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fd3JpdGVfYXR0cmlidXRlcyhFREdFX0FUVFJTLCAqKmFyZ3MpCisgICAgICAgIHNlbGYuX3N0cmVhbS53cml0ZSgifVxuIikKKworICAgICMgcHJpdmF0ZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiBfd3JpdGVfYXR0cmlidXRlcyhzZWxmLCBhdHRyaWJ1dGVzX2RpY3QsICoqYXJncyk6CisgICAgICAgICIiIndyaXRlIGdyYXBoLCBub2RlIG9yIGVkZ2UgYXR0cmlidXRlcyIiIgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhcmdzLml0ZW1zKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX3R5cGUgPSBhdHRyaWJ1dGVzX2RpY3Rba2V5XQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiIiJubyBzdWNoIGF0dHJpYnV0ZSAlcworcG9zc2libGUgYXR0cmlidXRlcyBhcmUgJXMiIiIKKyAgICAgICAgICAgICAgICAgICAgJSAoa2V5LCBhdHRyaWJ1dGVzX2RpY3Qua2V5cygpKQorICAgICAgICAgICAgICAgICkgZnJvbSBlCisKKyAgICAgICAgICAgIGlmIG5vdCBfdHlwZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zdHJlYW0ud3JpdGUoZid7c2VsZi5faW5kZW50fXtrZXl9OiJ7dmFsdWV9IlxuJykKKyAgICAgICAgICAgIGVsaWYgX3R5cGUgPT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLl9zdHJlYW0ud3JpdGUoZiJ7c2VsZi5faW5kZW50fXtrZXl9OntpbnQodmFsdWUpfVxuIikKKyAgICAgICAgICAgIGVsaWYgdmFsdWUgaW4gX3R5cGU6CisgICAgICAgICAgICAgICAgc2VsZi5fc3RyZWFtLndyaXRlKGYie3NlbGYuX2luZGVudH17a2V5fTp7dmFsdWV9XG4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGYiIiJ2YWx1ZSB7dmFsdWV9IGlzbid0IGNvcnJlY3QgZm9yIGF0dHJpYnV0ZSB7a2V5fQorY29ycmVjdCB2YWx1ZXMgYXJlIHt0eXBlfSIiIgorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBfaW5jX2luZGVudChzZWxmKToKKyAgICAgICAgIiIiaW5jcmVtZW50IGluZGVudGF0aW9uIiIiCisgICAgICAgIHNlbGYuX2luZGVudCA9ICIgICVzIiAlIHNlbGYuX2luZGVudAorCisgICAgZGVmIF9kZWNfaW5kZW50KHNlbGYpOgorICAgICAgICAiIiJkZWNyZW1lbnQgaW5kZW50YXRpb24iIiIKKyAgICAgICAgc2VsZi5faW5kZW50ID0gc2VsZi5faW5kZW50WzotMl0KZGlmZiAtLWdpdCBhL3B5bGludC9weXJldmVyc2Uvd3JpdGVyLnB5IGIvcHlsaW50L3B5cmV2ZXJzZS93cml0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MGJiOQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9weXJldmVyc2Uvd3JpdGVyLnB5CkBAIC0wLDAgKzEsMjE4IEBACisjIENvcHlyaWdodCAoYykgMjAwOC0yMDEwLCAyMDEzLTIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LCAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEt5bGlhbiA8ZGV2ZWxvcG1lbnRAZ291ZGNvZGUubmw+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbmRyZWFzIEZpbmtsZXIgPGFuZGkuZmlua2xlckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJrIEJ5cm5lIDxtYnlybmVwcjJAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlV0aWxpdGllcyBmb3IgY3JlYXRpbmcgVkNHIGFuZCBEb3QgZGlhZ3JhbXMiIiIKKworaW1wb3J0IG9zCisKK2Zyb20gcHlsaW50LmdyYXBoIGltcG9ydCBEb3RCYWNrZW5kCitmcm9tIHB5bGludC5weXJldmVyc2UudXRpbHMgaW1wb3J0IGlzX2V4Y2VwdGlvbgorZnJvbSBweWxpbnQucHlyZXZlcnNlLnZjZ3V0aWxzIGltcG9ydCBWQ0dQcmludGVyCisKKworY2xhc3MgRGlhZ3JhbVdyaXRlcjoKKyAgICAiIiJiYXNlIGNsYXNzIGZvciB3cml0aW5nIHByb2plY3QgZGlhZ3JhbXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcsIHN0eWxlcyk6CisgICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCisgICAgICAgIHNlbGYucGtnX2VkZ2VzLCBzZWxmLmluaF9lZGdlcywgc2VsZi5pbXBfZWRnZXMsIHNlbGYuYXNzb2NpYXRpb25fZWRnZXMgPSBzdHlsZXMKKyAgICAgICAgc2VsZi5wcmludGVyID0gTm9uZSAgIyBkZWZpbmVkIGluIHNldF9wcmludGVyCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGlhZGVmcyk6CisgICAgICAgICIiIndyaXRlIGZpbGVzIGZvciA8cHJvamVjdD4gYWNjb3JkaW5nIHRvIDxkaWFkZWZzPiIiIgorICAgICAgICBmb3IgZGlhZ3JhbSBpbiBkaWFkZWZzOgorICAgICAgICAgICAgYmFzZW5hbWUgPSBkaWFncmFtLnRpdGxlLnN0cmlwKCkucmVwbGFjZSgiICIsICJfIikKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IGYie2Jhc2VuYW1lfS57c2VsZi5jb25maWcub3V0cHV0X2Zvcm1hdH0iCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmNvbmZpZy5vdXRwdXRfZGlyZWN0b3J5KToKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5jb25maWcub3V0cHV0X2RpcmVjdG9yeSwgZmlsZV9uYW1lKQorICAgICAgICAgICAgc2VsZi5zZXRfcHJpbnRlcihmaWxlX25hbWUsIGJhc2VuYW1lKQorICAgICAgICAgICAgaWYgZGlhZ3JhbS5UWVBFID09ICJjbGFzcyI6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9jbGFzc2VzKGRpYWdyYW0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfcGFja2FnZXMoZGlhZ3JhbSkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfZ3JhcGgoKQorCisgICAgZGVmIHdyaXRlX3BhY2thZ2VzKHNlbGYsIGRpYWdyYW0pOgorICAgICAgICAiIiJ3cml0ZSBhIHBhY2thZ2UgZGlhZ3JhbSIiIgorICAgICAgICAjIHNvcnRlZCB0byBnZXQgcHJlZGljdGFibGUgKGhlbmNlIHRlc3RhYmxlKSByZXN1bHRzCisgICAgICAgIGZvciBpLCBvYmogaW4gZW51bWVyYXRlKHNvcnRlZChkaWFncmFtLm1vZHVsZXMoKSwga2V5PWxhbWJkYSB4OiB4LnRpdGxlKSk6CisgICAgICAgICAgICBzZWxmLnByaW50ZXIuZW1pdF9ub2RlKGksIGxhYmVsPXNlbGYuZ2V0X3RpdGxlKG9iaiksIHNoYXBlPSJib3giKQorICAgICAgICAgICAgb2JqLmZpZ19pZCA9IGkKKyAgICAgICAgIyBwYWNrYWdlIGRlcGVuZGVuY2llcworICAgICAgICBmb3IgcmVsIGluIGRpYWdyYW0uZ2V0X3JlbGF0aW9uc2hpcHMoImRlcGVuZHMiKToKKyAgICAgICAgICAgIHNlbGYucHJpbnRlci5lbWl0X2VkZ2UoCisgICAgICAgICAgICAgICAgcmVsLmZyb21fb2JqZWN0LmZpZ19pZCwgcmVsLnRvX29iamVjdC5maWdfaWQsICoqc2VsZi5wa2dfZWRnZXMKKyAgICAgICAgICAgICkKKworICAgIGRlZiB3cml0ZV9jbGFzc2VzKHNlbGYsIGRpYWdyYW0pOgorICAgICAgICAiIiJ3cml0ZSBhIGNsYXNzIGRpYWdyYW0iIiIKKyAgICAgICAgIyBzb3J0ZWQgdG8gZ2V0IHByZWRpY3RhYmxlIChoZW5jZSB0ZXN0YWJsZSkgcmVzdWx0cworICAgICAgICBmb3IgaSwgb2JqIGluIGVudW1lcmF0ZShzb3J0ZWQoZGlhZ3JhbS5vYmplY3RzLCBrZXk9bGFtYmRhIHg6IHgudGl0bGUpKToKKyAgICAgICAgICAgIHNlbGYucHJpbnRlci5lbWl0X25vZGUoaSwgKipzZWxmLmdldF92YWx1ZXMob2JqKSkKKyAgICAgICAgICAgIG9iai5maWdfaWQgPSBpCisgICAgICAgICMgaW5oZXJpdGFuY2UgbGlua3MKKyAgICAgICAgZm9yIHJlbCBpbiBkaWFncmFtLmdldF9yZWxhdGlvbnNoaXBzKCJzcGVjaWFsaXphdGlvbiIpOgorICAgICAgICAgICAgc2VsZi5wcmludGVyLmVtaXRfZWRnZSgKKyAgICAgICAgICAgICAgICByZWwuZnJvbV9vYmplY3QuZmlnX2lkLCByZWwudG9fb2JqZWN0LmZpZ19pZCwgKipzZWxmLmluaF9lZGdlcworICAgICAgICAgICAgKQorICAgICAgICAjIGltcGxlbWVudGF0aW9uIGxpbmtzCisgICAgICAgIGZvciByZWwgaW4gZGlhZ3JhbS5nZXRfcmVsYXRpb25zaGlwcygiaW1wbGVtZW50cyIpOgorICAgICAgICAgICAgc2VsZi5wcmludGVyLmVtaXRfZWRnZSgKKyAgICAgICAgICAgICAgICByZWwuZnJvbV9vYmplY3QuZmlnX2lkLCByZWwudG9fb2JqZWN0LmZpZ19pZCwgKipzZWxmLmltcF9lZGdlcworICAgICAgICAgICAgKQorICAgICAgICAjIGdlbmVyYXRlIGFzc29jaWF0aW9ucworICAgICAgICBmb3IgcmVsIGluIGRpYWdyYW0uZ2V0X3JlbGF0aW9uc2hpcHMoImFzc29jaWF0aW9uIik6CisgICAgICAgICAgICBzZWxmLnByaW50ZXIuZW1pdF9lZGdlKAorICAgICAgICAgICAgICAgIHJlbC5mcm9tX29iamVjdC5maWdfaWQsCisgICAgICAgICAgICAgICAgcmVsLnRvX29iamVjdC5maWdfaWQsCisgICAgICAgICAgICAgICAgbGFiZWw9cmVsLm5hbWUsCisgICAgICAgICAgICAgICAgKipzZWxmLmFzc29jaWF0aW9uX2VkZ2VzLAorICAgICAgICAgICAgKQorCisgICAgZGVmIHNldF9wcmludGVyKHNlbGYsIGZpbGVfbmFtZSwgYmFzZW5hbWUpOgorICAgICAgICAiIiJzZXQgcHJpbnRlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZ2V0X3RpdGxlKHNlbGYsIG9iaik6CisgICAgICAgICIiImdldCBwcm9qZWN0IHRpdGxlIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBnZXRfdmFsdWVzKHNlbGYsIG9iaik6CisgICAgICAgICIiImdldCBsYWJlbCBhbmQgc2hhcGUgZm9yIGNsYXNzZXMuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBjbG9zZV9ncmFwaChzZWxmKToKKyAgICAgICAgIiIiZmluYWxpemUgdGhlIGdyYXBoIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBEb3RXcml0ZXIoRGlhZ3JhbVdyaXRlcik6CisgICAgIiIid3JpdGUgZG90IGdyYXBocyBmcm9tIGEgZGlhZ3JhbSBkZWZpbml0aW9uIGFuZCBhIHByb2plY3QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgorICAgICAgICBzdHlsZXMgPSBbCisgICAgICAgICAgICBkaWN0KGFycm93dGFpbD0ibm9uZSIsIGFycm93aGVhZD0ib3BlbiIpLAorICAgICAgICAgICAgZGljdChhcnJvd3RhaWw9Im5vbmUiLCBhcnJvd2hlYWQ9ImVtcHR5IiksCisgICAgICAgICAgICBkaWN0KGFycm93dGFpbD0ibm9kZSIsIGFycm93aGVhZD0iZW1wdHkiLCBzdHlsZT0iZGFzaGVkIiksCisgICAgICAgICAgICBkaWN0KAorICAgICAgICAgICAgICAgIGZvbnRjb2xvcj0iZ3JlZW4iLCBhcnJvd3RhaWw9Im5vbmUiLCBhcnJvd2hlYWQ9ImRpYW1vbmQiLCBzdHlsZT0ic29saWQiCisgICAgICAgICAgICApLAorICAgICAgICBdCisgICAgICAgIERpYWdyYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgY29uZmlnLCBzdHlsZXMpCisKKyAgICBkZWYgc2V0X3ByaW50ZXIoc2VsZiwgZmlsZV9uYW1lLCBiYXNlbmFtZSk6CisgICAgICAgICIiImluaXRpYWxpemUgRG90V3JpdGVyIGFuZCBhZGQgb3B0aW9ucyBmb3IgbGF5b3V0LiIiIgorICAgICAgICBsYXlvdXQgPSBkaWN0KHJhbmtkaXI9IkJUIikKKyAgICAgICAgc2VsZi5wcmludGVyID0gRG90QmFja2VuZChiYXNlbmFtZSwgYWRkaXRpb25hbF9wYXJhbT1sYXlvdXQpCisgICAgICAgIHNlbGYuZmlsZV9uYW1lID0gZmlsZV9uYW1lCisKKyAgICBkZWYgZ2V0X3RpdGxlKHNlbGYsIG9iaik6CisgICAgICAgICIiImdldCBwcm9qZWN0IHRpdGxlIiIiCisgICAgICAgIHJldHVybiBvYmoudGl0bGUKKworICAgIGRlZiBnZXRfdmFsdWVzKHNlbGYsIG9iaik6CisgICAgICAgICIiImdldCBsYWJlbCBhbmQgc2hhcGUgZm9yIGNsYXNzZXMuCisKKyAgICAgICAgVGhlIGxhYmVsIGNvbnRhaW5zIGFsbCBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzCisgICAgICAgICIiIgorICAgICAgICBsYWJlbCA9IG9iai50aXRsZQorICAgICAgICBpZiBvYmouc2hhcGUgPT0gImludGVyZmFjZSI6CisgICAgICAgICAgICBsYWJlbCA9ICLCq2ludGVyZmFjZcK7XFxuJXMiICUgbGFiZWwKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlnLm9ubHlfY2xhc3NuYW1lczoKKyAgICAgICAgICAgIGxhYmVsID0gciJ7fXx7fVxsfCIuZm9ybWF0KGxhYmVsLCByIlxsIi5qb2luKG9iai5hdHRycykpCisgICAgICAgICAgICBmb3IgZnVuYyBpbiBvYmoubWV0aG9kczoKKyAgICAgICAgICAgICAgICBpZiBmdW5jLmFyZ3MuYXJnczoKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9IFthcmcubmFtZSBmb3IgYXJnIGluIGZ1bmMuYXJncy5hcmdzIGlmIGFyZy5uYW1lICE9ICJzZWxmIl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhcmdzID0gW10KKyAgICAgICAgICAgICAgICBsYWJlbCA9IHIie317fSh7fSlcbCIuZm9ybWF0KGxhYmVsLCBmdW5jLm5hbWUsICIsICIuam9pbihhcmdzKSkKKyAgICAgICAgICAgIGxhYmVsID0gInslc30iICUgbGFiZWwKKyAgICAgICAgaWYgaXNfZXhjZXB0aW9uKG9iai5ub2RlKToKKyAgICAgICAgICAgIHJldHVybiBkaWN0KGZvbnRjb2xvcj0icmVkIiwgbGFiZWw9bGFiZWwsIHNoYXBlPSJyZWNvcmQiKQorICAgICAgICByZXR1cm4gZGljdChsYWJlbD1sYWJlbCwgc2hhcGU9InJlY29yZCIpCisKKyAgICBkZWYgY2xvc2VfZ3JhcGgoc2VsZik6CisgICAgICAgICIiInByaW50IHRoZSBkb3QgZ3JhcGggaW50byA8ZmlsZV9uYW1lPiIiIgorICAgICAgICBzZWxmLnByaW50ZXIuZ2VuZXJhdGUoc2VsZi5maWxlX25hbWUpCisKKworY2xhc3MgVkNHV3JpdGVyKERpYWdyYW1Xcml0ZXIpOgorICAgICIiIndyaXRlIHZjZyBncmFwaHMgZnJvbSBhIGRpYWdyYW0gZGVmaW5pdGlvbiBhbmQgYSBwcm9qZWN0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKKyAgICAgICAgc3R5bGVzID0gWworICAgICAgICAgICAgZGljdChhcnJvd3N0eWxlPSJzb2xpZCIsIGJhY2thcnJvd3N0eWxlPSJub25lIiwgYmFja2Fycm93c2l6ZT0wKSwKKyAgICAgICAgICAgIGRpY3QoYXJyb3dzdHlsZT0ic29saWQiLCBiYWNrYXJyb3dzdHlsZT0ibm9uZSIsIGJhY2thcnJvd3NpemU9MTApLAorICAgICAgICAgICAgZGljdCgKKyAgICAgICAgICAgICAgICBhcnJvd3N0eWxlPSJzb2xpZCIsCisgICAgICAgICAgICAgICAgYmFja2Fycm93c3R5bGU9Im5vbmUiLAorICAgICAgICAgICAgICAgIGxpbmVzdHlsZT0iZG90dGVkIiwKKyAgICAgICAgICAgICAgICBiYWNrYXJyb3dzaXplPTEwLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIGRpY3QoYXJyb3dzdHlsZT0ic29saWQiLCBiYWNrYXJyb3dzdHlsZT0ibm9uZSIsIHRleHRjb2xvcj0iZ3JlZW4iKSwKKyAgICAgICAgXQorICAgICAgICBEaWFncmFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIGNvbmZpZywgc3R5bGVzKQorCisgICAgZGVmIHNldF9wcmludGVyKHNlbGYsIGZpbGVfbmFtZSwgYmFzZW5hbWUpOgorICAgICAgICAiIiJpbml0aWFsaXplIFZDR1dyaXRlciBmb3IgYSBVTUwgZ3JhcGgiIiIKKyAgICAgICAgc2VsZi5ncmFwaF9maWxlID0gb3BlbihmaWxlX25hbWUsICJ3KyIpICAjIHB5bGludDogZGlzYWJsZT1jb25zaWRlci11c2luZy13aXRoCisgICAgICAgIHNlbGYucHJpbnRlciA9IFZDR1ByaW50ZXIoc2VsZi5ncmFwaF9maWxlKQorICAgICAgICBzZWxmLnByaW50ZXIub3Blbl9ncmFwaCgKKyAgICAgICAgICAgIHRpdGxlPWJhc2VuYW1lLAorICAgICAgICAgICAgbGF5b3V0YWxnb3JpdGhtPSJkZnMiLAorICAgICAgICAgICAgbGF0ZV9lZGdlX2xhYmVscz0ieWVzIiwKKyAgICAgICAgICAgIHBvcnRfc2hhcmluZz0ibm8iLAorICAgICAgICAgICAgbWFuaGF0dGFuX2VkZ2VzPSJ5ZXMiLAorICAgICAgICApCisgICAgICAgIHNlbGYucHJpbnRlci5lbWl0X25vZGUgPSBzZWxmLnByaW50ZXIubm9kZQorICAgICAgICBzZWxmLnByaW50ZXIuZW1pdF9lZGdlID0gc2VsZi5wcmludGVyLmVkZ2UKKworICAgIGRlZiBnZXRfdGl0bGUoc2VsZiwgb2JqKToKKyAgICAgICAgIiIiZ2V0IHByb2plY3QgdGl0bGUgaW4gdmNnIGZvcm1hdCIiIgorICAgICAgICByZXR1cm4gciJcZmIlc1xmbiIgJSBvYmoudGl0bGUKKworICAgIGRlZiBnZXRfdmFsdWVzKHNlbGYsIG9iaik6CisgICAgICAgICIiImdldCBsYWJlbCBhbmQgc2hhcGUgZm9yIGNsYXNzZXMuCisKKyAgICAgICAgVGhlIGxhYmVsIGNvbnRhaW5zIGFsbCBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzCisgICAgICAgICIiIgorICAgICAgICBpZiBpc19leGNlcHRpb24ob2JqLm5vZGUpOgorICAgICAgICAgICAgbGFiZWwgPSByIlxmYlxmMDklc1xmbiIgJSBvYmoudGl0bGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhYmVsID0gciJcZmIlc1xmbiIgJSBvYmoudGl0bGUKKyAgICAgICAgaWYgb2JqLnNoYXBlID09ICJpbnRlcmZhY2UiOgorICAgICAgICAgICAgc2hhcGUgPSAiZWxsaXBzZSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNoYXBlID0gImJveCIKKyAgICAgICAgaWYgbm90IHNlbGYuY29uZmlnLm9ubHlfY2xhc3NuYW1lczoKKyAgICAgICAgICAgIGF0dHJzID0gb2JqLmF0dHJzCisgICAgICAgICAgICBtZXRob2RzID0gW2Z1bmMubmFtZSBmb3IgZnVuYyBpbiBvYmoubWV0aG9kc10KKyAgICAgICAgICAgICMgYm94IHdpZHRoIGZvciBVTUwgbGlrZSBkaWFncmFtCisgICAgICAgICAgICBtYXhsZW4gPSBtYXgobGVuKG5hbWUpIGZvciBuYW1lIGluIFtvYmoudGl0bGVdICsgbWV0aG9kcyArIGF0dHJzKQorICAgICAgICAgICAgbGluZSA9ICJfIiAqIChtYXhsZW4gKyAyKQorICAgICAgICAgICAgbGFiZWwgPSBmciJ7bGFiZWx9XG5cZntsaW5lfSIKKyAgICAgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgorICAgICAgICAgICAgICAgIGxhYmVsID0gZnIie2xhYmVsfVxuXGYwOHthdHRyfSIKKyAgICAgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgICAgIGxhYmVsID0gZnIie2xhYmVsfVxuXGZ7bGluZX0iCisgICAgICAgICAgICBmb3IgZnVuYyBpbiBtZXRob2RzOgorICAgICAgICAgICAgICAgIGxhYmVsID0gZnIie2xhYmVsfVxuXGYxMHtmdW5jfSgpIgorICAgICAgICByZXR1cm4gZGljdChsYWJlbD1sYWJlbCwgc2hhcGU9c2hhcGUpCisKKyAgICBkZWYgY2xvc2VfZ3JhcGgoc2VsZik6CisgICAgICAgICIiImNsb3NlIGdyYXBoIGFuZCBmaWxlIiIiCisgICAgICAgIHNlbGYucHJpbnRlci5jbG9zZV9ncmFwaCgpCisgICAgICAgIHNlbGYuZ3JhcGhfZmlsZS5jbG9zZSgpCmRpZmYgLS1naXQgYS9weWxpbnQvcmVwb3J0ZXJzL19faW5pdF9fLnB5IGIvcHlsaW50L3JlcG9ydGVycy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzYwZGZkCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3JlcG9ydGVycy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCwgMjAxMi0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMiBGRUxEIEJvcmlzIDxsb3RoaXJhbGRhbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgUmljYXJkbyBHZW1pZ25hbmkgPHJpY2FyZG8uZ2VtaWduYW5pQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgU2ltdSBUb25pIDxzaW11dG9uaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IEvDoXJpIFRyaXN0YW4gSGVsZ2Fzb24gPGt0aGVsZ2Fzb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU3VzaG9iaGl0IDwzMTk4Nzc2OStzdXNob2JoaXQyN0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIHJ1cm8gPHJ1cm8ucnVyb0B5YS5ydT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJ1dGlsaXRpZXMgbWV0aG9kcyBhbmQgY2xhc3NlcyBmb3IgcmVwb3J0ZXJzIiIiCisKKworZnJvbSBweWxpbnQgaW1wb3J0IHV0aWxzCitmcm9tIHB5bGludC5yZXBvcnRlcnMuYmFzZV9yZXBvcnRlciBpbXBvcnQgQmFzZVJlcG9ydGVyCitmcm9tIHB5bGludC5yZXBvcnRlcnMuY29sbGVjdGluZ19yZXBvcnRlciBpbXBvcnQgQ29sbGVjdGluZ1JlcG9ydGVyCitmcm9tIHB5bGludC5yZXBvcnRlcnMuanNvbl9yZXBvcnRlciBpbXBvcnQgSlNPTlJlcG9ydGVyCitmcm9tIHB5bGludC5yZXBvcnRlcnMubXVsdGlfcmVwb3J0ZXIgaW1wb3J0IE11bHRpUmVwb3J0ZXIKK2Zyb20gcHlsaW50LnJlcG9ydGVycy5yZXBvcnRzX2hhbmRsZXJfbWl4X2luIGltcG9ydCBSZXBvcnRzSGFuZGxlck1peEluCisKKworZGVmIGluaXRpYWxpemUobGludGVyKToKKyAgICAiIiJpbml0aWFsaXplIGxpbnRlciB3aXRoIHJlcG9ydGVycyBpbiB0aGlzIHBhY2thZ2UiIiIKKyAgICB1dGlscy5yZWdpc3Rlcl9wbHVnaW5zKGxpbnRlciwgX19wYXRoX19bMF0pCisKKworX19hbGxfXyA9IFsKKyAgICAiQmFzZVJlcG9ydGVyIiwKKyAgICAiUmVwb3J0c0hhbmRsZXJNaXhJbiIsCisgICAgIkpTT05SZXBvcnRlciIsCisgICAgIkNvbGxlY3RpbmdSZXBvcnRlciIsCisgICAgIk11bHRpUmVwb3J0ZXIiLAorXQpkaWZmIC0tZ2l0IGEvcHlsaW50L3JlcG9ydGVycy9iYXNlX3JlcG9ydGVyLnB5IGIvcHlsaW50L3JlcG9ydGVycy9iYXNlX3JlcG9ydGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODA3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcmVwb3J0ZXJzL2Jhc2VfcmVwb3J0ZXIucHkKQEAgLTAsMCArMSw2OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gdHlwaW5nIGltcG9ydCBMaXN0CisKK2Zyb20gcHlsaW50Lm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKKworCitjbGFzcyBCYXNlUmVwb3J0ZXI6CisgICAgIiIiYmFzZSBjbGFzcyBmb3IgcmVwb3J0ZXJzCisKKyAgICBzeW1ib2xzOiBzaG93IHNob3J0IHN5bWJvbGljIG5hbWVzIGZvciBtZXNzYWdlcy4KKyAgICAiIiIKKworICAgIGV4dGVuc2lvbiA9ICIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICBzZWxmLmxpbnRlciA9IE5vbmUKKyAgICAgICAgc2VsZi5zZWN0aW9uID0gMAorICAgICAgICBzZWxmLm91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5vdXRfZW5jb2RpbmcgPSBOb25lCisgICAgICAgIHNlbGYuc2V0X291dHB1dChvdXRwdXQpCisgICAgICAgIHNlbGYubWVzc2FnZXM6IExpc3RbTWVzc2FnZV0gPSBbXQorICAgICAgICAjIEJ1aWxkIHRoZSBwYXRoIHByZWZpeCB0byBzdHJpcCB0byBnZXQgcmVsYXRpdmUgcGF0aHMKKyAgICAgICAgc2VsZi5wYXRoX3N0cmlwX3ByZWZpeCA9IG9zLmdldGN3ZCgpICsgb3Muc2VwCisKKyAgICBkZWYgaGFuZGxlX21lc3NhZ2Uoc2VsZiwgbXNnOiBNZXNzYWdlKSAtPiBOb25lOgorICAgICAgICAiIiJIYW5kbGUgYSBuZXcgbWVzc2FnZSB0cmlnZ2VyZWQgb24gdGhlIGN1cnJlbnQgZmlsZS4iIiIKKyAgICAgICAgc2VsZi5tZXNzYWdlcy5hcHBlbmQobXNnKQorCisgICAgZGVmIHNldF9vdXRwdXQoc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICAiIiJzZXQgb3V0cHV0IHN0cmVhbSIiIgorICAgICAgICBzZWxmLm91dCA9IG91dHB1dCBvciBzeXMuc3Rkb3V0CisKKyAgICBkZWYgd3JpdGVsbihzZWxmLCBzdHJpbmc9IiIpOgorICAgICAgICAiIiJ3cml0ZSBhIGxpbmUgaW4gdGhlIG91dHB1dCBidWZmZXIiIiIKKyAgICAgICAgcHJpbnQoc3RyaW5nLCBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIGRpc3BsYXlfcmVwb3J0cyhzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJkaXNwbGF5IHJlc3VsdHMgZW5jYXBzdWxhdGVkIGluIHRoZSBsYXlvdXQgdHJlZSIiIgorICAgICAgICBzZWxmLnNlY3Rpb24gPSAwCisgICAgICAgIGlmIGhhc2F0dHIobGF5b3V0LCAicmVwb3J0X2lkIik6CisgICAgICAgICAgICBsYXlvdXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uZGF0YSArPSAiICglcykiICUgbGF5b3V0LnJlcG9ydF9pZAorICAgICAgICBzZWxmLl9kaXNwbGF5KGxheW91dCkKKworICAgIGRlZiBfZGlzcGxheShzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJkaXNwbGF5IHRoZSBsYXlvdXQiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgZGlzcGxheV9tZXNzYWdlcyhzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJIb29rIGZvciBkaXNwbGF5aW5nIHRoZSBtZXNzYWdlcyBvZiB0aGUgcmVwb3J0ZXIKKworICAgICAgICBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSB1bmRlcmx5aW5nIG1lc3NhZ2VzCisgICAgICAgIG5lZWRzIHRvIGJlIGRpc3BsYXllZC4gRm9yIHNvbWUgcmVwb3J0ZXJzLCBpdCBwcm9iYWJseQorICAgICAgICBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gZGlzcGxheSBtZXNzYWdlcyBhcyBzb29uIGFzIHRoZXkKKyAgICAgICAgYXJlIGF2YWlsYWJsZSwgc28gc29tZSBtZWNoYW5pc20gb2Ygc3RvcmluZyB0aGVtIGNvdWxkIGJlIHVzZWQuCisgICAgICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBpbXBsZW1lbnRlZCB0byBkaXNwbGF5IHRoZW0gYWZ0ZXIgdGhleSd2ZQorICAgICAgICBiZWVuIGFnZ3JlZ2F0ZWQuCisgICAgICAgICIiIgorCisgICAgIyBFdmVudCBjYWxsYmFja3MKKworICAgIGRlZiBvbl9zZXRfY3VycmVudF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBmaWxlcGF0aCk6CisgICAgICAgICIiIkhvb2sgY2FsbGVkIHdoZW4gYSBtb2R1bGUgc3RhcnRzIHRvIGJlIGFuYWx5c2VkLiIiIgorCisgICAgZGVmIG9uX2Nsb3NlKHNlbGYsIHN0YXRzLCBwcmV2aW91c19zdGF0cyk6CisgICAgICAgICIiIkhvb2sgY2FsbGVkIHdoZW4gYSBtb2R1bGUgZmluaXNoZWQgYW5hbHl6aW5nLiIiIgpkaWZmIC0tZ2l0IGEvcHlsaW50L3JlcG9ydGVycy9jb2xsZWN0aW5nX3JlcG9ydGVyLnB5IGIvcHlsaW50L3JlcG9ydGVycy9jb2xsZWN0aW5nX3JlcG9ydGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNGM0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcmVwb3J0ZXJzL2NvbGxlY3RpbmdfcmVwb3J0ZXIucHkKQEAgLTAsMCArMSwxOCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorZnJvbSBweWxpbnQucmVwb3J0ZXJzLmJhc2VfcmVwb3J0ZXIgaW1wb3J0IEJhc2VSZXBvcnRlcgorCisKK2NsYXNzIENvbGxlY3RpbmdSZXBvcnRlcihCYXNlUmVwb3J0ZXIpOgorICAgICIiImNvbGxlY3RzIG1lc3NhZ2VzIiIiCisKKyAgICBuYW1lID0gImNvbGxlY3RvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQmFzZVJlcG9ydGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubWVzc2FnZXMgPSBbXQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLm1lc3NhZ2VzID0gW10KKworICAgIF9kaXNwbGF5ID0gTm9uZQpkaWZmIC0tZ2l0IGEvcHlsaW50L3JlcG9ydGVycy9qc29uX3JlcG9ydGVyLnB5IGIvcHlsaW50L3JlcG9ydGVycy9qc29uX3JlcG9ydGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZWZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcmVwb3J0ZXJzL2pzb25fcmVwb3J0ZXIucHkKQEAgLTAsMCArMSw1NCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTQgVmxhZCBUZW1pYW4gPHZsYWR0ZW1pYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgZ3VpbGxhdW1lMiA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29sPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQ2zDqW1lbnQgUGl0LUNsYXVkZWwgPGNwaXRjbGF1ZGVsQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJKU09OIHJlcG9ydGVyIiIiCitpbXBvcnQganNvbgorCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJUmVwb3J0ZXIKK2Zyb20gcHlsaW50LnJlcG9ydGVycy5iYXNlX3JlcG9ydGVyIGltcG9ydCBCYXNlUmVwb3J0ZXIKKworCitjbGFzcyBKU09OUmVwb3J0ZXIoQmFzZVJlcG9ydGVyKToKKyAgICAiIiJSZXBvcnQgbWVzc2FnZXMgYW5kIGxheW91dHMgaW4gSlNPTi4iIiIKKworICAgIF9faW1wbGVtZW50c19fID0gSVJlcG9ydGVyCisgICAgbmFtZSA9ICJqc29uIgorICAgIGV4dGVuc2lvbiA9ICJqc29uIgorCisgICAgZGVmIGRpc3BsYXlfbWVzc2FnZXMoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgIiIiTGF1bmNoIGxheW91dHMgZGlzcGxheSIiIgorICAgICAgICBqc29uX2R1bXBhYmxlID0gWworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJ0eXBlIjogbXNnLmNhdGVnb3J5LAorICAgICAgICAgICAgICAgICJtb2R1bGUiOiBtc2cubW9kdWxlLAorICAgICAgICAgICAgICAgICJvYmoiOiBtc2cub2JqLAorICAgICAgICAgICAgICAgICJsaW5lIjogbXNnLmxpbmUsCisgICAgICAgICAgICAgICAgImNvbHVtbiI6IG1zZy5jb2x1bW4sCisgICAgICAgICAgICAgICAgInBhdGgiOiBtc2cucGF0aCwKKyAgICAgICAgICAgICAgICAic3ltYm9sIjogbXNnLnN5bWJvbCwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSI6IG1zZy5tc2cgb3IgIiIsCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UtaWQiOiBtc2cubXNnX2lkLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIG1zZyBpbiBzZWxmLm1lc3NhZ2VzCisgICAgICAgIF0KKyAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhqc29uX2R1bXBhYmxlLCBpbmRlbnQ9NCksIGZpbGU9c2VsZi5vdXQpCisKKyAgICBkZWYgZGlzcGxheV9yZXBvcnRzKHNlbGYsIGxheW91dCk6CisgICAgICAgICIiIkRvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgcmVwb3J0ZXIuIiIiCisKKyAgICBkZWYgX2Rpc3BsYXkoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgIiIiRG8gbm90aGluZy4iIiIKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJSZWdpc3RlciB0aGUgcmVwb3J0ZXIgY2xhc3NlcyB3aXRoIHRoZSBsaW50ZXIuIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX3JlcG9ydGVyKEpTT05SZXBvcnRlcikKZGlmZiAtLWdpdCBhL3B5bGludC9yZXBvcnRlcnMvbXVsdGlfcmVwb3J0ZXIucHkgYi9weWxpbnQvcmVwb3J0ZXJzL211bHRpX3JlcG9ydGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmI5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcmVwb3J0ZXJzL211bHRpX3JlcG9ydGVyLnB5CkBAIC0wLDAgKzEsMTAzIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKworaW1wb3J0IG9zCitmcm9tIHR5cGluZyBpbXBvcnQgSU8sIEFueSwgQW55U3RyLCBDYWxsYWJsZSwgTGlzdCwgTWFwcGluZywgT3B0aW9uYWwsIFVuaW9uCisKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IElSZXBvcnRlcgorZnJvbSBweWxpbnQubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorZnJvbSBweWxpbnQucmVwb3J0ZXJzLmJhc2VfcmVwb3J0ZXIgaW1wb3J0IEJhc2VSZXBvcnRlcgorZnJvbSBweWxpbnQucmVwb3J0ZXJzLnVyZXBvcnRzLm5vZGVzIGltcG9ydCBCYXNlTGF5b3V0CisKK0FueUZpbGUgPSBJT1tBbnlTdHJdCitBbnlQYXRoID0gVW5pb25bc3RyLCBieXRlcywgb3MuUGF0aExpa2VdCitQeUxpbnRlciA9IEFueQorCisKK2NsYXNzIE11bHRpUmVwb3J0ZXI6CisgICAgIiIiUmVwb3J0cyBtZXNzYWdlcyBhbmQgbGF5b3V0cyBpbiBwbGFpbiB0ZXh0IiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IElSZXBvcnRlcgorICAgIG5hbWUgPSAiX2ludGVybmFsX211bHRpX3JlcG9ydGVyIgorICAgICMgTm90ZTogZG8gbm90IHJlZ2lzdGVyIHRoaXMgcmVwb3J0ZXIgd2l0aCBsaW50ZXIucmVnaXN0ZXJfcmVwb3J0ZXIgYXMgaXQgaXMKKyAgICAjICAgICAgIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IGxpa2UgYSByZWd1bGFyIHJlcG9ydGVyLCBidXQgaXMKKyAgICAjICAgICAgIGluc3RlYWQgdXNlZCB0byBpbXBsZW1lbnQgdGhlCisgICAgIyAgICAgICBgLS1vdXRwdXQtZm9ybWF0PWpzb246c29tZWZpbGUuanNvbixjb2xvcml6ZWRgCisgICAgIyAgICAgICBtdWx0aXBsZSBvdXRwdXQgZm9ybWF0cyBmZWF0dXJlCisKKyAgICBleHRlbnNpb24gPSAiIgorCisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLAorICAgICAgICBzdWJfcmVwb3J0ZXJzOiBMaXN0W0Jhc2VSZXBvcnRlcl0sCisgICAgICAgIGNsb3NlX291dHB1dF9maWxlczogQ2FsbGFibGVbW10sIE5vbmVdLAorICAgICAgICBvdXRwdXQ6IE9wdGlvbmFsW0FueUZpbGVdID0gTm9uZSwKKyAgICApOgorICAgICAgICBzZWxmLl9zdWJfcmVwb3J0ZXJzID0gc3ViX3JlcG9ydGVycworICAgICAgICBzZWxmLmNsb3NlX291dHB1dF9maWxlcyA9IGNsb3NlX291dHB1dF9maWxlcworCisgICAgICAgIHNlbGYuX3BhdGhfc3RyaXBfcHJlZml4ID0gb3MuZ2V0Y3dkKCkgKyBvcy5zZXAKKyAgICAgICAgc2VsZi5fbGludGVyOiBPcHRpb25hbFtQeUxpbnRlcl0gPSBOb25lCisKKyAgICAgICAgc2VsZi5zZXRfb3V0cHV0KG91dHB1dCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlX291dHB1dF9maWxlcygpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGF0aF9zdHJpcF9wcmVmaXgoc2VsZikgLT4gc3RyOgorICAgICAgICByZXR1cm4gc2VsZi5fcGF0aF9zdHJpcF9wcmVmaXgKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBsaW50ZXIoc2VsZikgLT4gT3B0aW9uYWxbUHlMaW50ZXJdOgorICAgICAgICByZXR1cm4gc2VsZi5fbGludGVyCisKKyAgICBAbGludGVyLnNldHRlcgorICAgIGRlZiBsaW50ZXIoc2VsZiwgdmFsdWU6IFB5TGludGVyKSAtPiBOb25lOgorICAgICAgICBzZWxmLl9saW50ZXIgPSB2YWx1ZQorICAgICAgICBmb3IgcmVwIGluIHNlbGYuX3N1Yl9yZXBvcnRlcnM6CisgICAgICAgICAgICByZXAubGludGVyID0gdmFsdWUKKworICAgIGRlZiBoYW5kbGVfbWVzc2FnZShzZWxmLCBtc2c6IE1lc3NhZ2UpIC0+IE5vbmU6CisgICAgICAgICIiIkhhbmRsZSBhIG5ldyBtZXNzYWdlIHRyaWdnZXJlZCBvbiB0aGUgY3VycmVudCBmaWxlLiIiIgorICAgICAgICBmb3IgcmVwIGluIHNlbGYuX3N1Yl9yZXBvcnRlcnM6CisgICAgICAgICAgICByZXAuaGFuZGxlX21lc3NhZ2UobXNnKQorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UKKyAgICBkZWYgc2V0X291dHB1dChzZWxmLCBvdXRwdXQ6IE9wdGlvbmFsW0FueUZpbGVdID0gTm9uZSkgLT4gTm9uZToKKyAgICAgICAgIiIic2V0IG91dHB1dCBzdHJlYW0iIiIKKyAgICAgICAgIyBNdWx0aVJlcG9ydGVyIGRvZXNuJ3QgaGF2ZSBpdCdzIG93biBvdXRwdXQuIFRoaXMgbWV0aG9kIGlzIG9ubHkKKyAgICAgICAgIyBwcm92aWRlZCBmb3IgQVBJIHBhcml0eSB3aXRoIEJhc2VSZXBvcnRlciBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAgICAgICAgIyB3aXRoIG5vbi1Ob25lIHZhbHVlcyBmb3IgJ291dHB1dCcuCisgICAgICAgIGlmIG91dHB1dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIk11bHRpUmVwb3J0ZXIgZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3Qgb3V0cHV0LiIpCisKKyAgICBkZWYgd3JpdGVsbihzZWxmLCBzdHJpbmc6IHN0ciA9ICIiKSAtPiBOb25lOgorICAgICAgICAiIiJ3cml0ZSBhIGxpbmUgaW4gdGhlIG91dHB1dCBidWZmZXIiIiIKKyAgICAgICAgZm9yIHJlcCBpbiBzZWxmLl9zdWJfcmVwb3J0ZXJzOgorICAgICAgICAgICAgcmVwLndyaXRlbG4oc3RyaW5nKQorCisgICAgZGVmIGRpc3BsYXlfcmVwb3J0cyhzZWxmLCBsYXlvdXQ6IEJhc2VMYXlvdXQpIC0+IE5vbmU6CisgICAgICAgICIiImRpc3BsYXkgcmVzdWx0cyBlbmNhcHN1bGF0ZWQgaW4gdGhlIGxheW91dCB0cmVlIiIiCisgICAgICAgIGZvciByZXAgaW4gc2VsZi5fc3ViX3JlcG9ydGVyczoKKyAgICAgICAgICAgIHJlcC5kaXNwbGF5X3JlcG9ydHMobGF5b3V0KQorCisgICAgZGVmIGRpc3BsYXlfbWVzc2FnZXMoc2VsZiwgbGF5b3V0OiBCYXNlTGF5b3V0KSAtPiBOb25lOgorICAgICAgICAiIiJob29rIGZvciBkaXNwbGF5aW5nIHRoZSBtZXNzYWdlcyBvZiB0aGUgcmVwb3J0ZXIiIiIKKyAgICAgICAgZm9yIHJlcCBpbiBzZWxmLl9zdWJfcmVwb3J0ZXJzOgorICAgICAgICAgICAgcmVwLmRpc3BsYXlfbWVzc2FnZXMobGF5b3V0KQorCisgICAgZGVmIG9uX3NldF9jdXJyZW50X21vZHVsZShzZWxmLCBtb2R1bGU6IHN0ciwgZmlsZXBhdGg6IE9wdGlvbmFsW0FueVBhdGhdKSAtPiBOb25lOgorICAgICAgICAiIiJob29rIGNhbGxlZCB3aGVuIGEgbW9kdWxlIHN0YXJ0cyB0byBiZSBhbmFseXNlZCIiIgorICAgICAgICBmb3IgcmVwIGluIHNlbGYuX3N1Yl9yZXBvcnRlcnM6CisgICAgICAgICAgICByZXAub25fc2V0X2N1cnJlbnRfbW9kdWxlKG1vZHVsZSwgZmlsZXBhdGgpCisKKyAgICBkZWYgb25fY2xvc2UoCisgICAgICAgIHNlbGYsCisgICAgICAgIHN0YXRzOiBNYXBwaW5nW0FueSwgQW55XSwKKyAgICAgICAgcHJldmlvdXNfc3RhdHM6IE1hcHBpbmdbQW55LCBBbnldLAorICAgICkgLT4gTm9uZToKKyAgICAgICAgIiIiaG9vayBjYWxsZWQgd2hlbiBhIG1vZHVsZSBmaW5pc2hlZCBhbmFseXppbmciIiIKKyAgICAgICAgZm9yIHJlcCBpbiBzZWxmLl9zdWJfcmVwb3J0ZXJzOgorICAgICAgICAgICAgcmVwLm9uX2Nsb3NlKHN0YXRzLCBwcmV2aW91c19zdGF0cykKZGlmZiAtLWdpdCBhL3B5bGludC9yZXBvcnRlcnMvcmVwb3J0c19oYW5kbGVyX21peF9pbi5weSBiL3B5bGludC9yZXBvcnRlcnMvcmVwb3J0c19oYW5kbGVyX21peF9pbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDdjYzhiCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3JlcG9ydGVycy9yZXBvcnRzX2hhbmRsZXJfbWl4X2luLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbGxlY3Rpb25zCisKK2Zyb20gcHlsaW50LmV4Y2VwdGlvbnMgaW1wb3J0IEVtcHR5UmVwb3J0RXJyb3IKK2Zyb20gcHlsaW50LnJlcG9ydGVycy51cmVwb3J0cy5ub2RlcyBpbXBvcnQgU2VjdGlvbgorCisKK2NsYXNzIFJlcG9ydHNIYW5kbGVyTWl4SW46CisgICAgIiIiYSBtaXgtaW4gY2xhc3MgY29udGFpbmluZyBhbGwgdGhlIHJlcG9ydHMgYW5kIHN0YXRzIG1hbmlwdWxhdGlvbgorICAgIHJlbGF0ZWQgbWV0aG9kcyBmb3IgdGhlIG1haW4gbGludCBjbGFzcworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9yZXBvcnRzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgc2VsZi5fcmVwb3J0c19zdGF0ZSA9IHt9CisKKyAgICBkZWYgcmVwb3J0X29yZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHJlcG9ydHMsIHNvcnRlZCBpbiB0aGUgb3JkZXIKKyAgICAgICAgaW4gd2hpY2ggdGhleSBtdXN0IGJlIGNhbGxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuX3JlcG9ydHMpCisKKyAgICBkZWYgcmVnaXN0ZXJfcmVwb3J0KHNlbGYsIHJlcG9ydGlkLCByX3RpdGxlLCByX2NiLCBjaGVja2VyKToKKyAgICAgICAgIiIicmVnaXN0ZXIgYSByZXBvcnQKKworICAgICAgICByZXBvcnRpZCBpcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvcnQKKyAgICAgICAgcl90aXRsZSB0aGUgcmVwb3J0J3MgdGl0bGUKKyAgICAgICAgcl9jYiB0aGUgbWV0aG9kIHRvIGNhbGwgdG8gbWFrZSB0aGUgcmVwb3J0CisgICAgICAgIGNoZWNrZXIgaXMgdGhlIGNoZWNrZXIgZGVmaW5pbmcgdGhlIHJlcG9ydAorICAgICAgICAiIiIKKyAgICAgICAgcmVwb3J0aWQgPSByZXBvcnRpZC51cHBlcigpCisgICAgICAgIHNlbGYuX3JlcG9ydHNbY2hlY2tlcl0uYXBwZW5kKChyZXBvcnRpZCwgcl90aXRsZSwgcl9jYikpCisKKyAgICBkZWYgZW5hYmxlX3JlcG9ydChzZWxmLCByZXBvcnRpZCk6CisgICAgICAgICIiImRpc2FibGUgdGhlIHJlcG9ydCBvZiB0aGUgZ2l2ZW4gaWQiIiIKKyAgICAgICAgcmVwb3J0aWQgPSByZXBvcnRpZC51cHBlcigpCisgICAgICAgIHNlbGYuX3JlcG9ydHNfc3RhdGVbcmVwb3J0aWRdID0gVHJ1ZQorCisgICAgZGVmIGRpc2FibGVfcmVwb3J0KHNlbGYsIHJlcG9ydGlkKToKKyAgICAgICAgIiIiZGlzYWJsZSB0aGUgcmVwb3J0IG9mIHRoZSBnaXZlbiBpZCIiIgorICAgICAgICByZXBvcnRpZCA9IHJlcG9ydGlkLnVwcGVyKCkKKyAgICAgICAgc2VsZi5fcmVwb3J0c19zdGF0ZVtyZXBvcnRpZF0gPSBGYWxzZQorCisgICAgZGVmIHJlcG9ydF9pc19lbmFibGVkKHNlbGYsIHJlcG9ydGlkKToKKyAgICAgICAgIiIicmV0dXJuIHRydWUgaWYgdGhlIHJlcG9ydCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBpZGVudGlmaWVyIGlzCisgICAgICAgIGVuYWJsZWQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnRzX3N0YXRlLmdldChyZXBvcnRpZCwgVHJ1ZSkKKworICAgIGRlZiBtYWtlX3JlcG9ydHMoc2VsZiwgc3RhdHMsIG9sZF9zdGF0cyk6CisgICAgICAgICIiInJlbmRlciByZWdpc3RlcmVkIHJlcG9ydHMiIiIKKyAgICAgICAgc2VjdCA9IFNlY3Rpb24oIlJlcG9ydCIsICIlcyBzdGF0ZW1lbnRzIGFuYWx5c2VkLiIgJSAoc2VsZi5zdGF0c1sic3RhdGVtZW50Il0pKQorICAgICAgICBmb3IgY2hlY2tlciBpbiBzZWxmLnJlcG9ydF9vcmRlcigpOgorICAgICAgICAgICAgZm9yIHJlcG9ydGlkLCByX3RpdGxlLCByX2NiIGluIHNlbGYuX3JlcG9ydHNbY2hlY2tlcl06CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVwb3J0X2lzX2VuYWJsZWQocmVwb3J0aWQpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlcG9ydF9zZWN0ID0gU2VjdGlvbihyX3RpdGxlKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcl9jYihyZXBvcnRfc2VjdCwgc3RhdHMsIG9sZF9zdGF0cykKKyAgICAgICAgICAgICAgICBleGNlcHQgRW1wdHlSZXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZXBvcnRfc2VjdC5yZXBvcnRfaWQgPSByZXBvcnRpZAorICAgICAgICAgICAgICAgIHNlY3QuYXBwZW5kKHJlcG9ydF9zZWN0KQorICAgICAgICByZXR1cm4gc2VjdAorCisgICAgZGVmIGFkZF9zdGF0cyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgICIiImFkZCBzb21lIHN0YXRzIGVudHJpZXMgdG8gdGhlIHN0YXRpc3RpYyBkaWN0aW9uYXJ5CisgICAgICAgIHJhaXNlIGFuIEFzc2VydGlvbkVycm9yIGlmIHRoZXJlIGlzIGEga2V5IGNvbmZsaWN0CisgICAgICAgICIiIgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2FyZ3MuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleVstMV0gPT0gIl8iOgorICAgICAgICAgICAgICAgIGtleSA9IGtleVs6LTFdCisgICAgICAgICAgICBhc3NlcnQga2V5IG5vdCBpbiBzZWxmLnN0YXRzCisgICAgICAgICAgICBzZWxmLnN0YXRzW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gc2VsZi5zdGF0cwpkaWZmIC0tZ2l0IGEvcHlsaW50L3JlcG9ydGVycy90ZXh0LnB5IGIvcHlsaW50L3JlcG9ydGVycy90ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZThkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvcmVwb3J0ZXJzL3RleHQucHkKQEAgLTAsMCArMSwyNTEgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIDIwMTAtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IHkya2J1Z2dlciA8eTJrYnVnZ2VyQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTmljayBEcm96ZCA8bmljaG9sYXNkcm96ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEphY2UgQnJvd25pbmcgPGphY2Vicm93bmluZ0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiUGxhaW4gdGV4dCByZXBvcnRlcnM6CisKKzp0ZXh0OiB0aGUgZGVmYXVsdCBvbmUgZ3JvdXBpbmcgbWVzc2FnZXMgYnkgbW9kdWxlCis6Y29sb3JpemVkOiBhbiBBTlNJIGNvbG9yaXplZCB0ZXh0IHJlcG9ydGVyCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gcHlsaW50IGltcG9ydCB1dGlscworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSVJlcG9ydGVyCitmcm9tIHB5bGludC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIHB5bGludC5yZXBvcnRlcnMgaW1wb3J0IEJhc2VSZXBvcnRlcgorZnJvbSBweWxpbnQucmVwb3J0ZXJzLnVyZXBvcnRzLnRleHRfd3JpdGVyIGltcG9ydCBUZXh0V3JpdGVyCisKK1RJVExFX1VOREVSTElORVMgPSBbIiIsICI9IiwgIi0iLCAiLiJdCisKK0FOU0lfUFJFRklYID0gIlwwMzNbIgorQU5TSV9FTkQgPSAibSIKK0FOU0lfUkVTRVQgPSAiXDAzM1swbSIKK0FOU0lfU1RZTEVTID0geworICAgICJyZXNldCI6ICIwIiwKKyAgICAiYm9sZCI6ICIxIiwKKyAgICAiaXRhbGljIjogIjMiLAorICAgICJ1bmRlcmxpbmUiOiAiNCIsCisgICAgImJsaW5rIjogIjUiLAorICAgICJpbnZlcnNlIjogIjciLAorICAgICJzdHJpa2UiOiAiOSIsCit9CitBTlNJX0NPTE9SUyA9IHsKKyAgICAicmVzZXQiOiAiMCIsCisgICAgImJsYWNrIjogIjMwIiwKKyAgICAicmVkIjogIjMxIiwKKyAgICAiZ3JlZW4iOiAiMzIiLAorICAgICJ5ZWxsb3ciOiAiMzMiLAorICAgICJibHVlIjogIjM0IiwKKyAgICAibWFnZW50YSI6ICIzNSIsCisgICAgImN5YW4iOiAiMzYiLAorICAgICJ3aGl0ZSI6ICIzNyIsCit9CisKKworZGVmIF9nZXRfYW5zaV9jb2RlKGNvbG9yPU5vbmUsIHN0eWxlPU5vbmUpOgorICAgICIiInJldHVybiBhbnNpIGVzY2FwZSBjb2RlIGNvcnJlc3BvbmRpbmcgdG8gY29sb3IgYW5kIHN0eWxlCisKKyAgICA6dHlwZSBjb2xvcjogc3RyIG9yIE5vbmUKKyAgICA6cGFyYW0gY29sb3I6CisgICAgICB0aGUgY29sb3IgbmFtZSAoc2VlIGBBTlNJX0NPTE9SU2AgZm9yIGF2YWlsYWJsZSB2YWx1ZXMpCisgICAgICBvciB0aGUgY29sb3IgbnVtYmVyIHdoZW4gMjU2IGNvbG9ycyBhcmUgYXZhaWxhYmxlCisKKyAgICA6dHlwZSBzdHlsZTogc3RyIG9yIE5vbmUKKyAgICA6cGFyYW0gc3R5bGU6CisgICAgICBzdHlsZSBzdHJpbmcgKHNlZSBgQU5TSV9DT0xPUlNgIGZvciBhdmFpbGFibGUgdmFsdWVzKS4gVG8gZ2V0CisgICAgICBzZXZlcmFsIHN0eWxlIGVmZmVjdHMgYXQgdGhlIHNhbWUgdGltZSwgdXNlIGEgY29tYSBhcyBzZXBhcmF0b3IuCisKKyAgICA6cmFpc2UgS2V5RXJyb3I6IGlmIGFuIHVuZXhpc3RlbnQgY29sb3Igb3Igc3R5bGUgaWRlbnRpZmllciBpcyBnaXZlbgorCisgICAgOnJ0eXBlOiBzdHIKKyAgICA6cmV0dXJuOiB0aGUgYnVpbHQgZXNjYXBlIGNvZGUKKyAgICAiIiIKKyAgICBhbnNpX2NvZGUgPSBbXQorICAgIGlmIHN0eWxlOgorICAgICAgICBzdHlsZV9hdHRycyA9IHV0aWxzLl9zcGxpdHN0cmlwKHN0eWxlKQorICAgICAgICBmb3IgZWZmZWN0IGluIHN0eWxlX2F0dHJzOgorICAgICAgICAgICAgYW5zaV9jb2RlLmFwcGVuZChBTlNJX1NUWUxFU1tlZmZlY3RdKQorICAgIGlmIGNvbG9yOgorICAgICAgICBpZiBjb2xvci5pc2RpZ2l0KCk6CisgICAgICAgICAgICBhbnNpX2NvZGUuZXh0ZW5kKFsiMzgiLCAiNSJdKQorICAgICAgICAgICAgYW5zaV9jb2RlLmFwcGVuZChjb2xvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFuc2lfY29kZS5hcHBlbmQoQU5TSV9DT0xPUlNbY29sb3JdKQorICAgIGlmIGFuc2lfY29kZToKKyAgICAgICAgcmV0dXJuIEFOU0lfUFJFRklYICsgIjsiLmpvaW4oYW5zaV9jb2RlKSArIEFOU0lfRU5ECisgICAgcmV0dXJuICIiCisKKworZGVmIGNvbG9yaXplX2Fuc2kobXNnLCBjb2xvcj1Ob25lLCBzdHlsZT1Ob25lKToKKyAgICAiIiJjb2xvcml6ZSBtZXNzYWdlIGJ5IHdyYXBwaW5nIGl0IHdpdGggYW5zaSBlc2NhcGUgY29kZXMKKworICAgIDp0eXBlIG1zZzogc3RyIG9yIHVuaWNvZGUKKyAgICA6cGFyYW0gbXNnOiB0aGUgbWVzc2FnZSBzdHJpbmcgdG8gY29sb3JpemUKKworICAgIDp0eXBlIGNvbG9yOiBzdHIgb3IgTm9uZQorICAgIDpwYXJhbSBjb2xvcjoKKyAgICAgIHRoZSBjb2xvciBpZGVudGlmaWVyIChzZWUgYEFOU0lfQ09MT1JTYCBmb3IgYXZhaWxhYmxlIHZhbHVlcykKKworICAgIDp0eXBlIHN0eWxlOiBzdHIgb3IgTm9uZQorICAgIDpwYXJhbSBzdHlsZToKKyAgICAgIHN0eWxlIHN0cmluZyAoc2VlIGBBTlNJX0NPTE9SU2AgZm9yIGF2YWlsYWJsZSB2YWx1ZXMpLiBUbyBnZXQKKyAgICAgIHNldmVyYWwgc3R5bGUgZWZmZWN0cyBhdCB0aGUgc2FtZSB0aW1lLCB1c2UgYSBjb21hIGFzIHNlcGFyYXRvci4KKworICAgIDpyYWlzZSBLZXlFcnJvcjogaWYgYW4gdW5leGlzdGVudCBjb2xvciBvciBzdHlsZSBpZGVudGlmaWVyIGlzIGdpdmVuCisKKyAgICA6cnR5cGU6IHN0ciBvciB1bmljb2RlCisgICAgOnJldHVybjogdGhlIGFuc2kgZXNjYXBlZCBzdHJpbmcKKyAgICAiIiIKKyAgICAjIElmIGJvdGggY29sb3IgYW5kIHN0eWxlIGFyZSBub3QgZGVmaW5lZCwgdGhlbiBsZWF2ZSB0aGUgdGV4dCBhcyBpcworICAgIGlmIGNvbG9yIGlzIE5vbmUgYW5kIHN0eWxlIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBtc2cKKyAgICBlc2NhcGVfY29kZSA9IF9nZXRfYW5zaV9jb2RlKGNvbG9yLCBzdHlsZSkKKyAgICAjIElmIGludmFsaWQgKG9yIHVua25vd24pIGNvbG9yLCBkb24ndCB3cmFwIG1zZyB3aXRoIGFuc2kgY29kZXMKKyAgICBpZiBlc2NhcGVfY29kZToKKyAgICAgICAgcmV0dXJuIGYie2VzY2FwZV9jb2RlfXttc2d9e0FOU0lfUkVTRVR9IgorICAgIHJldHVybiBtc2cKKworCitjbGFzcyBUZXh0UmVwb3J0ZXIoQmFzZVJlcG9ydGVyKToKKyAgICAiIiJSZXBvcnRzIG1lc3NhZ2VzIGFuZCBsYXlvdXRzIGluIHBsYWluIHRleHQiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gSVJlcG9ydGVyCisgICAgbmFtZSA9ICJ0ZXh0IgorICAgIGV4dGVuc2lvbiA9ICJ0eHQiCisgICAgbGluZV9mb3JtYXQgPSAie3BhdGh9OntsaW5lfTp7Y29sdW1ufToge21zZ19pZH06IHttc2d9ICh7c3ltYm9sfSkiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICBCYXNlUmVwb3J0ZXIuX19pbml0X18oc2VsZiwgb3V0cHV0KQorICAgICAgICBzZWxmLl9tb2R1bGVzID0gc2V0KCkKKyAgICAgICAgc2VsZi5fdGVtcGxhdGUgPSBzZWxmLmxpbmVfZm9ybWF0CisKKyAgICBkZWYgb25fc2V0X2N1cnJlbnRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgZmlsZXBhdGgpOgorICAgICAgICBzZWxmLl90ZW1wbGF0ZSA9IHN0cihzZWxmLmxpbnRlci5jb25maWcubXNnX3RlbXBsYXRlIG9yIHNlbGYuX3RlbXBsYXRlKQorCisgICAgZGVmIHdyaXRlX21lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgIiIiQ29udmVuaWVuY2UgbWV0aG9kIHRvIHdyaXRlIGEgZm9ybWF0dGVkIG1lc3NhZ2Ugd2l0aCBjbGFzcyBkZWZhdWx0IHRlbXBsYXRlIiIiCisgICAgICAgIHNlbGYud3JpdGVsbihtc2cuZm9ybWF0KHNlbGYuX3RlbXBsYXRlKSkKKworICAgIGRlZiBoYW5kbGVfbWVzc2FnZShzZWxmLCBtc2c6IE1lc3NhZ2UpIC0+IE5vbmU6CisgICAgICAgICIiIm1hbmFnZSBtZXNzYWdlIG9mIGRpZmZlcmVudCB0eXBlIGFuZCBpbiB0aGUgY29udGV4dCBvZiBwYXRoIiIiCisgICAgICAgIGlmIG1zZy5tb2R1bGUgbm90IGluIHNlbGYuX21vZHVsZXM6CisgICAgICAgICAgICBpZiBtc2cubW9kdWxlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVsbigiKioqKioqKioqKioqKiBNb2R1bGUgJXMiICUgbXNnLm1vZHVsZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9tb2R1bGVzLmFkZChtc2cubW9kdWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlbG4oIioqKioqKioqKioqKiogIikKKyAgICAgICAgc2VsZi53cml0ZV9tZXNzYWdlKG1zZykKKworICAgIGRlZiBfZGlzcGxheShzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJsYXVuY2ggbGF5b3V0cyBkaXNwbGF5IiIiCisgICAgICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgICAgIFRleHRXcml0ZXIoKS5mb3JtYXQobGF5b3V0LCBzZWxmLm91dCkKKworCitjbGFzcyBQYXJzZWFibGVUZXh0UmVwb3J0ZXIoVGV4dFJlcG9ydGVyKToKKyAgICAiIiJhIHJlcG9ydGVyIHZlcnkgc2ltaWxhciB0byBUZXh0UmVwb3J0ZXIsIGJ1dCBkaXNwbGF5IG1lc3NhZ2VzIGluIGEgZm9ybQorICAgIHJlY29nbml6ZWQgYnkgbW9zdCB0ZXh0IGVkaXRvcnMgOgorCisgICAgPGZpbGVuYW1lPjo8bGluZW51bT46PG1zZz4KKyAgICAiIiIKKworICAgIG5hbWUgPSAicGFyc2VhYmxlIgorICAgIGxpbmVfZm9ybWF0ID0gIntwYXRofTp7bGluZX06IFt7bXNnX2lkfSh7c3ltYm9sfSksIHtvYmp9XSB7bXNnfSIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiJXMgb3V0cHV0IGZvcm1hdCBpcyBkZXByZWNhdGVkLiBUaGlzIGlzIGVxdWl2YWxlbnQgIgorICAgICAgICAgICAgInRvIC0tbXNnLXRlbXBsYXRlPSVzIiAlIChzZWxmLm5hbWUsIHNlbGYubGluZV9mb3JtYXQpLAorICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICApCisgICAgICAgIFRleHRSZXBvcnRlci5fX2luaXRfXyhzZWxmLCBvdXRwdXQpCisKKworY2xhc3MgVlNUZXh0UmVwb3J0ZXIoUGFyc2VhYmxlVGV4dFJlcG9ydGVyKToKKyAgICAiIiJWaXN1YWwgc3R1ZGlvIHRleHQgcmVwb3J0ZXIiIiIKKworICAgIG5hbWUgPSAibXN2cyIKKyAgICBsaW5lX2Zvcm1hdCA9ICJ7cGF0aH0oe2xpbmV9KTogW3ttc2dfaWR9KHtzeW1ib2x9KXtvYmp9XSB7bXNnfSIKKworCitjbGFzcyBDb2xvcml6ZWRUZXh0UmVwb3J0ZXIoVGV4dFJlcG9ydGVyKToKKyAgICAiIiJTaW1wbGUgVGV4dFJlcG9ydGVyIHRoYXQgY29sb3JpemVzIHRleHQgb3V0cHV0IiIiCisKKyAgICBuYW1lID0gImNvbG9yaXplZCIKKyAgICBDT0xPUl9NQVBQSU5HID0geworICAgICAgICAiSSI6ICgiZ3JlZW4iLCBOb25lKSwKKyAgICAgICAgIkMiOiAoTm9uZSwgImJvbGQiKSwKKyAgICAgICAgIlIiOiAoIm1hZ2VudGEiLCAiYm9sZCwgaXRhbGljIiksCisgICAgICAgICJXIjogKCJtYWdlbnRhIiwgTm9uZSksCisgICAgICAgICJFIjogKCJyZWQiLCAiYm9sZCIpLAorICAgICAgICAiRiI6ICgicmVkIiwgImJvbGQsIHVuZGVybGluZSIpLAorICAgICAgICAiUyI6ICgieWVsbG93IiwgImludmVyc2UiKSwgICMgUyBzdGFuZHMgZm9yIG1vZHVsZSBTZXBhcmF0b3IKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0cHV0PU5vbmUsIGNvbG9yX21hcHBpbmc9Tm9uZSk6CisgICAgICAgIFRleHRSZXBvcnRlci5fX2luaXRfXyhzZWxmLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY29sb3JfbWFwcGluZyA9IGNvbG9yX21hcHBpbmcgb3IgZGljdChDb2xvcml6ZWRUZXh0UmVwb3J0ZXIuQ09MT1JfTUFQUElORykKKyAgICAgICAgYW5zaV90ZXJtcyA9IFsieHRlcm0tMTZjb2xvciIsICJ4dGVybS0yNTZjb2xvciJdCisgICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJURVJNIikgbm90IGluIGFuc2lfdGVybXM6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtZXJyb3IsaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKKyAgICAgICAgICAgICAgICBpbXBvcnQgY29sb3JhbWEKKworICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gY29sb3JhbWEuQW5zaVRvV2luMzIoc2VsZi5vdXQpCisKKyAgICBkZWYgX2dldF9kZWNvcmF0aW9uKHNlbGYsIG1zZ19pZCk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHR1cGxlIGNvbG9yLCBzdHlsZSBhc3NvY2lhdGVkIHdpdGggbXNnX2lkIGFzIGRlZmluZWQKKyAgICAgICAgaW4gc2VsZi5jb2xvcl9tYXBwaW5nCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb2xvcl9tYXBwaW5nW21zZ19pZFswXV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgIGRlZiBoYW5kbGVfbWVzc2FnZShzZWxmLCBtc2c6IE1lc3NhZ2UpIC0+IE5vbmU6CisgICAgICAgICIiIm1hbmFnZSBtZXNzYWdlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIGNvbG9yaXplIG91dHB1dAorICAgICAgICB1c2luZyBhbnNpIGVzY2FwZSBjb2RlcworICAgICAgICAiIiIKKyAgICAgICAgaWYgbXNnLm1vZHVsZSBub3QgaW4gc2VsZi5fbW9kdWxlczoKKyAgICAgICAgICAgIGNvbG9yLCBzdHlsZSA9IHNlbGYuX2dldF9kZWNvcmF0aW9uKCJTIikKKyAgICAgICAgICAgIGlmIG1zZy5tb2R1bGU6CisgICAgICAgICAgICAgICAgbW9kc2VwID0gY29sb3JpemVfYW5zaSgKKyAgICAgICAgICAgICAgICAgICAgIioqKioqKioqKioqKiogTW9kdWxlICVzIiAlIG1zZy5tb2R1bGUsIGNvbG9yLCBzdHlsZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbW9kc2VwID0gY29sb3JpemVfYW5zaSgiKioqKioqKioqKioqKiAlcyIgJSBtc2cubW9kdWxlLCBjb2xvciwgc3R5bGUpCisgICAgICAgICAgICBzZWxmLndyaXRlbG4obW9kc2VwKQorICAgICAgICAgICAgc2VsZi5fbW9kdWxlcy5hZGQobXNnLm1vZHVsZSkKKyAgICAgICAgY29sb3IsIHN0eWxlID0gc2VsZi5fZ2V0X2RlY29yYXRpb24obXNnLkMpCisKKyAgICAgICAgbXNnID0gbXNnLl9yZXBsYWNlKAorICAgICAgICAgICAgKip7CisgICAgICAgICAgICAgICAgYXR0cjogY29sb3JpemVfYW5zaShnZXRhdHRyKG1zZywgYXR0ciksIGNvbG9yLCBzdHlsZSkKKyAgICAgICAgICAgICAgICBmb3IgYXR0ciBpbiAoIm1zZyIsICJzeW1ib2wiLCAiY2F0ZWdvcnkiLCAiQyIpCisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICAgICAgc2VsZi53cml0ZV9tZXNzYWdlKG1zZykKKworCitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICAiIiJSZWdpc3RlciB0aGUgcmVwb3J0ZXIgY2xhc3NlcyB3aXRoIHRoZSBsaW50ZXIuIiIiCisgICAgbGludGVyLnJlZ2lzdGVyX3JlcG9ydGVyKFRleHRSZXBvcnRlcikKKyAgICBsaW50ZXIucmVnaXN0ZXJfcmVwb3J0ZXIoUGFyc2VhYmxlVGV4dFJlcG9ydGVyKQorICAgIGxpbnRlci5yZWdpc3Rlcl9yZXBvcnRlcihWU1RleHRSZXBvcnRlcikKKyAgICBsaW50ZXIucmVnaXN0ZXJfcmVwb3J0ZXIoQ29sb3JpemVkVGV4dFJlcG9ydGVyKQpkaWZmIC0tZ2l0IGEvcHlsaW50L3JlcG9ydGVycy91cmVwb3J0cy9fX2luaXRfXy5weSBiL3B5bGludC9yZXBvcnRlcnMvdXJlcG9ydHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhM2EzNwotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC9yZXBvcnRlcnMvdXJlcG9ydHMvX19pbml0X18ucHkKQEAgLTAsMCArMSw5OCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOSwgMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJVbml2ZXJzYWwgcmVwb3J0IG9iamVjdHMgYW5kIHNvbWUgZm9ybWF0dGluZyBkcml2ZXJzLgorCitBIHdheSB0byBjcmVhdGUgc2ltcGxlIHJlcG9ydHMgdXNpbmcgcHl0aG9uIG9iamVjdHMsIHByaW1hcmlseSBkZXNpZ25lZCB0byBiZQorZm9ybWF0dGVkIGFzIHRleHQgYW5kIGh0bWwuCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KKworCitjbGFzcyBCYXNlV3JpdGVyOgorICAgICIiImJhc2UgY2xhc3MgZm9yIHVyZXBvcnQgd3JpdGVycyIiIgorCisgICAgZGVmIGZvcm1hdChzZWxmLCBsYXlvdXQsIHN0cmVhbT1Ob25lLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgIiIiZm9ybWF0IGFuZCB3cml0ZSB0aGUgZ2l2ZW4gbGF5b3V0IGludG8gdGhlIHN0cmVhbSBvYmplY3QKKworICAgICAgICB1bmljb2RlIHBvbGljeTogdW5pY29kZSBzdHJpbmdzIG1heSBiZSBmb3VuZCBpbiB0aGUgbGF5b3V0OworICAgICAgICB0cnkgdG8gY2FsbCBzdHJlYW0ud3JpdGUgd2l0aCBpdCwgYnV0IGdpdmUgaXQgYmFjayBlbmNvZGVkIHVzaW5nCisgICAgICAgIHRoZSBnaXZlbiBlbmNvZGluZyBpZiBpdCBmYWlscworICAgICAgICAiIiIKKyAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgICAgICBzdHJlYW0gPSBzeXMuc3Rkb3V0CisgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gZ2V0YXR0cihzdHJlYW0sICJlbmNvZGluZyIsICJVVEYtOCIpCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZyBvciAiVVRGLTgiCisgICAgICAgIHNlbGYub3V0ID0gc3RyZWFtCisgICAgICAgIHNlbGYuYmVnaW5fZm9ybWF0KCkKKyAgICAgICAgbGF5b3V0LmFjY2VwdChzZWxmKQorICAgICAgICBzZWxmLmVuZF9mb3JtYXQoKQorCisgICAgZGVmIGZvcm1hdF9jaGlsZHJlbihzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJyZWN1cnNlIG9uIHRoZSBsYXlvdXQgY2hpbGRyZW4gYW5kIGNhbGwgdGhlaXIgYWNjZXB0IG1ldGhvZAorICAgICAgICAoc2VlIHRoZSBWaXNpdG9yIHBhdHRlcm4pCisgICAgICAgICIiIgorICAgICAgICBmb3IgY2hpbGQgaW4gZ2V0YXR0cihsYXlvdXQsICJjaGlsZHJlbiIsICgpKToKKyAgICAgICAgICAgIGNoaWxkLmFjY2VwdChzZWxmKQorCisgICAgZGVmIHdyaXRlbG4oc2VsZiwgc3RyaW5nPSIiKToKKyAgICAgICAgIiIid3JpdGUgYSBsaW5lIGluIHRoZSBvdXRwdXQgYnVmZmVyIiIiCisgICAgICAgIHNlbGYud3JpdGUoc3RyaW5nICsgb3MubGluZXNlcCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBzdHJpbmcpOgorICAgICAgICAiIiJ3cml0ZSBhIHN0cmluZyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciIiIgorICAgICAgICBzZWxmLm91dC53cml0ZShzdHJpbmcpCisKKyAgICBkZWYgYmVnaW5fZm9ybWF0KHNlbGYpOgorICAgICAgICAiIiJiZWdpbiB0byBmb3JtYXQgYSBsYXlvdXQiIiIKKyAgICAgICAgc2VsZi5zZWN0aW9uID0gMAorCisgICAgZGVmIGVuZF9mb3JtYXQoc2VsZik6CisgICAgICAgICIiImZpbmlzaGVkIHRvIGZvcm1hdCBhIGxheW91dCIiIgorCisgICAgZGVmIGdldF90YWJsZV9jb250ZW50KHNlbGYsIHRhYmxlKToKKyAgICAgICAgIiIidHJpY2sgdG8gZ2V0IHRhYmxlIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSB3cml0aW5nIGl0CisKKyAgICAgICAgcmV0dXJuIGFuIGFsaWduZWQgbGlzdCBvZiBsaXN0cyBjb250YWluaW5nIHRhYmxlIGNlbGxzIHZhbHVlcyBhcyBzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IFtbXV0KKyAgICAgICAgY29scyA9IHRhYmxlLmNvbHMKKyAgICAgICAgZm9yIGNlbGwgaW4gc2VsZi5jb21wdXRlX2NvbnRlbnQodGFibGUpOgorICAgICAgICAgICAgaWYgY29scyA9PSAwOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoW10pCisgICAgICAgICAgICAgICAgY29scyA9IHRhYmxlLmNvbHMKKyAgICAgICAgICAgIGNvbHMgLT0gMQorICAgICAgICAgICAgcmVzdWx0Wy0xXS5hcHBlbmQoY2VsbCkKKyAgICAgICAgIyBmaWxsIG1pc3NpbmcgY2VsbHMKKyAgICAgICAgd2hpbGUgbGVuKHJlc3VsdFstMV0pIDwgY29sczoKKyAgICAgICAgICAgIHJlc3VsdFstMV0uYXBwZW5kKCIiKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgY29tcHV0ZV9jb250ZW50KHNlbGYsIGxheW91dCk6CisgICAgICAgICIiInRyaWNrIHRvIGNvbXB1dGUgdGhlIGZvcm1hdHRpbmcgb2YgY2hpbGRyZW4gbGF5b3V0IGJlZm9yZSBhY3R1YWxseQorICAgICAgICB3cml0aW5nIGl0CisKKyAgICAgICAgcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHN0cmluZ3MgKG9uZSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50KQorICAgICAgICAiIiIKKyAgICAgICAgIyBQYXRjaCB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIHdpdGggYSBmcmVzaC1nZW5lcmF0ZWQgc3RyZWFtLAorICAgICAgICAjIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgYSB0ZW1wb3JhcnkgcmVwcmVzZW50YXRpb24gb2YgYSBjaGlsZAorICAgICAgICAjIG5vZGUuCisgICAgICAgIG91dCA9IHNlbGYub3V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBsYXlvdXQuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gc3RyZWFtCisgICAgICAgICAgICAgICAgY2hpbGQuYWNjZXB0KHNlbGYpCisgICAgICAgICAgICAgICAgeWllbGQgc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYub3V0ID0gb3V0CmRpZmYgLS1naXQgYS9weWxpbnQvcmVwb3J0ZXJzL3VyZXBvcnRzL25vZGVzLnB5IGIvcHlsaW50L3JlcG9ydGVycy91cmVwb3J0cy9ub2Rlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmMzNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3JlcG9ydGVycy91cmVwb3J0cy9ub2Rlcy5weQpAQCAtMCwwICsxLDE5MSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggTmljayBEcm96ZCA8bmljaG9sYXNkcm96ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIk1pY3JvIHJlcG9ydHMgb2JqZWN0cy4KKworQSBtaWNybyByZXBvcnQgaXMgYSB0cmVlIG9mIGxheW91dCBhbmQgY29udGVudCBvYmplY3RzLgorIiIiCisKKworY2xhc3MgVk5vZGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5pZD1Ob25lKToKKyAgICAgICAgc2VsZi5pZCA9IG5pZAorICAgICAgICAjIG5hdmlnYXRpb24KKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLmNoaWxkcmVuKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBjaGlsZCk6CisgICAgICAgICIiImFkZCBhIG5vZGUgdG8gY2hpbGRyZW4iIiIKKyAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisgICAgICAgIGNoaWxkLnBhcmVudCA9IHNlbGYKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGNoaWxkKToKKyAgICAgICAgIiIiaW5zZXJ0IGEgY2hpbGQgbm9kZSIiIgorICAgICAgICBzZWxmLmNoaWxkcmVuLmluc2VydChpbmRleCwgY2hpbGQpCisgICAgICAgIGNoaWxkLnBhcmVudCA9IHNlbGYKKworICAgIGRlZiBfZ2V0X3Zpc2l0X25hbWUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdGhlIHZpc2l0IG5hbWUgZm9yIHRoZSBtaXhlZCBjbGFzcy4gV2hlbiBjYWxsaW5nICdhY2NlcHQnLCB0aGUKKyAgICAgICAgbWV0aG9kIDwndmlzaXRfJyArIG5hbWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Q+IHdpbGwgYmUgY2FsbGVkIG9uIHRoZQorICAgICAgICB2aXNpdG9yCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKKyAgICAgICAgICAgIHJldHVybiBzZWxmLlRZUEUucmVwbGFjZSgiLSIsICJfIikKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9YnJvYWQtZXhjZXB0CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18ubG93ZXIoKQorCisgICAgZGVmIGFjY2VwdChzZWxmLCB2aXNpdG9yLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmdW5jID0gZ2V0YXR0cih2aXNpdG9yLCAidmlzaXRfJXMiICUgc2VsZi5fZ2V0X3Zpc2l0X25hbWUoKSkKKyAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGxlYXZlKHNlbGYsIHZpc2l0b3IsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHZpc2l0b3IsICJsZWF2ZV8lcyIgJSBzZWxmLl9nZXRfdmlzaXRfbmFtZSgpKQorICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKworY2xhc3MgQmFzZUxheW91dChWTm9kZSk6CisgICAgIiIiYmFzZSBjb250YWluZXIgbm9kZQorCisgICAgYXR0cmlidXRlcworICAgICogY2hpbGRyZW4gOiBjb21wb25lbnRzIGluIHRoaXMgdGFibGUgKGkuZS4gdGhlIHRhYmxlJ3MgY2VsbHMpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2hpbGRyZW49KCksICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqKmt3YXJncykKKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgVk5vZGUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXBwZW5kKGNoaWxkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF90ZXh0KGNoaWxkKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBjaGlsZCk6CisgICAgICAgICIiIm92ZXJyaWRkZW4gdG8gZGV0ZWN0IHByb2JsZW1zIGVhc2lseSIiIgorICAgICAgICBhc3NlcnQgY2hpbGQgbm90IGluIHNlbGYucGFyZW50cygpCisgICAgICAgIFZOb2RlLmFwcGVuZChzZWxmLCBjaGlsZCkKKworICAgIGRlZiBwYXJlbnRzKHNlbGYpOgorICAgICAgICAiIiJyZXR1cm4gdGhlIGFuY2VzdG9yIG5vZGVzIiIiCisgICAgICAgIGFzc2VydCBzZWxmLnBhcmVudCBpcyBub3Qgc2VsZgorICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHJldHVybiBbc2VsZi5wYXJlbnRdICsgc2VsZi5wYXJlbnQucGFyZW50cygpCisKKyAgICBkZWYgYWRkX3RleHQoc2VsZiwgdGV4dCk6CisgICAgICAgICIiInNob3J0Y3V0IHRvIGFkZCB0ZXh0IGRhdGEiIiIKKyAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoVGV4dCh0ZXh0KSkKKworCisjIG5vbiBjb250YWluZXIgbm9kZXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgVGV4dChWTm9kZSk6CisgICAgIiIiYSB0ZXh0IHBvcnRpb24KKworICAgIGF0dHJpYnV0ZXMgOgorICAgICogZGF0YSA6IHRoZSB0ZXh0IHZhbHVlIGFzIGFuIGVuY29kZWQgb3IgdW5pY29kZSBzdHJpbmcKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCBlc2NhcGVkPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqKmt3YXJncykKKyAgICAgICAgIyBpZiBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgorICAgICAgICAjICAgIGRhdGEgPSBkYXRhLmVuY29kZSgnYXNjaWknKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhLCBzdHIpLCBkYXRhLl9fY2xhc3NfXworICAgICAgICBzZWxmLmVzY2FwZWQgPSBlc2NhcGVkCisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKworCitjbGFzcyBWZXJiYXRpbVRleHQoVGV4dCk6CisgICAgIiIiYSB2ZXJiYXRpbSB0ZXh0LCBkaXNwbGF5IHRoZSByYXcgZGF0YQorCisgICAgYXR0cmlidXRlcyA6CisgICAgKiBkYXRhIDogdGhlIHRleHQgdmFsdWUgYXMgYW4gZW5jb2RlZCBvciB1bmljb2RlIHN0cmluZworICAgICIiIgorCisKKyMgY29udGFpbmVyIG5vZGVzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitjbGFzcyBTZWN0aW9uKEJhc2VMYXlvdXQpOgorICAgICIiImEgc2VjdGlvbgorCisgICAgYXR0cmlidXRlcyA6CisgICAgKiBCYXNlTGF5b3V0IGF0dHJpYnV0ZXMKKworICAgIGEgdGl0bGUgbWF5IGFsc28gYmUgZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yLCBpdCdsbCBiZSBhZGRlZAorICAgIGFzIGEgZmlyc3QgZWxlbWVudAorICAgIGEgZGVzY3JpcHRpb24gbWF5IGFsc28gYmUgZ2l2ZW4gdG8gdGhlIGNvbnN0cnVjdG9yLCBpdCdsbCBiZSBhZGRlZAorICAgIGFzIGEgZmlyc3QgcGFyYWdyYXBoCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGU9Tm9uZSwgZGVzY3JpcHRpb249Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCoqa3dhcmdzKQorICAgICAgICBpZiBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIHNlbGYuaW5zZXJ0KDAsIFBhcmFncmFwaChbVGV4dChkZXNjcmlwdGlvbildKSkKKyAgICAgICAgaWYgdGl0bGU6CisgICAgICAgICAgICBzZWxmLmluc2VydCgwLCBUaXRsZShjaGlsZHJlbj0odGl0bGUsKSkpCisKKworY2xhc3MgRXZhbHVhdGlvblNlY3Rpb24oU2VjdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqKmt3YXJncykKKyAgICAgICAgdGl0bGUgPSBQYXJhZ3JhcGgoKQorICAgICAgICB0aXRsZS5hcHBlbmQoVGV4dCgiLSIgKiBsZW4obWVzc2FnZSkpKQorICAgICAgICBzZWxmLmFwcGVuZCh0aXRsZSkKKworICAgICAgICBtZXNzYWdlX2JvZHkgPSBQYXJhZ3JhcGgoKQorICAgICAgICBtZXNzYWdlX2JvZHkuYXBwZW5kKFRleHQobWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXBwZW5kKG1lc3NhZ2VfYm9keSkKKworCitjbGFzcyBUaXRsZShCYXNlTGF5b3V0KToKKyAgICAiIiJhIHRpdGxlCisKKyAgICBhdHRyaWJ1dGVzIDoKKyAgICAqIEJhc2VMYXlvdXQgYXR0cmlidXRlcworCisgICAgQSB0aXRsZSBtdXN0IG5vdCBjb250YWlucyBhIHNlY3Rpb24gbm9yIGEgcGFyYWdyYXBoIQorICAgICIiIgorCisKK2NsYXNzIFBhcmFncmFwaChCYXNlTGF5b3V0KToKKyAgICAiIiJhIHNpbXBsZSB0ZXh0IHBhcmFncmFwaAorCisgICAgYXR0cmlidXRlcyA6CisgICAgKiBCYXNlTGF5b3V0IGF0dHJpYnV0ZXMKKworICAgIEEgcGFyYWdyYXBoIG11c3Qgbm90IGNvbnRhaW5zIGEgc2VjdGlvbiAhCisgICAgIiIiCisKKworY2xhc3MgVGFibGUoQmFzZUxheW91dCk6CisgICAgIiIic29tZSB0YWJ1bGFyIGRhdGEKKworICAgIGF0dHJpYnV0ZXMgOgorICAgICogQmFzZUxheW91dCBhdHRyaWJ1dGVzCisgICAgKiBjb2xzIDogdGhlIG51bWJlciBvZiBjb2x1bW5zIG9mIHRoZSB0YWJsZSAoUkVRVUlSRUQpCisgICAgKiByaGVhZGVycyA6IHRoZSBmaXJzdCByb3cncyBlbGVtZW50cyBhcmUgdGFibGUncyBoZWFkZXIKKyAgICAqIGNoZWFkZXJzIDogdGhlIGZpcnN0IGNvbCdzIGVsZW1lbnRzIGFyZSB0YWJsZSdzIGhlYWRlcgorICAgICogdGl0bGUgOiB0aGUgdGFibGUncyBvcHRpb25hbCB0aXRsZQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbHMsIHRpdGxlPU5vbmUsIHJoZWFkZXJzPTAsIGNoZWFkZXJzPTAsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqKmt3YXJncykKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29scywgaW50KQorICAgICAgICBzZWxmLmNvbHMgPSBjb2xzCisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLnJoZWFkZXJzID0gcmhlYWRlcnMKKyAgICAgICAgc2VsZi5jaGVhZGVycyA9IGNoZWFkZXJzCmRpZmYgLS1naXQgYS9weWxpbnQvcmVwb3J0ZXJzL3VyZXBvcnRzL3RleHRfd3JpdGVyLnB5IGIvcHlsaW50L3JlcG9ydGVycy91cmVwb3J0cy90ZXh0X3dyaXRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVlODBhCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3JlcG9ydGVycy91cmVwb3J0cy90ZXh0X3dyaXRlci5weQpAQCAtMCwwICsxLDk2IEBACisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCAyMDE4LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIGJvdCA8Ym90QG5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJUZXh0IGZvcm1hdHRpbmcgZHJpdmVycyBmb3IgdXJlcG9ydHMiIiIKKworZnJvbSBweWxpbnQucmVwb3J0ZXJzLnVyZXBvcnRzIGltcG9ydCBCYXNlV3JpdGVyCisKK1RJVExFX1VOREVSTElORVMgPSBbIiIsICI9IiwgIi0iLCAiYCIsICIuIiwgIn4iLCAiXiJdCitCVUxMRVRTID0gWyIqIiwgIi0iXQorCisKK2NsYXNzIFRleHRXcml0ZXIoQmFzZVdyaXRlcik6CisgICAgIiIiZm9ybWF0IGxheW91dHMgYXMgdGV4dAorICAgIChSZVN0cnVjdHVyZWQgaW5zcGlyYXRpb24gYnV0IG5vdCB0b3RhbGx5IGhhbmRsZWQgeWV0KQorICAgICIiIgorCisgICAgZGVmIGJlZ2luX2Zvcm1hdChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5iZWdpbl9mb3JtYXQoKQorICAgICAgICBzZWxmLmxpc3RfbGV2ZWwgPSAwCisKKyAgICBkZWYgdmlzaXRfc2VjdGlvbihzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJkaXNwbGF5IGEgc2VjdGlvbiBhcyB0ZXh0IiIiCisgICAgICAgIHNlbGYuc2VjdGlvbiArPSAxCisgICAgICAgIHNlbGYud3JpdGVsbigpCisgICAgICAgIHNlbGYuZm9ybWF0X2NoaWxkcmVuKGxheW91dCkKKyAgICAgICAgc2VsZi5zZWN0aW9uIC09IDEKKyAgICAgICAgc2VsZi53cml0ZWxuKCkKKworICAgIGRlZiB2aXNpdF9ldmFsdWF0aW9uc2VjdGlvbihzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJEaXNwbGF5IGFuIGV2YWx1YXRpb24gc2VjdGlvbiBhcyBhIHRleHQuIiIiCisgICAgICAgIHNlbGYuc2VjdGlvbiArPSAxCisgICAgICAgIHNlbGYuZm9ybWF0X2NoaWxkcmVuKGxheW91dCkKKyAgICAgICAgc2VsZi5zZWN0aW9uIC09IDEKKyAgICAgICAgc2VsZi53cml0ZWxuKCkKKworICAgIGRlZiB2aXNpdF90aXRsZShzZWxmLCBsYXlvdXQpOgorICAgICAgICB0aXRsZSA9ICIiLmpvaW4obGlzdChzZWxmLmNvbXB1dGVfY29udGVudChsYXlvdXQpKSkKKyAgICAgICAgc2VsZi53cml0ZWxuKHRpdGxlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLndyaXRlbG4oVElUTEVfVU5ERVJMSU5FU1tzZWxmLnNlY3Rpb25dICogbGVuKHRpdGxlKSkKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwcmludCgiRklYTUUgVElUTEUgVE9PIERFRVAuIFRVUk5JTkcgVElUTEUgSU5UTyBURVhUIikKKworICAgIGRlZiB2aXNpdF9wYXJhZ3JhcGgoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgIiIiZW50ZXIgYSBwYXJhZ3JhcGgiIiIKKyAgICAgICAgc2VsZi5mb3JtYXRfY2hpbGRyZW4obGF5b3V0KQorICAgICAgICBzZWxmLndyaXRlbG4oKQorCisgICAgZGVmIHZpc2l0X3RhYmxlKHNlbGYsIGxheW91dCk6CisgICAgICAgICIiImRpc3BsYXkgYSB0YWJsZSBhcyB0ZXh0IiIiCisgICAgICAgIHRhYmxlX2NvbnRlbnQgPSBzZWxmLmdldF90YWJsZV9jb250ZW50KGxheW91dCkKKyAgICAgICAgIyBnZXQgY29sdW1ucyB3aWR0aAorICAgICAgICBjb2xzX3dpZHRoID0gWzBdICogbGVuKHRhYmxlX2NvbnRlbnRbMF0pCisgICAgICAgIGZvciByb3cgaW4gdGFibGVfY29udGVudDoKKyAgICAgICAgICAgIGZvciBpbmRleCwgY29sIGluIGVudW1lcmF0ZShyb3cpOgorICAgICAgICAgICAgICAgIGNvbHNfd2lkdGhbaW5kZXhdID0gbWF4KGNvbHNfd2lkdGhbaW5kZXhdLCBsZW4oY29sKSkKKyAgICAgICAgc2VsZi5kZWZhdWx0X3RhYmxlKGxheW91dCwgdGFibGVfY29udGVudCwgY29sc193aWR0aCkKKyAgICAgICAgc2VsZi53cml0ZWxuKCkKKworICAgIGRlZiBkZWZhdWx0X3RhYmxlKHNlbGYsIGxheW91dCwgdGFibGVfY29udGVudCwgY29sc193aWR0aCk6CisgICAgICAgICIiImZvcm1hdCBhIHRhYmxlIiIiCisgICAgICAgIGNvbHNfd2lkdGggPSBbc2l6ZSArIDEgZm9yIHNpemUgaW4gY29sc193aWR0aF0KKyAgICAgICAgZm9ybWF0X3N0cmluZ3MgPSAiICIuam9pbihbIiUlLSVzcyJdICogbGVuKGNvbHNfd2lkdGgpKQorICAgICAgICBmb3JtYXRfc3RyaW5ncyA9IGZvcm1hdF9zdHJpbmdzICUgdHVwbGUoY29sc193aWR0aCkKKyAgICAgICAgZm9ybWF0X3N0cmluZ3MgPSBmb3JtYXRfc3RyaW5ncy5zcGxpdCgiICIpCisgICAgICAgIHRhYmxlX2xpbmVzZXAgPSAiXG4rIiArICIrIi5qb2luKCItIiAqIHcgZm9yIHcgaW4gY29sc193aWR0aCkgKyAiK1xuIgorICAgICAgICBoZWFkc2VwID0gIlxuKyIgKyAiKyIuam9pbigiPSIgKiB3IGZvciB3IGluIGNvbHNfd2lkdGgpICsgIitcbiIKKworICAgICAgICBzZWxmLndyaXRlKHRhYmxlX2xpbmVzZXApCisgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUodGFibGVfY29udGVudCk6CisgICAgICAgICAgICBzZWxmLndyaXRlKCJ8IikKKyAgICAgICAgICAgIGZvciBsaW5lX2luZGV4LCBhdF9pbmRleCBpbiBlbnVtZXJhdGUobGluZSk6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShmb3JtYXRfc3RyaW5nc1tsaW5lX2luZGV4XSAlIGF0X2luZGV4KQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoInwiKQorICAgICAgICAgICAgaWYgaW5kZXggPT0gMCBhbmQgbGF5b3V0LnJoZWFkZXJzOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoaGVhZHNlcCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSh0YWJsZV9saW5lc2VwKQorCisgICAgZGVmIHZpc2l0X3ZlcmJhdGltdGV4dChzZWxmLCBsYXlvdXQpOgorICAgICAgICAiIiJkaXNwbGF5IGEgdmVyYmF0aW0gbGF5b3V0IGFzIHRleHQgKHNvIGRpZmZpY3VsdCA7KSIiIgorICAgICAgICBzZWxmLndyaXRlbG4oIjo6XG4iKQorICAgICAgICBmb3IgbGluZSBpbiBsYXlvdXQuZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICBzZWxmLndyaXRlbG4oIiAgICAiICsgbGluZSkKKyAgICAgICAgc2VsZi53cml0ZWxuKCkKKworICAgIGRlZiB2aXNpdF90ZXh0KHNlbGYsIGxheW91dCk6CisgICAgICAgICIiImFkZCBzb21lIHRleHQiIiIKKyAgICAgICAgc2VsZi53cml0ZSgiJXMiICUgbGF5b3V0LmRhdGEpCmRpZmYgLS1naXQgYS9weWxpbnQvdGVzdHV0aWxzL19faW5pdF9fLnB5IGIvcHlsaW50L3Rlc3R1dGlscy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJmY2YyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEZFTEQgQm9yaXMgPGxvdGhpcmFsZGFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTMgYnVja0B5ZWxwLmNvbSA8YnVja0B5ZWxwLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IExDRCA0NyA8bGNkMDQ3QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEJyZXR0IENhbm5vbiA8YnJldHRAcHl0aG9uLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IFJpY2FyZG8gR2VtaWduYW5pIDxyaWNhcmRvLmdlbWlnbmFuaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgUm95IFdpbGxpYW1zIDxyb3kud2lsbGlhbXMuaWlpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IHhtby1vZG9vIDx4bW8tb2Rvb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBCcnljZSBHdWludGEgPGJyeWNlLnBhdWwuZ3VpbnRhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNzb2xhbmtpIDxzdXNob2JoaXRzb2xhbmtpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE1yLiBTZW5rbyA8YXRvZG9yb3ZAbXJzZW5rby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIOiwreS5nem8jiA8MTA5MjI0NTczQHFxLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTGVmdGVyaXMgS2FyYXBldHNhcyA8bGVmdGVyaXNAcmVmdS5jbz4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJGdW5jdGlvbmFsL25vbiByZWdyZXNzaW9uIHRlc3RzIGZvciBweWxpbnQiIiIKKworX19hbGxfXyA9IFsKKyAgICAiX2dldF90ZXN0c19pbmZvIiwKKyAgICAiX3Rva2VuaXplX3N0ciIsCisgICAgIkNoZWNrZXJUZXN0Q2FzZSIsCisgICAgIkZ1bmN0aW9uYWxUZXN0RmlsZSIsCisgICAgImxpbnRlciIsCisgICAgIkxpbnRNb2R1bGVUZXN0IiwKKyAgICAiTWVzc2FnZSIsCisgICAgIk1pbmltYWxUZXN0UmVwb3J0ZXIiLAorICAgICJzZXRfY29uZmlnIiwKKyAgICAiR2VuZXJpY1Rlc3RSZXBvcnRlciIsCisgICAgIlVQREFURV9GSUxFIiwKKyAgICAiVVBEQVRFX09QVElPTiIsCisgICAgIlVuaXR0ZXN0TGludGVyIiwKK10KKworZnJvbSBweWxpbnQudGVzdHV0aWxzLmNoZWNrZXJfdGVzdF9jYXNlIGltcG9ydCBDaGVja2VyVGVzdENhc2UKK2Zyb20gcHlsaW50LnRlc3R1dGlscy5jb25zdGFudHMgaW1wb3J0IFVQREFURV9GSUxFLCBVUERBVEVfT1BUSU9OCitmcm9tIHB5bGludC50ZXN0dXRpbHMuZGVjb3JhdG9yIGltcG9ydCBzZXRfY29uZmlnCitmcm9tIHB5bGludC50ZXN0dXRpbHMuZnVuY3Rpb25hbF90ZXN0X2ZpbGUgaW1wb3J0IEZ1bmN0aW9uYWxUZXN0RmlsZQorZnJvbSBweWxpbnQudGVzdHV0aWxzLmdldF90ZXN0X2luZm8gaW1wb3J0IF9nZXRfdGVzdHNfaW5mbworZnJvbSBweWxpbnQudGVzdHV0aWxzLmdsb2JhbF90ZXN0X2xpbnRlciBpbXBvcnQgbGludGVyCitmcm9tIHB5bGludC50ZXN0dXRpbHMubGludF9tb2R1bGVfdGVzdCBpbXBvcnQgTGludE1vZHVsZVRlc3QKK2Zyb20gcHlsaW50LnRlc3R1dGlscy5vdXRwdXRfbGluZSBpbXBvcnQgTWVzc2FnZQorZnJvbSBweWxpbnQudGVzdHV0aWxzLnJlcG9ydGVyX2Zvcl90ZXN0cyBpbXBvcnQgR2VuZXJpY1Rlc3RSZXBvcnRlciwgTWluaW1hbFRlc3RSZXBvcnRlcgorZnJvbSBweWxpbnQudGVzdHV0aWxzLnRva2VuaXplX3N0ciBpbXBvcnQgX3Rva2VuaXplX3N0cgorZnJvbSBweWxpbnQudGVzdHV0aWxzLnVuaXR0ZXN0X2xpbnRlciBpbXBvcnQgVW5pdHRlc3RMaW50ZXIKZGlmZiAtLWdpdCBhL3B5bGludC90ZXN0dXRpbHMvY2hlY2tlcl90ZXN0X2Nhc2UucHkgYi9weWxpbnQvdGVzdHV0aWxzL2NoZWNrZXJfdGVzdF9jYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZmU2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvdGVzdHV0aWxzL2NoZWNrZXJfdGVzdF9jYXNlLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbnRleHRsaWIKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBPcHRpb25hbCwgVHlwZQorCitmcm9tIHB5bGludC50ZXN0dXRpbHMuZ2xvYmFsX3Rlc3RfbGludGVyIGltcG9ydCBsaW50ZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscy51bml0dGVzdF9saW50ZXIgaW1wb3J0IFVuaXR0ZXN0TGludGVyCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgQVNUV2Fsa2VyCisKKworY2xhc3MgQ2hlY2tlclRlc3RDYXNlOgorICAgICIiIkEgYmFzZSB0ZXN0Y2FzZSBjbGFzcyBmb3IgdW5pdCB0ZXN0aW5nIGluZGl2aWR1YWwgY2hlY2tlciBjbGFzc2VzLiIiIgorCisgICAgQ0hFQ0tFUl9DTEFTUzogT3B0aW9uYWxbVHlwZV0gPSBOb25lCisgICAgQ09ORklHOiBEaWN0ID0ge30KKworICAgIGRlZiBzZXR1cF9tZXRob2Qoc2VsZik6CisgICAgICAgIHNlbGYubGludGVyID0gVW5pdHRlc3RMaW50ZXIoKQorICAgICAgICBzZWxmLmNoZWNrZXIgPSBzZWxmLkNIRUNLRVJfQ0xBU1Moc2VsZi5saW50ZXIpICAjIHB5bGludDogZGlzYWJsZT1ub3QtY2FsbGFibGUKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5DT05GSUcuaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZi5jaGVja2VyLmNvbmZpZywga2V5LCB2YWx1ZSkKKyAgICAgICAgc2VsZi5jaGVja2VyLm9wZW4oKQorCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgYXNzZXJ0Tm9NZXNzYWdlcyhzZWxmKToKKyAgICAgICAgIiIiQXNzZXJ0IHRoYXQgbm8gbWVzc2FnZXMgYXJlIGFkZGVkIGJ5IHRoZSBnaXZlbiBtZXRob2QuIiIiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHlpZWxkCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBhc3NlcnRBZGRzTWVzc2FnZXMoc2VsZiwgKm1lc3NhZ2VzKToKKyAgICAgICAgIiIiQXNzZXJ0IHRoYXQgZXhhY3RseSB0aGUgZ2l2ZW4gbWV0aG9kIGFkZHMgdGhlIGdpdmVuIG1lc3NhZ2VzLgorCisgICAgICAgIFRoZSBsaXN0IG9mIG1lc3NhZ2VzIG11c3QgZXhhY3RseSBtYXRjaCAqYWxsKiB0aGUgbWVzc2FnZXMgYWRkZWQgYnkgdGhlCisgICAgICAgIG1ldGhvZC4gQWRkaXRpb25hbGx5LCB3ZSBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgYXJncyBpbiBlYWNoIG1lc3NhZ2UgY2FuCisgICAgICAgIGFjdHVhbGx5IGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIG1lc3NhZ2Ugc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgeWllbGQKKyAgICAgICAgZ290ID0gc2VsZi5saW50ZXIucmVsZWFzZV9tZXNzYWdlcygpCisgICAgICAgIG5vX21zZyA9ICJObyBtZXNzYWdlLiIKKyAgICAgICAgZXhwZWN0ZWQgPSAiXG4iLmpvaW4ocmVwcihtKSBmb3IgbSBpbiBtZXNzYWdlcykgb3Igbm9fbXNnCisgICAgICAgIGdvdF9zdHIgPSAiXG4iLmpvaW4ocmVwcihtKSBmb3IgbSBpbiBnb3QpIG9yIG5vX21zZworICAgICAgICBtc2cgPSAoCisgICAgICAgICAgICAiRXhwZWN0ZWQgbWVzc2FnZXMgZGlkIG5vdCBtYXRjaCBhY3R1YWwuXG4iCisgICAgICAgICAgICBmIlxuRXhwZWN0ZWQ6XG57ZXhwZWN0ZWR9XG5cbkdvdDpcbntnb3Rfc3RyfVxuIgorICAgICAgICApCisgICAgICAgIGFzc2VydCBnb3QgPT0gbGlzdChtZXNzYWdlcyksIG1zZworCisgICAgZGVmIHdhbGsoc2VsZiwgbm9kZSk6CisgICAgICAgICIiInJlY3Vyc2l2ZSB3YWxrIG9uIHRoZSBnaXZlbiBub2RlIiIiCisgICAgICAgIHdhbGtlciA9IEFTVFdhbGtlcihsaW50ZXIpCisgICAgICAgIHdhbGtlci5hZGRfY2hlY2tlcihzZWxmLmNoZWNrZXIpCisgICAgICAgIHdhbGtlci53YWxrKG5vZGUpCmRpZmYgLS1naXQgYS9weWxpbnQvdGVzdHV0aWxzL2NvbnN0YW50cy5weSBiL3B5bGludC90ZXN0dXRpbHMvY29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTdjODQKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvdGVzdHV0aWxzL2NvbnN0YW50cy5weQpAQCAtMCwwICsxLDI4IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitmcm9tIG9zLnBhdGggaW1wb3J0IGFic3BhdGgsIGRpcm5hbWUKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitTWVNfVkVSU19TVFIgPSAiJWQlZCVkIiAlIHN5cy52ZXJzaW9uX2luZm9bOjNdCitUSVRMRV9VTkRFUkxJTkVTID0gWyIiLCAiPSIsICItIiwgIi4iXQorUFJFRklYID0gYWJzcGF0aChkaXJuYW1lKF9fZmlsZV9fKSkKK1VQREFURV9PUFRJT04gPSAiLS11cGRhdGUtZnVuY3Rpb25hbC1vdXRwdXQiCitVUERBVEVfRklMRSA9IFBhdGgoInB5bGludC1mdW5jdGlvbmFsLXRlc3QtdXBkYXRlIikKKyMgQ29tbW9uIHN1Yi1leHByZXNzaW9ucy4KK19NRVNTQUdFID0geyJtc2ciOiByIlthLXpdW2EtelwtXSsifQorIyBNYXRjaGVzIGEgIywKKyMgIC0gZm9sbG93ZWQgYnkgYSBjb21wYXJpc29uIG9wZXJhdG9yIGFuZCBhIFB5dGhvbiB2ZXJzaW9uIChvcHRpb25hbCksCisjICAtIGZvbGxvd2VkIGJ5IGEgbGluZSBudW1iZXIgd2l0aCBhICsvLSAob3B0aW9uYWwpLAorIyAgLSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgYnJhY2tldGVkIG1lc3NhZ2Ugc3ltYm9scy4KKyMgVXNlZCB0byBleHRyYWN0IGV4cGVjdGVkIG1lc3NhZ2VzIGZyb20gdGVzdGRhdGEgZmlsZXMuCitfRVhQRUNURURfUkUgPSByZS5jb21waWxlKAorICAgIHIiXHMqI1xzKig/Oig/UDxsaW5lPlsrLV0/WzAtOV0rKTopPyIKKyAgICByIig/Oig/UDxvcD5bPjw9XSspICooP1A8dmVyc2lvbj5bMC05Ll0rKTopPyIKKyAgICByIlxzKlxbKD9QPG1zZ3M+JShtc2cpcyg/OixccyolKG1zZylzKSopXSIgJSBfTUVTU0FHRQorKQorCitfT1BFUkFUT1JTID0geyI+Ijogb3BlcmF0b3IuZ3QsICI8Ijogb3BlcmF0b3IubHQsICI+PSI6IG9wZXJhdG9yLmdlLCAiPD0iOiBvcGVyYXRvci5sZX0KZGlmZiAtLWdpdCBhL3B5bGludC90ZXN0dXRpbHMvZGVjb3JhdG9yLnB5IGIvcHlsaW50L3Rlc3R1dGlscy9kZWNvcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NDBlZQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC90ZXN0dXRpbHMvZGVjb3JhdG9yLnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGZ1bmN0b29scworCitmcm9tIHB5bGludC50ZXN0dXRpbHMuY2hlY2tlcl90ZXN0X2Nhc2UgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZQorCisKK2RlZiBzZXRfY29uZmlnKCoqa3dhcmdzKToKKyAgICAiIiJEZWNvcmF0b3IgZm9yIHNldHRpbmcgY29uZmlnIHZhbHVlcyBvbiBhIGNoZWNrZXIuCisKKyAgICBQYXNzaW5nIHRoZSBhcmdzIGFuZCBrd2FyZ3MgYmFjayB0byB0aGUgdGVzdCBmdW5jdGlvbiBpdHNlbGYKKyAgICBhbGxvd3MgdGhpcyBkZWNvcmF0b3IgdG8gYmUgdXNlZCBvbiBwYXJhbWV0cml6ZWQgdGVzdCBjYXNlcy4KKyAgICAiIiIKKworICAgIGRlZiBfd3JhcHBlcihmdW4pOgorICAgICAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bikKKyAgICAgICAgZGVmIF9mb3J3YXJkKHNlbGYsICphcmdzLCAqKnRlc3RfZnVuY3Rpb25fa3dhcmdzKToKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3YXJncy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZi5jaGVja2VyLmNvbmZpZywga2V5LCB2YWx1ZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZiwgQ2hlY2tlclRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICAjIHJlb3BlbiBjaGVja2VyIGluIGNhc2UsIGl0IG1heSBiZSBpbnRlcmVzdGVkIGluIGNvbmZpZ3VyYXRpb24gY2hhbmdlCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLm9wZW4oKQorICAgICAgICAgICAgZnVuKHNlbGYsICphcmdzLCAqKnRlc3RfZnVuY3Rpb25fa3dhcmdzKQorCisgICAgICAgIHJldHVybiBfZm9yd2FyZAorCisgICAgcmV0dXJuIF93cmFwcGVyCmRpZmYgLS1naXQgYS9weWxpbnQvdGVzdHV0aWxzL2Z1bmN0aW9uYWxfdGVzdF9maWxlLnB5IGIvcHlsaW50L3Rlc3R1dGlscy9mdW5jdGlvbmFsX3Rlc3RfZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTIzNDEyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy9mdW5jdGlvbmFsX3Rlc3RfZmlsZS5weQpAQCAtMCwwICsxLDczIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBjb25maWdwYXJzZXIKK2Zyb20gb3MucGF0aCBpbXBvcnQgYmFzZW5hbWUsIGV4aXN0cywgam9pbgorCisKK2RlZiBwYXJzZV9weXRob25fdmVyc2lvbih2ZXJfc3RyKToKKyAgICByZXR1cm4gdHVwbGUoaW50KGRpZ2l0KSBmb3IgZGlnaXQgaW4gdmVyX3N0ci5zcGxpdCgiLiIpKQorCisKK2NsYXNzIE5vRmlsZUVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIEZ1bmN0aW9uYWxUZXN0RmlsZToKKyAgICAiIiJBIHNpbmdsZSBmdW5jdGlvbmFsIHRlc3QgY2FzZSBmaWxlIHdpdGggb3B0aW9ucy4iIiIKKworICAgIF9DT05WRVJURVJTID0geworICAgICAgICAibWluX3B5dmVyIjogcGFyc2VfcHl0aG9uX3ZlcnNpb24sCisgICAgICAgICJtYXhfcHl2ZXIiOiBwYXJzZV9weXRob25fdmVyc2lvbiwKKyAgICAgICAgInJlcXVpcmVzIjogbGFtYmRhIHM6IHMuc3BsaXQoIiwiKSwKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyZWN0b3J5LCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX2RpcmVjdG9yeSA9IGRpcmVjdG9yeQorICAgICAgICBzZWxmLmJhc2UgPSBmaWxlbmFtZS5yZXBsYWNlKCIucHkiLCAiIikKKyAgICAgICAgc2VsZi5vcHRpb25zID0geworICAgICAgICAgICAgIm1pbl9weXZlciI6ICgyLCA1KSwKKyAgICAgICAgICAgICJtYXhfcHl2ZXIiOiAoNCwgMCksCisgICAgICAgICAgICAicmVxdWlyZXMiOiBbXSwKKyAgICAgICAgICAgICJleGNlcHRfaW1wbGVtZW50YXRpb25zIjogW10sCisgICAgICAgICAgICAiZXhjbHVkZV9wbGF0Zm9ybXMiOiBbXSwKKyAgICAgICAgfQorICAgICAgICBzZWxmLl9wYXJzZV9vcHRpb25zKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGYiRnVuY3Rpb25hbFRlc3Q6e3NlbGYuYmFzZX0iCisKKyAgICBkZWYgX3BhcnNlX29wdGlvbnMoc2VsZik6CisgICAgICAgIGNwID0gY29uZmlncGFyc2VyLkNvbmZpZ1BhcnNlcigpCisgICAgICAgIGNwLmFkZF9zZWN0aW9uKCJ0ZXN0b3B0aW9ucyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNwLnJlYWQoc2VsZi5vcHRpb25fZmlsZSkKKyAgICAgICAgZXhjZXB0IE5vRmlsZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBjcC5pdGVtcygidGVzdG9wdGlvbnMiKToKKyAgICAgICAgICAgIGNvbnYgPSBzZWxmLl9DT05WRVJURVJTLmdldChuYW1lLCBsYW1iZGEgdjogdikKKyAgICAgICAgICAgIHNlbGYub3B0aW9uc1tuYW1lXSA9IGNvbnYodmFsdWUpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgb3B0aW9uX2ZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlX3R5cGUoIi5yYyIpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbW9kdWxlKHNlbGYpOgorICAgICAgICBwYWNrYWdlID0gYmFzZW5hbWUoc2VsZi5fZGlyZWN0b3J5KQorICAgICAgICByZXR1cm4gIi4iLmpvaW4oW3BhY2thZ2UsIHNlbGYuYmFzZV0pCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXhwZWN0ZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZV90eXBlKCIudHh0IiwgY2hlY2tfZXhpc3RzPUZhbHNlKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNvdXJjZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVfdHlwZSgiLnB5IikKKworICAgIGRlZiBfZmlsZV90eXBlKHNlbGYsIGV4dCwgY2hlY2tfZXhpc3RzPVRydWUpOgorICAgICAgICBuYW1lID0gam9pbihzZWxmLl9kaXJlY3RvcnksIHNlbGYuYmFzZSArIGV4dCkKKyAgICAgICAgaWYgbm90IGNoZWNrX2V4aXN0cyBvciBleGlzdHMobmFtZSk6CisgICAgICAgICAgICByZXR1cm4gbmFtZQorICAgICAgICByYWlzZSBOb0ZpbGVFcnJvcihmIkNhbm5vdCBmaW5kICd7bmFtZX0nLiIpCmRpZmYgLS1naXQgYS9weWxpbnQvdGVzdHV0aWxzL2dldF90ZXN0X2luZm8ucHkgYi9weWxpbnQvdGVzdHV0aWxzL2dldF90ZXN0X2luZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkN2QzYQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC90ZXN0dXRpbHMvZ2V0X3Rlc3RfaW5mby5weQpAQCAtMCwwICsxLDQ1IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2Zyb20gZ2xvYiBpbXBvcnQgZ2xvYgorZnJvbSBvcy5wYXRoIGltcG9ydCBiYXNlbmFtZSwgam9pbiwgc3BsaXRleHQKKworZnJvbSBweWxpbnQudGVzdHV0aWxzLmNvbnN0YW50cyBpbXBvcnQgU1lTX1ZFUlNfU1RSCisKKworZGVmIF9nZXRfdGVzdHNfaW5mbyhpbnB1dF9kaXIsIG1zZ19kaXIsIHByZWZpeCwgc3VmZml4KToKKyAgICAiIiJnZXQgcHl0aG9uIGlucHV0IGV4YW1wbGVzIGFuZCBvdXRwdXQgbWVzc2FnZXMKKworICAgIFdlIHVzZSBmb2xsb3dpbmcgY29udmVudGlvbnMgZm9yIGlucHV0IGZpbGVzIGFuZCBtZXNzYWdlczoKKyAgICBmb3IgZGlmZmVyZW50IGlucHV0czoKKyAgICAgICAgdGVzdCBmb3IgcHl0aG9uICA+PSB4LnkgICAgLT4gIGlucHV0ICAgPSAgPG5hbWU+X3B5eHkucHkKKyAgICAgICAgdGVzdCBmb3IgcHl0aG9uICA8ICB4LnkgICAgLT4gIGlucHV0ICAgPSAgPG5hbWU+X3B5X3h5LnB5CisgICAgZm9yIG9uZSBpbnB1dCBhbmQgZGlmZmVyZW50IG1lc3NhZ2VzOgorICAgICAgICBtZXNzYWdlIGZvciBweXRob24gPj0gIHgueSAtPiAgbWVzc2FnZSA9ICA8bmFtZT5fcHl4eS50eHQKKyAgICAgICAgbG93ZXIgdmVyc2lvbnMgICAgICAgICAgICAgLT4gIG1lc3NhZ2Ugd2l0aCBoaWdoZXN0IG51bQorICAgICIiIgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGZuYW1lIGluIGdsb2Ioam9pbihpbnB1dF9kaXIsIHByZWZpeCArICIqIiArIHN1ZmZpeCkpOgorICAgICAgICBpbmZpbGUgPSBiYXNlbmFtZShmbmFtZSkKKyAgICAgICAgZmJhc2UgPSBzcGxpdGV4dChpbmZpbGUpWzBdCisgICAgICAgICMgZmlsdGVyIGlucHV0IGZpbGVzIDoKKyAgICAgICAgcHlyZXN0ciA9IGZiYXNlLnJzcGxpdCgiX3B5IiwgMSlbLTFdICAjIGxpa2UgXzI2IG9yIDI2CisgICAgICAgIGlmIHB5cmVzdHIuaXNkaWdpdCgpOiAgIyAnMjQnLCAnMjUnLi4uCisgICAgICAgICAgICBpZiBweXJlc3RyLmlzZGlnaXQoKSBhbmQgaW50KFNZU19WRVJTX1NUUikgPCBpbnQocHlyZXN0cik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgcHlyZXN0ci5zdGFydHN3aXRoKCJfIikgYW5kIHB5cmVzdHJbMTpdLmlzZGlnaXQoKToKKyAgICAgICAgICAgICMgc2tpcCB0ZXN0IGZvciBoaWdoZXIgcHl0aG9uIHZlcnNpb25zCisgICAgICAgICAgICBpZiBweXJlc3RyWzE6XS5pc2RpZ2l0KCkgYW5kIGludChTWVNfVkVSU19TVFIpID49IGludChweXJlc3RyWzE6XSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbWVzc2FnZXMgPSBnbG9iKGpvaW4obXNnX2RpciwgZmJhc2UgKyAiKi50eHQiKSkKKyAgICAgICAgIyB0aGUgbGFzdCBvbmUgd2lsbCBiZSB3aXRob3V0IGV4dCwgaS5lLiBmb3IgYWxsIG9yIHVwcGVyIHZlcnNpb25zOgorICAgICAgICBpZiBtZXNzYWdlczoKKyAgICAgICAgICAgIGZvciBvdXRmaWxlIGluIHNvcnRlZChtZXNzYWdlcywgcmV2ZXJzZT1UcnVlKToKKyAgICAgICAgICAgICAgICBweV9yZXN0ID0gb3V0ZmlsZS5yc3BsaXQoIl9weSIsIDEpWy0xXVs6LTRdCisgICAgICAgICAgICAgICAgaWYgcHlfcmVzdC5pc2RpZ2l0KCkgYW5kIGludChTWVNfVkVSU19TVFIpID49IGludChweV9yZXN0KToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhpcyB3aWxsIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSBtaXNzaW5nIGZpbGVuYW1lLgorICAgICAgICAgICAgb3V0ZmlsZSA9IGpvaW4obXNnX2RpciwgZmJhc2UgKyAiLnR4dCIpCisgICAgICAgIHJlc3VsdC5hcHBlbmQoKGluZmlsZSwgb3V0ZmlsZSkpCisgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvcHlsaW50L3Rlc3R1dGlscy9nbG9iYWxfdGVzdF9saW50ZXIucHkgYi9weWxpbnQvdGVzdHV0aWxzL2dsb2JhbF90ZXN0X2xpbnRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDUyMTBlCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy9nbG9iYWxfdGVzdF9saW50ZXIucHkKQEAgLTAsMCArMSwyMCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycworZnJvbSBweWxpbnQubGludCBpbXBvcnQgUHlMaW50ZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscy5yZXBvcnRlcl9mb3JfdGVzdHMgaW1wb3J0IEdlbmVyaWNUZXN0UmVwb3J0ZXIKKworCitkZWYgY3JlYXRlX3Rlc3RfbGludGVyKCk6CisgICAgdGVzdF9yZXBvcnRlciA9IEdlbmVyaWNUZXN0UmVwb3J0ZXIoKQorICAgIGxpbnRlcl8gPSBQeUxpbnRlcigpCisgICAgbGludGVyXy5zZXRfcmVwb3J0ZXIodGVzdF9yZXBvcnRlcikKKyAgICBsaW50ZXJfLmNvbmZpZy5wZXJzaXN0ZW50ID0gMAorICAgIGNoZWNrZXJzLmluaXRpYWxpemUobGludGVyXykKKyAgICByZXR1cm4gbGludGVyXworCisKKyMgQ2FuJ3QgYmUgcmVuYW1lZCB0byBhIGNvbnN0YW50IChlYXNpbHkpLCBpdCBicmVha3MgY291bnRsZXNzIHRlc3RzCitsaW50ZXIgPSBjcmVhdGVfdGVzdF9saW50ZXIoKQpkaWZmIC0tZ2l0IGEvcHlsaW50L3Rlc3R1dGlscy9saW50X21vZHVsZV90ZXN0LnB5IGIvcHlsaW50L3Rlc3R1dGlscy9saW50X21vZHVsZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGYyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9weWxpbnQvdGVzdHV0aWxzL2xpbnRfbW9kdWxlX3Rlc3QucHkKQEAgLTAsMCArMSwyMzYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNzdgoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzeXMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IENvdW50ZXIKK2Zyb20gaW8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFR1cGxlCisKK2ltcG9ydCBweXRlc3QKK2Zyb20gX3B5dGVzdC5jb25maWcgaW1wb3J0IENvbmZpZworCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IFB5TGludGVyCitmcm9tIHB5bGludC50ZXN0dXRpbHMuY29uc3RhbnRzIGltcG9ydCBfRVhQRUNURURfUkUsIF9PUEVSQVRPUlMsIFVQREFURV9PUFRJT04KK2Zyb20gcHlsaW50LnRlc3R1dGlscy5mdW5jdGlvbmFsX3Rlc3RfZmlsZSBpbXBvcnQgKAorICAgIEZ1bmN0aW9uYWxUZXN0RmlsZSwKKyAgICBOb0ZpbGVFcnJvciwKKyAgICBwYXJzZV9weXRob25fdmVyc2lvbiwKKykKK2Zyb20gcHlsaW50LnRlc3R1dGlscy5vdXRwdXRfbGluZSBpbXBvcnQgT3V0cHV0TGluZQorZnJvbSBweWxpbnQudGVzdHV0aWxzLnJlcG9ydGVyX2Zvcl90ZXN0cyBpbXBvcnQgRnVuY3Rpb25hbFRlc3RSZXBvcnRlcgorZnJvbSBweWxpbnQudXRpbHMgaW1wb3J0IHV0aWxzCisKKworY2xhc3MgTGludE1vZHVsZVRlc3Q6CisgICAgbWF4RGlmZiA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2ZpbGU6IEZ1bmN0aW9uYWxUZXN0RmlsZSwgY29uZmlnOiBPcHRpb25hbFtDb25maWddID0gTm9uZSk6CisgICAgICAgIF90ZXN0X3JlcG9ydGVyID0gRnVuY3Rpb25hbFRlc3RSZXBvcnRlcigpCisgICAgICAgIHNlbGYuX2xpbnRlciA9IFB5TGludGVyKCkKKyAgICAgICAgc2VsZi5fbGludGVyLnNldF9yZXBvcnRlcihfdGVzdF9yZXBvcnRlcikKKyAgICAgICAgc2VsZi5fbGludGVyLmNvbmZpZy5wZXJzaXN0ZW50ID0gMAorICAgICAgICBjaGVja2Vycy5pbml0aWFsaXplKHNlbGYuX2xpbnRlcikKKyAgICAgICAgc2VsZi5fbGludGVyLmRpc2FibGUoInN1cHByZXNzZWQtbWVzc2FnZSIpCisgICAgICAgIHNlbGYuX2xpbnRlci5kaXNhYmxlKCJsb2NhbGx5LWRpc2FibGVkIikKKyAgICAgICAgc2VsZi5fbGludGVyLmRpc2FibGUoInVzZWxlc3Mtc3VwcHJlc3Npb24iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9saW50ZXIucmVhZF9jb25maWdfZmlsZSh0ZXN0X2ZpbGUub3B0aW9uX2ZpbGUpCisgICAgICAgICAgICBpZiBzZWxmLl9saW50ZXIuY2ZnZmlsZV9wYXJzZXIuaGFzX29wdGlvbigiTUFTVEVSIiwgImxvYWQtcGx1Z2lucyIpOgorICAgICAgICAgICAgICAgIHBsdWdpbnMgPSB1dGlscy5fc3BsaXRzdHJpcCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGludGVyLmNmZ2ZpbGVfcGFyc2VyLmdldCgiTUFTVEVSIiwgImxvYWQtcGx1Z2lucyIpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHNlbGYuX2xpbnRlci5sb2FkX3BsdWdpbl9tb2R1bGVzKHBsdWdpbnMpCisgICAgICAgICAgICBzZWxmLl9saW50ZXIubG9hZF9jb25maWdfZmlsZSgpCisgICAgICAgIGV4Y2VwdCBOb0ZpbGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fdGVzdF9maWxlID0gdGVzdF9maWxlCisgICAgICAgIHNlbGYuX2NvbmZpZyA9IGNvbmZpZworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9zaG91bGRfYmVfc2tpcHBlZF9kdWVfdG9fdmVyc2lvbigpOgorICAgICAgICAgICAgcHl0ZXN0LnNraXAoCisgICAgICAgICAgICAgICAgIlRlc3QgY2Fubm90IHJ1biB3aXRoIFB5dGhvbiAlcy4iCisgICAgICAgICAgICAgICAgJSBzeXMudmVyc2lvbi5zcGxpdCgiICIsIG1heHNwbGl0PTEpWzBdCisgICAgICAgICAgICApCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBmb3IgcmVxdWlyZW1lbnQgaW4gc2VsZi5fdGVzdF9maWxlLm9wdGlvbnNbInJlcXVpcmVzIl06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX19pbXBvcnRfXyhyZXF1aXJlbWVudCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChyZXF1aXJlbWVudCkKKyAgICAgICAgaWYgbWlzc2luZzoKKyAgICAgICAgICAgIHB5dGVzdC5za2lwKCJSZXF1aXJlcyAlcyB0byBiZSBwcmVzZW50LiIgJSAiLCIuam9pbihtaXNzaW5nKSkKKyAgICAgICAgZXhjZXB0X2ltcGxlbWVudGF0aW9ucyA9IHNlbGYuX3Rlc3RfZmlsZS5vcHRpb25zWyJleGNlcHRfaW1wbGVtZW50YXRpb25zIl0KKyAgICAgICAgaWYgZXhjZXB0X2ltcGxlbWVudGF0aW9uczoKKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyA9IFtpLnN0cmlwKCkgZm9yIGkgaW4gZXhjZXB0X2ltcGxlbWVudGF0aW9ucy5zcGxpdCgiLCIpXQorICAgICAgICAgICAgaWYgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkgaW4gaW1wbGVtZW50YXRpb25zOgorICAgICAgICAgICAgICAgIG1zZyA9ICJUZXN0IGNhbm5vdCBydW4gd2l0aCBQeXRob24gaW1wbGVtZW50YXRpb24gJXIiCisgICAgICAgICAgICAgICAgcHl0ZXN0LnNraXAobXNnICUgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCkpCisgICAgICAgIGV4Y2x1ZGVkX3BsYXRmb3JtcyA9IHNlbGYuX3Rlc3RfZmlsZS5vcHRpb25zWyJleGNsdWRlX3BsYXRmb3JtcyJdCisgICAgICAgIGlmIGV4Y2x1ZGVkX3BsYXRmb3JtczoKKyAgICAgICAgICAgIHBsYXRmb3JtcyA9IFtwLnN0cmlwKCkgZm9yIHAgaW4gZXhjbHVkZWRfcGxhdGZvcm1zLnNwbGl0KCIsIildCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0ubG93ZXIoKSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgcHl0ZXN0LnNraXAoIlRlc3QgY2Fubm90IHJ1biBvbiBwbGF0Zm9ybSAlciIgJSBzeXMucGxhdGZvcm0pCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuVGVzdCgpCisKKyAgICBkZWYgX3Nob3VsZF9iZV9za2lwcGVkX2R1ZV90b192ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8IHNlbGYuX3Rlc3RfZmlsZS5vcHRpb25zWyJtaW5fcHl2ZXIiXQorICAgICAgICAgICAgb3Igc3lzLnZlcnNpb25faW5mbyA+IHNlbGYuX3Rlc3RfZmlsZS5vcHRpb25zWyJtYXhfcHl2ZXIiXQorICAgICAgICApCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGYie3NlbGYuX3Rlc3RfZmlsZS5iYXNlfSAoe3NlbGYuX19jbGFzc19fLl9fbW9kdWxlX199LntzZWxmLl9fY2xhc3NfXy5fX25hbWVfX30pIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBnZXRfZXhwZWN0ZWRfbWVzc2FnZXMoc3RyZWFtKToKKyAgICAgICAgIiIiUGFyc2VzIGEgZmlsZSBhbmQgZ2V0IGV4cGVjdGVkIG1lc3NhZ2VzLgorCisgICAgICAgIDpwYXJhbSBzdHJlYW06IEZpbGUtbGlrZSBpbnB1dCBzdHJlYW0uCisgICAgICAgIDp0eXBlIHN0cmVhbTogZW51bWVyYWJsZQorICAgICAgICA6cmV0dXJuczogQSBkaWN0IG1hcHBpbmcgbGluZSxtc2ctc3ltYm9sIHR1cGxlcyB0byB0aGUgY291bnQgb24gdGhpcyBsaW5lLgorICAgICAgICA6cnR5cGU6IGRpY3QKKyAgICAgICAgIiIiCisgICAgICAgIG1lc3NhZ2VzID0gQ291bnRlcigpCisgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShzdHJlYW0pOgorICAgICAgICAgICAgbWF0Y2ggPSBfRVhQRUNURURfUkUuc2VhcmNoKGxpbmUpCisgICAgICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaW5lID0gbWF0Y2guZ3JvdXAoImxpbmUiKQorICAgICAgICAgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGxpbmUgPSBpICsgMQorICAgICAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoIisiKSBvciBsaW5lLnN0YXJ0c3dpdGgoIi0iKToKKyAgICAgICAgICAgICAgICBsaW5lID0gaSArIDEgKyBpbnQobGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZSA9IGludChsaW5lKQorCisgICAgICAgICAgICB2ZXJzaW9uID0gbWF0Y2guZ3JvdXAoInZlcnNpb24iKQorICAgICAgICAgICAgb3AgPSBtYXRjaC5ncm91cCgib3AiKQorICAgICAgICAgICAgaWYgdmVyc2lvbjoKKyAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlX3B5dGhvbl92ZXJzaW9uKHZlcnNpb24pCisgICAgICAgICAgICAgICAgaWYgbm90IF9PUEVSQVRPUlNbb3BdKHN5cy52ZXJzaW9uX2luZm8sIHJlcXVpcmVkKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZm9yIG1zZ19pZCBpbiBtYXRjaC5ncm91cCgibXNncyIpLnNwbGl0KCIsIik6CisgICAgICAgICAgICAgICAgbWVzc2FnZXNbbGluZSwgbXNnX2lkLnN0cmlwKCldICs9IDEKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VzCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG11bHRpc2V0X2RpZmZlcmVuY2UoCisgICAgICAgIGV4cGVjdGVkX2VudHJpZXM6IENvdW50ZXIsIGFjdHVhbF9lbnRyaWVzOiBDb3VudGVyCisgICAgKSAtPiBUdXBsZVtDb3VudGVyLCBEaWN0W3N0ciwgaW50XV06CisgICAgICAgICIiIlRha2VzIHR3byBtdWx0aXNldHMgYW5kIGNvbXBhcmVzIHRoZW0uCisKKyAgICAgICAgQSBtdWx0aXNldCBpcyBhIGRpY3Qgd2l0aCB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIGtleSBhcyB0aGUgdmFsdWUuIiIiCisgICAgICAgIG1pc3NpbmcgPSBleHBlY3RlZF9lbnRyaWVzLmNvcHkoKQorICAgICAgICBtaXNzaW5nLnN1YnRyYWN0KGFjdHVhbF9lbnRyaWVzKQorICAgICAgICB1bmV4cGVjdGVkID0ge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbGlzdChtaXNzaW5nLml0ZW1zKCkpOgorICAgICAgICAgICAgaWYgdmFsdWUgPD0gMDoKKyAgICAgICAgICAgICAgICBtaXNzaW5nLnBvcChrZXkpCisgICAgICAgICAgICAgICAgaWYgdmFsdWUgPCAwOgorICAgICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkW2tleV0gPSAtdmFsdWUKKyAgICAgICAgcmV0dXJuIG1pc3NpbmcsIHVuZXhwZWN0ZWQKKworICAgICMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLXdpdGgKKyAgICBkZWYgX29wZW5fZXhwZWN0ZWRfZmlsZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fdGVzdF9maWxlLmV4cGVjdGVkX291dHB1dCkKKyAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPKCIiKQorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9Y29uc2lkZXItdXNpbmctd2l0aAorICAgIGRlZiBfb3Blbl9zb3VyY2VfZmlsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fdGVzdF9maWxlLmJhc2UgPT0gImludmFsaWRfZW5jb2RlZF9kYXRhIjoKKyAgICAgICAgICAgIHJldHVybiBvcGVuKHNlbGYuX3Rlc3RfZmlsZS5zb3VyY2UpCisgICAgICAgIGlmICJsYXRpbjEiIGluIHNlbGYuX3Rlc3RfZmlsZS5iYXNlOgorICAgICAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5fdGVzdF9maWxlLnNvdXJjZSwgZW5jb2Rpbmc9ImxhdGluMSIpCisgICAgICAgIHJldHVybiBvcGVuKHNlbGYuX3Rlc3RfZmlsZS5zb3VyY2UsIGVuY29kaW5nPSJ1dGY4IikKKworICAgIGRlZiBfZ2V0X2V4cGVjdGVkKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuX29wZW5fc291cmNlX2ZpbGUoKSBhcyBmOgorICAgICAgICAgICAgZXhwZWN0ZWRfbXNncyA9IHNlbGYuZ2V0X2V4cGVjdGVkX21lc3NhZ2VzKGYpCisgICAgICAgIGlmIG5vdCBleHBlY3RlZF9tc2dzOgorICAgICAgICAgICAgcmV0dXJuIENvdW50ZXIoKSwgW10KKyAgICAgICAgd2l0aCBzZWxmLl9vcGVuX2V4cGVjdGVkX2ZpbGUoKSBhcyBmOgorICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0X2xpbmVzID0gWworICAgICAgICAgICAgICAgIE91dHB1dExpbmUuZnJvbV9jc3Yocm93KSBmb3Igcm93IGluIGNzdi5yZWFkZXIoZiwgInRlc3QiKQorICAgICAgICAgICAgXQorICAgICAgICByZXR1cm4gZXhwZWN0ZWRfbXNncywgZXhwZWN0ZWRfb3V0cHV0X2xpbmVzCisKKyAgICBkZWYgX2dldF9hY3R1YWwoc2VsZik6CisgICAgICAgIG1lc3NhZ2VzID0gc2VsZi5fbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgICAgIG1lc3NhZ2VzLnNvcnQoa2V5PWxhbWJkYSBtOiAobS5saW5lLCBtLnN5bWJvbCwgbS5tc2cpKQorICAgICAgICByZWNlaXZlZF9tc2dzID0gQ291bnRlcigpCisgICAgICAgIHJlY2VpdmVkX291dHB1dF9saW5lcyA9IFtdCisgICAgICAgIGZvciBtc2cgaW4gbWVzc2FnZXM6CisgICAgICAgICAgICBhc3NlcnQgKAorICAgICAgICAgICAgICAgIG1zZy5zeW1ib2wgIT0gImZhdGFsIgorICAgICAgICAgICAgKSwgZiJQeWxpbnQgYW5hbHlzaXMgZmFpbGVkIGJlY2F1c2Ugb2YgJ3ttc2cubXNnfSciCisgICAgICAgICAgICByZWNlaXZlZF9tc2dzW21zZy5saW5lLCBtc2cuc3ltYm9sXSArPSAxCisgICAgICAgICAgICByZWNlaXZlZF9vdXRwdXRfbGluZXMuYXBwZW5kKE91dHB1dExpbmUuZnJvbV9tc2cobXNnKSkKKyAgICAgICAgcmV0dXJuIHJlY2VpdmVkX21zZ3MsIHJlY2VpdmVkX291dHB1dF9saW5lcworCisgICAgZGVmIF9ydW5UZXN0KHNlbGYpOgorICAgICAgICBfX3RyYWNlYmFja2hpZGVfXyA9IFRydWUgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC12YXJpYWJsZQorICAgICAgICBtb2R1bGVzX3RvX2NoZWNrID0gW3NlbGYuX3Rlc3RfZmlsZS5zb3VyY2VdCisgICAgICAgIHNlbGYuX2xpbnRlci5jaGVjayhtb2R1bGVzX3RvX2NoZWNrKQorICAgICAgICBleHBlY3RlZF9tZXNzYWdlcywgZXhwZWN0ZWRfb3V0cHV0ID0gc2VsZi5fZ2V0X2V4cGVjdGVkKCkKKyAgICAgICAgYWN0dWFsX21lc3NhZ2VzLCBhY3R1YWxfb3V0cHV0ID0gc2VsZi5fZ2V0X2FjdHVhbCgpCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBleHBlY3RlZF9tZXNzYWdlcyA9PSBhY3R1YWxfbWVzc2FnZXMKKyAgICAgICAgKSwgc2VsZi5lcnJvcl9tc2dfZm9yX3VuZXF1YWxfbWVzc2FnZXMoCisgICAgICAgICAgICBhY3R1YWxfbWVzc2FnZXMsIGV4cGVjdGVkX21lc3NhZ2VzLCBhY3R1YWxfb3V0cHV0CisgICAgICAgICkKKyAgICAgICAgc2VsZi5fY2hlY2tfb3V0cHV0X3RleHQoZXhwZWN0ZWRfbWVzc2FnZXMsIGV4cGVjdGVkX291dHB1dCwgYWN0dWFsX291dHB1dCkKKworICAgIGRlZiBlcnJvcl9tc2dfZm9yX3VuZXF1YWxfbWVzc2FnZXMoCisgICAgICAgIHNlbGYsIGFjdHVhbF9tZXNzYWdlcywgZXhwZWN0ZWRfbWVzc2FnZXMsIGFjdHVhbF9vdXRwdXQ6IExpc3RbT3V0cHV0TGluZV0KKyAgICApOgorICAgICAgICBtc2cgPSBbJ1dyb25nIHJlc3VsdHMgZm9yIGZpbGUgIiVzIjonICUgKHNlbGYuX3Rlc3RfZmlsZS5iYXNlKV0KKyAgICAgICAgbWlzc2luZywgdW5leHBlY3RlZCA9IHNlbGYubXVsdGlzZXRfZGlmZmVyZW5jZSgKKyAgICAgICAgICAgIGV4cGVjdGVkX21lc3NhZ2VzLCBhY3R1YWxfbWVzc2FnZXMKKyAgICAgICAgKQorICAgICAgICBpZiBtaXNzaW5nOgorICAgICAgICAgICAgbXNnLmFwcGVuZCgiXG5FeHBlY3RlZCBpbiB0ZXN0ZGF0YToiKQorICAgICAgICAgICAgbXNnLmV4dGVuZCgiICUzZDogJXMiICUgbXNnIGZvciBtc2cgaW4gc29ydGVkKG1pc3NpbmcpKQorICAgICAgICBpZiB1bmV4cGVjdGVkOgorICAgICAgICAgICAgbXNnLmFwcGVuZCgiXG5VbmV4cGVjdGVkIGluIHRlc3RkYXRhOiIpCisgICAgICAgICAgICBtc2cuZXh0ZW5kKCIgJTNkOiAlcyIgJSBtc2cgZm9yIG1zZyBpbiBzb3J0ZWQodW5leHBlY3RlZCkpICAjIHR5cGU6IGlnbm9yZQorICAgICAgICBlcnJvcl9tc2cgPSAiXG4iLmpvaW4obXNnKQorICAgICAgICBpZiBzZWxmLl9jb25maWcgYW5kIHNlbGYuX2NvbmZpZy5nZXRvcHRpb24oInZlcmJvc2UiKSA+IDA6CisgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIlxuXG5BY3R1YWwgcHlsaW50IG91dHB1dCBmb3IgdGhpcyBmaWxlOlxuIgorICAgICAgICAgICAgZXJyb3JfbXNnICs9ICJcbiIuam9pbihzdHIobykgZm9yIG8gaW4gYWN0dWFsX291dHB1dCkKKyAgICAgICAgcmV0dXJuIGVycm9yX21zZworCisgICAgZGVmIGVycm9yX21zZ19mb3JfdW5lcXVhbF9vdXRwdXQoc2VsZiwgZXhwZWN0ZWRfbGluZXMsIHJlY2VpdmVkX2xpbmVzKSAtPiBzdHI6CisgICAgICAgIG1pc3NpbmcgPSBzZXQoZXhwZWN0ZWRfbGluZXMpIC0gc2V0KHJlY2VpdmVkX2xpbmVzKQorICAgICAgICB1bmV4cGVjdGVkID0gc2V0KHJlY2VpdmVkX2xpbmVzKSAtIHNldChleHBlY3RlZF9saW5lcykKKyAgICAgICAgZXJyb3JfbXNnID0gKAorICAgICAgICAgICAgZiJXcm9uZyBvdXRwdXQgZm9yICd7c2VsZi5fdGVzdF9maWxlLmJhc2V9LnR4dCc6XG4iCisgICAgICAgICAgICAiWW91IGNhbiB1cGRhdGUgdGhlIGV4cGVjdGVkIG91dHB1dCBhdXRvbWF0aWNhbGx5IHdpdGg6ICciCisgICAgICAgICAgICBmInB5dGhvbiB0ZXN0cy90ZXN0X2Z1bmN0aW9uYWwucHkge1VQREFURV9PUFRJT059IC1rICIKKyAgICAgICAgICAgIGYnInRlc3RfZnVuY3Rpb25hbFt7c2VsZi5fdGVzdF9maWxlLmJhc2V9XSJcJ1xuXG4nCisgICAgICAgICkKKyAgICAgICAgc29ydF9ieV9saW5lX251bWJlciA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoImxpbmVubyIpCisgICAgICAgIGlmIG1pc3Npbmc6CisgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIlxuLSBNaXNzaW5nIGxpbmVzOlxuIgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gc29ydGVkKG1pc3NpbmcsIGtleT1zb3J0X2J5X2xpbmVfbnVtYmVyKToKKyAgICAgICAgICAgICAgICBlcnJvcl9tc2cgKz0gZiJ7bGluZX1cbiIKKyAgICAgICAgaWYgdW5leHBlY3RlZDoKKyAgICAgICAgICAgIGVycm9yX21zZyArPSAiXG4tIFVuZXhwZWN0ZWQgbGluZXM6XG4iCisgICAgICAgICAgICBmb3IgbGluZSBpbiBzb3J0ZWQodW5leHBlY3RlZCwga2V5PXNvcnRfYnlfbGluZV9udW1iZXIpOgorICAgICAgICAgICAgICAgIGVycm9yX21zZyArPSBmIntsaW5lfVxuIgorICAgICAgICByZXR1cm4gZXJyb3JfbXNnCisKKyAgICBkZWYgX2NoZWNrX291dHB1dF90ZXh0KHNlbGYsIF8sIGV4cGVjdGVkX291dHB1dCwgYWN0dWFsX291dHB1dCk6CisgICAgICAgICIiIlRoaXMgaXMgYSBmdW5jdGlvbiBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byB1cGRhdGUgdGhlIHRleHQgaW4gTGludE1vZHVsZU91dHB1dFVwZGF0ZSIiIgorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRfb3V0cHV0ID09IGFjdHVhbF9vdXRwdXQsIHNlbGYuZXJyb3JfbXNnX2Zvcl91bmVxdWFsX291dHB1dCgKKyAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dCwgYWN0dWFsX291dHB1dAorICAgICAgICApCmRpZmYgLS1naXQgYS9weWxpbnQvdGVzdHV0aWxzL291dHB1dF9saW5lLnB5IGIvcHlsaW50L3Rlc3R1dGlscy9vdXRwdXRfbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTUwYzZiCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy9vdXRwdXRfbGluZS5weQpAQCAtMCwwICsxLDk2IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBjb2xsZWN0aW9ucworZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgTmFtZWRUdXBsZQorCitmcm9tIHB5bGludCBpbXBvcnQgaW50ZXJmYWNlcworZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCBQWTM4X1BMVVMKK2Zyb20gcHlsaW50LnRlc3R1dGlscy5jb25zdGFudHMgaW1wb3J0IFVQREFURV9PUFRJT04KKworCitjbGFzcyBNZXNzYWdlKAorICAgIGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoIk1lc3NhZ2UiLCBbIm1zZ19pZCIsICJsaW5lIiwgIm5vZGUiLCAiYXJncyIsICJjb25maWRlbmNlIl0pCispOgorICAgIGRlZiBfX25ld19fKGNscywgbXNnX2lkLCBsaW5lPU5vbmUsIG5vZGU9Tm9uZSwgYXJncz1Ob25lLCBjb25maWRlbmNlPU5vbmUpOgorICAgICAgICByZXR1cm4gdHVwbGUuX19uZXdfXyhjbHMsIChtc2dfaWQsIGxpbmUsIG5vZGUsIGFyZ3MsIGNvbmZpZGVuY2UpKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE1lc3NhZ2UpOgorICAgICAgICAgICAgaWYgc2VsZi5jb25maWRlbmNlIGFuZCBvdGhlci5jb25maWRlbmNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcigpLl9fZXFfXyhvdGhlcikKKyAgICAgICAgICAgIHJldHVybiBzZWxmWzotMV0gPT0gb3RoZXJbOi0xXQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQgICMgcHJhZ21hOiBubyBjb3ZlcgorCisKK2NsYXNzIE1hbGZvcm1lZE91dHB1dExpbmVFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm93LCBleGNlcHRpb24pOgorICAgICAgICBleGFtcGxlID0gIm1zZy1zeW1ib2xpYy1uYW1lOjQyOjI3Ok15Q2xhc3MubXlfZnVuY3Rpb246VGhlIG1lc3NhZ2UiCisgICAgICAgIG90aGVyX2V4YW1wbGUgPSAibXNnLXN5bWJvbGljLW5hbWU6Nzo0Mjo6VGhlIG1lc3NhZ2UiCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgInN5bWJvbCIsCisgICAgICAgICAgICAibGluZSIsCisgICAgICAgICAgICAiY29sdW1uIiwKKyAgICAgICAgICAgICJNeUNsYXNzLm15RnVuY3Rpb24sIChvciAnJykiLAorICAgICAgICAgICAgIk1lc3NhZ2UiLAorICAgICAgICAgICAgImNvbmZpZGVuY2UiLAorICAgICAgICBdCisgICAgICAgIHJlY29uc3RydWN0ZWRfcm93ID0gIiIKKyAgICAgICAgaSA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGksIGNvbHVtbiBpbiBlbnVtZXJhdGUocm93KToKKyAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkX3JvdyArPSBmIlx0e2V4cGVjdGVkW2ldfT0ne2NvbHVtbn0nID9cbiIKKyAgICAgICAgICAgIGZvciBtaXNzaW5nIGluIGV4cGVjdGVkW2kgKyAxIDpdOgorICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRfcm93ICs9IGYiXHR7bWlzc2luZ309IE5vdGhpbmcgcHJvdmlkZWQgIVxuIgorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmF3ID0gIjoiLmpvaW4ocm93KQorICAgICAgICBtc2cgPSBmIiIiXAore2V4Y2VwdGlvbn0KKworRXhwZWN0ZWQgJ3tleGFtcGxlfScgb3IgJ3tvdGhlcl9leGFtcGxlfScgYnV0IHdlIGdvdCAne3Jhd30nOgore3JlY29uc3RydWN0ZWRfcm93fQorCitUcnkgdXBkYXRpbmcgaXQgd2l0aDogJ3B5dGhvbiB0ZXN0cy90ZXN0X2Z1bmN0aW9uYWwucHkge1VQREFURV9PUFRJT059JyIiIgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorCisKK2NsYXNzIE91dHB1dExpbmUoTmFtZWRUdXBsZSk6CisgICAgc3ltYm9sOiBzdHIKKyAgICBsaW5lbm86IGludAorICAgIGNvbHVtbjogaW50CisgICAgb2JqZWN0OiBBbnkKKyAgICBtc2c6IHN0cgorICAgIGNvbmZpZGVuY2U6IHN0cgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fbXNnKGNscywgbXNnKToKKyAgICAgICAgY29sdW1uID0gY2xzLmdldF9jb2x1bW4obXNnLmNvbHVtbikKKyAgICAgICAgcmV0dXJuIGNscygKKyAgICAgICAgICAgIG1zZy5zeW1ib2wsCisgICAgICAgICAgICBtc2cubGluZSwKKyAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgIG1zZy5vYmogb3IgIiIsCisgICAgICAgICAgICBtc2cubXNnLnJlcGxhY2UoIlxyXG4iLCAiXG4iKSwKKyAgICAgICAgICAgIG1zZy5jb25maWRlbmNlLm5hbWUKKyAgICAgICAgICAgIGlmIG1zZy5jb25maWRlbmNlICE9IGludGVyZmFjZXMuVU5ERUZJTkVECisgICAgICAgICAgICBlbHNlIGludGVyZmFjZXMuSElHSC5uYW1lLAorICAgICAgICApCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZ2V0X2NvbHVtbihjbHMsIGNvbHVtbik6CisgICAgICAgIGlmIG5vdCBQWTM4X1BMVVM6CisgICAgICAgICAgICByZXR1cm4gIiIgICMgcHJhZ21hOiBubyBjb3ZlcgorICAgICAgICByZXR1cm4gc3RyKGNvbHVtbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2NzdihjbHMsIHJvdyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbmZpZGVuY2UgPSByb3dbNV0gaWYgbGVuKHJvdykgPT0gNiBlbHNlIGludGVyZmFjZXMuSElHSC5uYW1lCisgICAgICAgICAgICBjb2x1bW4gPSBjbHMuZ2V0X2NvbHVtbihyb3dbMl0pCisgICAgICAgICAgICByZXR1cm4gY2xzKHJvd1swXSwgaW50KHJvd1sxXSksIGNvbHVtbiwgcm93WzNdLCByb3dbNF0sIGNvbmZpZGVuY2UpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHJhaXNlIE1hbGZvcm1lZE91dHB1dExpbmVFeGNlcHRpb24ocm93LCBlKSBmcm9tIGUKKworICAgIGRlZiB0b19jc3Yoc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShzZWxmKQpkaWZmIC0tZ2l0IGEvcHlsaW50L3Rlc3R1dGlscy9yZXBvcnRlcl9mb3JfdGVzdHMucHkgYi9weWxpbnQvdGVzdHV0aWxzL3JlcG9ydGVyX2Zvcl90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTZhMGUyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy9yZXBvcnRlcl9mb3JfdGVzdHMucHkKQEAgLTAsMCArMSw3NSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworZnJvbSBvcyBpbXBvcnQgZ2V0Y3dkLCBsaW5lc2VwLCBzZXAKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0CisKK2Zyb20gcHlsaW50IGltcG9ydCBpbnRlcmZhY2VzCitmcm9tIHB5bGludC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIHB5bGludC5yZXBvcnRlcnMgaW1wb3J0IEJhc2VSZXBvcnRlcgorCisKK2NsYXNzIEdlbmVyaWNUZXN0UmVwb3J0ZXIoQmFzZVJlcG9ydGVyKToKKyAgICAiIiJyZXBvcnRlciBzdG9yaW5nIHBsYWluIHRleHQgbWVzc2FnZXMiIiIKKworICAgIF9faW1wbGVtZW50c19fID0gaW50ZXJmYWNlcy5JUmVwb3J0ZXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKTogICMgcHlsaW50OiBkaXNhYmxlPXN1cGVyLWluaXQtbm90LWNhbGxlZAorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5tZXNzYWdlX2lkczogRGljdCA9IHt9CisgICAgICAgIHNlbGYub3V0ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLnBhdGhfc3RyaXBfcHJlZml4OiBzdHIgPSBnZXRjd2QoKSArIHNlcAorICAgICAgICBzZWxmLm1lc3NhZ2VzOiBMaXN0W3N0cl0gPSBbXQorCisgICAgZGVmIGhhbmRsZV9tZXNzYWdlKHNlbGYsIG1zZzogTWVzc2FnZSkgLT4gTm9uZToKKyAgICAgICAgIiIibWFuYWdlIG1lc3NhZ2Ugb2YgZGlmZmVyZW50IHR5cGUgYW5kIGluIHRoZSBjb250ZXh0IG9mIHBhdGgiIiIKKyAgICAgICAgb2JqID0gbXNnLm9iagorICAgICAgICBsaW5lID0gbXNnLmxpbmUKKyAgICAgICAgbXNnX2lkID0gbXNnLm1zZ19pZAorICAgICAgICBzdHJfbWVzc2FnZTogc3RyID0gbXNnLm1zZworICAgICAgICBzZWxmLm1lc3NhZ2VfaWRzW21zZ19pZF0gPSAxCisgICAgICAgIGlmIG9iajoKKyAgICAgICAgICAgIG9iaiA9ICI6JXMiICUgb2JqCisgICAgICAgIHNpZ2xlID0gbXNnX2lkWzBdCisgICAgICAgIGlmIGxpbmVzZXAgIT0gIlxuIjoKKyAgICAgICAgICAgICMgMnRvMyB3cml0ZXMgb3MubGluZXNlcCBpbnN0ZWFkIG9mIHVzaW5nCisgICAgICAgICAgICAjIHRoZSBwcmV2aW91c2x5IHVzZWQgbGluZSBzZXBhcmF0b3JzCisgICAgICAgICAgICBzdHJfbWVzc2FnZSA9IHN0cl9tZXNzYWdlLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQorICAgICAgICBzZWxmLm1lc3NhZ2VzLmFwcGVuZChmIntzaWdsZX06e2xpbmU6PjN9e29ian06IHtzdHJfbWVzc2FnZX0iKQorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICBzZWxmLm1lc3NhZ2VzLnNvcnQoKQorICAgICAgICBmb3IgbXNnIGluIHNlbGYubWVzc2FnZXM6CisgICAgICAgICAgICBwcmludChtc2csIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHJlc3VsdCA9IHNlbGYub3V0LmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgIGRlZiBvbl9zZXRfY3VycmVudF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBmaWxlcGF0aCk6CisgICAgICAgIHBhc3MKKworICAgICMgcHlsaW50OiBlbmFibGU9dW51c2VkLWFyZ3VtZW50CisKKyAgICBkZWYgZGlzcGxheV9yZXBvcnRzKHNlbGYsIGxheW91dCk6CisgICAgICAgICIiImlnbm9yZSBsYXlvdXRzIiIiCisKKyAgICBfZGlzcGxheSA9IE5vbmUKKworCitjbGFzcyBNaW5pbWFsVGVzdFJlcG9ydGVyKEJhc2VSZXBvcnRlcik6CisgICAgZGVmIG9uX3NldF9jdXJyZW50X21vZHVsZShzZWxmLCBtb2R1bGUsIGZpbGVwYXRoKToKKyAgICAgICAgc2VsZi5tZXNzYWdlcyA9IFtdCisKKyAgICBfZGlzcGxheSA9IE5vbmUKKworCitjbGFzcyBGdW5jdGlvbmFsVGVzdFJlcG9ydGVyKEJhc2VSZXBvcnRlcik6ICAjIHB5bGludDogZGlzYWJsZT1hYnN0cmFjdC1tZXRob2QKKyAgICBkZWYgb25fc2V0X2N1cnJlbnRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgZmlsZXBhdGgpOgorICAgICAgICBzZWxmLm1lc3NhZ2VzID0gW10KKworICAgIGRlZiBkaXNwbGF5X3JlcG9ydHMoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgIiIiSWdub3JlIGxheW91dHMgYW5kIGRvbid0IGNhbGwgc2VsZi5fZGlzcGxheSgpLiIiIgpkaWZmIC0tZ2l0IGEvcHlsaW50L3Rlc3R1dGlscy90b2tlbml6ZV9zdHIucHkgYi9weWxpbnQvdGVzdHV0aWxzL3Rva2VuaXplX3N0ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA5NGZhCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy90b2tlbml6ZV9zdHIucHkKQEAgLTAsMCArMSw5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCB0b2tlbml6ZQorZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KKworCitkZWYgX3Rva2VuaXplX3N0cihjb2RlKToKKyAgICByZXR1cm4gbGlzdCh0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8oY29kZSkucmVhZGxpbmUpKQpkaWZmIC0tZ2l0IGEvcHlsaW50L3Rlc3R1dGlscy91bml0dGVzdF9saW50ZXIucHkgYi9weWxpbnQvdGVzdHV0aWxzL3VuaXR0ZXN0X2xpbnRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjkwMmMyCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3Rlc3R1dGlscy91bml0dGVzdF9saW50ZXIucHkKQEAgLTAsMCArMSw0MCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitmcm9tIHB5bGludC50ZXN0dXRpbHMuZ2xvYmFsX3Rlc3RfbGludGVyIGltcG9ydCBsaW50ZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscy5vdXRwdXRfbGluZSBpbXBvcnQgTWVzc2FnZQorCisKK2NsYXNzIFVuaXR0ZXN0TGludGVyOgorICAgICIiIkEgZmFrZSBsaW50ZXIgY2xhc3MgdG8gY2FwdHVyZSBjaGVja2VyIG1lc3NhZ2VzLiIiIgorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50LCBuby1zZWxmLXVzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9tZXNzYWdlcyA9IFtdCisgICAgICAgIHNlbGYuc3RhdHMgPSB7fQorCisgICAgZGVmIHJlbGVhc2VfbWVzc2FnZXMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9tZXNzYWdlcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbWVzc2FnZXMgPSBbXQorCisgICAgZGVmIGFkZF9tZXNzYWdlKAorICAgICAgICBzZWxmLCBtc2dfaWQsIGxpbmU9Tm9uZSwgbm9kZT1Ob25lLCBhcmdzPU5vbmUsIGNvbmZpZGVuY2U9Tm9uZSwgY29sX29mZnNldD1Ob25lCisgICAgKToKKyAgICAgICAgIyBEbyBub3QgdGVzdCBjb2xfb2Zmc2V0IGZvciBub3cgc2luY2UgY2hhbmdpbmcgTWVzc2FnZSBicmVha3MgZXZlcnl0aGluZworICAgICAgICBzZWxmLl9tZXNzYWdlcy5hcHBlbmQoTWVzc2FnZShtc2dfaWQsIGxpbmUsIG5vZGUsIGFyZ3MsIGNvbmZpZGVuY2UpKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBpc19tZXNzYWdlX2VuYWJsZWQoKnVudXNlZF9hcmdzLCAqKnVudXNlZF9rd2FyZ3MpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGFkZF9zdGF0cyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBrd2FyZ3MuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbbmFtZV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gc2VsZi5zdGF0cworCisgICAgQHByb3BlcnR5CisgICAgZGVmIG9wdGlvbnNfcHJvdmlkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gbGludGVyLm9wdGlvbnNfcHJvdmlkZXJzCmRpZmYgLS1naXQgYS9weWxpbnQvdXRpbHMvX19pbml0X18ucHkgYi9weWxpbnQvdXRpbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZTVkNQotLS0gL2Rldi9udWxsCisrKyBiL3B5bGludC91dGlscy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDg5IEBACisjIENvcHlyaWdodCAoYykgMjAwNi0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDA5IFZpbmNlbnQKKyMgQ29weXJpZ2h0IChjKSAyMDA5IE1hZHMgS2lpbGVyaWNoIDxtYWRzQGtpaWxlcmljaC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgTWljaGFsIE5vd2lrb3dza2kgPGdvZGZyeWRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgTENEIDQ3IDxsY2QwNDdAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNCBEYW1pZW4gTm96YXkgPGRhbWllbi5ub3pheUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBBcnUgU2FobmkgPGFydXNhaG5pQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IEZsb3JpYW4gQnJ1aGluIDxtZUB0aGUtY29tcGlsZXIub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgU2ltdSBUb25pIDxzaW11dG9uaUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IE1vaXNlcyBMb3BleiA8bW95bG9wMjYwQHZhdXhvby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBHbGVubiBNYXR0aGV3cyA8Z2xlbm5AZS1kYWQubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsbWF0dGhlQGNpc2NvLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiB4bW8tb2RvbyA8eG1vLW9kb29AdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIDIwMjAtMjAyMSBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNywgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBDaHJpcyBMYW1iIDxjaHJpc0BjaHJpcy1sYW1iLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgVGhvbWFzIEhpc2NoIDx0Lmhpc2NoQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IE1pa2hhaWwgRmVzZW5rbyA8cHJvZ2dnYUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBDcmFpZyBDaXRybyA8Y3JhaWdjaXRyb0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5ndWludGFAcHJvdG9ubWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFJldmVyYiBDIDxyZXZlcmJjQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgUGV0ZXIgS29sYnVzIDxwZXRlci5rb2xidXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRGFtaWVuIEJhdHkgPGRhbWllbi5iYXR5QHBvbHljb25zZWlsLmZyPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiInNvbWUgdmFyaW91cyB1dGlsaXRpZXMgYW5kIGhlbHBlciBjbGFzc2VzLCBtb3N0IG9mIHRoZW0gdXNlZCBpbiB0aGUKK21haW4gcHlsaW50IGNsYXNzCisiIiIKKworZnJvbSBweWxpbnQudXRpbHMuYXN0X3dhbGtlciBpbXBvcnQgQVNUV2Fsa2VyCitmcm9tIHB5bGludC51dGlscy5maWxlX3N0YXRlIGltcG9ydCBGaWxlU3RhdGUKK2Zyb20gcHlsaW50LnV0aWxzLnV0aWxzIGltcG9ydCAoCisgICAgSEFTX0lTT1JUXzUsCisgICAgSXNvcnREcml2ZXIsCisgICAgX2NoZWNrX2NzdiwKKyAgICBfZm9ybWF0X29wdGlvbl92YWx1ZSwKKyAgICBfc3BsaXRzdHJpcCwKKyAgICBfdW5xdW90ZSwKKyAgICBkZWNvZGluZ19zdHJlYW0sCisgICAgZGVwcmVjYXRlZF9vcHRpb24sCisgICAgZGlmZl9zdHJpbmcsCisgICAgZm9ybWF0X3NlY3Rpb24sCisgICAgZ2V0X2dsb2JhbF9vcHRpb24sCisgICAgZ2V0X21vZHVsZV9hbmRfZnJhbWVpZCwKKyAgICBnZXRfcnN0X3NlY3Rpb24sCisgICAgZ2V0X3JzdF90aXRsZSwKKyAgICBub3JtYWxpemVfdGV4dCwKKyAgICByZWdpc3Rlcl9wbHVnaW5zLAorICAgIHNhZmVfZGVjb2RlLAorICAgIHRva2VuaXplX21vZHVsZSwKKykKKworX19hbGxfXyA9IFsKKyAgICAiQVNUV2Fsa2VyIiwKKyAgICAiSEFTX0lTT1JUXzUiLAorICAgICJJc29ydERyaXZlciIsCisgICAgIl9jaGVja19jc3YiLAorICAgICJfZm9ybWF0X29wdGlvbl92YWx1ZSIsCisgICAgIl9zcGxpdHN0cmlwIiwKKyAgICAiX3VucXVvdGUiLAorICAgICJkZWNvZGluZ19zdHJlYW0iLAorICAgICJkZXByZWNhdGVkX29wdGlvbiIsCisgICAgImRpZmZfc3RyaW5nIiwKKyAgICAiRmlsZVN0YXRlIiwKKyAgICAiZm9ybWF0X3NlY3Rpb24iLAorICAgICJnZXRfZ2xvYmFsX29wdGlvbiIsCisgICAgImdldF9tb2R1bGVfYW5kX2ZyYW1laWQiLAorICAgICJnZXRfcnN0X3NlY3Rpb24iLAorICAgICJnZXRfcnN0X3RpdGxlIiwKKyAgICAibm9ybWFsaXplX3RleHQiLAorICAgICJyZWdpc3Rlcl9wbHVnaW5zIiwKKyAgICAic2FmZV9kZWNvZGUiLAorICAgICJ0b2tlbml6ZV9tb2R1bGUiLAorXQpkaWZmIC0tZ2l0IGEvcHlsaW50L3V0aWxzL2FzdF93YWxrZXIucHkgYi9weWxpbnQvdXRpbHMvYXN0X3dhbGtlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQyZjk1Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3V0aWxzL2FzdF93YWxrZXIucHkKQEAgLTAsMCArMSw4NSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgY29sbGVjdGlvbnMKKworZnJvbSBhc3Ryb2lkIGltcG9ydCBub2RlcworCisKK2NsYXNzIEFTVFdhbGtlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGludGVyKToKKyAgICAgICAgIyBjYWxsYmFja3MgcGVyIG5vZGUgdHlwZXMKKyAgICAgICAgc2VsZi5uYnN0YXRlbWVudHMgPSAwCisgICAgICAgIHNlbGYudmlzaXRfZXZlbnRzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgc2VsZi5sZWF2ZV9ldmVudHMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBzZWxmLmxpbnRlciA9IGxpbnRlcgorICAgICAgICBzZWxmLmV4Y2VwdGlvbl9tc2cgPSBGYWxzZQorCisgICAgZGVmIF9pc19tZXRob2RfZW5hYmxlZChzZWxmLCBtZXRob2QpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihtZXRob2QsICJjaGVja3NfbXNncyIpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZm9yIG1zZ19kZXNjIGluIG1ldGhvZC5jaGVja3NfbXNnczoKKyAgICAgICAgICAgIGlmIHNlbGYubGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZChtc2dfZGVzYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYWRkX2NoZWNrZXIoc2VsZiwgY2hlY2tlcik6CisgICAgICAgICIiIndhbGsgdG8gdGhlIGNoZWNrZXIncyBkaXIgYW5kIGNvbGxlY3QgdmlzaXQgYW5kIGxlYXZlIG1ldGhvZHMiIiIKKyAgICAgICAgdmNpZHMgPSBzZXQoKQorICAgICAgICBsY2lkcyA9IHNldCgpCisgICAgICAgIHZpc2l0cyA9IHNlbGYudmlzaXRfZXZlbnRzCisgICAgICAgIGxlYXZlcyA9IHNlbGYubGVhdmVfZXZlbnRzCisgICAgICAgIGZvciBtZW1iZXIgaW4gZGlyKGNoZWNrZXIpOgorICAgICAgICAgICAgY2lkID0gbWVtYmVyWzY6XQorICAgICAgICAgICAgaWYgY2lkID09ICJkZWZhdWx0IjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbWVtYmVyLnN0YXJ0c3dpdGgoInZpc2l0XyIpOgorICAgICAgICAgICAgICAgIHZfbWV0aCA9IGdldGF0dHIoY2hlY2tlciwgbWVtYmVyKQorICAgICAgICAgICAgICAgICMgZG9uJ3QgdXNlIHZpc2l0X21ldGhvZHMgd2l0aCBubyBhY3RpdmF0ZWQgbWVzc2FnZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9pc19tZXRob2RfZW5hYmxlZCh2X21ldGgpOgorICAgICAgICAgICAgICAgICAgICB2aXNpdHNbY2lkXS5hcHBlbmQodl9tZXRoKQorICAgICAgICAgICAgICAgICAgICB2Y2lkcy5hZGQoY2lkKQorICAgICAgICAgICAgZWxpZiBtZW1iZXIuc3RhcnRzd2l0aCgibGVhdmVfIik6CisgICAgICAgICAgICAgICAgbF9tZXRoID0gZ2V0YXR0cihjaGVja2VyLCBtZW1iZXIpCisgICAgICAgICAgICAgICAgIyBkb24ndCB1c2UgbGVhdmVfbWV0aG9kcyB3aXRoIG5vIGFjdGl2YXRlZCBtZXNzYWdlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX21ldGhvZF9lbmFibGVkKGxfbWV0aCk6CisgICAgICAgICAgICAgICAgICAgIGxlYXZlc1tjaWRdLmFwcGVuZChsX21ldGgpCisgICAgICAgICAgICAgICAgICAgIGxjaWRzLmFkZChjaWQpCisgICAgICAgIHZpc2l0X2RlZmF1bHQgPSBnZXRhdHRyKGNoZWNrZXIsICJ2aXNpdF9kZWZhdWx0IiwgTm9uZSkKKyAgICAgICAgaWYgdmlzaXRfZGVmYXVsdDoKKyAgICAgICAgICAgIGZvciBjbHMgaW4gbm9kZXMuQUxMX05PREVfQ0xBU1NFUzoKKyAgICAgICAgICAgICAgICBjaWQgPSBjbHMuX19uYW1lX18ubG93ZXIoKQorICAgICAgICAgICAgICAgIGlmIGNpZCBub3QgaW4gdmNpZHM6CisgICAgICAgICAgICAgICAgICAgIHZpc2l0c1tjaWRdLmFwcGVuZCh2aXNpdF9kZWZhdWx0KQorICAgICAgICAjIGZvciBub3cgd2UgaGF2ZSBubyAibGVhdmVfZGVmYXVsdCIgbWV0aG9kIGluIFB5bGludAorCisgICAgZGVmIHdhbGsoc2VsZiwgYXN0cm9pZCk6CisgICAgICAgICIiImNhbGwgdmlzaXQgZXZlbnRzIG9mIGFzdHJvaWQgY2hlY2tlcnMgZm9yIHRoZSBnaXZlbiBub2RlLCByZWN1cnNlIG9uCisgICAgICAgIGl0cyBjaGlsZHJlbiwgdGhlbiBsZWF2ZSBldmVudHMuCisgICAgICAgICIiIgorICAgICAgICBjaWQgPSBhc3Ryb2lkLl9fY2xhc3NfXy5fX25hbWVfXy5sb3dlcigpCisKKyAgICAgICAgIyBEZXRlY3QgaWYgdGhlIG5vZGUgaXMgYSBuZXcgbmFtZSBmb3IgYSBkZXByZWNhdGVkIGFsaWFzLgorICAgICAgICAjIEluIHRoaXMgY2FzZSwgZmF2b3VyIHRoZSBtZXRob2RzIGZvciB0aGUgZGVwcmVjYXRlZAorICAgICAgICAjIGFsaWFzIGlmIGFueSwgIGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcworICAgICAgICAjIGNvbXBhdGliaWxpdHkuCisgICAgICAgIHZpc2l0X2V2ZW50cyA9IHNlbGYudmlzaXRfZXZlbnRzLmdldChjaWQsICgpKQorICAgICAgICBsZWF2ZV9ldmVudHMgPSBzZWxmLmxlYXZlX2V2ZW50cy5nZXQoY2lkLCAoKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBhc3Ryb2lkLmlzX3N0YXRlbWVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm5ic3RhdGVtZW50cyArPSAxCisgICAgICAgICAgICAjIGdlbmVyYXRlIGV2ZW50cyBmb3IgdGhpcyBub2RlIG9uIGVhY2ggY2hlY2tlcgorICAgICAgICAgICAgZm9yIGNhbGxiYWNrIGluIHZpc2l0X2V2ZW50cyBvciAoKToKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhhc3Ryb2lkKQorICAgICAgICAgICAgIyByZWN1cnNlIG9uIGNoaWxkcmVuCisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gYXN0cm9pZC5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgICAgICBzZWxmLndhbGsoY2hpbGQpCisgICAgICAgICAgICBmb3IgY2FsbGJhY2sgaW4gbGVhdmVfZXZlbnRzIG9yICgpOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKGFzdHJvaWQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBpZiBzZWxmLmV4Y2VwdGlvbl9tc2cgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgZmlsZSA9IGdldGF0dHIoYXN0cm9pZC5yb290KCksICJmaWxlIiwgTm9uZSkKKyAgICAgICAgICAgICAgICBwcmludChmIkV4Y2VwdGlvbiBvbiBub2RlIHtyZXByKGFzdHJvaWQpfSBpbiBmaWxlICd7ZmlsZX0nIikKKyAgICAgICAgICAgICAgICBzZWxmLmV4Y2VwdGlvbl9tc2cgPSBUcnVlCisgICAgICAgICAgICByYWlzZQpkaWZmIC0tZ2l0IGEvcHlsaW50L3V0aWxzL2ZpbGVfc3RhdGUucHkgYi9weWxpbnQvdXRpbHMvZmlsZV9zdGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg0MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3V0aWxzL2ZpbGVfc3RhdGUucHkKQEAgLTAsMCArMSwxMzYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbGxlY3Rpb25zCisKK2Zyb20gYXN0cm9pZCBpbXBvcnQgbm9kZXMKKworZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCBNU0dfU1RBVEVfU0NPUEVfTU9EVUxFLCBXYXJuaW5nU2NvcGUKKworCitjbGFzcyBGaWxlU3RhdGU6CisgICAgIiIiSG9sZCBpbnRlcm5hbCBzdGF0ZSBzcGVjaWZpYyB0byB0aGUgY3VycmVudGx5IGFuYWx5emVkIGZpbGUiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RuYW1lPU5vbmUpOgorICAgICAgICBzZWxmLmJhc2VfbmFtZSA9IG1vZG5hbWUKKyAgICAgICAgc2VsZi5fbW9kdWxlX21zZ3Nfc3RhdGUgPSB7fQorICAgICAgICBzZWxmLl9yYXdfbW9kdWxlX21zZ3Nfc3RhdGUgPSB7fQorICAgICAgICBzZWxmLl9pZ25vcmVkX21zZ3MgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChzZXQpCisgICAgICAgIHNlbGYuX3N1cHByZXNzaW9uX21hcHBpbmcgPSB7fQorICAgICAgICBzZWxmLl9lZmZlY3RpdmVfbWF4X2xpbmVfbnVtYmVyID0gTm9uZQorCisgICAgZGVmIGNvbGxlY3RfYmxvY2tfbGluZXMoc2VsZiwgbXNnc19zdG9yZSwgbW9kdWxlX25vZGUpOgorICAgICAgICAiIiJXYWxrIHRoZSBBU1QgdG8gY29sbGVjdCBibG9jayBsZXZlbCBvcHRpb25zIGxpbmUgbnVtYmVycy4iIiIKKyAgICAgICAgZm9yIG1zZywgbGluZXMgaW4gc2VsZi5fbW9kdWxlX21zZ3Nfc3RhdGUuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuX3Jhd19tb2R1bGVfbXNnc19zdGF0ZVttc2ddID0gbGluZXMuY29weSgpCisgICAgICAgIG9yaWdfc3RhdGUgPSBzZWxmLl9tb2R1bGVfbXNnc19zdGF0ZS5jb3B5KCkKKyAgICAgICAgc2VsZi5fbW9kdWxlX21zZ3Nfc3RhdGUgPSB7fQorICAgICAgICBzZWxmLl9zdXBwcmVzc2lvbl9tYXBwaW5nID0ge30KKyAgICAgICAgc2VsZi5fZWZmZWN0aXZlX21heF9saW5lX251bWJlciA9IG1vZHVsZV9ub2RlLnRvbGluZW5vCisgICAgICAgIHNlbGYuX2NvbGxlY3RfYmxvY2tfbGluZXMobXNnc19zdG9yZSwgbW9kdWxlX25vZGUsIG9yaWdfc3RhdGUpCisKKyAgICBkZWYgX2NvbGxlY3RfYmxvY2tfbGluZXMoc2VsZiwgbXNnc19zdG9yZSwgbm9kZSwgbXNnX3N0YXRlKToKKyAgICAgICAgIiIiUmVjdXJzaXZlbHkgd2FsayAoZGVwdGggZmlyc3QpIEFTVCB0byBjb2xsZWN0IGJsb2NrIGxldmVsIG9wdGlvbnMKKyAgICAgICAgbGluZSBudW1iZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuZ2V0X2NoaWxkcmVuKCk6CisgICAgICAgICAgICBzZWxmLl9jb2xsZWN0X2Jsb2NrX2xpbmVzKG1zZ3Nfc3RvcmUsIGNoaWxkLCBtc2dfc3RhdGUpCisgICAgICAgIGZpcnN0ID0gbm9kZS5mcm9tbGluZW5vCisgICAgICAgIGxhc3QgPSBub2RlLnRvbGluZW5vCisgICAgICAgICMgZmlyc3QgY2hpbGQgbGluZSBudW1iZXIgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpc2FibGUKKyAgICAgICAgIyB3aGljaCBhcmUgdGhlIGZpcnN0IGNoaWxkIG9mIHNjb3BlZCBub2RlIHdpdGggdGhvc2UgZGVmaW5lZCBsYXRlci4KKyAgICAgICAgIyBGb3IgaW5zdGFuY2UgaW4gdGhlIGNvZGUgYmVsb3c6CisgICAgICAgICMKKyAgICAgICAgIyAxLiAgIGRlZiBtZXRoOChzZWxmKToKKyAgICAgICAgIyAyLiAgICAgICAgIiIidGVzdCBsYXRlIGRpc2FibGluZyIiIgorICAgICAgICAjIDMuICAgICAgICBweWxpbnQ6IGRpc2FibGU9bm90LWNhbGxhYmxlCisgICAgICAgICMgNC4gICAgICAgIHByaW50KHNlbGYuYmxpcCkKKyAgICAgICAgIyA1LiAgICAgICAgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgorICAgICAgICAjIDYuICAgICAgICBwcmludChzZWxmLmJsYSkKKyAgICAgICAgIworICAgICAgICAjIEUxMTAyIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIGxpbmUgMSB0byA2IHdoaWxlIEUxMTAxIGZyb20gbGluZSA1IHRvIDYKKyAgICAgICAgIworICAgICAgICAjIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgbG9jYWxseSBtZXNzYWdlcyBhcHBseWluZyB0byBjbGFzcyAvCisgICAgICAgICMgZnVuY3Rpb24gdXNpbmcgdGhlaXIgZnJvbWxpbmVubworICAgICAgICBpZiAoCisgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUsIChub2Rlcy5Nb2R1bGUsIG5vZGVzLkNsYXNzRGVmLCBub2Rlcy5GdW5jdGlvbkRlZikpCisgICAgICAgICAgICBhbmQgbm9kZS5ib2R5CisgICAgICAgICk6CisgICAgICAgICAgICBmaXJzdGNoaWxkbGluZW5vID0gbm9kZS5ib2R5WzBdLmZyb21saW5lbm8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0Y2hpbGRsaW5lbm8gPSBsYXN0CisgICAgICAgIGZvciBtc2dpZCwgbGluZXMgaW4gbXNnX3N0YXRlLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgbGluZW5vLCBzdGF0ZSBpbiBsaXN0KGxpbmVzLml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIG9yaWdpbmFsX2xpbmVubyA9IGxpbmVubworICAgICAgICAgICAgICAgIGlmIGZpcnN0ID4gbGluZW5vIG9yIGxhc3QgPCBsaW5lbm86CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIyBTZXQgc3RhdGUgZm9yIGFsbCBsaW5lcyBmb3IgdGhpcyBibG9jaywgaWYgdGhlCisgICAgICAgICAgICAgICAgIyB3YXJuaW5nIGlzIGFwcGxpZWQgdG8gbm9kZXMuCisgICAgICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9ucyA9IG1zZ3Nfc3RvcmUuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbnMobXNnaWQpCisgICAgICAgICAgICAgICAgZm9yIG1lc3NhZ2VfZGVmaW5pdGlvbiBpbiBtZXNzYWdlX2RlZmluaXRpb25zOgorICAgICAgICAgICAgICAgICAgICBpZiBtZXNzYWdlX2RlZmluaXRpb24uc2NvcGUgPT0gV2FybmluZ1Njb3BlLk5PREU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm8gPiBmaXJzdGNoaWxkbGluZW5vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfLCBsYXN0XyA9IG5vZGUuYmxvY2tfcmFuZ2UobGluZW5vKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfID0gbGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0XyA9IGxhc3QKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiByYW5nZShmaXJzdF8sIGxhc3RfICsgMSk6CisgICAgICAgICAgICAgICAgICAgICMgZG8gbm90IG92ZXJyaWRlIGV4aXN0aW5nIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBpbiBzZWxmLl9tb2R1bGVfbXNnc19zdGF0ZS5nZXQobXNnaWQsICgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgaW4gbGluZXM6ICAjIHN0YXRlIGNoYW5nZSBpbiB0aGUgc2FtZSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBsaW5lc1tsaW5lXQorICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfbGluZW5vID0gbGluZQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdXBwcmVzc2lvbl9tYXBwaW5nWyhtc2dpZCwgbGluZSldID0gb3JpZ2luYWxfbGluZW5vCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21vZHVsZV9tc2dzX3N0YXRlW21zZ2lkXVtsaW5lXSA9IHN0YXRlCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21vZHVsZV9tc2dzX3N0YXRlW21zZ2lkXSA9IHtsaW5lOiBzdGF0ZX0KKyAgICAgICAgICAgICAgICBkZWwgbGluZXNbbGluZW5vXQorCisgICAgZGVmIHNldF9tc2dfc3RhdHVzKHNlbGYsIG1zZywgbGluZSwgc3RhdHVzKToKKyAgICAgICAgIiIiU2V0IHN0YXR1cyAoZW5hYmxlZC9kaXNhYmxlKSBmb3IgYSBnaXZlbiBtZXNzYWdlIGF0IGEgZ2l2ZW4gbGluZSIiIgorICAgICAgICBhc3NlcnQgbGluZSA+IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbW9kdWxlX21zZ3Nfc3RhdGVbbXNnLm1zZ2lkXVtsaW5lXSA9IHN0YXR1cworICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLl9tb2R1bGVfbXNnc19zdGF0ZVttc2cubXNnaWRdID0ge2xpbmU6IHN0YXR1c30KKworICAgIGRlZiBoYW5kbGVfaWdub3JlZF9tZXNzYWdlKAorICAgICAgICBzZWxmLCBzdGF0ZV9zY29wZSwgbXNnaWQsIGxpbmUsIG5vZGUsIGFyZ3MsIGNvbmZpZGVuY2UKKyAgICApOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgICIiIlJlcG9ydCBhbiBpZ25vcmVkIG1lc3NhZ2UuCisKKyAgICAgICAgc3RhdGVfc2NvcGUgaXMgZWl0aGVyIE1TR19TVEFURV9TQ09QRV9NT0RVTEUgb3IgTVNHX1NUQVRFX1NDT1BFX0NPTkZJRywKKyAgICAgICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIGRpc2FibGVkIGxvY2FsbHkgaW4gdGhlIG1vZHVsZSwKKyAgICAgICAgb3IgZ2xvYmFsbHkuIFRoZSBvdGhlciBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBhZGRfbWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHN0YXRlX3Njb3BlID09IE1TR19TVEFURV9TQ09QRV9NT0RVTEU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3JpZ19saW5lID0gc2VsZi5fc3VwcHJlc3Npb25fbWFwcGluZ1sobXNnaWQsIGxpbmUpXQorICAgICAgICAgICAgICAgIHNlbGYuX2lnbm9yZWRfbXNnc1sobXNnaWQsIG9yaWdfbGluZSldLmFkZChsaW5lKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBpdGVyX3NwdXJpb3VzX3N1cHByZXNzaW9uX21lc3NhZ2VzKHNlbGYsIG1zZ3Nfc3RvcmUpOgorICAgICAgICBmb3Igd2FybmluZywgbGluZXMgaW4gc2VsZi5fcmF3X21vZHVsZV9tc2dzX3N0YXRlLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgbGluZSwgZW5hYmxlIGluIGxpbmVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGVuYWJsZSBhbmQgKHdhcm5pbmcsIGxpbmUpIG5vdCBpbiBzZWxmLl9pZ25vcmVkX21zZ3M6CisgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGN5Y2xpYy1pbXBvcnQgY2hlY2sgd2hpY2ggY2FuIHNob3cgZmFsc2UgcG9zaXRpdmVzCisgICAgICAgICAgICAgICAgICAgICMgaGVyZSBkdWUgdG8gaW5jb21wbGV0ZSBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGlmIHdhcm5pbmcgIT0gIlIwNDAxIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkICJ1c2VsZXNzLXN1cHByZXNzaW9uIiwgbGluZSwgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ3Nfc3RvcmUuZ2V0X21zZ19kaXNwbGF5X3N0cmluZyh3YXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgIyBkb24ndCB1c2UgaXRlcml0ZW1zIGhlcmUsIF9pZ25vcmVkX21zZ3MgbWF5IGJlIG1vZGlmaWVkIGJ5IGFkZF9tZXNzYWdlCisgICAgICAgIGZvciAod2FybmluZywgZnJvbV8pLCBsaW5lcyBpbiBsaXN0KHNlbGYuX2lnbm9yZWRfbXNncy5pdGVtcygpKToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgIHlpZWxkICJzdXBwcmVzc2VkLW1lc3NhZ2UiLCBsaW5lLCAoCisgICAgICAgICAgICAgICAgICAgIG1zZ3Nfc3RvcmUuZ2V0X21zZ19kaXNwbGF5X3N0cmluZyh3YXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgZnJvbV8sCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGdldF9lZmZlY3RpdmVfbWF4X2xpbmVfbnVtYmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZWZmZWN0aXZlX21heF9saW5lX251bWJlcgpkaWZmIC0tZ2l0IGEvcHlsaW50L3V0aWxzL3ByYWdtYV9wYXJzZXIucHkgYi9weWxpbnQvdXRpbHMvcHJhZ21hX3BhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjBjNmRhCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3V0aWxzL3ByYWdtYV9wYXJzZXIucHkKQEAgLTAsMCArMSwxMzIgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IHJlCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCitmcm9tIHR5cGluZyBpbXBvcnQgR2VuZXJhdG9yLCBMaXN0CisKKyMgQWxsb3cgc3RvcHBpbmcgYWZ0ZXIgdGhlIGZpcnN0IHNlbWljb2xvbi9oYXNoIGVuY291bnRlcmVkLAorIyBzbyB0aGF0IGFuIG9wdGlvbiBjYW4gYmUgY29udGludWVkIHdpdGggdGhlIHJlYXNvbnMKKyMgd2h5IGl0IGlzIGFjdGl2ZSBvciBkaXNhYmxlZC4KK09QVElPTl9SR1ggPSByIiIiCisgICAgXHMqICAgICAgICAgICAgICAgICPCoEFueSBudW1iZXIgb2Ygd2hpdGhlc3BhY2UKKyAgICBcIz8gICAgICAgICAgICAgICAgI8KgT25lIG9yIHplcm8gaGFzaAorICAgIC4qICAgICAgICAgICAgICAgICAjwqBBbnl0aGluZyAoYXMgbXVjaCBhcyBwb3NzaWJsZSkKKyAgICAoXHMqICAgICAgICAgICAgICAgIyBCZWdpbm5pbmcgb2YgZmlyc3QgbWF0Y2hlZCBncm91cCBhbmQgYW55IG51bWJlciBvZiB3aGl0ZXNwYWNlcworICAgIFwjICAgICAgICAgICAgICAgICAjwqBCZWdpbm5pbmcgb2YgY29tbWVudAorICAgIC4qPyAgICAgICAgICAgICAgICAjwqBBbnl0aGluZyAoYXMgbGl0dGxlIGFzIHBvc3NpYmxlKQorICAgIFxicHlsaW50OiAgICAgICAgICAjIHB5bGludCB3b3JkIGFuZCBjb2x1bW4KKyAgICBccyogICAgICAgICAgICAgICAgIyBBbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2VzCisgICAgKFteOyNcbl0rKSkgICAgICAgICMgQW55dGhpbmcgZXhjZXB0IHNlbWljb2xvbiBvciBoYXNoIG9yIG5ld2xpbmUgKGl0IGlzIHRoZSBzZWNvbmQgbWF0Y2hlZCBncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgZW5kIG9mIHRoZSBmaXJzdCBtYXRjaGVkIGdyb3VwCisgICAgWzsjXXswLDF9IiIiICAjIEZyb20gMCB0byAxIHJlcGV0aXRpb24gb2Ygc2VtaWNvbG9uIG9yIGhhc2gKK09QVElPTl9QTyA9IHJlLmNvbXBpbGUoT1BUSU9OX1JHWCwgcmUuVkVSQk9TRSkKKworCitQcmFnbWFSZXByZXNlbnRlciA9IG5hbWVkdHVwbGUoIlByYWdtYVJlcHJlc2VudGVyIiwgImFjdGlvbiBtZXNzYWdlcyIpCisKKworQVRPTUlDX0tFWVdPUkRTID0gZnJvemVuc2V0KCgiZGlzYWJsZS1hbGwiLCAic2tpcC1maWxlIikpCitNRVNTQUdFX0tFWVdPUkRTID0gZnJvemVuc2V0KCgiZGlzYWJsZS1tc2ciLCAiZW5hYmxlLW1zZyIsICJkaXNhYmxlIiwgImVuYWJsZSIpKQorIyBzb3J0ZWQgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2V0cyBhcmUgdW5vcmRlcmVkIGNvbGxlY3Rpb25zIGFuZCBBTExfS0VZV09SRFMKKyMgwqBzdHJpbmcgc2hvdWxkIG5vdCB2YXJ5IGJldHdlZW4gZXhlY3V0aW9ucworIyDCoHJldmVyc2UgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGhhdmUgdGhlIGxvbmdlc3Qga2V5d29yZHMgZmlyc3QsIHNvIHRoYXQsIGZvciBleGFtcGxlLAorIyAnZGlzYWJsZScgc3RyaW5nwqBzaG91bGQgbm90IGJlIG1hdGNoZWQgaW5zdGVhZCBvZiAnZGlzYWJsZS1hbGwnCitBTExfS0VZV09SRFMgPSAifCIuam9pbigKKyAgICBzb3J0ZWQoQVRPTUlDX0tFWVdPUkRTIHwgTUVTU0FHRV9LRVlXT1JEUywga2V5PWxlbiwgcmV2ZXJzZT1UcnVlKQorKQorCisKK1RPS0VOX1NQRUNJRklDQVRJT04gPSBbCisgICAgKCJLRVlXT1JEIiwgZnIiXGIoe0FMTF9LRVlXT1JEUzpzfSlcYiIpLAorICAgICgiTUVTU0FHRV9TVFJJTkciLCByIlswLTlBLVphLXpcLVxfXXsyLH0iKSwgICMgwqBJZGVudGlmaWVycworICAgICgiQVNTSUdOIiwgciI9IiksICAjIMKgQXNzaWdubWVudCBvcGVyYXRvcgorICAgICgiTUVTU0FHRV9OVU1CRVIiLCByIltDUkVJV0ZdezF9XGQqIiksCitdCisKK1RPS19SRUdFWCA9ICJ8Ii5qb2luKAorICAgIGYiKD9QPHt0b2tlbl9uYW1lOnN9Pnt0b2tlbl9yZ3g6c30pIgorICAgIGZvciB0b2tlbl9uYW1lLCB0b2tlbl9yZ3ggaW4gVE9LRU5fU1BFQ0lGSUNBVElPTgorKQorCisKK2RlZiBlbWl0X3ByYWdtYV9yZXByZXNlbnRlcihhY3Rpb24sIG1lc3NhZ2VzKToKKyAgICBpZiBub3QgbWVzc2FnZXMgYW5kIGFjdGlvbiBpbiBNRVNTQUdFX0tFWVdPUkRTOgorICAgICAgICByYWlzZSBJbnZhbGlkUHJhZ21hRXJyb3IoCisgICAgICAgICAgICAiVGhlIGtleXdvcmQgaXMgbm90IGZvbGxvd2VkIGJ5IG1lc3NhZ2UgaWRlbnRpZmllciIsIGFjdGlvbgorICAgICAgICApCisgICAgcmV0dXJuIFByYWdtYVJlcHJlc2VudGVyKGFjdGlvbiwgbWVzc2FnZXMpCisKKworY2xhc3MgUHJhZ21hUGFyc2VyRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBBIGNsYXNzIGZvciBleGNlcHRpb25zIHRocm93biBieSBwcmFnbWFfcGFyc2VyIG1vZHVsZQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHRva2VuKToKKyAgICAgICAgIiIiCisgICAgICAgIDphcmdzIG1lc3NhZ2U6IGV4cGxhaW4gdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24KKyAgICAgICAgOmFyZ3MgdG9rZW46IHRva2VuIGNvbmNlcm5lZCBieSB0aGUgZXhjZXB0aW9uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIHNlbGYudG9rZW4gPSB0b2tlbgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKHNlbGYubWVzc2FnZSkKKworCitjbGFzcyBVblJlY29nbml6ZWRPcHRpb25FcnJvcihQcmFnbWFQYXJzZXJFcnJvcik6CisgICAgIiIiCisgICAgVGhyb3duIGluIGNhc2UgdGhlIG9mIGEgdmFsaWQgYnV0IHVucmVjb2duaXplZCBvcHRpb24KKyAgICAiIiIKKworCitjbGFzcyBJbnZhbGlkUHJhZ21hRXJyb3IoUHJhZ21hUGFyc2VyRXJyb3IpOgorICAgICIiIgorICAgIFRocm93biBpbiBjYXNlIHRoZSBwcmFnbWEgaXMgaW52YWxpZAorICAgICIiIgorCisKK2RlZiBwYXJzZV9wcmFnbWEocHlsaW50X3ByYWdtYTogc3RyKSAtPiBHZW5lcmF0b3JbUHJhZ21hUmVwcmVzZW50ZXIsIE5vbmUsIE5vbmVdOgorICAgIGFjdGlvbiA9IE5vbmUKKyAgICBtZXNzYWdlczogTGlzdFtzdHJdID0gW10KKyAgICBhc3NpZ25tZW50X3JlcXVpcmVkID0gRmFsc2UKKyAgICBwcmV2aW91c190b2tlbiA9ICIiCisKKyAgICBmb3IgbW8gaW4gcmUuZmluZGl0ZXIoVE9LX1JFR0VYLCBweWxpbnRfcHJhZ21hKToKKyAgICAgICAga2luZCA9IG1vLmxhc3Rncm91cAorICAgICAgICB2YWx1ZSA9IG1vLmdyb3VwKCkKKworICAgICAgICBpZiBraW5kID09ICJBU1NJR04iOgorICAgICAgICAgICAgaWYgbm90IGFzc2lnbm1lbnRfcmVxdWlyZWQ6CisgICAgICAgICAgICAgICAgaWYgYWN0aW9uOgorICAgICAgICAgICAgICAgICAgICAjIEEga2V5d29yZCBoYXMgYmVlbiBmb3VuZCBwcmV2aW91c2x5IGJ1dCBkb2Vzbid0IHN1cHBvcnQgYXNzaWduZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGtleXdvcmQgZG9lc24ndCBzdXBwb3J0IGFzc2lnbm1lbnQiLCBhY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzX3Rva2VuOgorICAgICAgICAgICAgICAgICAgICAjIMKgU29tZXRoaW5nIGZvdW5kIHByZXZpb3VzbHkgYnV0IG5vdCBhIGtub3duIGtleXdvcmQKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGtleXdvcmQgaXMgdW5rbm93biIsIHByZXZpb3VzX3Rva2VuCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAjIE5vdGhpbmcgYXQgYWxsIGRldGVjdGVkIGJlZm9yZSB0aGlzIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkUHJhZ21hRXJyb3IoIk1pc3Npbmcga2V5d29yZCBiZWZvcmUgYXNzaWdubWVudCIsICIiKQorICAgICAgICAgICAgYXNzaWdubWVudF9yZXF1aXJlZCA9IEZhbHNlCisgICAgICAgIGVsaWYgYXNzaWdubWVudF9yZXF1aXJlZDoKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRQcmFnbWFFcnJvcigiVGhlID0gc2lnbiBpcyBtaXNzaW5nIGFmdGVyIHRoZSBrZXl3b3JkIiwgYWN0aW9uKQorICAgICAgICBlbGlmIGtpbmQgPT0gIktFWVdPUkQiOgorICAgICAgICAgICAgaWYgYWN0aW9uOgorICAgICAgICAgICAgICAgIHlpZWxkIGVtaXRfcHJhZ21hX3JlcHJlc2VudGVyKGFjdGlvbiwgbWVzc2FnZXMpCisgICAgICAgICAgICBhY3Rpb24gPSB2YWx1ZQorICAgICAgICAgICAgbWVzc2FnZXMgPSBsaXN0KCkKKyAgICAgICAgICAgIGFzc2lnbm1lbnRfcmVxdWlyZWQgPSBhY3Rpb24gaW4gTUVTU0FHRV9LRVlXT1JEUworICAgICAgICBlbGlmIGtpbmQgaW4gKCJNRVNTQUdFX1NUUklORyIsICJNRVNTQUdFX05VTUJFUiIpOgorICAgICAgICAgICAgbWVzc2FnZXMuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgYXNzaWdubWVudF9yZXF1aXJlZCA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlRva2VuIG5vdCByZWNvZ25pemVkIikKKworICAgICAgICBwcmV2aW91c190b2tlbiA9IHZhbHVlCisKKyAgICBpZiBhY3Rpb246CisgICAgICAgIHlpZWxkIGVtaXRfcHJhZ21hX3JlcHJlc2VudGVyKGFjdGlvbiwgbWVzc2FnZXMpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IoIlRoZSBrZXl3b3JkIGlzIHVua25vd24iLCBwcmV2aW91c190b2tlbikKZGlmZiAtLWdpdCBhL3B5bGludC91dGlscy91dGlscy5weSBiL3B5bGludC91dGlscy91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDllZjRhCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50L3V0aWxzL3V0aWxzLnB5CkBAIC0wLDAgKzEsMzE4IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKwordHJ5OgorICAgIGltcG9ydCBpc29ydC5hcGkKKworICAgIEhBU19JU09SVF81ID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOiAgIyBpc29ydCA8IDUKKyAgICBpbXBvcnQgaXNvcnQKKworICAgIEhBU19JU09SVF81ID0gRmFsc2UKKworaW1wb3J0IGNvZGVjcworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHRva2VuaXplCisKK2Zyb20gYXN0cm9pZCBpbXBvcnQgTW9kdWxlLCBtb2R1dGlscworCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IFBZX0VYVFMKKworREVGQVVMVF9MSU5FX0xFTkdUSCA9IDc5CisKKworZGVmIG5vcm1hbGl6ZV90ZXh0KHRleHQsIGxpbmVfbGVuPURFRkFVTFRfTElORV9MRU5HVEgsIGluZGVudD0iIik6CisgICAgIiIiV3JhcCB0aGUgdGV4dCBvbiB0aGUgZ2l2ZW4gbGluZSBsZW5ndGguIiIiCisgICAgcmV0dXJuICJcbiIuam9pbigKKyAgICAgICAgdGV4dHdyYXAud3JhcCgKKyAgICAgICAgICAgIHRleHQsIHdpZHRoPWxpbmVfbGVuLCBpbml0aWFsX2luZGVudD1pbmRlbnQsIHN1YnNlcXVlbnRfaW5kZW50PWluZGVudAorICAgICAgICApCisgICAgKQorCisKK0NNUFMgPSBbIj0iLCAiLSIsICIrIl0KKworCisjIHB5M2sgaGFzIG5vIG1vcmUgY21wIGJ1aWx0aW4KK2RlZiBjbXAoYSwgYik6ICAjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtYnVpbHRpbgorICAgIHJldHVybiAoYSA+IGIpIC0gKGEgPCBiKQorCisKK2RlZiBkaWZmX3N0cmluZyhvbGQsIG5ldyk6CisgICAgIiIiZ2l2ZW4gYW4gb2xkIGFuZCBuZXcgaW50IHZhbHVlLCByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZQorICAgIGRpZmZlcmVuY2UKKyAgICAiIiIKKyAgICBkaWZmID0gYWJzKG9sZCAtIG5ldykKKyAgICBkaWZmX3N0ciA9ICJ7fXt9Ii5mb3JtYXQoQ01QU1tjbXAob2xkLCBuZXcpXSwgZGlmZiBhbmQgKCIlLjJmIiAlIGRpZmYpIG9yICIiKQorICAgIHJldHVybiBkaWZmX3N0cgorCisKK2RlZiBnZXRfbW9kdWxlX2FuZF9mcmFtZWlkKG5vZGUpOgorICAgICIiInJldHVybiB0aGUgbW9kdWxlIG5hbWUgYW5kIHRoZSBmcmFtZSBpZCBpbiB0aGUgbW9kdWxlIiIiCisgICAgZnJhbWUgPSBub2RlLmZyYW1lKCkKKyAgICBtb2R1bGUsIG9iaiA9ICIiLCBbXQorICAgIHdoaWxlIGZyYW1lOgorICAgICAgICBpZiBpc2luc3RhbmNlKGZyYW1lLCBNb2R1bGUpOgorICAgICAgICAgICAgbW9kdWxlID0gZnJhbWUubmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqLmFwcGVuZChnZXRhdHRyKGZyYW1lLCAibmFtZSIsICI8bGFtYmRhPiIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcmFtZSA9IGZyYW1lLnBhcmVudC5mcmFtZSgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZyYW1lID0gTm9uZQorICAgIG9iai5yZXZlcnNlKCkKKyAgICByZXR1cm4gbW9kdWxlLCAiLiIuam9pbihvYmopCisKKworZGVmIGdldF9yc3RfdGl0bGUodGl0bGUsIGNoYXJhY3Rlcik6CisgICAgIiIiUGVybWl0IHRvIGdldCBhIHRpdGxlIGZvcm1hdHRlZCBhcyBSZVN0cnVjdHVyZWRUZXh0IHRlc3QgKHVuZGVybGluZWQgd2l0aCBhIGNob3NlbiBjaGFyYWN0ZXIpLiIiIgorICAgIHJldHVybiBmInt0aXRsZX1cbntjaGFyYWN0ZXIgKiBsZW4odGl0bGUpfVxuIgorCisKK2RlZiBnZXRfcnN0X3NlY3Rpb24oc2VjdGlvbiwgb3B0aW9ucywgZG9jPU5vbmUpOgorICAgICIiImZvcm1hdCBhbiBvcHRpb25zIHNlY3Rpb24gdXNpbmcgYXMgYSBSZVN0cnVjdHVyZWRUZXh0IGZvcm1hdHRlZCBvdXRwdXQiIiIKKyAgICByZXN1bHQgPSAiIgorICAgIGlmIHNlY3Rpb246CisgICAgICAgIHJlc3VsdCArPSBnZXRfcnN0X3RpdGxlKHNlY3Rpb24sICInIikKKyAgICBpZiBkb2M6CisgICAgICAgIGZvcm1hdHRlZF9kb2MgPSBub3JtYWxpemVfdGV4dChkb2MpCisgICAgICAgIHJlc3VsdCArPSAiJXNcblxuIiAlIGZvcm1hdHRlZF9kb2MKKyAgICBmb3Igb3B0bmFtZSwgb3B0ZGljdCwgdmFsdWUgaW4gb3B0aW9uczoKKyAgICAgICAgaGVscF9vcHQgPSBvcHRkaWN0LmdldCgiaGVscCIpCisgICAgICAgIHJlc3VsdCArPSAiOiVzOlxuIiAlIG9wdG5hbWUKKyAgICAgICAgaWYgaGVscF9vcHQ6CisgICAgICAgICAgICBmb3JtYXR0ZWRfaGVscCA9IG5vcm1hbGl6ZV90ZXh0KGhlbHBfb3B0LCBpbmRlbnQ9IiAgIikKKyAgICAgICAgICAgIHJlc3VsdCArPSAiJXNcbiIgJSBmb3JtYXR0ZWRfaGVscAorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHZhbHVlID0gc3RyKF9mb3JtYXRfb3B0aW9uX3ZhbHVlKG9wdGRpY3QsIHZhbHVlKSkKKyAgICAgICAgICAgIHJlc3VsdCArPSAiXG4gIERlZmF1bHQ6IGBgJXNgYFxuIiAlIHZhbHVlLnJlcGxhY2UoImBgICIsICJgYGBgIGBgIikKKyAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIHNhZmVfZGVjb2RlKGxpbmUsIGVuY29kaW5nLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiInJldHVybiBkZWNvZGVkIGxpbmUgZnJvbSBlbmNvZGluZyBvciBkZWNvZGUgd2l0aCBkZWZhdWx0IGVuY29kaW5nIiIiCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gbGluZS5kZWNvZGUoZW5jb2Rpbmcgb3Igc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAqYXJncywgKiprd2FyZ3MpCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICByZXR1cm4gbGluZS5kZWNvZGUoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCAqYXJncywgKiprd2FyZ3MpCisKKworZGVmIGRlY29kaW5nX3N0cmVhbShzdHJlYW0sIGVuY29kaW5nLCBlcnJvcnM9InN0cmljdCIpOgorICAgIHRyeToKKyAgICAgICAgcmVhZGVyX2NscyA9IGNvZGVjcy5nZXRyZWFkZXIoZW5jb2Rpbmcgb3Igc3lzLmdldGRlZmF1bHRlbmNvZGluZygpKQorICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgcmVhZGVyX2NscyA9IGNvZGVjcy5nZXRyZWFkZXIoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpKQorICAgIHJldHVybiByZWFkZXJfY2xzKHN0cmVhbSwgZXJyb3JzKQorCisKK2RlZiB0b2tlbml6ZV9tb2R1bGUobW9kdWxlKToKKyAgICB3aXRoIG1vZHVsZS5zdHJlYW0oKSBhcyBzdHJlYW06CisgICAgICAgIHJlYWRsaW5lID0gc3RyZWFtLnJlYWRsaW5lCisgICAgICAgIHJldHVybiBsaXN0KHRva2VuaXplLnRva2VuaXplKHJlYWRsaW5lKSkKKworCitkZWYgcmVnaXN0ZXJfcGx1Z2lucyhsaW50ZXIsIGRpcmVjdG9yeSk6CisgICAgIiIibG9hZCBhbGwgbW9kdWxlIGFuZCBwYWNrYWdlIGluIHRoZSBnaXZlbiBkaXJlY3RvcnksIGxvb2tpbmcgZm9yIGEKKyAgICAncmVnaXN0ZXInIGZ1bmN0aW9uIGluIGVhY2ggb25lLCB1c2VkIHRvIHJlZ2lzdGVyIHB5bGludCBjaGVja2VycworICAgICIiIgorICAgIGltcG9ydGVkID0ge30KKyAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpOgorICAgICAgICBiYXNlLCBleHRlbnNpb24gPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBpZiBiYXNlIGluIGltcG9ydGVkIG9yIGJhc2UgPT0gIl9fcHljYWNoZV9fIjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIGV4dGVuc2lvbiBpbiBQWV9FWFRTCisgICAgICAgICAgICBhbmQgYmFzZSAhPSAiX19pbml0X18iCisgICAgICAgICAgICBvciAoCisgICAgICAgICAgICAgICAgbm90IGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIGFuZCBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihkaXJlY3RvcnksIGJhc2UpKQorICAgICAgICAgICAgICAgIGFuZCBub3QgZmlsZW5hbWUuc3RhcnRzd2l0aCgiLiIpCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gbW9kdXRpbHMubG9hZF9tb2R1bGVfZnJvbV9maWxlKAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGVtcHR5IG1vZHVsZSBuYW1lICh1c3VhbGx5IGVtYWNzIGF1dG8tc2F2ZSBmaWxlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBwcmludChmIlByb2JsZW0gaW1wb3J0aW5nIG1vZHVsZSB7ZmlsZW5hbWV9OiB7ZXhjfSIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICJyZWdpc3RlciIpOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUucmVnaXN0ZXIobGludGVyKQorICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZFtiYXNlXSA9IDEKKworCitkZWYgZ2V0X2dsb2JhbF9vcHRpb24oY2hlY2tlciwgb3B0aW9uLCBkZWZhdWx0PU5vbmUpOgorICAgICIiIlJldHJpZXZlIGFuIG9wdGlvbiBkZWZpbmVkIGJ5IHRoZSBnaXZlbiAqY2hlY2tlciogb3IKKyAgICBieSBhbGwga25vd24gb3B0aW9uIHByb3ZpZGVycy4KKworICAgIEl0IHdpbGwgbG9vayBpbiB0aGUgbGlzdCBvZiBhbGwgb3B0aW9ucyBwcm92aWRlcnMKKyAgICB1bnRpbCB0aGUgZ2l2ZW4gKm9wdGlvbiogd2lsbCBiZSBmb3VuZC4KKyAgICBJZiB0aGUgb3B0aW9uIHdhc24ndCBmb3VuZCwgdGhlICpkZWZhdWx0KiB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgorICAgICIiIgorICAgICMgRmlyc3QsIHRyeSBpbiB0aGUgZ2l2ZW4gY2hlY2tlcidzIGNvbmZpZy4KKyAgICAjIEFmdGVyIHRoYXQsIGxvb2sgaW4gdGhlIG9wdGlvbnMgcHJvdmlkZXJzLgorCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gZ2V0YXR0cihjaGVja2VyLmNvbmZpZywgb3B0aW9uLnJlcGxhY2UoIi0iLCAiXyIpKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGZvciBwcm92aWRlciBpbiBjaGVja2VyLmxpbnRlci5vcHRpb25zX3Byb3ZpZGVyczoKKyAgICAgICAgZm9yIG9wdGlvbnMgaW4gcHJvdmlkZXIub3B0aW9uczoKKyAgICAgICAgICAgIGlmIG9wdGlvbnNbMF0gPT0gb3B0aW9uOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHByb3ZpZGVyLmNvbmZpZywgb3B0aW9uLnJlcGxhY2UoIi0iLCAiXyIpKQorICAgIHJldHVybiBkZWZhdWx0CisKKworZGVmIGRlcHJlY2F0ZWRfb3B0aW9uKAorICAgIHNob3J0bmFtZT1Ob25lLCBvcHRfdHlwZT1Ob25lLCBoZWxwX21zZz1Ob25lLCBkZXByZWNhdGlvbl9tc2c9Tm9uZQorKToKKyAgICBkZWYgX3dhcm5fZGVwcmVjYXRlZChvcHRpb24sIG9wdG5hbWUsICphcmdzKTogICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgICAgICBpZiBkZXByZWNhdGlvbl9tc2c6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGRlcHJlY2F0aW9uX21zZyAlIChvcHRuYW1lLCkpCisKKyAgICBvcHRpb24gPSB7CisgICAgICAgICJoZWxwIjogaGVscF9tc2csCisgICAgICAgICJoaWRlIjogVHJ1ZSwKKyAgICAgICAgInR5cGUiOiBvcHRfdHlwZSwKKyAgICAgICAgImFjdGlvbiI6ICJjYWxsYmFjayIsCisgICAgICAgICJjYWxsYmFjayI6IF93YXJuX2RlcHJlY2F0ZWQsCisgICAgICAgICJkZXByZWNhdGVkIjogVHJ1ZSwKKyAgICB9CisgICAgaWYgc2hvcnRuYW1lOgorICAgICAgICBvcHRpb25bInNob3J0bmFtZSJdID0gc2hvcnRuYW1lCisgICAgcmV0dXJuIG9wdGlvbgorCisKK2RlZiBfc3BsaXRzdHJpcChzdHJpbmcsIHNlcD0iLCIpOgorICAgICIiInJldHVybiBhIGxpc3Qgb2Ygc3RyaXBwZWQgc3RyaW5nIGJ5IHNwbGl0dGluZyB0aGUgc3RyaW5nIGdpdmVuIGFzCisgICAgYXJndW1lbnQgb24gYHNlcGAgKCcsJyBieSBkZWZhdWx0KS4gRW1wdHkgc3RyaW5nIGFyZSBkaXNjYXJkZWQuCisKKyAgICA+Pj4gX3NwbGl0c3RyaXAoJ2EsIGIsIGMgICAsICA0LCwnKQorICAgIFsnYScsICdiJywgJ2MnLCAnNCddCisgICAgPj4+IF9zcGxpdHN0cmlwKCdhJykKKyAgICBbJ2EnXQorICAgID4+PiBfc3BsaXRzdHJpcCgnYSxcbmIsXG5jLCcpCisgICAgWydhJywgJ2InLCAnYyddCisKKyAgICA6dHlwZSBzdHJpbmc6IHN0ciBvciB1bmljb2RlCisgICAgOnBhcmFtIHN0cmluZzogYSBjc3YgbGluZQorCisgICAgOnR5cGUgc2VwOiBzdHIgb3IgdW5pY29kZQorICAgIDpwYXJhbSBzZXA6IGZpZWxkIHNlcGFyYXRvciwgZGVmYXVsdCB0byB0aGUgY29tbWEgKCcsJykKKworICAgIDpydHlwZTogc3RyIG9yIHVuaWNvZGUKKyAgICA6cmV0dXJuOiB0aGUgdW5xdW90ZWQgc3RyaW5nIChvciB0aGUgaW5wdXQgc3RyaW5nIGlmIGl0IHdhc24ndCBxdW90ZWQpCisgICAgIiIiCisgICAgcmV0dXJuIFt3b3JkLnN0cmlwKCkgZm9yIHdvcmQgaW4gc3RyaW5nLnNwbGl0KHNlcCkgaWYgd29yZC5zdHJpcCgpXQorCisKK2RlZiBfdW5xdW90ZShzdHJpbmcpOgorICAgICIiInJlbW92ZSBvcHRpb25hbCBxdW90ZXMgKHNpbXBsZSBvciBkb3VibGUpIGZyb20gdGhlIHN0cmluZworCisgICAgOnR5cGUgc3RyaW5nOiBzdHIgb3IgdW5pY29kZQorICAgIDpwYXJhbSBzdHJpbmc6IGFuIG9wdGlvbmFsbHkgcXVvdGVkIHN0cmluZworCisgICAgOnJ0eXBlOiBzdHIgb3IgdW5pY29kZQorICAgIDpyZXR1cm46IHRoZSB1bnF1b3RlZCBzdHJpbmcgKG9yIHRoZSBpbnB1dCBzdHJpbmcgaWYgaXQgd2Fzbid0IHF1b3RlZCkKKyAgICAiIiIKKyAgICBpZiBub3Qgc3RyaW5nOgorICAgICAgICByZXR1cm4gc3RyaW5nCisgICAgaWYgc3RyaW5nWzBdIGluICJcIiciOgorICAgICAgICBzdHJpbmcgPSBzdHJpbmdbMTpdCisgICAgaWYgc3RyaW5nWy0xXSBpbiAiXCInIjoKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nWzotMV0KKyAgICByZXR1cm4gc3RyaW5nCisKKworZGVmIF9jaGVja19jc3YodmFsdWUpOgorICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICByZXR1cm4gX3NwbGl0c3RyaXAodmFsdWUpCisKKworZGVmIF9jb21tZW50KHN0cmluZyk6CisgICAgIiIicmV0dXJuIHN0cmluZyBhcyBhIGNvbW1lbnQiIiIKKyAgICBsaW5lcyA9IFtsaW5lLnN0cmlwKCkgZm9yIGxpbmUgaW4gc3RyaW5nLnNwbGl0bGluZXMoKV0KKyAgICByZXR1cm4gIiMgIiArICgiJXMjICIgJSBvcy5saW5lc2VwKS5qb2luKGxpbmVzKQorCisKK2RlZiBfZm9ybWF0X29wdGlvbl92YWx1ZShvcHRkaWN0LCB2YWx1ZSk6CisgICAgIiIicmV0dXJuIHRoZSB1c2VyIGlucHV0J3MgdmFsdWUgZnJvbSBhICdjb21waWxlZCcgdmFsdWUiIiIKKyAgICBpZiBvcHRkaWN0LmdldCgidHlwZSIsIE5vbmUpID09ICJweV92ZXJzaW9uIjoKKyAgICAgICAgdmFsdWUgPSAiLiIuam9pbihzdHIoaXRlbSkgZm9yIGl0ZW0gaW4gdmFsdWUpCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgdmFsdWUgPSAiLCIuam9pbihfZm9ybWF0X29wdGlvbl92YWx1ZShvcHRkaWN0LCBpdGVtKSBmb3IgaXRlbSBpbiB2YWx1ZSkKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgorICAgICAgICB2YWx1ZSA9ICIsIi5qb2luKGYie2t9Ont2fSIgZm9yIGssIHYgaW4gdmFsdWUuaXRlbXMoKSkKKyAgICBlbGlmIGhhc2F0dHIodmFsdWUsICJtYXRjaCIpOiAgIyBvcHRkaWN0LmdldCgndHlwZScpID09ICdyZWdleHAnCisgICAgICAgICMgY29tcGlsZWQgcmVnZXhwCisgICAgICAgIHZhbHVlID0gdmFsdWUucGF0dGVybgorICAgIGVsaWYgb3B0ZGljdC5nZXQoInR5cGUiKSA9PSAieW4iOgorICAgICAgICB2YWx1ZSA9ICJ5ZXMiIGlmIHZhbHVlIGVsc2UgIm5vIgorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSBhbmQgdmFsdWUuaXNzcGFjZSgpOgorICAgICAgICB2YWx1ZSA9ICInJXMnIiAlIHZhbHVlCisgICAgcmV0dXJuIHZhbHVlCisKKworZGVmIGZvcm1hdF9zZWN0aW9uKHN0cmVhbSwgc2VjdGlvbiwgb3B0aW9ucywgZG9jPU5vbmUpOgorICAgICIiImZvcm1hdCBhbiBvcHRpb25zIHNlY3Rpb24gdXNpbmcgdGhlIElOSSBmb3JtYXQiIiIKKyAgICBpZiBkb2M6CisgICAgICAgIHByaW50KF9jb21tZW50KGRvYyksIGZpbGU9c3RyZWFtKQorICAgIHByaW50KCJbJXNdIiAlIHNlY3Rpb24sIGZpbGU9c3RyZWFtKQorICAgIF9pbmlfZm9ybWF0KHN0cmVhbSwgb3B0aW9ucykKKworCitkZWYgX2luaV9mb3JtYXQoc3RyZWFtLCBvcHRpb25zKToKKyAgICAiIiJmb3JtYXQgb3B0aW9ucyB1c2luZyB0aGUgSU5JIGZvcm1hdCIiIgorICAgIGZvciBvcHRuYW1lLCBvcHRkaWN0LCB2YWx1ZSBpbiBvcHRpb25zOgorICAgICAgICB2YWx1ZSA9IF9mb3JtYXRfb3B0aW9uX3ZhbHVlKG9wdGRpY3QsIHZhbHVlKQorICAgICAgICBoZWxwX29wdCA9IG9wdGRpY3QuZ2V0KCJoZWxwIikKKyAgICAgICAgaWYgaGVscF9vcHQ6CisgICAgICAgICAgICBoZWxwX29wdCA9IG5vcm1hbGl6ZV90ZXh0KGhlbHBfb3B0LCBpbmRlbnQ9IiMgIikKKyAgICAgICAgICAgIHByaW50KGZpbGU9c3RyZWFtKQorICAgICAgICAgICAgcHJpbnQoaGVscF9vcHQsIGZpbGU9c3RyZWFtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoZmlsZT1zdHJlYW0pCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCgiIyVzPSIgJSBvcHRuYW1lLCBmaWxlPXN0cmVhbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gc3RyKHZhbHVlKS5zdHJpcCgpCisgICAgICAgICAgICBpZiByZS5tYXRjaChyIl4oW1x3LV0rLCkrW1x3LV0rJCIsIHN0cih2YWx1ZSkpOgorICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9ICJcbiAiICsgIiAiICogbGVuKG9wdG5hbWUpCisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZXBhcmF0b3Iuam9pbih4ICsgIiwiIGZvciB4IGluIHN0cih2YWx1ZSkuc3BsaXQoIiwiKSkKKyAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyAnLCcgZnJvbSBsYXN0IGVsZW1lbnQgb2YgdGhlIGxpc3QKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzotMV0KKyAgICAgICAgICAgIHByaW50KGYie29wdG5hbWV9PXt2YWx1ZX0iLCBmaWxlPXN0cmVhbSkKKworCitjbGFzcyBJc29ydERyaXZlcjoKKyAgICAiIiJBIHdyYXBwZXIgYXJvdW5kIGlzb3J0IEFQSSB0aGF0IGNoYW5nZWQgYmV0d2VlbiB2ZXJzaW9ucyA0IGFuZCA1LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGlmIEhBU19JU09SVF81OgorICAgICAgICAgICAgc2VsZi5pc29ydDVfY29uZmlnID0gaXNvcnQuYXBpLkNvbmZpZygKKyAgICAgICAgICAgICAgICAjIFRoZXJlIGlzIG5vdCB0eXBvIGhlcmUuIEVYVFJBX3N0YW5kYXJkX2xpYnJhcnkgaXMKKyAgICAgICAgICAgICAgICAjIHdoYXQgbW9zdCB1c2VycyB3YW50LiBUaGUgb3B0aW9uIGhhcyBiZWVuIG5hbWVkCisgICAgICAgICAgICAgICAgIyBLTk9XTl9zdGFuZGFyZF9saWJyYXJ5IGZvciBhZ2VzIGluIHB5bGludCBhbmQgd2UKKyAgICAgICAgICAgICAgICAjIGRvbid0IHdhbnQgdG8gYnJlYWsgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgICAgICBleHRyYV9zdGFuZGFyZF9saWJyYXJ5PWNvbmZpZy5rbm93bl9zdGFuZGFyZF9saWJyYXJ5LAorICAgICAgICAgICAgICAgIGtub3duX3RoaXJkX3BhcnR5PWNvbmZpZy5rbm93bl90aGlyZF9wYXJ0eSwKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaXNvcnQ0X29iaiA9IGlzb3J0LlNvcnRJbXBvcnRzKCAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCisgICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cz0iIiwKKyAgICAgICAgICAgICAgICBrbm93bl9zdGFuZGFyZF9saWJyYXJ5PWNvbmZpZy5rbm93bl9zdGFuZGFyZF9saWJyYXJ5LAorICAgICAgICAgICAgICAgIGtub3duX3RoaXJkX3BhcnR5PWNvbmZpZy5rbm93bl90aGlyZF9wYXJ0eSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBwbGFjZV9tb2R1bGUoc2VsZiwgcGFja2FnZSk6CisgICAgICAgIGlmIEhBU19JU09SVF81OgorICAgICAgICAgICAgcmV0dXJuIGlzb3J0LmFwaS5wbGFjZV9tb2R1bGUocGFja2FnZSwgc2VsZi5pc29ydDVfY29uZmlnKQorICAgICAgICByZXR1cm4gc2VsZi5pc29ydDRfb2JqLnBsYWNlX21vZHVsZShwYWNrYWdlKQpkaWZmIC0tZ2l0IGEvcHlsaW50cmMgYi9weWxpbnRyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg4YjEzCi0tLSAvZGV2L251bGwKKysrIGIvcHlsaW50cmMKQEAgLTAsMCArMSwzODEgQEAKK1tNQVNURVJdCisKKyMgU3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyNyY2ZpbGU9CisKKyMgUHl0aG9uIGNvZGUgdG8gZXhlY3V0ZSwgdXN1YWxseSBmb3Igc3lzLnBhdGggbWFuaXB1bGF0aW9uIHN1Y2ggYXMKKyMgcHlndGsucmVxdWlyZSgpLgorI2luaXQtaG9vaz0KKworIyBGaWxlcyBvciBkaXJlY3RvcmllcyB0byBiZSBza2lwcGVkLiBUaGV5IHNob3VsZCBiZSBiYXNlIG5hbWVzLCBub3QKKyMgcGF0aHMuCitpZ25vcmU9Q1ZTCisKKyMgUGlja2xlIGNvbGxlY3RlZCBkYXRhIGZvciBsYXRlciBjb21wYXJpc29ucy4KK3BlcnNpc3RlbnQ9eWVzCisKKyMgTGlzdCBvZiBwbHVnaW5zIChhcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIG9mIHB5dGhvbiBtb2R1bGVzIG5hbWVzKSB0byBsb2FkLAorIyB1c3VhbGx5IHRvIHJlZ2lzdGVyIGFkZGl0aW9uYWwgY2hlY2tlcnMuCitsb2FkLXBsdWdpbnM9CisgICAgcHlsaW50LmV4dGVuc2lvbnMuY2hlY2tfZWxpZiwKKyAgICBweWxpbnQuZXh0ZW5zaW9ucy5iYWRfYnVpbHRpbiwKKyAgICBweWxpbnQuZXh0ZW5zaW9ucy5jb2RlX3N0eWxlLAorCisjIFVzZSBtdWx0aXBsZSBwcm9jZXNzZXMgdG8gc3BlZWQgdXAgUHlsaW50Lgoram9icz0xCisKKyMgQWxsb3cgbG9hZGluZyBvZiBhcmJpdHJhcnkgQyBleHRlbnNpb25zLiBFeHRlbnNpb25zIGFyZSBpbXBvcnRlZCBpbnRvIHRoZQorIyBhY3RpdmUgUHl0aG9uIGludGVycHJldGVyIGFuZCBtYXkgcnVuIGFyYml0cmFyeSBjb2RlLgordW5zYWZlLWxvYWQtYW55LWV4dGVuc2lvbj1ubworCisjIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZSBvciBtb2R1bGUgbmFtZXMgZnJvbSB3aGVyZSBDIGV4dGVuc2lvbnMgbWF5CisjIGJlIGxvYWRlZC4gRXh0ZW5zaW9ucyBhcmUgbG9hZGluZyBpbnRvIHRoZSBhY3RpdmUgUHl0aG9uIGludGVycHJldGVyIGFuZCBtYXkKKyMgcnVuIGFyYml0cmFyeSBjb2RlCitleHRlbnNpb24tcGtnLWFsbG93LWxpc3Q9CisKKworW01FU1NBR0VTIENPTlRST0xdCisKKyMgT25seSBzaG93IHdhcm5pbmdzIHdpdGggdGhlIGxpc3RlZCBjb25maWRlbmNlIGxldmVscy4gTGVhdmUgZW1wdHkgdG8gc2hvdworIyBhbGwuIFZhbGlkIGxldmVsczogSElHSCwgSU5GRVJFTkNFLCBJTkZFUkVOQ0VfRkFJTFVSRSwgVU5ERUZJTkVECitjb25maWRlbmNlPQorCisjIEVuYWJsZSB0aGUgbWVzc2FnZSwgcmVwb3J0LCBjYXRlZ29yeSBvciBjaGVja2VyIHdpdGggdGhlIGdpdmVuIGlkKHMpLiBZb3UgY2FuCisjIGVpdGhlciBnaXZlIG11bHRpcGxlIGlkZW50aWZpZXIgc2VwYXJhdGVkIGJ5IGNvbW1hICgsKSBvciBwdXQgdGhpcyBvcHRpb24KKyMgbXVsdGlwbGUgdGltZS4gU2VlIGFsc28gdGhlICItLWRpc2FibGUiIG9wdGlvbiBmb3IgZXhhbXBsZXMuCitlbmFibGU9CisgICAgdXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZCwKKyAgICB1c2VsZXNzLXN1cHJlc3Npb24sCisgICAgZml4bWUKKworIyBEaXNhYmxlIHRoZSBtZXNzYWdlLCByZXBvcnQsIGNhdGVnb3J5IG9yIGNoZWNrZXIgd2l0aCB0aGUgZ2l2ZW4gaWQocykuIFlvdQorIyBjYW4gZWl0aGVyIGdpdmUgbXVsdGlwbGUgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IGNvbW1hICgsKSBvciBwdXQgdGhpcworIyBvcHRpb24gbXVsdGlwbGUgdGltZXMgKG9ubHkgb24gdGhlIGNvbW1hbmQgbGluZSwgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCisjIGZpbGUgd2hlcmUgaXQgc2hvdWxkIGFwcGVhciBvbmx5IG9uY2UpLllvdSBjYW4gYWxzbyB1c2UgIi0tZGlzYWJsZT1hbGwiIHRvCisjIGRpc2FibGUgZXZlcnl0aGluZyBmaXJzdCBhbmQgdGhlbiByZWVuYWJsZSBzcGVjaWZpYyBjaGVja3MuIEZvciBleGFtcGxlLCBpZgorIyB5b3Ugd2FudCB0byBydW4gb25seSB0aGUgc2ltaWxhcml0aWVzIGNoZWNrZXIsIHlvdSBjYW4gdXNlICItLWRpc2FibGU9YWxsCisjIC0tZW5hYmxlPXNpbWlsYXJpdGllcyIuIElmIHlvdSB3YW50IHRvIHJ1biBvbmx5IHRoZSBjbGFzc2VzIGNoZWNrZXIsIGJ1dCBoYXZlCisjIG5vIFdhcm5pbmcgbGV2ZWwgbWVzc2FnZXMgZGlzcGxheWVkLCB1c2UiLS1kaXNhYmxlPWFsbCAtLWVuYWJsZT1jbGFzc2VzCisjIC0tZGlzYWJsZT1XIgorCitkaXNhYmxlPQorICAgIGF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCwKKyAgICBkdXBsaWNhdGUtY29kZSwKKyAgICBpbnZhbGlkLW5hbWUsCisgICAgbWlzc2luZy1kb2NzdHJpbmcsCisgICAgcHJvdGVjdGVkLWFjY2VzcywKKyAgICB0b28tZmV3LXB1YmxpYy1tZXRob2RzLAorICAgICMgaGFuZGxlZCBieSBibGFjaworICAgIGZvcm1hdAorCisKK1tSRVBPUlRTXQorCisjIFNldCB0aGUgb3V0cHV0IGZvcm1hdC4gQXZhaWxhYmxlIGZvcm1hdHMgYXJlIHRleHQsIHBhcnNlYWJsZSwgY29sb3JpemVkLCBtc3ZzCisjICh2aXN1YWwgc3R1ZGlvKSBhbmQgaHRtbC4gWW91IGNhbiBhbHNvIGdpdmUgYSByZXBvcnRlciBjbGFzcywgZWcKKyMgbXlwYWNrYWdlLm15bW9kdWxlLk15UmVwb3J0ZXJDbGFzcy4KK291dHB1dC1mb3JtYXQ9dGV4dAorCisjIFB1dCBtZXNzYWdlcyBpbiBhIHNlcGFyYXRlIGZpbGUgZm9yIGVhY2ggbW9kdWxlIC8gcGFja2FnZSBzcGVjaWZpZWQgb24gdGhlCisjIGNvbW1hbmQgbGluZSBpbnN0ZWFkIG9mIHByaW50aW5nIHRoZW0gb24gc3Rkb3V0LiBSZXBvcnRzIChpZiBhbnkpIHdpbGwgYmUKKyMgd3JpdHRlbiBpbiBhIGZpbGUgbmFtZSAicHlsaW50X2dsb2JhbC5bdHh0fGh0bWxdIi4KK2ZpbGVzLW91dHB1dD1ubworCisjIFRlbGxzIHdoZXRoZXIgdG8gZGlzcGxheSBhIGZ1bGwgcmVwb3J0IG9yIG9ubHkgdGhlIG1lc3NhZ2VzCityZXBvcnRzPW5vCisKKyMgUHl0aG9uIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIHJldHVybiBhIG5vdGUgbGVzcyB0aGFuIDEwICgxMCBpcyB0aGUgaGlnaGVzdAorIyBub3RlKS4gWW91IGhhdmUgYWNjZXNzIHRvIHRoZSB2YXJpYWJsZXMgZXJyb3JzIHdhcm5pbmcsIHN0YXRlbWVudCB3aGljaAorIyByZXNwZWN0aXZlbHkgY29udGFpbiB0aGUgbnVtYmVyIG9mIGVycm9ycyAvIHdhcm5pbmdzIG1lc3NhZ2VzIGFuZCB0aGUgdG90YWwKKyMgbnVtYmVyIG9mIHN0YXRlbWVudHMgYW5hbHl6ZWQuIFRoaXMgaXMgdXNlZCBieSB0aGUgZ2xvYmFsIGV2YWx1YXRpb24gcmVwb3J0CisjIChSUDAwMDQpLgorZXZhbHVhdGlvbj0xMC4wIC0gKChmbG9hdCg1ICogZXJyb3IgKyB3YXJuaW5nICsgcmVmYWN0b3IgKyBjb252ZW50aW9uKSAvIHN0YXRlbWVudCkgKiAxMCkKKworIyBUZW1wbGF0ZSB1c2VkIHRvIGRpc3BsYXkgbWVzc2FnZXMuIFRoaXMgaXMgYSBweXRob24gbmV3LXN0eWxlIGZvcm1hdCBzdHJpbmcKKyMgdXNlZCB0byBmb3JtYXQgdGhlIG1lc3NhZ2UgaW5mb3JtYXRpb24uIFNlZSBkb2MgZm9yIGFsbCBkZXRhaWxzCisjbXNnLXRlbXBsYXRlPQorCisKK1tMT0dHSU5HXQorCisjIExvZ2dpbmcgbW9kdWxlcyB0byBjaGVjayB0aGF0IHRoZSBzdHJpbmcgZm9ybWF0IGFyZ3VtZW50cyBhcmUgaW4gbG9nZ2luZworIyBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9ybWF0Citsb2dnaW5nLW1vZHVsZXM9bG9nZ2luZworCisKK1tNSVNDRUxMQU5FT1VTXQorCisjIExpc3Qgb2Ygbm90ZSB0YWdzIHRvIHRha2UgaW4gY29uc2lkZXJhdGlvbiwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCitub3Rlcz1GSVhNRSxYWFgsVE9ETworCisKK1tTSU1JTEFSSVRJRVNdCisKKyMgTWluaW11bSBsaW5lcyBudW1iZXIgb2YgYSBzaW1pbGFyaXR5LgorbWluLXNpbWlsYXJpdHktbGluZXM9NAorCisjIElnbm9yZSBjb21tZW50cyB3aGVuIGNvbXB1dGluZyBzaW1pbGFyaXRpZXMuCitpZ25vcmUtY29tbWVudHM9eWVzCisKKyMgSWdub3JlIGRvY3N0cmluZ3Mgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLgoraWdub3JlLWRvY3N0cmluZ3M9eWVzCisKKyMgSWdub3JlIGltcG9ydHMgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLgoraWdub3JlLWltcG9ydHM9bm8KKworCitbVkFSSUFCTEVTXQorCisjIFRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGNoZWNrIGZvciB1bnVzZWQgaW1wb3J0IGluIF9faW5pdF9fIGZpbGVzLgoraW5pdC1pbXBvcnQ9bm8KKworIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyB0aGUgbmFtZSBvZiBkdW1teSB2YXJpYWJsZXMgKGkuZS4gZXhwZWN0ZWRseQorIyBub3QgdXNlZCkuCitkdW1teS12YXJpYWJsZXMtcmd4PV8kfGR1bW15CisKKyMgTGlzdCBvZiBhZGRpdGlvbmFsIG5hbWVzIHN1cHBvc2VkIHRvIGJlIGRlZmluZWQgaW4gYnVpbHRpbnMuIFJlbWVtYmVyIHRoYXQKKyMgeW91IHNob3VsZCBhdm9pZCBkZWZpbmluZyBuZXcgYnVpbHRpbnMgd2hlbiBwb3NzaWJsZS4KK2FkZGl0aW9uYWwtYnVpbHRpbnM9CisKKyMgTGlzdCBvZiBzdHJpbmdzIHdoaWNoIGNhbiBpZGVudGlmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ5IG5hbWUuIEEgY2FsbGJhY2sKKyMgbmFtZSBtdXN0IHN0YXJ0IG9yIGVuZCB3aXRoIG9uZSBvZiB0aG9zZSBzdHJpbmdzLgorY2FsbGJhY2tzPWNiXyxfY2IKKworCitbRk9STUFUXQorCisjIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgb24gYSBzaW5nbGUgbGluZS4KK21heC1saW5lLWxlbmd0aD0xMDAKKworIyBSZWdleHAgZm9yIGEgbGluZSB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgbG9uZ2VyIHRoYW4gdGhlIGxpbWl0LgoraWdub3JlLWxvbmctbGluZXM9XlxzKigjICk/PD9odHRwcz86Ly9cUys+PyQKKworIyBBbGxvdyB0aGUgYm9keSBvZiBhbiBpZiB0byBiZSBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSB0ZXN0IGlmIHRoZXJlIGlzIG5vCisjIGVsc2UuCitzaW5nbGUtbGluZS1pZi1zdG10PW5vCisKKyMgTGlzdCBvZiBvcHRpb25hbCBjb25zdHJ1Y3RzIGZvciB3aGljaCB3aGl0ZXNwYWNlIGNoZWNraW5nIGlzIGRpc2FibGVkCituby1zcGFjZS1jaGVjaz10cmFpbGluZy1jb21tYSxkaWN0LXNlcGFyYXRvcgorCisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIGluIGEgbW9kdWxlCittYXgtbW9kdWxlLWxpbmVzPTIwMDAKKworIyBTdHJpbmcgdXNlZCBhcyBpbmRlbnRhdGlvbiB1bml0LiBUaGlzIGlzIHVzdWFsbHkgIiAgICAiICg0IHNwYWNlcykgb3IgIlx0IiAoMQorIyB0YWIpLgoraW5kZW50LXN0cmluZz0nICAgICcKKworIyBOdW1iZXIgb2Ygc3BhY2VzIG9mIGluZGVudCByZXF1aXJlZCBpbnNpZGUgYSBoYW5naW5nIG9yIGNvbnRpbnVlZCBsaW5lLgoraW5kZW50LWFmdGVyLXBhcmVuPTQKKworIyBFeHBlY3RlZCBmb3JtYXQgb2YgbGluZSBlbmRpbmcsIGUuZy4gZW1wdHkgKGFueSBsaW5lIGVuZGluZyksIExGIG9yIENSTEYuCitleHBlY3RlZC1saW5lLWVuZGluZy1mb3JtYXQ9CisKKworW0JBU0lDXQorCisjIEdvb2QgdmFyaWFibGUgbmFtZXMgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSBhY2NlcHRlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKK2dvb2QtbmFtZXM9aSxqLGssZXgsUnVuLF8KKworIyBCYWQgdmFyaWFibGUgbmFtZXMgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSByZWZ1c2VkLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQorYmFkLW5hbWVzPWZvbyxiYXIsYmF6LHRvdG8sdHV0dSx0YXRhCisKKyMgQ29sb24tZGVsaW1pdGVkIHNldHMgb2YgbmFtZXMgdGhhdCBkZXRlcm1pbmUgZWFjaCBvdGhlcidzIG5hbWluZyBzdHlsZSB3aGVuCisjIHRoZSBuYW1lIHJlZ2V4ZXMgYWxsb3cgc2V2ZXJhbCBzdHlsZXMuCituYW1lLWdyb3VwPQorCisjIEluY2x1ZGUgYSBoaW50IGZvciB0aGUgY29ycmVjdCBuYW1pbmcgZm9ybWF0IHdpdGggaW52YWxpZC1uYW1lCitpbmNsdWRlLW5hbWluZy1oaW50PW5vCisKKyMgUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGNvcnJlY3QgZnVuY3Rpb24gbmFtZXMKK2Z1bmN0aW9uLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgTmFtaW5nIGhpbnQgZm9yIGZ1bmN0aW9uIG5hbWVzCitmdW5jdGlvbi1uYW1lLWhpbnQ9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IHZhcmlhYmxlIG5hbWVzCit2YXJpYWJsZS1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIE5hbWluZyBoaW50IGZvciB2YXJpYWJsZSBuYW1lcwordmFyaWFibGUtbmFtZS1oaW50PVthLXpfXVthLXowLTlfXXsyLDMwfSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBjb25zdGFudCBuYW1lcworY29uc3Qtcmd4PSgoW0EtWl9dW0EtWjAtOV9dKil8KF9fLipfXykpJAorCisjIE5hbWluZyBoaW50IGZvciBjb25zdGFudCBuYW1lcworY29uc3QtbmFtZS1oaW50PSgoW0EtWl9dW0EtWjAtOV9dKil8KF9fLipfXykpJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IGF0dHJpYnV0ZSBuYW1lcworYXR0ci1yZ3g9W2Etel9dW2EtejAtOV9dezIsfSQKKworIyBOYW1pbmcgaGludCBmb3IgYXR0cmlidXRlIG5hbWVzCithdHRyLW5hbWUtaGludD1bYS16X11bYS16MC05X117Mix9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IGFyZ3VtZW50IG5hbWVzCithcmd1bWVudC1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIE5hbWluZyBoaW50IGZvciBhcmd1bWVudCBuYW1lcworYXJndW1lbnQtbmFtZS1oaW50PVthLXpfXVthLXowLTlfXXsyLDMwfSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBjbGFzcyBhdHRyaWJ1dGUgbmFtZXMKK2NsYXNzLWF0dHJpYnV0ZS1yZ3g9KFtBLVphLXpfXVtBLVphLXowLTlfXXsyLDMwfXwoX18uKl9fKSkkCisKKyMgTmFtaW5nIGhpbnQgZm9yIGNsYXNzIGF0dHJpYnV0ZSBuYW1lcworY2xhc3MtYXR0cmlidXRlLW5hbWUtaGludD0oW0EtWmEtel9dW0EtWmEtejAtOV9dezIsMzB9fChfXy4qX18pKSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBpbmxpbmUgaXRlcmF0aW9uIG5hbWVzCitpbmxpbmV2YXItcmd4PVtBLVphLXpfXVtBLVphLXowLTlfXSokCisKKyMgTmFtaW5nIGhpbnQgZm9yIGlubGluZSBpdGVyYXRpb24gbmFtZXMKK2lubGluZXZhci1uYW1lLWhpbnQ9W0EtWmEtel9dW0EtWmEtejAtOV9dKiQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgY29ycmVjdCBjbGFzcyBuYW1lcworY2xhc3Mtcmd4PVtBLVpfXVthLXpBLVowLTldKyQKKworIyBOYW1pbmcgaGludCBmb3IgY2xhc3MgbmFtZXMKK2NsYXNzLW5hbWUtaGludD1bQS1aX11bYS16QS1aMC05XSskCisKKyMgUmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGNvcnJlY3QgbW9kdWxlIG5hbWVzCittb2R1bGUtcmd4PSgoW2Etel9dW2EtejAtOV9dKil8KFtBLVpdW2EtekEtWjAtOV0rKSkkCisKKyMgTmFtaW5nIGhpbnQgZm9yIG1vZHVsZSBuYW1lcworbW9kdWxlLW5hbWUtaGludD0oKFthLXpfXVthLXowLTlfXSopfChbQS1aXVthLXpBLVowLTldKykpJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBjb3JyZWN0IG1ldGhvZCBuYW1lcworbWV0aG9kLXJneD1bYS16X11bYS16MC05X117Mix9JAorCisjIE5hbWluZyBoaW50IGZvciBtZXRob2QgbmFtZXMKK21ldGhvZC1uYW1lLWhpbnQ9W2Etel9dW2EtejAtOV9dezIsfSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggZnVuY3Rpb24gb3IgY2xhc3MgbmFtZXMgdGhhdCBkbworIyBub3QgcmVxdWlyZSBhIGRvY3N0cmluZy4KK25vLWRvY3N0cmluZy1yZ3g9X18uKl9fCisKKyMgTWluaW11bSBsaW5lIGxlbmd0aCBmb3IgZnVuY3Rpb25zL2NsYXNzZXMgdGhhdCByZXF1aXJlIGRvY3N0cmluZ3MsIHNob3J0ZXIKKyMgb25lcyBhcmUgZXhlbXB0LgorZG9jc3RyaW5nLW1pbi1sZW5ndGg9LTEKKworIyBMaXN0IG9mIGRlY29yYXRvcnMgdGhhdCBkZWZpbmUgcHJvcGVydGllcywgc3VjaCBhcyBhYmMuYWJzdHJhY3Rwcm9wZXJ0eS4KK3Byb3BlcnR5LWNsYXNzZXM9YWJjLmFic3RyYWN0cHJvcGVydHkKKworCitbVFlQRUNIRUNLXQorCisjIFRlbGxzIHdoZXRoZXIgbWlzc2luZyBtZW1iZXJzIGFjY2Vzc2VkIGluIG1peGluIGNsYXNzIHNob3VsZCBiZSBpZ25vcmVkLiBBCisjIG1peGluIGNsYXNzIGlzIGRldGVjdGVkIGlmIGl0cyBuYW1lIGVuZHMgd2l0aCAibWl4aW4iIChjYXNlIGluc2Vuc2l0aXZlKS4KK2lnbm9yZS1taXhpbi1tZW1iZXJzPXllcworCisjIExpc3Qgb2YgbW9kdWxlIG5hbWVzIGZvciB3aGljaCBtZW1iZXIgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIGNoZWNrZWQKKyMgKHVzZWZ1bCBmb3IgbW9kdWxlcy9wcm9qZWN0cyB3aGVyZSBuYW1lc3BhY2VzIGFyZSBtYW5pcHVsYXRlZCBkdXJpbmcgcnVudGltZQorIyBhbmQgdGh1cyBleGlzdGluZyBtZW1iZXIgYXR0cmlidXRlcyBjYW5ub3QgYmUgZGVkdWNlZCBieSBzdGF0aWMgYW5hbHlzaXMKK2lnbm9yZWQtbW9kdWxlcz0KKworIyBMaXN0IG9mIGNsYXNzZXMgbmFtZXMgZm9yIHdoaWNoIG1lbWJlciBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgY2hlY2tlZAorIyAodXNlZnVsIGZvciBjbGFzc2VzIHdpdGggYXR0cmlidXRlcyBkeW5hbWljYWxseSBzZXQpLgoraWdub3JlZC1jbGFzc2VzPVNRTE9iamVjdCwgb3B0cGFyc2UuVmFsdWVzLCB0aHJlYWQuX2xvY2FsLCBfdGhyZWFkLl9sb2NhbAorCisjIExpc3Qgb2YgbWVtYmVycyB3aGljaCBhcmUgc2V0IGR5bmFtaWNhbGx5IGFuZCBtaXNzZWQgYnkgcHlsaW50IGluZmVyZW5jZQorIyBzeXN0ZW0sIGFuZCBzbyBzaG91bGRuJ3QgdHJpZ2dlciBFMTEwMSB3aGVuIGFjY2Vzc2VkLiBQeXRob24gcmVndWxhcgorIyBleHByZXNzaW9ucyBhcmUgYWNjZXB0ZWQuCitnZW5lcmF0ZWQtbWVtYmVycz1SRVFVRVNULGFjbF91c2VycyxhcV9wYXJlbnQKKworIyBMaXN0IG9mIGRlY29yYXRvcnMgdGhhdCBjcmVhdGUgY29udGV4dCBtYW5hZ2VycyBmcm9tIGZ1bmN0aW9ucywgc3VjaCBhcworIyBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyLgorY29udGV4dG1hbmFnZXItZGVjb3JhdG9ycz1jb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisKKworW1NQRUxMSU5HXQorCisjIFNwZWxsaW5nIGRpY3Rpb25hcnkgbmFtZS4gQXZhaWxhYmxlIGRpY3Rpb25hcmllczogbm9uZS4gVG8gbWFrZSBpdCB3b3JraW5nCisjIGluc3RhbGwgcHl0aG9uLWVuY2hhbnQgcGFja2FnZS4KK3NwZWxsaW5nLWRpY3Q9CisKKyMgTGlzdCBvZiBjb21tYSBzZXBhcmF0ZWQgd29yZHMgdGhhdCBzaG91bGQgbm90IGJlIGNoZWNrZWQuCitzcGVsbGluZy1pZ25vcmUtd29yZHM9CisKKyMgQSBwYXRoIHRvIGEgZmlsZSB0aGF0IGNvbnRhaW5zIHByaXZhdGUgZGljdGlvbmFyeTsgb25lIHdvcmQgcGVyIGxpbmUuCitzcGVsbGluZy1wcml2YXRlLWRpY3QtZmlsZT0KKworIyBUZWxscyB3aGV0aGVyIHRvIHN0b3JlIHVua25vd24gd29yZHMgdG8gaW5kaWNhdGVkIHByaXZhdGUgZGljdGlvbmFyeSBpbgorIyAtLXNwZWxsaW5nLXByaXZhdGUtZGljdC1maWxlIG9wdGlvbiBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBtZXNzYWdlLgorc3BlbGxpbmctc3RvcmUtdW5rbm93bi13b3Jkcz1ubworCisKK1tERVNJR05dCisKKyMgTWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBmdW5jdGlvbiAvIG1ldGhvZAorbWF4LWFyZ3M9MTAKKworIyBBcmd1bWVudCBuYW1lcyB0aGF0IG1hdGNoIHRoaXMgZXhwcmVzc2lvbiB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHQgdG8gbmFtZQorIyB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZQoraWdub3JlZC1hcmd1bWVudC1uYW1lcz1fLioKKworIyBNYXhpbXVtIG51bWJlciBvZiBsb2NhbHMgZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1sb2NhbHM9MjUKKworIyBNYXhpbXVtIG51bWJlciBvZiByZXR1cm4gLyB5aWVsZCBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LXJldHVybnM9MTEKKworIyBNYXhpbXVtIG51bWJlciBvZiBicmFuY2ggZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1icmFuY2hlcz0yNgorCisjIE1heGltdW0gbnVtYmVyIG9mIHN0YXRlbWVudHMgaW4gZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LXN0YXRlbWVudHM9MTAwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgcGFyZW50cyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAxKS4KK21heC1wYXJlbnRzPTcKKworIyBNYXhpbXVtIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBhIGNsYXNzIChzZWUgUjA5MDIpLgorbWF4LWF0dHJpYnV0ZXM9MTEKKworIyBNaW5pbXVtIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAzKS4KK21pbi1wdWJsaWMtbWV0aG9kcz0yCisKKyMgTWF4aW11bSBudW1iZXIgb2YgcHVibGljIG1ldGhvZHMgZm9yIGEgY2xhc3MgKHNlZSBSMDkwNCkuCittYXgtcHVibGljLW1ldGhvZHM9MjUKKworCitbQ0xBU1NFU10KKworIyBMaXN0IG9mIG1ldGhvZCBuYW1lcyB1c2VkIHRvIGRlY2xhcmUgKGkuZS4gYXNzaWduKSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgorZGVmaW5pbmctYXR0ci1tZXRob2RzPV9faW5pdF9fLF9fbmV3X18sc2V0VXAsX19wb3N0X2luaXRfXworCisjIExpc3Qgb2YgdmFsaWQgbmFtZXMgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCBpbiBhIGNsYXNzIG1ldGhvZC4KK3ZhbGlkLWNsYXNzbWV0aG9kLWZpcnN0LWFyZz1jbHMKKworIyBMaXN0IG9mIHZhbGlkIG5hbWVzIGZvciB0aGUgZmlyc3QgYXJndW1lbnQgaW4gYSBtZXRhY2xhc3MgY2xhc3MgbWV0aG9kLgordmFsaWQtbWV0YWNsYXNzLWNsYXNzbWV0aG9kLWZpcnN0LWFyZz1tY3MKKworIyBMaXN0IG9mIG1lbWJlciBuYW1lcywgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHByb3RlY3RlZCBhY2Nlc3MKKyMgd2FybmluZy4KK2V4Y2x1ZGUtcHJvdGVjdGVkPV9hc2RpY3QsX2ZpZWxkcyxfcmVwbGFjZSxfc291cmNlLF9tYWtlCisKKworW0lNUE9SVFNdCisKKyMgRGVwcmVjYXRlZCBtb2R1bGVzIHdoaWNoIHNob3VsZCBub3QgYmUgdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKK2RlcHJlY2F0ZWQtbW9kdWxlcz1yZWdzdWIsVEVSTUlPUyxCYXN0aW9uLHJleGVjCisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgZXZlcnkgKGkuZS4gaW50ZXJuYWwgYW5kIGV4dGVybmFsKSBkZXBlbmRlbmNpZXMgaW4gdGhlCisjIGdpdmVuIGZpbGUgKHJlcG9ydCBSUDA0MDIgbXVzdCBub3QgYmUgZGlzYWJsZWQpCitpbXBvcnQtZ3JhcGg9CisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGluIHRoZSBnaXZlbiBmaWxlIChyZXBvcnQgUlAwNDAyIG11c3QKKyMgbm90IGJlIGRpc2FibGVkKQorZXh0LWltcG9ydC1ncmFwaD0KKworIyBDcmVhdGUgYSBncmFwaCBvZiBpbnRlcm5hbCBkZXBlbmRlbmNpZXMgaW4gdGhlIGdpdmVuIGZpbGUgKHJlcG9ydCBSUDA0MDIgbXVzdAorIyBub3QgYmUgZGlzYWJsZWQpCitpbnQtaW1wb3J0LWdyYXBoPQorCisKK1tFWENFUFRJT05TXQorCisjIEV4Y2VwdGlvbnMgdGhhdCB3aWxsIGVtaXQgYSB3YXJuaW5nIHdoZW4gYmVpbmcgY2F1Z2h0LiBEZWZhdWx0cyB0bworIyAiRXhjZXB0aW9uIgorb3ZlcmdlbmVyYWwtZXhjZXB0aW9ucz1FeGNlcHRpb24KKworCitbcHlsaW50LkRFUFJFQ0FURURfQlVJTFRJTlNdCisKKyMgTGlzdCBvZiBidWlsdGlucyBmdW5jdGlvbiBuYW1lcyB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKK2JhZC1mdW5jdGlvbnM9bWFwLGlucHV0CmRpZmYgLS1naXQgYS9yZXF1aXJlbWVudHNfdGVzdC50eHQgYi9yZXF1aXJlbWVudHNfdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2YWVlZAotLS0gL2Rldi9udWxsCisrKyBiL3JlcXVpcmVtZW50c190ZXN0LnR4dApAQCAtMCwwICsxLDEzIEBACistciByZXF1aXJlbWVudHNfdGVzdF9wcmVfY29tbWl0LnR4dAorLXIgcmVxdWlyZW1lbnRzX3Rlc3RfbWluLnR4dAorY292ZXJhbGxzfj0zLjEKK2NvdmVyYWdlfj01LjUKK3ByZS1jb21taXR+PTIuMTM7cHl0aG9uX2Z1bGxfdmVyc2lvbj49IjMuNi4yIgordGJ1bXB+PTYuMy4yCitweWVuY2hhbnR+PTMuMgorcHl0ZXN0LWNvdn49Mi4xMgorcHl0ZXN0LXByb2ZpbGluZ349MS43CitweXRlc3QteGRpc3R+PTIuMworIyBUeXBlIHBhY2thZ2VzIGZvciBteXB5Cit0eXBlcy1wa2dfcmVzb3VyY2VzPT0wLjEuMwordHlwZXMtdG9tbD09MC4xLjIKZGlmZiAtLWdpdCBhL3JlcXVpcmVtZW50c190ZXN0X21pbi50eHQgYi9yZXF1aXJlbWVudHNfdGVzdF9taW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGUzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9yZXF1aXJlbWVudHNfdGVzdF9taW4udHh0CkBAIC0wLDAgKzEsNCBAQAorLWUgLgorYXN0cm9pZD09Mi42LjAtZGV2MCAgIyBQaW5uZWQgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIGZvciB0ZXN0cworcHl0ZXN0fj02LjIKK3B5dGVzdC1iZW5jaG1hcmt+PTMuNApkaWZmIC0tZ2l0IGEvcmVxdWlyZW1lbnRzX3Rlc3RfcHJlX2NvbW1pdC50eHQgYi9yZXF1aXJlbWVudHNfdGVzdF9wcmVfY29tbWl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzRlODNmCi0tLSAvZGV2L251bGwKKysrIGIvcmVxdWlyZW1lbnRzX3Rlc3RfcHJlX2NvbW1pdC50eHQKQEAgLTAsMCArMSw2IEBACisjIEV2ZXJ5dGhpbmcgaW4gdGhpcyBmaWxlIHNob3VsZCByZWZsZWN0IHRoZSBwcmUtY29tbWl0IGNvbmZpZ3VyYXRpb24KKyMgaW4gLnByZS1jb21taXQtY29uZmlnLnlhbWwKK2JsYWNrPT0yMS42YjA7cHl0aG9uX2Z1bGxfdmVyc2lvbj49IjMuNi4yIgorZmxha2U4PT0zLjkuMgoraXNvcnQ9PTUuOS4wCitteXB5PT0wLjkwMgpkaWZmIC0tZ2l0IGEvc2NyaXB0L19faW5pdF9fLnB5IGIvc2NyaXB0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHQvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3NjcmlwdC9idW1wX2NoYW5nZWxvZy5weSBiL3NjcmlwdC9idW1wX2NoYW5nZWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTE2NTMwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0L2J1bXBfY2hhbmdlbG9nLnB5CkBAIC0wLDAgKzEsODAgQEAKKyMgT1JJR0lOQUwgaGVyZTpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUHlDUUEvYXN0cm9pZC9tYXN0ZXIvc2NyaXB0L2J1bXBfY2hhbmdlbG9nLnB5CisjIERPIE5PVCBNT0RJRlkgRElSRUNUTFkKKworIiIiCitUaGlzIHNjcmlwdCBwZXJtaXRzIHRvIHVwZ3JhZGUgdGhlIGNoYW5nZWxvZyBpbiBhc3Ryb2lkIG9yIHB5bGludCB3aGVuIHJlbGVhc2luZyBhIHZlcnNpb24uCisiIiIKK2ltcG9ydCBhcmdwYXJzZQorZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitERUZBVUxUX0NIQU5HRUxPR19QQVRIID0gUGF0aCgiQ2hhbmdlTG9nIikKK2VyciA9ICJpbiB0aGUgY2hhbmdlbG9nLCBmaXggdGhhdCBmaXJzdCEiCitUQkFfRVJST1JfTVNHID0gIk1vcmUgdGhhbiBvbmUgcmVsZWFzZSBkYXRlICdUQkEnICVzIiAlIGVycgorTkVXX1ZFUlNJT05fRVJST1JfTVNHID0gIlRoZSB0ZXh0IGZvciB0aGlzIHZlcnNpb24gJ3t2ZXJzaW9ufScgZGlkIG5vdCBleGlzdHMgJXMiICUgZXJyCitORVhUX1ZFUlNJT05fRVJST1JfTVNHID0gKAorICAgICJUaGUgdGV4dCBmb3IgdGhlIG5leHQgdmVyc2lvbiAne3ZlcnNpb259JyBhbHJlYWR5IGV4aXN0cyAlcyIgJSBlcnIKKykKKworVE9EQVkgPSBkYXRldGltZS5ub3coKQorV0hBVFNfTkVXX1RFWFQgPSAiV2hhdCdzIE5ldyBpbiBhc3Ryb2lkIgorRlVMTF9XSEFUU19ORVdfVEVYVCA9IFdIQVRTX05FV19URVhUICsgIiB7dmVyc2lvbn0/IgorUkVMRUFTRV9EQVRFX1RFWFQgPSAiUmVsZWFzZSBEYXRlOiBUQkEiCitORVdfUkVMRUFTRV9EQVRFX01FU1NBR0UgPSAiUmVsZWFzZSBEYXRlOiB7fSIuZm9ybWF0KFRPREFZLnN0cmZ0aW1lKCIlWS0lbS0lZCIpKQorCisKK2RlZiBtYWluKCkgLT4gTm9uZToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihfX2RvY19fKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoInZlcnNpb24iLCBoZWxwPSJUaGUgdmVyc2lvbiB3ZSB3YW50IHRvIHJlbGVhc2UiKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgaWYgImRldiIgbm90IGluIGFyZ3MudmVyc2lvbjoKKyAgICAgICAgdmVyc2lvbiA9IGFyZ3MudmVyc2lvbgorICAgICAgICBuZXh0X3ZlcnNpb24gPSBnZXRfbmV4dF92ZXJzaW9uKHZlcnNpb24pCisgICAgICAgIHJ1bih2ZXJzaW9uLCBuZXh0X3ZlcnNpb24pCisKKworZGVmIGdldF9uZXh0X3ZlcnNpb24odmVyc2lvbjogc3RyKSAtPiBzdHI6CisgICAgbmV3X3ZlcnNpb24gPSB2ZXJzaW9uLnNwbGl0KCIuIikKKyAgICBwYXRjaCA9IG5ld192ZXJzaW9uWzJdCisgICAgcmVtaW5kZXIgPSBOb25lCisgICAgaWYgIi0iIGluIHBhdGNoOgorICAgICAgICBwYXRjaCwgcmVtaW5kZXIgPSBwYXRjaC5zcGxpdCgiLSIpCisgICAgcGF0Y2ggPSBzdHIoaW50KHBhdGNoKSArIDEpCisgICAgbmV3X3ZlcnNpb25bMl0gPSBwYXRjaCBpZiByZW1pbmRlciBpcyBOb25lIGVsc2UgZiJ7cGF0Y2h9LXtyZW1pbmRlcn0iCisgICAgcmV0dXJuICIuIi5qb2luKG5ld192ZXJzaW9uKQorCisKK2RlZiBydW4odmVyc2lvbjogc3RyLCBuZXh0X3ZlcnNpb246IHN0cikgLT4gTm9uZToKKyAgICB3aXRoIG9wZW4oREVGQVVMVF9DSEFOR0VMT0dfUEFUSCkgYXMgZjoKKyAgICAgICAgY29udGVudCA9IGYucmVhZCgpCisgICAgY29udGVudCA9IHRyYW5zZm9ybV9jb250ZW50KGNvbnRlbnQsIHZlcnNpb24sIG5leHRfdmVyc2lvbikKKyAgICB3aXRoIG9wZW4oREVGQVVMVF9DSEFOR0VMT0dfUEFUSCwgInciKSBhcyBmOgorICAgICAgICBmLndyaXRlKGNvbnRlbnQpCisKKworZGVmIHRyYW5zZm9ybV9jb250ZW50KGNvbnRlbnQ6IHN0ciwgdmVyc2lvbjogc3RyLCBuZXh0X3ZlcnNpb246IHN0cikgLT4gc3RyOgorICAgIHduX25ld192ZXJzaW9uID0gRlVMTF9XSEFUU19ORVdfVEVYVC5mb3JtYXQodmVyc2lvbj12ZXJzaW9uKQorICAgIHduX25leHRfdmVyc2lvbiA9IEZVTExfV0hBVFNfTkVXX1RFWFQuZm9ybWF0KHZlcnNpb249bmV4dF92ZXJzaW9uKQorICAgICMgVGhlcmUgaXMgb25seSBvbmUgZmllbGQgd2hlcmUgdGhlIHJlbGVhc2UgZGF0ZSBpcyBUQkEKKyAgICBhc3NlcnQgY29udGVudC5jb3VudChSRUxFQVNFX0RBVEVfVEVYVCkgPT0gMSwgVEJBX0VSUk9SX01TRworICAgICMgVGhlcmUgaXMgYWxyZWFkeSBhIHJlbGVhc2Ugbm90ZSBmb3IgdGhlIHZlcnNpb24gd2Ugd2FudCB0byByZWxlYXNlCisgICAgYXNzZXJ0IGNvbnRlbnQuY291bnQod25fbmV3X3ZlcnNpb24pID09IDEsIE5FV19WRVJTSU9OX0VSUk9SX01TRy5mb3JtYXQoCisgICAgICAgIHZlcnNpb249dmVyc2lvbgorICAgICkKKyAgICAjIFRoZXJlIGlzIG5vIHJlbGVhc2Ugbm90ZXMgZm9yIHRoZSBuZXh0IHZlcnNpb24KKyAgICBhc3NlcnQgY29udGVudC5jb3VudCh3bl9uZXh0X3ZlcnNpb24pID09IDAsIE5FWFRfVkVSU0lPTl9FUlJPUl9NU0cuZm9ybWF0KAorICAgICAgICB2ZXJzaW9uPW5leHRfdmVyc2lvbgorICAgICkKKyAgICBpbmRleCA9IGNvbnRlbnQuZmluZChXSEFUU19ORVdfVEVYVCkKKyAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKFJFTEVBU0VfREFURV9URVhULCBORVdfUkVMRUFTRV9EQVRFX01FU1NBR0UpCisgICAgZW5kX2NvbnRlbnQgPSBjb250ZW50W2luZGV4Ol0KKyAgICBjb250ZW50ID0gY29udGVudFs6aW5kZXhdCisgICAgY29udGVudCArPSB3bl9uZXh0X3ZlcnNpb24gKyAiXG4iCisgICAgY29udGVudCArPSAiPSIgKiBsZW4od25fbmV4dF92ZXJzaW9uKSArICJcbiIKKyAgICBjb250ZW50ICs9IFJFTEVBU0VfREFURV9URVhUICsgIlxuIiAqIDQKKyAgICBjb250ZW50ICs9IGVuZF9jb250ZW50CisgICAgcmV0dXJuIGNvbnRlbnQKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvc2NyaXB0L2ZpeF9kb2N1bWVudGF0aW9uLnB5IGIvc2NyaXB0L2ZpeF9kb2N1bWVudGF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjIyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHQvZml4X2RvY3VtZW50YXRpb24ucHkKQEAgLTAsMCArMSwxMDEgQEAKKyIiIlNtYWxsIHNjcmlwdCB0byBmaXggdmFyaW91cyBpc3N1ZXMgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbi4gVXNlZCBieSBwcmUtY29tbWl0LiIiIgoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbCwgVW5pb24KKworSU5WQUxJRF9DT0RFX0JMT0NLX1BBVFRFUk4gPSAoCisgICAgciIoPzw9XHNgKShbXHdcLVwuXChcKVw9XStcc3swLDF9W1x3XC1cLlwoXClcPV0qKSg/PWBbLFwuXXswLDF9XHN8JCkiCispCisKK0RFRkFVTFRfQ0hBTkdFTE9HID0gIkNoYW5nZUxvZyIKK0RFRkFVTFRfU1VCVElUTEVfUFJFRklYID0gIldoYXQncyBOZXcgaW4iCisKKworZGVmIGZpeF9pbmxpbmVfY29kZV9ibG9ja3MoZmlsZV9jb250ZW50OiBzdHIpIC0+IHN0cjoKKyAgICAiIiJVc2UgZG91YmxlIHF1b3RlcyBmb3IgY29kZSBibG9ja3MuIFJTVCBzdHlsZS4KKworICAgIEV4YW1wbGU6CisgICAgICAgIGBoZWxsby13b3JsZGAgLT4gYGBoZWxsby13b3JsZGBgCisgICAgIiIiCisgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoSU5WQUxJRF9DT0RFX0JMT0NLX1BBVFRFUk4pCisgICAgcmV0dXJuIHBhdHRlcm4uc3ViKHIiYFxnPDA+YCIsIGZpbGVfY29udGVudCkKKworCitkZWYgY2hhbmdlbG9nX2luc2VydF9lbXB0eV9saW5lcyhmaWxlX2NvbnRlbnQ6IHN0ciwgc3VidGl0bGVfdGV4dDogc3RyKSAtPiBzdHI6CisgICAgIiIiSW5zZXJ0IHVwIHRvIHR3byBlbXB0eSBsaW5lcyBiZWZvcmUgYFdoYXQncyBOZXdgIGVudHJ5IGluIENoYW5nZUxvZyIiIgorICAgIGxpbmVzID0gZmlsZV9jb250ZW50LnNwbGl0KCJcbiIpCisgICAgc3VidGl0bGVfY291bnQgPSAwCisgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKHN1YnRpdGxlX3RleHQpOgorICAgICAgICAgICAgc3VidGl0bGVfY291bnQgKz0gMQorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIHN1YnRpdGxlX2NvdW50ID09IDEKKyAgICAgICAgICAgICAgICBvciBpIDwgMgorICAgICAgICAgICAgICAgIG9yIGxpbmVzW2kgLSAxXSA9PSAiIgorICAgICAgICAgICAgICAgIGFuZCBsaW5lc1tpIC0gMl0gPT0gIiIKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpbmVzLmluc2VydChpLCAiIikKKyAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQorCisKK2NsYXNzIEN1c3RvbUhlbHBGb3JtYXR0ZXIoYXJncGFyc2UuSGVscEZvcm1hdHRlcik6CisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICBzZWxmLAorICAgICAgICBwcm9nOiBzdHIsCisgICAgICAgIGluZGVudF9pbmNyZW1lbnQ6IGludCA9IDIsCisgICAgICAgIG1heF9oZWxwX3Bvc2l0aW9uOiBpbnQgPSAyNCwKKyAgICAgICAgd2lkdGg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAorICAgICkgLT4gTm9uZToKKyAgICAgICAgbWF4X2hlbHBfcG9zaXRpb24gPSA0MAorICAgICAgICBzdXBlcigpLl9faW5pdF9fKAorICAgICAgICAgICAgcHJvZywKKyAgICAgICAgICAgIGluZGVudF9pbmNyZW1lbnQ9aW5kZW50X2luY3JlbWVudCwKKyAgICAgICAgICAgIG1heF9oZWxwX3Bvc2l0aW9uPW1heF9oZWxwX3Bvc2l0aW9uLAorICAgICAgICAgICAgd2lkdGg9d2lkdGgsCisgICAgICAgICkKKworCitkZWYgbWFpbihhcmd2OiBVbmlvbltMaXN0W3N0cl0sIE5vbmVdID0gTm9uZSkgLT4gaW50OgorICAgIGFyZ3YgPSBhcmd2IG9yIHN5cy5hcmd2WzE6XQorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGZvcm1hdHRlcl9jbGFzcz1DdXN0b21IZWxwRm9ybWF0dGVyKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICItLWNoYW5nZWxvZyIsCisgICAgICAgIG1ldGF2YXI9ImZpbGUiLAorICAgICAgICBkZWZhdWx0PURFRkFVTFRfQ0hBTkdFTE9HLAorICAgICAgICBoZWxwPSJDaGFuZ2Vsb2cgZmlsZW5hbWUgKGRlZmF1bHQ6ICclKGRlZmF1bHQpcycpIiwKKyAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIi0tc3VidGl0bGUtcHJlZml4IiwKKyAgICAgICAgbWV0YXZhcj0icHJlZml4IiwKKyAgICAgICAgZGVmYXVsdD1ERUZBVUxUX1NVQlRJVExFX1BSRUZJWCwKKyAgICAgICAgaGVscD0iU3VidGl0bGUgcHJlZml4IChkZWZhdWx0OiAnJShkZWZhdWx0KXMnKSIsCisgICAgKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICJmaWxlbmFtZXMiLAorICAgICAgICBuYXJncz0iKiIsCisgICAgICAgIG1ldGF2YXI9IkZJTEVTIiwKKyAgICAgICAgaGVscD0iRmlsZSBuYW1lcyB0byBtb2RpZnkiLAorICAgICkKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKworICAgIHJldHVybl92YWx1ZTogaW50ID0gMAorICAgIGZvciBmaWxlX25hbWUgaW4gYXJncy5maWxlbmFtZXM6CisgICAgICAgIHdpdGggb3BlbihmaWxlX25hbWUpIGFzIGZwOgorICAgICAgICAgICAgb3JpZ25hbF9jb250ZW50ID0gZnAucmVhZCgpCisgICAgICAgIGNvbnRlbnQgPSBvcmlnbmFsX2NvbnRlbnQKKyAgICAgICAgIyBNb2RpZnkgZmlsZXMKKyAgICAgICAgY29udGVudCA9IGZpeF9pbmxpbmVfY29kZV9ibG9ja3MoY29udGVudCkKKyAgICAgICAgaWYgZmlsZV9uYW1lID09IGFyZ3MuY2hhbmdlbG9nOgorICAgICAgICAgICAgY29udGVudCA9IGNoYW5nZWxvZ19pbnNlcnRfZW1wdHlfbGluZXMoY29udGVudCwgYXJncy5zdWJ0aXRsZV9wcmVmaXgpCisgICAgICAgICMgSWYgbW9kaWZpZWQsIHdyaXRlIGNoYW5nZXMgYW5kIGV2ZW50dWFsbHkgcmV0dXJuIDEKKyAgICAgICAgaWYgb3JpZ25hbF9jb250ZW50ICE9IGNvbnRlbnQ6CisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZV9uYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKGNvbnRlbnQpCisgICAgICAgICAgICByZXR1cm5fdmFsdWUgfD0gMQorICAgIHJldHVybiByZXR1cm5fdmFsdWUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NldHVwLmNmZyBiL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZlMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMTEyIEBACitbbWV0YWRhdGFdCituYW1lID0gcHlsaW50Cit2ZXJzaW9uID0gYXR0cjogcHlsaW50Ll9fcGtnaW5mb19fLl9fdmVyc2lvbl9fCitkZXNjcmlwdGlvbiA9IHB5dGhvbiBjb2RlIHN0YXRpYyBjaGVja2VyCitsb25nX2Rlc2NyaXB0aW9uID0gZmlsZTogUkVBRE1FLnJzdAorbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUgPSB0ZXh0L3gtcnN0Cit1cmwgPSBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50CithdXRob3IgPSBQeXRob24gQ29kZSBRdWFsaXR5IEF1dGhvcml0eQorYXV0aG9yX2VtYWlsID0gY29kZS1xdWFsaXR5QHB5dGhvbi5vcmcKK2xpY2Vuc2UgPSBHUEwtMi4wLW9yLWxhdGVyCitsaWNlbnNlX2ZpbGVzID0KKyAgICBMSUNFTlNFCisgICAgQ09OVFJJQlVUT1JTLnR4dAorY2xhc3NpZmllcnMgPQorICAgIERldmVsb3BtZW50IFN0YXR1cyA6OiA2IC0gTWF0dXJlCisgICAgRW52aXJvbm1lbnQgOjogQ29uc29sZQorICAgIEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKKyAgICBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MiAoR1BMdjIpCisgICAgT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudAorICAgIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbgorICAgIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCisgICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMgOjogT25seQorICAgIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjYKKyAgICBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy43CisgICAgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuOAorICAgIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjkKKyAgICBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogSW1wbGVtZW50YXRpb24gOjogQ1B5dGhvbgorICAgIFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiBJbXBsZW1lbnRhdGlvbiA6OiBQeVB5CisgICAgVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogRGVidWdnZXJzCisgICAgVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogUXVhbGl0eSBBc3N1cmFuY2UKKyAgICBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBUZXN0aW5nCitrZXl3b3JkcyA9IHN0YXRpYyBjb2RlIGFuYWx5c2lzIGxpbnRlciBweXRob24gbGludAorcHJvamVjdF91cmxzID0KKyAgICBXaGF0J3MgTmV3ID0gaHR0cHM6Ly9weWxpbnQucHljcWEub3JnL2VuL2xhdGVzdC93aGF0c25ldy8KKyAgICBCdWcgdHJhY2tlciA9IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzCisgICAgRGlzY29yZCBzZXJ2ZXIgPSBodHRwczovL2Rpc2NvcmQuZ2cvRWd5NlA4QU1CNQorICAgIFVzZXIgbWFudWFsID0gaHR0cDovL3B5bGludC5weWNxYS5vcmcvZW4vbGF0ZXN0LworICAgIENvbnRyaWJ1dGluZyA9IGh0dHA6Ly9weWxpbnQucHljcWEub3JnL2VuL2xhdGVzdC9kZXZlbG9wbWVudF9ndWlkZS9jb250cmlidXRlLmh0bWwKKyAgICBUZWNobmljYWwgcmVmZXJlbmNlcyA9IGh0dHA6Ly9weWxpbnQucHljcWEub3JnL2VuL2xhdGVzdC90ZWNobmljYWxfcmVmZXJlbmNlL2luZGV4Lmh0bWwKKworW29wdGlvbnNdCitwYWNrYWdlcyA9IGZpbmQ6CitpbnN0YWxsX3JlcXVpcmVzID0KKyAgICBhc3Ryb2lkPj0yLjYuMC1kZXYwLDwyLjcgIyAoWW91IHNob3VsZCBhbHNvIHVwZ3JhZGUgcmVxdWlyZW1lbnRzX3Rlc3RfbWluLnR4dCkKKyAgICBpc29ydD49NC4yLjUsPDYKKyAgICBtY2NhYmU+PTAuNiw8MC43CisgICAgdG9tbD49MC43LjEKKyAgICBjb2xvcmFtYTtzeXNfcGxhdGZvcm09PSJ3aW4zMiIKK3B5dGhvbl9yZXF1aXJlcyA9IH49My42CisKK1tvcHRpb25zLnBhY2thZ2VzLmZpbmRdCitpbmNsdWRlID0KKyAgICBweWxpbnQqCisKK1tvcHRpb25zLmVudHJ5X3BvaW50c10KK2NvbnNvbGVfc2NyaXB0cyA9CisgICAgcHlsaW50ID0gcHlsaW50OnJ1bl9weWxpbnQKKyAgICBlcHlsaW50ID0gcHlsaW50OnJ1bl9lcHlsaW50CisgICAgcHlyZXZlcnNlID0gcHlsaW50OnJ1bl9weXJldmVyc2UKKyAgICBzeW1pbGFyID0gcHlsaW50OnJ1bl9zeW1pbGFyCisKK1thbGlhc2VzXQordGVzdCA9IHB5dGVzdAorCitbdG9vbDpweXRlc3RdCit0ZXN0cGF0aHMgPSB0ZXN0cworcHl0aG9uX2ZpbGVzID0gKnRlc3RfKi5weQorYWRkb3B0cyA9IC1tICJub3QgYWNjZXB0YW5jZSIKK21hcmtlcnMgPQorICAgIGFjY2VwdGFuY2U6CisgICAgYmVuY2htYXJrOiBCYXNlbGluZSBvZiBweWxpbnQgcGVyZm9ybWFuY2UsIGlmIHRoaXMgcmVncmVzcyBzb21ldGhpbmcgc2VyaW91cyBoYXBwZW5lZAorCitbaXNvcnRdCittdWx0aV9saW5lX291dHB1dCA9IDMKK2xpbmVfbGVuZ3RoID0gODgKK2tub3duX3RoaXJkX3BhcnR5ID0gYXN0cm9pZCwgc3BoaW54LCBpc29ydCwgcHl0ZXN0LCBtY2NhYmUsIHNpeCwgdG9tbAoraW5jbHVkZV90cmFpbGluZ19jb21tYSA9IFRydWUKK3NraXBfZ2xvYiA9IHRlc3RzL2Z1bmN0aW9uYWwvKiosdGVzdHMvaW5wdXQvKiosdGVzdHMvZXh0ZW5zaW9ucy9kYXRhLyoqLHRlc3RzL3JlZ3J0ZXN0X2RhdGEvKiosdGVzdHMvZGF0YS8qKixhc3Ryb2lkLyoqLHZlbnYvKioKK3NyY19wYXRocyA9IHB5bGludAorCitbbXlweV0KK3NjcmlwdHNfYXJlX21vZHVsZXMgPSBUcnVlCisKK1tteXB5LWFzdHJvaWQuKl0KK2lnbm9yZV9taXNzaW5nX2ltcG9ydHMgPSBUcnVlCisKK1tteXB5LWNvdmVyYWdlXQoraWdub3JlX21pc3NpbmdfaW1wb3J0cyA9IFRydWUKKworW215cHktZW5jaGFudC4qXQoraWdub3JlX21pc3NpbmdfaW1wb3J0cyA9IFRydWUKKworW215cHktaXNvcnQuKl0KK2lnbm9yZV9taXNzaW5nX2ltcG9ydHMgPSBUcnVlCisKK1tteXB5LW1jY2FiZV0KK2lnbm9yZV9taXNzaW5nX2ltcG9ydHMgPSBUcnVlCisKK1tteXB5LXB5dGVzdF0KK2lnbm9yZV9taXNzaW5nX2ltcG9ydHMgPSBUcnVlCisKK1tteXB5LV9weXRlc3QuKl0KK2lnbm9yZV9taXNzaW5nX2ltcG9ydHMgPSBUcnVlCisKK1tteXB5LXNldHVwdG9vbHNdCitpZ25vcmVfbWlzc2luZ19pbXBvcnRzID0gVHJ1ZQorCitbbXlweS1fc3RyaW5nXQoraWdub3JlX21pc3NpbmdfaW1wb3J0cyA9IFRydWUKKworW215cHktdG9tbC5kZWNvZGVyXQoraWdub3JlX21pc3NpbmdfaW1wb3J0cyA9IFRydWUKZGlmZiAtLWdpdCBhL3NldHVwLnB5IGIvc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2ODQ5MwotLS0gL2Rldi9udWxsCisrKyBiL3NldHVwLnB5CkBAIC0wLDAgKzEsMyBAQAorZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAorCitzZXR1cCgpCmRpZmYgLS1naXQgYS90YnVtcC50b21sIGIvdGJ1bXAudG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTU0ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGJ1bXAudG9tbApAQCAtMCwwICsxLDQ3IEBACitnaXRodWJfdXJsID0gImh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQiCisKK1t2ZXJzaW9uXQorY3VycmVudCA9ICIyLjkuMC1kZXYxIgorcmVnZXggPSAnJycKK14oP1A8bWFqb3I+MHxbMS05XVxkKikKK1wuCisoP1A8bWlub3I+MHxbMS05XVxkKikKK1wuCisoP1A8cGF0Y2g+MHxbMS05XVxkKikKKyg/Oi0oP1A8cHJlcmVsZWFzZT4oPzowfFsxLTldXGQqfFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XC4oPzowfFsxLTldXGQqfFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcKyg/UDxidWlsZG1ldGFkYXRhPlswLTlhLXpBLVotXSsoPzpcLlswLTlhLXpBLVotXSspKikpPyQKKycnJworCitbZ2l0XQorbWVzc2FnZV90ZW1wbGF0ZSA9ICJCdW1wIHB5bGludCB0byB7bmV3X3ZlcnNpb259LCB1cGRhdGUgY2hhbmdlbG9nIgordGFnX3RlbXBsYXRlID0gInZ7bmV3X3ZlcnNpb259IgorCisjIEZvciBlYWNoIGZpbGUgdG8gcGF0Y2gsIGFkZCBhIFtbZmlsZV1dIGNvbmZpZworIyBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHBhdGggb2YgdGhlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZQorIyB0YnVtcC50b21sIGxvY2F0aW9uLgorW1tmaWxlXV0KK3NyYyA9ICJweWxpbnQvX19wa2dpbmZvX18ucHkiCisKKyMgWW91IGNhbiBzcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyB0bworIyBydW4gYWZ0ZXIgdGhlIGZpbGVzIGhhdmUgYmVlbiBwYXRjaGVkCisjIGFuZCBiZWZvcmUgdGhlIGdpdCBjb21taXQgaXMgbWFkZQorW1tiZWZvcmVfY29tbWl0XV0KK25hbWUgPSAiVXBncmFkZSBjaGFuZ2Vsb2ciCitjbWQgPSAicHl0aG9uMyBzY3JpcHQvYnVtcF9jaGFuZ2Vsb2cucHkge25ld192ZXJzaW9ufSIKKworW1tiZWZvcmVfY29tbWl0XV0KK25hbWUgPSAiVXBncmFkZSBjb3B5cmlnaHRzIgorY21kID0gInBpcDMgaW5zdGFsbCBjb3B5cml0ZTtjb3B5cml0ZSAtLWNvbnRyaWJ1dGlvbi10aHJlc2hvbGQgMSAtLWNoYW5nZS10aHJlc2hvbGQgMyAtLWJhY2tlbmQtdHlwZSBnaXQgLS1hbGlhc2VzPS5jb3B5cml0ZV9hbGlhc2VzIC4gLS1qb2JzPTgiCisKK1tbYmVmb3JlX2NvbW1pdF1dCituYW1lID0gIkFwcGx5IHByZS1jb21taXQiCitjbWQgPSAicHJlLWNvbW1pdCBydW4gLS1hbGwtZmlsZXN8fGVjaG8gJ0hhY2sgc28gdGhpcyBjb21tYW5kIGRvZXMgbm90IGZhaWwnIgorCitbW2JlZm9yZV9jb21taXRdXQorbmFtZSA9ICJBY2NlcHRhbmNlIHRlc3RzIgorY21kID0gInB5dGVzdCAtbSBhY2NlcHRhbmNlIgorCisjIE9yIHJ1biBzb21lIGNvbW1hbmRzIGFmdGVyIHRoZSBnaXQgdGFnIGFuZCB0aGUgYnJhbmNoCisjIGhhdmUgYmVlbiBwdXNoZWQ6CisjICBbW2FmdGVyX3B1c2hdXQorIyAgbmFtZSA9ICJwdWJsaXNoIgorIyAgY21kID0gIi4vcHVibGlzaC5zaCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2FjY2VwdGFuY2UvdGVzdF9zdGRsaWIucHkgYi90ZXN0cy9hY2NlcHRhbmNlL3Rlc3Rfc3RkbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTgxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hY2NlcHRhbmNlL3Rlc3Rfc3RkbGliLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBpbworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2ltcG9ydCBweXRlc3QKKworaW1wb3J0IHB5bGludC5saW50CisKKworZGVmIGlzX21vZHVsZShmaWxlbmFtZSk6CisgICAgcmV0dXJuIGZpbGVuYW1lLmVuZHN3aXRoKCIucHkiKQorCisKK2RlZiBpc19wYWNrYWdlKGZpbGVuYW1lLCBsb2NhdGlvbik6CisgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihsb2NhdGlvbiwgZmlsZW5hbWUsICJfX2luaXRfXy5weSIpKQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgX3BhdGNoX3N0ZG91dChvdXQpOgorICAgIHN5cy5zdGRvdXQgPSBvdXQKKyAgICB0cnk6CisgICAgICAgIHlpZWxkCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCisKKworTElCX0RJUlMgPSBbb3MucGF0aC5kaXJuYW1lKG9zLl9fZmlsZV9fKV0KK01PRFVMRVNfVE9fQ0hFQ0sgPSBbCisgICAgKGxvY2F0aW9uLCBtb2R1bGUpCisgICAgZm9yIGxvY2F0aW9uIGluIExJQl9ESVJTCisgICAgZm9yIG1vZHVsZSBpbiBvcy5saXN0ZGlyKGxvY2F0aW9uKQorICAgIGlmIGlzX21vZHVsZShtb2R1bGUpIG9yIGlzX3BhY2thZ2UobW9kdWxlLCBsb2NhdGlvbikKK10KK01PRFVMRVNfTkFNRVMgPSBbbVsxXSBmb3IgbSBpbiBNT0RVTEVTX1RPX0NIRUNLXQorCisKK0BweXRlc3QubWFyay5hY2NlcHRhbmNlCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgKCJ0ZXN0X21vZHVsZV9sb2NhdGlvbiIsICJ0ZXN0X21vZHVsZV9uYW1lIiksIE1PRFVMRVNfVE9fQ0hFQ0ssIGlkcz1NT0RVTEVTX05BTUVTCispCitkZWYgdGVzdF9saWJtb2R1bGUodGVzdF9tb2R1bGVfbG9jYXRpb24sIHRlc3RfbW9kdWxlX25hbWUpOgorICAgIG9zLmNoZGlyKHRlc3RfbW9kdWxlX2xvY2F0aW9uKQorICAgIHdpdGggX3BhdGNoX3N0ZG91dChpby5TdHJpbmdJTygpKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHlsaW50LmxpbnQuUnVuKFt0ZXN0X21vZHVsZV9uYW1lLCAiLS1lbmFibGU9YWxsIiwgIi0taWdub3JlPXRlc3QiXSkKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgZXg6CisgICAgICAgICAgICBhc3NlcnQgZXguY29kZSAhPSAzMgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAic2hvdWxkbid0IGdldCB0aGVyZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2JlbmNobWFyay90ZXN0X2Jhc2VsaW5lX2JlbmNobWFya3MucHkgYi90ZXN0cy9iZW5jaG1hcmsvdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzkxNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iZW5jaG1hcmsvdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtzLnB5CkBAIC0wLDAgKzEsMzU5IEBACisiIiIgUHJvZmlsZXMgYmFzaWMgLWpYIGZ1bmN0aW9uYWxpdHkgIiIiCisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBGcmFuayBIYXJyaXNvbiA8ZnJhbmtAZG91YmxldGhlZmlzaC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcyxtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZyxuby1zZWxmLXVzZQorCitpbXBvcnQgb3MKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCB0aW1lCitmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IHBhdGNoCisKK2ltcG9ydCBweXRlc3QKKworaW1wb3J0IHB5bGludC5pbnRlcmZhY2VzCitmcm9tIHB5bGludC5jaGVja2Vycy5iYXNlX2NoZWNrZXIgaW1wb3J0IEJhc2VDaGVja2VyCitmcm9tIHB5bGludC5saW50IGltcG9ydCBQeUxpbnRlciwgUnVuLCBjaGVja19wYXJhbGxlbAorZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBHZW5lcmljVGVzdFJlcG9ydGVyIGFzIFJlcG9ydGVyCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgcmVnaXN0ZXJfcGx1Z2lucworCisKK2RlZiBfZW1wdHlfZmlsZXBhdGgoKToKKyAgICByZXR1cm4gb3MucGF0aC5hYnNwYXRoKAorICAgICAgICBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiLi4iLCAiaW5wdXQiLCAiYmVuY2htYXJrX21pbmltYWxfZmlsZS5weSIKKyAgICAgICAgKQorICAgICkKKworCitjbGFzcyBTbGVlcGluZ0NoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICIiIkEgY2hlY2tlciB0aGF0IHNsZWVwcywgdGhlIHdhbGwtY2xvY2sgdGltZSBzaG91bGQgcmVkdWNlIGFzIHdlIGFkZCB3b3JrZXJzCisKKyAgICBBcyB3ZSBhcHBseSBhIHJvdWdobHkgY29uc3RhbnQgYW1vdW50IG9mICJ3b3JrIiBpbiB0aGlzIGNoZWNrZXIgYW55IHZhcmlhbmNlIGlzCisgICAgbGlrZWx5IHRvIGJlIGNhdXNlZCBieSB0aGUgcHlsaW50IHN5c3RlbS4iIiIKKworICAgIF9faW1wbGVtZW50c19fID0gKHB5bGludC5pbnRlcmZhY2VzLklSYXdDaGVja2VyLCkKKworICAgIG5hbWUgPSAic2xlZXBlciIKKyAgICBtc2dzID0geworICAgICAgICAiUjk5OTkiOiAoCisgICAgICAgICAgICAiVGVzdCIsCisgICAgICAgICAgICAidGVzdC1jaGVjayIsCisgICAgICAgICAgICAiU29tZSBoZWxwZnVsIHRleHQuIiwKKyAgICAgICAgKQorICAgIH0KKyAgICBzbGVlcF9kdXJhdGlvbiA9IDAuNSAgIyB0aGUgdGltZSB0byBwcmV0ZW5kIHdlJ3JlIGRvaW5nIHdvcmsgZm9yCisKKyAgICBkZWYgcHJvY2Vzc19tb2R1bGUoc2VsZiwgX2FzdHJvaWQpOgorICAgICAgICAiIiJTbGVlcHMgZm9yIGBzbGVlcF9kdXJhdGlvbmAgb24gZWFjaCBjYWxsCisKKyAgICAgICAgVGhpcyBlZmZlY3RpdmVseSBtZWFucyBlYWNoIGZpbGUgY29zdHMgfmBzbGVlcF9kdXJhdGlvbmArZnJhbWV3b3JrIG92ZXJoZWFkIiIiCisgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5zbGVlcF9kdXJhdGlvbikKKworCitjbGFzcyBTbGVlcGluZ0NoZWNrZXJMb25nKEJhc2VDaGVja2VyKToKKyAgICAiIiJBIGNoZWNrZXIgdGhhdCBzbGVlcHMsIHRoZSB3YWxsLWNsb2NrIHRpbWUgc2hvdWxkIHJlZHVjZSBhcyB3ZSBhZGQgd29ya2VycworCisgICAgQXMgd2UgYXBwbHkgYSByb3VnaGx5IGNvbnN0YW50IGFtb3VudCBvZiAid29yayIgaW4gdGhpcyBjaGVja2VyIGFueSB2YXJpYW5jZSBpcworICAgIGxpa2VseSB0byBiZSBjYXVzZWQgYnkgdGhlIHB5bGludCBzeXN0ZW0uIiIiCisKKyAgICBfX2ltcGxlbWVudHNfXyA9IChweWxpbnQuaW50ZXJmYWNlcy5JUmF3Q2hlY2tlciwpCisKKyAgICBuYW1lID0gImxvbmctc2xlZXBlciIKKyAgICBtc2dzID0geworICAgICAgICAiUjk5OTkiOiAoCisgICAgICAgICAgICAiVGVzdCIsCisgICAgICAgICAgICAidGVzdC1jaGVjayIsCisgICAgICAgICAgICAiU29tZSBoZWxwZnVsIHRleHQuIiwKKyAgICAgICAgKQorICAgIH0KKyAgICBzbGVlcF9kdXJhdGlvbiA9IDAuNSAgIyB0aGUgdGltZSB0byBwcmV0ZW5kIHdlJ3JlIGRvaW5nIHdvcmsgZm9yCisKKyAgICBkZWYgcHJvY2Vzc19tb2R1bGUoc2VsZiwgX2FzdHJvaWQpOgorICAgICAgICAiIiJTbGVlcHMgZm9yIGBzbGVlcF9kdXJhdGlvbmAgb24gZWFjaCBjYWxsCisKKyAgICAgICAgVGhpcyBlZmZlY3RpdmVseSBtZWFucyBlYWNoIGZpbGUgY29zdHMgfmBzbGVlcF9kdXJhdGlvbmArZnJhbWV3b3JrIG92ZXJoZWFkIiIiCisgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5zbGVlcF9kdXJhdGlvbikKKworCitjbGFzcyBOb1dvcmtDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAiIiJBIGNoZWNrZXIgdGhhdCBzbGVlcHMsIHRoZSB3YWxsLWNsb2NrIHRpbWUgc2hvdWxkIGNoYW5nZSBhcyB3ZSBhZGQgdGhyZWFkcyIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAocHlsaW50LmludGVyZmFjZXMuSVJhd0NoZWNrZXIsKQorCisgICAgbmFtZSA9ICJzbGVlcGVyIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJSOTk5OSI6ICgKKyAgICAgICAgICAgICJUZXN0IiwKKyAgICAgICAgICAgICJ0ZXN0LWNoZWNrIiwKKyAgICAgICAgICAgICJTb21lIGhlbHBmdWwgdGV4dC4iLAorICAgICAgICApCisgICAgfQorCisgICAgZGVmIHByb2Nlc3NfbW9kdWxlKHNlbGYsIF9hc3Ryb2lkKToKKyAgICAgICAgcGFzcworCisKK0BweXRlc3QubWFyay5iZW5jaG1hcmsoCisgICAgZ3JvdXA9ImJhc2VsaW5lIiwKKykKK2NsYXNzIFRlc3RFc3RhYmxpc2hCYXNlbGluZUJlbmNobWFya3M6CisgICAgIiIiTmFpdmUgYmVuY2htYXJrcyBmb3IgdGhlIGhpZ2gtbGV2ZWwgcHlsaW50IGZyYW1ld29yaworCisgICAgQmVjYXVzZSB0aGlzIGJlbmNobWFya3MgdGhlIGZ1bmRlbWVudGFsIGFuZCBjb21tb24gcGFydHMgYW5kIGNoYW5nZXMgc2VlbiBoZXJlIHdpbGwKKyAgICBpbXBhY3QgZXZlcnl0aGluZyBlbHNlIiIiCisKKyAgICBlbXB0eV9maWxlcGF0aCA9IF9lbXB0eV9maWxlcGF0aCgpCisgICAgZW1wdHlfZmlsZV9pbmZvID0gKAorICAgICAgICAibmFtZS1lbXB0eWZpbGUtZmlsZSIsCisgICAgICAgIF9lbXB0eV9maWxlcGF0aCgpLAorICAgICAgICAibW9kbmFtZS1lbXB0eWZpbGUtbW9kIiwKKyAgICApCisgICAgbG90X29mX2ZpbGVzID0gNTAwCisKKyAgICBkZWYgdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtfajEoc2VsZiwgYmVuY2htYXJrKToKKyAgICAgICAgIiIiRXN0YWJsaXNoIGEgYmFzZWxpbmUgb2YgcHlsaW50IHBlcmZvcm1hbmNlIHdpdGggbm8gd29yaworCisgICAgICAgIFdlIHdpbGwgYWRkIGV4dHJhIENoZWNrZXJzIGluIG90aGVyIGJlbmNobWFya3MuCisKKyAgICAgICAgQmVjYXVzZSB0aGlzIGlzIHNvIHNpbXBsZSwgaWYgdGhpcyByZWdyZXNzZXMgc29tZXRoaW5nIHZlcnkgc2VyaW91cyBoYXMgaGFwcGVuZWQKKyAgICAgICAgIiIiCisgICAgICAgIGxpbnRlciA9IFB5TGludGVyKHJlcG9ydGVyPVJlcG9ydGVyKCkpCisgICAgICAgIGZpbGVpbmZvcyA9IFtzZWxmLmVtcHR5X2ZpbGVwYXRoXSAgIyBTaW5nbGUgZmlsZSB0byBlbmQtdG8tZW5kIHRoZSBzeXN0ZW0KKyAgICAgICAgYXNzZXJ0IGxpbnRlci5jb25maWcuam9icyA9PSAxCisgICAgICAgIGFzc2VydCBsZW4obGludGVyLl9jaGVja2VycykgPT0gMSwgIlNob3VsZCBqdXN0IGhhdmUgJ21hc3RlciciCisgICAgICAgIGJlbmNobWFyayhsaW50ZXIuY2hlY2ssIGZpbGVpbmZvcykKKyAgICAgICAgYXNzZXJ0ICgKKyAgICAgICAgICAgIGxpbnRlci5tc2dfc3RhdHVzID09IDAKKyAgICAgICAgKSwgIkV4cGVjdGVkIG5vIGVycm9ycyB0byBiZSB0aHJvd246ICVzIiAlIHBwcmludC5wZm9ybWF0KAorICAgICAgICAgICAgbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2Jhc2VsaW5lX2JlbmNobWFya19qMTAoc2VsZiwgYmVuY2htYXJrKToKKyAgICAgICAgIiIiRXN0YWJsaXNoIGEgYmFzZWxpbmUgb2YgcHlsaW50IHBlcmZvcm1hbmNlIHdpdGggbm8gd29yayBhY3Jvc3MgdGhyZWFkcworCisgICAgICAgIFNhbWUgYXMgYHRlc3RfYmFzZWxpbmVfYmVuY2htYXJrX2oxYCBidXQgd2UgdXNlIC1qMTAgd2l0aCAxMCBmYWtlIGZpbGVzIHRvCisgICAgICAgIGVuc3VyZSBlbmQtdG8tZW5kLXN5c3RlbSBpbnZva2VkLgorCisgICAgICAgIEJlY2F1c2UgdGhpcyBpcyBhbHNvIHNvIHNpbXBsZSwgaWYgdGhpcyByZWdyZXNzZXMgc29tZXRoaW5nIHZlcnkgc2VyaW91cyBoYXMKKyAgICAgICAgaGFwcGVuZWQuCisgICAgICAgICIiIgorICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSAxMAorCisgICAgICAgICMgQ3JlYXRlIGZpbGUgcGVyIHdvcmtlciwgdXNpbmcgYWxsIHdvcmtlcnMKKyAgICAgICAgZmlsZWluZm9zID0gW3NlbGYuZW1wdHlfZmlsZXBhdGggZm9yIF8gaW4gcmFuZ2UobGludGVyLmNvbmZpZy5qb2JzKV0KKworICAgICAgICBhc3NlcnQgbGludGVyLmNvbmZpZy5qb2JzID09IDEwCisgICAgICAgIGFzc2VydCBsZW4obGludGVyLl9jaGVja2VycykgPT0gMSwgIlNob3VsZCBoYXZlICdtYXN0ZXInIgorICAgICAgICBiZW5jaG1hcmsobGludGVyLmNoZWNrLCBmaWxlaW5mb3MpCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBsaW50ZXIubXNnX3N0YXR1cyA9PSAwCisgICAgICAgICksICJFeHBlY3RlZCBubyBlcnJvcnMgdG8gYmUgdGhyb3duOiAlcyIgJSBwcHJpbnQucGZvcm1hdCgKKyAgICAgICAgICAgIGxpbnRlci5yZXBvcnRlci5tZXNzYWdlcworICAgICAgICApCisKKyAgICBkZWYgdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtfY2hlY2tfcGFyYWxsZWxfajEwKHNlbGYsIGJlbmNobWFyayk6CisgICAgICAgICIiIlNob3VsZCBkZW1vbnN0cmF0ZSB0aW1lcyB2ZXJ5IGNsb3NlIHRvIGB0ZXN0X2Jhc2VsaW5lX2JlbmNobWFya19qMTBgIiIiCisgICAgICAgIGxpbnRlciA9IFB5TGludGVyKHJlcG9ydGVyPVJlcG9ydGVyKCkpCisKKyAgICAgICAgIyBDcmVhdGUgZmlsZSBwZXIgd29ya2VyLCB1c2luZyBhbGwgd29ya2VycworICAgICAgICBmaWxlaW5mb3MgPSBbc2VsZi5lbXB0eV9maWxlX2luZm8gZm9yIF8gaW4gcmFuZ2UobGludGVyLmNvbmZpZy5qb2JzKV0KKworICAgICAgICBhc3NlcnQgbGVuKGxpbnRlci5fY2hlY2tlcnMpID09IDEsICJTaG91bGQgaGF2ZSAnbWFzdGVyJyIKKyAgICAgICAgYmVuY2htYXJrKGNoZWNrX3BhcmFsbGVsLCBsaW50ZXIsIGpvYnM9MTAsIGZpbGVzPWZpbGVpbmZvcykKKyAgICAgICAgYXNzZXJ0ICgKKyAgICAgICAgICAgIGxpbnRlci5tc2dfc3RhdHVzID09IDAKKyAgICAgICAgKSwgIkV4cGVjdGVkIG5vIGVycm9ycyB0byBiZSB0aHJvd246ICVzIiAlIHBwcmludC5wZm9ybWF0KAorICAgICAgICAgICAgbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2Jhc2VsaW5lX2xvdHNfb2ZfZmlsZXNfajEoc2VsZiwgYmVuY2htYXJrKToKKyAgICAgICAgIiIiRXN0YWJsaXNoIGEgYmFzZWxpbmUgd2l0aCBvbmx5ICdtYXN0ZXInIGNoZWNrZXIgYmVpbmcgcnVuIGluIC1qMQorCisgICAgICAgIFdlIGRvIG5vdCByZWdpc3RlciBhbnkgY2hlY2tlcnMgZXhjZXB0IHRoZSBkZWZhdWx0ICdtYXN0ZXInLCBzbyB0aGUgY29zdCBpcyBqdXN0CisgICAgICAgIHRoYXQgb2YgdGhlIHN5c3RlbSB3aXRoIGEgbG90IG9mIGZpbGVzIHJlZ2lzdGVyZCIiIgorICAgICAgICBpZiBiZW5jaG1hcmsuZGlzYWJsZWQ6CisgICAgICAgICAgICBiZW5jaG1hcmsocHJpbnQsICJza2lwcGluZywgb25seSBiZW5jaG1hcmsgbGFyZ2UgZmlsZSBjb3VudHMiKQorICAgICAgICAgICAgcmV0dXJuICAjIF9vbmx5XyBydW4gdGhpcyB0ZXN0IGlzIHByb2ZpbGluZworICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSAxCisgICAgICAgIGZpbGVpbmZvcyA9IFtzZWxmLmVtcHR5X2ZpbGVwYXRoIGZvciBfIGluIHJhbmdlKHNlbGYubG90X29mX2ZpbGVzKV0KKyAgICAgICAgYXNzZXJ0IGxpbnRlci5jb25maWcuam9icyA9PSAxCisgICAgICAgIGFzc2VydCBsZW4obGludGVyLl9jaGVja2VycykgPT0gMSwgIlNob3VsZCBoYXZlICdtYXN0ZXInIgorICAgICAgICBiZW5jaG1hcmsobGludGVyLmNoZWNrLCBmaWxlaW5mb3MpCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBsaW50ZXIubXNnX3N0YXR1cyA9PSAwCisgICAgICAgICksICJFeHBlY3RlZCBubyBlcnJvcnMgdG8gYmUgdGhyb3duOiAlcyIgJSBwcHJpbnQucGZvcm1hdCgKKyAgICAgICAgICAgIGxpbnRlci5yZXBvcnRlci5tZXNzYWdlcworICAgICAgICApCisKKyAgICBkZWYgdGVzdF9iYXNlbGluZV9sb3RzX29mX2ZpbGVzX2oxMChzZWxmLCBiZW5jaG1hcmspOgorICAgICAgICAiIiJFc3RhYmxpc2ggYSBiYXNlbGluZSB3aXRoIG9ubHkgJ21hc3RlcicgY2hlY2tlciBiZWluZyBydW4gaW4gLWoxMAorCisgICAgICAgIEFzIHdpdGggdGhlIC1qMSB2YXJpYW50IGFib3ZlIGB0ZXN0X2Jhc2VsaW5lX2xvdHNfb2ZfZmlsZXNfajFgLCB3ZSBkbyBub3QKKyAgICAgICAgcmVnaXN0ZXIgYW55IGNoZWNrZXJzIGV4Y2VwdCB0aGUgZGVmYXVsdCAnbWFzdGVyJywgc28gdGhlIGNvc3QgaXMganVzdCB0aGF0IG9mCisgICAgICAgIHRoZSBjaGVja19wYXJhbGxlbCBzeXN0ZW0gYWNyb3NzIDEwIHdvcmtlcnMsIHBsdXMgdGhlIG92ZXJoZWFkIG9mIFB5TGludGVyIiIiCisgICAgICAgIGlmIGJlbmNobWFyay5kaXNhYmxlZDoKKyAgICAgICAgICAgIGJlbmNobWFyayhwcmludCwgInNraXBwaW5nLCBvbmx5IGJlbmNobWFyayBsYXJnZSBmaWxlIGNvdW50cyIpCisgICAgICAgICAgICByZXR1cm4gICMgX29ubHlfIHJ1biB0aGlzIHRlc3QgaXMgcHJvZmlsaW5nCisgICAgICAgIGxpbnRlciA9IFB5TGludGVyKHJlcG9ydGVyPVJlcG9ydGVyKCkpCisgICAgICAgIGxpbnRlci5jb25maWcuam9icyA9IDEwCisgICAgICAgIGZpbGVpbmZvcyA9IFtzZWxmLmVtcHR5X2ZpbGVwYXRoIGZvciBfIGluIHJhbmdlKHNlbGYubG90X29mX2ZpbGVzKV0KKyAgICAgICAgYXNzZXJ0IGxpbnRlci5jb25maWcuam9icyA9PSAxMAorICAgICAgICBhc3NlcnQgbGVuKGxpbnRlci5fY2hlY2tlcnMpID09IDEsICJTaG91bGQgaGF2ZSAnbWFzdGVyJyIKKyAgICAgICAgYmVuY2htYXJrKGxpbnRlci5jaGVjaywgZmlsZWluZm9zKQorICAgICAgICBhc3NlcnQgKAorICAgICAgICAgICAgbGludGVyLm1zZ19zdGF0dXMgPT0gMAorICAgICAgICApLCAiRXhwZWN0ZWQgbm8gZXJyb3JzIHRvIGJlIHRocm93bjogJXMiICUgcHByaW50LnBmb3JtYXQoCisgICAgICAgICAgICBsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXMKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFzZWxpbmVfbG90c19vZl9maWxlc19qMV9lbXB0eV9jaGVja2VyKHNlbGYsIGJlbmNobWFyayk6CisgICAgICAgICIiIkJhc2VsaW5lcyBweWxpbnQgZm9yIGEgc2luZ2xlIGV4dHJhIGNoZWNrZXIgYmVpbmcgcnVuIGluIC1qMSwgZm9yIE4tZmlsZXMKKworICAgICAgICBXZSB1c2UgYSBjaGVja2VyIHRoYXQgZG9lcyBubyB3b3JrLCBzbyB0aGUgY29zdCBpcyBqdXN0IHRoYXQgb2YgdGhlIHN5c3RlbSBhdAorICAgICAgICBzY2FsZSIiIgorICAgICAgICBpZiBiZW5jaG1hcmsuZGlzYWJsZWQ6CisgICAgICAgICAgICBiZW5jaG1hcmsocHJpbnQsICJza2lwcGluZywgb25seSBiZW5jaG1hcmsgbGFyZ2UgZmlsZSBjb3VudHMiKQorICAgICAgICAgICAgcmV0dXJuICAjIF9vbmx5XyBydW4gdGhpcyB0ZXN0IGlzIHByb2ZpbGluZworICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSAxCisgICAgICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKE5vV29ya0NoZWNrZXIobGludGVyKSkKKyAgICAgICAgZmlsZWluZm9zID0gW3NlbGYuZW1wdHlfZmlsZXBhdGggZm9yIF8gaW4gcmFuZ2Uoc2VsZi5sb3Rfb2ZfZmlsZXMpXQorICAgICAgICBhc3NlcnQgbGludGVyLmNvbmZpZy5qb2JzID09IDEKKyAgICAgICAgYXNzZXJ0IGxlbihsaW50ZXIuX2NoZWNrZXJzKSA9PSAyLCAiU2hvdWxkIGhhdmUgJ21hc3RlcicgYW5kICdzbGVlcGVyJyIKKyAgICAgICAgYmVuY2htYXJrKGxpbnRlci5jaGVjaywgZmlsZWluZm9zKQorICAgICAgICBhc3NlcnQgKAorICAgICAgICAgICAgbGludGVyLm1zZ19zdGF0dXMgPT0gMAorICAgICAgICApLCAiRXhwZWN0ZWQgbm8gZXJyb3JzIHRvIGJlIHRocm93bjogJXMiICUgcHByaW50LnBmb3JtYXQoCisgICAgICAgICAgICBsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXMKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFzZWxpbmVfbG90c19vZl9maWxlc19qMTBfZW1wdHlfY2hlY2tlcihzZWxmLCBiZW5jaG1hcmspOgorICAgICAgICAiIiJCYXNlbGluZXMgcHlsaW50IGZvciBhIHNpbmdsZSBleHRyYSBjaGVja2VyIGJlaW5nIHJ1biBpbiAtajEwLCBmb3IgTi1maWxlcworCisgICAgICAgIFdlIHVzZSBhIGNoZWNrZXIgdGhhdCBkb2VzIG5vIHdvcmssIHNvIHRoZSBjb3N0IGlzIGp1c3QgdGhhdCBvZiB0aGUgc3lzdGVtIGF0CisgICAgICAgIHNjYWxlLCBhY3Jvc3Mgd29ya2VycyIiIgorICAgICAgICBpZiBiZW5jaG1hcmsuZGlzYWJsZWQ6CisgICAgICAgICAgICBiZW5jaG1hcmsocHJpbnQsICJza2lwcGluZywgb25seSBiZW5jaG1hcmsgbGFyZ2UgZmlsZSBjb3VudHMiKQorICAgICAgICAgICAgcmV0dXJuICAjIF9vbmx5XyBydW4gdGhpcyB0ZXN0IGlzIHByb2ZpbGluZworICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSAxMAorICAgICAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihOb1dvcmtDaGVja2VyKGxpbnRlcikpCisgICAgICAgIGZpbGVpbmZvcyA9IFtzZWxmLmVtcHR5X2ZpbGVwYXRoIGZvciBfIGluIHJhbmdlKHNlbGYubG90X29mX2ZpbGVzKV0KKyAgICAgICAgYXNzZXJ0IGxpbnRlci5jb25maWcuam9icyA9PSAxMAorICAgICAgICBhc3NlcnQgbGVuKGxpbnRlci5fY2hlY2tlcnMpID09IDIsICJTaG91bGQgaGF2ZSAnbWFzdGVyJyBhbmQgJ3NsZWVwZXInIgorICAgICAgICBiZW5jaG1hcmsobGludGVyLmNoZWNrLCBmaWxlaW5mb3MpCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBsaW50ZXIubXNnX3N0YXR1cyA9PSAwCisgICAgICAgICksICJFeHBlY3RlZCBubyBlcnJvcnMgdG8gYmUgdGhyb3duOiAlcyIgJSBwcHJpbnQucGZvcm1hdCgKKyAgICAgICAgICAgIGxpbnRlci5yZXBvcnRlci5tZXNzYWdlcworICAgICAgICApCisKKyAgICBkZWYgdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtfajFfc2luZ2xlX3dvcmtpbmdfY2hlY2tlcihzZWxmLCBiZW5jaG1hcmspOgorICAgICAgICAiIiJFc3RhYmxpc2ggYSBiYXNlbGluZSBvZiBzaW5nbGUtd29ya2VyIHBlcmZvcm1hbmNlIGZvciBQeUxpbnRlcgorCisgICAgICAgIEhlcmUgd2UgbWltaWNrIGEgc2luZ2xlIENoZWNrZXIgdGhhdCBkb2VzIHNvbWUgd29yayBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlCisgICAgICAgIGltcGFjdCBvZiBydW5uaW5nIGEgc2ltcGxlIHN5c3RlbSB3aXRoIC1qMSBhZ2FpbnN0IHRoZSBzYW1lIHN5c3RlbSB3aXRoIC1qMTAuCisKKyAgICAgICAgV2UgZXhwZWN0IHRoaXMgYmVuY2htYXJrIHRvIHRha2UgdmVyeSBjbG9zZSB0bworICAgICAgICBgbnVtZmlsZXMqU2xlZXBpbmdDaGVja2VyLnNsZWVwX2R1cmF0aW9uYCIiIgorICAgICAgICBpZiBiZW5jaG1hcmsuZGlzYWJsZWQ6CisgICAgICAgICAgICBiZW5jaG1hcmsocHJpbnQsICJza2lwcGluZywgZG8gbm90IHdhbnQgdG8gc2xlZXAgaW4gbWFpbiB0ZXN0cyIpCisgICAgICAgICAgICByZXR1cm4gICMgX29ubHlfIHJ1biB0aGlzIHRlc3QgaXMgcHJvZmlsaW5nCisgICAgICAgIGxpbnRlciA9IFB5TGludGVyKHJlcG9ydGVyPVJlcG9ydGVyKCkpCisgICAgICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFNsZWVwaW5nQ2hlY2tlcihsaW50ZXIpKQorCisgICAgICAgICMgQ2hlY2sgdGhlIHNhbWUgbnVtYmVyIG9mIGZpbGVzIGFzCisgICAgICAgICMgYHRlc3RfYmFzZWxpbmVfYmVuY2htYXJrX2oxMF9zaW5nbGVfd29ya2luZ19jaGVja2VyYAorICAgICAgICBmaWxlaW5mb3MgPSBbc2VsZi5lbXB0eV9maWxlcGF0aCBmb3IgXyBpbiByYW5nZSgxMCldCisKKyAgICAgICAgYXNzZXJ0IGxpbnRlci5jb25maWcuam9icyA9PSAxCisgICAgICAgIGFzc2VydCBsZW4obGludGVyLl9jaGVja2VycykgPT0gMiwgIlNob3VsZCBoYXZlICdtYXN0ZXInIGFuZCAnc2xlZXBlciciCisgICAgICAgIGJlbmNobWFyayhsaW50ZXIuY2hlY2ssIGZpbGVpbmZvcykKKyAgICAgICAgYXNzZXJ0ICgKKyAgICAgICAgICAgIGxpbnRlci5tc2dfc3RhdHVzID09IDAKKyAgICAgICAgKSwgIkV4cGVjdGVkIG5vIGVycm9ycyB0byBiZSB0aHJvd246ICVzIiAlIHBwcmludC5wZm9ybWF0KAorICAgICAgICAgICAgbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2Jhc2VsaW5lX2JlbmNobWFya19qMTBfc2luZ2xlX3dvcmtpbmdfY2hlY2tlcihzZWxmLCBiZW5jaG1hcmspOgorICAgICAgICAiIiJFc3RhYmxpc2hlcyBiYXNlbGluZSBvZiBtdWx0aS13b3JrZXIgcGVyZm9ybWFuY2UgZm9yIFB5TGludGVyL2NoZWNrX3BhcmFsbGVsCisKKyAgICAgICAgV2UgZXhwZWN0IHRoaXMgYmVuY2htYXJrIHRvIHRha2UgbGVzcyB0aW1lIHRoYXQgdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtfajEsCisgICAgICAgIGBlcnJvcl9tYXJnaW4qKDEvSikqKG51bWZpbGVzKlNsZWVwaW5nQ2hlY2tlci5zbGVlcF9kdXJhdGlvbilgCisKKyAgICAgICAgQmVjYXVzZSBvZiB0aGUgY29zdCBvZiB0aGUgZnJhbWV3b3JrIGFuZCBzeXN0ZW0gdGhlIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2Ugd2lsbAorICAgICAgICAqbm90KiBiZSAxLzEwIG9mIC1qMSB2ZXJzaW9ucy4iIiIKKyAgICAgICAgaWYgYmVuY2htYXJrLmRpc2FibGVkOgorICAgICAgICAgICAgYmVuY2htYXJrKHByaW50LCAic2tpcHBpbmcsIGRvIG5vdCB3YW50IHRvIHNsZWVwIGluIG1haW4gdGVzdHMiKQorICAgICAgICAgICAgcmV0dXJuICAjIF9vbmx5XyBydW4gdGhpcyB0ZXN0IGlzIHByb2ZpbGluZworICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSAxMAorICAgICAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihTbGVlcGluZ0NoZWNrZXIobGludGVyKSkKKworICAgICAgICAjIENoZWNrIHRoZSBzYW1lIG51bWJlciBvZiBmaWxlcyBhcworICAgICAgICAjIGB0ZXN0X2Jhc2VsaW5lX2JlbmNobWFya19qMV9zaW5nbGVfd29ya2luZ19jaGVja2VyYAorICAgICAgICBmaWxlaW5mb3MgPSBbc2VsZi5lbXB0eV9maWxlcGF0aCBmb3IgXyBpbiByYW5nZSgxMCldCisKKyAgICAgICAgYXNzZXJ0IGxpbnRlci5jb25maWcuam9icyA9PSAxMAorICAgICAgICBhc3NlcnQgbGVuKGxpbnRlci5fY2hlY2tlcnMpID09IDIsICJTaG91bGQgaGF2ZSAnbWFzdGVyJyBhbmQgJ3NsZWVwZXInIgorICAgICAgICBiZW5jaG1hcmsobGludGVyLmNoZWNrLCBmaWxlaW5mb3MpCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBsaW50ZXIubXNnX3N0YXR1cyA9PSAwCisgICAgICAgICksICJFeHBlY3RlZCBubyBlcnJvcnMgdG8gYmUgdGhyb3duOiAlcyIgJSBwcHJpbnQucGZvcm1hdCgKKyAgICAgICAgICAgIGxpbnRlci5yZXBvcnRlci5tZXNzYWdlcworICAgICAgICApCisKKyAgICBkZWYgdGVzdF9iYXNlbGluZV9iZW5jaG1hcmtfajFfYWxsX2NoZWNrc19zaW5nbGVfZmlsZShzZWxmLCBiZW5jaG1hcmspOgorICAgICAgICAiIiJSdW5zIGEgc2luZ2xlIGZpbGUsIHdpdGggLWoxLCBhZ2FpbnN0IGFsbCBwbHVnLWlucworCisgICAgICAgIC4uLiB0aGF0J3MgdGhlIGludGVudCBhdCBsZWFzdC4KKyAgICAgICAgIiIiCisgICAgICAgICMgSnVzdCAxIGZpbGUsIGJ1dCBhbGwgQ2hlY2tlcnMvRXh0ZW5zaW9ucworICAgICAgICBmaWxlaW5mb3MgPSBbc2VsZi5lbXB0eV9maWxlcGF0aF0KKworICAgICAgICBydW5uZXIgPSBiZW5jaG1hcmsoUnVuLCBmaWxlaW5mb3MsIHJlcG9ydGVyPVJlcG9ydGVyKCksIGV4aXQ9RmFsc2UpCisgICAgICAgIGFzc2VydCBydW5uZXIubGludGVyLmNvbmZpZy5qb2JzID09IDEKKyAgICAgICAgcHJpbnQoImxlbihydW5uZXIubGludGVyLl9jaGVja2VycykiLCBsZW4ocnVubmVyLmxpbnRlci5fY2hlY2tlcnMpKQorICAgICAgICBhc3NlcnQgbGVuKHJ1bm5lci5saW50ZXIuX2NoZWNrZXJzKSA+IDEsICJTaG91bGQgaGF2ZSBtb3JlIHRoYW4gJ21hc3RlciciCisKKyAgICAgICAgYXNzZXJ0ICgKKyAgICAgICAgICAgIHJ1bm5lci5saW50ZXIubXNnX3N0YXR1cyA9PSAwCisgICAgICAgICksICJFeHBlY3RlZCBubyBlcnJvcnMgdG8gYmUgdGhyb3duOiAlcyIgJSBwcHJpbnQucGZvcm1hdCgKKyAgICAgICAgICAgIHJ1bm5lci5saW50ZXIucmVwb3J0ZXIubWVzc2FnZXMKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFzZWxpbmVfYmVuY2htYXJrX2oxX2FsbF9jaGVja3NfbG90c19vZl9maWxlcyhzZWxmLCBiZW5jaG1hcmspOgorICAgICAgICAiIiJSdW5zIGxvdHMgb2YgZmlsZXMsIHdpdGggLWoxLCBhZ2FpbnN0IGFsbCBwbHVnLWlucworCisgICAgICAgIC4uLiB0aGF0J3MgdGhlIGludGVudCBhdCBsZWFzdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGJlbmNobWFyay5kaXNhYmxlZDoKKyAgICAgICAgICAgIGJlbmNobWFyayhwcmludCwgInNraXBwaW5nLCBvbmx5IGJlbmNobWFyayBsYXJnZSBmaWxlIGNvdW50cyIpCisgICAgICAgICAgICByZXR1cm4gICMgX29ubHlfIHJ1biB0aGlzIHRlc3QgaXMgcHJvZmlsaW5nCisgICAgICAgIGxpbnRlciA9IFB5TGludGVyKCkKKworICAgICAgICAjIFJlZ2lzdGVyIGFsbCBjaGVja2Vycy9leHRlbnNpb25zIGFuZCBlbmFibGUgdGhlbQorICAgICAgICB3aXRoIHBhdGNoKCJvcy5saXN0ZGlyIiwgcmV0dXJuX3ZhbHVlPVsicHlsaW50IiwgInRlc3RzIl0pOgorICAgICAgICAgICAgcmVnaXN0ZXJfcGx1Z2lucygKKyAgICAgICAgICAgICAgICBsaW50ZXIsCisgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiLi4iLCAiLi4iKSksCisgICAgICAgICAgICApCisgICAgICAgIGxpbnRlci5sb2FkX2RlZmF1bHRfcGx1Z2lucygpCisgICAgICAgIGxpbnRlci5lbmFibGUoImFsbCIpCisKKyAgICAgICAgIyBKdXN0IDEgZmlsZSwgYnV0IGFsbCBDaGVja2Vycy9FeHRlbnNpb25zCisgICAgICAgIGZpbGVpbmZvcyA9IFtzZWxmLmVtcHR5X2ZpbGVwYXRoIGZvciBfIGluIHJhbmdlKHNlbGYubG90X29mX2ZpbGVzKV0KKworICAgICAgICBhc3NlcnQgbGludGVyLmNvbmZpZy5qb2JzID09IDEKKyAgICAgICAgcHJpbnQoImxlbihsaW50ZXIuX2NoZWNrZXJzKSIsIGxlbihsaW50ZXIuX2NoZWNrZXJzKSkKKyAgICAgICAgYXNzZXJ0IGxlbihsaW50ZXIuX2NoZWNrZXJzKSA+IDEsICJTaG91bGQgaGF2ZSBtb3JlIHRoYW4gJ21hc3RlciciCisgICAgICAgIGJlbmNobWFyayhsaW50ZXIuY2hlY2ssIGZpbGVpbmZvcykKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrZXJzL19faW5pdF9fLnB5IGIvdGVzdHMvY2hlY2tlcnMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2Vycy9jb25mdGVzdC5weSBiL3Rlc3RzL2NoZWNrZXJzL2NvbmZ0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzEwMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2Vycy9jb25mdGVzdC5weQpAQCAtMCwwICsxLDQgQEAKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitIRVJFID0gUGF0aChfX2ZpbGVfXykucGFyZW50CitSRUdSX0RBVEEgPSBIRVJFIC8gIi4uIiAvICJyZWdydGVzdF9kYXRhIgpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfYmFzZS5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2Jhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxMGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2Jhc2UucHkKQEAgLTAsMCArMSw2NzkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBEbWl0cnkgUHJpYnlzaCA8ZG1hbmRAeWFuZGV4LnJ1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IFlhbm5hY2sgPHlhbm5hY2tAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE5IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxNyB0dGVuaG9ldmUtYWEgPHR0ZW5ob2V2ZUBhcHBhbm5pZS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBGdXJlaWdoIDxmdXJlaWdoQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IGdsbWRncmllbHNvbiA8MzI0MTU0MDMrZ2xtZGdyaWVsc29uQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGV0aGFuLWxlYmEgPGV0aGFubGViYTVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMCBiZXJuaWUgZ3JheSA8YmZncmF5M0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBPciBCYWhhcmkgPG9yYmFoYXJpQG1haWwudGF1LmFjLmlsPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgRGF2aWQgR2lsbWFuIDxkYXZpZGdpbG1hbjFAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlVuaXR0ZXN0IGZvciB0aGUgYmFzZSBjaGVja2VyLiIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR5cGUKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyLCBiYXNlCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZSwgc2V0X2NvbmZpZworCisKK2NsYXNzIFRlc3REb2NzdHJpbmcoQ2hlY2tlclRlc3RDYXNlKToKKyAgICBDSEVDS0VSX0NMQVNTOiBUeXBlID0gYmFzZS5Eb2NTdHJpbmdDaGVja2VyCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2RvY3N0cmluZ19tb2R1bGUoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoInNvbWV0aGluZyIpCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKCJtaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmciLCBub2RlPW1vZHVsZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9tb2R1bGUobW9kdWxlKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19kb2NzdHJpbmdfZW1wdHlfbW9kdWxlKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKCIiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShtb2R1bGUpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9kb2NzdHJpbmdfbW9kdWxlKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKCInJycnJyciKQorICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgiZW1wdHktZG9jc3RyaW5nIiwgbm9kZT1tb2R1bGUsIGFyZ3M9KCJtb2R1bGUiLCkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfbW9kdWxlKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2RvY3N0cmluZ19mdW5jdGlvbihzZWxmKToKKyAgICAgICAgZnVuYyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jKHRpb24pOgorICAgICAgICAgICBwYXNzIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoIm1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nIiwgbm9kZT1mdW5jKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKGZ1bmMpCisKKyAgICBAc2V0X2NvbmZpZyhkb2NzdHJpbmdfbWluX2xlbmd0aD0yKQorICAgIGRlZiB0ZXN0X3Nob3J0X2Z1bmN0aW9uX25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jKHRpb24pOgorICAgICAgICAgICBwYXNzIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihmdW5jKQorCisgICAgQHNldF9jb25maWcoZG9jc3RyaW5nX21pbl9sZW5ndGg9MikKKyAgICBkZWYgdGVzdF9sb25nX2Z1bmN0aW9uX25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jKHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCBub2RlPWZ1bmMpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYoZnVuYykKKworICAgIEBzZXRfY29uZmlnKGRvY3N0cmluZ19taW5fbGVuZ3RoPTIpCisgICAgZGVmIHRlc3RfbG9uZ19mdW5jdGlvbl9uZXN0ZWRfc3RhdGVtZW50c19ub19kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIGZ1bmMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuYyh0aW9uKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCBub2RlPWZ1bmMpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYoZnVuYykKKworICAgIEBzZXRfY29uZmlnKGRvY3N0cmluZ19taW5fbGVuZ3RoPTIpCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fbm9fZG9jc3RyaW5nX2J5X25hbWUoc2VsZik6CisgICAgICAgIGZ1bmMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgX19mdW5fXyh0aW9uKToKKyAgICAgICAgICAgcGFzcyIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYoZnVuYykKKworICAgIGRlZiB0ZXN0X2NsYXNzX25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAga2xhc3MgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBLbGFzcyhvYmplY3QpOgorICAgICAgICAgICBwYXNzIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoIm1pc3NpbmctY2xhc3MtZG9jc3RyaW5nIiwgbm9kZT1rbGFzcykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihrbGFzcykKKworICAgIGRlZiB0ZXN0X2lubmVyX2Z1bmN0aW9uX25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jKHRpb24pOgorICAgICAgICAgICAgXCIiIkRvY3VtZW50ZWRcIiIiCisgICAgICAgICAgICBkZWYgaW5uZXIoZnVuKToKKyAgICAgICAgICAgICAgICAjIE5vdCBkb2N1bWVudGVkCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKGZ1bmMpCisKKworY2xhc3MgVGVzdE5hbWVDaGVja2VyKENoZWNrZXJUZXN0Q2FzZSk6CisgICAgQ0hFQ0tFUl9DTEFTUzogVHlwZSA9IGJhc2UuTmFtZUNoZWNrZXIKKyAgICBDT05GSUc6IERpY3QgPSB7ImJhZF9uYW1lcyI6IHNldCgpfQorCisgICAgQHNldF9jb25maWcoCisgICAgICAgIGF0dHJfcmd4PXJlLmNvbXBpbGUoIltBLVpdKyIpLAorICAgICAgICBwcm9wZXJ0eV9jbGFzc2VzPSgiYWJjLmFic3RyYWN0cHJvcGVydHkiLCAiLmN1c3RvbV9wcm9wIiksCisgICAgKQorICAgIGRlZiB0ZXN0X3Byb3BlcnR5X25hbWVzKHNlbGYpOgorICAgICAgICAjIElmIGEgbWV0aG9kIGlzIGFubm90YXRlZCB3aXRoIEBwcm9wZXJ0eSwgaXRzIG5hbWUgc2hvdWxkCisgICAgICAgICMgbWF0Y2ggdGhlIGF0dHIgcmVnZXguIFNpbmNlIGJ5IGRlZmF1bHQgdGhlIGF0dHJpYnV0ZSByZWdleCBpcyB0aGUgc2FtZQorICAgICAgICAjIGFzIHRoZSBtZXRob2QgcmVnZXgsIHdlIG92ZXJyaWRlIGl0IGhlcmUuCisgICAgICAgIG1ldGhvZHMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgYWJjCisKKyAgICAgICAgZGVmIGN1c3RvbV9wcm9wKGYpOgorICAgICAgICAgIHJldHVybiBwcm9wZXJ0eShmKQorCisgICAgICAgIGNsYXNzIEZvb0NsYXNzKG9iamVjdCk6CisgICAgICAgICAgQHByb3BlcnR5CisgICAgICAgICAgZGVmIEZPTyhzZWxmKTogI0AKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgIGRlZiBiYXIoc2VsZik6ICNACisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKKyAgICAgICAgICBkZWYgQkFaKHNlbGYpOiAjQAorICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgQGN1c3RvbV9wcm9wCisgICAgICAgICAgZGVmIFFVWChzZWxmKTogI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihtZXRob2RzWzBdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG1ldGhvZHNbMl0pCisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobWV0aG9kc1szXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgImludmFsaWQtbmFtZSIsCisgICAgICAgICAgICAgICAgbm9kZT1tZXRob2RzWzFdLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJBdHRyaWJ1dGUiLCAiYmFyIiwgIidbQS1aXSsnIHBhdHRlcm4iKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihtZXRob2RzWzFdKQorCisgICAgQHNldF9jb25maWcoYXR0cl9yZ3g9cmUuY29tcGlsZSgiW0EtWl0rIikpCisgICAgZGVmIHRlc3RfcHJvcGVydHlfc2V0dGVycyhzZWxmKToKKyAgICAgICAgbWV0aG9kID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vQ2xhc3Mob2JqZWN0KToKKyAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICBkZWYgZm9vKHNlbGYpOiBwYXNzCisKKyAgICAgICAgICBAZm9vLnNldHRlcgorICAgICAgICAgIGRlZiBGT09TRVRURVIoc2VsZik6ICNACisgICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG1ldGhvZCkKKworICAgIGRlZiB0ZXN0X21vZHVsZV9sZXZlbF9uYW1lcyhzZWxmKToKKyAgICAgICAgYXNzaWduID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGNvbGxlY3Rpb25zCisgICAgICAgIENsYXNzID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgiYSIsICgiYiIsICJjIikpICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXNzaWdubmFtZShhc3NpZ24udGFyZ2V0c1swXSkKKworICAgICAgICBhc3NpZ24gPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0Eob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgQ2xhc3NCID0gQ2xhc3NBCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXNzaWdubmFtZShhc3NpZ24udGFyZ2V0c1swXSkKKworICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBBKCk6CisgICAgICAgICAgcmV0dXJuIDEsIDIsIDMKKyAgICAgICAgQ09OU1RBLCBDT05TVEIsIENPTlNUQyA9IEEoKQorICAgICAgICBDT05TVEQgPSBBKCkiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Fzc2lnbm5hbWUobW9kdWxlLmJvZHlbMV0udGFyZ2V0c1swXS5lbHRzWzBdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Fzc2lnbm5hbWUobW9kdWxlLmJvZHlbMl0udGFyZ2V0c1swXSkKKworICAgICAgICBhc3NpZ24gPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBDT05TVCA9ICIxMiAzNCAiLnJzdHJpcCgpLnNwbGl0KCkiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Fzc2lnbm5hbWUoYXNzaWduLnRhcmdldHNbMF0pCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDcpLCByZWFzb249Ik5lZWRzIFB5dGhvbiAzLjYgb3IgZWFybGllciIpCisgICAgQHNldF9jb25maWcoY29uc3Rfcmd4PXJlLmNvbXBpbGUoIi4rIikpCisgICAgQHNldF9jb25maWcoZnVuY3Rpb25fcmd4PXJlLmNvbXBpbGUoIi4rIikpCisgICAgQHNldF9jb25maWcoY2xhc3Nfcmd4PXJlLmNvbXBpbGUoIi4rIikpCisgICAgZGVmIHRlc3RfYXNzaWduX3RvX25ld19rZXl3b3JkX3B5MyhzZWxmKToKKyAgICAgICAgYXN0ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYXN5bmMgPSAiZm9vIiAgI0AKKyAgICAgICAgYXdhaXQgPSAiYmFyIiAgI0AKKyAgICAgICAgZGVmIGFzeW5jKCk6ICAgI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgYXN5bmM6ICAgI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJhc3NpZ24tdG8tbmV3LWtleXdvcmQiLAorICAgICAgICAgICAgICAgIG5vZGU9YXN0WzBdLnRhcmdldHNbMF0sCisgICAgICAgICAgICAgICAgYXJncz0oImFzeW5jIiwgIjMuNyIpLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Fzc2lnbm5hbWUoYXN0WzBdLnRhcmdldHNbMF0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iYXNzaWduLXRvLW5ldy1rZXl3b3JkIiwKKyAgICAgICAgICAgICAgICBub2RlPWFzdFsxXS50YXJnZXRzWzBdLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJhd2FpdCIsICIzLjciKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hc3NpZ25uYW1lKGFzdFsxXS50YXJnZXRzWzBdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImFzc2lnbi10by1uZXcta2V5d29yZCIsIG5vZGU9YXN0WzJdLCBhcmdzPSgiYXN5bmMiLCAiMy43IikpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYoYXN0WzJdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImFzc2lnbi10by1uZXcta2V5d29yZCIsIG5vZGU9YXN0WzNdLCBhcmdzPSgiYXN5bmMiLCAiMy43IikpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYoYXN0WzNdKQorCisKK2NsYXNzIFRlc3RNdWx0aU5hbWluZ1N0eWxlKENoZWNrZXJUZXN0Q2FzZSk6CisgICAgQ0hFQ0tFUl9DTEFTUyA9IGJhc2UuTmFtZUNoZWNrZXIKKworICAgIE1VTFRJX1NUWUxFX1JFID0gcmUuY29tcGlsZSgiKD86KD9QPFVQPltBLVpdKyl8KD9QPGRvd24+W2Etel0rKSkkIikKKworICAgIEBzZXRfY29uZmlnKGNsYXNzX3JneD1NVUxUSV9TVFlMRV9SRSkKKyAgICBkZWYgdGVzdF9tdWx0aV9uYW1lX2RldGVjdGlvbl9tYWpvcml0eShzZWxmKToKKyAgICAgICAgY2xhc3NlcyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIGNsYXNzYihvYmplY3QpOiAjQAorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDTEFTU0Eob2JqZWN0KTogI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQ0xBU1NDKG9iamVjdCk6ICNACisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKAorICAgICAgICAgICAgImludmFsaWQtbmFtZSIsCisgICAgICAgICAgICBub2RlPWNsYXNzZXNbMF0sCisgICAgICAgICAgICBhcmdzPSgiQ2xhc3MiLCAiY2xhc3NiIiwgIicoPzooP1A8VVA+W0EtWl0rKXwoP1A8ZG93bj5bYS16XSspKSQnIHBhdHRlcm4iKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgY2xzID0gTm9uZQorICAgICAgICAgICAgZm9yIGNscyBpbiBjbGFzc2VzOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihjbHMpCisgICAgICAgICAgICBpZiBjbHM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLmxlYXZlX21vZHVsZShjbHMucm9vdCkKKworICAgIEBzZXRfY29uZmlnKGNsYXNzX3JneD1NVUxUSV9TVFlMRV9SRSkKKyAgICBkZWYgdGVzdF9tdWx0aV9uYW1lX2RldGVjdGlvbl9maXJzdF9pbnZhbGlkKHNlbGYpOgorICAgICAgICBjbGFzc2VzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgY2xhc3NfYShvYmplY3QpOiAjQAorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBjbGFzc2Iob2JqZWN0KTogI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQ0xBU1NDKG9iamVjdCk6ICNACisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2VzID0gWworICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW52YWxpZC1uYW1lIiwKKyAgICAgICAgICAgICAgICBub2RlPWNsYXNzZXNbMF0sCisgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICJDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICJjbGFzc19hIiwKKyAgICAgICAgICAgICAgICAgICAgIicoPzooP1A8VVA+W0EtWl0rKXwoP1A8ZG93bj5bYS16XSspKSQnIHBhdHRlcm4iLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW52YWxpZC1uYW1lIiwKKyAgICAgICAgICAgICAgICBub2RlPWNsYXNzZXNbMl0sCisgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICJDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICJDTEFTU0MiLAorICAgICAgICAgICAgICAgICAgICAiJyg/Oig/UDxVUD5bQS1aXSspfCg/UDxkb3duPlthLXpdKykpJCcgcGF0dGVybiIsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICksCisgICAgICAgIF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygqbWVzc2FnZXMpOgorICAgICAgICAgICAgY2xzID0gTm9uZQorICAgICAgICAgICAgZm9yIGNscyBpbiBjbGFzc2VzOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihjbHMpCisgICAgICAgICAgICBpZiBjbHM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLmxlYXZlX21vZHVsZShjbHMucm9vdCkKKworICAgIEBzZXRfY29uZmlnKAorICAgICAgICBtZXRob2Rfcmd4PU1VTFRJX1NUWUxFX1JFLAorICAgICAgICBmdW5jdGlvbl9yZ3g9TVVMVElfU1RZTEVfUkUsCisgICAgICAgIG5hbWVfZ3JvdXA9KCJmdW5jdGlvbjptZXRob2QiLCksCisgICAgKQorICAgIGRlZiB0ZXN0X211bHRpX25hbWVfZGV0ZWN0aW9uX2dyb3VwKHNlbGYpOgorICAgICAgICBmdW5jdGlvbl9kZWZzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRmlyc3Qob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmdW5jKHNlbGYpOiAjQAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgRlVOQygpOiAjQAorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIsCisgICAgICAgICAgICBtb2R1bGVfbmFtZT0idGVzdCIsCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAiaW52YWxpZC1uYW1lIiwKKyAgICAgICAgICAgIG5vZGU9ZnVuY3Rpb25fZGVmc1sxXSwKKyAgICAgICAgICAgIGFyZ3M9KCJGdW5jdGlvbiIsICJGVU5DIiwgIicoPzooP1A8VVA+W0EtWl0rKXwoP1A8ZG93bj5bYS16XSspKSQnIHBhdHRlcm4iKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgZnVuYyA9IE5vbmUKKyAgICAgICAgICAgIGZvciBmdW5jIGluIGZ1bmN0aW9uX2RlZnM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKGZ1bmMpCisgICAgICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci5sZWF2ZV9tb2R1bGUoZnVuYy5yb290KQorCisgICAgQHNldF9jb25maWcoCisgICAgICAgIGZ1bmN0aW9uX3JneD1yZS5jb21waWxlKCIoPzooP1A8aWdub3JlPkZPTyl8KD9QPFVQPltBLVpdKyl8KD9QPGRvd24+W2Etel0rKSkkIikKKyAgICApCisgICAgZGVmIHRlc3RfbXVsdGlfbmFtZV9kZXRlY3Rpb25fZXhlbXB0KHNlbGYpOgorICAgICAgICBmdW5jdGlvbl9kZWZzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIEZPTygpOiAjQAorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgbG93ZXIoKTogI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIEZPTygpOiAjQAorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgVVBQRVIoKTogI0AKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAiaW52YWxpZC1uYW1lIiwKKyAgICAgICAgICAgIG5vZGU9ZnVuY3Rpb25fZGVmc1szXSwKKyAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICJGdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgIlVQUEVSIiwKKyAgICAgICAgICAgICAgICAiJyg/Oig/UDxpZ25vcmU+Rk9PKXwoP1A8VVA+W0EtWl0rKXwoP1A8ZG93bj5bYS16XSspKSQnIHBhdHRlcm4iLAorICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgZnVuYyA9IE5vbmUKKyAgICAgICAgICAgIGZvciBmdW5jIGluIGZ1bmN0aW9uX2RlZnM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKGZ1bmMpCisgICAgICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci5sZWF2ZV9tb2R1bGUoZnVuYy5yb290KQorCisKK2NsYXNzIFRlc3RDb21wYXJpc29uKENoZWNrZXJUZXN0Q2FzZSk6CisgICAgQ0hFQ0tFUl9DTEFTUyA9IGJhc2UuQ29tcGFyaXNvbkNoZWNrZXIKKworICAgIGRlZiB0ZXN0X2NvbXBhcmlzb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgiZm9vID09IFRydWUiKQorICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgKKyAgICAgICAgICAgICJzaW5nbGV0b24tY29tcGFyaXNvbiIsCisgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAiJ2ZvbyA9PSBUcnVlJyIsCisgICAgICAgICAgICAgICAgIidmb28gaXMgVHJ1ZScgaWYgY2hlY2tpbmcgZm9yIHRoZSBzaW5nbGV0b24gdmFsdWUgVHJ1ZSwgb3IgJ2Jvb2woZm9vKScgaWYgdGVzdGluZyBmb3IgdHJ1dGhpbmVzcyIsCisgICAgICAgICAgICApLAorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY29tcGFyZShub2RlKQorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgiZm9vID09IEZhbHNlIikKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAic2luZ2xldG9uLWNvbXBhcmlzb24iLAorICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgIidmb28gPT0gRmFsc2UnIiwKKyAgICAgICAgICAgICAgICAiJ2ZvbyBpcyBGYWxzZScgaWYgY2hlY2tpbmcgZm9yIHRoZSBzaW5nbGV0b24gdmFsdWUgRmFsc2UsIG9yICdub3QgZm9vJyBpZiB0ZXN0aW5nIGZvciBmYWxzaW5lc3MiLAorICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NvbXBhcmUobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoImZvbyA9PSBOb25lIikKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAic2luZ2xldG9uLWNvbXBhcmlzb24iLCBub2RlPW5vZGUsIGFyZ3M9KCInZm9vID09IE5vbmUnIiwgIidmb28gaXMgTm9uZSciKQorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY29tcGFyZShub2RlKQorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgiZm9vIGlzIGZsb2F0KCduYW4nKSIpCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKAorICAgICAgICAgICAgIm5hbi1jb21wYXJpc29uIiwKKyAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgIGFyZ3M9KCInZm9vIGlzIGZsb2F0KCduYW4nKSciLCAiJ21hdGguaXNuYW4oZm9vKSciKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NvbXBhcmUobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG51bXB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbyAhPSBudW1weS5OYU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAibmFuLWNvbXBhcmlzb24iLAorICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgYXJncz0oIidmb28gIT0gbnVtcHkuTmFOJyIsICInbm90IG1hdGguaXNuYW4oZm9vKSciKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NvbXBhcmUobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5tcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb28gaXMgbm90IG5tcC5OYU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAibmFuLWNvbXBhcmlzb24iLAorICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgYXJncz0oIidmb28gaXMgbm90IG5tcC5OYU4nIiwgIidub3QgbWF0aC5pc25hbihmb28pJyIpLAorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY29tcGFyZShub2RlKQorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgiVHJ1ZSA9PSBmb28iKQorICAgICAgICBtZXNzYWdlcyA9ICgKKyAgICAgICAgICAgIE1lc3NhZ2UoIm1pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50Iiwgbm9kZT1ub2RlLCBhcmdzPSgiZm9vID09IFRydWUiLCkpLAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAic2luZ2xldG9uLWNvbXBhcmlzb24iLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgIidUcnVlID09IGZvbyciLAorICAgICAgICAgICAgICAgICAgICAiJ1RydWUgaXMgZm9vJyBpZiBjaGVja2luZyBmb3IgdGhlIHNpbmdsZXRvbiB2YWx1ZSBUcnVlLCBvciAnYm9vbChmb28pJyBpZiB0ZXN0aW5nIGZvciB0cnV0aGluZXNzIiwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSwKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKCptZXNzYWdlcyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY29tcGFyZShub2RlKQorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgiRmFsc2UgPT0gZm9vIikKKyAgICAgICAgbWVzc2FnZXMgPSAoCisgICAgICAgICAgICBNZXNzYWdlKCJtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudCIsIG5vZGU9bm9kZSwgYXJncz0oImZvbyA9PSBGYWxzZSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJzaW5nbGV0b24tY29tcGFyaXNvbiIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAiJ0ZhbHNlID09IGZvbyciLAorICAgICAgICAgICAgICAgICAgICAiJ0ZhbHNlIGlzIGZvbycgaWYgY2hlY2tpbmcgZm9yIHRoZSBzaW5nbGV0b24gdmFsdWUgRmFsc2UsIG9yICdub3QgZm9vJyBpZiB0ZXN0aW5nIGZvciBmYWxzaW5lc3MiLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoKm1lc3NhZ2VzKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jb21wYXJlKG5vZGUpCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKCJOb25lID09IGZvbyIpCisgICAgICAgIG1lc3NhZ2VzID0gKAorICAgICAgICAgICAgTWVzc2FnZSgibWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQiLCBub2RlPW5vZGUsIGFyZ3M9KCJmb28gPT0gTm9uZSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJzaW5nbGV0b24tY29tcGFyaXNvbiIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KCInTm9uZSA9PSBmb28nIiwgIidOb25lIGlzIGZvbyciKSwKKyAgICAgICAgICAgICksCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygqbWVzc2FnZXMpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NvbXBhcmUobm9kZSkKKworCitjbGFzcyBUZXN0TmFtZVByZXNldHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIFNOQUtFX0NBU0VfTkFNRVMgPSB7InTDqXN0X3NuYWtlX2Nhc2UiLCAidGVzdF9zbmFrZV9jYXNlMTEiLCAidGVzdF9odHRwc18yMDAifQorICAgIENBTUVMX0NBU0VfTkFNRVMgPSB7InTDqXN0Q2FtZWxDYXNlIiwgInRlc3RDYW1lbENhc2UxMSIsICJ0ZXN0SFRUUDIwMCJ9CisgICAgVVBQRVJfQ0FTRV9OQU1FUyA9IHsiVMOJU1RfVVBQRVJfQ0FTRSIsICJURVNUX1VQUEVSX0NBU0UxMSIsICJURVNUX0hUVFBfMjAwIn0KKyAgICBQQVNDQUxfQ0FTRV9OQU1FUyA9IHsiVMOpc3RQYXNjYWxDYXNlIiwgIlRlc3RQYXNjYWxDYXNlMTEiLCAiVGVzdEhUVFAyMDAifQorICAgIEFMTF9OQU1FUyA9ICgKKyAgICAgICAgU05BS0VfQ0FTRV9OQU1FUyB8IENBTUVMX0NBU0VfTkFNRVMgfCBVUFBFUl9DQVNFX05BTUVTIHwgUEFTQ0FMX0NBU0VfTkFNRVMKKyAgICApCisKKyAgICBkZWYgX3Rlc3RfbmFtZV9pc19jb3JyZWN0X2Zvcl9hbGxfbmFtZV90eXBlcyhzZWxmLCBuYW1pbmdfc3R5bGUsIG5hbWUpOgorICAgICAgICBmb3IgbmFtZV90eXBlIGluIGJhc2UuS05PV05fTkFNRV9UWVBFUzoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfaXNfY29ycmVjdChuYW1pbmdfc3R5bGUsIG5hbWUsIG5hbWVfdHlwZSkKKworICAgIGRlZiBfdGVzdF9uYW1lX2lzX2luY29ycmVjdF9mb3JfYWxsX25hbWVfdHlwZXMoc2VsZiwgbmFtaW5nX3N0eWxlLCBuYW1lKToKKyAgICAgICAgZm9yIG5hbWVfdHlwZSBpbiBiYXNlLktOT1dOX05BTUVfVFlQRVM6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2lzX2luY29ycmVjdChuYW1pbmdfc3R5bGUsIG5hbWUsIG5hbWVfdHlwZSkKKworICAgIGRlZiBfdGVzdF9zaG91bGRfYWx3YXlzX3Bhc3Moc2VsZiwgbmFtaW5nX3N0eWxlKToKKyAgICAgICAgYWx3YXlzX3Bhc3NfZGF0YSA9IFsKKyAgICAgICAgICAgICgiX19hZGRfXyIsICJtZXRob2QiKSwKKyAgICAgICAgICAgICgiX19zZXRfbmFtZV9fIiwgIm1ldGhvZCIpLAorICAgICAgICAgICAgKCJfX3ZlcnNpb25fXyIsICJjb25zdCIpLAorICAgICAgICAgICAgKCJfX2F1dGhvcl9fIiwgImNvbnN0IiksCisgICAgICAgIF0KKyAgICAgICAgZm9yIG5hbWUsIG5hbWVfdHlwZSBpbiBhbHdheXNfcGFzc19kYXRhOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9pc19jb3JyZWN0KG5hbWluZ19zdHlsZSwgbmFtZSwgbmFtZV90eXBlKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfdGVzdF9pc19jb3JyZWN0KG5hbWluZ19zdHlsZSwgbmFtZSwgbmFtZV90eXBlKToKKyAgICAgICAgcmd4ID0gbmFtaW5nX3N0eWxlLmdldF9yZWdleChuYW1lX3R5cGUpCisgICAgICAgIGZhaWwgPSBmIntuYW1lIXJ9IGRvZXMgbm90IG1hdGNoIHBhdHRlcm4ge3JneCFyfSAoc3R5bGU6IHtuYW1pbmdfc3R5bGV9LCB0eXBlOiB7bmFtZV90eXBlfSkiCisgICAgICAgIGFzc2VydCByZ3gubWF0Y2gobmFtZSksIGZhaWwKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX3Rlc3RfaXNfaW5jb3JyZWN0KG5hbWluZ19zdHlsZSwgbmFtZSwgbmFtZV90eXBlKToKKyAgICAgICAgcmd4ID0gbmFtaW5nX3N0eWxlLmdldF9yZWdleChuYW1lX3R5cGUpCisgICAgICAgIGZhaWwgPSBmIntuYW1lIXJ9IG5vdCBtYXRjaCBwYXR0ZXJuIHtyZ3ghcn0gKHN0eWxlOiB7bmFtaW5nX3N0eWxlfSwgdHlwZToge25hbWVfdHlwZX0pIgorICAgICAgICBhc3NlcnQgbm90IHJneC5tYXRjaChuYW1lKSwgZmFpbAorCisgICAgZGVmIHRlc3Rfc25ha2VfY2FzZShzZWxmKToKKyAgICAgICAgbmFtaW5nX3N0eWxlID0gYmFzZS5TbmFrZUNhc2VTdHlsZQorCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuU05BS0VfQ0FTRV9OQU1FUzoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbmFtZV9pc19jb3JyZWN0X2Zvcl9hbGxfbmFtZV90eXBlcyhuYW1pbmdfc3R5bGUsIG5hbWUpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuQUxMX05BTUVTIC0gc2VsZi5TTkFLRV9DQVNFX05BTUVTOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9uYW1lX2lzX2luY29ycmVjdF9mb3JfYWxsX25hbWVfdHlwZXMobmFtaW5nX3N0eWxlLCBuYW1lKQorCisgICAgICAgIHNlbGYuX3Rlc3Rfc2hvdWxkX2Fsd2F5c19wYXNzKG5hbWluZ19zdHlsZSkKKworICAgIGRlZiB0ZXN0X2NhbWVsX2Nhc2Uoc2VsZik6CisgICAgICAgIG5hbWluZ19zdHlsZSA9IGJhc2UuQ2FtZWxDYXNlU3R5bGUKKworICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLkNBTUVMX0NBU0VfTkFNRVM6CisgICAgICAgICAgICBzZWxmLl90ZXN0X25hbWVfaXNfY29ycmVjdF9mb3JfYWxsX25hbWVfdHlwZXMobmFtaW5nX3N0eWxlLCBuYW1lKQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLkFMTF9OQU1FUyAtIHNlbGYuQ0FNRUxfQ0FTRV9OQU1FUzoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbmFtZV9pc19pbmNvcnJlY3RfZm9yX2FsbF9uYW1lX3R5cGVzKG5hbWluZ19zdHlsZSwgbmFtZSkKKworICAgICAgICBzZWxmLl90ZXN0X3Nob3VsZF9hbHdheXNfcGFzcyhuYW1pbmdfc3R5bGUpCisKKyAgICBkZWYgdGVzdF91cHBlcl9jYXNlKHNlbGYpOgorICAgICAgICBuYW1pbmdfc3R5bGUgPSBiYXNlLlVwcGVyQ2FzZVN0eWxlCisKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5VUFBFUl9DQVNFX05BTUVTOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9uYW1lX2lzX2NvcnJlY3RfZm9yX2FsbF9uYW1lX3R5cGVzKG5hbWluZ19zdHlsZSwgbmFtZSkKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5BTExfTkFNRVMgLSBzZWxmLlVQUEVSX0NBU0VfTkFNRVM6CisgICAgICAgICAgICBzZWxmLl90ZXN0X25hbWVfaXNfaW5jb3JyZWN0X2Zvcl9hbGxfbmFtZV90eXBlcyhuYW1pbmdfc3R5bGUsIG5hbWUpCisgICAgICAgIHNlbGYuX3Rlc3RfbmFtZV9pc19pbmNvcnJlY3RfZm9yX2FsbF9uYW1lX3R5cGVzKG5hbWluZ19zdHlsZSwgIlVQUEVSY2FzZSIpCisKKyAgICAgICAgc2VsZi5fdGVzdF9zaG91bGRfYWx3YXlzX3Bhc3MobmFtaW5nX3N0eWxlKQorCisgICAgZGVmIHRlc3RfcGFzY2FsX2Nhc2Uoc2VsZik6CisgICAgICAgIG5hbWluZ19zdHlsZSA9IGJhc2UuUGFzY2FsQ2FzZVN0eWxlCisKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5QQVNDQUxfQ0FTRV9OQU1FUzoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbmFtZV9pc19jb3JyZWN0X2Zvcl9hbGxfbmFtZV90eXBlcyhuYW1pbmdfc3R5bGUsIG5hbWUpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuQUxMX05BTUVTIC0gc2VsZi5QQVNDQUxfQ0FTRV9OQU1FUzoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbmFtZV9pc19pbmNvcnJlY3RfZm9yX2FsbF9uYW1lX3R5cGVzKG5hbWluZ19zdHlsZSwgbmFtZSkKKworICAgICAgICBzZWxmLl90ZXN0X3Nob3VsZF9hbHdheXNfcGFzcyhuYW1pbmdfc3R5bGUpCisKKworY2xhc3MgVGVzdEJhc2VDaGVja2VyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9kb2Moc2VsZik6CisgICAgICAgIGNsYXNzIE90aGVyQmFzaWNDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAgICAgICAgIG5hbWUgPSAiYmFzaWMiCisgICAgICAgICAgICBtc2dzID0geworICAgICAgICAgICAgICAgICJXMDAwMSI6ICgKKyAgICAgICAgICAgICAgICAgICAgIkJhc2ljIGNoZWNrZXIgaGFzIGFuIGV4YW1wbGUuIiwKKyAgICAgICAgICAgICAgICAgICAgImJhc2ljLWNoZWNrZXItZXhhbXBsZSIsCisgICAgICAgICAgICAgICAgICAgICJVc2VkIG5vd2hlcmUgYW5kIHNlcnZlcyBubyBwdXJwb3NlLiIsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorCisgICAgICAgIGNsYXNzIExlc3NCYXNpY0NoZWNrZXIoT3RoZXJCYXNpY0NoZWNrZXIpOgorICAgICAgICAgICAgb3B0aW9ucyA9ICgKKyAgICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICAgICJleGFtcGxlLWFyZ3MiLAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhdmFyIjogIjxpbnQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwIjogIkV4YW1wbGUgb2YgaW50ZWdlciBhcmd1bWVudCBmb3IgdGhlIGNoZWNrZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKQorCisgICAgICAgIGJhc2ljID0gT3RoZXJCYXNpY0NoZWNrZXIoKQorICAgICAgICBleHBlY3RlZF9iZWdpbm5pbmcgPSAiIiJcCitCYXNpYyBjaGVja2VyCit+fn5+fn5+fn5+fn5+CisKK1ZlcmJhdGltIG5hbWUgb2YgdGhlIGNoZWNrZXIgaXMgYGBiYXNpY2BgLgorCisiIiIKKyAgICAgICAgZXhwZWN0ZWRfbWlkZGxlID0gIiIiXAorQmFzaWMgY2hlY2tlciBPcHRpb25zCiteXl5eXl5eXl5eXl5eXl5eXl5eXl4KKzpleGFtcGxlLWFyZ3M6CisgIEV4YW1wbGUgb2YgaW50ZWdlciBhcmd1bWVudCBmb3IgdGhlIGNoZWNrZXIuCisKKyAgRGVmYXVsdDogYGA0MmBgCisKKyIiIgorICAgICAgICBleHBlY3RlZF9lbmQgPSAiIiJcCitCYXNpYyBjaGVja2VyIE1lc3NhZ2VzCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eCis6YmFzaWMtY2hlY2tlci1leGFtcGxlIChXMDAwMSk6ICpCYXNpYyBjaGVja2VyIGhhcyBhbiBleGFtcGxlLioKKyAgVXNlZCBub3doZXJlIGFuZCBzZXJ2ZXMgbm8gcHVycG9zZS4KKworCisiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYmFzaWMpLCBleHBlY3RlZF9iZWdpbm5pbmcgKyBleHBlY3RlZF9lbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihiYXNpYyksICJDaGVja2VyICdiYXNpYycgKHJlc3BvbnNpYmxlIGZvciAnVzAwMDEnKSIpCisgICAgICAgIGxlc3NfYmFzaWMgPSBMZXNzQmFzaWNDaGVja2VyKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc3RyKGxlc3NfYmFzaWMpLCBleHBlY3RlZF9iZWdpbm5pbmcgKyBleHBlY3RlZF9taWRkbGUgKyBleHBlY3RlZF9lbmQKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIobGVzc19iYXNpYyksIHJlcHIoYmFzaWMpKQorCisKK2NsYXNzIFRlc3ROb1NpeCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQHVuaXR0ZXN0LnNraXAoInRvbyBtYW55IGRlcGVuZGVuY2llcyBuZWVkIHNpeCA6KCIpCisgICAgZGVmIHRlc3Rfbm9fc2l4KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYXNfc2l4ID0gVHJ1ZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBoYXNfc2l4ID0gRmFsc2UKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc19zaXgsICJweWxpbnQgbXVzdCBiZSBhYmxlIHRvIHJ1biB3aXRob3V0IHNpeCIpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9jbGFzc2VzLnB5IGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfY2xhc3Nlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FjMDJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfY2xhc3Nlcy5weQpAQCAtMCwwICsxLDI0NSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEJyeWNlIEd1aW50YSA8YnJ5Y2UucGF1bC5ndWludGFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggc3NvbGFua2kgPHN1c2hvYmhpdHNvbGFua2lAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIHl1c2hhbzIgPDM2ODQ4NDcyK3l1c2hhbzJAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgdGlhZ29ob25vcmF0byA8NjEwNTkyNDMrdGlhZ29ob25vcmF0b0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVW5pdCB0ZXN0cyBmb3IgdGhlIHZhcmlhYmxlcyBjaGVja2VyLiIiIgoraW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IGNsYXNzZXMKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBzZXRfY29uZmlnCisKKworY2xhc3MgVGVzdFZhcmlhYmxlc0NoZWNrZXIoQ2hlY2tlclRlc3RDYXNlKToKKworICAgIENIRUNLRVJfQ0xBU1MgPSBjbGFzc2VzLkNsYXNzQ2hlY2tlcgorCisgICAgZGVmIHRlc3RfYml0YnVja2V0X2lzc3VlXzE2NChzZWxmKToKKyAgICAgICAgIiIiSXNzdWUgMTY0IHJlcG9ydCBhIGZhbHNlIG5lZ2F0aXZlIGZvciBhY2Nlc3MtbWVtYmVyLWJlZm9yZS1kZWZpbml0aW9uIiIiCisgICAgICAgIG4xLCBuMiA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15Q2xhc3MxOgorICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgKz0gNSAjQAorICAgICAgICAgICAgc2VsZi5maXJzdCA9IDAgICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKAorICAgICAgICAgICAgImFjY2Vzcy1tZW1iZXItYmVmb3JlLWRlZmluaXRpb24iLCBub2RlPW4xLnRhcmdldCwgYXJncz0oImZpcnN0IiwgbjIubGluZW5vKQorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLndhbGsobjEucm9vdCgpKQorCisgICAgQHNldF9jb25maWcoZXhjbHVkZV9wcm90ZWN0ZWQ9KCJfbWV0YSIsICJfbWFuYWdlciIpKQorICAgIGRlZiB0ZXN0X2V4Y2x1ZGVfcHJvdGVjdGVkKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgZXhjbHVkZS1wcm90ZWN0ZWQgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgZXhjbHVkZSBuYW1lcyBmcm9tIHByb3RlY3RlZC1hY2Nlc3Mgd2FybmluZy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgUHJvdGVjdGVkOgorICAgICAgICAgICAgJycnZW1wdHknJycKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXRhID0gNDIKKyAgICAgICAgICAgICAgICBzZWxmLl9tYW5hZ2VyID0gMjQKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXRhID0gMjkKKyAgICAgICAgT0JKID0gUHJvdGVjdGVkKCkKKyAgICAgICAgT0JKLl9tZXRhCisgICAgICAgIE9CSi5fbWFuYWdlcgorICAgICAgICBPQkouX3RldGEKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoInByb3RlY3RlZC1hY2Nlc3MiLCBub2RlPW5vZGUuYm9keVstMV0udmFsdWUsIGFyZ3M9Il90ZXRhIikKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhub2RlLnJvb3QoKSkKKworICAgIGRlZiB0ZXN0X3JlZ3Jlc3Npb25fbm9uX3BhcmVudF9pbml0X2NhbGxlZF90cmFjZW1hbGxvYyhzZWxmKToKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gcmFpc2UgYSBub24tcGFyZW50LWluaXQtY2FsbGVkIG9uIFB5bGludCAxLjMKKyAgICAgICAgIyBTZWUgaXNzdWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL2xvZ2lsYWIvcHlsaW50L2lzc3VlLzMwOC8KKyAgICAgICAgIyBmb3IgcmVmZXJlbmNlLgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSB0cmFjZW1hbGxvYyBpbXBvcnQgU2VxdWVuY2UKKyAgICAgICAgY2xhc3MgX1RyYWNlcyhTZXF1ZW5jZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhY2VzKTogI0AKKyAgICAgICAgICAgICAgICBTZXF1ZW5jZS5fX2luaXRfXyhzZWxmKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9zdXBlcl9pbml0X25vdF9jYWxsZWRfcmVncmVzc2lvbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHNob3VsZCBub3QgZW1pdCBhIHN1cGVyLWluaXQtbm90LWNhbGxlZAorICAgICAgICAjIHdhcm5pbmcuIEl0IHByZXZpb3VzbHkgZGlkIHRoaXMsIGJlY2F1c2UKKyAgICAgICAgIyBgYG5leHQobm9kZS5pbmZlcigpKWBgIHdhcyB1c2VkIGluIHRoYXQgY2hlY2tlcidzCisgICAgICAgICMgbG9naWMgYW5kIHRoZSBmaXJzdCBpbmZlcnJlZCBub2RlIHdhcyBhbiBVbmluZmVyYWJsZSBvYmplY3QsCisgICAgICAgICMgbGVhZGluZyB0byB0aGlzIGZhbHNlIHBvc2l0aXZlLgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGN0eXBlcworCisgICAgICAgIGNsYXNzIEZvbyhjdHlwZXMuQmlnRW5kaWFuU3RydWN0dXJlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICBjdHlwZXMuQmlnRW5kaWFuU3RydWN0dXJlLl9faW5pdF9fKHNlbGYpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3VuaW5mZXJhYmxlX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHByb3RlY3QtYWNjZXNzIGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIFVuaW5mZXJhYmxlIGF0dHJpYnV0ZXMiIiIKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgTUMoKToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIG5hcmdzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxIGlmIHNlbGYuX25hcmdzIGVsc2UgMgorCisgICAgICAgIGNsYXNzIEFwcGxpY2F0aW9uKG1ldGFjbGFzcz1NQyk6CisgICAgICAgICAgICBkZWYgX19ub19zcGVjaWFsX18oY2xzKToKKyAgICAgICAgICAgICAgICBuYXJncyA9IG9iai5fbmFyZ3MgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoInByb3RlY3RlZC1hY2Nlc3MiLCBub2RlPW5vZGUudmFsdWUsIGFyZ3M9Il9uYXJncyIpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUudmFsdWUpCisKKyAgICBAc2V0X2NvbmZpZyhjaGVja19wcm90ZWN0ZWRfYWNjZXNzX2luX3NwZWNpYWxfbWV0aG9kcz1UcnVlKQorICAgIGRlZiB0ZXN0X2NoZWNrX3Byb3RlY3RlZF9hY2Nlc3NfaW5fc3BlY2lhbF9tZXRob2RzKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgY2hlY2stcHJvdGVjdGVkLWFjY2Vzcy1pbi1zcGVjaWFsLW1ldGhvZHMgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgdHJpZ2dlciBwcm90ZWN0ZWQtYWNjZXNzIG1lc3NhZ2UgZW1pc3Npb24gZm9yIHNpbmdsZSB1bmRlcnNjb3JlIHByZWZpeGVkIG5hbWVzCisgICAgICAgIGluc2lkZSBzcGVjaWFsIG1ldGhvZHMKKyAgICAgICAgIiIiCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgUHJvdGVjdGVkOgorICAgICAgICAgICAgJycnZW1wdHknJycKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLl9wcm90ZWN0ZWQgPSA0MgorICAgICAgICAgICAgICAgIHNlbGYucHVibGljID0gIkEiCisgICAgICAgICAgICAgICAgc2VsZi5fX3ByaXZhdGUgPSBOb25lCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLl9wcm90ZWN0ZWQgPSBvdGhlci5fcHJvdGVjdGVkCisgICAgICAgICAgICBkZWYgX2Zha2Vfc3BlY2lhbF8oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGEgPSBvdGhlci5wdWJsaWMKKyAgICAgICAgICAgICAgICBzZWxmLnB1YmxpYyA9IG90aGVyLl9wcm90ZWN0ZWQKKyAgICAgICAgICAgICAgICBzZWxmLl9fcHJpdmF0ZSA9IG90aGVyLl9fcHJpdmF0ZQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBjbGFzc2RlZiA9IG5vZGUuYm9keVstMV0KKyAgICAgICAgYXNzaWduX2F0dHJpYnV0ZV9pbl9lcSA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoIl9wcm90ZWN0ZWQiKVstMV0KKyAgICAgICAgYXR0cmlidXRlX2luX2VxID0gbGlzdChhc3NpZ25fYXR0cmlidXRlX2luX2VxLmFzc2lnbmVkX3N0bXRzKCkpWy0xXQorICAgICAgICBhc3NpZ25fYXR0cmlidXRlX2luX2Zha2VfMSA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoInB1YmxpYyIpWy0xXQorICAgICAgICBhdHRyaWJ1dGVfaW5fZmFrZV8xID0gbGlzdChhc3NpZ25fYXR0cmlidXRlX2luX2Zha2VfMS5hc3NpZ25lZF9zdG10cygpKVstMV0KKyAgICAgICAgYXNzaWduX2F0dHJpYnV0ZV9pbl9mYWtlXzIgPSBjbGFzc2RlZi5pbnN0YW5jZV9hdHRyKCJfX3ByaXZhdGUiKVstMV0KKyAgICAgICAgYXR0cmlidXRlX2luX2Zha2VfMiA9IGxpc3QoYXNzaWduX2F0dHJpYnV0ZV9pbl9mYWtlXzIuYXNzaWduZWRfc3RtdHMoKSlbLTFdCisgICAgICAgIHVudXNlZF9wcml2YXRlX2F0dHJfMSA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoIl9fcHJpdmF0ZSIpWzBdCisgICAgICAgIHVudXNlZF9wcml2YXRlX2F0dHJfMiA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoIl9fcHJpdmF0ZSIpWzFdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKCJwcm90ZWN0ZWQtYWNjZXNzIiwgbm9kZT1hdHRyaWJ1dGVfaW5fZXEsIGFyZ3M9Il9wcm90ZWN0ZWQiKSwKKyAgICAgICAgICAgIE1lc3NhZ2UoInByb3RlY3RlZC1hY2Nlc3MiLCBub2RlPWF0dHJpYnV0ZV9pbl9mYWtlXzEsIGFyZ3M9Il9wcm90ZWN0ZWQiKSwKKyAgICAgICAgICAgIE1lc3NhZ2UoInByb3RlY3RlZC1hY2Nlc3MiLCBub2RlPWF0dHJpYnV0ZV9pbl9mYWtlXzIsIGFyZ3M9Il9fcHJpdmF0ZSIpLAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAidW51c2VkLXByaXZhdGUtbWVtYmVyIiwKKyAgICAgICAgICAgICAgICBub2RlPXVudXNlZF9wcml2YXRlX2F0dHJfMSwKKyAgICAgICAgICAgICAgICBhcmdzPSgiUHJvdGVjdGVkIiwgIl9fcHJpdmF0ZSIpLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgInVudXNlZC1wcml2YXRlLW1lbWJlciIsCisgICAgICAgICAgICAgICAgbm9kZT11bnVzZWRfcHJpdmF0ZV9hdHRyXzIsCisgICAgICAgICAgICAgICAgYXJncz0oIlByb3RlY3RlZCIsICJfX3ByaXZhdGUiKSwKKyAgICAgICAgICAgICksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLndhbGsobm9kZS5yb290KCkpCisKKyAgICBAc2V0X2NvbmZpZyhjaGVja19wcm90ZWN0ZWRfYWNjZXNzX2luX3NwZWNpYWxfbWV0aG9kcz1GYWxzZSkKKyAgICBkZWYgdGVzdF9jaGVja19wcm90ZWN0ZWRfYWNjZXNzX2luX3NwZWNpYWxfbWV0aG9kc19kZWFjdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IHdoZW4gY2hlY2stcHJvdGVjdGVkLWFjY2Vzcy1pbi1zcGVjaWFsLW1ldGhvZHMgaXMgRmFsc2UgKGRlZmF1bHQpCisgICAgICAgIG5vIHByb3RlY3RlZC1hY2Nlc3MgbWVzc2FnZSBlbWlzc2lvbiBmb3Igc2luZ2xlIHVuZGVyc2NvcmUgcHJlZml4ZWQgbmFtZXMKKyAgICAgICAgaW5zaWRlIHNwZWNpYWwgbWV0aG9kcyBvY2N1cgorICAgICAgICAiIiIKKworICAgICAgICBub2RlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBQcm90ZWN0ZWQ6CisgICAgICAgICAgICAnJydlbXB0eScnJworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb3RlY3RlZCA9IDQyCisgICAgICAgICAgICAgICAgc2VsZi5wdWJsaWMgPSAiQSIKKyAgICAgICAgICAgICAgICBzZWxmLl9fcHJpdmF0ZSA9IE5vbmUKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb3RlY3RlZCA9IG90aGVyLl9wcm90ZWN0ZWQKKyAgICAgICAgICAgIGRlZiBfZmFrZV9zcGVjaWFsXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgYSA9IG90aGVyLnB1YmxpYworICAgICAgICAgICAgICAgIHNlbGYucHVibGljID0gb3RoZXIuX3Byb3RlY3RlZAorICAgICAgICAgICAgICAgIHNlbGYuX19wcml2YXRlID0gb3RoZXIuX19wcml2YXRlCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGNsYXNzZGVmID0gbm9kZS5ib2R5Wy0xXQorICAgICAgICBhc3NpZ25fYXR0cmlidXRlX2luX2Zha2VfMSA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoInB1YmxpYyIpWy0xXQorICAgICAgICBhdHRyaWJ1dGVfaW5fZmFrZV8xID0gbGlzdChhc3NpZ25fYXR0cmlidXRlX2luX2Zha2VfMS5hc3NpZ25lZF9zdG10cygpKVstMV0KKyAgICAgICAgYXNzaWduX2F0dHJpYnV0ZV9pbl9mYWtlXzIgPSBjbGFzc2RlZi5pbnN0YW5jZV9hdHRyKCJfX3ByaXZhdGUiKVstMV0KKyAgICAgICAgYXR0cmlidXRlX2luX2Zha2VfMiA9IGxpc3QoYXNzaWduX2F0dHJpYnV0ZV9pbl9mYWtlXzIuYXNzaWduZWRfc3RtdHMoKSlbLTFdCisgICAgICAgIHVudXNlZF9wcml2YXRlX2F0dHJfMSA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoIl9fcHJpdmF0ZSIpWzBdCisgICAgICAgIHVudXNlZF9wcml2YXRlX2F0dHJfMiA9IGNsYXNzZGVmLmluc3RhbmNlX2F0dHIoIl9fcHJpdmF0ZSIpWzFdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKCJwcm90ZWN0ZWQtYWNjZXNzIiwgbm9kZT1hdHRyaWJ1dGVfaW5fZmFrZV8xLCBhcmdzPSJfcHJvdGVjdGVkIiksCisgICAgICAgICAgICBNZXNzYWdlKCJwcm90ZWN0ZWQtYWNjZXNzIiwgbm9kZT1hdHRyaWJ1dGVfaW5fZmFrZV8yLCBhcmdzPSJfX3ByaXZhdGUiKSwKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgInVudXNlZC1wcml2YXRlLW1lbWJlciIsCisgICAgICAgICAgICAgICAgbm9kZT11bnVzZWRfcHJpdmF0ZV9hdHRyXzEsCisgICAgICAgICAgICAgICAgYXJncz0oIlByb3RlY3RlZCIsICJfX3ByaXZhdGUiKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1bnVzZWQtcHJpdmF0ZS1tZW1iZXIiLAorICAgICAgICAgICAgICAgIG5vZGU9dW51c2VkX3ByaXZhdGVfYXR0cl8yLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJQcm90ZWN0ZWQiLCAiX19wcml2YXRlIiksCisgICAgICAgICAgICApLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi53YWxrKG5vZGUucm9vdCgpKQorCisgICAgZGVmIHRlc3RfcHJpdmF0ZV9hdHRyaWJ1dGVfaGlkZXNfbWV0aG9kKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIFBhcmVudDoKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19wcml2YXRlID0gTm9uZQorCisgICAgICAgICAgICBjbGFzcyBDaGlsZChQYXJlbnQpOgorICAgICAgICAgICAgICAgIGRlZiBfX3ByaXZhdGUoc2VsZik6ICNACisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3Byb3RlY3RlZF9hdHRyaWJ1dGVfaGlkZXNfbWV0aG9kKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIFBhcmVudDoKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb3RlY3RlZCA9IE5vbmUKKworICAgICAgICAgICAgY2xhc3MgQ2hpbGQoUGFyZW50KToKKyAgICAgICAgICAgICAgICBkZWYgX3Byb3RlY3RlZChzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKCJtZXRob2QtaGlkZGVuIiwgbm9kZT1ub2RlLCBhcmdzPSgiIiwgNCkpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfZGVwcmVjYXRlZC5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2RlcHJlY2F0ZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhMmJjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2RlcHJlY2F0ZWQucHkKQEAgLTAsMCArMSw1MjYgQEAKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlciwgRGVwcmVjYXRlZE1peGluCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBVTkRFRklORUQsIElBc3Ryb2lkQ2hlY2tlcgorZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBDaGVja2VyVGVzdENhc2UsIE1lc3NhZ2UKKworCitjbGFzcyBfRGVwcmVjYXRlZENoZWNrZXIoRGVwcmVjYXRlZE1peGluLCBCYXNlQ2hlY2tlcik6CisgICAgX19pbXBsZW1lbnRzX18gPSAoSUFzdHJvaWRDaGVja2VyLCkKKyAgICBuYW1lID0gImRlcHJlY2F0ZWQiCisKKyAgICBkZWYgZGVwcmVjYXRlZF9tZXRob2RzKHNlbGYpOgorICAgICAgICByZXR1cm4geyJkZXByZWNhdGVkX2Z1bmMiLCAiLkRlcHJlY2F0ZWQuZGVwcmVjYXRlZF9tZXRob2QifQorCisgICAgZGVmIGRlcHJlY2F0ZWRfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHsiZGVwcmVjYXRlZF9tb2R1bGUifQorCisgICAgZGVmIGRlcHJlY2F0ZWRfY2xhc3NlcyhzZWxmLCBtb2R1bGUpOgorICAgICAgICByZXR1cm4gWyJEZXByZWNhdGVkQ2xhc3MiXSBpZiBtb2R1bGUgPT0gImRlcHJlY2F0ZWQiIGVsc2UgW10KKworICAgIGRlZiBkZXByZWNhdGVkX2FyZ3VtZW50cyhzZWxmLCBtZXRob2QpOgorICAgICAgICBpZiBtZXRob2QgPT0gIm15ZnVuY3Rpb24xIjoKKyAgICAgICAgICAgICMgZGVmIG15ZnVuY3Rpb24xKGFyZzEsIGRlcHJlY2F0ZWRfYXJnMT0nc3BhbScpCisgICAgICAgICAgICByZXR1cm4gKCgxLCAiZGVwcmVjYXRlZF9hcmcxIiksKQorICAgICAgICBpZiBtZXRob2QgPT0gIm15ZnVuY3Rpb24yIjoKKyAgICAgICAgICAgICMgZGVmIG15ZnVuY3Rpb24yKGFyZzEsIGRlcHJlY2F0ZWRfYXJnMSwgYXJnMj0nZm9vJywgZGVwcmVjYXRlZF9hcmcyPSdzcGFtJykpCisgICAgICAgICAgICByZXR1cm4gKCgxLCAiZGVwcmVjYXRlZF9hcmcxIiksICgzLCAiZGVwcmVjYXRlZF9hcmcyIikpCisgICAgICAgIGlmIG1ldGhvZCA9PSAibXlmdW5jdGlvbjMiOgorICAgICAgICAgICAgIyBkZWYgbXlmdW5jdGlvbjEoYXJnMSwgKiwgZGVwcmVjYXRlZF9hcmcxPSdzcGFtJykKKyAgICAgICAgICAgIHJldHVybiAoKE5vbmUsICJkZXByZWNhdGVkX2FyZzEiKSwpCisgICAgICAgIGlmIG1ldGhvZCA9PSAiLk15Q2xhc3MubXltZXRob2QxIjoKKyAgICAgICAgICAgICMgZGVmIG15bWV0aG9kMShzZWxmLCBhcmcxLCBkZXByZWNhdGVkX2FyZzE9Tm9uZSkKKyAgICAgICAgICAgIHJldHVybiAoKDEsICJkZXByZWNhdGVkX2FyZzEiKSwpCisgICAgICAgIGlmIG1ldGhvZCA9PSAiLk15Q2xhc3MubXltZXRob2QyIjoKKyAgICAgICAgICAgICMgZGVmIG15bWV0aG9kMihzZWxmLCBhcmcxLCBkZXByZWNhdGVkX2FyZzE9J2JhcicsIGFyZzI9J2ZvbycsIGRlcHJlY2F0ZWRfYXJnMj0nc3BhbScpKQorICAgICAgICAgICAgcmV0dXJuICgoMSwgImRlcHJlY2F0ZWRfYXJnMSIpLCAoMywgImRlcHJlY2F0ZWRfYXJnMiIpKQorICAgICAgICBpZiBtZXRob2QgPT0gIi5NeUNsYXNzLm15bWV0aG9kMyI6CisgICAgICAgICAgICAjIGRlZiBteW1ldGhvZDEoc2VsZiwgYXJnMSwgKiwgZGVwcmVjYXRlZF9hcmcxPU5vbmUpCisgICAgICAgICAgICByZXR1cm4gKChOb25lLCAiZGVwcmVjYXRlZF9hcmcxIiksKQorICAgICAgICBpZiBtZXRob2QgPT0gIi5NeUNsYXNzIjoKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGRlcHJlY2F0ZWRfYXJnPU5vbmUpCisgICAgICAgICAgICByZXR1cm4gKCgwLCAiZGVwcmVjYXRlZF9hcmciKSwpCisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIGRlcHJlY2F0ZWRfZGVjb3JhdG9ycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHsiLmRlcHJlY2F0ZWRfZGVjb3JhdG9yIn0KKworCitjbGFzcyBUZXN0RGVwcmVjYXRlZENoZWNrZXIoQ2hlY2tlclRlc3RDYXNlKToKKyAgICBDSEVDS0VSX0NMQVNTID0gX0RlcHJlY2F0ZWRDaGVja2VyCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGRldGVjdGluZyBkZXByZWNhdGVkIGZ1bmN0aW9uCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZGVwcmVjYXRlZF9mdW5jKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVwcmVjYXRlZF9mdW5jKCkKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJkZXByZWNhdGVkLW1ldGhvZCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfZnVuYyIsKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9tZXRob2Qoc2VsZik6CisgICAgICAgICMgVGVzdHMgZGV0ZWN0aW5nIGRlcHJlY2F0ZWQgbWV0aG9kCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBEZXByZWNhdGVkOgorICAgICAgICAgICAgZGVmIGRlcHJlY2F0ZWRfbWV0aG9kKCk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGQgPSBEZXByZWNhdGVkKCkKKyAgICAgICAgZC5kZXByZWNhdGVkX21ldGhvZCgpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1tZXRob2QiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX21ldGhvZCIsKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3Rfbm9fbWVzc2FnZShzZWxmKToKKyAgICAgICAgIyBUZXN0cyBub3QgcmFpc2luZyBlcnJvciB3aGVuIG5vIGRlcHJlY2F0ZWQgZnVuY3Rpb25zL21ldGhvZHMgYXJlIHByZXNlbnQuCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBNeUNsYXNzOgorICAgICAgICAgICAgZGVmIG15bWV0aG9kKCk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIE15Q2xhc3MoKS5teW1ldGhvZCgpCisKKyAgICAgICAgZGVmIG15ZnVuYygpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG15ZnVuYygpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVwcmVjYXRlZF9hcmcoc2VsZik6CisgICAgICAgICMgVGVzdHMgcmFpc2luZyBlcnJvciB3aGVuIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBkZXByZWNhdGVkIGFyZ3VtZW50CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgbXlmdW5jdGlvbjEoYXJnMSwgZGVwcmVjYXRlZF9hcmcxPSdzcGFtJyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbXlmdW5jdGlvbjEoTm9uZSwgJ2RlcHJlY2F0ZWQnKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX2FyZzEiLCAibXlmdW5jdGlvbjEiKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVwcmVjYXRlZF9rd2FyZyhzZWxmKToKKyAgICAgICAgIyBUZXN0cyByYWlzaW5nIGVycm9yIHdoZW4gY2FsbGluZyBmdW5jdGlvbiB3aXRoIGRlcHJlY2F0ZWQga2V5d29yZCBhcmd1bWVudAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIG15ZnVuY3Rpb24xKGFyZzEsIGRlcHJlY2F0ZWRfYXJnMT0nc3BhbScpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG15ZnVuY3Rpb24xKE5vbmUsIGRlcHJlY2F0ZWRfYXJnMT0nZGVwcmVjYXRlZCcpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfYXJnMSIsICJteWZ1bmN0aW9uMSIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbl9kZXByZWNhdGVkX25vdF91c2VkKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIGZ1bmN0aW9uIHdpdGhvdXQgZGVwcmVjYXRlZCBhcmd1bWVudAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIG15ZnVuY3Rpb24xKGFyZzEsIGRlcHJlY2F0ZWRfYXJnMT0nc3BhbScpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG15ZnVuY3Rpb24xKE5vbmUpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVwcmVjYXRlZF9rd2FyZ19vbmx5KHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIGZ1bmN0aW9uIHdpdGggZGVwcmVjYXRlZCBrZXl3b3JkIG9ubHkgYXJndW1lbnQKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBteWZ1bmN0aW9uMyhhcmcxLCAqLCBkZXByZWNhdGVkX2FyZzE9J3NwYW0nKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBteWZ1bmN0aW9uMyhOb25lLCBkZXByZWNhdGVkX2FyZzE9J2RlcHJlY2F0ZWQnKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX2FyZzEiLCAibXlmdW5jdGlvbjMiKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfbWV0aG9kX2RlcHJlY2F0ZWRfYXJnKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIG1ldGhvZCB3aXRoIGRlcHJlY2F0ZWQgYXJndW1lbnQKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15Q2xhc3M6CisgICAgICAgICAgICBkZWYgbXltZXRob2QxKHNlbGYsIGFyZzEsIGRlcHJlY2F0ZWRfYXJnMSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIE15Q2xhc3MoKS5teW1ldGhvZDEoTm9uZSwgJ2RlcHJlY2F0ZWQnKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX2FyZzEiLCAibXltZXRob2QxIiksCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X21ldGhvZF9kZXByZWNhdGVkX2t3YXJnKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIG1ldGhvZCB3aXRoIGRlcHJlY2F0ZWQga2V5d29yZCBhcmd1bWVudAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgTXlDbGFzczoKKyAgICAgICAgICAgIGRlZiBteW1ldGhvZDEoc2VsZiwgYXJnMSwgZGVwcmVjYXRlZF9hcmcxKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgTXlDbGFzcygpLm15bWV0aG9kMShOb25lLCBkZXByZWNhdGVkX2FyZzE9J2RlcHJlY2F0ZWQnKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX2FyZzEiLCAibXltZXRob2QxIiksCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X21ldGhvZF9kZXByZWNhdGVkX25vdF91c2VkKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIG1ldGhvZCB3aXRob3V0IGRlcHJlY2F0ZWQgYXJndW1lbnQKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15Q2xhc3M6CisgICAgICAgICAgICBkZWYgbXltZXRob2QxKHNlbGYsIGFyZzEsIGRlcHJlY2F0ZWRfYXJnMSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIE15Q2xhc3MoKS5teW1ldGhvZDEoTm9uZSkKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9tZXRob2RfZGVwcmVjYXRlZF9rd2FyZ19vbmx5KHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIG1ldGhvZCB3aXRoIGRlcHJlY2F0ZWQga2V5d29yZCBvbmx5IGFyZ3VtZW50CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBNeUNsYXNzOgorICAgICAgICAgICAgZGVmIG15bWV0aG9kMyhzZWxmLCBhcmcxLCAqLCBkZXByZWNhdGVkX2FyZzEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBNeUNsYXNzKCkubXltZXRob2QzKE5vbmUsIGRlcHJlY2F0ZWRfYXJnMT0nZGVwcmVjYXRlZCcpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfYXJnMSIsICJteW1ldGhvZDMiKSwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVwcmVjYXRlZF9hcmdfa3dhcmdzKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHJhaXNpbmcgZXJyb3Igd2hlbiBjYWxsaW5nIGZ1bmN0aW9uIHdpdGggZGVwcmVjYXRlZCBhcmd1bWVudAorICAgICAgICAjIGFuZCBrZXl3b3JkIGFyZ3VtZW50CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgbXlmdW5jdGlvbjIoYXJnMSwgZGVwcmVjYXRlZF9hcmcxLCBhcmcyPSdmb28nLCBkZXByZWNhdGVkX2FyZzI9J3NwYW0nKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBteWZ1bmN0aW9uMihOb25lLCAnZGVwcmVjYXRlZCcsIGRlcHJlY2F0ZWRfYXJnMj0nZGVwcmVjYXRlZCcpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfYXJnMSIsICJteWZ1bmN0aW9uMiIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfYXJnMiIsICJteWZ1bmN0aW9uMiIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVwcmVjYXRlZF9rd2FyZ19rd2FyZyhzZWxmKToKKyAgICAgICAgIyBUZXN0cyByYWlzaW5nIGVycm9yIHdoZW4gY2FsbGluZyBmdW5jdGlvbiB3aXRoIGRlcHJlY2F0ZWQga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBteWZ1bmN0aW9uMihhcmcxLCBkZXByZWNhdGVkX2FyZzEsIGFyZzI9J2ZvbycsIGRlcHJlY2F0ZWRfYXJnMj0nc3BhbScpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG15ZnVuY3Rpb24yKE5vbmUsIGRlcHJlY2F0ZWRfYXJnMT0nZGVwcmVjYXRlZCcsIGRlcHJlY2F0ZWRfYXJnMj0nZGVwcmVjYXRlZCcpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfYXJnMSIsICJteWZ1bmN0aW9uMiIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgYXJncz0oImRlcHJlY2F0ZWRfYXJnMiIsICJteWZ1bmN0aW9uMiIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfbWV0aG9kX2RlcHJlY2F0ZWRfYXJnX2t3YXJncyhzZWxmKToKKyAgICAgICAgIyBUZXN0cyByYWlzaW5nIGVycm9yIHdoZW4gY2FsbGluZyBtZXRob2Qgd2l0aCBkZXByZWNhdGVkIGFyZ3VtZW50CisgICAgICAgICMgYW5kIGtleXdvcmQgYXJndW1lbnQKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15Q2xhc3M6CisgICAgICAgICAgICBkZWYgbXltZXRob2QyKHNlbGYsIGFyZzEsIGRlcHJlY2F0ZWRfYXJnMSwgYXJnMj0nZm9vJywgZGVwcmVjYXRlZF9hcmcyPSdzcGFtJyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIE15Q2xhc3MoKS5teW1ldGhvZDIoTm9uZSwgJ2RlcHJlY2F0ZWQnLCBkZXByZWNhdGVkX2FyZzI9J2RlcHJlY2F0ZWQnKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX2FyZzEiLCAibXltZXRob2QyIiksCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJkZXByZWNhdGVkLWFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICBhcmdzPSgiZGVwcmVjYXRlZF9hcmcyIiwgIm15bWV0aG9kMiIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfbWV0aG9kX2RlcHJlY2F0ZWRfa3dhcmdfa3dhcmcoc2VsZik6CisgICAgICAgICMgVGVzdHMgcmFpc2luZyBlcnJvciB3aGVuIGNhbGxpbmcgbWV0aG9kIHdpdGggZGVwcmVjYXRlZCBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgTXlDbGFzczoKKyAgICAgICAgICAgIGRlZiBteW1ldGhvZDIoc2VsZiwgYXJnMSwgZGVwcmVjYXRlZF9hcmcxLCBhcmcyPSdmb28nLCBkZXByZWNhdGVkX2FyZzI9J3NwYW0nKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgTXlDbGFzcygpLm15bWV0aG9kMihOb25lLCBkZXByZWNhdGVkX2FyZzE9J2RlcHJlY2F0ZWQnLCBkZXByZWNhdGVkX2FyZzI9J2RlcHJlY2F0ZWQnKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtYXJndW1lbnQiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJkZXByZWNhdGVkX2FyZzEiLCAibXltZXRob2QyIiksCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJkZXByZWNhdGVkLWFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICBhcmdzPSgiZGVwcmVjYXRlZF9hcmcyIiwgIm15bWV0aG9kMiIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfY2xhc3NfZGVwcmVjYXRlZF9hcmd1bWVudHMoc2VsZik6CisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15Q2xhc3M6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGVwcmVjYXRlZF9hcmc9Tm9uZSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIE15Q2xhc3MoNSkKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJkZXByZWNhdGVkLWFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICBhcmdzPSgiZGVwcmVjYXRlZF9hcmciLCAiTXlDbGFzcyIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX21vZHVsZShzZWxmKToKKyAgICAgICAgIyBUZXN0cyBkZXRlY3RpbmcgZGVwcmVjYXRlZCBtb2R1bGUKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBkZXByZWNhdGVkX21vZHVsZQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtbW9kdWxlIiwKKyAgICAgICAgICAgICAgICBhcmdzPSJkZXByZWNhdGVkX21vZHVsZSIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydChub2RlKQorCisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9tb2R1bGVfZnJvbShzZWxmKToKKyAgICAgICAgIyBUZXN0cyBkZXRlY3RpbmcgZGVwcmVjYXRlZCBtb2R1bGUKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGVwcmVjYXRlZF9tb2R1bGUgaW1wb3J0IG15ZnVuY3Rpb24KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJkZXByZWNhdGVkLW1vZHVsZSIsCisgICAgICAgICAgICAgICAgYXJncz0iZGVwcmVjYXRlZF9tb2R1bGUiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2NsYXNzX2ltcG9ydF9mcm9tKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGRldGVjdGluZyBkZXByZWNhdGVkIGNsYXNzIHZpYSBpbXBvcnQgZnJvbQorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSAuZGVwcmVjYXRlZCBpbXBvcnQgRGVwcmVjYXRlZENsYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1jbGFzcyIsCisgICAgICAgICAgICAgICAgYXJncz0oIkRlcHJlY2F0ZWRDbGFzcyIsICJkZXByZWNhdGVkIiksCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20obm9kZSkKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfY2xhc3NfaW1wb3J0KHNlbGYpOgorICAgICAgICAjIFRlc3RzIGRldGVjdGluZyBkZXByZWNhdGVkIGNsYXNzIHZpYSBpbXBvcnQKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBkZXByZWNhdGVkLkRlcHJlY2F0ZWRDbGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtY2xhc3MiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJEZXByZWNhdGVkQ2xhc3MiLCAiZGVwcmVjYXRlZCIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfY2xhc3NfY2FsbChzZWxmKToKKyAgICAgICAgIyBUZXN0cyBkZXRlY3RpbmcgZGVwcmVjYXRlZCBjbGFzcyB2aWEgY2FsbAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGRlcHJlY2F0ZWQKKyAgICAgICAgZGVwcmVjYXRlZC5EZXByZWNhdGVkQ2xhc3MoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9ImRlcHJlY2F0ZWQtY2xhc3MiLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJEZXByZWNhdGVkQ2xhc3MiLCAiZGVwcmVjYXRlZCIpLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlPVVOREVGSU5FRCwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2RlY29yYXRvcihzZWxmKToKKyAgICAgICAgIyBUZXN0cyBkZXRlY3RpbmcgZGVwcmVjYXRlZCBkZWNvcmF0b3IKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBkZXByZWNhdGVkX2RlY29yYXRvcihmKToKKyAgICAgICAgICAgIGRlZiB3cmFwcGVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIKKworICAgICAgICBAZGVwcmVjYXRlZF9kZWNvcmF0b3IgI0AKKyAgICAgICAgZGVmIGZ1bmN0aW9uKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0iZGVwcmVjYXRlZC1kZWNvcmF0b3IiLAorICAgICAgICAgICAgICAgIGFyZ3M9Ii5kZXByZWNhdGVkX2RlY29yYXRvciIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2RlY29yYXRvcnMobm9kZSkKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZGVjb3JhdG9yX3dpdGhfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGRldGVjdGluZyBkZXByZWNhdGVkIGRlY29yYXRvciB3aXRoIGFyZ3VtZW50cworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGRlcHJlY2F0ZWRfZGVjb3JhdG9yKGFyZzEsIGFyZzIpOgorICAgICAgICAgICAgZGVmIHdyYXBwZXIoZik6CisgICAgICAgICAgICAgICAgZGVmIHdyYXBwZWQoKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkCisgICAgICAgICAgICByZXR1cm4gd3JhcHBlcgorCisgICAgICAgIEBkZXByZWNhdGVkX2RlY29yYXRvcigyLCAzKSAjQAorICAgICAgICBkZWYgZnVuY3Rpb24oKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJkZXByZWNhdGVkLWRlY29yYXRvciIsCisgICAgICAgICAgICAgICAgYXJncz0iLmRlcHJlY2F0ZWRfZGVjb3JhdG9yIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZGVjb3JhdG9ycyhub2RlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfZXhjZXB0aW9ucy5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2V4Y2VwdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmZDVjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFJlbmUgWmhhbmcgPHJ6OTlAY29ybmVsbC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxNSBTdGV2ZW4gTXlpbnQgPGhnQHN0ZXZlbm15aW50LmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJpYW4gU2hhZ2luYXcgPGJyaWFuLnNoYWdpbmF3QHdhcmJ5cGFya2VyLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlRlc3RzIGZvciBweWxpbnQuY2hlY2tlcnMuZXhjZXB0aW9ucy4iIiIKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBleGNlcHRpb25zCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZQorCisKK2NsYXNzIFRlc3RFeGNlcHRpb25zQ2hlY2tlcihDaGVja2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBweWxpbnQuY2hlY2tlcnMuZXhjZXB0aW9ucy4iIiIKKworICAgIENIRUNLRVJfQ0xBU1MgPSBleGNlcHRpb25zLkV4Y2VwdGlvbnNDaGVja2VyCisKKyAgICAjIFRoZXNlIHRlc3RzIGFyZW4ndCBpbiB0aGUgZnVuY3Rpb25hbCB0ZXN0IHN1aXRlLAorICAgICMgc2luY2UgdGhleSB3aWxsIGJlIGNvbnZlcnRlZCB3aXRoIDJ0bzMgZm9yIFB5dGhvbiAzCisgICAgIyBhbmQgYHJhaXNlIChFcnJvciwgLi4uKWAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8KKyAgICAjIGByYWlzZSBFcnJvciguLi4pYCwgc28gaXQgYmVhdHMgdGhlIHB1cnBvc2Ugb2YgdGhlIHRlc3QuCisKKyAgICBkZWYgdGVzdF9yYWlzaW5nX2JhZF90eXBlX3B5dGhvbjMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgicmFpc2UgKFplcm9EaXZpc2lvbkVycm9yLCBOb25lKSAgI0AiKQorICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgicmFpc2luZy1iYWQtdHlwZSIsIG5vZGU9bm9kZSwgYXJncz0idHVwbGUiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfZXhjZXB0aW9uX2NvbnRleHRfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb24oKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBmdW5jdGlvbiBhcyBleGM6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24gZnJvbSBleGMgICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKCJiYWQtZXhjZXB0aW9uLWNvbnRleHQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2Uobm9kZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2Zvcm1hdC5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2Zvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFjOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfZm9ybWF0LnB5CkBAIC0wLDAgKzEsMjc5IEBACisjIENvcHlyaWdodCAoYykgMjAwOS0yMDExLCAyMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEZFTEQgQm9yaXMgPGxvdGhpcmFsZGFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgYnVjayA8YnVjay4yMDE5QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSGFydXQgPHllc0BoYXJ1dHVuZS5uYW1lPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBQZXRyIFB1bGMgPHBldHJwdWxjQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgS3J6eXN6dG9mIEN6YXBsYSA8ay5jemFwbGE2OEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyDFgXVrYXN6IFJvZ2Fsc2tpIDxyb2dhbHNraS45MUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBKYW1lcyBNLiBBbGxlbiA8amFtZXMubS5hbGxlbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyB2aW5ueXJvc2UgPHZpbm55cm9zZUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMCBCcnljZSBHdWludGEgPGJyeWNlLmd1aW50YUBwcm90b25tYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEJyeWNlIEd1aW50YSA8YnJ5Y2UucGF1bC5ndWludGFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgsIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgQW5kcmVhcyBGaW5rbGVyIDxhbmRpLmZpbmtsZXJAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIkNoZWNrIGZvcm1hdCBjaGVja2VyIGhlbHBlciBmdW5jdGlvbnMiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0b2tlbml6ZQorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgbGludCwgcmVwb3J0ZXJzCitmcm9tIHB5bGludC5jaGVja2Vycy5mb3JtYXQgaW1wb3J0IEZvcm1hdENoZWNrZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBfdG9rZW5pemVfc3RyCisKKworY2xhc3MgVGVzdE11bHRpU3RhdGVtZW50TGluZShDaGVja2VyVGVzdENhc2UpOgorICAgIENIRUNLRVJfQ0xBU1MgPSBGb3JtYXRDaGVja2VyCisKKyAgICBkZWYgdGVzdFNpbmdsZUxpbmVJZlN0bXRzKHNlbGYpOgorICAgICAgICBzdG10ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaWYgVHJ1ZTogcGFzcyAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja2VyLmNvbmZpZy5zaW5nbGVfbGluZV9pZl9zdG10ID0gRmFsc2UKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKCJtdWx0aXBsZS1zdGF0ZW1lbnRzIiwgbm9kZT1zdG10LmJvZHlbMF0pKToKKyAgICAgICAgICAgIHNlbGYudmlzaXRGaXJzdChzdG10KQorICAgICAgICBzZWxmLmNoZWNrZXIuY29uZmlnLnNpbmdsZV9saW5lX2lmX3N0bXQgPSBUcnVlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLnZpc2l0Rmlyc3Qoc3RtdCkKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGlmIFRydWU6IHBhc3MgICNACisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZSgibXVsdGlwbGUtc3RhdGVtZW50cyIsIG5vZGU9c3RtdC5ib2R5WzBdKSk6CisgICAgICAgICAgICBzZWxmLnZpc2l0Rmlyc3Qoc3RtdCkKKworICAgIGRlZiB0ZXN0U2luZ2xlTGluZUNsYXNzU3RtdHMoc2VsZik6CisgICAgICAgIHN0bXQgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBNeUVycm9yKEV4Y2VwdGlvbik6IHBhc3MgICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tlci5jb25maWcuc2luZ2xlX2xpbmVfY2xhc3Nfc3RtdCA9IEZhbHNlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZSgibXVsdGlwbGUtc3RhdGVtZW50cyIsIG5vZGU9c3RtdC5ib2R5WzBdKSk6CisgICAgICAgICAgICBzZWxmLnZpc2l0Rmlyc3Qoc3RtdCkKKyAgICAgICAgc2VsZi5jaGVja2VyLmNvbmZpZy5zaW5nbGVfbGluZV9jbGFzc19zdG10ID0gVHJ1ZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi52aXNpdEZpcnN0KHN0bXQpCisKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15RXJyb3IoRXhjZXB0aW9uKTogYT0nYScgICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tlci5jb25maWcuc2luZ2xlX2xpbmVfY2xhc3Nfc3RtdCA9IEZhbHNlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZSgibXVsdGlwbGUtc3RhdGVtZW50cyIsIG5vZGU9c3RtdC5ib2R5WzBdKSk6CisgICAgICAgICAgICBzZWxmLnZpc2l0Rmlyc3Qoc3RtdCkKKyAgICAgICAgc2VsZi5jaGVja2VyLmNvbmZpZy5zaW5nbGVfbGluZV9jbGFzc19zdG10ID0gVHJ1ZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi52aXNpdEZpcnN0KHN0bXQpCisKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15RXJyb3IoRXhjZXB0aW9uKTogYT0nYSc7IGI9J2InICAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrZXIuY29uZmlnLnNpbmdsZV9saW5lX2NsYXNzX3N0bXQgPSBGYWxzZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKE1lc3NhZ2UoIm11bHRpcGxlLXN0YXRlbWVudHMiLCBub2RlPXN0bXQuYm9keVswXSkpOgorICAgICAgICAgICAgc2VsZi52aXNpdEZpcnN0KHN0bXQpCisgICAgICAgIHNlbGYuY2hlY2tlci5jb25maWcuc2luZ2xlX2xpbmVfY2xhc3Nfc3RtdCA9IFRydWUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKCJtdWx0aXBsZS1zdGF0ZW1lbnRzIiwgbm9kZT1zdG10LmJvZHlbMF0pKToKKyAgICAgICAgICAgIHNlbGYudmlzaXRGaXJzdChzdG10KQorCisgICAgZGVmIHRlc3RUcnlFeGNlcHRGaW5hbGx5Tm9NdWx0aXBsZVN0YXRlbWVudChzZWxmKToKKyAgICAgICAgdHJlZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIHRyeTogICNACisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi52aXNpdEZpcnN0KHRyZWUpCisKKyAgICBkZWYgdmlzaXRGaXJzdChzZWxmLCB0cmVlKToKKyAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKFtdKQorICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZGVmYXVsdCh0cmVlLmJvZHlbMF0pCisKKyAgICBkZWYgdGVzdF9lbGxpcHNpc19pc19pZ25vcmVkKHNlbGYpOgorICAgICAgICBjb2RlID0gIiIiCisgICAgICAgIGZyb20gdHlwaW5nIGltcG9ydCBvdmVybG9hZAorICAgICAgICBAb3ZlcmxvYWQKKyAgICAgICAgZGVmIGNvbmNhdDIoYXJnMTogc3RyKSAtPiBzdHI6IC4uLgorICAgICAgICAiIiIKKyAgICAgICAgdHJlZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKGNvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLnZpc2l0Rmlyc3QodHJlZSkKKworICAgICAgICBjb2RlID0gIiIiCisgICAgICAgIGRlZiBjb25jYXQyKGFyZzE6IHN0cikgLT4gc3RyOiAuLi4KKyAgICAgICAgIiIiCisgICAgICAgIHN0bXQgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShjb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKE1lc3NhZ2UoIm11bHRpcGxlLXN0YXRlbWVudHMiLCBub2RlPXN0bXQuYm9keVswXSkpOgorICAgICAgICAgICAgc2VsZi52aXNpdEZpcnN0KHN0bXQpCisKKworY2xhc3MgVGVzdFN1cGVyZmx1b3VzUGFyZW50aGVzZXMoQ2hlY2tlclRlc3RDYXNlKToKKyAgICBDSEVDS0VSX0NMQVNTID0gRm9ybWF0Q2hlY2tlcgorCisgICAgZGVmIHRlc3RDaGVja0tleXdvcmRQYXJlbnNIYW5kbGVzVmFsaWRDYXNlcyhzZWxmKToKKyAgICAgICAgY2FzZXMgPSBbCisgICAgICAgICAgICAiaWYgZm9vOiIsCisgICAgICAgICAgICAiaWYgZm9vKCk6IiwKKyAgICAgICAgICAgICJpZiAoeCBhbmQgeSkgb3IgejoiLAorICAgICAgICAgICAgImFzc2VydCBmb28oKSIsCisgICAgICAgICAgICAiYXNzZXJ0ICgpIiwKKyAgICAgICAgICAgICJpZiAoMSwgMikgaW4gKDMsIDQpOiIsCisgICAgICAgICAgICAiaWYgKGEgb3IgYikgaW4gYzoiLAorICAgICAgICAgICAgInJldHVybiAoeCBmb3IgeCBpbiB4KSIsCisgICAgICAgICAgICAiaWYgKHggZm9yIHggaW4geCk6IiwKKyAgICAgICAgICAgICJmb3IgeCBpbiAoeCBmb3IgeCBpbiB4KToiLAorICAgICAgICAgICAgIm5vdCAoZm9vIG9yIGJhcikiLAorICAgICAgICAgICAgIm5vdCAoZm9vIG9yIGJhcikgYW5kIGJheiIsCisgICAgICAgIF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIGZvciBjb2RlIGluIGNhc2VzOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci5fY2hlY2tfa2V5d29yZF9wYXJlbnRoZXNlcyhfdG9rZW5pemVfc3RyKGNvZGUpLCAwKQorCisgICAgZGVmIHRlc3RDaGVja0tleXdvcmRQYXJlbnNIYW5kbGVzVW5uZWNlc3NhcnlQYXJlbnMoc2VsZik6CisgICAgICAgIGNhc2VzID0gWworICAgICAgICAgICAgKE1lc3NhZ2UoInN1cGVyZmx1b3VzLXBhcmVucyIsIGxpbmU9MSwgYXJncz0iaWYiKSwgImlmIChmb28pOiIsIDApLAorICAgICAgICAgICAgKE1lc3NhZ2UoInN1cGVyZmx1b3VzLXBhcmVucyIsIGxpbmU9MSwgYXJncz0iaWYiKSwgImlmICgoZm9vLCBiYXIpKToiLCAwKSwKKyAgICAgICAgICAgIChNZXNzYWdlKCJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPTEsIGFyZ3M9ImlmIiksICJpZiAoZm9vKGJhcikpOiIsIDApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIE1lc3NhZ2UoInN1cGVyZmx1b3VzLXBhcmVucyIsIGxpbmU9MSwgYXJncz0icmV0dXJuIiksCisgICAgICAgICAgICAgICAgInJldHVybiAoKHggZm9yIHggaW4geCkpIiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIChNZXNzYWdlKCJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPTEsIGFyZ3M9Im5vdCIpLCAibm90IChmb28pIiwgMCksCisgICAgICAgICAgICAoTWVzc2FnZSgic3VwZXJmbHVvdXMtcGFyZW5zIiwgbGluZT0xLCBhcmdzPSJub3QiKSwgImlmIG5vdCAoZm9vKToiLCAxKSwKKyAgICAgICAgICAgIChNZXNzYWdlKCJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPTEsIGFyZ3M9ImlmIiksICJpZiAobm90IChmb28pKToiLCAwKSwKKyAgICAgICAgICAgIChNZXNzYWdlKCJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPTEsIGFyZ3M9Im5vdCIpLCAiaWYgKG5vdCAoZm9vKSk6IiwgMiksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgTWVzc2FnZSgic3VwZXJmbHVvdXMtcGFyZW5zIiwgbGluZT0xLCBhcmdzPSJmb3IiKSwKKyAgICAgICAgICAgICAgICAiZm9yICh4KSBpbiAoMSwgMiwgMyk6IiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICBNZXNzYWdlKCJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPTEsIGFyZ3M9ImlmIiksCisgICAgICAgICAgICAgICAgImlmICgxKSBpbiAoMSwgMiwgMyk6IiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgbXNnLCBjb2RlLCBvZmZzZXQgaW4gY2FzZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1zZyk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLl9jaGVja19rZXl3b3JkX3BhcmVudGhlc2VzKF90b2tlbml6ZV9zdHIoY29kZSksIG9mZnNldCkKKworICAgIGRlZiB0ZXN0Tm9TdXBlcmZsdW91c1BhcmVuc1dhbHJ1c09wZXJhdG9ySWYoc2VsZik6CisgICAgICAgICIiIlBhcmVudGhlc2lzIGNoYW5nZSB0aGUgbWVhbmluZyBvZiBhc3NpZ25tZW50IGluIHRoZSB3YWxydXMgb3BlcmF0b3IKKyAgICAgICAgYW5kIHNvIGFyZSBub3Qgc3VwZXJmbHVvdXM6IiIiCisgICAgICAgIGNvZGUgPSAiaWYgKG9kZCA6PSBpc19vZGQoaSkpIgorICAgICAgICBvZmZzZXQgPSAwCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIuX2NoZWNrX2tleXdvcmRfcGFyZW50aGVzZXMoX3Rva2VuaXplX3N0cihjb2RlKSwgb2Zmc2V0KQorCisgICAgZGVmIHRlc3RQb3NpdGl2ZVN1cGVyZmx1b3VzUGFyZW5zV2FscnVzT3BlcmF0b3JJZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBwb3NpdGl2ZSBzdXBlcmZsdW91cyBwYXJlbnMgd2l0aCB0aGUgd2FscnVzIG9wZXJhdG9yIiIiCisgICAgICAgIGNvZGUgPSAiaWYgKChvZGQgOj0gaXNfb2RkKGkpKSk6IgorICAgICAgICBtc2cgPSBNZXNzYWdlKCJzdXBlcmZsdW91cy1wYXJlbnMiLCBsaW5lPTEsIGFyZ3M9ImlmIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtc2cpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLl9jaGVja19rZXl3b3JkX3BhcmVudGhlc2VzKF90b2tlbml6ZV9zdHIoY29kZSksIDApCisKKyAgICBkZWYgdGVzdE5vU3VwZXJmbHVvdXNQYXJlbnNXYWxydXNPcGVyYXRvck5vdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBzdXBlcmZsdW91cy1wYXJlbnMgd2l0aCB0aGUgbm90IG9wZXJhdG9yIiIiCisgICAgICAgIGNvZGUgPSAibm90IChmb28gOj0gNSkiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIuX2NoZWNrX2tleXdvcmRfcGFyZW50aGVzZXMoX3Rva2VuaXplX3N0cihjb2RlKSwgMCkKKworICAgIGRlZiB0ZXN0Q2hlY2tJZkFyZ3NBcmVOb3RVbmljb2RlKHNlbGYpOgorICAgICAgICBjYXNlcyA9IFsoImlmIChmb28pOiIsIDApLCAoImFzc2VydCAoMSA9PSAxKSIsIDApXQorCisgICAgICAgIGZvciBjb2RlLCBvZmZzZXQgaW4gY2FzZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIuX2NoZWNrX2tleXdvcmRfcGFyZW50aGVzZXMoX3Rva2VuaXplX3N0cihjb2RlKSwgb2Zmc2V0KQorICAgICAgICAgICAgZ290ID0gc2VsZi5saW50ZXIucmVsZWFzZV9tZXNzYWdlcygpCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShnb3RbLTFdLmFyZ3MsIHN0cikKKworICAgIGRlZiB0ZXN0RnV0dXJlUHJpbnRTdGF0ZW1lbnRXaXRob3V0UGFyZW5zV2FybmluZyhzZWxmKToKKyAgICAgICAgY29kZSA9ICIiImZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK3ByaW50KCdIZWxsbyB3b3JsZCEnKQorIiIiCisgICAgICAgIHRyZWUgPSBhc3Ryb2lkLnBhcnNlKGNvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc19tb2R1bGUodHJlZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGNvZGUpKQorCisgICAgZGVmIHRlc3RLZXl3b3JkUGFyZW5zRmFsc2VQb3NpdGl2ZShzZWxmKToKKyAgICAgICAgY29kZSA9ICJpZiAnYmFyJyBpbiAoRElDVCBvciB7fSk6IgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLl9jaGVja19rZXl3b3JkX3BhcmVudGhlc2VzKF90b2tlbml6ZV9zdHIoY29kZSksIHN0YXJ0PTIpCisKKworY2xhc3MgVGVzdENoZWNrU3BhY2UoQ2hlY2tlclRlc3RDYXNlKToKKyAgICBDSEVDS0VSX0NMQVNTID0gRm9ybWF0Q2hlY2tlcgorCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfdG9rZW4oc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGUgZW5jb2RpbmcgdG9rZW4gZG9lc24ndCBjaGFuZ2UgdGhlIGNoZWNrZXIncyBiZWhhdmlvcgorCisgICAgICAgIF90b2tlbml6ZV9zdHIgZG9lc24ndCBwcm9kdWNlIGFuIGVuY29kaW5nIHRva2VuLCBidXQKKyAgICAgICAgcmVhZGluZyBhIGZpbGUgZG9lcworICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIGVuY29kaW5nX3Rva2VuID0gdG9rZW5pemUuVG9rZW5JbmZvKAorICAgICAgICAgICAgICAgIHRva2VuaXplLkVOQ09ESU5HLCAidXRmLTgiLCAoMCwgMCksICgwLCAwKSwgIiIKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRva2VucyA9IFtlbmNvZGluZ190b2tlbl0gKyBfdG9rZW5pemVfc3RyKAorICAgICAgICAgICAgICAgICJpZiAoXG4gICAgICAgIE5vbmUpOlxuICAgIHBhc3NcbiIKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2Vucyh0b2tlbnMpCisKKworZGVmIHRlc3RfZGlzYWJsZV9nbG9iYWxfb3B0aW9uX2VuZF9vZl9saW5lKCk6CisgICAgIiIiCisgICAgVGVzdCBmb3IgaXNzdWUgd2l0aCBkaXNhYmxpbmcgdG9rZW5pemVyIG1lc3NhZ2VzCisgICAgdGhhdCBleHRlbmQgYmV5b25kIHRoZSBzY29wZSBvZiB0aGUgYXN0IHRva2VucworICAgICIiIgorICAgIGZpbGVfID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCAgIyBweWxpbnQ6IGRpc2FibGU9Y29uc2lkZXItdXNpbmctd2l0aAorICAgICAgICAidyIsIGRlbGV0ZT1GYWxzZQorICAgICkKKyAgICB3aXRoIGZpbGVfOgorICAgICAgICBmaWxlXy53cml0ZSgKKyAgICAgICAgICAgICIiIgorbXlsaXN0ID0gWworICAgIE5vbmUKKyAgICAgICAgXQorICAgICIiIgorICAgICAgICApCisgICAgdHJ5OgorICAgICAgICBsaW50ZXIgPSBsaW50LlB5TGludGVyKCkKKyAgICAgICAgY2hlY2tlciA9IEZvcm1hdENoZWNrZXIobGludGVyKQorICAgICAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihjaGVja2VyKQorICAgICAgICBhcmdzID0gbGludGVyLmxvYWRfY29tbWFuZF9saW5lX2NvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBbZmlsZV8ubmFtZSwgIi1kIiwgImJhZC1jb250aW51YXRpb24iXQorICAgICAgICApCisgICAgICAgIG15cmVwb3J0ZXIgPSByZXBvcnRlcnMuQ29sbGVjdGluZ1JlcG9ydGVyKCkKKyAgICAgICAgbGludGVyLnNldF9yZXBvcnRlcihteXJlcG9ydGVyKQorICAgICAgICBsaW50ZXIuY2hlY2soYXJncykKKyAgICAgICAgYXNzZXJ0IG5vdCBteXJlcG9ydGVyLm1lc3NhZ2VzCisgICAgZmluYWxseToKKyAgICAgICAgb3MucmVtb3ZlKGZpbGVfLm5hbWUpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9pbXBvcnRzLnB5IGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfaW1wb3J0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTAyNTVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfaW1wb3J0cy5weQpAQCAtMCwwICsxLDE2MyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IERtaXRyeSBQcmlieXNoIDxkbWFuZEB5YW5kZXgucnU+CisjIENvcHlyaWdodCAoYykgMjAxNSBDZXphciA8Y2VsbmF6bGlAYml0ZGVmZW5kZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSmFtZXMgTW9yZ2Vuc2VuIDxqYW1lcy5tb3JnZW5zZW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBIb3Jud2l0c2VyIDxnaXRodWJAaG9ybndpdHNlci5ubz4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1hcmlhbm5hIFBvbGF0b2dsb3UgPG1wb2xhdG9nbG91QGJsb29tYmVyZy5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxOCBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE5pY2sgRHJvemQgPG5pY2hvbGFzZHJvemRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlVuaXQgdGVzdHMgZm9yIHRoZSBpbXBvcnRzIGNoZWNrZXIuIiIiCisKK2ltcG9ydCBvcworCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgaW1wb3J0cworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgVU5ERUZJTkVECitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZSwgc2V0X2NvbmZpZworCitSRUdSX0RBVEEgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgIi4uIiwgInJlZ3J0ZXN0X2RhdGEiLCAiIikKKworCitjbGFzcyBUZXN0SW1wb3J0c0NoZWNrZXIoQ2hlY2tlclRlc3RDYXNlKToKKworICAgIENIRUNLRVJfQ0xBU1MgPSBpbXBvcnRzLkltcG9ydHNDaGVja2VyCisKKyAgICBAc2V0X2NvbmZpZyhhbGxvd19hbnlfaW1wb3J0X2xldmVsPSgiYXN0cm9pZCIsKSkKKyAgICBkZWYgdGVzdF9pbXBvcnRfb3V0c2lkZV90b3BsZXZlbChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBpbXBvcnQgYXN0cm9pZAorICAgICAgICAiIiIKKyAgICAgICAgKS5ib2R5WzBdCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIGltcG9ydCBweWxpbnQKKyAgICAgICAgIiIiCisgICAgICAgICkuYm9keVswXQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKCJpbXBvcnQtb3V0c2lkZS10b3BsZXZlbCIsIG5vZGU9bm9kZSwgYXJncz0icHlsaW50IikKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgIEBzZXRfY29uZmlnKAorICAgICAgICBpZ25vcmVkX21vZHVsZXM9KCJleHRlcm5hbF9tb2R1bGUiLCAiZmFrZV9tb2R1bGUuc3VibW9kdWxlIiwgImZvbyIsICJiYXIiKQorICAgICkKKyAgICBkZWYgdGVzdF9pbXBvcnRfZXJyb3Jfc2tpcHBlZChzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoYXQgaW1wb3J0cyBkbyBub3QgZW1pdCBhbiAnaW1wb3J0LWVycm9yJyB3aGVuIHRoZQorICAgICAgICBtb2R1bGUgaXMgY29uZmlndXJlZCB0byBiZSBpZ25vcmVkLiIiIgorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBmcm9tIGV4dGVybmFsX21vZHVsZSBpbXBvcnQgYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gZXh0ZXJuYWxfbW9kdWxlLmFub3RoZXJfbW9kdWxlIGltcG9ydCBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20obm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGV4dGVybmFsX21vZHVsZQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydChub2RlKQorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBmcm9tIGZha2VfbW9kdWxlLnN1Ym1vZHVsZSBpbXBvcnQgYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gZmFrZV9tb2R1bGUuc3VibW9kdWxlLmRlZXBlciBpbXBvcnQgYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBmb28sIGJhcgorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCJtdWx0aXBsZS1pbXBvcnRzIiwgbm9kZT1ub2RlLCBhcmdzPSJmb28sIGJhciIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobXNnKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGZvbworICAgICAgICBpbXBvcnQgYmFyCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KG5vZGUpCisKKyAgICBkZWYgdGVzdF9yZWltcG9ydGVkX3NhbWVfbGluZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCBkdXBsaWNhdGUgaW1wb3J0cyBvbiBzaW5nbGUgbGluZSByYWlzZSAncmVpbXBvcnRlZCcuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoImZyb20gdGltZSBpbXBvcnQgc2xlZXAsIHNsZWVwLCB0aW1lIikKKyAgICAgICAgbXNnID0gTWVzc2FnZShtc2dfaWQ9InJlaW1wb3J0ZWQiLCBub2RlPW5vZGUsIGFyZ3M9KCJzbGVlcCIsIDEpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1zZyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShub2RlKQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVfYmV5b25kX3RvcF9sZXZlbChzZWxmKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5NQU5BR0VSLmFzdF9mcm9tX21vZHVsZV9uYW1lKCJiZXlvbmRfdG9wIiwgUkVHUl9EQVRBKQorICAgICAgICBpbXBvcnRfZnJvbSA9IG1vZHVsZS5ib2R5WzBdCisKKyAgICAgICAgbXNnID0gTWVzc2FnZShtc2dfaWQ9InJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwiLCBub2RlPWltcG9ydF9mcm9tKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1zZyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShpbXBvcnRfZnJvbSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG1vZHVsZS5ib2R5WzFdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20obW9kdWxlLmJvZHlbMl0uYm9keVswXSkKKworICAgIGRlZiB0ZXN0X3dpbGRjYXJkX2ltcG9ydF9pbml0KHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLk1BTkFHRVIuYXN0X2Zyb21fbW9kdWxlX25hbWUoImluaXRfd2lsZGNhcmQiLCBSRUdSX0RBVEEpCisgICAgICAgIGltcG9ydF9mcm9tID0gbW9kdWxlLmJvZHlbMF0KKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20oaW1wb3J0X2Zyb20pCisKKyAgICBkZWYgdGVzdF93aWxkY2FyZF9pbXBvcnRfbm9uX2luaXQoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQuTUFOQUdFUi5hc3RfZnJvbV9tb2R1bGVfbmFtZSgid2lsZGNhcmQiLCBSRUdSX0RBVEEpCisgICAgICAgIGltcG9ydF9mcm9tID0gbW9kdWxlLmJvZHlbMF0KKworICAgICAgICBtc2cgPSBNZXNzYWdlKAorICAgICAgICAgICAgbXNnX2lkPSJ3aWxkY2FyZC1pbXBvcnQiLAorICAgICAgICAgICAgbm9kZT1pbXBvcnRfZnJvbSwKKyAgICAgICAgICAgIGFyZ3M9ImVtcHR5IiwKKyAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobXNnKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKGltcG9ydF9mcm9tKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfbG9nZ2luZy5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2xvZ2dpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3ODI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X2xvZ2dpbmcucHkKQEAgLTAsMCArMSwxNTYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBbGFuIENoYW4gPGFjaGFuOTYxMTE3QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjAgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFN2ZXQgPHN2ZXRAaHlwZXJzY2llbmNlLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwLTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVW5pdHRlc3QgZm9yIHRoZSBsb2dnaW5nIGNoZWNrZXIuIiIiCitpbXBvcnQgc3lzCisKK2ltcG9ydCBhc3Ryb2lkCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBsb2dnaW5nCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBVTkRFRklORUQKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBzZXRfY29uZmlnCisKKworY2xhc3MgVGVzdExvZ2dpbmdNb2R1bGVEZXRlY3Rpb24oQ2hlY2tlclRlc3RDYXNlKToKKyAgICBDSEVDS0VSX0NMQVNTID0gbG9nZ2luZy5Mb2dnaW5nQ2hlY2tlcgorCisgICAgZGVmIHRlc3RfZGV0ZWN0c19zdGFuZGFyZF9sb2dnaW5nX21vZHVsZShzZWxmKToKKyAgICAgICAgc3RtdHMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgbG9nZ2luZyAjQAorICAgICAgICBsb2dnaW5nLndhcm4oJyVzJyAlICclcycpICAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfbW9kdWxlKE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQoc3RtdHNbMF0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKCJsb2dnaW5nLW5vdC1sYXp5Iiwgbm9kZT1zdG10c1sxXSwgYXJncz0oImxhenkgJSIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKHN0bXRzWzFdKQorCisgICAgZGVmIHRlc3RfZG9udF9jcmFzaF9vbl9pbnZhbGlkX2Zvcm1hdF9zdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBsb2dnaW5nCisgICAgICAgIGxvZ2dpbmcuZXJyb3IoJzB9IC0gezF9Jy5mb3JtYXQoMSwgMikpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHNlbGYud2Fsayhub2RlKQorCisgICAgZGVmIHRlc3RfZGV0ZWN0c19yZW5hbWVkX3N0YW5kYXJkX2xvZ2dpbmdfbW9kdWxlKHNlbGYpOgorICAgICAgICBzdG10cyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBsb2dnaW5nIGFzIGJsb2dnaW5nICNACisgICAgICAgIGJsb2dnaW5nLndhcm4oJyVzJyAlICclcycpICAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfbW9kdWxlKE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQoc3RtdHNbMF0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKCJsb2dnaW5nLW5vdC1sYXp5Iiwgbm9kZT1zdG10c1sxXSwgYXJncz0oImxhenkgJSIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKHN0bXRzWzFdKQorCisgICAgQHNldF9jb25maWcobG9nZ2luZ19tb2R1bGVzPVsibG9nZ2luZyIsICJteS5sb2dnaW5nIl0pCisgICAgZGVmIHRlc3Rfbm9uc3RhbmRhcmRfbG9nZ2luZ19tb2R1bGUoc2VsZik6CisgICAgICAgIHN0bXRzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBteSBpbXBvcnQgbG9nZ2luZyBhcyBibG9nZ2luZyAjQAorICAgICAgICBibG9nZ2luZy53YXJuKCclcycgJSAnJXMnKSAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KHN0bXRzWzBdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgibG9nZ2luZy1ub3QtbGF6eSIsIG5vZGU9c3RtdHNbMV0sIGFyZ3M9KCJsYXp5ICUiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChzdG10c1sxXSkKKworICAgIGRlZiBfYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X25vX21lc3NhZ2VzKHNlbGYsIHN0bXQpOgorICAgICAgICBzdG10cyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBsb2dnaW5nICNACisgICAgICAgIGxvZ2dpbmcuZXJyb3I8cGxhY2Vob2xkZXI+ICNACisgICAgICAgICIiIi5yZXBsYWNlKAorICAgICAgICAgICAgICAgICI8cGxhY2Vob2xkZXI+Iiwgc3RtdAorICAgICAgICAgICAgKQorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9tb2R1bGUoTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydChzdG10c1swXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKHN0bXRzWzFdKQorCisgICAgZGVmIF9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfbWVzc2FnZShzZWxmLCBtc2csIHN0bXQsIGFyZ3M9Tm9uZSwgd2l0aF90b29fbWFueT1GYWxzZSk6CisgICAgICAgIHN0bXRzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGxvZ2dpbmcgI0AKKyAgICAgICAgbG9nZ2luZy5lcnJvcjxwbGFjZWhvbGRlcj4gI0AKKyAgICAgICAgIiIiLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgIjxwbGFjZWhvbGRlcj4iLCBzdG10CisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KHN0bXRzWzBdKQorICAgICAgICBtZXNzYWdlcyA9IFtNZXNzYWdlKG1zZywgbm9kZT1zdG10c1sxXSwgYXJncz1hcmdzLCBjb25maWRlbmNlPVVOREVGSU5FRCldCisgICAgICAgIGlmIHdpdGhfdG9vX21hbnk6CisgICAgICAgICAgICBtZXNzYWdlcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgTWVzc2FnZSgibG9nZ2luZy10b28tbWFueS1hcmdzIiwgbm9kZT1zdG10c1sxXSwgY29uZmlkZW5jZT1VTkRFRklORUQpCisgICAgICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoKm1lc3NhZ2VzKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKHN0bXRzWzFdKQorCisgICAgZGVmIF9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfdG9vX2Zld19hcmdzKHNlbGYsIHN0bXQpOgorICAgICAgICBzZWxmLl9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfbWVzc2FnZSgibG9nZ2luZy10b28tZmV3LWFyZ3MiLCBzdG10KQorCisgICAgZGVmIF9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfdG9vX21hbnlfYXJncyhzZWxmLCBzdG10KToKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X21lc3NhZ2UoImxvZ2dpbmctdG9vLW1hbnktYXJncyIsIHN0bXQpCisKKyAgICBAc2V0X2NvbmZpZyhsb2dnaW5nX2Zvcm1hdF9zdHlsZT0ibmV3IikKKyAgICBkZWYgdGVzdF9icmFjZV9mb3JtYXRfc3R5bGVfbWF0Y2hpbmdfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLl9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfbm9fbWVzc2FnZXMoIignY29uc3RhbnQgc3RyaW5nJykiKQorICAgICAgICBzZWxmLl9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfbm9fbWVzc2FnZXMoIigne30nKSIpCisgICAgICAgIHNlbGYuX2Fzc2VydF9sb2dnaW5nX2Zvcm1hdF9ub19tZXNzYWdlcygiKCd7fScsIDEpIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X25vX21lc3NhZ2VzKCIoJ3swfScsIDEpIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X25vX21lc3NhZ2VzKCIoJ3tuYW1lZH0nLCB7J25hbWVkJzogMX0pIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X25vX21lc3NhZ2VzKCIoJ3t9IHtuYW1lZH0nLCAxLCB7J25hbWVkJzogMX0pIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X25vX21lc3NhZ2VzKCIoJ3swfSB7bmFtZWR9JywgMSwgeyduYW1lZCc6IDF9KSIpCisKKyAgICBAc2V0X2NvbmZpZyhsb2dnaW5nX2Zvcm1hdF9zdHlsZT0ibmV3IikKKyAgICBkZWYgdGVzdF9icmFjZV9mb3JtYXRfc3R5bGVfdG9vX2Zld19hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLl9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfdG9vX2Zld19hcmdzKCIoJ3t9LCB7fScsIDEpIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X3Rvb19mZXdfYXJncygiKCd7MH0sIHsxfScsIDEpIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X3Rvb19mZXdfYXJncygKKyAgICAgICAgICAgICIoJ3tuYW1lZDF9LCB7bmFtZWQyfScsIHsnbmFtZWQxJzogMX0pIgorICAgICAgICApCisgICAgICAgIHNlbGYuX2Fzc2VydF9sb2dnaW5nX2Zvcm1hdF90b29fZmV3X2FyZ3MoIignezB9LCB7bmFtZWR9JywgMSkiKQorICAgICAgICBzZWxmLl9hc3NlcnRfbG9nZ2luZ19mb3JtYXRfdG9vX2Zld19hcmdzKCIoJ3t9LCB7bmFtZWR9JywgeyduYW1lZCc6IDF9KSIpCisgICAgICAgIHNlbGYuX2Fzc2VydF9sb2dnaW5nX2Zvcm1hdF90b29fZmV3X2FyZ3MoIignezB9LCB7bmFtZWR9JywgeyduYW1lZCc6IDF9KSIpCisKKyAgICBAc2V0X2NvbmZpZyhsb2dnaW5nX2Zvcm1hdF9zdHlsZT0ibmV3IikKKyAgICBkZWYgdGVzdF9icmFjZV9mb3JtYXRfc3R5bGVfbm90X2Vub3VnaF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuX2Fzc2VydF9sb2dnaW5nX2Zvcm1hdF90b29fbWFueV9hcmdzKCIoJ2NvbnN0YW50IHN0cmluZycsIDEsIDIpIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X3Rvb19tYW55X2FyZ3MoIigne30nLCAxLCAyKSIpCisgICAgICAgIHNlbGYuX2Fzc2VydF9sb2dnaW5nX2Zvcm1hdF90b29fbWFueV9hcmdzKCIoJ3swfScsIDEsIDIpIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X3Rvb19tYW55X2FyZ3MoIigne30sIHtuYW1lZH0nLCAxLCAyLCB7J25hbWVkJzogMX0pIikKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ2dpbmdfZm9ybWF0X3Rvb19tYW55X2FyZ3MoCisgICAgICAgICAgICAiKCd7MH0sIHtuYW1lZH0nLCAxLCAyLCB7J25hbWVkJzogMX0pIgorICAgICAgICApCisKKyAgICBAcHl0ZXN0Lm1hcmsuc2tpcGlmKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgNiksIHJlYXNvbj0iRi1zdHJpbmcgcmVxdWlyZSA+PTMuNiIpCisgICAgQHNldF9jb25maWcobG9nZ2luZ19mb3JtYXRfc3R5bGU9Im5ldyIpCisgICAgZGVmIHRlc3RfZnN0cl9ub3RfbmV3X2Zvcm1hdF9zdHlsZV9tYXRjaGluZ19hcmd1bWVudHMoc2VsZik6CisgICAgICAgIG1zZyA9ICJsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbiIKKyAgICAgICAgYXJncyA9ICgibGF6eSAlIiwpCisgICAgICAgIHNlbGYuX2Fzc2VydF9sb2dnaW5nX2Zvcm1hdF9tZXNzYWdlKG1zZywgIihmJ3tuYW1lZH0nKSIsIGFyZ3MpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9taXNjLnB5IGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfbWlzYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA1OWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfbWlzYy5weQpAQCAtMCwwICsxLDEwNyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgMjAxNi0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgZ2xlZ291eCA8Z2lsbGVzLmxlZ291eEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBSb2dhbHNraSwgTHVrYXN6IDxsdWthc3oucm9nYWxza2lAaW50ZWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJUZXN0cyBmb3IgdGhlIG1pc2MgY2hlY2tlci4iIiIKKworZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IG1pc2MKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBfdG9rZW5pemVfc3RyLCBzZXRfY29uZmlnCisKKworY2xhc3MgVGVzdEZpeG1lKENoZWNrZXJUZXN0Q2FzZSk6CisgICAgQ0hFQ0tFUl9DTEFTUyA9IG1pc2MuRW5jb2RpbmdDaGVja2VyCisKKyAgICBkZWYgdGVzdF9maXhtZV93aXRoX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGNvZGUgPSAiIiJhID0gMQorICAgICAgICAgICAgICAgICMgRklYTUUgbWVzc2FnZQorICAgICAgICAgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImZpeG1lIiwgbGluZT0yLCBhcmdzPSJGSVhNRSBtZXNzYWdlIikKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGNvZGUpKQorCisgICAgZGVmIHRlc3RfdG9kb193aXRob3V0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGNvZGUgPSAiIiJhID0gMQorICAgICAgICAgICAgICAgICMgVE9ETworICAgICAgICAgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKE1lc3NhZ2UobXNnX2lkPSJmaXhtZSIsIGxpbmU9MiwgYXJncz0iVE9ETyIpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGNvZGUpKQorCisgICAgZGVmIHRlc3RfeHh4X3dpdGhvdXRfc3BhY2Uoc2VsZik6CisgICAgICAgIGNvZGUgPSAiIiJhID0gMQorICAgICAgICAgICAgICAgICNYWFgKKyAgICAgICAgICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKG1zZ19pZD0iZml4bWUiLCBsaW5lPTIsIGFyZ3M9IlhYWCIpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGNvZGUpKQorCisgICAgZGVmIHRlc3RfeHh4X21pZGRsZShzZWxmKToKKyAgICAgICAgY29kZSA9ICIiImEgPSAxCisgICAgICAgICAgICAgICAgIyBtaWRsZSBYWFgKKyAgICAgICAgICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGNvZGUpKQorCisgICAgZGVmIHRlc3Rfd2l0aG91dF9zcGFjZV9maXhtZShzZWxmKToKKyAgICAgICAgY29kZSA9ICIiImEgPSAxCisgICAgICAgICAgICAgICAgI0ZJWE1FCisgICAgICAgICAgICAgICAgIiIiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9ImZpeG1lIiwgbGluZT0yLCBhcmdzPSJGSVhNRSIpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGNvZGUpKQorCisgICAgQHNldF9jb25maWcobm90ZXM9W10pCisgICAgZGVmIHRlc3RfYWJzZW50X2NvZGV0YWcoc2VsZik6CisgICAgICAgIGNvZGUgPSAiIiJhID0gMQorICAgICAgICAgICAgICAgICMgRklYTUUJICAgICAgICAgICAgICAgICMgRklYTUUKKyAgICAgICAgICAgICAgICAjIFRPRE8JICAgICAgICAgICAgICAgICMgVE9ETworICAgICAgICAgICAgICAgICMgWFhYCSAgICAgICAgICAgICAgICAjIFhYWAorICAgICAgICAgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoY29kZSkpCisKKyAgICBAc2V0X2NvbmZpZyhub3Rlcz1bIkNPREVUQUciXSkKKyAgICBkZWYgdGVzdF9vdGhlcl9wcmVzZW50X2NvZGV0YWcoc2VsZik6CisgICAgICAgIGNvZGUgPSAiIiJhID0gMQorICAgICAgICAgICAgICAgICMgQ09ERVRBRworICAgICAgICAgICAgICAgICMgRklYTUUKKyAgICAgICAgICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKG1zZ19pZD0iZml4bWUiLCBsaW5lPTIsIGFyZ3M9IkNPREVUQUciKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc190b2tlbnMoX3Rva2VuaXplX3N0cihjb2RlKSkKKworICAgIGRlZiB0ZXN0X2lzc3VlXzIzMjFfc2hvdWxkX25vdF90cmlnZ2VyKHNlbGYpOgorICAgICAgICBjb2RlID0gJ3ByaW50KCIjIFRPRE8gdGhpcyBzaG91bGQgbm90IHRyaWdnZXIgYSBmaXhtZSIpJworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoY29kZSkpCisKKyAgICBkZWYgdGVzdF9pc3N1ZV8yMzIxX3Nob3VsZF90cmlnZ2VyKHNlbGYpOgorICAgICAgICBjb2RlID0gIiMgVE9ETyB0aGlzIHNob3VsZCBub3QgdHJpZ2dlciBhIGZpeG1lIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImZpeG1lIiwgbGluZT0xLCBhcmdzPSJUT0RPIHRoaXMgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgZml4bWUiKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoY29kZSkpCisKKyAgICBkZWYgdGVzdF9kb250X3RyaWdnZXJfb25fdG9kb2lzdChzZWxmKToKKyAgICAgICAgY29kZSA9ICIiIgorICAgICAgICAjIFRvZG9pc3QgQVBJOiBXaGF0IGlzIHRoaXMgdGFzayBhYm91dD8KKyAgICAgICAgIyBUb2RvaXN0IEFQSTogTG9vayB1cCBhIHRhc2sncyBkdWUgZGF0ZQorICAgICAgICAjIFRvZG9pc3QgQVBJOiBMb29rIHVwIGEgUHJvamVjdC9MYWJlbC9UYXNrIElECisgICAgICAgICMgVG9kb2lzdCBBUEk6IEZldGNoIGFsbCBsYWJlbHMKKyAgICAgICAgIyBUb2RvaXN0IEFQSTogIk5hbWUiIHZhbHVlCisgICAgICAgICMgVG9kb2lzdCBBUEk6IEdldCBhIHRhc2sncyBwcmlvcml0eQorICAgICAgICAjIFRvZG9pc3QgQVBJOiBMb29rIHVwIHRoZSBQcm9qZWN0IElEIGEgVGFzayBiZWxvbmdzIHRvCisgICAgICAgICMgVG9kb2lzdCBBUEk6IEZldGNoIGFsbCBQcm9qZWN0cworICAgICAgICAjIFRvZG9pc3QgQVBJOiBGZXRjaCBhbGwgVGFza3MKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc190b2tlbnMoX3Rva2VuaXplX3N0cihjb2RlKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3B5dGhvbjMucHkgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9weXRob24zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2QxNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9weXRob24zLnB5CkBAIC0wLDAgKzEsMTE3NyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgQnJldHQgQ2Fubm9uIDxicmV0dEBweXRob24ub3JnPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNSBDb3NtaW4gUG9pZWFuYSA8Y21pbkByb3B5dGhvbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBWaW9yZWwgU3RpcmJ1IDx2aW9yZWxzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgUm95IFdpbGxpYW1zIDxyb3kud2lsbGlhbXMuaWlpQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IFJveSBXaWxsaWFtcyA8cndpbGxpYW1zQGx5ZnQuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBEYW5pZWwgTWlsbGVyIDxtaWxsZXJkZXZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IHNiYWdhbiA8cG5sYmFnYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQWl2YXIgQW5uYW1hYSA8YWl2YXJhbm5hbWFhQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgR2FicmllbCBSIFNlemVmcmVkbyA8Z2FicmllbEBzZXplZnJlZG8uY29tLmJyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRmVkZXJpY28gQm9uZCA8ZmVkZXJpY29ib25kQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEF0aG9zIFJpYmVpcm8gPGF0aG9zY3JAZmVkb3JhcHJvamVjdC5vcmc+CisjIENvcHlyaWdodCAoYykgMjAyMSBUaWFnbyBIb25vcmF0byA8dGlhZ29ob25vcmF0bzFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgdGlhZ29ob25vcmF0byA8NjEwNTkyNDMrdGlhZ29ob25vcmF0b0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBEYXZpZCBHaWxtYW4gPGRhdmlkZ2lsbWFuMUBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdHMgZm9yIHRoZSBweXRob24zIGNoZWNrZXJzLiIiIgorCisjIHB5bGludDogZGlzYWJsZT10b28tbWFueS1wdWJsaWMtbWV0aG9kcyxyZWRlZmluZWQtb3V0ZXItbmFtZQorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludCBpbXBvcnQgdGVzdHV0aWxzCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgcHl0aG9uMyBhcyBjaGVja2VyCitmcm9tIHB5bGludC5pbnRlcmZhY2VzIGltcG9ydCBJTkZFUkVOQ0UsIElORkVSRU5DRV9GQUlMVVJFCisKKyMgVE9ETyhjcG9wYSk6IFBvcnQgdGhlc2UgdG8gdGhlIGZ1bmN0aW9uYWwgdGVzdCBmcmFtZXdvcmsgaW5zdGVhZC4gcHlsaW50OiBkaXNhYmxlPWZpeG1lCisKKworY2xhc3MgVGVzdFB5dGhvbjNDaGVja2VyKHRlc3R1dGlscy5DaGVja2VyVGVzdENhc2UpOgorCisgICAgQ0hFQ0tFUl9DTEFTUyA9IGNoZWNrZXIuUHl0aG9uM0NoZWNrZXIKKworICAgIGRlZiBjaGVja19iYWRfYnVpbHRpbihzZWxmLCBidWlsdGluX25hbWUpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoYnVpbHRpbl9uYW1lICsgIiAgI0AiKQorICAgICAgICBtZXNzYWdlID0gYnVpbHRpbl9uYW1lLmxvd2VyKCkgKyAiLWJ1aWx0aW4iCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXModGVzdHV0aWxzLk1lc3NhZ2UobWVzc2FnZSwgbm9kZT1ub2RlKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfbmFtZShub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX2J1aWx0aW5zKHNlbGYpOgorICAgICAgICBidWlsdGlucyA9IFsKKyAgICAgICAgICAgICJhcHBseSIsCisgICAgICAgICAgICAiYnVmZmVyIiwKKyAgICAgICAgICAgICJjbXAiLAorICAgICAgICAgICAgImNvZXJjZSIsCisgICAgICAgICAgICAiZXhlY2ZpbGUiLAorICAgICAgICAgICAgImZpbGUiLAorICAgICAgICAgICAgImlucHV0IiwKKyAgICAgICAgICAgICJpbnRlcm4iLAorICAgICAgICAgICAgImxvbmciLAorICAgICAgICAgICAgInJhd19pbnB1dCIsCisgICAgICAgICAgICAicm91bmQiLAorICAgICAgICAgICAgInJlZHVjZSIsCisgICAgICAgICAgICAiU3RhbmRhcmRFcnJvciIsCisgICAgICAgICAgICAidW5pY2hyIiwKKyAgICAgICAgICAgICJ1bmljb2RlIiwKKyAgICAgICAgICAgICJ4cmFuZ2UiLAorICAgICAgICAgICAgInJlbG9hZCIsCisgICAgICAgIF0KKyAgICAgICAgZm9yIGJ1aWx0aW4gaW4gYnVpbHRpbnM6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2JhZF9idWlsdGluKGJ1aWx0aW4pCisKKyAgICBkZWYgYXNfaXRlcmFibGVfaW5fZm9yX2xvb3BfdGVzdChzZWxmLCBmeG4pOgorICAgICAgICBjb2RlID0gZiJmb3IgeCBpbiB7ZnhufSgpOiBwYXNzIgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKGNvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobW9kdWxlKQorCisgICAgZGVmIGFzX3VzZWRfYnlfaXRlcmFibGVfaW5fZm9yX2xvb3BfdGVzdChzZWxmLCBmeG4pOgorICAgICAgICBjaGVja2VyID0gZiJ7ZnhufS1idWlsdGluLW5vdC1pdGVyYXRpbmciCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgIGYiIiIKKyAgICAgICAgZm9yIHggaW4gKHdoYXRldmVyKAorICAgICAgICAgICAge2Z4bn0oKSAjQAorICAgICAgICApKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKGNoZWNrZXIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgYXNfaXRlcmFibGVfaW5fZ2VuZXhwX3Rlc3Qoc2VsZiwgZnhuKToKKyAgICAgICAgY29kZSA9IGYieCA9ICh4IGZvciB4IGluIHtmeG59KCkpIgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKGNvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobW9kdWxlKQorCisgICAgZGVmIGFzX2l0ZXJhYmxlX2luX3N0YXJyZWRfY29udGV4dChzZWxmLCBmeG4pOgorICAgICAgICBjb2RlID0gZiJ4ID0gdGVzdCgqe2Z4bn0oKSkiCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgYXNfaXRlcmFibGVfaW5fbGlzdGNvbXBfdGVzdChzZWxmLCBmeG4pOgorICAgICAgICBjb2RlID0gZiJ4ID0gW3ggZm9yIHggaW4ge2Z4bn0oTm9uZSwgWzFdKV0iCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgYXNfaXRlcmFibGVfaW5feWllbGRfZnJvbShzZWxmLCBmeG4pOgorICAgICAgICBjb2RlID0gZiJ5aWVsZCBmcm9tIHtmeG59KCkiCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgYXNfdXNlZF9pbl92YXJpYW50X2luX2dlbmV4cF90ZXN0KHNlbGYsIGZ4bik6CisgICAgICAgIGNoZWNrZXIgPSBmIntmeG59LWJ1aWx0aW4tbm90LWl0ZXJhdGluZyIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgZiIiIgorICAgICAgICBsaXN0KAorICAgICAgICAgICAgX18oe2Z4bn0oeCkpCisgICAgICAgICAgICBmb3IgeCBpbiBbMV0KKyAgICAgICAgKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoY2hlY2tlciwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiBhc191c2VkX2luX3ZhcmlhbnRfaW5fbGlzdGNvbXBfdGVzdChzZWxmLCBmeG4pOgorICAgICAgICBjaGVja2VyID0gZiJ7ZnhufS1idWlsdGluLW5vdC1pdGVyYXRpbmciCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgIGYiIiIKKyAgICAgICAgWworICAgICAgICAgICAgX18oe2Z4bn0oTm9uZSwgeCkpCisgICAgICAgIGZvciB4IGluIFtbMV1dXQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoY2hlY2tlciwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiBhc19hcmd1bWVudF90b19jYWxsYWJsZV9jb25zdHJ1Y3Rvcl90ZXN0KHNlbGYsIGZ4biwgY2FsbGFibGVfZm4pOgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKGYieCA9IHtjYWxsYWJsZV9mbn0oe2Z4bn0oKSkiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiBhc19hcmd1bWVudF90b19tYXRlcmlhbGl6ZWRfZmlsdGVyKHNlbGYsIGNhbGxhYmxlX2ZuKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZShmImxpc3QoZmlsdGVyKE5vbmUsIHtjYWxsYWJsZV9mbn0oKSkpIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgYXNfYXJndW1lbnRfdG9fcmFuZG9tX2Z4bl90ZXN0KHNlbGYsIGZ4bik6CisgICAgICAgIGNoZWNrZXIgPSBmIntmeG59LWJ1aWx0aW4tbm90LWl0ZXJhdGluZyIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgZiIiIgorICAgICAgICB5KAorICAgICAgICAgICAge2Z4bn0oKSAjQAorICAgICAgICApCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZShjaGVja2VyLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIGFzX2FyZ3VtZW50X3RvX3N0cl9qb2luX3Rlc3Qoc2VsZiwgZnhuKToKKyAgICAgICAgY29kZSA9IGYieCA9ICcnLmpvaW4oe2Z4bn0oKSkiCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgYXNfYXJndW1lbnRfdG9faXRlcnRvb2xzX2Z1bmN0aW9ucyhzZWxmLCBmeG4pOgorICAgICAgICBjb2RlID0gZiIiIgorICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorICAgICAgICBpbXBvcnQgaXRlcnRvb2xzCisgICAgICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0CisgICAgICAgIGZvciBpLGogaW4gcHJvZHVjdCh7ZnhufSgpLCByZXBlYXQ9Mik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBpLGogaW4gaXRlcnRvb2xzLnByb2R1Y3Qoe2Z4bn0oKSwgcmVwZWF0PTIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZShjb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiBhc19hcmd1bWVudF90b196aXBfdGVzdChzZWxmLCBmeG4pOgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKGYibGlzdCh6aXAoe2Z4bn0pKSIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobW9kdWxlKQorCisgICAgZGVmIGFzX2FyZ3VtZW50X3RvX21hcF90ZXN0KHNlbGYsIGZ4bik6CisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoZiJsaXN0KG1hcChfXywge2Z4bn0oKSkpIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgYXNfaXRlcmFibGVfaW5fdW5wYWNraW5nKHNlbGYsIGZ4bik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgIGYiIiIKKyAgICAgICAgYSwgYiA9IF9fKHtmeG59KCkpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIGFzX2Fzc2lnbm1lbnQoc2VsZiwgZnhuKToKKyAgICAgICAgY2hlY2tlciA9IGYie2Z4bn0tYnVpbHRpbi1ub3QtaXRlcmF0aW5nIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICBmIiIiCisgICAgICAgIGEgPSBfXyh7ZnhufSgpKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoY2hlY2tlciwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiBpdGVyYXRpbmdfY29udGV4dF90ZXN0cyhzZWxmLCBmeG4pOgorICAgICAgICAiIiJIZWxwZXIgZm9yIHZlcmlmeWluZyBhIGZ1bmN0aW9uIGlzbid0IHVzZWQgYXMgYW4gaXRlcmF0b3IuIiIiCisgICAgICAgIHNlbGYuYXNfaXRlcmFibGVfaW5fZm9yX2xvb3BfdGVzdChmeG4pCisgICAgICAgIHNlbGYuYXNfdXNlZF9ieV9pdGVyYWJsZV9pbl9mb3JfbG9vcF90ZXN0KGZ4bikKKyAgICAgICAgc2VsZi5hc19pdGVyYWJsZV9pbl9nZW5leHBfdGVzdChmeG4pCisgICAgICAgIHNlbGYuYXNfaXRlcmFibGVfaW5fbGlzdGNvbXBfdGVzdChmeG4pCisgICAgICAgIHNlbGYuYXNfdXNlZF9pbl92YXJpYW50X2luX2dlbmV4cF90ZXN0KGZ4bikKKyAgICAgICAgc2VsZi5hc191c2VkX2luX3ZhcmlhbnRfaW5fbGlzdGNvbXBfdGVzdChmeG4pCisgICAgICAgIHNlbGYuYXNfYXJndW1lbnRfdG9fcmFuZG9tX2Z4bl90ZXN0KGZ4bikKKyAgICAgICAgc2VsZi5hc19hcmd1bWVudF90b19zdHJfam9pbl90ZXN0KGZ4bikKKyAgICAgICAgc2VsZi5hc19pdGVyYWJsZV9pbl91bnBhY2tpbmcoZnhuKQorICAgICAgICBzZWxmLmFzX2Fzc2lnbm1lbnQoZnhuKQorICAgICAgICBzZWxmLmFzX2FyZ3VtZW50X3RvX21hdGVyaWFsaXplZF9maWx0ZXIoZnhuKQorICAgICAgICBzZWxmLmFzX2l0ZXJhYmxlX2luX3lpZWxkX2Zyb20oZnhuKQorICAgICAgICBzZWxmLmFzX2l0ZXJhYmxlX2luX3N0YXJyZWRfY29udGV4dChmeG4pCisgICAgICAgIHNlbGYuYXNfYXJndW1lbnRfdG9faXRlcnRvb2xzX2Z1bmN0aW9ucyhmeG4pCisgICAgICAgIHNlbGYuYXNfYXJndW1lbnRfdG9femlwX3Rlc3QoZnhuKQorICAgICAgICBzZWxmLmFzX2FyZ3VtZW50X3RvX21hcF90ZXN0KGZ4bikKKyAgICAgICAgZm9yIGZ1bmMgaW4gKAorICAgICAgICAgICAgIml0ZXIiLAorICAgICAgICAgICAgImxpc3QiLAorICAgICAgICAgICAgInR1cGxlIiwKKyAgICAgICAgICAgICJzb3J0ZWQiLAorICAgICAgICAgICAgInNldCIsCisgICAgICAgICAgICAic3VtIiwKKyAgICAgICAgICAgICJhbnkiLAorICAgICAgICAgICAgImFsbCIsCisgICAgICAgICAgICAiZW51bWVyYXRlIiwKKyAgICAgICAgICAgICJkaWN0IiwKKyAgICAgICAgICAgICJPcmRlcmVkRGljdCIsCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFzX2FyZ3VtZW50X3RvX2NhbGxhYmxlX2NvbnN0cnVjdG9yX3Rlc3QoZnhuLCBmdW5jKQorCisgICAgZGVmIHRlc3RfZGljdF9zdWJjbGFzc2VzX21ldGhvZHNfaW5faXRlcmF0aW5nX2NvbnRleHQoc2VsZik6CisgICAgICAgIGl0ZXJhdGluZywgbm90X2l0ZXJhdGluZyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CisgICAgICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CisgICAgICAgIGQgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBhLCBiID0gZC5rZXlzKCkgI0AKKyAgICAgICAgeCA9IGQua2V5cygpICNACisgICAgICAgICIiIgorICAgICAgICApCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKGl0ZXJhdGluZy52YWx1ZSkKKworICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRpY3Qta2V5cy1ub3QtaXRlcmF0aW5nIiwgbm9kZT1ub3RfaXRlcmF0aW5nLnZhbHVlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm90X2l0ZXJhdGluZy52YWx1ZSkKKworICAgIGRlZiB0ZXN0X2RpY3RfbWV0aG9kc19pbl9pdGVyYXRpbmdfY29udGV4dChzZWxmKToKKyAgICAgICAgaXRlcmF0aW5nX2NvZGUgPSBbCisgICAgICAgICAgICAiZm9yIHggaW4ge30oKTogcGFzcyIsCisgICAgICAgICAgICAiKHggZm9yIHggaW4ge30oKSkiLAorICAgICAgICAgICAgIlt4IGZvciB4IGluIHt9KCldIiwKKyAgICAgICAgICAgICJpdGVyKHt9KCkpIiwKKyAgICAgICAgICAgICJhLCBiID0ge30oKSIsCisgICAgICAgICAgICAibWF4KHt9KCkpIiwKKyAgICAgICAgICAgICJtaW4oe30oKSkiLAorICAgICAgICAgICAgIjMgaW4ge30oKSIsCisgICAgICAgICAgICAiMyBub3QgaW4ge30oKSIsCisgICAgICAgICAgICAic2V0KCkudXBkYXRlKHt9KCkpIiwKKyAgICAgICAgICAgICJbXS5leHRlbmQoe30oKSkiLAorICAgICAgICAgICAgInt7fX0udXBkYXRlKHt9KCkpIiwKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKKyAgICAgICAgICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgorICAgICAgICAgICAgY2hhaW4uZnJvbV9pdGVyYWJsZSh7fSgpKQorICAgICAgICAgICAgIiIiLAorICAgICAgICBdCisgICAgICAgIG5vbl9pdGVyYXRpbmdfY29kZSA9IFsieCA9IF9fKHt9KCkpIiwgIl9fKHt9KCkpWzBdIl0KKworICAgICAgICBmb3IgbWV0aG9kIGluICgia2V5cyIsICJpdGVtcyIsICJ2YWx1ZXMiKToKKyAgICAgICAgICAgIGRpY3RfbWV0aG9kID0gZiJ7e319LnttZXRob2R9IgorCisgICAgICAgICAgICBmb3IgY29kZSBpbiBpdGVyYXRpbmdfY29kZToKKyAgICAgICAgICAgICAgICB3aXRoX3ZhbHVlID0gY29kZS5mb3JtYXQoZGljdF9tZXRob2QpCisgICAgICAgICAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSh3aXRoX3ZhbHVlKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICAgICAgICAgIGZvciBjb2RlIGluIG5vbl9pdGVyYXRpbmdfY29kZToKKyAgICAgICAgICAgICAgICB3aXRoX3ZhbHVlID0gY29kZS5mb3JtYXQoZGljdF9tZXRob2QpCisgICAgICAgICAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKHdpdGhfdmFsdWUpCisKKyAgICAgICAgICAgICAgICBjaGVja2VyID0gZiJkaWN0LXttZXRob2R9LW5vdC1pdGVyYXRpbmciCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKGNoZWNrZXIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfbWFwX2luX2l0ZXJhdGluZ19jb250ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLml0ZXJhdGluZ19jb250ZXh0X3Rlc3RzKCJtYXAiKQorCisgICAgZGVmIHRlc3RfemlwX2luX2l0ZXJhdGluZ19jb250ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLml0ZXJhdGluZ19jb250ZXh0X3Rlc3RzKCJ6aXAiKQorCisgICAgZGVmIHRlc3RfcmFuZ2VfaW5faXRlcmF0aW5nX2NvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuaXRlcmF0aW5nX2NvbnRleHRfdGVzdHMoInJhbmdlIikKKworICAgIGRlZiB0ZXN0X2ZpbHRlcl9pbl9pdGVyYXRpbmdfY29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5pdGVyYXRpbmdfY29udGV4dF90ZXN0cygiZmlsdGVyIikKKworICAgIGRlZiBkZWZpbmVkX21ldGhvZF90ZXN0KHNlbGYsIG1ldGhvZCwgd2FybmluZyk6CisgICAgICAgICIiIkhlbHBlciBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBjZXJ0YWluIG1ldGhvZCBpcyBub3QgZGVmaW5lZC4iIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgZiIiIgorICAgICAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9fe21ldGhvZH1fXyhzZWxmLCBvdGhlcik6ICAjQAorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKHdhcm5pbmcsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZGVsc2xpY2VfbWV0aG9kKHNlbGYpOgorICAgICAgICBzZWxmLmRlZmluZWRfbWV0aG9kX3Rlc3QoImRlbHNsaWNlIiwgImRlbHNsaWNlLW1ldGhvZCIpCisKKyAgICBkZWYgdGVzdF9nZXRzbGljZV9tZXRob2Qoc2VsZik6CisgICAgICAgIHNlbGYuZGVmaW5lZF9tZXRob2RfdGVzdCgiZ2V0c2xpY2UiLCAiZ2V0c2xpY2UtbWV0aG9kIikKKworICAgIGRlZiB0ZXN0X3NldHNsaWNlX21ldGhvZChzZWxmKToKKyAgICAgICAgc2VsZi5kZWZpbmVkX21ldGhvZF90ZXN0KCJzZXRzbGljZSIsICJzZXRzbGljZS1tZXRob2QiKQorCisgICAgZGVmIHRlc3RfY29lcmNlX21ldGhvZChzZWxmKToKKyAgICAgICAgc2VsZi5kZWZpbmVkX21ldGhvZF90ZXN0KCJjb2VyY2UiLCAiY29lcmNlLW1ldGhvZCIpCisKKyAgICBkZWYgdGVzdF9vY3RfbWV0aG9kKHNlbGYpOgorICAgICAgICBzZWxmLmRlZmluZWRfbWV0aG9kX3Rlc3QoIm9jdCIsICJvY3QtbWV0aG9kIikKKworICAgIGRlZiB0ZXN0X2hleF9tZXRob2Qoc2VsZik6CisgICAgICAgIHNlbGYuZGVmaW5lZF9tZXRob2RfdGVzdCgiaGV4IiwgImhleC1tZXRob2QiKQorCisgICAgZGVmIHRlc3Rfbm9uemVyb19tZXRob2Qoc2VsZik6CisgICAgICAgIHNlbGYuZGVmaW5lZF9tZXRob2RfdGVzdCgibm9uemVybyIsICJub256ZXJvLW1ldGhvZCIpCisKKyAgICBkZWYgdGVzdF9jbXBfbWV0aG9kKHNlbGYpOgorICAgICAgICBzZWxmLmRlZmluZWRfbWV0aG9kX3Rlc3QoImNtcCIsICJjbXAtbWV0aG9kIikKKworICAgIGRlZiB0ZXN0X2Rpdl9tZXRob2Qoc2VsZik6CisgICAgICAgIHNlbGYuZGVmaW5lZF9tZXRob2RfdGVzdCgiZGl2IiwgImRpdi1tZXRob2QiKQorCisgICAgZGVmIHRlc3RfaWRpdl9tZXRob2Qoc2VsZik6CisgICAgICAgIHNlbGYuZGVmaW5lZF9tZXRob2RfdGVzdCgiaWRpdiIsICJpZGl2LW1ldGhvZCIpCisKKyAgICBkZWYgdGVzdF9yZGl2X21ldGhvZChzZWxmKToKKyAgICAgICAgc2VsZi5kZWZpbmVkX21ldGhvZF90ZXN0KCJyZGl2IiwgInJkaXYtbWV0aG9kIikKKworICAgIGRlZiB0ZXN0X2VxX2FuZF9oYXNoX21ldGhvZChzZWxmKToKKyAgICAgICAgIiIiSGVscGVyIGZvciB2ZXJpZnlpbmcgdGhhdCBhIGNlcnRhaW4gbWV0aG9kIGlzIG5vdCBkZWZpbmVkLiIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOiAgI0AKKyAgICAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2VxX2FuZF9oYXNoX2lzX25vbmUoc2VsZik6CisgICAgICAgICIiIkhlbHBlciBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBjZXJ0YWluIG1ldGhvZCBpcyBub3QgZGVmaW5lZC4iIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBjbGFzcyBGb28ob2JqZWN0KTogICNACisgICAgICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NsYXNzZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9lcV93aXRob3V0X2hhc2hfbWV0aG9kKHNlbGYpOgorICAgICAgICAiIiJIZWxwZXIgZm9yIHZlcmlmeWluZyB0aGF0IGEgY2VydGFpbiBtZXRob2QgaXMgbm90IGRlZmluZWQuIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6ICAjQAorICAgICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJlcS13aXRob3V0LWhhc2giLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKCJpbXBvcnQgc3RyaW5nICAjQCIpCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydChub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgIyBtZXNzYWdlIHNob3VsZCBvbmx5IGJlIGFkZGVkIG9uY2UKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2Zyb21faW1wb3J0KHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoImZyb20gb3MgaW1wb3J0IHBhdGggICNAIikKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJuby1hYnNvbHV0ZS1pbXBvcnQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgIyBtZXNzYWdlIHNob3VsZCBvbmx5IGJlIGFkZGVkIG9uY2UKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICBkZWYgdGVzdF9hYnNvbHV0ZV9pbXBvcnQoc2VsZik6CisgICAgICAgIG1vZHVsZV9pbXBvcnQgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0OyBpbXBvcnQgb3MiCisgICAgICAgICkKKyAgICAgICAgbW9kdWxlX2Zyb20gPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0OyBmcm9tIG9zIGltcG9ydCBwYXRoIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBmb3IgbW9kdWxlIGluIChtb2R1bGVfaW1wb3J0LCBtb2R1bGVfZnJvbSk6CisgICAgICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9zdGFyX21vZHVsZV9sZXZlbChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBmcm9tIGxhbGEgaW1wb3J0ICogI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGUgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBzdGFyID0gdGVzdHV0aWxzLk1lc3NhZ2UoImltcG9ydC1zdGFyLW1vZHVsZS1sZXZlbCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZSwgc3Rhcik6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShub2RlKQorCisgICAgZGVmIHRlc3RfZGl2aXNpb24oc2VsZik6CisgICAgICAgIG5vZGVzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiJcCisgICAgICAgICAgICBmcm9tIF91bmtub3duIGltcG9ydCBhLCBiCisgICAgICAgICAgICAzIC8gMiAgI0AKKyAgICAgICAgICAgIDMgLyBpbnQoYSkgI0AKKyAgICAgICAgICAgIGludChhKSAvIDMgI0AKKyAgICAgICAgICAgIGEgLyBiICNACisgICAgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgib2xkLWRpdmlzaW9uIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYmlub3Aobm9kZSkKKworICAgIGRlZiB0ZXN0X2RpdmlzaW9uX3dpdGhfZnV0dXJlX3N0YXRlbWVudChzZWxmKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbjsgMyAvIDIiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X2Zsb29yX2RpdmlzaW9uKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoIiAzIC8vIDIgICNAIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9iaW5vcChub2RlKQorCisgICAgZGVmIHRlc3RfZGl2aXNpb25fYnlfZmxvYXQoc2VsZik6CisgICAgICAgIG5vZGVzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiJcCisgICAgICAgICAgICAzLjAgLyAyICAjQAorICAgICAgICAgICAgMyAvIDIuMCAgI0AKKyAgICAgICAgICAgIDMgLyBmbG9hdChhKSAgI0AKKyAgICAgICAgICAgIGZsb2F0KGEpIC8gMyAgI0AKKyAgICAgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYmlub3Aobm9kZSkKKworICAgIGRlZiB0ZXN0X2RpdmlzaW9uX2RpZmZlcmVudF90eXBlcyhzZWxmKToKKyAgICAgICAgbm9kZXMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgcGFzcworICAgICAgICBBIC8gMiAjQAorICAgICAgICBBKCkgLyAyICNACisgICAgICAgICJhIiAvICJhIiAjQAorICAgICAgICBjbGFzcyBQYXRoOgorICAgICAgICAgICAgZGVmIF9fZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICBQYXRoKCkgLyAyNCAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBmb3Igbm9kZSBpbiBub2RlczoKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Jpbm9wKG5vZGUpCisKKyAgICBkZWYgdGVzdF9kaWN0X2l0ZXJfbWV0aG9kKHNlbGYpOgorICAgICAgICBmb3IgbWV0aCBpbiAoImtleXMiLCAidmFsdWVzIiwgIml0ZW1zIik6CisgICAgICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoInguaXRlciVzKCkgICNAIiAlIG1ldGgpCisgICAgICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRpY3QtaXRlci1tZXRob2QiLCBub2RlPW5vZGUpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9kaWN0X2l0ZXJfbWV0aG9kX29uX2RpY3Qoc2VsZik6CisgICAgICAgIG5vZGVzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKKyAgICAgICAge30uaXRlcmtleXMoKSAjQAorICAgICAgICBkZWZhdWx0ZGljdChsaXN0KS5pdGVya2V5cygpICNACisgICAgICAgIGNsYXNzIFNvbWVjbGFzcyhkaWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgU29tZWNsYXNzKCkuaXRlcmtleXMoKSAjQAorCisgICAgICAgICMgRW1pdHMgZXZlbiB0aG91Z2ggd2UgYXJlIG5vdCBzdXJlIHRoZXkgYXJlIGRpY3RzCisgICAgICAgIHguaXRlcmtleXMoKSAjQAorCisgICAgICAgIGRlZiBmdW5jKHgpOgorICAgICAgICAgICAgeC5pdGVya2V5cygpICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGZvciBub2RlIGluIG5vZGVzOgorICAgICAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJkaWN0LWl0ZXItbWV0aG9kIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZGljdF9ub3RfaXRlcl9tZXRob2Qoc2VsZik6CisgICAgICAgIGFyZ19ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoInguaXRlcmtleXMoeCkgICNAIikKKyAgICAgICAgc3RhcmFyZ19ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoInguaXRlcmtleXMoKngpICAjQCIpCisgICAgICAgIGt3YXJnX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgieC5pdGVya2V5cyh5PXgpICAjQCIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBmb3Igbm9kZSBpbiAoYXJnX25vZGUsIHN0YXJhcmdfbm9kZSwga3dhcmdfbm9kZSk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X2RpY3Rfdmlld19tZXRob2Qoc2VsZik6CisgICAgICAgIGZvciBtZXRoIGluICgia2V5cyIsICJ2YWx1ZXMiLCAiaXRlbXMiKToKKyAgICAgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgieC52aWV3JXMoKSAgI0AiICUgbWV0aCkKKyAgICAgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgiZGljdC12aWV3LW1ldGhvZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X2RpY3Rfdmlld2tleXMoc2VsZik6CisgICAgICAgIG5vZGVzID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKKyAgICAgICAge30udmlld2tleXMoKSAjQAorICAgICAgICBkZWZhdWx0ZGljdChsaXN0KS52aWV3a2V5cygpICNACisgICAgICAgIGNsYXNzIFNvbWVjbGFzcyhkaWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgU29tZWNsYXNzKCkudmlld2tleXMoKSAjQAorCisgICAgICAgICMgRW1pdHMgZXZlbiB0aG91Z2ggdGhleSBtaWdodCBub3QgYmUgZGljdHMKKyAgICAgICAgeC52aWV3a2V5cygpICNACisKKyAgICAgICAgZGVmIGZ1bmMoeCk6CisgICAgICAgICAgICB4LnZpZXdrZXlzKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRpY3Qtdmlldy1tZXRob2QiLCBub2RlPW5vZGUpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9uZXh0X21ldGhvZChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKCJ4Lm5leHQoKSAgI0AiKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5leHQtbWV0aG9kLWNhbGxlZCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9ub3RfbmV4dF9tZXRob2Qoc2VsZik6CisgICAgICAgIGFyZ19ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoIngubmV4dCh4KSAgI0AiKQorICAgICAgICBzdGFyYXJnX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgieC5uZXh0KCp4KSAgI0AiKQorICAgICAgICBrd2FyZ19ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoIngubmV4dCh5PXgpICAjQCIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBmb3Igbm9kZSBpbiAoYXJnX25vZGUsIHN0YXJhcmdfbm9kZSwga3dhcmdfbm9kZSk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X21ldGFjbGFzc19hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOiAgI0AKKyAgICAgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gdHlwZSIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibWV0YWNsYXNzLWFzc2lnbm1lbnQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X21ldGFjbGFzc19nbG9iYWxfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgiX19tZXRhY2xhc3NfXyA9IHR5cGUiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X3hyZWFkbGluZXNfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZi54cmVhZGxpbmVzICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgieHJlYWRsaW5lcy1hdHRyaWJ1dGUiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fbWVzc2FnZV9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oInRlc3QiKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBlLm1lc3NhZ2UgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJleGNlcHRpb24tbWVzc2FnZS1hdHRyaWJ1dGUiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9ub3JtYWxfbWVzc2FnZV9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBlLm1lc3NhZ2UgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfY29kZWMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgnZm9vYmFyLmVuY29kZSgiaGV4IikgI0AnKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImludmFsaWQtc3RyLWNvZGVjIiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X3ZhbGlkX2NvZGVjKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoJ2Zvb2Jhci5lbmNvZGUoImFzY2lpIiwgImlnbm9yZSIpICAjQCcpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfdmlzaXRfY2FsbF93aXRoX2t3YXJnKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoJ2Zvb2Jhci5yYXooZW5jb2Rpbmc9ImhleCIpICAjQCcpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9vcGVuX2NvZGVjKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoJ29wZW4oZm9vYmFyLCBlbmNvZGluZz0iaGV4IikgI0AnKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImludmFsaWQtc3RyLWNvZGVjIiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X3ZhbGlkX29wZW5fY29kZWMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgnb3Blbihmb29iYXIsIGVuY29kaW5nPSJwYWxtb3MiKSAjQCcpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfdXNpbmdfY21wX2FyZ3VtZW50KHNlbGYpOgorICAgICAgICBub2RlcyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIFtdLnNvcnQoY21wPWxhbWJkYSB4OiB4KSAjQAorICAgICAgICBhID0gbGlzdChyYW5nZSh4KSkKKyAgICAgICAgYS5zb3J0KGNtcD1sYW1iZGEgeDogeCkgI0AKKworICAgICAgICBzb3J0ZWQoW10sIGNtcD1sYW1iZGEgeDogeCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoInVzaW5nLWNtcC1hcmd1bWVudCIsIG5vZGU9bm9kZSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X3N5c19tYXhpbnQoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHN5cy5tYXhpbnQgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJzeXMtbWF4LWludCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIGRlZiB0ZXN0X2l0ZXJ0b29sc19pemlwKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRlcHJlY2F0ZWQtaXRlcnRvb2xzLWZ1bmN0aW9uIiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKGFic29sdXRlX2ltcG9ydF9tZXNzYWdlLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX3R5cGVzX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRlcHJlY2F0ZWQtdHlwZXMtZmllbGQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UsIG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20obm9kZSkKKworICAgIGRlZiB0ZXN0X3N5c19tYXhpbnRfaW1vcnRfZnJvbShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBtYXhpbnQgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoInN5cy1tYXgtaW50Iiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKGFic29sdXRlX2ltcG9ydF9tZXNzYWdlLCBtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnRmcm9tKG5vZGUpCisKKyAgICBkZWYgdGVzdF9vYmplY3RfbWF4aW50KHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc3lzID0gb2JqZWN0KCkKKyAgICAgICAgc3lzLm1heGludCAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2F0dHJpYnV0ZShub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX2ltcG9ydChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCB1cmxsaWIyLCBzeXMgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImJhZC1weXRob24zLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfaW1wb3J0X3R1cnRsZShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCB0dXJ0bGUgI0AKKyAgICAgICAgdHVydGxlLlR1cnRsZSgpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGFic29sdXRlX2ltcG9ydF9tZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5vLWFic29sdXRlLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfaW1wb3J0X2RibShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGJtIGltcG9ydCBvcGVuIGFzIG9wZW5fICNACisgICAgICAgIG9wZW5fKCJkdW1teS5kYiIpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGFic29sdXRlX2ltcG9ydF9tZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5vLWFic29sdXRlLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX2ltcG9ydF9jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBzaXgKKyAgICAgICAgaWYgc2l4LlBZMjoKKyAgICAgICAgICAgIGltcG9ydCB1cmxsaWIyICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGFic29sdXRlX2ltcG9ydF9tZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5vLWFic29sdXRlLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfaW1wb3J0X3RyeV9leGNlcHRfaGFuZGxlcihzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gaGFzaGxpYiBpbXBvcnQgc2hhCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGltcG9ydCBzaGEgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKGFic29sdXRlX2ltcG9ydF9tZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgIGRlZiB0ZXN0X2JhZF9pbXBvcnRfdHJ5KHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IG1kNSAgI0AKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZnJvbSBoYXNobGliIGltcG9ydCBtZDUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKGFic29sdXRlX2ltcG9ydF9tZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pbXBvcnQobm9kZSkKKworICAgIGRlZiB0ZXN0X2JhZF9pbXBvcnRfdHJ5X2ZpbmFsbHkoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgUXVldWUgICNACisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbXBvcnQgcXVldWUKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImJhZC1weXRob24zLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0KG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfaW1wb3J0X2Zyb20oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgibm8tYWJzb2x1dGUtaW1wb3J0Iiwgbm9kZT1ub2RlKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImJhZC1weXRob24zLWltcG9ydCIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX3N0cmluZ19hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgIHN0cmluZy5tYWtldHJhbnMgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJkZXByZWNhdGVkLXN0cmluZy1mdW5jdGlvbiIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIGRlZiB0ZXN0X2JhZF9vcGVyYXRvcl9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgb3BlcmF0b3IKKyAgICAgICAgb3BlcmF0b3IuZGl2ICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgiZGVwcmVjYXRlZC1vcGVyYXRvci1mdW5jdGlvbiIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIGRlZiB0ZXN0X2NvbXByZWhlbnNpb25fZXNjYXBlKHNlbGYpOgorICAgICAgICBhc3NpZ24sIGVzY2FwZWRfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSBbaSBmb3IgaSBpbiByYW5nZSgxMCldICNACisgICAgICAgIGkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgZ29vZF9tb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIHtjIGZvciBjIGluIHJhbmdlKDEwKX0gI0AKKyAgICAgICAge2o6aiBmb3IgaiBpbiByYW5nZSgxMCl9ICNACisgICAgICAgIFtpbWFnZV9jaGlsZF0gPSBbeCBmb3IgeCBpbiByYW5nZSgxMCldCisgICAgICAgIHRodW1ibmFpbCA9IGZ1bmMoX18oaW1hZ2VfY2hpbGQpKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImNvbXByZWhlbnNpb24tZXNjYXBlIiwgbm9kZT1lc2NhcGVkX25vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfbGlzdGNvbXAoYXNzaWduLnZhbHVlKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsoZ29vZF9tb2R1bGUpCisKKyAgICBkZWYgdGVzdF9jb21wcmVoZW5zaW9uX2VzY2FwZV9uZXdseV9pbnRyb2R1Y2VkKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgW2kgZm9yIGkgaW4gcmFuZ2UoMyldCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgaQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG5vZGUpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fZXNjYXBlKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjICNACisgICAgICAgIHRyeToKKyAgICAgICAgICAgMi8wCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKSBhcyBleGM6CisgICAgICAgICAgIGV4YyA9IDIKKyAgICAgICAgZXhjICNACisgICAgICAgIHRyeToKKyAgICAgICAgICAgMi8wCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKTogI0AKKyAgICAgICAgICAgZXhjID0gMgorICAgICAgICBleGMgI0AKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IpIGFzIGV4YzoKKyAgICAgICAgICAgZm9vKGJhciBmb3IgYmFyIGluIGV4Yy5iYXIpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgiZXhjZXB0aW9uLWVzY2FwZSIsIG5vZGU9bW9kdWxlLmJvZHlbMV0udmFsdWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZXhjZXB0aGFuZGxlcihtb2R1bGUuYm9keVswXS5oYW5kbGVyc1swXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9leGNlcHRoYW5kbGVyKG1vZHVsZS5ib2R5WzJdLmhhbmRsZXJzWzBdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2V4Y2VwdGhhbmRsZXIobW9kdWxlLmJvZHlbNF0uaGFuZGxlcnNbMF0pCisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZXhjZXB0aGFuZGxlcihtb2R1bGUuYm9keVs2XS5oYW5kbGVyc1swXSkKKworICAgIGRlZiB0ZXN0X2JhZF9zeXNfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBzeXMuZXhjX2NsZWFyICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgiZGVwcmVjYXRlZC1zeXMtZnVuY3Rpb24iLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfdXJsbGliX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgbm9kZXMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgdXJsbGliCisgICAgICAgIHVybGxpYi5hZGRiYXNlICNACisgICAgICAgIHVybGxpYi5zcGxpdGhvc3QgI0AKKyAgICAgICAgdXJsbGliLnVybHJldHJpZXZlICNACisgICAgICAgIHVybGxpYi51cmxvcGVuICNACisgICAgICAgIHVybGxpYi51cmxlbmNvZGUgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXM6CisgICAgICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRlcHJlY2F0ZWQtdXJsbGliLWZ1bmN0aW9uIiwgbm9kZT1ub2RlKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9va19zdHJpbmdfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHN0cmluZworICAgICAgICBzdHJpbmcuYXNjaWlfbGV0dGVycyAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2F0dHJpYnV0ZShub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX3N0cmluZ19jYWxsKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHN0cmluZworICAgICAgICBzdHJpbmcudXBwZXIoImhlbGxvIHdvcmxkIikgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJkZXByZWNhdGVkLXN0cmluZy1mdW5jdGlvbiIsIG5vZGU9bm9kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9va19zaGFkb3dlZF9jYWxsKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHNpeC5tb3Zlcy5jb25maWdwYXJzZXIKKyAgICAgICAgc2l4Lm1vdmVzLmNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKSAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X29rX3N0cmluZ19jYWxsKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHN0cmluZworICAgICAgICBzdHJpbmcuRm9yYW10dGVyKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9iYWRfc3RyaW5nX2ltcG9ydF9mcm9tKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCBhdG9pICNACisgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJuby1hYnNvbHV0ZS1pbXBvcnQiLCBub2RlPW5vZGUpCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgiZGVwcmVjYXRlZC1zdHJpbmctZnVuY3Rpb24iLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UsIG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20obm9kZSkKKworICAgIGRlZiB0ZXN0X29rX3N0cmluZ19pbXBvcnRfZnJvbShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgZGlnaXRzICNACisgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBhYnNvbHV0ZV9pbXBvcnRfbWVzc2FnZSA9IHRlc3R1dGlscy5NZXNzYWdlKCJuby1hYnNvbHV0ZS1pbXBvcnQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoYWJzb2x1dGVfaW1wb3J0X21lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2ltcG9ydGZyb20obm9kZSkKKworICAgIGRlZiB0ZXN0X2JhZF9zdHJfdHJhbnNsYXRlX2NhbGxfc3RyaW5nX2xpdGVyYWwoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICAgZm9vYmFyLnRyYW5zbGF0ZShOb25lLCAnYWJjMTIzJykgI0AKKyAgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgKKyAgICAgICAgICAgICJkZXByZWNhdGVkLXN0ci10cmFuc2xhdGUtY2FsbCIsIG5vZGU9bm9kZSwgY29uZmlkZW5jZT1JTkZFUkVOQ0VfRkFJTFVSRQorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX3N0cl90cmFuc2xhdGVfY2FsbF92YXJpYWJsZShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICBkZWYgcmF6KGZvb2Jhcik6CisgICAgICAgICAgIGZvb2Jhci50cmFuc2xhdGUoTm9uZSwgJ2hlbGxvJykgI0AKKyAgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSB0ZXN0dXRpbHMuTWVzc2FnZSgKKyAgICAgICAgICAgICJkZXByZWNhdGVkLXN0ci10cmFuc2xhdGUtY2FsbCIsIG5vZGU9bm9kZSwgY29uZmlkZW5jZT1JTkZFUkVOQ0VfRkFJTFVSRQorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfYmFkX3N0cl90cmFuc2xhdGVfY2FsbF9pbmZlcl9zdHIoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICAgZm9vYmFyID0gImhlbGxvIHdvcmxkIgorICAgICAgICAgZm9vYmFyLnRyYW5zbGF0ZShOb25lLCBmb29iYXIpICNACisgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoCisgICAgICAgICAgICAiZGVwcmVjYXRlZC1zdHItdHJhbnNsYXRlLWNhbGwiLCBub2RlPW5vZGUsIGNvbmZpZGVuY2U9SU5GRVJFTkNFCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9va19zdHJfdHJhbnNsYXRlX2NhbGxfaW50ZWdlcihzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICBmb29iYXIudHJhbnNsYXRlKE5vbmUsIDMzKSAjQAorICAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9va19zdHJfdHJhbnNsYXRlX2NhbGxfa2V5d29yZChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICBmb29iYXIudHJhbnNsYXRlKE5vbmUsICdmb29iYXInLCByYXo9MzMpICNACisgICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X29rX3N0cl90cmFuc2xhdGVfY2FsbF9ub3Rfc3RyKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgIGZvb2JhciA9IHt9CisgICAgICAgICBmb29iYXIudHJhbnNsYXRlKE5vbmUsICdmb29iYXInKSAjQAorICAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9ub25fcHkyX2NvbmRpdGlvbmFsKHNlbGYpOgorICAgICAgICBjb2RlID0gIiIiCisgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgeCA9IHt9CisgICAgICAgIGlmIHN5cy5tYXhzaXplOgorICAgICAgICAgICAgeC5pdGVya2V5cygpICAjQAorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKGNvZGUpCisgICAgICAgIG1vZHVsZSA9IG5vZGUucGFyZW50LnBhcmVudAorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoImRpY3QtaXRlci1tZXRob2QiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLndhbGsobW9kdWxlKQorCisgICAgZGVmIHRlc3Rfc2l4X2NvbmRpdGlvbmFsKHNlbGYpOgorICAgICAgICBjb2RlID0gIiIiCisgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CisgICAgICAgIGltcG9ydCBzaXgKKyAgICAgICAgeCA9IHt9CisgICAgICAgIGlmIHNpeC5QWTI6CisgICAgICAgICAgICB4Lml0ZXJrZXlzKCkKKyAgICAgICAgIiIiCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uaW5mb19jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgY29kZSA9ICIiIgorICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHggPSB7fQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICB4Lml0ZXJrZXlzKCkKKyAgICAgICAgIiIiCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uaW5mb190dXBsZV9jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgY29kZSA9ICIiIgorICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHggPSB7fQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID09ICgyLCA3KToKKyAgICAgICAgICAgIHguaXRlcmtleXMoKQorICAgICAgICAiIiIKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZShjb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X3NpeF9pZmV4cF9jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgY29kZSA9ICIiIgorICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorICAgICAgICBpbXBvcnQgc2l4CisgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgc3RyaW5nLnRyYW5zbGF0ZSBpZiBzaXguUFkyIGVsc2UgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZShjb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X25leHRfZGVmaW5lZChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKTogICNACisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5leHQtbWV0aG9kLWRlZmluZWQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X25leHRfZGVmaW5lZF90b29fbWFueV9hcmdzKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGZvbz1Ob25lKTogICNACisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9uZXh0X2RlZmluZWRfc3RhdGljX21ldGhvZF90b29fbWFueV9hcmdzKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKTogICNACisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9uZXh0X2RlZmluZWRfc3RhdGljX21ldGhvZChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICAgICAgZGVmIG5leHQoKTogICNACisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5leHQtbWV0aG9kLWRlZmluZWQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X25leHRfZGVmaW5lZF9jbGFzc19tZXRob2Qoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICAgICAgZGVmIG5leHQoY2xzKTogICNACisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gdGVzdHV0aWxzLk1lc3NhZ2UoIm5leHQtbWV0aG9kLWRlZmluZWQiLCBub2RlPW5vZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3JlZmFjdG9yaW5nLnB5IGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfcmVmYWN0b3JpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMThkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3JlZmFjdG9yaW5nLnB5CkBAIC0wLDAgKzEsNDggQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMucmVmYWN0b3JpbmcgaW1wb3J0IExlbkNoZWNrZXIKKworCitkZWYgdGVzdF9jbGFzc190cmVlX2RldGVjdGlvbigpOgorICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICIiIgorY2xhc3MgQ2xhc3NXaXRoQm9vbChsaXN0KToKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKK2NsYXNzIENsYXNzV2l0aG91dEJvb2woZGljdCk6CisgICAgcGFzcworCitjbGFzcyBDaGlsZENsYXNzV2l0aEJvb2woQ2xhc3NXaXRoQm9vbCk6CisgICAgcGFzcworCitjbGFzcyBDaGlsZENsYXNzV2l0aG91dEJvb2woQ2xhc3NXaXRob3V0Qm9vbCk6CisgICAgcGFzcworIiIiCisgICAgKQorICAgIHdpdGhfYm9vbCwgd2l0aG91dF9ib29sLCBjaGlsZF93aXRoX2Jvb2wsIGNoaWxkX3dpdGhvdXRfYm9vbCA9IG1vZHVsZS5ib2R5CisgICAgYXNzZXJ0IExlbkNoZWNrZXIoKS5iYXNlX2NsYXNzZXNfb2Zfbm9kZSh3aXRoX2Jvb2wpID09IFsKKyAgICAgICAgIkNsYXNzV2l0aEJvb2wiLAorICAgICAgICAibGlzdCIsCisgICAgICAgICJvYmplY3QiLAorICAgIF0KKyAgICBhc3NlcnQgTGVuQ2hlY2tlcigpLmJhc2VfY2xhc3Nlc19vZl9ub2RlKHdpdGhvdXRfYm9vbCkgPT0gWworICAgICAgICAiQ2xhc3NXaXRob3V0Qm9vbCIsCisgICAgICAgICJkaWN0IiwKKyAgICAgICAgIm9iamVjdCIsCisgICAgXQorICAgIGFzc2VydCBMZW5DaGVja2VyKCkuYmFzZV9jbGFzc2VzX29mX25vZGUoY2hpbGRfd2l0aF9ib29sKSA9PSBbCisgICAgICAgICJDaGlsZENsYXNzV2l0aEJvb2wiLAorICAgICAgICAiQ2xhc3NXaXRoQm9vbCIsCisgICAgICAgICJsaXN0IiwKKyAgICAgICAgIm9iamVjdCIsCisgICAgXQorICAgIGFzc2VydCBMZW5DaGVja2VyKCkuYmFzZV9jbGFzc2VzX29mX25vZGUoY2hpbGRfd2l0aG91dF9ib29sKSA9PSBbCisgICAgICAgICJDaGlsZENsYXNzV2l0aG91dEJvb2wiLAorICAgICAgICAiQ2xhc3NXaXRob3V0Qm9vbCIsCisgICAgICAgICJkaWN0IiwKKyAgICAgICAgIm9iamVjdCIsCisgICAgXQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3Rfc2ltaWxhci5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3NpbWlsYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiNTRlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3NpbWlsYXIucHkKQEAgLTAsMCArMSw0MTkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCAyMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIFJ5NGFuIEJyYXNlIDxyeTRhbi1oZ0ByeTRhbi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU2NvdHQgV29ybGV5IDxzY290dHdvcmxleUBzY290dHdvcmxleS5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgVGFld29uIEQuIEtpbSA8a2ltdDMzQG1jbWFzdGVyLmNhPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRnJhbmsgSGFycmlzb24gPGZyYW5rQGRvdWJsZXRoZWZpc2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRWxpIEZpbmUgPGVqZmluZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBZGl0eWEgR3VwdGEgPGFkaXR5YWd1cHRhMTA4OUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworZnJvbSBjb250ZXh0bGliIGltcG9ydCByZWRpcmVjdF9zdGRvdXQKK2Zyb20gaW8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgc2ltaWxhcgorZnJvbSBweWxpbnQubGludCBpbXBvcnQgUHlMaW50ZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgR2VuZXJpY1Rlc3RSZXBvcnRlciBhcyBSZXBvcnRlcgorCitJTlBVVCA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICIuLiIgLyAiaW5wdXQiCitTSU1JTEFSMSA9IHN0cihJTlBVVCAvICJzaW1pbGFyMSIpCitTSU1JTEFSMiA9IHN0cihJTlBVVCAvICJzaW1pbGFyMiIpCitTSU1JTEFSMyA9IHN0cihJTlBVVCAvICJzaW1pbGFyMyIpCitTSU1JTEFSNCA9IHN0cihJTlBVVCAvICJzaW1pbGFyNCIpCitTSU1JTEFSNSA9IHN0cihJTlBVVCAvICJzaW1pbGFyNSIpCitTSU1JTEFSNiA9IHN0cihJTlBVVCAvICJzaW1pbGFyNiIpCitNVUxUSUxJTkUgPSBzdHIoSU5QVVQgLyAibXVsdGlsaW5lLWltcG9ydCIpCitISURFX0NPREVfV0lUSF9JTVBPUlRTID0gc3RyKElOUFVUIC8gImhpZGVfY29kZV93aXRoX2ltcG9ydHMucHkiKQorCisKK2RlZiB0ZXN0X2lnbm9yZV9jb21tZW50cygpOgorICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICB3aXRoIHJlZGlyZWN0X3N0ZG91dChvdXRwdXQpLCBweXRlc3QucmFpc2VzKFN5c3RlbUV4aXQpIGFzIGV4OgorICAgICAgICBzaW1pbGFyLlJ1bihbIi0taWdub3JlLWNvbW1lbnRzIiwgU0lNSUxBUjEsIFNJTUlMQVIyXSkKKyAgICBhc3NlcnQgZXgudmFsdWUuY29kZSA9PSAwCisgICAgYXNzZXJ0ICgKKyAgICAgICAgb3V0cHV0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICA9PSAoCisgICAgICAgICAgICAiIiIKKzEwIHNpbWlsYXIgbGluZXMgaW4gMiBmaWxlcworPT0lczowCis9PSVzOjAKKyAgIGltcG9ydCBvbmUKKyAgIGZyb20gdHdvIGltcG9ydCB0d28KKyAgIHRocmVlCisgICBmb3VyCisgICBmaXZlCisgICBzaXgKKyAgIHNldmVuCisgICBlaWdodAorICAgbmluZQorICAgJycnIHRlbgorVE9UQUwgbGluZXM9NjAgZHVwbGljYXRlcz0xMCBwZXJjZW50PTE2LjY3CisiIiIKKyAgICAgICAgICAgICUgKFNJTUlMQVIxLCBTSU1JTEFSMikKKyAgICAgICAgKS5zdHJpcCgpCisgICAgKQorCisKK2RlZiB0ZXN0X2lnbm9yZV9kb2NzcmluZ3MoKToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgd2l0aCByZWRpcmVjdF9zdGRvdXQob3V0cHV0KSwgcHl0ZXN0LnJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBleDoKKyAgICAgICAgc2ltaWxhci5SdW4oWyItLWlnbm9yZS1kb2NzdHJpbmdzIiwgU0lNSUxBUjEsIFNJTUlMQVIyXSkKKyAgICBhc3NlcnQgZXgudmFsdWUuY29kZSA9PSAwCisgICAgYXNzZXJ0ICgKKyAgICAgICAgb3V0cHV0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICA9PSAoCisgICAgICAgICAgICAiIiIKKzggc2ltaWxhciBsaW5lcyBpbiAyIGZpbGVzCis9PSVzOjYKKz09JXM6NgorICAgc2V2ZW4KKyAgIGVpZ2h0CisgICBuaW5lCisgICAnJycgdGVuCisgICBFTEVWRU4KKyAgIHR3ZWx2ZSAnJycKKyAgIHRoaXJ0ZWVuCisgICBmb3VydGVlbgorCis1IHNpbWlsYXIgbGluZXMgaW4gMiBmaWxlcworPT0lczowCis9PSVzOjAKKyAgIGltcG9ydCBvbmUKKyAgIGZyb20gdHdvIGltcG9ydCB0d28KKyAgIHRocmVlCisgICBmb3VyCisgICBmaXZlCitUT1RBTCBsaW5lcz02MCBkdXBsaWNhdGVzPTEzIHBlcmNlbnQ9MjEuNjcKKyIiIgorICAgICAgICAgICAgJSAoKFNJTUlMQVIxLCBTSU1JTEFSMikgKiAyKQorICAgICAgICApLnN0cmlwKCkKKyAgICApCisKKworZGVmIHRlc3RfaWdub3JlX2ltcG9ydHMoKToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgd2l0aCByZWRpcmVjdF9zdGRvdXQob3V0cHV0KSwgcHl0ZXN0LnJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBleDoKKyAgICAgICAgc2ltaWxhci5SdW4oWyItLWlnbm9yZS1pbXBvcnRzIiwgU0lNSUxBUjEsIFNJTUlMQVIyXSkKKyAgICBhc3NlcnQgZXgudmFsdWUuY29kZSA9PSAwCisgICAgYXNzZXJ0ICgKKyAgICAgICAgb3V0cHV0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICA9PSAiIiIKK1RPVEFMIGxpbmVzPTYwIGR1cGxpY2F0ZXM9MCBwZXJjZW50PTAuMDAKKyIiIi5zdHJpcCgpCisgICAgKQorCisKK2RlZiB0ZXN0X211bHRpbGluZV9pbXBvcnRzKCk6CisgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQorICAgIHdpdGggcmVkaXJlY3Rfc3Rkb3V0KG91dHB1dCksIHB5dGVzdC5yYWlzZXMoU3lzdGVtRXhpdCkgYXMgZXg6CisgICAgICAgIHNpbWlsYXIuUnVuKFtNVUxUSUxJTkUsIE1VTFRJTElORV0pCisgICAgYXNzZXJ0IGV4LnZhbHVlLmNvZGUgPT0gMAorICAgIGFzc2VydCAoCisgICAgICAgIG91dHB1dC5nZXR2YWx1ZSgpLnN0cmlwKCkKKyAgICAgICAgPT0gKAorICAgICAgICAgICAgIiIiCis4IHNpbWlsYXIgbGluZXMgaW4gMiBmaWxlcworPT0lczowCis9PSVzOjAKKyAgIGZyb20gZm9vIGltcG9ydCAoCisgICAgIGJhciwKKyAgICAgYmF6LAorICAgICBxdXV4LAorICAgICBxdXV1eCwKKyAgICAgcXV1dXV4LAorICAgICBxdXV1dXV4LAorICAgKQorVE9UQUwgbGluZXM9MTYgZHVwbGljYXRlcz04IHBlcmNlbnQ9NTAuMDAKKyIiIgorICAgICAgICAgICAgJSAoTVVMVElMSU5FLCBNVUxUSUxJTkUpCisgICAgICAgICkuc3RyaXAoKQorICAgICkKKworCitkZWYgdGVzdF9pZ25vcmVfbXVsdGlsaW5lX2ltcG9ydHMoKToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgd2l0aCByZWRpcmVjdF9zdGRvdXQob3V0cHV0KSwgcHl0ZXN0LnJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBleDoKKyAgICAgICAgc2ltaWxhci5SdW4oWyItLWlnbm9yZS1pbXBvcnRzIiwgTVVMVElMSU5FLCBNVUxUSUxJTkVdKQorICAgIGFzc2VydCBleC52YWx1ZS5jb2RlID09IDAKKyAgICBhc3NlcnQgKAorICAgICAgICBvdXRwdXQuZ2V0dmFsdWUoKS5zdHJpcCgpCisgICAgICAgID09ICIiIgorVE9UQUwgbGluZXM9MTYgZHVwbGljYXRlcz0wIHBlcmNlbnQ9MC4wMAorIiIiLnN0cmlwKCkKKyAgICApCisKKworZGVmIHRlc3RfaWdub3JlX3NpZ25hdHVyZXNfZmFpbCgpOgorICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICB3aXRoIHJlZGlyZWN0X3N0ZG91dChvdXRwdXQpLCBweXRlc3QucmFpc2VzKFN5c3RlbUV4aXQpIGFzIGV4OgorICAgICAgICBzaW1pbGFyLlJ1bihbU0lNSUxBUjUsIFNJTUlMQVI2XSkKKyAgICBhc3NlcnQgZXgudmFsdWUuY29kZSA9PSAwCisgICAgYXNzZXJ0ICgKKyAgICAgICAgb3V0cHV0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICA9PSAoCisgICAgICAgICAgICAiIiIKKzcgc2ltaWxhciBsaW5lcyBpbiAyIGZpbGVzCis9PSVzOjEKKz09JXM6OAorICAgICAgIGFyZzE6IGludCA9IDMsCisgICAgICAgYXJnMjogQ2xhc3MxID0gdmFsMSwKKyAgICAgICBhcmczOiBDbGFzczIgPSBmdW5jMyh2YWwyKSwKKyAgICAgICBhcmc0OiBpbnQgPSA0LAorICAgICAgIGFyZzU6IGludCA9IDUKKyAgICkgLT4gUmV0MToKKyAgICAgICBwYXNzCitUT1RBTCBsaW5lcz0yMyBkdXBsaWNhdGVzPTcgcGVyY2VudD0zMC40MworIiIiCisgICAgICAgICAgICAlIChTSU1JTEFSNSwgU0lNSUxBUjYpCisgICAgICAgICkuc3RyaXAoKQorICAgICkKKworCitkZWYgdGVzdF9pZ25vcmVfc2lnbmF0dXJlc19wYXNzKCk6CisgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQorICAgIHdpdGggcmVkaXJlY3Rfc3Rkb3V0KG91dHB1dCksIHB5dGVzdC5yYWlzZXMoU3lzdGVtRXhpdCkgYXMgZXg6CisgICAgICAgIHNpbWlsYXIuUnVuKFsiLS1pZ25vcmUtc2lnbmF0dXJlcyIsIFNJTUlMQVI1LCBTSU1JTEFSNl0pCisgICAgYXNzZXJ0IGV4LnZhbHVlLmNvZGUgPT0gMAorICAgIGFzc2VydCAoCisgICAgICAgIG91dHB1dC5nZXR2YWx1ZSgpLnN0cmlwKCkKKyAgICAgICAgPT0gIiIiCitUT1RBTCBsaW5lcz0yMyBkdXBsaWNhdGVzPTAgcGVyY2VudD0wLjAwCisiIiIuc3RyaXAoKQorICAgICkKKworCitkZWYgdGVzdF9ub19oaWRlX2NvZGVfd2l0aF9pbXBvcnRzKCk6CisgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQorICAgIHdpdGggcmVkaXJlY3Rfc3Rkb3V0KG91dHB1dCksIHB5dGVzdC5yYWlzZXMoU3lzdGVtRXhpdCkgYXMgZXg6CisgICAgICAgIHNpbWlsYXIuUnVuKFsiLS1pZ25vcmUtaW1wb3J0cyJdICsgMiAqIFtISURFX0NPREVfV0lUSF9JTVBPUlRTXSkKKyAgICBhc3NlcnQgZXgudmFsdWUuY29kZSA9PSAwCisgICAgYXNzZXJ0ICJUT1RBTCBsaW5lcz0zMiBkdXBsaWNhdGVzPTE2IHBlcmNlbnQ9NTAuMDAiIGluIG91dHB1dC5nZXR2YWx1ZSgpCisKKworZGVmIHRlc3RfaWdub3JlX25vdGhpbmcoKToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgd2l0aCByZWRpcmVjdF9zdGRvdXQob3V0cHV0KSwgcHl0ZXN0LnJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBleDoKKyAgICAgICAgc2ltaWxhci5SdW4oW1NJTUlMQVIxLCBTSU1JTEFSMl0pCisgICAgYXNzZXJ0IGV4LnZhbHVlLmNvZGUgPT0gMAorICAgIGFzc2VydCAoCisgICAgICAgIG91dHB1dC5nZXR2YWx1ZSgpLnN0cmlwKCkKKyAgICAgICAgPT0gKAorICAgICAgICAgICAgIiIiCis1IHNpbWlsYXIgbGluZXMgaW4gMiBmaWxlcworPT0lczowCis9PSVzOjAKKyAgIGltcG9ydCBvbmUKKyAgIGZyb20gdHdvIGltcG9ydCB0d28KKyAgIHRocmVlCisgICBmb3VyCisgICBmaXZlCitUT1RBTCBsaW5lcz02MCBkdXBsaWNhdGVzPTUgcGVyY2VudD04LjMzCisiIiIKKyAgICAgICAgICAgICUgKFNJTUlMQVIxLCBTSU1JTEFSMikKKyAgICAgICAgKS5zdHJpcCgpCisgICAgKQorCisKK2RlZiB0ZXN0X2xpbmVzX3dpdGhvdXRfbWVhbmluZ2Z1bF9jb250ZW50X2RvX25vdF90cmlnZ2VyX3NpbWlsYXJpdHkoKToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgd2l0aCByZWRpcmVjdF9zdGRvdXQob3V0cHV0KSwgcHl0ZXN0LnJhaXNlcyhTeXN0ZW1FeGl0KSBhcyBleDoKKyAgICAgICAgc2ltaWxhci5SdW4oW1NJTUlMQVIzLCBTSU1JTEFSNF0pCisgICAgYXNzZXJ0IGV4LnZhbHVlLmNvZGUgPT0gMAorICAgIGFzc2VydCAoCisgICAgICAgIG91dHB1dC5nZXR2YWx1ZSgpLnN0cmlwKCkKKyAgICAgICAgPT0gKAorICAgICAgICAgICAgIiIiCisxNCBzaW1pbGFyIGxpbmVzIGluIDIgZmlsZXMKKz09JXM6MTEKKz09JXM6MTEKKyAgIGIgPSAoCisgICAgICAgKAorICAgICAgICAgICBbCisgICAgICAgICAgICAgICAiTGluZXMgMTItMjUgc3RpbGwgdHJpZ2dlciBhIHNpbWlsYXJpdHkuLi4iLAorICAgICAgICAgICAgICAgIi4uLndhcm5pbmcsIGJlY2F1c2UuLi4iCisgICAgICAgICAgIF0sCisgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICIuLi5ldmVuIGFmdGVyIGlnbm9yaW5nIGxpbmVzIHdpdGggb25seSBzeW1ib2xzLi4uIgorICAgICAgICAgICBdLAorICAgICAgICksCisgICAgICAgKAorICAgICAgICAgICAiLi4udGhlcmUgYXJlIHN0aWxsIDUgc2ltaWxhciBsaW5lcyBpbiB0aGlzIGNvZGUgYmxvY2suIiwKKyAgICAgICApCisgICApCitUT1RBTCBsaW5lcz01MCBkdXBsaWNhdGVzPTE0IHBlcmNlbnQ9MjguMDAKKyIiIgorICAgICAgICAgICAgJSAoU0lNSUxBUjMsIFNJTUlMQVI0KQorICAgICAgICApLnN0cmlwKCkKKyAgICApCisKKworZGVmIHRlc3RfaGVscCgpOgorICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICB3aXRoIHJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzaW1pbGFyLlJ1bihbIi0taGVscCJdKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyBleDoKKyAgICAgICAgICAgIGFzc2VydCBleC5jb2RlID09IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHB5dGVzdC5mYWlsKCJub3Qgc3lzdGVtIGV4aXQiKQorCisKK2RlZiB0ZXN0X25vX2FyZ3MoKToKKyAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgd2l0aCByZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2ltaWxhci5SdW4oW10pCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIGV4OgorICAgICAgICAgICAgYXNzZXJ0IGV4LmNvZGUgPT0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHl0ZXN0LmZhaWwoIm5vdCBzeXN0ZW0gZXhpdCIpCisKKworZGVmIHRlc3RfZ2V0X21hcF9kYXRhKCk6CisgICAgIiIiVGVzdHMgdGhhdCBhIFNpbWlsYXJDaGVja2VyIHJlc3BlY3RzIHRoZSBNYXBSZWR1Y2VNaXhpbiBpbnRlcmZhY2UiIiIKKyAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorCisgICAgIyBBZGQgYSBwYXJhbGxlbCBjaGVja2VyIHRvIGVuc3VyZSBpdCBjYW4gbWFwIGFuZCByZWR1Y2UKKyAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihzaW1pbGFyLlNpbWlsYXJDaGVja2VyKGxpbnRlcikpCisKKyAgICBzb3VyY2Vfc3RyZWFtcyA9ICgKKyAgICAgICAgc3RyKElOUFVUIC8gInNpbWlsYXJfbGluZXNfYS5weSIpLAorICAgICAgICBzdHIoSU5QVVQgLyAic2ltaWxhcl9saW5lc19iLnB5IiksCisgICAgKQorICAgIGV4cGVjdGVkX2xpbmVsaXN0cyA9ICgKKyAgICAgICAgKAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgImRlZiBhZGlwaXNjaW5nKGVsaXQpOiIsCisgICAgICAgICAgICAnZXRpYW0gPSAiaWQiJywKKyAgICAgICAgICAgICdkaWN0dW0gPSAicHVydXMsIicsCisgICAgICAgICAgICAndml0YWUgPSAicHJldGl1bSInLAorICAgICAgICAgICAgJ25lcXVlID0gIlZpdmFtdXMiJywKKyAgICAgICAgICAgICduZWMgPSAib3JuYXJlIicsCisgICAgICAgICAgICAndG9ydG9yID0gInNpdCInLAorICAgICAgICAgICAgInJldHVybiBldGlhbSwgZGljdHVtLCB2aXRhZSwgbmVxdWUsIG5lYywgdG9ydG9yIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiY2xhc3MgQW1ldDoiLAorICAgICAgICAgICAgImRlZiBzaW1pbGFyX2Z1bmN0aW9uXzNfbGluZXMoc2VsZiwgdGVsbHVzKToiLAorICAgICAgICAgICAgImFnaXR0aXMgPSAxMCIsCisgICAgICAgICAgICAidGVsbHVzICo9IDMwMCIsCisgICAgICAgICAgICAicmV0dXJuIGFnaXR0aXMsIHRlbGx1cyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJkZWYgbG9yZW0oc2VsZiwgaXBzdW0pOiIsCisgICAgICAgICAgICAnZG9sb3IgPSAic2l0IicsCisgICAgICAgICAgICAnYW1ldCA9ICJjb25zZWN0ZXR1ciInLAorICAgICAgICAgICAgInJldHVybiAobG9yZW0sIGRvbG9yLCBhbWV0KSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJkZWYgc2ltaWxhcl9mdW5jdGlvbl81X2xpbmVzKHNlbGYsIHNpbWlsYXIpOiIsCisgICAgICAgICAgICAic29tZV92YXIgPSAxMCIsCisgICAgICAgICAgICAic29tZW90aGVyX3ZhciAqPSAzMDAiLAorICAgICAgICAgICAgJ2Z1c2NlID0gInNpdCInLAorICAgICAgICAgICAgJ2FtZXQgPSAidG9ydG9yIicsCisgICAgICAgICAgICAicmV0dXJuIHNvbWVfdmFyLCBzb21lb3RoZXJfdmFyLCBmdXNjZSwgYW1ldCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICdkZWYgX19pbml0X18oc2VsZiwgbW9sZXNraWUsIGxlY3R1cz0iTWF1cmlzIiwgYWM9InBlbGxlbnRlc3F1ZSIpOicsCisgICAgICAgICAgICAnbWV0dXMgPSAidXQiJywKKyAgICAgICAgICAgICdsb2JvcnRpcyA9ICJ1cm5hLiInLAorICAgICAgICAgICAgJ0ludGVnZXIgPSAibmlzbCInLAorICAgICAgICAgICAgJyhtYXVyaXMsKSA9ICJpbnRlcmR1bSInLAorICAgICAgICAgICAgJ25vbiA9ICJvZGlvIicsCisgICAgICAgICAgICAnc2VtcGVyID0gImFsaXF1YW0iJywKKyAgICAgICAgICAgICdtYWxlc3VhZGEgPSAibnVuYy4iJywKKyAgICAgICAgICAgICdpYWN1bGlzID0gImRvbG9yIicsCisgICAgICAgICAgICAnZmFjaWxpc2lzID0gInVsdHJpY2VzIicsCisgICAgICAgICAgICAndml0YWUgPSAidXQuIicsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJyZXR1cm4gKCIsCisgICAgICAgICAgICAibWV0dXMsIiwKKyAgICAgICAgICAgICJsb2JvcnRpcywiLAorICAgICAgICAgICAgIkludGVnZXIsIiwKKyAgICAgICAgICAgICJtYXVyaXMsIiwKKyAgICAgICAgICAgICJub24sIiwKKyAgICAgICAgICAgICJzZW1wZXIsIiwKKyAgICAgICAgICAgICJtYWxlc3VhZGEsIiwKKyAgICAgICAgICAgICJpYWN1bGlzLCIsCisgICAgICAgICAgICAiZmFjaWxpc2lzLCIsCisgICAgICAgICAgICAidml0YWUsIiwKKyAgICAgICAgICAgICIpIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgImRlZiBzaW1pbGFyX2Z1bmN0aW9uXzNfbGluZXMoc2VsZiwgdGVsbHVzKToiLAorICAgICAgICAgICAgImFnaXR0aXMgPSAxMCIsCisgICAgICAgICAgICAidGVsbHVzICo9IDMwMCIsCisgICAgICAgICAgICAicmV0dXJuIGFnaXR0aXMsIHRlbGx1cyIsCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgImNsYXNzIE51bGxhOiIsCisgICAgICAgICAgICAndG9ydG9yID0gInVsdHJpY2VzIHF1aXMgcG9ydGEgaW4iJywKKyAgICAgICAgICAgICdzYWdpdHRpcyA9ICJ1dCB0ZWxsdXMiJywKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgImRlZiBwdWx2aW5hcihzZWxmLCBibGFuZGl0LCBtZXR1cyk6IiwKKyAgICAgICAgICAgICJlZ2VzdGFzID0gW21hdXJpcyBmb3IgbWF1cmlzIGluIHppcChibGFuZGl0LCBtZXR1cyldIiwKKyAgICAgICAgICAgICJuZXF1ZSA9IChlZ2VzdGFzLCBibGFuZGl0KSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJkZWYgc2ltaWxhcl9mdW5jdGlvbl81X2xpbmVzKHNlbGYsIHNpbWlsYXIpOiIsCisgICAgICAgICAgICAic29tZV92YXIgPSAxMCIsCisgICAgICAgICAgICAic29tZW90aGVyX3ZhciAqPSAzMDAiLAorICAgICAgICAgICAgJ2Z1c2NlID0gInNpdCInLAorICAgICAgICAgICAgJ2FtZXQgPSAidG9ydG9yIicsCisgICAgICAgICAgICAnaWFjdWxpcyA9ICJkb2xvciInLAorICAgICAgICAgICAgInJldHVybiBzb21lX3Zhciwgc29tZW90aGVyX3ZhciwgZnVzY2UsIGFtZXQsIGlhY3VsaXMsIGlhY3VsaXMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJkZWYgdG9ydG9yKHNlbGYpOiIsCisgICAgICAgICAgICAidWx0cmljZXMgPSAyIiwKKyAgICAgICAgICAgICdxdWlzID0gdWx0cmljaWVzICogInBvcnRhIicsCisgICAgICAgICAgICAicmV0dXJuIHVsdHJpY2llcywgcXVpcyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgImNsYXNzIENvbW1vZG86IiwKKyAgICAgICAgICAgICJkZWYgc2ltaWxhcl9mdW5jdGlvbl8zX2xpbmVzKHNlbGYsIHRlbGx1cyk6IiwKKyAgICAgICAgICAgICJhZ2l0dGlzID0gMTAiLAorICAgICAgICAgICAgInRlbGx1cyAqPSAzMDAiLAorICAgICAgICAgICAgJ2xhb3JlZXQgPSAiY29tbW9kbyAiJywKKyAgICAgICAgICAgICJyZXR1cm4gYWdpdHRpcywgdGVsbHVzLCBsYW9yZWV0IiwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBkYXRhID0gW10KKworICAgICMgTWFudWFsbHkgcGVyZm9ybSBhICdtYXAnIHR5cGUgZnVuY3Rpb24KKyAgICBmb3Igc291cmNlX2ZuYW1lIGluIHNvdXJjZV9zdHJlYW1zOgorICAgICAgICBzaW0gPSBzaW1pbGFyLlNpbWlsYXJDaGVja2VyKGxpbnRlcikKKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9mbmFtZSkgYXMgc3RyZWFtOgorICAgICAgICAgICAgc2ltLmFwcGVuZF9zdHJlYW0oc291cmNlX2ZuYW1lLCBzdHJlYW0pCisgICAgICAgICMgVGhlIG1hcCBiaXQsIGNhbiB5b3UgdGVsbD8gOykKKyAgICAgICAgZGF0YS5leHRlbmQoc2ltLmdldF9tYXBfZGF0YSgpKQorCisgICAgYXNzZXJ0IGxlbihleHBlY3RlZF9saW5lbGlzdHMpID09IGxlbihkYXRhKQorICAgIGZvciBzb3VyY2VfZm5hbWUsIGV4cGVjdGVkX2xpbmVzLCBsaW5lc2V0X29iaiBpbiB6aXAoCisgICAgICAgIHNvdXJjZV9zdHJlYW1zLCBleHBlY3RlZF9saW5lbGlzdHMsIGRhdGEKKyAgICApOgorICAgICAgICBhc3NlcnQgc291cmNlX2ZuYW1lID09IGxpbmVzZXRfb2JqLm5hbWUKKyAgICAgICAgIyBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBmYXN0ZXIgd2F5IG9mIGRvaW5nIHRoaXMsIHlldC4KKyAgICAgICAgbGluZXMgPSAobGluZSBmb3IgaWR4LCBsaW5lIGluIGxpbmVzZXRfb2JqLmVudW1lcmF0ZV9zdHJpcHBlZCgpKQorICAgICAgICBhc3NlcnQgdHVwbGUoZXhwZWN0ZWRfbGluZXMpID09IHR1cGxlKGxpbmVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3Rfc3BlbGxpbmcucHkgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9zcGVsbGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDllYzIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3Rfc3BlbGxpbmcucHkKQEAgLTAsMCArMSw2MTQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWwgTm93aWtvd3NraSA8Z29kZnJ5ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMjAgUGVkcm8gQWxnYXJ2aW8gPHBlZHJvQGFsZ2FydmlvLm1lPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTgsIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IGFndXRvbGUgPHRvbGRvX2NhcnBAaG90bWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBHYW5kZW4gU2NoYWZmbmVyIDxnc2NoYWZmbmVyQHBtLm1lPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgRWxpIEZpbmUgPGVqZmluZUBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVW5pdHRlc3QgZm9yIHRoZSBzcGVsbGluZyBjaGVja2VyLiIiIgorCitpbXBvcnQgYXN0cm9pZAoraW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgc3BlbGxpbmcKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBfdG9rZW5pemVfc3RyLCBzZXRfY29uZmlnCisKKyMgdHJ5IHRvIGNyZWF0ZSBlbmNoYW50IGRpY3Rpb25hcnkKK3RyeToKKyAgICBpbXBvcnQgZW5jaGFudAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGVuY2hhbnQgPSBOb25lCisKK3NwZWxsX2RpY3QgPSBOb25lCitpZiBlbmNoYW50IGlzIG5vdCBOb25lOgorICAgIHRyeToKKyAgICAgICAgZW5jaGFudC5EaWN0KCJlbl9VUyIpCisgICAgICAgIHNwZWxsX2RpY3QgPSAiZW5fVVMiCisgICAgZXhjZXB0IGVuY2hhbnQuRGljdE5vdEZvdW5kRXJyb3I6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBUZXN0U3BlbGxpbmdDaGVja2VyKENoZWNrZXJUZXN0Q2FzZSk6ICAjIHB5bGludDpkaXNhYmxlPXRvby1tYW55LXB1YmxpYy1tZXRob2RzCisgICAgIyBUaGlzIGlzIGEgdGVzdCBjYXNlIGNsYXNzLCBub3Qgc3VyZSB3aHkgaXQgd291bGQgYmUgcmVsZXZhbnQgdG8gaGF2ZQorICAgICMgICB0aGlzIHB5bGludCBydWxlIGVuZm9yY2VkIGZvciB0ZXN0IGNhc2UgY2xhc3Nlcy4KKyAgICBDSEVDS0VSX0NMQVNTID0gc3BlbGxpbmcuU3BlbGxpbmdDaGVja2VyCisKKyAgICBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0ID0gcHl0ZXN0Lm1hcmsuc2tpcGlmKAorICAgICAgICBzcGVsbF9kaWN0IGlzIE5vbmUsCisgICAgICAgIHJlYXNvbj0ibWlzc2luZyBweXRob24tZW5jaGFudCBwYWNrYWdlIG9yIG1pc3Npbmcgc3BlbGxpbmcgZGljdGlvbmFyaWVzIiwKKyAgICApCisKKyAgICBkZWYgX2dldF9tc2dfc3VnZ2VzdGlvbnMoc2VsZiwgd29yZCwgY291bnQ9NCk6CisgICAgICAgIHN1Z2dlc3Rpb25zID0gIicgb3IgJyIuam9pbihzZWxmLmNoZWNrZXIuc3BlbGxpbmdfZGljdC5zdWdnZXN0KHdvcmQpWzpjb3VudF0pCisgICAgICAgIHJldHVybiBmIid7c3VnZ2VzdGlvbnN9JyIKKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X2NoZWNrX2JhZF9jb21lbnQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1jb21tZW50IiwKKyAgICAgICAgICAgICAgICBsaW5lPTEsCisgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICJjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiIyBiYWQgY29tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIF5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoImNvbWVudCIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc190b2tlbnMoX3Rva2VuaXplX3N0cigiIyBiYWQgY29tZW50IikpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBAc2V0X2NvbmZpZyhtYXhfc3BlbGxpbmdfc3VnZ2VzdGlvbnM9MikKKyAgICBkZWYgdGVzdF9jaGVja19iYWRfY29tZW50X2N1c3RvbV9zdWdnZXN0aW9uX2NvdW50KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAid3Jvbmctc3BlbGxpbmctaW4tY29tbWVudCIsCisgICAgICAgICAgICAgICAgbGluZT0xLAorICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAiY29tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIiMgYmFkIGNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICIgICAgICBeXl5eXl4iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbXNnX3N1Z2dlc3Rpb25zKCJjb21lbnQiLCBjb3VudD0yKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoIiMgYmFkIGNvbWVudCIpKQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3RfY2hlY2tfYmFkX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKCdkZWYgZmZmKCk6XG4gICAiIiJiYWQgY29tZW50IiIiXG4gICBwYXNzJykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgIndyb25nLXNwZWxsaW5nLWluLWRvY3N0cmluZyIsCisgICAgICAgICAgICAgICAgbGluZT0yLAorICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAiY29tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiICAgIF5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoImNvbWVudCIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYoc3RtdCkKKworICAgICAgICBzdG10ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoJ2NsYXNzIEFiYyhvYmplY3QpOlxuICAgIiIiYmFkIGNvbWVudCIiIlxuICAgcGFzcycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgImNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICJiYWQgY29tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIiAgICBeXl5eXl4iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbXNnX3N1Z2dlc3Rpb25zKCJjb21lbnQiKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NsYXNzZGVmKHN0bXQpCisKKyAgICBAcHl0ZXN0Lm1hcmsuc2tpcGlmKFRydWUsIHJlYXNvbj0icHllbmNoYW50J3MgdG9rZW5pemVyIHN0cmlwcyB0aGVzZSIpCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3RfaW52YWxpZF9kb2NzdHJpbmdfY2hhcmFjdGVycyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKCdkZWYgZmZmKCk6XG4gICAiIiJ0ZXN0XFx4MDAiIiJcbiAgIHBhc3MnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgiaW52YWxpZC1jaGFyYWN0ZXJzLWluLWRvY3N0cmluZyIsIGxpbmU9MiwgYXJncz0oInRlc3RceDAwIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKHN0bXQpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9za2lwX3NoZWJhbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc190b2tlbnMoX3Rva2VuaXplX3N0cigiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIikpCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X3NraXBfcHl0aG9uX2NvZGluZ19jb21tZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoIiMgLSotIGNvZGluZzogdXRmLTggLSotIikpCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKyAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoIiMgY29kaW5nPXV0Zi04IikpCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKyAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoIiMgdmltOiBzZXQgZmlsZWVuY29kaW5nPXV0Zi04IDoiKSkKKyAgICAgICAgYXNzZXJ0IHNlbGYubGludGVyLnJlbGVhc2VfbWVzc2FnZXMoKSA9PSBbXQorICAgICAgICAjIE5vdyB3aXRoIGEgc2hlYmFuZyBmaXJzdAorICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc190b2tlbnMoCisgICAgICAgICAgICBfdG9rZW5pemVfc3RyKCIjIS91c3IvYmluL2VudiBweXRob25cbiMgLSotIGNvZGluZzogdXRmLTggLSotIikKKyAgICAgICAgKQorICAgICAgICBhc3NlcnQgc2VsZi5saW50ZXIucmVsZWFzZV9tZXNzYWdlcygpID09IFtdCisgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucygKKyAgICAgICAgICAgIF90b2tlbml6ZV9zdHIoIiMhL3Vzci9iaW4vZW52IHB5dGhvblxuIyBjb2Rpbmc9dXRmLTgiKQorICAgICAgICApCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKyAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKAorICAgICAgICAgICAgX3Rva2VuaXplX3N0cigiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uXG4jIHZpbTogc2V0IGZpbGVlbmNvZGluZz11dGYtOCA6IikKKyAgICAgICAgKQorICAgICAgICBhc3NlcnQgc2VsZi5saW50ZXIucmVsZWFzZV9tZXNzYWdlcygpID09IFtdCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9za2lwX3RvcF9sZXZlbF9weWxpbnRfZW5hYmxlX2Rpc2FibGVfY29tbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucygKKyAgICAgICAgICAgIF90b2tlbml6ZV9zdHIoIiMgTGluZSAxXG4gTGluZSAyXG4jIHB5bGludDogZGlzYWJsZT11bmdyb3VwZWQtaW1wb3J0cyIpCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0IHNlbGYubGludGVyLnJlbGVhc2VfbWVzc2FnZXMoKSA9PSBbXQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3Rfc2tpcF93b3Jkc193aXRoX251bWJlcnMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKCJcbiMgMG5lXG4jIFRocjMzXG4jIFNoM2xsIikpCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X3NraXBfd2lraV93b3JkcyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJ2NsYXNzIENvbWVudEFiYyhvYmplY3QpOlxuICAgIiIiQ29tZW50QWJjIHdpdGggYSBiYWQgY29tZW50IiIiXG4gICBwYXNzJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgImNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICJDb21lbnRBYmMgd2l0aCBhIGJhZCBjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgXl5eXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygiY29tZW50IiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihzdG10KQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3Rfc2tpcF9jYW1lbF9jYXNlZF93b3JkcyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJ2NsYXNzIENvbWVudEFiYyhvYmplY3QpOlxuICAgIiIiY29tZW50QWJjIHdpdGggYSBiYWQgY29tZW50IiIiXG4gICBwYXNzJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgImNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICJjb21lbnRBYmMgd2l0aCBhIGJhZCBjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgXl5eXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygiY29tZW50IiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihzdG10KQorCisgICAgICAgICMgV2l0aCBqdXN0IGEgc2luZ2xlIHVwcGVyIGNhc2UgbGV0dGVyIGluIHRoZSBlbmQKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJ2NsYXNzIENvbWVudEFiYyhvYmplY3QpOlxuICAgIiIiYXJndW1lbnROIHdpdGggYSBiYWQgY29tZW50IiIiXG4gICBwYXNzJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgImNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudE4gd2l0aCBhIGJhZCBjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgXl5eXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygiY29tZW50IiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihzdG10KQorCisgICAgICAgIGZvciBjY24gaW4gKAorICAgICAgICAgICAgInhtbEh0dHBSZXF1ZXN0IiwKKyAgICAgICAgICAgICJuZXdDdXN0b21lciIsCisgICAgICAgICAgICAibmV3Q3VzdG9tZXJJZCIsCisgICAgICAgICAgICAiaW5uZXJTdG9wd2F0Y2giLAorICAgICAgICAgICAgInN1cHBvcnRzSXB2Nk9uSW9zIiwKKyAgICAgICAgICAgICJhZmZpbmUzRCIsCisgICAgICAgICk6CisgICAgICAgICAgICBzdG10ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgZidjbGFzcyBUZXN0Q2xhc3Mob2JqZWN0KTpcbiAgICIiIntjY259IGNvbW1lbnQiIiJcbiAgIHBhc3MnCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYoc3RtdCkKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X3NraXBfd29yZHNfd2l0aF91bmRlcnNjb3JlcyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJ2RlZiBmZmYocGFyYW1fbmFtZSk6XG4gICAiIiJ0ZXN0IHBhcmFtX25hbWUiIiJcbiAgIHBhc3MnCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKHN0bXQpCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X3NraXBfZW1haWxfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoIiMgdW5hbWVAZG9tYWluLnRsZCIpKQorICAgICAgICBhc3NlcnQgc2VsZi5saW50ZXIucmVsZWFzZV9tZXNzYWdlcygpID09IFtdCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9za2lwX3VybHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKCIjIGh0dHBzOi8vZ2l0aHViLmNvbS9yZmsvcHllbmNoYW50IikpCisgICAgICAgIGFzc2VydCBzZWxmLmxpbnRlci5yZWxlYXNlX21lc3NhZ2VzKCkgPT0gW10KKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X3NraXBfc3BoaW54X2RpcmVjdGl2ZXMoc2VsZik6CisgICAgICAgIHN0bXQgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICdjbGFzcyBDb21lbnRBYmMob2JqZWN0KTpcbiAgICIiIlRoaXMgaXMgOmNsYXNzOmBDb21lbnRBYmNgIHdpdGggYSBiYWQgY29tZW50IiIiXG4gICBwYXNzJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgImNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIDpjbGFzczpgQ29tZW50QWJjYCB3aXRoIGEgYmFkIGNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoImNvbWVudCIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYoc3RtdCkKKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X3NraXBfc3BoaW54X2RpcmVjdGl2ZXNfMihzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJ2NsYXNzIENvbWVudEFiYyhvYmplY3QpOlxuICAgIiIiVGhpcyBpcyA6cHk6YXR0cjpgQ29tZW50QWJjYCB3aXRoIGEgYmFkIGNvbWVudCIiIlxuICAgcGFzcycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAid3Jvbmctc3BlbGxpbmctaW4tZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICAgICBsaW5lPTIsCisgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICJjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyA6cHk6YXR0cjpgQ29tZW50QWJjYCB3aXRoIGEgYmFkIGNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygiY29tZW50IiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihzdG10KQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICAgICAiLCIuam9pbigKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAibWlzc3BlbGxlZF9wb3J0aW9uX29mX2RpcmVjdGl2ZSIsCisgICAgICAgICAgICAgICAgInNlY29uZF9wb3J0aW9uX29mX2RpcmVjdGl2ZSIsCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICkKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgKCJmbXQiLCAiOiBvbiIsICJibGFjayBkaXJlY3RpdmUgdG8gdHVybiBvbiBmb3JtYXR0aW5nIiksCisgICAgICAgICAgICAoImZtdCIsICI6IG9mZiIsICJibGFjayBkaXJlY3RpdmUgdG8gdHVybiBvZmYgZm9ybWF0dGluZyIpLAorICAgICAgICAgICAgKCJub3FhIiwgIiIsICJweWNoYXJtIGRpcmVjdGl2ZSIpLAorICAgICAgICAgICAgKCJub3FhIiwgIjoiLCAiZmxha2U4IC8gemltcG9ydHMgZGlyZWN0aXZlIiksCisgICAgICAgICAgICAoIm5vc2VjIiwgIiIsICJiYW5kaXQgZGlyZWN0aXZlIiksCisgICAgICAgICAgICAoImlzb3J0IiwgIjpza2lwIiwgImlzb3J0IGRpcmVjdGl2ZSIpLAorICAgICAgICAgICAgKCJteXB5IiwgIjoiLCAibXlweSBkaXJlY3RpdmUiKSwKKyAgICAgICAgKSwKKyAgICApCisgICAgZGVmIHRlc3Rfc2tpcF90b29sX2RpcmVjdGl2ZXNfYXRfYmVnaW5uaW5nX29mX2NvbW1lbnRzX2J1dF9zdGlsbF9yYWlzZV9lcnJvcl9pZl9kaXJlY3RpdmVfYXBwZWFyc19sYXRlcl9pbl9jb21tZW50KCAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgIyBIYXZpbmcgdGhlIGV4dHJhIGRlc2NyaXB0aW9uIHBhcmFtZXRlciBhbGxvd3MgdGhlIGRlc2NyaXB0aW9uCisgICAgICAgICMgICB0byBzaG93IHVwIGluIHRoZSBweXRlc3Qgb3V0cHV0IGFzIHBhcnQgb2YgdGhlIHRlc3QgbmFtZQorICAgICAgICAjICAgd2hlbiBydW5uaW5nIHBhcmFtZXRyaXplZCB0ZXN0cy4KKyAgICAgICAgc2VsZiwKKyAgICAgICAgbWlzc3BlbGxlZF9wb3J0aW9uX29mX2RpcmVjdGl2ZSwKKyAgICAgICAgc2Vjb25kX3BvcnRpb25fb2ZfZGlyZWN0aXZlLAorICAgICAgICBkZXNjcmlwdGlvbiwKKyAgICApOgorICAgICAgICBmdWxsX2NvbW1lbnQgPSBmIiMge21pc3NwZWxsZWRfcG9ydGlvbl9vZl9kaXJlY3RpdmV9e3NlY29uZF9wb3J0aW9uX29mX2RpcmVjdGl2ZX0ge21pc3NwZWxsZWRfcG9ydGlvbl9vZl9kaXJlY3RpdmV9IgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAid3Jvbmctc3BlbGxpbmctaW4tY29tbWVudCIsCisgICAgICAgICAgICAgICAgbGluZT0xLAorICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICBtaXNzcGVsbGVkX3BvcnRpb25fb2ZfZGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICBmdWxsX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgIGYiICB7J14nKmxlbihtaXNzcGVsbGVkX3BvcnRpb25fb2ZfZGlyZWN0aXZlKX0iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbXNnX3N1Z2dlc3Rpb25zKG1pc3NwZWxsZWRfcG9ydGlvbl9vZl9kaXJlY3RpdmUpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIucHJvY2Vzc190b2tlbnMoX3Rva2VuaXplX3N0cihmdWxsX2NvbW1lbnQpKQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3Rfc2tpcF9jb2RlX2ZsYW5rZWRfaW5fZG91YmxlX2JhY2t0aWNrcyhzZWxmKToKKyAgICAgICAgZnVsbF9jb21tZW50ID0gIiMgVGhlIGZ1bmN0aW9uIGBgLnFzaXplKClgYCAucXNpemUoKSIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgIndyb25nLXNwZWxsaW5nLWluLWNvbW1lbnQiLAorICAgICAgICAgICAgICAgIGxpbmU9MSwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgInFzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgZnVsbF9jb21tZW50LAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICBeXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoInFzaXplIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGZ1bGxfY29tbWVudCkpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9za2lwX2NvZGVfZmxhbmtlZF9pbl9zaW5nbGVfYmFja3RpY2tzKHNlbGYpOgorICAgICAgICBmdWxsX2NvbW1lbnQgPSAiIyBUaGUgZnVuY3Rpb24gYC5xc2l6ZSgpYCAucXNpemUoKSIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgIndyb25nLXNwZWxsaW5nLWluLWNvbW1lbnQiLAorICAgICAgICAgICAgICAgIGxpbmU9MSwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgInFzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgZnVsbF9jb21tZW50LAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICBeXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoInFzaXplIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGZ1bGxfY29tbWVudCkpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKAorICAgICAgICBzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QsCisgICAgICAgIHNwZWxsaW5nX2lnbm9yZV9jb21tZW50X2RpcmVjdGl2ZXM9Im5ld2RpcmVjdGl2ZTosbm9xYSIsCisgICAgKQorICAgIGRlZiB0ZXN0X3NraXBfZGlyZWN0aXZlc19zcGVjaWZpZWRfaW5fcHlsaW50cmMoc2VsZik6CisgICAgICAgIGZ1bGxfY29tbWVudCA9ICIjIG5ld2RpcmVjdGl2ZTogZG8gdGhpcyBuZXdkaXJlY3RpdmUiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1jb21tZW50IiwKKyAgICAgICAgICAgICAgICBsaW5lPTEsCisgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICJuZXdkaXJlY3RpdmUiLAorICAgICAgICAgICAgICAgICAgICBmdWxsX2NvbW1lbnQsCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgXl5eXl5eXl5eXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygibmV3ZGlyZWN0aXZlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5wcm9jZXNzX3Rva2VucyhfdG9rZW5pemVfc3RyKGZ1bGxfY29tbWVudCkpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9oYW5kbGVfd29yZHNfam9pbmVkX2J5X2ZvcndhcmRfc2xhc2goc2VsZik6CisgICAgICAgIHN0bXQgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBjbGFzcyBDb21lbnRBYmMob2JqZWN0KToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgQ29tbWVudC9BYmN6IHdpdGggYSBiYWQgY29tbWVudCIiIgorICAgICAgICAgICAgcGFzcworICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAid3Jvbmctc3BlbGxpbmctaW4tZG9jc3RyaW5nIiwKKyAgICAgICAgICAgICAgICBsaW5lPTMsCisgICAgICAgICAgICAgICAgYXJncz0oCisgICAgICAgICAgICAgICAgICAgICJBYmN6IiwKKyAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgQ29tbWVudC9BYmN6IHdpdGggYSBiYWQgY29tbWVudCIsCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoIkFiY3oiKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NsYXNzZGVmKHN0bXQpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9tb3JlX3RoYW5fb25lX2Vycm9yX2luX3NhbWVfbGluZV9mb3Jfc2FtZV93b3JkX29uX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJ2NsYXNzIENvbWVudEFiYyhvYmplY3QpOlxuICAgIiIiQ2hlY2sgdGVoIGR1bW15IGNvbW1lbnQgdGVoIiIiXG4gICBwYXNzJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgInRlaCIsCisgICAgICAgICAgICAgICAgICAgICJDaGVjayB0ZWggZHVtbXkgY29tbWVudCB0ZWgiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygidGVoIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgInRlaCIsCisgICAgICAgICAgICAgICAgICAgICJDaGVjayB0ZWggZHVtbXkgY29tbWVudCB0ZWgiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygidGVoIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2xhc3NkZWYoc3RtdCkKKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X21vcmVfdGhhbl9vbmVfZXJyb3JfaW5fc2FtZV9saW5lX2Zvcl9zYW1lX3dvcmRfb25fY29tbWVudChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgIndyb25nLXNwZWxsaW5nLWluLWNvbW1lbnQiLAorICAgICAgICAgICAgICAgIGxpbmU9MSwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgImNvbWVudCIsCisgICAgICAgICAgICAgICAgICAgICIjIGJhZCBjb21lbnQgY29tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIF5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoImNvbWVudCIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAid3Jvbmctc3BlbGxpbmctaW4tY29tbWVudCIsCisgICAgICAgICAgICAgICAgbGluZT0xLAorICAgICAgICAgICAgICAgIGFyZ3M9KAorICAgICAgICAgICAgICAgICAgICAiY29tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIiMgYmFkIGNvbWVudCBjb21lbnQiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgIF5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoImNvbWVudCIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnByb2Nlc3NfdG9rZW5zKF90b2tlbml6ZV9zdHIoIiMgYmFkIGNvbWVudCBjb21lbnQiKSkKKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X2RvY3N0cmluZ19saW5lc190aGF0X2xvb2tfbGlrZV9jb21tZW50c18xKHNlbGYpOgorICAgICAgICBzdG10ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJydkZWYgZigpOgorICAgICIiIgorICAgICMgbXNpdGFrZQorICAgICIiIicnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MywKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgIm1zaXRha2UiLAorICAgICAgICAgICAgICAgICAgICAiICAgICMgbXNpdGFrZSIsCisgICAgICAgICAgICAgICAgICAgICIgICAgICBeXl5eXl5eIiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21zZ19zdWdnZXN0aW9ucygibXNpdGFrZSIpLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYoc3RtdCkKKworICAgIEBza2lwX29uX21pc3NpbmdfcGFja2FnZV9vcl9kaWN0CisgICAgQHNldF9jb25maWcoc3BlbGxpbmdfZGljdD1zcGVsbF9kaWN0KQorICAgIGRlZiB0ZXN0X2RvY3N0cmluZ19saW5lc190aGF0X2xvb2tfbGlrZV9jb21tZW50c18yKHNlbGYpOgorICAgICAgICBzdG10ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJydkZWYgZigpOgorICAgICIiIiMgbXNpdGFrZSIiIicnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MiwKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgIm1zaXRha2UiLAorICAgICAgICAgICAgICAgICAgICAiIyBtc2l0YWtlIiwKKyAgICAgICAgICAgICAgICAgICAgIiAgXl5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoIm1zaXRha2UiKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKHN0bXQpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9kb2NzdHJpbmdfbGluZXNfdGhhdF9sb29rX2xpa2VfY29tbWVudHNfMyhzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnZGVmIGYoKToKKyAgICAiIiIKKyMgbXNpdGFrZQorICAgICIiIicnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MywKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgIm1zaXRha2UiLAorICAgICAgICAgICAgICAgICAgICAiIyBtc2l0YWtlIiwKKyAgICAgICAgICAgICAgICAgICAgIiAgXl5eXl5eXiIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9tc2dfc3VnZ2VzdGlvbnMoIm1zaXRha2UiKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKHN0bXQpCisKKyAgICBAc2tpcF9vbl9taXNzaW5nX3BhY2thZ2Vfb3JfZGljdAorICAgIEBzZXRfY29uZmlnKHNwZWxsaW5nX2RpY3Q9c3BlbGxfZGljdCkKKyAgICBkZWYgdGVzdF9kb2NzdHJpbmdfbGluZXNfdGhhdF9sb29rX2xpa2VfY29tbWVudHNfNChzZWxmKToKKyAgICAgICAgc3RtdCA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnZGVmIGYoKToKKyAgICAiIiIKKyAgICAjIGNhdAorICAgICIiIicnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihzdG10KQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3RfZG9jc3RyaW5nX2xpbmVzX3RoYXRfbG9va19saWtlX2NvbW1lbnRzXzUoc2VsZik6CisgICAgICAgIHN0bXQgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJ2RlZiBmKCk6CisgICAgIiIiCisgICAgbXNpdGFrZSAjIGNhdAorICAgICIiIicnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MywKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgIm1zaXRha2UiLAorICAgICAgICAgICAgICAgICAgICAiICAgIG1zaXRha2UgIyBjYXQiLAorICAgICAgICAgICAgICAgICAgICAiICAgIF5eXl5eXl4iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbXNnX3N1Z2dlc3Rpb25zKCJtc2l0YWtlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihzdG10KQorCisgICAgQHNraXBfb25fbWlzc2luZ19wYWNrYWdlX29yX2RpY3QKKyAgICBAc2V0X2NvbmZpZyhzcGVsbGluZ19kaWN0PXNwZWxsX2RpY3QpCisgICAgZGVmIHRlc3RfZG9jc3RyaW5nX2xpbmVzX3RoYXRfbG9va19saWtlX2NvbW1lbnRzXzYoc2VsZik6CisgICAgICAgIHN0bXQgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJ2RlZiBmKCk6CisgICAgIiIiCisgICAgY2F0ICMgbXNpdGFrZQorICAgICIiIicnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ3cm9uZy1zcGVsbGluZy1pbi1kb2NzdHJpbmciLAorICAgICAgICAgICAgICAgIGxpbmU9MywKKyAgICAgICAgICAgICAgICBhcmdzPSgKKyAgICAgICAgICAgICAgICAgICAgIm1zaXRha2UiLAorICAgICAgICAgICAgICAgICAgICAiICAgIGNhdCAjIG1zaXRha2UiLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgIF5eXl5eXl4iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbXNnX3N1Z2dlc3Rpb25zKCJtc2l0YWtlIiksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihzdG10KQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3Rfc3RkbGliLnB5IGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3Rfc3RkbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MmIzM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9zdGRsaWIucHkKQEAgLTAsMCArMSwxMjAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNSBDZXphciA8Y2VsbmF6bGlAYml0ZGVmZW5kZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBNYXJ0aW4gPE1hcnRpbkJhc3RpQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBjb250ZXh0bGliCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBzdGRsaWIKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IFVOREVGSU5FRAorZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBDaGVja2VyVGVzdENhc2UsIE1lc3NhZ2UKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIF9hZGRfdHJhbnNmb3JtKG1hbmFnZXIsIG5vZGUsIHRyYW5zZm9ybSwgcHJlZGljYXRlPU5vbmUpOgorICAgIG1hbmFnZXIucmVnaXN0ZXJfdHJhbnNmb3JtKG5vZGUsIHRyYW5zZm9ybSwgcHJlZGljYXRlKQorICAgIHRyeToKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBtYW5hZ2VyLnVucmVnaXN0ZXJfdHJhbnNmb3JtKG5vZGUsIHRyYW5zZm9ybSwgcHJlZGljYXRlKQorCisKK2NsYXNzIFRlc3RTdGRsaWJDaGVja2VyKENoZWNrZXJUZXN0Q2FzZSk6CisgICAgQ0hFQ0tFUl9DTEFTUyA9IHN0ZGxpYi5TdGRsaWJDaGVja2VyCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX25vX3FuYW1lX29uX3VuZXhwZWN0ZWRfbm9kZXMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHdlIGRvbid0IGNyYXNoIG9uIG5vZGVzIHdoaWNoIGRvbid0IGhhdmUKKyAgICAgICAgIyBhIHFuYW1lIG1ldGhvZC4gV2hpbGUgdGhpcyB0ZXN0IG1pZ2h0IHNlZW0gd2VpcmQgc2luY2UKKyAgICAgICAgIyBpdCB1c2VzIGEgdHJhbnNmb3JtLCBpdCdzIGFjdHVhbGx5IHRlc3RpbmcgYSBjcmFzaCB0aGF0CisgICAgICAgICMgaGFwcGVuZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZXJlIHdhcyBubyB3YXkgdG8gcmV0cmlldmUKKyAgICAgICAgIyB0aGUgY29kZSBmb3Igd2hpY2ggdGhpcyBvY2N1cnJlZCAoaG93IGFuIEFzc2lnbkF0dHIKKyAgICAgICAgIyBnb3QgdG8gYmUgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGluZmVyZW5jZQorICAgICAgICAjIGJlYXRzIG1lLi4pCisKKyAgICAgICAgZGVmIGluZmVyX2Z1bmMobm9kZSwgY29udGV4dD1Ob25lKTogICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgICAgICAgICAgbmV3X25vZGUgPSBhc3Ryb2lkLkFzc2lnbkF0dHIoKQorICAgICAgICAgICAgbmV3X25vZGUucGFyZW50ID0gbm9kZQorICAgICAgICAgICAgeWllbGQgbmV3X25vZGUKKworICAgICAgICBtYW5hZ2VyID0gYXN0cm9pZC5NQU5BR0VSCisgICAgICAgIHRyYW5zZm9ybSA9IGFzdHJvaWQuaW5mZXJlbmNlX3RpcChpbmZlcl9mdW5jKQorICAgICAgICB3aXRoIF9hZGRfdHJhbnNmb3JtKG1hbmFnZXIsIGFzdHJvaWQuTmFtZSwgdHJhbnNmb3JtKToKKyAgICAgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNhbGxfc29tZXRoaW5nKCkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfY29weV9lbnZpcm9uKHNlbGYpOgorICAgICAgICAjIHNoYWxsb3cgY29weSBvZiBvcy5lbnZpcm9uIHNob3VsZCBiZSByZXBvcnRlZAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGNvcHksIG9zCisgICAgICAgIGNvcHkuY29weShvcy5lbnZpcm9uKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InNoYWxsb3ctY29weS1lbnZpcm9uIiwgbm9kZT1ub2RlLCBjb25maWRlbmNlPVVOREVGSU5FRCkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKG5vZGUpCisKKyAgICBkZWYgdGVzdF9jb3B5X2Vudmlyb25faGlkZGVuKHNlbGYpOgorICAgICAgICAjIHNoYWxsb3cgY29weSBvZiBvcy5lbnZpcm9uIHNob3VsZCBiZSByZXBvcnRlZAorICAgICAgICAjIGhpZGUgZnVuY3Rpb24gbmFtZXMgdG8gYmUgc3VyZSB0aGF0IGNoZWNrZXIgaXMgbm90IGp1c3QgbWF0Y2hpbmcgdGV4dAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBjb3B5IGltcG9ydCBjb3B5IGFzIHRlc3RfY3AKKyAgICAgICAgaW1wb3J0IG9zIGFzIG8KKyAgICAgICAgdGVzdF9jcChvLmVudmlyb24pCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ic2hhbGxvdy1jb3B5LWVudmlyb24iLCBub2RlPW5vZGUsIGNvbmZpZGVuY2U9VU5ERUZJTkVEKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKKworICAgIGRlZiB0ZXN0X2NvcHlfZGljdChzZWxmKToKKyAgICAgICAgIyBjb3B5IG9mIGRpY3QgaXMgT0sKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIHRlc3RfZGljdCA9IHt9CisgICAgICAgIGNvcHkuY29weSh0ZXN0X2RpY3QpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfY29weV91bmluZmVyYWJsZShzZWxmKToKKyAgICAgICAgIyBjb3B5IG9mIHVuaW5mZXJhYmxlIG9iamVjdCBzaG91bGQgbm90IHJhaXNlIGV4Y2VwdGlvbiwgbm9yIG1ha2UKKyAgICAgICAgIyB0aGUgY2hlY2tlciBjcmFzaAorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgZnJvbSBtaXNzaW5nX2xpYnJhcnkgaW1wb3J0IE1pc3NpbmdPYmplY3QKKyAgICAgICAgY29weS5jb3B5KE1pc3NpbmdPYmplY3QpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfZW52aXJvbihzZWxmKToKKyAgICAgICAgIyBkZWVwY29weSBvZiBvcy5lbnZpcm9uIGlzIE9LCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgY29weSwgb3MKKyAgICAgICAgY29weS5kZWVwY29weShvcy5lbnZpcm9uKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NhbGwobm9kZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3N0cmluZ3MucHkgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9zdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjJiNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF9zdHJpbmdzLnB5CkBAIC0wLDAgKzEsOTIgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE1LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEx1Y2FzIENpbW9uIDxsdWNhcy5jaW1vbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBZdXJ5IEdyaWJvdiA8dGV0cmEyMDA1QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyYyBNdWVsbGVyIDwzMDEzMDM3MStjZGNlOHBAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBzdHJpbmdzCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZQorCitURVNUX1RPS0VOUyA9ICgKKyAgICAnIlgiJywKKyAgICAiJ1gnIiwKKyAgICAiJycnWCcnJyIsCisgICAgJyIiIlgiIiInLAorICAgICdyIlgiJywKKyAgICAiUidYJyIsCisgICAgJ3UiWCInLAorICAgICJGJ1gnIiwKKyAgICAnZiJYIicsCisgICAgIkYnWCciLAorICAgICdmciJYIicsCisgICAgJ0ZyIlgiJywKKyAgICAnZlIiWCInLAorICAgICdGUiJYIicsCisgICAgJ3JmIlgiJywKKyAgICAnckYiWCInLAorICAgICdSZiJYIicsCisgICAgJ1JGIlgiJywKKykKKworCitjbGFzcyBUZXN0U3RyaW5nQ2hlY2tlcihDaGVja2VyVGVzdENhc2UpOgorICAgIENIRUNLRVJfQ0xBU1MgPSBzdHJpbmdzLlN0cmluZ0Zvcm1hdENoZWNrZXIKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9ieXRlcyhzZWxmKToKKyAgICAgICAgY29kZSA9ICJiJ3Rlc3QnLmZvcm1hdCgxLCAyKSIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKGNvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChub2RlKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X3R5cGVzKHNlbGYpOgorICAgICAgICBmb3IgY29kZSBpbiAoIiclcycgJSAxIiwgIiclZCcgJSAxIiwgIiclZicgJSAxIik6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShjb2RlKQorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Jpbm9wKG5vZGUpCisKKyAgICAgICAgZm9yIGNvZGUgaW4gKAorICAgICAgICAgICAgIiclcycgJSAxIiwKKyAgICAgICAgICAgICInJShrZXkpcycgJSB7J2tleScgOiAxfSIsCisgICAgICAgICAgICAiJyVkJyAlIDEiLAorICAgICAgICAgICAgIiclKGtleSlkJyAlIHsna2V5JyA6IDF9IiwKKyAgICAgICAgICAgICInJWYnICUgMSIsCisgICAgICAgICAgICAiJyUoa2V5KWYnICUgeydrZXknIDogMX0iLAorICAgICAgICAgICAgIiclZCcgJSAxLjEiLAorICAgICAgICAgICAgIiclKGtleSlkJyAlIHsna2V5JyA6IDEuMX0iLAorICAgICAgICAgICAgIiclcycgJSBbXSIsCisgICAgICAgICAgICAiJyUoa2V5KXMnICUgeydrZXknIDogW119IiwKKyAgICAgICAgICAgICInJXMnICUgTm9uZSIsCisgICAgICAgICAgICAiJyUoa2V5KXMnICUgeydrZXknIDogTm9uZX0iLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoY29kZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYmlub3Aobm9kZSkKKworICAgICAgICBmb3IgY29kZSwgYXJnX3R5cGUsIGZvcm1hdF90eXBlIGluICgKKyAgICAgICAgICAgICgiJyVkJyAlICcxJyIsICJidWlsdGlucy5zdHIiLCAiZCIpLAorICAgICAgICAgICAgKCInJShrZXkpZCcgJSB7J2tleScgOiAnMSd9IiwgImJ1aWx0aW5zLnN0ciIsICJkIiksCisgICAgICAgICAgICAoIicleCcgJSAxLjEiLCAiYnVpbHRpbnMuZmxvYXQiLCAieCIpLAorICAgICAgICAgICAgKCInJShrZXkpeCcgJSB7J2tleScgOiAxLjF9IiwgImJ1aWx0aW5zLmZsb2F0IiwgIngiKSwKKyAgICAgICAgICAgICgiJyVkJyAlIFtdIiwgImJ1aWx0aW5zLmxpc3QiLCAiZCIpLAorICAgICAgICAgICAgKCInJShrZXkpZCcgJSB7J2tleScgOiBbXX0iLCAiYnVpbHRpbnMubGlzdCIsICJkIiksCisgICAgICAgICk6CisgICAgICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoY29kZSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgImJhZC1zdHJpbmctZm9ybWF0LXR5cGUiLCBub2RlPW5vZGUsIGFyZ3M9KGFyZ190eXBlLCBmb3JtYXRfdHlwZSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9iaW5vcChub2RlKQorCisKK2RlZiB0ZXN0X3N0cl9ldmFsKCk6CisgICAgZm9yIHRva2VuIGluIFRFU1RfVE9LRU5TOgorICAgICAgICBhc3NlcnQgc3RyaW5ncy5zdHJfZXZhbCh0b2tlbikgPT0gIlgiCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2Vycy91bml0dGVzdF90eXBlY2hlY2sucHkgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF90eXBlY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkM2RhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3R5cGVjaGVjay5weQpAQCAtMCwwICsxLDQ5MCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxNCBIb2xnZXIgUGV0ZXJzIDxlbWFpbEBob2xnZXItcGV0ZXJzLmRlPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IERtaXRyeSBQcmlieXNoIDxkbWFuZEB5YW5kZXgucnU+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRmlsaXBlIEJyYW5kZW5idXJnZXIgPGZpbGJyYW5kZW5AZ29vZ2xlLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEJyeWNlIEd1aW50YSA8YnJ5Y2UucGF1bC5ndWludGFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IE1hcnRpbiBWaWVsc21haWVyIDxtYXJ0aW4udmllbHNtYWllckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBGZWRlcmljbyBCb25kIDxmZWRlcmljb2JvbmRAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgSnVsaWVuIFBhbGFyZCA8anVsaWVuQHBhbGFyZC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgRGF2aWQgR2lsbWFuIDxkYXZpZGdpbG1hbjFAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKK2ltcG9ydCBhc3Ryb2lkCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCB0eXBlY2hlY2sKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IFVOREVGSU5FRAorZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBDaGVja2VyVGVzdENhc2UsIE1lc3NhZ2UsIHNldF9jb25maWcKKwordHJ5OgorICAgIGZyb20gY292ZXJhZ2UgaW1wb3J0IHRyYWNlciBhcyBfICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CisKKyAgICBDX0VYVEVOVElPTlNfQVZBSUxBQkxFID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF8gPSBOb25lCisgICAgQ19FWFRFTlRJT05TX0FWQUlMQUJMRSA9IEZhbHNlCisKK25lZWRzX2NfZXh0ZW5zaW9uID0gcHl0ZXN0Lm1hcmsuc2tpcGlmKAorICAgIG5vdCBDX0VYVEVOVElPTlNfQVZBSUxBQkxFLCByZWFzb249IlJlcXVpcmVzIGNvdmVyYWdlIChzb3VyY2Ugb2YgQy1leHRlbnNpb24pIgorKQorCisKK2NsYXNzIFRlc3RUeXBlQ2hlY2tlcihDaGVja2VyVGVzdENhc2UpOgorICAgICJUZXN0cyBmb3IgcHlsaW50LmNoZWNrZXJzLnR5cGVjaGVjayIKKyAgICBDSEVDS0VSX0NMQVNTID0gdHlwZWNoZWNrLlR5cGVDaGVja2VyCisKKyAgICBkZWYgdGVzdF9ub19tZW1iZXJfaW5fZ2V0YXR0cihzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoYXQgYSBtb2R1bGUgYXR0cmlidXRlIGFjY2VzcyBpcyBjaGVja2VkIGJ5IHB5bGludC4iIiIKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IG9wdHBhcnNlCisgICAgICAgIG9wdHBhcnNlLlRISVNfZG9lc19ub3RfRVhJU1QKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgIm5vLW1lbWJlciIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJNb2R1bGUiLCAib3B0cGFyc2UiLCAiVEhJU19kb2VzX25vdF9FWElTVCIsICIiKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIEBzZXRfY29uZmlnKGlnbm9yZWRfbW9kdWxlcz0oImFyZ3BhcnNlIiwpKQorICAgIGRlZiB0ZXN0X25vX21lbWJlcl9pbl9nZXRhdHRyX2lnbm9yZWQoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGF0IGEgbW9kdWxlIGF0dHJpYnV0ZSBhY2Nlc3MgY2hlY2sgaXMgb21pdHRlZCB3aXRoIGEKKyAgICAgICAgbW9kdWxlIHRoYXQgaXMgY29uZmlndXJlZCB0byBiZSBpZ25vcmVkLgorICAgICAgICAiIiIKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGFyZ3BhcnNlCisgICAgICAgIGFyZ3BhcnNlLlRISVNfZG9lc19ub3RfRVhJU1QKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIEBzZXRfY29uZmlnKGlnbm9yZWRfbW9kdWxlcz0oInhtbC5ldHJlZS4iLCkpCisgICAgZGVmIHRlc3RfaWdub3JlZF9tb2R1bGVzX2ludmFsaWRfcGF0dGVybihzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCB4bWwKKyAgICAgICAgeG1sLmV0cmVlLkxhbGEKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2UoCisgICAgICAgICAgICAibm8tbWVtYmVyIiwgbm9kZT1ub2RlLCBhcmdzPSgiTW9kdWxlIiwgInhtbC5ldHJlZSIsICJMYWxhIiwgIiIpCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhtZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIEBzZXRfY29uZmlnKGlnbm9yZWRfbW9kdWxlcz0oInhtbCIsKSkKKyAgICBkZWYgdGVzdF9pZ25vcmVkX21vZHVsZXNfcm9vdF9vbmVfYXBwbGllc19hc193ZWxsKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgd2hlbiBhIHJvb3QgbW9kdWxlIGlzIGNvbXBsZXRlbHkgaWdub3JlZCwgc3VibW9kdWxlcyBhcmUgc2tpcHBlZC4KKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCB4bWwKKyAgICAgICAgeG1sLmV0cmVlLkxhbGEKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9hdHRyaWJ1dGUobm9kZSkKKworICAgIEBzZXRfY29uZmlnKGlnbm9yZWRfbW9kdWxlcz0oInhtbC5ldHJlZSoiLCkpCisgICAgZGVmIHRlc3RfaWdub3JlZF9tb2R1bGVzX3BhdHRlcm5zKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHhtbAorICAgICAgICB4bWwuZXRyZWUucG9ydG9jb2xhICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhpZ25vcmVkX2NsYXNzZXM9KCJ4bWwuKiIsKSkKKyAgICBkZWYgdGVzdF9pZ25vcmVkX2NsYXNzZXNfbm9fcmVjdXJzaXZlX3BhdHRlcm4oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgeG1sCisgICAgICAgIHhtbC5ldHJlZS5FbGVtZW50VHJlZS5UZXN0CisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKAorICAgICAgICAgICAgIm5vLW1lbWJlciIsIG5vZGU9bm9kZSwgYXJncz0oIk1vZHVsZSIsICJ4bWwuZXRyZWUuRWxlbWVudFRyZWUiLCAiVGVzdCIsICIiKQorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhpZ25vcmVkX2NsYXNzZXM9KCJvcHRwYXJzZS5WYWx1ZXMiLCkpCisgICAgZGVmIHRlc3RfaWdub3JlZF9jbGFzc2VzX3F1YWxpZmllZF9uYW1lKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgaWdub3JlZC1jbGFzc2VzIHN1cHBvcnRzIHF1YWxpZmllZCBuYW1lIGZvciBpZ25vcmluZy4iIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBvcHRwYXJzZQorICAgICAgICBvcHRwYXJzZS5WYWx1ZXMubGFsYQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2F0dHJpYnV0ZShub2RlKQorCisgICAgQHNldF9jb25maWcoaWdub3JlZF9jbGFzc2VzPSgiVmFsdWVzIiwpKQorICAgIGRlZiB0ZXN0X2lnbm9yZWRfY2xhc3Nlc19vbmx5X25hbWUoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBpZ25vcmVkX2NsYXNzZXMgd29ya3Mgd2l0aCB0aGUgbmFtZSBvbmx5LiIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IG9wdHBhcnNlCisgICAgICAgIG9wdHBhcnNlLlZhbHVlcy5sYWxhCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhzdWdnZXN0aW9uX21vZGU9RmFsc2UpCisgICAgQG5lZWRzX2NfZXh0ZW5zaW9uCisgICAgZGVmIHRlc3Rfbm9tZW1iZXJfb25fY19leHRlbnNpb25fZXJyb3JfbXNnKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBjb3ZlcmFnZSBpbXBvcnQgdHJhY2VyCisgICAgICAgIHRyYWNlci5DVHJhY2VyICAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgKKyAgICAgICAgICAgICJuby1tZW1iZXIiLCBub2RlPW5vZGUsIGFyZ3M9KCJNb2R1bGUiLCAiY292ZXJhZ2UudHJhY2VyIiwgIkNUcmFjZXIiLCAiIikKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2F0dHJpYnV0ZShub2RlKQorCisgICAgQHNldF9jb25maWcoc3VnZ2VzdGlvbl9tb2RlPVRydWUpCisgICAgQG5lZWRzX2NfZXh0ZW5zaW9uCisgICAgZGVmIHRlc3Rfbm9tZW1iZXJfb25fY19leHRlbnNpb25faW5mb19tc2coc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBmcm9tIGNvdmVyYWdlIGltcG9ydCB0cmFjZXIKKyAgICAgICAgdHJhY2VyLkNUcmFjZXIgICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKAorICAgICAgICAgICAgImMtZXh0ZW5zaW9uLW5vLW1lbWJlciIsCisgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICBhcmdzPSgiTW9kdWxlIiwgImNvdmVyYWdlLnRyYWNlciIsICJDVHJhY2VyIiwgIiIpLAorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfYXR0cmlidXRlKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZygKKyAgICAgICAgY29udGV4dG1hbmFnZXJfZGVjb3JhdG9ycz0oCisgICAgICAgICAgICAiY29udGV4dGxpYi5jb250ZXh0bWFuYWdlciIsCisgICAgICAgICAgICAiLmN1c3RvbV9jb250ZXh0bWFuYWdlciIsCisgICAgICAgICkKKyAgICApCisgICAgZGVmIHRlc3RfY3VzdG9tX2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IEBjdXN0b21fY29udGV4dG1hbmFnZXIgaXMgcmVjb2duaXplZCBhcyBjb25maWd1cmVkLiIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgY3VzdG9tX2NvbnRleHRtYW5hZ2VyKGYpOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHRtYW5hZ2VyKGYpCisgICAgICAgIEBjdXN0b21fY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGRlYygpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgd2l0aCBkZWMoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF93aXRoKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX21ldGFjbGFzcyhzZWxmKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBJbnZhbGlkQXNNZXRhY2xhc3Mob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBGaXJzdEludmFsaWQob2JqZWN0LCBtZXRhY2xhc3M9aW50KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBTZWNvbmRJbnZhbGlkKG9iamVjdCwgbWV0YWNsYXNzPUludmFsaWRBc01ldGFjbGFzcyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgVGhpcmRJbnZhbGlkKG9iamVjdCwgbWV0YWNsYXNzPTIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBmb3IgY2xhc3Nfb2JqLCBtZXRhY2xhc3NfbmFtZSBpbiAoCisgICAgICAgICAgICAoIlRoaXJkSW52YWxpZCIsICIyIiksCisgICAgICAgICAgICAoIlNlY29uZEludmFsaWQiLCAiSW52YWxpZEFzTWV0YWNsYXNzIiksCisgICAgICAgICAgICAoIkZpcnN0SW52YWxpZCIsICJpbnQiKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIGNsYXNzZGVmID0gbW9kdWxlW2NsYXNzX29ial0KKyAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJpbnZhbGlkLW1ldGFjbGFzcyIsIG5vZGU9Y2xhc3NkZWYsIGFyZ3M9KG1ldGFjbGFzc19uYW1lLCkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobWVzc2FnZSk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2NsYXNzZGVmKGNsYXNzZGVmKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9tZXRhY2xhc3NfZnVuY3Rpb25fbWV0YWNsYXNzZXMoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGludmFsaWRfbWV0YWNsYXNzXzEobmFtZSwgYmFzZXMsIGF0dHJzKToKKyAgICAgICAgICAgIHJldHVybiBpbnQKKyAgICAgICAgZGVmIGludmFsaWRfbWV0YWNsYXNzXzIobmFtZSwgYmFzZXMsIGF0dHJzKToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGNsYXNzIEludmFsaWQobWV0YWNsYXNzPWludmFsaWRfbWV0YWNsYXNzXzEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBJbnZhbGlkU2Vjb25kKG1ldGFjbGFzcz1pbnZhbGlkX21ldGFjbGFzc18yKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgZm9yIGNsYXNzX29iaiwgbWV0YWNsYXNzX25hbWUgaW4gKCgiSW52YWxpZCIsICJpbnQiKSwgKCJJbnZhbGlkU2Vjb25kIiwgIjEiKSk6CisgICAgICAgICAgICBjbGFzc2RlZiA9IG1vZHVsZVtjbGFzc19vYmpdCisgICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAiaW52YWxpZC1tZXRhY2xhc3MiLCBub2RlPWNsYXNzZGVmLCBhcmdzPShtZXRhY2xhc3NfbmFtZSwpCisgICAgICAgICAgICApCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKG1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jbGFzc2RlZihjbGFzc2RlZikKKworICAgIGRlZiB0ZXN0X3R5cGluZ19uYW1lZHR1cGxlX25vdF9jYWxsYWJsZV9pc3N1ZTEyOTUoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHR5cGluZworICAgICAgICBOYW1lZCA9IHR5cGluZy5OYW1lZFR1cGxlKCdOYW1lZCcsIFsoJ2ZvbycsIGludCksICgnYmFyJywgaW50KV0pCisgICAgICAgIG5hbWVkID0gTmFtZWQoMSwgMikKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgY2FsbCA9IG1vZHVsZS5ib2R5Wy0xXS52YWx1ZQorICAgICAgICBjYWxsYWJsZXMgPSBjYWxsLmZ1bmMuaW5mZXJyZWQoKQorICAgICAgICBhc3NlcnQgbGVuKGNhbGxhYmxlcykgPT0gMQorICAgICAgICBhc3NlcnQgY2FsbGFibGVzWzBdLmNhbGxhYmxlKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKGNhbGwpCisKKyAgICBkZWYgdGVzdF90eXBpbmdfbmFtZWR0dXBsZV91bnN1YnNjcmlwdGFibGVfb2JqZWN0X2lzc3VlMTI5NShzZWxmKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgdHlwaW5nCisgICAgICAgIE15VHlwZSA9IHR5cGluZy5UdXBsZVtzdHIsIHN0cl0KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc3Vic2NyaXB0ID0gbW9kdWxlLmJvZHlbLTFdLnZhbHVlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfc3Vic2NyaXB0KHN1YnNjcmlwdCkKKworICAgIGRlZiB0ZXN0X3N0YXRpY21ldGhvZF9tdWx0aXByb2Nlc3NpbmdfY2FsbChzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIG5vdC1jYWxsYWJsZSBpc24ndCByYWlzZWQgZm9yIGRlc2NyaXB0b3JzCisKKyAgICAgICAgYXN0cm9pZCBjYW4ndCBwcm9jZXNzIGRlc2NyaXB0b3JzIGNvcnJlY3RseSBzbworICAgICAgICBweWxpbnQgbmVlZHMgdG8gaWdub3JlIG5vdC1jYWxsYWJsZSBmb3IgdGhlbQorICAgICAgICByaWdodCBub3cKKworICAgICAgICBUZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8xNjk5CisgICAgICAgICIiIgorICAgICAgICBjYWxsID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IG11bHRpcHJvY2Vzc2luZworICAgICAgICBtdWx0aXByb2Nlc3NpbmcuY3VycmVudF9wcm9jZXNzKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKGNhbGwpCisKKyAgICBkZWYgdGVzdF9ub3RfY2FsbGFibGVfdW5pbmZlcmFibGVfcHJvcGVydHkoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSBub3QtY2FsbGFibGUgaXNuJ3QgcmFpc2VkIGZvciB1bmluZmVyYWJsZQorICAgICAgICBwcm9wZXJ0aWVzCisgICAgICAgICIiIgorICAgICAgICBjYWxsID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGNhbGwoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZAorCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5jYWxsKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9jYWxsKGNhbGwpCisKKyAgICBkZWYgdGVzdF9kZXNjcmlwdG9yX2NhbGwoc2VsZik6CisgICAgICAgIGNhbGwgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuYygpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEFEZXNjcmlwdG9yOgorICAgICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYworCisgICAgICAgIGNsYXNzIEFnZ3JlZ2F0ZUNsczoKKyAgICAgICAgICAgIGEgPSBBRGVzY3JpcHRvcigpCisKKyAgICAgICAgQWdncmVnYXRlQ2xzKCkuYSgpICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChjYWxsKQorCisgICAgZGVmIHRlc3RfdW5rbm93bl9wYXJlbnQoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGUgY2FsbGFibGUgY2hlY2sgZG9lcyBub3QgY3Jhc2ggd2hlbiBhIG5vZGUncyBwYXJlbnQKKyAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWQuCisgICAgICAgICIiIgorICAgICAgICBjYWxsID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGdldF9udW0obik6CisgICAgICAgICAgICByZXR1cm4gMiAqIG4KKyAgICAgICAgZ2V0X251bSgxMCkoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgibm90LWNhbGxhYmxlIiwgbm9kZT1jYWxsLCBhcmdzPSJnZXRfbnVtKDEwKSIpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfY2FsbChjYWxsKQorCisKK2NsYXNzIFRlc3RUeXBlQ2hlY2tlck9uRGVjb3JhdG9ycyhDaGVja2VyVGVzdENhc2UpOgorICAgICJUZXN0cyBmb3IgcHlsaW50LmNoZWNrZXJzLnR5cGVjaGVjayBvbiBkZWNvcmF0ZWQgZnVuY3Rpb25zLiIKKyAgICBDSEVDS0VSX0NMQVNTID0gdHlwZWNoZWNrLlR5cGVDaGVja2VyCisKKyAgICBkZWYgdGVzdF9pc3N1ZTM4ODJfY2xhc3NfZGVjb3JhdG9ycyhzZWxmKToKKyAgICAgICAgZGVjb3JhdG9ycyA9ICIiIgorICAgICAgICBjbGFzcyBVbnN1YnNjcmlwdGFibGU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgICAgICAgICAgc2VsZi5mID0gZgorCisgICAgICAgIGNsYXNzIFN1YnNjcmlwdGFibGU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgICAgICAgICAgc2VsZi5mID0gZgorCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXRlbSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBnZW5lcmljIGluICJPcHRpb25hbCIsICJMaXN0IiwgIkNsYXNzVmFyIiwgIkZpbmFsIiwgIkxpdGVyYWwiOgorICAgICAgICAgICAgc2VsZi50eXBpbmdfb2JqZWN0c19hcmVfc3Vic2NyaXB0YWJsZShnZW5lcmljKQorCisgICAgICAgIHNlbGYuZ2V0aXRlbV9vbl9tb2R1bGVzKCkKKyAgICAgICAgc2VsZi5kZWNvcmF0ZWRfYnlfYV9zdWJzY3JpcHRhYmxlX2NsYXNzKGRlY29yYXRvcnMpCisgICAgICAgIHNlbGYuZGVjb3JhdGVkX2J5X2FuX3Vuc3Vic2NyaXB0YWJsZV9jbGFzcyhkZWNvcmF0b3JzKQorCisgICAgICAgIHNlbGYuZGVjb3JhdGVkX2J5X3N1YnNjcmlwdGFibGVfdGhlbl91bnN1YnNjcmlwdGFibGVfY2xhc3MoZGVjb3JhdG9ycykKKyAgICAgICAgc2VsZi5kZWNvcmF0ZWRfYnlfdW5zdWJzY3JpcHRhYmxlX3RoZW5fc3Vic2NyaXB0YWJsZV9jbGFzcyhkZWNvcmF0b3JzKQorCisgICAgZGVmIGdldGl0ZW1fb25fbW9kdWxlcyhzZWxmKToKKyAgICAgICAgIiIiTWFpbmx5IHZhbGlkYXRlIHRoZSBjb2RlIHdvbid0IGNyYXNoIGlmIHdlJ3JlIG5vdCBoYXZpbmcgYSBmdW5jdGlvbi4iIiIKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgY29sbGVjdGlvbnMKKyAgICAgICAgdGVzdCA9IGNvbGxlY3Rpb25zW2ludF0KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc3Vic2NyaXB0ID0gbW9kdWxlLmJvZHlbLTFdLnZhbHVlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1bnN1YnNjcmlwdGFibGUtb2JqZWN0IiwKKyAgICAgICAgICAgICAgICBub2RlPXN1YnNjcmlwdC52YWx1ZSwKKyAgICAgICAgICAgICAgICBhcmdzPSJjb2xsZWN0aW9ucyIsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfc3Vic2NyaXB0KHN1YnNjcmlwdCkKKworICAgIGRlZiB0eXBpbmdfb2JqZWN0c19hcmVfc3Vic2NyaXB0YWJsZShzZWxmLCBnZW5lcmljKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgIGYiIiIKKyAgICAgICAgaW1wb3J0IHR5cGluZworICAgICAgICB0ZXN0ID0gdHlwaW5nLntnZW5lcmljfVtpbnRdCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHN1YnNjcmlwdCA9IG1vZHVsZS5ib2R5Wy0xXS52YWx1ZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3N1YnNjcmlwdChzdWJzY3JpcHQpCisKKyAgICBkZWYgZGVjb3JhdGVkX2J5X2Ffc3Vic2NyaXB0YWJsZV9jbGFzcyhzZWxmLCBkZWNvcmF0b3JzKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgIGRlY29yYXRvcnMKKyAgICAgICAgICAgICsgIiIiCisgICAgICAgIEBTdWJzY3JpcHRhYmxlCisgICAgICAgIGRlZiBkZWNvcmF0ZWQoKToKKyAgICAgICAgICAgIC4uLgorCisgICAgICAgIHRlc3QgPSBkZWNvcmF0ZWRbTm9uZV0KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc3Vic2NyaXB0ID0gbW9kdWxlLmJvZHlbLTFdLnZhbHVlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfc3Vic2NyaXB0KHN1YnNjcmlwdCkKKworICAgIGRlZiBkZWNvcmF0ZWRfYnlfc3Vic2NyaXB0YWJsZV90aGVuX3Vuc3Vic2NyaXB0YWJsZV9jbGFzcyhzZWxmLCBkZWNvcmF0b3JzKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgIGRlY29yYXRvcnMKKyAgICAgICAgICAgICsgIiIiCisgICAgICAgIEBVbnN1YnNjcmlwdGFibGUKKyAgICAgICAgQFN1YnNjcmlwdGFibGUKKyAgICAgICAgZGVmIGRlY29yYXRlZCgpOgorICAgICAgICAgICAgLi4uCisKKyAgICAgICAgdGVzdCA9IGRlY29yYXRlZFtOb25lXQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBzdWJzY3JpcHQgPSBtb2R1bGUuYm9keVstMV0udmFsdWUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgInVuc3Vic2NyaXB0YWJsZS1vYmplY3QiLAorICAgICAgICAgICAgICAgIG5vZGU9c3Vic2NyaXB0LnZhbHVlLAorICAgICAgICAgICAgICAgIGFyZ3M9ImRlY29yYXRlZCIsCisgICAgICAgICAgICAgICAgY29uZmlkZW5jZT1VTkRFRklORUQsCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfc3Vic2NyaXB0KHN1YnNjcmlwdCkKKworICAgIGRlZiBkZWNvcmF0ZWRfYnlfdW5zdWJzY3JpcHRhYmxlX3RoZW5fc3Vic2NyaXB0YWJsZV9jbGFzcyhzZWxmLCBkZWNvcmF0b3JzKToKKyAgICAgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgIGRlY29yYXRvcnMKKyAgICAgICAgICAgICsgIiIiCisgICAgICAgIEBTdWJzY3JpcHRhYmxlCisgICAgICAgIEBVbnN1YnNjcmlwdGFibGUKKyAgICAgICAgZGVmIGRlY29yYXRlZCgpOgorICAgICAgICAgICAgLi4uCisKKyAgICAgICAgdGVzdCA9IGRlY29yYXRlZFtOb25lXQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBzdWJzY3JpcHQgPSBtb2R1bGUuYm9keVstMV0udmFsdWUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9zdWJzY3JpcHQoc3Vic2NyaXB0KQorCisgICAgZGVmIGRlY29yYXRlZF9ieV9hbl91bnN1YnNjcmlwdGFibGVfY2xhc3Moc2VsZiwgZGVjb3JhdG9ycyk6CisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICBkZWNvcmF0b3JzCisgICAgICAgICAgICArICIiIgorICAgICAgICBAVW5zdWJzY3JpcHRhYmxlCisgICAgICAgIGRlZiBkZWNvcmF0ZWQoKToKKyAgICAgICAgICAgIC4uLgorCisgICAgICAgIHRlc3QgPSBkZWNvcmF0ZWRbTm9uZV0KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc3Vic2NyaXB0ID0gbW9kdWxlLmJvZHlbLTFdLnZhbHVlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgICJ1bnN1YnNjcmlwdGFibGUtb2JqZWN0IiwKKyAgICAgICAgICAgICAgICBub2RlPXN1YnNjcmlwdC52YWx1ZSwKKyAgICAgICAgICAgICAgICBhcmdzPSJkZWNvcmF0ZWQiLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U9VU5ERUZJTkVELAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3N1YnNjcmlwdChzdWJzY3JpcHQpCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2Vycy91bml0dGVzdF91dGlscy5weSBiL3Rlc3RzL2NoZWNrZXJzL3VuaXR0ZXN0X3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTE1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF91dGlscy5weQpAQCAtMCwwICsxLDM5OCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTAgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBbGFuIENoYW4gPGFjaGFuOTYxMTE3QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IENhaW8gQ2FycmFyYSA8Y2NhcnJhcmFAcmVkaGF0LmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgTmF0aGFuIE1hcnJvdyA8bm1hcnJvd0Bnb29nbGUuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdHMgZm9yIHRoZSBweWxpbnQuY2hlY2tlcnMudXRpbHMgbW9kdWxlLiIiIgorCitpbXBvcnQgYXN0cm9pZAoraW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgdXRpbHMKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgIm5hbWUsZXhwZWN0ZWQiLAorICAgIFsKKyAgICAgICAgKCJtaW4iLCBUcnVlKSwKKyAgICAgICAgKCJfX2J1aWx0aW5zX18iLCBUcnVlKSwKKyAgICAgICAgKCJfX3BhdGhfXyIsIEZhbHNlKSwKKyAgICAgICAgKCJfX2ZpbGVfXyIsIEZhbHNlKSwKKyAgICAgICAgKCJ3aGF0ZXZlciIsIEZhbHNlKSwKKyAgICAgICAgKCJteWJ1aWx0aW4iLCBGYWxzZSksCisgICAgXSwKKykKK2RlZiB0ZXN0SXNCdWlsdGluKG5hbWUsIGV4cGVjdGVkKToKKyAgICBhc3NlcnQgdXRpbHMuaXNfYnVpbHRpbihuYW1lKSA9PSBleHBlY3RlZAorCisKK0BweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAiZm4sa3ciLAorICAgIFsoImZvbygzKSIsIHsia2V5d29yZCI6ICJiYXIifSksICgiZm9vKG9uZT1hLCB0d289YiwgdGhyZWU9YykiLCB7InBvc2l0aW9uIjogMX0pXSwKKykKK2RlZiB0ZXN0R2V0QXJndW1lbnRGcm9tQ2FsbEVycm9yKGZuLCBrdyk6CisgICAgd2l0aCBweXRlc3QucmFpc2VzKHV0aWxzLk5vU3VjaEFyZ3VtZW50RXJyb3IpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoZm4pCisgICAgICAgIHV0aWxzLmdldF9hcmd1bWVudF9mcm9tX2NhbGwobm9kZSwgKiprdykKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgImZuLGt3IiwgWygiZm9vKGJhcj0zKSIsIHsia2V5d29yZCI6ICJiYXIifSksICgiZm9vKGEsIGIsIGMpIiwgeyJwb3NpdGlvbiI6IDF9KV0KKykKK2RlZiB0ZXN0R2V0QXJndW1lbnRGcm9tQ2FsbEV4aXN0cyhmbiwga3cpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShmbikKKyAgICBhc3NlcnQgdXRpbHMuZ2V0X2FyZ3VtZW50X2Zyb21fY2FsbChub2RlLCAqKmt3KSBpcyBub3QgTm9uZQorCisKK2RlZiB0ZXN0R2V0QXJndW1lbnRGcm9tQ2FsbCgpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgiZm9vKGEsIG5vdF90aGlzX29uZT0xLCB0aGlzX29uZT0yKSIpCisgICAgYXJnID0gdXRpbHMuZ2V0X2FyZ3VtZW50X2Zyb21fY2FsbChub2RlLCBwb3NpdGlvbj0yLCBrZXl3b3JkPSJ0aGlzX29uZSIpCisgICAgYXNzZXJ0IGFyZy52YWx1ZSA9PSAyCisKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoImZvbyhhKSIpCisgICAgd2l0aCBweXRlc3QucmFpc2VzKHV0aWxzLk5vU3VjaEFyZ3VtZW50RXJyb3IpOgorICAgICAgICB1dGlscy5nZXRfYXJndW1lbnRfZnJvbV9jYWxsKG5vZGUsIHBvc2l0aW9uPTEpCisgICAgd2l0aCBweXRlc3QucmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICB1dGlscy5nZXRfYXJndW1lbnRfZnJvbV9jYWxsKG5vZGUsIE5vbmUsIE5vbmUpCisgICAgbmFtZSA9IHV0aWxzLmdldF9hcmd1bWVudF9mcm9tX2NhbGwobm9kZSwgcG9zaXRpb249MCkKKyAgICBhc3NlcnQgbmFtZS5uYW1lID09ICJhIgorCisKK2RlZiB0ZXN0X2Vycm9yX29mX3R5cGUoKToKKyAgICBub2RlcyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICB0cnk6IHBhc3MKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICNACisgICAgICAgICBwYXNzCisgICAgdHJ5OiBwYXNzCisgICAgZXhjZXB0IEV4Y2VwdGlvbjogI0AKKyAgICAgICAgIHBhc3MKKyAgICBleGNlcHQ6ICNACisgICAgICAgICBwYXNzCisgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5lcnJvcl9vZl90eXBlKG5vZGVzWzBdLCBBdHRyaWJ1dGVFcnJvcikKKyAgICBhc3NlcnQgdXRpbHMuZXJyb3Jfb2ZfdHlwZShub2Rlc1swXSwgKEF0dHJpYnV0ZUVycm9yLCkpCisgICAgYXNzZXJ0IG5vdCB1dGlscy5lcnJvcl9vZl90eXBlKG5vZGVzWzBdLCBFeGNlcHRpb24pCisgICAgYXNzZXJ0IHV0aWxzLmVycm9yX29mX3R5cGUobm9kZXNbMV0sIEV4Y2VwdGlvbikKKworCitkZWYgdGVzdF9ub2RlX2lnbm9yZXNfZXhjZXB0aW9uKCk6CisgICAgbm9kZXMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgdHJ5OgorICAgICAgICAxLzAgI0AKKyAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIDEvMCAjQAorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIDIvMCAjQAorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgMS8wICNACisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICAiIiIKKyAgICApCisgICAgYXNzZXJ0IHV0aWxzLm5vZGVfaWdub3Jlc19leGNlcHRpb24obm9kZXNbMF0sIFplcm9EaXZpc2lvbkVycm9yKQorICAgIGFzc2VydCBub3QgdXRpbHMubm9kZV9pZ25vcmVzX2V4Y2VwdGlvbihub2Rlc1sxXSwgWmVyb0RpdmlzaW9uRXJyb3IpCisgICAgYXNzZXJ0IG5vdCB1dGlscy5ub2RlX2lnbm9yZXNfZXhjZXB0aW9uKG5vZGVzWzJdLCBaZXJvRGl2aXNpb25FcnJvcikKKyAgICBhc3NlcnQgbm90IHV0aWxzLm5vZGVfaWdub3Jlc19leGNlcHRpb24obm9kZXNbM10sIFplcm9EaXZpc2lvbkVycm9yKQorCisKK2RlZiB0ZXN0X2lzX3N1YmNsYXNzX29mX25vZGVfYl9kZXJpdmVkX2Zyb21fbm9kZV9hKCk6CisgICAgbm9kZXMgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgY2xhc3MgU3VwZXJjbGFzczogI0AKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgU3ViY2xhc3MoU3VwZXJjbGFzcyk6ICNACisgICAgICAgIHBhc3MKKyAgICAiIiIKKyAgICApCisgICAgYXNzZXJ0IHV0aWxzLmlzX3N1YmNsYXNzX29mKG5vZGVzWzFdLCBub2Rlc1swXSkKKworCitkZWYgdGVzdF9pc19zdWJjbGFzc19vZl9ub2RlX2Jfbm90X2Rlcml2ZWRfZnJvbV9ub2RlX2EoKToKKyAgICBub2RlcyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICBjbGFzcyBPbmVDbGFzczogI0AKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgQW5vdGhlckNsYXNzOiAjQAorICAgICAgICBwYXNzCisgICAgIiIiCisgICAgKQorICAgIGFzc2VydCBub3QgdXRpbHMuaXNfc3ViY2xhc3Nfb2Yobm9kZXNbMV0sIG5vZGVzWzBdKQorCisKK2RlZiB0ZXN0X2lzX3N1YmNsYXNzX29mX25vdF9jbGFzc2RlZnMoKToKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICIiIgorICAgIGNsYXNzIE9uZUNsYXNzOiAjQAorICAgICAgICBwYXNzCisgICAgIiIiCisgICAgKQorICAgIGFzc2VydCBub3QgdXRpbHMuaXNfc3ViY2xhc3Nfb2YoTm9uZSwgbm9kZSkKKyAgICBhc3NlcnQgbm90IHV0aWxzLmlzX3N1YmNsYXNzX29mKG5vZGUsIE5vbmUpCisgICAgYXNzZXJ0IG5vdCB1dGlscy5pc19zdWJjbGFzc19vZihOb25lLCBOb25lKQorCisKK2RlZiB0ZXN0X3BhcnNlX2Zvcm1hdF9tZXRob2Rfc3RyaW5nKCk6CisgICAgc2FtcGxlcyA9IFsKKyAgICAgICAgKCJ7fSIsIDEpLAorICAgICAgICAoInt9Ont9IiwgMiksCisgICAgICAgICgie2ZpZWxkfSIsIDEpLAorICAgICAgICAoIns6NX0iLCAxKSwKKyAgICAgICAgKCJ7OjEwfSIsIDEpLAorICAgICAgICAoIntmaWVsZDoxMH0iLCAxKSwKKyAgICAgICAgKCJ7ZmllbGQ6MTB9e3t9fSIsIDEpLAorICAgICAgICAoIns6NX17IXI6MTB9IiwgMiksCisgICAgICAgICgiezo1fXt9e3t9fXt9IiwgMyksCisgICAgICAgICgiezB9ezF9ezB9IiwgMiksCisgICAgICAgICgiQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9IiwgMiksCisgICAgICAgICgiWDogezBbMF19OyAgWTogezBbMV19IiwgMSksCisgICAgICAgICgiezoqXjMwfSIsIDEpLAorICAgICAgICAoInshcjp9IiwgMSksCisgICAgXQorICAgIGZvciBmbXQsIGNvdW50IGluIHNhbXBsZXM6CisgICAgICAgIGtleXMsIG51bV9hcmdzLCBwb3NfYXJncyA9IHV0aWxzLnBhcnNlX2Zvcm1hdF9tZXRob2Rfc3RyaW5nKGZtdCkKKyAgICAgICAga2V5d29yZF9hcmdzID0gbGVuKHtrIGZvciBrLCBsIGluIGtleXMgaWYgbm90IGlzaW5zdGFuY2UoaywgaW50KX0pCisgICAgICAgIGFzc2VydCBrZXl3b3JkX2FyZ3MgKyBudW1fYXJncyArIHBvc19hcmdzID09IGNvdW50CisKKworZGVmIHRlc3RfaW5oZXJpdF9mcm9tX3N0ZF9leF9yZWN1cnNpdmVfZGVmaW5pdGlvbigpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICBpbXBvcnQgZGF0ZXRpbWUKKyAgICAgIGNsYXNzIEZpcnN0KGRhdGV0aW1lLmRhdGV0aW1lKToKKyAgICAgICAgcGFzcworICAgICAgY2xhc3MgU2Vjb25kKGRhdGV0aW1lLmRhdGV0aW1lKTogI0AKKyAgICAgICAgcGFzcworICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUgPSBGaXJzdAorICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUgPSBTZWNvbmQKKyAgICAgICIiIgorICAgICkKKyAgICBhc3NlcnQgbm90IHV0aWxzLmluaGVyaXRfZnJvbV9zdGRfZXgobm9kZSkKKworCitkZWYgdGVzdF9nZXRfbm9kZV9sYXN0X2xpbmVub19zaW1wbGUoKToKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSAyCisKKworZGVmIHRlc3RfZ2V0X25vZGVfbGFzdF9saW5lbm9faWZfc2ltcGxlKCk6CisgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIHByaW50KDEpCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICkKKyAgICBhc3NlcnQgdXRpbHMuZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZSkgPT0gNAorCisKK2RlZiB0ZXN0X2dldF9ub2RlX2xhc3RfbGluZW5vX2lmX2Vsc2VpZl9lbHNlKCk6CisgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIHByaW50KDEpCisgICAgICAgIGVsaWYgRmFsc2U6CisgICAgICAgICAgICBwcmludCgyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoMykKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSA3CisKKworZGVmIHRlc3RfZ2V0X25vZGVfbGFzdF9saW5lbm9fd2hpbGUoKToKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSAzCisKKworZGVmIHRlc3RfZ2V0X25vZGVfbGFzdF9saW5lbm9fd2hpbGVfZWxzZSgpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBwcmludCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoMikKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSA1CisKKworZGVmIHRlc3RfZ2V0X25vZGVfbGFzdF9saW5lbm9fZm9yKCk6CisgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMCwgNSk6CisgICAgICAgICAgICBwcmludCgxKQorICAgICAgICAiIiIKKyAgICApCisgICAgYXNzZXJ0IHV0aWxzLmdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUpID09IDMKKworCitkZWYgdGVzdF9nZXRfbm9kZV9sYXN0X2xpbmVub19mb3JfZWxzZSgpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICAgIGZvciB4IGluIHJhbmdlKDAsIDUpOgorICAgICAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KDIpCisgICAgICAgICIiIgorICAgICkKKyAgICBhc3NlcnQgdXRpbHMuZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZSkgPT0gNQorCisKK2RlZiB0ZXN0X2dldF9ub2RlX2xhc3RfbGluZW5vX3RyeSgpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50KDEpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcHJpbnQoMikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHByaW50KDMpCisgICAgICAgICIiIgorICAgICkKKyAgICBhc3NlcnQgdXRpbHMuZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZSkgPT0gNworCisKK2RlZiB0ZXN0X2dldF9ub2RlX2xhc3RfbGluZW5vX3RyeV9leGNlcHRfZWxzZSgpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50KDEpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBwcmludCgyKQorICAgICAgICAgICAgcHJpbnQoMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KDQpCisgICAgICAgICIiIgorICAgICkKKyAgICBhc3NlcnQgdXRpbHMuZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZSkgPT0gOAorCisKK2RlZiB0ZXN0X2dldF9ub2RlX2xhc3RfbGluZW5vX3RyeV9leGNlcHRfZmluYWxseSgpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50KDEpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBwcmludCgyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcHJpbnQoNCkKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSA3CisKKworZGVmIHRlc3RfZ2V0X25vZGVfbGFzdF9saW5lbm9fdHJ5X2V4Y2VwdF9lbHNlX2ZpbmFsbHkoKToKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCgxKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcHJpbnQoMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KDMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBwcmludCg0KQorICAgICAgICAiIiIKKyAgICApCisgICAgYXNzZXJ0IHV0aWxzLmdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUpID09IDkKKworCitkZWYgdGVzdF9nZXRfbm9kZV9sYXN0X2xpbmVub193aXRoKCk6CisgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICAgICAgd2l0aCB4IGFzIHk6CisgICAgICAgICAgICBwcmludCgxKQorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICApCisgICAgYXNzZXJ0IHV0aWxzLmdldF9ub2RlX2xhc3RfbGluZW5vKG5vZGUpID09IDQKKworCitkZWYgdGVzdF9nZXRfbm9kZV9sYXN0X2xpbmVub19tZXRob2QoKToKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICIiIgorICAgICAgICBkZWYgeChhLCBiKToKKyAgICAgICAgICAgIHByaW50KGEsIGIpCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICkKKyAgICBhc3NlcnQgdXRpbHMuZ2V0X25vZGVfbGFzdF9saW5lbm8obm9kZSkgPT0gNAorCisKK2RlZiB0ZXN0X2dldF9ub2RlX2xhc3RfbGluZW5vX2RlY29yYXRvcigpOgorICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgIiIiCisgICAgICAgIEBkZWNvcigpCisgICAgICAgIGRlZiB4KGEsIGIpOgorICAgICAgICAgICAgcHJpbnQoYSwgYikKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSA1CisKKworZGVmIHRlc3RfZ2V0X25vZGVfbGFzdF9saW5lbm9fY2xhc3MoKToKKyAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBDT05TVCA9IFRydWUKKworICAgICAgICAgICAgZGVmIHgoc2VsZiwgYik6CisgICAgICAgICAgICAgICAgcHJpbnQoYikKKworICAgICAgICAgICAgZGVmIHkoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSAxMAorCisKK2RlZiB0ZXN0X2dldF9ub2RlX2xhc3RfbGluZW5vX2NvbWJpbmVkKCk6CisgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgQ09OU1QgPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiB5KHNlbGYpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgKQorICAgIGFzc2VydCB1dGlscy5nZXRfbm9kZV9sYXN0X2xpbmVubyhub2RlKSA9PSAxMQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfdmFyaWFibGVzLnB5IGIvdGVzdHMvY2hlY2tlcnMvdW5pdHRlc3RfdmFyaWFibGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGFhOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2Vycy91bml0dGVzdF92YXJpYWJsZXMucHkKQEAgLTAsMCArMSwzNTQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggQnJ5Y2UgR3VpbnRhIDxicnljZS5ndWludGFAcHJvdG9ubWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBCcnljZSBHdWludGEgPGJyeWNlLnBhdWwuZ3VpbnRhQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IG1hci1jaGktcGFuIDxtYXIucG9sYXRvZ2xvdUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFuZHJldyBTaW1tb25zIDxhbmpzaW1tb0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbmRyZXcgU2ltbW9ucyA8YS5zaW1tb25zQGRlYWtpbi5lZHUuYXU+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCB2YXJpYWJsZXMKK2Zyb20gcHlsaW50LmludGVyZmFjZXMgaW1wb3J0IFVOREVGSU5FRAorZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBDaGVja2VyVGVzdENhc2UsIE1lc3NhZ2UsIGxpbnRlciwgc2V0X2NvbmZpZworCitSRUdSX0RBVEFfRElSID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCAvICIuLiIgLyAicmVncnRlc3RfZGF0YSIpCisKKworY2xhc3MgVGVzdFZhcmlhYmxlc0NoZWNrZXIoQ2hlY2tlclRlc3RDYXNlKToKKworICAgIENIRUNLRVJfQ0xBU1MgPSB2YXJpYWJsZXMuVmFyaWFibGVzQ2hlY2tlcgorCisgICAgZGVmIHRlc3RfYml0YnVja2V0X2lzc3VlXzc4KHNlbGYpOgorICAgICAgICAiIiJJc3N1ZSA3OCByZXBvcnQgYSBmYWxzZSBwb3NpdGl2ZSBmb3IgdW51c2VkLW1vZHVsZSIiIgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBwYXRoCisgICAgICAgIHBhdGggKz0gWydzdHVmZiddCisgICAgICAgIGRlZiBmdW5jKCk6CisgICAgICAgICAgICBvdGhlciA9IDEKKyAgICAgICAgICAgIHJldHVybiBsZW4ob3RoZXIpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobW9kdWxlKQorCisgICAgQHNldF9jb25maWcoaWdub3JlZF9tb2R1bGVzPSgiYXJncGFyc2UiLCkpCisgICAgZGVmIHRlc3Rfbm9fbmFtZV9pbl9tb2R1bGVfc2tpcHBlZChzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoYXQgJ2Zyb20gLi4uIGltcG9ydCAuLi4nIGRvZXMgbm90IGVtaXQgYQorICAgICAgICAnbm8tbmFtZS1pbi1tb2R1bGUnIHdpdGggYSBtb2R1bGUgdGhhdCBpcyBjb25maWd1cmVkCisgICAgICAgIHRvIGJlIGlnbm9yZWQuCisgICAgICAgICIiIgorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBmcm9tIGFyZ3BhcnNlIGltcG9ydCBUSElTX2RvZXNfbm90X0VYSVNUCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaW1wb3J0ZnJvbShub2RlKQorCisgICAgZGVmIHRlc3RfYWxsX2VsZW1lbnRzX3dpdGhvdXRfcGFyZW50KHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoIl9fYWxsX18gPSBbXSIpCisgICAgICAgIG5vZGUudmFsdWUuZWx0cy5hcHBlbmQoYXN0cm9pZC5Db25zdCgidGVzdCIpKQorICAgICAgICByb290ID0gbm9kZS5yb290KCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9tb2R1bGUocm9vdCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5sZWF2ZV9tb2R1bGUocm9vdCkKKworICAgIGRlZiB0ZXN0X3JlZGVmaW5lZF9idWlsdGluX2lnbm9yZWQoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGZyb20gZnV0dXJlLmJ1aWx0aW5zIGltcG9ydCBvcGVuCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfbW9kdWxlKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhyZWRlZmluaW5nX2J1aWx0aW5zX21vZHVsZXM9KCJvcyIsKSkKKyAgICBkZWYgdGVzdF9yZWRlZmluZWRfYnVpbHRpbl9jdXN0b21fbW9kdWxlcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBvcyBpbXBvcnQgb3BlbgorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShub2RlKQorCisgICAgQHNldF9jb25maWcocmVkZWZpbmluZ19idWlsdGluc19tb2R1bGVzPSgib3MiLCkpCisgICAgZGVmIHRlc3RfcmVkZWZpbmVkX2J1aWx0aW5fbW9kbmFtZV9ub3RfaWdub3JlZChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBmdXR1cmUuYnVpbHRpbnMgaW1wb3J0IG9wZW4KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoInJlZGVmaW5lZC1idWlsdGluIiwgbm9kZT1ub2RlLmJvZHlbMF0sIGFyZ3M9Im9wZW4iKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShub2RlKQorCisgICAgQHNldF9jb25maWcocmVkZWZpbmluZ19idWlsdGluc19tb2R1bGVzPSgib3MiLCkpCisgICAgZGVmIHRlc3RfcmVkZWZpbmVkX2J1aWx0aW5faW5fZnVuY3Rpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgdGVzdCgpOgorICAgICAgICAgICAgZnJvbSBvcyBpbXBvcnQgb3BlbgorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShub2RlLnJvb3QoKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfdW5hc3NpZ25lZF9nbG9iYWwoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZGVmIGZ1bmMoKToKKyAgICAgICAgICAgICAgICBnbG9iYWwgc3lzICAjQAorICAgICAgICAgICAgICAgIGltcG9ydCBzeXMsIGxhbGEKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbXNnID0gTWVzc2FnZSgiZ2xvYmFsLXN0YXRlbWVudCIsIG5vZGU9bm9kZSwgY29uZmlkZW5jZT1VTkRFRklORUQpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMobXNnKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9nbG9iYWwobm9kZSkKKworICAgIGRlZiB0ZXN0X2xpc3Rjb21wX2luX2RlY29yYXRvcihzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIGNsYXNzIGF0dHJpYnV0ZXMgaW4gc2NvcGUgZm9yIGxpc3Rjb21wIGluIGRlY29yYXRvci4KKworICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy81MTEKKyAgICAgICAgIiIiCisgICAgICAgIG1vZHVsZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGRlYyhpbnApOgorICAgICAgICAgICAgZGVmIGlubmVyKGZ1bmMpOgorICAgICAgICAgICAgICAgIHByaW50KGlucCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYworICAgICAgICAgICAgcmV0dXJuIGlubmVyCisKKworICAgICAgICBjbGFzcyBDbHM6CisKKyAgICAgICAgICAgIERBVEEgPSAiZm9vIgorCisgICAgICAgICAgICBAZGVjKFt4IGZvciB4IGluIERBVEFdKQorICAgICAgICAgICAgZGVmIGZ1bihzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobW9kdWxlKQorCisgICAgZGVmIHRlc3RfbGlzdGNvbXBfaW5fYW5jZXN0b3JzKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgbGlzdCBjb21wcmVoZW5zaW9ucyBpbiBiYXNlIGNsYXNzZXMgYXJlIHNjb3BlZCBjb3JyZWN0bHkKKworICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zNDM0CisgICAgICAgICIiIgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBjb2xsZWN0aW9ucworCisKKyAgICAgICAgbCA9IFsiYSIsImIiLCJjIl0KKworCisgICAgICAgIGNsYXNzIEZvbyhjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCJGb28iLFt4KyJfZm9vIiBmb3IgeCBpbiBsXSkpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X3JldHVybl90eXBlX2Fubm90YXRpb24oc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSBjbGFzcyBhdHRyaWJ1dGVzIGluIHNjb3BlIGZvciByZXR1cm4gdHlwZSBhbm5vdGF0aW9ucy4KKworICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8xOTc2CisgICAgICAgICIiIgorICAgICAgICBtb2R1bGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE15T2JqZWN0OgorICAgICAgICAgICAgY2xhc3MgTXlUeXBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiBteV9tZXRob2Qoc2VsZikgLT4gTXlUeXBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhtb2R1bGUpCisKKworY2xhc3MgVGVzdFZhcmlhYmxlc0NoZWNrZXJXaXRoVGVhckRvd24oQ2hlY2tlclRlc3RDYXNlKToKKworICAgIENIRUNLRVJfQ0xBU1MgPSB2YXJpYWJsZXMuVmFyaWFibGVzQ2hlY2tlcgorCisgICAgZGVmIHNldHVwX21ldGhvZChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5zZXR1cF9tZXRob2QoKQorICAgICAgICBzZWxmLl90b19jb25zdW1lX2JhY2t1cCA9IHNlbGYuY2hlY2tlci5fdG9fY29uc3VtZQorICAgICAgICBzZWxmLmNoZWNrZXIuX3RvX2NvbnN1bWUgPSBbXQorCisgICAgZGVmIHRlYXJkb3duX21ldGhvZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VyLl90b19jb25zdW1lID0gc2VsZi5fdG9fY29uc3VtZV9iYWNrdXAKKworICAgIEBzZXRfY29uZmlnKGNhbGxiYWNrcz0oImNhbGxiYWNrXyIsICJfY2FsbGJhY2siKSkKKyAgICBkZWYgdGVzdF9jdXN0b21fY2FsbGJhY2tfc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoZSAtLWNhbGJhY2tzIG9wdGlvbiB3b3Jrcy4iIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBjYWxsYmFja19vbmUoYWJjKToKKyAgICAgICAgICAgICAnJycgc2hvdWxkIG5vdCBlbWl0IHVudXNlZC1hcmd1bWVudC4gJycnCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5sZWF2ZV9mdW5jdGlvbmRlZihub2RlKQorCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgdHdvX2NhbGxiYWNrKGFiYywgZGVmZyk6CisgICAgICAgICAgICAgJycnIHNob3VsZCBub3QgZW1pdCB1bnVzZWQtYXJndW1lbnQuICcnJworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXIubGVhdmVfZnVuY3Rpb25kZWYobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIG5vcm1hbF9mdW5jKGFiYyk6CisgICAgICAgICAgICAgJycnIHNob3VsZCBlbWl0IHVudXNlZC1hcmd1bWVudC4gJycnCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKCJ1bnVzZWQtYXJndW1lbnQiLCBub2RlPW5vZGVbImFiYyJdLCBhcmdzPSJhYmMiKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXIubGVhdmVfZnVuY3Rpb25kZWYobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGNiX2Z1bmMoYWJjKToKKyAgICAgICAgICAgICAnJycgUHJldmlvdXMgY2FsbGJhY2tzIGFyZSBvdmVycmlkZGVuLiAnJycKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoInVudXNlZC1hcmd1bWVudCIsIG5vZGU9bm9kZVsiYWJjIl0sIGFyZ3M9ImFiYyIpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci5sZWF2ZV9mdW5jdGlvbmRlZihub2RlKQorCisgICAgQHNldF9jb25maWcocmVkZWZpbmluZ19idWlsdGluc19tb2R1bGVzPSgib3MiLCkpCisgICAgZGVmIHRlc3RfcmVkZWZpbmVkX2J1aWx0aW5fbW9kbmFtZV9ub3RfaWdub3JlZChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBmdXR1cmUuYnVpbHRpbnMgaW1wb3J0IG9wZW4KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoInJlZGVmaW5lZC1idWlsdGluIiwgbm9kZT1ub2RlLmJvZHlbMF0sIGFyZ3M9Im9wZW4iKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShub2RlKQorCisgICAgQHNldF9jb25maWcocmVkZWZpbmluZ19idWlsdGluc19tb2R1bGVzPSgib3MiLCkpCisgICAgZGVmIHRlc3RfcmVkZWZpbmVkX2J1aWx0aW5faW5fZnVuY3Rpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgdGVzdCgpOgorICAgICAgICAgICAgZnJvbSBvcyBpbXBvcnQgb3BlbgorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X21vZHVsZShub2RlLnJvb3QoKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2FzX3VuZGVyc2NvcmUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLnBhcnNlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBtYXRoIGFzIF8KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYud2Fsayhub2RlKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX2luX2NsYXNzZGVmKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBsYW1iZGEgZG9lc24ndCByYWlzZXMKKyAgICAgICAgIyBVbmRlZmluZWQtbWV0aG9kIGluIGNsYXNzIGRlZgorCisgICAgICAgICMgSXNzdWUgMTgyNAorICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzE4MjQKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgTXlPYmplY3Qob2JqZWN0KToKKyAgICAgICAgICAgIG1ldGhvZDEgPSBsYW1iZGEgZnVuYzogZnVuYygpCisgICAgICAgICAgICBtZXRob2QyID0gbGFtYmRhIGZ1bmN0aW9uOiBmdW5jdGlvbigpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobm9kZSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9sYW1iZGEoc2VsZik6CisgICAgICAgICIiIk1ha2Ugc3VyZSB2YXJpYWJsZXMgZnJvbSBwYXJlbnQgbGFtYmRhcworICAgICAgICBhcmVuJ3Qgbm90ZWQgYXMgdW5kZWZpbmVkCisKKyAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNzYwCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBsYW1iZGEgeDogbGFtYmRhOiB4ICsgMQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi53YWxrKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhpZ25vcmVkX2FyZ3VtZW50X25hbWVzPXJlLmNvbXBpbGUoImFyZyIpKQorICAgIGRlZiB0ZXN0X2lnbm9yZWRfYXJndW1lbnRfbmFtZXNfbm9fbWVzc2FnZShzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIGlzX2lnbm9yZWRfYXJndW1lbnRfbmFtZXMgcHJvcGVybHkgaWdub3JlcworICAgICAgICBmdW5jdGlvbiBhcmd1bWVudHMiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZvb2J5KGFyZyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobm9kZSkKKworICAgIEBzZXRfY29uZmlnKGlnbm9yZWRfYXJndW1lbnRfbmFtZXM9cmUuY29tcGlsZSgiYXJnc3xrd2FyZ3MiKSkKKyAgICBkZWYgdGVzdF9pZ25vcmVkX2FyZ3VtZW50X25hbWVzX3N0YXJyZWRfYXJncyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQucGFyc2UoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZvb2J5KCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLndhbGsobm9kZSkKKworCitjbGFzcyBUZXN0TWlzc2luZ1N1Ym1vZHVsZShDaGVja2VyVGVzdENhc2UpOgorICAgIENIRUNLRVJfQ0xBU1MgPSB2YXJpYWJsZXMuVmFyaWFibGVzQ2hlY2tlcgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB0ZXN0X3BhY2thZ2VfYWxsKCk6CisKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIFJFR1JfREFUQV9ESVIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbnRlci5jaGVjayhvcy5wYXRoLmpvaW4oUkVHUl9EQVRBX0RJUiwgInBhY2thZ2VfYWxsIikpCisgICAgICAgICAgICBnb3QgPSBsaW50ZXIucmVwb3J0ZXIuZmluYWxpemUoKS5zdHJpcCgpCisgICAgICAgICAgICBhc3NlcnQgZ290ID09ICJFOiAgMzogVW5kZWZpbmVkIHZhcmlhYmxlIG5hbWUgJ21pc3NpbmcnIGluIF9fYWxsX18iCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aC5wb3AoMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2NvbmZ0ZXN0LnB5IGIvdGVzdHMvY29uZnRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyNTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NvbmZ0ZXN0LnB5CkBAIC0wLDAgKzEsNTkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1vdXRlci1uYW1lCisjIHB5bGludDogZGlzYWJsZT1uby1uYW1lLWluLW1vZHVsZQoraW1wb3J0IG9zCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IFB5TGludGVyCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IE1pbmltYWxUZXN0UmVwb3J0ZXIKKworCitAcHl0ZXN0LmZpeHR1cmUoKQorZGVmIHRlc3RzX2RpcmVjdG9yeSgpOgorICAgIHJldHVybiBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBsaW50ZXIoY2hlY2tlciwgcmVnaXN0ZXIsIGVuYWJsZSwgZGlzYWJsZSwgcmVwb3J0ZXIpOgorICAgIF9saW50ZXIgPSBQeUxpbnRlcigpCisgICAgX2xpbnRlci5zZXRfcmVwb3J0ZXIocmVwb3J0ZXIoKSkKKyAgICBjaGVja2Vycy5pbml0aWFsaXplKF9saW50ZXIpCisgICAgaWYgcmVnaXN0ZXI6CisgICAgICAgIHJlZ2lzdGVyKF9saW50ZXIpCisgICAgaWYgY2hlY2tlcjoKKyAgICAgICAgX2xpbnRlci5yZWdpc3Rlcl9jaGVja2VyKGNoZWNrZXIoX2xpbnRlcikpCisgICAgaWYgZGlzYWJsZToKKyAgICAgICAgZm9yIG1zZyBpbiBkaXNhYmxlOgorICAgICAgICAgICAgX2xpbnRlci5kaXNhYmxlKG1zZykKKyAgICBpZiBlbmFibGU6CisgICAgICAgIGZvciBtc2cgaW4gZW5hYmxlOgorICAgICAgICAgICAgX2xpbnRlci5lbmFibGUobXNnKQorICAgIG9zLmVudmlyb24ucG9wKCJQWUxJTlRSQyIsIE5vbmUpCisgICAgcmV0dXJuIF9saW50ZXIKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgY2hlY2tlcigpOgorICAgIHJldHVybiBOb25lCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIHJlZ2lzdGVyKCk6CisgICAgcmV0dXJuIE5vbmUKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgZW5hYmxlKCk6CisgICAgcmV0dXJuIE5vbmUKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgZGlzYWJsZSgpOgorICAgIHJldHVybiBOb25lCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIHJlcG9ydGVyKCk6CisgICAgcmV0dXJuIE1pbmltYWxUZXN0UmVwb3J0ZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvX19pbml0X18ucHkgYi90ZXN0cy9kYXRhL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9kYXRhL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2FzY3JpcHQgYi90ZXN0cy9kYXRhL2FzY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjQwMWViYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvYXNjcmlwdApAQCAtMCwwICsxLDIgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisiIiJ0dHR0dHR0dHR0dHR0dHR0dHR0dG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbyBsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vbm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5uZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnIiIiCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NsYXNzZXNfTm9fTmFtZS5kb3QgYi90ZXN0cy9kYXRhL2NsYXNzZXNfTm9fTmFtZS5kb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2N2I0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2RhdGEvY2xhc3Nlc19Ob19OYW1lLmRvdApAQCAtMCwwICsxLDEyIEBACitkaWdyYXBoICJjbGFzc2VzX05vX05hbWUiIHsKK2NoYXJzZXQ9InV0Zi04IgorcmFua2Rpcj1CVAorIjAiIFtsYWJlbD0ie0FuY2VzdG9yfGF0dHIgOiBzdHJcbGNsc19tZW1iZXJcbHxnZXRfdmFsdWUoKVxsc2V0X3ZhbHVlKHZhbHVlKVxsfSIsIHNoYXBlPSJyZWNvcmQiXTsKKyIxIiBbbGFiZWw9IntEb05vdGhpbmd8XGx8fSIsIHNoYXBlPSJyZWNvcmQiXTsKKyIyIiBbbGFiZWw9IntJbnRlcmZhY2V8XGx8Z2V0X3ZhbHVlKClcbHNldF92YWx1ZSh2YWx1ZSlcbH0iLCBzaGFwZT0icmVjb3JkIl07CisiMyIgW2xhYmVsPSJ7U3BlY2lhbGl6YXRpb258VFlQRSA6IHN0clxscmVsYXRpb25cbHRvcCA6IHN0clxsfH0iLCBzaGFwZT0icmVjb3JkIl07CisiMyIgLT4gIjAiIFthcnJvd2hlYWQ9ImVtcHR5IiwgYXJyb3d0YWlsPSJub25lIl07CisiMCIgLT4gIjIiIFthcnJvd2hlYWQ9ImVtcHR5IiwgYXJyb3d0YWlsPSJub2RlIiwgc3R5bGU9ImRhc2hlZCJdOworIjEiIC0+ICIwIiBbYXJyb3doZWFkPSJkaWFtb25kIiwgYXJyb3d0YWlsPSJub25lIiwgZm9udGNvbG9yPSJncmVlbiIsIGxhYmVsPSJjbHNfbWVtYmVyIiwgc3R5bGU9InNvbGlkIl07CisiMSIgLT4gIjMiIFthcnJvd2hlYWQ9ImRpYW1vbmQiLCBhcnJvd3RhaWw9Im5vbmUiLCBmb250Y29sb3I9ImdyZWVuIiwgbGFiZWw9InJlbGF0aW9uIiwgc3R5bGU9InNvbGlkIl07Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL2NsaWVudG1vZHVsZV90ZXN0LnB5IGIvdGVzdHMvZGF0YS9jbGllbnRtb2R1bGVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGRiMmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9jbGllbnRtb2R1bGVfdGVzdC5weQpAQCAtMCwwICsxLDI5IEBACisiIiIgZG9jc3RyaW5nIGZvciBmaWxlIGNsaWVudG1vZHVsZS5weSAiIiIKK2Zyb20gZGF0YS5zdXBwbGllcm1vZHVsZV90ZXN0IGltcG9ydCBJbnRlcmZhY2UsIERvTm90aGluZworCitjbGFzcyBBbmNlc3RvcjoKKyAgICAiIiIgQW5jZXN0b3IgbWV0aG9kICIiIgorICAgIF9faW1wbGVtZW50c19fID0gKEludGVyZmFjZSwpCisgICAgY2xzX21lbWJlciA9IERvTm90aGluZygpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBsb2NhbF92YXJpYWJsZSA9IDAKKyAgICAgICAgc2VsZi5hdHRyID0gJ3RoaXMgbWV0aG9kIHNob3VsZG5cJ3QgaGF2ZSBhIGRvY3N0cmluZycKKyAgICAgICAgc2VsZi5fX3ZhbHVlID0gdmFsdWUKKworICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6CisgICAgICAgICIiIiBuaWNlIGRvY3N0cmluZyA7LSkgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdmFsdWUKKworICAgIGRlZiBzZXRfdmFsdWUoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9fdmFsdWUgPSB2YWx1ZQorICAgICAgICByZXR1cm4gJ3RoaXMgbWV0aG9kIHNob3VsZG5cJ3QgaGF2ZSBhIGRvY3N0cmluZycKKworY2xhc3MgU3BlY2lhbGl6YXRpb24oQW5jZXN0b3IpOgorICAgIFRZUEUgPSAnZmluYWwgY2xhc3MnCisgICAgdG9wID0gJ2NsYXNzJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlLCBfaWQpOgorICAgICAgICBBbmNlc3Rvci5fX2luaXRfXyhzZWxmLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5faWQgPSBfaWQKKyAgICAgICAgc2VsZi5yZWxhdGlvbiA9IERvTm90aGluZygpCmRpZmYgLS1naXQgYS90ZXN0cy9kYXRhL3BhY2thZ2VzX05vX05hbWUuZG90IGIvdGVzdHMvZGF0YS9wYWNrYWdlc19Ob19OYW1lLmRvdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VlYjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9wYWNrYWdlc19Ob19OYW1lLmRvdApAQCAtMCwwICsxLDggQEAKK2RpZ3JhcGggInBhY2thZ2VzX05vX05hbWUiIHsKK2NoYXJzZXQ9InV0Zi04IgorcmFua2Rpcj1CVAorIjAiIFtsYWJlbD0iZGF0YSIsIHNoYXBlPSJib3giXTsKKyIxIiBbbGFiZWw9ImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QiLCBzaGFwZT0iYm94Il07CisiMiIgW2xhYmVsPSJkYXRhLnN1cHBsaWVybW9kdWxlX3Rlc3QiLCBzaGFwZT0iYm94Il07CisiMSIgLT4gIjIiIFthcnJvd2hlYWQ9Im9wZW4iLCBhcnJvd3RhaWw9Im5vbmUiXTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2RhdGEvc3VwcGxpZXJtb2R1bGVfdGVzdC5weSBiL3Rlc3RzL2RhdGEvc3VwcGxpZXJtb2R1bGVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRjOWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZGF0YS9zdXBwbGllcm1vZHVsZV90ZXN0LnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiIiBmaWxlIHN1cHBsaWVybW9kdWxlLnB5ICIiIgorCitjbGFzcyBJbnRlcmZhY2U6CisgICAgZGVmIGdldF92YWx1ZShzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHNldF92YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworY2xhc3MgRG9Ob3RoaW5nOiBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9leHRlbnNpb25zL19faW5pdF9fLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL2JhZF9idWlsdGluLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL2JhZF9idWlsdGluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkM2U1YzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvYmFkX2J1aWx0aW4ucHkKQEAgLTAsMCArMSw0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitURVNUID0gbWFwKHN0ciwgKDEsIDIsIDMpKSAjIFtiYWQtYnVpbHRpbl0KK1RFU1QxID0gZmlsdGVyKHN0ciwgKDEsIDIsIDMpKSAjIFtiYWQtYnVpbHRpbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9icm9hZF90cnlfY2xhdXNlLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL2Jyb2FkX3RyeV9jbGF1c2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0OTAyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9icm9hZF90cnlfY2xhdXNlLnB5CkBAIC0wLDAgKzEsNDkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBpbnZhbGlkLW5hbWUKKworTVlfRElDVElPTkFSWSA9IHsia2V5X29uZSI6IDEsICJrZXlfdHdvIjogMiwgImtleV90aHJlZSI6IDN9CisKK3RyeTogICMgW21heC10cnktc3RhdGVtZW50c10KKyAgICB2YWx1ZSA9IE1ZX0RJQ1RJT05BUllbImtleV9vbmUiXQorICAgIHZhbHVlICs9IDEKKyAgICBwcmludCgiVGhpcyBvbmUgaGFzIGFuIGV4Y2VwdCBjbGF1c2Ugb25seS4iKQorZXhjZXB0IEtleUVycm9yOgorICAgIHBhc3MKKwordHJ5OiAgIyBbbWF4LXRyeS1zdGF0ZW1lbnRzXQorICAgIHZhbHVlID0gTVlfRElDVElPTkFSWVsia2V5X29uZSJdCisgICAgdmFsdWUgKz0gMQorICAgIHByaW50KCJUaGlzIG9uZSBoYXMgYW4gZmluYWxseSBjbGF1c2Ugb25seS4iKQorZmluYWxseToKKyAgICBwYXNzCisKK3RyeTogICMgW21heC10cnktc3RhdGVtZW50c10KKyAgICB2YWx1ZSA9IE1ZX0RJQ1RJT05BUllbImtleV9vbmUiXQorICAgIHZhbHVlICs9IDEKKyAgICBwcmludCgiVGhpcyBvbmUgaGFzIGFuIGV4Y2VwdCBjbGF1c2UuLi4iKQorICAgIHByaW50KCJhbmQgYWxzbyBhIGZpbmFsbHkgY2xhdXNlISIpCitleGNlcHQgS2V5RXJyb3I6CisgICAgcGFzcworZmluYWxseToKKyAgICBwYXNzCisKK3RyeTogICMgW21heC10cnktc3RhdGVtZW50c10KKyAgICBpZiAia2V5X29uZSIgaW4gTVlfRElDVElPTkFSWToKKyAgICAgICAgZW50ZXJlZF9pZl9ib2R5ID0gVHJ1ZQorICAgICAgICBwcmludCgiVGhpcyB2ZXJpZmllcyB0aGF0IGNvbnRlbnQgaW5zaWRlIG9mIGFuIGlmIHN0YXRlbWVudCBpcyBjb3VudGVkIHRvby4iKQorICAgIGVsc2U6CisgICAgICAgIGVudGVyZWRfaWZfYm9keSA9IEZhbHNlCisKKyAgICB3aGlsZSBGYWxzZToKKyAgICAgICAgcHJpbnQoIlRoaXMgdmVyaWZpZXMgdGhhdCBjb250ZW50IGluc2lkZSBvZiBhIHdoaWxlIGxvb3AgaXMgY291bnRlZCB0b28uIikKKworICAgIGZvciBpdGVtIGluIFtdOgorICAgICAgICBwcmludCgiVGhpcyB2ZXJpZmllcyB0aGF0IGNvbnRlbnQgaW5zaWRlIG9mIGEgZm9yIGxvb3AgaXMgY291bnRlZCB0b28uIikKKworCitleGNlcHQgS2V5RXJyb3I6CisgICAgcGFzcworCit0cnk6CisgICAgdmFsdWUgPSBNWV9ESUNUSU9OQVJZWyJrZXlfb25lIl0KK2V4Y2VwdCBLZXlFcnJvcjoKKyAgICB2YWx1ZSA9IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9jb21wYXJlX3RvX3plcm8ucHkgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvY29tcGFyZV90b196ZXJvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZTZiYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvY29tcGFyZV90b196ZXJvLnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgcHlsaW50OiBkaXNhYmxlPWxpdGVyYWwtY29tcGFyaXNvbixtaXNzaW5nLWRvY3N0cmluZyxtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudAorCitYID0gMTIzCitZID0gbGVuKCd0ZXN0JykKKworaWYgWCBpcyAwOiAgIyBbY29tcGFyZS10by16ZXJvXQorICAgIHBhc3MKKworaWYgWSBpcyBub3QgMDogICMgW2NvbXBhcmUtdG8temVyb10KKyAgICBwYXNzCisKK2lmIFggPT0gMDogICMgW2NvbXBhcmUtdG8temVyb10KKyAgICBwYXNzCisKK2lmIFkgIT0gMDogICMgW2NvbXBhcmUtdG8temVyb10KKyAgICBwYXNzCisKK2lmIFggPiAwOgorICAgIHBhc3MKKworaWYgWCA8IDA6CisgICAgcGFzcworCitpZiAwIDwgWDoKKyAgICBwYXNzCisKK2lmIDAgPiBYOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9kb2NzdHJpbmcucHkgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvZG9jc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzRjNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvZG9jc3RyaW5nLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyIiIkNoZWNrcyBvZiBEb3NjdHJpbmdzICdkb2NzdHJpbmctZmlyc3QtbGluZS1lbXB0eScgJ2JhZC1kb2NzdHJpbmctcXVvdGVzJyIiIgorCisKK2RlZiBjaGVja19tZXNzYWdlcygqbWVzc2FnZXMpOgorICAgICIiIgorICAgIGRvY3N0cmluZyIiIgorICAgIHJldHVybiBtZXNzYWdlcworCitkZWYgZnVuY3Rpb24yKCk6CisgICAgIiIiVGVzdCBPayIiIgorCitjbGFzcyBGRkZGOgorICAgICIiIgorICAgIFRlc3QgRG9jc3RyaW5nIEZpcnN0IExpbmUgRW1wdHkKKyAgICAiIiIKKworICAgIGRlZiBtZXRob2QxKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgVGVzdCBUcmlwbGUgU2luZ2xlIFF1b3RlcyBkb2NzdHJpbmcKKyAgICAgICAgJycnCisKKyAgICBkZWYgbWV0aG9kMihzZWxmKToKKyAgICAgICAgImJhZCBkb2NzdHJpbmcgMSIKKworICAgIGRlZiBtZXRob2QzKHNlbGYpOgorICAgICAgICAnYmFkIGRvY3N0cmluZyAyJworCisgICAgZGVmIG1ldGhvZDQoc2VsZik6CisgICAgICAgICcgIiIiYmFkIGRvY3N0cmluZyAzICcKKworICAgIEBjaGVja19tZXNzYWdlcygnYmFkLW9wZW4tbW9kZScsICdyZWR1bmRhbnQtdW5pdHRlc3QtYXNzZXJ0JywKKyAgICAgICAgICAgICAgICAgICAgJ2RlcHJlY2F0ZWQtbW9kdWxlJykKKyAgICBkZWYgbWV0aG9kNShzZWxmKToKKyAgICAgICAgIiIiVGVzdCBPSyAxIHdpdGggZGVjb3JhdG9ycyIiIgorCisgICAgZGVmIG1ldGhvZDYoc2VsZik6CisgICAgICAgIHIiIiJUZXN0IE9LIDIgd2l0aCByYXcgc3RyaW5nIiIiCisKKyAgICBkZWYgbWV0aG9kNyhzZWxmKToKKyAgICAgICAgdSIiIlRlc3QgT0sgMyB3aXRoIHVuaWNvZGUgc3RyaW5nIiIiCmRpZmYgLS1naXQgYS90ZXN0cy9leHRlbnNpb25zL2RhdGEvZWxpZi5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9lbGlmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTc5YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvZWxpZi5weQpAQCAtMCwwICsxLDI2IEBACisiIiJDaGVja3MgdXNlIG9mICJlbHNlIGlmIiB0cmlnZ2VycyBhIHJlZmFjdG9yIG1lc3NhZ2UiIiIKKworZGVmIG15X2Z1bmN0aW9uKCk6CisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgbXlpbnQgPSAyCisgICAgaWYgbXlpbnQgPiA1OgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgbXlpbnQgPD0gNToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG15aW50ID0gMworICAgICAgICAgICAgaWYgbXlpbnQgPiAyOgorICAgICAgICAgICAgICAgIGlmIG15aW50ID4gMzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgbXlpbnQgPT0gMzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgbXlpbnQgPCAzOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbXlpbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG15aW50OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbXlpbnQgPSA0CmRpZmYgLS1naXQgYS90ZXN0cy9leHRlbnNpb25zL2RhdGEvZW1wdHlfY29tbWVudC5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9lbXB0eV9jb21tZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMThkZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvZW1wdHlfY29tbWVudC5weQpAQCAtMCwwICsxLDkgQEAKKyIiImVtcHR5LWNvbW1lbnQgdGVzdC1jYXNlIiIiCitBID0gNSAgIworIworQSA9ICcjJyArICcxJworcHJpbnQoQSkgICMKK3ByaW50KCJBPSIsIEEpICAjIHNob3VsZCBub3QgYmUgYW4gZXJyb3IjCitBID0gIiNwZVwwYWNlI2xvdmUjIiAgIworQSA9ICJwZWFjZSNsb3ZlIiAgIyBcMCBwZWFjZScjJycnJyBsb3ZlI3BlYWNlJycnLScjbG92ZSctInBlYWNlI2xvdmUiIworIyMjIyMjIwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL2VtcHR5X3N0cmluZ19jb21wYXJpc29uLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL2VtcHR5X3N0cmluZ19jb21wYXJpc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGNmOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvZW1wdHlfc3RyaW5nX2NvbXBhcmlzb24ucHkKQEAgLTAsMCArMSwxNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bGl0ZXJhbC1jb21wYXJpc29uLG1pc3NpbmctZG9jc3RyaW5nCisKK1ggPSAnJworWSA9ICd0ZXN0JworCitpZiBYIGlzICcnOiAgIyBbY29tcGFyZS10by1lbXB0eS1zdHJpbmddCisgICAgcGFzcworCitpZiBZIGlzIG5vdCAiIjogICMgW2NvbXBhcmUtdG8tZW1wdHktc3RyaW5nXQorICAgIHBhc3MKKworaWYgWCA9PSAiIjogICMgW2NvbXBhcmUtdG8tZW1wdHktc3RyaW5nXQorICAgIHBhc3MKKworaWYgWSAhPSAnJzogICMgW2NvbXBhcmUtdG8tZW1wdHktc3RyaW5nXQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9tY2NhYmUucHkgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvbWNjYWJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYmRiNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvbWNjYWJlLnB5CkBAIC0wLDAgKzEsMjA1IEBACisiIiJDaGVja3MgdXNlIG9mICJ0b28tY29tcGxleCIgY2hlY2siIiIKKworCitkZWYgZjEoKToKKyAgICAiIiJNY0NhYmUgcmF0aW5nOiAxIiIiCisgICAgcGFzcworCisKK2RlZiBmMihuKToKKyAgICAiIiJNY0NhYmUgcmF0aW5nOiAxIiIiCisgICAgayA9IG4gKyA0CisgICAgcyA9IGsgKyBuCisgICAgcmV0dXJuIHMKKworCitkZWYgZjMobik6CisgICAgIiIiTWNDYWJlIHJhdGluZzogMyIiIgorICAgIGlmIG4gPiAzOgorICAgICAgICByZXR1cm4gImJpZ2dlciB0aGFuIHRocmVlIgorICAgIGVsaWYgbiA+IDQ6CisgICAgICAgIHJldHVybiAiaXMgbmV2ZXIgZXhlY3V0ZWQiCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICJzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhyZWUiCisKKworZGVmIGY0KCk6CisgICAgIiIiTWNDYWJlIHJhdGluZzogMiIiIgorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgcHJpbnQoaSkKKworCitkZWYgZjUobXlsaXN0KToKKyAgICAiIiJNY0NhYmUgcmF0aW5nOiAyIiIiCisgICAgZm9yIGkgaW4gbXlsaXN0OgorICAgICAgICBwcmludChpKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KE5vbmUpCisKKworZGVmIGY2KG4pOgorICAgICIiIk1jQ2FiZSByYXRpbmc6IDIiIiIKKyAgICBpZiBuID4gNDoKKyAgICAgICAgcmV0dXJuIGYobiAtIDEpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG4KKworCitkZWYgZjcoKToKKyAgICAiIiJNY0NhYmUgcmF0aW5nOiAzIiIiCisgICAgZGVmIGIoKToKKyAgICAgICAgIiIiTWNDYWJlIHJhdGluZzogMiIiIgorICAgICAgICBkZWYgYygpOgorICAgICAgICAgICAgIiIiTWNDYWJlIHJhdGluZzogMSIiIgorICAgICAgICAgICAgcGFzcworICAgICAgICBjKCkKKyAgICBiKCkKKworCitkZWYgZjgoKToKKyAgICAiIiJNY0NhYmUgcmF0aW5nOiA0IiIiCisgICAgdHJ5OgorICAgICAgICBwcmludCgxKQorICAgIGV4Y2VwdCBUeXBlQToKKyAgICAgICAgcHJpbnQoMikKKyAgICBleGNlcHQgVHlwZUI6CisgICAgICAgIHByaW50KDMpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoNCkKKworCitkZWYgZjkoKToKKyAgICAiIiJNY0NhYmUgcmF0aW5nOiA5IiIiCisgICAgbXlpbnQgPSAyCisgICAgaWYgbXlpbnQgPiA1OgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgbXlpbnQgPD0gNToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG15aW50ID0gMworICAgICAgICAgICAgaWYgbXlpbnQgPiAyOgorICAgICAgICAgICAgICAgIGlmIG15aW50ID4gMzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgbXlpbnQgPT0gMzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsaWYgbXlpbnQgPCAzOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbXlpbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG15aW50OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbXlpbnQgPSA0CisKKworZGVmIGYxMCgpOgorICAgICIiIk1jQ2FiZSByYXRpbmc6IDExIiIiCisgICAgbXlpbnQgPSAyCisgICAgaWYgbXlpbnQgPT0gNToKKyAgICAgICAgcmV0dXJuIG15aW50CisgICAgZWxpZiBteWludCA9PSA2OgorICAgICAgICByZXR1cm4gbXlpbnQKKyAgICBlbGlmIG15aW50ID09IDc6CisgICAgICAgIHJldHVybiBteWludAorICAgIGVsaWYgbXlpbnQgPT0gODoKKyAgICAgICAgcmV0dXJuIG15aW50CisgICAgZWxpZiBteWludCA9PSA5OgorICAgICAgICByZXR1cm4gbXlpbnQKKyAgICBlbGlmIG15aW50ID09IDEwOgorICAgICAgICBpZiBteWludCA9PSA4OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbGlmIG15aW50ID09IDg6CisgICAgICAgICAgICB3aXRoIG15aW50OgorICAgICAgICAgICAgICAgIHJldHVybiA4CisgICAgZWxzZToKKyAgICAgICAgaWYgbXlpbnQgPT0gMjoKKyAgICAgICAgICAgIHJldHVybiBteWludAorICAgICAgICByZXR1cm4gbXlpbnQKKyAgICByZXR1cm4gbXlpbnQKKworCitjbGFzcyBNeUNsYXNzMShvYmplY3QpOgorICAgICIiIkNsYXNzIG9mIGV4YW1wbGUgdG8gdGVzdCBtY2NhYmUiIiIKKyAgICBfbmFtZSA9ICdNeUNsYXNzJyAgIyBUbyBmb3JjZSBhIHRhaWwubm9kZT1Ob25lCisKKyAgICBkZWYgbWV0aG9kMSgpOgorICAgICAgICAiIiJNY0NhYmUgcmF0aW5nOiAxIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBtZXRob2QyKHNlbGYsIHBhcmFtMSk6CisgICAgICAgICIiIk1jQ2FiZSByYXRpbmc6IDE4IiIiCisgICAgICAgIGlmIG5vdCBwYXJhbTE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHBhc3MKKyAgICAgICAgaWYgcGFyYW0xOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHBhc3MKKworICAgICAgICBpZiBwYXJhbTE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHBhcmFtMToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgcGFyYW0xOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBwYXJhbTE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHBhcmFtMToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgcGFyYW0xOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBwYXJhbTE6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGNvdW50IGluIHJhbmdlKDYpOgorICAgICAgICAgICAgd2l0aCBvcGVuKCdteWZpbGUnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBwYXNzCisgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbm90IHBhcmFtMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIHBhcmFtMToKKyAgICAgICAgICAgICAgICByYWlzZSBCYXNlRXhjZXB0aW9uKCdFcnJvcicpCisgICAgICAgICAgICB3aXRoIG9wZW4oJ215ZmlsZTInKSBhcyBmcDI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgcGFyYW0xIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBjb3VudDIgaW4gcmFuZ2UoOCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24oJ0Vycm9yMicpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBwYXJhbTEKKworCitmb3IgY291bnQgaW4gcmFuZ2UoMTApOgorICAgIGlmIGNvdW50ID09IDE6CisgICAgICAgIGV4aXQoMCkKKyAgICBlbGlmIGNvdW50ID09IDI6CisgICAgICAgIGV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICBleGl0KDIpCisKKworZGVmIG1ldGhvZDMoc2VsZik6CisgICAgdHJ5OgorICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gVHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL292ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvb3ZlcmxhcHBpbmdfZXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWU1MGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy9kYXRhL292ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw0NSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworY2xhc3MgU29tZUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgU3ViY2xhc3NFeGNlcHRpb24oU29tZUV4Y2VwdGlvbik6CisgICAgcGFzcworCitBbGlhc0V4Y2VwdGlvbiA9IFNvbWVFeGNlcHRpb24KKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCAoU29tZUV4Y2VwdGlvbiwgU29tZUV4Y2VwdGlvbik6ICMgW292ZXJsYXBwaW5nLWV4Y2VwdF0KKyAgICBwYXNzCisKK3RyeToKKyAgICBwYXNzCitleGNlcHQgKFNvbWVFeGNlcHRpb24sIFN1YmNsYXNzRXhjZXB0aW9uKTogIyBbb3ZlcmxhcHBpbmctZXhjZXB0XQorICAgIHBhc3MKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCAoU29tZUV4Y2VwdGlvbiwgQWxpYXNFeGNlcHRpb24pOiAjIFtvdmVybGFwcGluZy1leGNlcHRdCisgICAgcGFzcworCit0cnk6CisgICAgcGFzcworZXhjZXB0IChBbGlhc0V4Y2VwdGlvbiwgU3ViY2xhc3NFeGNlcHRpb24pOiAjIFtvdmVybGFwcGluZy1leGNlcHRdCisgICAgcGFzcworCit0cnk6CisgICAgcGFzcworIyArMTpbb3ZlcmxhcHBpbmctZXhjZXB0LCBvdmVybGFwcGluZy1leGNlcHQsIG92ZXJsYXBwaW5nLWV4Y2VwdF0KK2V4Y2VwdCAoU29tZUV4Y2VwdGlvbiwgQWxpYXNFeGNlcHRpb24sIFN1YmNsYXNzRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK3RyeToKKyAgICBwYXNzCitleGNlcHQgKEFyaXRobWV0aWNFcnJvciwgRmxvYXRpbmdQb2ludEVycm9yKTogIyBbb3ZlcmxhcHBpbmctZXhjZXB0XQorICAgIHBhc3MKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCAoVmFsdWVFcnJvciwgVW5pY29kZURlY29kZUVycm9yKTogIyBbb3ZlcmxhcHBpbmctZXhjZXB0XQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9vdmVybGFwcGluZ19leGNlcHRpb25zX3B5MzMucHkgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvb3ZlcmxhcHBpbmdfZXhjZXB0aW9uc19weTMzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDVjMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvb3ZlcmxhcHBpbmdfZXhjZXB0aW9uc19weTMzLnB5CkBAIC0wLDAgKzEsMTggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKK2ltcG9ydCBzb2NrZXQKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6ICMgW292ZXJsYXBwaW5nLWV4Y2VwdF0KKyAgICBwYXNzCisKK3RyeToKKyAgICBwYXNzCitleGNlcHQgKHNvY2tldC5lcnJvciwgT1NFcnJvcik6ICMgW292ZXJsYXBwaW5nLWV4Y2VwdF0KKyAgICBwYXNzCisKK3RyeToKKyAgICBwYXNzCitleGNlcHQgKENvbm5lY3Rpb25FcnJvciwgc29ja2V0LmVycm9yKTogIyBbb3ZlcmxhcHBpbmctZXhjZXB0XQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvZGF0YS9yZWRlZmluZWQucHkgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvcmVkZWZpbmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjljNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL2RhdGEvcmVkZWZpbmVkLnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIkNoZWNrcyB2YXJpYWJsZSB0eXBlcyBhcmVuJ3QgcmVkZWZpbmVkIHdpdGhpbiBhIG1ldGhvZCBvciBhIGZ1bmN0aW9uIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLXZhcmlhYmxlLGludmFsaWQtbmFtZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworX09LID0gVHJ1ZQorCitjbGFzcyBNeUNsYXNzKG9iamVjdCk6CisKKyAgICBjbGFzcyBLbGFzcyhvYmplY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICBzZWxmLnZhcjIgPSAndmFyJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhciA9IFRydWUKKyAgICAgICAgc2VsZi52YXIxID0gMgorICAgICAgICBzZWxmLnZhcjIgPSAxLgorICAgICAgICBzZWxmLnZhcjEgPSAyLiAgIyBbcmVkZWZpbmVkLXZhcmlhYmxlLXR5cGVdCisgICAgICAgIHNlbGYuYV9zdHIgPSAiaGVsbG8iCisgICAgICAgIGFfc3RyID0gRmFsc2UKKyAgICAgICAgKGFfc3RyLCBiX3N0cikgPSAoMSwgMikgICMgbm8gc3VwcG9ydCBmb3IgaW5mZXJlbmNlIG9uIHR1cGxlIGFzc2lnbm1lbnQKKyAgICAgICAgYV9zdHIgPSAyLjAgaWYgc2VsZi52YXIgZWxzZSAxLjAKKworICAgIGRlZiBfZ2V0dGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hX3N0cgorICAgIGRlZiBfc2V0dGVyKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYuYV9zdHIgPSB2YWwKKyAgICB2YXIyID0gcHJvcGVydHkoX2dldHRlciwgX3NldHRlcikKKworICAgIGRlZiBzb21lX21ldGhvZChzZWxmKToKKyAgICAgICAgZGVmIGZ1bmMoKToKKyAgICAgICAgICAgIHZhciA9IDEKKyAgICAgICAgICAgIHRlc3QgPSAnYmFyJworICAgICAgICAgICAgdmFyID0gJ2JheicgICMgW3JlZGVmaW5lZC12YXJpYWJsZS10eXBlXQorICAgICAgICBzZWxmLnZhciA9IDEgICMgdGhlIHJ1bGUgY2hlY2tzIGZvciByZWRlZmluaXRpb25zIGluIHRoZSBzY29wZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZAorICAgICAgICB0ZXN0ID0gJ2ZvbycKKyAgICAgICAgbXlpbnQgPSAyCisgICAgICAgIG15aW50ID0gRmFsc2UgICMgW3JlZGVmaW5lZC12YXJpYWJsZS10eXBlXQorCitfT0sgPSAiVGhpcyBpcyBPSyIgICMgW3JlZGVmaW5lZC12YXJpYWJsZS10eXBlXQorCitpZiBfT0s6CisgICAgU09NRV9GTE9BVCA9IDEuCisKK2RlZiBkdW1teV9mdW5jdGlvbigpOgorICAgIHJldHVybiAyCisKK2RlZiBvdGhlcl9mdW5jdGlvbigpOgorICAgIGluc3RhbmNlID0gTXlDbGFzcygpCisgICAgaW5zdGFuY2UgPSBUcnVlICAjIFtyZWRlZmluZWQtdmFyaWFibGUtdHlwZV0KKworU09NRV9GTE9BVCA9IGR1bW15X2Z1bmN0aW9uKCkgICMgW3JlZGVmaW5lZC12YXJpYWJsZS10eXBlXQorCitBX0dMT0IgPSBOb25lCitBX0dMT0IgPSBbMSwgMiwgM10KKworZGVmIGZ1bmMyKHgpOgorICAgIGlmIHg6CisgICAgICAgIHZhciA9ICdmb28nCisgICAgZWxzZToKKyAgICAgICAgdmFyID0gVHJ1ZQorCisgICAgaWYgeDoKKyAgICAgICAgdmFyMiA9ICdmb28nCisgICAgZWxpZiBub3QgeDoKKyAgICAgICAgdmFyMiA9IDIKKyAgICBlbHNlOgorICAgICAgICBwYXNzCisKKyAgICBpZiB4OgorICAgICAgICB2YXIzID0gJ2ZvbycKKyAgICAgICAgdmFyMyA9IDIgICMgW3JlZGVmaW5lZC12YXJpYWJsZS10eXBlXQorICAgIGVsc2U6CisgICAgICAgIHBhc3MKKworICAgIHZhciA9IDIgICMgW3JlZGVmaW5lZC12YXJpYWJsZS10eXBlXQorCisgICAgaWYgeDoKKyAgICAgICAgcGFzcworICAgIGVsaWYgbm90IHg6CisgICAgICAgIHZhcjQgPSBUcnVlCisgICAgZWxpZiBfT0s6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICB2YXI0ID0gMi4KKyAgICAgICAgdmFyNCA9ICdiYXonICAjIFtyZWRlZmluZWQtdmFyaWFibGUtdHlwZV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9iYWRfYnVpbHRpbi5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9iYWRfYnVpbHRpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdkZDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2JhZF9idWlsdGluLnB5CkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdHMgZm9yIHRoZSBweWxpbnQgY2hlY2tlciBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5iYWRfYnVpbHRpbgorIiIiCitmcm9tIG9zIGltcG9ydCBwYXRoIGFzIG9zcAorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmV4dGVuc2lvbnMuYmFkX2J1aWx0aW4gaW1wb3J0IEJhZEJ1aWx0aW5DaGVja2VyCitmcm9tIHB5bGludC5saW50IGltcG9ydCBmaXhfaW1wb3J0X3BhdGgKKworRVhQRUNURUQgPSBbCisgICAgIlVzZWQgYnVpbHRpbiBmdW5jdGlvbiAnbWFwJy4gVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb24gY2FuIGJlIGNsZWFyZXIuIiwKKyAgICAiVXNlZCBidWlsdGluIGZ1bmN0aW9uICdmaWx0ZXInLiBVc2luZyBhIGxpc3QgY29tcHJlaGVuc2lvbiBjYW4gYmUgY2xlYXJlci4iLAorXQorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiBjaGVja2VyKCk6CisgICAgcmV0dXJuIEJhZEJ1aWx0aW5DaGVja2VyCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGRpc2FibGUoKToKKyAgICByZXR1cm4gWyJJIl0KKworCitkZWYgdGVzdF90eXBlc19yZWRlZmluZWQobGludGVyKToKKyAgICBlbGlmX3Rlc3QgPSBvc3Auam9pbihvc3AuZGlybmFtZShvc3AuYWJzcGF0aChfX2ZpbGVfXykpLCAiZGF0YSIsICJiYWRfYnVpbHRpbi5weSIpCisgICAgd2l0aCBmaXhfaW1wb3J0X3BhdGgoW2VsaWZfdGVzdF0pOgorICAgICAgICBsaW50ZXIuY2hlY2soW2VsaWZfdGVzdF0pCisgICAgbXNncyA9IHNvcnRlZChsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXMsIGtleT1sYW1iZGEgaXRlbTogaXRlbS5saW5lKQorICAgIGFzc2VydCBsZW4obXNncykgPT0gMgorICAgIGZvciBtc2csIGV4cGVjdGVkIGluIHppcChtc2dzLCBFWFBFQ1RFRCk6CisgICAgICAgIGFzc2VydCBtc2cuc3ltYm9sID09ICJiYWQtYnVpbHRpbiIKKyAgICAgICAgYXNzZXJ0IG1zZy5tc2cgPT0gZXhwZWN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9icm9hZF90cnlfY2xhdXNlLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2Jyb2FkX3RyeV9jbGF1c2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5Y2ZmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9icm9hZF90cnlfY2xhdXNlLnB5CkBAIC0wLDAgKzEsNjkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIwIFR5bGVyIFRoaWVkaW5nIDx0eWxlckB0aGllZGluZy5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlRlc3RzIGZvciB0aGUgcHlsaW50IGNoZWNrZXIgaW4gOm1vZDpgcHlsaW50LmV4dGVuc2lvbnMuYnJvYWRfdHJ5X2NsYXVzZWAiIiIKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBvcyBpbXBvcnQgcGF0aCBhcyBvc3AKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzCitmcm9tIHB5bGludC5leHRlbnNpb25zLmJyb2FkX3RyeV9jbGF1c2UgaW1wb3J0IEJyb2FkVHJ5Q2xhdXNlQ2hlY2tlcgorZnJvbSBweWxpbnQubGludCBpbXBvcnQgUHlMaW50ZXIKK2Zyb20gcHlsaW50LnJlcG9ydGVycyBpbXBvcnQgQmFzZVJlcG9ydGVyCisKKworY2xhc3MgQnJvYWRUcnlDbGF1c2VUZXN0UmVwb3J0ZXIoQmFzZVJlcG9ydGVyKToKKyAgICBkZWYgb25fc2V0X2N1cnJlbnRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgZmlsZXBhdGgpOgorICAgICAgICBzZWxmLm1lc3NhZ2VzID0gW10KKworICAgIGRlZiBfZGlzcGxheShzZWxmLCBsYXlvdXQpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgQnJvYWRUcnlDbGF1c2VUQyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLl9saW50ZXIgPSBQeUxpbnRlcigpCisgICAgICAgIGNscy5fbGludGVyLnNldF9yZXBvcnRlcihCcm9hZFRyeUNsYXVzZVRlc3RSZXBvcnRlcigpKQorICAgICAgICBjaGVja2Vycy5pbml0aWFsaXplKGNscy5fbGludGVyKQorICAgICAgICBjbHMuX2xpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEJyb2FkVHJ5Q2xhdXNlQ2hlY2tlcihjbHMuX2xpbnRlcikpCisgICAgICAgIGNscy5fbGludGVyLmRpc2FibGUoIkkiKQorCisgICAgZGVmIHRlc3RfYnJvYWRfdHJ5X2NsYXVzZV9tZXNzYWdlKHNlbGYpOgorICAgICAgICBicm9hZF90cnlfY2xhdXNlX3Rlc3QgPSBvc3Auam9pbigKKyAgICAgICAgICAgIG9zcC5kaXJuYW1lKG9zcC5hYnNwYXRoKF9fZmlsZV9fKSksICJkYXRhIiwgImJyb2FkX3RyeV9jbGF1c2UucHkiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fbGludGVyLmNoZWNrKFticm9hZF90cnlfY2xhdXNlX3Rlc3RdKQorICAgICAgICBtc2dzID0gc2VsZi5fbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZ3MpLCA0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnc1swXS5zeW1ib2wsICJ0b28tbWFueS10cnktc3RhdGVtZW50cyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2dzWzBdLm1zZywgInRyeSBjbGF1c2UgY29udGFpbnMgMyBzdGF0ZW1lbnRzLCBleHBlY3RlZCBhdCBtb3N0IDEiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzWzBdLmxpbmUsIDUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzWzFdLnN5bWJvbCwgInRvby1tYW55LXRyeS1zdGF0ZW1lbnRzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZ3NbMV0ubXNnLCAidHJ5IGNsYXVzZSBjb250YWlucyAzIHN0YXRlbWVudHMsIGV4cGVjdGVkIGF0IG1vc3QgMSIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ3NbMV0ubGluZSwgMTIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzWzJdLnN5bWJvbCwgInRvby1tYW55LXRyeS1zdGF0ZW1lbnRzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZ3NbMl0ubXNnLCAidHJ5IGNsYXVzZSBjb250YWlucyA0IHN0YXRlbWVudHMsIGV4cGVjdGVkIGF0IG1vc3QgMSIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ3NbMl0ubGluZSwgMTkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzWzNdLnN5bWJvbCwgInRvby1tYW55LXRyeS1zdGF0ZW1lbnRzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZ3NbM10ubXNnLCAidHJ5IGNsYXVzZSBjb250YWlucyA3IHN0YXRlbWVudHMsIGV4cGVjdGVkIGF0IG1vc3QgMSIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ3NbM10ubGluZSwgMjkpCmRpZmYgLS1naXQgYS90ZXN0cy9leHRlbnNpb25zL3Rlc3RfY2hlY2tfZG9jcy5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19kb2NzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NWJmOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3RfY2hlY2tfZG9jcy5weQpAQCAtMCwwICsxLDIzMzAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgQnJ1bm8gRGFuaWVsIDxicnVuby5kYW5pZWxAYmx1ZS15b25kZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbG1hdHRoZUBjaXNjby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNywgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBNaXRhciA8bWl0YXIuZ2l0aHViQHRub2RlLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IEpvaG4gUGFyYXNrZXZvcG91bG9zIDxpby5wYXJhc2tldkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEFkcmlhbiBDaGlyaWVhYyA8Y2hpcmllYWNhbUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBMdWlnaSA8bHVpZ2kuY3Jpc3RvZm9saW5pQHEtY3RybC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBMb2dhbiBNaWxsZXIgPDE0MzE5MTc5K2tvbW9kbzQ3MkB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVW5pdCB0ZXN0cyBmb3IgdGhlIHB5bGludCBjaGVja2VycyBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5jaGVja19kb2NzYCwKK2luIHBhcnRpY3VsYXIgdGhlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uIGNoZWNrZXIgYERvY3N0cmluZ0NoZWNrZXJgCisiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktcHVibGljLW1ldGhvZHMKKworaW1wb3J0IGFzdHJvaWQKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQuZXh0ZW5zaW9ucy5kb2NwYXJhbXMgaW1wb3J0IERvY3N0cmluZ1BhcmFtZXRlckNoZWNrZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBzZXRfY29uZmlnCisKKworY2xhc3MgVGVzdFBhcmFtRG9jQ2hlY2tlcihDaGVja2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBweWxpbnRfcGx1Z2luLlBhcmFtRG9jQ2hlY2tlciIiIgorCisgICAgQ0hFQ0tFUl9DTEFTUyA9IERvY3N0cmluZ1BhcmFtZXRlckNoZWNrZXIKKyAgICBDT05GSUcgPSB7CisgICAgICAgICJhY2NlcHRfbm9fcGFyYW1fZG9jIjogRmFsc2UsCisgICAgICAgICJub19kb2NzdHJpbmdfcmd4IjogIiIsCisgICAgICAgICJkb2NzdHJpbmdfbWluX2xlbmd0aCI6IC0xLAorICAgIH0KKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZnVuY19wYXJhbXNfaW5fc3BoaW54X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGZ1bmN0aW9uIHdpdGggbWlzc2luZyBTcGhpbnggcGFyYW1ldGVyIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgdGhlIGRvY3N0cmluZworICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeCwgeSwgeik6CisgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgIDpwYXJhbSB4OiBibGEKKworICAgICAgICAgICAgOnBhcmFtIGludCB6OiBiYXIKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2Z1bmNfcGFyYW1zX2luX2dvb2dsZV9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB3aXRoIG1pc3NpbmcgR29vZ2xlIHN0eWxlIHBhcmFtZXRlcgorICAgICAgICBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb25fZm9vKHgsIHksIHopOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgIHg6IGJsYQorICAgICAgICAgICAgICAgIHogKGludCk6IGJhcgorCisgICAgICAgICAgICBzb21lIG90aGVyIHN0dWZmCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInkiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ190eXBlX2RvY19nb29nbGVfZG9jc3RyaW5nX2V4ZW1wdF9rd29ubHlfYXJncyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBpZGVudGlmaWVyX2t3YXJnX21ldGhvZChhcmcxOiBpbnQsIGFyZzI6IGludCwgKiwgdmFsdWUxOiBzdHIsIHZhbHVlMjogc3RyKToKKyAgICAgICAgICAgICcnJ0NvZGUgdG8gc2hvdyBmYWlsdXJlIGluIG1pc3NpbmctdHlwZS1kb2MKKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICBhcmcxOiBGaXJzdCBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICBhcmcyOiBTZWNvbmQgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgdmFsdWUxOiBGaXJzdCBrd2FyZy4KKyAgICAgICAgICAgICAgICB2YWx1ZTI6IFNlY29uZCBrd2FyZy4KKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcHJpbnQoIk5PVEU6IEl0IGRvZXNuJ3QgbGlrZSBhbnl0aGluZyBhZnRlciB0aGUgJyonLiIpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZnVuY19wYXJhbXNfd2l0aF9hbm5vdGF0aW9uc19pbl9nb29nbGVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgZnVuY3Rpb24gd2l0aCBtaXNzaW5nIEdvb2dsZSBzdHlsZSBwYXJhbWV0ZXIKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeDogaW50LCB5OiBib29sLCB6KToKKyAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICB4OiBibGEKKyAgICAgICAgICAgICAgICB5OiBibGFoIGJsYWgKKyAgICAgICAgICAgICAgICB6IChpbnQpOiBiYXIKKworICAgICAgICAgICAgc29tZSBvdGhlciBzdHVmZgorICAgICAgICAgICAgJycnCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfYXJnX3dpdGhfYW5ub3RhdGlvbnNfaW5fZ29vZ2xlX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGZ1bmN0aW9uIHdpdGggbWlzc2luZyBHb29nbGUgc3R5bGUgcGFyYW1ldGVyCisgICAgICAgIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvY3N0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb25fZm9vKHg6IGludCwgeTogYm9vbCwgejogaW50ID0gNzg2KToKKyAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICB4OiBibGEKKyAgICAgICAgICAgICAgICB5OiBibGFoIGJsYWgKKyAgICAgICAgICAgICAgICB6OiBiYXIKKworICAgICAgICAgICAgc29tZSBvdGhlciBzdHVmZgorICAgICAgICAgICAgJycnCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZnVuY19wYXJhbXNfd2l0aF9wYXJ0aWFsX2Fubm90YXRpb25zX2luX2dvb2dsZV9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB3aXRoIG1pc3NpbmcgR29vZ2xlIHN0eWxlIHBhcmFtZXRlcgorICAgICAgICBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2NzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4LCB5OiBib29sLCB6KToKKyAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICB4OiBibGEKKyAgICAgICAgICAgICAgICB5OiBibGFoIGJsYWgKKyAgICAgICAgICAgICAgICB6IChpbnQpOiBiYXIKKworICAgICAgICAgICAgc29tZSBvdGhlciBzdHVmZgorICAgICAgICAgICAgJycnCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X25vbl9idWlsdGluX2Fubm90YXRpb25zX2luX2dvb2dsZV9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB3aXRoIG1pc3NpbmcgR29vZ2xlIHN0eWxlIHBhcmFtZXRlcgorICAgICAgICBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2NzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGFyZWEoYm90dG9tbGVmdDogUG9pbnQsIHRvcHJpZ2h0OiBQb2ludCkgLT4gZmxvYXQ6CisgICAgICAgICAgICAnJydDYWxjdWxhdGUgYXJlYSBvZiBmYWtlIHJlY3RhbmdsZS4KKyAgICAgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgICAgICBib3R0b21sZWZ0OiBib3R0b20gbGVmdCBwb2ludCBvZiByZWN0YW5nbGUKKyAgICAgICAgICAgICAgICAgICAgdG9wcmlnaHQ6IHRvcCByaWdodCBwb2ludCBvZiByZWN0YW5nbGUKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9ub25fYnVpbHRpbl9hbm5vdGF0aW9uc19mb3JfcmV0dXJudHlwZV9pbl9nb29nbGVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgZnVuY3Rpb24gd2l0aCBtaXNzaW5nIEdvb2dsZSBzdHlsZSBwYXJhbWV0ZXIKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBnZXRfbWlkcG9pbnQoYm90dG9tbGVmdDogUG9pbnQsIHRvcHJpZ2h0OiBQb2ludCkgLT4gUG9pbnQ6CisgICAgICAgICAgICAnJydDYWxjdWxhdGUgbWlkcG9pbnQgb2YgZmFrZSByZWN0YW5nbGUuCisgICAgICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICAgICAgYm90dG9tbGVmdDogYm90dG9tIGxlZnQgcG9pbnQgb2YgcmVjdGFuZ2xlCisgICAgICAgICAgICAgICAgICAgIHRvcHJpZ2h0OiB0b3AgcmlnaHQgcG9pbnQgb2YgcmVjdGFuZ2xlCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZnVuY19wYXJhbXNfYW5kX2tleXdvcmRfcGFyYW1zX2luX2dvb2dsZV9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB3aXRoIEdvb2dsZSBzdHlsZSBwYXJhbWV0ZXIgc3BsaXR0ZWQKKyAgICAgICAgaW4gQXJncyBhbmQgS2V5d29yZCBBcmdzIGluIHRoZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgbXlfZnVuYyh0aGlzLCBvdGhlciwgdGhhdD1UcnVlKToKKyAgICAgICAgICAgICcnJ1ByaW50cyB0aGlzLCBvdGhlciBhbmQgdGhhdAorCisgICAgICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICAgICAgdGhpcyAoc3RyKTogUHJpbnRlZCBmaXJzdAorICAgICAgICAgICAgICAgICAgICBvdGhlciAoaW50KTogT3RoZXIgYXJncworCisgICAgICAgICAgICAgICAgS2V5d29yZCBBcmdzOgorICAgICAgICAgICAgICAgICAgICB0aGF0IChib29sKTogUHJpbnRlZCBzZWNvbmQKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcHJpbnQodGhpcywgdGhhdCwgb3RoZXIpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2Z1bmNfcGFyYW1zX2FuZF93cm9uZ19rZXl3b3JkX3BhcmFtc19pbl9nb29nbGVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgZnVuY3Rpb24gd2l0aCBHb29nbGUgc3R5bGUgcGFyYW1ldGVyIHNwbGl0dGVkCisgICAgICAgIGluIEFyZ3MgYW5kIEtleXdvcmQgQXJncyBpbiB0aGUgZG9jc3RyaW5nIGJ1dCB3aXRoIHdyb25nIGtleXdvcmQgYXJncworICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBteV9mdW5jKHRoaXMsIG90aGVyLCB0aGF0PVRydWUpOgorICAgICAgICAgICAgJycnUHJpbnRzIHRoaXMsIG90aGVyIGFuZCB0aGF0CisKKyAgICAgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgICAgICB0aGlzIChzdHIpOiBQcmludGVkIGZpcnN0CisgICAgICAgICAgICAgICAgICAgIG90aGVyIChpbnQpOiBPdGhlciBhcmdzCisKKyAgICAgICAgICAgICAgICBLZXl3b3JkIEFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHRoZXNlIChib29sKTogUHJpbnRlZCBzZWNvbmQKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcHJpbnQodGhpcywgdGhhdCwgb3RoZXIpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ0aGF0IiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXR5cGUtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgidGhhdCIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0iZGlmZmVyaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInRoZXNlIiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJkaWZmZXJpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ0aGVzZSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZnVuY19wYXJhbXNfaW5fbnVtcHlfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgZnVuY3Rpb24gd2l0aCBtaXNzaW5nIE51bVB5IHN0eWxlIHBhcmFtZXRlcgorICAgICAgICBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb25fZm9vKHgsIHksIHopOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICBQYXJhbWV0ZXJzCisgICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgICAgICAgICB4OgorICAgICAgICAgICAgICAgIGJsYQorICAgICAgICAgICAgejogaW50CisgICAgICAgICAgICAgICAgYmFyCisKKyAgICAgICAgICAgIHNvbWUgb3RoZXIgc3R1ZmYKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhhY2NlcHRfbm9fcGFyYW1fZG9jPVRydWUpCisgICAgZGVmIHRlc3RfdG9sZXJhdGVfbm9fcGFyYW1fZG9jdW1lbnRhdGlvbl9hdF9hbGwoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uIGF0IGFsbAorCisgICAgICAgIE5vIGVycm9yIG1lc3NhZ2UgaXMgZW1pdHRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb25fZm9vKHgsIHkpOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICBtaXNzaW5nIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uJycnCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2Rvbl90X3RvbGVyYXRlX25vX3BhcmFtX2RvY3VtZW50YXRpb25fYXRfYWxsKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgZnVuY3Rpb24gd2l0aCBubyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiBhdCBhbGwKKworICAgICAgICBNaXNzaW5nIGRvY3VtZW50YXRpb24gZXJyb3IgbWVzc2FnZSBpcyBlbWl0dGVkLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeCwgeSk6CisgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgIG1pc3NpbmcgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24nJycKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3Rfc2VlX3RvbGVyYXRlX25vX3BhcmFtX2RvY3VtZW50YXRpb25fYXRfYWxsKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIGZvciB0aGUgdXNhZ2Ugb2YgIkZvciB0aGUgcGFyYW1ldGVycywgc2VlIgorICAgICAgICB0byBzdXBwcmVzcyBtaXNzaW5nLXBhcmFtIHdhcm5pbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeCwgeSk6CisgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgIEZvciB0aGUgcGFyYW1ldGVycywgc2VlIDpmdW5jOmBibGFoYAorICAgICAgICAgICAgJycnCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiBfdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhzZWxmLCBub2RlKToKKyAgICAgICAgIiIiVmlzaXQgYWxsIG1ldGhvZHMgb2YgYSBjbGFzcyBub2RlCisKKyAgICAgICAgOnBhcmFtIG5vZGU6IGNsYXNzIG5vZGUKKyAgICAgICAgOnR5cGUgbm9kZTogOmNsYXNzOmBhc3Ryb2lkLnNjb3BlZF9ub2Rlcy5DbGFzc2AKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBib2R5X2l0ZW0gaW4gbm9kZS5ib2R5OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShib2R5X2l0ZW0sIGFzdHJvaWQuRnVuY3Rpb25EZWYpIGFuZCBoYXNhdHRyKAorICAgICAgICAgICAgICAgIGJvZHlfaXRlbSwgIm5hbWUiCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihib2R5X2l0ZW0pCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX21ldGhvZF9wYXJhbXNfaW5fc3BoaW54X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGNsYXNzIG1ldGhvZCB3aXRoIG1pc3NpbmcgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgdGhlIFNwaGlueCBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBtZXRob2RfZm9vKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIG1pc3NpbmcgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKworICAgICAgICAgICAgICAgIDpwYXJhbSB4OiBibGEKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIG1ldGhvZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW1ldGhvZF9ub2RlLCBhcmdzPSgieSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bWV0aG9kX25vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuX3Zpc2l0X21ldGhvZHNfb2ZfY2xhc3Mobm9kZSkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfbWV0aG9kX3BhcmFtc19pbl9nb29nbGVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgY2xhc3MgbWV0aG9kIHdpdGggbWlzc2luZyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiBpbgorICAgICAgICB0aGUgR29vZ2xlIHN0eWxlIGRvY3N0cmluZworICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIG1ldGhvZF9mb28oc2VsZiwgeCwgeSk6CisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgbWlzc2luZyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorCisgICAgICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICAgICAgeDogYmxhCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBtZXRob2Rfbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1tZXRob2Rfbm9kZSwgYXJncz0oInkiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPW1ldGhvZF9ub2RlLCBhcmdzPSgieCwgeSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLl92aXNpdF9tZXRob2RzX29mX2NsYXNzKG5vZGUpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX21ldGhvZF9wYXJhbXNfaW5fbnVtcHlfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgY2xhc3MgbWV0aG9kIHdpdGggbWlzc2luZyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiBpbgorICAgICAgICB0aGUgTnVtcHkgc3R5bGUgZG9jc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbWV0aG9kX2ZvbyhzZWxmLCB4LCB5KToKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBtaXNzaW5nIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgIHg6CisgICAgICAgICAgICAgICAgICAgIGJsYQorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgbWV0aG9kX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bWV0aG9kX25vZGUsIGFyZ3M9KCJ5IiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXR5cGUtZG9jIiwgbm9kZT1tZXRob2Rfbm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3RfZXhpc3RpbmdfZnVuY19wYXJhbXNfaW5fc3BoaW54X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGZ1bmN0aW9uIHdpdGggY29ycmVjdGx5IGRvY3VtZW50ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgICAgcmV0dXJuIHZhbHVlcyAoU3BoaW54IHN0eWxlKQorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeGFyZywgeWFyZywgemFyZywgd2FyZyk6CisgICAgICAgICAgICAnJydmdW5jdGlvbiBmb28gLi4uCisKKyAgICAgICAgICAgIDpwYXJhbSB4YXJnOiBibGEgeGFyZworICAgICAgICAgICAgOnR5cGUgeGFyZzogaW50CisKKyAgICAgICAgICAgIDpwYXJhbWV0ZXIgeWFyZzogYmxhIHlhcmcKKyAgICAgICAgICAgIDp0eXBlIHlhcmc6IG15LnF1YWxpZmllZC50eXBlCisKKyAgICAgICAgICAgIDphcmcgaW50IHphcmc6IGJsYSB6YXJnCisKKyAgICAgICAgICAgIDprZXl3b3JkIG15LnF1YWxpZmllZC50eXBlIHdhcmc6IGJsYSB3YXJnCisKKyAgICAgICAgICAgIDpyZXR1cm46IHN1bQorICAgICAgICAgICAgOnJ0eXBlOiBmbG9hdAorICAgICAgICAgICAgJycnCisgICAgICAgICAgICByZXR1cm4geGFyZyArIHlhcmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZXhpc3RpbmdfZnVuY19wYXJhbXNfaW5fZ29vZ2xlX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGZ1bmN0aW9uIHdpdGggY29ycmVjdGx5IGRvY3VtZW50ZWQgcGFyYW1ldGVycyBhbmQKKyAgICAgICAgcmV0dXJuIHZhbHVlcyAoR29vZ2xlIHN0eWxlKQorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeGFyZywgeWFyZywgemFyZywgd2FyZyk6CisgICAgICAgICAgICAnJydmdW5jdGlvbiBmb28gLi4uCisKKyAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgeGFyZyAoaW50KTogYmxhIHhhcmcKKyAgICAgICAgICAgICAgICB5YXJnIChteS5xdWFsaWZpZWQudHlwZSk6IGJsYQorICAgICAgICAgICAgICAgICAgICBibGEgeWFyZworCisgICAgICAgICAgICAgICAgemFyZyAoaW50KTogYmxhIHphcmcKKyAgICAgICAgICAgICAgICB3YXJnIChteS5xdWFsaWZpZWQudHlwZSk6IGJsYSB3YXJnCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgZmxvYXQ6IHN1bQorICAgICAgICAgICAgJycnCisgICAgICAgICAgICByZXR1cm4geGFyZyArIHlhcmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZXhpc3RpbmdfZnVuY19wYXJhbXNfaW5fbnVtcHlfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgZnVuY3Rpb24gd2l0aCBjb3JyZWN0bHkgZG9jdW1lbnRlZCBwYXJhbWV0ZXJzIGFuZAorICAgICAgICByZXR1cm4gdmFsdWVzIChOdW1weSBzdHlsZSkKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb25fZm9vKHhhcmcsIHlhcmcsIHphcmcsIHdhcmcpOgorICAgICAgICAgICAgJycnZnVuY3Rpb24gZm9vIC4uLgorCisgICAgICAgICAgICBQYXJhbWV0ZXJzCisgICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgICAgICAgICB4YXJnOiBpbnQKKyAgICAgICAgICAgICAgICBibGEgeGFyZworICAgICAgICAgICAgeWFyZzogbXkucXVhbGlmaWVkLnR5cGUKKyAgICAgICAgICAgICAgICBibGEgeWFyZworCisgICAgICAgICAgICB6YXJnOiBpbnQKKyAgICAgICAgICAgICAgICBibGEgemFyZworICAgICAgICAgICAgd2FyZzogbXkucXVhbGlmaWVkLnR5cGUKKyAgICAgICAgICAgICAgICBibGEgd2FyZworCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICBmbG9hdAorICAgICAgICAgICAgICAgIHN1bQorICAgICAgICAgICAgJycnCisgICAgICAgICAgICByZXR1cm4geGFyZyArIHlhcmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3Rfd3JvbmdfbmFtZV9vZl9mdW5jX3BhcmFtc19pbl9zcGhpbnhfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGZ1bmN0aW9ucyB3aXRoIGluY29uc2lzdGVudCBwYXJhbWV0ZXIgbmFtZXMgaW4gdGhlCisgICAgICAgIHNpZ25hdHVyZSBhbmQgaW4gdGhlIFNwaGlueCBzdHlsZSBkb2N1bWVudGF0aW9uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4YXJnLCB5YXJnLCB6YXJnKToKKyAgICAgICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgICAgICAgOnBhcmFtIHhhcmcxOiBibGEgeGFyZworICAgICAgICAgICAgOnR5cGUgeGFyZzogaW50CisKKyAgICAgICAgICAgIDpwYXJhbSB5YXJnOiBibGEgeWFyZworICAgICAgICAgICAgOnR5cGUgeWFyZzE6IGZsb2F0CisKKyAgICAgICAgICAgIDpwYXJhbSBzdHIgemFyZzE6IGJsYSB6YXJnCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHJldHVybiB4YXJnICsgeWFyZworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieGFyZywgemFyZyIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInlhcmcsIHphcmciLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImRpZmZlcmluZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4YXJnMSwgemFyZzEiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImRpZmZlcmluZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInlhcmcxLCB6YXJnMSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4YXJnLCB5YXJnKToKKyAgICAgICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgICAgICAgOnBhcmFtIHlhcmcxOiBibGEgeWFyZworICAgICAgICAgICAgOnR5cGUgeWFyZzE6IGZsb2F0CisKKyAgICAgICAgICAgIEZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywgc2VlIGJsYS4KKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcmV0dXJuIHhhcmcgKyB5YXJnCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0iZGlmZmVyaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInlhcmcxIiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJkaWZmZXJpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ5YXJnMSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3dyb25nX25hbWVfb2ZfZnVuY19wYXJhbXNfaW5fZ29vZ2xlX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBmdW5jdGlvbnMgd2l0aCBpbmNvbnNpc3RlbnQgcGFyYW1ldGVyIG5hbWVzIGluIHRoZQorICAgICAgICBzaWduYXR1cmUgYW5kIGluIHRoZSBHb29nbGUgc3R5bGUgZG9jdW1lbnRhdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeGFyZywgeWFyZywgemFyZyk6CisgICAgICAgICAgICAnJydmdW5jdGlvbiBmb28gLi4uCisKKyAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgeGFyZzEgKGludCk6IGJsYSB4YXJnCisgICAgICAgICAgICAgICAgeWFyZyAoZmxvYXQpOiBibGEgeWFyZworCisgICAgICAgICAgICAgICAgemFyZzEgKHN0cik6IGJsYSB6YXJnCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHJldHVybiB4YXJnICsgeWFyZworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieGFyZywgemFyZyIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInhhcmcsIHphcmciLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImRpZmZlcmluZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4YXJnMSwgemFyZzEiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImRpZmZlcmluZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInhhcmcxLCB6YXJnMSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4YXJnLCB5YXJnKToKKyAgICAgICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICB5YXJnMSAoZmxvYXQpOiBibGEgeWFyZworCisgICAgICAgICAgICBGb3IgdGhlIG90aGVyIHBhcmFtZXRlcnMsIHNlZSBibGEuCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHJldHVybiB4YXJnICsgeWFyZworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9ImRpZmZlcmluZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ5YXJnMSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0iZGlmZmVyaW5nLXR5cGUtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieWFyZzEiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93cm9uZ19uYW1lX29mX2Z1bmNfcGFyYW1zX2luX251bXB5X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBmdW5jdGlvbnMgd2l0aCBpbmNvbnNpc3RlbnQgcGFyYW1ldGVyIG5hbWVzIGluIHRoZQorICAgICAgICBzaWduYXR1cmUgYW5kIGluIHRoZSBOdW1weSBzdHlsZSBkb2N1bWVudGF0aW9uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4YXJnLCB5YXJnLCB6YXJnKToKKyAgICAgICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICAgICAgICAgeGFyZzE6IGludAorICAgICAgICAgICAgICAgIGJsYSB4YXJnCisgICAgICAgICAgICB5YXJnOiBmbG9hdAorICAgICAgICAgICAgICAgIGJsYSB5YXJnCisKKyAgICAgICAgICAgIHphcmcxOiBzdHIKKyAgICAgICAgICAgICAgICBibGEgemFyZworICAgICAgICAgICAgJycnCisgICAgICAgICAgICByZXR1cm4geGFyZyArIHlhcmcKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInhhcmcsIHphcmciLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4YXJnLCB6YXJnIiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJkaWZmZXJpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieGFyZzEsIHphcmcxIiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJkaWZmZXJpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4YXJnMSwgemFyZzEiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeGFyZywgeWFyZyk6CisgICAgICAgICAgICAnJydmdW5jdGlvbiBmb28gLi4uCisKKyAgICAgICAgICAgIFBhcmFtZXRlcnMKKyAgICAgICAgICAgIC0tLS0tLS0tLS0KKyAgICAgICAgICAgIHlhcmcxOiBmbG9hdAorICAgICAgICAgICAgICAgIGJsYSB5YXJnCisKKyAgICAgICAgICAgIEZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywgc2VlIGJsYS4KKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcmV0dXJuIHhhcmcgKyB5YXJnCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0iZGlmZmVyaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oInlhcmcxIiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJkaWZmZXJpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ5YXJnMSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3NlZV9zZW50ZW5jZV9mb3JfZnVuY19wYXJhbXNfaW5fc3BoaW54X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBmb3IgdGhlIHVzYWdlIG9mICJGb3IgdGhlIG90aGVyIHBhcmFtZXRlcnMsIHNlZSIgdG8gYXZvaWQKKyAgICAgICAgdG9vIG1hbnkgcmVwZXRpdGlvbnMsIGUuZy4gaW4gZnVuY3Rpb25zIG9yIG1ldGhvZHMgYWRoZXJpbmcgdG8gYQorICAgICAgICBnaXZlbiBpbnRlcmZhY2UgKFNwaGlueCBzdHlsZSkKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgZnVuY3Rpb25fZm9vKHhhcmcsIHlhcmcpOgorICAgICAgICAgICAgJycnZnVuY3Rpb24gZm9vIC4uLgorCisgICAgICAgICAgICA6cGFyYW0geWFyZzogYmxhIHlhcmcKKyAgICAgICAgICAgIDp0eXBlIHlhcmc6IGZsb2F0CisKKyAgICAgICAgICAgIEZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywgc2VlIDpmdW5jOmBibGFgCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHJldHVybiB4YXJnICsgeWFyZworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9zZWVfc2VudGVuY2VfZm9yX2Z1bmNfcGFyYW1zX2luX2dvb2dsZV9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgZm9yIHRoZSB1c2FnZSBvZiAiRm9yIHRoZSBvdGhlciBwYXJhbWV0ZXJzLCBzZWUiIHRvIGF2b2lkCisgICAgICAgIHRvbyBtYW55IHJlcGV0aXRpb25zLCBlLmcuIGluIGZ1bmN0aW9ucyBvciBtZXRob2RzIGFkaGVyaW5nIHRvIGEKKyAgICAgICAgZ2l2ZW4gaW50ZXJmYWNlIChHb29nbGUgc3R5bGUpCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4YXJnLCB5YXJnKToKKyAgICAgICAgICAgICcnJ2Z1bmN0aW9uIGZvbyAuLi4KKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICB5YXJnIChmbG9hdCk6IGJsYSB5YXJnCisKKyAgICAgICAgICAgIEZvciB0aGUgb3RoZXIgcGFyYW1ldGVycywgc2VlIDpmdW5jOmBibGFgCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIHJldHVybiB4YXJnICsgeWFyZworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9zZWVfc2VudGVuY2VfZm9yX2Z1bmNfcGFyYW1zX2luX251bXB5X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBmb3IgdGhlIHVzYWdlIG9mICJGb3IgdGhlIG90aGVyIHBhcmFtZXRlcnMsIHNlZSIgdG8gYXZvaWQKKyAgICAgICAgdG9vIG1hbnkgcmVwZXRpdGlvbnMsIGUuZy4gaW4gZnVuY3Rpb25zIG9yIG1ldGhvZHMgYWRoZXJpbmcgdG8gYQorICAgICAgICBnaXZlbiBpbnRlcmZhY2UgKE51bXB5IHN0eWxlKQorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBmdW5jdGlvbl9mb28oeGFyZywgeWFyZyk6CisgICAgICAgICAgICAnJydmdW5jdGlvbiBmb28gLi4uCisKKyAgICAgICAgICAgIFBhcmFtZXRlcnMKKyAgICAgICAgICAgIC0tLS0tLS0tLS0KKyAgICAgICAgICAgIHlhcmc6IGZsb2F0CisgICAgICAgICAgICAgICAgYmxhIHlhcmcKKworICAgICAgICAgICAgRm9yIHRoZSBvdGhlciBwYXJhbWV0ZXJzLCBzZWUgOmZ1bmM6YGJsYWAKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgcmV0dXJuIHhhcmcgKyB5YXJnCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cl9wYXJhbXNfaW5fY2xhc3Nfc3BoaW54KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgY2xhc3Mgd2l0aCBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgIChTcGhpbnggc3R5bGUpCisKKyAgICAgICAgRXZlcnl0aGluZyBpcyBjb21wbGV0ZWx5IGFuYWxvZ291cyB0byBmdW5jdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQ2xhc3NGb28ob2JqZWN0KToKKyAgICAgICAgICAgICcnJ2RvY3N0cmluZyBmb28KKworICAgICAgICAgICAgOnBhcmFtIHk6IGJsYQorCisgICAgICAgICAgICBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAnJycKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieCIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3RfY29uc3RyX3BhcmFtc19pbl9jbGFzc19nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyB3aXRoIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgKEdvb2dsZSBzdHlsZSkKKworICAgICAgICBFdmVyeXRoaW5nIGlzIGNvbXBsZXRlbHkgYW5hbG9nb3VzIHRvIGZ1bmN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbworCisgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgIHk6IGJsYQorCisgICAgICAgICAgICBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAnJycKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieCIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3RfY29uc3RyX3BhcmFtc19pbl9jbGFzc19udW1weShzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGNsYXNzIHdpdGggbWlzc2luZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAgICAoTnVtcHkgc3R5bGUpCisKKyAgICAgICAgRXZlcnl0aGluZyBpcyBjb21wbGV0ZWx5IGFuYWxvZ291cyB0byBmdW5jdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQ2xhc3NGb28ob2JqZWN0KToKKyAgICAgICAgICAgICcnJ2RvY3N0cmluZyBmb28KKworICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICAgICAgICAgeToKKyAgICAgICAgICAgICAgICBibGEKKworICAgICAgICAgICAgbWlzc2luZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgJycnCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuX3Zpc2l0X21ldGhvZHNfb2ZfY2xhc3Mobm9kZSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cl9wYXJhbXNfYW5kX2F0dHJpYnV0ZXNfaW5fY2xhc3NfbnVtcHkoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyB3aXRoIGNvcnJlY3QgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgYW5kIGFuIGF0dHJpYnV0ZXMgc2VjdGlvbiAoTnVtcHkgc3R5bGUpCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQ2xhc3NGb28ob2JqZWN0KToKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICAgICAgICAgZm9vIDogc3RyCisgICAgICAgICAgICAgICAgU29tZXRoaW5nLgorCisgICAgICAgICAgICBBdHRyaWJ1dGVzCisgICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgICAgICAgICBiYXIgOiBzdHIKKyAgICAgICAgICAgICAgICBTb21ldGhpbmcuCisgICAgICAgICAgICAnJycKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuYmFyID0gTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3RfY29uc3RyX3BhcmFtc19pbl9pbml0X3NwaGlueChzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGNsYXNzIHdpdGggbWlzc2luZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAgICAoU3BoaW54IHN0eWxlKQorCisgICAgICAgIEV2ZXJ5dGhpbmcgaXMgY29tcGxldGVseSBhbmFsb2dvdXMgdG8gZnVuY3Rpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIENsYXNzRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6CisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbyBjb25zdHJ1Y3RvcgorCisgICAgICAgICAgICAgICAgOnBhcmFtIHk6IGJsYQorCisgICAgICAgICAgICAgICAgbWlzc2luZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICcnJworCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGNvbnN0cnVjdG9yX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9Y29uc3RydWN0b3Jfbm9kZSwgYXJncz0oIngiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPWNvbnN0cnVjdG9yX25vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuX3Zpc2l0X21ldGhvZHNfb2ZfY2xhc3Mobm9kZSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cl9wYXJhbXNfaW5faW5pdF9nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyB3aXRoIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgKEdvb2dsZSBzdHlsZSkKKworICAgICAgICBFdmVyeXRoaW5nIGlzIGNvbXBsZXRlbHkgYW5hbG9nb3VzIHRvIGZ1bmN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyBmb28gY29uc3RydWN0b3IKKworICAgICAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHk6IGJsYQorCisgICAgICAgICAgICAgICAgbWlzc2luZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBjb25zdHJ1Y3Rvcl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPWNvbnN0cnVjdG9yX25vZGUsIGFyZ3M9KCJ4IiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXR5cGUtZG9jIiwgbm9kZT1jb25zdHJ1Y3Rvcl9ub2RlLCBhcmdzPSgieCwgeSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLl92aXNpdF9tZXRob2RzX29mX2NsYXNzKG5vZGUpCisKKyAgICBkZWYgdGVzdF9jb25zdHJfcGFyYW1zX2luX2luaXRfbnVtcHkoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyB3aXRoIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgKE51bXB5IHN0eWxlKQorCisgICAgICAgIEV2ZXJ5dGhpbmcgaXMgY29tcGxldGVseSBhbmFsb2dvdXMgdG8gZnVuY3Rpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIENsYXNzRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6CisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbyBjb25zdHJ1Y3RvcgorCisgICAgICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICB5OgorICAgICAgICAgICAgICAgICAgICBibGEKKworICAgICAgICAgICAgICAgIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgY29uc3RydWN0b3Jfbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1jb25zdHJ1Y3Rvcl9ub2RlLCBhcmdzPSgieCIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9Y29uc3RydWN0b3Jfbm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3Rfc2VlX3NlbnRlbmNlX2Zvcl9jb25zdHJfcGFyYW1zX2luX2NsYXNzKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIHVzYWdlIG9mICJGb3IgdGhlIHBhcmFtZXRlcnMsIHNlZSIgaW4gY2xhc3MgZG9jc3RyaW5nIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbworCisgICAgICAgICAgICBGb3IgdGhlIHBhcmFtZXRlcnMsIHNlZSA6ZnVuYzpgYmxhYAorICAgICAgICAgICAgJycnCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKKyAgICAgICAgICAgICAgICAnJydpbml0JycnCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLl92aXNpdF9tZXRob2RzX29mX2NsYXNzKG5vZGUpCisKKyAgICBkZWYgdGVzdF9zZWVfc2VudGVuY2VfZm9yX2NvbnN0cl9wYXJhbXNfaW5faW5pdChzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSB1c2FnZSBvZiAiRm9yIHRoZSBwYXJhbWV0ZXJzLCBzZWUiIGluIGluaXQgZG9jc3RyaW5nIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgJycnZm9vJycnCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KToKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgZm9vIGNvbnN0cnVjdG9yCisKKyAgICAgICAgICAgICAgICBGb3IgdGhlIHBhcmFtZXRlcnMsIHNlZSA6ZnVuYzpgYmxhYAorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3RfY29uc3RyX3BhcmFtc19pbl9jbGFzc19hbmRfaW5pdF9zcGhpbngoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyB3aXRoIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgaW4gYm90aCB0aGUgaW5pdCBkb2NzdHJpbmcgYW5kIHRoZSBjbGFzcyBkb2NzdHJpbmcKKyAgICAgICAgKFNwaGlueCBzdHlsZSkKKworICAgICAgICBFdmVyeXRoaW5nIGlzIGNvbXBsZXRlbHkgYW5hbG9nb3VzIHRvIGZ1bmN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbworCisgICAgICAgICAgICA6cGFyYW0geTogTm9uZQorCisgICAgICAgICAgICBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAnJycKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyBmb28KKworICAgICAgICAgICAgICAgIDpwYXJhbSB5OiBibGEKKworICAgICAgICAgICAgICAgIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgY29uc3RydWN0b3Jfbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im11bHRpcGxlLWNvbnN0cnVjdG9yLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0obm9kZS5uYW1lLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieCIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1jb25zdHJ1Y3Rvcl9ub2RlLCBhcmdzPSgieCIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9Y29uc3RydWN0b3Jfbm9kZSwgYXJncz0oIngsIHkiLCkpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRfbWV0aG9kc19vZl9jbGFzcyhub2RlKQorCisgICAgZGVmIHRlc3RfY29uc3RyX3BhcmFtc19pbl9jbGFzc19hbmRfaW5pdF9nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyB3aXRoIG1pc3NpbmcgY29uc3RydWN0b3IgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24KKyAgICAgICAgaW4gYm90aCB0aGUgaW5pdCBkb2NzdHJpbmcgYW5kIHRoZSBjbGFzcyBkb2NzdHJpbmcKKyAgICAgICAgKEdvb2dsZSBzdHlsZSkKKworICAgICAgICBFdmVyeXRoaW5nIGlzIGNvbXBsZXRlbHkgYW5hbG9nb3VzIHRvIGZ1bmN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbworCisgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgIHk6IGJsYQorCisgICAgICAgICAgICBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAnJycKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyBmb28KKworICAgICAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHk6IGJsYQorCisgICAgICAgICAgICAgICAgbWlzc2luZyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBjb25zdHJ1Y3Rvcl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibXVsdGlwbGUtY29uc3RydWN0b3ItZG9jIiwgbm9kZT1ub2RlLCBhcmdzPShub2RlLm5hbWUsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4IiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXR5cGUtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgieCwgeSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPWNvbnN0cnVjdG9yX25vZGUsIGFyZ3M9KCJ4IiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXR5cGUtZG9jIiwgbm9kZT1jb25zdHJ1Y3Rvcl9ub2RlLCBhcmdzPSgieCwgeSIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLl92aXNpdF9tZXRob2RzX29mX2NsYXNzKG5vZGUpCisKKyAgICBkZWYgdGVzdF9jb25zdHJfcGFyYW1zX2luX2NsYXNzX2FuZF9pbml0X251bXB5KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgY2xhc3Mgd2l0aCBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgIGluIGJvdGggdGhlIGluaXQgZG9jc3RyaW5nIGFuZCB0aGUgY2xhc3MgZG9jc3RyaW5nCisgICAgICAgIChOdW1weSBzdHlsZSkKKworICAgICAgICBFdmVyeXRoaW5nIGlzIGNvbXBsZXRlbHkgYW5hbG9nb3VzIHRvIGZ1bmN0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDbGFzc0ZvbyhvYmplY3QpOgorICAgICAgICAgICAgJycnZG9jc3RyaW5nIGZvbworCisgICAgICAgICAgICBQYXJhbWV0ZXJzCisgICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgICAgICAgICB5OgorICAgICAgICAgICAgICAgIGJsYQorCisgICAgICAgICAgICBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAnJycKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyBmb28KKworICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgeToKKyAgICAgICAgICAgICAgICAgICAgYmxhCisKKyAgICAgICAgICAgICAgICBtaXNzaW5nIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIGNvbnN0cnVjdG9yX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtdWx0aXBsZS1jb25zdHJ1Y3Rvci1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KG5vZGUubmFtZSwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIngiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9Y29uc3RydWN0b3Jfbm9kZSwgYXJncz0oIngiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctdHlwZS1kb2MiLCBub2RlPWNvbnN0cnVjdG9yX25vZGUsIGFyZ3M9KCJ4LCB5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuX3Zpc2l0X21ldGhvZHNfb2ZfY2xhc3Mobm9kZSkKKworICAgIGRlZiB0ZXN0X2t3b25seWFyZ3NfYXJlX3Rha2VuX2luX2FjY291bnQoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhhcmcsICosIGt3b25seSwgbWlzc2luZ19rd29ubHkpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICA6cGFyYW0gaW50IGFyZzogVGhlIGFyZ3VtZW50LgorICAgICAgICAgICAgOnBhcmFtIGJvb2wga3dvbmx5OiBBIGtleXdvcmQtYXJnLgorICAgICAgICAgICAgIiIiCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJtaXNzaW5nX2t3b25seSIsKSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy10eXBlLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIm1pc3Npbmdfa3dvbmx5IiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3Rfd2FybnNfbWlzc2luZ19hcmdzX3NwaGlueChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKmFyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICA6cGFyYW0gbmFtZWRfYXJnOiBSZXR1cm5lZAorICAgICAgICAgICAgOnR5cGUgbmFtZWRfYXJnOiBvYmplY3QKKyAgICAgICAgICAgIDpyZXR1cm5zOiBNYXliZSBuYW1lZF9hcmcKKyAgICAgICAgICAgIDpydHlwZTogb2JqZWN0IG9yIE5vbmUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJhcmdzIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19taXNzaW5nX2t3YXJnc19zcGhpbngoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhuYW1lZF9hcmcsICoqa3dhcmdzKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgOnBhcmFtIG5hbWVkX2FyZzogUmV0dXJuZWQKKyAgICAgICAgICAgIDp0eXBlIG5hbWVkX2FyZzogb2JqZWN0CisgICAgICAgICAgICA6cmV0dXJuczogTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICA6cnR5cGU6IG9iamVjdCBvciBOb25lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJrd2FyZ3MiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX21pc3NpbmdfYXJnc19nb29nbGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhuYW1lZF9hcmcsICphcmdzKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICBuYW1lZF9hcmcgKG9iamVjdCk6IFJldHVybmVkCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgb2JqZWN0IG9yIE5vbmU6IE1heWJlIG5hbWVkX2FyZworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lZF9hcmcKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oImFyZ3MiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX21pc3Npbmdfa3dhcmdzX2dvb2dsZShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKiprd2FyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgIG5hbWVkX2FyZyAob2JqZWN0KTogUmV0dXJuZWQKKworICAgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICBvYmplY3Qgb3IgTm9uZTogTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1wYXJhbS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJrd2FyZ3MiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX21pc3NpbmdfYXJnc19udW1weShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKmFyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICBBcmdzCisgICAgICAgICAgICAtLS0tCisgICAgICAgICAgICBuYW1lZF9hcmcgOiBvYmplY3QKKyAgICAgICAgICAgICAgICBSZXR1cm5lZAorCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgb2JqZWN0IG9yIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVkX2FyZworICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiYXJncyIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3Rfd2FybnNfbWlzc2luZ19rd2FyZ3NfbnVtcHkoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhuYW1lZF9hcmcsICoqa3dhcmdzKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgQXJncworICAgICAgICAgICAgLS0tLQorICAgICAgICAgICAgbmFtZWRfYXJnIDogb2JqZWN0CisgICAgICAgICAgICAgICAgUmV0dXJuZWQKKworICAgICAgICAgICAgUmV0dXJucworICAgICAgICAgICAgLS0tLS0tLQorICAgICAgICAgICAgICAgIG9iamVjdCBvciBOb25lCisgICAgICAgICAgICAgICAgICAgIE1heWJlIG5hbWVkX2FyZworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVkX2FyZworICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgia3dhcmdzIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19hcmdzX3dpdGhvdXRfdHlwZV9zcGhpbngoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhuYW1lZF9hcmcsICphcmdzKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgOnBhcmFtIG5hbWVkX2FyZzogUmV0dXJuZWQKKyAgICAgICAgICAgIDp0eXBlIG5hbWVkX2FyZzogb2JqZWN0CisgICAgICAgICAgICA6cGFyYW0gYXJnczogT3B0aW9uYWwgYXJndW1lbnRzCisgICAgICAgICAgICA6cmV0dXJuczogTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICA6cnR5cGU6IG9iamVjdCBvciBOb25lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVkX2FyZworICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19rd2FyZ3Nfd2l0aG91dF90eXBlX3NwaGlueChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKiprd2FyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICA6cGFyYW0gbmFtZWRfYXJnOiBSZXR1cm5lZAorICAgICAgICAgICAgOnR5cGUgbmFtZWRfYXJnOiBvYmplY3QKKyAgICAgICAgICAgIDpwYXJhbSBrd2FyZ3M6IEtleXdvcmQgYXJndW1lbnRzCisgICAgICAgICAgICA6cmV0dXJuczogTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICA6cnR5cGU6IG9iamVjdCBvciBOb25lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX2FyZ3Nfd2l0aG91dF90eXBlX2dvb2dsZShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKmFyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgIG5hbWVkX2FyZyAob2JqZWN0KTogUmV0dXJuZWQKKyAgICAgICAgICAgICAgICAqYXJnczogT3B0aW9uYWwgYXJndW1lbnRzCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgb2JqZWN0IG9yIE5vbmU6IE1heWJlIG5hbWVkX2FyZworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lZF9hcmcKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfa3dhcmdzX3dpdGhvdXRfdHlwZV9nb29nbGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhuYW1lZF9hcmcsICoqa3dhcmdzKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICBuYW1lZF9hcmcgKG9iamVjdCk6IFJldHVybmVkCisgICAgICAgICAgICAgICAgKiprd2FyZ3M6IEtleXdvcmQgYXJndW1lbnRzCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgb2JqZWN0IG9yIE5vbmU6IE1heWJlIG5hbWVkX2FyZworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVkX2FyZworICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19hcmdzX3dpdGhvdXRfdHlwZV9udW1weShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKmFyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICBBcmdzCisgICAgICAgICAgICAtLS0tCisgICAgICAgICAgICBuYW1lZF9hcmcgOiBvYmplY3QKKyAgICAgICAgICAgICAgICBSZXR1cm5lZAorICAgICAgICAgICAgYXJncyA6CisgICAgICAgICAgICAgICAgT3B0aW9uYWwgQXJndW1lbnRzCisKKyAgICAgICAgICAgIFJldHVybnMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgICAgICBvYmplY3Qgb3IgTm9uZQorICAgICAgICAgICAgICAgICAgICBNYXliZSBuYW1lZF9hcmcKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX2FyZ3Nfd2l0aF94cmVmX3R5cGVfZ29vZ2xlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMobmFtZWRfYXJnLCAqKmt3YXJncyk6CisgICAgICAgICAgICAiIiJUaGUgZG9jc3RyaW5nCisKKyAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgbmFtZWRfYXJnIChgZXhhbXBsZS52YWx1ZWApOiBSZXR1cm5lZAorICAgICAgICAgICAgICAgICoqa3dhcmdzOiBLZXl3b3JkIGFyZ3VtZW50cworCisgICAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgICAgIGBleGFtcGxlLnZhbHVlYDogTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX2FyZ3Nfd2l0aF94cmVmX3R5cGVfbnVtcHkoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhuYW1lZF9hcmcsICphcmdzKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgQXJncworICAgICAgICAgICAgLS0tLQorICAgICAgICAgICAgbmFtZWRfYXJnIDogYGV4YW1wbGUudmFsdWVgCisgICAgICAgICAgICAgICAgUmV0dXJuZWQKKyAgICAgICAgICAgIGFyZ3MgOgorICAgICAgICAgICAgICAgIE9wdGlvbmFsIEFyZ3VtZW50cworCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgYGV4YW1wbGUudmFsdWVgCisgICAgICAgICAgICAgICAgICAgIE1heWJlIG5hbWVkX2FyZworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lZF9hcmcKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfa3dhcmdzX3dpdGhvdXRfdHlwZV9udW1weShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZywgKiprd2FyZ3MpOgorICAgICAgICAgICAgIiIiVGhlIGRvY3N0cmluZworCisgICAgICAgICAgICBBcmdzCisgICAgICAgICAgICAtLS0tCisgICAgICAgICAgICBuYW1lZF9hcmcgOiBvYmplY3QKKyAgICAgICAgICAgICAgICBSZXR1cm5lZAorICAgICAgICAgICAga3dhcmdzIDoKKyAgICAgICAgICAgICAgICBLZXl3b3JkIGFyZ3VtZW50cworCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgb2JqZWN0IG9yIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgTWF5YmUgbmFtZWRfYXJnCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZWRfYXJnCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIENPTlRBSU5FUl9UWVBFUyA9IFsKKyAgICAgICAgImRpY3Qoc3RyLHN0cikiLAorICAgICAgICAiZGljdFtzdHIsc3RyXSIsCisgICAgICAgICJ0dXBsZShpbnQpIiwKKyAgICAgICAgImxpc3RbdG9rZW5pemUuVG9rZW5JbmZvXSIsCisgICAgXQorCisgICAgQ09NUExFWF9UWVBFUyA9IENPTlRBSU5FUl9UWVBFUyArIFsKKyAgICAgICAgImRpY3Qoc3RyLCBzdHIpIiwKKyAgICAgICAgImRpY3Rbc3RyLCBzdHJdIiwKKyAgICAgICAgImludCBvciBzdHIiLAorICAgICAgICAidHVwbGUoaW50IG9yIHN0cikiLAorICAgICAgICAidHVwbGUoaW50KSBvciBsaXN0KGludCkiLAorICAgICAgICAidHVwbGUoaW50IG9yIHN0cikgb3IgbGlzdChpbnQgb3Igc3RyKSIsCisgICAgXQorCisgICAgQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJjb21wbGV4X3R5cGUiLCBDT01QTEVYX1RZUEVTKQorICAgIGRlZiB0ZXN0X2ZpbmRzX211bHRpcGxlX3R5cGVzX3NwaGlueChzZWxmLCBjb21wbGV4X3R5cGUpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICBmJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZyk6CisgICAgICAgICAgICAiIiJUaGUgZG9jc3RyaW5nCisKKyAgICAgICAgICAgIDpwYXJhbSBuYW1lZF9hcmc6IFJldHVybmVkCisgICAgICAgICAgICA6dHlwZSBuYW1lZF9hcmc6IHtjb21wbGV4X3R5cGV9CisKKyAgICAgICAgICAgIDpyZXR1cm5zOiBuYW1lZF9hcmcKKyAgICAgICAgICAgIDpydHlwZToge2NvbXBsZXhfdHlwZX0KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIG5hbWVkX2FyZworICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoImNvbXBsZXhfdHlwZSIsIENPTVBMRVhfVFlQRVMpCisgICAgZGVmIHRlc3RfZmluZHNfbXVsdGlwbGVfdHlwZXNfZ29vZ2xlKHNlbGYsIGNvbXBsZXhfdHlwZSk6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgIGYnJycKKyAgICAgICAgZGVmIG15X2Z1bmMobmFtZWRfYXJnKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICBuYW1lZF9hcmcgKHtjb21wbGV4X3R5cGV9KTogUmV0dXJuZWQKKworICAgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICB7Y29tcGxleF90eXBlfTogbmFtZWRfYXJnCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBuYW1lZF9hcmcKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJjb21wbGV4X3R5cGUiLCBDT01QTEVYX1RZUEVTKQorICAgIGRlZiB0ZXN0X2ZpbmRzX211bHRpcGxlX3R5cGVzX251bXB5KHNlbGYsIGNvbXBsZXhfdHlwZSk6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgIGYnJycKKyAgICAgICAgZGVmIG15X2Z1bmMobmFtZWRfYXJnKToKKyAgICAgICAgICAgICIiIlRoZSBkb2NzdHJpbmcKKworICAgICAgICAgICAgQXJncworICAgICAgICAgICAgLS0tLQorICAgICAgICAgICAgbmFtZWRfYXJnIDoge2NvbXBsZXhfdHlwZX0KKyAgICAgICAgICAgICAgICBSZXR1cm5lZAorCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAge2NvbXBsZXhfdHlwZX0KKyAgICAgICAgICAgICAgICAgICAgbmFtZWRfYXJnCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBuYW1lZF9hcmcKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJjb250YWluZXJfdHlwZSIsIENPTlRBSU5FUl9UWVBFUykKKyAgICBkZWYgdGVzdF9maW5kc19jb21wYWN0X2NvbnRhaW5lcl90eXBlc19zcGhpbngoc2VsZiwgY29udGFpbmVyX3R5cGUpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICBmJycnCisgICAgICAgIGRlZiBteV9mdW5jKG5hbWVkX2FyZyk6CisgICAgICAgICAgICAiIiJUaGUgZG9jc3RyaW5nCisKKyAgICAgICAgICAgIDpwYXJhbSB7Y29udGFpbmVyX3R5cGV9IG5hbWVkX2FyZzogUmV0dXJuZWQKKworICAgICAgICAgICAgOnJldHVybnM6IG5hbWVkX2FyZworICAgICAgICAgICAgOnJ0eXBlOiB7Y29udGFpbmVyX3R5cGV9CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBuYW1lZF9hcmcKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19vcHRpb25hbF9zcGVjaWZpZXJfZ29vZ2xlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIGRvX3NvbWV0aGluZyhwYXJhbTEsIHBhcmFtMiwgcGFyYW0zPSgpLCBwYXJhbTQ9W10sIHBhcmFtNT1bXSwgcGFyYW02PVRydWUpOgorICAgICAgICAgICAgIiIiRG8gc29tZXRoaW5nLgorCisgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgIHBhcmFtMSAoc3RyKTogRGVzY3JpcHRpb24uCisgICAgICAgICAgICAgICAgcGFyYW0yIChkaWN0KHN0ciwgaW50KSk6IERlc2NyaXB0aW9uLgorICAgICAgICAgICAgICAgIHBhcmFtMyAodHVwbGUoc3RyKSwgb3B0aW9uYWwpOiBEZWZhdWx0cyB0byBlbXB0eS4gRGVzY3JpcHRpb24uCisgICAgICAgICAgICAgICAgcGFyYW00IChMaXN0W3N0cl0sIG9wdGlvbmFsKTogRGVmYXVsdHMgdG8gZW1wdHkuIERlc2NyaXB0aW9uLgorICAgICAgICAgICAgICAgIHBhcmFtNSAobGlzdFt0dXBsZShzdHIpXSwgb3B0aW9uYWwpOiBEZWZhdWx0cyB0byBlbXB0eS4gRGVzY3JpcHRpb24uCisgICAgICAgICAgICAgICAgcGFyYW02IChib29sLCBvcHRpb25hbCk6IERlZmF1bHRzIHRvIFRydWUuIERlc2NyaXB0aW9uLgorCisgICAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgICAgIGludDogRGVzY3JpcHRpb24uCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgcGFyYW02CisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfb3B0aW9uYWxfc3BlY2lmaWVyX251bXB5KHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIGRvX3NvbWV0aGluZyhwYXJhbSwgcGFyYW0yPSdhbGwnKToKKyAgICAgICAgICAgICIiIkRvIHNvbWV0aGluZy4KKworICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgLS0tLS0tLS0tLQorICAgICAgICAgICAgcGFyYW0gOiBzdHIKKyAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbi4KKyAgICAgICAgICAgIHBhcmFtMiA6IHN0ciwgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiAodGhlIGRlZmF1bHQgaXMgJ2FsbCcpLgorCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICBpbnQKKyAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbi4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIHBhcmFtLCBwYXJhbTIKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfc2hvcnRfbmFtZV9leGNlcHRpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBmcm9tIGZha2VfcGFja2FnZSBpbXBvcnQgQmFkRXJyb3IKKworICAgICAgICBkZWYgZG9fc29tZXRoaW5nKCk6ICNACisgICAgICAgICAgICAiIiJEbyBzb21ldGhpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICB+ZmFrZV9wYWNrYWdlLmV4Y2VwdGlvbnMuQmFkRXJyb3I6IFdoZW4gc29tZXRoaW5nIGJhZCBoYXBwZW5lZC4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgQmFkRXJyb3IoIkEgYmFkIHRoaW5nIGhhcHBlbmVkLiIpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX21pc3NpbmdfcmFpc2VzX2Zyb21fc2V0dGVyX3NwaGlueChzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIHNldHRlciBoYXZpbmcgbWlzc2luZyByYWlzZXMgZG9jdW1lbnRhdGlvbiBpbgorICAgICAgICB0aGUgU3BoaW54IHN0eWxlIGRvY3N0cmluZyBvZiB0aGUgcHJvcGVydHkKKyAgICAgICAgIiIiCisgICAgICAgIHByb3BlcnR5X25vZGUsIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICA6dHlwZTogaW50CisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmV0dXJuIDEwCisKKyAgICAgICAgICAgIEBmb28uc2V0dGVyCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigpICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwKKyAgICAgICAgICAgICAgICBub2RlPXByb3BlcnR5X25vZGUsCisgICAgICAgICAgICAgICAgYXJncz0oIkF0dHJpYnV0ZUVycm9yIiwpLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19taXNzaW5nX3JhaXNlc19mcm9tX3NldHRlcl9nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBzZXR0ZXIgaGF2aW5nIG1pc3NpbmcgcmFpc2VzIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgdGhlIEdvb2dsZSBzdHlsZSBkb2NzdHJpbmcgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICIiIgorICAgICAgICBwcm9wZXJ0eV9ub2RlLCBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnaW50OiBkb2NzdHJpbmcKKworICAgICAgICAgICAgICAgIEluY2x1ZGUgYSAiUmFpc2VzIiBzZWN0aW9uIHNvIHRoYXQgdGhpcyBpcyBpZGVudGlmaWVkCisgICAgICAgICAgICAgICAgYXMgYSBHb29nbGUgZG9jc3RyaW5nIGFuZCBub3QgYSBOdW1weSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcjogQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKworICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLAorICAgICAgICAgICAgICAgIG5vZGU9cHJvcGVydHlfbm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPSgiQXR0cmlidXRlRXJyb3IiLCksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2Uobm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX21pc3NpbmdfcmFpc2VzX2Zyb21fc2V0dGVyX251bXB5KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgc2V0dGVyIGhhdmluZyBtaXNzaW5nIHJhaXNlcyBkb2N1bWVudGF0aW9uIGluCisgICAgICAgIHRoZSBOdW1weSBzdHlsZSBkb2NzdHJpbmcgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICIiIgorICAgICAgICBwcm9wZXJ0eV9ub2RlLCBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnaW50OiBkb2NzdHJpbmcKKworICAgICAgICAgICAgICAgIEluY2x1ZGUgYSAiUmFpc2VzIiBzZWN0aW9uIHNvIHRoYXQgdGhpcyBpcyBpZGVudGlmaWVkCisgICAgICAgICAgICAgICAgYXMgYSBOdW1weSBkb2NzdHJpbmcgYW5kIG5vdCBhIEdvb2dsZSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgICAgICAtLS0tLS0KKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKworICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLAorICAgICAgICAgICAgICAgIG5vZGU9cHJvcGVydHlfbm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPSgiQXR0cmlidXRlRXJyb3IiLCksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2Uobm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX21pc3NpbmdfcmFpc2VzX2luX3NldHRlcl9zcGhpbngoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBzZXR0ZXIgaGF2aW5nIG1pc3NpbmcgcmFpc2VzIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgaXRzIG93biBTcGhpbnggc3R5bGUgZG9jc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBzZXR0ZXJfbm9kZSwgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgQHByb3BlcnR5CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIDp0eXBlOiBpbnQKKyAgICAgICAgICAgICAgICA6cmFpc2VzIFJ1bnRpbWVFcnJvcjogQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKworICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOiAjQAorICAgICAgICAgICAgICAgICcnJ3NldHRlciBkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICA6dHlwZTogTm9uZQorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCkgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLCBub2RlPXNldHRlcl9ub2RlLCBhcmdzPSgiQXR0cmlidXRlRXJyb3IiLCkKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfbWlzc2luZ19yYWlzZXNfZnJvbV9zZXR0ZXJfZ29vZ2xlXzIoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBzZXR0ZXIgaGF2aW5nIG1pc3NpbmcgcmFpc2VzIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgaXRzIG93biBHb29nbGUgc3R5bGUgZG9jc3RyaW5nIG9mIHRoZSBwcm9wZXJ0eQorICAgICAgICAiIiIKKyAgICAgICAgc2V0dGVyX25vZGUsIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICAnJydpbnQ6IGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICAgICAgUnVudGltZUVycm9yOiBBbHdheXMKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAgICAgICAgIHJldHVybiAxMAorCisgICAgICAgICAgICBAZm9vLnNldHRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCB2YWx1ZSk6ICNACisgICAgICAgICAgICAgICAgJycnc2V0dGVyIGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICAgICAgUnVudGltZUVycm9yOiBOZXZlcgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCkgI0AKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9Im1pc3NpbmctcmFpc2VzLWRvYyIsIG5vZGU9c2V0dGVyX25vZGUsIGFyZ3M9KCJBdHRyaWJ1dGVFcnJvciIsKQorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19taXNzaW5nX3JhaXNlc19mcm9tX3NldHRlcl9udW1weV8yKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgc2V0dGVyIGhhdmluZyBtaXNzaW5nIHJhaXNlcyBkb2N1bWVudGF0aW9uIGluCisgICAgICAgIGl0cyBvd24gTnVtcHkgc3R5bGUgZG9jc3RyaW5nIG9mIHRoZSBwcm9wZXJ0eQorICAgICAgICAiIiIKKyAgICAgICAgc2V0dGVyX25vZGUsIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICAnJydpbnQ6IGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgICAgICBBbHdheXMKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAgICAgICAgIHJldHVybiAxMAorCisgICAgICAgICAgICBAZm9vLnNldHRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCB2YWx1ZSk6ICNACisgICAgICAgICAgICAgICAgJycnc2V0dGVyIGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgICAgICBOZXZlcgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCkgI0AKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9Im1pc3NpbmctcmFpc2VzLWRvYyIsIG5vZGU9c2V0dGVyX25vZGUsIGFyZ3M9KCJBdHRyaWJ1dGVFcnJvciIsKQorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19wcm9wZXJ0eV9yZXR1cm5fdHlwZV9zcGhpbngoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBwcm9wZXJ0eSBoYXZpbmcgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgYSBTcGhpbnggc3R5bGUgZG9jc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgOnR5cGU6IGludAorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19wcm9wZXJ0eV9yZXR1cm5fdHlwZV9nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBwcm9wZXJ0eSBoYXZpbmcgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgYSBHb29nbGUgc3R5bGUgZG9jc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnaW50OiBkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcjogQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfcHJvcGVydHlfcmV0dXJuX3R5cGVfbnVtcHkoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBwcm9wZXJ0eSBoYXZpbmcgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgYSBudW1weSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAnJydpbnQ6IGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgICAgICBBbHdheXMKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19hbm5vdGF0aW9uX3Byb3BlcnR5X3JldHVybl90eXBlX3NwaGlueChzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIHByb3BlcnR5IGhhdmluZyBtaXNzaW5nIHJldHVybiBkb2N1bWVudGF0aW9uIGluCisgICAgICAgIGEgU3BoaW54IHN0eWxlIGRvY3N0cmluZworICAgICAgICAiIiIKKyAgICAgICAgXywgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgQHByb3BlcnR5CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpIC0+IGludDogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICA6cmFpc2VzIFJ1bnRpbWVFcnJvcjogQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4obm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX21pc3NpbmdfcHJvcGVydHlfcmV0dXJuX3R5cGVfc3BoaW54KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgcHJvcGVydHkgaGF2aW5nIG1pc3NpbmcgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgYSBTcGhpbnggc3R5bGUgZG9jc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICBwcm9wZXJ0eV9ub2RlLCBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgOnJhaXNlcyBSdW50aW1lRXJyb3I6IEFsd2F5cworICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEwICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tdHlwZS1kb2MiLCBub2RlPXByb3BlcnR5X25vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19hbm5vdGF0aW9uX3Byb3BlcnR5X3JldHVybl90eXBlX2dvb2dsZShzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIHByb3BlcnR5IGhhdmluZyByZXR1cm4gZG9jdW1lbnRhdGlvbiBpbgorICAgICAgICBhIEdvb2dsZSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF8sIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKSAtPiBpbnQ6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgUmFpc2VzOgorICAgICAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3I6IEFsd2F5cworICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEwICNACisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKG5vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19taXNzaW5nX3Byb3BlcnR5X3JldHVybl90eXBlX2dvb2dsZShzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIHByb3BlcnR5IGhhdmluZyByZXR1cm4gZG9jdW1lbnRhdGlvbiBpbgorICAgICAgICBhIEdvb2dsZSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIHByb3BlcnR5X25vZGUsIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcjogQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi10eXBlLWRvYyIsIG5vZGU9cHJvcGVydHlfbm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4obm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX21pc3NpbmdfcHJvcGVydHlfcmV0dXJuX3R5cGVfbnVtcHkoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBwcm9wZXJ0eSBoYXZpbmcgcmV0dXJuIGRvY3VtZW50YXRpb24gaW4KKyAgICAgICAgYSBudW1weSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIHByb3BlcnR5X25vZGUsIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgICAgICAtLS0tLS0KKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi10eXBlLWRvYyIsIG5vZGU9cHJvcGVydHlfbm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4obm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfbm9uX3Byb3BlcnR5X3JldHVybl90eXBlX3NwaGlueChzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIGNsYXNzIGZ1bmN0aW9uIHRyeWluZyB0byB1c2UgYHR5cGVgIGFzIHJldHVybgorICAgICAgICBkb2N1bWVudGF0aW9uIGluIGEgU3BoaW54IHN0eWxlIGRvY3N0cmluZworICAgICAgICAiIiIKKyAgICAgICAgZnVuY19ub2RlLCBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiAjQAorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIDp0eXBlOiBpbnQKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi1kb2MiLCBub2RlPWZ1bmNfbm9kZSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tdHlwZS1kb2MiLCBub2RlPWZ1bmNfbm9kZSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX25vbl9wcm9wZXJ0eV9yZXR1cm5fdHlwZV9nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBjbGFzcyBmdW5jdGlvbiB0cnlpbmcgdG8gdXNlIGB0eXBlYCBhcyByZXR1cm4KKyAgICAgICAgZG9jdW1lbnRhdGlvbiBpbiBhIEdvb2dsZSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGZ1bmNfbm9kZSwgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAnJydpbnQ6IGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICAgICAgUnVudGltZUVycm9yOiBBbHdheXMKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAgICAgICAgIHJldHVybiAxMCAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9ZnVuY19ub2RlKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi10eXBlLWRvYyIsIG5vZGU9ZnVuY19ub2RlKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4obm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfbm9uX3Byb3BlcnR5X3JldHVybl90eXBlX251bXB5KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgY2xhc3MgZnVuY3Rpb24gdHJ5aW5nIHRvIHVzZSBgdHlwZWAgYXMgcmV0dXJuCisgICAgICAgIGRvY3VtZW50YXRpb24gaW4gYSBudW1weSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGZ1bmNfbm9kZSwgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogI0AKKyAgICAgICAgICAgICAgICAnJydpbnQ6IGRvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgICAgICBBbHdheXMKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAgICAgICAgIHJldHVybiAxMCAjQAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9ZnVuY19ub2RlKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi10eXBlLWRvYyIsIG5vZGU9ZnVuY19ub2RlKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4obm9kZSkKKworICAgIGRlZiB0ZXN0X25vbl9wcm9wZXJ0eV9hbm5vdGF0aW9uX3JldHVybl90eXBlX251bXB5KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgY2xhc3MgZnVuY3Rpb24gdHJ5aW5nIHRvIHVzZSBgdHlwZWAgYXMgcmV0dXJuCisgICAgICAgIGRvY3VtZW50YXRpb24gaW4gYSBudW1weSBzdHlsZSBkb2NzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGZ1bmNfbm9kZSwgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKSAtPiBpbnQ6ICNACisgICAgICAgICAgICAgICAgJycnaW50OiBkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgICAgICAtLS0tLS0KKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQWx3YXlzCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi1kb2MiLCBub2RlPWZ1bmNfbm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4obm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfcmV0dXJuX2luX2Fic3RyYWN0X21ldGhvZF9zcGhpbngoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYW4gYWJzdHJhY3QgbWV0aG9kIGRvY3VtZW50aW5nIHRoZSByZXR1cm4gdHlwZSB0aGF0IGFuCisgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGFiYworICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgOnJldHVybnM6IFRlbgorICAgICAgICAgICAgICAgIDpydHlwZTogaW50CisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcmV0dXJuIDEwCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfcmV0dXJuX2luX2Fic3RyYWN0X21ldGhvZF9nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYW4gYWJzdHJhY3QgbWV0aG9kIGRvY3VtZW50aW5nIHRoZSByZXR1cm4gdHlwZSB0aGF0IGFuCisgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGFiYworICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICAgICAgaW50OiBUZW4KKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19yZXR1cm5faW5fYWJzdHJhY3RfbWV0aG9kX251bXB5KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGFuIGFic3RyYWN0IG1ldGhvZCBkb2N1bWVudGluZyB0aGUgcmV0dXJuIHR5cGUgdGhhdCBhbgorICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBhYmMKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiAjQAorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFJldHVybnMKKyAgICAgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgaW50CisgICAgICAgICAgICAgICAgICAgIFRlbgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX3JhaXNlX25vdGltcGxlbWVudGVkZXJyb3Jfc3BoaW54KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGFuIGFic3RyYWN0IiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgYXJnKTogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICA6cGFyYW0gYXJnOiBBbiBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICA6dHlwZSBhcmc6IGludAorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX3JldHVybl9pbl9hYnN0cmFjdF9tZXRob2RfZ29vZ2xlXzIoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBtZXRob2QgZG9jdW1lbnRpbmcgdGhlIHJldHVybiB0eXBlIHRoYXQgYW4KKyAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVybi4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgYXJnKTogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgICAgICBhcmcgKGludCk6IEFuIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX3JldHVybl9pbl9hYnN0cmFjdF9tZXRob2RfbnVtcHlfMihzZWxmKToKKyAgICAgICAgIiIiRXhhbXBsZSBvZiBhIG1ldGhvZCBkb2N1bWVudGluZyB0aGUgcmV0dXJuIHR5cGUgdGhhdCBhbgorICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuLgorICAgICAgICAiIiIKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCBhcmcpOiAjQAorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAtLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgYXJnIDogaW50CisgICAgICAgICAgICAgICAgICAgIEFuIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX2lnbm9yZWRfYXJndW1lbnRfbmFtZXNfc3BoaW54KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgbWV0aG9kIGRvY3VtZW50aW5nIHRoZSByZXR1cm4gdHlwZSB0aGF0IGFuCisgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsIGFyZywgXyk6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgOnBhcmFtIGFyZzogQW4gYXJndW1lbnQuCisgICAgICAgICAgICAgICAgOnR5cGUgYXJnOiBpbnQKKyAgICAgICAgICAgICAgICAnJycKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfaWdub3JlZF9hcmd1bWVudF9uYW1lc19nb29nbGUoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBtZXRob2QgZG9jdW1lbnRpbmcgdGhlIHJldHVybiB0eXBlIHRoYXQgYW4KKyAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVybi4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgYXJnLCBfKTogI0AKKyAgICAgICAgICAgICAgICAnJydkb2NzdHJpbmcgLi4uCisKKyAgICAgICAgICAgICAgICBBcmdzOgorICAgICAgICAgICAgICAgICAgICBhcmcgKGludCk6IEFuIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19pZ25vcmVkX2FyZ3VtZW50X25hbWVzX251bXB5KHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgbWV0aG9kIGRvY3VtZW50aW5nIHRoZSByZXR1cm4gdHlwZSB0aGF0IGFuCisgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsIGFyZywgXyk6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBhcmcgOiBpbnQKKyAgICAgICAgICAgICAgICAgICAgQW4gYXJndW1lbnQuCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF91c2VsZXNzX2RvY3NfaWdub3JlZF9hcmd1bWVudF9uYW1lc19zcGhpbngoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBtZXRob2QgZG9jdW1lbnRpbmcgdGhlIHJldHVybiB0eXBlIHRoYXQgYW4KKyAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVybi4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgYXJnLCBfLCBfaWdub3JlZCk6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgOnBhcmFtIGFyZzogQW4gYXJndW1lbnQuCisgICAgICAgICAgICAgICAgOnR5cGUgYXJnOiBpbnQKKworICAgICAgICAgICAgICAgIDpwYXJhbSBfOiBBbm90aGVyIGFyZ3VtZW50LgorICAgICAgICAgICAgICAgIDp0eXBlIF86IGZsb2F0CisKKyAgICAgICAgICAgICAgICA6cGFyYW0gX2lnbm9yZWQ6IElnbm9yZWQgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InVzZWxlc3MtcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiXywgX2lnbm9yZWQiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InVzZWxlc3MtdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJfIiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfdXNlbGVzc19kb2NzX2lnbm9yZWRfYXJndW1lbnRfbmFtZXNfZ29vZ2xlKHNlbGYpOgorICAgICAgICAiIiJFeGFtcGxlIG9mIGEgbWV0aG9kIGRvY3VtZW50aW5nIHRoZSByZXR1cm4gdHlwZSB0aGF0IGFuCisgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4uCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsIGFyZywgXywgX2lnbm9yZWQpOiAjQAorICAgICAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgICAgIGFyZyAoaW50KTogQW4gYXJndW1lbnQuCisgICAgICAgICAgICAgICAgICAgIF8gKGZsb2F0KTogQW5vdGhlciBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgX2lnbm9yZWQ6IElnbm9yZWQgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgJycnCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InVzZWxlc3MtcGFyYW0tZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiXywgX2lnbm9yZWQiLCkpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InVzZWxlc3MtdHlwZS1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJfIiwpKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfdXNlbGVzc19kb2NzX2lnbm9yZWRfYXJndW1lbnRfbmFtZXNfbnVtcHkoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBtZXRob2QgZG9jdW1lbnRpbmcgdGhlIHJldHVybiB0eXBlIHRoYXQgYW4KKyAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVybi4KKyAgICAgICAgIiIiCisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgYXJnLCBfLCBfaWdub3JlZCk6ICNACisgICAgICAgICAgICAgICAgJycnZG9jc3RyaW5nIC4uLgorCisgICAgICAgICAgICAgICAgUGFyYW1ldGVycworICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBhcmcgOiBpbnQKKyAgICAgICAgICAgICAgICAgICAgQW4gYXJndW1lbnQuCisKKyAgICAgICAgICAgICAgICBfIDogZmxvYXQKKyAgICAgICAgICAgICAgICAgICAgQW5vdGhlciBhcmd1bWVudC4KKworICAgICAgICAgICAgICAgIF9pZ25vcmVkIDoKKyAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBBcmd1bWVudAorICAgICAgICAgICAgICAgICcnJworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJ1c2VsZXNzLXBhcmFtLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIl8sIF9pZ25vcmVkIiwpKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJ1c2VsZXNzLXR5cGUtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiXyIsKSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIEBzZXRfY29uZmlnKG5vX2RvY3N0cmluZ19yZ3g9ciJeXyg/IV8pLiokIikKKyAgICBkZWYgdGVzdF9za2lwX25vX2RvY3N0cmluZ19yZ3goc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGRlZmF1bHQgJ25vLWRvY3N0cmluZy1yZ3gnIGNvbmZpZyBvcHRpb24KKworICAgICAgICBObyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIF9wcml2YXRlX2Z1bmN0aW9uX2Zvbyh4LCB5KToKKyAgICAgICAgICAgICcnJ2RvY3N0cmluZyAuLi4KKworICAgICAgICAgICAgbWlzc2luZyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbicnJworICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhkb2NzdHJpbmdfbWluX2xlbmd0aD0zKQorICAgIGRlZiB0ZXN0X3NraXBfZG9jc3RyaW5nX21pbl9sZW5ndGgoc2VsZik6CisgICAgICAgICIiIkV4YW1wbGUgb2YgYSBmdW5jdGlvbiB0aGF0IGlzIGxlc3MgdGhhbiAnZG9jc3RyaW5nLW1pbi1sZW5ndGgnIGNvbmZpZyBvcHRpb24KKworICAgICAgICBObyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQuCisgICAgICAgICIiIgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZ1bmN0aW9uX2Zvbyh4LCB5KToKKyAgICAgICAgICAgICcnJ2Z1bmN0aW9uIGlzIHRvbyBzaG9ydCBhbmQgaXMgbWlzc2luZyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbicnJworICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCmRpZmYgLS1naXQgYS90ZXN0cy9leHRlbnNpb25zL3Rlc3RfY2hlY2tfZG9jc191dGlscy5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19kb2NzX3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YTJlYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3RfY2hlY2tfZG9jc191dGlscy5weQpAQCAtMCwwICsxLDE0OSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMTksIDIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJVbml0IHRlc3RzIGZvciB0aGUgcHlsaW50IGNoZWNrZXJzIGluIDptb2Q6YHB5bGludC5leHRlbnNpb25zLmNoZWNrX2RvY3NgLAoraW4gcGFydGljdWxhciB0aGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24gY2hlY2tlciBgRG9jc3RyaW5nQ2hlY2tlcmAKKyIiIgoraW1wb3J0IGFzdHJvaWQKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQuZXh0ZW5zaW9ucyBpbXBvcnQgX2NoZWNrX2RvY3NfdXRpbHMgYXMgdXRpbHMKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgInN0cmluZyxjb3VudCIsCisgICAgWygiYWJjIiwgMCksICgiIiwgMCksICgiICBhYmMiLCAyKSwgKCJcbiAgYWJjIiwgMCksICgiICAgXG4gIGFiYyIsIDMpXSwKKykKK2RlZiB0ZXN0X3NwYWNlX2luZGVudGF0aW9uKHN0cmluZywgY291bnQpOgorICAgICIiIlRlc3QgZm9yIHB5bGludF9wbHVnaW4uUGFyYW1Eb2NDaGVja2VyIiIiCisgICAgYXNzZXJ0IHV0aWxzLnNwYWNlX2luZGVudGF0aW9uKHN0cmluZykgPT0gY291bnQKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgInJhaXNlX25vZGUsZXhwZWN0ZWQiLAorICAgIFsKKyAgICAgICAgKAorICAgICAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgIiIiCisgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciAjQAorICAgICIiIgorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIHsiTm90SW1wbGVtZW50ZWRFcnJvciJ9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICAgICAiIiIKKyAgICBkZWYgbXlfZnVuYygpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJOb3QgaW1wbGVtZW50ZWQhIikgI0AKKyAgICAiIiIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICB7Ik5vdEltcGxlbWVudGVkRXJyb3IifSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgIiIiCisgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlICNACisgICAgIiIiCisgICAgICAgICAgICApLAorICAgICAgICAgICAgeyJSdW50aW1lRXJyb3IifSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgIiIiCisgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIGlmIGFub3RoZXJfZnVuYygpOgorICAgICAgICAgICAgICAgIHJhaXNlICNACisgICAgIiIiCisgICAgICAgICAgICApLAorICAgICAgICAgICAgeyJSdW50aW1lRXJyb3IifSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgIiIiCisgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhbm90aGVyX2Z1bmMoKQorICAgICAgICAgICAgICAgIHJhaXNlICNACisgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAiIiIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICB7IlJ1bnRpbWVFcnJvciJ9LAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICAgICAiIiIKKyAgICBkZWYgbXlfZnVuYygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWtlX2Z1bmMoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFub3RoZXJfZnVuYygpCisgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlICNACisgICAgIiIiCisgICAgICAgICAgICApLAorICAgICAgICAgICAgeyJOYW1lRXJyb3IifSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgIiIiCisgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmFpc2UgI0AKKyAgICAiIiIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBzZXQoKSwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAgICAgIiIiCisgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgZXhjZXB0IChSdW50aW1lRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgI0AKKyAgICAiIiIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICB7IlJ1bnRpbWVFcnJvciIsICJWYWx1ZUVycm9yIn0sCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgIGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgICAgICIiIgorICAgIGltcG9ydCBub3RfYV9tb2R1bGUKKyAgICBkZWYgbXlfZnVuYygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWtlX2Z1bmMoKQorICAgICAgICBleGNlcHQgbm90X2FfbW9kdWxlLkVycm9yOgorICAgICAgICAgICAgcmFpc2UgI0AKKyAgICAiIiIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBzZXQoKSwKKyAgICAgICAgKSwKKyAgICBdLAorKQorZGVmIHRlc3RfZXhjZXB0aW9uKHJhaXNlX25vZGUsIGV4cGVjdGVkKToKKyAgICBmb3VuZCA9IHV0aWxzLnBvc3NpYmxlX2V4Y190eXBlcyhyYWlzZV9ub2RlKQorICAgIGFzc2VydCBmb3VuZCA9PSBleHBlY3RlZApkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NoZWNrX21jY2FiZS5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19tY2NhYmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjYjM0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19tY2NhYmUucHkKQEAgLTAsMCArMSw2NiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBNb2lzZXMgTG9wZXogPG1veWxvcDI2MEB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdHMgZm9yIHRoZSBweWxpbnQgY2hlY2tlciBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5jaGVja19tY2NhYmUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1vdXRlci1uYW1lCisKK2Zyb20gb3MgaW1wb3J0IHBhdGggYXMgb3NwCisKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQuZXh0ZW5zaW9ucyBpbXBvcnQgbWNjYWJlCisKK0VYUEVDVEVEX01TR1MgPSBbCisgICAgIidmMScgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDEiLAorICAgICInZjInIGlzIHRvbyBjb21wbGV4LiBUaGUgTWNDYWJlIHJhdGluZyBpcyAxIiwKKyAgICAiJ2YzJyBpcyB0b28gY29tcGxleC4gVGhlIE1jQ2FiZSByYXRpbmcgaXMgMyIsCisgICAgIidmNCcgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDIiLAorICAgICInZjUnIGlzIHRvbyBjb21wbGV4LiBUaGUgTWNDYWJlIHJhdGluZyBpcyAyIiwKKyAgICAiJ2Y2JyBpcyB0b28gY29tcGxleC4gVGhlIE1jQ2FiZSByYXRpbmcgaXMgMiIsCisgICAgIidmNycgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDMiLAorICAgICInZjgnIGlzIHRvbyBjb21wbGV4LiBUaGUgTWNDYWJlIHJhdGluZyBpcyA0IiwKKyAgICAiJ2Y5JyBpcyB0b28gY29tcGxleC4gVGhlIE1jQ2FiZSByYXRpbmcgaXMgOSIsCisgICAgIidtZXRob2QxJyBpcyB0b28gY29tcGxleC4gVGhlIE1jQ2FiZSByYXRpbmcgaXMgMSIsCisgICAgIlRoaXMgJ2ZvcicgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDQiLAorICAgICInbWV0aG9kMycgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDIiLAorICAgICInZjEwJyBpcyB0b28gY29tcGxleC4gVGhlIE1jQ2FiZSByYXRpbmcgaXMgMTEiLAorICAgICInbWV0aG9kMicgaXMgdG9vIGNvbXBsZXguIFRoZSBNY0NhYmUgcmF0aW5nIGlzIDE4IiwKK10KKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgZW5hYmxlKCk6CisgICAgcmV0dXJuIFsidG9vLWNvbXBsZXgiXQorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiBkaXNhYmxlKCk6CisgICAgcmV0dXJuIFsiYWxsIl0KKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgcmVnaXN0ZXIoKToKKyAgICByZXR1cm4gbWNjYWJlLnJlZ2lzdGVyCisKKworQHB5dGVzdC5maXh0dXJlCitkZWYgZm5hbWVfbWNjYWJlX2V4YW1wbGUoKToKKyAgICByZXR1cm4gb3NwLmpvaW4ob3NwLmRpcm5hbWUob3NwLmFic3BhdGgoX19maWxlX18pKSwgImRhdGEiLCAibWNjYWJlLnB5IikKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgImNvbXBsZXhpdHksIGV4cGVjdGVkIiwgWygwLCBFWFBFQ1RFRF9NU0dTKSwgKDksIEVYUEVDVEVEX01TR1NbLTI6XSldCispCitkZWYgdGVzdF9tYXhfbWNjYWJlX3JhdGUobGludGVyLCBmbmFtZV9tY2NhYmVfZXhhbXBsZSwgY29tcGxleGl0eSwgZXhwZWN0ZWQpOgorICAgIGxpbnRlci5nbG9iYWxfc2V0X29wdGlvbigibWF4LWNvbXBsZXhpdHkiLCBjb21wbGV4aXR5KQorICAgIGxpbnRlci5jaGVjayhbZm5hbWVfbWNjYWJlX2V4YW1wbGVdKQorICAgIHJlYWxfbXNncyA9IFttZXNzYWdlLm1zZyBmb3IgbWVzc2FnZSBpbiBsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXNdCisgICAgYXNzZXJ0IHNvcnRlZChleHBlY3RlZCkgPT0gc29ydGVkKHJlYWxfbXNncykKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19yYWlzZV9kb2NzLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NoZWNrX3JhaXNlX2RvY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzZDQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19yYWlzZV9kb2NzLnB5CkBAIC0wLDAgKzEsOTAxIEBACisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IEppbSBSb2JlcnRzb24gPGpyb2JlcnRzb245OGF0eEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBBZGFtIERhbmdvb3IgPGFkYW1kYW5nb29yQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IERhbm55IEhlcm1lcyA8ZGFuaWVsLmouaGVybWVzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJVbml0IHRlc3RzIGZvciB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBkb2N1bWVudGF0aW9uIGNoZWNraW5nIGluIHRoZQorYERvY3N0cmluZ0NoZWNrZXJgIGluIDptb2Q6YHB5bGludC5leHRlbnNpb25zLmNoZWNrX2RvY3NgCisiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktcHVibGljLW1ldGhvZHMKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuZXh0ZW5zaW9ucy5kb2NwYXJhbXMgaW1wb3J0IERvY3N0cmluZ1BhcmFtZXRlckNoZWNrZXIKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgQ2hlY2tlclRlc3RDYXNlLCBNZXNzYWdlLCBzZXRfY29uZmlnCisKKworY2xhc3MgVGVzdERvY3N0cmluZ0NoZWNrZXJSYWlzZShDaGVja2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBweWxpbnRfcGx1Z2luLlJhaXNlRG9jQ2hlY2tlciIiIgorCisgICAgQ0hFQ0tFUl9DTEFTUyA9IERvY3N0cmluZ1BhcmFtZXRlckNoZWNrZXIKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfbm9fZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ2hpJykgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc191bmtub3duX3N0eWxlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLiIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJhaXNlX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgQHNldF9jb25maWcoYWNjZXB0X25vX3JhaXNlX2RvYz1GYWxzZSkKKyAgICBkZWYgdGVzdF93YXJuc191bmtub3duX3N0eWxlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLiIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJhaXNlX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJSdW50aW1lRXJyb3IiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbWlzc2luZ19zcGhpbnhfcmFpc2VzKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIE5hbWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpCisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgcmFpc2Vfbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmFpc2VzLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIlJ1bnRpbWVFcnJvciIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9taXNzaW5nX2dvb2dsZV9yYWlzZXMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICBOYW1lRXJyb3I6IE5ldmVyCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignaGknKQorICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJhaXNlX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJSdW50aW1lRXJyb3IiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZ29vZ2xlX2F0dHJfcmFpc2VzX2V4YWN0X2V4YyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGdvb2dsZSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICByZS5lcnJvcjogU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgcmFpc2UgcmUuZXJyb3IoJ2hpJykgICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZ29vZ2xlX2F0dHJfcmFpc2VzX3N1YnN0cl9leGMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBnb29nbGUgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgcmUuZXJyb3I6IFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBmcm9tIHJlIGltcG9ydCBlcnJvcgorICAgICAgICAgICAgcmFpc2UgZXJyb3IoJ2hpJykgICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfdmFsaWRfbWlzc2luZ19nb29nbGVfYXR0cl9yYWlzZXMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBnb29nbGUgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgcmUuYW5vdGhlcmVycm9yOiBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZnJvbSByZSBpbXBvcnQgZXJyb3IKKyAgICAgICAgICAgIHJhaXNlIGVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJhaXNlX25vZGUgPSBub2RlLmJvZHlbMV0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJlcnJvciIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9pbnZhbGlkX21pc3NpbmdfZ29vZ2xlX2F0dHJfcmFpc2VzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZ29vZ2xlIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmFpc2VzOgorICAgICAgICAgICAgICAgIGJvZ3VzbW9kdWxlLmVycm9yOiBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZnJvbSByZSBpbXBvcnQgZXJyb3IKKyAgICAgICAgICAgIHJhaXNlIGVycm9yKCdoaScpICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgICMgcHlsaW50IGFsbG93cyB0aGlzIHRvIHBhc3Mgc2luY2UgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBSYWlzZXMgYW5kCisgICAgICAgICMgcmFpc2UgYXJlIGJhc2VkIG9uIHRoZSBjbGFzcyBuYW1lLCBub3QgdGhlIHF1YWxpZmllZCBuYW1lLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9nb29nbGVfcmFpc2VzX2xvY2FsX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGdvb2dsZSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICAuTG9jYWxFeGNlcHRpb246IEFsd2F5cworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBmcm9tIG5laWdoYm9yX21vZHVsZSBpbXBvcnQgTG9jYWxFeGNlcHRpb24KKyAgICAgICAgICAgIHJhaXNlIExvY2FsRXhjZXB0aW9uKCdoaScpICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgICMgcHlsaW50IGFsbG93cyB0aGlzIHRvIHBhc3Mgc2luY2UgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiBSYWlzZXMgYW5kCisgICAgICAgICMgcmFpc2UgYXJlIGJhc2VkIG9uIHRoZSBjbGFzcyBuYW1lLCBub3QgdGhlIHF1YWxpZmllZCBuYW1lLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhhY2NlcHRfbm9fcmFpc2VfZG9jPUZhbHNlKQorICAgIGRlZiB0ZXN0X2dvb2dsZV9yYWlzZXNfd2l0aF9wcmVmaXgoc2VsZik6CisgICAgICAgIGNvZGVfc25pcHBldCA9ICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBnb29nbGUgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAge3ByZWZpeH1yZS5lcnJvcjogU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgcmFpc2UgcmUuZXJyb3IoJ2hpJykgI0AKKyAgICAgICAgJycnCisgICAgICAgIGZvciBwcmVmaXggaW4gKCJ+IiwgIiEiKToKKyAgICAgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShjb2RlX3NuaXBwZXQuZm9ybWF0KHByZWZpeD1wcmVmaXgpKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbWlzc2luZ19udW1weV9yYWlzZXMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgLS0tLS0tCisgICAgICAgICAgICBOYW1lRXJyb3IKKyAgICAgICAgICAgICAgICBOZXZlcgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ2hpJykKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICByYWlzZV9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiUnVudGltZUVycm9yIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVfc3B1cmlvdXNfc3BoaW54X3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJhaXNlcyBSdW50aW1lRXJyb3I6IEFsd2F5cworICAgICAgICAgICAgOmV4Y2VwdCBOYW1lRXJyb3I6IE5ldmVyCisgICAgICAgICAgICA6cmFpc2UgT1NFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgIDpleGNlcHRpb24gVmFsdWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdCbGFoJykgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9hbGxfc3BoaW54X3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJhaXNlcyBSdW50aW1lRXJyb3I6IEFsd2F5cworICAgICAgICAgICAgOmV4Y2VwdCBOYW1lRXJyb3I6IE5ldmVyCisgICAgICAgICAgICA6cmFpc2UgT1NFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgIDpleGNlcHRpb24gVmFsdWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpICNACisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykKKyAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoMiwgJ2Fib3J0IScpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmb28nKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX2FsbF9nb29nbGVfcmFpc2VzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yOiBBbHdheXMKKyAgICAgICAgICAgICAgICBOYW1lRXJyb3I6IE5ldmVyCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignaGknKSAjQAorICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfYWxsX251bXB5X3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmFpc2VzCisgICAgICAgICAgICAtLS0tLS0KKyAgICAgICAgICAgIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgIEFsd2F5cworICAgICAgICAgICAgTmFtZUVycm9yCisgICAgICAgICAgICAgICAgTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpICNACisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9tdWx0aXBsZV9zcGhpbnhfcmFpc2VzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIFJ1bnRpbWVFcnJvcjogQWx3YXlzCisgICAgICAgICAgICA6cmFpc2VzIE5hbWVFcnJvciwgT1NFcnJvciwgVmFsdWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpCisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykgI0AKKyAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoMiwgJ2Fib3J0IScpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmb28nKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX211bHRpcGxlX2dvb2dsZV9yYWlzZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3I6IEFsd2F5cworICAgICAgICAgICAgICAgIE5hbWVFcnJvciwgT1NFcnJvciwgVmFsdWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpCisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykgI0AKKyAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoMiwgJ2Fib3J0IScpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmb28nKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19yZXRocm93bl9zcGhpbnhfcmFpc2VzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIE5hbWVFcnJvcjogU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmYWtlX2Z1bmMoKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSAjQAorCisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgbm9kZSA9IHJhaXNlX25vZGUuZnJhbWUoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmFpc2VzLWRvYyIsIG5vZGU9bm9kZSwgYXJncz0oIlJ1bnRpbWVFcnJvciIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9yZXRocm93bl9nb29nbGVfcmFpc2VzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXM6CisgICAgICAgICAgICAgICAgTmFtZUVycm9yOiBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZha2VfZnVuYygpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlICNACisKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICBub2RlID0gcmFpc2Vfbm9kZS5mcmFtZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiUnVudGltZUVycm9yIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3JldGhyb3duX251bXB5X3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmFpc2VzCisgICAgICAgICAgICAtLS0tLS0KKyAgICAgICAgICAgIE5hbWVFcnJvcgorICAgICAgICAgICAgICAgIFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgI0AKKworICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIG5vZGUgPSByYWlzZV9ub2RlLmZyYW1lKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJSdW50aW1lRXJyb3IiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX3JldGhyb3duX3NwaGlueF9tdWx0aXBsZV9yYWlzZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyYWlzZXMgTmFtZUVycm9yOiBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZha2VfZnVuYygpCisgICAgICAgICAgICBleGNlcHQgKFJ1bnRpbWVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgI0AKKworICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIG5vZGUgPSByYWlzZV9ub2RlLmZyYW1lKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLAorICAgICAgICAgICAgICAgIG5vZGU9bm9kZSwKKyAgICAgICAgICAgICAgICBhcmdzPSgiUnVudGltZUVycm9yLCBWYWx1ZUVycm9yIiwpLAorICAgICAgICAgICAgKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3JldGhyb3duX2dvb2dsZV9tdWx0aXBsZV9yYWlzZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICBOYW1lRXJyb3I6IFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmFrZV9mdW5jKCkKKyAgICAgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSAjQAorCisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IoJ2hpJykKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgbm9kZSA9IHJhaXNlX25vZGUuZnJhbWUoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtc2dfaWQ9Im1pc3NpbmctcmFpc2VzLWRvYyIsCisgICAgICAgICAgICAgICAgbm9kZT1ub2RlLAorICAgICAgICAgICAgICAgIGFyZ3M9KCJSdW50aW1lRXJyb3IsIFZhbHVlRXJyb3IiLCksCisgICAgICAgICAgICApCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcmV0aHJvd25fbnVtcHlfbXVsdGlwbGVfcmFpc2VzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgTmFtZUVycm9yCisgICAgICAgICAgICAgICAgU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmYWtlX2Z1bmMoKQorICAgICAgICAgICAgZXhjZXB0IChSdW50aW1lRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlICNACisKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICBub2RlID0gcmFpc2Vfbm9kZS5mcmFtZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwKKyAgICAgICAgICAgICAgICBub2RlPW5vZGUsCisgICAgICAgICAgICAgICAgYXJncz0oIlJ1bnRpbWVFcnJvciwgVmFsdWVFcnJvciIsKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19jYXVnaHRfc3BoaW54X3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJhaXNlcyBOYW1lRXJyb3I6IFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpICNACisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfY2F1Z2h0X2dvb2dsZV9yYWlzZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlczoKKyAgICAgICAgICAgICAgICBOYW1lRXJyb3I6IFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpICNACisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfY2F1Z2h0X251bXB5X3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIG51bXB5IGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmFpc2VzCisgICAgICAgICAgICAtLS0tLS0KKyAgICAgICAgICAgIE5hbWVFcnJvcgorICAgICAgICAgICAgICAgIFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoaScpICNACisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbnVtcHlfYXR0cl9yYWlzZXNfZXhhY3RfZXhjKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgbnVtcHkgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgcmUuZXJyb3IKKyAgICAgICAgICAgICAgICBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaW1wb3J0IHJlCisgICAgICAgICAgICByYWlzZSByZS5lcnJvcignaGknKSAgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9udW1weV9hdHRyX3JhaXNlc19zdWJzdHJfZXhjKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgbnVtcHkgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAgcmUuZXJyb3IKKyAgICAgICAgICAgICAgICBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZnJvbSByZSBpbXBvcnQgZXJyb3IKKyAgICAgICAgICAgIHJhaXNlIGVycm9yKCdoaScpICAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3ZhbGlkX21pc3NpbmdfbnVtcHlfYXR0cl9yYWlzZXMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBudW1weSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgLS0tLS0tCisgICAgICAgICAgICByZS5hbm90aGVyZXJyb3IKKyAgICAgICAgICAgICAgICBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZnJvbSByZSBpbXBvcnQgZXJyb3IKKyAgICAgICAgICAgIHJhaXNlIGVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJhaXNlX25vZGUgPSBub2RlLmJvZHlbMV0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJhaXNlcy1kb2MiLCBub2RlPW5vZGUsIGFyZ3M9KCJlcnJvciIsKSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9pbnZhbGlkX21pc3NpbmdfbnVtcHlfYXR0cl9yYWlzZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBudW1weSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJhaXNlcworICAgICAgICAgICAgLS0tLS0tCisgICAgICAgICAgICBib2d1c21vZHVsZS5lcnJvcgorICAgICAgICAgICAgICAgIFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBmcm9tIHJlIGltcG9ydCBlcnJvcgorICAgICAgICAgICAgcmFpc2UgZXJyb3IoJ2hpJykgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgIyBweWxpbnQgYWxsb3dzIHRoaXMgdG8gcGFzcyBzaW5jZSB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIFJhaXNlcyBhbmQKKyAgICAgICAgIyByYWlzZSBhcmUgYmFzZWQgb24gdGhlIGNsYXNzIG5hbWUsIG5vdCB0aGUgcXVhbGlmaWVkIG5hbWUuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIEBzZXRfY29uZmlnKGFjY2VwdF9ub19yYWlzZV9kb2M9RmFsc2UpCisgICAgZGVmIHRlc3RfbnVtcHlfcmFpc2VzX3dpdGhfcHJlZml4KHNlbGYpOgorICAgICAgICBjb2RlX3NuaXBwZXQgPSAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgbnVtcHkgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSYWlzZXMKKyAgICAgICAgICAgIC0tLS0tLQorICAgICAgICAgICAge3ByZWZpeH1yZS5lcnJvcgorICAgICAgICAgICAgICAgIFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgIHJhaXNlIHJlLmVycm9yKCdoaScpICNACisgICAgICAgICcnJworICAgICAgICBmb3IgcHJlZml4IGluICgifiIsICIhIik6CisgICAgICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoY29kZV9zbmlwcGV0LmZvcm1hdChwcmVmaXg9cHJlZml4KSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX21pc3Npbmdfc3BoaW54X3JhaXNlc19pbmZlcl9mcm9tX2luc3RhbmNlKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIE5hbWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgbXlfZXhjZXB0aW9uID0gUnVudGltZUVycm9yKCdoaScpCisgICAgICAgICAgICByYWlzZSBteV9leGNlcHRpb24gI0AKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICBub2RlID0gcmFpc2Vfbm9kZS5mcmFtZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiUnVudGltZUVycm9yIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX21pc3Npbmdfc3BoaW54X3JhaXNlc19pbmZlcl9mcm9tX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIE5hbWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZGVmIGV4X2Z1bmModmFsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gUnVudGltZUVycm9yKHZhbCkKKyAgICAgICAgICAgIHJhaXNlIGV4X2Z1bmMoJ2hpJykgI0AKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICBub2RlID0gcmFpc2Vfbm9kZS5mcmFtZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiUnVudGltZUVycm9yIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3NwaGlueF9hdHRyX3JhaXNlc19leGFjdF9leGMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBzcGhpbnggZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIHJlLmVycm9yOiBTb21ldGltZXMKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaW1wb3J0IHJlCisgICAgICAgICAgICByYWlzZSByZS5lcnJvcignaGknKSAgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9zcGhpbnhfYXR0cl9yYWlzZXNfc3Vic3RyX2V4YyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIHNwaGlueCBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyYWlzZXMgcmUuZXJyb3I6IFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBmcm9tIHJlIGltcG9ydCBlcnJvcgorICAgICAgICAgICAgcmFpc2UgZXJyb3IoJ2hpJykgICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfdmFsaWRfbWlzc2luZ19zcGhpbnhfYXR0cl9yYWlzZXMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBzcGhpbnggZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIHJlLmFub3RoZXJlcnJvcjogU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGZyb20gcmUgaW1wb3J0IGVycm9yCisgICAgICAgICAgICByYWlzZSBlcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICByYWlzZV9ub2RlID0gbm9kZS5ib2R5WzFdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiZXJyb3IiLCkpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfaW52YWxpZF9taXNzaW5nX3NwaGlueF9hdHRyX3JhaXNlcyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIHNwaGlueCBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyYWlzZXMgYm9ndXNtb2R1bGUuZXJyb3I6IFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBmcm9tIHJlIGltcG9ydCBlcnJvcgorICAgICAgICAgICAgcmFpc2UgZXJyb3IoJ2hpJykgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgIyBweWxpbnQgYWxsb3dzIHRoaXMgdG8gcGFzcyBzaW5jZSB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIFJhaXNlcyBhbmQKKyAgICAgICAgIyByYWlzZSBhcmUgYmFzZWQgb24gdGhlIGNsYXNzIG5hbWUsIG5vdCB0aGUgcXVhbGlmaWVkIG5hbWUuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIEBzZXRfY29uZmlnKGFjY2VwdF9ub19yYWlzZV9kb2M9RmFsc2UpCisgICAgZGVmIHRlc3Rfc3BoaW54X3JhaXNlc193aXRoX3ByZWZpeChzZWxmKToKKyAgICAgICAgY29kZV9zbmlwcGV0ID0gJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIHNwaGlueCBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyYWlzZXMge3ByZWZpeH1yZS5lcnJvcjogU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgcmFpc2UgcmUuZXJyb3IoJ2hpJykgI0AKKyAgICAgICAgJycnCisgICAgICAgIGZvciBwcmVmaXggaW4gKCJ+IiwgIiEiKToKKyAgICAgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShjb2RlX3NuaXBwZXQuZm9ybWF0KHByZWZpeD1wcmVmaXgpKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX3JhaXNlX3VuaW5mZXJhYmxlKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZnJvbSB1bmtub3duIGltcG9ydCBVbmtub3duCisKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmFpc2VzIE5hbWVFcnJvcjogTmV2ZXIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmFpc2UgVW5rbm93bignaGknKSAjQAorICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yKCdoaScpCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfcmV0dXJuc19mcm9tX2lubmVyX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJhaXNlcyBOYW1lRXJyb3I6IE5ldmVyCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGRlZiBleF9mdW5jKHZhbCk6CisgICAgICAgICAgICAgICAgZGVmIGlubmVyX2Z1bmModmFsdWUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1NFcnJvcih2YWx1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUnVudGltZUVycm9yKHZhbCkKKyAgICAgICAgICAgIHJhaXNlIGV4X2Z1bmMoJ2hpJykgI0AKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvcignaGknKQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICBub2RlID0gcmFpc2Vfbm9kZS5mcmFtZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yYWlzZXMtZG9jIiwgbm9kZT1ub2RlLCBhcmdzPSgiUnVudGltZUVycm9yIiwpKQorICAgICAgICApOgorICAgICAgICAgICAgIyB3ZSBkbyBOT1QgZXhwZWN0IGEgd2FybmluZyBhYm91dCB0aGUgT1NFcnJvciBpbiBpbm5lcl9mdW5jIQorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX3JldHVybnNfdXNlX29ubHlfbmFtZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlmdW5jKCk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nCisKKyAgICAgICAgICAgIDpyYWlzZXMgTmFtZUVycm9yOiBOZXZlcgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBkZWYgaW5uZXJfZnVuYygpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgICAgICByYWlzZSBpbm5lcl9mdW5jKCkgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yYWlzZShyYWlzZV9ub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19yZXR1cm5zX3VzZV9vbmx5X2V4Y2VwdGlvbl9pbnN0YW5jZXMoc2VsZik6CisgICAgICAgIHJhaXNlX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlmdW5jKCk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nCisKKyAgICAgICAgICAgIDpyYWlzZXMgTXlFeGNlcHRpb246IE5ldmVyCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNsYXNzIE15RXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIGlubmVyX2Z1bmMoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTXlFeGNlcHRpb24KKworICAgICAgICAgICAgcmFpc2UgaW5uZXJfZnVuYygpICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X25vX2NyYXNoX3doZW5faW5mZXJyaW5nX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgaW1wb3J0IGNvbGxlY3Rpb25zCisKKyAgICAgICAgZGVmIHRlc3QoKToKKyAgICAgICAgICAgIiIicmFpc2VzCisKKyAgICAgICAgICAgOnJhaXNlIFU6IHBhc3MKKyAgICAgICAgICAgIiIiCisgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICBleGNlcHQgY29sbGVjdGlvbnMuVSBhcyBleGM6CisgICAgICAgICAgICAgIHJhaXNlICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKKworICAgIGRlZiB0ZXN0X25vX2NyYXNoX3doZW5fY2FudF9maW5kX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgcmFpc2Vfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGltcG9ydCBjb2xsZWN0aW9ucworCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICIiInJhaXNlcworCisgICAgICAgICAgIDpyYWlzZSBVOiBwYXNzCisgICAgICAgICAgICIiIgorICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgZXhjZXB0IFUgYXMgZXhjOgorICAgICAgICAgICAgICByYWlzZSAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JhaXNlKHJhaXNlX25vZGUpCisKKyAgICBkZWYgdGVzdF9ub19lcnJvcl9ub3RpbXBsZW1lbnRlZF9kb2N1bWVudGVkKHNlbGYpOgorICAgICAgICByYWlzZV9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoKToKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgUmFpc2VzOgorICAgICAgICAgICAgICAgIE5vdEltcGxlbWVudGVkRXJyb3I6IFdoZW4gY2FsbGVkLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmFpc2UocmFpc2Vfbm9kZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19yZXR1cm5fZG9jcy5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja19yZXR1cm5fZG9jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ5NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NoZWNrX3JldHVybl9kb2NzLnB5CkBAIC0wLDAgKzEsNjk1IEBACisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IE1vaXNlcyBMb3BleiA8bW95bG9wMjYwQHZhdXhvby5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFplYiBOaWNob2xscyA8emViZWRlZS5uaWNob2xsc0BjbGltYXRlLWVuZXJneS1jb2xsZWdlLm9yZz4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlVuaXQgdGVzdHMgZm9yIHRoZSByZXR1cm4gZG9jdW1lbnRhdGlvbiBjaGVja2luZyBpbiB0aGUKK2BEb2NzdHJpbmdDaGVja2VyYCBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5jaGVja19kb2NzYAorIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LXB1YmxpYy1tZXRob2RzCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmV4dGVuc2lvbnMuZG9jcGFyYW1zIGltcG9ydCBEb2NzdHJpbmdQYXJhbWV0ZXJDaGVja2VyCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZSwgc2V0X2NvbmZpZworCisKK2NsYXNzIFRlc3REb2NzdHJpbmdDaGVja2VyUmV0dXJuKENoZWNrZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHB5bGludF9wbHVnaW4uUmFpc2VEb2NDaGVja2VyIiIiCisKKyAgICBDSEVDS0VSX0NMQVNTID0gRG9jc3RyaW5nUGFyYW1ldGVyQ2hlY2tlcgorCisgICAgZGVmIHRlc3RfaWdub3Jlc19ub19kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBAc2V0X2NvbmZpZyhhY2NlcHRfbm9fcmV0dXJuX2RvYz1GYWxzZSkKKyAgICBkZWYgdGVzdF93YXJuc19ub19kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICIiIgorICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICByZXR1cm5fbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9bm9kZSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tdHlwZS1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfdW5rbm93bl9zdHlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuIiIiCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuX3BhcnRpYWxfc3BoaW54X3JldHVybnMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyZXR1cm5zOiBBbHdheXMgRmFsc2UKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJldHVybl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tdHlwZS1kb2MiLCBub2RlPW5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3Rfc3BoaW54X21pc3NpbmdfcmV0dXJuX3R5cGVfd2l0aF9hbm5vdGF0aW9ucyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpIC0+IGJvb2w6CisgICAgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICAgICA6cmV0dXJuczogQWx3YXlzIEZhbHNlCisgICAgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICByZXR1cm5fbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5fcGFydGlhbF9zcGhpbnhfcmV0dXJuc190eXBlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cnR5cGU6IGJvb2wKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJldHVybl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9bm9kZSkpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5fbWlzc2luZ19zcGhpbnhfcmV0dXJucyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYsIGRvY190eXBlKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpwYXJhbSBkb2NfdHlwZTogU3BoaW54CisgICAgICAgICAgICA6dHlwZSBkb2NfdHlwZTogc3RyCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICByZXR1cm5fbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9bm9kZSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tdHlwZS1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5fcGFydGlhbF9nb29nbGVfcmV0dXJucyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICBBbHdheXMgRmFsc2UKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJldHVybl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tdHlwZS1kb2MiLCBub2RlPW5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9wYXJ0aWFsX2dvb2dsZV9yZXR1cm5zX3R5cGUoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgYm9vbDoKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJldHVybl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9bm9kZSkpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5fbWlzc2luZ19nb29nbGVfcmV0dXJucyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYsIGRvY190eXBlKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFBhcmFtZXRlcnM6CisgICAgICAgICAgICAgICAgZG9jX3R5cGUgKHN0cik6IEdvb2dsZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLXR5cGUtZG9jIiwgbm9kZT1ub2RlKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuX3BhcnRpYWxfbnVtcHlfcmV0dXJuc190eXBlKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZiwgZG9jX3R5cGUpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgQXJndW1lbnRzCisgICAgICAgICAgICAtLS0tLS0tLS0KKyAgICAgICAgICAgIGRvY190eXBlIDogc3RyCisgICAgICAgICAgICAgICAgTnVtcHkKKworICAgICAgICAgICAgUmV0dXJucworICAgICAgICAgICAgLS0tLS0tLQorICAgICAgICAgICAgYm9vbAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tZG9jIiwgbm9kZT1ub2RlKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9taXNzaW5nX251bXB5X3JldHVybnMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmLCBkb2NfdHlwZSk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBBcmd1bWVudHMKKyAgICAgICAgICAgIC0tLS0tLS0tLQorICAgICAgICAgICAgZG9jX3R5cGUgOiBzdHIKKyAgICAgICAgICAgICAgICBOdW1weQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLXR5cGUtZG9jIiwgbm9kZT1ub2RlKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3NwaGlueF9yZXR1cm5zKHNlbGYpOgorICAgICAgICByZXR1cm5fbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJldHVybjogQWx3YXlzIEZhbHNlCisgICAgICAgICAgICA6cnR5cGU6IGJvb2wKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9nb29nbGVfcmV0dXJucyhzZWxmKToKKyAgICAgICAgcmV0dXJuX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgYm9vbDogQWx3YXlzIEZhbHNlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBGYWxzZSAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbnVtcHlfcmV0dXJucyhzZWxmKToKKyAgICAgICAgcmV0dXJuX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgIGJvb2wKKyAgICAgICAgICAgICAgICBBbHdheXMgRmFsc2UKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9udW1weV9yZXR1cm5zX3dpdGhfb2Yoc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICA6b2JqOmBsaXN0YCBvZiA6b2JqOmBzdHJgCisgICAgICAgICAgICAgICAgTGlzdCBvZiBzdHJpbmdzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBbImhpIiwgImJ5ZSJdICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19zcGhpbnhfcmV0dXJuX25vbmUoc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZiwgZG9jX3R5cGUpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnBhcmFtIGRvY190eXBlOiBTcGhpbngKKyAgICAgICAgICAgIDp0eXBlIGRvY190eXBlOiBzdHIKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19nb29nbGVfcmV0dXJuX25vbmUoc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZiwgZG9jX3R5cGUpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICBkb2NfdHlwZSAoc3RyKTogR29vZ2xlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfbnVtcHlfcmV0dXJuX25vbmUoc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZiwgZG9jX3R5cGUpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgQXJndW1lbnRzCisgICAgICAgICAgICAtLS0tLS0tLS0KKyAgICAgICAgICAgIGRvY190eXBlIDogc3RyCisgICAgICAgICAgICAgICAgTnVtcHkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfc3BoaW54X3JldHVybl9jdXN0b21fY2xhc3Moc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmV0dXJuczogQW4gb2JqZWN0CisgICAgICAgICAgICA6cnR5cGU6IDpjbGFzczpgbXltb2R1bGUuQ2xhc3NgCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBteW1vZHVsZS5DbGFzcygpICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfZ29vZ2xlX3JldHVybl9jdXN0b21fY2xhc3Moc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgICAgIG15bW9kdWxlLkNsYXNzOiBBbiBvYmplY3QKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIG15bW9kdWxlLkNsYXNzKCkgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19udW1weV9yZXR1cm5fY3VzdG9tX2NsYXNzKHNlbGYpOgorICAgICAgICByZXR1cm5fbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmV0dXJucworICAgICAgICAgICAgLS0tLS0tLQorICAgICAgICAgICAgICAgIG15bW9kdWxlLkNsYXNzCisgICAgICAgICAgICAgICAgICAgIEFuIG9iamVjdAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gbXltb2R1bGUuQ2xhc3MoKSAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX3NwaGlueF9yZXR1cm5fbGlzdF9vZl9jdXN0b21fY2xhc3Moc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cmV0dXJuczogQW4gb2JqZWN0CisgICAgICAgICAgICA6cnR5cGU6IGxpc3QoOmNsYXNzOmBteW1vZHVsZS5DbGFzc2ApCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBbbXltb2R1bGUuQ2xhc3MoKV0gI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19nb29nbGVfcmV0dXJuX2xpc3Rfb2ZfY3VzdG9tX2NsYXNzKHNlbGYpOgorICAgICAgICByZXR1cm5fbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICBsaXN0KDpjbGFzczpgbXltb2R1bGUuQ2xhc3NgKTogQW4gb2JqZWN0CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBbbXltb2R1bGUuQ2xhc3MoKV0gI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19udW1weV9yZXR1cm5fbGlzdF9vZl9jdXN0b21fY2xhc3Moc2VsZik6CisgICAgICAgIHJldHVybl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgbGlzdCg6Y2xhc3M6YG15bW9kdWxlLkNsYXNzYCkKKyAgICAgICAgICAgICAgICAgICAgQW4gb2JqZWN0CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBbbXltb2R1bGUuQ2xhc3MoKV0gI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19zcGhpbnhfcmV0dXJuX2xpc3Rfb2ZfY3VzdG9tX2NsYXNzX3dpdGhvdXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpydHlwZTogbGlzdCg6Y2xhc3M6YG15bW9kdWxlLkNsYXNzYCkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIFtteW1vZHVsZS5DbGFzcygpXQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICByZXR1cm5fbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXJldHVybi1kb2MiLCBub2RlPW5vZGUpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9yZXR1cm4ocmV0dXJuX25vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19nb29nbGVfcmV0dXJuX2xpc3Rfb2ZfY3VzdG9tX2NsYXNzX3dpdGhvdXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgbGlzdCg6Y2xhc3M6YG15bW9kdWxlLkNsYXNzYCk6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBbbXltb2R1bGUuQ2xhc3MoKV0KKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy1yZXR1cm4tZG9jIiwgbm9kZT1ub2RlKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfcmV0dXJuKHJldHVybl9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2FybnNfbnVtcHlfcmV0dXJuX2xpc3Rfb2ZfY3VzdG9tX2NsYXNzX3dpdGhvdXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgICAgICBsaXN0KDpjbGFzczpgbXltb2R1bGUuQ2xhc3NgKQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gW215bW9kdWxlLkNsYXNzKCldCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHJldHVybl9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmctcmV0dXJuLWRvYyIsIG5vZGU9bm9kZSkpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3JldHVybihyZXR1cm5fbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX3NwaGlueF9yZWR1bmRhbnRfcmV0dXJuX2RvYyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJldHVybnM6IE9uZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InJlZHVuZGFudC1yZXR1cm5zLWRvYyIsIG5vZGU9bm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3Rfd2FybnNfc3BoaW54X3JlZHVuZGFudF9ydHlwZV9kb2Moc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpydHlwZTogaW50CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0icmVkdW5kYW50LXJldHVybnMtZG9jIiwgbm9kZT1ub2RlKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19nb29nbGVfcmVkdW5kYW50X3JldHVybl9kb2Moc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgT25lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0icmVkdW5kYW50LXJldHVybnMtZG9jIiwgbm9kZT1ub2RlKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19nb29nbGVfcmVkdW5kYW50X3J0eXBlX2RvYyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgICAgICBpbnQ6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0icmVkdW5kYW50LXJldHVybnMtZG9jIiwgbm9kZT1ub2RlKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19udW1weV9yZWR1bmRhbnRfcmV0dXJuX2RvYyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgUmV0dXJucworICAgICAgICAgICAgLS0tLS0tLQorICAgICAgICAgICAgICAgIGludAorICAgICAgICAgICAgICAgICAgICBPbmUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJyZWR1bmRhbnQtcmV0dXJucy1kb2MiLCBub2RlPW5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX251bXB5X3JlZHVuZGFudF9ydHlwZV9kb2Moc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgICAgICBpbnQKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJyZWR1bmRhbnQtcmV0dXJucy1kb2MiLCBub2RlPW5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfc3BoaW54X3JlZHVuZGFudF9yZXR1cm5fZG9jX211bHRpcGxlX3JldHVybnMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyZXR1cm5zOiBPbmUKKyAgICAgICAgICAgIDpydHlwZTogaW50CisKKyAgICAgICAgICAgIDpyZXR1cm5zOiBOb25lIHNvbWV0aW1lcworICAgICAgICAgICAgOnJ0eXBlOiBOb25lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGFfZnVuYygpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX2dvb2dsZV9yZWR1bmRhbnRfcmV0dXJuX2RvY19tdWx0aXBsZV9yZXR1cm5zKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgICAgIGludCBvciBOb25lOiBPbmUsIG9yIHNvbWV0aW1lcyBOb25lLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBhX2Z1bmMoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19udW1weV9yZWR1bmRhbnRfcmV0dXJuX2RvY19tdWx0aXBsZV9yZXR1cm5zKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBSZXR1cm5zCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgaW50CisgICAgICAgICAgICAgICAgICAgIE9uZQorICAgICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgU29tZXRpbWVzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIGFfZnVuYygpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVfc3BoaW54X3JlZHVuZGFudF9yZXR1cm5fZG9jX3lpZWxkKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmNfd2l0aF95aWVsZChzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyZXR1cm5zOiBPbmUKKyAgICAgICAgICAgIDpydHlwZTogZ2VuZXJhdG9yCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19nb29nbGVfcmVkdW5kYW50X3JldHVybl9kb2NfeWllbGQoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICAgICAgaW50OiBPbmUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9InJlZHVuZGFudC1yZXR1cm5zLWRvYyIsIG5vZGU9bm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9mdW5jdGlvbmRlZihub2RlKQorCisgICAgZGVmIHRlc3Rfd2FybnNfbnVtcHlfcmVkdW5kYW50X3JldHVybl9kb2NfeWllbGQoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFJldHVybnMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgICAgICBpbnQKKyAgICAgICAgICAgICAgICAgICAgT25lCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJyZWR1bmRhbnQtcmV0dXJucy1kb2MiLCBub2RlPW5vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja195aWVsZHNfZG9jcy5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9jaGVja195aWVsZHNfZG9jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGMzNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NoZWNrX3lpZWxkc19kb2NzLnB5CkBAIC0wLDAgKzEsNDg4IEBACisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgR2xlbm4gTWF0dGhld3MgPGdsZW5uQGUtZGFkLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBIdWdvIHZhbiBLZW1lbmFkZSA8aHVnb3ZrQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJVbml0IHRlc3RzIGZvciB0aGUgeWllbGQgZG9jdW1lbnRhdGlvbiBjaGVja2luZyBpbiB0aGUKK2BEb2NzdHJpbmdDaGVja2VyYCBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5jaGVja19kb2NzYAorIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LXB1YmxpYy1tZXRob2RzCisKK2ltcG9ydCBhc3Ryb2lkCisKK2Zyb20gcHlsaW50LmV4dGVuc2lvbnMuZG9jcGFyYW1zIGltcG9ydCBEb2NzdHJpbmdQYXJhbWV0ZXJDaGVja2VyCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZSwgc2V0X2NvbmZpZworCisKK2NsYXNzIFRlc3REb2NzdHJpbmdDaGVja2VyWWllbGQoQ2hlY2tlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgcHlsaW50X3BsdWdpbi5SYWlzZURvY0NoZWNrZXIiIiIKKworICAgIENIRUNLRVJfQ0xBU1MgPSBEb2NzdHJpbmdQYXJhbWV0ZXJDaGVja2VyCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgeWllbGRfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgIiIiCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgeWllbGQgRmFsc2UgI0AKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgQHNldF9jb25maWcoYWNjZXB0X25vX3lpZWxkc19kb2M9RmFsc2UpCisgICAgZGVmIHRlc3Rfd2FybnNfbm9fZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICB5aWVsZCBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmcteWllbGQtdHlwZS1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3lpZWxkKHlpZWxkX25vZGUpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX3Vua25vd25fc3R5bGUoc2VsZik6CisgICAgICAgIHlpZWxkX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuIiIiCisgICAgICAgICAgICB5aWVsZCBGYWxzZSAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3lpZWxkKHlpZWxkX25vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuX3BhcnRpYWxfc3BoaW54X3lpZWxkcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJldHVybnM6IEFsd2F5cyBGYWxzZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB5aWVsZCBGYWxzZQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC10eXBlLWRvYyIsIG5vZGU9bm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9wYXJ0aWFsX3NwaGlueF95aWVsZHNfdHlwZShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJ0eXBlOiBib29sCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHlpZWxkX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC1kb2MiLCBub2RlPW5vZGUpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9taXNzaW5nX3NwaGlueF95aWVsZHMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmLCBkb2NfdHlwZSk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cGFyYW0gZG9jX3R5cGU6IFNwaGlueAorICAgICAgICAgICAgOnR5cGUgZG9jX3R5cGU6IHN0cgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB5aWVsZCBGYWxzZQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmcteWllbGQtdHlwZS1kb2MiLCBub2RlPW5vZGUpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3lpZWxkKHlpZWxkX25vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuX3BhcnRpYWxfZ29vZ2xlX3lpZWxkcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgWWllbGRzOgorICAgICAgICAgICAgICAgIEFsd2F5cyBGYWxzZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB5aWVsZCBGYWxzZQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC10eXBlLWRvYyIsIG5vZGU9bm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9wYXJ0aWFsX2dvb2dsZV95aWVsZHNfdHlwZShzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgWWllbGRzOgorICAgICAgICAgICAgICAgIGJvb2w6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHlpZWxkX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcyhNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC1kb2MiLCBub2RlPW5vZGUpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9taXNzaW5nX2dvb2dsZV95aWVsZHMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmLCBkb2NfdHlwZSk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBQYXJhbWV0ZXJzOgorICAgICAgICAgICAgICAgIGRvY190eXBlIChzdHIpOiBHb29nbGUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgRmFsc2UKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgeWllbGRfbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmcteWllbGQtZG9jIiwgbm9kZT1ub2RlKSwKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXlpZWxkLXR5cGUtZG9jIiwgbm9kZT1ub2RlKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3Rfd2Fybl9taXNzaW5nX251bXB5X3lpZWxkcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYsIGRvY190eXBlKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIEFyZ3VtZW50cworICAgICAgICAgICAgLS0tLS0tLS0tCisgICAgICAgICAgICBkb2NfdHlwZSA6IHN0cgorICAgICAgICAgICAgICAgIE51bXB5CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIEZhbHNlCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHlpZWxkX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPSJtaXNzaW5nLXlpZWxkLWRvYyIsIG5vZGU9bm9kZSksCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD0ibWlzc2luZy15aWVsZC10eXBlLWRvYyIsIG5vZGU9bm9kZSksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfc3BoaW54X3lpZWxkcyhzZWxmKToKKyAgICAgICAgeWllbGRfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJldHVybjogQWx3YXlzIEZhbHNlCisgICAgICAgICAgICA6cnR5cGU6IGJvb2wKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgRmFsc2UgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZF9nb29nbGVfeWllbGRzKHNlbGYpOgorICAgICAgICB5aWVsZF9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBZaWVsZHM6CisgICAgICAgICAgICAgICAgYm9vbDogQWx3YXlzIEZhbHNlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIEZhbHNlICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbnVtcHlfeWllbGRzKHNlbGYpOgorICAgICAgICB5aWVsZF9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBZaWVsZHMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgIGJvb2wKKyAgICAgICAgICAgICAgICBBbHdheXMgRmFsc2UKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgRmFsc2UgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfc3BoaW54X3lpZWxkX2N1c3RvbV9jbGFzcyhzZWxmKToKKyAgICAgICAgeWllbGRfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgOnJldHVybnM6IEFuIG9iamVjdAorICAgICAgICAgICAgOnJ0eXBlOiA6Y2xhc3M6YG15bW9kdWxlLkNsYXNzYAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB5aWVsZCBteW1vZHVsZS5DbGFzcygpICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX2dvb2dsZV95aWVsZF9jdXN0b21fY2xhc3Moc2VsZik6CisgICAgICAgIHlpZWxkX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFlpZWxkczoKKyAgICAgICAgICAgICAgICBteW1vZHVsZS5DbGFzczogQW4gb2JqZWN0CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIG15bW9kdWxlLkNsYXNzKCkgI0AKKyAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQorCisgICAgZGVmIHRlc3RfZmluZHNfbnVtcHlfeWllbGRfY3VzdG9tX2NsYXNzKHNlbGYpOgorICAgICAgICB5aWVsZF9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBZaWVsZHMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgICAgICBteW1vZHVsZS5DbGFzcworICAgICAgICAgICAgICAgICAgICBBbiBvYmplY3QKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgbXltb2R1bGUuQ2xhc3MoKSAjQAorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3lpZWxkKHlpZWxkX25vZGUpCisKKyAgICBkZWYgdGVzdF9maW5kc19zcGhpbnhfeWllbGRfbGlzdF9vZl9jdXN0b21fY2xhc3Moc2VsZik6CisgICAgICAgIHlpZWxkX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIDpyZXR1cm5zOiBBbiBvYmplY3QKKyAgICAgICAgICAgIDpydHlwZTogbGlzdCg6Y2xhc3M6YG15bW9kdWxlLkNsYXNzYCkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgW215bW9kdWxlLkNsYXNzKCldICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX2dvb2dsZV95aWVsZF9saXN0X29mX2N1c3RvbV9jbGFzcyhzZWxmKToKKyAgICAgICAgeWllbGRfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgWWllbGRzOgorICAgICAgICAgICAgICAgIGxpc3QoOmNsYXNzOmBteW1vZHVsZS5DbGFzc2ApOiBBbiBvYmplY3QKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgW215bW9kdWxlLkNsYXNzKCldICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzX251bXB5X3lpZWxkX2xpc3Rfb2ZfY3VzdG9tX2NsYXNzKHNlbGYpOgorICAgICAgICB5aWVsZF9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBZaWVsZHMKKyAgICAgICAgICAgIC0tLS0tLS0KKyAgICAgICAgICAgICAgICBsaXN0KDpjbGFzczpgbXltb2R1bGUuQ2xhc3NgKQorICAgICAgICAgICAgICAgICAgICBBbiBvYmplY3QKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeWllbGQgW215bW9kdWxlLkNsYXNzKCldICNACisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX3NwaGlueF95aWVsZF9saXN0X29mX2N1c3RvbV9jbGFzc193aXRob3V0X2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICA6cnR5cGU6IGxpc3QoOmNsYXNzOmBteW1vZHVsZS5DbGFzc2ApCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIFtteW1vZHVsZS5DbGFzcygpXQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmcteWllbGQtZG9jIiwgbm9kZT1ub2RlKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX2dvb2dsZV95aWVsZF9saXN0X29mX2N1c3RvbV9jbGFzc193aXRob3V0X2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoCisgICAgICAgICAgICAnJycKKyAgICAgICAgZGVmIG15X2Z1bmMoc2VsZik6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLgorCisgICAgICAgICAgICBZaWVsZHM6CisgICAgICAgICAgICAgICAgbGlzdCg6Y2xhc3M6YG15bW9kdWxlLkNsYXNzYCk6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIFtteW1vZHVsZS5DbGFzcygpXQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmcteWllbGQtZG9jIiwgbm9kZT1ub2RlKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgIGRlZiB0ZXN0X3dhcm5zX251bXB5X3lpZWxkX2xpc3Rfb2ZfY3VzdG9tX2NsYXNzX3dpdGhvdXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFlpZWxkcworICAgICAgICAgICAgLS0tLS0tLQorICAgICAgICAgICAgICAgIGxpc3QoOmNsYXNzOmBteW1vZHVsZS5DbGFzc2ApCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHlpZWxkIFtteW1vZHVsZS5DbGFzcygpXQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB5aWVsZF9ub2RlID0gbm9kZS5ib2R5WzBdCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoTWVzc2FnZShtc2dfaWQ9Im1pc3NpbmcteWllbGQtZG9jIiwgbm9kZT1ub2RlKSk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfeWllbGQoeWllbGRfbm9kZSkKKworICAgICMgTm8gc3VjaCB0aGluZyBhcyByZWR1bmRhbnQgeWllbGQgZG9jdW1lbnRhdGlvbiBmb3Igc3BoaW54IGJlY2F1c2UgaXQKKyAgICAjIGRvZXNuJ3Qgc3VwcG9ydCB5aWVsZCBkb2N1bWVudGF0aW9uCisKKyAgICBkZWYgdGVzdF9pZ25vcmVzX2dvb2dsZV9yZWR1bmRhbnRfeWllbGRfZG9jX211bHRpcGxlX3lpZWxkcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgWWllbGRzOgorICAgICAgICAgICAgICAgIGludCBvciBOb25lOiBPbmUsIG9yIHNvbWV0aW1lcyBOb25lLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBhX2Z1bmMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBOb25lCisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfbnVtcHlfcmVkdW5kYW50X3lpZWxkX2RvY19tdWx0aXBsZV95aWVsZHMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFlpZWxkcworICAgICAgICAgICAgLS0tLS0tLQorICAgICAgICAgICAgICAgIGludAorICAgICAgICAgICAgICAgICAgICBPbmUKKyAgICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICAgICAgICAgIFNvbWV0aW1lcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBhX2Z1bmMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBOb25lCisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfZnVuY3Rpb25kZWYobm9kZSkKKworICAgICMgTm8gc3VjaCB0aGluZyBhcyByZWR1bmRhbnQgeWllbGQgZG9jdW1lbnRhdGlvbiBmb3Igc3BoaW54IGJlY2F1c2UgaXQKKyAgICAjIGRvZXNuJ3Qgc3VwcG9ydCB5aWVsZCBkb2N1bWVudGF0aW9uCisKKyAgICBkZWYgdGVzdF93YXJuc19nb29nbGVfcmVkdW5kYW50X3lpZWxkX2RvY19yZXR1cm4oc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICBkZWYgbXlfZnVuYyhzZWxmKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSBkb2NzdHJpbmcuCisKKyAgICAgICAgICAgIFlpZWxkczoKKyAgICAgICAgICAgICAgICBpbnQ6IE9uZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKE1lc3NhZ2UobXNnX2lkPSJyZWR1bmRhbnQteWllbGRzLWRvYyIsIG5vZGU9bm9kZSkpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF93YXJuc19udW1weV9yZWR1bmRhbnRfeWllbGRfZG9jX3JldHVybihzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiBteV9mdW5jKHNlbGYpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIGRvY3N0cmluZy4KKworICAgICAgICAgICAgWWllbGRzCisgICAgICAgICAgICAtLS0tLS0tCisgICAgICAgICAgICAgICAgaW50CisgICAgICAgICAgICAgICAgICAgIE9uZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAnJycKKyAgICAgICAgKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKE1lc3NhZ2UobXNnX2lkPSJyZWR1bmRhbnQteWllbGRzLWRvYyIsIG5vZGU9bm9kZSkpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2Z1bmN0aW9uZGVmKG5vZGUpCisKKyAgICBkZWYgdGVzdF9zcGhpbnhfbWlzc2luZ195aWVsZF90eXBlX3dpdGhfYW5ub3RhdGlvbnMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgaW1wb3J0IHR5cGluZworCisgICAgICAgICAgICBkZWYgZ2VuZXJhdG9yKCkgLT4gdHlwaW5nLkl0ZXJhdG9yW2ludF06CisgICAgICAgICAgICAgICAgIiIiQSBzaW1wbGUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHR5cGUgaGludHMuCisKKyAgICAgICAgICAgICAgICA6cmV0dXJuczogVGhlIG51bWJlciAwCisgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgeWllbGQgMAorICAgICAgICAgICAgJycnCisgICAgICAgICkKKyAgICAgICAgeWllbGRfbm9kZSA9IG5vZGUuYm9keVswXQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X3lpZWxkKHlpZWxkX25vZGUpCisKKyAgICBkZWYgdGVzdF9nb29nbGVfbWlzc2luZ195aWVsZF90eXBlX3dpdGhfYW5ub3RhdGlvbnMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZSgKKyAgICAgICAgICAgICcnJworICAgICAgICAgICAgaW1wb3J0IHR5cGluZworCisgICAgICAgICAgICBkZWYgZ2VuZXJhdG9yKCkgLT4gdHlwaW5nLkl0ZXJhdG9yW2ludF06CisgICAgICAgICAgICAgICAgIiIiQSBzaW1wbGUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHR5cGUgaGludHMuCisKKyAgICAgICAgICAgICAgICBZaWVsZHM6CisgICAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgMAorICAgICAgICAgICAgICAgICIiIgorICAgICAgICAgICAgICAgIHlpZWxkIDAKKyAgICAgICAgICAgICcnJworICAgICAgICApCisgICAgICAgIHlpZWxkX25vZGUgPSBub2RlLmJvZHlbMF0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydE5vTWVzc2FnZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF95aWVsZCh5aWVsZF9ub2RlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NvbXBhcmV0b3plcm8ucHkgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3RfY29tcGFyZXRvemVyby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWJlYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NvbXBhcmV0b3plcm8ucHkKQEAgLTAsMCArMSw1MyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFRvZG9yb3YgPGF0b2Rvcm92QG90Yi5iZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlRlc3RzIGZvciB0aGUgcHlsaW50IGNoZWNrZXIgaW4gOm1vZDpgcHlsaW50LmV4dGVuc2lvbnMuZW1wdHlzdHJpbmciIiIKKworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBweWxpbnQgaW1wb3J0IGNoZWNrZXJzCitmcm9tIHB5bGludC5leHRlbnNpb25zLmNvbXBhcmV0b3plcm8gaW1wb3J0IENvbXBhcmVUb1plcm9DaGVja2VyCitmcm9tIHB5bGludC5saW50IGltcG9ydCBQeUxpbnRlcgorZnJvbSBweWxpbnQucmVwb3J0ZXJzIGltcG9ydCBCYXNlUmVwb3J0ZXIKKworCitjbGFzcyBDb21wYXJlVG9aZXJvVGVzdFJlcG9ydGVyKEJhc2VSZXBvcnRlcik6CisgICAgZGVmIG9uX3NldF9jdXJyZW50X21vZHVsZShzZWxmLCBtb2R1bGUsIGZpbGVwYXRoKToKKyAgICAgICAgc2VsZi5tZXNzYWdlcyA9IFtdCisKKyAgICBkZWYgX2Rpc3BsYXkoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIENvbXBhcmVUb1plcm9Vc2VkVEModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5fbGludGVyID0gUHlMaW50ZXIoKQorICAgICAgICBjbHMuX2xpbnRlci5zZXRfcmVwb3J0ZXIoQ29tcGFyZVRvWmVyb1Rlc3RSZXBvcnRlcigpKQorICAgICAgICBjaGVja2Vycy5pbml0aWFsaXplKGNscy5fbGludGVyKQorICAgICAgICBjbHMuX2xpbnRlci5yZWdpc3Rlcl9jaGVja2VyKENvbXBhcmVUb1plcm9DaGVja2VyKGNscy5fbGludGVyKSkKKyAgICAgICAgY2xzLl9saW50ZXIuZGlzYWJsZSgiSSIpCisKKyAgICBkZWYgdGVzdF9jb21wYXJldG96ZXJvX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGVsaWZfdGVzdCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgImRhdGEiLCAiY29tcGFyZV90b196ZXJvLnB5IgorICAgICAgICApCisgICAgICAgIHNlbGYuX2xpbnRlci5jaGVjayhbZWxpZl90ZXN0XSkKKyAgICAgICAgbXNncyA9IHNlbGYuX2xpbnRlci5yZXBvcnRlci5tZXNzYWdlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2dzKSwgNCkKKyAgICAgICAgZm9yIG1zZyBpbiBtc2dzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuc3ltYm9sLCAiY29tcGFyZS10by16ZXJvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLm1zZywgIkF2b2lkIGNvbXBhcmlzb25zIHRvIHplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ3NbMF0ubGluZSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzWzFdLmxpbmUsIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnc1syXS5saW5lLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzWzNdLmxpbmUsIDE1KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NvbmZ1c2luZ19lbGlmLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2NvbmZ1c2luZ19lbGlmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWU5MDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3RfY29uZnVzaW5nX2VsaWYucHkKQEAgLTAsMCArMSwxOTYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgQW5kcmVhcyBGaW5rbGVyIDxhbmRpLmZpbmtsZXJAZ21haWwuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlRlc3RzIGZvciB0aGUgcHlsaW50IGNoZWNrZXIgaW4gOm1vZDpgcHlsaW50LmV4dGVuc2lvbnMuY29uZnVzaW5nX2VsaWYKKyIiIgorCitpbXBvcnQgYXN0cm9pZAorCitmcm9tIHB5bGludC5leHRlbnNpb25zLmNvbmZ1c2luZ19lbGlmIGltcG9ydCBDb25mdXNpbmdDb25zZWN1dGl2ZUVsaWZDaGVja2VyCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IENoZWNrZXJUZXN0Q2FzZSwgTWVzc2FnZQorCitNU0dfSURfQ09ORlVTSU5HX0NPTlNFQ1VUSVZFX0VMSUYgPSAiY29uZnVzaW5nLWNvbnNlY3V0aXZlLWVsaWYiCisKKworY2xhc3MgVGVzdENvbmZ1c2luZ0NvbnNlY3V0aXZlRWxpZkNoZWNrZXIoQ2hlY2tlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgcHlsaW50LmV4dGVuc2lvbnMuY29uZnVzaW5nX2VsaWYuQ29uZnVzaW5nQ29uc2VjdXRpdmVFbGlmQ2hlY2tlciIiIgorCisgICAgQ0hFQ0tFUl9DTEFTUyA9IENvbmZ1c2luZ0NvbnNlY3V0aXZlRWxpZkNoZWNrZXIKKworICAgIGRlZiB0ZXN0X3RyaWdnZXJlZF9pZl9pZl9ibG9ja19lbmRzX3dpdGhfZWxpZihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEdpdmVuIGFuIGlmLWVsaWYgY29uc3RydWN0CisgICAgICAgIFdoZW4gdGhlIGJvZHkgb2YgdGhlIGlmIGVuZHMgd2l0aCBhbiBlbGlmCisgICAgICAgIFRoZW4gdGhlIG1lc3NhZ2UgY29uZnVzaW5nLWNvbnNlY3V0aXZlLWVsaWYgbXVzdCBiZSB0cmlnZ2VyZWQuCisgICAgICAgICIiIgorICAgICAgICBleGFtcGxlX2NvZGUgPSAiIiIKKyAgICAgICAgZGVmIGZvbyhhLCBiLCBjKToKKyAgICAgICAgICAgIGlmIGEgPiBiOiAjQAorICAgICAgICAgICAgICAgIGlmIGEgPiAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYQorICAgICAgICAgICAgICAgIGVsaWYgYSA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIGEgPiBjOiAjQAorICAgICAgICAgICAgICAgIHJldHVybiBjCisgICAgICAgICIiIgorICAgICAgICBpZl9ub2RlX3RvX3Rlc3QsIGVsaWZfbm9kZSA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKGV4YW1wbGVfY29kZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydEFkZHNNZXNzYWdlcygKKyAgICAgICAgICAgIE1lc3NhZ2UobXNnX2lkPU1TR19JRF9DT05GVVNJTkdfQ09OU0VDVVRJVkVfRUxJRiwgbm9kZT1lbGlmX25vZGUpCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaWYoaWZfbm9kZV90b190ZXN0KQorCisgICAgZGVmIHRlc3RfdHJpZ2dlcmVkX2lmX2VsaWZfYmxvY2tfZW5kc193aXRoX2VsaWYoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhbiBpZi1lbGlmLWVsaWYgY29uc3RydWN0CisgICAgICAgIFdoZW4gdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGVsaWYgZW5kcyB3aXRoIGFuIGVsaWYKKyAgICAgICAgVGhlbiB0aGUgbWVzc2FnZSBjb25mdXNpbmctY29uc2VjdXRpdmUtZWxpZiBtdXN0IGJlIHRyaWdnZXJlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGV4YW1wbGVfY29kZSA9ICIiIgorICAgICAgICBkZWYgZm9vKGEsIGIsIGMpOgorICAgICAgICAgICAgaWYgYSA8IGI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGIKKyAgICAgICAgICAgIGVsaWYgYSA+IGI6ICNACisgICAgICAgICAgICAgICAgaWYgYSA+IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhCisgICAgICAgICAgICAgICAgZWxpZiBhIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsaWYgYSA+IGM6ICNACisgICAgICAgICAgICAgICAgcmV0dXJuIGMKKyAgICAgICAgIiIiCisgICAgICAgIGlmX25vZGVfdG9fdGVzdCwgZWxpZl9ub2RlID0gYXN0cm9pZC5leHRyYWN0X25vZGUoZXhhbXBsZV9jb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0QWRkc01lc3NhZ2VzKAorICAgICAgICAgICAgTWVzc2FnZShtc2dfaWQ9TVNHX0lEX0NPTkZVU0lOR19DT05TRUNVVElWRV9FTElGLCBub2RlPWVsaWZfbm9kZSkKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlci52aXNpdF9pZihpZl9ub2RlX3RvX3Rlc3QpCisKKyAgICBkZWYgdGVzdF90cmlnZ2VyZWRfaWZfYmxvY2tfZW5kc193aXRoX2lmKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2l2ZW4gYW4gaWYtZWxpZiBjb25zdHJ1Y3QKKyAgICAgICAgV2hlbiB0aGUgYm9keSBvZiB0aGUgaWYgZW5kcyB3aXRoIGFuIGlmCisgICAgICAgIFRoZW4gdGhlIG1lc3NhZ2UgY29uZnVzaW5nLWNvbnNlY3V0aXZlLWVsaWYgbXVzdCBiZSB0cmlnZ2VyZWQuCisgICAgICAgICIiIgorICAgICAgICBleGFtcGxlX2NvZGUgPSAiIiIKKyAgICAgICAgZGVmIGZvbyhhLCBiLCBjKToKKyAgICAgICAgICAgIGlmIGEgPiBiOiAjQAorICAgICAgICAgICAgICAgIGlmIGEgPiAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYQorICAgICAgICAgICAgZWxpZiBhID4gYzogI0AKKyAgICAgICAgICAgICAgICByZXR1cm4gYworICAgICAgICAiIiIKKyAgICAgICAgaWZfbm9kZV90b190ZXN0LCBlbGlmX25vZGUgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShleGFtcGxlX2NvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRBZGRzTWVzc2FnZXMoCisgICAgICAgICAgICBNZXNzYWdlKG1zZ19pZD1NU0dfSURfQ09ORlVTSU5HX0NPTlNFQ1VUSVZFX0VMSUYsIG5vZGU9ZWxpZl9ub2RlKQorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2lmKGlmX25vZGVfdG9fdGVzdCkKKworICAgIGRlZiB0ZXN0X25vdF90cmlnZ2VyZWRfaWZfaW5kZW50ZWRfYmxvY2tfZW5kc193aXRoX2Vsc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhbiBpZi1lbGlmIGNvbnN0cnVjdAorICAgICAgICBXaGVuIHRoZSBib2R5IG9mIHRoZSBpZiBlbmRzIHdpdGggYW4gZWxzZQorICAgICAgICBUaGVuIG5vIG1lc3NhZ2Ugc2hhbGwgYmUgdHJpZ2dlcmVkLgorICAgICAgICAiIiIKKyAgICAgICAgZXhhbXBsZV9jb2RlID0gIiIiCisgICAgICAgIGRlZiBmb28oYSwgYiwgYyk6CisgICAgICAgICAgICBpZiBhID4gYjogI0AKKyAgICAgICAgICAgICAgICBpZiBhID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxpZiBhID4gYzoKKyAgICAgICAgICAgICAgICByZXR1cm4gYworICAgICAgICAiIiIKKyAgICAgICAgaWZfbm9kZV90b190ZXN0ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoZXhhbXBsZV9jb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2lmKGlmX25vZGVfdG9fdGVzdCkKKworICAgIGRlZiB0ZXN0X25vdF90cmlnZ2VyZWRfaWZfaW5kZW50ZW5kX2Jsb2NrX2VuZHNfd2l0aF9jYWxsKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2l2ZW4gYW4gaWYtZWxpZiBjb25zdHJ1Y3QKKyAgICAgICAgV2hlbiB0aGUgYm9keSBvZiB0aGUgaWYgZW5kcyB3aXRoIGEgZnVuY3Rpb24gY2FsbAorICAgICAgICBUaGVuIG5vIG1lc3NhZ2Ugc2hhbGwgYmUgdHJpZ2dlcmVkLgorCisgICAgICAgIE5vdGU6IFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgYm9keSBlbmRpbmcgd2l0aCBhIGZ1bmN0aW9uIGNhbGwuIFRoaXMgaXMganVzdCB0YWtlbiBhcyBhCisgICAgICAgIHJlcHJlc2VudGF0aXZlIHZhbHVlIGZvciB0aGUgZXF1aXZhbGVuY2UgY2xhc3Mgb2YgImV2ZXJ5IG5vZGUgY2xhc3MgdW5yZWxhdGVkIHRvIGlmL2VsaWYvZWxzZSIuCisgICAgICAgICIiIgorICAgICAgICBleGFtcGxlX2NvZGUgPSAiIiIKKyAgICAgICAgZGVmIGZvbyhhLCBiLCBjKToKKyAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGEgPiBiOiAjQAorICAgICAgICAgICAgICAgIGlmIGEgPiAwOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhCisgICAgICAgICAgICAgICAgcHJpbnQoInJlc3VsdCBpcyIsIHJlc3VsdCkKKyAgICAgICAgICAgIGVsaWYgYSA+IGM6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAiIiIKKyAgICAgICAgaWZfbm9kZV90b190ZXN0ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoZXhhbXBsZV9jb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2lmKGlmX25vZGVfdG9fdGVzdCkKKworICAgIGRlZiB0ZXN0X25vdF90cmlnZ2VyZWRfaWZfaW5kZW50ZWRfYmxvY2tfZW5kc193aXRoX2lmZXhwKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2l2ZW4gYW4gaWYtZWxpZiBjb25zdHJ1Y3QKKyAgICAgICAgV2hlbiB0aGUgYm9keSBvZiB0aGUgaWYgZW5kcyB3aXRoIGFuIGlmIGV4cHJlc3Npb24KKyAgICAgICAgVGhlbiBubyBtZXNzYWdlIHNoYWxsIGJlIHRyaWdnZXJlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGV4YW1wbGVfY29kZSA9ICIiIgorICAgICAgICBkZWYgZm9vKGEsIGIsIGMpOgorICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICAgICAgaWYgYSA+IGI6ICNACisgICAgICAgICAgICAgICAgaWYgYSA+IDA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBiIGlmIGIgPiBjIGVsc2UgYworICAgICAgICAgICAgZWxpZiBhID4gYzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgICIiIgorICAgICAgICBpZl9ub2RlX3RvX3Rlc3QgPSBhc3Ryb2lkLmV4dHJhY3Rfbm9kZShleGFtcGxlX2NvZGUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnROb01lc3NhZ2VzKCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXIudmlzaXRfaWYoaWZfbm9kZV90b190ZXN0KQorCisgICAgZGVmIHRlc3Rfbm90X3RyaWdnZXJlZF9pZl9vdXRlcl9ibG9ja19kb2VzX25vdF9oYXZlX2VsaWYoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhbiBpZiBjb25zdHJ1Y3Qgd2l0aG91dCBhbiBlbGlmCisgICAgICAgIFdoZW4gdGhlIGJvZHkgb2YgdGhlIGlmIGVuZHMgd2l0aCBhbiBpZgorICAgICAgICBUaGVuIG5vIG1lc3NhZ2Ugc2hhbGwgYmUgdHJpZ2dlcmVkLgorICAgICAgICAiIiIKKyAgICAgICAgZXhhbXBsZV9jb2RlID0gIiIiCisgICAgICAgIGRlZiBmb28oYSwgYiwgYyk6CisgICAgICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgICAgICBpZiBhID4gYjogI0AKKyAgICAgICAgICAgICAgICBpZiBhID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYQorICAgICAgICAgICAgICAgIGVsaWYgYSA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAiIiIKKyAgICAgICAgaWZfbm9kZV90b190ZXN0ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoZXhhbXBsZV9jb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2lmKGlmX25vZGVfdG9fdGVzdCkKKworICAgIGRlZiB0ZXN0X25vdF90cmlnZ2VyZWRfaWZfb3V0ZXJfYmxvY2tfY29udGludWVzX3dpdGhfaWYoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhbiBpZiBjb25zdHJ1Y3Qgd2hpY2ggY29udGludWVzIHdpdGggYSBuZXcgaWYgY29uc3RydWN0CisgICAgICAgIFdoZW4gdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGlmIGVuZHMgd2l0aCBhbiBpZiBleHByZXNzaW9uCisgICAgICAgIFRoZW4gbm8gbWVzc2FnZSBzaGFsbCBiZSB0cmlnZ2VyZWQuCisgICAgICAgICIiIgorICAgICAgICBleGFtcGxlX2NvZGUgPSAiIiIKKyAgICAgICAgZGVmIGZvbyhhLCBiLCBjKToKKyAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGEgPiBiOiAjQAorICAgICAgICAgICAgICAgIGlmIGEgPiAwOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhCisgICAgICAgICAgICAgICAgZWxpZiBhIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICAgICAgaWYgYiA+IGM6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gYworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAiIiIKKyAgICAgICAgaWZfbm9kZV90b190ZXN0ID0gYXN0cm9pZC5leHRyYWN0X25vZGUoZXhhbXBsZV9jb2RlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0Tm9NZXNzYWdlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VyLnZpc2l0X2lmKGlmX25vZGVfdG9fdGVzdCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9kb2NzdHlsZS5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9kb2NzdHlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzZjZDMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2RvY3N0eWxlLnB5CkBAIC0wLDAgKzEsNTUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpcyBFc2NvYmFyIDxsZXNjb2JhckB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdHMgZm9yIHRoZSBweWxpbnQgY2hlY2tlciBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5jaGVja19kb2NzdHJpbmcKKyIiIgorCitmcm9tIG9zLnBhdGggaW1wb3J0IGFic3BhdGgsIGRpcm5hbWUsIGpvaW4KKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5leHRlbnNpb25zLmRvY3N0eWxlIGltcG9ydCBEb2NTdHJpbmdTdHlsZUNoZWNrZXIKKworRVhQRUNURURfTVNHUyA9IFsKKyAgICAiRmlyc3QgbGluZSBlbXB0eSBpbiBmdW5jdGlvbiBkb2NzdHJpbmciLAorICAgICJGaXJzdCBsaW5lIGVtcHR5IGluIGNsYXNzIGRvY3N0cmluZyIsCisgICAgIkZpcnN0IGxpbmUgZW1wdHkgaW4gbWV0aG9kIGRvY3N0cmluZyIsCisgICAgIkJhZCBkb2NzdHJpbmcgcXVvdGVzIGluIG1ldGhvZCwgZXhwZWN0ZWQgXCJcIlwiLCBnaXZlbiAnJyciLAorICAgICdCYWQgZG9jc3RyaW5nIHF1b3RlcyBpbiBtZXRob2QsIGV4cGVjdGVkICIiIiwgZ2l2ZW4gIicsCisgICAgJ0JhZCBkb2NzdHJpbmcgcXVvdGVzIGluIG1ldGhvZCwgZXhwZWN0ZWQgIiIiLCBnaXZlbiBcJycsCisgICAgJ0JhZCBkb2NzdHJpbmcgcXVvdGVzIGluIG1ldGhvZCwgZXhwZWN0ZWQgIiIiLCBnaXZlbiBcJycsCitdCisKK0VYUEVDVEVEX1NZTUJPTFMgPSBbCisgICAgImRvY3N0cmluZy1maXJzdC1saW5lLWVtcHR5IiwKKyAgICAiZG9jc3RyaW5nLWZpcnN0LWxpbmUtZW1wdHkiLAorICAgICJkb2NzdHJpbmctZmlyc3QtbGluZS1lbXB0eSIsCisgICAgImJhZC1kb2NzdHJpbmctcXVvdGVzIiwKKyAgICAiYmFkLWRvY3N0cmluZy1xdW90ZXMiLAorICAgICJiYWQtZG9jc3RyaW5nLXF1b3RlcyIsCisgICAgImJhZC1kb2NzdHJpbmctcXVvdGVzIiwKK10KKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgY2hlY2tlcigpOgorICAgIHJldHVybiBEb2NTdHJpbmdTdHlsZUNoZWNrZXIKKworCitkZWYgdGVzdF9kb2NzdHJpbmdfbWVzc2FnZShsaW50ZXIpOgorICAgIGRvY3N0cmluZ190ZXN0ID0gam9pbihkaXJuYW1lKGFic3BhdGgoX19maWxlX18pKSwgImRhdGEiLCAiZG9jc3RyaW5nLnB5IikKKyAgICBsaW50ZXIuY2hlY2soW2RvY3N0cmluZ190ZXN0XSkKKyAgICBtc2dzID0gbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgYXNzZXJ0IGxlbihtc2dzKSA9PSA3CisgICAgZm9yIG1zZywgZXhwZWN0ZWRfc3ltYm9sLCBleHBlY3RlZF9tc2cgaW4gemlwKAorICAgICAgICBtc2dzLCBFWFBFQ1RFRF9TWU1CT0xTLCBFWFBFQ1RFRF9NU0dTCisgICAgKToKKyAgICAgICAgYXNzZXJ0IG1zZy5zeW1ib2wgPT0gZXhwZWN0ZWRfc3ltYm9sCisgICAgICAgIGFzc2VydCBtc2cubXNnID09IGV4cGVjdGVkX21zZwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2Vsc2VpZl91c2VkLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2Vsc2VpZl91c2VkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjY0NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3RfZWxzZWlmX3VzZWQucHkKQEAgLTAsMCArMSwzNSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJUZXN0cyBmb3IgdGhlIHB5bGludCBjaGVja2VyIGluIDptb2Q6YHB5bGludC5leHRlbnNpb25zLmNoZWNrX2VsaWYKKyIiIgorZnJvbSBvcyBpbXBvcnQgcGF0aCBhcyBvc3AKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5leHRlbnNpb25zLmNoZWNrX2VsaWYgaW1wb3J0IEVsc2VpZlVzZWRDaGVja2VyCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGNoZWNrZXIoKToKKyAgICByZXR1cm4gRWxzZWlmVXNlZENoZWNrZXIKKworCitkZWYgdGVzdF9lbHNlaWZfbWVzc2FnZShsaW50ZXIpOgorICAgIGVsaWZfdGVzdCA9IG9zcC5qb2luKG9zcC5kaXJuYW1lKG9zcC5hYnNwYXRoKF9fZmlsZV9fKSksICJkYXRhIiwgImVsaWYucHkiKQorICAgIGxpbnRlci5jaGVjayhbZWxpZl90ZXN0XSkKKyAgICBtc2dzID0gbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgYXNzZXJ0IGxlbihtc2dzKSA9PSAyCisgICAgZm9yIG1zZyBpbiBtc2dzOgorICAgICAgICBhc3NlcnQgbXNnLnN5bWJvbCA9PSAiZWxzZS1pZi11c2VkIgorICAgICAgICBhc3NlcnQgbXNnLm1zZyA9PSAnQ29uc2lkZXIgdXNpbmcgImVsaWYiIGluc3RlYWQgb2YgImVsc2UgaWYiJworICAgIGFzc2VydCBtc2dzWzBdLmxpbmUgPT0gOQorICAgIGFzc2VydCBtc2dzWzFdLmxpbmUgPT0gMjEKZGlmZiAtLWdpdCBhL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9lbXB0eV9jb21tZW50LnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2VtcHR5X2NvbW1lbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzZjMxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9lbXB0eV9jb21tZW50LnB5CkBAIC0wLDAgKzEsMzQgQEAKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmV4dGVuc2lvbnMgaW1wb3J0IGVtcHR5X2NvbW1lbnQKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgY2hlY2tlcigpOgorICAgIHJldHVybiBlbXB0eV9jb21tZW50LkNvbW1lbnRDaGVja2VyCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGVuYWJsZSgpOgorICAgIHJldHVybiBbImVtcHR5LWNvbW1lbnQiXQorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiBkaXNhYmxlKCk6CisgICAgcmV0dXJuIFsiYWxsIl0KKworCitkZWYgdGVzdF9jb21tZW50X2Jhc2VfY2FzZShsaW50ZXIpOgorICAgIGNvbW1lbnRfdGVzdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQuam9pbnBhdGgoImRhdGEiLCAiZW1wdHlfY29tbWVudC5weSIpKQorICAgIGxpbnRlci5jaGVjayhbY29tbWVudF90ZXN0XSkKKyAgICBtc2dzID0gbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisgICAgYXNzZXJ0IGxlbihtc2dzKSA9PSA0CisgICAgZm9yIG1zZyBpbiBtc2dzOgorICAgICAgICBhc3NlcnQgbXNnLnN5bWJvbCA9PSAiZW1wdHktY29tbWVudCIKKyAgICAgICAgYXNzZXJ0IG1zZy5tc2cgPT0gIkxpbmUgd2l0aCBlbXB0eSBjb21tZW50IgorICAgIGFzc2VydCBtc2dzWzBdLmxpbmUgPT0gMgorICAgIGFzc2VydCBtc2dzWzFdLmxpbmUgPT0gMworICAgIGFzc2VydCBtc2dzWzJdLmxpbmUgPT0gNQorICAgIGFzc2VydCBtc2dzWzNdLmxpbmUgPT0gNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2VtcHR5c3RyaW5nLnB5IGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X2VtcHR5c3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzkxODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3RfZW1wdHlzdHJpbmcucHkKQEAgLTAsMCArMSw0NCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFRvZG9yb3YgPGF0b2Rvcm92QG90Yi5iZz4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRGFtaWVuIEJhdHkgPGRhbWllbi5iYXR5QHBvbHljb25zZWlsLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdHMgZm9yIHRoZSBweWxpbnQgY2hlY2tlciBpbiA6bW9kOmBweWxpbnQuZXh0ZW5zaW9ucy5lbXB0eXN0cmluZworIiIiCitmcm9tIG9zIGltcG9ydCBwYXRoIGFzIG9zcAorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmV4dGVuc2lvbnMuZW1wdHlzdHJpbmcgaW1wb3J0IENvbXBhcmVUb0VtcHR5U3RyaW5nQ2hlY2tlcgorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiBjaGVja2VyKCk6CisgICAgcmV0dXJuIENvbXBhcmVUb0VtcHR5U3RyaW5nQ2hlY2tlcgorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiBkaXNhYmxlKCk6CisgICAgcmV0dXJuIFsiSSJdCisKKworZGVmIHRlc3RfZW1wdHlzdHJpbmdfbWVzc2FnZShsaW50ZXIpOgorICAgIGVsaWZfdGVzdCA9IG9zcC5qb2luKAorICAgICAgICBvc3AuZGlybmFtZShvc3AuYWJzcGF0aChfX2ZpbGVfXykpLCAiZGF0YSIsICJlbXB0eV9zdHJpbmdfY29tcGFyaXNvbi5weSIKKyAgICApCisgICAgbGludGVyLmNoZWNrKFtlbGlmX3Rlc3RdKQorICAgIG1zZ3MgPSBsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXMKKyAgICBleHBlY3RlZF9saW5lbm8gPSBbNiwgOSwgMTIsIDE1XQorICAgIGFzc2VydCBsZW4obXNncykgPT0gbGVuKGV4cGVjdGVkX2xpbmVubykKKyAgICBmb3IgbXNnLCBsaW5lbm8gaW4gemlwKG1zZ3MsIGV4cGVjdGVkX2xpbmVubyk6CisgICAgICAgIGFzc2VydCBtc2cuc3ltYm9sID09ICJjb21wYXJlLXRvLWVtcHR5LXN0cmluZyIKKyAgICAgICAgYXNzZXJ0IG1zZy5tc2cgPT0gIkF2b2lkIGNvbXBhcmlzb25zIHRvIGVtcHR5IHN0cmluZyIKKyAgICAgICAgYXNzZXJ0IG1zZy5saW5lID09IGxpbmVubwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X292ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkgYi90ZXN0cy9leHRlbnNpb25zL3Rlc3Rfb3ZlcmxhcHBpbmdfZXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTRhOGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X292ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw4NyBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJUZXN0cyBmb3IgdGhlIHB5bGludCBjaGVja2VyIGluIDptb2Q6YHB5bGludC5leHRlbnNpb25zLm92ZXJsYXBwaW5nX2V4Y2VwdGlvbnMKKyIiIgorCitmcm9tIG9zLnBhdGggaW1wb3J0IGRpcm5hbWUsIGpvaW4KKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5leHRlbnNpb25zLm92ZXJsYXBwaW5nX2V4Y2VwdGlvbnMgaW1wb3J0IE92ZXJsYXBwaW5nRXhjZXB0aW9uc0NoZWNrZXIKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgY2hlY2tlcigpOgorICAgIHJldHVybiBPdmVybGFwcGluZ0V4Y2VwdGlvbnNDaGVja2VyCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGRpc2FibGUoKToKKyAgICByZXR1cm4gWyJJIl0KKworCitkZWYgdGVzdF9vdmVybGFwcGluZ19leGNlcHRpb25zKGxpbnRlcik6CisgICAgdGVzdCA9IGpvaW4oZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIiwgIm92ZXJsYXBwaW5nX2V4Y2VwdGlvbnMucHkiKQorICAgIGxpbnRlci5jaGVjayhbdGVzdF0pCisgICAgbXNncyA9IGxpbnRlci5yZXBvcnRlci5tZXNzYWdlcworCisgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICgxMywgIk92ZXJsYXBwaW5nIGV4Y2VwdGlvbnMgKFNvbWVFeGNlcHRpb24gYW5kIFNvbWVFeGNlcHRpb24gYXJlIHRoZSBzYW1lKSIpLAorICAgICAgICAoCisgICAgICAgICAgICAxOCwKKyAgICAgICAgICAgICJPdmVybGFwcGluZyBleGNlcHRpb25zIChTb21lRXhjZXB0aW9uIGlzIGFuIGFuY2VzdG9yIGNsYXNzIG9mIFN1YmNsYXNzRXhjZXB0aW9uKSIsCisgICAgICAgICksCisgICAgICAgICgyMywgIk92ZXJsYXBwaW5nIGV4Y2VwdGlvbnMgKFNvbWVFeGNlcHRpb24gYW5kIEFsaWFzRXhjZXB0aW9uIGFyZSB0aGUgc2FtZSkiKSwKKyAgICAgICAgKAorICAgICAgICAgICAgMjgsCisgICAgICAgICAgICAiT3ZlcmxhcHBpbmcgZXhjZXB0aW9ucyAoQWxpYXNFeGNlcHRpb24gaXMgYW4gYW5jZXN0b3IgY2xhc3Mgb2YgU3ViY2xhc3NFeGNlcHRpb24pIiwKKyAgICAgICAgKSwKKyAgICAgICAgKDM0LCAiT3ZlcmxhcHBpbmcgZXhjZXB0aW9ucyAoU29tZUV4Y2VwdGlvbiBhbmQgQWxpYXNFeGNlcHRpb24gYXJlIHRoZSBzYW1lKSIpLAorICAgICAgICAoCisgICAgICAgICAgICAzNCwKKyAgICAgICAgICAgICJPdmVybGFwcGluZyBleGNlcHRpb25zIChTb21lRXhjZXB0aW9uIGlzIGFuIGFuY2VzdG9yIGNsYXNzIG9mIFN1YmNsYXNzRXhjZXB0aW9uKSIsCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgIDM0LAorICAgICAgICAgICAgIk92ZXJsYXBwaW5nIGV4Y2VwdGlvbnMgKEFsaWFzRXhjZXB0aW9uIGlzIGFuIGFuY2VzdG9yIGNsYXNzIG9mIFN1YmNsYXNzRXhjZXB0aW9uKSIsCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgIDM5LAorICAgICAgICAgICAgIk92ZXJsYXBwaW5nIGV4Y2VwdGlvbnMgKEFyaXRobWV0aWNFcnJvciBpcyBhbiBhbmNlc3RvciBjbGFzcyBvZiBGbG9hdGluZ1BvaW50RXJyb3IpIiwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgNDQsCisgICAgICAgICAgICAiT3ZlcmxhcHBpbmcgZXhjZXB0aW9ucyAoVmFsdWVFcnJvciBpcyBhbiBhbmNlc3RvciBjbGFzcyBvZiBVbmljb2RlRGVjb2RlRXJyb3IpIiwKKyAgICAgICAgKSwKKyAgICBdCisKKyAgICBhc3NlcnQgbGVuKG1zZ3MpID09IGxlbihleHBlY3RlZCkKKyAgICBmb3IgbXNnLCBleHAgaW4gemlwKG1zZ3MsIGV4cGVjdGVkKToKKyAgICAgICAgYXNzZXJ0IG1zZy5tc2dfaWQgPT0gIlcwNzE0IgorICAgICAgICBhc3NlcnQgbXNnLnN5bWJvbCA9PSAib3ZlcmxhcHBpbmctZXhjZXB0IgorICAgICAgICBhc3NlcnQgbXNnLmNhdGVnb3J5ID09ICJ3YXJuaW5nIgorICAgICAgICBhc3NlcnQgKG1zZy5saW5lLCBtc2cubXNnKSA9PSBleHAKKworCitkZWYgdGVzdF9vdmVybGFwcGluZ19leGNlcHRpb25zX3B5MzMobGludGVyKToKKyAgICAiIiJGcm9tIFB5dGhvbiAzLjMgYm90aCBJT0Vycm9yIGFuZCBzb2NrZXQuZXJyb3IgYXJlIGFsaWFzZXMgZm9yIE9TRXJyb3IuIiIiCisgICAgdGVzdCA9IGpvaW4oZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIiwgIm92ZXJsYXBwaW5nX2V4Y2VwdGlvbnNfcHkzMy5weSIpCisgICAgbGludGVyLmNoZWNrKFt0ZXN0XSkKKyAgICBtc2dzID0gbGludGVyLnJlcG9ydGVyLm1lc3NhZ2VzCisKKyAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgKDcsICJPdmVybGFwcGluZyBleGNlcHRpb25zIChJT0Vycm9yIGFuZCBPU0Vycm9yIGFyZSB0aGUgc2FtZSkiKSwKKyAgICAgICAgKDEyLCAiT3ZlcmxhcHBpbmcgZXhjZXB0aW9ucyAoc29ja2V0LmVycm9yIGFuZCBPU0Vycm9yIGFyZSB0aGUgc2FtZSkiKSwKKyAgICAgICAgKAorICAgICAgICAgICAgMTcsCisgICAgICAgICAgICAiT3ZlcmxhcHBpbmcgZXhjZXB0aW9ucyAoc29ja2V0LmVycm9yIGlzIGFuIGFuY2VzdG9yIGNsYXNzIG9mIENvbm5lY3Rpb25FcnJvcikiLAorICAgICAgICApLAorICAgIF0KKworICAgIGFzc2VydCBsZW4obXNncykgPT0gbGVuKGV4cGVjdGVkKQorICAgIGZvciBtc2csIGV4cCBpbiB6aXAobXNncywgZXhwZWN0ZWQpOgorICAgICAgICBhc3NlcnQgbXNnLm1zZ19pZCA9PSAiVzA3MTQiCisgICAgICAgIGFzc2VydCBtc2cuc3ltYm9sID09ICJvdmVybGFwcGluZy1leGNlcHQiCisgICAgICAgIGFzc2VydCBtc2cuY2F0ZWdvcnkgPT0gIndhcm5pbmciCisgICAgICAgIGFzc2VydCAobXNnLmxpbmUsIG1zZy5tc2cpID09IGV4cApkaWZmIC0tZ2l0IGEvdGVzdHMvZXh0ZW5zaW9ucy90ZXN0X3JlZGVmaW5lZC5weSBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9yZWRlZmluZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZTRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2V4dGVuc2lvbnMvdGVzdF9yZWRlZmluZWQucHkKQEAgLTAsMCArMSw1MSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJUZXN0cyBmb3IgdGhlIHB5bGludCBjaGVja2VyIGluIDptb2Q6YHB5bGludC5leHRlbnNpb25zLmNoZWNrX2VsaWYiIiIKK2Zyb20gb3MgaW1wb3J0IHBhdGggYXMgb3NwCisKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQuZXh0ZW5zaW9ucy5yZWRlZmluZWRfdmFyaWFibGVfdHlwZSBpbXBvcnQgTXVsdGlwbGVUeXBlc0NoZWNrZXIKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IGZpeF9pbXBvcnRfcGF0aAorCitFWFBFQ1RFRCA9IFsKKyAgICAiUmVkZWZpbml0aW9uIG9mIHNlbGYudmFyMSB0eXBlIGZyb20gaW50IHRvIGZsb2F0IiwKKyAgICAiUmVkZWZpbml0aW9uIG9mIGFfc3RyIHR5cGUgZnJvbSBib29sIHRvIGZsb2F0IiwKKyAgICAiUmVkZWZpbml0aW9uIG9mIHZhciB0eXBlIGZyb20gaW50IHRvIHN0ciIsCisgICAgIlJlZGVmaW5pdGlvbiBvZiBteWludCB0eXBlIGZyb20gaW50IHRvIGJvb2wiLAorICAgICJSZWRlZmluaXRpb24gb2YgX09LIHR5cGUgZnJvbSBib29sIHRvIHN0ciIsCisgICAgIlJlZGVmaW5pdGlvbiBvZiBpbnN0YW5jZSB0eXBlIGZyb20gcmVkZWZpbmVkLk15Q2xhc3MgdG8gYm9vbCIsCisgICAgIlJlZGVmaW5pdGlvbiBvZiBTT01FX0ZMT0FUIHR5cGUgZnJvbSBmbG9hdCB0byBpbnQiLAorICAgICJSZWRlZmluaXRpb24gb2YgdmFyMyB0eXBlIGZyb20gc3RyIHRvIGludCIsCisgICAgIlJlZGVmaW5pdGlvbiBvZiB2YXIgdHlwZSBmcm9tIGJvb2wgdG8gaW50IiwKKyAgICAiUmVkZWZpbml0aW9uIG9mIHZhcjQgdHlwZSBmcm9tIGZsb2F0IHRvIHN0ciIsCitdCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGNoZWNrZXIoKToKKyAgICByZXR1cm4gTXVsdGlwbGVUeXBlc0NoZWNrZXIKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgZGlzYWJsZSgpOgorICAgIHJldHVybiBbIkkiXQorCisKK2RlZiB0ZXN0X3R5cGVzX3JlZGVmaW5lZChsaW50ZXIpOgorICAgIGVsaWZfdGVzdCA9IG9zcC5qb2luKG9zcC5kaXJuYW1lKG9zcC5hYnNwYXRoKF9fZmlsZV9fKSksICJkYXRhIiwgInJlZGVmaW5lZC5weSIpCisgICAgd2l0aCBmaXhfaW1wb3J0X3BhdGgoW2VsaWZfdGVzdF0pOgorICAgICAgICBsaW50ZXIuY2hlY2soW2VsaWZfdGVzdF0pCisgICAgbXNncyA9IHNvcnRlZChsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXMsIGtleT1sYW1iZGEgaXRlbTogaXRlbS5saW5lKQorICAgIGFzc2VydCBsZW4obXNncykgPT0gMTAKKyAgICBmb3IgbXNnLCBleHBlY3RlZCBpbiB6aXAobXNncywgRVhQRUNURUQpOgorICAgICAgICBhc3NlcnQgbXNnLnN5bWJvbCA9PSAicmVkZWZpbmVkLXZhcmlhYmxlLXR5cGUiCisgICAgICAgIGFzc2VydCBtc2cubXNnID09IGV4cGVjdGVkCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9hYmNfbWV0aG9kcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9hYmNfbWV0aG9kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTc0NjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2FiY19tZXRob2RzLnB5CkBAIC0wLDAgKzEsMTcgQEAKKyIiIiBUaGlzIHNob3VsZCBub3Qgd2FybiBhYm91dCBgcHJvcGAgYmVpbmcgYWJzdHJhY3QgaW4gQ2hpbGQgIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgbm8tYWJzb2x1dGUtaW1wb3J0LG1ldGFjbGFzcy1hc3NpZ25tZW50LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQ0KKw0KK2ltcG9ydCBhYmMNCisNCitjbGFzcyBQYXJlbnQob2JqZWN0KToNCisgICAgIiIiQWJzdHJhY3QgQmFzZSBDbGFzcyAiIiINCisgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhDQorDQorICAgIEBwcm9wZXJ0eQ0KKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kDQorICAgIGRlZiBwcm9wKHNlbGYpOg0KKyAgICAgICAgIiIiIEFic3RyYWN0ICIiIg0KKw0KK2NsYXNzIENoaWxkKFBhcmVudCk6DQorICAgICIiIiBObyB3YXJuaW5nIGZvciB0aGUgZm9sbG93aW5nLiAiIiINCisgICAgcHJvcCA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiAxKQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9jbGFzc19pbnN0YW50aWF0ZWRfaW5fY2xhc3MucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX2luX2NsYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYWEzYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX2luX2NsYXNzLnB5CkBAIC0wLDAgKzEsMTcgQEAKKyIiIkRvbid0IHdhcm4gaWYgdGhlIGNsYXNzIGlzIGluc3RhbnRpYXRlZCBpbiBpdHMgb3duIGJvZHkuIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlDQorDQorDQoraW1wb3J0IGFiYw0KKw0KKw0KK2NsYXNzIEFsYShvYmplY3QsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6DQorDQorICAgIEBhYmMuYWJzdHJhY3RtZXRob2QNCisgICAgZGVmIGJhbGEoc2VsZik6DQorICAgICAgICBwYXNzDQorDQorICAgIEBjbGFzc21ldGhvZA0KKyAgICBkZWYgcG9ydG9jYWxhKGNscyk6DQorICAgICAgICBpbnN0YW5jZSA9IGNscygpDQorICAgICAgICByZXR1cm4gaW5zdGFuY2UNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX3B5My5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9jbGFzc19pbnN0YW50aWF0ZWRfcHkzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmVmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX3B5My5weQpAQCAtMCwwICsxLDEyOCBAQAorIiIiQ2hlY2sgdGhhdCBpbnN0YW50aWF0aW5nIGEgY2xhc3Mgd2l0aAorYGFiYy5BQkNNZXRhYCBhcyBtZXRhY2xhc3MgZmFpbHMgaWYgaXQgZGVmaW5lcworYWJzdHJhY3QgbWV0aG9kcy4KKyIiIgorCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBtaXNzaW5nLWRvY3N0cmluZworIyBweWxpbnQ6IGRpc2FibGU9YWJzdHJhY3QtbWV0aG9kLCBpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2ltcG9ydCBhYmMKK2ltcG9ydCB3ZWFrcmVmCitmcm9tIGxhbGEgaW1wb3J0IEJhbGEKKworCitjbGFzcyBHb29kQ2xhc3Mob2JqZWN0LCBtZXRhY2xhc3M9YWJjLkFCQ01ldGEpOgorICAgIHBhc3MKKworY2xhc3MgU2Vjb25kR29vZENsYXNzKG9iamVjdCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiIGRvIG5vdGhpbmcuICIiIgorCitjbGFzcyBUaGlyZEdvb2RDbGFzcyhvYmplY3QsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisgICAgIiIiIFRoaXMgc2hvdWxkIG5vdCByYWlzZSB0aGUgd2FybmluZy4gIiIiCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCitjbGFzcyBCYWRDbGFzcyhvYmplY3QsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAiIiIgZG8gbm90aGluZy4gIiIiCisKK2NsYXNzIFNlY29uZEJhZENsYXNzKG9iamVjdCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKKyAgICBAcHJvcGVydHkKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICIiIiBkbyBub3RoaW5nLiAiIiIKKworY2xhc3MgVGhpcmRCYWRDbGFzcyhTZWNvbmRCYWRDbGFzcyk6CisgICAgcGFzcworCisKK2NsYXNzIFN0cnVjdHVyZShvYmplY3QsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcGFzcworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcGFzcworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIF8pOgorICAgICAgICBwYXNzCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBDb250YWluZXIoU3RydWN0dXJlKToKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIF8pOgorICAgICAgICBwYXNzCisKK2NsYXNzIFNpemFibGUoU3RydWN0dXJlKToKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDQyCisKK2NsYXNzIEhhc2hhYmxlKFN0cnVjdHVyZSk6CisgICAgX19oYXNoX18gPSA0MgorCisKK2NsYXNzIEl0ZXJhdG9yKFN0cnVjdHVyZSk6CisgICAgZGVmIGtleXMoc2VsZik6ICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgICAgICAgIHJldHVybiBpdGVyKFsxLCAyLCAzXSkKKworICAgIF9faXRlcl9fID0ga2V5cworCitjbGFzcyBBYnN0cmFjdFNpemFibGUoU3RydWN0dXJlKToKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIGxlbmd0aChzZWxmKToKKyAgICAgICAgcGFzcworICAgIF9fbGVuX18gPSBsZW5ndGgKKworY2xhc3MgTm9Ncm9BYnN0cmFjdE1ldGhvZHMoQ29udGFpbmVyLCBJdGVyYXRvciwgU2l6YWJsZSwgSGFzaGFibGUpOgorICAgIHBhc3MKKworY2xhc3MgQmFkTXJvQWJzdHJhY3RNZXRob2RzKENvbnRhaW5lciwgSXRlcmF0b3IsIEFic3RyYWN0U2l6YWJsZSk6CisgICAgcGFzcworCitjbGFzcyBTb21lTWV0YWNsYXNzKG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIHByb3Aoc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgRm91cnRoR29vZENsYXNzKFNvbWVNZXRhY2xhc3MpOgorICAgICIiIkRvbid0IGNvbnNpZGVyIHRoaXMgYWJzdHJhY3QgaWYgc29tZSBhdHRyaWJ1dGVzIGFyZQorICAgIHRoZXJlLCBidXQgY2FuJ3QgYmUgaW5mZXJyZWQuCisgICAgIiIiCisgICAgcHJvcCA9IEJhbGEgIyBtaXNzaW5nCisKKworZGVmIG1haW4oKToKKyAgICAiIiIgZG8gbm90aGluZyAiIiIKKyAgICBHb29kQ2xhc3MoKQorICAgIFNlY29uZEdvb2RDbGFzcygpCisgICAgVGhpcmRHb29kQ2xhc3MoKQorICAgIEZvdXJ0aEdvb2RDbGFzcygpCisgICAgd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSgpCisgICAgd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKyAgICBOb01yb0Fic3RyYWN0TWV0aG9kcygpCisKKyAgICBCYWRNcm9BYnN0cmFjdE1ldGhvZHMoKSAjIFthYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWRdCisgICAgQmFkQ2xhc3MoKSAjIFthYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWRdCisgICAgU2Vjb25kQmFkQ2xhc3MoKSAjIFthYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWRdCisgICAgVGhpcmRCYWRDbGFzcygpICMgW2Fic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZF0KKworCitpZiAxOiAjIHB5bGludDogZGlzYWJsZT11c2luZy1jb25zdGFudC10ZXN0CisgICAgY2xhc3MgRm91cnRoQmFkQ2xhc3Mob2JqZWN0LCBtZXRhY2xhc3M9YWJjLkFCQ01ldGEpOgorCisgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBGb3VydGhCYWRDbGFzcyhvYmplY3QsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisKKyAgICAgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworCitkZWYgbWFpbjIoKToKKyAgICBGb3VydGhCYWRDbGFzcygpICMgW2Fic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9jbGFzc19pbnN0YW50aWF0ZWRfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9jbGFzc19pbnN0YW50aWF0ZWRfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOGJhZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX3B5My50eHQKQEAgLTAsMCArMSw1IEBACithYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWQ6MTA4OjQ6bWFpbjpBYnN0cmFjdCBjbGFzcyAnQmFkTXJvQWJzdHJhY3RNZXRob2RzJyB3aXRoIGFic3RyYWN0IG1ldGhvZHMgaW5zdGFudGlhdGVkCithYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWQ6MTA5OjQ6bWFpbjpBYnN0cmFjdCBjbGFzcyAnQmFkQ2xhc3MnIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBpbnN0YW50aWF0ZWQKK2Fic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZDoxMTA6NDptYWluOkFic3RyYWN0IGNsYXNzICdTZWNvbmRCYWRDbGFzcycgd2l0aCBhYnN0cmFjdCBtZXRob2RzIGluc3RhbnRpYXRlZAorYWJzdHJhY3QtY2xhc3MtaW5zdGFudGlhdGVkOjExMTo0Om1haW46QWJzdHJhY3QgY2xhc3MgJ1RoaXJkQmFkQ2xhc3MnIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBpbnN0YW50aWF0ZWQKK2Fic3RyYWN0LWNsYXNzLWluc3RhbnRpYXRlZDoxMjg6NDptYWluMjpBYnN0cmFjdCBjbGFzcyAnRm91cnRoQmFkQ2xhc3MnIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBpbnN0YW50aWF0ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9jbGFzc19pbnN0YW50aWF0ZWRfcHkzNC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9jbGFzc19pbnN0YW50aWF0ZWRfcHkzNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRhZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTM0LnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiIg0KK0NoZWNrIHRoYXQgaW5zdGFudGlhdGluZyBhIGNsYXNzIHdpdGggYGFiYy5BQkNNZXRhYCBhcyBhbmNlc3RvciBmYWlscyBpZiBpdA0KK2RlZmluZXMgYWJzdHJhY3QgbWV0aG9kcy4NCisiIiINCisNCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBtaXNzaW5nLWRvY3N0cmluZywgbm8taW5pdA0KKw0KK2ltcG9ydCBhYmMNCisNCisNCisNCitjbGFzcyBCYWRDbGFzcyhhYmMuQUJDKToNCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZA0KKyAgICBkZWYgdGVzdChzZWxmKToNCisgICAgICAgIHBhc3MNCisNCitkZWYgbWFpbigpOg0KKyAgICAiIiIgZG8gbm90aGluZyAiIiINCisgICAgQmFkQ2xhc3MoKSAjIFthYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWRdDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTM0LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTM0LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDBhODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX3B5MzQucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My40CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfY2xhc3NfaW5zdGFudGlhdGVkX3B5MzQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTM0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQwZWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X2NsYXNzX2luc3RhbnRpYXRlZF9weTM0LnR4dApAQCAtMCwwICsxIEBACithYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWQ6MTk6NDptYWluOkFic3RyYWN0IGNsYXNzICdCYWRDbGFzcycgd2l0aCBhYnN0cmFjdCBtZXRob2RzIGluc3RhbnRpYXRlZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X21ldGhvZF9weTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfbWV0aG9kX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNThmNjgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X21ldGhvZF9weTMucHkKQEAgLTAsMCArMSwxMDcgQEAKKyIiIlRlc3QgYWJzdHJhY3QtbWV0aG9kIHdhcm5pbmcuIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBuby1pbml0LCBuby1zZWxmLXVzZQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2ltcG9ydCBhYmMKKworCitjbGFzcyBBYnN0cmFjdChvYmplY3QpOgorICAgIGRlZiBhYWFhKHNlbGYpOgorICAgICAgICAiIiJzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBjb25jcmV0ZSBjbGFzcyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBiYmJiKHNlbGYpOgorICAgICAgICAiIiJzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBjb25jcmV0ZSBjbGFzcyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworCitjbGFzcyBBYnN0cmFjdEIoQWJzdHJhY3QpOgorICAgICIiIkFic3RyYWN0IGNsYXNzLgorCisgICAgdGhpcyBjbGFzcyBpcyBjaGVja2luZyB0aGF0IGl0IGRvZXMgbm90IG91dHB1dCBhbiBlcnJvciBtc2cgZm9yCisgICAgdW5pbXBsZW1ldGVkIG1ldGhvZHMgaW4gYWJzdHJhY3QgY2xhc3NlcworICAgICIiIgorICAgIGRlZiBjY2NjKHNlbGYpOgorICAgICAgICAiIiJzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBjb25jcmV0ZSBjbGFzcyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworY2xhc3MgQWJzdHJhY3RDKEFic3RyYWN0QiwgYWJjLkFCQyk6CisgICAgIiIiCisgICAgQWJzdHJhY3QgY2xhc3MuCisKKyAgICBTaG91bGQgbm90IHRyaWdnZXIgYSB3YXJuaW5nIGZvciB1bmltcGxlbWVudGVkCisgICAgYWJzdHJhY3QgbWV0aG9kcywgYmVjYXVzZSBvZiBleHBsaWNpdCBhYmMuQUJDIGluaGVyaXRhbmNlLgorICAgICIiIgorCisKK2NsYXNzIEFic3RyYWN0RChBYnN0cmFjdEIsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisgICAgIiIiCisgICAgQWJzdHJhY3QgY2xhc3MuCisKKyAgICBTaG91bGQgbm90IHRyaWdnZXIgYSB3YXJuaW5nIGZvciB1bmltcGxlbWVudGVkCisgICAgYWJzdHJhY3QgbWV0aG9kcywgYmVjYXVzZSBvZiBleHBsaWNpdCBtZXRhY2xhc3MuCisgICAgIiIiCisKKworY2xhc3MgQ29uY3JldGUoQWJzdHJhY3QpOiAjIFthYnN0cmFjdC1tZXRob2RdCisgICAgIiIiQ29uY3JldGUgY2xhc3MiIiIKKworICAgIGRlZiBhYWFhKHNlbGYpOgorICAgICAgICAiIiJvdmVyaWRkZW4gZm9ybSBBYnN0cmFjdCIiIgorCisKK2NsYXNzIFN0cnVjdHVyZShvYmplY3QsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6CisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcGFzcworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcGFzcworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIF8pOgorICAgICAgICBwYXNzCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisKKyMgKzE6IFthYnN0cmFjdC1tZXRob2QsIGFic3RyYWN0LW1ldGhvZCwgYWJzdHJhY3QtbWV0aG9kXQorY2xhc3MgQ29udGFpbmVyKFN0cnVjdHVyZSk6CisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBfKToKKyAgICAgICAgcGFzcworCisKKyMgKzE6IFthYnN0cmFjdC1tZXRob2QsIGFic3RyYWN0LW1ldGhvZCwgYWJzdHJhY3QtbWV0aG9kXQorY2xhc3MgU2l6YWJsZShTdHJ1Y3R1cmUpOgorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gNDIKKworCisjICsxOiBbYWJzdHJhY3QtbWV0aG9kLCBhYnN0cmFjdC1tZXRob2QsIGFic3RyYWN0LW1ldGhvZF0KK2NsYXNzIEhhc2hhYmxlKFN0cnVjdHVyZSk6CisgICAgX19oYXNoX18gPSA0MgorCisKKyMgKzE6IFthYnN0cmFjdC1tZXRob2QsIGFic3RyYWN0LW1ldGhvZCwgYWJzdHJhY3QtbWV0aG9kXQorY2xhc3MgSXRlcmF0b3IoU3RydWN0dXJlKToKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoWzEsIDIsIDNdKQorCisgICAgX19pdGVyX18gPSBrZXlzCisKKworY2xhc3MgQWJzdHJhY3RTaXphYmxlKFN0cnVjdHVyZSk6CisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBsZW5ndGgoc2VsZik6CisgICAgICAgIHBhc3MKKyAgICBfX2xlbl9fID0gbGVuZ3RoCisKKworY2xhc3MgR29vZENvbXBsZXhNUk8oQ29udGFpbmVyLCBJdGVyYXRvciwgU2l6YWJsZSwgSGFzaGFibGUpOgorICAgIHBhc3MKKworCisjICsxOiBbYWJzdHJhY3QtbWV0aG9kLCBhYnN0cmFjdC1tZXRob2QsIGFic3RyYWN0LW1ldGhvZF0KK2NsYXNzIEJhZENvbXBsZXhNcm8oQ29udGFpbmVyLCBJdGVyYXRvciwgQWJzdHJhY3RTaXphYmxlKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfbWV0aG9kX3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9tZXRob2RfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWJzdHJhY3QvYWJzdHJhY3RfbWV0aG9kX3B5My5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9tZXRob2RfcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hYnN0cmFjdC9hYnN0cmFjdF9tZXRob2RfcHkzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODMyNDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fic3RyYWN0L2Fic3RyYWN0X21ldGhvZF9weTMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK2Fic3RyYWN0LW1ldGhvZDo0NzowOkNvbmNyZXRlOk1ldGhvZCAnYmJiYicgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0Fic3RyYWN0JyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo3MDowOkNvbnRhaW5lcjpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo3MDowOkNvbnRhaW5lcjpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo3MDowOkNvbnRhaW5lcjpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTdHJ1Y3R1cmUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjc2OjA6U2l6YWJsZTpNZXRob2QgJ19fY29udGFpbnNfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1N0cnVjdHVyZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6NzY6MDpTaXphYmxlOk1ldGhvZCAnX19oYXNoX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTdHJ1Y3R1cmUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjc2OjA6U2l6YWJsZTpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo4MjowOkhhc2hhYmxlOk1ldGhvZCAnX19jb250YWluc19fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo4MjowOkhhc2hhYmxlOk1ldGhvZCAnX19pdGVyX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTdHJ1Y3R1cmUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjgyOjA6SGFzaGFibGU6TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo4NzowOkl0ZXJhdG9yOk1ldGhvZCAnX19jb250YWluc19fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo4NzowOkl0ZXJhdG9yOk1ldGhvZCAnX19oYXNoX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTdHJ1Y3R1cmUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjg3OjA6SXRlcmF0b3I6TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU3RydWN0dXJlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMDY6MDpCYWRDb21wbGV4TXJvOk1ldGhvZCAnX19oYXNoX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTdHJ1Y3R1cmUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwNjowOkJhZENvbXBsZXhNcm86TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnQWJzdHJhY3RTaXphYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMDY6MDpCYWRDb21wbGV4TXJvOk1ldGhvZCAnbGVuZ3RoJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnQWJzdHJhY3RTaXphYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX2F0dHJfYmVmb3JlX2RlZl9mYWxzZV9wb3NpdGl2ZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX2F0dHJfYmVmb3JlX2RlZl9mYWxzZV9wb3NpdGl2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI3ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FjY2Vzcy9hY2Nlc3NfYXR0cl9iZWZvcmVfZGVmX2ZhbHNlX3Bvc2l0aXZlLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSx0b28tbWFueS1wdWJsaWMtbWV0aG9kcyxhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydCwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworIiIiVGhpcyBtb2R1bGUgZGVtb25zdHJhdGVzIGEgcG9zc2libGUgcHJvYmxlbSBvZiBweUxpbnQgd2l0aCBjYWxsaW5nIF9faW5pdF9fIHMKK2Zyb20gaW5oZXJpdGVkIGNsYXNzZXMuCitJbml0aWFsaXphdGlvbnMgZG9uZSB0aGVyZSBhcmUgbm90IGNvbnNpZGVyZWQsIHdoaWNoIHJlc3VsdHMgaW4gRXJyb3IgRTAyMDMgZm9yCitzZWxmLmNvb2tlZHEuIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IHRlbG5ldGxpYgorCitjbGFzcyBTZWVUZWxuZXQodGVsbmV0bGliLlRlbG5ldCk6CisgICAgIiIiCisgICAgRXh0ZW5zaW9uIG9mIHRlbG5ldGxpYi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9MCk6CisgICAgICAgICIiIgorICAgICAgICBDb25zdHJ1Y3Rvci4KKyAgICAgICAgV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGNyZWF0ZSBhbiB1bmNvbm5lY3RlZCBpbnN0YW5jZS4KKyAgICAgICAgV2l0aCBhIGhvc3RuYW1lIGFyZ3VtZW50LCBpdCBjb25uZWN0cyB0aGUgaW5zdGFuY2U7IGEgcG9ydAorICAgICAgICBudW1iZXIgaXMgb3B0aW9uYWwuCisgICAgICAgIFBhcmFtZXRlcjoKKyAgICAgICAgLSBob3N0OiBJUCBhZGRyZXNzIG9mIHRoZSBob3N0CisgICAgICAgIC0gcG9ydDogUG9ydCBudW1iZXIKKyAgICAgICAgIiIiCisgICAgICAgIHRlbG5ldGxpYi5UZWxuZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKKworICAgIGRlZiByZWFkVW50aWxBcnJheShzZWxmLCBtYXRjaGVzLCBfPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVhZCB1bnRpbCBhIGdpdmVuIHN0cmluZyBpcyBlbmNvdW50ZXJlZCBvciB1bnRpbCB0aW1lb3V0LgorICAgICAgICAuLi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgbWF4TGVuZ3RoID0gMAorICAgICAgICBmb3IgbWF0Y2ggaW4gbWF0Y2hlczoKKyAgICAgICAgICAgIGlmIGxlbihtYXRjaCkgPiBtYXhMZW5ndGg6CisgICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gbGVuKG1hdGNoKQorCitjbGFzcyBCYXNlKG9iamVjdCk6CisgICAgIiIiYmxhIGJsYSIiIgorICAgIGRvdWdsb3VwX3BhcGEgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3ZhciA9IEZhbHNlCisKK2NsYXNzIERlcml2ZWQoQmFzZSk6CisgICAgIiIiZGVyaXZlZCBibGFibGEiIiIKKyAgICBkb3VnbG91cF9tb2kgPSBOb25lCisgICAgZGVmIFdvcmsoc2VsZik6CisgICAgICAgICIiImRvIHNvbWV0aGluZyIiIgorICAgICAgICAjIEUwMjAzIC0gQWNjZXNzIHRvIG1lbWJlciAnX3ZhcicgYmVmb3JlIGl0cyBkZWZpbml0aW9uCisgICAgICAgIGlmIHNlbGYuX3ZhcjoKKyAgICAgICAgICAgIHByaW50KCJUcnVlIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCJGYWxzZSIpCisgICAgICAgIHNlbGYuX3ZhciA9IFRydWUKKworICAgICAgICAjIEUwMjAzIC0gQWNjZXNzIHRvIG1lbWJlciAnZG91Z2xvdXBfcGFwYScgYmVmb3JlIGl0cyBkZWZpbml0aW9uCisgICAgICAgIGlmIHNlbGYuZG91Z2xvdXBfcGFwYToKKyAgICAgICAgICAgIHByaW50KCdkb3VnbG91cCAhJykKKyAgICAgICAgc2VsZi5kb3VnbG91cF9wYXBhID0gVHJ1ZQorICAgICAgICAjIEUwMjAzIC0gQWNjZXNzIHRvIG1lbWJlciAnZG91Z2xvdXBfbW9pJyBiZWZvcmUgaXRzIGRlZmluaXRpb24KKyAgICAgICAgaWYgc2VsZi5kb3VnbG91cF9tb2k6CisgICAgICAgICAgICBwcmludCgnZG91Z2xvdXAgIScpCisgICAgICAgIHNlbGYuZG91Z2xvdXBfbW9pID0gVHJ1ZQorCisKK2NsYXNzIFFvU0FMQ29ubmVjdGlvbihvYmplY3QpOgorICAgICIiImJsYWJsYSIiIgorCisgICAgX3RoZV9pbnN0YW5jZSA9IE5vbmUKKworICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgIGlmIGNscy5fdGhlX2luc3RhbmNlIGlzIE5vbmU6CisgICAgICAgICAgICBjbHMuX3RoZV9pbnN0YW5jZSA9IG9iamVjdC5fX25ld19fKGNscykKKyAgICAgICAgcmV0dXJuIGNscy5fdGhlX2luc3RhbmNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgRGVmaW5lZE91dHNpZGVJbml0KG9iamVjdCk6CisgICAgIiIidXNlX2F0dHIgaXMgc2VlbiBhcyB0aGUgbWV0aG9kIGRlZmluaW5nIGF0dHIgYmVjYXVzZSBpdHMgaW4KKyAgICBmaXJzdCBwb3NpdGlvbgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgdXNlX2F0dHIoc2VsZik6CisgICAgICAgICIiInVzZSBhbmQgc2V0IG1lbWJlcnMiIiIKKyAgICAgICAgaWYgc2VsZi5hdHRyOgorICAgICAgICAgICAgcHJpbnQoJ2hvcCcpCisgICAgICAgIHNlbGYuYXR0ciA9IDEwCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiInJlc2V0IG1lbWJlcnMiIiIKKyAgICAgICAgc2VsZi5hdHRyID0gNApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2FjY2Vzcy9hY2Nlc3NfbWVtYmVyX2JlZm9yZV9kZWZpbml0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FjY2Vzcy9hY2Nlc3NfbWVtYmVyX2JlZm9yZV9kZWZpbml0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTk3YjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc19tZW1iZXJfYmVmb3JlX2RlZmluaXRpb24ucHkKQEAgLTAsMCArMSw0MCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbnZhbGlkLW5hbWUKKyMgcHlsaW50OiBkaXNhYmxlPWF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgQWFhYShvYmplY3QpOgorICAgICIiImNsYXNzIHdpdGggYXR0cmlidXRlcyBkZWZpbmVkIGluIHdyb25nIG9yZGVyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHZhcjEgPSBzZWxmLl92YXIyICMgW2FjY2Vzcy1tZW1iZXItYmVmb3JlLWRlZmluaXRpb25dCisgICAgICAgIHNlbGYuX3ZhcjIgPSAzCisgICAgICAgIHNlbGYuX3ZhcjMgPSB2YXIxCisKKworY2xhc3MgQmJiYihvYmplY3QpOgorICAgIEEgPSAyMworICAgIEIgPSBBCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVwbworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9fcmVwbyA9IGF0dHIKKyAgICAgICAgICAgIHJldHVybiBhdHRyCisKKworICAgIGRlZiBjYXRjaG1lKHNlbGYsIGF0dHIpOgorICAgICAgICAiIiJubyBBdHRyaWJ1dGVFcnJvciBjYXRjaGVkIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXBvICMgW2FjY2Vzcy1tZW1iZXItYmVmb3JlLWRlZmluaXRpb25dCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5fcmVwbyA9IGF0dHIKKyAgICAgICAgICAgIHJldHVybiBhdHRyCisKKworY2xhc3MgTWl4aW4ob2JqZWN0KToKKworICAgIGRlZiB0ZXN0X21peGluKHNlbGYpOgorICAgICAgICAiIiJEb24ndCBlbWl0IGFjY2Vzcy1tZW1iZXItYmVmb3JlLWRlZmluaXRpb24gZm9yIG1peGluIGNsYXNzZXMuIiIiCisgICAgICAgIGlmIHNlbGYuYWxyZWFkeV9kZWZpbmVkOgorICAgICAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9YXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0CisgICAgICAgICAgICBzZWxmLmFscmVhZHlfZGVmaW5lZCA9IE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX21lbWJlcl9iZWZvcmVfZGVmaW5pdGlvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc19tZW1iZXJfYmVmb3JlX2RlZmluaXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmE1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc19tZW1iZXJfYmVmb3JlX2RlZmluaXRpb24udHh0CkBAIC0wLDAgKzEsMiBAQAorYWNjZXNzLW1lbWJlci1iZWZvcmUtZGVmaW5pdGlvbjo4OjE1OkFhYWEuX19pbml0X186QWNjZXNzIHRvIG1lbWJlciAnX3ZhcjInIGJlZm9yZSBpdHMgZGVmaW5pdGlvbiBsaW5lIDkKK2FjY2Vzcy1tZW1iZXItYmVmb3JlLWRlZmluaXRpb246Mjg6MTk6QmJiYi5jYXRjaG1lOkFjY2VzcyB0byBtZW1iZXIgJ19yZXBvJyBiZWZvcmUgaXRzIGRlZmluaXRpb24gbGluZSAzMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2FjY2Vzcy9hY2Nlc3NfdG9fX25hbWVfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX3RvX19uYW1lX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkY2RiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX3RvX19uYW1lX18ucHkKQEAgLTAsMCArMSwyMSBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgcHJpbnQtc3RhdGVtZW50LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIidGVzdCBhY2Nlc3MgdG8gX19uYW1lX18gZ2l2ZXMgdW5kZWZpbmVkIG1lbWJlciBvbiBuZXcvb2xkIGNsYXNzIGluc3RhbmNlcworYnV0IG5vdCBvbiBuZXcvb2xkIGNsYXNzIG9iamVjdAorIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2NsYXNzIEFhYWE6CisgICAgIiIib2xkIGNsYXNzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmludChzZWxmLl9fbmFtZV9fKSAgIyBbbm8tbWVtYmVyXQorICAgICAgICBwcmludChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKKworY2xhc3MgTmV3Q2xhc3Mob2JqZWN0KToKKyAgICAiIiJuZXcgY2xhc3MiIiIKKworICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcHJpbnQoJ25ldycsIGNscy5fX25hbWVfXykKKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmludCgnaW5pdCcsIHNlbGYuX19uYW1lX18pICAjIFtuby1tZW1iZXJdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc190b19fbmFtZV9fLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX3RvX19uYW1lX18udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWY4MGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc190b19fbmFtZV9fLnR4dApAQCAtMCwwICsxLDIgQEAKK25vLW1lbWJlcjoxMDoxNDpBYWFhLl9faW5pdF9fOkluc3RhbmNlIG9mICdBYWFhJyBoYXMgbm8gJ19fbmFtZV9fJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MjE6MjI6TmV3Q2xhc3MuX19pbml0X186SW5zdGFuY2Ugb2YgJ05ld0NsYXNzJyBoYXMgbm8gJ19fbmFtZV9fJyBtZW1iZXI6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc190b19wcm90ZWN0ZWRfbWVtYmVycy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX3RvX3Byb3RlY3RlZF9tZW1iZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NDM4NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWNjZXNzL2FjY2Vzc190b19wcm90ZWN0ZWRfbWVtYmVycy5weQpAQCAtMCwwICsxLDIxMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgc3VwZXItaW5pdC1ub3QtY2FsbGVkLCBwcmludC1zdGF0ZW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWNsYXNzbWV0aG9kLWRlY29yYXRvcix1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIiVGVzdCBleHRlcm5hbCBhY2Nlc3MgdG8gcHJvdGVjdGVkIGNsYXNzIG1lbWJlcnMuIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2NsYXNzIE15Q2xhc3Mob2JqZWN0KToKKyAgICAiIiJDbGFzcyB3aXRoIHByb3RlY3RlZCBtZW1iZXJzLiIiIgorICAgIF9jbHNfcHJvdGVjdGVkID0gNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgTXlDbGFzcy5fY2xzX3Byb3RlY3RlZCA9IDYKKyAgICAgICAgc2VsZi5fcHJvdGVjdGVkID0gMQorICAgICAgICBzZWxmLnB1YmxpYyA9IG90aGVyCisgICAgICAgIHNlbGYuYXR0ciA9IDAKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAiIiJEb2NzdHJpbmcuIiIiCisgICAgICAgIHNlbGYuX3Byb3RlY3RlZCArPSBzZWxmLl9jbHNfcHJvdGVjdGVkCisgICAgICAgIHByaW50KHNlbGYucHVibGljLl9oYWhhKSAgIyBbcHJvdGVjdGVkLWFjY2Vzc10KKworICAgIGRlZiBjbHNtZXRoKGNscyk6CisgICAgICAgICIiIkRvY3N0cmluZy4iIiIKKyAgICAgICAgY2xzLl9jbHNfcHJvdGVjdGVkICs9IDEKKyAgICAgICAgcHJpbnQoY2xzLl9jbHNfcHJvdGVjdGVkKQorICAgIGNsc21ldGggPSBjbGFzc21ldGhvZChjbHNtZXRoKQorCisgICAgZGVmIF9wcml2YXRlX21ldGhvZChzZWxmKToKKyAgICAgICAgIiIiRG9pbmcgbm90aGluZy4iIiIKKworCitjbGFzcyBTdWJjbGFzcyhNeUNsYXNzKToKKyAgICAiIiJTdWJjbGFzcyB3aXRoIHByb3RlY3RlZCBtZW1iZXJzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBNeUNsYXNzLl9wcm90ZWN0ZWQgPSA1CisgICAgICAgIHN1cGVyKCkuX3ByaXZhdGVfbWV0aG9kKCkKKworSU5TVCA9IFN1YmNsYXNzKCkKK0lOU1QuYXR0ciA9IDEKK3ByaW50KElOU1QuYXR0cikKK0lOU1QuX3Byb3RlY3RlZCA9IDIgICMgW3Byb3RlY3RlZC1hY2Nlc3NdCitwcmludChJTlNULl9wcm90ZWN0ZWQpICAjIFtwcm90ZWN0ZWQtYWNjZXNzXQorSU5TVC5fY2xzX3Byb3RlY3RlZCA9IDMgICMgW3Byb3RlY3RlZC1hY2Nlc3NdCitwcmludChJTlNULl9jbHNfcHJvdGVjdGVkKSAgIyBbcHJvdGVjdGVkLWFjY2Vzc10KKworCitjbGFzcyBJc3N1ZTEwMzEob2JqZWN0KToKKyAgICAiIiJUZXN0IGZvciBHaXRIdWIgaXNzdWUgMTAzMSIiIgorICAgIF9hdHRyID0gMQorCisgICAgZGVmIGNvcnJlY3RfYWNjZXNzKHNlbGYpOgorICAgICAgICAiIiJEZW1vbnN0cmF0ZXMgY29ycmVjdCBhY2Nlc3MiIiIKKyAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX2F0dHIKKworICAgIGRlZiBpbmNvcnJlY3RfYWNjZXNzKHNlbGYpOgorICAgICAgICAiIiJEZW1vbnN0cmF0ZXMgaW5jb3JyZWN0IGFjY2VzcyIiIgorICAgICAgICBpZiBzZWxmLl9hdHRyID09IDE6CisgICAgICAgICAgICByZXR1cm4gdHlwZShJTlNUKS5fcHJvdGVjdGVkICAjIFtwcm90ZWN0ZWQtYWNjZXNzXQorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIElzc3VlMTgwMihvYmplY3QpOgorICAgICIiIlRlc3QgZm9yIEdpdEh1YiBpc3N1ZSAxODAyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fZm9vID0gdmFsdWUKKyAgICAgICAgc2VsZi5fX3ByaXZhdGUgPSAyICogdmFsdWUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJUZXN0IGEgY29ycmVjdCBhY2Nlc3MgYXMgdGhlIGFjY2VzcyB0byBwcm90ZWN0ZWQgbWVtYmVyIGlzIGluIGEgc3BlY2lhbCBtZXRob2QiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgYW5zd2VyID0gc2VsZi5fZm9vID09IG90aGVyLl9mb28KKyAgICAgICAgICAgIHJldHVybiBhbnN3ZXIgYW5kIHNlbGYuX19wcml2YXRlID09IG90aGVyLl9fcHJpdmF0ZSAgIyBbcHJvdGVjdGVkLWFjY2Vzc10KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgbm90X2luX3NwZWNpYWwoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCBhbiBpbmNvcnJlY3QgYWNjZXNzIGFzIHRoZSBhY2Nlc3MgdG8gcHJvdGVjdGVkIG1lbWJlciBpcyBub3QgaW5zaWRlIGEgc3BlY2lhbCBtZXRob2QKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mb28gPT0gb3RoZXIuX2ZvbyAgIyBbcHJvdGVjdGVkLWFjY2Vzc10KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgYSBjb3JyZWN0IGFjY2VzcyBhcyB0aGUgYWNjZXNzIHRvIHByb3RlY3RlZCBtZW1iZXIKKyAgICAgICAgaXMgaW5zaWRlIGEgc3BlY2lhbCBtZXRob2QgZXZlbiBpZiBpdCBpcyBkZWVwbHkgbmVzdGVkCisgICAgICAgICIiIgorICAgICAgICBpZiAyID4gMToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgICAgICBpZiAiYW5zd2VyIiA9PSAiNDIiOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZm9vID09IG90aGVyLl9mb28KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19mYWtlX3NwZWNpYWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IGFuIGluY29ycmVjdCBhY2Nlc3MgYXMgdGhlIGFjY2VzcworICAgICAgICB0byBwcm90ZWN0ZWQgbWVtYmVyIGlzIG5vdCBpbnNpZGUgYSBsaWNpdCBzcGVjaWFsIG1ldGhvZAorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZvbyA9PSBvdGhlci5fZm9vICAjIFtwcm90ZWN0ZWQtYWNjZXNzXQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBJc3N1ZTExNTlPdGhlckNsYXNzKG9iamVjdCk6CisgICAgIiIiVGVzdCBmb3IgR2l0SHViIGlzc3VlIDExNTkiIiIKKworICAgIF9mb28gPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2JhciA9IDAKKworCitjbGFzcyBJc3N1ZTExNTkob2JqZWN0KToKKyAgICAiIiJUZXN0IGZvciBHaXRIdWIgaXNzdWUgMTE1OSIiIgorCisgICAgX2ZvbyA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fYmFyID0gMAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFjY2Vzc19jbHNfYXR0cihjbHMpOgorICAgICAgICAiIiIKKyAgICAgICAgQWNjZXNzIHRvIHByb3RlY3RlZCBjbGFzcyBtZW1iZXJzIGluc2lkZSBjbGFzcyBtZXRob2RzIGlzIE9LLgorICAgICAgICAiIiIKKworICAgICAgICBfID0gY2xzLl9mb28KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhc3NpZ25fY2xzX2F0dHIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIEFzc2lnbm1lbnQgdG8gcHJvdGVjdGVkIGNsYXNzIG1lbWJlcnMgaW5zaWRlIGNsYXNzIG1ldGhvZHMgaXMgT0suCisgICAgICAgICIiIgorCisgICAgICAgIGNscy5fZm9vID0gMQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFjY2Vzc19pbnN0X2F0dHIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIEFjY2VzcyB0byBwcm90ZWN0ZWQgaW5zdGFuY2UgbWVtYmVycyBpbnNpZGUgY2xhc3MgbWV0aG9kcyBpcyBPSy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaW5zdGFuY2UgPSBjbHMoKQorICAgICAgICBfID0gaW5zdGFuY2UuX2JhcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFzc2lnbl9pbnN0X2F0dHIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIEFzc2lnbm1lbnQgdG8gcHJvdGVjdGVkIG1lbWJlcnMgaW5zaWRlIGNsYXNzIG1ldGhvZHMgaXMgT0suCisgICAgICAgICIiIgorCisgICAgICAgIGluc3RhbmNlID0gY2xzKCkKKyAgICAgICAgaW5zdGFuY2UuX2JhciA9IDEKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhY2Nlc3Nfb3RoZXJfYXR0cihjbHMpOgorICAgICAgICAiIiIKKyAgICAgICAgQWNjZXNzIHRvIHByb3RlY3RlZCBpbnN0YW5jZSBtZW1iZXJzIG9mIG90aGVyIGNsYXNzZXMgaXMgbm90IE9LLgorICAgICAgICAiIiIKKworICAgICAgICBpbnN0YW5jZSA9IElzc3VlMTE1OU90aGVyQ2xhc3MoKQorICAgICAgICBpbnN0YW5jZS5fYmFyID0gMyAgIyBbcHJvdGVjdGVkLWFjY2Vzc10KKyAgICAgICAgXyA9IGluc3RhbmNlLl9mb28gICMgW3Byb3RlY3RlZC1hY2Nlc3NdCisKKworY2xhc3MgSXNzdWUxMTU5U3ViY2xhc3MoSXNzdWUxMTU5KToKKyAgICAiIiJUZXN0IGZvciBHaXRIdWIgaXNzdWUgMTE1OSIiIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFjY2Vzc19pbnN0X2F0dHIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIEFjY2VzcyB0byBwcm90ZWN0ZWQgaW5zdGFuY2UgbWVtYmVycyBpbnNpZGUgY2xhc3MgbWV0aG9kcyBpcyBPSy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaW5zdGFuY2UgPSBjbHMoKQorICAgICAgICBfID0gaW5zdGFuY2UuX2JhcgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFzc2lnbl9pbnN0X2F0dHIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIEFzc2lnbm1lbnQgdG8gcHJvdGVjdGVkIGluc3RhbmNlIG1lbWJlcnMgaW5zaWRlIGNsYXNzIG1ldGhvZHMgaXMgT0suCisgICAgICAgICIiIgorCisgICAgICAgIGluc3RhbmNlID0gY2xzKCkKKyAgICAgICAgaW5zdGFuY2UuX2JhciA9IDEKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhY2Nlc3NfbWlzc2luZ19tZW1iZXIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIEFjY2VzcyB0byB1bmFzc2lnbmVkIG1lbWJlcnMgaW5zaWRlIGNsYXNzIG1ldGhvZHMgaXMgbm90IE9LLgorICAgICAgICAiIiIKKworICAgICAgICBpbnN0YW5jZSA9IGNscygpCisgICAgICAgIF8gPSBpbnN0YW5jZS5fYmF6ICAjIFtuby1tZW1iZXIscHJvdGVjdGVkLWFjY2Vzc10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBhc3NpZ25fbWlzc2luZ19tZW1iZXIoY2xzKToKKyAgICAgICAgIiIiCisgICAgICAgIERlZmluaW5nIGF0dHJpYnV0ZXMgb3V0c2lkZSBpbml0IGlzIHN0aWxsIG5vdCBPSy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaW5zdGFuY2UgPSBjbHMoKQorICAgICAgICBpbnN0YW5jZS5fcXV4ID0gMSAgIyBbYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0XQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGFjY2Vzc19vdGhlcl9hdHRyKGNscyk6CisgICAgICAgICIiIgorICAgICAgICBBY2Nlc3MgdG8gcHJvdGVjdGVkIGluc3RhbmNlIG1lbWJlcnMgb2Ygb3RoZXIgY2xhc3NlcyBpcyBub3QgT0suCisgICAgICAgICIiIgorCisgICAgICAgIGluc3RhbmNlID0gSXNzdWUxMTU5T3RoZXJDbGFzcygpCisgICAgICAgIGluc3RhbmNlLl9iYXIgPSAzICAjIFtwcm90ZWN0ZWQtYWNjZXNzXQorICAgICAgICBfID0gaW5zdGFuY2UuX2ZvbyAgIyBbcHJvdGVjdGVkLWFjY2Vzc10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX3RvX3Byb3RlY3RlZF9tZW1iZXJzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hY2Nlc3MvYWNjZXNzX3RvX3Byb3RlY3RlZF9tZW1iZXJzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkzNjgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FjY2Vzcy9hY2Nlc3NfdG9fcHJvdGVjdGVkX21lbWJlcnMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK3Byb3RlY3RlZC1hY2Nlc3M6MTk6MTQ6TXlDbGFzcy50ZXN0OkFjY2VzcyB0byBhIHByb3RlY3RlZCBtZW1iZXIgX2hhaGEgb2YgYSBjbGllbnQgY2xhc3MKK3Byb3RlY3RlZC1hY2Nlc3M6NDE6MDo6QWNjZXNzIHRvIGEgcHJvdGVjdGVkIG1lbWJlciBfcHJvdGVjdGVkIG9mIGEgY2xpZW50IGNsYXNzCitwcm90ZWN0ZWQtYWNjZXNzOjQyOjY6OkFjY2VzcyB0byBhIHByb3RlY3RlZCBtZW1iZXIgX3Byb3RlY3RlZCBvZiBhIGNsaWVudCBjbGFzcworcHJvdGVjdGVkLWFjY2Vzczo0MzowOjpBY2Nlc3MgdG8gYSBwcm90ZWN0ZWQgbWVtYmVyIF9jbHNfcHJvdGVjdGVkIG9mIGEgY2xpZW50IGNsYXNzCitwcm90ZWN0ZWQtYWNjZXNzOjQ0OjY6OkFjY2VzcyB0byBhIHByb3RlY3RlZCBtZW1iZXIgX2Nsc19wcm90ZWN0ZWQgb2YgYSBjbGllbnQgY2xhc3MKK3Byb3RlY3RlZC1hY2Nlc3M6NTg6MTk6SXNzdWUxMDMxLmluY29ycmVjdF9hY2Nlc3M6QWNjZXNzIHRvIGEgcHJvdGVjdGVkIG1lbWJlciBfcHJvdGVjdGVkIG9mIGEgY2xpZW50IGNsYXNzCitwcm90ZWN0ZWQtYWNjZXNzOjcyOjQ4Oklzc3VlMTgwMi5fX2VxX186QWNjZXNzIHRvIGEgcHJvdGVjdGVkIG1lbWJlciBfX3ByaXZhdGUgb2YgYSBjbGllbnQgY2xhc3MKK3Byb3RlY3RlZC1hY2Nlc3M6ODA6MzI6SXNzdWUxODAyLm5vdF9pbl9zcGVjaWFsOkFjY2VzcyB0byBhIHByb3RlY3RlZCBtZW1iZXIgX2ZvbyBvZiBhIGNsaWVudCBjbGFzcworcHJvdGVjdGVkLWFjY2VzczoxMDA6MzI6SXNzdWUxODAyLl9fZmFrZV9zcGVjaWFsX186QWNjZXNzIHRvIGEgcHJvdGVjdGVkIG1lbWJlciBfZm9vIG9mIGEgY2xpZW50IGNsYXNzCitwcm90ZWN0ZWQtYWNjZXNzOjE2Mjo4Oklzc3VlMTE1OS5hY2Nlc3Nfb3RoZXJfYXR0cjpBY2Nlc3MgdG8gYSBwcm90ZWN0ZWQgbWVtYmVyIF9iYXIgb2YgYSBjbGllbnQgY2xhc3MKK3Byb3RlY3RlZC1hY2Nlc3M6MTYzOjEyOklzc3VlMTE1OS5hY2Nlc3Nfb3RoZXJfYXR0cjpBY2Nlc3MgdG8gYSBwcm90ZWN0ZWQgbWVtYmVyIF9mb28gb2YgYSBjbGllbnQgY2xhc3MKK25vLW1lbWJlcjoxOTQ6MTI6SXNzdWUxMTU5U3ViY2xhc3MuYWNjZXNzX21pc3NpbmdfbWVtYmVyOkluc3RhbmNlIG9mICdJc3N1ZTExNTlTdWJjbGFzcycgaGFzIG5vICdfYmF6JyBtZW1iZXI7IG1heWJlICdfYmFyJz86SU5GRVJFTkNFCitwcm90ZWN0ZWQtYWNjZXNzOjE5NDoxMjpJc3N1ZTExNTlTdWJjbGFzcy5hY2Nlc3NfbWlzc2luZ19tZW1iZXI6QWNjZXNzIHRvIGEgcHJvdGVjdGVkIG1lbWJlciBfYmF6IG9mIGEgY2xpZW50IGNsYXNzCithdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQ6MjAzOjg6SXNzdWUxMTU5U3ViY2xhc3MuYXNzaWduX21pc3NpbmdfbWVtYmVyOkF0dHJpYnV0ZSAnX3F1eCcgZGVmaW5lZCBvdXRzaWRlIF9faW5pdF9fCitwcm90ZWN0ZWQtYWNjZXNzOjIxMjo4Oklzc3VlMTE1OVN1YmNsYXNzLmFjY2Vzc19vdGhlcl9hdHRyOkFjY2VzcyB0byBhIHByb3RlY3RlZCBtZW1iZXIgX2JhciBvZiBhIGNsaWVudCBjbGFzcworcHJvdGVjdGVkLWFjY2VzczoyMTM6MTI6SXNzdWUxMTU5U3ViY2xhc3MuYWNjZXNzX290aGVyX2F0dHI6QWNjZXNzIHRvIGEgcHJvdGVjdGVkIG1lbWJlciBfZm9vIG9mIGEgY2xpZW50IGNsYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI1OGZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheC5weQpAQCAtMCwwICsxLDg0IEBACisiIiJUZXN0IFBFUCA2MDQgLSBBbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXgiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nLHVudXNlZC1hcmd1bWVudCxpbnZhbGlkLW5hbWUsbWlzc2luZy1jbGFzcy1kb2NzdHJpbmcKKyMgcHlsaW50OiBkaXNhYmxlPWluaGVyaXQtbm9uLWNsYXNzLHRvby1mZXctcHVibGljLW1ldGhvZHMKK2ltcG9ydCBkYXRhY2xhc3NlcworaW1wb3J0IHR5cGluZworZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitmcm9tIHR5cGluZyBpbXBvcnQgTmFtZWRUdXBsZSwgVHlwZWREaWN0CisKK0FsaWFzID0gc3RyIHwgbGlzdFtpbnRdCitsc3QgPSBbdHlwaW5nLkRpY3Rbc3RyLCBpbnRdIHwgTm9uZSxdCisKK3ZhcjE6IHR5cGluZy5EaWN0W3N0ciwgaW50IHwgTm9uZV0KK3ZhcjI6IGludCB8IHN0ciB8IE5vbmUKK3ZhcjM6IGludCB8IGxpc3Rbc3RyIHwgaW50XQordmFyNDogdHlwaW5nLkRpY3RbdHlwaW5nLlR1cGxlW2ludCwgaW50XSB8IGludCwgTm9uZV0KKworY2FzdF92YXIgPSAxCitjYXN0X3ZhciA9IHR5cGluZy5jYXN0KHN0ciB8IGludCwgY2FzdF92YXIpCisKK1QgPSB0eXBpbmcuVHlwZVZhcigiVCIsIGludCB8IHN0ciwgYm9vbCkKKworKGxhbWJkYSB4OiAyKShpbnQgfCBzdHIpCisKK3Zhcjogc3RyIHwgaW50CisKK2RlZiBmdW5jKGFyZzogaW50IHwgc3RyKToKKyAgICBwYXNzCisKK2RlZiBmdW5jMigpIC0+IGludCB8IHN0cjoKKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbUNscyhpbnQpOgorICAgIHBhc3MKKworQWxpYXMyID0gQ3VzdG9tQ2xzIHwgIHN0cgorCit2YXIyID0gQ3VzdG9tQ2xzKDEpIHwgaW50KDIpCisKKworIyBDaGVjayB0eXBpbmcuTmFtZWRUdXBsZQorQ3VzdG9tTmFtZWRUdXBsZSA9IHR5cGluZy5OYW1lZFR1cGxlKAorICAgICJDdXN0b21OYW1lZFR1cGxlIiwgWygibXlfdmFyIiwgaW50IHwgc3RyKV0pCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUyKE5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUzKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IGludCB8IHN0cgorCisKKyMgQ2hlY2sgdHlwaW5nLlR5cGVkRGljdAorQ3VzdG9tVHlwZWREaWN0ID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QiLCBteV92YXI9KGludCB8IHN0cikpCisKK0N1c3RvbVR5cGVkRGljdDIgPSBUeXBlZERpY3QoIkN1c3RvbVR5cGVkRGljdDIiLCB7Im15X3ZhciI6IGludCB8IHN0cn0pCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDMoVHlwZWREaWN0KToKKyAgICBteV92YXI6IGludCB8IHN0cgorCitjbGFzcyBDdXN0b21UeXBlZERpY3Q0KHR5cGluZy5UeXBlZERpY3QpOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKKworIyBDaGVjayBkYXRhY2xhc3NlcworZGVmIG15X2RlY29yYXRvcigqYXJncywgKiprd2FyZ3MpOgorICAgIGRlZiB3cmFwcygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHdyYXBzCisKK0BkYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczoKKyAgICBteV92YXI6IGludCB8IHN0cgorCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3MyOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKK0BkYXRhY2xhc3MoKQorY2xhc3MgQ3VzdG9tRGF0YUNsYXNzMzoKKyAgICBteV92YXI6IGludCB8IHN0cgorCitAbXlfZGVjb3JhdG9yCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3M0OgorICAgIG15X3ZhcjogaW50IHwgc3RyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE4YzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjEwCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X2Vycm9yLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheF9lcnJvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJlYWNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheF9lcnJvci5weQpAQCAtMCwwICsxLDg5IEBACisiIiJUZXN0IFBFUCA2MDQgLSBBbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXgKK3dpdGhvdXQgcG9zdHBvbmVkIGV2YWx1YXRpb24gb2YgYW5ub3RhdGlvbnMuCisKK0ZvciBQeXRob24gMy43IC0gMy45OiBFdmVyeXRoaW5nIHNob3VsZCBmYWlsLgorVGVzdGluZyBvbmx5IDMuOC8zLjkgdG8gc3VwcG9ydCBUeXBlZERpY3QuCisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nLHVudXNlZC1hcmd1bWVudCxpbnZhbGlkLW5hbWUsbWlzc2luZy1jbGFzcy1kb2NzdHJpbmcsaW5oZXJpdC1ub24tY2xhc3MsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxsaW5lLXRvby1sb25nCitpbXBvcnQgZGF0YWNsYXNzZXMKK2ltcG9ydCB0eXBpbmcKK2Zyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcworZnJvbSB0eXBpbmcgaW1wb3J0IE5hbWVkVHVwbGUsIFR5cGVkRGljdAorCisKK0FsaWFzID0gc3RyIHwgdHlwaW5nLkxpc3RbaW50XSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KK2xzdCA9IFt0eXBpbmcuRGljdFtzdHIsIGludF0gfCBOb25lLF0gICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK3ZhcjE6IHR5cGluZy5EaWN0W3N0ciwgaW50IHwgTm9uZV0gICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCit2YXIyOiBpbnQgfCBzdHIgfCBOb25lICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQordmFyMzogaW50IHwgdHlwaW5nLkxpc3Rbc3RyIHwgaW50XSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KK3ZhcjQ6IHR5cGluZy5EaWN0W3R5cGluZy5UdXBsZVtpbnQsIGludF0gfCBpbnQsIE5vbmVdICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCitjYXN0X3ZhciA9IDEKK2Nhc3RfdmFyID0gdHlwaW5nLmNhc3Qoc3RyIHwgaW50LCBjYXN0X3ZhcikgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK1QgPSB0eXBpbmcuVHlwZVZhcigiVCIsIGludCB8IHN0ciwgYm9vbCkgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKKyhsYW1iZGEgeDogMikoaW50IHwgc3RyKSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKwordmFyOiBzdHIgfCBpbnQgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK2RlZiBmdW5jKGFyZzogaW50IHwgc3RyKTogICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisgICAgcGFzcworCitkZWYgZnVuYzIoKSAtPiBpbnQgfCBzdHI6ICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorICAgIHBhc3MKKworY2xhc3MgQ3VzdG9tQ2xzKGludCk6CisgICAgcGFzcworCitBbGlhczIgPSBDdXN0b21DbHMgfCAgc3RyICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCit2YXIyID0gQ3VzdG9tQ2xzKDEpIHwgaW50KDIpCisKKworIyBDaGVjayB0eXBpbmcuTmFtZWRUdXBsZQorQ3VzdG9tTmFtZWRUdXBsZSA9IHR5cGluZy5OYW1lZFR1cGxlKAorICAgICJDdXN0b21OYW1lZFR1cGxlIiwgWygibXlfdmFyIiwgaW50IHwgc3RyKV0pICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCitjbGFzcyBDdXN0b21OYW1lZFR1cGxlMihOYW1lZFR1cGxlKToKKyAgICBteV92YXI6IGludCB8IHN0ciAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKworY2xhc3MgQ3VzdG9tTmFtZWRUdXBsZTModHlwaW5nLk5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogaW50IHwgc3RyICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCisKKyMgQ2hlY2sgdHlwaW5nLlR5cGVkRGljdAorQ3VzdG9tVHlwZWREaWN0ID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QiLCBteV92YXI9aW50IHwgc3RyKSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKworQ3VzdG9tVHlwZWREaWN0MiA9IFR5cGVkRGljdCgiQ3VzdG9tVHlwZWREaWN0MiIsIHsibXlfdmFyIjogaW50IHwgc3RyfSkgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDMoVHlwZWREaWN0KToKKyAgICBteV92YXI6IGludCB8IHN0ciAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKworY2xhc3MgQ3VzdG9tVHlwZWREaWN0NCh0eXBpbmcuVHlwZWREaWN0KToKKyAgICBteV92YXI6IGludCB8IHN0ciAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKworCisjIENoZWNrIGRhdGFjbGFzc2VzCitkZWYgbXlfZGVjb3JhdG9yKCphcmdzLCAqKmt3YXJncyk6CisgICAgZGVmIHdyYXBzKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gd3JhcHMKKworQGRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzOgorICAgIG15X3ZhcjogaW50IHwgc3RyICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3MyOgorICAgIG15X3ZhcjogaW50IHwgc3RyICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCitAZGF0YWNsYXNzKCkKK2NsYXNzIEN1c3RvbURhdGFDbGFzczM6CisgICAgbXlfdmFyOiBpbnQgfCBzdHIgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK0BteV9kZWNvcmF0b3IKK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczQ6CisgICAgbXlfdmFyOiBpbnQgfCBzdHIgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X2Vycm9yLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheF9lcnJvci5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZiOTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheF9lcnJvci5yYwpAQCAtMCwwICsxLDMgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKK21heF9weXZlcj0zLjEwCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X2Vycm9yLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbHRlcm5hdGl2ZS9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXhfZXJyb3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzFiY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X2Vycm9yLnR4dApAQCAtMCwwICsxLDI0IEBACit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjE0Ojg6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoxNTo3Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTc6MjM6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoxODo2Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTk6Njo6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjIwOjE4Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MjM6MjM6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoyNToyNDo6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjI3OjE0Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246Mjk6NTo6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjMxOjE0OmZ1bmM6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjM0OjE1OmZ1bmMyOnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo0MDo5Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246NDc6MzY6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo1MDoxMjpDdXN0b21OYW1lZFR1cGxlMjp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246NTM6MTI6Q3VzdG9tTmFtZWRUdXBsZTM6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjU3OjU0Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246NTk6NjA6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo2MjoxMjpDdXN0b21UeXBlZERpY3QzOnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo2NToxMjpDdXN0b21UeXBlZERpY3Q0OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo3NjoxMjpDdXN0b21EYXRhQ2xhc3M6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjgwOjEyOkN1c3RvbURhdGFDbGFzczI6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjg0OjEyOkN1c3RvbURhdGFDbGFzczM6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjg5OjEyOkN1c3RvbURhdGFDbGFzczQ6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X3B5MzcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X3B5MzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNDYzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbHRlcm5hdGl2ZS9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXhfcHkzNy5weQpAQCAtMCwwICsxLDkwIEBACisiIiJUZXN0IFBFUCA2MDQgLSBBbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXgKK3dpdGggcG9zdHBvbmVkIGV2YWx1YXRpb24gb2YgYW5ub3RhdGlvbnMgZW5hYmxlZC4KKworRm9yIFB5dGhvbiAzLjcgLSAzLjk6IE1vc3QgdGhpbmdzIHNob3VsZCB3b3JrLgorVGVzdGluZyBvbmx5IDMuOC8zLjkgdG8gc3VwcG9ydCBUeXBlZERpY3QuCisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nLHVudXNlZC1hcmd1bWVudCxpbnZhbGlkLW5hbWUsbWlzc2luZy1jbGFzcy1kb2NzdHJpbmcsaW5oZXJpdC1ub24tY2xhc3MsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxsaW5lLXRvby1sb25nCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCitpbXBvcnQgZGF0YWNsYXNzZXMKK2ltcG9ydCB0eXBpbmcKK2Zyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcworZnJvbSB0eXBpbmcgaW1wb3J0IE5hbWVkVHVwbGUsIFR5cGVkRGljdAorCisKK0FsaWFzID0gc3RyIHwgdHlwaW5nLkxpc3RbaW50XSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KK2xzdCA9IFt0eXBpbmcuRGljdFtzdHIsIGludF0gfCBOb25lLF0gICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK3ZhcjE6IHR5cGluZy5EaWN0W3N0ciwgaW50IHwgTm9uZV0KK3ZhcjI6IGludCB8IHN0ciB8IE5vbmUKK3ZhcjM6IGludCB8IGxpc3Rbc3RyIHwgaW50XQordmFyNDogdHlwaW5nLkRpY3RbdHlwaW5nLlR1cGxlW2ludCwgaW50XSB8IGludCwgTm9uZV0KKworY2FzdF92YXIgPSAxCitjYXN0X3ZhciA9IHR5cGluZy5jYXN0KHN0ciB8IGludCwgY2FzdF92YXIpICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCitUID0gdHlwaW5nLlR5cGVWYXIoIlQiLCBpbnQgfCBzdHIsIGJvb2wpICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCisobGFtYmRhIHg6IDIpKGludCB8IHN0cikgICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dCisKK3Zhcjogc3RyIHwgaW50CisKK2RlZiBmdW5jKGFyZzogaW50IHwgc3RyKToKKyAgICBwYXNzCisKK2RlZiBmdW5jMigpIC0+IGludCB8IHN0cjoKKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbUNscyhpbnQpOgorICAgIHBhc3MKKworQWxpYXMyID0gQ3VzdG9tQ2xzIHwgIHN0ciAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKwordmFyMiA9IEN1c3RvbUNscygxKSB8IGludCgyKQorCisKKyMgQ2hlY2sgdHlwaW5nLk5hbWVkVHVwbGUKK0N1c3RvbU5hbWVkVHVwbGUgPSB0eXBpbmcuTmFtZWRUdXBsZSgKKyAgICAiQ3VzdG9tTmFtZWRUdXBsZSIsIFsoIm15X3ZhciIsIGludCB8IHN0cildKSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKworY2xhc3MgQ3VzdG9tTmFtZWRUdXBsZTIoTmFtZWRUdXBsZSk6CisgICAgbXlfdmFyOiBpbnQgfCBzdHIKKworY2xhc3MgQ3VzdG9tTmFtZWRUdXBsZTModHlwaW5nLk5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKKworIyBDaGVjayB0eXBpbmcuVHlwZWREaWN0CitDdXN0b21UeXBlZERpY3QgPSBUeXBlZERpY3QoIkN1c3RvbVR5cGVkRGljdCIsIG15X3Zhcj1pbnQgfCBzdHIpICAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQorCitDdXN0b21UeXBlZERpY3QyID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QyIiwgeyJteV92YXIiOiBpbnQgfCBzdHJ9KSAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0KKworY2xhc3MgQ3VzdG9tVHlwZWREaWN0MyhUeXBlZERpY3QpOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDQodHlwaW5nLlR5cGVkRGljdCk6CisgICAgbXlfdmFyOiBpbnQgfCBzdHIKKworCisjIENoZWNrIGRhdGFjbGFzc2VzCitkZWYgbXlfZGVjb3JhdG9yKCphcmdzLCAqKmt3YXJncyk6CisgICAgZGVmIHdyYXBzKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gd3JhcHMKKworQGRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczI6CisgICAgbXlfdmFyOiBpbnQgfCBzdHIKKworQGRhdGFjbGFzcygpCitjbGFzcyBDdXN0b21EYXRhQ2xhc3MzOgorICAgIG15X3ZhcjogaW50IHwgc3RyCisKK0BteV9kZWNvcmF0b3IKK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczQ6CisgICAgbXlfdmFyOiBpbnQgfCBzdHIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbHRlcm5hdGl2ZS9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXhfcHkzNy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbHRlcm5hdGl2ZS9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXhfcHkzNy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZiOTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FsdGVybmF0aXZlL2FsdGVybmF0aXZlX3VuaW9uX3N5bnRheF9weTM3LnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOAorbWF4X3B5dmVyPTMuMTAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbHRlcm5hdGl2ZS9hbHRlcm5hdGl2ZV91bmlvbl9zeW50YXhfcHkzNy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X3B5MzcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Nzc5M2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYWx0ZXJuYXRpdmUvYWx0ZXJuYXRpdmVfdW5pb25fc3ludGF4X3B5MzcudHh0CkBAIC0wLDAgKzEsOSBAQAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoxNTo4Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTY6Nzo6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjI0OjIzOjp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MjY6MjQ6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoyODoxNDo6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjQxOjk6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfAordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo0ODozNjo6dW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciB8Cit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjU4OjU0Ojp1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHwKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246NjA6NjA6OnVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgfApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fub21hbG91c19iYWNrc2xhc2hfZXNjYXBlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fub21hbG91c19iYWNrc2xhc2hfZXNjYXBlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTNkZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX2JhY2tzbGFzaF9lc2NhcGUucHkKQEAgLTAsMCArMSwyMSBAQAorIiIiVGVzdCBmb3IgYW5vbWFsb3VzIGJhY2tzbGFzaCBlc2NhcGVzIGluIHN0cmluZ3MiIiIKKworCitCQURfRVNDQVBFID0gJ1x6JyAgIyBbYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmddCitCQURfRVNDQVBFX05PVF9GSVJTVCA9ICdhYmNceicgICMgW2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nXQorQkFEX0VTQ0FQRV9XSVRIX1BSRUZJWCA9IGInYWJjXHonICAjIFthbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZ10KK0JBRF9FU0NBUEVfV0lUSF9CQUNLU0xBU0ggPSBiJ2FcCisgICAgXHonICAjIFthbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZ10KKyMgKzM6W2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nXQorQkFEX0VTQ0FQRV9CTE9DSyA9IGInJycKKyAgICBhYmMKKyAgICBcegorJycnCitCQURfRVNDQVBFX1BBUkVOUyA9IChiJ2FiYycKKyAgICAgICAgICAgICAgICAgICAgIGInXHonKSAgIyBbYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmddCitHT09EX0VTQ0FQRSA9ICdcYicKKworIyBWYWxpZCByYXcgc3RyaW5ncworQkFEX0VTQ0FQRV9CVVRfUkFXID0gcidceicKKworIyBJbiBhIGNvbW1lbnQgeW91IGNhbiBoYXZlIHdoYXRldmVyIHlvdSB3YW50OiBcegpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fub21hbG91c19iYWNrc2xhc2hfZXNjYXBlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbm9tYWxvdXNfYmFja3NsYXNoX2VzY2FwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjYjg1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbm9tYWxvdXNfYmFja3NsYXNoX2VzY2FwZS50eHQKQEAgLTAsMCArMSw2IEBACithbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZzo0OjE0OjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdceicuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjU6Mjc6OiJBbm9tYWxvdXMgYmFja3NsYXNoIGluIHN0cmluZzogJ1x6Jy4gU3RyaW5nIGNvbnN0YW50IG1pZ2h0IGJlIG1pc3NpbmcgYW4gciBwcmVmaXguIgorYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmc6NjozMDo6IkFub21hbG91cyBiYWNrc2xhc2ggaW4gc3RyaW5nOiAnXHonLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIHByZWZpeC4iCithbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZzo4OjQ6OiJBbm9tYWxvdXMgYmFja3NsYXNoIGluIHN0cmluZzogJ1x6Jy4gU3RyaW5nIGNvbnN0YW50IG1pZ2h0IGJlIG1pc3NpbmcgYW4gciBwcmVmaXguIgorYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmc6MTI6NDo6IkFub21hbG91cyBiYWNrc2xhc2ggaW4gc3RyaW5nOiAnXHonLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIHByZWZpeC4iCithbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZzoxNToyMzo6IkFub21hbG91cyBiYWNrc2xhc2ggaW4gc3RyaW5nOiAnXHonLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIHByZWZpeC4iCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5My5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbm9tYWxvdXNfdW5pY29kZV9lc2NhcGVfcHkzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZWJkZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5My5weQpAQCAtMCwwICsxLDE5IEBACisjIHB5bGludDpkaXNhYmxlPXBvaW50bGVzcy1zdHJpbmctc3RhdGVtZW50CisiIiJUZXN0IGZvciBiYWNrc2xhc2ggZXNjYXBlcyBpbiBieXRlIHZzIHVuaWNvZGUgc3RyaW5ncyIiIgorCisjIFdvdWxkIGJlIHZhbGlkIGluIFVuaWNvZGUsIGJ1dCBwcm9iYWJseSBub3Qgd2hhdCB5b3Ugd2FudCBvdGhlcndpc2UKK0JBRF9VTklDT0RFID0gYidcdTAwNDInICAjIFthbm9tYWxvdXMtdW5pY29kZS1lc2NhcGUtaW4tc3RyaW5nXQorQkFEX0xPTkdfVU5JQ09ERSA9IGInXFUwMDAwMDA0MicgICMgW2Fub21hbG91cy11bmljb2RlLWVzY2FwZS1pbi1zdHJpbmddCisjICsxOlthbm9tYWxvdXMtdW5pY29kZS1lc2NhcGUtaW4tc3RyaW5nXQorQkFEX05BTUVEX1VOSUNPREUgPSBiJ1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX0nCisKK0dPT0RfVU5JQ09ERSA9IHUnXHUwMDQyJworR09PRF9MT05HX1VOSUNPREUgPSB1J1xVMDAwMDAwNDInCitHT09EX05BTUVEX1VOSUNPREUgPSB1J1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX0nCisKKworIyBWYWxpZCByYXcgc3RyaW5ncworUkFXX0JBQ0tTTEFTSEVTID0gcidyYXcnCisKKyMgSW4gYSBjb21tZW50IHlvdSBjYW4gaGF2ZSB3aGF0ZXZlciB5b3Ugd2FudDogXCBcXCBcbiBcbQorIyBldmVuIHRoaW5ncyB0aGF0IGxvb2sgbGlrZSBiYWQgc3RyaW5nczogIkM6XFByb2dyYW0gRmlsZXMiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbm9tYWxvdXNfdW5pY29kZV9lc2NhcGVfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDkwYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5My5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10NCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5My50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MmRiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hbm9tYWxvdXNfdW5pY29kZV9lc2NhcGVfcHkzLnR4dApAQCAtMCwwICsxLDMgQEAKK2Fub21hbG91cy11bmljb2RlLWVzY2FwZS1pbi1zdHJpbmc6NToxNjo6IkFub21hbG91cyBVbmljb2RlIGVzY2FwZSBpbiBieXRlIHN0cmluZzogJ1x1Jy4gU3RyaW5nIGNvbnN0YW50IG1pZ2h0IGJlIG1pc3NpbmcgYW4gciBvciB1IHByZWZpeC4iCithbm9tYWxvdXMtdW5pY29kZS1lc2NhcGUtaW4tc3RyaW5nOjY6MjE6OiJBbm9tYWxvdXMgVW5pY29kZSBlc2NhcGUgaW4gYnl0ZSBzdHJpbmc6ICdcVScuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgb3IgdSBwcmVmaXguIgorYW5vbWFsb3VzLXVuaWNvZGUtZXNjYXBlLWluLXN0cmluZzo4OjIyOjoiQW5vbWFsb3VzIFVuaWNvZGUgZXNjYXBlIGluIGJ5dGUgc3RyaW5nOiAnXE4nLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIG9yIHUgcHJlZml4LiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMGM3NGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzLnB5CkBAIC0wLDAgKzEsMjYyIEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBuby1hYnNvbHV0ZS1pbXBvcnQsbWlzc2luZy1kb2NzdHJpbmcsaW1wb3J0LWVycm9yLHdyb25nLWltcG9ydC1wb3NpdGlvbgorIyBweWxpbnQ6IGRpc2FibGU9d3JvbmctaW1wb3J0LW9yZGVyLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSx1bm5lY2Vzc2FyeS1sYW1iZGEKKworZGVmIGRlY29yYXRvcihmdW4pOgorICAgICIiIkRlY29yYXRvciIiIgorICAgIHJldHVybiBmdW4KKworCitjbGFzcyBEZW1vQ2xhc3Mob2JqZWN0KToKKyAgICAiIiJUZXN0IGNsYXNzIGZvciBtZXRob2QgaW52b2NhdGlvbnMuIiIiCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHN0YXRpY19tZXRob2QoYXJnKToKKyAgICAgICAgIiIic3RhdGljIG1ldGhvZC4iIiIKKyAgICAgICAgcmV0dXJuIGFyZyArIGFyZworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNsYXNzX21ldGhvZChjbHMsIGFyZyk6CisgICAgICAgICIiImNsYXNzIG1ldGhvZCIiIgorICAgICAgICByZXR1cm4gYXJnICsgYXJnCisKKyAgICBkZWYgbWV0aG9kKHNlbGYsIGFyZyk6CisgICAgICAgICIiIm1ldGhvZC4iIiIKKyAgICAgICAgcmV0dXJuIChzZWxmLCBhcmcpCisKKyAgICBAZGVjb3JhdG9yCisgICAgZGVmIGRlY29yYXRlZF9tZXRob2Qoc2VsZiwgYXJnKToKKyAgICAgICAgIiIiZGVjb3JhdGVkIG1ldGhvZC4iIiIKKyAgICAgICAgcmV0dXJuIChzZWxmLCBhcmcpCisKKworZGVmIGZ1bmN0aW9uXzFfYXJnKGZpcnN0X2FyZ3VtZW50KToKKyAgICAiIiJvbmUgYXJndW1lbnQgZnVuY3Rpb24iIiIKKyAgICByZXR1cm4gZmlyc3RfYXJndW1lbnQKKworZGVmIGZ1bmN0aW9uXzNfYXJncyhmaXJzdF9hcmd1bWVudCwgc2Vjb25kX2FyZ3VtZW50LCB0aGlyZF9hcmd1bWVudCk6CisgICAgIiIidGhyZWUgYXJndW1lbnRzIGZ1bmN0aW9uIiIiCisgICAgcmV0dXJuIGZpcnN0X2FyZ3VtZW50LCBzZWNvbmRfYXJndW1lbnQsIHRoaXJkX2FyZ3VtZW50CisKK2RlZiBmdW5jdGlvbl9kZWZhdWx0X2FyZyhvbmU9MSwgdHdvPTIpOgorICAgICIiImZvbmN0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSIiIgorICAgIHJldHVybiB0d28sIG9uZQorCisKK2Z1bmN0aW9uXzFfYXJnKDQyMCkKK2Z1bmN0aW9uXzFfYXJnKCkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCitmdW5jdGlvbl8xX2FyZygxMzM3LCAzNDcpICAjIFt0b28tbWFueS1mdW5jdGlvbi1hcmdzXQorCitmdW5jdGlvbl8zX2FyZ3MoNDIwLCA3ODkpICAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorIyArMTpbbm8tdmFsdWUtZm9yLXBhcmFtZXRlcixuby12YWx1ZS1mb3ItcGFyYW1ldGVyLG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCitmdW5jdGlvbl8zX2FyZ3MoKQorZnVuY3Rpb25fM19hcmdzKDEzMzcsIDM0NywgNDU2KQorZnVuY3Rpb25fM19hcmdzKCdiYWInLCAnYmViZScsIE5vbmUsIDUuNikgICMgW3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3NdCisKK2Z1bmN0aW9uX2RlZmF1bHRfYXJnKDEsIHR3bz01KQorZnVuY3Rpb25fZGVmYXVsdF9hcmcodHdvPTUpCisKK2Z1bmN0aW9uXzFfYXJnKGJvYj00KSAgIyBbdW5leHBlY3RlZC1rZXl3b3JkLWFyZyxuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorZnVuY3Rpb25fZGVmYXVsdF9hcmcoMSwgNCwgY29pbj0iaGVsbG8iKSAgIyBbdW5leHBlY3RlZC1rZXl3b3JkLWFyZ10KKworZnVuY3Rpb25fZGVmYXVsdF9hcmcoMSwgb25lPTUpICAjIFtyZWR1bmRhbnQta2V5d29yZC1hcmddCisKKyMgUmVtYWluaW5nIHRlc3RzIGFyZSBmb3IgY292ZXJhZ2Ugb2YgY29ycmVjdCBuYW1lcyBpbiBtZXNzYWdlcy4KK0xBTUJEQSA9IGxhbWJkYSBhcmc6IDEKKworTEFNQkRBKCkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisKK2RlZiBtZXRob2RfdGVzdHMoKToKKyAgICAiIiJNZXRob2QgaW52b2NhdGlvbnMuIiIiCisgICAgZGVtbyA9IERlbW9DbGFzcygpCisgICAgZGVtby5zdGF0aWNfbWV0aG9kKCkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgRGVtb0NsYXNzLnN0YXRpY19tZXRob2QoKSAgIyBbbm8tdmFsdWUtZm9yLXBhcmFtZXRlcl0KKworICAgIGRlbW8uY2xhc3NfbWV0aG9kKCkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgRGVtb0NsYXNzLmNsYXNzX21ldGhvZCgpICAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorCisgICAgZGVtby5tZXRob2QoKSAgIyBbbm8tdmFsdWUtZm9yLXBhcmFtZXRlcl0KKyAgICBEZW1vQ2xhc3MubWV0aG9kKGRlbW8pICAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorCisgICAgZGVtby5kZWNvcmF0ZWRfbWV0aG9kKCkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgRGVtb0NsYXNzLmRlY29yYXRlZF9tZXRob2QoZGVtbykgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisKKyMgVGVzdCBhIHJlZ3Jlc3Npb24gKGlzc3VlICMyMzQpCitpbXBvcnQgc3lzCisKK2NsYXNzIFRleHQob2JqZWN0KToKKyAgICAiIiIgUmVncmVzc2lvbiAiIiIKKworICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywpOgorICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgIiIiIGVtcHR5ICIiIgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGNscykKKyAgICBlbHNlOgorICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgIiIiIGVtcHR5ICIiIgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGNscykKKworVGV4dCgpCisKK2NsYXNzIFRlc3RTdGF0aWNNZXRob2Qob2JqZWN0KToKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgdGVzdChmaXJzdCwgc2Vjb25kPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIGZpcnN0LCBzZWNvbmQsIGt3YXJncworCisgICAgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgIHNlbGYudGVzdCg0MikKKyAgICAgICAgc2VsZi50ZXN0KDQyLCBzZWNvbmQ9MzQpCisgICAgICAgIHNlbGYudGVzdCg0MiwgNDIpCisgICAgICAgIHNlbGYudGVzdCgpICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgICAgIHNlbGYudGVzdCg0MiwgNDIsIDQyKSAjIFt0b28tbWFueS1mdW5jdGlvbi1hcmdzXQorCisKK2NsYXNzIFR5cGVDaGVja0NvbnN0cnVjdG9yKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0LCBzZWNvbmQpOgorICAgICAgICBzZWxmLmZpcnN0ID0gZmlyc3QKKyAgICAgICAgc2VsZi5zZWNvbmQgPSBzZWNvbmQKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgdHlwZShzZWxmKSgxLCAyLCAzKSAjIFt0b28tbWFueS1mdW5jdGlvbi1hcmdzXQorICAgICAgICAjICsxOiBbbm8tdmFsdWUtZm9yLXBhcmFtZXRlcixuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorICAgICAgICB0eXBlKHNlbGYpKCkKKyAgICAgICAgdHlwZShzZWxmKSgxLCBsYWxhPTIpICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXIsdW5leHBlY3RlZC1rZXl3b3JkLWFyZ10KKyAgICAgICAgdHlwZShzZWxmKSgxLCAyKQorICAgICAgICB0eXBlKHNlbGYpKGZpcnN0PTEsIHNlY29uZD0yKQorCisKK2NsYXNzIFRlc3Qob2JqZWN0KToKKyAgICAiIiIgbGFtYmRhIG5lZWRzIFRlc3QgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQgIiIiCisgICAgbGFtID0gbGFtYmRhIHNlbGYsIGljb246IChzZWxmLCBpY29uKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYubGFtKDQyKQorICAgICAgICBzZWxmLmxhbSgpICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgICAgIHNlbGYubGFtKDEsIDIsIDMpICMgW3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3NdCisKK1Rlc3QoKS5sYW0oKSAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorCisjIERvbid0IGVtaXQgYSByZWR1bmRhbnQta2V5d29yZC1hcmcgZm9yIHRoaXMgZXhhbXBsZSwKKyMgaXQncyBwZXJmZWN0bHkgdmFsaWQKKworY2xhc3MgSXNzdWU2NDIob2JqZWN0KToKKyAgICBhdHRyID0gMAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIntzZWxmLmF0dHJ9Ii5mb3JtYXQoc2VsZj1zZWxmKQorCisjIFRoZXNlIHNob3VsZCBub3QgZW1pdCBhbnl0aGluZyByZWdhcmRpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMsCisjIHNpbmNlIHRoZXkgaGF2ZSBzb21ldGhpbmcgaW52YWxpZC4KK2Zyb20gYWxhX2JhbGFfcG9ydG9jb2xhIGltcG9ydCB1bmtub3duCisKKyMgcHlsaW50OiBkaXNhYmxlPW5vdC1hLW1hcHBpbmcsbm90LWFuLWl0ZXJhYmxlCisKK2Z1bmN0aW9uXzFfYXJnKCp1bmtub3duKQorZnVuY3Rpb25fMV9hcmcoMSwgKjIpCitmdW5jdGlvbl8xX2FyZygxLCAyLCAzLCAqKnVua25vd24pCitmdW5jdGlvbl8xX2FyZyg0LCA1LCAqKjEpCitmdW5jdGlvbl8xX2FyZyg1LCA2LCAqKnt1bmtub3duOiAxfSkKK2Z1bmN0aW9uXzFfYXJnKCoqe29iamVjdDogMX0pCitmdW5jdGlvbl8xX2FyZygqKnsxOiAyfSkKKworZGVmIG5vX2NvbnRleHRfYnV0X3JlZGVmaW5lZCgqYXJncyk6CisgICAgYXJncyA9IFsxXQorICAgICMrMTogW25vLXZhbHVlLWZvci1wYXJhbWV0ZXIsIG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgZXhwZWN0X3RocmVlKCpsaXN0KGFyZ3MpKQorCitkZWYgbm9fY29udGV4dF9vbmVfZWxlbSgqYXJncyk6CisgICAgZXhwZWN0X3RocmVlKGFyZ3MpICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXIsIG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisKKyMgRG9uJ3QgZW1pdCBuby12YWx1ZS1mb3ItcGFyYW1ldGVyIGZvciB0aGlzLCBzaW5jZSB3ZQorIyBkb24ndCBoYXZlIHRoZSBjb250ZXh0IGF0IG91ciBkaXNwb3NhbC4KK2RlZiBleHBlY3RfdGhyZWUob25lLCB0d28sIHRocmVlKToKKyAgICByZXR1cm4gb25lICsgdHdvICsgdGhyZWUKKworCitkZWYgbm9fY29udGV4dCgqYXJncyk6CisgICAgZXhwZWN0X3RocmVlKCphcmdzKQorCitkZWYgbm9fY29udGV4dF90d28oKmFyZ3MpOgorICAgIGV4cGVjdF90aHJlZSgqbGlzdChhcmdzKSkKKworZGVmIG5vX2NvbnRleHRfdGhyZWUoKmFyZ3MpOgorICAgIGV4cGVjdF90aHJlZSgqc2V0KGFyZ3MpKQorCitkZWYgY29tcGFyZV9wcmljZXMoYXJnKToKKyAgICByZXR1cm4gc2V0KChhcmcsICkpCisKK2RlZiBmaW5kX3Byb2JsZW1zMihwcm9iX2RhdGVzKToKKyAgICBmb3IgZmZmIGluIHJhbmdlKDEwKToKKyAgICAgICAgcHJvYl9kYXRlcyB8PSBjb21wYXJlX3ByaWNlcyhmZmYpCisKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorCisKK2RlZiBuYW1lZHR1cGxlX3JlcGxhY2VfaXNzdWVfMTAzNigpOgorICAgIGNscyA9IG5hbWVkdHVwbGUoJ2NscycsICdhIGIgYycpCisgICAgbmV3X2luc3RhbmNlID0gY2xzKDEsIDIsIDMpLl9yZXBsYWNlKAorICAgICAgICBhPTI0LAorICAgICAgICBiPTI0LAorICAgICAgICBjPTQyCisgICAgKQorICAgICMgKzE6W3VuZXhwZWN0ZWQta2V5d29yZC1hcmcsdW5leHBlY3RlZC1rZXl3b3JkLWFyZ10KKyAgICBuZXdfYmFkX2luc3RhbmNlID0gY2xzKDEsIDIsIDMpLl9yZXBsYWNlKGQ9MjQsIGU9MzIpCisgICAgcmV0dXJuIG5ld19pbnN0YW5jZSwgbmV3X2JhZF9pbnN0YW5jZQorCisKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCisKK2RlZiBzb21lX2Z1bmMoZmlyc3QsIHNlY29uZCwgdGhpcmQpOgorICAgIHJldHVybiBmaXJzdCArIHNlY29uZCArIHRoaXJkCisKKworcGFydGlhbChzb21lX2Z1bmMsIDEsIDIpKDMpCitwYXJ0aWFsKHNvbWVfZnVuYywgdGhpcmQ9MSwgc2Vjb25kPTIpKDMpCitwYXJ0aWFsKHNvbWVfZnVuYywgMSwgdGhpcmQ9Mikoc2Vjb25kPTMpCitwYXJ0aWFsKHNvbWVfZnVuYywgMSkoMSkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCitwYXJ0aWFsKHNvbWVfZnVuYywgMSkodGhpcmQ9MSkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCitwYXJ0aWFsKHNvbWVfZnVuYywgMSwgMikodGhpcmQ9MSwgZm91cnRoPTQpICAjIFt1bmV4cGVjdGVkLWtleXdvcmQtYXJnXQorCisKK2RlZiBtdXRhdGlvbl9kZWNvcmF0b3IoZnVuKToKKyAgICAiIiJEZWNvcmF0b3IgdGhhdCBjaGFuZ2VzIGEgZnVuY3Rpb24ncyBzaWduYXR1cmUuIiIiCisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsIGRvX3NvbWV0aGluZz1UcnVlLCAqKmt3YXJncyk6CisgICAgICAgIGlmIGRvX3NvbWV0aGluZzoKKyAgICAgICAgICAgIHJldHVybiBmdW4oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICByZXR1cm4gd3JhcHBlcgorCisKK2RlZiBvdGhlcl9tdXRhdGlvbl9kZWNvcmF0b3IoZnVuKToKKyAgICAiIiJBbm90aGVyIGRlY29yYXRvciB0aGF0IGNoYW5nZXMgYSBmdW5jdGlvbidzIHNpZ25hdHVyZSIiIgorICAgIGRlZiB3cmFwcGVyKCphcmdzLCBkb19zb21ldGhpbmc9VHJ1ZSwgKiprd2FyZ3MpOgorICAgICAgICBpZiBkb19zb21ldGhpbmc6CisgICAgICAgICAgICByZXR1cm4gZnVuKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgcmV0dXJuIHdyYXBwZXIKKworCitAbXV0YXRpb25fZGVjb3JhdG9yCitkZWYgbXV0YXRlZF9mdW5jdGlvbihhcmcpOgorICAgIHJldHVybiBhcmcKKworCitAb3RoZXJfbXV0YXRpb25fZGVjb3JhdG9yCitkZWYgbXV0YXRlZChhcmcpOgorICAgIHJldHVybiBhcmcKKworCittdXRhdGVkX2Z1bmN0aW9uKGRvX3NvbWV0aGluZz1GYWxzZSkKK211dGF0ZWRfZnVuY3Rpb24oKQorCittdXRhdGVkKGRvX3NvbWV0aGluZz1UcnVlKQorCisKK2RlZiBmdW5jKG9uZSwgdHdvLCB0aHJlZSk6CisgICAgcmV0dXJuIG9uZSArIHR3byArIHRocmVlCisKKworQ0FMTCA9IGxhbWJkYSAqYXJnczogZnVuYygqYXJncykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjRkMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzLnJjCkBAIC0wLDAgKzEsMiBAQAorW1RZUEVDSEVDS10KK3NpZ25hdHVyZS1tdXRhdG9ycz1mdW5jdGlvbmFsLmEuYXJndW1lbnRzLm11dGF0aW9uX2RlY29yYXRvcixvdGhlcl9tdXRhdGlvbl9kZWNvcmF0b3IKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FyZ3VtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3YmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHMudHh0CkBAIC0wLDAgKzEsMzkgQEAKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6NDY6MDo6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdmaXJzdF9hcmd1bWVudCcgaW4gZnVuY3Rpb24gY2FsbAordG9vLW1hbnktZnVuY3Rpb24tYXJnczo0NzowOjpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo0OTowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3RoaXJkX2FyZ3VtZW50JyBpbiBmdW5jdGlvbiBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjUxOjA6Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAnZmlyc3RfYXJndW1lbnQnIGluIGZ1bmN0aW9uIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6NTE6MDo6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdzZWNvbmRfYXJndW1lbnQnIGluIGZ1bmN0aW9uIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6NTE6MDo6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICd0aGlyZF9hcmd1bWVudCcgaW4gZnVuY3Rpb24gY2FsbAordG9vLW1hbnktZnVuY3Rpb24tYXJnczo1MzowOjpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo1ODowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2ZpcnN0X2FyZ3VtZW50JyBpbiBmdW5jdGlvbiBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjU4OjA6OlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnYm9iJyBpbiBmdW5jdGlvbiBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjU5OjA6OlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnY29pbicgaW4gZnVuY3Rpb24gY2FsbAorcmVkdW5kYW50LWtleXdvcmQtYXJnOjYxOjA6OkFyZ3VtZW50ICdvbmUnIHBhc3NlZCBieSBwb3NpdGlvbiBhbmQga2V5d29yZCBpbiBmdW5jdGlvbiBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjY2OjA6Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAnYXJnJyBpbiBsYW1iZGEgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo3MTo0Om1ldGhvZF90ZXN0czpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2FyZycgaW4gc3RhdGljbWV0aG9kIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6NzI6NDptZXRob2RfdGVzdHM6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdhcmcnIGluIHN0YXRpY21ldGhvZCBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjc0OjQ6bWV0aG9kX3Rlc3RzOk5vIHZhbHVlIGZvciBhcmd1bWVudCAnYXJnJyBpbiBjbGFzc21ldGhvZCBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjc1OjQ6bWV0aG9kX3Rlc3RzOk5vIHZhbHVlIGZvciBhcmd1bWVudCAnYXJnJyBpbiBjbGFzc21ldGhvZCBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjc3OjQ6bWV0aG9kX3Rlc3RzOk5vIHZhbHVlIGZvciBhcmd1bWVudCAnYXJnJyBpbiBtZXRob2QgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo3ODo0Om1ldGhvZF90ZXN0czpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2FyZycgaW4gdW5ib3VuZCBtZXRob2QgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo4MDo0Om1ldGhvZF90ZXN0czpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2FyZycgaW4gbWV0aG9kIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6ODE6NDptZXRob2RfdGVzdHM6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdhcmcnIGluIHVuYm91bmQgbWV0aG9kIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6MTEwOjg6VGVzdFN0YXRpY01ldGhvZC5mdW5jOk5vIHZhbHVlIGZvciBhcmd1bWVudCAnZmlyc3QnIGluIHN0YXRpY21ldGhvZCBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjExMTo4OlRlc3RTdGF0aWNNZXRob2QuZnVuYzpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3Igc3RhdGljbWV0aG9kIGNhbGwKK3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3M6MTE5Ojg6VHlwZUNoZWNrQ29uc3RydWN0b3IudGVzdDpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjoxMjE6ODpUeXBlQ2hlY2tDb25zdHJ1Y3Rvci50ZXN0Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAnZmlyc3QnIGluIGNvbnN0cnVjdG9yIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6MTIxOjg6VHlwZUNoZWNrQ29uc3RydWN0b3IudGVzdDpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3NlY29uZCcgaW4gY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjoxMjI6ODpUeXBlQ2hlY2tDb25zdHJ1Y3Rvci50ZXN0Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAnc2Vjb25kJyBpbiBjb25zdHJ1Y3RvciBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjEyMjo4OlR5cGVDaGVja0NvbnN0cnVjdG9yLnRlc3Q6VW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdsYWxhJyBpbiBjb25zdHJ1Y3RvciBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjEzMzo4OlRlc3QudGVzdDpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2ljb24nIGluIG1ldGhvZCBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjEzNDo4OlRlc3QudGVzdDpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgbWV0aG9kIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6MTM2OjA6Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAnaWNvbicgaW4gbWV0aG9kIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6MTYzOjQ6bm9fY29udGV4dF9idXRfcmVkZWZpbmVkOk5vIHZhbHVlIGZvciBhcmd1bWVudCAndGhyZWUnIGluIGZ1bmN0aW9uIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6MTYzOjQ6bm9fY29udGV4dF9idXRfcmVkZWZpbmVkOk5vIHZhbHVlIGZvciBhcmd1bWVudCAndHdvJyBpbiBmdW5jdGlvbiBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjE2Njo0Om5vX2NvbnRleHRfb25lX2VsZW06Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICd0aHJlZScgaW4gZnVuY3Rpb24gY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjoxNjY6NDpub19jb250ZXh0X29uZV9lbGVtOk5vIHZhbHVlIGZvciBhcmd1bWVudCAndHdvJyBpbiBmdW5jdGlvbiBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjIwMjoyMzpuYW1lZHR1cGxlX3JlcGxhY2VfaXNzdWVfMTAzNjpVbmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ2QnIGluIG1ldGhvZCBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjIwMjoyMzpuYW1lZHR1cGxlX3JlcGxhY2VfaXNzdWVfMTAzNjpVbmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ2UnIGluIG1ldGhvZCBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjIxNTowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3RoaXJkJyBpbiBmdW5jdGlvbiBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjIxNjowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3NlY29uZCcgaW4gZnVuY3Rpb24gY2FsbAordW5leHBlY3RlZC1rZXl3b3JkLWFyZzoyMTc6MDo6VW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdmb3VydGgnIGluIGZ1bmN0aW9uIGNhbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfZGlmZmVyLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FyZ3VtZW50c19kaWZmZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNDM1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfZGlmZmVyLnB5CkBAIC0wLDAgKzEsMzIwIEBACisiIiJUZXN0IHRoYXQgd2UgYXJlIGVtaXR0aW5nIGFyZ3VtZW50cy1kaWZmZXIgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSBkaWZmZXJlbnQuIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIHVudXNlZC1hcmd1bWVudCx1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb24sIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCB1bnVzZWQtcHJpdmF0ZS1tZW1iZXINCisNCitjbGFzcyBQYXJlbnQob2JqZWN0KToNCisNCisgICAgZGVmIHRlc3Qoc2VsZik6DQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgQ2hpbGQoUGFyZW50KToNCisNCisgICAgZGVmIHRlc3Qoc2VsZiwgYXJnKTogICMgW2FyZ3VtZW50cy1kaWZmZXJdDQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgUGFyZW50RGVmYXVsdHMob2JqZWN0KToNCisNCisgICAgZGVmIHRlc3Qoc2VsZiwgYXJnPU5vbmUsIGJhcmc9Tm9uZSk6DQorICAgICAgICBwYXNzDQorDQorY2xhc3MgQ2hpbGREZWZhdWx0cyhQYXJlbnREZWZhdWx0cyk6DQorDQorICAgIGRlZiB0ZXN0KHNlbGYsIGFyZz1Ob25lKTogICMgW2FyZ3VtZW50cy1kaWZmZXJdDQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgQ2xhc3NtZXRob2Qob2JqZWN0KToNCisNCisgICAgQGNsYXNzbWV0aG9kDQorICAgIGRlZiBmdW5jKGNscywgZGF0YSk6DQorICAgICAgICByZXR1cm4gZGF0YQ0KKw0KKyAgICBAY2xhc3NtZXRob2QNCisgICAgZGVmIGZ1bmMxKGNscyk6DQorICAgICAgICByZXR1cm4gY2xzDQorDQorDQorY2xhc3MgQ2xhc3NtZXRob2RDaGlsZChDbGFzc21ldGhvZCk6DQorDQorICAgIEBzdGF0aWNtZXRob2QNCisgICAgZGVmIGZ1bmMoKTogICMgW2FyZ3VtZW50cy1kaWZmZXJdDQorICAgICAgICBwYXNzDQorDQorICAgIEBjbGFzc21ldGhvZA0KKyAgICBkZWYgZnVuYzEoY2xzKToNCisgICAgICAgIHJldHVybiBjbHMoKQ0KKw0KKw0KK2NsYXNzIEJ1aWx0aW5zKGRpY3QpOg0KKyAgICAiIiJJZ25vcmUgZm9yIGJ1aWx0aW5zLCBmb3Igd2hpY2ggd2UgZG9uJ3Qga25vdyB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIGFyZ3MuIiIiDQorDQorICAgIEBjbGFzc21ldGhvZA0KKyAgICBkZWYgZnJvbWtleXMoY2xzLCBhcmcsIGFyZzEpOg0KKyAgICAgICAgcGFzcw0KKw0KKw0KK2NsYXNzIFZhcmFyZ3Mob2JqZWN0KToNCisNCisgICAgZGVmIGhhc19rd2FyZ3Moc2VsZiwgYXJnLCAqKmt3YXJncyk6DQorICAgICAgICBwYXNzDQorDQorICAgIGRlZiBub19rd2FyZ3Moc2VsZiwgYXJncyk6DQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgVmFyYXJnc0NoaWxkKFZhcmFyZ3MpOg0KKw0KKyAgICBkZWYgaGFzX2t3YXJncyhzZWxmLCBhcmcpOiAgIyBbYXJndW1lbnRzLWRpZmZlcl0NCisgICAgICAgICJOb3Qgb2theSB0byBsb3NlIGNhcGFiaWxpdGllcy4gQWxzbywgdHlwZSBoYXMgY2hhbmdlZC4iDQorDQorICAgIGRlZiBub19rd2FyZ3Moc2VsZiwgYXJnLCAqKmt3YXJncyk6ICAjIFthcmd1bWVudHMtcmVuYW1lZF0NCisgICAgICAgICJBZGRpdGlvbiBvZiBrd2FyZ3MgZG9lcyBub3QgdmlvbGF0ZSBMU1AsIGJ1dCBmaXJzdCBhcmd1bWVudCdzIG5hbWUgaGFzIGNoYW5nZWQuIg0KKw0KKw0KK2NsYXNzIFN1cGVyKG9iamVjdCk6DQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fcHJpdmF0ZShzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fcHJpdmF0ZTJfKHNlbGYpOg0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19fcHJpdmF0ZTMoc2VsZik6DQorICAgICAgICBwYXNzDQorDQorICAgIGRlZiBtZXRob2Qoc2VsZiwgcGFyYW0pOg0KKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcg0KKw0KKw0KK2NsYXNzIFN1YihTdXBlcik6DQorDQorICAgICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudA0KKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToNCisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQ0KKw0KKyAgICBkZWYgX19wcml2YXRlKHNlbGYsIGFyZyk6DQorICAgICAgICBwYXNzDQorDQorICAgIGRlZiBfX3ByaXZhdGUyXyhzZWxmLCBhcmcpOg0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19fcHJpdmF0ZTMoc2VsZiwgYXJnKToNCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIG1ldGhvZChzZWxmLCBwYXJhbT0nYWJjJyk6DQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgU3RhdGljbWV0aG9kKG9iamVjdCk6DQorDQorICAgIEBzdGF0aWNtZXRob2QNCisgICAgZGVmIGZ1bmMoZGF0YSk6DQorICAgICAgICByZXR1cm4gZGF0YQ0KKw0KKw0KK2NsYXNzIFN0YXRpY21ldGhvZENoaWxkKFN0YXRpY21ldGhvZCk6DQorDQorICAgIEBjbGFzc21ldGhvZA0KKyAgICBkZWYgZnVuYyhjbHMsIGRhdGEpOg0KKyAgICAgICAgcmV0dXJuIGRhdGENCisNCisNCitjbGFzcyBQcm9wZXJ0eShvYmplY3QpOg0KKw0KKyAgICBAcHJvcGVydHkNCisgICAgZGVmIGNsb3NlKHNlbGYpOg0KKyAgICAgICAgcGFzcw0KKw0KK2NsYXNzIFByb3BlcnR5U2V0dGVyKFByb3BlcnR5KToNCisNCisgICAgQHByb3BlcnR5DQorICAgIGRlZiBjbG9zZShzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisgICAgQGNsb3NlLnNldHRlcg0KKyAgICBkZWYgY2xvc2Uoc2VsZiwgYXR0cik6DQorICAgICAgICByZXR1cm4gYXR0cg0KKw0KKw0KK2NsYXNzIFN0YXRpY21ldGhvZENoaWxkMihTdGF0aWNtZXRob2QpOg0KKw0KKyAgICBkZWYgZnVuYyhzZWxmLCBkYXRhKToNCisgICAgICAgIHN1cGVyKCkuZnVuYyhkYXRhKQ0KKw0KKw0KK2NsYXNzIFN1cGVyQ2xhc3Mob2JqZWN0KToNCisNCisgICAgQHN0YXRpY21ldGhvZA0KKyAgICBkZWYgaW1wbChhcmcxLCBhcmcyLCAqKmt3YXJncyk6DQorICAgICAgICByZXR1cm4gYXJnMSArIGFyZzINCisNCisNCitjbGFzcyBNeUNsYXNzKFN1cGVyQ2xhc3MpOg0KKw0KKyAgICBkZWYgaW1wbChzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KKyAgICAgICAgIiIiDQorICAgICAgICBBY2NlcHRhYmxlIHVzZSBvZiB2YXJhcmcgaW4gc3ViY2xhc3MgYmVjYXVzZSBpdCBkb2VzIG5vdCB2aW9sYXRlIExTUC4NCisgICAgICAgICIiIg0KKyAgICAgICAgc3VwZXIoKS5pbXBsKCphcmdzLCAqKmt3YXJncykNCisNCisNCitjbGFzcyBGaXJzdEhhc0FyZ3Mob2JqZWN0KToNCisNCisgICAgZGVmIHRlc3Qoc2VsZiwgKmFyZ3MpOg0KKyAgICAgICAgcGFzcw0KKw0KKw0KK2NsYXNzIFNlY29uZENoYW5nZXNBcmdzKEZpcnN0SGFzQXJncyk6DQorDQorICAgIGRlZiB0ZXN0KHNlbGYsIGZpcnN0LCBzZWNvbmQsICphcmdzKTogICMgW2FyZ3VtZW50cy1kaWZmZXJdDQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgUG9zaXRpb25hbChvYmplY3QpOg0KKw0KKyAgICBkZWYgdGVzdChzZWxmLCBmaXJzdCwgc2Vjb25kKToNCisgICAgICAgIHBhc3MNCisNCisNCitjbGFzcyBQb3NpdGlvbmFsQ2hpbGQoUG9zaXRpb25hbCk6DQorDQorICAgIGRlZiB0ZXN0KHNlbGYsICphcmdzKToNCisgICAgICAgICIiIg0KKyAgICAgICAgQWNjZXB0YWJsZSB1c2Ugb2YgdmFyYXJnIGluIHN1YmNsYXNzIGJlY2F1c2UgaXQgZG9lcyBub3QgdmlvbGF0ZSBMU1AuDQorICAgICAgICAiIiINCisgICAgICAgIHN1cGVyKCkudGVzdChhcmdzWzBdLCBhcmdzWzFdKQ0KKw0KK2NsYXNzIE1peGVkKG9iamVjdCk6DQorDQorICAgIGRlZiBtaXhlZChzZWxmLCBmaXJzdCwgc2Vjb25kLCAqLCB0aGlyZCwgZm91cnRoKToNCisgICAgICAgIHBhc3MNCisNCisNCitjbGFzcyBNaXhlZENoaWxkMShNaXhlZCk6DQorDQorICAgIGRlZiBtaXhlZChzZWxmLCBmaXJzdCwgKmFyZ3MsICoqa3dhcmdzKToNCisgICAgICAgICIiIg0KKyAgICAgICAgQWNjZXB0YWJsZSB1c2Ugb2YgdmFyYXJnIGluIHN1YmNsYXNzIGJlY2F1c2UgaXQgZG9lcyBub3QgdmlvbGF0ZSBMU1AuDQorICAgICAgICAiIiINCisgICAgICAgIHN1cGVyKCkubWl4ZWQoZmlyc3QsICphcmdzLCAqKmt3YXJncykNCisNCisNCitjbGFzcyBNaXhlZENoaWxkMihNaXhlZCk6DQorDQorICAgIGRlZiBtaXhlZChzZWxmLCBmaXJzdCwgKmFyZ3MsIHRoaXJkLCAqKmt3YXJncyk6DQorICAgICAgICAiIiINCisgICAgICAgIEFjY2VwdGFibGUgdXNlIG9mIHZhcmFyZyBpbiBzdWJjbGFzcyBiZWNhdXNlIGl0IGRvZXMgbm90IHZpb2xhdGUgTFNQLg0KKyAgICAgICAgIiIiDQorICAgICAgICBzdXBlcigpLm1peGVkKGZpcnN0LCAqYXJncywgdGhpcmQsICoqa3dhcmdzKQ0KKw0KKw0KK2NsYXNzIEhhc1NwZWNpYWxNZXRob2Qob2JqZWN0KToNCisNCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6DQorICAgICAgICByZXR1cm4ga2V5DQorDQorDQorY2xhc3MgT3ZlcnJpZGVzU3BlY2lhbE1ldGhvZChIYXNTcGVjaWFsTWV0aG9kKToNCisNCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGNoZWllKToNCisgICAgICAgICMgbm8gZXJyb3IgaGVyZSwgbWV0aG9kIG92ZXJyaWRlcyBzcGVjaWFsIG1ldGhvZA0KKyAgICAgICAgcmV0dXJuIGNoZWllICsgMQ0KKw0KKw0KK2NsYXNzIFBhcmVudENsYXNzKG9iamVjdCk6DQorDQorICAgIGRlZiBtZXRoKHNlbGYsIGFyZywgYXJnMSk6DQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yDQorDQorDQorY2xhc3MgQ2hpbGRDbGFzcyhQYXJlbnRDbGFzcyk6DQorDQorICAgIGRlZiBtZXRoKHNlbGYsIF9hcmcsIGR1bW15KToNCisgICAgICAgICMgbm8gZXJyb3IgaGVyZSwgImR1bW15IiBhbmQgIl8iIGFyZSBiZWluZyBpZ25vcmVkIGlmDQorICAgICAgICAjIHNwb3R0ZWQgaW4gYSB2YXJpYWJsZSBuYW1lIChkZWNsYXJlZCBpbiBkdW1teV9wYXJhbWV0ZXJfcmVnZXgpDQorICAgICAgICBwYXNzDQorDQorDQorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80NDQzDQorIyBTb21lIHZhbGlkIG92ZXJ3cml0ZXMgd2l0aCB0eXBlIGFubm90YXRpb25zDQorDQoraW1wb3J0IHR5cGluZyAgIyBweWxpbnQ6IGRpc2FibGU9d3JvbmctaW1wb3J0LXBvc2l0aW9uDQorZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QgICMgcHlsaW50OiBkaXNhYmxlPXdyb25nLWltcG9ydC1wb3NpdGlvbg0KKw0KK2NsYXNzIFBhcmVudFQxOg0KKyAgICBkZWYgZnVuYyhzZWxmLCB1c2VyX2lucHV0OiBEaWN0W3N0ciwgaW50XSkgLT4gTm9uZToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBDaGlsZFQxKFBhcmVudFQxKToNCisgICAgZGVmIGZ1bmMoc2VsZiwgdXNlcl9pbnB1dDogRGljdFtzdHIsIGludF0pIC0+IE5vbmU6DQorICAgICAgICBwYXNzDQorDQorY2xhc3MgUGFyZW50VDI6DQorICAgIGFzeW5jIGRlZiBmdW5jKHNlbGYsIHVzZXJfaW5wdXQ6IHR5cGluZy5MaXN0KSAtPiBOb25lOg0KKyAgICAgICAgcGFzcw0KKw0KK2NsYXNzIENoaWxkVDIoUGFyZW50VDIpOg0KKyAgICBhc3luYyBkZWYgZnVuYyhzZWxmLCB1c2VyX2lucHV0OiB0eXBpbmcuTGlzdCkgLT4gTm9uZToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBGb29UMToNCisgICAgcGFzcw0KKw0KK2NsYXNzIFBhcmVudFQzOg0KKyAgICBkZWYgZnVuYyhzZWxmLCB1c2VyX2lucHV0OiBGb29UMSkgLT4gTm9uZToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBDaGlsZFQzKFBhcmVudFQzKToNCisgICAgZGVmIGZ1bmMoc2VsZiwgdXNlcl9pbnB1dDogRm9vVDEpIC0+IE5vbmU6DQorICAgICAgICBwYXNzDQorDQorIyBLZXl3b3JkIGFuZCBwb3NpdGlvbmFsIG92ZXJyaWRkZXMNCitjbGFzcyBBYnN0cmFjdEZvbzoNCisNCisgICAgZGVmIGt3b25seV8xKHNlbGYsIGZpcnN0LCAqLCBzZWNvbmQsIHRoaXJkKToNCisgICAgICAgICJOb3JtYWwgcG9zaXRpb25hbCB3aXRoIHR3byBwb3NpdGlvbmFsIG9ubHkgcGFyYW1zLiINCisNCisgICAgZGVmIGt3b25seV8yKHNlbGYsICosIGZpcnN0LCBzZWNvbmQpOg0KKyAgICAgICAgIlR3byBwb3NpdGlvbmFsIG9ubHkgcGFyYW1ldGVyLiINCisNCisgICAgZGVmIGt3b25seV8zKHNlbGYsICosIGZpcnN0LCBzZWNvbmQpOg0KKyAgICAgICAgIlR3byBwb3NpdGlvbmFsIG9ubHkgcGFyYW1zLiINCisNCisgICAgZGVmIGt3b25seV80KHNlbGYsICosIGZpcnN0LCBzZWNvbmQ9Tm9uZSk6DQorICAgICAgICAiT25lIHBvc2l0aW9uYWwgb25seSBhbmQgYW5vdGhlciB3aXRoIGEgZGVmYXVsdC4iDQorDQorICAgIGRlZiBrd29ubHlfNShzZWxmLCAqLCBmaXJzdCwgKiprd2FyZ3MpOg0KKyAgICAgICAgIktleXdvcmQgb25seSBhbmQga2V5d29yZCB2YXJpYWRpY3MuIg0KKw0KKyAgICBkZWYga3dvbmx5XzYoc2VsZiwgZmlyc3QsIHNlY29uZCwgKiwgdGhpcmQpOg0KKyAgICAgICAgIlR3byBwb3NpdGlvbmFsIGFuZCBvbmUga2V5d29yZCINCisNCisNCitjbGFzcyBGb28oQWJzdHJhY3RGb28pOg0KKw0KKyAgICBkZWYga3dvbmx5XzEoc2VsZiwgZmlyc3QsICosIHNlY29uZCk6ICAjIFthcmd1bWVudHMtZGlmZmVyXQ0KKyAgICAgICAgIk9uZSBwb3NpdGlvbmFsIGFuZCBvbmx5IG9uZSBwb3NpdGlvbmFsIG9ubHkgcGFyYW0uIg0KKw0KKyAgICBkZWYga3dvbmx5XzIoc2VsZiwgKiwgZmlyc3QpOiAgIyBbYXJndW1lbnRzLWRpZmZlcl0NCisgICAgICAgICJPbmx5IG9uZSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHR3byBwb3NpdGlvbmFsIG9ubHkgcGFyYW1ldGVycy4iDQorDQorICAgIGRlZiBrd29ubHlfMyhzZWxmLCBmaXJzdCwgc2Vjb25kKTogICMgW2FyZ3VtZW50cy1kaWZmZXJdDQorICAgICAgICAiVHdvIHBvc2l0aW9uYWwgcGFyYW1zLiINCisNCisgICAgZGVmIGt3b25seV80KHNlbGYsIGZpcnN0LCBzZWNvbmQpOiAgIyBbYXJndW1lbnRzLWRpZmZlcl0NCisgICAgICAgICJUd28gcG9zaXRpb25hbCBwYXJhbXMuIg0KKw0KKyAgICBkZWYga3dvbmx5XzUoc2VsZiwgKiwgZmlyc3QpOiAgIyBbYXJndW1lbnRzLWRpZmZlcl0NCisgICAgICAgICJLZXl3b3JkIG9ubHksIGJ1dCBubyB2YXJpYWRpY3MuIg0KKw0KKyAgICBkZWYga3dvbmx5XzYoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKTogICMgdmFsaWQgb3ZlcnJpZGUNCisgICAgICAgICJQb3NpdGlvbmFsIGFuZCBrZXl3b3JkIHZhcmlhZGljcyB0byBwYXNzIHRocm91Z2ggcGFyZW50IHBhcmFtcyINCisNCisNCitjbGFzcyBGb28yKEFic3RyYWN0Rm9vKToNCisNCisgICAgZGVmIGt3b25seV82KHNlbGYsIGZpcnN0LCAqYXJncywgKiprd2FyZ3MpOiAgIyB2YWxpZCBvdmVycmlkZQ0KKyAgICAgICAgIk9uZSBwb3NpdGlvbmFsIHdpdGggdGhlIHJlc3QgdmFyaWFkaWNzIHRvIHBhc3MgdGhyb3VnaCBwYXJlbnQgcGFyYW1zIg0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfZGlmZmVyLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfZGlmZmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI3MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FyZ3VtZW50c19kaWZmZXIudHh0CkBAIC0wLDAgKzEsMTEgQEAKK2FyZ3VtZW50cy1kaWZmZXI6MTI6NDpDaGlsZC50ZXN0Ok51bWJlciBvZiBwYXJhbWV0ZXJzIHdhcyAxIGluICdQYXJlbnQudGVzdCcgYW5kIGlzIG5vdyAyIGluIG92ZXJyaWRkZW4gJ0NoaWxkLnRlc3QnIG1ldGhvZAorYXJndW1lbnRzLWRpZmZlcjoyMzo0OkNoaWxkRGVmYXVsdHMudGVzdDpOdW1iZXIgb2YgcGFyYW1ldGVycyB3YXMgMyBpbiAnUGFyZW50RGVmYXVsdHMudGVzdCcgYW5kIGlzIG5vdyAyIGluIG92ZXJyaWRkZW4gJ0NoaWxkRGVmYXVsdHMudGVzdCcgbWV0aG9kCithcmd1bWVudHMtZGlmZmVyOjQxOjQ6Q2xhc3NtZXRob2RDaGlsZC5mdW5jOk51bWJlciBvZiBwYXJhbWV0ZXJzIHdhcyAyIGluICdDbGFzc21ldGhvZC5mdW5jJyBhbmQgaXMgbm93IDAgaW4gb3ZlcnJpZGRlbiAnQ2xhc3NtZXRob2RDaGlsZC5mdW5jJyBtZXRob2QKK2FyZ3VtZW50cy1kaWZmZXI6Njg6NDpWYXJhcmdzQ2hpbGQuaGFzX2t3YXJnczpWYXJpYWRpY3MgcmVtb3ZlZCBpbiBvdmVycmlkZGVuICdWYXJhcmdzQ2hpbGQuaGFzX2t3YXJncycgbWV0aG9kCithcmd1bWVudHMtcmVuYW1lZDo3MTo0OlZhcmFyZ3NDaGlsZC5ub19rd2FyZ3M6UGFyYW1ldGVyICdhcmdzJyBoYXMgYmVlbiByZW5hbWVkIHRvICdhcmcnIGluIG92ZXJyaWRkZW4gJ1ZhcmFyZ3NDaGlsZC5ub19rd2FyZ3MnIG1ldGhvZAorYXJndW1lbnRzLWRpZmZlcjoxNzI6NDpTZWNvbmRDaGFuZ2VzQXJncy50ZXN0Ok51bWJlciBvZiBwYXJhbWV0ZXJzIHdhcyAyIGluICdGaXJzdEhhc0FyZ3MudGVzdCcgYW5kIGlzIG5vdyA0IGluIG92ZXJyaWRkZW4gJ1NlY29uZENoYW5nZXNBcmdzLnRlc3QnIG1ldGhvZAorYXJndW1lbnRzLWRpZmZlcjoyOTg6NDpGb28ua3dvbmx5XzE6TnVtYmVyIG9mIHBhcmFtZXRlcnMgd2FzIDQgaW4gJ0Fic3RyYWN0Rm9vLmt3b25seV8xJyBhbmQgaXMgbm93IDMgaW4gb3ZlcnJpZGRlbiAnRm9vLmt3b25seV8xJyBtZXRob2QKK2FyZ3VtZW50cy1kaWZmZXI6MzAxOjQ6Rm9vLmt3b25seV8yOk51bWJlciBvZiBwYXJhbWV0ZXJzIHdhcyAzIGluICdBYnN0cmFjdEZvby5rd29ubHlfMicgYW5kIGlzIG5vdyAyIGluIG92ZXJyaWRkZW4gJ0Zvby5rd29ubHlfMicgbWV0aG9kCithcmd1bWVudHMtZGlmZmVyOjMwNDo0OkZvby5rd29ubHlfMzpOdW1iZXIgb2YgcGFyYW1ldGVycyB3YXMgMyBpbiAnQWJzdHJhY3RGb28ua3dvbmx5XzMnIGFuZCBpcyBub3cgMyBpbiBvdmVycmlkZGVuICdGb28ua3dvbmx5XzMnIG1ldGhvZAorYXJndW1lbnRzLWRpZmZlcjozMDc6NDpGb28ua3dvbmx5XzQ6TnVtYmVyIG9mIHBhcmFtZXRlcnMgd2FzIDMgaW4gJ0Fic3RyYWN0Rm9vLmt3b25seV80JyBhbmQgaXMgbm93IDMgaW4gb3ZlcnJpZGRlbiAnRm9vLmt3b25seV80JyBtZXRob2QKK2FyZ3VtZW50cy1kaWZmZXI6MzEwOjQ6Rm9vLmt3b25seV81OlZhcmlhZGljcyByZW1vdmVkIGluIG92ZXJyaWRkZW4gJ0Zvby5rd29ubHlfNScgbWV0aG9kCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzX291dF9vZl9vcmRlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfb3V0X29mX29yZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDY2NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzX291dF9vZl9vcmRlci5weQpAQCAtMCwwICsxLDUzIEBACisgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UsIG5vLW1ldGhvZC1hcmd1bWVudCwgbWlzc2luZy1kb2NzdHJpbmcsCisKKworZGVmIGZ1bmN0aW9uXzNfYXJncyhmaXJzdF9hcmd1bWVudCwgc2Vjb25kX2FyZ3VtZW50LCB0aGlyZF9hcmd1bWVudCk6CisgICAgIiIidGhyZWUgYXJndW1lbnRzIGZ1bmN0aW9uIiIiCisgICAgcmV0dXJuIGZpcnN0X2FyZ3VtZW50LCBzZWNvbmRfYXJndW1lbnQsIHRoaXJkX2FyZ3VtZW50CisKKworZGVmIGZ1bmN0aW9uX2RlZmF1bHRfYXJnKG9uZT0xLCB0d289Mik6CisgICAgIiIiZm9uY3Rpb24gd2l0aCBkZWZhdWx0IHZhbHVlIiIiCisgICAgcmV0dXJuIHR3bywgb25lCisKKworZGVmIGFyZ3Nfb3V0X29mX29yZGVyKCk6CisgICAgIiIiVGVzdHMgZm9yIGFyZ3VtZW50cy1vdXQtb2Ytb3JkZXIiIiIKKyAgICBmaXJzdF9hcmd1bWVudCA9IDEKKyAgICBzZWNvbmRfYXJndW1lbnQgPSAyCisgICAgdGhpcmRfYXJndW1lbnQgPSAzCisgICAgb25lID0gMQorICAgIHR3byA9IDIKKworICAgIGZ1bmN0aW9uXzNfYXJncyhmaXJzdF9hcmd1bWVudCwgdGhpcmRfYXJndW1lbnQsIHNlY29uZF9hcmd1bWVudCkgIyBbYXJndW1lbnRzLW91dC1vZi1vcmRlcl0KKyAgICBmdW5jdGlvbl8zX2FyZ3Moc2Vjb25kX2FyZ3VtZW50LCBmaXJzdF9hcmd1bWVudCwgIyBbYXJndW1lbnRzLW91dC1vZi1vcmRlcl0KKyAgICAgICAgICAgICAgICAgICAgdGhpcmRfYXJndW1lbnQ9dGhpcmRfYXJndW1lbnQpCisgICAgZnVuY3Rpb25fZGVmYXVsdF9hcmcodHdvLCBvbmUpICMgW2FyZ3VtZW50cy1vdXQtb2Ytb3JkZXJdCisKKyAgICAjIENoZWNraW5nIGV4Y2VwdGlvbnM6CisgICAgIyBzdXBwbHlpbmcgdGhlIHNhbWUgYXR0cmlidXRlIHR3aWNlIGluc3RlYWQgb2YgdHdvIGRpZmZlcmVudCBvbmVzCisgICAgZnVuY3Rpb25fM19hcmdzKGZpcnN0X2FyZ3VtZW50LCBmaXJzdF9hcmd1bWVudCwgdGhpcmRfYXJndW1lbnQpCisKKyAgICAjIGtleXdvcmQgcGFzc2luZworICAgIGZ1bmN0aW9uX2RlZmF1bHRfYXJnKHR3bz10d28sIG9uZT1vbmUpCisKKyAgICAjIGFueXRoaW5nIG90aGVyIHRoYW4gbmFtZWQgYXR0cmlidXRlcworICAgIGZ1bmN0aW9uXzNfYXJncygxLCBsaXN0LCAxICsgMikKKworICAgICMgVGhlIGNoZWNrIGFzc3VtZXMgeW91IGtub3cgYmV0dGVyIGlmIGF0IGxlYXN0IDEgYXJnIGRvZXMgbm90IG1hdGNoIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUKKyAgICBmdW5jdGlvbl8zX2FyZ3Mob25lLCB0aGlyZF9hcmd1bWVudCwgc2Vjb25kX2FyZ3VtZW50KQorCisgICAgIyB3ZSBjdXJyZW50bHkgZG9uJ3Qgd2FybiBmb3IgdGhlIGNhc2Ugd2hlcmUga2V5d29yZCBhcmdzIGhhdmUgYmVlbiBzd2FwcGVkCisgICAgZnVuY3Rpb25fZGVmYXVsdF9hcmcodHdvPW9uZSwgb25lPXR3bykKKworICAgICMgZW5zdXJlIG9iamVjdCBtZXRob2RzIGFyZSBjaGVja2VkIGNvcnJlY3RseSBkZXNwaXRlIGltcGxpY2l0IHNlbGYKKyAgICBjbGFzcyBUZXN0Q2xhc3M6CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGZ1bmN0aW9uXzBfYXJncygpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRlZiBmdW5jdGlvbl8yX2FyZ3Moc2VsZiwgZmlyc3RfYXJndW1lbnQsIHNlY29uZF9hcmd1bWVudD0yKToKKyAgICAgICAgICAgIHJldHVybiBmaXJzdF9hcmd1bWVudCwgc2Vjb25kX2FyZ3VtZW50CisKKyAgICBUZXN0Q2xhc3MoKS5mdW5jdGlvbl8yX2FyZ3Moc2Vjb25kX2FyZ3VtZW50LCBmaXJzdF9hcmd1bWVudCkgIyBbYXJndW1lbnRzLW91dC1vZi1vcmRlcl0KKyAgICBUZXN0Q2xhc3MoKS5mdW5jdGlvbl8yX2FyZ3MoZmlyc3RfYXJndW1lbnQsIHNlY29uZF9hcmd1bWVudD1zZWNvbmRfYXJndW1lbnQpCisgICAgVGVzdENsYXNzLmZ1bmN0aW9uXzBfYXJncygpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzX291dF9vZl9vcmRlci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzX291dF9vZl9vcmRlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMmZjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfb3V0X29mX29yZGVyLnR4dApAQCAtMCwwICsxLDQgQEAKK2FyZ3VtZW50cy1vdXQtb2Ytb3JkZXI6MjI6NDphcmdzX291dF9vZl9vcmRlcjpQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcHBlYXIgdG8gYmUgb3V0IG9mIG9yZGVyCithcmd1bWVudHMtb3V0LW9mLW9yZGVyOjIzOjQ6YXJnc19vdXRfb2Zfb3JkZXI6UG9zaXRpb25hbCBhcmd1bWVudHMgYXBwZWFyIHRvIGJlIG91dCBvZiBvcmRlcgorYXJndW1lbnRzLW91dC1vZi1vcmRlcjoyNTo0OmFyZ3Nfb3V0X29mX29yZGVyOlBvc2l0aW9uYWwgYXJndW1lbnRzIGFwcGVhciB0byBiZSBvdXQgb2Ygb3JkZXIKK2FyZ3VtZW50cy1vdXQtb2Ytb3JkZXI6NTE6NDphcmdzX291dF9vZl9vcmRlcjpQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcHBlYXIgdG8gYmUgb3V0IG9mIG9yZGVyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzX3JlbmFtZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzX3JlbmFtZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViNTExNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfcmVuYW1lZC5weQpAQCAtMCwwICsxLDc0IEBACisjcHlsaW50OiBkaXNhYmxlID0gdW51c2VkLWFyZ3VtZW50LCBtaXNzaW5nLWRvY3N0cmluZywgbm8tc2VsZi11c2UsIGxpbmUtdG9vLWxvbmcsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzCitpbXBvcnQgZW51bQorCisKK2NsYXNzIENvbmRpbWVudChlbnVtLkVudW0pOgorICAgIENJTkFNT04gPSAxCisgICAgU1VHQVIgPSAyCisKK2NsYXNzIEZydWl0OgorICAgIGRlZiBicmV3KHNlbGYsIGZydWl0X25hbWU6IHN0cik6CisgICAgICAgIHByaW50KGYiQnJld2luZyBhIGZydWl0IG5hbWVkIHtmcnVpdF9uYW1lfSIpCisKKyAgICBkZWYgZWF0X3dpdGhfY29uZGltZW50KHNlbGYsIGZydWl0X25hbWU6c3RyLCBjb25kaW1lbnQ6IENvbmRpbWVudCk6CisgICAgICAgIHByaW50KGYiRWF0aW5nIGEgZnJ1aXQgbmFtZWQge2ZydWl0X25hbWV9IHdpdGgge2NvbmRpbWVudH0iKQorCitjbGFzcyBPcmFuZ2UoRnJ1aXQpOgorICAgIGRlZiBicmV3KHNlbGYsIG9yYW5nZV9uYW1lOiBzdHIpOiAjIFthcmd1bWVudHMtcmVuYW1lZF0KKyAgICAgICAgcHJpbnQoZiJCcmV3aW5nIGFuIG9yYW5nZSBuYW1lZCB7b3JhbmdlX25hbWV9IikKKworICAgIGRlZiBlYXRfd2l0aF9jb25kaW1lbnQoc2VsZiwgb3JhbmdlX25hbWU6IHN0ciwgY29uZGltZW50OiBDb25kaW1lbnQoKSk6ICNbYXJndW1lbnRzLXJlbmFtZWRdCisgICAgICAgIHByaW50KGYiRWF0aW5nIGEgZnJ1aXQgbmFtZWQge29yYW5nZV9uYW1lfSB3aXRoIHtjb25kaW1lbnR9IikKKworY2xhc3MgQmFuYW5hKEZydWl0KToKKyAgICBkZWYgYnJldyhzZWxmLCBmcnVpdF9uYW1lOiBib29sKTogIyBObyB3YXJuaW5nIGhlcmUKKyAgICAgICAgcHJpbnQoZiJCcmV3aW5nIGEgYmFuYW5hIG5hbWVkIHtmcnVpdF9uYW1lfSIpCisKKyAgICBkZWYgZWF0X3dpdGhfY29uZGltZW50KHNlbGYsIGZydWl0X25hbWU6IHN0ciwgY29uZGltZW50OiBDb25kaW1lbnQsIGVycm9yOiBzdHIpOiAjIFthcmd1bWVudHMtZGlmZmVyXQorICAgICAgICBwcmludChmIkVhdGluZyBhIGZydWl0IG5hbWVkIHtmcnVpdF9uYW1lfSB3aXRoIHtjb25kaW1lbnR9IikKKworY2xhc3MgUGFyZW50KG9iamVjdCk6CisKKyAgICBkZWYgdGVzdChzZWxmLCBhcmcpOgorICAgICAgICByZXR1cm4gYXJnICsgMQorCisgICAgZGVmIGt3YXJnc190ZXN0KHNlbGYsIGFyZywgKiwgdmFyMSwgdmFyMik6CisgICAgICAgIHByaW50KGYia2V5d29yZCBwYXJhbWV0ZXJzIGFyZSB7dmFyMX0gYW5kIHt2YXIyfS4iKQorCitjbGFzcyBDaGlsZChQYXJlbnQpOgorCisgICAgZGVmIHRlc3Qoc2VsZiwgYXJnMSk6ICMgW2FyZ3VtZW50cy1yZW5hbWVkXQorICAgICAgICByZXR1cm4gYXJnMSArIDEKKworICAgIGRlZiBrd2FyZ3NfdGVzdChzZWxmLCBhcmcsICosIHZhbHVlMSwgdmFyMik6ICNbYXJndW1lbnRzLXJlbmFtZWRdCisgICAgICAgIHByaW50KGYia2V5d29yZCBwYXJhbWV0ZXJzIGFyZSB7dmFsdWUxfSBhbmQge3ZhcjJ9LiIpCisKK2NsYXNzIENoaWxkMihQYXJlbnQpOgorCisgICAgZGVmIHRlc3Qoc2VsZiwgdmFyKTogIyBbYXJndW1lbnRzLXJlbmFtZWRdCisgICAgICAgIHJldHVybiB2YXIgKyAxCisKKyAgICBkZWYga3dhcmdzX3Rlc3Qoc2VsZiwgKiwgdmFyMSwga3cyKTogI1thcmd1bWVudHMtcmVuYW1lZCwgYXJndW1lbnRzLWRpZmZlcl0KKyAgICAgICAgcHJpbnQoZiJrZXl3b3JkIHBhcmFtZXRlcnMgYXJlIHt2YXIxfSBhbmQge2t3Mn0uIikKKworY2xhc3MgUGFyZW50RGVmYXVsdHMob2JqZWN0KToKKworICAgIGRlZiB0ZXN0MShzZWxmLCBhcmcsIGJhcmcpOgorICAgICAgICBwcmludChmIkFyZ3VtZW50IHZhbHVlcyBhcmUge2FyZ30gYW5kIHtiYXJnfSIpCisKKyAgICBkZWYgdGVzdDIoc2VsZiwgYXJnLCBiYXJnKToKKyAgICAgICAgcHJpbnQoZiJBcmd1bWVudCB2YWx1ZXMgYXJlIHthcmd9IGFuZCB7YmFyZ30hIikKKworICAgIGRlZiB0ZXN0MyhzZWxmLCBhcmcxLCBhcmcyKToKKyAgICAgICAgcHJpbnQoZiJhcmd1bWVudHM6IHthcmcxfSB7YXJnMn0iKQorCitjbGFzcyBDaGlsZERlZmF1bHRzKFBhcmVudERlZmF1bHRzKToKKworICAgIGRlZiB0ZXN0MShzZWxmLCBhcmcsIHBhcmFtMik6ICMgW2FyZ3VtZW50cy1yZW5hbWVkXQorICAgICAgICBwcmludChmIkFyZ3VtZW50IHZhbHVlcyBhcmUge2FyZ30gYW5kIHtwYXJhbTJ9IikKKworICAgIGRlZiB0ZXN0MihzZWxmLCBfYXJnLCBpZ25vcmVkX2JhcmcpOiAjIG5vIGVycm9yIGhlcmUKKyAgICAgICAgcHJpbnQoZiJBcmd1bWVudCB2YWx1ZSBpcyB7X2FyZ30iKQorCisgICAgZGVmIHRlc3QzKHNlbGYsIGR1bW15X3BhcmFtLCBhcmcyKTogIyBubyBlcnJvciBoZXJlCisgICAgICAgIHByaW50KGYiYXJndW1lbnRzOiB7YXJnMn0iKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2FyZ3VtZW50c19yZW5hbWVkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfcmVuYW1lZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzYjYwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hcmd1bWVudHNfcmVuYW1lZC50eHQKQEAgLTAsMCArMSw5IEBACithcmd1bWVudHMtcmVuYW1lZDoxNzo0Ok9yYW5nZS5icmV3OlBhcmFtZXRlciAnZnJ1aXRfbmFtZScgaGFzIGJlZW4gcmVuYW1lZCB0byAnb3JhbmdlX25hbWUnIGluIG92ZXJyaWRkZW4gJ09yYW5nZS5icmV3JyBtZXRob2QKK2FyZ3VtZW50cy1yZW5hbWVkOjIwOjQ6T3JhbmdlLmVhdF93aXRoX2NvbmRpbWVudDpQYXJhbWV0ZXIgJ2ZydWl0X25hbWUnIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ29yYW5nZV9uYW1lJyBpbiBvdmVycmlkZGVuICdPcmFuZ2UuZWF0X3dpdGhfY29uZGltZW50JyBtZXRob2QKK2FyZ3VtZW50cy1kaWZmZXI6Mjc6NDpCYW5hbmEuZWF0X3dpdGhfY29uZGltZW50Ok51bWJlciBvZiBwYXJhbWV0ZXJzIHdhcyAzIGluICdGcnVpdC5lYXRfd2l0aF9jb25kaW1lbnQnIGFuZCBpcyBub3cgNCBpbiBvdmVycmlkZGVuICdCYW5hbmEuZWF0X3dpdGhfY29uZGltZW50JyBtZXRob2QKK2FyZ3VtZW50cy1yZW5hbWVkOjQwOjQ6Q2hpbGQudGVzdDpQYXJhbWV0ZXIgJ2FyZycgaGFzIGJlZW4gcmVuYW1lZCB0byAnYXJnMScgaW4gb3ZlcnJpZGRlbiAnQ2hpbGQudGVzdCcgbWV0aG9kCithcmd1bWVudHMtcmVuYW1lZDo0Mzo0OkNoaWxkLmt3YXJnc190ZXN0OlBhcmFtZXRlciAndmFyMScgaGFzIGJlZW4gcmVuYW1lZCB0byAndmFsdWUxJyBpbiBvdmVycmlkZGVuICdDaGlsZC5rd2FyZ3NfdGVzdCcgbWV0aG9kCithcmd1bWVudHMtcmVuYW1lZDo0ODo0OkNoaWxkMi50ZXN0OlBhcmFtZXRlciAnYXJnJyBoYXMgYmVlbiByZW5hbWVkIHRvICd2YXInIGluIG92ZXJyaWRkZW4gJ0NoaWxkMi50ZXN0JyBtZXRob2QKK2FyZ3VtZW50cy1kaWZmZXI6NTE6NDpDaGlsZDIua3dhcmdzX3Rlc3Q6TnVtYmVyIG9mIHBhcmFtZXRlcnMgd2FzIDQgaW4gJ1BhcmVudC5rd2FyZ3NfdGVzdCcgYW5kIGlzIG5vdyAzIGluIG92ZXJyaWRkZW4gJ0NoaWxkMi5rd2FyZ3NfdGVzdCcgbWV0aG9kCithcmd1bWVudHMtcmVuYW1lZDo1MTo0OkNoaWxkMi5rd2FyZ3NfdGVzdDpQYXJhbWV0ZXIgJ3ZhcjInIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ2t3MicgaW4gb3ZlcnJpZGRlbiAnQ2hpbGQyLmt3YXJnc190ZXN0JyBtZXRob2QKK2FyZ3VtZW50cy1yZW5hbWVkOjY3OjQ6Q2hpbGREZWZhdWx0cy50ZXN0MTpQYXJhbWV0ZXIgJ2JhcmcnIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ3BhcmFtMicgaW4gb3ZlcnJpZGRlbiAnQ2hpbGREZWZhdWx0cy50ZXN0MScgbWV0aG9kCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzZXJ0X29uX3N0cmluZ19saXRlcmFsLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2VydF9vbl9zdHJpbmdfbGl0ZXJhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU3ZDRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2VydF9vbl9zdHJpbmdfbGl0ZXJhbC5weQpAQCAtMCwwICsxLDQgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctbW9kdWxlLWRvY3N0cmluZywgdW5kZWZpbmVkLXZhcmlhYmxlCithc3NlcnQgW2ZvbywgYmFyXSwgIk5vIEFzc2VydGlvbkVycm9yIgorYXNzZXJ0ICJUaGVyZSBpcyBhbiBBc3NlcnRpb25FcnJvciIgIyBbYXNzZXJ0LW9uLXN0cmluZy1saXRlcmFsXQorYXNzZXJ0ICIiICMgW2Fzc2VydC1vbi1zdHJpbmctbGl0ZXJhbF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NlcnRfb25fc3RyaW5nX2xpdGVyYWwudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2VydF9vbl9zdHJpbmdfbGl0ZXJhbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwODE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NlcnRfb25fc3RyaW5nX2xpdGVyYWwudHh0CkBAIC0wLDAgKzEsMiBAQAorYXNzZXJ0LW9uLXN0cmluZy1saXRlcmFsOjM6MDo6QXNzZXJ0IHN0YXRlbWVudCBoYXMgYSBzdHJpbmcgbGl0ZXJhbCBhcyBpdHMgZmlyc3QgYXJndW1lbnQuIFRoZSBhc3NlcnQgd2lsbCBuZXZlciBmYWlsLgorYXNzZXJ0LW9uLXN0cmluZy1saXRlcmFsOjQ6MDo6QXNzZXJ0IHN0YXRlbWVudCBoYXMgYSBzdHJpbmcgbGl0ZXJhbCBhcyBpdHMgZmlyc3QgYXJndW1lbnQuIFRoZSBhc3NlcnQgd2lsbCBhbHdheXMgZmFpbC4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NlcnRfb25fdHVwbGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzZXJ0X29uX3R1cGxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjA3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzZXJ0X29uX3R1cGxlLnB5CkBAIC0wLDAgKzEsMTEgQEAKKycnJ0Fzc2VydCBjaGVjayBleGFtcGxlJycnCisKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50LCBjb21wYXJpc29uLXdpdGgtaXRzZWxmCithc3NlcnQgKDEgPT0gMSwgMiA9PSAyKSwgIm5vIGVycm9yIgorYXNzZXJ0ICgxID09IDEsIDIgPT0gMikgIyBbYXNzZXJ0LW9uLXR1cGxlXQorYXNzZXJ0IDEgPT0gMSwgIm5vIGVycm9yIgorYXNzZXJ0ICgxID09IDEsICksICJubyBlcnJvciIKK2Fzc2VydCAoMSA9PSAxLCApCithc3NlcnQgKDEgPT0gMSwgMiA9PSAyLCAzID09IDUpLCAibm8gZXJyb3IiCithc3NlcnQgKCkKK2Fzc2VydCAoVHJ1ZSwgJ2Vycm9yIG1zZycpICMgW2Fzc2VydC1vbi10dXBsZV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NlcnRfb25fdHVwbGUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2VydF9vbl90dXBsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzZmFmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NlcnRfb25fdHVwbGUudHh0CkBAIC0wLDAgKzEsMiBAQAorYXNzZXJ0LW9uLXR1cGxlOjU6MDo6QXNzZXJ0IGNhbGxlZCBvbiBhIDItaXRlbS10dXBsZS4gRGlkIHlvdSBtZWFuICdhc3NlcnQgeCx5Jz8KK2Fzc2VydC1vbi10dXBsZToxMTowOjpBc3NlcnQgY2FsbGVkIG9uIGEgMi1pdGVtLXR1cGxlLiBEaWQgeW91IG1lYW4gJ2Fzc2VydCB4LHknPwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ21lbnRfZnJvbV9ub19yZXR1cm4ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbWVudF9mcm9tX25vX3JldHVybi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q1ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ21lbnRfZnJvbV9ub19yZXR1cm4ucHkKQEAgLTAsMCArMSw2MSBAQAorIyBweWxpbnQ6IGRpc2FibGU9dXNlbGVzcy1yZXR1cm4sIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCBjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQKKyIiImNoZWNrIGFzc2lnbm1lbnQgdG8gZnVuY3Rpb24gY2FsbCB3aGVyZSB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4KKworICAgICdFMTExMSc6ICgnQXNzaWduaW5nIHRvIGZ1bmN0aW9uIGNhbGwgd2hpY2ggZG9lc25cJ3QgcmV0dXJuJywKKyAgICAgICAgICAgICAgJ1VzZWQgd2hlbiBhbiBhc3NpZ25tZW50IGlzIGRvbmUgb24gYSBmdW5jdGlvbiBjYWxsIGJ1dCB0aGUgXAorICAgICAgICAgICAgICBpbmZlcmVkIGZ1bmN0aW9uIGRvZXNuXCd0IHJldHVybiBhbnl0aGluZy4nKSwKKyAgICAnVzExMTEnOiAoJ0Fzc2lnbmluZyB0byBmdW5jdGlvbiBjYWxsIHdoaWNoIG9ubHkgcmV0dXJucyBOb25lJywKKyAgICAgICAgICAgICAgJ1VzZWQgd2hlbiBhbiBhc3NpZ25tZW50IGlzIGRvbmUgb24gYSBmdW5jdGlvbiBjYWxsIGJ1dCB0aGUgXAorICAgICAgICAgICAgICBpbmZlcmVkIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyBidXQgTm9uZS4nKSwKKworIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMsIHByaW50X2Z1bmN0aW9uCisKK2RlZiBmdW5jX25vX3JldHVybigpOgorICAgICIiImZ1bmN0aW9uIHdpdGhvdXQgcmV0dXJuIiIiCisgICAgcHJpbnQoJ2RvdWdsb3VwJykKKworQSA9IGZ1bmNfbm9fcmV0dXJuKCkgICMgW2Fzc2lnbm1lbnQtZnJvbS1uby1yZXR1cm5dCisKKworZGVmIGZ1bmNfcmV0dXJuX25vbmUoKToKKyAgICAiIiJmdW5jdGlvbiByZXR1cm5pbmcgbm9uZSIiIgorICAgIHByaW50KCdkb3VnbG91cCcpCisgICAgcmV0dXJuIE5vbmUKKworQSA9IGZ1bmNfcmV0dXJuX25vbmUoKSAgIyBbYXNzaWdubWVudC1mcm9tLW5vbmVdCisKKworZGVmIGZ1bmNfaW1wbGljaXRfcmV0dXJuX25vbmUoKToKKyAgICAiIiJGdW5jdGlvbiByZXR1cm5pbmcgTm9uZSBmcm9tIGJhcmUgcmV0dXJuIHN0YXRlbWVudC4iIiIKKyAgICByZXR1cm4KKworQSA9IGZ1bmNfaW1wbGljaXRfcmV0dXJuX25vbmUoKSAgIyBbYXNzaWdubWVudC1mcm9tLW5vbmVdCisKKworZGVmIGZ1bmNfcmV0dXJuX25vbmVfYW5kX3NtdGgoKToKKyAgICAiIiJmdW5jdGlvbiByZXR1cm5pbmcgbm9uZSBhbmQgc29tZXRoaW5nIGVsc2UiIiIKKyAgICBwcmludCgnZG91Z2xvdXAnKQorICAgIGlmIDIgb3IgMzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gMworCitBID0gZnVuY19yZXR1cm5fbm9uZV9hbmRfc210aCgpCisKK2RlZiBnZW5lcmF0b3IoKToKKyAgICAiIiJubyBwcm9ibGVtbyIiIgorICAgIHlpZWxkIDIKKworQSA9IGdlbmVyYXRvcigpCisKK2NsYXNzIEFic3RyYWN0KG9iamVjdCk6CisgICAgIiIiYmxhIGJsYSIiIgorCisgICAgZGVmIGFic3RyYWN0X21ldGhvZChzZWxmKToKKyAgICAgICAgIiIidXNlIHRvIHJldHVybiBzb21ldGhpbmcgaW4gY29uY3JldGUgaW1wbGVtZW50YXRpb24iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHVzZV9hYnN0cmFjdChzZWxmKToKKyAgICAgICAgIiIic2hvdWxkIG5vdCBpc3N1ZSBFMTExMSIiIgorICAgICAgICB2YXIgPSBzZWxmLmFic3RyYWN0X21ldGhvZCgpCisgICAgICAgIHByaW50KHZhcikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdtZW50X2Zyb21fbm9fcmV0dXJuLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdtZW50X2Zyb21fbm9fcmV0dXJuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTE4MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ21lbnRfZnJvbV9ub19yZXR1cm4udHh0CkBAIC0wLDAgKzEsMyBAQAorYXNzaWdubWVudC1mcm9tLW5vLXJldHVybjoxODowOjpBc3NpZ25pbmcgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgd2hlcmUgdGhlIGZ1bmN0aW9uIGhhcyBubyByZXR1cm4KK2Fzc2lnbm1lbnQtZnJvbS1ub25lOjI2OjA6OkFzc2lnbmluZyByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCB3aGVyZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBOb25lCithc3NpZ25tZW50LWZyb20tbm9uZTozMzowOjpBc3NpZ25pbmcgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2FsbCwgd2hlcmUgdGhlIGZ1bmN0aW9uIHJldHVybnMgTm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25pbmdfbm9uX3Nsb3QucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDBhMmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25pbmdfbm9uX3Nsb3QucHkKQEAgLTAsMCArMSwxNzUgQEAKKyIiIiBDaGVja3MgYXNzaWduaW5nIGF0dHJpYnV0ZXMgbm90IGZvdW5kIGluIGNsYXNzIHNsb3RzCit3aWxsIHRyaWdnZXIgYXNzaWduaW5nLW5vbi1zbG90IHdhcm5pbmcuCisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG5vLWluaXQsIG1pc3NpbmctZG9jc3RyaW5nLCBuby1hYnNvbHV0ZS1pbXBvcnQsIGltcG9ydC1lcnJvciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisKK2Zyb20gbWlzc2luZyBpbXBvcnQgVW5rbm93bgorCitjbGFzcyBFbXB0eShvYmplY3QpOgorICAgICIiIiBlbXB0eSAiIiIKKworY2xhc3MgQmFkKG9iamVjdCk6CisgICAgIiIiIG1pc3Npbmcgbm90IGluIHNsb3RzLiAiIiIKKworICAgIF9fc2xvdHNfXyA9IFsnbWVtYmVyJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5taXNzaW5nID0gNDIgIyBbYXNzaWduaW5nLW5vbi1zbG90XQorCitjbGFzcyBCYWQyKG9iamVjdCk6CisgICAgIiIiIG1pc3Npbmcgbm90IGluIHNsb3RzICIiIgorICAgIF9fc2xvdHNfXyA9IFtkZXF1ZS5fX25hbWVfXywgJ21lbWJlciddCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGVxdWUgPSA0MgorICAgICAgICBzZWxmLm1pc3NpbmcgPSA0MiAjIFthc3NpZ25pbmctbm9uLXNsb3RdCisKK2NsYXNzIEJhZDMoQmFkKToKKyAgICAiIiIgbWlzc2luZyBub3QgZm91bmQgaW4gc2xvdHMgIiIiCisKKyAgICBfX3Nsb3RzX18gPSBbJ2NvbXBvbmVudCddCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29tcG9uZW50ID0gNDIKKyAgICAgICAgc2VsZi5tZW1iZXIgPSAyNAorICAgICAgICBzZWxmLm1pc3NpbmcgPSA0MiAjIFthc3NpZ25pbmctbm9uLXNsb3RdCisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQorCitjbGFzcyBHb29kKEVtcHR5KToKKyAgICAiIiIgbWlzc2luZyBub3QgaW4gc2xvdHMsIGJ1dCBFbXB0eSBkb2Vzbid0CisgICAgc3BlY2lmeSBfX3Nsb3RzX18uCisgICAgIiIiCisgICAgX19zbG90c19fID0gWydhJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5taXNzaW5nID0gNDIKKworY2xhc3MgR29vZDIob2JqZWN0KToKKyAgICAiIiIgVXNpbmcgX19kaWN0X18gaW4gc2xvdHMgd2lsbCBiZSBzYWZlLiAiIiIKKworICAgIF9fc2xvdHNfXyA9IFsnX19kaWN0X18nLCAnY29tcCddCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29tcCA9IDQKKyAgICAgICAgc2VsZi5taXNzaW5nID0gNQorCitjbGFzcyBQcm9wZXJ0eUdvb2Qob2JqZWN0KToKKyAgICAiIiIgVXNpbmcgcHJvcGVydGllcyBpcyBzYWZlLiAiIiIKKworICAgIF9fc2xvdHNfXyA9IFsndG1wJywgJ192YWx1ZSddCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCisKKyAgICBAdGVzdC5zZXR0ZXIKKyAgICBkZWYgdGVzdChzZWxmLCB2YWx1ZSk6CisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPWF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdAorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudGVzdCA9IDQyCisKK2NsYXNzIFByb3BlcnR5R29vZDIob2JqZWN0KToKKyAgICAiIiIgVXNpbmcgcHJvcGVydGllcyBpbiB0aGUgYm9keSBvZiB0aGUgY2xhc3MgaXMgc2FmZS4gIiIiCisgICAgX19zbG90c19fID0gWydfdmFsdWUnXQorCisgICAgZGVmIF9nZXR0ZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorCisgICAgZGVmIF9zZXR0ZXIoc2VsZiwgdmFsdWUpOgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1hdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgdGVzdCA9IHByb3BlcnR5KF9nZXR0ZXIsIF9zZXR0ZXIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudGVzdCA9IDI0CisKK2NsYXNzIFVuaWNvZGVTbG90cyhvYmplY3QpOgorICAgICIiIlVzaW5nIHVuaWNvZGUgb2JqZWN0cyBpbiBfX3Nsb3RzX18gaXMgb2theS4KKworICAgIE9uIFB5dGhvbiAzLjMgb253YXJkLCB1JycgaXMgZXF1aXZhbGVudCB0byAnJywKKyAgICBzbyB0aGlzIHRlc3Qgc2hvdWxkIGJlIHNhZmUgZm9yIGJvdGggdmVyc2lvbnMuCisgICAgIiIiCisgICAgX19zbG90c19fID0gKHUnZmlyc3QnLCB1J3NlY29uZCcpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZmlyc3QgPSA0MgorICAgICAgICBzZWxmLnNlY29uZCA9IDI0CisKKworY2xhc3MgRGF0YURlc2NyaXB0b3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGVmYXVsdD0nJyk6CisgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQorICAgICAgICBzZWxmLl9fZGVmYXVsdCA9IGRlZmF1bHQKKworICAgIGRlZiBfX2dldF9fKHNlbGYsIGluc3QsIGNscyk6CisgICAgICAgIHJldHVybiBnZXRhdHRyKGluc3QsIHNlbGYuX19uYW1lLCBzZWxmLl9fZGVmYXVsdCkKKworICAgIGRlZiBfX3NldF9fKHNlbGYsIGluc3QsIHZhbHVlKToKKyAgICAgICAgc2V0YXR0cihpbnN0LCBzZWxmLl9fbmFtZSwgdmFsdWUpCisKKworY2xhc3MgTm9uRGF0YURlc2NyaXB0b3Iob2JqZWN0KToKKyAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0LCBjbHMpOgorICAgICAgICByZXR1cm4gNDIKKworCitjbGFzcyBTbG90c1dpdGhEZXNjcmlwdG9yKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfZXJyJ10KKyAgICBkYXRhX2Rlc2NyaXB0b3IgPSBEYXRhRGVzY3JpcHRvcignX2VycicpCisgICAgbm9uX2RhdGFfZGVzY3JpcHRvciA9IE5vbkRhdGFEZXNjcmlwdG9yKCkKKyAgICBtaXNzaW5nX2Rlc2NyaXB0b3IgPSBVbmtub3duKCkKKworCitkZWYgZG9udF9lbWl0X2Zvcl9kZXNjcmlwdG9ycygpOgorICAgIGluc3QgPSBTbG90c1dpdGhEZXNjcmlwdG9yKCkKKyAgICAjIFRoaXMgc2hvdWxkIG5vdCBlbWl0LCBiZWNhdXNlIGF0dHIgaXMKKyAgICAjIGEgZGF0YSBkZXNjcmlwdG9yCisgICAgaW5zdC5kYXRhX2Rlc2NyaXB0b3IgPSAnZm9vJworICAgIGluc3Qubm9uX2RhdGFfZGVzY3JpcHRvciA9ICdsYWxhJyAjIFthc3NpZ25pbmctbm9uLXNsb3RdCisKKworY2xhc3MgQ2xhc3NXaXRoU2xvdHMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ2Zvb2JhciddCisKKworY2xhc3MgQ2xhc3NSZWFzc2lnbmluZ0R1bmRlckNsYXNzKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydmb29iYXInXQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX19jbGFzc19fID0gQ2xhc3NXaXRoU2xvdHMKKworCitjbGFzcyBDbGFzc1JlYXNzaW5naW5nSW52YWxpZExheW91dENsYXNzKG9iamVjdCk6CisgICAgX19zbG90c19fID0gW10KKworICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IENsYXNzV2l0aFNsb3RzICMgW2Fzc2lnbmluZy1ub24tc2xvdF0KKworCisjIHB5bGludDogZGlzYWJsZT1hdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQKK2NsYXNzIENsYXNzSGF2aW5nVW5rbm93bkFuY2VzdG9ycyhVbmtub3duKToKKyAgICBfX3Nsb3RzX18gPSBbJ3lvJ10KKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLm5vdF95byA9IDQyCisKKworIyBweWxpbnQ6IGRpc2FibGU9d3JvbmctaW1wb3J0LW9yZGVyLCB3cm9uZy1pbXBvcnQtcG9zaXRpb24KK2Zyb20gdHlwaW5nIGltcG9ydCAoCisgICAgR2VuZXJpYywKKyAgICBUeXBlVmFyLAorKQorCitUWVBFID0gVHlwZVZhcignVFlQRScpCisKKworY2xhc3MgQ2xzKEdlbmVyaWNbVFlQRV0pOgorICAgICIiIiBTaW1wbGUgY2xhc3Mgd2l0aCBzbG90cyAiIiIKKyAgICBfX3Nsb3RzX18gPSBbJ3ZhbHVlJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25pbmdfbm9uX3Nsb3QudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25pbmdfbm9uX3Nsb3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmY1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdC50eHQKQEAgLTAsMCArMSw1IEBACithc3NpZ25pbmctbm9uLXNsb3Q6MTg6ODpCYWQuX19pbml0X186QXNzaWduaW5nIHRvIGF0dHJpYnV0ZSAnbWlzc2luZycgbm90IGRlZmluZWQgaW4gY2xhc3Mgc2xvdHMKK2Fzc2lnbmluZy1ub24tc2xvdDoyNjo4OkJhZDIuX19pbml0X186QXNzaWduaW5nIHRvIGF0dHJpYnV0ZSAnbWlzc2luZycgbm90IGRlZmluZWQgaW4gY2xhc3Mgc2xvdHMKK2Fzc2lnbmluZy1ub24tc2xvdDozNjo4OkJhZDMuX19pbml0X186QXNzaWduaW5nIHRvIGF0dHJpYnV0ZSAnbWlzc2luZycgbm90IGRlZmluZWQgaW4gY2xhc3Mgc2xvdHMKK2Fzc2lnbmluZy1ub24tc2xvdDoxMzI6NDpkb250X2VtaXRfZm9yX2Rlc2NyaXB0b3JzOkFzc2lnbmluZyB0byBhdHRyaWJ1dGUgJ25vbl9kYXRhX2Rlc2NyaXB0b3InIG5vdCBkZWZpbmVkIGluIGNsYXNzIHNsb3RzCithc3NpZ25pbmctbm9uLXNsb3Q6MTUwOjg6Q2xhc3NSZWFzc2luZ2luZ0ludmFsaWRMYXlvdXRDbGFzcy5yZWxlYXNlOkFzc2lnbmluZyB0byBhdHRyaWJ1dGUgJ19fY2xhc3NfXycgbm90IGRlZmluZWQgaW4gY2xhc3Mgc2xvdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWduaW5nX25vbl9zbG90XzQ1MDkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdF80NTA5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2M2YjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdF80NTA5LnB5CkBAIC0wLDAgKzEsMTggQEAKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCisKKyMgU2xvdHMgd2l0aCBiYXNlIHRoYXQgaW5oZXJpdHMgZnJvbSAnR2VuZXJpYycKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDUwOQorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvYXN0cm9pZC9pc3N1ZXMvOTk5CisKK2Zyb20gdHlwaW5nIGltcG9ydCBHZW5lcmljLCBUeXBlVmFyCitUID0gVHlwZVZhcigiVCIpCisKK2NsYXNzIEJhc2UoR2VuZXJpY1tUXSk6CisgICAgX19zbG90c19fID0gKCkKKworY2xhc3MgRm9vKEJhc2VbVF0pOgorICAgIF9fc2xvdHNfXyA9IFsnX3ZhbHVlJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZTogVCk6CisgICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5fYmFyID0gdmFsdWUgICMgW2Fzc2lnbmluZy1ub24tc2xvdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWduaW5nX25vbl9zbG90XzQ1MDkucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdF80NTA5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2JiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdF80NTA5LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25pbmdfbm9uX3Nsb3RfNDUwOS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbmluZ19ub25fc2xvdF80NTA5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQ3ZjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25pbmdfbm9uX3Nsb3RfNDUwOS50eHQKQEAgLTAsMCArMSBAQAorYXNzaWduaW5nLW5vbi1zbG90OjE4Ojg6Rm9vLl9faW5pdF9fOkFzc2lnbmluZyB0byBhdHRyaWJ1dGUgJ19iYXInIG5vdCBkZWZpbmVkIGluIGNsYXNzIHNsb3RzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbm1lbnRfZXhwcmVzc2lvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9leHByZXNzaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTU4NmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbm1lbnRfZXhwcmVzc2lvbi5weQpAQCAtMCwwICsxLDg2IEBACisiIiJUZXN0IGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHVudXNlZC1hcmd1bWVudCx1bnVzZWQtaW1wb3J0LGludmFsaWQtbmFtZQorIyBweWxpbnQ6IGRpc2FibGU9YmxhY2tsaXN0ZWQtbmFtZSx1bnVzZWQtdmFyaWFibGUscG9pbnRsZXNzLXN0YXRlbWVudAoraW1wb3J0IHJlCisKK2lmIChhIDo9IFRydWUpOgorICAgIHggPSBhCitlbHNlOgorICAgIHggPSBGYWxzZQorCit4ID0gYiBpZiAoYiA6PSBUcnVlKSBlbHNlIEZhbHNlCit4MjogYm9vbCA9IGIyIGlmIChiMiA6PSBUcnVlKSBlbHNlIEZhbHNlCit4MyA9IDAKK3gzICs9IGIzIGlmIChiMyA6PSA0KSBlbHNlIDYKKworYSA9IFsiYSAgICIsICJiICAgIiwgImMgICAiXQorYyA9IFt0ZXh0IGZvciBlbCBpbiBhIGlmICh0ZXh0IDo9IGVsLnN0cmlwKCkpID09ICJiIl0KKworCisjIGNoZWNrIHdyb25nIHVzYWdlCithc3NlcnQgZXJyX2EsIChlcnJfYSA6PSAyKSAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KK3ByaW50KGVycl9iIGFuZCAoZXJyX2IgOj0gMikpICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQordmFsdWVzID0gKAorICAgIGVycl9jIDo9IGVycl9kLCAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICBlcnJfZCA6PSAyLAorKQorCisKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMzM0NworcyA9ICdmb28nIGlmIChmdmFsIDo9IGxhbWJkYTogMSkgaXMgTm9uZSBlbHNlIGZ2YWwKKworCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzM5NTMKK2Fzc2VydCAobiA6PSAyKSA9PSAxLCBmIkV4cGVjdGVkIDEsIGJ1dCBnb3Qge259IgorZGljdCh7MTogKG8gOj0gMil9LCBkYXRhPW8pCithc3NlcnQgKHAgOj0gMikgPT0gMSwgXAorICAgIHAKKworRk9PX1BBVFQgPSByZS5jb21waWxlKCIiKQorZm9vID0gbS5ncm91cCgiZm9vIikgaWYgKG0gOj0gRk9PX1BBVFQubWF0Y2goIiIpKSBlbHNlIEZhbHNlCisKKworIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zODY1CitpZiAoYyA6PSBsYW1iZGE6IDIpIGFuZCBjKCk6CisgICAgcHJpbnQoIm9rIikKKworZGVmIGZ1bmMoKToKKyAgICBwcmludCgoZCA6PSBsYW1iZGE6IDIpIGFuZCBkKQorCisKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMzI3NQordmFsdWVzID0gKAorICAgIGUgOj0gMSwKKyAgICBmIDo9IGUsCispCitwcmludCh2YWx1ZXMpCisKK2Z1bmN0aW9uID0gbGFtYmRhOiAoCisgICAgaCA6PSAxLAorICAgIGkgOj0gaCwKKykKK3ByaW50KGZ1bmN0aW9uKCkpCisKKworIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zNzYzCitmb28gaWYgKGZvbyA6PSAzIC0gMikgPiAwIGVsc2UgMAorCisKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDIzOAorbDEgPSBmJ1RoZSBudW1iZXIgeyhjb3VudDEgOj0gNCl9ICcgXAorICAgICBmJ2lzIGVxdWFsIHRvIHtjb3VudDF9JworbDI6IHN0ciA9ICgKKyAgICBmJ1RoZSBudW1iZXIgeyhjb3VudDIgOj0gNCl9ICcKKyAgICBmJ2lzIGVxdWFsIHRvIHtjb3VudDJ9JworKQorbDMgPSAiSGVsbG8gIgorbDMgKz0gKAorICAgIGYnVGhlIG51bWJlciB7KGNvdW50MyA6PSA0KX0gJworICAgIGYnaXMgZXF1YWwgdG8ge2NvdW50M30nCispCisKKworIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80MzAxCitkZWYgZnVuYzIoKToKKyAgICByZXR1cm4gZidUaGUgbnVtYmVyIHsoY291bnQgOj0gNCl9ICcgXAorICAgICAgICAgICBmJ2lzIGVxdWFsIHRvIHtjb3VudH0nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbm1lbnRfZXhwcmVzc2lvbi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9leHByZXNzaW9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmM1MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbm1lbnRfZXhwcmVzc2lvbi5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9leHByZXNzaW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9leHByZXNzaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI4ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25tZW50X2V4cHJlc3Npb24udHh0CkBAIC0wLDAgKzEsMyBAQAordXNlZC1iZWZvcmUtYXNzaWdubWVudDoyMTo3OjpVc2luZyB2YXJpYWJsZSAnZXJyX2EnIGJlZm9yZSBhc3NpZ25tZW50Cit1c2VkLWJlZm9yZS1hc3NpZ25tZW50OjIyOjY6OlVzaW5nIHZhcmlhYmxlICdlcnJfYicgYmVmb3JlIGFzc2lnbm1lbnQKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MjQ6MTM6OlVzaW5nIHZhcmlhYmxlICdlcnJfZCcgYmVmb3JlIGFzc2lnbm1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9mcm9tX25vX3JldHVybi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9mcm9tX25vX3JldHVybi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdlYjhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25tZW50X2Zyb21fbm9fcmV0dXJuLnB5CkBAIC0wLDAgKzEsNTYgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKKworZGVmIHNvbWVfZnVuYygpOgorICAgIHBhc3MKKworCitkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgIiIiRGVjb3JhdGUgKmZuKiB0byByZXR1cm4gYGBzZWxmYGAgdG8gZW5hYmxlIGNoYWluZWQgbWV0aG9kIGNhbGxzLiIiIgorICAgIGRlZiB3cmFwcGVyKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgZnVuYyhzZWxmLCAqYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIDQyCisgICAgcmV0dXJuIHdyYXBwZXIKKworCitjbGFzcyBDbGFzczoKKworICAgIGRlZiBzb21lX21ldGhvZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGRlY29yYXRlCisgICAgZGVmIHNvbWVfb3RoZXJfZGVjb3JhdGVkX21ldGhvZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNvbWVfb3RoZXJfbWV0aG9kKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuc29tZV9tZXRob2QoKSAgIyBbYXNzaWdubWVudC1mcm9tLW5vLXJldHVybl0KKyAgICAgICAgb3RoZXJfdmFsdWUgPSBzZWxmLnNvbWVfb3RoZXJfZGVjb3JhdGVkX21ldGhvZCgpCisgICAgICAgIHJldHVybiB2YWx1ZSArIG90aGVyX3ZhbHVlCisKKworVkFMVUUgPSBzb21lX2Z1bmMoKSAjIFthc3NpZ25tZW50LWZyb20tbm8tcmV0dXJuXQorCisKK2NsYXNzIFBhcmVudDoKKyAgICAiIiJQYXJlbnQgY2xhc3MiIiIKKworICAgIGRlZiBjb21wdXRlKHNlbGYpOgorICAgICAgICAiIiJUaGlzIGlzbid0IHN1cHBvcnRlZCBieSBhbGwgY2hpbGQgY2xhc3NlcyIiIgorCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0JykKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IiIiCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb21wdXRlKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2NsYXNzIENoaWxkKFBhcmVudCk6CisgICAgIiIiQ2hpbGQgY2xhc3MiIiIKKworICAgIGRlZiBjb21wdXRlKHNlbGYpOgorICAgICAgICAiIiJUaGlzIGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjaGlsZCBjbGFzcyIiIgorCisgICAgICAgIHJldHVybiA0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25tZW50X2Zyb21fbm9fcmV0dXJuLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9mcm9tX25vX3JldHVybi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiY2Q5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9mcm9tX25vX3JldHVybi50eHQKQEAgLTAsMCArMSwyIEBACithc3NpZ25tZW50LWZyb20tbm8tcmV0dXJuOjI2Ojg6Q2xhc3Muc29tZV9vdGhlcl9tZXRob2Q6QXNzaWduaW5nIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHdoZXJlIHRoZSBmdW5jdGlvbiBoYXMgbm8gcmV0dXJuCithc3NpZ25tZW50LWZyb20tbm8tcmV0dXJuOjMxOjA6OkFzc2lnbmluZyByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCB3aGVyZSB0aGUgZnVuY3Rpb24gaGFzIG5vIHJldHVybgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25tZW50X2Zyb21fbm9fcmV0dXJuX3B5My5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9mcm9tX25vX3JldHVybl9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYWJkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3NpZ24vYXNzaWdubWVudF9mcm9tX25vX3JldHVybl9weTMucHkKQEAgLTAsMCArMSwzNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCitpbXBvcnQgYXN5bmNpbworCisKK2FzeW5jIGRlZiBibGExKCk6CisgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKQorCisKK2FzeW5jIGRlZiBibGEyKCk6CisgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgyKQorCisKK2FzeW5jIGRlZiBjb21iaW5pbmdfY29yb3V0aW5lMSgpOgorICAgIGF3YWl0IGJsYTEoKQorICAgIGF3YWl0IGJsYTIoKQorCisKK2NsYXNzIENvcm86CisgICAgYXN5bmMgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgIGZ1dHVyZTEgPSBibGExKCkKKyAgICAgICAgZnV0dXJlMiA9IGJsYTIoKQorICAgICAgICBhd2FpdCBhc3luY2lvLmdhdGhlcihmdXR1cmUxLCBmdXR1cmUyKQorCisKK2FzeW5jIGRlZiBjb21iaW5pbmdfY29yb3V0aW5lMigpOgorICAgIGZ1dHVyZTEgPSBibGExKCkKKyAgICBmdXR1cmUyID0gYmxhMigpCisgICAgZnV0dXJlMyA9IENvcm8oKS5mdW5jKCkKKyAgICBhd2FpdCBhc3luY2lvLmdhdGhlcihmdXR1cmUxLCBmdXR1cmUyLCBmdXR1cmUzKQorCisKK2RlZiBkb19zdHVmZigpOgorICAgIGxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKCkKKyAgICBsb29wLnJ1bl91bnRpbF9jb21wbGV0ZShjb21iaW5pbmdfY29yb3V0aW5lMSgpKQorICAgIGxvb3AucnVuX3VudGlsX2NvbXBsZXRlKGNvbWJpbmluZ19jb3JvdXRpbmUyKCkpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXNzaWduL2Fzc2lnbm1lbnRfZnJvbV9ub19yZXR1cm5fcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25tZW50X2Zyb21fbm9fcmV0dXJuX3B5My5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbi9hc3NpZ25tZW50X2Zyb21fbm9fcmV0dXJuX3B5My5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3luY19mdW5jdGlvbnMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXN5bmNfZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjM0MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXN5bmNfZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsNjMgQEAKKyIiIkNoZWNrIHRoYXQgUHl0aG9uIDMuNSdzIGFzeW5jIGZ1bmN0aW9ucyBhcmUgcHJvcGVybHkgYW5hbHl6ZWQgYnkgUHlsaW50LiIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHRvby1mZXctcHVibGljLW1ldGhvZHMKKyMgcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2FzeW5jIGRlZiBuZXh0KCk6ICMgW3JlZGVmaW5lZC1idWlsdGluXQorICAgIHBhc3MKKworYXN5bmMgZGVmIHNvbWVfZnVuY3Rpb24oYXJnMSwgYXJnMik6ICMgW3VudXNlZC1hcmd1bWVudF0KKyAgICBhd2FpdCBhcmcxCisKKworY2xhc3MgT3RoZXJDbGFzcyhvYmplY3QpOgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB0ZXN0KCk6CisgICAgICAgIHJldHVybiA0MgorCisKK2NsYXNzIENsYXNzKG9iamVjdCk6CisKKyAgICBhc3luYyBkZWYgc29tZV9tZXRob2Qoc2VsZik6CisgICAgICAgIHN1cGVyKE90aGVyQ2xhc3MsIHNlbGYpLnRlc3QoKSAjIFtiYWQtc3VwZXItY2FsbF0KKworCisjICsxOiBbdG9vLW1hbnktYXJndW1lbnRzLHRvby1tYW55LXJldHVybi1zdGF0ZW1lbnRzLCB0b28tbWFueS1icmFuY2hlc10KK2FzeW5jIGRlZiBjb21wbGV4X2Z1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uLCBoYXMsIG1vcmUsIGFyZ3VtZW50cywgdGhhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSwgXywgc2hvdWxkLCBoYXZlKToKKyAgICBpZiAxOgorICAgICAgICByZXR1cm4gdGhpcworICAgIGlmIDE6CisgICAgICAgIHJldHVybiBmdW5jdGlvbgorICAgIGlmIDE6CisgICAgICAgIHJldHVybiBoYXMKKyAgICBpZiAxOgorICAgICAgICByZXR1cm4gbW9yZQorICAgIGlmIDE6CisgICAgICAgIHJldHVybiBhcmd1bWVudHMKKyAgICBpZiAxOgorICAgICAgICByZXR1cm4gdGhhbgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG9uZQorICAgIGZpbmFsbHk6CisgICAgICAgIHBhc3MKKyAgICBpZiAyOgorICAgICAgICByZXR1cm4gc2hvdWxkCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcGFzcworICAgIGlmIDE6CisgICAgICAgIHJldHVybiBoYXZlCisgICAgaWYgMjoKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uCisgICAgaWYgMzoKKyAgICAgICAgcGFzcworCisKKyMgKzE6IFtkdXBsaWNhdGUtYXJndW1lbnQtbmFtZSwgZHVwbGljYXRlLWFyZ3VtZW50LW5hbWUsIGRhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorYXN5bmMgZGVmIGZ1bmMoYSwgYSwgYj1bXSk6CisgICAgcmV0dXJuIGEsIGIKKworCisjICsxOiBbZW1wdHktZG9jc3RyaW5nLCBkaXNhbGxvd2VkLW5hbWVdCithc3luYyBkZWYgZm9vKCk6CisgICAgIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hc3luY19mdW5jdGlvbnMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXN5bmNfZnVuY3Rpb25zLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGU4YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXN5bmNfZnVuY3Rpb25zLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2FzeW5jX2Z1bmN0aW9ucy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXN5bmNfZnVuY3Rpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUzMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2FzeW5jX2Z1bmN0aW9ucy50eHQKQEAgLTAsMCArMSwxMSBAQAorcmVkZWZpbmVkLWJ1aWx0aW46NTowOm5leHQ6UmVkZWZpbmluZyBidWlsdC1pbiAnbmV4dCcKK3VudXNlZC1hcmd1bWVudDo4OjMwOnNvbWVfZnVuY3Rpb246VW51c2VkIGFyZ3VtZW50ICdhcmcyJworYmFkLXN1cGVyLWNhbGw6MjI6ODpDbGFzcy5zb21lX21ldGhvZDpCYWQgZmlyc3QgYXJndW1lbnQgJ090aGVyQ2xhc3MnIGdpdmVuIHRvIHN1cGVyKCkKK3Rvby1tYW55LWFyZ3VtZW50czoyNjowOmNvbXBsZXhfZnVuY3Rpb246VG9vIG1hbnkgYXJndW1lbnRzICgxMC81KQordG9vLW1hbnktYnJhbmNoZXM6MjY6MDpjb21wbGV4X2Z1bmN0aW9uOlRvbyBtYW55IGJyYW5jaGVzICgxMy8xMikKK3Rvby1tYW55LXJldHVybi1zdGF0ZW1lbnRzOjI2OjA6Y29tcGxleF9mdW5jdGlvbjpUb28gbWFueSByZXR1cm4gc3RhdGVtZW50cyAoMTAvNikKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjU3OjA6ZnVuYzpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBbXSBhcyBhcmd1bWVudAorZHVwbGljYXRlLWFyZ3VtZW50LW5hbWU6NTc6MTU6ZnVuYzpEdXBsaWNhdGUgYXJndW1lbnQgbmFtZSBhIGluIGZ1bmN0aW9uIGRlZmluaXRpb24KK2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lOjU3OjE4OmZ1bmM6RHVwbGljYXRlIGFyZ3VtZW50IG5hbWUgYSBpbiBmdW5jdGlvbiBkZWZpbml0aW9uCitkaXNhbGxvd2VkLW5hbWU6NjI6MDpmb286RGlzYWxsb3dlZCBuYW1lICJmb28iCitlbXB0eS1kb2NzdHJpbmc6NjI6MDpmb286RW1wdHkgZnVuY3Rpb24gZG9jc3RyaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2EvYXR0cmlidXRlX2RlZmluZWRfb3V0c2lkZV9pbml0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2F0dHJpYnV0ZV9kZWZpbmVkX291dHNpZGVfaW5pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2IzMTljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2F0dHJpYnV0ZV9kZWZpbmVkX291dHNpZGVfaW5pdC5weQpAQCAtMCwwICsxLDg0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLGludmFsaWQtbmFtZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgQShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnggPSAwCisgICAgICAgIHNlbGYuc2V0VXAoKQorCisgICAgZGVmIHNldF95KHNlbGYsIHkpOgorICAgICAgICBzZWxmLnkgPSB5CisKKyAgICBkZWYgc2V0X3goc2VsZiwgeCk6CisgICAgICAgIHNlbGYueCA9IHgKKworICAgIGRlZiBzZXRfeihzZWxmLCB6KToKKyAgICAgICAgc2VsZi56ID0geiAjIFthdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXRdCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYueCA9IDAKKyAgICAgICAgc2VsZi55ID0gMAorCisKK2NsYXNzIEIoQSk6CisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi56ID0gNDQgIyBbYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0XQorCisKK2NsYXNzIEMob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5faW5pdCgpCisKKyAgICBkZWYgX2luaXQoc2VsZik6CisgICAgICAgIHNlbGYueiA9IDQ0CisKKworY2xhc3MgRChvYmplY3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldF96KCkKKworICAgIGRlZiBzZXRfeihzZWxmKToKKyAgICAgICAgc2VsZi56ID0gNDIKKworCitjbGFzcyBFKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGkgPSBzZWxmLl9pbml0CisgICAgICAgIGkoKQorCisgICAgZGVmIF9pbml0KHNlbGYpOgorICAgICAgICBzZWxmLnogPSA0NAorCisKK2NsYXNzIE1peGluKG9iamVjdCk6CisKKyAgICBkZWYgdGVzdF9taXhpbihzZWxmKToKKyAgICAgICAgIiIiRG9uJ3QgZW1pdCBhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQgZm9yIG1peGluIGNsYXNzZXMuIiIiCisgICAgICAgIGlmIHNlbGYuZGVmaW5lZF9hbHJlYWR5OiAjIHB5bGludDogZGlzYWJsZT1hY2Nlc3MtbWVtYmVyLWJlZm9yZS1kZWZpbml0aW9uCisgICAgICAgICAgICBzZWxmLmRlZmluZWRfYWxyZWFkeSA9IE5vbmUKKworCitjbGFzcyBGOgorICAgIGRlZiBmdW5jKHNlbGYpOgorICAgICAgICBzZWxmLl9fZGljdF9fID0geydmb28nOiAnYmFyJ30KKworCitjbGFzcyBNaW5lOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJhbSk6CisgICAgICAgIHNlbGYucHJvcCA9IHBhcmFtCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19wcm9wCisKKyAgICBAcHJvcC5zZXR0ZXIKKyAgICBkZWYgcHJvcChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX19wcm9wID0gdmFsdWUKKworY2xhc3MgRGF0YUNsYXNzOgorICAgIGRlZiBfX3Bvc3RfaW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmEgPSA0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2F0dHJpYnV0ZV9kZWZpbmVkX291dHNpZGVfaW5pdC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXR0cmlidXRlX2RlZmluZWRfb3V0c2lkZV9pbml0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdhOWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2F0dHJpYnV0ZV9kZWZpbmVkX291dHNpZGVfaW5pdC50eHQKQEAgLTAsMCArMSwyIEBACithdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQ6MTY6ODpBLnNldF96OkF0dHJpYnV0ZSAneicgZGVmaW5lZCBvdXRzaWRlIF9faW5pdF9fCithdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQ6MjY6ODpCLnRlc3Q6QXR0cmlidXRlICd6JyBkZWZpbmVkIG91dHNpZGUgX19pbml0X18KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hd2FpdF9vdXRzaWRlX2FzeW5jLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2F3YWl0X291dHNpZGVfYXN5bmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMTI2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hd2FpdF9vdXRzaWRlX2FzeW5jLnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHVudXNlZC12YXJpYWJsZQoraW1wb3J0IGFzeW5jaW8KKworYXN5bmMgZGVmIG5lc3RlZCgpOgorICAgIHJldHVybiA0MgorCithc3luYyBkZWYgbWFpbigpOgorICAgIG5lc3RlZCgpCisgICAgcHJpbnQoYXdhaXQgbmVzdGVkKCkpICAjIFRoaXMgaXMgb2theQorCitkZWYgbm90X2FzeW5jKCk6CisgICAgcHJpbnQoYXdhaXQgbmVzdGVkKCkpICAjIFthd2FpdC1vdXRzaWRlLWFzeW5jXQorCisKK2FzeW5jIGRlZiBmdW5jKGkpOgorICAgIHJldHVybiBpKioyCisKK2FzeW5jIGRlZiBva2F5X2Z1bmN0aW9uKCk6CisgICAgdmFyID0gW2F3YWl0IGZ1bmMoaSkgZm9yIGkgaW4gcmFuZ2UoNSldICAjIFRoaXMgc2hvdWxkIGJlIG9rYXkKKworCisjIFRlc3QgbmVzdGVkIGZ1bmN0aW9ucworYXN5bmMgZGVmIGZ1bmMyKCk6CisgICAgZGVmIGlubmVyX2Z1bmMoKToKKyAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKSAgIyBbYXdhaXQtb3V0c2lkZS1hc3luY10KKworCitkZWYgb3V0ZXJfZnVuYygpOgorICAgIGFzeW5jIGRlZiBpbm5lcl9mdW5jKCk6CisgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hd2FpdF9vdXRzaWRlX2FzeW5jLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9hL2F3YWl0X291dHNpZGVfYXN5bmMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYS9hd2FpdF9vdXRzaWRlX2FzeW5jLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9hL2F3YWl0X291dHNpZGVfYXN5bmMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9hL2F3YWl0X291dHNpZGVfYXN5bmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGE1MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2EvYXdhaXRfb3V0c2lkZV9hc3luYy50eHQKQEAgLTAsMCArMSwyIEBACithd2FpdC1vdXRzaWRlLWFzeW5jOjEyOjEwOm5vdF9hc3luYzonYXdhaXQnIHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhbiBhc3luYyBmdW5jdGlvbgorYXdhaXQtb3V0c2lkZS1hc3luYzoyNTo4OmZ1bmMyLmlubmVyX2Z1bmM6J2F3YWl0JyBzaG91bGQgYmUgdXNlZCB3aXRoaW4gYW4gYXN5bmMgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2V4Y2VwdF9vcmRlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfZXhjZXB0X29yZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmZhM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2V4Y2VwdF9vcmRlci5weQpAQCAtMCwwICsxLDQ1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgYmFyZS1leGNlcHQsIGJyb2FkLWV4Y2VwdAorCitfX3JldmlzaW9uX18gPSAxCisKK3RyeToKKyAgICBfX3JldmlzaW9uX18gKz0gMQorZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICBfX3JldmlzaW9uX18gPSAwCitleGNlcHQgVHlwZUVycm9yOiAjIFtiYWQtZXhjZXB0LW9yZGVyXQorICAgIF9fcmV2aXNpb25fXyA9IDAKKwordHJ5OgorICAgIF9fcmV2aXNpb25fXyArPSAxCitleGNlcHQgTG9va3VwRXJyb3I6CisgICAgX19yZXZpc2lvbl9fID0gMAorZXhjZXB0IEluZGV4RXJyb3I6ICMgW2JhZC1leGNlcHQtb3JkZXJdCisgICAgX19yZXZpc2lvbl9fID0gMAorCit0cnk6CisgICAgX19yZXZpc2lvbl9fICs9IDEKK2V4Y2VwdCAoTG9va3VwRXJyb3IsIE5hbWVFcnJvcik6CisgICAgX19yZXZpc2lvbl9fID0gMAorZXhjZXB0IChJbmRleEVycm9yLCBVbmJvdW5kTG9jYWxFcnJvcik6ICMgW2JhZC1leGNlcHQtb3JkZXIsIGJhZC1leGNlcHQtb3JkZXJdCisgICAgX19yZXZpc2lvbl9fID0gMAorCit0cnk6ICMgW2JhZC1leGNlcHQtb3JkZXJdCisgICAgX19yZXZpc2lvbl9fICs9IDEKK2V4Y2VwdDoKKyAgICBwYXNzCitleGNlcHQgRXhjZXB0aW9uOgorICAgIHBhc3MKKwordHJ5OgorICAgIF9fcmV2aXNpb25fXyArPSAxCitleGNlcHQgVHlwZUVycm9yOgorICAgIF9fcmV2aXNpb25fXyA9IDAKK2V4Y2VwdDoKKyAgICBfX3JldmlzaW9uX18gPSAwCisKK3RyeToKKyAgICBfX3JldmlzaW9uX18gKz0gMQorZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICBwYXNzCitleGNlcHQ6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9leGNlcHRfb3JkZXIudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9leGNlcHRfb3JkZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODE2NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2V4Y2VwdF9vcmRlci50eHQKQEAgLTAsMCArMSw1IEBACitiYWQtZXhjZXB0LW9yZGVyOjk6Nzo6QmFkIGV4Y2VwdCBjbGF1c2VzIG9yZGVyIChFeGNlcHRpb24gaXMgYW4gYW5jZXN0b3IgY2xhc3Mgb2YgVHlwZUVycm9yKQorYmFkLWV4Y2VwdC1vcmRlcjoxNjo3OjpCYWQgZXhjZXB0IGNsYXVzZXMgb3JkZXIgKExvb2t1cEVycm9yIGlzIGFuIGFuY2VzdG9yIGNsYXNzIG9mIEluZGV4RXJyb3IpCitiYWQtZXhjZXB0LW9yZGVyOjIzOjc6OkJhZCBleGNlcHQgY2xhdXNlcyBvcmRlciAoTG9va3VwRXJyb3IgaXMgYW4gYW5jZXN0b3IgY2xhc3Mgb2YgSW5kZXhFcnJvcikKK2JhZC1leGNlcHQtb3JkZXI6MjM6Nzo6QmFkIGV4Y2VwdCBjbGF1c2VzIG9yZGVyIChOYW1lRXJyb3IgaXMgYW4gYW5jZXN0b3IgY2xhc3Mgb2YgVW5ib3VuZExvY2FsRXJyb3IpCitiYWQtZXhjZXB0LW9yZGVyOjI2OjA6OkJhZCBleGNlcHQgY2xhdXNlcyBvcmRlciAoZW1wdHkgZXhjZXB0IGNsYXVzZSBzaG91bGQgYWx3YXlzIGFwcGVhciBsYXN0KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9leGNlcHRpb25fY29udGV4dC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfZXhjZXB0aW9uX2NvbnRleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzZTRmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfZXhjZXB0aW9uX2NvbnRleHQucHkKQEAgLTAsMCArMSwyNCBAQAorIiIiQ2hlY2sgdGhhdCByYWlzZSAuLi4gZnJvbSAuLiB1c2VzIGEgcHJvcGVyIGV4Y2VwdGlvbiBjb250ZXh0ICIiIgorCisjIHB5bGludDogZGlzYWJsZT11bnJlYWNoYWJsZSwgaW1wb3J0LWVycm9yLCBtdWx0aXBsZS1pbXBvcnRzCisKK2ltcG9ydCBzb2NrZXQsIHVua25vd24KKworX19yZXZpc2lvbl9fID0gMAorCitjbGFzcyBFeGNlcHRpb25TdWJjbGFzcyhFeGNlcHRpb24pOgorICAgICIiIiBzdWJjbGFzcyAiIiIKKworZGVmIHRlc3QoKToKKyAgICAiIiIgZG9jc3RyaW5nICIiIgorICAgIHJhaXNlIEluZGV4RXJyb3IgZnJvbSAxICMgW2JhZC1leGNlcHRpb24tY29udGV4dF0KKyAgICByYWlzZSBJbmRleEVycm9yIGZyb20gTm9uZQorICAgIHJhaXNlIEluZGV4RXJyb3IgZnJvbSBaZXJvRGl2aXNpb25FcnJvcgorICAgIHJhaXNlIEluZGV4RXJyb3IgZnJvbSBvYmplY3QoKSAjIFtiYWQtZXhjZXB0aW9uLWNvbnRleHRdCisgICAgcmFpc2UgSW5kZXhFcnJvciBmcm9tIEV4Y2VwdGlvblN1YmNsYXNzCisgICAgcmFpc2UgSW5kZXhFcnJvciBmcm9tIHNvY2tldC5lcnJvcgorICAgIHJhaXNlIEluZGV4RXJyb3IoKSBmcm9tIE5vbmUKKyAgICByYWlzZSBJbmRleEVycm9yKCkgZnJvbSBaZXJvRGl2aXNpb25FcnJvcgorICAgIHJhaXNlIEluZGV4RXJyb3IoKSBmcm9tIFplcm9EaXZpc2lvbkVycm9yKCkKKyAgICByYWlzZSBJbmRleEVycm9yKCkgZnJvbSBvYmplY3QoKSAjIFtiYWQtZXhjZXB0aW9uLWNvbnRleHRdCisgICAgcmFpc2UgSW5kZXhFcnJvcigpIGZyb20gdW5rbm93bgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9leGNlcHRpb25fY29udGV4dC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfZXhjZXB0aW9uX2NvbnRleHQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0OTBhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfZXhjZXB0aW9uX2NvbnRleHQucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdDQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9leGNlcHRpb25fY29udGV4dC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2V4Y2VwdGlvbl9jb250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY5ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9leGNlcHRpb25fY29udGV4dC50eHQKQEAgLTAsMCArMSwzIEBACitiYWQtZXhjZXB0aW9uLWNvbnRleHQ6MTQ6NDp0ZXN0OkV4Y2VwdGlvbiBjb250ZXh0IHNldCB0byBzb21ldGhpbmcgd2hpY2ggaXMgbm90IGFuIGV4Y2VwdGlvbiwgbm9yIE5vbmUKK2JhZC1leGNlcHRpb24tY29udGV4dDoxNzo0OnRlc3Q6RXhjZXB0aW9uIGNvbnRleHQgc2V0IHRvIHNvbWV0aGluZyB3aGljaCBpcyBub3QgYW4gZXhjZXB0aW9uLCBub3IgTm9uZQorYmFkLWV4Y2VwdGlvbi1jb250ZXh0OjIzOjQ6dGVzdDpFeGNlcHRpb24gY29udGV4dCBzZXQgdG8gc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhbiBleGNlcHRpb24sIG5vciBOb25lCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2luZGVudGF0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9pbmRlbnRhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUwZWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9pbmRlbnRhdGlvbi5weQpAQCAtMCwwICsxLDE5IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgcG9pbnRsZXNzLXN0YXRlbWVudAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCisKK2RlZiB0b3RvbygpOgorIHByaW50KCdtYWxpbmRlbnRlZCcpICMgW2JhZC1pbmRlbnRhdGlvbl0KKworZGVmIHR1dHV1KCk6CisgICAgcHJpbnQoJ2dvb2QgaW5kZW50YXRpb24nKQorCitkZWYgdGl0aWkoKToKKyAgICAgMSAgIyBhbmQgdGhpcy4gIyBbYmFkLWluZGVudGF0aW9uXQorCitkZWYgdGF0YWEoa2RpY3QpOgorICAgIGZvciBrZXkgaW4gWycxJywgJzInLCAnMyddOgorICAgICAgICBrZXkgPSBrZXkubG93ZXIoKQorCisgICAgICAgIGlmIGtleSBpbiBrZGljdDoKKyAgICAgICAgICAgIGRlbCBrZGljdFtrZXldCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2luZGVudGF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfaW5kZW50YXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjM2MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2luZGVudGF0aW9uLnR4dApAQCAtMCwwICsxLDIgQEAKK2JhZC1pbmRlbnRhdGlvbjo2OjA6OkJhZCBpbmRlbnRhdGlvbi4gRm91bmQgMSBzcGFjZXMsIGV4cGVjdGVkIDQKK2JhZC1pbmRlbnRhdGlvbjoxMjowOjpCYWQgaW5kZW50YXRpb24uIEZvdW5kIDUgc3BhY2VzLCBleHBlY3RlZCA0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2lubGluZV9vcHRpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX2lubGluZV9vcHRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2ZmM2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfaW5saW5lX29wdGlvbi5weQpAQCAtMCwwICsxLDUgQEAKKyIiImVycm9ycy1vbmx5IGlzIG5vdCB1c2FibGUgYXMgYW4gaW5saW5lIG9wdGlvbiIiIgorIyArMTogW2JhZC1pbmxpbmUtb3B0aW9uXQorIyBweWxpbnQ6IGRpc2FibGUgbWlzc2luZy1kb2NzdHJpbmcKKworQ09OU1QgPSAiVGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IgaXMgbWlzc2luZyBpbnNpZGUgdGhlIHB5bGludCBpbmxpbmUgb3B0aW9uLiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfaW5saW5lX29wdGlvbi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfaW5saW5lX29wdGlvbi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjExZDcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9pbmxpbmVfb3B0aW9uLnJjCkBAIC0wLDAgKzEsMiBAQAorW01lc3NhZ2VzIENvbnRyb2xdCitlbmFibGU9SQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9pbmxpbmVfb3B0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfaW5saW5lX29wdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5N2JmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfaW5saW5lX29wdGlvbi50eHQKQEAgLTAsMCArMSBAQAorYmFkLWlubGluZS1vcHRpb246MzowOjpVbmFibGUgdG8gY29uc2lkZXIgaW5saW5lIG9wdGlvbiAnZGlzYWJsZScKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3Blbl9tb2RlX3B5My5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3Blbl9tb2RlX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2FhMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9vcGVuX21vZGVfcHkzLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyIiIldhcm5pbmdzIGZvciB1c2luZyBvcGVuKCkgd2l0aCBhbiBpbnZhbGlkIG1vZGUgc3RyaW5nLiIiIg0KKyMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLXdpdGgNCisNCitOQU1FID0gImZvby5iYXIiDQorb3BlbihOQU1FLCAid2IiKQ0KK29wZW4oTkFNRSwgInciKQ0KK29wZW4oTkFNRSwgInJiIikNCitvcGVuKE5BTUUsICJ4IikNCitvcGVuKE5BTUUsICJiciIpDQorb3BlbihOQU1FLCAiK3IiKQ0KK29wZW4oTkFNRSwgInhiIikNCitvcGVuKE5BTUUsICJyd3giKSAgIyBbYmFkLW9wZW4tbW9kZV0NCitvcGVuKE5BTUUsICJyciIpICAjIFtiYWQtb3Blbi1tb2RlXQ0KK29wZW4oTkFNRSwgIisiKSAgIyBbYmFkLW9wZW4tbW9kZV0NCitvcGVuKE5BTUUsICJ4dyIpICAjIFtiYWQtb3Blbi1tb2RlXQ0KK29wZW4oTkFNRSwgImFiKyIpDQorb3BlbihOQU1FLCAiYStiIikNCitvcGVuKE5BTUUsICIrYWIiKQ0KK29wZW4oTkFNRSwgIityVWIiKQ0KK29wZW4oTkFNRSwgIngrYiIpDQorb3BlbihOQU1FLCAiVWEiKSAgIyBbYmFkLW9wZW4tbW9kZV0NCitvcGVuKE5BTUUsICJVcisrIikgICMgW2JhZC1vcGVuLW1vZGVdDQorb3BlbihOQU1FLCAiVXQiKQ0KK29wZW4oTkFNRSwgIlViciIpDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9vcGVuX21vZGVfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9vcGVuX21vZGVfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZWQ2OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX29wZW5fbW9kZV9weTMucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdDQorbWluX3B5dmVyPTMuMA0KK2V4Y2VwdF9pbXBsZW1lbnRhdGlvbnM9UHlQeQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9vcGVuX21vZGVfcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3Blbl9tb2RlX3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhMjMyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3Blbl9tb2RlX3B5My50eHQKQEAgLTAsMCArMSw2IEBACitiYWQtb3Blbi1tb2RlOjEyOjA6OiIiInJ3eCIiIGlzIG5vdCBhIHZhbGlkIG1vZGUgZm9yIG9wZW4uIgorYmFkLW9wZW4tbW9kZToxMzowOjoiIiJyciIiIGlzIG5vdCBhIHZhbGlkIG1vZGUgZm9yIG9wZW4uIgorYmFkLW9wZW4tbW9kZToxNDowOjoiIiIrIiIgaXMgbm90IGEgdmFsaWQgbW9kZSBmb3Igb3Blbi4iCitiYWQtb3Blbi1tb2RlOjE1OjA6OiIiInh3IiIgaXMgbm90IGEgdmFsaWQgbW9kZSBmb3Igb3Blbi4iCitiYWQtb3Blbi1tb2RlOjIxOjA6OiIiIlVhIiIgaXMgbm90IGEgdmFsaWQgbW9kZSBmb3Igb3Blbi4iCitiYWQtb3Blbi1tb2RlOjIyOjA6OiIiIlVyKysiIiBpcyBub3QgYSB2YWxpZCBtb2RlIGZvciBvcGVuLiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3B0aW9uX3ZhbHVlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9vcHRpb25fdmFsdWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczZTgyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3B0aW9uX3ZhbHVlLnB5CkBAIC0wLDAgKzEsNCBAQAorIyBweWxpbnQ6ZW5hYmxlPVcwNDA0NCAgIyBbYmFkLW9wdGlvbi12YWx1ZV0KKyIiImNoZWNrIHVua25vd24gb3B0aW9uCisiIiIKK19fcmV2aXNpb25fXyA9IDEKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3B0aW9uX3ZhbHVlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfb3B0aW9uX3ZhbHVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGViODUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9vcHRpb25fdmFsdWUudHh0CkBAIC0wLDAgKzEgQEAKK2JhZC1vcHRpb24tdmFsdWU6MTowOjpCYWQgb3B0aW9uIHZhbHVlICdXMDQwNDQnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3JldmVyc2VkX3NlcXVlbmNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdiODRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZS5weQpAQCAtMCwwICsxLDc5IEBACisiIiIgQ2hlY2tzIHRoYXQgcmV2ZXJzZWQoKSByZWNlaXZlIHByb3BlciBhcmd1bWVudCAiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxuby1zZWxmLXVzZSxuby1hYnNvbHV0ZS1pbXBvcnQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlLCBPcmRlcmVkRGljdAorZnJvbSBlbnVtIGltcG9ydCBJbnRFbnVtCisKKworY2xhc3MgR29vZFJldmVyc2VkKG9iamVjdCk6CisgICAgIiIiIEltcGxlbWVudHMgX19yZXZlcnNlZF9fICIiIgorICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CisgICAgICAgIHJldHVybiBbMSwgMiwgM10KKworY2xhc3MgU2Vjb25kR29vZFJldmVyc2VkKG9iamVjdCk6CisgICAgIiIiIEltcGxlbWVudHMgX19sZW5fXyBhbmQgX19nZXRpdGVtX18gIiIiCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAzCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gaW5kZXgKKworY2xhc3MgQmFkUmV2ZXJzZWQob2JqZWN0KToKKyAgICAiIiIgaW1wbGVtZW50cyBvbmx5IGxlbigpICIiIgorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMworCitjbGFzcyBTZWNvbmRCYWRSZXZlcnNlZChvYmplY3QpOgorICAgICIiIiBpbXBsZW1lbnRzIG9ubHkgX19nZXRpdGVtX18gIiIiCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIGluZGV4CisKK2NsYXNzIFRoaXJkQmFkUmV2ZXJzZWQoZGljdCk6CisgICAgIiIiIGRpY3Qgc3ViY2xhc3MgIiIiCisKK2RlZiB1bmluZmVyYWJsZShzZXEpOgorICAgICIiIiBUaGlzIGNhbid0IGJlIGluZmVyZWQgYXQgdGhpcyBtb21lbnQsCisgICAgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYSBmYWxzZSBwb3NpdGl2ZS4KKyAgICAiIiIKKyAgICByZXR1cm4gcmV2ZXJzZWQoc2VxKQorCitkZWYgdGVzdChwYXRoKToKKyAgICAiIiIgdGVzdCBmdW5jdGlvbiAiIiIKKyAgICBzZXEgPSByZXZlcnNlZCgpICMgTm8gYXJndW1lbnQgZ2l2ZW4KKyAgICBzZXEgPSByZXZlcnNlZChOb25lKSAjIFtiYWQtcmV2ZXJzZWQtc2VxdWVuY2VdCisgICAgc2VxID0gcmV2ZXJzZWQoWzEsIDIsIDNdKQorICAgIHNlcSA9IHJldmVyc2VkKCgxLCAyLCAzKSkKKyAgICBzZXEgPSByZXZlcnNlZChzZXQoKSkgIyBbYmFkLXJldmVyc2VkLXNlcXVlbmNlXQorICAgIHNlcSA9IHJldmVyc2VkKGl0ZXIoWzEsIDIsIDNdKSkgIyBbYmFkLXJldmVyc2VkLXNlcXVlbmNlXQorICAgIHNlcSA9IHJldmVyc2VkKEdvb2RSZXZlcnNlZCgpKQorICAgIHNlcSA9IHJldmVyc2VkKFNlY29uZEdvb2RSZXZlcnNlZCgpKQorICAgIHNlcSA9IHJldmVyc2VkKEJhZFJldmVyc2VkKCkpICMgW2JhZC1yZXZlcnNlZC1zZXF1ZW5jZV0KKyAgICBzZXEgPSByZXZlcnNlZChTZWNvbmRCYWRSZXZlcnNlZCgpKSAjIFtiYWQtcmV2ZXJzZWQtc2VxdWVuY2VdCisgICAgc2VxID0gcmV2ZXJzZWQocmFuZ2UoMTAwKSkKKyAgICBzZXEgPSByZXZlcnNlZChUaGlyZEJhZFJldmVyc2VkKCkpICMgW2JhZC1yZXZlcnNlZC1zZXF1ZW5jZV0KKyAgICBzZXEgPSByZXZlcnNlZChsYW1iZGE6IE5vbmUpICMgW2JhZC1yZXZlcnNlZC1zZXF1ZW5jZV0KKyAgICBzZXEgPSByZXZlcnNlZChkZXF1ZShbXSkpCisgICAgc2VxID0gcmV2ZXJzZWQoIjEyMyIpCisgICAgc2VxID0gdW5pbmZlcmFibGUoWzEsIDIsIDNdKQorICAgIHNlcSA9IHJldmVyc2VkKHBhdGguc3BsaXQoIi8iKSkKKyAgICByZXR1cm4gc2VxCisKK2RlZiB0ZXN0X2RpY3RfYW5jZXN0b3JfYW5kX3JldmVyc2VkKCk6CisgICAgIiIiRG9uJ3QgZW1pdCBmb3Igc3ViY2xhc3NlcyBvZiBkaWN0LCB3aXRoIF9fcmV2ZXJzZWRfXyBpbXBsZW1lbnRlZC4iIiIKKyAgICBjbGFzcyBDaGlsZChkaWN0KToKKyAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiByZXZlcnNlZChyYW5nZSgxMCkpCisKKyAgICBzZXEgPSByZXZlcnNlZChPcmRlcmVkRGljdCgpKQorICAgIHJldHVybiByZXZlcnNlZChDaGlsZCgpKSwgc2VxCisKKworZGVmIHRlc3RfZG9udF9lbWl0X2Zvcl9yZXZlcnNpbmdfZW51bXMoKToKKyAgICAiIiJEb24ndCBlbWl0IHdoZW4gcmV2ZXJzaW5nIGVudW0gY2xhc3NlcyIiIgorICAgIGNsYXNzIENvbG9yKEludEVudW0pOgorICAgICAgICBSRUQgPSAxCisgICAgICAgIEdSRUVOID0gMgorICAgICAgICBCTFVFID0gMworCisgICAgZm9yIGNvbG9yIGluIHJldmVyc2VkKENvbG9yKToKKyAgICAgICAgeWllbGQgY29sb3IKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2UudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxYmQxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2UudHh0CkBAIC0wLDAgKzEsNyBAQAorYmFkLXJldmVyc2VkLXNlcXVlbmNlOjQzOjEwOnRlc3Q6VGhlIGZpcnN0IHJldmVyc2VkKCkgYXJndW1lbnQgaXMgbm90IGEgc2VxdWVuY2UKK2JhZC1yZXZlcnNlZC1zZXF1ZW5jZTo0NjoxMDp0ZXN0OlRoZSBmaXJzdCByZXZlcnNlZCgpIGFyZ3VtZW50IGlzIG5vdCBhIHNlcXVlbmNlCitiYWQtcmV2ZXJzZWQtc2VxdWVuY2U6NDc6MTA6dGVzdDpUaGUgZmlyc3QgcmV2ZXJzZWQoKSBhcmd1bWVudCBpcyBub3QgYSBzZXF1ZW5jZQorYmFkLXJldmVyc2VkLXNlcXVlbmNlOjUwOjEwOnRlc3Q6VGhlIGZpcnN0IHJldmVyc2VkKCkgYXJndW1lbnQgaXMgbm90IGEgc2VxdWVuY2UKK2JhZC1yZXZlcnNlZC1zZXF1ZW5jZTo1MToxMDp0ZXN0OlRoZSBmaXJzdCByZXZlcnNlZCgpIGFyZ3VtZW50IGlzIG5vdCBhIHNlcXVlbmNlCitiYWQtcmV2ZXJzZWQtc2VxdWVuY2U6NTM6MTA6dGVzdDpUaGUgZmlyc3QgcmV2ZXJzZWQoKSBhcmd1bWVudCBpcyBub3QgYSBzZXF1ZW5jZQorYmFkLXJldmVyc2VkLXNlcXVlbmNlOjU0OjEwOnRlc3Q6VGhlIGZpcnN0IHJldmVyc2VkKCkgYXJndW1lbnQgaXMgbm90IGEgc2VxdWVuY2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2VfcHkzNy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2VfcHkzNy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhjODRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZV9weTM3LnB5CkBAIC0wLDAgKzEsMiBAQAorIiIiIERpY3Rpb25hcmllcyBhcmUgcmV2ZXJzaWJsZSBzdGFydGluZyBvbiBweXRob24gMy44IiIiCityZXZlcnNlZCh7J2EnOiAxLCAnYic6IDJ9KSAjIFtiYWQtcmV2ZXJzZWQtc2VxdWVuY2VdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3JldmVyc2VkX3NlcXVlbmNlX3B5MzcucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3JldmVyc2VkX3NlcXVlbmNlX3B5MzcucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhMjhhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2VfcHkzNy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21heF9weXZlcj0zLjgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2VfcHkzNy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3JldmVyc2VkX3NlcXVlbmNlX3B5MzcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWI5MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3JldmVyc2VkX3NlcXVlbmNlX3B5MzcudHh0CkBAIC0wLDAgKzEgQEAKK2JhZC1yZXZlcnNlZC1zZXF1ZW5jZToyOjo6VGhlIGZpcnN0IHJldmVyc2VkKCkgYXJndW1lbnQgaXMgbm90IGEgc2VxdWVuY2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2VfcHkzOC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfcmV2ZXJzZWRfc2VxdWVuY2VfcHkzOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZkZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZV9weTM4LnB5CkBAIC0wLDAgKzEsMiBAQAorIiIiIERpY3Rpb25hcmllcyBhcmUgcmV2ZXJzaWJsZSBzdGFydGluZyBvbiBweXRob24gMy44IiIiCityZXZlcnNlZCh7J2EnOiAxLCAnYic6IDJ9KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZV9weTM4LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9yZXZlcnNlZF9zZXF1ZW5jZV9weTM4LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmM1MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3JldmVyc2VkX3NlcXVlbmNlX3B5MzgucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3N0YXRpY21ldGhvZF9hcmd1bWVudC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfc3RhdGljbWV0aG9kX2FyZ3VtZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3M2JmM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3N0YXRpY21ldGhvZF9hcmd1bWVudC5weQpAQCAtMCwwICsxLDE2IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgbm8tc3RhdGljbWV0aG9kLWRlY29yYXRvciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgQWJjZChvYmplY3QpOgorCisgICAgZGVmIG1ldGhvZDEoc2VsZik6ICMgW2JhZC1zdGF0aWNtZXRob2QtYXJndW1lbnRdCisgICAgICAgIHBhc3MKKworICAgIG1ldGhvZDEgPSBzdGF0aWNtZXRob2QobWV0aG9kMSkKKworICAgIGRlZiBtZXRob2QyKGNscyk6ICMgW2JhZC1zdGF0aWNtZXRob2QtYXJndW1lbnRdCisgICAgICAgIHBhc3MKKworICAgIG1ldGhvZDIgPSBzdGF0aWNtZXRob2QobWV0aG9kMikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9zdGF0aWNtZXRob2RfYXJndW1lbnQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF9zdGF0aWNtZXRob2RfYXJndW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZTBjNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3N0YXRpY21ldGhvZF9hcmd1bWVudC50eHQKQEAgLTAsMCArMSwyIEBACitiYWQtc3RhdGljbWV0aG9kLWFyZ3VtZW50OjU6NDpBYmNkLm1ldGhvZDE6U3RhdGljIG1ldGhvZCB3aXRoICdzZWxmJyBhcyBmaXJzdCBhcmd1bWVudAorYmFkLXN0YXRpY21ldGhvZC1hcmd1bWVudDoxMDo0OkFiY2QubWV0aG9kMjpTdGF0aWMgbWV0aG9kIHdpdGggJ2NscycgYXMgZmlyc3QgYXJndW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfdGhyZWFkX2luc3RhbnRpYXRpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3RocmVhZF9pbnN0YW50aWF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTAyZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFkX3RocmVhZF9pbnN0YW50aWF0aW9uLnB5CkBAIC0wLDAgKzEsOCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKK2ltcG9ydCB0aHJlYWRpbmcKKworCit0aHJlYWRpbmcuVGhyZWFkKGxhbWJkYTogTm9uZSkucnVuKCkgICMgW2JhZC10aHJlYWQtaW5zdGFudGlhdGlvbl0KK3RocmVhZGluZy5UaHJlYWQoTm9uZSwgbGFtYmRhOiBOb25lKQordGhyZWFkaW5nLlRocmVhZChncm91cD1Ob25lLCB0YXJnZXQ9bGFtYmRhOiBOb25lKS5ydW4oKQordGhyZWFkaW5nLlRocmVhZCgpICMgW2JhZC10aHJlYWQtaW5zdGFudGlhdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfdGhyZWFkX2luc3RhbnRpYXRpb24udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhZF90aHJlYWRfaW5zdGFudGlhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNjA2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYWRfdGhyZWFkX2luc3RhbnRpYXRpb24udHh0CkBAIC0wLDAgKzEsMiBAQAorYmFkLXRocmVhZC1pbnN0YW50aWF0aW9uOjU6MDo6dGhyZWFkaW5nLlRocmVhZCBuZWVkcyB0aGUgdGFyZ2V0IGZ1bmN0aW9uCitiYWQtdGhyZWFkLWluc3RhbnRpYXRpb246ODowOjp0aHJlYWRpbmcuVGhyZWFkIG5lZWRzIHRoZSB0YXJnZXQgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYXJlX2V4Y2VwdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9iYXJlX2V4Y2VwdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2EyMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhcmVfZXhjZXB0LnB5CkBAIC0wLDAgKzEsNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGltcG9ydC1lcnJvcgorCit0cnk6CisgICAgMSArICIyIgorZXhjZXB0OiAjIFtiYXJlLWV4Y2VwdF0KKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYmFyZV9leGNlcHQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhcmVfZXhjZXB0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTRmZmUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JhcmVfZXhjZXB0LnR4dApAQCAtMCwwICsxIEBACitiYXJlLWV4Y2VwdDo1OjA6Ok5vIGV4Y2VwdGlvbiB0eXBlKHMpIHNwZWNpZmllZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2Jhc2VfaW5pdF92YXJzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2Jhc2VfaW5pdF92YXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmFzZV9pbml0X3ZhcnMucHkKQEAgLTAsMCArMSwzNSBAQAorIyBweWxpbnQ6ZGlzYWJsZT1uby1zZWxmLXVzZSwgcHJpbnQtc3RhdGVtZW50CisjIHB5bGludDpkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiJDaGVja3MgdGhhdCBjbGFzcyB2YXJpYWJsZXMgYXJlIHNlZW4gYXMgaW5oZXJpdGVkICEiIiIKK19fcmV2aXNpb25fXyA9ICcnCisKK2NsYXNzIEJhc2VDbGFzcyhvYmplY3QpOgorICAgICIiIkEgc2ltcGxlIGJhc2UgY2xhc3MKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5iYXNlX3ZhciA9IHt9CisKKyAgICBkZWYgbWV0KHNlbGYpOgorICAgICAgICAiIiJ5byIiIgorICAgIGRlZiBtZWV0aW5nKHNlbGYsIHdpdGhfKToKKyAgICAgICAgIiIieWUiIiIKKyAgICAgICAgcmV0dXJuIHdpdGhfCitjbGFzcyBNeUNsYXNzKEJhc2VDbGFzcyk6CisgICAgIiIiSW5oZXJpdHMgZnJvbSBCYXNlQ2xhc3MKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYudmFyID0ge30KKworICAgIGRlZiBtZXQoc2VsZik6CisgICAgICAgICIiIkNoZWNrcyB0aGF0IGJhc2VfdmFyIGlzIG5vdCBzZWVuIGFzIGRlZmluZWQgb3V0c2l0ZSAnX19pbml0X18nCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnZhclsxXSA9ICdvbmUnCisgICAgICAgIHNlbGYuYmFzZV92YXJbMV0gPSAnb25lJworICAgICAgICByZXR1cm4gc2VsZi5iYXNlX3Zhciwgc2VsZi52YXIKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBPQkogPSBNeUNsYXNzKCkKKyAgICBPQkoubWV0KCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9ibGFja2xpc3RlZF9uYW1lLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JsYWNrbGlzdGVkX25hbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwNjdlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9ibGFja2xpc3RlZF9uYW1lLnB5CkBAIC0wLDAgKzEsNCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworZGVmIGJheigpOiAjIFtkaXNhbGxvd2VkLW5hbWVdCisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2JsYWNrbGlzdGVkX25hbWUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2JsYWNrbGlzdGVkX25hbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2Q3MWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYmxhY2tsaXN0ZWRfbmFtZS50eHQKQEAgLTAsMCArMSBAQAorZGlzYWxsb3dlZC1uYW1lOjM6MDpiYXo6RGlzYWxsb3dlZCBuYW1lICJiYXoiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYnJvYWRfZXhjZXB0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9iL2Jyb2FkX2V4Y2VwdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGM4Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2Jyb2FkX2V4Y2VwdC5weQpAQCAtMCwwICsxLDE0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorX19yZXZpc2lvbl9fID0gMAorCit0cnk6CisgICAgX19yZXZpc2lvbl9fICs9IDEKK2V4Y2VwdCBFeGNlcHRpb246ICMgW2Jyb2FkLWV4Y2VwdF0KKyAgICBwcmludCgnZXJyb3InKQorCisKK3RyeToKKyAgICBfX3JldmlzaW9uX18gKz0gMQorZXhjZXB0IEJhc2VFeGNlcHRpb246ICMgW2Jyb2FkLWV4Y2VwdF0KKyAgICBwcmludCgnZXJyb3InKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2Jyb2FkX2V4Y2VwdC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYnJvYWRfZXhjZXB0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg0NTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9iL2Jyb2FkX2V4Y2VwdC50eHQKQEAgLTAsMCArMSwyIEBACiticm9hZC1leGNlcHQ6Nzo3OjpDYXRjaGluZyB0b28gZ2VuZXJhbCBleGNlcHRpb24gRXhjZXB0aW9uCiticm9hZC1leGNlcHQ6MTM6Nzo6Q2F0Y2hpbmcgdG9vIGdlbmVyYWwgZXhjZXB0aW9uIEJhc2VFeGNlcHRpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYi9idWdmaXhfbG9jYWxfc2NvcGVfbWV0YWNsYXNzXzExNzcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYnVnZml4X2xvY2FsX3Njb3BlX21ldGFjbGFzc18xMTc3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzA3YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYnVnZml4X2xvY2FsX3Njb3BlX21ldGFjbGFzc18xMTc3LnB5CkBAIC0wLDAgKzEsNTQgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsaW1wb3J0LWVycm9yCitmcm9tIFVOSU5GRVJBQkxFIGltcG9ydCBJbXBvcnRlZE1ldGFjbGFzcywgSW1wb3J0ZWRNZXRhY2xhc3MyCisKKworY2xhc3MgTWV0YSh0eXBlKToKKyAgICBwYXNzCisKKworY2xhc3MgQ2xhc3MobWV0YWNsYXNzPU1ldGEpOgorICAgIHBhc3MKKworCitkZWYgZnVuY19zY29wZSgpOgorICAgIGNsYXNzIE1ldGEyKHR5cGUpOgorICAgICAgICBwYXNzCisKKyAgICBjbGFzcyBDbGFzczIobWV0YWNsYXNzPU1ldGEyKToKKyAgICAgICAgcGFzcworCisgICAgcmV0dXJuIENsYXNzMgorCisKK2NsYXNzIENsYXNzU2NvcGU6CisgICAgY2xhc3MgTWV0YTModHlwZSk6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIENsYXNzMyhtZXRhY2xhc3M9TWV0YTMpOgorICAgICAgICBwYXNzCisKKyAgICBpbnN0YW5jZSA9IENsYXNzMygpCisKKworZGVmIG1peGVkX3Njb3BlcygpOgorICAgIGNsYXNzIENsYXNzTShtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgIHBhc3MKKworICAgIHJldHVybiBDbGFzc00KKworCitkZWYgaW1wb3J0ZWRfYW5kX25lc3RlZF9zY29wZTEoKToKKyAgICBjbGFzcyBDbGFzc0ltcDEobWV0YWNsYXNzPUltcG9ydGVkTWV0YWNsYXNzKToKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgQ2xhc3NJbXAyKG1ldGFjbGFzcz1JbXBvcnRlZE1ldGFjbGFzcyk6CisgICAgICAgIHBhc3MKKworICAgIHJldHVybiBDbGFzc0ltcDEsIENsYXNzSW1wMgorCisKK2RlZiBpbXBvcnRlZF9hbmRfbmVzdGVkX3Njb3BlMigpOgorICAgIGNsYXNzIENsYXNzSW1wMyhtZXRhY2xhc3M9SW1wb3J0ZWRNZXRhY2xhc3MyKToKKyAgICAgICAgcGFzcworCisgICAgcmV0dXJuIENsYXNzSW1wMwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9iL2J1Z2ZpeF9sb2NhbF9zY29wZV9tZXRhY2xhc3NfMTE3Ny5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9idWdmaXhfbG9jYWxfc2NvcGVfbWV0YWNsYXNzXzExNzcucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9idWdmaXhfbG9jYWxfc2NvcGVfbWV0YWNsYXNzXzExNzcucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2IvYnVpbHRpbl9tb2R1bGVfdGVzdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYi9idWlsdGluX21vZHVsZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMWU3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2IvYnVpbHRpbl9tb2R1bGVfdGVzdC5weQpAQCAtMCwwICsxLDExIEBACisiIiJ0ZXN0IGltcG9ydCBmcm9tIGEgYnVpbHRpbiBtb2R1bGUiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gbWF0aCBpbXBvcnQgbG9nMTAKKworX19yZXZpc2lvbl9fID0gTm9uZQorCisKK2RlZiBsb2cxMF8yKCk6CisgICAgIiIiYmxhIGJsYSBibGEiIiIKKyAgICByZXR1cm4gbG9nMTAoMikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2FjaGVkX3Byb3BlcnR5LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NhY2hlZF9wcm9wZXJ0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODAwMTVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NhY2hlZF9wcm9wZXJ0eS5weQpAQCAtMCwwICsxLDIzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsbm8tc2VsZi11c2UKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBjYWNoZWRfcHJvcGVydHkKKworCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzQwMjMKKyMgRmFsc2UtcG9zaXRpdmUgJ2ludmFsaWQtb3ZlcnJpZGRlbi1tZXRob2QnIHdpdGggJ2NhY2hlZF9wcm9wZXJ0eScKK2NsYXNzIFBhcmVudDoKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiA0MgorCisgICAgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIENoaWxkKFBhcmVudCk6CisgICAgQGNhY2hlZF9wcm9wZXJ0eQorICAgIGRlZiB2YWx1ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDIqKjYKKworICAgIEBjYWNoZWRfcHJvcGVydHkKKyAgICBkZWYgZnVuYyhzZWxmKTogICMgW2ludmFsaWQtb3ZlcnJpZGRlbi1tZXRob2RdCisgICAgICAgIHJldHVybiA0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NhY2hlZF9wcm9wZXJ0eS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jYWNoZWRfcHJvcGVydHkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmYzUwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jYWNoZWRfcHJvcGVydHkucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2FjaGVkX3Byb3BlcnR5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jYWNoZWRfcHJvcGVydHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjM2E2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2FjaGVkX3Byb3BlcnR5LnR4dApAQCAtMCwwICsxIEBACitpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kOjIyOjQ6Q2hpbGQuZnVuYzpNZXRob2QgJ2Z1bmMnIHdhcyBleHBlY3RlZCB0byBiZSAnbWV0aG9kJywgZm91bmQgaXQgaW5zdGVhZCBhcyAncHJvcGVydHknCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2VsbHZhcl9lc2NhcGluZ19sb29wLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NlbGx2YXJfZXNjYXBpbmdfbG9vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQyMjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NlbGx2YXJfZXNjYXBpbmdfbG9vcC5weQpAQCAtMCwwICsxLDEzMSBAQAorIyBweWxpbnQ6IGRpc2FibGU9cHJpbnQtc3RhdGVtZW50LCB1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uLG1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMKKyIiIlRlc3RzIGZvciBsb29wdmFyLWluLWNsb3N1cmUuIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2Zyb20gZW51bSBpbXBvcnQgRW51bQorCisKK2RlZiBnb29kX2Nhc2UoKToKKyAgICAiIiJObyBwcm9ibGVtcyBoZXJlLiIiIgorICAgIGxzdCA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBsc3QuYXBwZW5kKGkpCisKKworZGVmIGdvb2RfY2FzZTIoKToKKyAgICAiIiJObyBwcm9ibGVtcyBoZXJlLiIiIgorICAgIHJldHVybiBbaSBmb3IgaSBpbiByYW5nZSgxMCldCisKKworZGVmIGdvb2RfY2FzZTMoKToKKyAgICAiIiJObyBwcm9ibGVtcyBoZXJlLiIiIgorICAgIGxzdCA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBsc3QuYXBwZW5kKGxhbWJkYSBpPWk6IGkpCisKKworZGVmIGdvb2RfY2FzZTQoKToKKyAgICAiIiJObyBwcm9ibGVtcyBoZXJlLiIiIgorICAgIGxzdCA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBwcmludChpKQorICAgICAgICBsc3QuYXBwZW5kKGxhbWJkYSBpOiBpKQorCisKK2RlZiBnb29kX2Nhc2U1KCk6CisgICAgIiIiTm8gcHJvYmxlbXMgaGVyZS4iIiIKKyAgICByZXR1cm4gKGkgZm9yIGkgaW4gcmFuZ2UoMTApKQorCisKK2RlZiBnb29kX2Nhc2U2KCk6CisgICAgIiIiQWNjZXB0IHVzZSBvZiB0aGUgdmFyaWFibGUgaW5zaWRlIHJldHVybi4iIiIKKyAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgIGlmIGkgPT0gODoKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGE6IGkKKyAgICByZXR1cm4gbGFtYmRhOiAtMQorCisKK2RlZiBnb29kX2Nhc2U3KCk6CisgICAgIiIiTGFtYmRhIGRlZmluZWQgYW5kIGNhbGxlZCBpbiBsb29wLiIiIgorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgcHJpbnQoKGxhbWJkYSB4OiBpICsgeCkoMSkpCisKKworZGVmIGdvb2RfY2FzZTgoKToKKyAgICAiIiJBbm90aGVyIGVhZ2VyIGJpbmRpbmcgb2YgdGhlIGNlbGwgdmFyaWFibGUuIiIiCisgICAgZnVucyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBkZWYgZnVuYyhib3VuZF9pPWkpOgorICAgICAgICAgICAgIiIiSWdub3JlLiIiIgorICAgICAgICAgICAgcmV0dXJuIGJvdW5kX2kKKyAgICAgICAgZnVucy5hcHBlbmQoZnVuYykKKyAgICByZXR1cm4gZnVucworCisKK2RlZiBiYWRfY2FzZSgpOgorICAgICIiIkNsb3Npbmcgb3ZlciBhIGxvb3AgdmFyaWFibGUuIiIiCisgICAgbHN0ID0gW10KKyAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgIHByaW50KGkpCisgICAgICAgIGxzdC5hcHBlbmQobGFtYmRhOiBpKSAgIyBbY2VsbC12YXItZnJvbS1sb29wXQorCisKK2RlZiBiYWRfY2FzZTIoKToKKyAgICAiIiJDbG9zaW5nIG92ZXIgYSBsb29wIHZhcmlhYmxlLiIiIgorICAgIHJldHVybiBbbGFtYmRhOiBpIGZvciBpIGluIHJhbmdlKDEwKV0gICMgW2NlbGwtdmFyLWZyb20tbG9vcF0KKworCitkZWYgYmFkX2Nhc2UzKCk6CisgICAgIiIiQ2xvc2luZyBvdmVyIHZhcmlhYmxlIGRlZmluZWQgaW4gbG9vcC4iIiIKKyAgICBsc3QgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgaiA9IGkgKiBpCisgICAgICAgIGxzdC5hcHBlbmQobGFtYmRhOiBqKSAgIyBbY2VsbC12YXItZnJvbS1sb29wXQorICAgIHJldHVybiBsc3QKKworCitkZWYgYmFkX2Nhc2U0KCk6CisgICAgIiIiQ2xvc2luZyBvdmVyIHZhcmlhYmxlIGRlZmluZWQgaW4gbG9vcC4iIiIKKyAgICBsc3QgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgZGVmIG5lc3RlZCgpOgorICAgICAgICAgICAgIiIiTmVzdGVkIGZ1bmN0aW9uLiIiIgorICAgICAgICAgICAgcmV0dXJuIGkqKjIgICMgW2NlbGwtdmFyLWZyb20tbG9vcF0KKyAgICAgICAgbHN0LmFwcGVuZChuZXN0ZWQpCisgICAgcmV0dXJuIGxzdAorCisKK2RlZiBiYWRfY2FzZTUoKToKKyAgICAiIiJQcm9ibGVtYXRpYyBjYXNlLgorCisgICAgSWYgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzCisKKyAgICA+Pj4gW3goKSBmb3IgeCBpbiBiYWRfY2FzZTUoKV0KKworICAgIGl0IGJlaGF2ZXMgJ2FzIGV4cGVjdGVkJywgaS5lLiB0aGUgcmVzdWx0IGlzIHJhbmdlKDEwKS4KKworICAgIElmIGl0J3MgdXNlZCB3aXRoCisKKyAgICA+Pj4gbHN0ID0gbGlzdChiYWRfY2FzZTUoKSkKKyAgICA+Pj4gW3goKSBmb3IgeCBpbiBsc3RdCisKKyAgICB0aGUgcmVzdWx0IGlzIFs5XSAqIDEwIGFnYWluLgorICAgICIiIgorICAgIHJldHVybiAobGFtYmRhOiBpIGZvciBpIGluIHJhbmdlKDEwKSkgICMgW2NlbGwtdmFyLWZyb20tbG9vcF0KKworCitkZWYgYmFkX2Nhc2U2KCk6CisgICAgIiIiQ2xvc2luZyBvdmVyIHZhcmlhYmxlIGRlZmluZWQgaW4gbG9vcC4iIiIKKyAgICBsc3QgPSBbXQorICAgIGZvciBpLCBqIGluIHppcChyYW5nZSgxMCksIHJhbmdlKDEwLCAyMCkpOgorICAgICAgICBwcmludChqKQorICAgICAgICBsc3QuYXBwZW5kKGxhbWJkYTogaSkgICMgW2NlbGwtdmFyLWZyb20tbG9vcF0KKyAgICByZXR1cm4gbHN0CisKKworY2xhc3MgVGVzdChFbnVtKToKKyAgICBURVNUID0gKDQwLCAxNjApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG5ld190ZXN0KG1pbmltdW09VEVTVFswXSwgbWF4aW11bT1URVNUWzFdKToKKyAgICAgICAgcmV0dXJuIG1pbmltdW0sIG1heGltdW0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jZWxsdmFyX2VzY2FwaW5nX2xvb3AudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NlbGx2YXJfZXNjYXBpbmdfbG9vcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllOGNiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jZWxsdmFyX2VzY2FwaW5nX2xvb3AudHh0CkBAIC0wLDAgKzEsNiBAQAorY2VsbC12YXItZnJvbS1sb29wOjcwOjI3OmJhZF9jYXNlLjxsYW1iZGE+OkNlbGwgdmFyaWFibGUgaSBkZWZpbmVkIGluIGxvb3AKK2NlbGwtdmFyLWZyb20tbG9vcDo3NToyMDpiYWRfY2FzZTIuPGxhbWJkYT46Q2VsbCB2YXJpYWJsZSBpIGRlZmluZWQgaW4gbG9vcAorY2VsbC12YXItZnJvbS1sb29wOjgzOjI3OmJhZF9jYXNlMy48bGFtYmRhPjpDZWxsIHZhcmlhYmxlIGogZGVmaW5lZCBpbiBsb29wCitjZWxsLXZhci1mcm9tLWxvb3A6OTM6MTk6YmFkX2Nhc2U0Lm5lc3RlZDpDZWxsIHZhcmlhYmxlIGkgZGVmaW5lZCBpbiBsb29wCitjZWxsLXZhci1mcm9tLWxvb3A6MTE0OjIwOmJhZF9jYXNlNS48bGFtYmRhPjpDZWxsIHZhcmlhYmxlIGkgZGVmaW5lZCBpbiBsb29wCitjZWxsLXZhci1mcm9tLWxvb3A6MTIyOjI3OmJhZF9jYXNlNi48bGFtYmRhPjpDZWxsIHZhcmlhYmxlIGkgZGVmaW5lZCBpbiBsb29wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfYXR0cmlidXRlcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19hdHRyaWJ1dGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfYXR0cmlidXRlcy5weQpAQCAtMCwwICsxLDE4IEBACisiIiJUZXN0IHRoYXQgdmFsaWQgY2xhc3MgYXR0cmlidXRlIGRvZXNuJ3QgdHJpZ2dlciBlcnJvcnMiIiIKK19fcmV2aXNpb25fXyA9ICdzcG9uZ2UgYm9iJworIyBweWxpbnQ6IGRpc2FibGU9dXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgQ2xhenoob2JqZWN0KToKKyAgICAiZHVtbXkgY2xhc3MiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudG9waWMgPSA1CisgICAgICAgIHNlbGYuX2RhdGEgPSA0NQorCisgICAgZGVmIGNoYW5nZV90eXBlKHNlbGYsIG5ld19jbGFzcyk6CisgICAgICAgICIiIkNoYW5nZSB0eXBlIiIiCisgICAgICAgIHNlbGYuX19jbGFzc19fID0gbmV3X2NsYXNzCisKKyAgICBkZWYgZG9fbm90aGluZyhzZWxmKToKKyAgICAgICAgIkkgZG8gbm90aGluZyB1c2VmdWwiCisgICAgICAgIHJldHVybiBzZWxmLnRvcGljICsgNTYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19tZW1iZXJzX3B5MzAucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfbWVtYmVyc19weTMwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzI2N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfbWVtYmVyc19weTMwLnB5CkBAIC0wLDAgKzEsNjggQEAKKyIiIiBWYXJpb3VzIHRlc3RzIGZvciBjbGFzcyBtZW1iZXJzIGFjY2Vzcy4gIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbXBvcnQtZXJyb3Isbm8taW5pdCxtaXNzaW5nLWRvY3N0cmluZywgd3JvbmctaW1wb3J0LXBvc2l0aW9uLHdyb25nLWltcG9ydC1vcmRlciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UNCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcNCitjbGFzcyBNeUNsYXNzKG9iamVjdCk6DQorICAgICIiImNsYXNzIGRvY3N0cmluZyIiIg0KKw0KKyAgICBkZWYgX19pbml0X18oc2VsZik6DQorICAgICAgICAiIiJpbml0IiIiDQorICAgICAgICBzZWxmLmNvcnJlY3QgPSAxDQorDQorICAgIGRlZiB0ZXN0KHNlbGYpOg0KKyAgICAgICAgIiIidGVzdCIiIg0KKyAgICAgICAgc2VsZi5jb3JyZWN0ICs9IDINCisgICAgICAgIHNlbGYuaW5jb3JyZWN0ICs9IDIgIyBbbm8tbWVtYmVyXQ0KKyAgICAgICAgZGVsIHNlbGYuaGF2ZW5vdCAjIFtuby1tZW1iZXJdDQorICAgICAgICBzZWxmLm5vbmV4aXN0ZW50MS50cnVjKCkgIyBbbm8tbWVtYmVyXQ0KKyAgICAgICAgc2VsZi5ub25leGlzdGVudDJbMV0gPSAnaGVoZScgIyBbbm8tbWVtYmVyXQ0KKw0KK2NsYXNzIFhZWk1peGluKG9iamVjdCk6DQorICAgICIiImFjY2VzcyB0byB1bmRlZmluZWQgbWVtYmVycyBzaG91bGQgYmUgaWdub3JlZCBpbiBtaXhpbiBjbGFzc2VzIGJ5DQorICAgIGRlZmF1bHQNCisgICAgIiIiDQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHByaW50KHNlbGYubm9uZXhpc3RlbnQpDQorDQorDQorY2xhc3MgTmV3Q2xhc3Mob2JqZWN0KToNCisgICAgIiIidXNlIG9iamVjdC5fX3NldGF0dHJfXyIiIg0KKyAgICBkZWYgX19pbml0X18oc2VsZik6DQorICAgICAgICBzZWxmLl9fc2V0YXR0cl9fKCd0b3RvJywgJ3R1dHUnKQ0KKw0KK2Zyb20gYWJjIGltcG9ydCBBQkNNZXRhDQorDQorY2xhc3MgVGVzdE1ldGFjbGFzcyhvYmplY3QsIG1ldGFjbGFzcz1BQkNNZXRhKToNCisgICAgIiIiIFRlc3QgYXR0cmlidXRlIGFjY2VzcyBmb3IgbWV0YWNsYXNzZXMuICIiIg0KKw0KK2NsYXNzIE1ldGFjbGFzcyh0eXBlKToNCisgICAgIiIiIG1ldGFjbGFzcyAiIiINCisgICAgQGNsYXNzbWV0aG9kDQorICAgIGRlZiB0ZXN0KGNscyk6DQorICAgICAgICAiIiIgY2xhc3NtZXRob2QgIiIiDQorDQorY2xhc3MgVXNpbmdNZXRhY2xhc3Mob2JqZWN0LCBtZXRhY2xhc3M9TWV0YWNsYXNzKToNCisgICAgIiIiIGVtcHR5ICIiIg0KKw0KK1Rlc3RNZXRhY2xhc3MucmVnaXN0ZXIoaW50KQ0KK1VzaW5nTWV0YWNsYXNzLnRlc3QoKQ0KK1Rlc3RNZXRhY2xhc3MoKS5yZWdpc3RlcihpbnQpICMgW25vLW1lbWJlcl0NCitVc2luZ01ldGFjbGFzcygpLnRlc3QoKSAjIFtuby1tZW1iZXJdDQorDQorDQorY2xhc3MgTm9Lbm93bkJhc2VzKE1pc3NpbmcpOg0KKyAgICAiIiJEb24ndCBlbWl0IG5vLW1lbWJlciBpZiB3ZSBkb24ndCBrbm93IHRoZSBiYXNlcyBvZiBhIGNsYXNzLiIiIg0KKw0KK05vS25vd25CYXNlcygpLmxhbGFsYSgpDQorDQorDQorY2xhc3MgTWV0YUNsYXNzKG9iamVjdCk6DQorICAgICIiIkxvb2sgc29tZSBtZXRob2RzIGluIHRoZSBpbXBsaWNpdCBtZXRhY2xhc3MuIiIiDQorDQorICAgIEBjbGFzc21ldGhvZA0KKyAgICBkZWYgd2hhdGV2ZXIoY2xzKToNCisgICAgICAgIHJldHVybiBjbHMubXJvKCkgKyBjbHMubWlzc2luZygpICMgW25vLW1lbWJlcl0NCisNCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlDQorDQorVHVwbGUgPSBuYW1lZHR1cGxlKCJUdXBsZSIsICJmaWVsZCBvdGhlciIpDQorVHVwbGUuZmllbGQuX19kb2NfXyA9ICJBIGRvYyBmb3IgdGhlIGZpZWxkLiINCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfbWVtYmVyc19weTMwLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX21lbWJlcnNfcHkzMC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ5MGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX21lbWJlcnNfcHkzMC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10NCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfbWVtYmVyc19weTMwLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19tZW1iZXJzX3B5MzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmFiMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfbWVtYmVyc19weTMwLnR4dApAQCAtMCwwICsxLDcgQEAKK25vLW1lbWJlcjoxNDo4Ok15Q2xhc3MudGVzdDpJbnN0YW5jZSBvZiAnTXlDbGFzcycgaGFzIG5vICdpbmNvcnJlY3QnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjoxNToxMjpNeUNsYXNzLnRlc3Q6SW5zdGFuY2Ugb2YgJ015Q2xhc3MnIGhhcyBubyAnaGF2ZW5vdCcgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjE2Ojg6TXlDbGFzcy50ZXN0Okluc3RhbmNlIG9mICdNeUNsYXNzJyBoYXMgbm8gJ25vbmV4aXN0ZW50MScgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjE3Ojg6TXlDbGFzcy50ZXN0Okluc3RhbmNlIG9mICdNeUNsYXNzJyBoYXMgbm8gJ25vbmV4aXN0ZW50MicgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjQ4OjA6Okluc3RhbmNlIG9mICdUZXN0TWV0YWNsYXNzJyBoYXMgbm8gJ3JlZ2lzdGVyJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6NDk6MDo6SW5zdGFuY2Ugb2YgJ1VzaW5nTWV0YWNsYXNzJyBoYXMgbm8gJ3Rlc3QnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjo2MzoyNzpNZXRhQ2xhc3Mud2hhdGV2ZXI6Q2xhc3MgJ01ldGFDbGFzcycgaGFzIG5vICdtaXNzaW5nJyBtZW1iZXI6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfbWVtYmVyc19weTM2LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX21lbWJlcnNfcHkzNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNhYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX21lbWJlcnNfcHkzNi5weQpAQCAtMCwwICsxLDEzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCisKK2NsYXNzIENsYXNzOgorICAgIGF0dHI6IGludAorICAgIC4uLgorCisKKyMgYGJhcmAgZGVmaW5pdGVseSBkb2VzIG5vdCBleGlzdCBoZXJlLCBidXQgaW4gYSBjb21wbGV4IHNjZW5hcmlvLAorIyBpdCBtaWdodC4gV2Ugc2ltcGx5IGV4Y2x1ZGUgUEVQIDUyNiBjbGFzcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzCisjIGZyb20gYG5vLW1lbWJlcmAuCitwcmludChDbGFzcygpLmF0dHIpCitwcmludChDbGFzcy5hdHRyKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX21lbWJlcnNfcHkzNi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19tZW1iZXJzX3B5MzYucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19tZW1iZXJzX3B5MzYucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My42CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3Nfc2NvcGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3Nfc2NvcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyYmE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19zY29wZS5weQpAQCAtMCwwICsxLDQzIEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLWluaXQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiJjaGVjayBmb3Igc2NvcGUgcHJvYmxlbXMiIiIKKworX19yZXZpc2lvbl9fID0gTm9uZQorCitjbGFzcyBXZWxsKG9iamVjdCk6CisgICAgIiIid2VsbCIiIgorICAgIGF0dHIgPSA0MgorICAgIGdldF9hdHRyID0gbGFtYmRhIGFyZz1hdHRyOiBhcmcgKiAyNAorICAgICMgKzE6IFt1bmRlZmluZWQtdmFyaWFibGUsIHVzZWQtYmVmb3JlLWFzc2lnbm1lbnRdCisgICAgZ2V0X2F0dHJfYmFkID0gbGFtYmRhIGFyZz1yZXZhdHRyOiByZXZhdHRyICogNDIKKyAgICByZXZhdHRyID0gMjQKKyAgICBiYWRfbGFtYmRhID0gbGFtYmRhOiBnZXRfYXR0cl9iYWQgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorICAgIGJhZF9nZW4gPSBsaXN0KGF0dHIgKyBpIGZvciBpIGluIHJhbmdlKDEwKSkgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorCisgICAgY2xhc3MgRGF0YShvYmplY3QpOgorICAgICAgICAiIiJiYXNlIGhpZGRlbiBjbGFzcyIiIgorICAgIGNsYXNzIFN1YihEYXRhKToKKyAgICAgICAgIiIid2hhb3UsIGlzIERhdGEgZm91bmQ/Pz8iIiIKKyAgICAgICAgYXR0ciA9IERhdGEoKSAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgICIiImNoZWNrIFN1YiBpcyBub3QgZGVmaW5lZCBoZXJlIiIiCisgICAgICAgIHJldHVybiBTdWIoKSwgc2VsZiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKKworY2xhc3MgUmlnaHQ6CisgICAgIiIicmlnaHQiIiIKKyAgICBjbGFzcyBSZXN1bHQxOgorICAgICAgICAiIiJyZXN1bHQgb25lIiIiCisgICAgICAgIE9LID0gMAorICAgIGRlZiB3b3JrKHNlbGYpIC0+IFJlc3VsdDE6CisgICAgICAgICIiImdvb2QgdHlwZSBoaW50IiIiCisgICAgICAgIHJldHVybiBzZWxmLlJlc3VsdDEuT0sKKworCitjbGFzcyBXcm9uZzoKKyAgICAiIiJ3cm9uZyIiIgorICAgIGNsYXNzIFJlc3VsdDI6CisgICAgICAgICIiInJlc3VsdCB0d28iIiIKKyAgICAgICAgT0sgPSAwCisgICAgZGVmIHdvcmsoc2VsZikgLT4gc2VsZi5SZXN1bHQyOiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgICIiImJhZCB0eXBlIGhpbnQiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuUmVzdWx0Mi5PSwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX3Njb3BlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19zY29wZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZDIzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc19zY29wZS50eHQKQEAgLTAsMCArMSw3IEBACit1bmRlZmluZWQtdmFyaWFibGU6MTE6Mzk6V2VsbC48bGFtYmRhPjpVbmRlZmluZWQgdmFyaWFibGUgJ3JldmF0dHInCit1c2VkLWJlZm9yZS1hc3NpZ25tZW50OjExOjMwOldlbGwuPGxhbWJkYT46VXNpbmcgdmFyaWFibGUgJ3JldmF0dHInIGJlZm9yZSBhc3NpZ25tZW50Cit1bmRlZmluZWQtdmFyaWFibGU6MTM6MjU6V2VsbC48bGFtYmRhPjpVbmRlZmluZWQgdmFyaWFibGUgJ2dldF9hdHRyX2JhZCcKK3VuZGVmaW5lZC12YXJpYWJsZToxNDoxOTpXZWxsOlVuZGVmaW5lZCB2YXJpYWJsZSAnYXR0cicKK3VuZGVmaW5lZC12YXJpYWJsZToyMDoxNTpXZWxsLlN1YjpVbmRlZmluZWQgdmFyaWFibGUgJ0RhdGEnCit1bmRlZmluZWQtdmFyaWFibGU6MjM6MTU6V2VsbC5mdW5jOlVuZGVmaW5lZCB2YXJpYWJsZSAnU3ViJwordW5kZWZpbmVkLXZhcmlhYmxlOjQxOjIyOldyb25nLndvcms6VW5kZWZpbmVkIHZhcmlhYmxlICdzZWxmJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX3ZhcmlhYmxlX3Nsb3RzX2NvbmZsaWN0X2V4ZW1wdGVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX3ZhcmlhYmxlX3Nsb3RzX2NvbmZsaWN0X2V4ZW1wdGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YTBlZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3NfdmFyaWFibGVfc2xvdHNfY29uZmxpY3RfZXhlbXB0ZWQucHkKQEAgLTAsMCArMSw0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCitjbGFzcyBFeGFtcGxlOgorICAgIF9fc2xvdHNfXyA9IFsiZmllbGQiXQorICAgIGZpZWxkOiBpbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc192YXJpYWJsZV9zbG90c19jb25mbGljdF9leGVtcHRlZC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc192YXJpYWJsZV9zbG90c19jb25mbGljdF9leGVtcHRlZC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzX3ZhcmlhYmxlX3Nsb3RzX2NvbmZsaWN0X2V4ZW1wdGVkLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzZXNfbWV0aF9jb3VsZF9iZV9hX2Z1bmN0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzZXNfbWV0aF9jb3VsZF9iZV9hX2Z1bmN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MTAzYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY2xhc3Nlc19tZXRoX2NvdWxkX2JlX2FfZnVuY3Rpb24ucHkKQEAgLTAsMCArMSwzMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxuby1pbml0LHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiIKKyMyNDc5CisKK1IwMjAxIChmb3JtZWx5IFcwMjEyKSwgTWV0aG9kIGNvdWxkIGJlIGEgZnVuY3Rpb24gc2hvdWxkbid0IGJlIGVtaXR0ZWQgaW4gY2FzZQorbGlrZSBmYWN0b3J5IG1ldGhvZCBwYXR0ZXJuCisiIiIKK19fcmV2aXNpb25fXyA9IDEKKworY2xhc3MgWEFzdWIob2JqZWN0KToKKyAgICBwYXNzCitjbGFzcyBYQnN1YihYQXN1Yik6CisgICAgcGFzcworY2xhc3MgWENzdWIoWEFzdWIpOgorICAgIHBhc3MKKworY2xhc3MgQWltcGwob2JqZWN0KToKKyAgICAjIGRpc2FibGUgIm1ldGhvZCBjb3VsZCBiZSBhIGZ1bmN0aW9uIiBvbiBjbGFzc2VzIHdoaWNoIGFyZSBub3Qgb3ZlcnJpZGluZworICAgICMgdGhlIGZhY3RvcnkgbWV0aG9kIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHRoZSB1c2FnZSBvZiBwb2x5bW9ycGhpc20gaXMgbm90CisgICAgIyBkZXRlY3RlZAorICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgICAgZGVmIG1ha2V4KHNlbGYpOgorICAgICAgICByZXR1cm4gWEFzdWIoKQorCitjbGFzcyBCaW1wbChBaW1wbCk6CisKKyAgICBkZWYgbWFrZXgoc2VsZik6CisgICAgICAgIHJldHVybiBYQnN1YigpCisKK2NsYXNzIENpbXBsKEFpbXBsKToKKworICAgIGRlZiBtYWtleChzZWxmKToKKyAgICAgICAgcmV0dXJuIFhDc3ViKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc2VzX3Byb3RlY3RlZF9tZW1iZXJfYWNjZXNzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NsYXNzZXNfcHJvdGVjdGVkX21lbWJlcl9hY2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2ZWZkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jbGFzc2VzX3Byb3RlY3RlZF9tZW1iZXJfYWNjZXNzLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyIiIgorIzMxMjM6IFcwMjEyIGZhbHNlIHBvc2l0aXZlIG9uIHN0YXRpYyBtZXRob2QKKyIiIgorX19yZXZpc2lvbl9fID0gMQorCisjIHB5bGludDogZGlzYWJsZT1uby1jbGFzc21ldGhvZC1kZWNvcmF0b3IsIG5vLXN0YXRpY21ldGhvZC1kZWNvcmF0b3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitjbGFzcyBBMzEyMyhvYmplY3QpOgorICAgICIiIm95cHVlZSIiIgorICAgIF9wcm90ZWN0ZWQgPSAxCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBjbWV0aChjbHMsIHZhbCk6CisgICAgICAgICIiInNldCBwcm90ZWN0ZWQgbWVtYmVyIiIiCisgICAgICAgIGNscy5fcHJvdGVjdGVkID0gK3ZhbAorCisgICAgY21ldGggPSBjbGFzc21ldGhvZChjbWV0aCkKKworICAgIGRlZiBzbWV0aCh2YWwpOgorICAgICAgICAiIiJzZXQgcHJvdGVjdGVkIG1lbWJlciIiIgorICAgICAgICBBMzEyMy5fcHJvdGVjdGVkICs9IHZhbAorCisgICAgc21ldGggPSBzdGF0aWNtZXRob2Qoc21ldGgpCisKKyAgICBwcm9wID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX3Byb3RlY3RlZCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb21wYXJpc29uX3dpdGhfY2FsbGFibGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29tcGFyaXNvbl93aXRoX2NhbGxhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzY4NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29tcGFyaXNvbl93aXRoX2NhbGxhYmxlLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMgcHlsaW50OiBkaXNhYmxlID0gZGlzYWxsb3dlZC1uYW1lLCBtaXNzaW5nLWRvY3N0cmluZywgdXNlbGVzcy1yZXR1cm4sIG1pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50LCBpbnZhbGlkLW5hbWUsIG5vLXNlbGYtdXNlLCBsaW5lLXRvby1sb25nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorZGVmIGZvbygpOgorICAgIHJldHVybiBOb25lCisKK2RlZiBnb28oKToKKyAgICByZXR1cm4gTm9uZQorCitpZiBmb28gPT0gNzg2OiAgIyBbY29tcGFyaXNvbi13aXRoLWNhbGxhYmxlXQorICAgIHBhc3MKKworaWYgNjY2ID09IGdvbzogICMgW2NvbXBhcmlzb24td2l0aC1jYWxsYWJsZV0KKyAgICBwYXNzCisKK2lmIGZvbyA9PSBnb286CisgICAgcGFzcworCitpZiBmb28oKSA9PSBnb28oKToKKyAgICBwYXNzCisKKworY2xhc3MgRmFrZUNsYXNzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9mYWtlX3Byb3AgPSAnZmFrZSBpdCB0aWxsIHlvdSBtYWtlIGl0ISEnCisKKyAgICBkZWYgZmFrZV9tZXRob2Qoc2VsZik6CisgICAgICAgIHJldHVybiAnNjY2IC0gVGhlIE51bWJlciBvZiB0aGUgQmVhc3QnCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZmFrZV9wcm9wZXJ0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Zha2VfcHJvcAorCisgICAgQGZha2VfcHJvcGVydHkuc2V0dGVyCisgICAgZGVmIGZha2VfcHJvcGVydHkoc2VsZiwgcHJvcCk6CisgICAgICAgIHNlbGYuX2Zha2VfcHJvcCA9IHByb3AKKworb2JqMSA9IEZha2VDbGFzcygpCitvYmoyID0gRmFrZUNsYXNzKCkKKworaWYgb2JqMS5mYWtlX21ldGhvZCA9PSBvYmoyLmZha2VfbWV0aG9kOgorICAgIHBhc3MKKworaWYgb2JqMS5mYWtlX3Byb3BlcnR5ICE9IG9iajIuZmFrZV9wcm9wZXJ0eTogICAgIyBwcm9wZXJ0eSBhbHRob3VnaCBpcyBmdW5jdGlvbiBidXQgaXMgY2FsbGVkIHdpdGhvdXQgcGFyZW50aGVzaXMKKyAgICBwYXNzCisKK2lmIG9iajEuZmFrZV9tZXRob2QgIT0gZm9vOgorICAgIHBhc3MKKworaWYgb2JqMS5mYWtlX21ldGhvZCAhPSA3ODY6ICMgW2NvbXBhcmlzb24td2l0aC1jYWxsYWJsZV0KKyAgICBwYXNzCisKK2lmIG9iajEuZmFrZV9tZXRob2QgIT0gb2JqMi5mYWtlX3Byb3BlcnR5OiAjIFtjb21wYXJpc29uLXdpdGgtY2FsbGFibGVdCisgICAgcGFzcworCitpZiA2NjYgPT0gNzg2OgorICAgIHBhc3MKKworYSA9IDY2NgorYiA9IDc4NgoraWYgYSA9PSBiOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb21wYXJpc29uX3dpdGhfY2FsbGFibGUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbXBhcmlzb25fd2l0aF9jYWxsYWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ZjBiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb21wYXJpc29uX3dpdGhfY2FsbGFibGUudHh0CkBAIC0wLDAgKzEsNCBAQAorY29tcGFyaXNvbi13aXRoLWNhbGxhYmxlOjg6Mzo6Q29tcGFyaW5nIGFnYWluc3QgYSBjYWxsYWJsZSwgZGlkIHlvdSBvbWl0IHRoZSBwYXJlbnRoZXNpcz8KK2NvbXBhcmlzb24td2l0aC1jYWxsYWJsZToxMTozOjpDb21wYXJpbmcgYWdhaW5zdCBhIGNhbGxhYmxlLCBkaWQgeW91IG9taXQgdGhlIHBhcmVudGhlc2lzPworY29tcGFyaXNvbi13aXRoLWNhbGxhYmxlOjQ4OjM6OkNvbXBhcmluZyBhZ2FpbnN0IGEgY2FsbGFibGUsIGRpZCB5b3Ugb21pdCB0aGUgcGFyZW50aGVzaXM/Citjb21wYXJpc29uLXdpdGgtY2FsbGFibGU6NTE6Mzo6Q29tcGFyaW5nIGFnYWluc3QgYSBjYWxsYWJsZSwgZGlkIHlvdSBvbWl0IHRoZSBwYXJlbnRoZXNpcz8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25kaXRpb25fZXZhbHNfdG9fY29uc3RhbnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZGl0aW9uX2V2YWxzX3RvX2NvbnN0YW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDBiMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZGl0aW9uX2V2YWxzX3RvX2NvbnN0YW50LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyIiIlRlc3QgdGhhdCBib29sZWFuIGNvbmRpdGlvbnMgc2ltcGxpZnkgdG8gYSBjb25zdGFudCB2YWx1ZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9cG9pbnRsZXNzLXN0YXRlbWVudAorZnJvbSB1bmtub3duIGltcG9ydCBVbmtub3duICAjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtZXJyb3IKKworCitkZWYgZnVuYyhfKToKKyAgICAiIiJQb2ludGxlc3MgZnVuY3Rpb24iIiIKKworCitDT05TVEFOVCA9IDEwMAorT1RIRVIgPSAyMDAKKworIyBTaW1wbGlmaWVzIGFueSBib29sZWFuIGV4cHJlc3Npb24gdGhhdCBpcyBjb2VyY2VkIGludG8gYSBUcnVlL0ZhbHNlIHZhbHVlCitib29sKENPTlNUQU5UIG9yIFRydWUpICAjIFtjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnRdCithc3NlcnQgQ09OU1RBTlQgb3IgVHJ1ZSAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQoraWYgQ09OU1RBTlQgYW5kIEZhbHNlOiAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQorICAgIHBhc3MKK2VsaWYgQ09OU1RBTlQgYW5kIEZhbHNlOiAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQorICAgIHBhc3MKK3doaWxlIENPTlNUQU5UIGFuZCBGYWxzZTogICMgW2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudF0KKyAgICBicmVhaworMSBpZiBDT05TVEFOVCBvciBUcnVlIGVsc2UgMiAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQoreiA9IFt4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4IG9yIFRydWVdICAjIFtjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnRdCisKKyMgU2ltcGxpZmllcyByZWN1cnNpdmVseQorYXNzZXJ0IFRydWUgb3IgQ09OU1RBTlQgb3IgT1RIRVIgICMgW2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudF0KK2Fzc2VydCAoQ09OU1RBTlQgb3IgVHJ1ZSkgb3IgKENPTlNUQU5UIG9yIFRydWUpICAjIFtjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnRdCisKKyMgV2lsbCB0cnkgdG8gaW5mZXIgdGhlIHRydXRoaW5lc3Mgb2YgYW4gZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgY29udGFpbiBhbnkgdmFyaWFibGVzCithc3NlcnQgMyArIDQgb3IgQ09OU1RBTlQgICMgW2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudF0KK2Fzc2VydCBVbmtub3duIG9yIFRydWUgICMgW2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudF0KKworYXNzZXJ0IFRydWUgb3IgVHJ1ZSAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQorYXNzZXJ0IEZhbHNlIG9yIEZhbHNlICAjIFtjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnRdCithc3NlcnQgVHJ1ZSBhbmQgVHJ1ZSAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQorYXNzZXJ0IEZhbHNlIGFuZCBGYWxzZSAgIyBbY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50XQorCisKKyMgQSBiYXJlIGNvbnN0YW50IHRoYXQncyBub3QgaW5zaWRlIG9mIGEgYm9vbGVhbiBvcGVyYXRpb24gd2lsbCBlbWl0IGB1c2luZy1jb25zdGFudC10ZXN0YCBpbnN0ZWFkCitpZiBUcnVlOiAgIyBweWxpbnQ6IGRpc2FibGU9dXNpbmctY29uc3RhbnQtdGVzdAorICAgIHBhc3MKKworIyBFeHByZXNzaW9ucyBub3QgaW4gb25lIG9mIHRoZSBhYm92ZSBzaXR1YXRpb25zIHdpbGwgbm90IGVtaXQgYSBtZXNzYWdlCitDT05TVEFOVCBvciBUcnVlCitib29sKENPTlNUQU5UIG9yIE9USEVSKQorYm9vbChmdW5jKENPTlNUQU5UIG9yIFRydWUpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmRpdGlvbl9ldmFsc190b19jb25zdGFudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZGl0aW9uX2V2YWxzX3RvX2NvbnN0YW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQ4ZGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmRpdGlvbl9ldmFsc190b19jb25zdGFudC50eHQKQEAgLTAsMCArMSwxNSBAQAorY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50OjE0OjU6OkJvb2xlYW4gY29uZGl0aW9uICdDT05TVEFOVCBvciBUcnVlJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAnVHJ1ZScKK2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudDoxNTo3OjpCb29sZWFuIGNvbmRpdGlvbiAnQ09OU1RBTlQgb3IgVHJ1ZScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ1RydWUnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MTY6Mzo6Qm9vbGVhbiBjb25kaXRpb24gJ0NPTlNUQU5UIGFuZCBGYWxzZScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ0ZhbHNlJworY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50OjE4OjU6OkJvb2xlYW4gY29uZGl0aW9uICdDT05TVEFOVCBhbmQgRmFsc2UnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICdGYWxzZScKK2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudDoyMDo2OjpCb29sZWFuIGNvbmRpdGlvbiAnQ09OU1RBTlQgYW5kIEZhbHNlJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAnRmFsc2UnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MjI6NTo6Qm9vbGVhbiBjb25kaXRpb24gJ0NPTlNUQU5UIG9yIFRydWUnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICdUcnVlJworY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50OjIzOjI5OjpCb29sZWFuIGNvbmRpdGlvbiAneCBvciBUcnVlJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAnVHJ1ZScKK2NvbmRpdGlvbi1ldmFscy10by1jb25zdGFudDoyNjo3OjpCb29sZWFuIGNvbmRpdGlvbiAnVHJ1ZSBvciBDT05TVEFOVCBvciBPVEhFUicgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ1RydWUnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6Mjc6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ0NPTlNUQU5UIG9yIFRydWUgb3IgQ09OU1RBTlQgb3IgVHJ1ZScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ1RydWUnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MzA6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJzMgKyA0IG9yIENPTlNUQU5UJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAnMyArIDQnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MzE6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ1Vua25vd24gb3IgVHJ1ZScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ1RydWUnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MzM6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ1RydWUgb3IgVHJ1ZScgd2lsbCBhbHdheXMgZXZhbHVhdGUgdG8gJ1RydWUnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MzQ6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ0ZhbHNlIG9yIEZhbHNlJyB3aWxsIGFsd2F5cyBldmFsdWF0ZSB0byAnRmFsc2UnCitjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQ6MzU6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ1RydWUgYW5kIFRydWUnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICdUcnVlJworY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50OjM2Ojc6OkJvb2xlYW4gY29uZGl0aW9uICdGYWxzZSBhbmQgRmFsc2UnIHdpbGwgYWx3YXlzIGV2YWx1YXRlIHRvICdGYWxzZScKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25maWRlbmNlX2ZpbHRlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25maWRlbmNlX2ZpbHRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM1MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZpZGVuY2VfZmlsdGVyLnB5CkBAIC0wLDAgKzEsMTYgQEAKKyIiIlRlc3QgZm9yIHRoZSBjb25maWRlbmNlIGZpbHRlci4iIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKyMgcHlsaW50OiBkaXNhYmxlPXVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2NsYXNzIENsaWVudChvYmplY3QpOgorICAgICIiInVzZSBwcm92aWRlciBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNldF9sYXRlciA9IDAKKworICAgIGRlZiBzZXRfc2V0X2xhdGVyKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIic2V0IHNldF9sYXRlciBhdHRyaWJ1dGUgKGludHJvZHVjZSBhbiBpbmZlcmVuY2UgYW1iaWd1aXR5KSIiIgorICAgICAgICBzZWxmLnNldF9sYXRlciA9IHZhbHVlCisKK3ByaW50KENsaWVudCgpLnNldF9sYXRlci5sb3dlcigpKQorcHJpbnQoQ2xpZW50KCkuZm9vKSAgIyBbbm8tbWVtYmVyXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZpZGVuY2VfZmlsdGVyLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZpZGVuY2VfZmlsdGVyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTUzYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZmlkZW5jZV9maWx0ZXIucmMKQEAgLTAsMCArMSwzIEBACitbTWVzc2FnZXMgQ29udHJvbF0KK2Rpc2FibGU9bm8taW5pdCx0b28tZmV3LXB1YmxpYy1tZXRob2RzLHVuZGVmaW5lZC12YXJpYWJsZSxwcmludC1zdGF0ZW1lbnQKK2NvbmZpZGVuY2U9SU5GRVJFTkNFLEhJR0gsVU5ERUZJTkVECmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZmlkZW5jZV9maWx0ZXIudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZpZGVuY2VfZmlsdGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJjZDgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZpZGVuY2VfZmlsdGVyLnR4dApAQCAtMCwwICsxIEBACituby1tZW1iZXI6MTY6Njo6SW5zdGFuY2Ugb2YgJ0NsaWVudCcgaGFzIG5vICdmb28nIG1lbWJlcjpJTkZFUkVOQ0UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25mdXNpbmdfd2l0aF9zdGF0ZW1lbnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZnVzaW5nX3dpdGhfc3RhdGVtZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOGQ0OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZnVzaW5nX3dpdGhfc3RhdGVtZW50LnB5CkBAIC0wLDAgKzEsMjcgQEAKKyMgcHlsaW50OiBkaXNhYmxlPXVuZGVmaW5lZC12YXJpYWJsZSxub3QtY29udGV4dC1tYW5hZ2VyLG1pc3NpbmctZG9jc3RyaW5nCisKKyMgYm90aCBjb250ZXh0IG1hbmFnZXJzIGFyZSBuYW1lZAord2l0aCBvbmUgYXMgZmlyc3QsIHR3byBhcyBzZWNvbmQ6CisgICAgcGFzcworCisjIGZpcnN0IG1hdGNoZWQgYXMgdHVwbGU7IHRoaXMgaXMgb2sKK3dpdGggb25lIGFzIChmaXJzdCwgc2Vjb25kKSwgdGhpcmQ6CisgICAgcGFzcworCisjIHRoZSBmaXJzdCBjb250ZXh0IG1hbmFnZXIgZG9lc24ndCBoYXZlIGFzIG5hbWUKK3dpdGggb25lLCB0d28gYXMgc2Vjb25kOgorICAgIHBhc3MKKworIyB0aGUgc2Vjb25kIGlzIGEgZnVuY3Rpb24gY2FsbDsgdGhpcyBpcyBvaword2l0aCBvbmUgYXMgZmlyc3QsIHR3bygpOgorICAgIHBhc3MKKworIyBuZXN0ZWQgd2l0aCBzdGF0ZW1lbnRzOyBtYWtlIHN1cmUgbm8gbWVzc2FnZSBpcyBlbWl0dGVkCisjIHRoaXMgY291bGQgYmUgYSBmYWxzZSBwb3NpdGl2ZSBvbiBQeTIKK3dpdGggb25lIGFzIGZpcnN0OgorICAgIHdpdGggdHdvOgorICAgICAgICBwYXNzCisKKyMgYW1iaWd1b3VzIGxvb2tpbmcgd2l0aCBzdGF0ZW1lbnQKK3dpdGggb25lIGFzIGZpcnN0LCB0d286ICAjIFtjb25mdXNpbmctd2l0aC1zdGF0ZW1lbnRdCisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZ1c2luZ193aXRoX3N0YXRlbWVudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uZnVzaW5nX3dpdGhfc3RhdGVtZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMyZTdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbmZ1c2luZ193aXRoX3N0YXRlbWVudC50eHQKQEAgLTAsMCArMSBAQAorY29uZnVzaW5nLXdpdGgtc3RhdGVtZW50OjI2OjA6OiJGb2xsb3dpbmcgIiJhcyIiIHdpdGggYW5vdGhlciBjb250ZXh0IG1hbmFnZXIgbG9va3MgbGlrZSBhIHR1cGxlLiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9pdGVyYXRpbmdfZGljdGlvbmFyeS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9pdGVyYXRpbmdfZGljdGlvbmFyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTk4ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX2l0ZXJhdGluZ19kaWN0aW9uYXJ5LnB5CkBAIC0wLDAgKzEsMzggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBleHByZXNzaW9uLW5vdC1hc3NpZ25lZCwgdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgbm8tbWVtYmVyLCBpbXBvcnQtZXJyb3IsIG5vLXNlbGYtdXNlLCBsaW5lLXRvby1sb25nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbgorCitmcm9tIHVua25vd24gaW1wb3J0IFVua25vd24KKworCitjbGFzcyBDdXN0b21DbGFzcyhvYmplY3QpOgorICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gW10KKworZm9yIGtleSBpbiBVbmtub3duKCkua2V5cygpOgorICAgIHBhc3MKK2ZvciBrZXkgaW4gVW5rbm93bi5rZXlzKCk6CisgICAgcGFzcworZm9yIGtleSBpbiBkaWN0LmtleXMoKToKKyAgICBwYXNzCitmb3Iga2V5IGluIHt9LnZhbHVlcygpOgorICAgIHBhc3MKK2ZvciBrZXkgaW4ge30ua2V5KCk6CisgICAgcGFzcworZm9yIGtleSBpbiBDdXN0b21DbGFzcygpLmtleXMoKToKKyAgICBwYXNzCisKK1trZXkgZm9yIGtleSBpbiB7fS5rZXlzKCldICMgW2NvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5XQorKGtleSBmb3Iga2V5IGluIHt9LmtleXMoKSkgIyBbY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnldCit7a2V5IGZvciBrZXkgaW4ge30ua2V5cygpfSAjIFtjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeV0KK3trZXk6IGtleSBmb3Iga2V5IGluIHt9LmtleXMoKX0gIyBbY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnldCitDT01QMSA9IFtrZXkgZm9yIGtleSBpbiB7fS5rZXlzKCldICMgW2NvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5XQorQ09NUDIgPSAoa2V5IGZvciBrZXkgaW4ge30ua2V5cygpKSAjIFtjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeV0KK0NPTVAzID0ge2tleSBmb3Iga2V5IGluIHt9LmtleXMoKX0gIyBbY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnldCitDT01QNCA9IHtrZXk6IGtleSBmb3Iga2V5IGluIHt9LmtleXMoKX0gIyBbY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnldCitmb3Iga2V5IGluIHt9LmtleXMoKTogIyBbY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnldCisgICAgcGFzcworCisjIElzc3VlICMxMjQ3CitESUNUID0geydhJzogMSwgJ2InOiAyfQorQ09NUDEgPSBbayAqIDIgZm9yIGsgaW4gRElDVC5rZXlzKCldICsgW2sgKiAzIGZvciBrIGluIERJQ1Qua2V5cygpXSAgIyBbY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnksY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnldCitDT01QMiwgQ09NUDMgPSBbayAqIDIgZm9yIGsgaW4gRElDVC5rZXlzKCldLCBbayAqIDMgZm9yIGsgaW4gRElDVC5rZXlzKCldICAjIFtjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeSxjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeV0KK1NPTUVfVFVQTEUgPSAoW2sgKiAyIGZvciBrIGluIERJQ1Qua2V5cygpXSwgW2sgKiAzIGZvciBrIGluIERJQ1Qua2V5cygpXSkgICMgW2NvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5LGNvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX2l0ZXJhdGluZ19kaWN0aW9uYXJ5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9pdGVyYXRpbmdfZGljdGlvbmFyeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiMTJmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9pdGVyYXRpbmdfZGljdGlvbmFyeS50eHQKQEAgLTAsMCArMSwxNSBAQAorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MjM6MTY6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MjQ6MTY6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MjU6MTY6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MjY6MjE6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mjc6MjQ6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mjg6MjQ6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mjk6MjQ6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MzA6Mjk6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MzE6MTE6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MzY6MjQ6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6MzY6NTU6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mzc6MzE6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mzc6NjE6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mzg6MzA6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQorY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnk6Mzg6NjA6OkNvbnNpZGVyIGl0ZXJhdGluZyB0aGUgZGljdGlvbmFyeSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgLmtleXMoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX2pvaW4ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfam9pbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGNkNmRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX2pvaW4ucHkKQEAgLTAsMCArMSwxMjYgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLGludmFsaWQtbmFtZSx1bmRlZmluZWQtdmFyaWFibGUsbXVsdGlwbGUtc3RhdGVtZW50cworCisjIFZhcmlhdGlvbnMgb2YgJ3Jlc3VsdCcKK3Jlc3VsdCA9ICcnCitmb3IgbnVtYmVyIGluIFsnMScsICcyJywgJzMnXToKKyAgICByZXN1bHQgKz0gbnVtYmVyICAjIFtjb25zaWRlci11c2luZy1qb2luXQorCityZXN1bHQgPSAnaGVhZGVyJworZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcmVzdWx0ICs9IG51bWJlciAgIyBbY29uc2lkZXItdXNpbmctam9pbl0KKworcmVzdWx0ID0gYW5vdGhlcl9yZXN1bHQgPSAnJworZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcmVzdWx0ICs9IG51bWJlciAgIyBbY29uc2lkZXItdXNpbmctam9pbl0KKworYW5vdGhlcl9yZXN1bHQgPSByZXN1bHQgPSAnJworZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcmVzdWx0ICs9IG51bWJlciAgIyBbY29uc2lkZXItdXNpbmctam9pbl0KKworcmVzdWx0ID0gMCAgIyByZXN1bHQgaXMgbm90IGEgc3RyaW5nCitmb3IgbnVtYmVyIGluIFsnMScsICcyJywgJzMnXToKKyAgICByZXN1bHQgKz0gbnVtYmVyCisKK1JFU1VMVCA9ICcnICAjIHdyb25nIG5hbWUgLyBpbml0aWFsIHZhcmlhYmxlIG1pc3NpbmcKK2ZvciBudW1iZXIgaW4gWycxJywgJzInLCAnMyddOgorICAgIHJlc3VsdCArPSBbbnVtYmVyXQorCitzdHJpbmdfdmFyaWFibGUgPSAnJworcmVzdWx0ID0gc3RyaW5nX3ZhcmlhYmxlICAjIHR5cGUgb2YgJ3Jlc3VsdCcgbm90IG9idmlvdXNseSBhIHN0cmluZworZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcmVzdWx0ICs9IG51bWJlcgorCityZXN1bHQgPSAnJworYW5vdGhlcl9yZXN1bHQgPSAnJyAgIyByZXN1bHQgZGVmaW5lZCB0b28gZWFybHkKK2ZvciBudW1iZXIgaW4gWycxJywgJzInLCAnMyddOgorICAgIHJlc3VsdCArPSBbbnVtYmVyXQorCitmb3IgbnVtYmVyIGluIFsnMScsICcyJywgJzMnXTogICMgJ3Jlc3VsdCctZGVmaW5pdGlvbiBtaXNzaW5nCisgICAgcmVzdWx0ICs9IG51bWJlcgorCisKKyMgVmFyaWF0aW9ucyBvZiAnbnVtYmVyJworcmVzdWx0ID0gJycgICMgbm8gY29uY2F0ZW5hdGlvbiAoaXRlcmF0b3ItbmFtZSBkaWZmZXJzKQorZm9yIG5hbWUgaW4gWycxJywgJzInLCAnMyddOgorICAgIHJlc3VsdCArPSBudW1iZXIKKworcmVzdWx0ID0gJycgICMgbm8gY29uY2F0ZW5hdGlvbiAoaXRlcmF0b3ItbmFtZSBkaWZmZXJzKQorZm9yIF8gaW4gWycxJywgJzInLCAnMyddOgorICAgIHJlc3VsdCArPSBudW1iZXIKKyMgJ2V4cHJsaXN0JyBpcyBub3QgYSBzaW5nbGUgbmFtZQorZm9yIGluZGV4LCBudW1iZXIgaW4gWycxJywgJzInLCAnMyddOgorICAgIHJlc3VsdCArPSBudW1iZXIKKworCisjIFZhcmlhdGlvbnMgb2YgJ2l0ZXJhYmxlJworcmVzdWx0ID0gJycKK2ZvciBudW1iZXIgaW4gW106CisgICAgcmVzdWx0ICs9IG51bWJlciAgIyBbY29uc2lkZXItdXNpbmctam9pbl0KKworcmVzdWx0ID0gJycKK2ZvciBudW1iZXIgaW4gImEgdGV4dCI6CisgICAgcmVzdWx0ICs9IG51bWJlciAgIyBbY29uc2lkZXItdXNpbmctam9pbl0KKworcmVzdWx0ID0gJycKK2ZvciBudW1iZXIgaW4gWzEsIDIsIDNdOgorICAgIHJlc3VsdCArPSBudW1iZXIgICMgW2NvbnNpZGVyLXVzaW5nLWpvaW5dCisKK2FfbGlzdCA9IFsxLCAyLCAzXQorcmVzdWx0ID0gJycKK2ZvciBudW1iZXIgaW4gYV9saXN0OgorICAgIHJlc3VsdCArPSBudW1iZXIgICMgW2NvbnNpZGVyLXVzaW5nLWpvaW5dCisKK3Jlc3VsdCA9ICcnCitmb3IgbnVtYmVyIGluIFsnMScsICcyJywgJzMnXToKKyAgICByZXN1bHQgKz0gbnVtYmVyICAjIFtjb25zaWRlci11c2luZy1qb2luXQorCityZXN1bHQgPSAnJworZm9yIG51bWJlciBpbiB1bmRlZmluZWRfaXRlcmFibGU6CisgICAgcmVzdWx0ICs9IG51bWJlciAgIyBbY29uc2lkZXItdXNpbmctam9pbl0KKworCisjIFZhcmlhdGlvbnMgb2YgbG9vcC1ib2R5CityZXN1bHQgPSAnJyAgIyBhZGRpdGlvbiBpcyBub3QgdGhlIG9ubHkgcGFydCBvZiB0aGUgYm9keQorZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcHJpbnQobnVtYmVyKQorICAgIHJlc3VsdCArPSBudW1iZXIKKworcmVzdWx0ID0gJycgICMgYWRkaXRpb24gaXMgbm90IHRoZSBvbmx5IHBhcnQgb2YgdGhlIGJvZHkKK2ZvciBudW1iZXIgaW4gWycxJywgJzInLCAnMyddOgorICAgIHJlc3VsdCArPSBudW1iZXIKKyAgICBwcmludChudW1iZXIpCisKK3Jlc3VsdCA9ICcnICAjIGF1Z21lbnRlZCBhZGRpdGlvbiBpcyBub3QgYSBzaW1wbGUgb25lCitmb3IgbnVtYmVyIGluIFsnMScsICcyJywgJzMnXToKKyAgICByZXN1bHQgKz0gJzQnICsgbnVtYmVyCisKK3Jlc3VsdCA9ICcnICAjIGFzc2lnbm1lbnQgaXMgbm90IGF1Z21lbnRlZAorZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcmVzdWx0ID0gbnVtYmVyCisKK3Jlc3VsdCA9ICcnICAjIGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIG5vdCBhbiBhZGRpdGlvbgorZm9yIG51bWJlciBpbiBbJzEnLCAnMicsICczJ106CisgICAgcmVzdWx0IC09IG51bWJlcgorCityZXN1bHQgPSAnJyAgIyBhZGRpdGlvbiBpcyBub3QgdGhlICdudW1iZXInLWl0ZXJhYmxlCitmb3IgbnVtYmVyIGluIFsnMScsICcyJywgJzMnXToKKyAgICByZXN1bHQgKz0gYW5vdGhlcl9udW1iZXIKKworcmVzdWx0ID0gJycKK2ZvciBudW1iZXIgaW4gWycxJywgJzInLCAnMyddOiByZXN1bHQgKz0gbnVtYmVyICAjIFtjb25zaWRlci11c2luZy1qb2luXQorCityZXN1bHQgPSAnJworZm9yIG51bWJlciBpbiBbJzEnXToKKyAgICByZXN1bHQucmVzdWx0ICs9IG51bWJlcgorCisjIERvZXMgbm90IGVtaXQgaWYgdGhlIGJvZHkgaXMgbW9yZSBjb21wbGV4CityZXN1bHQgPSB7J2NvbnRleHQnOiAxfQorcmVzdWx0Wydjb250ZXh0J10gPSAwCitmb3IgbnVtYmVyIGluIFsnMSddOgorICAgIHJlc3VsdDEgPSA0MiArIGludChudW1iZXIpCisgICAgcmVzdWx0Wydjb250ZXh0J10gKz0gcmVzdWx0MSAqIDI0CisKKyMgRG9lcyBub3QgY3Jhc2ggaWYgdGhlIHByZXZpb3VzIHNpYmxpbmcgZG9lcyBub3QgaGF2ZSBBc3NpZ25OYW1lcworcmVzdWx0Wydjb250ZXh0J10gPSAwCitmb3IgbnVtYmVyIGluIFsnMSddOgorICAgIHJlc3VsdFsnY29udGV4dCddICs9IDI0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfam9pbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfam9pbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0NGU1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9qb2luLnR4dApAQCAtMCwwICsxLDExIEBACitjb25zaWRlci11c2luZy1qb2luOjY6NDo6Q29uc2lkZXIgdXNpbmcgc3RyLmpvaW4oc2VxdWVuY2UpIGZvciBjb25jYXRlbmF0aW5nIHN0cmluZ3MgZnJvbSBhbiBpdGVyYWJsZQorY29uc2lkZXItdXNpbmctam9pbjoxMDo0OjpDb25zaWRlciB1c2luZyBzdHIuam9pbihzZXF1ZW5jZSkgZm9yIGNvbmNhdGVuYXRpbmcgc3RyaW5ncyBmcm9tIGFuIGl0ZXJhYmxlCitjb25zaWRlci11c2luZy1qb2luOjE0OjQ6OkNvbnNpZGVyIHVzaW5nIHN0ci5qb2luKHNlcXVlbmNlKSBmb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzIGZyb20gYW4gaXRlcmFibGUKK2NvbnNpZGVyLXVzaW5nLWpvaW46MTg6NDo6Q29uc2lkZXIgdXNpbmcgc3RyLmpvaW4oc2VxdWVuY2UpIGZvciBjb25jYXRlbmF0aW5nIHN0cmluZ3MgZnJvbSBhbiBpdGVyYWJsZQorY29uc2lkZXItdXNpbmctam9pbjo1ODo0OjpDb25zaWRlciB1c2luZyBzdHIuam9pbihzZXF1ZW5jZSkgZm9yIGNvbmNhdGVuYXRpbmcgc3RyaW5ncyBmcm9tIGFuIGl0ZXJhYmxlCitjb25zaWRlci11c2luZy1qb2luOjYyOjQ6OkNvbnNpZGVyIHVzaW5nIHN0ci5qb2luKHNlcXVlbmNlKSBmb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzIGZyb20gYW4gaXRlcmFibGUKK2NvbnNpZGVyLXVzaW5nLWpvaW46NjY6NDo6Q29uc2lkZXIgdXNpbmcgc3RyLmpvaW4oc2VxdWVuY2UpIGZvciBjb25jYXRlbmF0aW5nIHN0cmluZ3MgZnJvbSBhbiBpdGVyYWJsZQorY29uc2lkZXItdXNpbmctam9pbjo3MTo0OjpDb25zaWRlciB1c2luZyBzdHIuam9pbihzZXF1ZW5jZSkgZm9yIGNvbmNhdGVuYXRpbmcgc3RyaW5ncyBmcm9tIGFuIGl0ZXJhYmxlCitjb25zaWRlci11c2luZy1qb2luOjc1OjQ6OkNvbnNpZGVyIHVzaW5nIHN0ci5qb2luKHNlcXVlbmNlKSBmb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzIGZyb20gYW4gaXRlcmFibGUKK2NvbnNpZGVyLXVzaW5nLWpvaW46Nzk6NDo6Q29uc2lkZXIgdXNpbmcgc3RyLmpvaW4oc2VxdWVuY2UpIGZvciBjb25jYXRlbmF0aW5nIHN0cmluZ3MgZnJvbSBhbiBpdGVyYWJsZQorY29uc2lkZXItdXNpbmctam9pbjoxMTA6MzE6OkNvbnNpZGVyIHVzaW5nIHN0ci5qb2luKHNlcXVlbmNlKSBmb3IgY29uY2F0ZW5hdGluZyBzdHJpbmdzIGZyb20gYW4gaXRlcmFibGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9tZXJnaW5nX2lzaW5zdGFuY2UucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfbWVyZ2luZ19pc2luc3RhbmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzg3YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfbWVyZ2luZ19pc2luc3RhbmNlLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyIiIkNoZWNrcyB1c2Ugb2YgY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlIiIiCisjIHB5bGludDpkaXNhYmxlPWxpbmUtdG9vLWxvbmcsIHNpbXBsaWZpYWJsZS1jb25kaXRpb24KKworCitkZWYgaXNpbnN0YW5jZXMoKToKKyAgICAiRXhhbXBsZXMgb2YgaXNpbnN0YW5jZXMiCisgICAgdmFyID0gcmFuZ2UoMTApCisKKyAgICAjIG1lcmdlZAorICAgIGlmIGlzaW5zdGFuY2UodmFyWzFdLCAoaW50LCBmbG9hdCkpOgorICAgICAgICBwYXNzCisgICAgcmVzdWx0ID0gaXNpbnN0YW5jZSh2YXJbMl0sIChpbnQsIGZsb2F0KSkKKworICAgICMgbm90IG1lcmdlZAorICAgIGlmIGlzaW5zdGFuY2UodmFyWzNdLCBpbnQpIG9yIGlzaW5zdGFuY2UodmFyWzNdLCBmbG9hdCkgb3IgaXNpbnN0YW5jZSh2YXJbM10sIGxpc3QpIGFuZCBUcnVlOiAgIyBbY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlXQorICAgICAgICBwYXNzCisgICAgcmVzdWx0ID0gaXNpbnN0YW5jZSh2YXJbNF0sIGludCkgb3IgaXNpbnN0YW5jZSh2YXJbNF0sIGZsb2F0KSBvciBpc2luc3RhbmNlKHZhcls1XSwgbGlzdCkgYW5kIEZhbHNlICAjIFtjb25zaWRlci1tZXJnaW5nLWlzaW5zdGFuY2VdCisKKyAgICByZXN1bHQgPSBpc2luc3RhbmNlKHZhcls1XSwgaW50KSBvciBUcnVlIG9yIGlzaW5zdGFuY2UodmFyWzVdLCBmbG9hdCkgICMgW2NvbnNpZGVyLW1lcmdpbmctaXNpbnN0YW5jZV0KKworICAgIGluZmVyZWRfaXNpbnN0YW5jZSA9IGlzaW5zdGFuY2UKKyAgICByZXN1bHQgPSBpbmZlcmVkX2lzaW5zdGFuY2UodmFyWzZdLCBpbnQpIG9yIGluZmVyZWRfaXNpbnN0YW5jZSh2YXJbNl0sIGZsb2F0KSBvciBpbmZlcmVkX2lzaW5zdGFuY2UodmFyWzZdLCBsaXN0KSBhbmQgRmFsc2UgICAjIFtjb25zaWRlci1tZXJnaW5nLWlzaW5zdGFuY2VdCisgICAgcmVzdWx0ID0gaXNpbnN0YW5jZSh2YXJbMTBdLCBzdHIpIG9yIGlzaW5zdGFuY2UodmFyWzEwXSwgaW50KSBhbmQgdmFyWzhdICogMTQgb3IgaXNpbnN0YW5jZSh2YXJbMTBdLCBmbG9hdCkgYW5kIHZhcls1XSAqIDE0LjQgb3IgaXNpbnN0YW5jZSh2YXJbMTBdLCBsaXN0KSAgICMgW2NvbnNpZGVyLW1lcmdpbmctaXNpbnN0YW5jZV0KKyAgICByZXN1bHQgPSBpc2luc3RhbmNlKHZhclsxMV0sIGludCkgb3IgaXNpbnN0YW5jZSh2YXJbMTFdLCBpbnQpIG9yIGlzaW5zdGFuY2UodmFyWzExXSwgZmxvYXQpICAgIyBbY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlXQorCisgICAgcmVzdWx0ID0gaXNpbnN0YW5jZSh2YXJbMjBdKQorICAgIHJlc3VsdCA9IGlzaW5zdGFuY2UoKQorCisgICAgIyBDb21iaW5hdGlvbiBtZXJnZWQgYW5kIG5vdCBtZXJnZWQKKyAgICByZXN1bHQgPSBpc2luc3RhbmNlKHZhclsxMl0sIChpbnQsIGZsb2F0KSkgb3IgaXNpbnN0YW5jZSh2YXJbMTJdLCBsaXN0KSAgIyBbY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlXQorCisgICAgIyBub3QgbWVyZ2VkIGJ1dCB2YWxpZAorICAgIHJlc3VsdCA9IGlzaW5zdGFuY2UodmFyWzVdLCBpbnQpIGFuZCB2YXJbNV0gKiAxNCBvciBpc2luc3RhbmNlKHZhcls1XSwgZmxvYXQpIGFuZCB2YXJbNV0gKiAxNC40CisgICAgcmVzdWx0ID0gaXNpbnN0YW5jZSh2YXJbN10sIGludCkgb3Igbm90IGlzaW5zdGFuY2UodmFyWzddLCBmbG9hdCkKKyAgICByZXN1bHQgPSBpc2luc3RhbmNlKHZhcls2XSwgaW50KSBvciBpc2luc3RhbmNlKHZhcls3XSwgZmxvYXQpCisgICAgcmVzdWx0ID0gaXNpbnN0YW5jZSh2YXJbNl0sIGludCkgb3IgaXNpbnN0YW5jZSh2YXJbN10sIGludCkKKyAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfbWVyZ2luZ19pc2luc3RhbmNlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9tZXJnaW5nX2lzaW5zdGFuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MjhmMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfbWVyZ2luZ19pc2luc3RhbmNlLnR4dApAQCAtMCwwICsxLDcgQEAKK2NvbnNpZGVyLW1lcmdpbmctaXNpbnN0YW5jZToxNTo3OmlzaW5zdGFuY2VzOkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgaXNpbnN0YW5jZSBjYWxscyB0byBpc2luc3RhbmNlKHZhclszXSwgKGZsb2F0LCBpbnQpKQorY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlOjE3OjEzOmlzaW5zdGFuY2VzOkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgaXNpbnN0YW5jZSBjYWxscyB0byBpc2luc3RhbmNlKHZhcls0XSwgKGZsb2F0LCBpbnQpKQorY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlOjE5OjEzOmlzaW5zdGFuY2VzOkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgaXNpbnN0YW5jZSBjYWxscyB0byBpc2luc3RhbmNlKHZhcls1XSwgKGZsb2F0LCBpbnQpKQorY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlOjIyOjEzOmlzaW5zdGFuY2VzOkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgaXNpbnN0YW5jZSBjYWxscyB0byBpc2luc3RhbmNlKHZhcls2XSwgKGZsb2F0LCBpbnQpKQorY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlOjIzOjEzOmlzaW5zdGFuY2VzOkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgaXNpbnN0YW5jZSBjYWxscyB0byBpc2luc3RhbmNlKHZhclsxMF0sIChsaXN0LCBzdHIpKQorY29uc2lkZXItbWVyZ2luZy1pc2luc3RhbmNlOjI0OjEzOmlzaW5zdGFuY2VzOkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgaXNpbnN0YW5jZSBjYWxscyB0byBpc2luc3RhbmNlKHZhclsxMV0sIChmbG9hdCwgaW50KSkKK2NvbnNpZGVyLW1lcmdpbmctaXNpbnN0YW5jZTozMDoxMzppc2luc3RhbmNlczpDb25zaWRlciBtZXJnaW5nIHRoZXNlIGlzaW5zdGFuY2UgY2FsbHMgdG8gaXNpbnN0YW5jZSh2YXJbMTJdLCAoZmxvYXQsIGludCwgbGlzdCkpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfc3dhcF92YXJpYWJsZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfc3dhcF92YXJpYWJsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzMjA3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9zd2FwX3ZhcmlhYmxlcy5weQpAQCAtMCwwICsxLDI1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdXNpbmctY29uc3RhbnQtdGVzdAorCithLCBiLCBjLCBkID0gJ2EgYiBjIGQnLnNwbGl0KCkKKwordGVtcCA9IGEgIyBbY29uc2lkZXItc3dhcC12YXJpYWJsZXNdCithID0gYgorYiA9IHRlbXAKKwordGVtcCA9IGEgICMgb25seSBzaW1wbGUgc3dhcHMgYXJlIHJlcG9ydGVkCithID0gYgoraWYgVHJ1ZToKKyAgICBiID0gYQorCit0ZW1wID0gYSAgIyB0aGlzIGlzIG5vIHN3YXAKK2EgPSBiCitiID0gYQorCit0ZW1wID0gYSwgYiAgIyBjb21wbGV4IHN3YXBzIGFyZSBpZ25vcmVkCithLCBiID0gYywgZAorYywgZCA9IHRlbXAKKwordGVtcCA9IGEgIyBbY29uc2lkZXItc3dhcC12YXJpYWJsZXNdCithID0gYiAgIyBsb25nZXIgc3dhcCBjaXJjbGVzIGFyZSBvbmx5IHJlcG9ydGVkIG9uY2UKK2IgPSB0ZW1wCit0ZW1wID0gYQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3N3YXBfdmFyaWFibGVzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9zd2FwX3ZhcmlhYmxlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwOTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl9zd2FwX3ZhcmlhYmxlcy50eHQKQEAgLTAsMCArMSwyIEBACitjb25zaWRlci1zd2FwLXZhcmlhYmxlczo1OjA6OkNvbnNpZGVyIHVzaW5nIHR1cGxlIHVucGFja2luZyBmb3Igc3dhcHBpbmcgdmFyaWFibGVzCitjb25zaWRlci1zd2FwLXZhcmlhYmxlczoyMjowOjpDb25zaWRlciB1c2luZyB0dXBsZSB1bnBhY2tpbmcgZm9yIHN3YXBwaW5nIHZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2RpY3RfY29tcHJlaGVuc2lvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19kaWN0X2NvbXByZWhlbnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwYmU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19kaWN0X2NvbXByZWhlbnNpb24ucHkKQEAgLTAsMCArMSwxMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZQ0KKw0KK251bWJlcnMgPSBbMSwgMiwgMywgNCwgNSwgNl0NCisNCitkaWN0KCkNCisNCitkaWN0KFtdKQ0KKw0KK2RpY3QoWyhudW1iZXIsIG51bWJlcioyKSBmb3IgbnVtYmVyIGluIG51bWJlcnNdKSAgIyBbY29uc2lkZXItdXNpbmctZGljdC1jb21wcmVoZW5zaW9uXQ0KKw0KKyMgQ2Fubm90IGVtaXQgYXMgdGhpcyBjYW5ub3QgYmUgd3JpdHRlbiBhcyBhIGNvbXByZWhlbnNpb24NCitkaWN0KFt2YWx1ZS5zcGxpdCgiPSIpIGZvciB2YWx1ZSBpbiBbImE9YiIsICJjPWQiXV0pDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2RpY3RfY29tcHJlaGVuc2lvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZGljdF9jb21wcmVoZW5zaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJiYjMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2RpY3RfY29tcHJlaGVuc2lvbi50eHQKQEAgLTAsMCArMSBAQAorY29uc2lkZXItdXNpbmctZGljdC1jb21wcmVoZW5zaW9uOjk6MDo6Q29uc2lkZXIgdXNpbmcgYSBkaWN0aW9uYXJ5IGNvbXByZWhlbnNpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19kaWN0X2l0ZW1zLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2RpY3RfaXRlbXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2Yzg2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19kaWN0X2l0ZW1zLnB5CkBAIC0wLDAgKzEsODYgQEAKKyIiIkVtaXQgYSBtZXNzYWdlIGZvciBpdGVyYXRpb24gdGhyb3VnaCBkaWN0IGtleXMgYW5kIHN1YnNjcmlwdGluZyBkaWN0IHdpdGgga2V5LiIiIg0KKyMgcHlsaW50OiBkaXNhYmxlPWxpbmUtdG9vLWxvbmcsbWlzc2luZy1kb2NzdHJpbmcsdW5zdWJzY3JpcHRhYmxlLW9iamVjdCx0b28tZmV3LXB1YmxpYy1tZXRob2RzDQorDQorZGVmIGJhZCgpOg0KKyAgICBhX2RpY3QgPSB7MTogMSwgMjogMiwgMzogM30NCisgICAgZm9yIGsgaW4gYV9kaWN0OiAgIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10NCisgICAgICAgIHByaW50KGFfZGljdFtrXSkNCisgICAgYW5vdGhlcl9kaWN0ID0gZGljdCgpDQorICAgIGZvciBrIGluIGFub3RoZXJfZGljdDogICMgW2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXNdDQorICAgICAgICBwcmludChhbm90aGVyX2RpY3Rba10pDQorDQorDQorZGVmIGdvb2QoKToNCisgICAgYV9kaWN0ID0gezE6IDEsIDI6IDIsIDM6IDN9DQorICAgIGZvciBrIGluIGFfZGljdDoNCisgICAgICAgIHByaW50KGspDQorDQorb3V0X29mX3Njb3BlX2RpY3QgPSBkaWN0KCkNCisNCitkZWYgYW5vdGhlcl9iYWQoKToNCisgICAgZm9yIGsgaW4gb3V0X29mX3Njb3BlX2RpY3Q6ICAjIFtjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zXQ0KKyAgICAgICAgcHJpbnQob3V0X29mX3Njb3BlX2RpY3Rba10pDQorDQorZGVmIGFub3RoZXJfZ29vZCgpOg0KKyAgICBmb3IgayBpbiBvdXRfb2Zfc2NvcGVfZGljdDoNCisgICAgICAgIGsgPSAxDQorICAgICAgICBrID0gMg0KKyAgICAgICAgayA9IDMNCisgICAgICAgIHByaW50KG91dF9vZl9zY29wZV9kaWN0W2tdKQ0KKw0KKw0KK2JfZGljdCA9IHt9DQorZm9yIGsyIGluIGJfZGljdDogICMgU2hvdWxkIG5vdCBlbWl0IHdhcm5pbmcsIGtleSBhY2Nlc3MgbmVjZXNzYXJ5DQorICAgIGJfZGljdFtrMl0gPSAyDQorDQorZm9yIGsyIGluIGJfZGljdDogICMgU2hvdWxkIG5vdCBlbWl0IHdhcm5pbmcsIGtleSBhY2Nlc3MgbmVjZXNzYXJ5IChBdWdBc3NpZ24pDQorICAgIGJfZGljdFtrMl0gKz0gMg0KKw0KKyMgV2FybmluZyBzaG91bGQgYmUgZW1pdHRlZCBpbiB0aGlzIGNhc2UNCitmb3IgazYgaW4gYl9kaWN0OiAgIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10NCisgICAgdmFsID0gYl9kaWN0W2s2XQ0KKyAgICBiX2RpY3RbazZdID0gMg0KKw0KK2ZvciBrMyBpbiBiX2RpY3Q6ICAjIFtjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zXQ0KKyAgICB2YWwgPSBiX2RpY3RbazNdDQorDQorZm9yIGs0IGluIGJfZGljdC5rZXlzKCk6ICAjIFtjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeSxjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zXQ0KKyAgICB2YWwgPSBiX2RpY3RbazRdDQorDQorY2xhc3MgRm9vOg0KKyAgICBjX2RpY3QgPSB7fQ0KKw0KKyMgU2hvdWxkIGVtaXQgd2FybmluZyB3aGVuIGl0ZXJhdGluZyBvdmVyIGEgZGljdCBhdHRyaWJ1dGUgb2YgYSBjbGFzcw0KK2ZvciBrNSBpbiBGb28uY19kaWN0OiAgIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10NCisgICAgdmFsID0gRm9vLmNfZGljdFtrNV0NCisNCitjX2RpY3QgPSB7fQ0KKw0KKyMgU2hvdWxkIE5PVCBlbWl0IHdhcm5pbmcgd2hleSBrZXkgdXNlZCB0byBhY2Nlc3MgYSBkaWZmZXJlbnQgZGljdA0KK2ZvciBrNSBpbiBGb28uY19kaWN0OiAgIyBUaGlzIGlzIGZpbmUNCisgICAgdmFsID0gYl9kaWN0W2s1XQ0KKw0KK2ZvciBrNSBpbiBGb28uY19kaWN0OiAgIyBUaGlzIGlzIGZpbmUNCisgICAgdmFsID0gY19kaWN0W2s1XQ0KKw0KKyMgU2hvdWxkIGVtaXQgd2FybmluZyB3aXRoaW4gYSBsaXN0L2RpY3QgY29tcHJlaGVuc2lvbg0KK3ZhbCA9IHtrOTogYl9kaWN0W2s5XSBmb3IgazkgaW4gYl9kaWN0fSAgIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10NCit2YWwgPSBbKGs3LCBiX2RpY3RbazddKSBmb3IgazcgaW4gYl9kaWN0XSAgIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10NCisNCisjIFNob3VsZCBlbWl0IHdhcm5pbmcgZXZlbiB3aGVuIHVzaW5nIGRpY3QgYXR0cmlidXRlIG9mIGEgY2xhc3Mgd2l0aGluIGNvbXByZWhlbnNpb24NCit2YWwgPSBbKGs3LCBGb28uY19kaWN0W2s3XSkgZm9yIGs3IGluIEZvby5jX2RpY3RdICAjIFtjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zXQ0KK3ZhbCA9IGFueShUcnVlIGZvciBrOCBpbiBGb28uY19kaWN0IGlmIEZvby5jX2RpY3RbazhdKSAgIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10NCisNCisjIFNob3VsZCBlbWl0IHdhcm5pbmcgd2hlbiBkaWN0IGFjY2VzcyBkb25lIGluIGBgaWZgYCBwb3J0aW9uIG9mIGNvbXByZWhlbnNpb24NCit2YWwgPSBhbnkoVHJ1ZSBmb3IgazggaW4gYl9kaWN0IGlmIGJfZGljdFtrOF0pICAjIFtjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zXQ0KKw0KKyMgU2hvdWxkIE5PVCBlbWl0IHdhcm5pbmcgd2hleSBrZXkgdXNlZCB0byBhY2Nlc3MgYSBkaWZmZXJlbnQgZGljdA0KK3ZhbCA9IFsoazcsIGJfZGljdFtrN10pIGZvciBrNyBpbiBGb28uY19kaWN0XQ0KK3ZhbCA9IGFueShUcnVlIGZvciBrOCBpbiBGb28uY19kaWN0IGlmIGJfZGljdFtrOF0pDQorDQorIyBTaG91bGQgTk9UIGVtaXQgd2FybmluZywgZXNzZW50aWFsbHkgc2FtZSBjaGVjayBhcyBhYm92ZQ0KK3ZhbCA9IFsoazcsIGNfZGljdFtrN10pIGZvciBrNyBpbiBGb28uY19kaWN0XQ0KK3ZhbCA9IGFueShUcnVlIGZvciBrOCBpbiBGb28uY19kaWN0IGlmIGNfZGljdFtrOF0pDQorDQorIyBTaG91bGQgZW1pdCB3YXJuaW5nLCB1c2luZyAua2V5cygpIG9mIEZvby5jX2RpY3QNCit2YWwgPSBhbnkoVHJ1ZSBmb3IgazggaW4gRm9vLmNfZGljdC5rZXlzKCkgaWYgRm9vLmNfZGljdFtrOF0pICAjIFtjb25zaWRlci1pdGVyYXRpbmctZGljdGlvbmFyeSxjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zXQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19kaWN0X2l0ZW1zLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19kaWN0X2l0ZW1zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWFkODIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2RpY3RfaXRlbXMudHh0CkBAIC0wLDAgKzEsMTUgQEAKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6Njo0OmJhZDpDb25zaWRlciBpdGVyYXRpbmcgd2l0aCAuaXRlbXMoKQorY29uc2lkZXItdXNpbmctZGljdC1pdGVtczo5OjQ6YmFkOkNvbnNpZGVyIGl0ZXJhdGluZyB3aXRoIC5pdGVtcygpCitjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zOjIxOjQ6YW5vdGhlcl9iYWQ6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NDA6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NDQ6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5OjQ3OjEwOjpDb25zaWRlciBpdGVyYXRpbmcgdGhlIGRpY3Rpb25hcnkgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIC5rZXlzKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NDc6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NTQ6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6Njc6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6Njg6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NzE6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NzI6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6NzU6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKK2NvbnNpZGVyLWl0ZXJhdGluZy1kaWN0aW9uYXJ5Ojg2OjI1OjpDb25zaWRlciBpdGVyYXRpbmcgdGhlIGRpY3Rpb25hcnkgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxsaW5nIC5rZXlzKCkKK2NvbnNpZGVyLXVzaW5nLWRpY3QtaXRlbXM6ODY6MDo6Q29uc2lkZXIgaXRlcmF0aW5nIHdpdGggLml0ZW1zKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19lbnVtZXJhdGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZW51bWVyYXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjQ5NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZW51bWVyYXRlLnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIkVtaXQgYSBtZXNzYWdlIGZvciBpdGVyYXRpb24gdGhyb3VnaCByYW5nZSBhbmQgbGVuIGlzIGVuY291bnRlcmVkLiIiIg0KKw0KKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCB1bnN1YnNjcmlwdGFibGUtb2JqZWN0LCB0b28tZmV3LXB1YmxpYy1tZXRob2RzDQorDQorZGVmIGJhZCgpOg0KKyAgICBpdGVyYWJsZSA9IFsxLCAyLCAzXQ0KKyAgICBmb3Igb2JqIGluIHJhbmdlKGxlbihpdGVyYWJsZSkpOiAjIFtjb25zaWRlci11c2luZy1lbnVtZXJhdGVdDQorICAgICAgICB5aWVsZCBpdGVyYWJsZVtvYmpdDQorICAgIGZvciBvYmogaW4gcmFuZ2UoMCwgbGVuKGl0ZXJhYmxlKSk6ICMgW2NvbnNpZGVyLXVzaW5nLWVudW1lcmF0ZV0NCisgICAgICAgIHlpZWxkIGl0ZXJhYmxlW29ial0NCisNCisNCitjbGFzcyBCYWQob2JqZWN0KToNCisNCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOg0KKyAgICAgICAgaXRlcmFibGUgPSBbMSwgMiwgM10NCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVyYWJsZSkpOiAjIFtjb25zaWRlci11c2luZy1lbnVtZXJhdGVdDQorICAgICAgICAgICAgeWllbGQgaXRlcmFibGVbaV0NCisNCisgICAgZGVmIHRlc3Qoc2VsZik6DQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZikpOiAjIFtjb25zaWRlci11c2luZy1lbnVtZXJhdGVdDQorICAgICAgICAgICAgeWllbGQgc2VsZltpXQ0KKw0KKw0KK2RlZiBnb29kKCk6DQorICAgIGl0ZXJhYmxlID0gb3RoZXJfb2JqID0gWzEsIDIsIDNdDQorICAgIHRvdGFsID0gMA0KKyAgICBmb3Igb2JqIGluIHJhbmdlKGxlbihpdGVyYWJsZSkpOg0KKyAgICAgICAgdG90YWwgKz0gb2JqDQorICAgICAgICB5aWVsZCB0b3RhbA0KKyAgICAgICAgeWllbGQgaXRlcmFibGVbb2JqICsgMTogMl0NCisgICAgICAgIHlpZWxkIGl0ZXJhYmxlW2xlbihvYmopXQ0KKyAgICBmb3Igb2JqIGluIGl0ZXJhYmxlOg0KKyAgICAgICAgeWllbGQgaXRlcmFibGVbb2JqIC0gMV0NCisNCisgICAgZm9yIGluZGV4LCBvYmogaW4gZW51bWVyYXRlKGl0ZXJhYmxlKToNCisgICAgICAgIHlpZWxkIGl0ZXJhYmxlW2luZGV4XQ0KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMCwgMTApOg0KKyAgICAgICAgeWllbGQgaXRlcmFibGVbaW5kZXggKyAxXQ0KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMTApOg0KKyAgICAgICAgeWllbGQgaXRlcmFibGVbaW5kZXhdDQorICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oWzEsIDIsIDMsIDRdKSk6DQorICAgICAgICB5aWVsZCBpbmRleA0KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMSwgbGVuKGl0ZXJhYmxlKSk6DQorICAgICAgICB5aWVsZCBpbmRleA0KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKGl0ZXJhYmxlKSk6DQorICAgICAgICB5aWVsZCBbMSwgMiwgM11baW5kZXhdDQorICAgICAgICB5aWVsZCBsZW4oWzEsIDIsIDNdKQ0KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKGl0ZXJhYmxlKSk6DQorICAgICAgICB5aWVsZCBvdGhlcl9vYmpbaW5kZXhdDQorDQorICAgICMgcHlsaW50OiBkaXNhYmxlPWltcG9ydC1vdXRzaWRlLXRvcGxldmVsDQorICAgIGZyb20gdW5rbm93biBpbXBvcnQgdW5rbm93bg0KKyAgICBmb3IgaW5kZXggaW4gcmFuZ2UodW5rbm93bihpdGVyYWJsZSkpOg0KKyAgICAgICAgeWllbGQgaXRlcmFibGVbaW5kZXhdDQorDQorICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oaXRlcmFibGUpKToNCisgICAgICAgIGRlZiB0ZXN0KGl0ZXJhYmxlKToNCisgICAgICAgICAgICByZXR1cm4gaXRlcmFibGVbaW5kZXhdDQorICAgICAgICB5aWVsZCB0ZXN0KFsxLCAyLCAzXSkNCisNCisNCitjbGFzcyBHb29kKG9iamVjdCk6DQorDQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToNCisgICAgICAgICMgU2hvdWxkIG5vdCBzdWdnZXN0IGVudW1lcmF0ZSBvbiBzZWxmDQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZikpOg0KKyAgICAgICAgICAgIHlpZWxkIHNlbGZbaV0NCisNCisNCitkZWYgZG9lc19ub3RfY3Jhc2hfb25fcmFuZ2Vfd2l0aG91dF9hcmdzKCk6DQorICAgIGZvciBlbGVtIGluIHJhbmdlKCk6DQorICAgICAgICBwcmludChlbGVtKQ0KKw0KKyMgRmFsc2UgbmVnYXRpdmUgZGVzY3JpYmVkIGluICMzNjU3DQorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zNjU3DQorY2xhc3MgTXlDbGFzcyhvYmplY3QpOg0KKyAgICBkZWYgX19pbml0X18oc2VsZik6DQorICAgICAgICBzZWxmLm15X2xpc3QgPSBbXQ0KKw0KK215X29iaiA9IE15Q2xhc3MoKQ0KK2RlZiBteV9mdW5jdGlvbihpbnN0YW5jZTogTXlDbGFzcyk6DQorICAgIGZvciBpIGluIHJhbmdlKGxlbihpbnN0YW5jZS5teV9saXN0KSk6ICAjIFtjb25zaWRlci11c2luZy1lbnVtZXJhdGVdDQorICAgICAgICB2YXIgPSBpbnN0YW5jZS5teV9saXN0W2ldDQorICAgICAgICBwcmludCh2YXIpDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2VudW1lcmF0ZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZW51bWVyYXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQ3Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2VudW1lcmF0ZS50eHQKQEAgLTAsMCArMSw1IEBACitjb25zaWRlci11c2luZy1lbnVtZXJhdGU6Nzo0OmJhZDpDb25zaWRlciB1c2luZyBlbnVtZXJhdGUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgd2l0aCByYW5nZSBhbmQgbGVuCitjb25zaWRlci11c2luZy1lbnVtZXJhdGU6OTo0OmJhZDpDb25zaWRlciB1c2luZyBlbnVtZXJhdGUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgd2l0aCByYW5nZSBhbmQgbGVuCitjb25zaWRlci11c2luZy1lbnVtZXJhdGU6MTc6ODpCYWQuX19pdGVyX186Q29uc2lkZXIgdXNpbmcgZW51bWVyYXRlIGluc3RlYWQgb2YgaXRlcmF0aW5nIHdpdGggcmFuZ2UgYW5kIGxlbgorY29uc2lkZXItdXNpbmctZW51bWVyYXRlOjIxOjg6QmFkLnRlc3Q6Q29uc2lkZXIgdXNpbmcgZW51bWVyYXRlIGluc3RlYWQgb2YgaXRlcmF0aW5nIHdpdGggcmFuZ2UgYW5kIGxlbgorY29uc2lkZXItdXNpbmctZW51bWVyYXRlOjgzOjQ6bXlfZnVuY3Rpb246Q29uc2lkZXIgdXNpbmcgZW51bWVyYXRlIGluc3RlYWQgb2YgaXRlcmF0aW5nIHdpdGggcmFuZ2UgYW5kIGxlbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2dlbmVyYXRvci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkYjM0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxMSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZQorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zMTY1CisKK2xpc3QoW10pCit0dXBsZShbXSkKKworbGlzdChbMCBmb3IgeSBpbiBsaXN0KHJhbmdlKDEwKSldKSAjIFtjb25zaWRlci11c2luZy1nZW5lcmF0b3JdCit0dXBsZShbMCBmb3IgeSBpbiBsaXN0KHJhbmdlKDEwKSldKSAjIFtjb25zaWRlci11c2luZy1nZW5lcmF0b3JdCisKK2xpc3QoMCBmb3IgeSBpbiBsaXN0KHJhbmdlKDEwKSkpCit0dXBsZSgwIGZvciB5IGluIGxpc3QocmFuZ2UoMTApKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19nZW5lcmF0b3IudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2dlbmVyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYzVhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19nZW5lcmF0b3IudHh0CkBAIC0wLDAgKzEsMiBAQAorY29uc2lkZXItdXNpbmctZ2VuZXJhdG9yOjc6MDo6Q29uc2lkZXIgdXNpbmcgYSBnZW5lcmF0b3IgaW5zdGVhZCAnbGlzdCgwIGZvciB5IGluIGxpc3QocmFuZ2UoMTApKSknCitjb25zaWRlci11c2luZy1nZW5lcmF0b3I6ODowOjpDb25zaWRlciB1c2luZyBhIGdlbmVyYXRvciBpbnN0ZWFkICd0dXBsZSgwIGZvciB5IGluIGxpc3QocmFuZ2UoMTApKSknCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZ2V0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2dldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjNjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2dldC5weQpAQCAtMCwwICsxLDkwIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdXNpbmctY29uc3RhbnQtdGVzdCxpbnZhbGlkLXNlcXVlbmNlLWluZGV4LHVuZGVmaW5lZC12YXJpYWJsZQorZGljdGlvbmFyeSA9IGRpY3QoKQora2V5ID0gJ2tleScKKworaWYgJ2tleScgaW4gZGljdGlvbmFyeTogICMgW2NvbnNpZGVyLXVzaW5nLWdldF0KKyAgICB2YXJpYWJsZSA9IGRpY3Rpb25hcnlbJ2tleSddCisKK2lmICdrZXknIGluIGRpY3Rpb25hcnk6ICAjIFtjb25zaWRlci11c2luZy1nZXRdCisgICAgdmFyaWFibGUgPSBkaWN0aW9uYXJ5WydrZXknXQorZWxzZToKKyAgICB2YXJpYWJsZSA9ICdkZWZhdWx0JworCitpZiBrZXkgaW4gZGljdGlvbmFyeTogICMgW2NvbnNpZGVyLXVzaW5nLWdldF0KKyAgICB2YXJpYWJsZSA9IGRpY3Rpb25hcnlba2V5XQorCitpZiAna2V5JyBpbiBkaWN0aW9uYXJ5OiAgIyBub3QgYWNjZXNzaW5nIHRoZSBkaWN0aW9uYXJ5IGluIGFzc2lnbm1lbnQKKyAgICB2YXJpYWJsZSA9ICJzdHJpbmciCisKK2lmICdrZXknIGluIGRpY3Rpb25hcnk6ICAjIGlzIGEgbWF0Y2gsIGJ1dCBub3Qgb2J2aW91cyBhbmQgd2UgaWdub3JlIGl0IGZvciBub3cKKyAgICB2YXJpYWJsZSA9IGRpY3Rpb25hcnlba2V5XQorCitpZiAna2V5MScgaW4gZGljdGlvbmFyeTogICMgZGljdGlvbmFyeSBxdWVycmllZCBmb3Igd3Jvbmcga2V5CisgICAgdmFyaWFibGUgPSBkaWN0aW9uYXJ5WydrZXkyJ10KKworaWYgJ2tleScgaW4gZGljdGlvbmFyeTogICMgYm9keSBpcyBub3QgcHVyZQorICAgIHZhcmlhYmxlID0gZGljdGlvbmFyeVsna2V5J10KKyAgICBwcmludCgnZm91bmQnKQorCitpZiAna2V5JyBpbiBkaWN0aW9uYXJ5OiAgIyBib2R5IGlzIG5vdCBwdXJlCisgICAgdmFyaWFibGUgPSBkaWN0aW9uYXJ5WydrZXknXQorICAgIHByaW50KCdmb3VuZCcpCitlbHNlOgorICAgIHZhcmlhYmxlID0gJ2RlZmF1bHQnCisKK2lmICdrZXknIGluIGRpY3Rpb25hcnkxOiAgIyBkaWZmZXJlbnQgZGljdGlvbmFyaWVzCisgICAgdmFyaWFibGUgPSBkaWN0aW9uYXJ5Mlsna2V5J10KK2Vsc2U6CisgICAgdmFyaWFibGUgPSAnZGVmYXVsdCcKKworaWYgJ2tleScgaW4gZGljdGlvbmFyeTogICMgYm9keSBpcyBub3QgcHVyZQorICAgIHZhcmlhYmxlID0gZGljdGlvbmFyeVsna2V5J10KK2Vsc2U6CisgICAgdmFyaWFibGUgPSAnZGVmYXVsdCcKKyAgICBwcmludCgnZm91bmQnKQorCitpZiAna2V5JyBpbiBkaWN0aW9uYXJ5OiAgIyBkaWZmZXJlbnQgdmFyaWFibGVzCisgICAgdmFyaWFibGUxID0gZGljdGlvbmFyeVsna2V5J10KK2Vsc2U6CisgICAgdmFyaWFibGUyID0gJ2RlZmF1bHQnCisKK2lmICdrZXknIGluIGRpY3Rpb25hcnk6ICAjIGFzc2lnbm1lbnQgaXMgbm90IHNpbXBsZQorICAgIHZhcmlhYmxlMSA9IHZhcmlhYmxlMiA9IGRpY3Rpb25hcnlbJ2tleSddCisKK2lmICdrZXknIGluIGRpY3Rpb25hcnk6ICAjIGFzc2lnbm1lbnQgaXMgbm90IHNpbXBsZQorICAgIHZhcmlhYmxlMSA9IGRpY3Rpb25hcnlbJ2tleSddCitlbHNlOgorICAgIHZhcmlhYmxlMSA9IHZhcmlhYmxlMiA9ICJkZWZhdWx0IgorCitpZiAnd29yZCcgaW4gJ3RleHQnOgorICAgIHZhcmlhYmxlID0gJ3RleHQnWyd3b3JkJ10gICMgYWxyZWFkeSBib2d1cywgYnV0IHRvIGFzc2VydCB0aGF0IHRoaXMgb25seSB3b3JrcyB3aXRoIGRpY3Rpb25hcmllcworCitpZiAnd29yZCcgaW4gZGljdGlvbmFyeToKKyAgICB2YXJpYWJsZSA9ICdkaWN0aW9uYXJ5J1snd29yZCddCisKK2lmICdrZXkxJyBpbiBkaWN0aW9uYXJ5OiAgIyBub3QgdGhlIHNpbXBsZSBjYXNlCisgICAgdmFyaWFibGUgPSBkaWN0aW9uYXJ5WydrZXkxJ10KK2VsaWYgJ2tleTInIGluIGRpY3Rpb25hcnk6ICAjIFtjb25zaWRlci11c2luZy1nZXRdCisgICAgdmFyaWFibGUgPSBkaWN0aW9uYXJ5WydrZXkyJ10KK2Vsc2U6CisgICAgdmFyaWFibGUgPSAnZGVmYXVsdCcKKworaWYgJ2tleScgaW4gZGljdGlvbmFyeSBhbmQgYm9vbChrZXkpOiAgIyBub3QgYSBzaW1wbGUgY29tcGFyZQorICAgIHZhcmlhYmxlID0gZGljdGlvbmFyeVsna2V5MSddCitlbHNlOgorICAgIHZhcmlhYmxlID0gJ2RlZmF1bHQnCisKK2lmIGJvb2woa2V5KSBhbmQgJ2tleScgaW4gZGljdGlvbmFyeTogICMgbm90IGEgc2ltcGxlIGNvbXBhcmUKKyAgICB2YXJpYWJsZSA9IGRpY3Rpb25hcnlbJ2tleTEnXQorZWxzZToKKyAgICB2YXJpYWJsZSA9ICdkZWZhdWx0JworCisKK2QxID0geydmb28nOiBOb25lfQorZDIgPSB7fQorIyBDYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgdXNpbmcgLmdldCgpCitpZiAnZm9vJyBpbiBkMToKKyAgICBkMlsnYmFyJ10gPSBkMVsnZm9vJ10KKworaWYgJ2tleScgaW4gZGljdGlvbmFyeToKKyAgICB2YXJpYWJsZSA9IGRpY3Rpb25hcnlbMTpdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZ2V0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19nZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1N2I0YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfZ2V0LnR4dApAQCAtMCwwICsxLDQgQEAKK2NvbnNpZGVyLXVzaW5nLWdldDo1OjA6OkNvbnNpZGVyIHVzaW5nIGRpY3QuZ2V0IGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIGEgZGljdCBpZiBhIGtleSBpcyBwcmVzZW50IG9yIGEgZGVmYXVsdCBpZiBub3QKK2NvbnNpZGVyLXVzaW5nLWdldDo4OjA6OkNvbnNpZGVyIHVzaW5nIGRpY3QuZ2V0IGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIGEgZGljdCBpZiBhIGtleSBpcyBwcmVzZW50IG9yIGEgZGVmYXVsdCBpZiBub3QKK2NvbnNpZGVyLXVzaW5nLWdldDoxMzowOjpDb25zaWRlciB1c2luZyBkaWN0LmdldCBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBhIGRpY3QgaWYgYSBrZXkgaXMgcHJlc2VudCBvciBhIGRlZmF1bHQgaWYgbm90Citjb25zaWRlci11c2luZy1nZXQ6Njc6MDo6Q29uc2lkZXIgdXNpbmcgZGljdC5nZXQgZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gYSBkaWN0IGlmIGEga2V5IGlzIHByZXNlbnQgb3IgYSBkZWZhdWx0IGlmIG5vdApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2luLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2luLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjhhYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfaW4ucHkKQEAgLTAsMCArMSw0NiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZSwgcG9pbnRsZXNzLXN0YXRlbWVudCwgbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQsIHVuZGVmaW5lZC12YXJpYWJsZSwgbGl0ZXJhbC1jb21wYXJpc29uLCBsaW5lLXRvby1sb25nLCB1bm5lZWRlZC1ub3QKKwordmFsdWUgPSB2YWx1ZTEgPSAxCit2YWx1ZTIgPSAyCithX3NldCA9IHsxLCAyLCAzfQorYV9saXN0ID0gWzEsIDIsIDNdCithX3N0ciA9ICcxJworCisjIFBvc2l0aXZlCit2YWx1ZSA9PSAxIG9yIHZhbHVlID09IDEgICMgW2NvbnNpZGVyLXVzaW5nLWluXQordmFsdWUgPT0gMSBvciB2YWx1ZSA9PSAyICAjIFtjb25zaWRlci11c2luZy1pbl0KKyd2YWx1ZScgPT0gdmFsdWUgb3IgJ3ZhbHVlJyA9PSB2YWx1ZSAgIyBbY29uc2lkZXItdXNpbmctaW5dCit2YWx1ZSA9PSAxIG9yIHZhbHVlID09IHVuZGVmX3ZhbHVlICAjIFtjb25zaWRlci11c2luZy1pbl0KK3ZhbHVlID09IDEgb3IgdmFsdWUgPT0gMiBvciB2YWx1ZSA9PSAzICAjIFtjb25zaWRlci11c2luZy1pbl0KK3ZhbHVlID09ICcyJyBvciB2YWx1ZSA9PSAxICAjIFtjb25zaWRlci11c2luZy1pbl0KKzEgPT0gdmFsdWUgb3IgMiA9PSB2YWx1ZSAgIyBbY29uc2lkZXItdXNpbmctaW5dCisxID09IHZhbHVlIG9yIHZhbHVlID09IDIgICMgW2NvbnNpZGVyLXVzaW5nLWluXQordmFsdWUgPT0gMSBvciB2YWx1ZSA9PSBhX2xpc3QgICMgW2NvbnNpZGVyLXVzaW5nLWluXQordmFsdWUgPT0gYV9zZXQgb3IgdmFsdWUgPT0gYV9saXN0IG9yIHZhbHVlID09IGFfc3RyICAjIFtjb25zaWRlci11c2luZy1pbl0KK3ZhbHVlICE9IDEgYW5kIHZhbHVlICE9IDIgICMgW2NvbnNpZGVyLXVzaW5nLWluXQordmFsdWUxID09IHZhbHVlMiBvciB2YWx1ZTIgPT0gdmFsdWUxICAjIFtjb25zaWRlci11c2luZy1pbl0KK2FfbGlzdCA9PSBbMSwgMiwgM10gb3IgYV9saXN0ID09IFtdICAjIFtjb25zaWRlci11c2luZy1pbl0KKworIyBOZWdhdGl2ZQordmFsdWUgIT0gMSBvciB2YWx1ZSAhPSAyICAjIG5vdCBhICJub3QgaW4iLWNhc2UgYmVjYXVzZSBvZiAib3IiCit2YWx1ZSA9PSAxIGFuZCB2YWx1ZSA9PSAyICAjIG5vdCBhICJpbiItY2FzZSBiZWNhdXNlIG9mICJhbmQiCit2YWx1ZSA9PSAxIGFuZCB2YWx1ZSA9PSAyIG9yIHZhbHVlID09IDMgICMgbm90IG9ubHkgJ29yJ3MKK3ZhbHVlID09IDEgb3IgdmFsdWUgPT0gMiBvciAzIDwgdmFsdWUgPCA0ICAjIG5vdCBvbmx5ICc9PScKK3ZhbHVlID09IDEgICMgdmFsdWUgbm90IGNoZWNrZWQgYWdhaW5zdCBtdWx0aXBsZSB2YWx1ZXMKK3ZhbHVlID09IDEgb3IgdmFsdWUgPT0gMiBvciB2YWx1ZSA9PSAzIGFuZCB2YWx1ZSA9PSA0ICAjIG5vdCBhbGwgY2hlY2tzIGFyZSBjb25jYXRlbmF0ZWQgd2l0aCAnb3InCit2YWx1ZSA9PSAxIG9yIDIgPCB2YWx1ZSA8IDMgICMgbGVuZ3RoIG9mICdvcHMnICE9IDEgZm9yIHNlY29uZCBjaGVjawordmFsdWUgaXMgMSBvciB2YWx1ZSBpcyAyICAjICdpbicgY29tcGFyZXMgdXNpbmcgJz09JyBub3QgJ2lzJyBhbmQgdGhlcmVmb3JlIG5vdCBjb25zaWRlcmVkCitub3QgdmFsdWUgPT0gMSBhbmQgbm90IHZhbHVlID09IDIKK3ZhbHVlMSA9PSAxIG9yIHZhbHVlMiA9PSAyICAjIGRpZmZlcmVudCB2YXJpYWJsZXMgYW5kIG9ubHkgb25lIGNvbXBhcmlzb24gZm9yIGVhY2gKK3ZhbHVlMSA9PSB2YWx1ZTIgPT0gMSBvciB2YWx1ZTEgPT0gMiAgIyBub3QgY2hlY2tpbmcgbXVsdGktY29tcGFyZXMgZm9yICc9PScKK3ZhbHVlMSAhPSAxID09IHZhbHVlMiBhbmQgdmFsdWUyICE9IHZhbHVlMSAhPSAyICAjIG5vdCBjaGVja2luZyBtdWx0aS1jb21wYXJlcyBmb3IgJyE9JwordmFsdWUxID09IDEgb3IgdmFsdWUxID09IHZhbHVlMiBvciB2YWx1ZTIgPT0gMyAgIyB2YWx1ZTEgb3IgdmFsdWUyIGRvIG5vdCBvY2N1ciBpbiBldmVyeSBjaGVjawordmFsdWUxID09IDEgb3IgdmFsdWUxID09IDIgb3IgdmFsdWUyID09IDEgb3IgdmFsdWUyID09IDIgICMgdmFsdWUxIG9yIHZhbHVlMiBkbyBub3Qgb2NjdXIgaW4gZXZlcnkgY2hlY2sKKyd2YWx1ZScgPT0gMSBvciAndmFsdWUnID09IDIgICMgb25seSBkZXRlY3QgdmFyaWFibGVzIGZvciBub3cKKworCitkZWYgb29wcygpOgorICAgIHJldHVybiA1IC8gMAorCisKK3NvbWVfdmFsdWUgPSB2YWx1ZSA9PSA0IG9yIHZhbHVlID09IDUgb3IgdmFsdWUgPT0gb29wcygpICMgV2Ugb25seSBsb29rIGZvciBuYW1lcyBhbmQgY29uc3RhbnRzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfaW4udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2luLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U1ZmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX2luLnR4dApAQCAtMCwwICsxLDEzIEBACitjb25zaWRlci11c2luZy1pbjoxMDowOjoiQ29uc2lkZXIgbWVyZ2luZyB0aGVzZSBjb21wYXJpc29ucyB3aXRoICIiaW4iIiB0byAndmFsdWUgaW4gKDEsKSciCitjb25zaWRlci11c2luZy1pbjoxMTowOjoiQ29uc2lkZXIgbWVyZ2luZyB0aGVzZSBjb21wYXJpc29ucyB3aXRoICIiaW4iIiB0byAndmFsdWUgaW4gKDEsIDIpJyIKK2NvbnNpZGVyLXVzaW5nLWluOjEyOjA6OiJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGNvbXBhcmlzb25zIHdpdGggIiJpbiIiIHRvICIidmFsdWUgaW4gKCd2YWx1ZScsKSIiIgorY29uc2lkZXItdXNpbmctaW46MTM6MDo6IkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgY29tcGFyaXNvbnMgd2l0aCAiImluIiIgdG8gJ3ZhbHVlIGluICgxLCB1bmRlZl92YWx1ZSknIgorY29uc2lkZXItdXNpbmctaW46MTQ6MDo6IkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgY29tcGFyaXNvbnMgd2l0aCAiImluIiIgdG8gJ3ZhbHVlIGluICgxLCAyLCAzKSciCitjb25zaWRlci11c2luZy1pbjoxNTowOjoiQ29uc2lkZXIgbWVyZ2luZyB0aGVzZSBjb21wYXJpc29ucyB3aXRoICIiaW4iIiB0byAiInZhbHVlIGluICgnMicsIDEpIiIiCitjb25zaWRlci11c2luZy1pbjoxNjowOjoiQ29uc2lkZXIgbWVyZ2luZyB0aGVzZSBjb21wYXJpc29ucyB3aXRoICIiaW4iIiB0byAndmFsdWUgaW4gKDEsIDIpJyIKK2NvbnNpZGVyLXVzaW5nLWluOjE3OjA6OiJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGNvbXBhcmlzb25zIHdpdGggIiJpbiIiIHRvICd2YWx1ZSBpbiAoMSwgMiknIgorY29uc2lkZXItdXNpbmctaW46MTg6MDo6IkNvbnNpZGVyIG1lcmdpbmcgdGhlc2UgY29tcGFyaXNvbnMgd2l0aCAiImluIiIgdG8gJ3ZhbHVlIGluICgxLCBhX2xpc3QpJyIKK2NvbnNpZGVyLXVzaW5nLWluOjE5OjA6OiJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGNvbXBhcmlzb25zIHdpdGggIiJpbiIiIHRvICd2YWx1ZSBpbiAoYV9zZXQsIGFfbGlzdCwgYV9zdHIpJyIKK2NvbnNpZGVyLXVzaW5nLWluOjIwOjA6OiJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGNvbXBhcmlzb25zIHdpdGggIiJpbiIiIHRvICd2YWx1ZSBub3QgaW4gKDEsIDIpJyIKK2NvbnNpZGVyLXVzaW5nLWluOjIxOjA6OiJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGNvbXBhcmlzb25zIHdpdGggIiJpbiIiIHRvICd2YWx1ZTEgaW4gKHZhbHVlMiwpJyIKK2NvbnNpZGVyLXVzaW5nLWluOjIyOjA6OiJDb25zaWRlciBtZXJnaW5nIHRoZXNlIGNvbXBhcmlzb25zIHdpdGggIiJpbiIiIHRvICdhX2xpc3QgaW4gKFsxLCAyLCAzXSwgW10pJyIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19taW5fbWF4X2J1aWx0aW4ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfbWluX21heF9idWlsdGluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2M3YjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfbWluX21heF9idWlsdGluLnB5CkBAIC0wLDAgKzEsMTA3IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCByZWRlZmluZWQtb3V0ZXItbmFtZQorCit2YWx1ZSA9IDEwCit2YWx1ZTIgPSAwCit2YWx1ZTMgPSAzCisKKyMgUG9zaXRpdmUKK2lmIHZhbHVlIDwgMTA6ICAjIFtjb25zaWRlci11c2luZy1tYXgtYnVpbHRpbl0KKyAgICB2YWx1ZSA9IDEwCisKK2lmIHZhbHVlID49IDEwOiAgIyBbY29uc2lkZXItdXNpbmctbWluLWJ1aWx0aW5dCisgICAgdmFsdWUgPSAxMAorCitpZiB2YWx1ZSA8PSAxMDogICMgW2NvbnNpZGVyLXVzaW5nLW1heC1idWlsdGluXQorICAgIHZhbHVlID0gMTAKKworaWYgdmFsdWUgPiAxMDogICMgW2NvbnNpZGVyLXVzaW5nLW1pbi1idWlsdGluXQorICAgIHZhbHVlID0gMTAKKworaWYgdmFsdWUgPCB2YWx1ZTI6ICAjIFtjb25zaWRlci11c2luZy1tYXgtYnVpbHRpbl0KKyAgICB2YWx1ZSA9IHZhbHVlMgorCitpZiB2YWx1ZSA+IHZhbHVlMjogICMgW2NvbnNpZGVyLXVzaW5nLW1pbi1idWlsdGluXQorICAgIHZhbHVlID0gdmFsdWUyCisKKworY2xhc3MgQToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsdWUgPSAxMworCisKK0ExID0gQSgpCitpZiBBMS52YWx1ZSA+IDEwOiAgIyBbY29uc2lkZXItdXNpbmctbWluLWJ1aWx0aW5dCisgICAgQTEudmFsdWUgPSAxMAorCisKK2NsYXNzIEFBOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPiBiCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIGIpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA+PSBiCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIGIpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA8IGIKKworICAgIGRlZiBfX2xlX18oc2VsZiwgYik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDw9IGIKKworCitBMSA9IEFBKDApCitBMiA9IEFBKDMpCisKK2lmIEExID4gQTI6ICAjIFtjb25zaWRlci11c2luZy1taW4tYnVpbHRpbl0KKyAgICBBMSA9IEEyCisKK2lmIEEyIDwgQTE6ICAjIFtjb25zaWRlci11c2luZy1tYXgtYnVpbHRpbl0KKyAgICBBMiA9IEExCisKK2lmIEExID49IEEyOiAgIyBbY29uc2lkZXItdXNpbmctbWluLWJ1aWx0aW5dCisgICAgQTEgPSBBMgorCitpZiBBMiA8PSBBMTogICMgW2NvbnNpZGVyLXVzaW5nLW1heC1idWlsdGluXQorICAgIEEyID0gQTEKKworIyBOZWdhdGl2ZQoraWYgdmFsdWUgPiAxMDoKKyAgICB2YWx1ZSA9IDIKKworaWYgdmFsdWUgPiAxMDoKKyAgICB2YWx1ZSA9IDIKKyAgICB2YWx1ZTIgPSAzCisKK2lmIHZhbHVlID4gdmFsdWUyOgorICAgIHZhbHVlID0gdmFsdWUzCisKK2lmIHZhbHVlID4gNToKKyAgICB2YWx1ZSA9IHZhbHVlMworCitpZiAyIDwgdmFsdWUgPD0gMzoKKyAgICB2YWx1ZSA9IDEKKworaWYgdmFsdWUgPD0gMzoKKyAgICB2YWx1ZSA9IDUKKworaWYgdmFsdWUgPD0gMzoKKyAgICB2YWx1ZSA9IDUKK2VsaWYgdmFsdWUgPT0gMzoKKyAgICB2YWx1ZSA9IDIKKworaWYgdmFsdWUgPiAxMDoKKyAgICB2YWx1ZSA9IDEwCitlbHNlOgorICAgIHZhbHVlID0gMworCisKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDM3OQordmFyID0gMQoraWYgdmFyID09IC0xOgorICAgIHZhciA9IE5vbmUKKwordmFyMiA9IDEKK2lmIHZhcjIgaW4gWzEsIDJdOgorICAgIHZhcjIgPSBOb25lCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfbWluX21heF9idWlsdGluLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19taW5fbWF4X2J1aWx0aW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDVlMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfbWluX21heF9idWlsdGluLnR4dApAQCAtMCwwICsxLDExIEBACitjb25zaWRlci11c2luZy1tYXgtYnVpbHRpbjo4OjA6OiJDb25zaWRlciB1c2luZyAndmFsdWUgPSBtYXgodmFsdWUsIDEwKScgaW5zdGVhZCBvZiB1bm5lY2Vzc2FyeSBpZiBibG9jayIKK2NvbnNpZGVyLXVzaW5nLW1pbi1idWlsdGluOjExOjA6OiJDb25zaWRlciB1c2luZyAndmFsdWUgPSBtaW4odmFsdWUsIDEwKScgaW5zdGVhZCBvZiB1bm5lY2Vzc2FyeSBpZiBibG9jayIKK2NvbnNpZGVyLXVzaW5nLW1heC1idWlsdGluOjE0OjA6OiJDb25zaWRlciB1c2luZyAndmFsdWUgPSBtYXgodmFsdWUsIDEwKScgaW5zdGVhZCBvZiB1bm5lY2Vzc2FyeSBpZiBibG9jayIKK2NvbnNpZGVyLXVzaW5nLW1pbi1idWlsdGluOjE3OjA6OiJDb25zaWRlciB1c2luZyAndmFsdWUgPSBtaW4odmFsdWUsIDEwKScgaW5zdGVhZCBvZiB1bm5lY2Vzc2FyeSBpZiBibG9jayIKK2NvbnNpZGVyLXVzaW5nLW1heC1idWlsdGluOjIwOjA6OiJDb25zaWRlciB1c2luZyAndmFsdWUgPSBtYXgodmFsdWUsIHZhbHVlMiknIGluc3RlYWQgb2YgdW5uZWNlc3NhcnkgaWYgYmxvY2siCitjb25zaWRlci11c2luZy1taW4tYnVpbHRpbjoyMzowOjoiQ29uc2lkZXIgdXNpbmcgJ3ZhbHVlID0gbWluKHZhbHVlLCB2YWx1ZTIpJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIgorY29uc2lkZXItdXNpbmctbWluLWJ1aWx0aW46MzM6MDo6IkNvbnNpZGVyIHVzaW5nICd2YWx1ZSA9IG1pbih2YWx1ZSwgMTApJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIgorY29uc2lkZXItdXNpbmctbWluLWJ1aWx0aW46NTc6MDo6IkNvbnNpZGVyIHVzaW5nICdBMSA9IG1pbihBMSwgQTIpJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIgorY29uc2lkZXItdXNpbmctbWF4LWJ1aWx0aW46NjA6MDo6IkNvbnNpZGVyIHVzaW5nICdBMiA9IG1heChBMiwgQTEpJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIgorY29uc2lkZXItdXNpbmctbWluLWJ1aWx0aW46NjM6MDo6IkNvbnNpZGVyIHVzaW5nICdBMSA9IG1pbihBMSwgQTIpJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIgorY29uc2lkZXItdXNpbmctbWF4LWJ1aWx0aW46NjY6MDo6IkNvbnNpZGVyIHVzaW5nICdBMiA9IG1heChBMiwgQTEpJyBpbnN0ZWFkIG9mIHVubmVjZXNzYXJ5IGlmIGJsb2NrIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3NldF9jb21wcmVoZW5zaW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3NldF9jb21wcmVoZW5zaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTk4OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfc2V0X2NvbXByZWhlbnNpb24ucHkKQEAgLTAsMCArMSw5IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCB1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uCisKK251bWJlcnMgPSBbMSwgMiwgMywgNCwgNSwgNl0KKworc2V0KCkKKworc2V0KFtdKQorCitzZXQoW251bWJlciBmb3IgbnVtYmVyIGluIG51bWJlcnNdKSAgIyBbY29uc2lkZXItdXNpbmctc2V0LWNvbXByZWhlbnNpb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfc2V0X2NvbXByZWhlbnNpb24udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3NldF9jb21wcmVoZW5zaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODM5YTdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3NldF9jb21wcmVoZW5zaW9uLnR4dApAQCAtMCwwICsxIEBACitjb25zaWRlci11c2luZy1zZXQtY29tcHJlaGVuc2lvbjo5OjA6OkNvbnNpZGVyIHVzaW5nIGEgc2V0IGNvbXByZWhlbnNpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRjZjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3N5c19leGl0LnB5CkBAIC0wLDAgKzEsMTQgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBpbnZhbGlkLW5hbWUsIGRpc2FsbG93ZWQtbmFtZSwgcmVkZWZpbmVkLWJ1aWx0aW4sIHVudXNlZC12YXJpYWJsZQoraW1wb3J0IHN5cworCitkZWYgZm9vKCk6CisgICAgZXhpdCgpICAjIFtjb25zaWRlci11c2luZy1zeXMtZXhpdF0KKworZGVmIGZvb18xKCk6CisgICAgcXVpdCgpICAjIFtjb25zaWRlci11c2luZy1zeXMtZXhpdF0KKworZGVmIGZvb18yKCk6CisgICAgcXVpdCA9ICdhYmMnCisgICAgc3lzLmV4aXQoKQorCitxdWl0KCkgICMgW2NvbnNpZGVyLXVzaW5nLXN5cy1leGl0XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3N5c19leGl0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyOWM2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdC50eHQKQEAgLTAsMCArMSwzIEBACitjb25zaWRlci11c2luZy1zeXMtZXhpdDo1OjQ6Zm9vOkNvbnNpZGVyIHVzaW5nIHN5cy5leGl0KCkKK2NvbnNpZGVyLXVzaW5nLXN5cy1leGl0Ojg6NDpmb29fMTpDb25zaWRlciB1c2luZyBzeXMuZXhpdCgpCitjb25zaWRlci11c2luZy1zeXMtZXhpdDoxNDowOjpDb25zaWRlciB1c2luZyBzeXMuZXhpdCgpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfc3lzX2V4aXRfZXhlbXB0ZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfc3lzX2V4aXRfZXhlbXB0ZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2Njk4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdF9leGVtcHRlZC5weQpAQCAtMCwwICsxLDUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHJlZGVmaW5lZC1idWlsdGluCisKK2Zyb20gc3lzIGltcG9ydCBleGl0CisKK2V4aXQoMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdF9sb2NhbF9zY29wZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ19zeXNfZXhpdF9sb2NhbF9zY29wZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI1N2FlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3N5c19leGl0X2xvY2FsX3Njb3BlLnB5CkBAIC0wLDAgKzEsNSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwscmVkZWZpbmVkLWJ1aWx0aW4KKworZGVmIHJ1bigpOgorICAgIGZyb20gc3lzIGltcG9ydCBleGl0CisgICAgZXhpdCgpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfd2l0aC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ193aXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfd2l0aC5weQpAQCAtMCwwICsxLDE1NiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcsIG1pc3NpbmctbW9kdWxlLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCBpbXBvcnQtb3V0c2lkZS10b3BsZXZlbAoraW1wb3J0IGNvZGVjcworaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdGFyZmlsZQoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdXJsbGliCitpbXBvcnQgemlwZmlsZQorZnJvbSBjb25jdXJyZW50IGltcG9ydCBmdXR1cmVzCisKKworZGVmIHRlc3RfY29kZWNzX29wZW4oKToKKyAgICBmaCA9IGNvZGVjcy5vcGVuKCJ0ZXN0LnR4dCIsICJ1dGY4IikgICMgW2NvbnNpZGVyLXVzaW5nLXdpdGhdCisgICAgZmguY2xvc2UoKQorCisKK2RlZiB0ZXN0X3VybG9wZW4oKToKKyAgICBfID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnIikgICMgW2NvbnNpZGVyLXVzaW5nLXdpdGhdCisKKworZGVmIHRlc3RfdGVtcG9yYXJ5X2ZpbGUoKToKKyAgICBfID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgiciIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorCisKK2RlZiB0ZXN0X25hbWVkX3RlbXBvcmFyeV9maWxlKCk6CisgICAgXyA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgiciIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorCisKK2RlZiB0ZXN0X3Nwb29sZWRfdGVtcG9yYXJ5X2ZpbGUoKToKKyAgICBfID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUoInIiKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKworCitkZWYgdGVzdF90ZW1wb3JhcnlfZGlyZWN0b3J5KCk6CisgICAgXyA9IHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorCisKK2RlZiB0ZXN0X3ppcGZpbGUoKToKKyAgICBteXppcCA9IHppcGZpbGUuWmlwRmlsZSgic3BhbS56aXAiLCAidyIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIF8gPSBteXppcC5vcGVuKCJlZ2dzLnR4dCIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorCisKK2RlZiB0ZXN0X3B5emlwZmlsZSgpOgorICAgIG15emlwID0gemlwZmlsZS5QeVppcEZpbGUoInNwYW0uemlwIiwgInciKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKworICAgIHdpdGggemlwZmlsZS5QeVppcEZpbGUoInNwYW0uemlwIiwgInciKTogICMgbXVzdCBub3QgdHJpZ2dlcgorICAgICAgICBwYXNzCisKKyAgICBfID0gbXl6aXAub3BlbigiZWdncy50eHQiKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKworICAgIHdpdGggbXl6aXAub3BlbigiZWdncy50eHQiKTogICMgbXVzdCBub3QgdHJpZ2dlcgorICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfdGFyZmlsZSgpOgorICAgIHRmID0gdGFyZmlsZS5vcGVuKCIvdG1wL3Rlc3QudGFyIiwgInciKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKyAgICB0Zi5jbG9zZSgpCisKKyAgICB3aXRoIHRhcmZpbGUub3BlbigiL3RtcC90ZXN0LnRhciIsICJ3Iik6ICAjIG11c3Qgbm90IHRyaWdnZXIKKyAgICAgICAgcGFzcworCisgICAgdGYgPSB0YXJmaWxlLlRhckZpbGUoIi90bXAvdGVzdDIudGFyIiwgInciKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKyAgICB0Zi5jbG9zZSgpCisKKyAgICB3aXRoIHRhcmZpbGUuVGFyRmlsZSgiL3RtcC90ZXN0Mi50YXIiLCAidyIpOiAgIyBtdXN0IG5vdCB0cmlnZ2VyCisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9sb2NrX2FjcXVpc2l0aW9uKCk6CisgICAgbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICBsb2NrLmFjcXVpcmUoKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKyAgICBsb2NrLnJlbGVhc2UoKQorCisgICAgd2l0aCBsb2NrOiAgIyBtdXN0IG5vdCB0cmlnZ2VyCisgICAgICAgIHBhc3MKKworICAgIHJsb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKKyAgICBybG9jay5hY3F1aXJlKCkgICMgW2NvbnNpZGVyLXVzaW5nLXdpdGhdCisgICAgcmxvY2sucmVsZWFzZSgpCisKKyAgICB3aXRoIHJsb2NrOiAgIyBtdXN0IG5vdCB0cmlnZ2VyCisgICAgICAgIHBhc3MKKworICAgIHNlbWEgPSB0aHJlYWRpbmcuU2VtYXBob3JlKCkKKyAgICBzZW1hLmFjcXVpcmUoKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKyAgICBzZW1hLnJlbGVhc2UoKQorCisgICAgd2l0aCBzZW1hOiAgIyBtdXN0IG5vdCB0cmlnZ2VyCisgICAgICAgIHBhc3MKKworICAgIGJvdW5kZWRfc2VtYSA9IHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKCkKKyAgICBib3VuZGVkX3NlbWEuYWNxdWlyZSgpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIGJvdW5kZWRfc2VtYS5yZWxlYXNlKCkKKworICAgIHdpdGggYm91bmRlZF9zZW1hOiAgIyBtdXN0IG5vdCB0cmlnZ2VyCisgICAgICAgIHBhc3MKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIHRlc3RfbG9ja19hY3F1aXNpdGlvbl9pbl9jb250ZXh0X21hbmFnZXIxKCk6CisgICAgIiIiCisgICAgVGhlIG1lc3NhZ2UgbXVzdCBub3QgYmUgdHJpZ2dlcmVkIGlmIHRoZSByZXNvdXJjZSBhbGxvY2F0aW9uIGlzIGRvbmUgaW5zaWRlIGEgY29udGV4dCBtYW5hZ2VyLgorICAgICIiIgorICAgIGxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgbG9jay5hY3F1aXJlKCkgICMgbXVzdCBub3QgdHJpZ2dlcgorICAgIHlpZWxkCisgICAgbG9jay5yZWxlYXNlKCkKKworCitjbGFzcyBNeUxvY2tDb250ZXh0OgorICAgICIiIgorICAgIFRoZSBtZXNzYWdlIG11c3Qgbm90IGJlIHRyaWdnZXJlZCBpZiB0aGUgcmVzb3VyY2UgYWxsb2NhdGlvbiBpcyBkb25lIGluc2lkZSBhIGNvbnRleHQgbWFuYWdlci4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkgICMgbXVzdCBub3QgdHJpZ2dlcgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYubG9jay5yZWxlYXNlKCkKKworCitkZWYgdGVzdF9tdWx0aXByb2Nlc3NpbmcoKToKKyAgICAjIHRoZSBkaWZmZXJlbnQgTG9ja3MgcHJvdmlkZWQgYnkgbXVsdGlwcm9jZXNzaW5nIHdvdWxkIGJlIGNhbmRpZGF0ZXMKKyAgICAjIGZvciBjb25zaWRlci11c2luZy13aXRoIGFzIHdlbGwsIGJ1dCB0aGV5IGxlYWQgdG8gSW5mZXJlbmNlRXJyb3JzLgorICAgIF8gPSBtdWx0aXByb2Nlc3NpbmcuUG9vbCgpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIHdpdGggbXVsdGlwcm9jZXNzaW5nLlBvb2woKToKKyAgICAgICAgcGFzcworCisgICAgbWFuYWdlciA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcigpCisgICAgbWFuYWdlci5zdGFydCgpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIHdpdGggbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKCk6CisgICAgICAgIHBhc3MKKworICAgIG1hbmFnZXIgPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuU3luY01hbmFnZXIoKQorICAgIG1hbmFnZXIuc3RhcnQoKSAgIyBbY29uc2lkZXItdXNpbmctd2l0aF0KKyAgICB3aXRoIG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5TeW5jTWFuYWdlcigpOgorICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfZnV0dXJlcygpOgorICAgIF8gPSBmdXR1cmVzLlRocmVhZFBvb2xFeGVjdXRvcigpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIHdpdGggZnV0dXJlcy5UaHJlYWRQb29sRXhlY3V0b3IoKToKKyAgICAgICAgcGFzcworCisgICAgXyA9IGZ1dHVyZXMuUHJvY2Vzc1Bvb2xFeGVjdXRvcigpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIHdpdGggZnV0dXJlcy5Qcm9jZXNzUG9vbEV4ZWN1dG9yKCk6CisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9wb3BlbigpOgorICAgIF8gPSBzdWJwcm9jZXNzLlBvcGVuKCJzaCIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIHdpdGggc3VicHJvY2Vzcy5Qb3Blbigic2giKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3dpdGgudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3dpdGgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzE1NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfd2l0aC50eHQKQEAgLTAsMCArMSwyMiBAQAorY29uc2lkZXItdXNpbmctd2l0aDoxNTo5OnRlc3RfY29kZWNzX29wZW46Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6MjA6ODp0ZXN0X3VybG9wZW46Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6MjQ6ODp0ZXN0X3RlbXBvcmFyeV9maWxlOkNvbnNpZGVyIHVzaW5nICd3aXRoJyBmb3IgcmVzb3VyY2UtYWxsb2NhdGluZyBvcGVyYXRpb25zCitjb25zaWRlci11c2luZy13aXRoOjI4Ojg6dGVzdF9uYW1lZF90ZW1wb3JhcnlfZmlsZTpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDozMjo4OnRlc3Rfc3Bvb2xlZF90ZW1wb3JhcnlfZmlsZTpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDozNjo4OnRlc3RfdGVtcG9yYXJ5X2RpcmVjdG9yeTpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo0MDoxMjp0ZXN0X3ppcGZpbGU6Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6NDE6ODp0ZXN0X3ppcGZpbGU6Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6NDU6MTI6dGVzdF9weXppcGZpbGU6Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6NTA6ODp0ZXN0X3B5emlwZmlsZTpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo1Nzo5OnRlc3RfdGFyZmlsZTpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo2Mzo5OnRlc3RfdGFyZmlsZTpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo3Mjo0OnRlc3RfbG9ja19hY3F1aXNpdGlvbjpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo3OTo0OnRlc3RfbG9ja19hY3F1aXNpdGlvbjpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo4Njo0OnRlc3RfbG9ja19hY3F1aXNpdGlvbjpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo5Mzo0OnRlc3RfbG9ja19hY3F1aXNpdGlvbjpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDoxMjg6ODp0ZXN0X211bHRpcHJvY2Vzc2luZzpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDoxMzM6NDp0ZXN0X211bHRpcHJvY2Vzc2luZzpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDoxMzg6NDp0ZXN0X211bHRpcHJvY2Vzc2luZzpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDoxNDQ6ODp0ZXN0X2Z1dHVyZXM6Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6MTQ4Ojg6dGVzdF9mdXR1cmVzOkNvbnNpZGVyIHVzaW5nICd3aXRoJyBmb3IgcmVzb3VyY2UtYWxsb2NhdGluZyBvcGVyYXRpb25zCitjb25zaWRlci11c2luZy13aXRoOjE1NDo4OnRlc3RfcG9wZW46Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ193aXRoX29wZW4ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfd2l0aF9vcGVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDFhNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29uc2lkZXIvY29uc2lkZXJfdXNpbmdfd2l0aF9vcGVuLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nLCBtaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmcsIGludmFsaWQtbmFtZSwgaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctY2xhc3MtZG9jc3RyaW5nLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1bnVzZWQtdmFyaWFibGUKKyIiIgorVGhlIGZ1bmN0aW9uYWwgdGVzdCBmb3IgdGhlIHN0YW5kYXJkIGBgb3BlbigpYGAgZnVuY3Rpb24gaGFzIHRvIGJlIG1vdmVkIGluIGEgc2VwYXJhdGUgZmlsZSwKK2JlY2F1c2UgUHlQeSBoYXMgdG8gYmUgZXhjbHVkZWQgZm9yIHRoZSB0ZXN0cyBhcyB0aGUgYGBvcGVuKClgYCBmdW5jdGlvbiBpcyB1bmluZmVyYWJsZSBpbiBQeVB5LgorSG93ZXZlciwgYWxsIHJlbWFpbmluZyBjaGVja3MgZm9yIGNvbnNpZGVyLXVzaW5nLXdpdGggd29yayBpbiBQeVB5LCBzbyB3ZSBkbyBub3Qgd2FudCB0byBleGNsdWRlCitQeVB5IGZyb20gQUxMIGZ1bmN0aW9uYWwgdGVzdHMuCisiIiIKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworCitteWZpbGUgPSBvcGVuKCJ0ZXN0LnR4dCIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorCisKK2RlZiB0ZXN0X29wZW4oKToKKyAgICBmaCA9IG9wZW4oInRlc3QudHh0IikgICMgW2NvbnNpZGVyLXVzaW5nLXdpdGhdCisgICAgZmguY2xvc2UoKQorCisgICAgd2l0aCBvcGVuKCJ0ZXN0LnR4dCIpIGFzIGZoOiAgIyBtdXN0IG5vdCB0cmlnZ2VyCisgICAgICAgIGZoLnJlYWQoKQorCisKK2RlZiB0ZXN0X29wZW5faW5fZW50ZXIoKToKKyAgICAiIiJNZXNzYWdlIG11c3Qgbm90IHRyaWdnZXIgaWYgdGhlIHJlc291cmNlIGlzIGFsbG9jYXRlZCBpbiBhIGNvbnRleHQgbWFuYWdlci4iIiIKKyAgICBjbGFzcyBNeUNvbnRleHRNYW5hZ2VyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICBzZWxmLmZpbGVfaGFuZGxlID0gTm9uZQorCisgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLmZpbGVfaGFuZGxlID0gb3BlbigiZm9vLnR4dCIsICJ3IikgICMgbXVzdCBub3QgdHJpZ2dlcgorCisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgc2VsZi5maWxlX2hhbmRsZS5jbG9zZSgpCisKKworQGNvbnRleHRtYW5hZ2VyCitkZWYgdGVzdF9vcGVuX2luX3dpdGhfY29udGV4dGxpYigpOgorICAgICIiIk1lc3NhZ2UgbXVzdCBub3QgdHJpZ2dlciBpZiB0aGUgcmVzb3VyY2UgaXMgYWxsb2NhdGVkIGluIGEgY29udGV4dCBtYW5hZ2VyLiIiIgorICAgIGZpbGVfaGFuZGxlID0gb3BlbigiZm9vLnR4dCIsICJ3IikgICMgbXVzdCBub3QgdHJpZ2dlcgorICAgIHlpZWxkIGZpbGVfaGFuZGxlCisgICAgZmlsZV9oYW5kbGUuY2xvc2UoKQorCisKK2RlZiB0ZXN0X29wZW5fb3V0c2lkZV9hc3NpZ25tZW50KCk6CisgICAgb3BlbigiZm9vIikucmVhZCgpICAjIFtjb25zaWRlci11c2luZy13aXRoXQorICAgIGNvbnRlbnQgPSBvcGVuKCJmb28iKS5yZWFkKCkgICMgW2NvbnNpZGVyLXVzaW5nLXdpdGhdCisKKworZGVmIHRlc3Rfb3Blbl9pbnNpZGVfd2l0aF9ibG9jaygpOgorICAgIHdpdGggb3BlbigiZm9vIikgYXMgZmg6CisgICAgICAgIG9wZW4oImJhciIpICAjIFtjb25zaWRlci11c2luZy13aXRoXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3dpdGhfb3Blbi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ193aXRoX29wZW4ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3YTc0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ193aXRoX29wZW4ucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCitleGNlcHRfaW1wbGVtZW50YXRpb25zPVB5UHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ193aXRoX29wZW4udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnNpZGVyL2NvbnNpZGVyX3VzaW5nX3dpdGhfb3Blbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjZDA4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb25zaWRlci9jb25zaWRlcl91c2luZ193aXRoX29wZW4udHh0CkBAIC0wLDAgKzEsNSBAQAorY29uc2lkZXItdXNpbmctd2l0aDoxMjo5OjpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDoxNjo5OnRlc3Rfb3BlbjpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo0NTo0OnRlc3Rfb3Blbl9vdXRzaWRlX2Fzc2lnbm1lbnQ6Q29uc2lkZXIgdXNpbmcgJ3dpdGgnIGZvciByZXNvdXJjZS1hbGxvY2F0aW5nIG9wZXJhdGlvbnMKK2NvbnNpZGVyLXVzaW5nLXdpdGg6NDY6MTQ6dGVzdF9vcGVuX291dHNpZGVfYXNzaWdubWVudDpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucworY29uc2lkZXItdXNpbmctd2l0aDo1MTo4OnRlc3Rfb3Blbl9pbnNpZGVfd2l0aF9ibG9jazpDb25zaWRlciB1c2luZyAnd2l0aCcgZm9yIHJlc291cmNlLWFsbG9jYXRpbmcgb3BlcmF0aW9ucwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnRpbnVlX2luX2ZpbmFsbHkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29udGludWVfaW5fZmluYWxseS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFmY2JhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnRpbnVlX2luX2ZpbmFsbHkucHkKQEAgLTAsMCArMSwyMyBAQAorIiIiVGVzdCB0aGF0IGBjb250aW51ZWAgaXMgY2F0Y2hlZCB3aGVuIG1ldCBpbnNpZGUgYSBgZmluYWxseWAgY2xhdXNlLiIiIg0KKw0KKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBsb3N0LWV4Y2VwdGlvbiwgYnJvYWQtZXhjZXB0DQorDQord2hpbGUgVHJ1ZToNCisgICAgdHJ5Og0KKyAgICAgICAgcGFzcw0KKyAgICBmaW5hbGx5Og0KKyAgICAgICAgY29udGludWUgIyBbY29udGludWUtaW4tZmluYWxseV0NCisNCit3aGlsZSBUcnVlOg0KKyAgICB0cnk6DQorICAgICAgICBwYXNzDQorICAgIGZpbmFsbHk6DQorICAgICAgICBicmVhaw0KKw0KK3doaWxlIFRydWU6DQorICAgIHRyeToNCisgICAgICAgIHBhc3MNCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCisgICAgICAgIHBhc3MNCisgICAgZWxzZToNCisgICAgICAgIGNvbnRpbnVlDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnRpbnVlX2luX2ZpbmFsbHkucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29udGludWVfaW5fZmluYWxseS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EyOGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NvbnRpbnVlX2luX2ZpbmFsbHkucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittYXhfcHl2ZXI9My44CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2MvY29udGludWVfaW5fZmluYWxseS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29udGludWVfaW5fZmluYWxseS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZTU0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb250aW51ZV9pbl9maW5hbGx5LnR4dApAQCAtMCwwICsxIEBACitjb250aW51ZS1pbi1maW5hbGx5Ojk6OjonY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jb250cm9sX3ByYWdtYXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29udHJvbF9wcmFnbWFzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5M2Y5YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY29udHJvbF9wcmFnbWFzLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKKworZGVmIHRlc3RfcHJhZ21hKCk6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBjb250cm9sIHByYWdtYXMgYXJlIG5vdCB0b28gZWFnZXIgdG8gY29uc3VtZSB0aGUgZW50aXJlIGxpbmUKKworICAgIFdlIHNob3VsZCBzdG9wIGVpdGhlciBhdDoKKyAgICAtIDsgb3IgIworICAgIC0gb3IgYXQgdGhlIGVuZCBvZiBsaW5lCisgICAgIiIiCisgICAgIyBub3FhOiBFNTAxICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC12YXJpYWJsZSAjbm9zZWMKKyAgICB2YXJpYWJsZSA9IDEKKworICAgICMgbm9xYSAjIHB5bGludDogZGlzYWJsZT11bmRlZmluZWQtdmFyaWFibGUsbm8tbWVtYmVyOyBkb24ndCB0cmlnZ2VyCisgICAgb3RoZXJfdmFyaWFibGUgPSBzb21lX3ZhcmlhYmxlICsgdmFyaWFibGUubWVtYmVyCisKKyAgICAjIG5vcWEgIyBweWxpbnQ6IGRpc2FibGU9dW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmcsbm8tbWVtYmVyICMgbm8gdHJpZ2dlcgorICAgIGZpcnN0LCBzZWNvbmQgPSBzb21lX290aGVyX3ZhcmlhYmxlCisgICAgcmV0dXJuIGZpcnN0ICsgb3RoZXJfdmFyaWFibGUubWV0aG9kKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jcmFzaF9taXNzaW5nX21vZHVsZV90eXBlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2NyYXNoX21pc3NpbmdfbW9kdWxlX3R5cGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4NjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jcmFzaF9taXNzaW5nX21vZHVsZV90eXBlLnB5CkBAIC0wLDAgKzEsMTggQEAKKyIiIiBUZXN0IGZvciBhIGNyYXNoIGZvdW5kIGluDQoraHR0cHM6Ly9iaXRidWNrZXQub3JnL2xvZ2lsYWIvYXN0cm9pZC9pc3N1ZS80NS9hdHRyaWJ1dGVlcnJvci1tb2R1bGUtb2JqZWN0LWhhcy1ubyNjb21tZW50LTExOTQ0NjczDQorIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9bm8taW5pdCwgaW52YWxpZC1uYW1lLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCByZWRlZmluZWQtb3V0ZXItbmFtZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UNCitkZWYgZGVjb3IodHJvcCk6DQorICAgICIiIiBkZWNvcmF0b3IgIiIiDQorICAgIHJldHVybiB0cm9wDQorDQorY2xhc3MgRm9vKG9iamVjdCk6DQorICAgICIiIiBDbGFzcyAiIiINCisgICAgQGRlY29yDQorICAgIGRlZiBwcm9wKHNlbGYpOg0KKyAgICAgICAgIiIiIG1ldGhvZCAiIiINCisgICAgICAgIHJldHVybiBzZWxmDQorDQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoNCisgICAgdHJvcCA9IEZvbygpDQorICAgIHRyb3AucHJvcCA9IDQyDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2N0b3JfYXJndW1lbnRzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9jL2N0b3JfYXJndW1lbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTA0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2MvY3Rvcl9hcmd1bWVudHMucHkKQEAgLTAsMCArMSwxMDQgQEAKKyIiIlRlc3QgZnVuY3Rpb24gYXJndW1lbnQgY2hlY2tlciBvbiBfX2luaXRfXworCitCYXNlZCBvbiB0ZXN0cy9mdW5jdGlvbmFsL2EvYXJndW1lbnRzLnB5CisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsc3VwZXItaW5pdC1ub3QtY2FsbGVkLHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKKworY2xhc3MgQ2xhc3MxQXJnKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0X2FyZ3VtZW50KToKKyAgICAgICAgIiIib25lIGFyZ3VtZW50IGZ1bmN0aW9uIiIiCisKK2NsYXNzIENsYXNzM0FyZyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdF9hcmd1bWVudCwgc2Vjb25kX2FyZ3VtZW50LCB0aGlyZF9hcmd1bWVudCk6CisgICAgICAgICIiInRocmVlIGFyZ3VtZW50cyBmdW5jdGlvbiIiIgorCitjbGFzcyBDbGFzc0RlZmF1bHRBcmcob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb25lPTEsIHR3bz0yKToKKyAgICAgICAgIiIiZnVuY3Rpb24gd2l0aCBkZWZhdWx0IHZhbHVlIiIiCisKK2NsYXNzIFN1YmNsYXNzMUFyZyhDbGFzczFBcmcpOgorICAgIHBhc3MKKworY2xhc3MgQ2xhc3NBbGxBcmdzKENsYXNzMUFyZyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHBhc3MKKworY2xhc3MgQ2xhc3NNdWx0aUluaGVyaXRhbmNlKENsYXNzMUFyZywgQ2xhc3MzQXJnKToKKyAgICBwYXNzCisKK2NsYXNzIENsYXNzTmV3KG9iamVjdCk6CisgICAgZGVmIF9fbmV3X18oY2xzLCBmaXJzdF9hcmd1bWVudCwga3dhcmc9Tm9uZSk6CisgICAgICAgIHJldHVybiBmaXJzdF9hcmd1bWVudCwga3dhcmcKKworQ2xhc3MxQXJnKDQyMCkKK0NsYXNzMUFyZygpICAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorQ2xhc3MxQXJnKDEzMzcsIDM0NykgICMgW3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3NdCisKK0NsYXNzM0FyZyg0MjAsIDc4OSkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisjICsxOltuby12YWx1ZS1mb3ItcGFyYW1ldGVyLG5vLXZhbHVlLWZvci1wYXJhbWV0ZXIsbm8tdmFsdWUtZm9yLXBhcmFtZXRlcl0KK0NsYXNzM0FyZygpCitDbGFzczNBcmcoMTMzNywgMzQ3LCA0NTYpCitDbGFzczNBcmcoJ2JhYicsICdiZWJlJywgTm9uZSwgNS42KSAgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJnc10KKworQ2xhc3NEZWZhdWx0QXJnKDEsIHR3bz01KQorQ2xhc3NEZWZhdWx0QXJnKHR3bz01KQorCitDbGFzczFBcmcoYm9iPTQpICAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyLHVuZXhwZWN0ZWQta2V5d29yZC1hcmddCitDbGFzc0RlZmF1bHRBcmcoMSwgNCwgY29pbj0iaGVsbG8iKSAgIyBbdW5leHBlY3RlZC1rZXl3b3JkLWFyZ10KKworQ2xhc3NEZWZhdWx0QXJnKDEsIG9uZT01KSAgIyBbcmVkdW5kYW50LWtleXdvcmQtYXJnXQorCitTdWJjbGFzczFBcmcoNDIwKQorU3ViY2xhc3MxQXJnKCkgICMgW25vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCitTdWJjbGFzczFBcmcoMTMzNywgMzQ3KSAgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJnc10KKworQ2xhc3NBbGxBcmdzKCkKK0NsYXNzQWxsQXJncygxLCAyLCAzLCBldmVuPTQsIG1vcmU9NSkKKworQ2xhc3NNdWx0aUluaGVyaXRhbmNlKDEpCitDbGFzc011bHRpSW5oZXJpdGFuY2UoMSwgMiwgMykgICMgW3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3NdCisKK0NsYXNzTmV3KDEsIGt3YXJnPTEpCitDbGFzc05ldygxLCAyLCAzKSAgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJnc10KK0NsYXNzTmV3KG9uZT0yKSAgIyBbbm8tdmFsdWUtZm9yLXBhcmFtZXRlcix1bmV4cGVjdGVkLWtleXdvcmQtYXJnXQorCisKK2NsYXNzIE1ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpOgorICAgICAgICByZXR1cm4gdHlwZS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKworZGVmIHdpdGhfbWV0YWNsYXNzKG1ldGEsIGJhc2U9b2JqZWN0KToKKyAgICAiIiJDcmVhdGUgYSBuZXcgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgbWV0YWNsYXNzLiIiIgorICAgIHJldHVybiBtZXRhKCJOZXdCYXNlIiwgKGJhc2UsICksIHt9KQorCitjbGFzcyBDbGFzc1dpdGhNZXRhKHdpdGhfbWV0YWNsYXNzKE1ldGFjbGFzcykpOgorICAgIHBhc3MKKworQ2xhc3NXaXRoTWV0YSgpCisKKworY2xhc3MgQnVpbHRpbkV4YyhFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWw9VHJ1ZSk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKK0J1aWx0aW5FeGMoNDIsIDI0LCBiYWRhcmc9MSkgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJncyx1bmV4cGVjdGVkLWtleXdvcmQtYXJnXQorCisKK2NsYXNzIENsc21ldGhvZChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdCwgc2Vjb25kKToKKyAgICAgICAgc2VsZi5maXJzdCA9IGZpcnN0CisgICAgICAgIHNlbGYuc2Vjb25kID0gc2Vjb25kCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9ub3RoaW5nKGNscyk6CisgICAgICAgIHJldHVybiBjbHMoMSwgMiwgMywgNCkgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJnc10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX25vdGhpbmcxKGNscyk6CisgICAgICAgIHJldHVybiBjbHMoKSAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyLG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9ub3RoaW5nMihjbHMpOgorICAgICAgICAjICsxOiBbbm8tdmFsdWUtZm9yLXBhcmFtZXRlcix1bmV4cGVjdGVkLWtleXdvcmQtYXJnXQorICAgICAgICByZXR1cm4gY2xzKDEsIG5vdF9hcmd1bWVudD0yKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9jL2N0b3JfYXJndW1lbnRzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jdG9yX2FyZ3VtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxNzE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvYy9jdG9yX2FyZ3VtZW50cy50eHQKQEAgLTAsMCArMSwyNCBAQAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjozNTowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2ZpcnN0X2FyZ3VtZW50JyBpbiBjb25zdHJ1Y3RvciBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjM2OjA6OlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIGZvciBjb25zdHJ1Y3RvciBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjM4OjA6Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAndGhpcmRfYXJndW1lbnQnIGluIGNvbnN0cnVjdG9yIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6NDA6MDo6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdmaXJzdF9hcmd1bWVudCcgaW4gY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo0MDowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3NlY29uZF9hcmd1bWVudCcgaW4gY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo0MDowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3RoaXJkX2FyZ3VtZW50JyBpbiBjb25zdHJ1Y3RvciBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjQyOjA6OlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIGZvciBjb25zdHJ1Y3RvciBjYWxsCituby12YWx1ZS1mb3ItcGFyYW1ldGVyOjQ3OjA6Ok5vIHZhbHVlIGZvciBhcmd1bWVudCAnZmlyc3RfYXJndW1lbnQnIGluIGNvbnN0cnVjdG9yIGNhbGwKK3VuZXhwZWN0ZWQta2V5d29yZC1hcmc6NDc6MDo6VW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdib2InIGluIGNvbnN0cnVjdG9yIGNhbGwKK3VuZXhwZWN0ZWQta2V5d29yZC1hcmc6NDg6MDo6VW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdjb2luJyBpbiBjb25zdHJ1Y3RvciBjYWxsCityZWR1bmRhbnQta2V5d29yZC1hcmc6NTA6MDo6QXJndW1lbnQgJ29uZScgcGFzc2VkIGJ5IHBvc2l0aW9uIGFuZCBrZXl3b3JkIGluIGNvbnN0cnVjdG9yIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6NTM6MDo6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdmaXJzdF9hcmd1bWVudCcgaW4gY29uc3RydWN0b3IgY2FsbAordG9vLW1hbnktZnVuY3Rpb24tYXJnczo1NDowOjpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29uc3RydWN0b3IgY2FsbAordG9vLW1hbnktZnVuY3Rpb24tYXJnczo2MDowOjpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29uc3RydWN0b3IgY2FsbAordG9vLW1hbnktZnVuY3Rpb24tYXJnczo2MzowOjpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo2NDowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2ZpcnN0X2FyZ3VtZW50JyBpbiBjb25zdHJ1Y3RvciBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjY0OjA6OlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnb25lJyBpbiBjb25zdHJ1Y3RvciBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjg1OjA6OlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIGZvciBjb25zdHJ1Y3RvciBjYWxsCit1bmV4cGVjdGVkLWtleXdvcmQtYXJnOjg1OjA6OlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnYmFkYXJnJyBpbiBjb25zdHJ1Y3RvciBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjk1OjE1OkNsc21ldGhvZC5mcm9tX25vdGhpbmc6VG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMgZm9yIGNvbnN0cnVjdG9yIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6OTk6MTU6Q2xzbWV0aG9kLmZyb21fbm90aGluZzE6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdmaXJzdCcgaW4gY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo5OToxNTpDbHNtZXRob2QuZnJvbV9ub3RoaW5nMTpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3NlY29uZCcgaW4gY29uc3RydWN0b3IgY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjoxMDQ6MTU6Q2xzbWV0aG9kLmZyb21fbm90aGluZzI6Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdzZWNvbmQnIGluIGNvbnN0cnVjdG9yIGNhbGwKK3VuZXhwZWN0ZWQta2V5d29yZC1hcmc6MTA0OjE1OkNsc21ldGhvZC5mcm9tX25vdGhpbmcyOlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnbm90X2FyZ3VtZW50JyBpbiBjb25zdHJ1Y3RvciBjYWxsCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvX19pbml0X18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rhbmdlcm91c19kZWZhdWx0X3ZhbHVlX3B5MzAucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGFuZ2Vyb3VzX2RlZmF1bHRfdmFsdWVfcHkzMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc0ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rhbmdlcm91c19kZWZhdWx0X3ZhbHVlX3B5MzAucHkKQEAgLTAsMCArMSwxMTEgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitpbXBvcnQgY29sbGVjdGlvbnMKKworSEVIRSA9IHt9CisKK2RlZiBmdW5jdGlvbjEodmFsdWU9W10pOiAjIFtkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZV0KKyAgICAiIiJkb2NzdHJpbmciIiIKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIGZ1bmN0aW9uMih2YWx1ZT1IRUhFKTogIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjModmFsdWUpOgorICAgICIiImRvY3N0cmluZyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb240KHZhbHVlPXNldCgpKTogIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIic2V0IGlzIG11dGFibGUgYW5kIGRhbmdlcm91cy4iIiIKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIGZ1bmN0aW9uNSh2YWx1ZT1mcm96ZW5zZXQoKSk6CisgICAgIiIiZnJvemVuc2V0IGlzIGltbXV0YWJsZSBhbmQgc2FmZS4iIiIKKyAgICByZXR1cm4gdmFsdWUKKworR0xPQkFMX1NFVCA9IHNldCgpCisKK2RlZiBmdW5jdGlvbjYodmFsdWU9R0xPQkFMX1NFVCk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiInNldCBpcyBtdXRhYmxlIGFuZCBkYW5nZXJvdXMuIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjcodmFsdWU9ZGljdCgpKTogIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIiZGljdCBpcyBtdXRhYmxlIGFuZCBkYW5nZXJvdXMuIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjgodmFsdWU9bGlzdCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImxpc3QgaXMgbXV0YWJsZSBhbmQgZGFuZ2Vyb3VzLiIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb245KHZhbHVlPVsxLCAyLCAzLCA0XSk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImxpc3Qgd2l0aCBpdGVtcyBzaG91bGQgbm90IG91dHB1dCBpdGVtIHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjEwKHZhbHVlPXsnYSc6IDEsICdiJzogMn0pOiAjIFtkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZV0KKyAgICAiIiJkaWN0aW9uYXJpZXMgd2l0aCBpdGVtcyBzaG91bGQgbm90IG91dHB1dCBpdGVtIHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjExKHZhbHVlPWxpc3QoWzEsIDIsIDNdKSk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImxpc3Qgd2l0aCBpdGVtcyBzaG91bGQgbm90IG91dHB1dCBpdGVtIHZhbHVlcyBpbiBlcnJvciBtZXNzYWdlIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjEyKHZhbHVlPWRpY3QoWygnYScsIDEpLCAoJ2InLCAyKV0pKTogIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIiZGljdGlvbmFyaWVzIHdpdGggaXRlbXMgc2hvdWxkIG5vdCBvdXRwdXQgaXRlbSB2YWx1ZXMgaW4gZXJyb3IgbWVzc2FnZSIiIgorICAgIHJldHVybiB2YWx1ZQorCitPSU5LID0geworICAgICdhJzogMSwKKyAgICAnYic6IDIKK30KKworZGVmIGZ1bmN0aW9uMTModmFsdWU9T0lOSyk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImRpY3Rpb25hcmllcyB3aXRoIGl0ZW1zIHNob3VsZCBub3Qgb3V0cHV0IGl0ZW0gdmFsdWVzIGluIGVycm9yIG1lc3NhZ2UiIiIKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIGZ1bmN0aW9uMTQodmFsdWU9ZGljdChbKDEsIDIpLCAoMSwgMiwgMyldKSk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImEgZGljdGlvbmFyeSB3aGljaCB3aWxsIG5vdCBiZSBpbmZlcnJlZCB0byBhIHN5bnRheCBBU1QsIGJ1dCB0byBhbgorICAgIGFzdHJvaWQuSW5zdGFuY2UuCisgICAgIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK0lOVkFMSURfRElDVCA9IGRpY3QoWygxLCAyKSwgKDEsIDIsIDMpXSkKKworZGVmIGZ1bmN0aW9uMTUodmFsdWU9SU5WQUxJRF9ESUNUKTogIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIiVGhlIHNhbWUgc2l0dWF0aW9uIGFzIGZ1bmN0aW9uMTQuIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjE2KHZhbHVlPXsxfSk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiInNldCBsaXRlcmFsIGFzIGRlZmF1bHQgdmFsdWUiIiIKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIGZ1bmN0aW9uMTcodmFsdWU9Y29sbGVjdGlvbnMuZGVxdWUoKSk6ICAjIFtkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZV0KKyAgICAiIiJtdXRhYmxlLCBkYW5nZXJvdXMiIiIKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIGZ1bmN0aW9uMTgodmFsdWU9Y29sbGVjdGlvbnMuQ2hhaW5NYXAoKSk6ICAjIFtkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZV0KKyAgICAiIiJtdXRhYmxlLCBkYW5nZXJvdXMiIiIKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIGZ1bmN0aW9uMTkodmFsdWU9Y29sbGVjdGlvbnMuQ291bnRlcigpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24yMCh2YWx1ZT1jb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24yMSh2YWx1ZT1jb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24yMih2YWx1ZT1jb2xsZWN0aW9ucy5Vc2VyRGljdCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24yMyh2YWx1ZT1jb2xsZWN0aW9ucy5Vc2VyTGlzdCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24yNCgqLCB2YWx1ZT1bXSk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIGluIGt3YXJnLiIiIgorICAgIHJldHVybiB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rhbmdlcm91c19kZWZhdWx0X3ZhbHVlX3B5MzAucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGFuZ2Vyb3VzX2RlZmF1bHRfdmFsdWVfcHkzMC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ5MGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rhbmdlcm91c19kZWZhdWx0X3ZhbHVlX3B5MzAucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdDQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rhbmdlcm91c19kZWZhdWx0X3ZhbHVlX3B5MzAudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rhbmdlcm91c19kZWZhdWx0X3ZhbHVlX3B5MzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGRkN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGFuZ2Vyb3VzX2RlZmF1bHRfdmFsdWVfcHkzMC50eHQKQEAgLTAsMCArMSwyMiBAQAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6NjowOmZ1bmN0aW9uMTpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBbXSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6MTA6MDpmdW5jdGlvbjI6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgSEVIRSAoYnVpbHRpbnMuZGljdCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjE4OjA6ZnVuY3Rpb240OkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIHNldCgpIChidWlsdGlucy5zZXQpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZToyODowOmZ1bmN0aW9uNjpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBHTE9CQUxfU0VUIChidWlsdGlucy5zZXQpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTozMjowOmZ1bmN0aW9uNzpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBkaWN0KCkgKGJ1aWx0aW5zLmRpY3QpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTozNjowOmZ1bmN0aW9uODpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBsaXN0KCkgKGJ1aWx0aW5zLmxpc3QpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTo0MDowOmZ1bmN0aW9uOTpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBbXSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6NDQ6MDpmdW5jdGlvbjEwOkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIHt9IGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTo0ODowOmZ1bmN0aW9uMTE6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgbGlzdCgpIChidWlsdGlucy5saXN0KSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6NTI6MDpmdW5jdGlvbjEyOkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIGRpY3QoKSAoYnVpbHRpbnMuZGljdCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjYxOjA6ZnVuY3Rpb24xMzpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBPSU5LIChidWlsdGlucy5kaWN0KSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6NjU6MDpmdW5jdGlvbjE0OkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIGRpY3QoKSAoYnVpbHRpbnMuZGljdCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjczOjA6ZnVuY3Rpb24xNTpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBJTlZBTElEX0RJQ1QgKGJ1aWx0aW5zLmRpY3QpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTo3NzowOmZ1bmN0aW9uMTY6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgc2V0KCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjgxOjA6ZnVuY3Rpb24xNzpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBkZXF1ZSgpIChjb2xsZWN0aW9ucy5kZXF1ZSkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjg1OjA6ZnVuY3Rpb24xODpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBDaGFpbk1hcCgpIChjb2xsZWN0aW9ucy5DaGFpbk1hcCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjg5OjA6ZnVuY3Rpb24xOTpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBDb3VudGVyKCkgKGNvbGxlY3Rpb25zLkNvdW50ZXIpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTo5MzowOmZ1bmN0aW9uMjA6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgT3JkZXJlZERpY3QoKSAoY29sbGVjdGlvbnMuT3JkZXJlZERpY3QpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZTo5NzowOmZ1bmN0aW9uMjE6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgZGVmYXVsdGRpY3QoKSAoY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QpIGFzIGFyZ3VtZW50CitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZToxMDE6MDpmdW5jdGlvbjIyOkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIFVzZXJEaWN0KCkgKGNvbGxlY3Rpb25zLlVzZXJEaWN0KSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6MTA1OjA6ZnVuY3Rpb24yMzpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBVc2VyTGlzdCgpIChjb2xsZWN0aW9ucy5Vc2VyTGlzdCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjEwOTowOmZ1bmN0aW9uMjQ6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgW10gYXMgYXJndW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kYXRhY2xhc3Nfd2l0aF9kZWZhdWx0X2ZhY3RvcnkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGF0YWNsYXNzX3dpdGhfZGVmYXVsdF9mYWN0b3J5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWYzODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGF0YWNsYXNzX3dpdGhfZGVmYXVsdF9mYWN0b3J5LnB5CkBAIC0wLDAgKzEsMTUgQEAKKyIiIkEgdGVzdCBzY3JpcHQgdGhlIGNvbmZ1c2VzIHB5bGludC4iIiIKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjYwNQorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZAorCisKK0BkYXRhY2xhc3MKK2NsYXNzIFRlc3Q6CisgICAgIiIiQSB0ZXN0IGRhdGFjbGFzcyB3aXRoIGEgZmllbGQsIHRoYXQgaGFzIGEgZGVmYXVsdF9mYWN0b3J5LiIiIgorCisgICAgdGVzdDogbGlzdCA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQorCisKK1RFU1QgPSBUZXN0KCkKK1RFU1QudGVzdC5hcHBlbmQoMSkKK3ByaW50KFRFU1QudGVzdFswXSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kYXRhY2xhc3Nfd2l0aF9kZWZhdWx0X2ZhY3RvcnkucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGF0YWNsYXNzX3dpdGhfZGVmYXVsdF9mYWN0b3J5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2JiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGF0YWNsYXNzX3dpdGhfZGVmYXVsdF9mYWN0b3J5LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlY29yYXRvcl9zY29wZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZWNvcmF0b3Jfc2NvcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxYzI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZWNvcmF0b3Jfc2NvcGUucHkKQEAgLTAsMCArMSwxOSBAQAorIyAtKi0gcHlsaW50OiBkaXNhYmxlPW5vLWluaXQsdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKyIiIlRlc3QgdGhhdCBkZWNvcmF0b3JzIHNlZXMgdGhlIGNsYXNzIG5hbWVzcGFjZSAtIGp1c3QgbGlrZQorZnVuY3Rpb24gZGVmYXVsdCB2YWx1ZXMgZG9lcyBidXQgZnVuY3Rpb24gYm9keSBkb2Vzbid0LgorCitodHRwczovL3d3dy5sb2dpbGFiLm5ldC9lbG8vdGlja2V0LzM3MTEgLSBidWcgZmluZGluZyBkZWNvcmF0b3IgYXJndW1lbnRzCitodHRwczovL3d3dy5sb2dpbGFiLm5ldC9lbG8vdGlja2V0LzU2MjYgLSBuYW1lIHJlc29sdXRpb24gYnVnIGluc2lkZSBjbGFzc2VzCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgIiIidGVzdCBjbGFzcyIiIgorICAgIGlkZW50ID0gbGFtYmRhIHg6IHgKKworICAgIEBpZGVudChpZGVudCkKKyAgICBkZWYgbWV0aG9kKHNlbGYsIHZhbD1pZGVudCg3KSwgZnVuYz1pZGVudCk6CisgICAgICAgICIiImhvcCIiIgorICAgICAgICBwcmludChzZWxmKQorICAgICAgICByZXR1cm4gZnVuYyh2YWwpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVjb3JhdG9yX3VudXNlZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZWNvcmF0b3JfdW51c2VkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDViM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVjb3JhdG9yX3VudXNlZC5weQpAQCAtMCwwICsxLDEzIEBACisjIHB5bGludDogZGlzYWJsZT1DCitkZWYgZm9vKCk6CisgICAgX2Rpc3BhdGNoID0ge30KKworICAgIGRlZiBzYXZlKGZuKToKKyAgICAgICAgX2Rpc3BhdGNoW2ZuLl9fbmFtZV9fXSA9IGZuCisgICAgICAgIHJldHVybiBmbgorCisgICAgQHNhdmUKKyAgICBkZWYgYmFyKCk6CisgICAgICAgIC4uLgorICAgICMgZG8gd2hhdGV2ZXIKK2ZvbygpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVmaW5lZF9hbmRfdXNlZF9vbl9zYW1lX2xpbmUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVmaW5lZF9hbmRfdXNlZF9vbl9zYW1lX2xpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliOWViNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZWZpbmVkX2FuZF91c2VkX29uX3NhbWVfbGluZS5weQpAQCAtMCwwICsxLDI5IEBACisiIiJDaGVjayBmb3IgZGVmaW5pdGlvbnMgYW5kIHVzYWdlIGhhcHBlbmluZyBvbiB0aGUgc2FtZSBsaW5lLiIiIgorI3B5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxtdWx0aXBsZS1zdGF0ZW1lbnRzLG5vLWFic29sdXRlLWltcG9ydCxwYXJhbWV0ZXItdW5wYWNraW5nLHdyb25nLWltcG9ydC1wb3NpdGlvbix1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitwcmludChbaW5kZXgKKyAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMTApXSkKKworcHJpbnQoKGluZGV4CisgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKDEwKSkpCisKK0ZJTFRFUl9GVU5DID0gbGFtYmRhIHg6IG5vdCB4CisKK2RlZiBmdW5jKHh4eCk6IHJldHVybiB4eHgKKworZGVmIGZ1bmMyKHh4eCk6IHJldHVybiB4eHggKyBmdW5jMigxKQorCitpbXBvcnQgc3lzOyBwcmludChzeXMuZXhjX2luZm8oKSkKKworZm9yIGkgaW4gcmFuZ2UoMTApOiBwcmludChpKQorCitqID0gNDsgTEFNQiA9IGxhbWJkYSB4OiB4K2oKKworRlVOQzQgPSBsYW1iZGEgYSwgYjogYSAhPSBiCisKKyMgdGVzdCBodHRwczovL3d3dy5sb2dpbGFiLm9yZy90aWNrZXQvNjk1NDoKKword2l0aCBvcGVuKCdmJykgYXMgZjogcHJpbnQoZi5yZWFkKCkpCisKK3dpdGggb3BlbignZicpIGFzIGYsIG9wZW4oZi5yZWFkKCkpIGFzIGc6CisgICAgcHJpbnQoZy5yZWFkKCkpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2NsYXNzX3B5MzMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2NsYXNzX3B5MzMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwZTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfY2xhc3NfcHkzMy5weQpAQCAtMCwwICsxLDExIEBACisiIiJUZXN0IGRlcHJlY2F0ZWQgY2xhc3NlcyBmcm9tIFB5dGhvbiAzLjMuIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LGltcG9ydC1lcnJvcixuby1uYW1lLWluLW1vZHVsZSxhYnN0cmFjdC1jbGFzcy1pbnN0YW50aWF0ZWQKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgSXRlcmFibGUgICMgW2RlcHJlY2F0ZWQtY2xhc3NdCisKK2ltcG9ydCBjb2xsZWN0aW9ucy5TZXQgICMgW2RlcHJlY2F0ZWQtY2xhc3NdCisKK2ltcG9ydCBjb2xsZWN0aW9ucworCisKK18gPSBjb2xsZWN0aW9ucy5Bd2FpdGFibGUoKSAgIyBbZGVwcmVjYXRlZC1jbGFzc10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfY2xhc3NfcHkzMy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfY2xhc3NfcHkzMy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIxMDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9jbGFzc19weTMzLnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMworbWF4X3B5dmVyPTMuMTAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfY2xhc3NfcHkzMy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2NsYXNzX3B5MzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzFjMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2NsYXNzX3B5MzMudHh0CkBAIC0wLDAgKzEsMyBAQAorZGVwcmVjYXRlZC1jbGFzczo0OjA6OlVzaW5nIGRlcHJlY2F0ZWQgY2xhc3MgSXRlcmFibGUgb2YgbW9kdWxlIGNvbGxlY3Rpb25zCitkZXByZWNhdGVkLWNsYXNzOjY6MDo6VXNpbmcgZGVwcmVjYXRlZCBjbGFzcyBTZXQgb2YgbW9kdWxlIGNvbGxlY3Rpb25zCitkZXByZWNhdGVkLWNsYXNzOjExOjQ6OlVzaW5nIGRlcHJlY2F0ZWQgY2xhc3MgQXdhaXRhYmxlIG9mIG1vZHVsZSBjb2xsZWN0aW9ucwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9kZWNvcmF0b3JzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9kZWNvcmF0b3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGJhNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2RlY29yYXRvcnMucHkKQEAgLTAsMCArMSwyMCBAQAorIiIiVGVzdCBkZXByZWNhdGVkIGFiYyBkZWNvcmF0b3JzIGZyb20gUHl0aG9uIDMuMy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctY2xhc3MtZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcsbm8tbWVtYmVyCisKK2ltcG9ydCBhYmMKKworY2xhc3MgTXlDbGFzczoKKyAgICBAYWJjLmFic3RyYWN0Y2xhc3NtZXRob2QgICMgW2RlcHJlY2F0ZWQtZGVjb3JhdG9yXQorICAgIGRlZiBteV9tZXRob2QoY2xzKToKKyAgICAgICAgcGFzcworCitjbGFzcyBGb286CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9iYXogPSA4NAorCisgICAgZGVmIG1ldGhvZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2JhegorCisgICAgQG1ldGhvZC5zZXR0ZXIgICAgICAgICAgIyBJbnZhbGlkIGRlY29yYXRvcgorICAgIGRlZiBtZXRob2Qoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9iYXogPSB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9kZWNvcmF0b3JzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9kZWNvcmF0b3JzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Yzk5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2RlY29yYXRvcnMucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX2RlY29yYXRvcnMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9kZWNvcmF0b3JzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk2YzhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9kZWNvcmF0b3JzLnR4dApAQCAtMCwwICsxIEBACitkZXByZWNhdGVkLWRlY29yYXRvcjo3OjQ6TXlDbGFzcy5teV9tZXRob2Q6VXNpbmcgZGVwcmVjYXRlZCBkZWNvcmF0b3IgYWJjLmFic3RyYWN0Y2xhc3NtZXRob2QoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RfZ2V0bW9kdWxlaW5mby5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kX2dldG1vZHVsZWluZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzOGMyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kX2dldG1vZHVsZWluZm8ucHkKQEAgLTAsMCArMSw0IEBACisiIiJUZXN0IHRoYXQgZ2V0bW9kdWxlaW5mbyBpcyBkZXByZWNhdGVkLiIiIgoraW1wb3J0IGluc3BlY3QKKworaW5zcGVjdC5nZXRtb2R1bGVpbmZvKGluc3BlY3QpICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RfZ2V0bW9kdWxlaW5mby5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kX2dldG1vZHVsZWluZm8ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0NGNhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kX2dldG1vZHVsZWluZm8ucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittYXhfcHl2ZXI9My42CittaW5fcHl2ZXI9My4zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZF9nZXRtb2R1bGVpbmZvLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kX2dldG1vZHVsZWluZm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjMyYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZF9nZXRtb2R1bGVpbmZvLnR4dApAQCAtMCwwICsxIEBACitkZXByZWNhdGVkLW1ldGhvZDo0Ojo6VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgZ2V0bW9kdWxlaW5mbygpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQyOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5My5weQpAQCAtMCwwICsxLDUwIEBACisiIiIgRnVuY3Rpb25hbCB0ZXN0cyBmb3IgbWV0aG9kIGRlcHJlY2F0aW9uLiAiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBzdXBlci1pbml0LW5vdC1jYWxsZWQsIG5vdC1jYWxsYWJsZQoraW1wb3J0IGJhc2U2NAoraW1wb3J0IGNnaQoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbm50cGxpYgoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUKKworCitjbGFzcyBNeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydF8oVHJ1ZSkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorCit4bWwuZXRyZWUuRWxlbWVudFRyZWUuRWxlbWVudCgndGFnJykuZ2V0Y2hpbGRyZW4oKSAgIyBbZGVwcmVjYXRlZC1tZXRob2RdCit4bWwuZXRyZWUuRWxlbWVudFRyZWUuRWxlbWVudCgndGFnJykuZ2V0aXRlcmF0b3IoKSAgIyBbZGVwcmVjYXRlZC1tZXRob2RdCit4bWwuZXRyZWUuRWxlbWVudFRyZWUuWE1MUGFyc2VyKCd0YWcnLCBOb25lLCBOb25lKS5kb2N0eXBlKE5vbmUsIE5vbmUsIE5vbmUpICAjIFtkZXByZWNhdGVkLW1ldGhvZF0KK25udHBsaWIuTk5UUChOb25lKS54cGF0aChOb25lKSAjIFtkZXByZWNhdGVkLW1ldGhvZF0KKworCitpbnNwZWN0LmdldGFyZ3NwZWMoTm9uZSkgIyBbZGVwcmVjYXRlZC1tZXRob2RdCitsb2dnaW5nLndhcm4oImEiKSAjIFtkZXByZWNhdGVkLW1ldGhvZF0KK3BsYXRmb3JtLnBvcGVuKFtdKSAjIFtkZXByZWNhdGVkLW1ldGhvZF0KK2Jhc2U2NC5lbmNvZGVzdHJpbmcoIjQyIikgIyBbZGVwcmVjYXRlZC1tZXRob2RdCitiYXNlNjQuZGVjb2Rlc3RyaW5nKCI0MiIpICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorY2dpLmVzY2FwZSgiYSIpICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorCisKK2NsYXNzIFN1cGVyQ3Jhc2godW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIHNob3VsZCBub3QgY3Jhc2guCisgICAgICAgIHN1cGVyKCkoKQorCit4bWwuZXRyZWUuRWxlbWVudFRyZWUuaXRlcnBhcnNlKE5vbmUpCisKKworY2xhc3MgVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydF8oImFiYyIgPT0gIjIiKSAgIyBbZGVwcmVjYXRlZC1tZXRob2RdCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAiZXhjZXB0aW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleCgic29tZXRoaW5nIiwgciIuKyIpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5My5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzNlNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5My5yYwpAQCAtMCwwICsxLDMgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjMKK21heF9weXZlcj0zLjcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NjExNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK2RlcHJlY2F0ZWQtbWV0aG9kOjE1OjpNeVRlc3QudGVzdDpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBhc3NlcnRfKCkKK2RlcHJlY2F0ZWQtbWV0aG9kOjE3Ojo6VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgZ2V0Y2hpbGRyZW4oKQorZGVwcmVjYXRlZC1tZXRob2Q6MTg6OjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBnZXRpdGVyYXRvcigpCitkZXByZWNhdGVkLW1ldGhvZDoxOTo6OlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGRvY3R5cGUoKQorZGVwcmVjYXRlZC1tZXRob2Q6MjA6OjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCB4cGF0aCgpCitkZXByZWNhdGVkLW1ldGhvZDoyMzo6OlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGdldGFyZ3NwZWMoKQorZGVwcmVjYXRlZC1tZXRob2Q6MjQ6OjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCB3YXJuKCkKK2RlcHJlY2F0ZWQtbWV0aG9kOjI1Ojo6VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgcG9wZW4oKQorZGVwcmVjYXRlZC1tZXRob2Q6MjY6OjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBlbmNvZGVzdHJpbmcoKQorZGVwcmVjYXRlZC1tZXRob2Q6Mjc6OjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBkZWNvZGVzdHJpbmcoKQorZGVwcmVjYXRlZC1tZXRob2Q6Mjg6OjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBlc2NhcGUoKQorZGVwcmVjYXRlZC1tZXRob2Q6NDM6OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydEVxdWFscygpCitkZXByZWNhdGVkLW1ldGhvZDo0NDo6VGVzdHMudGVzdF9mb286VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgYXNzZXJ0Tm90RXF1YWxzKCkKK2RlcHJlY2F0ZWQtbWV0aG9kOjQ1OjpUZXN0cy50ZXN0X2ZvbzpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBhc3NlcnRBbG1vc3RFcXVhbHMoKQorZGVwcmVjYXRlZC1tZXRob2Q6NDY6OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydE5vdEFsbW9zdEVxdWFscygpCitkZXByZWNhdGVkLW1ldGhvZDo0Nzo6VGVzdHMudGVzdF9mb286VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgYXNzZXJ0XygpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzNi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTM2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTZhMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzNi5weQpAQCAtMCwwICsxLDcgQEAKKyIiIiBGdW5jdGlvbmFsIHRlc3RzIGZvciBtZXRob2QgZGVwcmVjYXRpb24uICIiIgorIyBweWxpbnQ6IGRpc2FibGU9bm8tdmFsdWUtZm9yLXBhcmFtZXRlcgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGltcG9ydGxpYi5tYWNoaW5lcnkgaW1wb3J0IFNvdXJjZUZpbGVMb2FkZXIsIFNvdXJjZWxlc3NGaWxlTG9hZGVyCisKK1NvdXJjZUZpbGVMb2FkZXIoJ3VuaXR0ZXN0JywgdW5pdHRlc3QuX19maWxlX18pLmxvYWRfbW9kdWxlKCkgIyBbZGVwcmVjYXRlZC1tZXRob2RdCitTb3VyY2VsZXNzRmlsZUxvYWRlcigndW5pdHRlc3QnLCB1bml0dGVzdC5fX2ZpbGVfXykubG9hZF9tb2R1bGUoKSAjIFtkZXByZWNhdGVkLW1ldGhvZF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTM2LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5MzYucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5MzYudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5MzYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMWQyNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzNi50eHQKQEAgLTAsMCArMSwyIEBACitkZXByZWNhdGVkLW1ldGhvZDo2OjA6OlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGxvYWRfbW9kdWxlKCkKK2RlcHJlY2F0ZWQtbWV0aG9kOjc6MDo6VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgbG9hZF9tb2R1bGUoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5MzgucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA0N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5MzgucHkKQEAgLTAsMCArMSw0NSBAQAorIiIiIEZ1bmN0aW9uYWwgdGVzdHMgZm9yIG1ldGhvZCBkZXByZWNhdGlvbi4gIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgc3VwZXItaW5pdC1ub3QtY2FsbGVkLCBub3QtY2FsbGFibGUKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG5udHBsaWIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZQorCisKK2NsYXNzIE15VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0XyhUcnVlKSAgIyBbZGVwcmVjYXRlZC1tZXRob2RdCisKK3htbC5ldHJlZS5FbGVtZW50VHJlZS5FbGVtZW50KCd0YWcnKS5nZXRjaGlsZHJlbigpICAjIFtkZXByZWNhdGVkLW1ldGhvZF0KK3htbC5ldHJlZS5FbGVtZW50VHJlZS5FbGVtZW50KCd0YWcnKS5nZXRpdGVyYXRvcigpICAjIFtkZXByZWNhdGVkLW1ldGhvZF0KK25udHBsaWIuTk5UUChOb25lKS54cGF0aChOb25lKSAjIFtkZXByZWNhdGVkLW1ldGhvZF0KKworCitpbnNwZWN0LmdldGFyZ3NwZWMoTm9uZSkgIyBbZGVwcmVjYXRlZC1tZXRob2RdCitsb2dnaW5nLndhcm4oImEiKSAjIFtkZXByZWNhdGVkLW1ldGhvZF0KK2Jhc2U2NC5lbmNvZGVzdHJpbmcoIjQyIikgIyBbZGVwcmVjYXRlZC1tZXRob2RdCitiYXNlNjQuZGVjb2Rlc3RyaW5nKCI0MiIpICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorCisKK2NsYXNzIFN1cGVyQ3Jhc2godW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIHNob3VsZCBub3QgY3Jhc2guCisgICAgICAgIHN1cGVyKCkoKQorCit4bWwuZXRyZWUuRWxlbWVudFRyZWUuaXRlcnBhcnNlKE5vbmUpCisKKworY2xhc3MgVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFscygyICsgMiwgNCkgICMgW2RlcHJlY2F0ZWQtbWV0aG9kXQorICAgICAgICBzZWxmLmFzc2VydF8oImFiYyIgPT0gIjIiKSAgIyBbZGVwcmVjYXRlZC1tZXRob2RdCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAiZXhjZXB0aW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleCgic29tZXRoaW5nIiwgciIuKyIpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzOC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTM4LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjE4NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21ldGhvZHNfcHkzOC5yYwpAQCAtMCwwICsxLDMgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKK21heF9weXZlcj0zLjkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTM4LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbWV0aG9kc19weTM4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGQ3ZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tZXRob2RzX3B5MzgudHh0CkBAIC0wLDAgKzEsMTMgQEAKK2RlcHJlY2F0ZWQtbWV0aG9kOjEzOjg6TXlUZXN0LnRlc3Q6VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgYXNzZXJ0XygpCitkZXByZWNhdGVkLW1ldGhvZDoxNTowOjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBnZXRjaGlsZHJlbigpCitkZXByZWNhdGVkLW1ldGhvZDoxNjowOjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBnZXRpdGVyYXRvcigpCitkZXByZWNhdGVkLW1ldGhvZDoxNzowOjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCB4cGF0aCgpCitkZXByZWNhdGVkLW1ldGhvZDoyMDowOjpVc2luZyBkZXByZWNhdGVkIG1ldGhvZCBnZXRhcmdzcGVjKCkKK2RlcHJlY2F0ZWQtbWV0aG9kOjIxOjA6OlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIHdhcm4oKQorZGVwcmVjYXRlZC1tZXRob2Q6MjI6MDo6VXNpbmcgZGVwcmVjYXRlZCBtZXRob2QgZW5jb2Rlc3RyaW5nKCkKK2RlcHJlY2F0ZWQtbWV0aG9kOjIzOjA6OlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGRlY29kZXN0cmluZygpCitkZXByZWNhdGVkLW1ldGhvZDozODo4OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydEVxdWFscygpCitkZXByZWNhdGVkLW1ldGhvZDozOTo4OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydE5vdEVxdWFscygpCitkZXByZWNhdGVkLW1ldGhvZDo0MDo4OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydEFsbW9zdEVxdWFscygpCitkZXByZWNhdGVkLW1ldGhvZDo0MTo4OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydE5vdEFsbW9zdEVxdWFscygpCitkZXByZWNhdGVkLW1ldGhvZDo0Mjo4OlRlc3RzLnRlc3RfZm9vOlVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kIGFzc2VydF8oKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGQ0MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTMucHkKQEAgLTAsMCArMSw0IEBACisiIiJUZXN0IGRlcHJlY2F0ZWQgbW9kdWxlcy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKKworaW1wb3J0IG9wdHBhcnNlICMgW2RlcHJlY2F0ZWQtbW9kdWxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzQzZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTMucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCittYXhfcHl2ZXI9My42CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMwYTQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzLnR4dApAQCAtMCwwICsxIEBACitkZXByZWNhdGVkLW1vZHVsZTo0Ojo6VXNlcyBvZiBhIGRlcHJlY2F0ZWQgbW9kdWxlICdvcHRwYXJzZScKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5MzYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTM2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWY5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTM2LnB5CkBAIC0wLDAgKzEsNCBAQAorIiIiVGVzdCBkZXByZWNhdGVkIG1vZHVsZXMgZnJvbSBQeXRob24gMy42LiIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCxpbXBvcnQtZXJyb3IKKworaW1wb3J0IG9wdHBhcnNlICMgW2RlcHJlY2F0ZWQtbW9kdWxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfcHkzNi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5MzYucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5MzYucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My42CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTM2LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5MzYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNWY0ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTM2LnR4dApAQCAtMCwwICsxIEBACitkZXByZWNhdGVkLW1vZHVsZTo0OjA6OlVzZXMgb2YgYSBkZXByZWNhdGVkIG1vZHVsZSAnb3B0cGFyc2UnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhZDk1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5NC5weQpAQCAtMCwwICsxLDQgQEAKKyIiIlRlc3QgZGVwcmVjYXRlZCBtb2R1bGVzLiIiIgorCitmcm9tIGRlcHJlY2F0ZWQgaW1wb3J0IGZvbyAgIyBbZGVwcmVjYXRlZC1tb2R1bGVdCitpbXBvcnQgZGVwcmVjYXRlZCAgIyBbZGVwcmVjYXRlZC1tb2R1bGVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTQucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiZDM0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5NC5yYwpAQCAtMCwwICsxLDQgQEAKK1tNZXNzYWdlcyBDb250cm9sXQorZGVwcmVjYXRlZC1tb2R1bGVzPWRlcHJlY2F0ZWQKK2Rpc2FibGU9YWxsCitlbmFibGU9ZGVwcmVjYXRlZC1tb2R1bGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3B5NC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODAwZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV9weTQudHh0CkBAIC0wLDAgKzEsMiBAQAorZGVwcmVjYXRlZC1tb2R1bGU6MzowOjpVc2VzIG9mIGEgZGVwcmVjYXRlZCBtb2R1bGUgJ2RlcHJlY2F0ZWQnCitkZXByZWNhdGVkLW1vZHVsZTo0OjA6OlVzZXMgb2YgYSBkZXByZWNhdGVkIG1vZHVsZSAnZGVwcmVjYXRlZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3VuaW5zdGFsbGVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RlcHJlY2F0ZWQvZGVwcmVjYXRlZF9tb2R1bGVfdW5pbnN0YWxsZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNTVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3VuaW5zdGFsbGVkLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiVGVzdCBkZXByZWNhdGVkIG1vZHVsZXMgdW5pbnN0YWxsZWQuIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LG5vLW5hbWUtaW4tbW9kdWxlLGltcG9ydC1lcnJvcgorCitmcm9tIHVuaW5zdGFsbGVkIGltcG9ydCB1bmluc3RhbGxlZF9tb2R1bGUgIyBbZGVwcmVjYXRlZC1tb2R1bGVdCitpbXBvcnQgdW5pbnN0YWxsZWQgIyBbZGVwcmVjYXRlZC1tb2R1bGVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV91bmluc3RhbGxlZC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3VuaW5zdGFsbGVkLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGZjMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV91bmluc3RhbGxlZC5yYwpAQCAtMCwwICsxLDIgQEAKK1tNZXNzYWdlcyBDb250cm9sXQorZGVwcmVjYXRlZC1tb2R1bGVzPXVuaW5zdGFsbGVkCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV91bmluc3RhbGxlZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGVwcmVjYXRlZC9kZXByZWNhdGVkX21vZHVsZV91bmluc3RhbGxlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5ZjAxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kZXByZWNhdGVkL2RlcHJlY2F0ZWRfbW9kdWxlX3VuaW5zdGFsbGVkLnR4dApAQCAtMCwwICsxLDIgQEAKK2RlcHJlY2F0ZWQtbW9kdWxlOjQ6MDo6VXNlcyBvZiBhIGRlcHJlY2F0ZWQgbW9kdWxlICd1bmluc3RhbGxlZCcKK2RlcHJlY2F0ZWQtbW9kdWxlOjU6MDo6VXNlcyBvZiBhIGRlcHJlY2F0ZWQgbW9kdWxlICd1bmluc3RhbGxlZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaWN0X2l0ZXJfbWlzc2luZ19pdGVtcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaWN0X2l0ZXJfbWlzc2luZ19pdGVtcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNmNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RpY3RfaXRlcl9taXNzaW5nX2l0ZW1zLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSwgY29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnksIG1pc3NpbmctZG9jc3RyaW5nLCBpbXBvcnQtZXJyb3IKK2Zyb20gdW5rbm93biBpbXBvcnQgVW5pbmZlcmFibGUKKworZCA9IHsxOiAxLCAyOiAyfQorbCA9IFsxLCAyXQorczEgPSB7MSwgMn0KK3MyID0gezEsIDIsIDN9CisKKyMgUG9zaXRpdmUKK2ZvciBrLCB2IGluIGQ6ICAjIFtkaWN0LWl0ZXItbWlzc2luZy1pdGVtc10KKyAgICBwYXNzCisKKyMgTmVnYXRpdmUKK2ZvciBrLCB2IGluIGQuaXRlbXMoKToKKyAgICBwYXNzCitmb3IgayBpbiBkLmtleXMoKToKKyAgICBwYXNzCitmb3IgaSwgdiBpbiBlbnVtZXJhdGUobCk6CisgICAgcGFzcworZm9yIGksIHYgaW4gczEuaW50ZXJzZWN0aW9uKHMyKToKKyAgICBwYXNzCitmb3IgaywgdiBpbiBVbmluZmVyYWJsZToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZGljdF9pdGVyX21pc3NpbmdfaXRlbXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RpY3RfaXRlcl9taXNzaW5nX2l0ZW1zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFlZDgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RpY3RfaXRlcl9taXNzaW5nX2l0ZW1zLnR4dApAQCAtMCwwICsxIEBACitkaWN0LWl0ZXItbWlzc2luZy1pdGVtczoxMDowOjpVbnBhY2tpbmcgYSBkaWN0aW9uYXJ5IGluIGl0ZXJhdGlvbiB3aXRob3V0IGNhbGxpbmcgLml0ZW1zKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX21zZ19naXRodWJfaXNzdWVfMTM4OS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX21zZ19naXRodWJfaXNzdWVfMTM4OS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdhZDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfbXNnX2dpdGh1Yl9pc3N1ZV8xMzg5LnB5CkBAIC0wLDAgKzEsMTUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMKKworZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIE5hbWVkVHVwbGUsIE5ld1R5cGUsIFNldAorCitVc2VySWQgPSBOZXdUeXBlKCdVc2VySWQnLCBzdHIpICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKK1BsYWNlSWQgPSBOZXdUeXBlKCdQbGFjZUlkJywgc3RyKSAgIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lCisKKworY2xhc3MgQmFyKE5hbWVkVHVwbGUpOgorICAgIHBsYWNlOiBQbGFjZUlkCisgICAgbmFtZTogc3RyCisKKworY2xhc3MgRm9vKE5hbWVkVHVwbGUpOgorICAgIHVzZXI6IERpY3RbVXNlcklkLCBTZXRbQmFyXV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX21zZ19naXRodWJfaXNzdWVfMTM4OS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX21zZ19naXRodWJfaXNzdWVfMTM4OS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfbXNnX2dpdGh1Yl9pc3N1ZV8xMzg5LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfdW5ncm91cGVkX2ltcG9ydHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGlzYWJsZV91bmdyb3VwZWRfaW1wb3J0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMwNmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfdW5ncm91cGVkX2ltcG9ydHMucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiQ2hlY2tzIHRoYXQgZGlzYWJsaW5nICd1bmdyb3VwZWQtaW1wb3J0cycgb24gYW4gaW1wb3J0IHByZXZlbnRzIHN1YnNlcXVlbnQKK2ltcG9ydHMgZnJvbSBiZWluZyBjb25zaWRlcmVkIHVuZ3JvdXBlZCBpbiByZXNwZWN0IHRvIGl0LiIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCx3cm9uZy1pbXBvcnQtcG9zaXRpb24sd3JvbmctaW1wb3J0LW9yZGVyLHVzaW5nLWNvbnN0YW50LXRlc3QKKyMgcHlsaW50OiBkaXNhYmxlPWltcG9ydC1lcnJvcgorZnJvbSBvcy5wYXRoIGltcG9ydCBiYXNlbmFtZQoraW1wb3J0IGxvZ2dpbmcuY29uZmlnICAjIHB5bGludDogZGlzYWJsZT11bmdyb3VwZWQtaW1wb3J0cworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBsb2dnaW5nCitmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4gICMgW3VuZ3JvdXBlZC1pbXBvcnRzXQoraW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMgICMgW3VuZ3JvdXBlZC1pbXBvcnRzXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfdW5ncm91cGVkX2ltcG9ydHMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfdW5ncm91cGVkX2ltcG9ydHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTBlMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGlzYWJsZV91bmdyb3VwZWRfaW1wb3J0cy50eHQKQEAgLTAsMCArMSwyIEBACit1bmdyb3VwZWQtaW1wb3J0czo5OjA6OkltcG9ydHMgZnJvbSBwYWNrYWdlIG9zIGFyZSBub3QgZ3JvdXBlZAordW5ncm91cGVkLWltcG9ydHM6MTA6MDo6SW1wb3J0cyBmcm9tIHBhY2thZ2UgbG9nZ2luZyBhcmUgbm90IGdyb3VwZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX3dyb25nX2ltcG9ydF9vcmRlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX3dyb25nX2ltcG9ydF9vcmRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmRmODNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfd3JvbmdfaW1wb3J0X29yZGVyLnB5CkBAIC0wLDAgKzEsMTEgQEAKKyIiIkNoZWNrcyB0aGF0IGRpc2FibGluZyAnd3JvbmctaW1wb3J0LW9yZGVyJyBvbiBhbiBpbXBvcnQgcHJldmVudHMgc3Vic2VxdWVudAoraW1wb3J0cyBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgb3V0LW9mLW9yZGVyIGluIHJlc3BlY3QgdG8gaXQgYnV0IGRvZXMgbm90IHByZXZlbnQKK2l0IGZyb20gYmVpbmcgY29uc2lkZXJlZCBmb3IgJ3VuZ3JvdXBlZC1pbXBvcnRzJy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsaW1wb3J0LWVycm9yLG5vLW5hbWUtaW4tbW9kdWxlCisKK2Zyb20gZmlyc3RfcGFydHkuZm9vIGltcG9ydCBiYXIgIyBweWxpbnQ6IGRpc2FibGU9d3JvbmctaW1wb3J0LW9yZGVyCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKK2Zyb20gYXN0cm9pZCBpbXBvcnQgYXJlX2V4Y2x1c2l2ZQorZnJvbSBmaXJzdF9wYXJ0eS5iYXIgaW1wb3J0IGZvbyAjIFt1bmdyb3VwZWQtaW1wb3J0c10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlX3dyb25nX2ltcG9ydF9vcmRlci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGlzYWJsZV93cm9uZ19pbXBvcnRfb3JkZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZmNhZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGlzYWJsZV93cm9uZ19pbXBvcnRfb3JkZXIudHh0CkBAIC0wLDAgKzEgQEAKK3VuZ3JvdXBlZC1pbXBvcnRzOjExOjA6OkltcG9ydHMgZnJvbSBwYWNrYWdlIGZpcnN0X3BhcnR5IGFyZSBub3QgZ3JvdXBlZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVfd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDMzMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGlzYWJsZV93cm9uZ19pbXBvcnRfcG9zaXRpb24ucHkKQEAgLTAsMCArMSw3IEBACisiIiJDaGVja3MgdGhhdCBkaXNhYmxpbmcgJ3dyb25nLWltcG9ydC1wb3NpdGlvbicgb24gYSBzdGF0ZW1lbnQgcHJldmVudHMgaXQgZnJvbQoraW52YWxpZGF0aW5nIHN1YnNlcXVlbnQgaW1wb3J0cy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKKworQ09OU1RBTlQgPSBUcnVlICAjIHB5bGludDogZGlzYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KKworaW1wb3J0IHN5cwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVkX21zZ2lkX2luX3B5bGludHJjLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVkX21zZ2lkX2luX3B5bGludHJjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGRmMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZGlzYWJsZWRfbXNnaWRfaW5fcHlsaW50cmMucHkKQEAgLTAsMCArMSw2IEBACisiIiJodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80MjY1IiIiCisKK3RyeToKKyAgICBmID0gb3BlbigndGVzdCcpCitleGNlcHQgRXhjZXB0aW9uOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlZF9tc2dpZF9pbl9weWxpbnRyYy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kaXNhYmxlZF9tc2dpZF9pbl9weWxpbnRyYy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTU4NGNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2Rpc2FibGVkX21zZ2lkX2luX3B5bGludHJjLnJjCkBAIC0wLDAgKzEsNCBAQAorW01FU1NBR0VTIENPTlRST0xdCisKK2Rpc2FibGU9CisgICAgQzAxMTEsQzAzMjYsVzA3MDMsUjE3MzIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kb2NzdHJpbmdzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RvY3N0cmluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2NmEwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kb2NzdHJpbmdzLnB5CkBAIC0wLDAgKzEsOTAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktcGFzcw0KKyMgLTE6IFttaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmddDQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbg0KKw0KKyMgKzE6IFtlbXB0eS1kb2NzdHJpbmddDQorZGVmIGZ1bmN0aW9uMCgpOg0KKyAgICAiIiIiIiINCisNCisjICsxOiBbbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmddDQorZGVmIGZ1bmN0aW9uMSh2YWx1ZSk6DQorICAgICMgbWlzc2luZyBkb2NzdHJpbmcNCisgICAgcHJpbnQodmFsdWUpDQorDQorZGVmIGZ1bmN0aW9uMih2YWx1ZSk6DQorICAgICIiImRvY3N0cmluZyIiIg0KKyAgICBwcmludCh2YWx1ZSkNCisNCitkZWYgZnVuY3Rpb24zKHZhbHVlKToNCisgICAgIiIiZG9jc3RyaW5nIiIiDQorICAgIHByaW50KHZhbHVlKQ0KKw0KKyMgKzE6IFttaXNzaW5nLWNsYXNzLWRvY3N0cmluZ10NCitjbGFzcyBBQUFBKG9iamVjdCk6DQorICAgICMgbWlzc2luZyBkb2NzdHJpbmcNCisNCisjIyAgICAgY2xhc3MgQkJCQjoNCisjIyAgICAgICAgICMgbWlzc2luZyBkb2NzdHJpbmcNCisjIyAgICAgICAgIHBhc3MNCisNCisjIyAgICAgY2xhc3MgQ0NDQzoNCisjIyAgICAgICAgICIiInllYWggISIiIg0KKyMjICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZik6DQorIyMgICAgICAgICAgICAgcGFzcw0KKw0KKyMjICAgICAgICAgZGVmIG1ldGhvZDIoc2VsZik6DQorIyMgICAgICAgICAgICAgIiIiIHllYWggISIiIg0KKyMjICAgICAgICAgICAgIHBhc3MNCisNCisgICAgIyArMTogW21pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nXQ0KKyAgICBkZWYgbWV0aG9kMShzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIG1ldGhvZDIoc2VsZik6DQorICAgICAgICAiIiIgeWVhaCAhIiIiDQorICAgICAgICBwYXNzDQorDQorICAgICMgKzE6IFtlbXB0eS1kb2NzdHJpbmddDQorICAgIGRlZiBtZXRob2QzKHNlbGYpOg0KKyAgICAgICAgIiIiIiIiDQorICAgICAgICBwYXNzDQorDQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBEREREKEFBQUEpOg0KKyAgICAiIiJ5ZWFoICEiIiINCisNCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgQUFBQS5fX2luaXRfXyhzZWxmKQ0KKw0KKyAgICAjICsxOiBbZW1wdHktZG9jc3RyaW5nXQ0KKyAgICBkZWYgbWV0aG9kMihzZWxmKToNCisgICAgICAgICIiIiIiIg0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgbWV0aG9kMyhzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisgICAgIyArMTogW21pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nXQ0KKyAgICBkZWYgbWV0aG9kNChzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZw0KK2RlZiBmdW5jdGlvbjQoKToNCisgICAgcGFzcw0KKw0KKyMgcHlsaW50OiBkaXNhYmxlPWVtcHR5LWRvY3N0cmluZw0KK2RlZiBmdW5jdGlvbjUoKToNCisgICAgIiIiIiIiDQorICAgIHBhc3MNCisNCitkZWYgZnVuY3Rpb242KCk6DQorICAgICIiIiBJIGFtIGEge30gZG9jc3RyaW5nLiIiIi5mb3JtYXQoImdvb2QiKQ0KKw0KK2RlZiBmdW5jdGlvbjcoKToNCisgICAgIiIiZG9jc3RyaW5nIiIiDQorICAgIGRlZiBpbm5lcigpOg0KKyAgICAgICAgIyBOb3QgZG9jdW1lbnRlZA0KKyAgICAgICAgcmV0dXJuIDQyDQorICAgIHJldHVybiBpbm5lcigpDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2RvY3N0cmluZ3MudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RvY3N0cmluZ3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmIyZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZG9jc3RyaW5ncy50eHQKQEAgLTAsMCArMSw4IEBACittaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmc6MTowOjpNaXNzaW5nIG1vZHVsZSBkb2NzdHJpbmcKK2VtcHR5LWRvY3N0cmluZzo2OjA6ZnVuY3Rpb24wOkVtcHR5IGZ1bmN0aW9uIGRvY3N0cmluZworbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmc6MTA6MDpmdW5jdGlvbjE6TWlzc2luZyBmdW5jdGlvbiBvciBtZXRob2QgZG9jc3RyaW5nCittaXNzaW5nLWNsYXNzLWRvY3N0cmluZzoyMzowOkFBQUE6TWlzc2luZyBjbGFzcyBkb2NzdHJpbmcKK21pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nOjQwOjQ6QUFBQS5tZXRob2QxOk1pc3NpbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGRvY3N0cmluZzpJTkZFUkVOQ0UKK2VtcHR5LWRvY3N0cmluZzo0ODo0OkFBQUEubWV0aG9kMzpFbXB0eSBtZXRob2QgZG9jc3RyaW5nOklORkVSRU5DRQorZW1wdHktZG9jc3RyaW5nOjYyOjQ6RERERC5tZXRob2QyOkVtcHR5IG1ldGhvZCBkb2NzdHJpbmc6SU5GRVJFTkNFCittaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZzo3MDo0OkREREQubWV0aG9kNDpNaXNzaW5nIGZ1bmN0aW9uIG9yIG1ldGhvZCBkb2NzdHJpbmc6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZG90dGVkX2FuY2VzdG9yLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RvdHRlZF9hbmNlc3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzgyZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RvdHRlZF9hbmNlc3Rvci5weQpAQCAtMCwwICsxLDExIEBACisiIiJibGEiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydAorCitmcm9tIC4ubi5ub24gaW1wb3J0IG5vbl9pbml0X3BhcmVudF9jYWxsZWQKKworX19yZXZpc2lvbl9fID0gJ3lvJworCitjbGFzcyBBYWFhKG5vbl9pbml0X3BhcmVudF9jYWxsZWQuQUFBQSk6ICAjIFt0b28tZmV3LXB1YmxpYy1tZXRob2RzXQorICAgICIiInRlc3QgZG90dGVkIG5hbWUgaW4gYW5jZXN0b3JzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBub25faW5pdF9wYXJlbnRfY2FsbGVkLkFBQUEuX19pbml0X18oc2VsZikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kb3R0ZWRfYW5jZXN0b3IudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2RvdHRlZF9hbmNlc3Rvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhNDdlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kb3R0ZWRfYW5jZXN0b3IudHh0CkBAIC0wLDAgKzEgQEAKK3Rvby1mZXctcHVibGljLW1ldGhvZHM6ODowOkFhYWE6VG9vIGZldyBwdWJsaWMgbWV0aG9kcyAoMC8yKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9hcmd1bWVudF9uYW1lLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9hcmd1bWVudF9uYW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGIxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2FyZ3VtZW50X25hbWUucHkKQEAgLTAsMCArMSwxNCBAQAorIiIiQ2hlY2sgZm9yIGR1cGxpY2F0ZSBmdW5jdGlvbiBhcmd1bWVudHMuIiIiCisKKworZGVmIGZvbzEoXywgXyk6ICMgW2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lLCBkdXBsaWNhdGUtYXJndW1lbnQtbmFtZV0KKyAgICAiIiJGdW5jdGlvbiB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lLiIiIgorCitkZWYgZm9vMihfYWJjLCAqLCBfYWJjKTogIyBbZHVwbGljYXRlLWFyZ3VtZW50LW5hbWUsIGR1cGxpY2F0ZS1hcmd1bWVudC1uYW1lXQorICAgICIiIkZ1bmN0aW9uIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWUuIiIiCisKK2RlZiBmb28zKF8sIF89Myk6ICMgW2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lLCBkdXBsaWNhdGUtYXJndW1lbnQtbmFtZV0KKyAgICAiIiJGdW5jdGlvbiB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lLiIiIgorCitkZWYgZm9vNChfLCAqLCBfKTogIyBbZHVwbGljYXRlLWFyZ3VtZW50LW5hbWUsIGR1cGxpY2F0ZS1hcmd1bWVudC1uYW1lXQorICAgICIiIkZ1bmN0aW9uIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWUuIiIiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2FyZ3VtZW50X25hbWUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9hcmd1bWVudF9uYW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODMyMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9hcmd1bWVudF9uYW1lLnR4dApAQCAtMCwwICsxLDggQEAKK2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lOjQ6OTpmb28xOkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lIF8gaW4gZnVuY3Rpb24gZGVmaW5pdGlvbgorZHVwbGljYXRlLWFyZ3VtZW50LW5hbWU6NDoxMjpmb28xOkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lIF8gaW4gZnVuY3Rpb24gZGVmaW5pdGlvbgorZHVwbGljYXRlLWFyZ3VtZW50LW5hbWU6Nzo5OmZvbzI6RHVwbGljYXRlIGFyZ3VtZW50IG5hbWUgX2FiYyBpbiBmdW5jdGlvbiBkZWZpbml0aW9uCitkdXBsaWNhdGUtYXJndW1lbnQtbmFtZTo3OjE4OmZvbzI6RHVwbGljYXRlIGFyZ3VtZW50IG5hbWUgX2FiYyBpbiBmdW5jdGlvbiBkZWZpbml0aW9uCitkdXBsaWNhdGUtYXJndW1lbnQtbmFtZToxMDo5OmZvbzM6RHVwbGljYXRlIGFyZ3VtZW50IG5hbWUgXyBpbiBmdW5jdGlvbiBkZWZpbml0aW9uCitkdXBsaWNhdGUtYXJndW1lbnQtbmFtZToxMDoxMjpmb28zOkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lIF8gaW4gZnVuY3Rpb24gZGVmaW5pdGlvbgorZHVwbGljYXRlLWFyZ3VtZW50LW5hbWU6MTM6OTpmb280OkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lIF8gaW4gZnVuY3Rpb24gZGVmaW5pdGlvbgorZHVwbGljYXRlLWFyZ3VtZW50LW5hbWU6MTM6MTU6Zm9vNDpEdXBsaWNhdGUgYXJndW1lbnQgbmFtZSBfIGluIGZ1bmN0aW9uIGRlZmluaXRpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfYXJndW1lbnRfbmFtZV9weTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2FyZ3VtZW50X25hbWVfcHkzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmJlMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2FyZ3VtZW50X25hbWVfcHkzLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiQ2hlY2sgZm9yIGR1cGxpY2F0ZSBmdW5jdGlvbiBrZXl3b3Jkb25seSBhcmd1bWVudHMuIiIiCisKKworZGVmIGZvbzEoXywgKl8sIF89Myk6ICMgW2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lLCBkdXBsaWNhdGUtYXJndW1lbnQtbmFtZV0KKyAgICAiIiJGdW5jdGlvbiB3aXRoIGR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lLiIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9hcmd1bWVudF9uYW1lX3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfYXJndW1lbnRfbmFtZV9weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfYXJndW1lbnRfbmFtZV9weTMucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2FyZ3VtZW50X25hbWVfcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfYXJndW1lbnRfbmFtZV9weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDJmYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2FyZ3VtZW50X25hbWVfcHkzLnR4dApAQCAtMCwwICsxLDIgQEAKK2R1cGxpY2F0ZS1hcmd1bWVudC1uYW1lOjQ6OTpmb28xOkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lIF8gaW4gZnVuY3Rpb24gZGVmaW5pdGlvbgorZHVwbGljYXRlLWFyZ3VtZW50LW5hbWU6NDoxNjpmb28xOkR1cGxpY2F0ZSBhcmd1bWVudCBuYW1lIF8gaW4gZnVuY3Rpb24gZGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9iYXNlcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfYmFzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiMzI5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfYmFzZXMucHkKQEAgLTAsMCArMSwxOCBAQAorIiIiVGVzdCBkdXBsaWNhdGUgYmFzZXMgZXJyb3IuIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxuby1pbml0DQorDQorDQorY2xhc3MgRHVwbGljYXRlcyhzdHIsIHN0cik6ICAjIFtkdXBsaWNhdGUtYmFzZXNdDQorICAgIHBhc3MNCisNCisNCitjbGFzcyBBbHBoYShzdHIpOg0KKyAgICBwYXNzDQorDQorDQorY2xhc3MgTm90RHVwbGljYXRlcyhBbHBoYSwgc3RyKToNCisgICAgIiIiVGhlIGVycm9yIHNob3VsZCBub3QgYmUgZW1pdHRlZCBmb3IgdGhpcyBjYXNlLCBzaW5jZSB0aGUNCisgICAgb3RoZXIgc2FtZSBiYXNlIGNvbWVzIGZyb20gdGhlIGFuY2VzdG9ycy4iIiINCisNCisNCitwcmludChEdXBsaWNhdGVzLl9fbXJvX18pDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9iYXNlcy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2Jhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTEwODZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9iYXNlcy50eHQKQEAgLTAsMCArMSBAQAorZHVwbGljYXRlLWJhc2VzOjU6MDpEdXBsaWNhdGVzOkR1cGxpY2F0ZSBiYXNlcyBmb3IgY2xhc3MgJ0R1cGxpY2F0ZXMnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2RpY3RfbGl0ZXJhbF9rZXkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2RpY3RfbGl0ZXJhbF9rZXkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlYWIyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfZGljdF9saXRlcmFsX2tleS5weQpAQCAtMCwwICsxLDE3IEBACisiIiJDaGVjayBtdWx0aXBsZSBrZXkgZGVmaW5pdGlvbiIiIgorIyBweWxpbnQ6IGRpc2FibGU9cG9pbnRsZXNzLXN0YXRlbWVudAorCitjb3JyZWN0X2RpY3QgPSB7CisgICAgJ3RlYSc6ICdmb3IgdHdvJywKKyAgICAndHdvJzogJ2ZvciB0ZWEnLAorfQorCit3cm9uZ19kaWN0ID0geyAgIyBbZHVwbGljYXRlLWtleV0KKyAgICAndGVhJzogJ2ZvciB0d28nLAorICAgICd0d28nOiAnZm9yIHRlYScsCisgICAgJ3RlYSc6ICd0aW1lJywKKworfQorCit7MTogYidhJywgMTogdSdhJ30gIyBbZHVwbGljYXRlLWtleV0KK3sxOiAxLCAxLjA6IDJ9ICMgW2R1cGxpY2F0ZS1rZXldCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2RpY3RfbGl0ZXJhbF9rZXkudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9kaWN0X2xpdGVyYWxfa2V5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZmMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9kaWN0X2xpdGVyYWxfa2V5LnR4dApAQCAtMCwwICsxLDMgQEAKK2R1cGxpY2F0ZS1rZXk6OToxMzo6RHVwbGljYXRlIGtleSAndGVhJyBpbiBkaWN0aW9uYXJ5CitkdXBsaWNhdGUta2V5OjE2OjA6OkR1cGxpY2F0ZSBrZXkgMSBpbiBkaWN0aW9uYXJ5CitkdXBsaWNhdGUta2V5OjE3OjA6OkR1cGxpY2F0ZSBrZXkgMS4wIGluIGRpY3Rpb25hcnkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfZXhjZXB0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9leGNlcHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4Y2Y3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfZXhjZXB0LnB5CkBAIC0wLDAgKzEsMTIgQEAKKyIiIlRlc3QgZm9yIGR1cGxpY2F0ZS1jaGVjay4iIiIKKworZGVmIG1haW4oKToKKyAgICAiIiJUaGUgc2Vjb25kIFZhbHVlRXJyb3Igc2hvdWxkIGJlIGZsYWdnZWQuIiIiCisgICAgdHJ5OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0ZXN0JykKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcmV0dXJuIDEKKyAgICBleGNlcHQgVmFsdWVFcnJvcjogICMgW2R1cGxpY2F0ZS1leGNlcHRdCisgICAgICAgIHJldHVybiAyCisgICAgZXhjZXB0IChPU0Vycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICByZXR1cm4gMwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9leGNlcHQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9leGNlcHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOGRmOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX2V4Y2VwdC50eHQKQEAgLTAsMCArMSBAQAorZHVwbGljYXRlLWV4Y2VwdDo5OjExOm1haW46Q2F0Y2hpbmcgcHJldmlvdXNseSBjYXVnaHQgZXhjZXB0aW9uIHR5cGUgVmFsdWVFcnJvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9kL2R1cGxpY2F0ZV9zdHJpbmdfZm9ybWF0dGluZ19hcmd1bWVudC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfc3RyaW5nX2Zvcm1hdHRpbmdfYXJndW1lbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMmY5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfc3RyaW5nX2Zvcm1hdHRpbmdfYXJndW1lbnQucHkKQEAgLTAsMCArMSwxNSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworTkFNRSA9IDQyCitPVEhFUl9OQU1FID0gMjQKK09USEVSX09USEVSX05BTUUgPSAyCisKKyMgKzE6IFtkdXBsaWNhdGUtc3RyaW5nLWZvcm1hdHRpbmctYXJndW1lbnQsZHVwbGljYXRlLXN0cmluZy1mb3JtYXR0aW5nLWFyZ3VtZW50XQorQ09OU1QgPSAic29tZSB2YWx1ZSB7fSBzb21lIG90aGVyIHZhbHVlIHt9IHt9IHt9IHt9IHt9Ii5mb3JtYXQoCisgICAgTkFNRSwKKyAgICBOQU1FLAorICAgIE9USEVSX05BTUUsCisgICAgT1RIRVJfTkFNRSwKKyAgICBPVEhFUl9OQU1FLAorICAgIE9USEVSX09USEVSX05BTUUsCispCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX3N0cmluZ19mb3JtYXR0aW5nX2FyZ3VtZW50LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZC9kdXBsaWNhdGVfc3RyaW5nX2Zvcm1hdHRpbmdfYXJndW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzQzODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2QvZHVwbGljYXRlX3N0cmluZ19mb3JtYXR0aW5nX2FyZ3VtZW50LnR4dApAQCAtMCwwICsxLDIgQEAKK2R1cGxpY2F0ZS1zdHJpbmctZm9ybWF0dGluZy1hcmd1bWVudDo4Ojg6OkR1cGxpY2F0ZSBzdHJpbmcgZm9ybWF0dGluZyBhcmd1bWVudCAnTkFNRScsIGNvbnNpZGVyIHBhc3NpbmcgYXMgbmFtZWQgYXJndW1lbnQKK2R1cGxpY2F0ZS1zdHJpbmctZm9ybWF0dGluZy1hcmd1bWVudDo4Ojg6OkR1cGxpY2F0ZSBzdHJpbmcgZm9ybWF0dGluZyBhcmd1bWVudCAnT1RIRVJfTkFNRScsIGNvbnNpZGVyIHBhc3NpbmcgYXMgbmFtZWQgYXJndW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZS9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9lL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2UvZTExMDFfOTU4OF9iYXNlX2F0dHJfYXVnX2Fzc2lnbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9lMTEwMV85NTg4X2Jhc2VfYXR0cl9hdWdfYXNzaWduLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDY4NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZTExMDFfOTU4OF9iYXNlX2F0dHJfYXVnX2Fzc2lnbi5weQpAQCAtMCwwICsxLDM4IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIiCitGYWxzZSBwb3NpdGl2ZSBjYXNlIG9mIEUxMTAxOgorCitUaGUgZXJyb3IgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBzZXQgaW4gdGhlIGJhc2UgY2xhc3MgaXMKK21vZGlmaWVkIHdpdGggYXVnbWVudGVkIGFzc2lnbm1lbnQgaW4gYSBkZXJpdmVkIGNsYXNzLgorCitodHRwczovL3d3dy5sb2dpbGFiLm9yZy90aWNrZXQvOTU4OAorIiIiCitfX3JldmlzaW9uX18gPSAwCisKK2NsYXNzIEJhc2VDbGFzcyhvYmplY3QpOgorICAgICJUaGUgYmFzZSBjbGFzcyIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICJTZXQgYW4gYXR0cmlidXRlLiIKKyAgICAgICAgc2VsZi5lMTEwMSA9IDEKKworY2xhc3MgRmFsc2VQb3NpdGl2ZUNsYXNzKEJhc2VDbGFzcyk6CisgICAgIlRoZSBmaXJzdCBkZXJpdmVkIGNsYXNzIHdoaWNoIHRyaWdnZXJzIHRoZSBmYWxzZSBwb3NpdGl2ZSIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICJBdWdtZW50ZWQgYXNzaWdubWVudCB0cmlnZ2VycyBFMTEwMS4iCisgICAgICAgIEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmUxMTAxICs9IDEKKworICAgIGRlZiBjb3VudHVwKHNlbGYpOgorICAgICAgICAiQ29uc2VxdWVudGx5IHRoaXMgYWxzbyB0cmlnZ2VycyBFMTEwMS4iCisgICAgICAgIHNlbGYuZTExMDEgKz0gMQorCitjbGFzcyBOZWdhdGl2ZUNsYXNzKEJhc2VDbGFzcyk6CisgICAgIlRoZSBzZWNvbmQgZGVyaXZlZCBjbGFzcywgd2hpY2ggZG9lcyBub3QgdHJpZ2dlciB0aGUgZXJyb3IgRTExMDEiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiT3JkaW5hcnkgYXNzaWdubWVudCBpcyBPSy4iCisgICAgICAgIEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmUxMTAxID0gc2VsZi5lMTEwMSArIDEKKworICAgIGRlZiBjb3VudHVwKHNlbGYpOgorICAgICAgICAiTm8gcHJvYmxlbS4iCisgICAgICAgIHNlbGYuZTExMDEgKz0gMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9lL2VudW1fc3ViY2xhc3Nlcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9lbnVtX3N1YmNsYXNzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1Y2IyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9lbnVtX3N1YmNsYXNzZXMucHkKQEAgLTAsMCArMSwxOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKK2Zyb20gZW51bSBpbXBvcnQgRW51bSwgSW50RW51bQorCisKK2NsYXNzIElzc3VlMTkzMihJbnRFbnVtKToKKyAgICAiIiJodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8xOTMyIiIiCisgICAgRk9PID0gMQorCisgICAgZGVmIHdoYXRzX215X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUubG93ZXIoKQorCisKK2NsYXNzIElzc3VlMjA2MihFbnVtKToKKyAgICAiIiJodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8yMDYyIiIiCisgICAgRk9PID0gMQorICAgIEJBUiA9IDIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lLmxvd2VyKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZS9ldmFsX3VzZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZXZhbF91c2VkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2RhZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZXZhbF91c2VkLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiInRlc3QgZm9yIGV2YWwgdXNhZ2UiIiIKKworZXZhbCgnb3MubGlzdGRpcigiLiIpJykgIyBbZXZhbC11c2VkXQorZXZhbCgnb3MubGlzdGRpcigiLiIpJywgZ2xvYmFscz17fSkgICMgW2V2YWwtdXNlZF0KKworZXZhbCgnb3MubGlzdGRpcigiLiIpJywgZ2xvYmFscz1nbG9iYWxzKCkpICAjIFtldmFsLXVzZWRdCisKK2RlZiBmdW5jKCk6CisgICAgIiIiIGV2YWwgaW4gbG9jYWwgc2NvcGUiIiIKKyAgICBldmFsKCdiID0gMScpICAjIFtldmFsLXVzZWRdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2UvZXZhbF91c2VkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9ldmFsX3VzZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Y2RjNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZXZhbF91c2VkLnR4dApAQCAtMCwwICsxLDQgQEAKK2V2YWwtdXNlZDozOjA6OlVzZSBvZiBldmFsCitldmFsLXVzZWQ6NDowOjpVc2Ugb2YgZXZhbAorZXZhbC11c2VkOjY6MDo6VXNlIG9mIGV2YWwKK2V2YWwtdXNlZDoxMDo0OmZ1bmM6VXNlIG9mIGV2YWwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlcHRpb25faXNfYmluYXJ5X29wLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9lL2V4Y2VwdGlvbl9pc19iaW5hcnlfb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxMTYzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlcHRpb25faXNfYmluYXJ5X29wLnB5CkBAIC0wLDAgKzEsMTIgQEAKKyIiIldhcm4gYWJvdXQgYmluYXJ5IG9wZXJhdGlvbnMgdXNlZCBhcyBleGNlcHRpb25zLiIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCBFeGNlcHRpb24gb3IgQmFzZUV4Y2VwdGlvbjogICMgW2JpbmFyeS1vcC1leGNlcHRpb25dCisgICAgcHJpbnQoImNhdWdodDEiKQorZXhjZXB0IEV4Y2VwdGlvbiBhbmQgQmFzZUV4Y2VwdGlvbjogICMgW2JpbmFyeS1vcC1leGNlcHRpb25dCisgICAgcHJpbnQoImNhdWdodDIiKQorZXhjZXB0IEV4Y2VwdGlvbiBvciBCYXNlRXhjZXB0aW9uOiAgIyBbYmluYXJ5LW9wLWV4Y2VwdGlvbl0KKyAgICBwcmludCgiY2F1Z2h0MyIpCitleGNlcHQgKEV4Y2VwdGlvbiBvciBCYXNlRXhjZXB0aW9uKSBhcyBleGM6ICAjIFtiaW5hcnktb3AtZXhjZXB0aW9uXQorICAgIHByaW50KCJjYXVnaHQ0IikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlcHRpb25faXNfYmluYXJ5X29wLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlcHRpb25faXNfYmluYXJ5X29wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk1YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9lL2V4Y2VwdGlvbl9pc19iaW5hcnlfb3AudHh0CkBAIC0wLDAgKzEsNCBAQAorYmluYXJ5LW9wLWV4Y2VwdGlvbjo1OjA6OiJFeGNlcHRpb24gdG8gY2F0Y2ggaXMgdGhlIHJlc3VsdCBvZiBhIGJpbmFyeSAiIm9yIiIgb3BlcmF0aW9uIgorYmluYXJ5LW9wLWV4Y2VwdGlvbjo3OjA6OiJFeGNlcHRpb24gdG8gY2F0Y2ggaXMgdGhlIHJlc3VsdCBvZiBhIGJpbmFyeSAiImFuZCIiIG9wZXJhdGlvbiIKK2JpbmFyeS1vcC1leGNlcHRpb246OTowOjoiRXhjZXB0aW9uIHRvIGNhdGNoIGlzIHRoZSByZXN1bHQgb2YgYSBiaW5hcnkgIiJvciIiIG9wZXJhdGlvbiIKK2JpbmFyeS1vcC1leGNlcHRpb246MTE6MDo6IkV4Y2VwdGlvbiB0byBjYXRjaCBpcyB0aGUgcmVzdWx0IG9mIGEgYmluYXJ5ICIib3IiIiBvcGVyYXRpb24iCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2UvZXhjZXNzX2VzY2FwZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZXhjZXNzX2VzY2FwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmYTRkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlc3NfZXNjYXBlcy5weQpAQCAtMCwwICsxLDMyIEBACisjIHB5bGludDpkaXNhYmxlPXBvaW50bGVzcy1zdHJpbmctc3RhdGVtZW50LCBmaXhtZSwgbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQsIGNvbXBhcmlzb24td2l0aC1pdHNlbGYKKyIiIlN0cmF5IGJhY2tzbGFzaCBlc2NhcGVzIG1heSBiZSBtaXNzaW5nIGEgcmF3LXN0cmluZyBwcmVmaXguIiIiCisKK19fcmV2aXNpb25fXyA9ICckSWQkJworCisjIEJhZCBlc2NhcGUgc2VxdWVuY2VzLCB3aGljaCBwcm9iYWJseSBkb24ndCBkbyB3aGF0IHlvdSBleHBlY3QuCitBID0gIlxbXF1cXCIgICMgW2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nLGFub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nXQorYXNzZXJ0ICdcLycgPT0gJ1xcLycgIyBbYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmddCitFU0NBUEVfQkFDS1NMQVNIID0gJ1xgJyAgIyBbYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmddCisKKyMgVmFsaWQgZXNjYXBlIHNlcXVlbmNlcy4KK05FV0xJTkUgPSAiXG4iCitPTERfRVNDQVBFUyA9ICdcYVxiXGZcblx0XHJcdicKK0hFWCA9ICdceGFkXHgwYVx4MGQnCisjICsxOlthbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZyxhbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZ10KK0ZBTFNFX09DVEFMID0gJ1xvMTIzXG8wMDAnICAjIE5vdCBvY3RhbCBpbiBQeXRob24KK09DVEFMID0gJ1wxMjNcMDAwJworTk9UX09DVEFMID0gJ1w4ODhcOTk5JyAgIyBbYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmcsYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmddCitOVUwgPSAnXDAnCitVTklDT0RFID0gdSdcdTEyMzQnCitISUdIX1VOSUNPREUgPSB1J1xVMDAwMGFiY2QnCitRVU9URVMgPSAnXCdcIicKK0xJVEVSQUxfTkVXTElORSA9ICdcCisnCitFU0NBUEVfVU5JQ09ERSA9ICJcXFxcbiIKKworIyBCYWQgZG9jc3RyaW5nCisjICszOlthbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZ10KKyIiIkV2ZW4gaW4gYSBkb2NzdHJpbmcKKworWW91IHNob3VsZG4ndCBoYXZlIGFtYmlndW91cyB0ZXh0IGxpa2U6IEM6XFByb2dyYW0gRmlsZXNcYWxwaGEKKyIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9lL2V4Y2Vzc19lc2NhcGVzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlc3NfZXNjYXBlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmYTU1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGNlc3NfZXNjYXBlcy50eHQKQEAgLTAsMCArMSw5IEBACithbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZzo3OjU6OiJBbm9tYWxvdXMgYmFja3NsYXNoIGluIHN0cmluZzogJ1xbJy4gU3RyaW5nIGNvbnN0YW50IG1pZ2h0IGJlIG1pc3NpbmcgYW4gciBwcmVmaXguIgorYW5vbWFsb3VzLWJhY2tzbGFzaC1pbi1zdHJpbmc6Nzo3OjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcXScuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjg6ODo6IkFub21hbG91cyBiYWNrc2xhc2ggaW4gc3RyaW5nOiAnXC8nLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIHByZWZpeC4iCithbm9tYWxvdXMtYmFja3NsYXNoLWluLXN0cmluZzo5OjIwOjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcYCcuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjE2OjE1OjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcbycuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjE2OjIwOjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcbycuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjE4OjEzOjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcOCcuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjE4OjE3OjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcOScuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKK2Fub21hbG91cy1iYWNrc2xhc2gtaW4tc3RyaW5nOjMxOjQyOjoiQW5vbWFsb3VzIGJhY2tzbGFzaCBpbiBzdHJpbmc6ICdcUCcuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgcHJlZml4LiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGVjX3VzZWRfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9lL2V4ZWNfdXNlZF9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4NDk0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGVjX3VzZWRfcHkzLnB5CkBAIC0wLDAgKzEsOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworZXhlYygnYSA9IF9fcmV2aXNpb25fXycpICMgW2V4ZWMtdXNlZF0KK2V4ZWMoJ2EgPSAxJywgZ2xvYmFscz17fSkgIyBbZXhlYy11c2VkXQorCitleGVjKCdhID0gMScsIGdsb2JhbHM9Z2xvYmFscygpKSAjIFtleGVjLXVzZWRdCisKK2RlZiBmdW5jKCk6CisgICAgZXhlYygnYiA9IDEnKSAjIFtleGVjLXVzZWRdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2UvZXhlY191c2VkX3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGVjX3VzZWRfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZXhlY191c2VkX3B5My5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGVjX3VzZWRfcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leGVjX3VzZWRfcHkzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmZhYjFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9lL2V4ZWNfdXNlZF9weTMudHh0CkBAIC0wLDAgKzEsNCBAQAorZXhlYy11c2VkOjM6MDo6VXNlIG9mIGV4ZWMKK2V4ZWMtdXNlZDo0OjA6OlVzZSBvZiBleGVjCitleGVjLXVzZWQ6NjowOjpVc2Ugb2YgZXhlYworZXhlYy11c2VkOjk6NDpmdW5jOlVzZSBvZiBleGVjCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2UvZXh0ZXJuYWxfY2xhc3NtZXRob2RfY3Jhc2gucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2UvZXh0ZXJuYWxfY2xhc3NtZXRob2RfY3Jhc2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2YjkyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZS9leHRlcm5hbF9jbGFzc21ldGhvZF9jcmFzaC5weQpAQCAtMCwwICsxLDIxIEBACisjIHB5bGludDogZGlzYWJsZT1uby1pbml0LHRvby1mZXctcHVibGljLW1ldGhvZHMsdW51c2VkLWFyZ3VtZW50LHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiJ0YWdnaW5nIGEgZnVuY3Rpb24gYXMgYSBjbGFzcyBtZXRob2QgY2F1c2UgYSBjcmFzaCB3aGVuIGNoZWNraW5nIGZvcgorc2lnbmF0dXJlIG92ZXJyaWRpbmcKKyIiIgorCitkZWYgZmV0Y2hfY29uZmlnKG1haW5hdHRyPU5vbmUpOgorICAgICIiInJldHVybiBhIGNsYXNzIG1ldGhvZCIiIgorCisgICAgZGVmIGZldGNoX29yZGVyKGNscywgYXR0ciwgdmFyKToKKyAgICAgICAgIiIiYSBjbGFzcyBtZXRob2QiIiIKKyAgICAgICAgaWYgYXR0ciA9PSBtYWluYXR0cjoKKyAgICAgICAgICAgIHJldHVybiB2YXIKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBmZXRjaF9vcmRlciA9IGNsYXNzbWV0aG9kKGZldGNoX29yZGVyKQorICAgIHJldHVybiBmZXRjaF9vcmRlcgorCitjbGFzcyBBYWEob2JqZWN0KToKKyAgICAiIiJob3AiIiIKKyAgICBmZXRjaF9vcmRlciA9IGZldGNoX2NvbmZpZygnQScpCisKK19fcmV2aXNpb25fXyA9IE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2JhZF9idWlsdGlucy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2JhZF9idWlsdGlucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzM3ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvYmFkX2J1aWx0aW5zLnB5CkBAIC0wLDAgKzEsMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKK2lucHV0KCJZZXMgb3Igbm8gPyAoWT0xLCBuPTApIikgICMgW2JhZC1idWlsdGluXQorcHJpbnQobWFwKHN0ciwgZmlsdGVyKDEsIFsxLCAyLCAzXSkpKSAgIyBbYmFkLWJ1aWx0aW4sIGJhZC1idWlsdGluLCBiYWQtYnVpbHRpbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2JhZF9idWlsdGlucy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2JhZF9idWlsdGlucy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJiOWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvYmFkX2J1aWx0aW5zLnJjCkBAIC0wLDAgKzEsNSBAQAorW01BU1RFUl0KK2xvYWQtcGx1Z2lucyA9IHB5bGludC5leHRlbnNpb25zLmJhZF9idWlsdGluCisKK1tweWxpbnQuREVQUkVDQVRFRF9CVUlMVElOU10KK2JhZC1mdW5jdGlvbnM9bWFwLGlucHV0LGZpbHRlcixwcmludApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvYmFkX2J1aWx0aW5zLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2JhZF9idWlsdGlucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzYjFkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2JhZF9idWlsdGlucy50eHQKQEAgLTAsMCArMSw0IEBACitiYWQtYnVpbHRpbjoyOjA6OlVzZWQgYnVpbHRpbiBmdW5jdGlvbiAnaW5wdXQnCitiYWQtYnVpbHRpbjozOjE1OjpVc2VkIGJ1aWx0aW4gZnVuY3Rpb24gJ2ZpbHRlcicuIFVzaW5nIGEgbGlzdCBjb21wcmVoZW5zaW9uIGNhbiBiZSBjbGVhcmVyLgorYmFkLWJ1aWx0aW46Mzo2OjpVc2VkIGJ1aWx0aW4gZnVuY3Rpb24gJ21hcCcuIFVzaW5nIGEgbGlzdCBjb21wcmVoZW5zaW9uIGNhbiBiZSBjbGVhcmVyLgorYmFkLWJ1aWx0aW46MzowOjpVc2VkIGJ1aWx0aW4gZnVuY3Rpb24gJ3ByaW50JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX25hbWVkdHVwbGVfb3JfZGF0YWNsYXNzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX25hbWVkdHVwbGVfb3JfZGF0YWNsYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2RlNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfbmFtZWR0dXBsZV9vcl9kYXRhY2xhc3MucHkKQEAgLTAsMCArMSw3NCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyx1bnVzZWQtdmFyaWFibGUsbm8tbmFtZS1pbi1tb2R1bGUKK2Zyb20gdHlwaW5nIGltcG9ydCBGaW5hbAorCitjbGFzcyBGb286CisgICAgQkFSID0gImJhciIKKworS0VZXzMgPSAia2V5XzMiCisKKworIyBTdWJkaWN0cyBoYXZlIGF0IGxlYXN0IDEgY29tbW9uIGtleQorTUFQUElOR18xID0geyAgIyBbY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3NdCisgICAgImVudHJ5XzEiOiB7ImtleV8xIjogMCwgImtleV8yIjogMSwgImtleV9kaWZmXzEiOiAyfSwKKyAgICAiZW50cnlfMiI6IHsia2V5XzEiOiAwLCAia2V5XzIiOiAxLCAia2V5X2RpZmZfMiI6IDN9LAorfQorTUFQUElOR18yID0geyAgIyBbY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3NdCisgICAgImVudHJ5XzEiOiB7S0VZXzM6IE5vbmUsIEZvby5CQVI6IE5vbmV9LAorICAgICJlbnRyeV8yIjoge0tFWV8zOiBOb25lLCBGb28uQkFSOiBOb25lfSwKK30KKworIyBpbnRzIGFyZSBub3QgdmFsaWQgZmllbGRuYW1lcyBmb3IgbmFtZWR0dXBsZXMKK01BUFBJTkdfMyA9IHsKKyAgICAiZW50cnlfMSI6IHswOiBOb25lLCAxOiBOb25lfSwKKyAgICAiZW50cnlfMiI6IHswOiBOb25lLCAxOiBOb25lfSwKK30KKworCitkZWYgZnVuYygpOgorICAgICMgTm90IGluIG1vZHVsZSBzY29wZQorICAgIG1hcHBpbmdfNCA9IHsKKyAgICAgICAgImVudHJ5XzEiOiB7ImtleV8xIjogMCwgImtleV8yIjogMX0sCisgICAgICAgICJlbnRyeV8yIjogeyJrZXlfMSI6IDAsICJrZXlfMiI6IDF9LAorICAgIH0KKworICAgIG1hcHBpbmdfNTogRmluYWwgPSB7ICAjIFtjb25zaWRlci11c2luZy1uYW1lZHR1cGxlLW9yLWRhdGFjbGFzc10KKyAgICAgICAgImVudHJ5XzEiOiB7ImtleV8xIjogMCwgImtleV8yIjogMX0sCisgICAgICAgICJlbnRyeV8yIjogeyJrZXlfMSI6IDAsICJrZXlfMiI6IDF9LAorICAgIH0KKworCisjIGxpc3RzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgKK01BUFBJTkdfNiA9IHsgICMgW2NvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzXQorICAgICJlbnRyeV8xIjogWzEsICJhIiwgc2V0KCldLAorICAgICJlbnRyeV8yIjogWzIsICJiIiwgc2V0KCldLAorfQorTUFQUElOR183ID0geworICAgICJlbnRyeV8xIjogW10sCisgICAgImVudHJ5XzIiOiBbXSwKK30KK01BUFBJTkdfOCA9IHsKKyAgICAiZW50cnlfMSI6IFsxXSwKKyAgICAiZW50cnlfMiI6IFsyLCAiYiJdLAorfQorTUFQUElOR185ID0geyAgIyBbY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3NdCisgICAgImVudHJ5XzEiOiAoMSwgImEiKSwKKyAgICAiZW50cnlfMiI6ICgyLCAiYiIpLAorfQorCisjIE5vIGVudHJ5IGNhbid0IGNvbnRhaW4gb25seSBkaWN0cworTUFQUElOR18xMCA9IHsKKyAgICAiZW50cnlfMSI6IFsKKyAgICAgICAgeyJrZXlfMSI6IE5vbmUsICJrZXlfMiI6IE5vbmV9LAorICAgIF0sCisgICAgImVudHJ5XzIiOiBbTm9uZV0KK30KKworIyBObyBlaXRoZXIgZGljdCwgdHVwbGUsIG9yIGxpc3QgYXMgZGljdCB2YWx1ZXMKK01BUFBJTkdfMTEgPSB7CisgICAgImVudHJ5XzEiOiAxLAorICAgICJlbnRyeV8yIjogMiwKK30KK01BUFBJTkdfMTIgPSB7CisgICAgImVudHJ5XzEiOiAiIiwKKyAgICAiZW50cnlfMiI6ICIiLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX25hbWVkdHVwbGVfb3JfZGF0YWNsYXNzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX25hbWVkdHVwbGVfb3JfZGF0YWNsYXNzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzY3YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfbmFtZWR0dXBsZV9vcl9kYXRhY2xhc3MucmMKQEAgLTAsMCArMSwyIEBACitbTUFTVEVSXQorbG9hZC1wbHVnaW5zPXB5bGludC5leHRlbnNpb25zLmNvZGVfc3R5bGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvZGVfc3R5bGUvY29kZV9zdHlsZV9jb25zaWRlcl91c2luZ19uYW1lZHR1cGxlX29yX2RhdGFjbGFzcy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfbmFtZWR0dXBsZV9vcl9kYXRhY2xhc3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDcxZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfbmFtZWR0dXBsZV9vcl9kYXRhY2xhc3MudHh0CkBAIC0wLDAgKzEsNSBAQAorY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3M6MTE6MTI6OkNvbnNpZGVyIHVzaW5nIG5hbWVkdHVwbGUgb3IgZGF0YWNsYXNzIGZvciBkaWN0aW9uYXJ5IHZhbHVlcworY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3M6MTU6MTI6OkNvbnNpZGVyIHVzaW5nIG5hbWVkdHVwbGUgb3IgZGF0YWNsYXNzIGZvciBkaWN0aW9uYXJ5IHZhbHVlcworY29uc2lkZXItdXNpbmctbmFtZWR0dXBsZS1vci1kYXRhY2xhc3M6MzQ6MjM6ZnVuYzpDb25zaWRlciB1c2luZyBuYW1lZHR1cGxlIG9yIGRhdGFjbGFzcyBmb3IgZGljdGlvbmFyeSB2YWx1ZXMKK2NvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzOjQxOjEyOjpDb25zaWRlciB1c2luZyBuYW1lZHR1cGxlIG9yIGRhdGFjbGFzcyBmb3IgZGljdGlvbmFyeSB2YWx1ZXMKK2NvbnNpZGVyLXVzaW5nLW5hbWVkdHVwbGUtb3ItZGF0YWNsYXNzOjUzOjEyOjpDb25zaWRlciB1c2luZyBuYW1lZHR1cGxlIG9yIGRhdGFjbGFzcyBmb3IgZGljdGlvbmFyeSB2YWx1ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvZGVfc3R5bGUvY29kZV9zdHlsZV9jb25zaWRlcl91c2luZ190dXBsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvZGVfc3R5bGUvY29kZV9zdHlsZV9jb25zaWRlcl91c2luZ190dXBsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzllZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX3R1cGxlLnB5CkBAIC0wLDAgKzEsMjkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50LHVubmVjZXNzYXJ5LWNvbXByZWhlbnNpb24KKwordmFyID0gKDEsIDIsIDMpCisKK2ZvciB4IGluIHZhcjoKKyAgICBwYXNzCitmb3IgeCBpbiAoMSwgMiwgMyk6CisgICAgcGFzcworZm9yIHggaW4gWzEsIDIsIDNdOiAgIyBbY29uc2lkZXItdXNpbmctdHVwbGVdCisgICAgcGFzcworCisoeCBmb3IgeCBpbiB2YXIpCisoeCBmb3IgeCBpbiAoMSwgMiwgMykpCisoeCBmb3IgeCBpbiBbMSwgMiwgM10pICAjIFtjb25zaWRlci11c2luZy10dXBsZV0KKyh4IGZvciB4IGluIHsxLCAyLCAzfSkgICMgW2NvbnNpZGVyLXVzaW5nLXR1cGxlXQorCitbeCBmb3IgeCBpbiB2YXJdCitbeCBmb3IgeCBpbiAoMSwgMiwgMyldCitbeCBmb3IgeCBpbiBbMSwgMiwgM11dICAjIFtjb25zaWRlci11c2luZy10dXBsZV0KKworCisjIGxpc3Qvc2V0IGNhbid0IGJlIHJlcGxhY2VkIGlmIHR1cGxlIHVucGFja2luZyBpcyB1c2VkCitmb3IgeCBpbiBbKnZhcl06CisgICAgcGFzcworZm9yIHggaW4gWzIsICp2YXJdOgorICAgIHBhc3MKKworW3ggZm9yIHggaW4gWyp2YXIsIDJdXQorW3ggZm9yIHggaW4geyp2YXIsIDJ9XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX3R1cGxlLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29kZV9zdHlsZS9jb2RlX3N0eWxlX2NvbnNpZGVyX3VzaW5nX3R1cGxlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzY3YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfdHVwbGUucmMKQEAgLTAsMCArMSwyIEBACitbTUFTVEVSXQorbG9hZC1wbHVnaW5zPXB5bGludC5leHRlbnNpb25zLmNvZGVfc3R5bGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvZGVfc3R5bGUvY29kZV9zdHlsZV9jb25zaWRlcl91c2luZ190dXBsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfdHVwbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzk2YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb2RlX3N0eWxlL2NvZGVfc3R5bGVfY29uc2lkZXJfdXNpbmdfdHVwbGUudHh0CkBAIC0wLDAgKzEsNCBAQAorY29uc2lkZXItdXNpbmctdHVwbGU6OTo5OjpDb25zaWRlciB1c2luZyBhbiBpbi1wbGFjZSB0dXBsZSBpbnN0ZWFkIG9mIGxpc3QKK2NvbnNpZGVyLXVzaW5nLXR1cGxlOjE0OjEyOjpDb25zaWRlciB1c2luZyBhbiBpbi1wbGFjZSB0dXBsZSBpbnN0ZWFkIG9mIGxpc3QKK2NvbnNpZGVyLXVzaW5nLXR1cGxlOjE1OjEyOjpDb25zaWRlciB1c2luZyBhbiBpbi1wbGFjZSB0dXBsZSBpbnN0ZWFkIG9mIHNldAorY29uc2lkZXItdXNpbmctdHVwbGU6MTk6MTI6OkNvbnNpZGVyIHVzaW5nIGFuIGluLXBsYWNlIHR1cGxlIGluc3RlYWQgb2YgbGlzdApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29uZnVzaW5nX2VsaWYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb25mdXNpbmdfZWxpZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFkMWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29uZnVzaW5nX2VsaWYucHkKQEAgLTAsMCArMSw0MSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nLCBtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZworCitkZWYgY2hlY2tfY29uZmlnKG1hY2hpbmUsIG9sZF9jb25mLCBuZXdfY29uZik6CisgICAgIiIiRXhhbXBsZSBjb2RlIHRoYXQgd2lsbCB0cmlnZ2VyIHRoZSBtZXNzYWdlIiIiCisgICAgaWYgb2xkX2NvbmY6CisgICAgICAgIGlmIG5vdCBuZXdfY29uZjoKKyAgICAgICAgICAgIG1hY2hpbmUuZGlzYWJsZSgpCisgICAgICAgIGVsaWYgb2xkX2NvbmYudmFsdWUgIT0gbmV3X2NvbmYudmFsdWU6CisgICAgICAgICAgICBtYWNoaW5lLmRpc2FibGUoKQorICAgICAgICAgICAgbWFjaGluZS5lbmFibGUobmV3X2NvbmYudmFsdWUpCisgICAgZWxpZiBuZXdfY29uZjogICMgW2NvbmZ1c2luZy1jb25zZWN1dGl2ZS1lbGlmXQorICAgICAgICBtYWNoaW5lLmVuYWJsZShuZXdfY29uZi52YWx1ZSkKKworCitkZWYgY2hlY2tfY29uZmlnXzIobWFjaGluZSwgb2xkX2NvbmYsIG5ld19jb25mKToKKyAgICAiIiJFeGFtcGxlIGNvZGUgbXVzdCBub3QgdHJpZ2dlciB0aGUgbWVzc2FnZSwgYmVjYXVzZSB0aGUgaW5uZXIgYmxvY2sgZW5kcyB3aXRoIGVsc2UuIiIiCisgICAgaWYgb2xkX2NvbmY6CisgICAgICAgIGlmIG5vdCBuZXdfY29uZjoKKyAgICAgICAgICAgIG1hY2hpbmUuZGlzYWJsZSgpCisgICAgICAgIGVsaWYgb2xkX2NvbmYudmFsdWUgIT0gbmV3X2NvbmYudmFsdWU6CisgICAgICAgICAgICBtYWNoaW5lLmRpc2FibGUoKQorICAgICAgICAgICAgbWFjaGluZS5lbmFibGUobmV3X2NvbmYudmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzCisgICAgZWxpZiBuZXdfY29uZjoKKyAgICAgICAgbWFjaGluZS5lbmFibGUobmV3X2NvbmYudmFsdWUpCisKK2RlZiBjaGVja19jb25maWdfMyhtYWNoaW5lLCBvbGRfY29uZiwgbmV3X2NvbmYpOgorICAgICIiIgorICAgIEV4YW1wbGUgY29kZSBtdXN0IG5vdCB0cmlnZ2VyIHRoZSBtZXNzYWdlLAorICAgIGJlY2F1c2UgdGhlIGlubmVyIGlmIGlzIG5vdCB0aGUgZmluYWwgbm9kZSBvZiB0aGUgYm9keS4KKyAgICAiIiIKKyAgICBpZiBvbGRfY29uZjoKKyAgICAgICAgaWYgbm90IG5ld19jb25mOgorICAgICAgICAgICAgbWFjaGluZS5kaXNhYmxlKCkKKyAgICAgICAgZWxpZiBvbGRfY29uZi52YWx1ZSAhPSBuZXdfY29uZi52YWx1ZToKKyAgICAgICAgICAgIG1hY2hpbmUuZGlzYWJsZSgpCisgICAgICAgICAgICBtYWNoaW5lLmVuYWJsZShuZXdfY29uZi52YWx1ZSkKKyAgICAgICAgcHJpbnQoIlByb2Nlc3NlZCBvbGQgY29uZmlndXJhdGlvbi4uLiIpCisgICAgZWxpZiBuZXdfY29uZjoKKyAgICAgICAgbWFjaGluZS5lbmFibGUobmV3X2NvbmYudmFsdWUpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb25mdXNpbmdfZWxpZi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvbmZ1c2luZ19lbGlmLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTFiMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9jb25mdXNpbmdfZWxpZi5yYwpAQCAtMCwwICsxLDIgQEAKK1tNQVNURVJdCitsb2FkLXBsdWdpbnM9cHlsaW50LmV4dGVuc2lvbnMuY29uZnVzaW5nX2VsaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvbmZ1c2luZ19lbGlmLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2NvbmZ1c2luZ19lbGlmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNjMGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvY29uZnVzaW5nX2VsaWYudHh0CkBAIC0wLDAgKzEgQEAKK2NvbmZ1c2luZy1jb25zZWN1dGl2ZS1lbGlmOjExOjQ6Y2hlY2tfY29uZmlnOkNvbnNlY3V0aXZlIGVsaWYgd2l0aCBkaWZmZXJpbmcgaW5kZW50YXRpb24gbGV2ZWwsIGNvbnNpZGVyIGNyZWF0aW5nIGEgZnVuY3Rpb24gdG8gc2VwYXJhdGUgdGhlIGlubmVyIGVsaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2RvY3BhcmFtcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2RvY3BhcmFtcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODc5YWZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvZG9jcGFyYW1zLnB5CkBAIC0wLDAgKzEsMTEgQEAKKyIiIkZpeHR1cmUgZm9yIHRlc3RpbmcgbWlzc2luZyBkb2N1bWVudGF0aW9uIGluIGRvY3BhcmFtcy4iIiIKKworCitkZWYgX3ByaXZhdGVfZnVuYyhwYXJhbTEpOiAgIyBbbWlzc2luZy1yZXR1cm4tZG9jLCBtaXNzaW5nLXJldHVybi10eXBlLWRvY10KKyAgICBpZiBwYXJhbTE6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignRXhhbXBsZScpCisgICAgcmV0dXJuIHBhcmFtMQorCisKK2RlZiBfcHJpdmF0ZV9mdW5jMihwYXJhbTEpOiAgIyBbbWlzc2luZy15aWVsZC1kb2MsIG1pc3NpbmcteWllbGQtdHlwZS1kb2NdCisgICAgeWllbGQgcGFyYW0xCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC9kb2NwYXJhbXMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9kb2NwYXJhbXMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNzhiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2RvY3BhcmFtcy5yYwpAQCAtMCwwICsxLDggQEAKK1tNQVNURVJdCitsb2FkLXBsdWdpbnMgPSBweWxpbnQuZXh0ZW5zaW9ucy5kb2NwYXJhbXMKKworW0JBU0lDXQorYWNjZXB0LW5vLXBhcmFtLWRvYyA9IG5vCithY2NlcHQtbm8tcmFpc2UtZG9jID0gbm8KK2FjY2VwdC1uby1yZXR1cm4tZG9jID0gbm8KK2FjY2VwdC1uby15aWVsZHMtZG9jID0gbm8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L2RvY3BhcmFtcy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9kb2NwYXJhbXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYjMyNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC9kb2NwYXJhbXMudHh0CkBAIC0wLDAgKzEsNCBAQAorbWlzc2luZy1yZXR1cm4tZG9jOjQ6MDpfcHJpdmF0ZV9mdW5jOk1pc3NpbmcgcmV0dXJuIGRvY3VtZW50YXRpb24KK21pc3NpbmctcmV0dXJuLXR5cGUtZG9jOjQ6MDpfcHJpdmF0ZV9mdW5jOk1pc3NpbmcgcmV0dXJuIHR5cGUgZG9jdW1lbnRhdGlvbgorbWlzc2luZy15aWVsZC1kb2M6MTA6MDpfcHJpdmF0ZV9mdW5jMjpNaXNzaW5nIHlpZWxkIGRvY3VtZW50YXRpb24KK21pc3NpbmcteWllbGQtdHlwZS1kb2M6MTA6MDpfcHJpdmF0ZV9mdW5jMjpNaXNzaW5nIHlpZWxkIHR5cGUgZG9jdW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ19hbGlhcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0OWRkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXMucHkKQEAgLTAsMCArMSw2MSBAQAorIiIiVGVzdCBweWxpbnQuZXh0ZW5zaW9uLnR5cGluZyAtIGNvbnNpZGVyLXVzaW5nLWFsaWFzCisKKydweS12ZXJzaW9uJyBuZWVkcyB0byBiZSBzZXQgdG8gJzMuNycgb3IgJzMuOCcgYW5kICdydW50aW1lLXR5cGluZz1ubycuCitXaXRoICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBwcmVzZW50LgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdW51c2VkLWFyZ3VtZW50LGxpbmUtdG9vLWxvbmcKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgdHlwaW5nCitmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQXdhaXRhYmxlCitmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBTZXQsIFVuaW9uLCBUeXBlZERpY3QKKwordmFyMTogdHlwaW5nLkRpY3Rbc3RyLCBpbnRdICAjIFtjb25zaWRlci11c2luZy1hbGlhc10KK3ZhcjI6IExpc3RbaW50XSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXIzOiBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbaW50XQordmFyNDogdHlwaW5nLk9yZGVyZWREaWN0W3N0ciwgaW50XSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXI1OiB0eXBpbmcuQXdhaXRhYmxlW05vbmVdICAjIFtjb25zaWRlci11c2luZy1hbGlhc10KK3ZhcjY6IHR5cGluZy5JdGVyYWJsZVtpbnRdICAjIFtjb25zaWRlci11c2luZy1hbGlhc10KK3Zhcjc6IHR5cGluZy5IYXNoYWJsZSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXI4OiB0eXBpbmcuQ29udGV4dE1hbmFnZXJbc3RyXSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXI5OiB0eXBpbmcuUGF0dGVybltzdHJdICAjIFtjb25zaWRlci11c2luZy1hbGlhc10KK3ZhcjEwOiB0eXBpbmcucmUuTWF0Y2hbc3RyXSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXIxMTogbGlzdFtpbnRdCit2YXIxMjogY29sbGVjdGlvbnMuYWJjCit2YXIxMzogQXdhaXRhYmxlW05vbmVdCit2YXIxNDogY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Rbc3RyLCBzdHJdCisKK0FsaWFzMSA9IFNldFtpbnRdCitBbGlhczIgPSBEaWN0W2ludCwgTGlzdFtpbnRdXQorQWxpYXMzID0gVW5pb25baW50LCB0eXBpbmcuTGlzdFtzdHJdXQorQWxpYXM0ID0gTGlzdCAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCisKK2RlZiBmdW5jMShhcmcxOiBMaXN0W2ludF0sIC8sICphcmdzOiBMaXN0W2ludF0sIGFyZzI6IHNldFtpbnRdLCAqKmt3YXJnczogRGljdFtzdHIsIGludF0pIC0+IHR5cGluZy5UdXBsZVtpbnRdOgorICAgICMgLTE6W2NvbnNpZGVyLXVzaW5nLWFsaWFzLGNvbnNpZGVyLXVzaW5nLWFsaWFzLGNvbnNpZGVyLXVzaW5nLWFsaWFzLGNvbnNpZGVyLXVzaW5nLWFsaWFzXQorICAgIHBhc3MKKworZGVmIGZ1bmMyKGFyZzE6IGxpc3RbaW50XSkgLT4gdHVwbGVbaW50LCBpbnRdOgorICAgIHBhc3MKKworY2xhc3MgQ3VzdG9tSW50TGlzdCh0eXBpbmcuTGlzdFtpbnRdKToKKyAgICBwYXNzCisKK2Nhc3RfdmFyaWFibGUgPSBbMSwgMiwgM10KK2Nhc3RfdmFyaWFibGUgPSB0eXBpbmcuY2FzdChMaXN0W2ludF0sIGNhc3RfdmFyaWFibGUpCisKKyhsYW1iZGEgeDogMikoTGlzdFtpbnRdKQorCitjbGFzcyBDdXN0b21OYW1lZFR1cGxlKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IExpc3RbaW50XSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCisKK0N1c3RvbVR5cGVkRGljdDEgPSBUeXBlZERpY3QoIkN1c3RvbVR5cGVkRGljdDEiLCBteV92YXI9TGlzdFtpbnRdKQorCitjbGFzcyBDdXN0b21UeXBlZERpY3QyKFR5cGVkRGljdCk6CisgICAgbXlfdmFyOiBMaXN0W2ludF0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQorCitAZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3M6CisgICAgbXlfdmFyOiBMaXN0W2ludF0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ19hbGlhcy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmNDNjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXMucmMKQEAgLTAsMCArMSw5IEBACitbbWFzdGVyXQorbG9hZC1wbHVnaW5zPXB5bGludC5leHRlbnNpb25zLnR5cGluZworCitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CisKK1t0eXBpbmddCitweS12ZXJzaW9uPTMuNworcnVudGltZS10eXBpbmc9bm8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ19hbGlhcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlMTM3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXMudHh0CkBAIC0wLDAgKzEsMTcgQEAKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjE2OjY6Oid0eXBpbmcuRGljdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2RpY3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjE3OjY6Oid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjE5OjY6Oid0eXBpbmcuT3JkZXJlZERpY3QnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCcgaW5zdGVhZAorY29uc2lkZXItdXNpbmctYWxpYXM6MjA6Njo6J3R5cGluZy5Bd2FpdGFibGUnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlJyBpbnN0ZWFkCitjb25zaWRlci11c2luZy1hbGlhczoyMTo2OjondHlwaW5nLkl0ZXJhYmxlJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJyBpbnN0ZWFkCitjb25zaWRlci11c2luZy1hbGlhczoyMjo2OjondHlwaW5nLkhhc2hhYmxlJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlJyBpbnN0ZWFkCitjb25zaWRlci11c2luZy1hbGlhczoyMzo2OjondHlwaW5nLkNvbnRleHRNYW5hZ2VyJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyJyBpbnN0ZWFkCitjb25zaWRlci11c2luZy1hbGlhczoyNDo2OjondHlwaW5nLlBhdHRlcm4nIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdyZS5QYXR0ZXJuJyBpbnN0ZWFkCitjb25zaWRlci11c2luZy1hbGlhczoyNTo3OjondHlwaW5nLk1hdGNoJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAncmUuTWF0Y2gnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjM0Ojk6Oid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjM2Ojc0OmZ1bmMxOid0eXBpbmcuRGljdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2RpY3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjM2OjE2OmZ1bmMxOid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjM2OjM3OmZ1bmMxOid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjM2OjkzOmZ1bmMxOid0eXBpbmcuVHVwbGUnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICd0dXBsZScgaW5zdGVhZAorY29uc2lkZXItdXNpbmctYWxpYXM6NTI6MTI6Q3VzdG9tTmFtZWRUdXBsZTondHlwaW5nLkxpc3QnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdsaXN0JyBpbnN0ZWFkCitjb25zaWRlci11c2luZy1hbGlhczo1NzoxMjpDdXN0b21UeXBlZERpY3QyOid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjYxOjEyOkN1c3RvbURhdGFDbGFzczondHlwaW5nLkxpc3QnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdsaXN0JyBpbnN0ZWFkCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX2FsaWFzX3dpdGhvdXRfZnV0dXJlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ19hbGlhc193aXRob3V0X2Z1dHVyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY1NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ19hbGlhc193aXRob3V0X2Z1dHVyZS5weQpAQCAtMCwwICsxLDU4IEBACisiIiJUZXN0IHB5bGludC5leHRlbnNpb24udHlwaW5nIC0gY29uc2lkZXItdXNpbmctYWxpYXMKKworJ3B5LXZlcnNpb24nIG5lZWRzIHRvIGJlIHNldCB0byAnMy43JyBvciAnMy44JyBhbmQgJ3J1bnRpbWUtdHlwaW5nPW5vJy4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHVudXNlZC1hcmd1bWVudCxsaW5lLXRvby1sb25nLHVuc3Vic2NyaXB0YWJsZS1vYmplY3QKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworaW1wb3J0IHR5cGluZworZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEF3YWl0YWJsZQorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgU2V0LCBVbmlvbiwgVHlwZWREaWN0CisKK3ZhcjE6IHR5cGluZy5EaWN0W3N0ciwgaW50XSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXIyOiBMaXN0W2ludF0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQordmFyMzogY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0KK3ZhcjQ6IHR5cGluZy5PcmRlcmVkRGljdFtzdHIsIGludF0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQordmFyNTogdHlwaW5nLkF3YWl0YWJsZVtOb25lXSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXI2OiB0eXBpbmcuSXRlcmFibGVbaW50XSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXI3OiB0eXBpbmcuSGFzaGFibGUgICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQordmFyODogdHlwaW5nLkNvbnRleHRNYW5hZ2VyW3N0cl0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQordmFyOTogdHlwaW5nLlBhdHRlcm5bc3RyXSAgIyBbY29uc2lkZXItdXNpbmctYWxpYXNdCit2YXIxMDogdHlwaW5nLnJlLk1hdGNoW3N0cl0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQordmFyMTE6IGxpc3RbaW50XQordmFyMTI6IGNvbGxlY3Rpb25zLmFiYwordmFyMTM6IEF3YWl0YWJsZVtOb25lXQordmFyMTQ6IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0W3N0ciwgc3RyXQorCitBbGlhczEgPSBTZXRbaW50XQorQWxpYXMyID0gRGljdFtpbnQsIExpc3RbaW50XV0KK0FsaWFzMyA9IFVuaW9uW2ludCwgdHlwaW5nLkxpc3Rbc3RyXV0KK0FsaWFzNCA9IExpc3QgICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQorCitkZWYgZnVuYzEoYXJnMTogTGlzdFtpbnRdLCAvLCAqYXJnczogTGlzdFtpbnRdLCBhcmcyOiBzZXRbaW50XSwgKiprd2FyZ3M6IERpY3Rbc3RyLCBpbnRdKSAtPiB0eXBpbmcuVHVwbGVbaW50XToKKyAgICAjIC0xOltjb25zaWRlci11c2luZy1hbGlhcyxjb25zaWRlci11c2luZy1hbGlhcyxjb25zaWRlci11c2luZy1hbGlhcyxjb25zaWRlci11c2luZy1hbGlhc10KKyAgICBwYXNzCisKK2RlZiBmdW5jMihhcmcxOiBsaXN0W2ludF0pIC0+IHR1cGxlW2ludCwgaW50XToKKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbUludExpc3QodHlwaW5nLkxpc3RbaW50XSk6CisgICAgcGFzcworCitjYXN0X3ZhcmlhYmxlID0gWzEsIDIsIDNdCitjYXN0X3ZhcmlhYmxlID0gdHlwaW5nLmNhc3QoTGlzdFtpbnRdLCBjYXN0X3ZhcmlhYmxlKQorCisobGFtYmRhIHg6IDIpKExpc3RbaW50XSkKKworY2xhc3MgQ3VzdG9tTmFtZWRUdXBsZSh0eXBpbmcuTmFtZWRUdXBsZSk6CisgICAgbXlfdmFyOiBMaXN0W2ludF0gICMgW2NvbnNpZGVyLXVzaW5nLWFsaWFzXQorCitDdXN0b21UeXBlZERpY3QxID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QxIiwgbXlfdmFyPUxpc3RbaW50XSkKKworY2xhc3MgQ3VzdG9tVHlwZWREaWN0MihUeXBlZERpY3QpOgorICAgIG15X3ZhcjogTGlzdFtpbnRdICAjIFtjb25zaWRlci11c2luZy1hbGlhc10KKworQGRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzOgorICAgIG15X3ZhcjogTGlzdFtpbnRdICAjIFtjb25zaWRlci11c2luZy1hbGlhc10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXNfd2l0aG91dF9mdXR1cmUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX2FsaWFzX3dpdGhvdXRfZnV0dXJlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjQzY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX2FsaWFzX3dpdGhvdXRfZnV0dXJlLnJjCkBAIC0wLDAgKzEsOSBAQAorW21hc3Rlcl0KK2xvYWQtcGx1Z2lucz1weWxpbnQuZXh0ZW5zaW9ucy50eXBpbmcKKworW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOAorCitbdHlwaW5nXQorcHktdmVyc2lvbj0zLjcKK3J1bnRpbWUtdHlwaW5nPW5vCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX2FsaWFzX3dpdGhvdXRfZnV0dXJlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfYWxpYXNfd2l0aG91dF9mdXR1cmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTA1YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX2FsaWFzX3dpdGhvdXRfZnV0dXJlLnR4dApAQCAtMCwwICsxLDE3IEBACitjb25zaWRlci11c2luZy1hbGlhczoxMzo2OjondHlwaW5nLkRpY3QnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdkaWN0JyBpbnN0ZWFkLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjE0OjY6Oid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItdXNpbmctYWxpYXM6MTY6Njo6J3R5cGluZy5PcmRlcmVkRGljdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0JyBpbnN0ZWFkLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjE3OjY6Oid0eXBpbmcuQXdhaXRhYmxlJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZScgaW5zdGVhZC4gQWRkICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBhcyB3ZWxsCitjb25zaWRlci11c2luZy1hbGlhczoxODo2OjondHlwaW5nLkl0ZXJhYmxlJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJyBpbnN0ZWFkLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjE5OjY6Oid0eXBpbmcuSGFzaGFibGUnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjIwOjY6Oid0eXBpbmcuQ29udGV4dE1hbmFnZXInIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXInIGluc3RlYWQuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItdXNpbmctYWxpYXM6MjE6Njo6J3R5cGluZy5QYXR0ZXJuJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAncmUuUGF0dGVybicgaW5zdGVhZC4gQWRkICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBhcyB3ZWxsCitjb25zaWRlci11c2luZy1hbGlhczoyMjo3OjondHlwaW5nLk1hdGNoJyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAncmUuTWF0Y2gnIGluc3RlYWQuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItdXNpbmctYWxpYXM6MzE6OTo6J3R5cGluZy5MaXN0JyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnbGlzdCcgaW5zdGVhZAorY29uc2lkZXItdXNpbmctYWxpYXM6MzM6NzQ6ZnVuYzE6J3R5cGluZy5EaWN0JyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnZGljdCcgaW5zdGVhZC4gQWRkICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBhcyB3ZWxsCitjb25zaWRlci11c2luZy1hbGlhczozMzoxNjpmdW5jMTondHlwaW5nLkxpc3QnIHdpbGwgYmUgZGVwcmVjYXRlZCB3aXRoIFBZMzksIGNvbnNpZGVyIHVzaW5nICdsaXN0JyBpbnN0ZWFkLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjMzOjM3OmZ1bmMxOid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItdXNpbmctYWxpYXM6MzM6OTM6ZnVuYzE6J3R5cGluZy5UdXBsZScgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ3R1cGxlJyBpbnN0ZWFkLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLXVzaW5nLWFsaWFzOjQ5OjEyOkN1c3RvbU5hbWVkVHVwbGU6J3R5cGluZy5MaXN0JyB3aWxsIGJlIGRlcHJlY2F0ZWQgd2l0aCBQWTM5LCBjb25zaWRlciB1c2luZyAnbGlzdCcgaW5zdGVhZC4gQWRkICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBhcyB3ZWxsCitjb25zaWRlci11c2luZy1hbGlhczo1NDoxMjpDdXN0b21UeXBlZERpY3QyOid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItdXNpbmctYWxpYXM6NTg6MTI6Q3VzdG9tRGF0YUNsYXNzOid0eXBpbmcuTGlzdCcgd2lsbCBiZSBkZXByZWNhdGVkIHdpdGggUFkzOSwgY29uc2lkZXIgdXNpbmcgJ2xpc3QnIGluc3RlYWQuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ191bmlvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyN2I0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb24ucHkKQEAgLTAsMCArMSw0NyBAQAorIiIiVGVzdCBweWxpbnQuZXh0ZW5zaW9uLnR5cGluZyAtIGNvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheAorCisncHktdmVyc2lvbicgbmVlZHMgdG8gYmUgc2V0IHRvID49ICczLjcnIGFuZCAncnVudGltZS10eXBpbmc9bm8nLgorV2l0aCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgcHJlc2VudC4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHVudXNlZC1hcmd1bWVudCxsaW5lLXRvby1sb25nCisjIHB5bGludDogZGlzYWJsZT1jb25zaWRlci11c2luZy1hbGlhcworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucworZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitpbXBvcnQgdHlwaW5nCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFVuaW9uLCBUeXBlZERpY3QKKwordmFyMTogVW5pb25baW50LCBzdHJdICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCit2YXIyOiBMaXN0W1VuaW9uW2ludCwgTm9uZV1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCit2YXIzOiBEaWN0W3N0ciwgdHlwaW5nLlVuaW9uW2ludCwgc3RyXV0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KK3ZhcjQ6IE9wdGlvbmFsW2ludF0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKworQWxpYXMxID0gVW5pb25baW50LCBzdHJdCitBbGlhczIgPSBMaXN0W1VuaW9uW2ludCwgTm9uZV1dCitBbGlhczMgPSBEaWN0W3N0ciwgdHlwaW5nLlVuaW9uW2ludCwgc3RyXV0KK0FsaWFzNCA9IE9wdGlvbmFsW2ludF0KKworZGVmIGZ1bmMxKAorICAgIGFyZzE6IE9wdGlvbmFsW2ludF0sICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisgICAgKiprd2FyZ3M6IERpY3Rbc3RyLCBVbmlvbltpbnQsIHN0cl1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCispIC0+IFVuaW9uW3N0ciwgTm9uZV06ICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisgICAgcGFzcworCitjbGFzcyBDdXN0b20xKExpc3RbVW5pb25bc3RyLCBpbnRdXSk6CisgICAgcGFzcworCitjYXN0X3ZhcmlhYmxlID0gWzEsIDIsIDNdCitjYXN0X3ZhcmlhYmxlID0gdHlwaW5nLmNhc3QoVW5pb25bTGlzdFtpbnRdLCBOb25lXSwgY2FzdF92YXJpYWJsZSkKKworKGxhbWJkYSB4OiAyKShPcHRpb25hbFtpbnRdKQorCitjbGFzcyBDdXN0b21OYW1lZFR1cGxlKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IFVuaW9uW2ludCwgc3RyXSAgIyBbY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4XQorCitDdXN0b21UeXBlZERpY3QxID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QxIiwgbXlfdmFyPU9wdGlvbmFsW2ludF0pCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDIoVHlwZWREaWN0KToKKyAgICBteV92YXI6IERpY3Rbc3RyLCBMaXN0W1VuaW9uW3N0ciwgaW50XV1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisKK0BkYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczoKKyAgICBteV92YXI6IE9wdGlvbmFsW2ludF0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb24ucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZjQzY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uLnJjCkBAIC0wLDAgKzEsOSBAQAorW21hc3Rlcl0KK2xvYWQtcGx1Z2lucz1weWxpbnQuZXh0ZW5zaW9ucy50eXBpbmcKKworW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOAorCitbdHlwaW5nXQorcHktdmVyc2lvbj0zLjcKK3J1bnRpbWUtdHlwaW5nPW5vCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGE3MTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uLnR4dApAQCAtMCwwICsxLDEwIEBACitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTM6Njo6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ1VuaW9uJworY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjE0OjExOjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnVW5pb24nCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTU6MTY6OkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoxNjo2OjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnT3B0aW9uYWwnCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MjQ6MTA6ZnVuYzE6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ09wdGlvbmFsJworY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjI1OjI0OmZ1bmMxOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoyNjo1OmZ1bmMxOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDozODoxMjpDdXN0b21OYW1lZFR1cGxlOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDo0MzoyNzpDdXN0b21UeXBlZERpY3QyOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDo0NzoxMjpDdXN0b21EYXRhQ2xhc3M6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ09wdGlvbmFsJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ191bmlvbl9weTMxMC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fcHkzMTAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxOGMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fcHkzMTAucHkKQEAgLTAsMCArMSw0NSBAQAorIiIiVGVzdCBweWxpbnQuZXh0ZW5zaW9uLnR5cGluZyAtIGNvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheAorCisncHktdmVyc2lvbicgbmVlZHMgdG8gYmUgc2V0IHRvID49ICczLjEwJy4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHVudXNlZC1hcmd1bWVudCxsaW5lLXRvby1sb25nCisjIHB5bGludDogZGlzYWJsZT1kZXByZWNhdGVkLXR5cGluZy1hbGlhcworZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitpbXBvcnQgdHlwaW5nCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFVuaW9uLCBUeXBlZERpY3QKKwordmFyMTogVW5pb25baW50LCBzdHJdICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCit2YXIyOiBMaXN0W1VuaW9uW2ludCwgTm9uZV1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCit2YXIzOiBEaWN0W3N0ciwgdHlwaW5nLlVuaW9uW2ludCwgc3RyXV0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KK3ZhcjQ6IE9wdGlvbmFsW2ludF0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKworQWxpYXMxID0gVW5pb25baW50LCBzdHJdICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCitBbGlhczIgPSBMaXN0W1VuaW9uW2ludCwgTm9uZV1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCitBbGlhczMgPSBEaWN0W3N0ciwgdHlwaW5nLlVuaW9uW2ludCwgc3RyXV0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KK0FsaWFzNCA9IE9wdGlvbmFsW2ludF0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKworZGVmIGZ1bmMxKAorICAgIGFyZzE6IE9wdGlvbmFsW2ludF0sICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisgICAgKiprd2FyZ3M6IERpY3Rbc3RyLCBVbmlvbltpbnQsIHN0cl1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCispIC0+IFVuaW9uW3N0ciwgTm9uZV06ICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisgICAgcGFzcworCitjbGFzcyBDdXN0b20xKExpc3RbVW5pb25bc3RyLCBpbnRdXSk6ICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisgICAgcGFzcworCitjYXN0X3ZhcmlhYmxlID0gWzEsIDIsIDNdCitjYXN0X3ZhcmlhYmxlID0gdHlwaW5nLmNhc3QoVW5pb25bTGlzdFtpbnRdLCBOb25lXSwgY2FzdF92YXJpYWJsZSkgICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKworKGxhbWJkYSB4OiAyKShPcHRpb25hbFtpbnRdKSAgIyBbY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4XQorCitjbGFzcyBDdXN0b21OYW1lZFR1cGxlKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IFVuaW9uW2ludCwgc3RyXSAgIyBbY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4XQorCitDdXN0b21UeXBlZERpY3QxID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QxIiwgbXlfdmFyPU9wdGlvbmFsW2ludF0pICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDIoVHlwZWREaWN0KToKKyAgICBteV92YXI6IERpY3Rbc3RyLCBMaXN0W1VuaW9uW3N0ciwgaW50XV1dICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisKK0BkYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczoKKyAgICBteV92YXI6IE9wdGlvbmFsW2ludF0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fcHkzMTAucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uX3B5MzEwLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDBmMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uX3B5MzEwLnJjCkBAIC0wLDAgKzEsOCBAQAorW21hc3Rlcl0KK2xvYWQtcGx1Z2lucz1weWxpbnQuZXh0ZW5zaW9ucy50eXBpbmcKKworW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOAorCitbdHlwaW5nXQorcHktdmVyc2lvbj0zLjEwCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uX3B5MzEwLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fcHkzMTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDJlYjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2NvbnNpZGVyX3VzaW5nX3VuaW9uX3B5MzEwLnR4dApAQCAtMCwwICsxLDE4IEBACitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTE6Njo6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ1VuaW9uJworY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjEyOjExOjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnVW5pb24nCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTM6MTY6OkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoxNDo2OjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnT3B0aW9uYWwnCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTY6OTo6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ1VuaW9uJworY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjE3OjE0OjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnVW5pb24nCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTg6MTk6OkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoxOTo5OjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnT3B0aW9uYWwnCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MjI6MTA6ZnVuYzE6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ09wdGlvbmFsJworY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjIzOjI0OmZ1bmMxOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoyNDo1OmZ1bmMxOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoyNzoxOTpDdXN0b20xOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDozMToyODo6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ1VuaW9uJworY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjMzOjE0OjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnT3B0aW9uYWwnCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MzY6MTI6Q3VzdG9tTmFtZWRUdXBsZTpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnVW5pb24nCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6Mzg6NTY6OkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdPcHRpb25hbCcKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDo0MToyNzpDdXN0b21UeXBlZERpY3QyOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDo0NToxMjpDdXN0b21EYXRhQ2xhc3M6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ09wdGlvbmFsJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ191bmlvbl93aXRob3V0X2Z1dHVyZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fd2l0aG91dF9mdXR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1OWQwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fd2l0aG91dF9mdXR1cmUucHkKQEAgLTAsMCArMSw0NSBAQAorIiIiVGVzdCBweWxpbnQuZXh0ZW5zaW9uLnR5cGluZyAtIGNvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheAorCisncHktdmVyc2lvbicgbmVlZHMgdG8gYmUgc2V0IHRvID49ICczLjcnIGFuZCAncnVudGltZS10eXBpbmc9bm8nLgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdW51c2VkLWFyZ3VtZW50LGxpbmUtdG9vLWxvbmcKKyMgcHlsaW50OiBkaXNhYmxlPWNvbnNpZGVyLXVzaW5nLWFsaWFzCitmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKK2ltcG9ydCB0eXBpbmcKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVW5pb24sIFR5cGVkRGljdAorCit2YXIxOiBVbmlvbltpbnQsIHN0cl0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KK3ZhcjI6IExpc3RbVW5pb25baW50LCBOb25lXV0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KK3ZhcjM6IERpY3Rbc3RyLCB0eXBpbmcuVW5pb25baW50LCBzdHJdXSAgIyBbY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4XQordmFyNDogT3B0aW9uYWxbaW50XSAgIyBbY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4XQorCitBbGlhczEgPSBVbmlvbltpbnQsIHN0cl0KK0FsaWFzMiA9IExpc3RbVW5pb25baW50LCBOb25lXV0KK0FsaWFzMyA9IERpY3Rbc3RyLCB0eXBpbmcuVW5pb25baW50LCBzdHJdXQorQWxpYXM0ID0gT3B0aW9uYWxbaW50XQorCitkZWYgZnVuYzEoCisgICAgYXJnMTogT3B0aW9uYWxbaW50XSwgICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKyAgICAqKmt3YXJnczogRGljdFtzdHIsIFVuaW9uW2ludCwgc3RyXV0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKykgLT4gVW5pb25bc3RyLCBOb25lXTogICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbTEoTGlzdFtVbmlvbltzdHIsIGludF1dKToKKyAgICBwYXNzCisKK2Nhc3RfdmFyaWFibGUgPSBbMSwgMiwgM10KK2Nhc3RfdmFyaWFibGUgPSB0eXBpbmcuY2FzdChVbmlvbltMaXN0W2ludF0sIE5vbmVdLCBjYXN0X3ZhcmlhYmxlKQorCisobGFtYmRhIHg6IDIpKE9wdGlvbmFsW2ludF0pCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUodHlwaW5nLk5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogVW5pb25baW50LCBzdHJdICAjIFtjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXhdCisKK0N1c3RvbVR5cGVkRGljdDEgPSBUeXBlZERpY3QoIkN1c3RvbVR5cGVkRGljdDEiLCBteV92YXI9T3B0aW9uYWxbaW50XSkKKworY2xhc3MgQ3VzdG9tVHlwZWREaWN0MihUeXBlZERpY3QpOgorICAgIG15X3ZhcjogRGljdFtzdHIsIExpc3RbVW5pb25bc3RyLCBpbnRdXV0gICMgW2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheF0KKworQGRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzOgorICAgIG15X3ZhcjogT3B0aW9uYWxbaW50XSAgIyBbY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ191bmlvbl93aXRob3V0X2Z1dHVyZS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fd2l0aG91dF9mdXR1cmUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmNDNjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fd2l0aG91dF9mdXR1cmUucmMKQEAgLTAsMCArMSw5IEBACitbbWFzdGVyXQorbG9hZC1wbHVnaW5zPXB5bGludC5leHRlbnNpb25zLnR5cGluZworCitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CisKK1t0eXBpbmddCitweS12ZXJzaW9uPTMuNworcnVudGltZS10eXBpbmc9bm8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fd2l0aG91dF9mdXR1cmUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19jb25zaWRlcl91c2luZ191bmlvbl93aXRob3V0X2Z1dHVyZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzY2JjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfY29uc2lkZXJfdXNpbmdfdW5pb25fd2l0aG91dF9mdXR1cmUudHh0CkBAIC0wLDAgKzEsMTAgQEAKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoxMTo2OjpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnVW5pb24nLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDoxMjoxMTo6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ1VuaW9uJy4gQWRkICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBhcyB3ZWxsCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MTM6MTY6OkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjE0OjY6OkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdPcHRpb25hbCcuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjIyOjEwOmZ1bmMxOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdPcHRpb25hbCcuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjIzOjI0OmZ1bmMxOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjI0OjU6ZnVuYzE6Q29uc2lkZXIgdXNpbmcgYWx0ZXJuYXRpdmUgVW5pb24gc3ludGF4IGluc3RlYWQgb2YgJ1VuaW9uJy4gQWRkICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zJyBhcyB3ZWxsCitjb25zaWRlci1hbHRlcm5hdGl2ZS11bmlvbi1zeW50YXg6MzY6MTI6Q3VzdG9tTmFtZWRUdXBsZTpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnVW5pb24nLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKK2NvbnNpZGVyLWFsdGVybmF0aXZlLXVuaW9uLXN5bnRheDo0MToyNzpDdXN0b21UeXBlZERpY3QyOkNvbnNpZGVyIHVzaW5nIGFsdGVybmF0aXZlIFVuaW9uIHN5bnRheCBpbnN0ZWFkIG9mICdVbmlvbicuIEFkZCAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucycgYXMgd2VsbAorY29uc2lkZXItYWx0ZXJuYXRpdmUtdW5pb24tc3ludGF4OjQ1OjEyOkN1c3RvbURhdGFDbGFzczpDb25zaWRlciB1c2luZyBhbHRlcm5hdGl2ZSBVbmlvbiBzeW50YXggaW5zdGVhZCBvZiAnT3B0aW9uYWwnLiBBZGQgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMnIGFzIHdlbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfZGVwcmVjYXRlZF9hbGlhcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfZGVwcmVjYXRlZF9hbGlhcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2QxMzljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19kZXByZWNhdGVkX2FsaWFzLnB5CkBAIC0wLDAgKzEsNTggQEAKKyIiIlRlc3QgcHlsaW50LmV4dGVuc2lvbi50eXBpbmcgLSBkZXByZWNhdGVkLXR5cGluZy1hbGlhcworCisncHktdmVyc2lvbicgbmVlZHMgdG8gYmUgc2V0IHRvID49ICczLjknLgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdW51c2VkLWFyZ3VtZW50LGxpbmUtdG9vLWxvbmcsdW5zdWJzY3JpcHRhYmxlLW9iamVjdAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgdHlwaW5nCitmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQXdhaXRhYmxlCitmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKK2Zyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBTZXQsIFVuaW9uLCBUeXBlZERpY3QKKwordmFyMTogdHlwaW5nLkRpY3Rbc3RyLCBpbnRdICAjIFtkZXByZWNhdGVkLXR5cGluZy1hbGlhc10KK3ZhcjI6IExpc3RbaW50XSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCit2YXIzOiBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbaW50XQordmFyNDogdHlwaW5nLk9yZGVyZWREaWN0W3N0ciwgaW50XSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCit2YXI1OiB0eXBpbmcuQXdhaXRhYmxlW05vbmVdICAjIFtkZXByZWNhdGVkLXR5cGluZy1hbGlhc10KK3ZhcjY6IHR5cGluZy5JdGVyYWJsZVtpbnRdICAjIFtkZXByZWNhdGVkLXR5cGluZy1hbGlhc10KK3Zhcjc6IHR5cGluZy5IYXNoYWJsZSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCit2YXI4OiB0eXBpbmcuQ29udGV4dE1hbmFnZXJbc3RyXSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCit2YXI5OiB0eXBpbmcuUGF0dGVybltzdHJdICAjIFtkZXByZWNhdGVkLXR5cGluZy1hbGlhc10KK3ZhcjEwOiB0eXBpbmcucmUuTWF0Y2hbc3RyXSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCit2YXIxMTogbGlzdFtpbnRdCit2YXIxMjogY29sbGVjdGlvbnMuYWJjCit2YXIxMzogQXdhaXRhYmxlW05vbmVdCit2YXIxNDogY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Rbc3RyLCBzdHJdCisKK0FsaWFzMSA9IFNldFtpbnRdICAjIFtkZXByZWNhdGVkLXR5cGluZy1hbGlhc10KK0FsaWFzMiA9IERpY3RbaW50LCBMaXN0W2ludF1dICAjIFtkZXByZWNhdGVkLXR5cGluZy1hbGlhcyxkZXByZWNhdGVkLXR5cGluZy1hbGlhc10KK0FsaWFzMyA9IFVuaW9uW2ludCwgdHlwaW5nLkxpc3Rbc3RyXV0gICMgW2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzXQorQWxpYXM0ID0gTGlzdCAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCisKK2RlZiBmdW5jMShhcmcxOiBMaXN0W2ludF0sIC8sICphcmdzOiBMaXN0W2ludF0sIGFyZzI6IHNldFtpbnRdLCAqKmt3YXJnczogRGljdFtzdHIsIGludF0pIC0+IHR5cGluZy5UdXBsZVtpbnRdOgorICAgICMgLTE6W2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzLGRlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzLGRlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzLGRlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzXQorICAgIHBhc3MKKworZGVmIGZ1bmMyKGFyZzE6IGxpc3RbaW50XSkgLT4gdHVwbGVbaW50LCBpbnRdOgorICAgIHBhc3MKKworY2xhc3MgQ3VzdG9tSW50TGlzdCh0eXBpbmcuTGlzdFtpbnRdKTogICMgW2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzXQorICAgIHBhc3MKKworY2FzdF92YXJpYWJsZSA9IFsxLCAyLCAzXQorY2FzdF92YXJpYWJsZSA9IHR5cGluZy5jYXN0KExpc3RbaW50XSwgY2FzdF92YXJpYWJsZSkgICMgW2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzXQorCisobGFtYmRhIHg6IDIpKExpc3RbaW50XSkgICMgW2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzXQorCitjbGFzcyBDdXN0b21OYW1lZFR1cGxlKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IExpc3RbaW50XSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCisKK0N1c3RvbVR5cGVkRGljdDEgPSBUeXBlZERpY3QoIkN1c3RvbVR5cGVkRGljdDEiLCBteV92YXI9TGlzdFtpbnRdKSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDIoVHlwZWREaWN0KToKKyAgICBteV92YXI6IExpc3RbaW50XSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCisKK0BkYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczoKKyAgICBteV92YXI6IExpc3RbaW50XSAgIyBbZGVwcmVjYXRlZC10eXBpbmctYWxpYXNdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2RlcHJlY2F0ZWRfYWxpYXMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2RlcHJlY2F0ZWRfYWxpYXMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyMWQ1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZXh0L3R5cGluZy90eXBpbmdfZGVwcmVjYXRlZF9hbGlhcy5yYwpAQCAtMCwwICsxLDggQEAKK1ttYXN0ZXJdCitsb2FkLXBsdWdpbnM9cHlsaW50LmV4dGVuc2lvbnMudHlwaW5nCisKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKKworW3R5cGluZ10KK3B5LXZlcnNpb249My45CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2V4dC90eXBpbmcvdHlwaW5nX2RlcHJlY2F0ZWRfYWxpYXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19kZXByZWNhdGVkX2FsaWFzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTc0ZmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9leHQvdHlwaW5nL3R5cGluZ19kZXByZWNhdGVkX2FsaWFzLnR4dApAQCAtMCwwICsxLDI1IEBACitkZXByZWNhdGVkLXR5cGluZy1hbGlhczoxMzo2OjondHlwaW5nLkRpY3QnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnZGljdCcgaW5zdGVhZAorZGVwcmVjYXRlZC10eXBpbmctYWxpYXM6MTQ6Njo6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjE2OjY6Oid0eXBpbmcuT3JkZXJlZERpY3QnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnY29sbGVjdGlvbnMuT3JkZXJlZERpY3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjE3OjY6Oid0eXBpbmcuQXdhaXRhYmxlJyBpcyBkZXByZWNhdGVkLCB1c2UgJ2NvbGxlY3Rpb25zLmFiYy5Bd2FpdGFibGUnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjE4OjY6Oid0eXBpbmcuSXRlcmFibGUnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczoxOTo2OjondHlwaW5nLkhhc2hhYmxlJyBpcyBkZXByZWNhdGVkLCB1c2UgJ2NvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZScgaW5zdGVhZAorZGVwcmVjYXRlZC10eXBpbmctYWxpYXM6MjA6Njo6J3R5cGluZy5Db250ZXh0TWFuYWdlcicgaXMgZGVwcmVjYXRlZCwgdXNlICdjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXInIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjIxOjY6Oid0eXBpbmcuUGF0dGVybicgaXMgZGVwcmVjYXRlZCwgdXNlICdyZS5QYXR0ZXJuJyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczoyMjo3OjondHlwaW5nLk1hdGNoJyBpcyBkZXByZWNhdGVkLCB1c2UgJ3JlLk1hdGNoJyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczoyODo5OjondHlwaW5nLlNldCcgaXMgZGVwcmVjYXRlZCwgdXNlICdzZXQnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjI5Ojk6Oid0eXBpbmcuRGljdCcgaXMgZGVwcmVjYXRlZCwgdXNlICdkaWN0JyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczoyOToxOTo6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjMwOjIwOjondHlwaW5nLkxpc3QnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnbGlzdCcgaW5zdGVhZAorZGVwcmVjYXRlZC10eXBpbmctYWxpYXM6MzE6OTo6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjMzOjc0OmZ1bmMxOid0eXBpbmcuRGljdCcgaXMgZGVwcmVjYXRlZCwgdXNlICdkaWN0JyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczozMzoxNjpmdW5jMTondHlwaW5nLkxpc3QnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnbGlzdCcgaW5zdGVhZAorZGVwcmVjYXRlZC10eXBpbmctYWxpYXM6MzM6Mzc6ZnVuYzE6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjMzOjkzOmZ1bmMxOid0eXBpbmcuVHVwbGUnIGlzIGRlcHJlY2F0ZWQsIHVzZSAndHVwbGUnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjQwOjIwOkN1c3RvbUludExpc3Q6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjQ0OjI4OjondHlwaW5nLkxpc3QnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnbGlzdCcgaW5zdGVhZAorZGVwcmVjYXRlZC10eXBpbmctYWxpYXM6NDY6MTQ6Oid0eXBpbmcuTGlzdCcgaXMgZGVwcmVjYXRlZCwgdXNlICdsaXN0JyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczo0OToxMjpDdXN0b21OYW1lZFR1cGxlOid0eXBpbmcuTGlzdCcgaXMgZGVwcmVjYXRlZCwgdXNlICdsaXN0JyBpbnN0ZWFkCitkZXByZWNhdGVkLXR5cGluZy1hbGlhczo1MTo1Njo6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjU0OjEyOkN1c3RvbVR5cGVkRGljdDI6J3R5cGluZy5MaXN0JyBpcyBkZXByZWNhdGVkLCB1c2UgJ2xpc3QnIGluc3RlYWQKK2RlcHJlY2F0ZWQtdHlwaW5nLWFsaWFzOjU4OjEyOkN1c3RvbURhdGFDbGFzczondHlwaW5nLkxpc3QnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnbGlzdCcgaW5zdGVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9mL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mX3N0cmluZ193aXRob3V0X2ludGVycG9sYXRpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZl9zdHJpbmdfd2l0aG91dF9pbnRlcnBvbGF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmUzNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZl9zdHJpbmdfd2l0aG91dF9pbnRlcnBvbGF0aW9uLnB5CkBAIC0wLDAgKzEsOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nCitpbXBvcnQgbWF0aAorCitWQUxVRSA9IDEKKworcHJpbnQoZiJzb21lIHZhbHVlIHtWQUxVRX0iKQorcHJpbnQoZidwaToge21hdGgucGk6LjNmfScpCisKK3ByaW50KGYiRVJST1IiKSAgIyBbZi1zdHJpbmctd2l0aG91dC1pbnRlcnBvbGF0aW9uXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2Zfc3RyaW5nX3dpdGhvdXRfaW50ZXJwb2xhdGlvbi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mX3N0cmluZ193aXRob3V0X2ludGVycG9sYXRpb24ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mX3N0cmluZ193aXRob3V0X2ludGVycG9sYXRpb24ucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My42CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2YvZl9zdHJpbmdfd2l0aG91dF9pbnRlcnBvbGF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mX3N0cmluZ193aXRob3V0X2ludGVycG9sYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGYyNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZl9zdHJpbmdfd2l0aG91dF9pbnRlcnBvbGF0aW9uLnR4dApAQCAtMCwwICsxIEBACitmLXN0cmluZy13aXRob3V0LWludGVycG9sYXRpb246OTo2OjpVc2luZyBhbiBmLXN0cmluZyB0aGF0IGRvZXMgbm90IGhhdmUgYW55IGludGVycG9sYXRlZCB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mYWxsYmFja19pbXBvcnRfZGlzYWJsZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZmFsbGJhY2tfaW1wb3J0X2Rpc2FibGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWViMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZmFsbGJhY2tfaW1wb3J0X2Rpc2FibGVkLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHVudXNlZC1pbXBvcnQKK3RyeToKKyAgICBpbXBvcnQgdXJsbGliMiBhcyB1cmxsaWJfcmVxdWVzdCAjQAorICAgIGltcG9ydCB1cmxsaWIyIGFzIHVybGxpYl9lcnJvcgorICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBweXRob24yCisgICAgZnJvbSB1cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKKyAgICBmcm9tIHVybGxpYiBpbXBvcnQgZXJyb3IgYXMgdXJsbGliX2Vycm9yCisgICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHBhcnNlcQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2ZhbGxiYWNrX2ltcG9ydF9lbmFibGVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9mL2ZhbGxiYWNrX2ltcG9ydF9lbmFibGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjA4MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZmFsbGJhY2tfaW1wb3J0X2VuYWJsZWQucHkKQEAgLTAsMCArMSw1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtaW1wb3J0Cit0cnk6CisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLm1pc3NpbmcgIyBbbm8tbmFtZS1pbi1tb2R1bGVdCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbWlzc2luZyAjIFtuby1uYW1lLWluLW1vZHVsZV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mYWxsYmFja19pbXBvcnRfZW5hYmxlZC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mYWxsYmFja19pbXBvcnRfZW5hYmxlZC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZmMTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2ZhbGxiYWNrX2ltcG9ydF9lbmFibGVkLnJjCkBAIC0wLDAgKzEsMiBAQAorW0lNUE9SVFNdCithbmFseXNlLWZhbGxiYWNrLWJsb2Nrcz15ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mYWxsYmFja19pbXBvcnRfZW5hYmxlZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZmFsbGJhY2tfaW1wb3J0X2VuYWJsZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZWY1OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZmFsbGJhY2tfaW1wb3J0X2VuYWJsZWQudHh0CkBAIC0wLDAgKzEsMiBAQAorbm8tbmFtZS1pbi1tb2R1bGU6Mzo0OjpObyBuYW1lICdtaXNzaW5nJyBpbiBtb2R1bGUgJ2NvbGxlY3Rpb25zJworbm8tbmFtZS1pbi1tb2R1bGU6NTo0OjpObyBuYW1lICdtaXNzaW5nJyBpbiBtb2R1bGUgJ2NvbGxlY3Rpb25zJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpcnN0X2FyZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXJzdF9hcmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1YzA4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXJzdF9hcmcucHkKQEAgLTAsMCArMSw0MiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIG5vLWluaXQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiJjaGVjayBmb3IgbWV0aG9kcyBmaXJzdCBhcmd1bWVudHMKKyIiIgorCitfX3JldmlzaW9uX18gPSAwCisKKworY2xhc3MgT2JqKG9iamVjdCk6CisgICAgIyBDMDIwMiwgY2xhc3NtZXRob2QKKyAgICBkZWYgX19uZXdfXyhzb21ldGhpbmcpOiAgIyBbYmFkLWNsYXNzbWV0aG9kLWFyZ3VtZW50XQorICAgICAgICBwYXNzCisKKyAgICAjIEMwMjAyLCBjbGFzc21ldGhvZAorICAgIGRlZiBjbGFzczEoY2xzKToKKyAgICAgICAgcGFzcworICAgIGNsYXNzMSA9IGNsYXNzbWV0aG9kKGNsYXNzMSkgICMgW25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcl0KKworICAgIGRlZiBjbGFzczIob3RoZXIpOiAgIyBbYmFkLWNsYXNzbWV0aG9kLWFyZ3VtZW50XQorICAgICAgICBwYXNzCisgICAgY2xhc3MyID0gY2xhc3NtZXRob2QoY2xhc3MyKSAgIyBbbm8tY2xhc3NtZXRob2QtZGVjb3JhdG9yXQorCisKK2NsYXNzIE1ldGEodHlwZSk6CisgICAgIyBDMDIwNCwgbWV0YWNsYXNzIF9fbmV3X18KKyAgICBkZWYgX19uZXdfXyhvdGhlciwgbmFtZSwgYmFzZXMsIGRjdCk6ICAjIFtiYWQtbWNzLWNsYXNzbWV0aG9kLWFyZ3VtZW50XQorICAgICAgICBwYXNzCisKKyAgICAjIEMwMjAzLCBtZXRhY2xhc3MgbWV0aG9kCisgICAgZGVmIG1ldGhvZDEoY2xzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG1ldGhvZDIob3RoZXIpOiAgIyBbYmFkLW1jcy1tZXRob2QtYXJndW1lbnRdCisgICAgICAgIHBhc3MKKworICAgICMgQzAyMDUsIG1ldGFjbGFzcyBjbGFzc21ldGhvZAorICAgIGRlZiBjbGFzczEoY2xzKToKKyAgICAgICAgcGFzcworICAgIGNsYXNzMSA9IGNsYXNzbWV0aG9kKGNsYXNzMSkgICMgW25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcl0KKworICAgIGRlZiBjbGFzczIob3RoZXIpOiAgIyBbYmFkLW1jcy1jbGFzc21ldGhvZC1hcmd1bWVudF0KKyAgICAgICAgcGFzcworICAgIGNsYXNzMiA9IGNsYXNzbWV0aG9kKGNsYXNzMikgICMgW25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXJzdF9hcmcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpcnN0X2FyZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0NGZhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXJzdF9hcmcudHh0CkBAIC0wLDAgKzEsOSBAQAorYmFkLWNsYXNzbWV0aG9kLWFyZ3VtZW50OjEwOjQ6T2JqLl9fbmV3X186Q2xhc3MgbWV0aG9kIF9fbmV3X18gc2hvdWxkIGhhdmUgJ2NscycgYXMgZmlyc3QgYXJndW1lbnQKK25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcjoxNjo0Ok9iajpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgY2xhc3NtZXRob2QKK2JhZC1jbGFzc21ldGhvZC1hcmd1bWVudDoxODo0Ok9iai5jbGFzczI6Q2xhc3MgbWV0aG9kIGNsYXNzMiBzaG91bGQgaGF2ZSAnY2xzJyBhcyBmaXJzdCBhcmd1bWVudAorbm8tY2xhc3NtZXRob2QtZGVjb3JhdG9yOjIwOjQ6T2JqOkNvbnNpZGVyIHVzaW5nIGEgZGVjb3JhdG9yIGluc3RlYWQgb2YgY2FsbGluZyBjbGFzc21ldGhvZAorYmFkLW1jcy1jbGFzc21ldGhvZC1hcmd1bWVudDoyNTo0Ok1ldGEuX19uZXdfXzpNZXRhY2xhc3MgY2xhc3MgbWV0aG9kIF9fbmV3X18gc2hvdWxkIGhhdmUgJ2NscycgYXMgZmlyc3QgYXJndW1lbnQKK2JhZC1tY3MtbWV0aG9kLWFyZ3VtZW50OjMyOjQ6TWV0YS5tZXRob2QyOk1ldGFjbGFzcyBtZXRob2QgbWV0aG9kMiBzaG91bGQgaGF2ZSAnY2xzJyBhcyBmaXJzdCBhcmd1bWVudAorbm8tY2xhc3NtZXRob2QtZGVjb3JhdG9yOjM4OjQ6TWV0YTpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgY2xhc3NtZXRob2QKK2JhZC1tY3MtY2xhc3NtZXRob2QtYXJndW1lbnQ6NDA6NDpNZXRhLmNsYXNzMjpNZXRhY2xhc3MgY2xhc3MgbWV0aG9kIGNsYXNzMiBzaG91bGQgaGF2ZSAnY2xzJyBhcyBmaXJzdCBhcmd1bWVudAorbm8tY2xhc3NtZXRob2QtZGVjb3JhdG9yOjQyOjQ6TWV0YTpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgY2xhc3NtZXRob2QKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFkNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpeG1lLnB5CkBAIC0wLDAgKzEsMzMgQEAKKyMgLSotIGVuY29kaW5nPXV0Zi04IC0qLQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHVudXNlZC12YXJpYWJsZQorCisjICsxOiBbZml4bWVdCisjIEZJWE1FOiBiZWVwCisKKworZGVmIGZ1bmN0aW9uKCk6CisgICAgdmFyaWFibGUgPSAiRklYTUU6IElnbm9yZSBtZSEiCisgICAgIyArMTogW2ZpeG1lXQorICAgIHRlc3QgPSAidGV4dCIgICMgRklYTUU6IFZhbGlkIHRlc3QKKworICAgICMgKzE6IFtmaXhtZV0KKyAgICAjIFRPRE86IERvIHNvbWV0aGluZyB3aXRoIHRoZSB2YXJpYWJsZXMKKyAgICAjICsxOiBbZml4bWVdCisgICAgeHh4ID0gIm4vYSIgICMgWFhYOiBGaXggdGhpcyBsYXRlcgorICAgICMgKzE6IFtmaXhtZV0KKyAgICAjRklYTUU6IG5vIHNwYWNlIGFmdGVyIGhhc2gKKyAgICAjICsxOiBbZml4bWVdCisgICAgI3RvZG86IG5vIHNwYWNlIGFmdGVyIGhhc2gKKworICAgICMgKzE6IFtmaXhtZV0KKwkjIEZJWE1FOiB0aGlzIGlzIGJyb2tlbgorICAgICMgKzE6IFtmaXhtZV0KKyAgICAjIC4vVE9ETzogZmluZCB3aXRoIG5vdGVzCisJIyArMTogW2ZpeG1lXQorICAgICMgVE8gbWFrZSBzb21ldGhpbmcgRE86IGZpbmQgd2l0aCByZWdleAorCSMgRklYTUU6IHRoaXMgaXMgYnJva2VuIChJU1NVRS0xMjM0KQorCisgICAgI0ZJWE1FOiBpbiBmYWN0IG5vdGhpbmcgdG8gZml4ICNweWxpbnQ6IGRpc2FibGU9Zml4bWUKKyAgICAjVE9ETzogaW4gZmFjdCBub3RoaW5nIHRvIGRvICNweWxpbnQ6IGRpc2FibGU9Zml4bWUKKyAgICAjVE9ETzogaW4gZmFjdCBub3RoaW5nIHRvIGRvICNweWxpbnQ6IGRpc2FibGU9bGluZS10b28tbG9uZywgZml4bWUKKyAgICAjIFRvZG9pc3QgQVBJIG1lbnRpb25lZCBzaG91bGQgbm90IHJlc3VsdCBpbiBhIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2YvZml4bWUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZml4bWUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5MDNjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZS5yYwpAQCAtMCwwICsxLDMgQEAKK1t0ZXN0b3B0aW9uc10KK25vdGVzPVhYWCxUT0RPLC4vVE9ETworbm90ZXMtcmd4PUZJWE1FKD8hLipJU1NVRS1cZCspfFRPLipETwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpeG1lLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4ZTA4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZS50eHQKQEAgLTAsMCArMSw5IEBACitmaXhtZTo1OjE6OiJGSVhNRTogYmVlcCIKK2ZpeG1lOjExOjIwOjoiRklYTUU6IFZhbGlkIHRlc3QiCitmaXhtZToxNDo1OjoiVE9ETzogRG8gc29tZXRoaW5nIHdpdGggdGhlIHZhcmlhYmxlcyIKK2ZpeG1lOjE2OjE4OjoiWFhYOiBGaXggdGhpcyBsYXRlciIKK2ZpeG1lOjE4OjU6OiJGSVhNRTogbm8gc3BhY2UgYWZ0ZXIgaGFzaCIKK2ZpeG1lOjIwOjU6OiJ0b2RvOiBubyBzcGFjZSBhZnRlciBoYXNoIgorZml4bWU6MjM6Mjo6IkZJWE1FOiB0aGlzIGlzIGJyb2tlbiIKK2ZpeG1lOjI1OjU6OiIuL1RPRE86IGZpbmQgd2l0aCBub3RlcyIKK2ZpeG1lOjI3OjU6OiJUTyBtYWtlIHNvbWV0aGluZyBETzogZmluZCB3aXRoIHJlZ2V4IgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpeG1lX2JhZF9mb3JtYXR0aW5nXzExMzkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZml4bWVfYmFkX2Zvcm1hdHRpbmdfMTEzOS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzMGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpeG1lX2JhZF9mb3JtYXR0aW5nXzExMzkucHkKQEAgLTAsMCArMSw2IEBACisiIiINCitUZXN0IGZvciBpc3N1ZSAjIzExMzkgLSB3aGVuIENSTEYgbmV3bGluZSBjaGFyYWN0ZXJzIGFyZSB1c2VkLA0KK1xyIGlzIGxlZnQgaW4gbXNnIHNlY3Rpb24uIEFzIGEgcmVzdWx0LCBvdXRwdXQgbGluZSBpbiBjbWRsaW5lDQoraXMgb3ZlcndyaXR0ZW4gd2l0aCB0ZXh0IGFmdGVyIG1zZyIiIg0KKw0KKyMgVE9ETyBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQgICMgW2ZpeG1lXQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZV9iYWRfZm9ybWF0dGluZ18xMTM5LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2ZpeG1lX2JhZF9mb3JtYXR0aW5nXzExMzkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YmIzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZV9iYWRfZm9ybWF0dGluZ18xMTM5LnJjCkBAIC0wLDAgKzEsMiBAQAorW01FU1NBR0VTIENPTlRST0xdCittc2ctdGVtcGxhdGU9e0N9OntsaW5lOjNkfSx7Y29sdW1uOjJkfToge29ian06IHttc2d9ICh7c3ltYm9sfSwge21zZ19pZH0pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2YvZml4bWVfYmFkX2Zvcm1hdHRpbmdfMTEzOS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZml4bWVfYmFkX2Zvcm1hdHRpbmdfMTEzOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhMDI2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9maXhtZV9iYWRfZm9ybWF0dGluZ18xMTM5LnR4dApAQCAtMCwwICsxIEBACitmaXhtZTo2OjE6OlRPRE8gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0ICAjIFtmaXhtZV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mb3JtYXR0ZWRfc3RyaW5nX2xpdGVyYWxfd2l0aF9pZl9weTM2LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Zvcm1hdHRlZF9zdHJpbmdfbGl0ZXJhbF93aXRoX2lmX3B5MzYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlYjRlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mb3JtYXR0ZWRfc3RyaW5nX2xpdGVyYWxfd2l0aF9pZl9weTM2LnB5CkBAIC0wLDAgKzEsOCBAQAorIiIiVGVzdCB0aGF0IGBpZmAgaW4gZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsIHdvbid0IGJyZWFrIFB5bGludC4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBwb2ludGxlc3Mtc3RhdGVtZW50LCB1c2luZy1jb25zdGFudC10ZXN0CisKK2YneyIrIiBpZiBUcnVlIGVsc2UgIi0ifScKK2lmIFRydWU6CisgICAgcGFzcworZWxpZiBUcnVlOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mb3JtYXR0ZWRfc3RyaW5nX2xpdGVyYWxfd2l0aF9pZl9weTM2LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Zvcm1hdHRlZF9zdHJpbmdfbGl0ZXJhbF93aXRoX2lmX3B5MzYucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mb3JtYXR0ZWRfc3RyaW5nX2xpdGVyYWxfd2l0aF9pZl9weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmNfZGlzYWJsZV9saW5lYmFzZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZnVuY19kaXNhYmxlX2xpbmViYXNlZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRhZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmNfZGlzYWJsZV9saW5lYmFzZWQucHkKQEAgLTAsMCArMSwxNSBAQAorIyBUaGlzIGlzIGEgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgbG9uZyBsaW5lLiAgIyBbbGluZS10b28tbG9uZ10KKyMgcHlsaW50OiBkaXNhYmxlPWxpbmUtdG9vLWxvbmcKKyMgVGhpcyBpcyBhIHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IHZlcnkgdmVyeSB2ZXJ5IGxvbmcgbGluZS4KKyIiIk1ha2Ugc3VyZSBlbmFibGUvZGlzYWJsZSBwcmFnbWFzIHdvcmsgZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIGFwcGxpZWQgdG8gbGluZXMgYW5kIG5vdCBzeW50YXggbm9kZXMuCisKK0EgZGlzYWJsZSBwcmFnbWEgZm9yIGEgbWVzc2FnZSB0aGF0IGFwcGxpZXMgdG8gbm9kZXMgaXMgYXBwbGllZCB0byB0aGUgd2hvbGUKK2Jsb2NrIGlmIGl0IGNvbWVzIGJlZm9yZSB0aGUgZmlyc3Qgc3RhdGVtZW50IChleGNsdWRpbmcgdGhlIGRvY3N0cmluZykuIEZvcgorbGluZS1iYXNlZCBtZXNzYWdlcywgdGhpcyBiZWhhdmlvciBuZWVkcyB0byBiZSBhbHRlcmVkIHRvIHJlYWxseSBvbmx5IGFwcGx5IHRvCit0aGUgZW5jbG9zZWQgbGluZXMuCisiIiIKKyMgcHlsaW50OiBlbmFibGU9bGluZS10b28tbG9uZworCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK3ByaW50KCdUaGlzIGlzIGEgdmVyeSBsb25nIGxpbmUgd2hpY2ggdGhlIGxpbnRlciB3aWxsIHdhcm4gYWJvdXQsIG5vdyB0aGF0IGxpbmUtdG9vLWxvbmcgaGFzIGJlZW4gZW5hYmxlZCBhZ2Fpbi4nKSAgIyBbbGluZS10b28tbG9uZ10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdW5jX2Rpc2FibGVfbGluZWJhc2VkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdW5jX2Rpc2FibGVfbGluZWJhc2VkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzY0NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmNfZGlzYWJsZV9saW5lYmFzZWQudHh0CkBAIC0wLDAgKzEsMiBAQAorbGluZS10b28tbG9uZzoxOjA6OkxpbmUgdG9vIGxvbmcgKDE0Ni8xMDApCitsaW5lLXRvby1sb25nOjE1OjA6OkxpbmUgdG9vIGxvbmcgKDEzMy8xMDApCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2YvZnVuY3Rpb25fcmVkZWZpbmVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmN0aW9uX3JlZGVmaW5lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWFjODFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmN0aW9uX3JlZGVmaW5lZC5weQpAQCAtMCwwICsxLDEyMCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UsbWlzc2luZy1kb2NzdHJpbmcsdXNpbmctY29uc3RhbnQtdGVzdCwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsd3JvbmctaW1wb3J0LXBvc2l0aW9uLHJlaW1wb3J0ZWQsIHVubmVjZXNzYXJ5LXBhc3MKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK19fcmV2aXNpb25fXyA9ICcnCitjbGFzcyBBQUFBKG9iamVjdCk6CisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgZGVmIG1ldGhvZDEoc2VsZik6CisgICAgICAgICIiImRvY3N0cmluZyIiIgorCisgICAgZGVmIG1ldGhvZDIoc2VsZik6CisgICAgICAgICIiImRvY3N0cmluZyIiIgorCisgICAgZGVmIG1ldGhvZDIoc2VsZik6ICMgW2Z1bmN0aW9uLXJlZGVmaW5lZF0KKyAgICAgICAgIiIiZG9jc3RyaW5nIiIiCisKK2NsYXNzIEFBQUEob2JqZWN0KTogIyBbZnVuY3Rpb24tcmVkZWZpbmVkXQorICAgICIiImRvY3N0cmluZyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworICAgIGRlZiB5ZWFoKHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKyAgICBkZWYgeW9vKHNlbGYpOgorICAgICAgICAiIiJ5b28iIiIKK2RlZiBmdW5jMSgpOgorICAgICIiImRvY3N0cmluZyIiIgorCitkZWYgZnVuYzIoKToKKyAgICAiIiJkb2NzdHJpbmciIiIKKworZGVmIGZ1bmMyKCk6ICMgW2Z1bmN0aW9uLXJlZGVmaW5lZF0KKyAgICAiIiJkb2NzdHJpbmciIiIKKyAgICBfX3JldmlzaW9uX18gPSAxICMgW3JlZGVmaW5lZC1vdXRlci1uYW1lXQorICAgIHJldHVybiBfX3JldmlzaW9uX18KKworaWYgX19yZXZpc2lvbl9fOgorICAgIGRlZiBleGNsdXNpdmVfZnVuYygpOgorICAgICAgICAiZG9jc3RyaW5nIgorZWxzZToKKyAgICBkZWYgZXhjbHVzaXZlX2Z1bmMoKToKKyAgICAgICAgImRvY3N0cmluZyIKKwordHJ5OgorICAgIGRlZiBleGNsdXNpdmVfZnVuYzIoKToKKyAgICAgICAgImRvY3N0cmluZyIKK2V4Y2VwdCBUeXBlRXJyb3I6CisgICAgZGVmIGV4Y2x1c2l2ZV9mdW5jMigpOgorICAgICAgICAiZG9jc3RyaW5nIgorZWxzZToKKyAgICBkZWYgZXhjbHVzaXZlX2Z1bmMyKCk6ICMgW2Z1bmN0aW9uLXJlZGVmaW5lZF0KKyAgICAgICAgInRoaXMgb25lIHJlZGVmaW5lIHRoZSBvbmUgZGVmaW5lZCBsaW5lIDQyIgorCisKK2RlZiB3aXRoX2lubmVyX2Z1bmN0aW9uXzEoKToKKyAgICAiIiJkb2NzdHJpbmciIiIKKyAgICBkZWYgY2FsbGJhY2soKToKKyAgICAgICAgIiIiY2FsbGJhY2sgZG9jc3RyaW5nIiIiCisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gY2FsbGJhY2sKKworZGVmIHdpdGhfaW5uZXJfZnVuY3Rpb25fMigpOgorICAgICIiImRvY3N0cmluZyIiIgorICAgIGRlZiBjYWxsYmFjaygpOgorICAgICAgICAiIiJkb2VzIG5vdCByZWRlZmluZSBjYWxsYmFjayByZXR1cm5lZCBieSB3aXRoX2lubmVyX2Z1bmN0aW9uXzEiIiIKKyAgICAgICAgcGFzcworICAgIHJldHVybiBjYWxsYmFjaworCitkZWYgc29tZV9mdW5jKCk6CisgICAgIiIiRG9uJ3QgZW1pdCBpZiB3ZSBkZWZpbmVkIGEgdmFyaWFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGEKKyAgICBfX2Z1dHVyZV9fIGRpcmVjdGl2ZS4KKyAgICAiIiIKKyAgICBkaXZpc2lvbiA9IDIKKyAgICByZXR1cm4gZGl2aXNpb24KKworZGVmIGR1bW15X2Z1bmMoKToKKyAgICAiIiJGaXJzdCBkdW1teSBmdW5jdGlvbiIiIgorICAgIHBhc3MKKworZGVmIGR1bW15X2Z1bmMoKToKKyAgICAiIiJTZWNvbmQgZHVtbXkgZnVuY3Rpb24sIGRvbid0IGVtaXQgZnVuY3Rpb24tcmVkZWZpbmVkIG1lc3NhZ2UKKyAgICBiZWNhdXNlIG9mIHRoZSBkdW1teSBuYW1lIiIiCisgICAgcGFzcworCitmcm9tIG1hdGggaW1wb3J0IGNlaWwKK2RlZiBjZWlsKCk6ICMgW2Z1bmN0aW9uLXJlZGVmaW5lZF0KKyAgICBwYXNzCisKK2ltcG9ydCBtYXRoCitkZWYgbWF0aCgpOiAjIFtmdW5jdGlvbi1yZWRlZmluZWRdCisgICAgcGFzcworCitpbXBvcnQgbWF0aCBhcyBfCitkZWYgXygpOgorICAgIHBhc3MKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcworY2xhc3MgT2JqZWN0UHJveHk6CisgICAgIiIiQUJDIiIiCisKKyAgICAjIFdlIGFjdHVhbGx5ICpyZWRlZmluZSogdGhlc2UgYXR0cmlidXRlcywgYnV0IHRoZXNlIHNob3VsZG4ndAorICAgICMgYmUgY29uc2lkZXJlZCBhY3R1YWwgcmVkZWZpbml0aW9ucy4gSXNzdWUgIzI0NTEKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX19tb2R1bGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJhY3R1YWwubW9kdWxlIgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9fZG9jX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRG9jc3RyaW5nIgorCisKKyMgRG8gbm90IGVtaXQgdGhlIGVycm9yIGZvciBjb25kaXRpb25hbCBkZWZpbml0aW9ucworZGVmIGZ1bmMoY2FsbGJhY2sxPU5vbmUsIGNhbGxiYWNrMj1Ob25lKToKKyAgICBpZiBub3QgY2FsbGJhY2sxOgorICAgICAgICBkZWYgY2FsbGJhY2sxKCk6CisgICAgICAgICAgICByZXR1cm4gNDIKKyAgICBpZiBjYWxsYmFjazIgaXMgTm9uZToKKyAgICAgICAgZGVmIGNhbGxiYWNrMigpOgorICAgICAgICAgICAgcmV0dXJuIDI0CisgICAgcmV0dXJuIGNhbGxiYWNrMSgpLCBjYWxsYmFjazIoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmN0aW9uX3JlZGVmaW5lZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZnVuY3Rpb25fcmVkZWZpbmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYxYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmN0aW9uX3JlZGVmaW5lZC50eHQKQEAgLTAsMCArMSw3IEBACitmdW5jdGlvbi1yZWRlZmluZWQ6MTU6NDpBQUFBLm1ldGhvZDI6bWV0aG9kIGFscmVhZHkgZGVmaW5lZCBsaW5lIDEyCitmdW5jdGlvbi1yZWRlZmluZWQ6MTg6MDpBQUFBOmNsYXNzIGFscmVhZHkgZGVmaW5lZCBsaW5lIDUKK2Z1bmN0aW9uLXJlZGVmaW5lZDozMjowOmZ1bmMyOmZ1bmN0aW9uIGFscmVhZHkgZGVmaW5lZCBsaW5lIDI5CityZWRlZmluZWQtb3V0ZXItbmFtZTozNDo0OmZ1bmMyOlJlZGVmaW5pbmcgbmFtZSAnX19yZXZpc2lvbl9fJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDQpCitmdW5jdGlvbi1yZWRlZmluZWQ6NTE6NDpleGNsdXNpdmVfZnVuYzI6ZnVuY3Rpb24gYWxyZWFkeSBkZWZpbmVkIGxpbmUgNDUKK2Z1bmN0aW9uLXJlZGVmaW5lZDo4NjowOmNlaWw6ZnVuY3Rpb24gYWxyZWFkeSBkZWZpbmVkIGxpbmUgODUKK2Z1bmN0aW9uLXJlZGVmaW5lZDo5MDowOm1hdGg6ZnVuY3Rpb24gYWxyZWFkeSBkZWZpbmVkIGxpbmUgODkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdW5jdGlvbl9yZWRlZmluZWRfMjU0MC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdW5jdGlvbl9yZWRlZmluZWRfMjU0MC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc5MjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmN0aW9uX3JlZGVmaW5lZF8yNTQwLnB5CkBAIC0wLDAgKzEsOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nLG1pc3NpbmctY2xhc3MtZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsaW52YWxpZC1uYW1lCisKK2Zyb20gdHlwaW5nIGltcG9ydCBGb3J3YXJkUmVmCisKK0NscyA9IEZvcndhcmRSZWYoIkNscyIpCisKKworY2xhc3MgQ2xzOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdW5jdGlvbl9yZWRlZmluZWRfMjU0MC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdW5jdGlvbl9yZWRlZmluZWRfMjU0MC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1bmN0aW9uX3JlZGVmaW5lZF8yNTQwLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1dHVyZV9pbXBvcnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZnV0dXJlX2ltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQzNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1dHVyZV9pbXBvcnQucHkKQEAgLTAsMCArMSwzIEBACisiIiJhIGRvY3N0cmluZyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdXR1cmVfdW5pY29kZV9saXRlcmFscy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdXR1cmVfdW5pY29kZV9saXRlcmFscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGMyYmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1dHVyZV91bmljb2RlX2xpdGVyYWxzLnB5CkBAIC0wLDAgKzEsNiBAQAorIiIiVW5pY29kZSBsaXRlcmFscyBpbiBQeXRob24gMi4qIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKKworCitCQURfU1RSSU5HID0gYidcdTEyMzQnICAjID49IDIuNy40Olthbm9tYWxvdXMtdW5pY29kZS1lc2NhcGUtaW4tc3RyaW5nXQorR09PRF9TVFJJTkcgPSAnXHUxMjM0JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1dHVyZV91bmljb2RlX2xpdGVyYWxzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1dHVyZV91bmljb2RlX2xpdGVyYWxzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YjVhOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2YvZnV0dXJlX3VuaWNvZGVfbGl0ZXJhbHMucmMKQEAgLTAsMCArMSBAQAorW3Rlc3RvcHRpb25zXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9mL2Z1dHVyZV91bmljb2RlX2xpdGVyYWxzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdXR1cmVfdW5pY29kZV9saXRlcmFscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1NmI2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZi9mdXR1cmVfdW5pY29kZV9saXRlcmFscy50eHQKQEAgLTAsMCArMSBAQAorYW5vbWFsb3VzLXVuaWNvZGUtZXNjYXBlLWluLXN0cmluZzo1OjE1OjoiQW5vbWFsb3VzIFVuaWNvZGUgZXNjYXBlIGluIGJ5dGUgc3RyaW5nOiAnXHUnLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIG9yIHUgcHJlZml4LiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJhdGVkX21lbWJlcnMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJhdGVkX21lbWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5YzAwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmF0ZWRfbWVtYmVycy5weQpAQCAtMCwwICsxLDIwIEBACisiIiJUZXN0IHRoZSBnZW5lcmF0ZWQtbWVtYmVycyBjb25maWcgb3B0aW9uLiIiIgorIyBweWxpbnQ6IGRpc2FibGU9cG9pbnRsZXNzLXN0YXRlbWVudCwgaW52YWxpZC1uYW1lLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBhc3Ryb2lkIGltcG9ydCBub2RlX2NsYXNzZXMKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycworCitjbGFzcyBLbGFzcyhvYmplY3QpOgorICAgICIiIkEgY2xhc3Mgd2l0aCBhIGdlbmVyYXRlZCBtZW1iZXIuIiIiCisKK3ByaW50KEtsYXNzKCkuRG9lc05vdEV4aXN0KQorcHJpbnQoS2xhc3MoKS5hQkNfc2V0MSkKK3ByaW50KEtsYXNzKCkuaGFtLmRvZXMubm90Xy5leGlzdCkKK3ByaW50KEtsYXNzKCkuc3BhbS5kb2VzLm5vdF8uZXhpc3QpICAjIFtuby1tZW1iZXJdCitub2RlX2NsYXNzZXMuVHVwbGUuZG9lcy5ub3RfLmV4aXN0CitjaGVja2Vycy5iYXNlLmRvZXNub3RleGlzdCgpCisKK3Nlc3Npb24gPSBLbGFzcygpCitTRVNTSU9OID0gS2xhc3MoKQorc2Vzc2lvbi5yb2xsYmFjaygpCitTRVNTSU9OLnJvbGxiYWNrKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmF0ZWRfbWVtYmVycy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmF0ZWRfbWVtYmVycy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYxYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyYXRlZF9tZW1iZXJzLnJjCkBAIC0wLDAgKzEsMTEgQEAKK1tNZXNzYWdlcyBDb250cm9sXQorZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLHByaW50LXN0YXRlbWVudAorCitbdHlwZWNoZWNrXQorZ2VuZXJhdGVkLW1lbWJlcnM9CisgICAgXEFmdW5jdGlvbmFsXC5nXC5nZW5lcmF0ZWRfbWVtYmVyc1wuS2xhc3NcLmhhbVxaLAorICAgIERvZXNOb3RFeGlzdCwKKyAgICAiW2EtekEtWl0rX3NldHsxLDJ9IiwKKyAgICBub2RlX2NsYXNzZXMuVHVwbGUuKiwKKyAgICBjaGVja2Vycy4qP2Jhc2UsCisgICAgKHNlc3Npb258U0VTU0lPTikucm9sbGJhY2sKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmF0ZWRfbWVtYmVycy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJhdGVkX21lbWJlcnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTc5M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJhdGVkX21lbWJlcnMudHh0CkBAIC0wLDAgKzEgQEAKK25vLW1lbWJlcjoxMzo2OjpJbnN0YW5jZSBvZiAnS2xhc3MnIGhhcyBubyAnc3BhbScgbWVtYmVyOklORkVSRU5DRQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvX19pbml0X18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjZiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zLnB5CkBAIC0wLDAgKzEsMTMwIEBACisiIiJUZXN0IGdlbmVyaWMgYWxpYXMgc3VwcG9ydCBmb3Igc3RkbGliIHR5cGVzIChhZGRlZCBpbiBQWTM5KS4iIiIKKyMgZmxha2U4OiBub3FhCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50CisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG11bHRpcGxlLXN0YXRlbWVudHMsbGluZS10b28tbG9uZworaW1wb3J0IGFiYworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IHJlCisKKyMgc3BlY2lhbAordHVwbGVbaW50LCBpbnRdCit0eXBlW2ludF0KK2NvbGxlY3Rpb25zLmFiYy5DYWxsYWJsZVtbaW50XSwgc3RyXQorCisjIGJ1aWx0aW5zCitkaWN0W2ludCwgc3RyXQorbGlzdFtpbnRdCitzZXRbaW50XQorZnJvemVuc2V0W2ludF0KKworIyBjb2xsZWN0aW9ucworY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RbaW50LCBzdHJdCitjb2xsZWN0aW9ucy5PcmRlcmVkRGljdFtpbnQsIHN0cl0KK2NvbGxlY3Rpb25zLkNoYWluTWFwW2ludCwgc3RyXQorY29sbGVjdGlvbnMuQ291bnRlcltpbnRdCitjb2xsZWN0aW9ucy5kZXF1ZVtpbnRdCisKKyMgY29sbGVjdGlvbnMuYWJjCitjb2xsZWN0aW9ucy5hYmMuU2V0W2ludF0KK2NvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uW2ludF0KK2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXJbaW50XQorY29sbGVjdGlvbnMuYWJjLkl0ZW1zVmlld1tpbnQsIHN0cl0KK2NvbGxlY3Rpb25zLmFiYy5LZXlzVmlld1tpbnRdCitjb2xsZWN0aW9ucy5hYmMuTWFwcGluZ1tpbnQsIHN0cl0KK2NvbGxlY3Rpb25zLmFiYy5NYXBwaW5nVmlld1tpbnRdCitjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmdbaW50LCBzdHJdCitjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlW2ludF0KK2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0W2ludF0KK2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZVtpbnRdCitjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlld1tpbnRdCisKK2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdCitjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JbaW50XQorY29sbGVjdGlvbnMuYWJjLkdlbmVyYXRvcltpbnQsIE5vbmUsIE5vbmVdCitjb2xsZWN0aW9ucy5hYmMuUmV2ZXJzaWJsZVtpbnRdCisKK2NvbGxlY3Rpb25zLmFiYy5Db3JvdXRpbmVbbGlzdFtzdHJdLCBzdHIsIGludF0KK2NvbGxlY3Rpb25zLmFiYy5Bc3luY0dlbmVyYXRvcltpbnQsIE5vbmVdCitjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYWJsZVtpbnRdCitjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYXRvcltpbnRdCitjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlW2ludF0KKworIyBjb250ZXh0bGliCitjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJbaW50XQorY29udGV4dGxpYi5BYnN0cmFjdEFzeW5jQ29udGV4dE1hbmFnZXJbaW50XQorCisjIHJlCityZS5QYXR0ZXJuW3N0cl0KK3JlLk1hdGNoW3N0cl0KKworCisjIHVuc3Vic2NyaXB0YWJsZSB0eXBlcworY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlCitjb2xsZWN0aW9ucy5hYmMuU2l6ZWQKK2NvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLlNpemVkW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgc3Vic2NyaXB0YWJsZSB3aXRoIFB5dGhvbiAzLjkKK2NvbGxlY3Rpb25zLmFiYy5CeXRlU3RyaW5nW2ludF0KKworCisjIE1pc3NpbmcgaW1wbGVtZW50YXRpb24gZm9yICdjb2xsZWN0aW9ucy5hYmMnIGRlcml2ZWQgY2xhc3NlcworY2xhc3MgRGVyaXZlZEhhc2hhYmxlKGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZSk6ICAjIFthYnN0cmFjdC1tZXRob2RdICAjIF9faGFzaF9fCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkSXRlcmFibGUoY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0pOiAgIyBbYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2l0ZXJfXworICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZENvbGxlY3Rpb24oY29sbGVjdGlvbnMuYWJjLkNvbGxlY3Rpb25baW50XSk6ICAjIFthYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kLGFic3RyYWN0LW1ldGhvZF0gICMgX19jb250YWluc19fLCBfX2l0ZXJfXywgX19sZW5fXworICAgIHBhc3MKKworCisjIE5vIGltcGxlbWVudGF0aW9uIHJlcXVpcmVkIGZvciAnYnVpbHRpbnMnIGFuZCAnY29sbGVjdGlvbnMnIHR5cGVzCitjbGFzcyBEZXJpdmVkTGlzdChsaXN0W2ludF0pOgorICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZFNldChzZXRbaW50XSk6CisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkT3JkZXJlZERpY3QoY29sbGVjdGlvbnMuT3JkZXJlZERpY3RbaW50LCBzdHJdKToKKyAgICBwYXNzCisKK2NsYXNzIERlcml2ZWRMaXN0SXRlcmFibGUobGlzdFtjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbaW50XV0pOgorICAgIHBhc3MKKworCisjIE11bHRpcGxlIGdlbmVyaWMgYmFzZSBjbGFzc2VzCitjbGFzcyBEZXJpdmVkTXVsdGlwbGUoY29sbGVjdGlvbnMuYWJjLlNpemVkLCBjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUpOiAgIyBbYWJzdHJhY3QtbWV0aG9kLGFic3RyYWN0LW1ldGhvZF0KKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbUFic3RyYWN0Q2xzMShhYmMuQUJDKToKKyAgICBwYXNzCitjbGFzcyBDdXN0b21BYnN0cmFjdENsczIoY29sbGVjdGlvbnMuYWJjLlNpemVkLCBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbQ3VzdG9tQWJzdHJhY3RDbHMxXSk6ICAjIFthYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2l0ZXJfXywgX19sZW5fXworICAgIHBhc3MKK2NsYXNzIEN1c3RvbUltcGxlbWVudGF0aW9uKEN1c3RvbUFic3RyYWN0Q2xzMik6ICAjIFthYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2l0ZXJfXywgX19sZW5fXworICAgIHBhc3MKKworCisjIFR5cGUgYW5ub3RhdGlvbnMKK3Zhcl90dXBsZTogdHVwbGVbaW50LCBpbnRdCit2YXJfZGljdDogZGljdFtpbnQsIHN0cl0KK3Zhcl9vcmRlcmVkRGljdDogY29sbGVjdGlvbnMuT3JkZXJlZERpY3RbaW50LCBzdHJdCit2YXJfY29udGFpbmVyOiBjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyW2ludF0KK3Zhcl9zZXF1ZW5jZTogY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlW2ludF0KK3Zhcl9pdGVyYWJsZTogY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0KK3Zhcl9hd2FpdGFibGU6IGNvbGxlY3Rpb25zLmFiYy5Bd2FpdGFibGVbaW50XQordmFyX2NvbnRleHRtYW5hZ2VyOiBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJbaW50XQordmFyX3BhdHRlcm46IHJlLlBhdHRlcm5baW50XQordmFyX2J5dGVzdHJpbmc6IGNvbGxlY3Rpb25zLmFiYy5CeXRlU3RyaW5nCit2YXJfaGFzaGFibGU6IGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZQordmFyX3NpemVkOiBjb2xsZWN0aW9ucy5hYmMuU2l6ZWQKKworIyBUeXBlIGFubm90YXRpb24gd2l0aCB1bnN1YnNjcmlwdGFibGUgdHlwZQordmFyX2ludDogaW50W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfaGFzaGFibGUyOiBjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9zaXplZDI6IGNvbGxlY3Rpb25zLmFiYy5TaXplZFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisjIHN1YnNjcmlwdGFibGUgd2l0aCBQeXRob24gMy45Cit2YXJfYnl0ZXN0cmluZzI6IGNvbGxlY3Rpb25zLmFiYy5CeXRlU3RyaW5nW2ludF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Yjc1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19jb2xsZWN0aW9ucy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNlMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19jb2xsZWN0aW9ucy50eHQKQEAgLTAsMCArMSwxNiBAQAordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo2NjowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Njc6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TaXplZCcgaXMgdW5zdWJzY3JpcHRhYmxlCithYnN0cmFjdC1tZXRob2Q6NzQ6MDpEZXJpdmVkSGFzaGFibGU6TWV0aG9kICdfX2hhc2hfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0hhc2hhYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo3NzowOkRlcml2ZWRJdGVyYWJsZTpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSXRlcmFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjgwOjA6RGVyaXZlZENvbGxlY3Rpb246TWV0aG9kICdfX2NvbnRhaW5zX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdDb250YWluZXInIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjgwOjA6RGVyaXZlZENvbGxlY3Rpb246TWV0aG9kICdfX2l0ZXJfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0l0ZXJhYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo4MDowOkRlcml2ZWRDb2xsZWN0aW9uOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDo5OTowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjk5OjA6RGVyaXZlZE11bHRpcGxlOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMDQ6MDpDdXN0b21BYnN0cmFjdENsczI6TWV0aG9kICdfX2l0ZXJfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0l0ZXJhYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMDQ6MDpDdXN0b21BYnN0cmFjdENsczI6TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU2l6ZWQnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwNjowOkN1c3RvbUltcGxlbWVudGF0aW9uOk1ldGhvZCAnX19pdGVyX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdJdGVyYWJsZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6MTA2OjA6Q3VzdG9tSW1wbGVtZW50YXRpb246TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU2l6ZWQnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjU6OTo6VmFsdWUgJ2ludCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyNjoxNTo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyNzoxMjo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TaXplZCcgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zX3B5MzcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zX3B5MzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhMTUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzNy5weQpAQCAtMCwwICsxLDEzMyBAQAorIiIiVGVzdCBnZW5lcmljIGFsaWFzIHN1cHBvcnQgZm9yIHN0ZGxpYiB0eXBlcyAoYWRkZWQgaW4gUFkzOSkuCisKK1JhaXNlIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XSBlcnJvciBmb3IgUFkzNyBhbmQgUFkzOC4KKyIiIgorIyBmbGFrZTg6IG5vcWEKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHBvaW50bGVzcy1zdGF0ZW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbXVsdGlwbGUtc3RhdGVtZW50cyxsaW5lLXRvby1sb25nCitpbXBvcnQgYWJjCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgcmUKKworIyBzcGVjaWFsCit0dXBsZVtpbnQsIGludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit0eXBlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQ2FsbGFibGVbW2ludF0sIHN0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgYnVpbHRpbnMKK2RpY3RbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorbGlzdFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorc2V0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitmcm96ZW5zZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBjb2xsZWN0aW9ucworY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuT3JkZXJlZERpY3RbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuQ2hhaW5NYXBbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuQ291bnRlcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuZGVxdWVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBjb2xsZWN0aW9ucy5hYmMKK2NvbGxlY3Rpb25zLmFiYy5TZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuSXRlbXNWaWV3W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5LZXlzVmlld1tpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdWaWV3W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmdbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLlZhbHVlc1ZpZXdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5HZW5lcmF0b3JbaW50LCBOb25lLCBOb25lXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5SZXZlcnNpYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK2NvbGxlY3Rpb25zLmFiYy5Db3JvdXRpbmVbbGlzdFtzdHJdLCBzdHIsIGludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QsdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Bc3luY0dlbmVyYXRvcltpbnQsIE5vbmVdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmFibGVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Bc3luY0l0ZXJhdG9yW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgY29udGV4dGxpYgorY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb250ZXh0bGliLkFic3RyYWN0QXN5bmNDb250ZXh0TWFuYWdlcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisjIHJlCityZS5QYXR0ZXJuW3N0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCityZS5NYXRjaFtzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisKKyMgdW5zdWJzY3JpcHRhYmxlIHR5cGVzCitjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUKK2NvbGxlY3Rpb25zLmFiYy5TaXplZAorY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuU2l6ZWRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBzdWJzY3JpcHRhYmxlIHdpdGggUHl0aG9uIDMuOQorY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCisjIE1pc3NpbmcgaW1wbGVtZW50YXRpb24gZm9yICdjb2xsZWN0aW9ucy5hYmMnIGRlcml2ZWQgY2xhc3NlcworY2xhc3MgRGVyaXZlZEhhc2hhYmxlKGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZSk6ICAjIFthYnN0cmFjdC1tZXRob2RdICAjIF9faGFzaF9fCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkSXRlcmFibGUoY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKK2NsYXNzIERlcml2ZWRDb2xsZWN0aW9uKGNvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uW2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKKworIyBObyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBmb3IgJ2J1aWx0aW5zJyBhbmQgJ2NvbGxlY3Rpb25zJyB0eXBlcworY2xhc3MgRGVyaXZlZExpc3QobGlzdFtpbnRdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkU2V0KHNldFtpbnRdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkT3JkZXJlZERpY3QoY29sbGVjdGlvbnMuT3JkZXJlZERpY3RbaW50LCBzdHJdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkTGlzdEl0ZXJhYmxlKGxpc3RbY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF1dKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QsdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKKworIyBNdWx0aXBsZSBnZW5lcmljIGJhc2UgY2xhc3NlcworY2xhc3MgRGVyaXZlZE11bHRpcGxlKGNvbGxlY3Rpb25zLmFiYy5TaXplZCwgY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlKTogICMgW2Fic3RyYWN0LW1ldGhvZCxhYnN0cmFjdC1tZXRob2RdCisgICAgcGFzcworCitjbGFzcyBDdXN0b21BYnN0cmFjdENsczEoYWJjLkFCQyk6CisgICAgcGFzcworY2xhc3MgQ3VzdG9tQWJzdHJhY3RDbHMyKGNvbGxlY3Rpb25zLmFiYy5TaXplZCwgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW0N1c3RvbUFic3RyYWN0Q2xzMV0pOiAgIyBbYWJzdHJhY3QtbWV0aG9kLHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdICAjIF9fbGVuX18KKyAgICBwYXNzCitjbGFzcyBDdXN0b21JbXBsZW1lbnRhdGlvbihDdXN0b21BYnN0cmFjdENsczIpOiAgIyBbYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2xlbl9fCisgICAgcGFzcworCisKKyMgVHlwZSBhbm5vdGF0aW9ucwordmFyX3R1cGxlOiB0dXBsZVtpbnQsIGludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfZGljdDogZGljdFtpbnQsIHN0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfb3JkZXJlZERpY3Q6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9jb250YWluZXI6IGNvbGxlY3Rpb25zLmFiYy5Db250YWluZXJbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9zZXF1ZW5jZTogY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfaXRlcmFibGU6IGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyX2F3YWl0YWJsZTogY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyX2NvbnRleHRtYW5hZ2VyOiBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9wYXR0ZXJuOiByZS5QYXR0ZXJuW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfYnl0ZXN0cmluZzogY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmcKK3Zhcl9oYXNoYWJsZTogY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlCit2YXJfc2l6ZWQ6IGNvbGxlY3Rpb25zLmFiYy5TaXplZAorCisjIFR5cGUgYW5ub3RhdGlvbiB3aXRoIHVuc3Vic2NyaXB0YWJsZSB0eXBlCit2YXJfaW50OiBpbnRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9oYXNoYWJsZTI6IGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyX3NpemVkMjogY29sbGVjdGlvbnMuYWJjLlNpemVkW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgc3Vic2NyaXB0YWJsZSB3aXRoIFB5dGhvbiAzLjkKK3Zhcl9ieXRlc3RyaW5nMjogY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzNy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzNy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRmOGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19jb2xsZWN0aW9uc19weTM3LnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNworbWF4X3B5dmVyPTMuOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19jb2xsZWN0aW9uc19weTM3LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwODA3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzNy50eHQKQEAgLTAsMCArMSw2NyBAQAordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNTowOjpWYWx1ZSAndHVwbGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNjowOjpWYWx1ZSAndHlwZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjE3OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQ2FsbGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyMDowOjpWYWx1ZSAnZGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjIxOjA6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MjI6MDo6VmFsdWUgJ3NldCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjIzOjA6OlZhbHVlICdmcm96ZW5zZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyNjowOjpWYWx1ZSAnY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyNzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuT3JkZXJlZERpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyODowOjpWYWx1ZSAnY29sbGVjdGlvbnMuQ2hhaW5NYXAnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyOTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuQ291bnRlcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMwOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5kZXF1ZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMzOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuU2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MzQ6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MzU6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozNjowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZW1zVmlldycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM3OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuS2V5c1ZpZXcnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozODowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLk1hcHBpbmcnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozOTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdWaWV3JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDA6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQxOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDI6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDM6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQ0OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlldycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQ2OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhdG9yJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDg6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5HZW5lcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0OTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLlJldmVyc2libGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1MTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkNvcm91dGluZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjUxOjI2OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjUyOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQXN5bmNHZW5lcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1MzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1NDowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1NTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU4OjA6OlZhbHVlICdjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1OTowOjpWYWx1ZSAnY29udGV4dGxpYi5BYnN0cmFjdEFzeW5jQ29udGV4dE1hbmFnZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo2MjowOjpWYWx1ZSAncmUuUGF0dGVybicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjYzOjA6OlZhbHVlICdyZS5NYXRjaCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY5OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo3MDowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLlNpemVkJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NzM6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5CeXRlU3RyaW5nJyBpcyB1bnN1YnNjcmlwdGFibGUKK2Fic3RyYWN0LW1ldGhvZDo3NzowOkRlcml2ZWRIYXNoYWJsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo4MDoyMjpEZXJpdmVkSXRlcmFibGU6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjgzOjI0OkRlcml2ZWRDb2xsZWN0aW9uOlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQ29sbGVjdGlvbicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg4OjE4OkRlcml2ZWRMaXN0OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6OTE6MTc6RGVyaXZlZFNldDpWYWx1ZSAnc2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6OTQ6MjU6RGVyaXZlZE9yZGVyZWREaWN0OlZhbHVlICdjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk3OjMxOkRlcml2ZWRMaXN0SXRlcmFibGU6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk3OjI2OkRlcml2ZWRMaXN0SXRlcmFibGU6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQorYWJzdHJhY3QtbWV0aG9kOjEwMjowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwMjowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTaXplZCcgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6MTA3OjA6Q3VzdG9tQWJzdHJhY3RDbHMyOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTA3OjQ4OkN1c3RvbUFic3RyYWN0Q2xzMjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK2Fic3RyYWN0LW1ldGhvZDoxMDk6MDpDdXN0b21JbXBsZW1lbnRhdGlvbjpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTaXplZCcgYnV0IGlzIG5vdCBvdmVycmlkZGVuCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExNDoxMTo6VmFsdWUgJ3R1cGxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTE1OjEwOjpWYWx1ZSAnZGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExNjoxNzo6VmFsdWUgJ2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTE3OjE1OjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExODoxNDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExOToxNDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyMDoxNTo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Bd2FpdGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjE6MjA6OlZhbHVlICdjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjI6MTM6OlZhbHVlICdyZS5QYXR0ZXJuJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTI4Ojk6OlZhbHVlICdpbnQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjk6MTU6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMzA6MTI6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuU2l6ZWQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMzM6MTc6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQnl0ZVN0cmluZycgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zX3B5Mzdfd2l0aF90eXBpbmcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX2NvbGxlY3Rpb25zX3B5Mzdfd2l0aF90eXBpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxOWYxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzN193aXRoX3R5cGluZy5weQpAQCAtMCwwICsxLDEzNSBAQAorIiIiVGVzdCBnZW5lcmljIGFsaWFzIHN1cHBvcnQgZm9yIHN0ZGxpYiB0eXBlcyAoYWRkZWQgaW4gUFkzOSkuCisKK1JhaXNlIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XSBlcnJvciBmb3IgUFkzNyBhbmQgUFkzOC4KK01ha2Ugc3VyZSBgaW1wb3J0IHR5cGluZ2AgZG9lc24ndCBjaGFuZ2UgYW55dGhpbmcuCisiIiIKKyMgZmxha2U4OiBub3FhCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50LHVudXNlZC1pbXBvcnQKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbXVsdGlwbGUtc3RhdGVtZW50cyxsaW5lLXRvby1sb25nCitpbXBvcnQgYWJjCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgcmUKK2ltcG9ydCB0eXBpbmcKKworIyBzcGVjaWFsCit0dXBsZVtpbnQsIGludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit0eXBlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQ2FsbGFibGVbW2ludF0sIHN0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgYnVpbHRpbnMKK2RpY3RbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorbGlzdFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorc2V0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitmcm96ZW5zZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBjb2xsZWN0aW9ucworY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuT3JkZXJlZERpY3RbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuQ2hhaW5NYXBbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuQ291bnRlcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuZGVxdWVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBjb2xsZWN0aW9ucy5hYmMKK2NvbGxlY3Rpb25zLmFiYy5TZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuSXRlbXNWaWV3W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5LZXlzVmlld1tpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdWaWV3W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZU1hcHBpbmdbaW50LCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLlZhbHVlc1ZpZXdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5HZW5lcmF0b3JbaW50LCBOb25lLCBOb25lXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5SZXZlcnNpYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK2NvbGxlY3Rpb25zLmFiYy5Db3JvdXRpbmVbbGlzdFtzdHJdLCBzdHIsIGludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QsdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Bc3luY0dlbmVyYXRvcltpbnQsIE5vbmVdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmFibGVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Bc3luY0l0ZXJhdG9yW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgY29udGV4dGxpYgorY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb250ZXh0bGliLkFic3RyYWN0QXN5bmNDb250ZXh0TWFuYWdlcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisjIHJlCityZS5QYXR0ZXJuW3N0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCityZS5NYXRjaFtzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisKKyMgdW5zdWJzY3JpcHRhYmxlIHR5cGVzCitjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUKK2NvbGxlY3Rpb25zLmFiYy5TaXplZAorY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuU2l6ZWRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBzdWJzY3JpcHRhYmxlIHdpdGggUHl0aG9uIDMuOQorY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCisjIE1pc3NpbmcgaW1wbGVtZW50YXRpb24gZm9yICdjb2xsZWN0aW9ucy5hYmMnIGRlcml2ZWQgY2xhc3NlcworY2xhc3MgRGVyaXZlZEhhc2hhYmxlKGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZSk6ICAjIFthYnN0cmFjdC1tZXRob2RdICAjIF9faGFzaF9fCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkSXRlcmFibGUoY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKK2NsYXNzIERlcml2ZWRDb2xsZWN0aW9uKGNvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uW2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKKworIyBObyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBmb3IgJ2J1aWx0aW5zJyBhbmQgJ2NvbGxlY3Rpb25zJyB0eXBlcworY2xhc3MgRGVyaXZlZExpc3QobGlzdFtpbnRdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkU2V0KHNldFtpbnRdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkT3JkZXJlZERpY3QoY29sbGVjdGlvbnMuT3JkZXJlZERpY3RbaW50LCBzdHJdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkTGlzdEl0ZXJhYmxlKGxpc3RbY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW2ludF1dKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QsdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKKworIyBNdWx0aXBsZSBnZW5lcmljIGJhc2UgY2xhc3NlcworY2xhc3MgRGVyaXZlZE11bHRpcGxlKGNvbGxlY3Rpb25zLmFiYy5TaXplZCwgY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlKTogICMgW2Fic3RyYWN0LW1ldGhvZCxhYnN0cmFjdC1tZXRob2RdCisgICAgcGFzcworCitjbGFzcyBDdXN0b21BYnN0cmFjdENsczEoYWJjLkFCQyk6CisgICAgcGFzcworY2xhc3MgQ3VzdG9tQWJzdHJhY3RDbHMyKGNvbGxlY3Rpb25zLmFiYy5TaXplZCwgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlW0N1c3RvbUFic3RyYWN0Q2xzMV0pOiAgIyBbYWJzdHJhY3QtbWV0aG9kLHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdICAjIF9fbGVuX18KKyAgICBwYXNzCitjbGFzcyBDdXN0b21JbXBsZW1lbnRhdGlvbihDdXN0b21BYnN0cmFjdENsczIpOiAgIyBbYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2xlbl9fCisgICAgcGFzcworCisKKyMgVHlwZSBhbm5vdGF0aW9ucwordmFyX3R1cGxlOiB0dXBsZVtpbnQsIGludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfZGljdDogZGljdFtpbnQsIHN0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfb3JkZXJlZERpY3Q6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9jb250YWluZXI6IGNvbGxlY3Rpb25zLmFiYy5Db250YWluZXJbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9zZXF1ZW5jZTogY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfaXRlcmFibGU6IGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyX2F3YWl0YWJsZTogY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyX2NvbnRleHRtYW5hZ2VyOiBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9wYXR0ZXJuOiByZS5QYXR0ZXJuW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfYnl0ZXN0cmluZzogY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmcKK3Zhcl9oYXNoYWJsZTogY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlCit2YXJfc2l6ZWQ6IGNvbGxlY3Rpb25zLmFiYy5TaXplZAorCisjIFR5cGUgYW5ub3RhdGlvbiB3aXRoIHVuc3Vic2NyaXB0YWJsZSB0eXBlCit2YXJfaW50OiBpbnRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9oYXNoYWJsZTI6IGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyX3NpemVkMjogY29sbGVjdGlvbnMuYWJjLlNpemVkW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgc3Vic2NyaXB0YWJsZSB3aXRoIFB5dGhvbiAzLjkKK3Zhcl9ieXRlc3RyaW5nMjogY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzN193aXRoX3R5cGluZy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzN193aXRoX3R5cGluZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRmOGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19jb2xsZWN0aW9uc19weTM3X3dpdGhfdHlwaW5nLnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNworbWF4X3B5dmVyPTMuOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19jb2xsZWN0aW9uc19weTM3X3dpdGhfdHlwaW5nLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzN193aXRoX3R5cGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3YmM0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfY29sbGVjdGlvbnNfcHkzN193aXRoX3R5cGluZy50eHQKQEAgLTAsMCArMSw2NyBAQAordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNzowOjpWYWx1ZSAndHVwbGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxODowOjpWYWx1ZSAndHlwZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjE5OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQ2FsbGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyMjowOjpWYWx1ZSAnZGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjIzOjA6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MjQ6MDo6VmFsdWUgJ3NldCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjI1OjA6OlZhbHVlICdmcm96ZW5zZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyODowOjpWYWx1ZSAnY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyOTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuT3JkZXJlZERpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozMDowOjpWYWx1ZSAnY29sbGVjdGlvbnMuQ2hhaW5NYXAnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozMTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuQ291bnRlcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMyOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5kZXF1ZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM1OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuU2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MzY6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Mzc6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozODowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZW1zVmlldycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM5OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuS2V5c1ZpZXcnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0MDowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLk1hcHBpbmcnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0MTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdWaWV3JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDI6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQzOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDQ6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDU6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQ2OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlldycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQ4OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0OTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhdG9yJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTA6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5HZW5lcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1MTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLlJldmVyc2libGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1MzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkNvcm91dGluZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjUzOjI2OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU0OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQXN5bmNHZW5lcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1NTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1NjowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1NzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjYwOjA6OlZhbHVlICdjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo2MTowOjpWYWx1ZSAnY29udGV4dGxpYi5BYnN0cmFjdEFzeW5jQ29udGV4dE1hbmFnZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo2NDowOjpWYWx1ZSAncmUuUGF0dGVybicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY1OjA6OlZhbHVlICdyZS5NYXRjaCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjcxOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo3MjowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLlNpemVkJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NzU6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5CeXRlU3RyaW5nJyBpcyB1bnN1YnNjcmlwdGFibGUKK2Fic3RyYWN0LW1ldGhvZDo3OTowOkRlcml2ZWRIYXNoYWJsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo4MjoyMjpEZXJpdmVkSXRlcmFibGU6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg1OjI0OkRlcml2ZWRDb2xsZWN0aW9uOlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQ29sbGVjdGlvbicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjkwOjE4OkRlcml2ZWRMaXN0OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6OTM6MTc6RGVyaXZlZFNldDpWYWx1ZSAnc2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6OTY6MjU6RGVyaXZlZE9yZGVyZWREaWN0OlZhbHVlICdjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk5OjMxOkRlcml2ZWRMaXN0SXRlcmFibGU6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk5OjI2OkRlcml2ZWRMaXN0SXRlcmFibGU6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQorYWJzdHJhY3QtbWV0aG9kOjEwNDowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwNDowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTaXplZCcgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6MTA5OjA6Q3VzdG9tQWJzdHJhY3RDbHMyOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTA5OjQ4OkN1c3RvbUFic3RyYWN0Q2xzMjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK2Fic3RyYWN0LW1ldGhvZDoxMTE6MDpDdXN0b21JbXBsZW1lbnRhdGlvbjpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTaXplZCcgYnV0IGlzIG5vdCBvdmVycmlkZGVuCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExNjoxMTo6VmFsdWUgJ3R1cGxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTE3OjEwOjpWYWx1ZSAnZGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExODoxNzo6VmFsdWUgJ2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTE5OjE1OjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyMDoxNDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyMToxNDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyMjoxNTo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Bd2FpdGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjM6MjA6OlZhbHVlICdjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXInIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjQ6MTM6OlZhbHVlICdyZS5QYXR0ZXJuJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTMwOjk6OlZhbHVlICdpbnQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMzE6MTU6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMzI6MTI6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuU2l6ZWQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMzU6MTc6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQnl0ZVN0cmluZycgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX21peGVkX3B5MzcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX21peGVkX3B5MzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3YTRkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfbWl4ZWRfcHkzNy5weQpAQCAtMCwwICsxLDQxIEBACisiIiJUZXN0IGdlbmVyaWMgYWxpYXMgc3VwcG9ydCB3aXRoIG1peCBvZiB0eXBpbmcucHkgYW5kIHN0ZGxpYiB0eXBlcy4KKworUG9zc2libGUgd2l0aCBwb3N0cG9uZWQgZXZhbHVhdGlvbiBlbmFibGVkLCBzdGFydGluZyB3aXRoIFBZMzcuCisiIiIKKyMgZmxha2U4OiBub3FhCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50CisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG11bHRpcGxlLXN0YXRlbWVudHMsbGluZS10b28tbG9uZworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucworCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgcmUKK2ltcG9ydCB0eXBpbmcKKworIyBUeXBlIGFubm90YXRpb25zCit2YXJfb3JkZXJlZERpY3Q6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W2ludCwgc3RyXQordmFyX2NvbnRhaW5lcjogY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcltpbnRdCit2YXJfc2VxdWVuY2U6IGNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZVtpbnRdCit2YXJfaXRlcmFibGU6IGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdCit2YXJfYXdhaXRhYmxlOiBjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlW2ludF0KK3Zhcl9wYXR0ZXJuOiByZS5QYXR0ZXJuW2ludF0KK3Zhcl9ieXRlc3RyaW5nOiBjb2xsZWN0aW9ucy5hYmMuQnl0ZVN0cmluZwordmFyX2hhc2hhYmxlOiBjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUKK3Zhcl9Db250ZXh0TWFuYWdlcjogY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyW2ludF0KKworCisjIE5vIGltcGxlbWVudGF0aW9uIHJlcXVpcmVkIGZvciAnYnVpbHRpbnMnCitjbGFzcyBEZXJpdmVkTGlzdEl0ZXJhYmxlKHR5cGluZy5MaXN0W3R5cGluZy5JdGVyYWJsZVtpbnRdXSk6CisgICAgcGFzcworCisKKyMgTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBmb3IgJ2NvbGxlY3Rpb25zLmFiYycgZGVyaXZlZCBjbGFzc2VzCitjbGFzcyBEZXJpdmVkSGFzaGFibGUodHlwaW5nLkhhc2hhYmxlKTogICMgW2Fic3RyYWN0LW1ldGhvZF0gICMgX19oYXNoX18KKyAgICBwYXNzCisKK2NsYXNzIERlcml2ZWRJdGVyYWJsZSh0eXBpbmcuSXRlcmFibGVbaW50XSk6ICAjIFthYnN0cmFjdC1tZXRob2RdICAjIF9faXRlcl9fCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkQ29sbGVjdGlvbih0eXBpbmcuQ29sbGVjdGlvbltpbnRdKTogICMgW2Fic3RyYWN0LW1ldGhvZCxhYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2NvbnRhaW5zX18sIF9faXRlcl9fLCBfX2xlbl9fCisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM3LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM3LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGY4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX21peGVkX3B5MzcucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CittYXhfcHl2ZXI9My45CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX21peGVkX3B5MzcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGQ3ODRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM3LnR4dApAQCAtMCwwICsxLDUgQEAKK2Fic3RyYWN0LW1ldGhvZDozNDowOkRlcml2ZWRIYXNoYWJsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjM3OjA6RGVyaXZlZEl0ZXJhYmxlOk1ldGhvZCAnX19pdGVyX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdJdGVyYWJsZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6NDA6MDpEZXJpdmVkQ29sbGVjdGlvbjpNZXRob2QgJ19fY29udGFpbnNfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0NvbnRhaW5lcicgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6NDA6MDpEZXJpdmVkQ29sbGVjdGlvbjpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSXRlcmFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjQwOjA6RGVyaXZlZENvbGxlY3Rpb246TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU2l6ZWQnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM5LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNmU2M2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX21peGVkX3B5MzkucHkKQEAgLTAsMCArMSwzNiBAQAorIiIiVGVzdCBnZW5lcmljIGFsaWFzIHN1cHBvcnQgd2l0aCBtaXggb2YgdHlwaW5nLnB5IGFuZCBzdGRsaWIgdHlwZXMgKFBZMzkrKS4iIiIKKyMgZmxha2U4OiBub3FhCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50CisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG11bHRpcGxlLXN0YXRlbWVudHMsbGluZS10b28tbG9uZworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IHJlCitpbXBvcnQgdHlwaW5nCisKKyMgVHlwZSBhbm5vdGF0aW9ucwordmFyX29yZGVyZWREaWN0OiBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdFtpbnQsIHN0cl0KK3Zhcl9jb250YWluZXI6IGNvbGxlY3Rpb25zLmFiYy5Db250YWluZXJbaW50XQordmFyX3NlcXVlbmNlOiBjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2VbaW50XQordmFyX2l0ZXJhYmxlOiBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbaW50XQordmFyX2F3YWl0YWJsZTogY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZVtpbnRdCit2YXJfcGF0dGVybjogcmUuUGF0dGVybltpbnRdCit2YXJfYnl0ZXN0cmluZzogY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmcKK3Zhcl9oYXNoYWJsZTogY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlCit2YXJfQ29udGV4dE1hbmFnZXI6IGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcltpbnRdCisKKworIyBObyBpbXBsZW1lbnRhdGlvbiByZXF1aXJlZCBmb3IgJ2J1aWx0aW5zJworY2xhc3MgRGVyaXZlZExpc3RJdGVyYWJsZSh0eXBpbmcuTGlzdFt0eXBpbmcuSXRlcmFibGVbaW50XV0pOgorICAgIHBhc3MKKworCisjIE1pc3NpbmcgaW1wbGVtZW50YXRpb24gZm9yICdjb2xsZWN0aW9ucy5hYmMnIGRlcml2ZWQgY2xhc3NlcworY2xhc3MgRGVyaXZlZEhhc2hhYmxlKHR5cGluZy5IYXNoYWJsZSk6ICAjIFthYnN0cmFjdC1tZXRob2RdICAjIF9faGFzaF9fCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkSXRlcmFibGUodHlwaW5nLkl0ZXJhYmxlW2ludF0pOiAgIyBbYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2l0ZXJfXworICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZENvbGxlY3Rpb24odHlwaW5nLkNvbGxlY3Rpb25baW50XSk6ICAjIFthYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kLGFic3RyYWN0LW1ldGhvZF0gICMgX19jb250YWluc19fLCBfX2l0ZXJfXywgX19sZW5fXworICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfbWl4ZWRfcHkzOS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfbWl4ZWRfcHkzOS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI3NWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM5LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19taXhlZF9weTM5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfbWl4ZWRfcHkzOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0N2MxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfbWl4ZWRfcHkzOS50eHQKQEAgLTAsMCArMSw1IEBACithYnN0cmFjdC1tZXRob2Q6Mjk6MDpEZXJpdmVkSGFzaGFibGU6TWV0aG9kICdfX2hhc2hfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0hhc2hhYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDozMjowOkRlcml2ZWRJdGVyYWJsZTpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSXRlcmFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjM1OjA6RGVyaXZlZENvbGxlY3Rpb246TWV0aG9kICdfX2NvbnRhaW5zX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdDb250YWluZXInIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjM1OjA6RGVyaXZlZENvbGxlY3Rpb246TWV0aG9kICdfX2l0ZXJfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0l0ZXJhYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDozNTowOkRlcml2ZWRDb2xsZWN0aW9uOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcG9zdHBvbmVkX2V2YWx1YXRpb25fcHkzNy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcG9zdHBvbmVkX2V2YWx1YXRpb25fcHkzNy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGVkNzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19wb3N0cG9uZWRfZXZhbHVhdGlvbl9weTM3LnB5CkBAIC0wLDAgKzEsMTc5IEBACisiIiJUZXN0IGdlbmVyaWMgYWxpYXMgc3VwcG9ydCBmb3Igc3RkbGliIHR5cGVzIChhZGRlZCBpbiBQWTM5KS4KKworSW4gdHlwZSBhbm5vdGF0aW9uIGNvbnRleHQsIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCBwb3N0cG9uZWQgZXZhbHVhdGlvbiBlbmFibGVkLAorc3RhcnRpbmcgd2l0aCBQWTM3LgorIiIiCisjIGZsYWtlODogbm9xYQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcscG9pbnRsZXNzLXN0YXRlbWVudAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtdWx0aXBsZS1zdGF0ZW1lbnRzLGxpbmUtdG9vLWxvbmcKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKKworaW1wb3J0IGFiYworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IHJlCisKKworIyAtLS0tLSB1bnN1YnNjcmlwdGFibGUgKGV2ZW4gd2l0aCBwb3N0cG9uZWQgZXZhbHVhdGlvbikgLS0tLS0KKyMgc3BlY2lhbAordHVwbGVbaW50LCBpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordHlwZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkNhbGxhYmxlW1tpbnRdLCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisjIGJ1aWx0aW5zCitkaWN0W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2xpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3NldFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorZnJvemVuc2V0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgY29sbGVjdGlvbnMKK2NvbGxlY3Rpb25zLmRlZmF1bHRkaWN0W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0W2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLkNoYWluTWFwW2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLkNvdW50ZXJbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmRlcXVlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgY29sbGVjdGlvbnMuYWJjCitjb2xsZWN0aW9ucy5hYmMuU2V0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQ29sbGVjdGlvbltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkl0ZW1zVmlld1tpbnQsIHN0cl0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuS2V5c1ZpZXdbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5NYXBwaW5nW2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5NYXBwaW5nVmlld1tpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nW2ludCwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2VbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2V0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2VbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5WYWx1ZXNWaWV3W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkl0ZXJhdG9yW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuR2VuZXJhdG9yW2ludCwgTm9uZSwgTm9uZV0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuUmV2ZXJzaWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitjb2xsZWN0aW9ucy5hYmMuQ29yb3V0aW5lW2xpc3Rbc3RyXSwgc3RyLCBpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0LHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQXN5bmNHZW5lcmF0b3JbaW50LCBOb25lXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK2NvbGxlY3Rpb25zLmFiYy5Bc3luY0l0ZXJhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYXRvcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisjIGNvbnRleHRsaWIKK2NvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcltpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29udGV4dGxpYi5BYnN0cmFjdEFzeW5jQ29udGV4dE1hbmFnZXJbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyByZQorcmUuUGF0dGVybltzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorcmUuTWF0Y2hbc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCisjIHVuc3Vic2NyaXB0YWJsZSB0eXBlcworY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlCitjb2xsZWN0aW9ucy5hYmMuU2l6ZWQKK2NvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorY29sbGVjdGlvbnMuYWJjLlNpemVkW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgc3Vic2NyaXB0YWJsZSB3aXRoIFB5dGhvbiAzLjkKK2NvbGxlY3Rpb25zLmFiYy5CeXRlU3RyaW5nW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKworIyBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGZvciAnY29sbGVjdGlvbnMuYWJjJyBkZXJpdmVkIGNsYXNzZXMKK2NsYXNzIERlcml2ZWRIYXNoYWJsZShjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUpOiAgIyBbYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2hhc2hfXworICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZEl0ZXJhYmxlKGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkQ29sbGVjdGlvbihjb2xsZWN0aW9ucy5hYmMuQ29sbGVjdGlvbltpbnRdKTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCisKKyMgTm8gaW1wbGVtZW50YXRpb24gcmVxdWlyZWQgZm9yICdidWlsdGlucycgYW5kICdjb2xsZWN0aW9ucycgdHlwZXMKK2NsYXNzIERlcml2ZWRMaXN0KGxpc3RbaW50XSk6ICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZFNldChzZXRbaW50XSk6ICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZE9yZGVyZWREaWN0KGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W2ludCwgc3RyXSk6ICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZExpc3RJdGVyYWJsZShsaXN0W2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdXSk6ICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0LHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCisKKyMgTXVsdGlwbGUgZ2VuZXJpYyBiYXNlIGNsYXNzZXMKK2NsYXNzIERlcml2ZWRNdWx0aXBsZShjb2xsZWN0aW9ucy5hYmMuU2l6ZWQsIGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZSk6ICAjIFthYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kXQorICAgIHBhc3MKKworY2xhc3MgQ3VzdG9tQWJzdHJhY3RDbHMxKGFiYy5BQkMpOgorICAgIHBhc3MKK2NsYXNzIEN1c3RvbUFic3RyYWN0Q2xzMihjb2xsZWN0aW9ucy5hYmMuU2l6ZWQsIGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtDdXN0b21BYnN0cmFjdENsczFdKTogICMgW2Fic3RyYWN0LW1ldGhvZCx1bnN1YnNjcmlwdGFibGUtb2JqZWN0XSAgIyBfX2xlbl9fCisgICAgcGFzcworY2xhc3MgQ3VzdG9tSW1wbGVtZW50YXRpb24oQ3VzdG9tQWJzdHJhY3RDbHMyKTogICMgW2Fic3RyYWN0LW1ldGhvZF0gICMgX19sZW5fXworICAgIHBhc3MKKworCisKKyMgLS0tLS0gc3Vic2NyaXB0YWJsZSAod2l0aCBwb3N0cG9uZWQgZXZhbHVhdGlvbikgLS0tLS0KKyMgc3BlY2lhbAordmFyX3R1cGxlOiB0dXBsZVtpbnQsIGludF0KK3Zhcl90eXBlOiB0eXBlW2ludF0KK3Zhcl9jYWxsYWJsZTogY29sbGVjdGlvbnMuYWJjLkNhbGxhYmxlW1tpbnRdLCBzdHJdCisKKyMgYnVpbHRpbnMKK3Zhcl9kaWN0OiBkaWN0W2ludCwgc3RyXQordmFyX2xpc3Q6IGxpc3RbaW50XQordmFyX3NldDogc2V0W2ludF0KK3Zhcl9mcm96ZW5zZXQ6IGZyb3plbnNldFtpbnRdCisKKyMgY29sbGVjdGlvbnMKK3Zhcl9kZWZhdWx0ZGljdDogY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RbaW50LCBzdHJdCit2YXJfT3JkZXJlZERpY3Q6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W2ludCwgc3RyXQordmFyX0NoYWluTWFwOiBjb2xsZWN0aW9ucy5DaGFpbk1hcFtpbnQsIHN0cl0KK3Zhcl9Db3VudGVyOiBjb2xsZWN0aW9ucy5Db3VudGVyW2ludF0KK3Zhcl9kZXF1ZTogY29sbGVjdGlvbnMuZGVxdWVbaW50XQorCisjIGNvbGxlY3Rpb25zLmFiYwordmFyX2FiY19zZXQ6IGNvbGxlY3Rpb25zLmFiYy5TZXRbaW50XQordmFyX2FiY19jb2xsZWN0aW9uOiBjb2xsZWN0aW9ucy5hYmMuQ29sbGVjdGlvbltpbnRdCit2YXJfYWJjX2NvbnRhaW5lcjogY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcltpbnRdCit2YXJfYWJjX0l0ZW1zVmlldzogY29sbGVjdGlvbnMuYWJjLkl0ZW1zVmlld1tpbnQsIHN0cl0KK3Zhcl9hYmNfS2V5c1ZpZXc6IGNvbGxlY3Rpb25zLmFiYy5LZXlzVmlld1tpbnRdCit2YXJfYWJjX01hcHBpbmc6IGNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nW2ludCwgc3RyXQordmFyX2FiY19NYXBwaW5nVmlldzogY29sbGVjdGlvbnMuYWJjLk1hcHBpbmdWaWV3W2ludF0KK3Zhcl9hYmNfTXV0YWJsZU1hcHBpbmc6IGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZ1tpbnQsIHN0cl0KK3Zhcl9hYmNfTXV0YWJsZVNlcXVlbmNlOiBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlW2ludF0KK3Zhcl9hYmNfTXV0YWJsZVNldDogY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXRbaW50XQordmFyX2FiY19TZXF1ZW5jZTogY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlW2ludF0KK3Zhcl9hYmNfVmFsdWVzVmlldzogY29sbGVjdGlvbnMuYWJjLlZhbHVlc1ZpZXdbaW50XQorCit2YXJfYWJjX0l0ZXJhYmxlOiBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbaW50XQordmFyX2FiY19JdGVyYXRvcjogY29sbGVjdGlvbnMuYWJjLkl0ZXJhdG9yW2ludF0KK3Zhcl9hYmNfR2VuZXJhdG9yOiBjb2xsZWN0aW9ucy5hYmMuR2VuZXJhdG9yW2ludCwgTm9uZSwgTm9uZV0KK3Zhcl9hYmNfUmV2ZXJzaWJsZTogY29sbGVjdGlvbnMuYWJjLlJldmVyc2libGVbaW50XQorCit2YXJfYWJjX0Nvcm91dGluZTogY29sbGVjdGlvbnMuYWJjLkNvcm91dGluZVtsaXN0W3N0cl0sIHN0ciwgaW50XQordmFyX2FiY19Bc3luY0dlbmVyYXRvcjogY29sbGVjdGlvbnMuYWJjLkFzeW5jR2VuZXJhdG9yW2ludCwgTm9uZV0KK3Zhcl9hYmNfQXN5bmNJdGVyYWJsZTogY29sbGVjdGlvbnMuYWJjLkFzeW5jSXRlcmFibGVbaW50XQordmFyX2FiY19Bc3luY0l0ZXJhdG9yOiBjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYXRvcltpbnRdCit2YXJfYWJjX0F3YWl0YWJsZTogY29sbGVjdGlvbnMuYWJjLkF3YWl0YWJsZVtpbnRdCisKKyMgY29udGV4dGxpYgordmFyX0NvbnRleHRNYW5hZ2VyOiBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJbaW50XQordmFyX0FzeW5jQ29udGV4dE1hbmFnZXI6IGNvbnRleHRsaWIuQWJzdHJhY3RBc3luY0NvbnRleHRNYW5hZ2VyW2ludF0KKworIyByZQordmFyX3JlX1BhdHRlcm46IHJlLlBhdHRlcm5bc3RyXQordmFyX3JlX01hdGNoOiByZS5NYXRjaFtzdHJdCisKKworIyB1bnN1YnNjcmlwdGFibGUgdHlwZXMKK3Zhcl9hYmNfSGFzaGFibGU6IGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZQordmFyX2FiY19TaXplZDogY29sbGVjdGlvbnMuYWJjLlNpemVkCit2YXJfYWJjX0hhc2hhYmxlMjogY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfYWJjX1NpemVkMjogY29sbGVjdGlvbnMuYWJjLlNpemVkW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgc3Vic2NyaXB0YWJsZSB3aXRoIFB5dGhvbiAzLjkKK3Zhcl9hYmNfQnl0ZVN0cmluZzogY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmdbaW50XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19wb3N0cG9uZWRfZXZhbHVhdGlvbl9weTM3LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19wb3N0cG9uZWRfZXZhbHVhdGlvbl9weTM3LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGY4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3B5MzcucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CittYXhfcHl2ZXI9My45CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3B5MzcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19wb3N0cG9uZWRfZXZhbHVhdGlvbl9weTM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmZjYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19wb3N0cG9uZWRfZXZhbHVhdGlvbl9weTM3LnR4dApAQCAtMCwwICsxLDU2IEBACit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjIwOjA6OlZhbHVlICd0dXBsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjIxOjA6OlZhbHVlICd0eXBlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MjI6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5DYWxsYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjI1OjA6OlZhbHVlICdkaWN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MjY6MDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyNzowOjpWYWx1ZSAnc2V0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Mjg6MDo6VmFsdWUgJ2Zyb3plbnNldCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMxOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMyOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMzOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5DaGFpbk1hcCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM0OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5Db3VudGVyJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MzU6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmRlcXVlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Mzg6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5TZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozOTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkNvbGxlY3Rpb24nIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0MDowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQxOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSXRlbXNWaWV3JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDI6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5LZXlzVmlldycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQzOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuTWFwcGluZycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQ0OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuTWFwcGluZ1ZpZXcnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NTowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDY6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0ODowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDk6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5WYWx1ZXNWaWV3JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTE6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjUyOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3InIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo1MzowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkdlbmVyYXRvcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU0OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuUmV2ZXJzaWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU2OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQ29yb3V0aW5lJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTY6MjY6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTc6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Bc3luY0dlbmVyYXRvcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU4OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU5OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQXN5bmNJdGVyYXRvcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjYwOjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuQXdhaXRhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NjM6MDo6VmFsdWUgJ2NvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY0OjA6OlZhbHVlICdjb250ZXh0bGliLkFic3RyYWN0QXN5bmNDb250ZXh0TWFuYWdlcicgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY3OjA6OlZhbHVlICdyZS5QYXR0ZXJuJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Njg6MDo6VmFsdWUgJ3JlLk1hdGNoJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NzQ6MDo6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojc1OjA6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuU2l6ZWQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo3ODowOjpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkJ5dGVTdHJpbmcnIGlzIHVuc3Vic2NyaXB0YWJsZQorYWJzdHJhY3QtbWV0aG9kOjgyOjA6RGVyaXZlZEhhc2hhYmxlOk1ldGhvZCAnX19oYXNoX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdIYXNoYWJsZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg1OjIyOkRlcml2ZWRJdGVyYWJsZTpWYWx1ZSAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6ODg6MjQ6RGVyaXZlZENvbGxlY3Rpb246VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5Db2xsZWN0aW9uJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6OTM6MTg6RGVyaXZlZExpc3Q6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5NjoxNzpEZXJpdmVkU2V0OlZhbHVlICdzZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5OToyNTpEZXJpdmVkT3JkZXJlZERpY3Q6VmFsdWUgJ2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTAyOjMxOkRlcml2ZWRMaXN0SXRlcmFibGU6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEwMjoyNjpEZXJpdmVkTGlzdEl0ZXJhYmxlOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK2Fic3RyYWN0LW1ldGhvZDoxMDc6MDpEZXJpdmVkTXVsdGlwbGU6TWV0aG9kICdfX2hhc2hfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0hhc2hhYmxlJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMDc6MDpEZXJpdmVkTXVsdGlwbGU6TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU2l6ZWQnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjExMjowOkN1c3RvbUFic3RyYWN0Q2xzMjpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTaXplZCcgYnV0IGlzIG5vdCBvdmVycmlkZGVuCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExMjo0ODpDdXN0b21BYnN0cmFjdENsczI6VmFsdWUgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZScgaXMgdW5zdWJzY3JpcHRhYmxlCithYnN0cmFjdC1tZXRob2Q6MTE0OjA6Q3VzdG9tSW1wbGVtZW50YXRpb246TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU2l6ZWQnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNzU6MTk6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNzY6MTY6OlZhbHVlICdjb2xsZWN0aW9ucy5hYmMuU2l6ZWQnIGlzIHVuc3Vic2NyaXB0YWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19yZWxhdGVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19yZWxhdGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjA3NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3JlbGF0ZWQucHkKQEAgLTAsMCArMSw1NCBAQAorIiIiVGVzdCByZWxhdGVkIGZ1bmN0aW9uIGZvciBnZW5lcmljIGFsaWFzLgorCitBbnkgc29sdXRpb24gc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCistIGBfX2dldGl0ZW1fX2AKKy0gYF9fY2xhc3NfZ2V0aXRlbV9fYAorLSBgbWV0YWNsYXNzPUFCQ01ldGFgCisiIiIKKyMgZmxha2U4OiBub3FhCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50LGV4cHJlc3Npb24tbm90LWFzc2lnbmVkCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG11bHRpcGxlLXN0YXRlbWVudHMsbGluZS10b28tbG9uZworZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEsIGFic3RyYWN0bWV0aG9kCitpbXBvcnQgdHlwaW5nCisKKworY2xhc3MgQ2xzVW5zdWJzY3JpcHRhYmxlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBDbHNHZXRJdGVtOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YXIgPSBbMSwgMiwgMywgNF0KKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXRlbSk6CisgICAgICAgIHJldHVybiBzZWxmLnZhcltpdGVtXQorCitjbGFzcyBDbHNDbGFzc0dldEl0ZW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgX19jbGFzc19nZXRpdGVtX18gPSBsYW1iZGEgY2xzLCB4OiBOb25lCisKK2NsYXNzIENsc0xpc3QodHlwaW5nLkxpc3QpOgorICAgIHBhc3MKKworCitDbHNVbnN1YnNjcmlwdGFibGUoKVsxXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK0Nsc1Vuc3Vic2NyaXB0YWJsZVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitDbHNHZXRJdGVtKClbMV0KK0Nsc0dldEl0ZW1baW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworQ2xzQ2xhc3NHZXRJdGVtKClbMV0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitDbHNDbGFzc0dldEl0ZW1baW50XQorCisjIHN1YnNjcmlwdGFibGUgYmVjYXVzZSBvZiBpbmhlcml0YW5jZQorQ2xzTGlzdChbMCwgMSwgMl0pWzFdCitDbHNMaXN0W2ludF0KKworCitjbGFzcyBDbHNBYnN0cmFjdChtZXRhY2xhc3M9QUJDTWV0YSk6CisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIGFic3RyYWN0X21ldGhvZChzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBEZXJpdmVkKENsc0Fic3RyYWN0KTogICMgW2Fic3RyYWN0LW1ldGhvZF0KKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3JlbGF0ZWQucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3JlbGF0ZWQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcmVsYXRlZC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcmVsYXRlZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3JlbGF0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGY2NmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3JlbGF0ZWQudHh0CkBAIC0wLDAgKzEsNSBAQAordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozNDowOjpWYWx1ZSAnQ2xzVW5zdWJzY3JpcHRhYmxlKCknIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozNTowOjpWYWx1ZSAnQ2xzVW5zdWJzY3JpcHRhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Mzg6MDo6VmFsdWUgJ0Nsc0dldEl0ZW0nIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0MDowOjpWYWx1ZSAnQ2xzQ2xhc3NHZXRJdGVtKCknIGlzIHVuc3Vic2NyaXB0YWJsZQorYWJzdHJhY3QtbWV0aG9kOjUzOjA6RGVyaXZlZDpNZXRob2QgJ2Fic3RyYWN0X21ldGhvZCcgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0Nsc0Fic3RyYWN0JyBidXQgaXMgbm90IG92ZXJyaWRkZW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcmVsYXRlZF9weTM5LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19yZWxhdGVkX3B5MzkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0NDVhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcmVsYXRlZF9weTM5LnB5CkBAIC0wLDAgKzEsNTYgQEAKKyIiIlRlc3QgcmVsYXRlZCBmdW5jdGlvbiBmb3IgZ2VuZXJpYyBhbGlhcy4KKworQW55IHNvbHV0aW9uIHNob3VsZCBub3QgY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorLSBgX19nZXRpdGVtX19gCistIGBfX2NsYXNzX2dldGl0ZW1fX2AKKy0gYG1ldGFjbGFzcz1BQkNNZXRhYAorIiIiCisjIGZsYWtlODogbm9xYQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcscG9pbnRsZXNzLXN0YXRlbWVudCxleHByZXNzaW9uLW5vdC1hc3NpZ25lZAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtdWx0aXBsZS1zdGF0ZW1lbnRzLGxpbmUtdG9vLWxvbmcKK2Zyb20gYWJjIGltcG9ydCBBQkNNZXRhLCBhYnN0cmFjdG1ldGhvZAoraW1wb3J0IHR5cGluZworCitHZW5lcmljQWxpYXMgPSB0eXBlKGxpc3RbaW50XSkKKworCitjbGFzcyBDbHNVbnN1YnNjcmlwdGFibGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIENsc0dldEl0ZW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhciA9IFsxLCAyLCAzLCA0XQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFyW2l0ZW1dCisKK2NsYXNzIENsc0NsYXNzR2V0SXRlbToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKyAgICBfX2NsYXNzX2dldGl0ZW1fXyA9IGNsYXNzbWV0aG9kKEdlbmVyaWNBbGlhcykKKworY2xhc3MgQ2xzTGlzdCh0eXBpbmcuTGlzdCk6CisgICAgcGFzcworCisKK0Nsc1Vuc3Vic2NyaXB0YWJsZSgpWzFdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorQ2xzVW5zdWJzY3JpcHRhYmxlW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK0Nsc0dldEl0ZW0oKVsxXQorQ2xzR2V0SXRlbVtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitDbHNDbGFzc0dldEl0ZW0oKVsxXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK0Nsc0NsYXNzR2V0SXRlbVtpbnRdCisKKyMgc3Vic2NyaXB0YWJsZSBiZWNhdXNlIG9mIGluaGVyaXRhbmNlCitDbHNMaXN0KFswLCAxLCAyXSlbMV0KK0Nsc0xpc3RbaW50XQorCisKK2NsYXNzIENsc0Fic3RyYWN0KG1ldGFjbGFzcz1BQkNNZXRhKToKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgYWJzdHJhY3RfbWV0aG9kKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIERlcml2ZWQoQ2xzQWJzdHJhY3QpOiAgIyBbYWJzdHJhY3QtbWV0aG9kXQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcmVsYXRlZF9weTM5LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19yZWxhdGVkX3B5MzkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNzVlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfcmVsYXRlZF9weTM5LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19yZWxhdGVkX3B5MzkudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19yZWxhdGVkX3B5MzkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNTE4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3JlbGF0ZWRfcHkzOS50eHQKQEAgLTAsMCArMSw1IEBACit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM2OjA6OlZhbHVlICdDbHNVbnN1YnNjcmlwdGFibGUoKScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM3OjA6OlZhbHVlICdDbHNVbnN1YnNjcmlwdGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0MDowOjpWYWx1ZSAnQ2xzR2V0SXRlbScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjQyOjA6OlZhbHVlICdDbHNDbGFzc0dldEl0ZW0oKScgaXMgdW5zdWJzY3JpcHRhYmxlCithYnN0cmFjdC1tZXRob2Q6NTU6MDpEZXJpdmVkOk1ldGhvZCAnYWJzdHJhY3RfbWV0aG9kJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnQ2xzQWJzdHJhY3QnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19zaWRlX2VmZmVjdHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3NpZGVfZWZmZWN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIzZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19zaWRlX2VmZmVjdHMucHkKQEAgLTAsMCArMSw3OCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLGxpbmUtdG9vLWxvbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworaW1wb3J0IHR5cGluZworaW1wb3J0IGNvbGxlY3Rpb25zCitmcm9tIHR5cGluZyBpbXBvcnQgR2VuZXJpYywgVHlwZVZhcgorCisKKyMgdGVzdHMvZnVuY3Rpb25hbC9hL2Fzc2lnbmluZ19ub25fc2xvdC5weQorVFlQRSA9IFR5cGVWYXIoJ1RZUEUnKQorCitjbGFzcyBDbHMoR2VuZXJpY1tUWVBFXSk6CisgICAgIiIiIFNpbXBsZSBjbGFzcyB3aXRoIHNsb3RzICIiIgorICAgIF9fc2xvdHNfXyA9IFsndmFsdWUnXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisKKworIyB0ZXN0cy9mdW5jdGlvbmFsL2QvZGFuZ2Vyb3VzX2RlZmF1bHRfdmFsdWVfcHkzMC5weQorZGVmIGZ1bmN0aW9uNCh2YWx1ZT1zZXQoKSk6ICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiInNldCBpcyBtdXRhYmxlIGFuZCBkYW5nZXJvdXMuIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjUodmFsdWU9ZnJvemVuc2V0KCkpOgorICAgICIiImZyb3plbnNldCBpcyBpbW11dGFibGUgYW5kIHNhZmUuIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjcodmFsdWU9ZGljdCgpKTogIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIiZGljdCBpcyBtdXRhYmxlIGFuZCBkYW5nZXJvdXMuIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjgodmFsdWU9bGlzdCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiImxpc3QgaXMgbXV0YWJsZSBhbmQgZGFuZ2Vyb3VzLiIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24xNyh2YWx1ZT1jb2xsZWN0aW9ucy5kZXF1ZSgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24xOCh2YWx1ZT1jb2xsZWN0aW9ucy5DaGFpbk1hcCgpKTogICMgW2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlXQorICAgICIiIm11dGFibGUsIGRhbmdlcm91cyIiIgorICAgIHJldHVybiB2YWx1ZQorCitkZWYgZnVuY3Rpb24xOSh2YWx1ZT1jb2xsZWN0aW9ucy5Db3VudGVyKCkpOiAgIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIibXV0YWJsZSwgZGFuZ2Vyb3VzIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjIwKHZhbHVlPWNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KCkpOiAgIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIibXV0YWJsZSwgZGFuZ2Vyb3VzIiIiCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBmdW5jdGlvbjIxKHZhbHVlPWNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KCkpOiAgIyBbZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWVdCisgICAgIiIibXV0YWJsZSwgZGFuZ2Vyb3VzIiIiCisgICAgcmV0dXJuIHZhbHVlCisKKworIyB0ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdG9jb2xfY2xhc3Nlcy5weSAgKG1pbiBweTM4KQorVDIgPSB0eXBpbmcuVHlwZVZhcigiVDIiKQorCitjbGFzcyBIYXNoZXJHZW5lcmljKHR5cGluZy5Qcm90b2NvbFtUMl0pOgorICAgICIiIkEgaGFzaGluZyBhbGdvcml0aG0sIGUuZy4gOmZ1bmM6YGhhc2hsaWIuc2hhMjU2YC4iIiIKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGJsb2I6IGJ5dGVzKToKKyAgICAgICAgLi4uCisgICAgZGVmIGRpZ2VzdChzZWxmKSAtPiBieXRlczoKKyAgICAgICAgLi4uCisKKworIyB0ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzI0NDNfZHVwbGljYXRlX2Jhc2VzLnB5CitJTiA9IFR5cGVWYXIoJ0lOJywgY29udHJhdmFyaWFudD1UcnVlKQorT1VUID0gVHlwZVZhcignT1VUJywgY292YXJpYW50PVRydWUpCisKK2NsYXNzIENvbnN1bWluZ01peGluKEdlbmVyaWNbSU5dKToKKyAgICBwYXNzCisKK2NsYXNzIFByb2R1Y2luZ01peGluKEdlbmVyaWNbT1VUXSk6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1pbmdNaXhpbihHZW5lcmljW0lOLCBPVVRdLCBDb25zdW1pbmdNaXhpbltJTl0sIFByb2R1Y2luZ01peGluW09VVF0pOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfc2lkZV9lZmZlY3RzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19zaWRlX2VmZmVjdHMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmYzUwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfc2lkZV9lZmZlY3RzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19zaWRlX2VmZmVjdHMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc19zaWRlX2VmZmVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDY0YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3NpZGVfZWZmZWN0cy50eHQKQEAgLTAsMCArMSw4IEBACitkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZToxOTowOmZ1bmN0aW9uNDpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBzZXQoKSAoYnVpbHRpbnMuc2V0KSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6Mjc6MDpmdW5jdGlvbjc6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgZGljdCgpIChidWlsdGlucy5kaWN0KSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6MzE6MDpmdW5jdGlvbjg6RGFuZ2Vyb3VzIGRlZmF1bHQgdmFsdWUgbGlzdCgpIChidWlsdGlucy5saXN0KSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6MzU6MDpmdW5jdGlvbjE3OkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIGRlcXVlKCkgKGNvbGxlY3Rpb25zLmRlcXVlKSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6Mzk6MDpmdW5jdGlvbjE4OkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIENoYWluTWFwKCkgKGNvbGxlY3Rpb25zLkNoYWluTWFwKSBhcyBhcmd1bWVudAorZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWU6NDM6MDpmdW5jdGlvbjE5OkRhbmdlcm91cyBkZWZhdWx0IHZhbHVlIENvdW50ZXIoKSAoY29sbGVjdGlvbnMuQ291bnRlcikgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjQ3OjA6ZnVuY3Rpb24yMDpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBPcmRlcmVkRGljdCgpIChjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCkgYXMgYXJndW1lbnQKK2Rhbmdlcm91cy1kZWZhdWx0LXZhbHVlOjUxOjA6ZnVuY3Rpb24yMTpEYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZSBkZWZhdWx0ZGljdCgpIChjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCkgYXMgYXJndW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfdHlwaW5nLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc190eXBpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlMDVkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfdHlwaW5nLnB5CkBAIC0wLDAgKzEsMTQxIEBACisiIiJUZXN0IGdlbmVyaWMgYWxpYXMgc3VwcG9ydCBmb3IgdHlwaW5nLnB5IHR5cGVzLiIiIgorIyBmbGFrZTg6IG5vcWEKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHBvaW50bGVzcy1zdGF0ZW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbXVsdGlwbGUtc3RhdGVtZW50cyxsaW5lLXRvby1sb25nCitpbXBvcnQgYWJjCitpbXBvcnQgdHlwaW5nCisKKyMgc3BlY2lhbAordHlwaW5nLlR1cGxlW2ludCwgaW50XQordHlwaW5nLlR5cGVbaW50XQordHlwaW5nLkNhbGxhYmxlW1tpbnRdLCBzdHJdCisKKyMgYnVpbHRpbnMKK3R5cGluZy5EaWN0W2ludCwgc3RyXQordHlwaW5nLkxpc3RbaW50XQordHlwaW5nLlNldFtpbnRdCit0eXBpbmcuRnJvemVuU2V0W2ludF0KKworIyBjb2xsZWN0aW9ucwordHlwaW5nLkRlZmF1bHREaWN0W2ludCwgc3RyXQordHlwaW5nLk9yZGVyZWREaWN0W2ludCwgc3RyXQordHlwaW5nLkNoYWluTWFwW2ludCwgc3RyXQordHlwaW5nLkNvdW50ZXJbaW50XQordHlwaW5nLkRlcXVlW2ludF0KKworIyBjb2xsZWN0aW9ucy5hYmMKK3R5cGluZy5BYnN0cmFjdFNldFtpbnRdCit0eXBpbmcuQ29sbGVjdGlvbltpbnRdCit0eXBpbmcuQ29udGFpbmVyW2ludF0KK3R5cGluZy5JdGVtc1ZpZXdbaW50LCBzdHJdCit0eXBpbmcuS2V5c1ZpZXdbaW50XQordHlwaW5nLk1hcHBpbmdbaW50LCBzdHJdCit0eXBpbmcuTWFwcGluZ1ZpZXdbaW50XQordHlwaW5nLk11dGFibGVNYXBwaW5nW2ludCwgc3RyXQordHlwaW5nLk11dGFibGVTZXF1ZW5jZVtpbnRdCit0eXBpbmcuTXV0YWJsZVNldFtpbnRdCit0eXBpbmcuU2VxdWVuY2VbaW50XQordHlwaW5nLlZhbHVlc1ZpZXdbaW50XQorCit0eXBpbmcuSXRlcmFibGVbaW50XQordHlwaW5nLkl0ZXJhdG9yW2ludF0KK3R5cGluZy5HZW5lcmF0b3JbaW50LCBOb25lLCBOb25lXQordHlwaW5nLlJldmVyc2libGVbaW50XQorCit0eXBpbmcuQ29yb3V0aW5lW3R5cGluZy5MaXN0W3N0cl0sIHN0ciwgaW50XQordHlwaW5nLkFzeW5jR2VuZXJhdG9yW2ludCwgTm9uZV0KK3R5cGluZy5Bc3luY0l0ZXJhYmxlW2ludF0KK3R5cGluZy5Bc3luY0l0ZXJhdG9yW2ludF0KK3R5cGluZy5Bd2FpdGFibGVbaW50XQorCisjIGNvbnRleHRsaWIKK3R5cGluZy5Db250ZXh0TWFuYWdlcltpbnRdCit0eXBpbmcuQXN5bmNDb250ZXh0TWFuYWdlcltpbnRdCisKKyMgcmUKK3R5cGluZy5QYXR0ZXJuW3N0cl0KK3R5cGluZy5NYXRjaFtzdHJdCit0eXBpbmcucmUuUGF0dGVybltzdHJdCit0eXBpbmcucmUuTWF0Y2hbc3RyXQorCisKKyMgdW5zdWJzY3JpcHRhYmxlIHR5cGVzCit0eXBpbmcuQnl0ZVN0cmluZwordHlwaW5nLkhhc2hhYmxlCit0eXBpbmcuU2l6ZWQKK3R5cGluZy5CeXRlU3RyaW5nW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit0eXBpbmcuSGFzaGFibGVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3R5cGluZy5TaXplZFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisKKyMgTWlzc2luZyBpbXBsZW1lbnRhdGlvbiBmb3IgJ2NvbGxlY3Rpb25zLmFiYycgZGVyaXZlZCBjbGFzc2VzCitjbGFzcyBEZXJpdmVkSGFzaGFibGUodHlwaW5nLkhhc2hhYmxlKTogICMgW2Fic3RyYWN0LW1ldGhvZF0gICMgX19oYXNoX18KKyAgICBwYXNzCisKK2NsYXNzIERlcml2ZWRJdGVyYWJsZSh0eXBpbmcuSXRlcmFibGVbaW50XSk6ICAjIFthYnN0cmFjdC1tZXRob2RdICAjIF9faXRlcl9fCisgICAgcGFzcworCitjbGFzcyBEZXJpdmVkQ29sbGVjdGlvbih0eXBpbmcuQ29sbGVjdGlvbltpbnRdKTogICMgW2Fic3RyYWN0LW1ldGhvZCxhYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2NvbnRhaW5zX18sIF9faXRlcl9fLCBfX2xlbl9fCisgICAgcGFzcworCisKKyMgTm8gaW1wbGVtZW50YXRpb24gcmVxdWlyZWQgZm9yICdidWlsdGlucycgYW5kICdjb2xsZWN0aW9ucycgdHlwZXMKK2NsYXNzIERlcml2ZWRMaXN0KHR5cGluZy5MaXN0W2ludF0pOgorICAgIGRlZiBmdW5jKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2l0ZXJfXygpCisKK2NsYXNzIERlcml2ZWRTZXQodHlwaW5nLlNldFtpbnRdKToKKyAgICBkZWYgZnVuYyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRkKDIpCisKK2NsYXNzIERlcml2ZWRPcmRlcmVkRGljdCh0eXBpbmcuT3JkZXJlZERpY3RbaW50LCBzdHJdKToKKyAgICBkZWYgZnVuYyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMoKQorCitjbGFzcyBEZXJpdmVkTGlzdEl0ZXJhYmxlKHR5cGluZy5MaXN0W3R5cGluZy5JdGVyYWJsZVtpbnRdXSk6CisgICAgcGFzcworCisKKyMgTXVsdGlwbGUgZ2VuZXJpYyBiYXNlIGNsYXNzZXMKK2NsYXNzIERlcml2ZWRNdWx0aXBsZSh0eXBpbmcuU2l6ZWQsIHR5cGluZy5IYXNoYWJsZSk6ICAjIFthYnN0cmFjdC1tZXRob2QsYWJzdHJhY3QtbWV0aG9kXQorICAgIHBhc3MKKworY2xhc3MgQ3VzdG9tQWJzdHJhY3RDbHMxKGFiYy5BQkMpOgorICAgIHBhc3MKK2NsYXNzIEN1c3RvbUFic3RyYWN0Q2xzMih0eXBpbmcuU2l6ZWQsIHR5cGluZy5JdGVyYWJsZVtDdXN0b21BYnN0cmFjdENsczFdKTogICMgW2Fic3RyYWN0LW1ldGhvZCxhYnN0cmFjdC1tZXRob2RdICAjIF9faXRlcl9fLCBfX2xlbl9fCisgICAgcGFzcworY2xhc3MgQ3VzdG9tSW1wbGVtZW50YXRpb24oQ3VzdG9tQWJzdHJhY3RDbHMyKTogICMgW2Fic3RyYWN0LW1ldGhvZCxhYnN0cmFjdC1tZXRob2RdICAjIF9faXRlcl9fLCBfX2xlbl9fCisgICAgcGFzcworCisKKyMgSW5oZXJpdGFuY2Ugd2l0aG91dCBnZW5lcmljCitjbGFzcyBEZXJpdmVkTGlzdDIodHlwaW5nLkxpc3QpOgorICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZE9yZGVyZWREaWN0Mih0eXBpbmcuT3JkZXJlZERpY3QpOgorICAgIHBhc3MKKworY2xhc3MgRGVyaXZlZEl0ZXJhYmxlMih0eXBpbmcuSXRlcmFibGUpOiAgIyBbYWJzdHJhY3QtbWV0aG9kXSAgIyBfX2l0ZXJfXworICAgIHBhc3MKKworCisjIFR5cGUgYW5ub3RhdGlvbnMKK3Zhcl90dXBsZTogdHlwaW5nLlR1cGxlW2ludCwgaW50XQordmFyX2RpY3Q6IHR5cGluZy5EaWN0W2ludCwgc3RyXQordmFyX29yZGVyZWREaWN0OiB0eXBpbmcuT3JkZXJlZERpY3RbaW50LCBzdHJdCit2YXJfY29udGFpbmVyOiB0eXBpbmcuQ29udGFpbmVyW2ludF0KK3Zhcl9zZXF1ZW5jZTogdHlwaW5nLlNlcXVlbmNlW2ludF0KK3Zhcl9pdGVyYWJsZTogdHlwaW5nLkl0ZXJhYmxlW2ludF0KK3Zhcl9hd2FpdGFibGU6IHR5cGluZy5Bd2FpdGFibGVbaW50XQordmFyX2NvbnRleHRtYW5hZ2VyOiB0eXBpbmcuQ29udGV4dE1hbmFnZXJbaW50XQordmFyX3BhdHRlcm46IHR5cGluZy5QYXR0ZXJuW2ludF0KK3Zhcl9wYXR0ZXJuMjogdHlwaW5nLnJlLlBhdHRlcm5baW50XQordmFyX2J5dGVzdHJpbmc6IHR5cGluZy5CeXRlU3RyaW5nCit2YXJfaGFzaGFibGU6IHR5cGluZy5IYXNoYWJsZQordmFyX3NpemVkOiB0eXBpbmcuU2l6ZWQKKworIyBUeXBlIGFubm90YXRpb24gd2l0aCB1bnN1YnNjcmlwdGFibGUgdHlwZQordmFyX2ludDogaW50W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfYnl0ZXN0cmluZzI6IHR5cGluZy5CeXRlU3RyaW5nW2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXJfaGFzaGFibGUyOiB0eXBpbmcuSGFzaGFibGVbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcl9zaXplZDI6IHR5cGluZy5TaXplZFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc190eXBpbmcucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3R5cGluZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmVyaWNfYWxpYXMvZ2VuZXJpY19hbGlhc190eXBpbmcucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3R5cGluZy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2VuZXJpY19hbGlhcy9nZW5lcmljX2FsaWFzX3R5cGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0MmNhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5lcmljX2FsaWFzL2dlbmVyaWNfYWxpYXNfdHlwaW5nLnR4dApAQCAtMCwwICsxLDE5IEBACit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY2OjA6OlZhbHVlICd0eXBpbmcuQnl0ZVN0cmluZycgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY3OjA6OlZhbHVlICd0eXBpbmcuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo2ODowOjpWYWx1ZSAndHlwaW5nLlNpemVkJyBpcyB1bnN1YnNjcmlwdGFibGUKK2Fic3RyYWN0LW1ldGhvZDo3MjowOkRlcml2ZWRIYXNoYWJsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjc1OjA6RGVyaXZlZEl0ZXJhYmxlOk1ldGhvZCAnX19pdGVyX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdJdGVyYWJsZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6Nzg6MDpEZXJpdmVkQ29sbGVjdGlvbjpNZXRob2QgJ19fY29udGFpbnNfXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ0NvbnRhaW5lcicgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6Nzg6MDpEZXJpdmVkQ29sbGVjdGlvbjpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSXRlcmFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjc4OjA6RGVyaXZlZENvbGxlY3Rpb246TWV0aG9kICdfX2xlbl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnU2l6ZWQnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwMDowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19faGFzaF9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSGFzaGFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwMDowOkRlcml2ZWRNdWx0aXBsZTpNZXRob2QgJ19fbGVuX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdTaXplZCcgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6MTA1OjA6Q3VzdG9tQWJzdHJhY3RDbHMyOk1ldGhvZCAnX19pdGVyX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdJdGVyYWJsZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCithYnN0cmFjdC1tZXRob2Q6MTA1OjA6Q3VzdG9tQWJzdHJhY3RDbHMyOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMDc6MDpDdXN0b21JbXBsZW1lbnRhdGlvbjpNZXRob2QgJ19faXRlcl9fJyBpcyBhYnN0cmFjdCBpbiBjbGFzcyAnSXRlcmFibGUnIGJ1dCBpcyBub3Qgb3ZlcnJpZGRlbgorYWJzdHJhY3QtbWV0aG9kOjEwNzowOkN1c3RvbUltcGxlbWVudGF0aW9uOk1ldGhvZCAnX19sZW5fXycgaXMgYWJzdHJhY3QgaW4gY2xhc3MgJ1NpemVkJyBidXQgaXMgbm90IG92ZXJyaWRkZW4KK2Fic3RyYWN0LW1ldGhvZDoxMTg6MDpEZXJpdmVkSXRlcmFibGUyOk1ldGhvZCAnX19pdGVyX18nIGlzIGFic3RyYWN0IGluIGNsYXNzICdJdGVyYWJsZScgYnV0IGlzIG5vdCBvdmVycmlkZGVuCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEzODo5OjpWYWx1ZSAnaW50JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTM5OjE3OjpWYWx1ZSAndHlwaW5nLkJ5dGVTdHJpbmcnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNDA6MTU6OlZhbHVlICd0eXBpbmcuSGFzaGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNDE6MTI6OlZhbHVlICd0eXBpbmcuU2l6ZWQnIGlzIHVuc3Vic2NyaXB0YWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmV4cF9pbl9jbGFzc19zY29wZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5leHBfaW5fY2xhc3Nfc2NvcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2OTYzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5leHBfaW5fY2xhc3Nfc2NvcGUucHkKQEAgLTAsMCArMSw2IEBACisjIHB5bGludDogZGlzYWJsZT1uby1pbml0LHRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nCisjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIiQ2xhc3Mgc2NvcGUgbXVzdCBiZSBoYW5kbGVkIGNvcnJlY3RseSBpbiBnZW5leHBzIiIiCitjbGFzcyBNeUNsYXNzKG9iamVjdCk6CisgICAgdmFyMSA9IFtdCisgICAgdmFyMiA9IGxpc3QodmFsdWUqMiBmb3IgdmFsdWUgaW4gdmFyMSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5leHByX3ZhcmlhYmxlX3Njb3BlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmV4cHJfdmFyaWFibGVfc2NvcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwZDcyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5leHByX3ZhcmlhYmxlX3Njb3BlLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIidGVzdCBuYW1lIGRlZmluZWQgaW4gZ2VuZXJhdG9yIGV4cHJlc3Npb24gYXJlIG5vdCBhdmFpbGFibGUKK291dHNpZGUgdGhlIGdlbmV4cHIgc2NvcGUKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorcHJpbnQobikgICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5leHByX3ZhcmlhYmxlX3Njb3BlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nZW5leHByX3ZhcmlhYmxlX3Njb3BlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTY3ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dlbmV4cHJfdmFyaWFibGVfc2NvcGUudHh0CkBAIC0wLDAgKzEgQEAKK3VuZGVmaW5lZC12YXJpYWJsZTo1OjY6OlVuZGVmaW5lZCB2YXJpYWJsZSAnbicKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nbG9iYWxzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dsb2JhbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmM2NjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvZy9nbG9iYWxzLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyIiIldhcm5pbmdzIGFib3V0IGdsb2JhbCBzdGF0ZW1lbnRzIGFuZCB1c2FnZSBvZiBnbG9iYWwgdmFyaWFibGVzLiIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitnbG9iYWwgQ1NURSAgIyBbZ2xvYmFsLWF0LW1vZHVsZS1sZXZlbF0KK3ByaW50KENTVEUpICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKK0NPTlNUQU5UID0gMQorCitkZWYgZml4X2NvbnRhbnQodmFsdWUpOgorICAgICIiImFsbCB0aGlzIGlzIG9rLCBidXQgdHJ5IG5vdCB1c2luZyBnbG9iYWwgOykiIiIKKyAgICBnbG9iYWwgQ09OU1RBTlQgICMgW2dsb2JhbC1zdGF0ZW1lbnRdCisgICAgcHJpbnQoQ09OU1RBTlQpCisgICAgQ09OU1RBTlQgPSB2YWx1ZQorCisKK2RlZiBvdGhlcigpOgorICAgICIiImdsb2JhbCBiZWhhdmlvdXIgdGVzdCIiIgorICAgIGdsb2JhbCBIT1AgICMgW2dsb2JhbC12YXJpYWJsZS1ub3QtYXNzaWduZWRdCisgICAgcHJpbnQoSE9QKSAgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorCisKK2RlZiBkZWZpbmVfY29uc3RhbnQoKToKKyAgICAiIiJvayBidXQgc29tZXZhciBpcyBub3QgZGVmaW5lZCBhdCB0aGUgbW9kdWxlIHNjb3BlIiIiCisgICAgZ2xvYmFsIFNPTUVWQVIgICMgW2dsb2JhbC12YXJpYWJsZS11bmRlZmluZWRdCisgICAgU09NRVZBUiA9IDIKKworCisjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKK2RlZiBnbG9iYWxfd2l0aF9pbXBvcnQoKToKKyAgICAiIiJzaG91bGQgb25seSB3YXJuIGZvciBnbG9iYWwtc3RhdGVtZW50IiIiCisgICAgZ2xvYmFsIHN5cyAgIyBbZ2xvYmFsLXN0YXRlbWVudF0KKyAgICBpbXBvcnQgc3lzICAjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtb3V0c2lkZS10b3BsZXZlbApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9nL2dsb2JhbHMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9nL2dsb2JhbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWZlYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2cvZ2xvYmFscy50eHQKQEAgLTAsMCArMSw3IEBACitnbG9iYWwtYXQtbW9kdWxlLWxldmVsOjQ6MDo6VXNpbmcgdGhlIGdsb2JhbCBzdGF0ZW1lbnQgYXQgdGhlIG1vZHVsZSBsZXZlbAordW5kZWZpbmVkLXZhcmlhYmxlOjU6Njo6VW5kZWZpbmVkIHZhcmlhYmxlICdDU1RFJworZ2xvYmFsLXN0YXRlbWVudDoxMTo0OmZpeF9jb250YW50OlVzaW5nIHRoZSBnbG9iYWwgc3RhdGVtZW50CitnbG9iYWwtdmFyaWFibGUtbm90LWFzc2lnbmVkOjE4OjQ6b3RoZXI6VXNpbmcgZ2xvYmFsIGZvciAnSE9QJyBidXQgbm8gYXNzaWdubWVudCBpcyBkb25lCit1bmRlZmluZWQtdmFyaWFibGU6MTk6MTA6b3RoZXI6VW5kZWZpbmVkIHZhcmlhYmxlICdIT1AnCitnbG9iYWwtdmFyaWFibGUtdW5kZWZpbmVkOjI0OjQ6ZGVmaW5lX2NvbnN0YW50Okdsb2JhbCB2YXJpYWJsZSAnU09NRVZBUicgdW5kZWZpbmVkIGF0IHRoZSBtb2R1bGUgbGV2ZWwKK2dsb2JhbC1zdGF0ZW1lbnQ6MzE6NDpnbG9iYWxfd2l0aF9pbXBvcnQ6VXNpbmcgdGhlIGdsb2JhbCBzdGF0ZW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2ZhNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdC5weQpAQCAtMCwwICsxLDMxIEBACisjcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZworCisjIEJhc2ljIHRlc3Qgd2l0aCBhIGxpc3QKK1RFU1RfTElTVDEgPSBbJ2EnICdiJ10gICMgW2ltcGxpY2l0LXN0ci1jb25jYXRdCisjIFRlc3Rpbmcgd2l0aCB1bmljb2RlIHN0cmluZ3MgaW4gYSB0dXBsZSwgd2l0aCBhIGNvbW1hIEFGVEVSIGNvbmNhdGVuYXRpb24KK1RFU1RfTElTVDIgPSAodSJhIiB1ImIiLCB1ImMiKSAgIyBbaW1wbGljaXQtc3RyLWNvbmNhdF0KKyMgVGVzdGluZyB3aXRoIHJhdyBzdHJpbmdzIGluIGEgc2V0LCB3aXRoIGEgY29tbWEgQkVGT1JFIGNvbmNhdGVuYXRpb24KK1RFU1RfTElTVDMgPSB7cicnJ2EnJycsIHInJydiJycnIHInJydjJycnfSAgIyBbaW1wbGljaXQtc3RyLWNvbmNhdF0KKyMgVGVzdGluZyB0aGF0IG9ubHkgT05FIHdhcm5pbmcgaXMgZ2VuZXJhdGVkIHdoZW4gc3RyaW5nIGNvbmNhdGVuYXRpb24gaGFwcGVucworIyBpbiB0aGUgbWlkZGxlIG9mIGEgbGlzdAorVEVTVF9MSVNUNCA9IFsiIiJhIiIiLCAiIiJiIiIiICIiImMiIiIsICIiImQiIiJdICAjIFtpbXBsaWNpdC1zdHItY29uY2F0XQorCisjIFRoZSBmb2xsb3dpbmcgc2hvdWxkbid0IHJhaXNlIGEgd2FybmluZyBiZWNhdXNlIGl0IGlzIGEgZnVuY3Rpb24gY2FsbAorcHJpbnQoJ2EnLCAnYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmInICdjY2MnKQorCisjIFRoZSBmb2xsb3dpbmcgc2hvdWxkbid0IHJhaXNlIGEgd2FybmluZyBiZWNhdXNlIHN0cmluZyBsaXRlcmFscyBhcmUKKyMgb24gZGlmZmVyZW50IGxpbmVzCitURVNUX0xJU1Q1ID0gKCdhJywgJ2InCisgICAgICAgICAgICAgICdjJykKKworIyBUaGUgZm9sbG93aW5nIHNob3VsZG4ndCByYWlzZSBhIHdhcm5pbmcgYmVjYXVzZSBvZiB0aGUgZXNjYXBlZCBuZXdsaW5lCitURVNUX0xJU1Q2ID0gKCdiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiBcCisgICAgICAgICAgICAgIGNjYycpCisKKyMgQnV0IHdlIHNob3VsZCBlbWl0IHdoZW4gdGhlcmUgaXMgYW4gYWN0dWFsIGp1eHRhcG9zaXRpb24KKyMgKzE6IFtpbXBsaWNpdC1zdHItY29uY2F0XQorVEVTVF9MSVNUNyA9ICgnYScgJ2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIFwKKyAgICAgICAgICAgICAgY2NjJykKKworIyBObyB3YXJuaW5nIGZvciBieXRlcworVEVTVF9MSVNUOCA9IFtiJ0EnIGInQiddCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjZWNkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0LnR4dApAQCAtMCwwICsxLDUgQEAKK2ltcGxpY2l0LXN0ci1jb25jYXQ6NDowOjpJbXBsaWNpdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3VuZCBpbiBsaXN0CitpbXBsaWNpdC1zdHItY29uY2F0OjY6MDo6SW1wbGljaXQgc3RyaW5nIGNvbmNhdGVuYXRpb24gZm91bmQgaW4gdHVwbGUKK2ltcGxpY2l0LXN0ci1jb25jYXQ6ODowOjpJbXBsaWNpdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3VuZCBpbiBzZXQKK2ltcGxpY2l0LXN0ci1jb25jYXQ6MTE6MDo6SW1wbGljaXQgc3RyaW5nIGNvbmNhdGVuYXRpb24gZm91bmQgaW4gbGlzdAoraW1wbGljaXQtc3RyLWNvbmNhdDoyNzowOjpJbXBsaWNpdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3VuZCBpbiBhc3NpZ25tZW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9sYXRpbjEucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9sYXRpbjEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4YzNlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0X2xhdGluMS5weQpAQCAtMCwwICsxLDQgQEAKKyMgY29kaW5nOiBsYXRpbl8xCisjcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZworCitUT1RPID0gKCdDYWbpJywgJ0NhZuknLCAnQ2Fm6ScpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9tdWx0aWxpbmUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9tdWx0aWxpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM3YWM4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0X211bHRpbGluZS5weQpAQCAtMCwwICsxLDQgQEAKKyNweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworVEVTVF9UVVBMRSA9ICgnYScsICdiJyAgIyBbaW1wbGljaXQtc3RyLWNvbmNhdF0KKyAgICAgICAgICAgICAgJ2MnKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcGxpY2l0L2ltcGxpY2l0X3N0cl9jb25jYXRfbXVsdGlsaW5lLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcGxpY2l0L2ltcGxpY2l0X3N0cl9jb25jYXRfbXVsdGlsaW5lLnJjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1YjM0NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9tdWx0aWxpbmUucmMKQEAgLTAsMCArMSwyIEBACitbU1RSSU5HX0NPTlNUQU5UXQ0KK2NoZWNrLXN0ci1jb25jYXQtb3Zlci1saW5lLWp1bXBzPXllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0X211bHRpbGluZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9tdWx0aWxpbmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTYyNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wbGljaXQvaW1wbGljaXRfc3RyX2NvbmNhdF9tdWx0aWxpbmUudHh0CkBAIC0wLDAgKzEgQEAKK2ltcGxpY2l0LXN0ci1jb25jYXQ6MzowOjpJbXBsaWNpdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3VuZCBpbiB0dXBsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcGxpY2l0L2ltcGxpY2l0X3N0cl9jb25jYXRfdXRmOC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0X3V0ZjgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkNjYxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBsaWNpdC9pbXBsaWNpdF9zdHJfY29uY2F0X3V0ZjgucHkKQEAgLTAsMCArMSwzIEBACisjcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZworCitUT1RPID0gKCdDYWbDqScsICdDYWbDqScsICdDYWbDqScpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2FsaWFzaW5nLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9hbGlhc2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU1MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9hbGlhc2luZy5weQpAQCAtMCwwICsxLDI1IEBACisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LCBtaXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCByZWltcG9ydGVkLCBpbXBvcnQtZXJyb3IsIHdyb25nLWltcG9ydC1vcmRlciwgbm8tbmFtZS1pbi1tb2R1bGUsIHJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwKKyMgRnVuY3Rpb25hbCB0ZXN0cyBmb3IgaW1wb3J0IGFsaWFzaW5nCisjIDEuIHVzZWxlc3MtaW1wb3J0LWFsaWFzCisjIDIuIGNvbnNpZGVyLXVzaW5nLWZyb20taW1wb3J0CisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIE9yZGVyZWREaWN0ICMgW3VzZWxlc3MtaW1wb3J0LWFsaWFzXQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgb19kaWN0CitpbXBvcnQgb3MucGF0aCBhcyBwYXRoICAjIFtjb25zaWRlci11c2luZy1mcm9tLWltcG9ydF0KK2ltcG9ydCBvcy5wYXRoIGFzIHAKK2ltcG9ydCBmb28uYmFyLmZvb2JhciBhcyBmb29iYXIgICMgW2NvbnNpZGVyLXVzaW5nLWZyb20taW1wb3J0XQoraW1wb3J0IG9zCitpbXBvcnQgb3MgYXMgT1MKK2Zyb20gc3lzIGltcG9ydCB2ZXJzaW9uCitmcm9tIC4gaW1wb3J0IGJhciBhcyBiYXIgIyBbdXNlbGVzcy1pbXBvcnQtYWxpYXNdCitmcm9tIC4gaW1wb3J0IGJhciBhcyBCYXIKK2Zyb20gLiBpbXBvcnQgYmFyCitmcm9tIC4uZm9vIGltcG9ydCBiYXIgYXMgYmFyICMgW3VzZWxlc3MtaW1wb3J0LWFsaWFzXQorZnJvbSAuLmZvby5iYXIgaW1wb3J0IGZvb2JhciBhcyBmb29iYXIgIyBbdXNlbGVzcy1pbXBvcnQtYWxpYXNdCitmcm9tIC4uZm9vLmJhciBpbXBvcnQgZm9vYmFyIGFzIGFub3RoZXJmb29iYXIKK2Zyb20gLiBpbXBvcnQgZm9vIGFzIGZvbywgZm9vMiBhcyBiYXIyICAjIFt1c2VsZXNzLWltcG9ydC1hbGlhc10KK2Zyb20gLiBpbXBvcnQgZm9vIGFzIGJhciwgZm9vMiBhcyBmb28yICAjIFt1c2VsZXNzLWltcG9ydC1hbGlhc10KK2Zyb20gLiBpbXBvcnQgZm9vIGFzIGJhciwgZm9vMiBhcyBiYXIyCitmcm9tIGZvby5iYXIgaW1wb3J0IGZvb2JhciBhcyBmb29iYXIgICMgW3VzZWxlc3MtaW1wb3J0LWFsaWFzXQorZnJvbSBmb28uYmFyIGltcG9ydCBmb29iYXIgYXMgZm9vCitmcm9tIC5mb28uYmFyIGltcG9ydCBmIGFzIGZvb2JhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9hbGlhc2luZy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2FsaWFzaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTVjYjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9hbGlhc2luZy50eHQKQEAgLTAsMCArMSw5IEBACit1c2VsZXNzLWltcG9ydC1hbGlhczo2OjA6OkltcG9ydCBhbGlhcyBkb2VzIG5vdCByZW5hbWUgb3JpZ2luYWwgcGFja2FnZQorY29uc2lkZXItdXNpbmctZnJvbS1pbXBvcnQ6ODowOjpVc2UgJ2Zyb20gb3MgaW1wb3J0IHBhdGgnIGluc3RlYWQKK2NvbnNpZGVyLXVzaW5nLWZyb20taW1wb3J0OjEwOjA6OlVzZSAnZnJvbSBmb28uYmFyIGltcG9ydCBmb29iYXInIGluc3RlYWQKK3VzZWxlc3MtaW1wb3J0LWFsaWFzOjE0OjA6OkltcG9ydCBhbGlhcyBkb2VzIG5vdCByZW5hbWUgb3JpZ2luYWwgcGFja2FnZQordXNlbGVzcy1pbXBvcnQtYWxpYXM6MTc6MDo6SW1wb3J0IGFsaWFzIGRvZXMgbm90IHJlbmFtZSBvcmlnaW5hbCBwYWNrYWdlCit1c2VsZXNzLWltcG9ydC1hbGlhczoxODowOjpJbXBvcnQgYWxpYXMgZG9lcyBub3QgcmVuYW1lIG9yaWdpbmFsIHBhY2thZ2UKK3VzZWxlc3MtaW1wb3J0LWFsaWFzOjIwOjA6OkltcG9ydCBhbGlhcyBkb2VzIG5vdCByZW5hbWUgb3JpZ2luYWwgcGFja2FnZQordXNlbGVzcy1pbXBvcnQtYWxpYXM6MjE6MDo6SW1wb3J0IGFsaWFzIGRvZXMgbm90IHJlbmFtZSBvcmlnaW5hbCBwYWNrYWdlCit1c2VsZXNzLWltcG9ydC1hbGlhczoyMzowOjpJbXBvcnQgYWxpYXMgZG9lcyBub3QgcmVuYW1lIG9yaWdpbmFsIHBhY2thZ2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBvcnRfZXJyb3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2Vycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjRkNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2Vycm9yLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyIiIiBUZXN0IHRoYXQgaW1wb3J0IGVycm9ycyBhcmUgZGV0ZWN0ZWQuICIiIgorIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lLCB1bnVzZWQtaW1wb3J0LCBuby1hYnNvbHV0ZS1pbXBvcnQsIGJhcmUtZXhjZXB0LCBicm9hZC1leGNlcHQsIHdyb25nLWltcG9ydC1vcmRlciwgd3JvbmctaW1wb3J0LXBvc2l0aW9uCitpbXBvcnQgdG90YWxseV9taXNzaW5nICMgW2ltcG9ydC1lcnJvcl0KKwordHJ5OgorICAgIGltcG9ydCBtYXliZV9taXNzaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbWF5YmVfbWlzc2luZyA9IE5vbmUKKwordHJ5OgorICAgIGltcG9ydCBtYXliZV9taXNzaW5nXzEKK2V4Y2VwdCAoSW1wb3J0RXJyb3IsIFN5bnRheEVycm9yKToKKyAgICBtYXliZV9taXNzaW5nXzEgPSBOb25lCisKK3RyeToKKyAgICBpbXBvcnQgbWF5YmVfbWlzc2luZ18yICMgW2ltcG9ydC1lcnJvcl0KK2V4Y2VwdCBWYWx1ZUVycm9yOgorICAgIG1heWJlX21pc3NpbmdfMiA9IE5vbmUKKworCit0cnk6CisgICAgaWYgbWF5YmVfbWlzc2luZzoKKyAgICAgICAgaW1wb3J0IHJlYWxseV9taXNzaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCisjIHB5bGludDogZGlzYWJsZT1uby1uYW1lLWluLW1vZHVsZQorZnJvbSBmdW5jdGlvbmFsLnMuc3ludGF4X2Vycm9yIGltcG9ydCB0b3RvICMgW3N5bnRheC1lcnJvcl0KKworIyBEb24ndCBlbWl0IGltcG9ydC1lcnJvciBpZiBndWFyZGVkIGJlaGluZCBgc3lzLnZlcnNpb25faW5mb2AKK2ltcG9ydCBzeXMKKworaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywgOSk6CisgICAgaW1wb3J0IHpvbmVpbmZvCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgzLCA5KToKKyAgICBpbXBvcnQgem9uZWluZm8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBvcnRfZXJyb3IucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2Vycm9yLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDFkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2Vycm9yLnJjCkBAIC0wLDAgKzEsNSBAQAorW01lc3NhZ2VzIENvbnRyb2xdCitkaXNhYmxlPUMsUixXCisKK1t0ZXN0b3B0aW9uc10KK2V4Y2VwdF9pbXBsZW1lbnRhdGlvbnM9UHlQeQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9lcnJvci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2Vycm9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTczMTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9lcnJvci50eHQKQEAgLTAsMCArMSwzIEBACitpbXBvcnQtZXJyb3I6MzowOjpVbmFibGUgdG8gaW1wb3J0ICd0b3RhbGx5X21pc3NpbmcnCitpbXBvcnQtZXJyb3I6MTY6NDo6VW5hYmxlIHRvIGltcG9ydCAnbWF5YmVfbWlzc2luZ18yJworc3ludGF4LWVycm9yOjI4OjA6OkNhbm5vdCBpbXBvcnQgJ2Z1bmN0aW9uYWwucy5zeW50YXhfZXJyb3InIGR1ZSB0byBzeW50YXggZXJyb3IgJ2ludmFsaWQgc3ludGF4ICg8dW5rbm93bj4sIGxpbmUgMSknCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2l0c2VsZi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbXBvcnRfaXRzZWxmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2Q1MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2l0c2VsZi5weQpAQCAtMCwwICsxLDEwIEBACisiIiJ0ZXN0IG1vZHVsZSBpbXBvcnRpbmcgaXRzZWxmIiIiCisjIHB5bGludDogZGlzYWJsZT1uby1hYnNvbHV0ZS1pbXBvcnQsdXNpbmctY29uc3RhbnQtdGVzdAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSAuIGltcG9ydCBpbXBvcnRfaXRzZWxmICAjIFtpbXBvcnQtc2VsZl0KKworX19yZXZpc2lvbl9fID0gMAorCisKK2lmIF9fcmV2aXNpb25fXzoKKyAgICBwcmludChpbXBvcnRfaXRzZWxmKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9pdHNlbGYudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ltcG9ydF9pdHNlbGYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDM2MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW1wb3J0X2l0c2VsZi50eHQKQEAgLTAsMCArMSBAQAoraW1wb3J0LXNlbGY6NDowOjpNb2R1bGUgaW1wb3J0IGl0c2VsZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfbXJvLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfbXJvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjUwNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9tcm8ucHkKQEAgLTAsMCArMSw5IEBACisiIiJUZXN0cyBmb3IgaW5jb25zaXN0ZW50LW1yby4iIiINCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLWluaXQNCisNCitjbGFzcyBTdHIoc3RyKToNCisgICAgcGFzcw0KKw0KKw0KK2NsYXNzIEluY29uc2lzdGVudChzdHIsIFN0cik6ICMgW2luY29uc2lzdGVudC1tcm9dDQorICAgIHBhc3MNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9tcm8udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfbXJvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDcwOGJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfbXJvLnR4dApAQCAtMCwwICsxIEBACitpbmNvbnNpc3RlbnQtbXJvOjg6MDpJbmNvbnNpc3RlbnQ6SW5jb25zaXN0ZW50IG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIGZvciBjbGFzcyAnSW5jb25zaXN0ZW50JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NTUzZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMucHkKQEAgLTAsMCArMSwxNiBAQAorIiIiVGVzdHMgZm9yIGluY29uc2lzdGVudCBxdW90aW5nIHN0cmF0ZWd5Lg0KKw0KK0luIHRoaXMgZmlsZSwgZG91YmxlIHF1b3RlcyBhcmUgdGhlIG1ham9yaXR5IHF1b3RlIGRlbGltaXRlci4NCisiIiINCisNCitGSVJTVF9TVFJJTkcgPSAiZG91YmxlLXF1b3RlZCBzdHJpbmciDQorU0VDT05EX1NUUklORyA9ICdzaW5nbGUtcXVvdGVkIHN0cmluZycgIyBbaW5jb25zaXN0ZW50LXF1b3Rlc10NCitUSElSRF9TVFJJTkcgPSAiYW5vdGhlciBkb3VibGUtcXVvdGVkIHN0cmluZyINCitGT1VSVEhfU1RSSU5HID0gInlldCBhbm90aGVyIGRvdWJsZS1xdW90ZWQgc3RyaW5nIg0KK0ZJRlRIX1NUUklORyA9ICdzaW5nbGUtcXVvdGVkIHN0cmluZyB3aXRoIGFuIHVuZXNjYXBlZCAiZG91YmxlIHF1b3RlIicNCisNCitkZWYgZnVuY3Rpb25fd2l0aF9kb2NzdHJpbmcoKToNCisgICAgJycnVGhpcyBpcyBhIG11bHRpLWxpbmUgZG9jc3RyaW5nIHRoYXQgc2hvdWxkIG5vdCByYWlzZSBhIHdhcm5pbmcgZXZlbiB0aG91Z2ggdGhlDQorICAgIGRlbGltaXRlciBpdCB1c2VzIGZvciBxdW90ZXMgaXMgbm90IHRoZSBkZWxpbWl0ZXIgdXNlZCBpbiB0aGUgbWFqb3JpdHkgb2YgdGhlDQorICAgIG1vZHVsZS4NCisgICAgJycnDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzVmZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMucmMKQEAgLTAsMCArMSwyIEBACitbU1RSSU5HXQorY2hlY2stcXVvdGUtY29uc2lzdGVuY3k9eWVzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJmZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzLnR4dApAQCAtMCwwICsxIEBACitpbmNvbnNpc3RlbnQtcXVvdGVzOjc6MDo6UXVvdGUgZGVsaW1pdGVyICcgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3F1b3RlczIucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjE1N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMyLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiIlRlc3RzIGZvciBpbmNvbnNpc3RlbnQgcXVvdGluZyBzdHJhdGVneS4NCisNCitJbiB0aGlzIGZpbGUsIHNpbmdsZSBxdW90ZXMgYXJlIHRoZSBtYWpvcml0eSBxdW90ZSBkZWxpbWl0ZXIuDQorIiIiDQorDQorRklSU1RfU1RSSU5HID0gImRvdWJsZS1xdW90ZWQgc3RyaW5nIiAgIyBbaW5jb25zaXN0ZW50LXF1b3Rlc10NCitTRUNPTkRfU1RSSU5HID0gJ3NpbmdsZS1xdW90ZWQgc3RyaW5nJw0KK1RISVJEX1NUUklORyA9ICdhbm90aGVyIHNpbmdsZS1xdW90ZWQgc3RyaW5nJw0KK0ZPVVJUSF9TVFJJTkcgPSAneWV0IGFub3RoZXIgc2luZ2xlLXF1b3RlZCBzdHJpbmcnDQorRklGVEhfU1RSSU5HID0gImRvdWJsZS1xdW90ZWQgc3RyaW5nIHdpdGggYW4gdW5lc2NhcGVkICdzaW5nbGUgcXVvdGUnIg0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3F1b3RlczIucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzVmZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMyLnJjCkBAIC0wLDAgKzEsMiBAQAorW1NUUklOR10KK2NoZWNrLXF1b3RlLWNvbnNpc3RlbmN5PXllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzMi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9xdW90ZXMyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJmNzdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcXVvdGVzMi50eHQKQEAgLTAsMCArMSBAQAoraW5jb25zaXN0ZW50LXF1b3Rlczo2OjA6OiJRdW90ZSBkZWxpbWl0ZXIgIiIgaXMgaW5jb25zaXN0ZW50IHdpdGggdGhlIHJlc3Qgb2YgdGhlIGZpbGUiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9yZXR1cm5zLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRkZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJucy5weQpAQCAtMCwwICsxLDM1NSBAQAorI3B5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgbm8tZWxzZS1yZXR1cm4sIG5vLWVsc2UtYnJlYWssIGludmFsaWQtbmFtZSwgdW51c2VkLXZhcmlhYmxlLCBzdXBlcmZsdW91cy1wYXJlbnMsIHRyeS1leGNlcHQtcmFpc2UKKyNweWxpbnQ6IGRpc2FibGU9ZGlzYWxsb3dlZC1uYW1lCisiIiJUZXN0aW5nIGluY29uc2lzdGVudCByZXR1cm5zIiIiCitpbXBvcnQgbWF0aAoraW1wb3J0IHN5cworCisjIFRoZXNlIG9uZXMgYXJlIGNvbnNpc3RlbnQKK2RlZiBleHBsaWNpdF9yZXR1cm5zKHZhcik6CisgICAgaWYgdmFyID49IDA6CisgICAgICAgIHJldHVybiBtYXRoLnNxcnQodmFyKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKK2RlZiBleHBsaWNpdF9yZXR1cm5zMih2YXIpOgorICAgIGlmIHZhciA8IDA6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIG1hdGguc3FydCh2YXIpCisKK2RlZiBlbXB0eV9pbXBsaWNpdF9yZXR1cm5zKHZhcik6CisgICAgaWYgdmFyIDwgMDoKKyAgICAgICAgcmV0dXJuCisKK2RlZiByZXR1cm5zX2luX2V4Y2VwdGlvbnMoKToKKyAgICB0cnk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rlc3QnKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByZXR1cm4gMQorICAgIGV4Y2VwdCAoT1NFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgcmV0dXJuIDIKKworZGVmIHJldHVybnNfYW5kX2V4Y2VwdGlvbnModmFyKToKKyAgICBpZiB2YXIgPCAxMDoKKyAgICAgICAgcmV0dXJuIHZhcioqMgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkluY29ycmVjdCB2YWx1ZSIpCisKK2RlZiByZXR1cm5zX2FuZF9leGNlcHRpb25zX2lzc3VlMTc3MCh2YXIpOgorICAgIHRyeToKKyAgICAgICAgaWYgdmFyID09IDE6CisgICAgICAgICAgICByZXR1cm4gJ2EnCisgICAgICAgIGVsaWYgdmFyID09IDI6CisgICAgICAgICAgICByZXR1cm4gJ2InCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgZXhwbGljaXRfcmV0dXJuczMoYXJnKToKKyAgICBpZiBhcmc6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIGlmIGFyZyA8IDM6CisgICAgICAgICAgICBwcmludCgnYXJnIDwgMycpCisgICAgICAgIHJldHVybiBUcnVlCisKK2RlZiBleHBsaWNpdF9yZXR1cm5zNChhcmcpOgorICAgIGlmIGFyZzoKKyAgICAgICAgaWYgYXJnID4gMjoKKyAgICAgICAgICAgIHByaW50KCdhcmcgPiAyJykKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZWxzZToKKyAgICAgICAgaWYgYXJnIDwgMzoKKyAgICAgICAgICAgIHByaW50KCdhcmcgPCAzJykKKyAgICAgICAgcmV0dXJuIFRydWUKKworZGVmIGV4cGxpY2l0X3JldHVybnM1KGFyZyk6CisgICAgaWYgYXJnOgorICAgICAgICBpZiBhcmcgPiAyOgorICAgICAgICAgICAgcHJpbnQoJ2FyZyA+IDInKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gVHJ1ZQorCitkZWYgbmVzdGVkX2Z1bmN0aW9uKCk6CisgICAgZGVmIGR1bW15X3JldHVybigpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBkdW1teV9yZXR1cm4KKworZGVmIGV4cGxpY2l0X3JldHVybnM2KHgsIHksIHopOgorICAgIGlmIHg6ICAjIHB5bGludDogZGlzYWJsZT1uby1lbHNlLXJldHVybgorICAgICAgICBhID0gMQorICAgICAgICBpZiB5OiAgIyBweWxpbnQ6IGRpc2FibGU9bm8tZWxzZS1yZXR1cm4KKyAgICAgICAgICAgIGIgPSAyCisgICAgICAgICAgICByZXR1cm4geQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgZWxzZToKKyAgICAgICAgZCA9IDQKKyAgICAgICAgcmV0dXJuIHoKKworZGVmIGV4cGxpY2l0X3JldHVybnM3KGFyZyk6CisgICAgaWYgYXJnIDwgMDoKKyAgICAgICAgYXJnID0gMiAqIGFyZworICAgICAgICByZXR1cm4gJ2JlbG93IDAnCisgICAgZWxpZiBhcmcgPT0gMDoKKyAgICAgICAgcHJpbnQoIk51bGwgYXJnIikKKyAgICAgICAgcmV0dXJuICcwJworICAgIGVsc2U6CisgICAgICAgIGFyZyA9IDMgKiBhcmcKKyAgICAgICAgcmV0dXJuICdhYm92ZSAwJworCitkZWYgYnVnXzE3NzIoKToKKyAgICAiIiJEb24ndCBjaGVjayBpbmNvbnNpc3RlbnQgcmV0dXJuIHN0YXRlbWVudHMgaW5zaWRlIHdoaWxlIGxvb3AiIiIKKyAgICBjb3VudGVyID0gMQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGNvdW50ZXIgKz0gMQorICAgICAgICBpZiBjb3VudGVyID09IDEwMDoKKyAgICAgICAgICAgIHJldHVybiA3CisKK2RlZiBidWdfMTc3MSh2YXIpOgorICAgIGlmIHZhciA9PSAxOgorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB2YXIgKiAyCisKK2RlZiBidWdfMTc3MV93aXRoX3VzZXJfY29uZmlnKHZhcik6CisgICAgIyBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nIGlzIGNvbnNpZGVyZWQgYXMgYSBuZXZlcgorICAgICMgcmV0dXJuaW5nIGZ1bmN0aW9uIGluIHRoZSBpbmNvbnNpc3RlbnRfcmV0dXJucy5yYyBmaWxlLgorICAgIGlmIHZhciA9PSAxOgorICAgICAgICBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gdmFyICogMgorCitkZWYgYnVnXzE3OTRfaW5uZXJfZnVuY19pbl9pZih2YXIpOgorICAgICMgcHlsaW50OiBkaXNhYmxlID0gbm8tZWxzZS1yZXR1cm4sdXNlbGVzcy1yZXR1cm4KKyAgICBpZiB2YXI6CisgICAgICAgIGRlZiBfaW5uZXIoKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKwordHJ5OgorICAgIGltcG9ydCBDb25maWdQYXJzZXIgYXMgY29uZmlncGFyc2VyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGNvbmZpZ3BhcnNlcgorCisjIER1ZSB0byB0aGUgdHJ5L2V4Y2VwdCBpbXBvcnQgYWJvdmUsIGFzdHJvaWQgY2Fubm90IHNhZmVseQorIyBpbmZlciB0aGUgZXhjZXB0aW9uIHR5cGUuIEl0IGRvZXNuJ3QgbWF0dGVyIGhlcmUsIGJlY2F1c2UKKyMgYXMgdGhlIHJhaXNlIHN0YXRlbWVudCBpcyBub3QgaW5zaWRlIGEgdHJ5L2V4Y2VwdCBvbmUsIHRoZXJlCisjIGlzIG5vIG5lZWQgdG8gaW5mZXIgdGhlIGV4Y2VwdGlvbiB0eXBlLiBJdCBpcyBqdXN0IGFuIGV4Y2VwdGlvbgorIyB0aGF0IGlzIHJhaXNlZC4KK2RlZiBidWdfMTc5NChhKToKKyAgICBmb3IgeCBpbiByYW5nZShhKToKKyAgICAgICAgaWYgeCA9PSAxMDA6CisgICAgICAgICAgICByZXR1cm4gYQorICAgIHJhaXNlIGNvbmZpZ3BhcnNlci5Ob1NlY3Rpb25FcnJvcigndG90bycpCisKKyNweWxpbnQ6IGRpc2FibGUgPSBuby1lbHNlLXJldHVybgorZGVmIGJ1Z18xNzgyX2Jpcyh2YWw9Myk6CisgICAgaWYgdmFsID09IDM6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCisKKyMgTmV4dCBvbmVzIGFyZSBub3QgY29uc2lzdGVudAorZGVmIGV4cGxpY2l0X2ltcGxpY2l0X3JldHVybnModmFyKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgIGlmIHZhciA+PSAwOgorICAgICAgICByZXR1cm4gbWF0aC5zcXJ0KHZhcikKKworZGVmIGVtcHR5X2V4cGxpY2l0X3JldHVybnModmFyKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgIGlmIHZhciA8IDA6CisgICAgICAgIHJldHVybgorICAgIHJldHVybiBtYXRoLnNxcnQodmFyKQorCitkZWYgZXhwbGljaXRfaW1wbGljaXRfcmV0dXJuczIoYXJnKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgIGlmIGFyZzoKKyAgICAgICAgaWYgYXJnID4gMjoKKyAgICAgICAgICAgIHByaW50KCdhcmcgPiAyJykKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBUcnVlCisKK2RlZiBleHBsaWNpdF9pbXBsaWNpdF9yZXR1cm5zMyhhcmcpOiAjIFtpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNdCisgICAgaWYgYXJnOgorICAgICAgICBpZiBhcmcgPiAyOgorICAgICAgICAgICAgcHJpbnQoJ2FyZyA+IDInKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCitkZWYgcmV0dXJuc19taXNzaW5nX2luX2NhdGNoZWRfZXhjZXB0aW9ucyhhcmcpOiAjIFtpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNdCisgICAgdHJ5OgorICAgICAgICBhcmcgPSBhcmcqKjIKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGVzdCcpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHByaW50KCdWYWx1ZUVycm9yJykKKyAgICAgICAgYXJnID0gMAorICAgIGV4Y2VwdCAoT1NFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgcmV0dXJuIDIKKworZGVmIGNvbXBsZXhfZnVuYyhhcmcpOiAjIFtpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNdCisgICAgZm9yIGkgaW4gcmFuZ2UoYXJnKToKKyAgICAgICAgaWYgaSA+IGFyZyAvIDI6CisgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGFyZworCitkZWYgaW5jb25zaXN0ZW50X3JldHVybnNfaW5fbmVzdGVkX2Z1bmN0aW9uKCk6CisgICAgZGVmIG5vdF9jb25zaXN0ZW50X3JldHVybnNfaW5uZXIoYXJnKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgICAgICBmb3IgaSBpbiByYW5nZShhcmcpOgorICAgICAgICAgICAgaWYgaSA+IGFyZyAvIDI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFyZworICAgIHJldHVybiBub3RfY29uc2lzdGVudF9yZXR1cm5zX2lubmVyCisKK2RlZiBidWdfMTc3MV9jb3VudGVyX2V4YW1wbGUodmFyKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgIGlmIHZhciA9PSAxOgorICAgICAgICBpbmNvbnNpc3RlbnRfcmV0dXJuc19pbl9uZXN0ZWRfZnVuY3Rpb24oKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB2YXIgKiAyCisKK2NsYXNzIEJsYXJnRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2RlZiBibGFyZyhzb21ldmFsKToKKyAgICB0cnk6CisgICAgICAgIGlmIHNvbWV2YWw6CisgICAgICAgICAgICByYWlzZSBCbGFyZ0V4Y2VwdGlvbigpCisgICAgICAgIHJldHVybiA1CisgICAgZXhjZXB0IEJsYXJnRXhjZXB0aW9uOgorICAgICAgICByYWlzZQorCitkZWYgYnVnXzE3NzJfY291bnRlcl9leGFtcGxlKCk6ICMgW2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c10KKyAgICBjb3VudGVyID0gMQorICAgIGlmIGNvdW50ZXIgPT0gMToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNvdW50ZXIgKz0gMQorICAgICAgICAgICAgaWYgY291bnRlciA9PSAxMDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIDcKKworZGVmIGJ1Z18xNzk0X2lubmVyX2Z1bmNfaW5faWZfY291bnRlcl9leGFtcGxlXzEodmFyKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgICMgcHlsaW50OiBkaXNhYmxlID0gbm8tZWxzZS1yZXR1cm4sdXNlbGVzcy1yZXR1cm4KKyAgICBpZiB2YXI6CisgICAgICAgIGRlZiBfaW5uZXIoKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisKK2RlZiBidWdfMTc5NF9pbm5lcl9mdW5jX2luX2lmX2NvdW50ZXJfZXhhbXBsZV8yKHZhcik6ICMgW2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c10KKyAgICAjIHB5bGludDogZGlzYWJsZSA9IG5vLWVsc2UtcmV0dXJuLHVzZWxlc3MtcmV0dXJuCisgICAgaWYgdmFyOgorICAgICAgICBkZWYgX2lubmVyKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4KKworZGVmIGJ1Z18xNzk0X2lubmVyX2Z1bmNfaW5faWZfY291bnRlcl9leGFtcGxlXzModmFyKTogIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgICMgcHlsaW50OiBkaXNhYmxlID0gbm8tZWxzZS1yZXR1cm4sdXNlbGVzcy1yZXR1cm4KKyAgICBpZiB2YXI6CisgICAgICAgIGRlZiBfaW5uZXIoKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgZGVmIF9pbm5lcjIodmFyX2Jpcyk6ICMgW2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c10KKyAgICAgICAgICAgIGlmIHZhcl9iaXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybgorCitkZWYgYnVnXzM0NjgoYmFyKTogICMgW2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c10KKyAgICAiIiIKKyAgICBJbiBjYXNlIG9mIEF0dHJpYnV0ZUVycm9yIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltcGxpY2l0bHkgTm9uZS4KKyAgICBUaGVyZSBhcmUgb25lIGV4cGxpY2l0IHJldHVybiBhbmQgb25lIGltcGxpY2l0LgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGJhci5iYXoKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKworZGVmIGJ1Z18zNDY4X3ZhcmlhbnQoYmFyKTogICMgW2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c10KKyAgICAiIiIKKyAgICBJbiBjYXNlIG9mIEF0dHJpYnV0ZUVycm9yIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltcGxpY2l0bHkgTm9uZQorICAgIFRoZXJlIGFyZSBvbmUgZXhwbGljaXQgcmV0dXJuIGFuZCBvbmUgaW1wbGljaXQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gYmFyLmJhegorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcmFpc2UKKworZGVmIGJ1Z18zNDY4X2NvdW50ZXJfZXhhbXBsZShiYXIpOgorICAgICIiIgorICAgIEluIGNhc2Ugb2YgQXR0cmlidXRlRXJyb3IgdGhlIGZ1bmN0aW9uIHJldHVybnMgZXhwbGljaXRseSBOb25lLgorICAgIFRodXMgYWxsIHJldHVybnMgYXJlIGV4cGxpY2l0LgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGJhci5iYXoKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gTm9uZQorCitkZWYgYnVnXzM0NjhfY291bnRlcl9leGFtcGxlXzIoYmFyKToKKyAgICAiIiIKKyAgICBJbiBjYXNlIG9mIEF0dHJpYnV0ZUVycm9yIHRoZSBmdW5jdGlvbiByZXR1cm5zIGV4cGxpY2l0bHkgTm9uZS4KKyAgICBUaHVzIGFsbCByZXR1cm5zIGFyZSBleHBsaWNpdC4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBiYXIuYmF6CisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgbm90aGluZ190b19kbygpOgorICAgIHBhc3MKKworZGVmIGJ1Z19weWxpbnRfMzg3MygpOgorICAgIHRyeToKKyAgICAgICAgbm90aGluZ190b19kbygpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgYnVnX3B5bGludF8zODczXzEoKTogICMgW2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50c10KKyAgICB0cnk6CisgICAgICAgIG5vdGhpbmdfdG9fZG8oKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICBwYXNzCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgYnVnX3B5bGludF8zODczXzIoKToKKyAgICB0cnk6CisgICAgICAgIG5vdGhpbmdfdG9fZG8oKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICBub3RoaW5nX3RvX2RvKCkKKyAgICByZXR1cm4gRmFsc2UKKworIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80MDE5CitkZWYgYnVnX3B5bGludF80MDE5KHgpOgorICAgICIiIgorICAgIGFzc2VydCBGYWxzZSBpcyBlcXVpdmFsZW50IHRvIGEgcmV0dXJuCisgICAgIiIiCisgICAgaWYgeCA9PSAxOgorICAgICAgICByZXR1cm4gNDIKKyAgICBhc3NlcnQgRmFsc2UKKworCitkZWYgYnVnX3B5bGludF80MDE5X3dyb25nKHgpOiAgIyBbaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzXQorICAgICIiIgorICAgIGFzc2VydCBUcnVlIGlzIG5vdCBlcXVpdmFsZW50IHRvIGEgcmV0dXJuCisgICAgIiIiCisgICAgaWYgeCA9PSAxOgorICAgICAgICByZXR1cm4gNDIKKyAgICBhc3NlcnQgVHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJucy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2Y2JiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnMucmMKQEAgLTAsMCArMSwyIEBACitbUkVGQUNUT1JJTkddCituZXZlci1yZXR1cm5pbmctZnVuY3Rpb25zPXN5cy5leGl0LHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhNmRkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnMudHh0CkBAIC0wLDAgKzEsMTcgQEAKK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoxNjA6MDpleHBsaWNpdF9pbXBsaWNpdF9yZXR1cm5zOkVpdGhlciBhbGwgcmV0dXJuIHN0YXRlbWVudHMgaW4gYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGV4cHJlc3Npb24sIG9yIG5vbmUgb2YgdGhlbSBzaG91bGQuCitpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHM6MTY0OjA6ZW1wdHlfZXhwbGljaXRfcmV0dXJuczpFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCBvciBub25lIG9mIHRoZW0gc2hvdWxkLgoraW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzOjE2OTowOmV4cGxpY2l0X2ltcGxpY2l0X3JldHVybnMyOkVpdGhlciBhbGwgcmV0dXJuIHN0YXRlbWVudHMgaW4gYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGV4cHJlc3Npb24sIG9yIG5vbmUgb2YgdGhlbSBzaG91bGQuCitpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHM6MTc3OjA6ZXhwbGljaXRfaW1wbGljaXRfcmV0dXJuczM6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoxODU6MDpyZXR1cm5zX21pc3NpbmdfaW5fY2F0Y2hlZF9leGNlcHRpb25zOkVpdGhlciBhbGwgcmV0dXJuIHN0YXRlbWVudHMgaW4gYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGV4cHJlc3Npb24sIG9yIG5vbmUgb2YgdGhlbSBzaG91bGQuCitpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHM6MTk1OjA6Y29tcGxleF9mdW5jOkVpdGhlciBhbGwgcmV0dXJuIHN0YXRlbWVudHMgaW4gYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGV4cHJlc3Npb24sIG9yIG5vbmUgb2YgdGhlbSBzaG91bGQuCitpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHM6MjAzOjQ6aW5jb25zaXN0ZW50X3JldHVybnNfaW5fbmVzdGVkX2Z1bmN0aW9uLm5vdF9jb25zaXN0ZW50X3JldHVybnNfaW5uZXI6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoyMTE6MDpidWdfMTc3MV9jb3VudGVyX2V4YW1wbGU6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoyMjk6MDpidWdfMTc3Ml9jb3VudGVyX2V4YW1wbGU6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoyMzc6MDpidWdfMTc5NF9pbm5lcl9mdW5jX2luX2lmX2NvdW50ZXJfZXhhbXBsZV8xOkVpdGhlciBhbGwgcmV0dXJuIHN0YXRlbWVudHMgaW4gYSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGFuIGV4cHJlc3Npb24sIG9yIG5vbmUgb2YgdGhlbSBzaG91bGQuCitpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHM6MjQ2OjA6YnVnXzE3OTRfaW5uZXJfZnVuY19pbl9pZl9jb3VudGVyX2V4YW1wbGVfMjpFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCBvciBub25lIG9mIHRoZW0gc2hvdWxkLgoraW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzOjI1NTowOmJ1Z18xNzk0X2lubmVyX2Z1bmNfaW5faWZfY291bnRlcl9leGFtcGxlXzM6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoyNjI6ODpidWdfMTc5NF9pbm5lcl9mdW5jX2luX2lmX2NvdW50ZXJfZXhhbXBsZV8zLl9pbm5lcjI6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czoyNjc6MDpidWdfMzQ2ODpFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCBvciBub25lIG9mIHRoZW0gc2hvdWxkLgoraW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzOjI3NzowOmJ1Z18zNDY4X3ZhcmlhbnQ6RWl0aGVyIGFsbCByZXR1cm4gc3RhdGVtZW50cyBpbiBhIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXhwcmVzc2lvbiwgb3Igbm9uZSBvZiB0aGVtIHNob3VsZC4KK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czozMjI6MDpidWdfcHlsaW50XzM4NzNfMTpFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCBvciBub25lIG9mIHRoZW0gc2hvdWxkLgoraW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzOjM0OTowOmJ1Z19weWxpbnRfNDAxOV93cm9uZzpFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCBvciBub25lIG9mIHRoZW0gc2hvdWxkLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJuc19ub3JldHVybi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnNfbm9yZXR1cm4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4ZDZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnNfbm9yZXR1cm4ucHkKQEAgLTAsMCArMSw1NSBAQAorIiIiVGVzdGluZyBpbmNvbnNpc3RlbnQgcmV0dXJucyBpbnZvbHZpbmcgdHlwaW5nLk5vUmV0dXJuIGFubm90YXRpb25zLiIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZQorCitpbXBvcnQgc3lzCitpbXBvcnQgdHlwaW5nCisKK2RlZiBwYXJzZXJfZXJyb3IobXNnKSAtPiB0eXBpbmcuTm9SZXR1cm46ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICBzeXMuZXhpdCgxKQorCitkZWYgcGFyc2VyX2Vycm9yX25vcnR5cGUobXNnKTogICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgIHN5cy5leGl0KDIpCisKKworZnJvbSB0eXBpbmcgaW1wb3J0IE5vUmV0dXJuICAjIHB5bGludDogZGlzYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KKworZGVmIHBhcnNlcl9lcnJvcl9uYW1lKG1zZykgLT4gTm9SZXR1cm46ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICBzeXMuZXhpdCgzKQorCitkZWYgYnVnX3B5bGludF80MTIyKHMpOgorICAgICIiIgorICAgIEV2ZXJ5IHJldHVybnMgaXMgY29uc2lzdGVudCBiZWNhdXNlIHBhcnNlcl9lcnJvciBoYXMgdHlwZSBoaW50cworICAgIGluZGljYXRpbmcgaXQgbmV2ZXIgcmV0dXJucworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgbiA9IGludChzKQorICAgICAgICBpZiBuIDwgMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQorICAgICAgICByZXR1cm4gbgorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwYXJzZXJfZXJyb3IoJ3BhcnNlciBlcnJvcicpCisKK2RlZiBidWdfcHlsaW50XzQxMjJfd3Jvbmcocyk6ICAjIFtpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHNdCisgICAgIiIiCisgICAgRXZlcnkgcmV0dXJucyBpcyBub3QgY29uc2lzdGVudCBiZWNhdXNlIHBhcnNlcl9lcnJvcl9ub3J0eXBlIGhhcyBubyB0eXBlIGhpbnRzCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBuID0gaW50KHMpCisgICAgICAgIGlmIG4gPCAxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpCisgICAgICAgIHJldHVybiBuCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhcnNlcl9lcnJvcl9ub3J0eXBlKCdwYXJzZXIgZXJyb3InKQorCitkZWYgYnVnX3B5bGludF80MTIyX2JpcyhzKToKKyAgICAiIiIKKyAgICBFdmVyeSByZXR1cm5zIGlzIGNvbnNpc3RlbnQgYmVjYXVzZSBwYXJzZXJfZXJyb3IgaGFzIHR5cGUgaGludHMKKyAgICBpbmRpY2F0aW5nIGl0IG5ldmVyIHJldHVybnMKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIG4gPSBpbnQocykKKyAgICAgICAgaWYgbiA8IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKKyAgICAgICAgcmV0dXJuIG4KKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFyc2VyX2Vycm9yX25hbWUoJ3BhcnNlciBlcnJvcicpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5jb25zaXN0ZW50L2luY29uc2lzdGVudF9yZXR1cm5zX25vcmV0dXJuLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJuc19ub3JldHVybi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk1NjliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJuc19ub3JldHVybi5yYwpAQCAtMCwwICsxLDUgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjYuMgorCitbUkVGQUNUT1JJTkddCituZXZlci1yZXR1cm5pbmctZnVuY3Rpb25zPXN5cy5leGl0LHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnNfbm9yZXR1cm4udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luY29uc2lzdGVudC9pbmNvbnNpc3RlbnRfcmV0dXJuc19ub3JldHVybi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyMzU1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmNvbnNpc3RlbnQvaW5jb25zaXN0ZW50X3JldHVybnNfbm9yZXR1cm4udHh0CkBAIC0wLDAgKzEgQEAKK2luY29uc2lzdGVudC1yZXR1cm4tc3RhdGVtZW50czozMjowOmJ1Z19weWxpbnRfNDEyMl93cm9uZzpFaXRoZXIgYWxsIHJldHVybiBzdGF0ZW1lbnRzIGluIGEgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBleHByZXNzaW9uLCBvciBub25lIG9mIHRoZW0gc2hvdWxkLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2luaGVyaXRfbm9uX2NsYXNzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luaGVyaXRfbm9uX2NsYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWVmNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5oZXJpdF9ub25fY2xhc3MucHkKQEAgLTAsMCArMSw4MSBAQAorIiIiVGVzdCB0aGF0IGluaGVyaXRpbmcgZnJvbSBzb21ldGhpbmcgd2hpY2ggaXMgbm90DQorYSBjbGFzcyBlbWl0cyBhIHdhcm5pbmcuICIiIg0KKw0KKyMgcHlsaW50OiBkaXNhYmxlPW5vLWluaXQsIGltcG9ydC1lcnJvciwgaW52YWxpZC1uYW1lLCB1c2luZy1jb25zdGFudC10ZXN0LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQ0KKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCBuby1hYnNvbHV0ZS1pbXBvcnQNCisNCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcNCisNCitpZiAxOg0KKyAgICBBbWJpZ3VvdXMgPSBOb25lDQorZWxzZToNCisgICAgQW1iaWd1b3VzID0gaW50DQorDQorY2xhc3MgRW1wdHkob2JqZWN0KToNCisgICAgIiIiIEVtcHR5IGNsYXNzLiAiIiINCisNCitkZWYgcmV0dXJuX2NsYXNzKCk6DQorICAgICIiIiBSZXR1cm4gYSBjbGFzcy4gIiIiDQorICAgIHJldHVybiBHb29kMw0KKw0KK2NsYXNzIEJhZCgxKTogIyBbaW5oZXJpdC1ub24tY2xhc3NdDQorICAgICIiIiBDYW4ndCBpbmhlcml0IGZyb20gaW5zdGFuY2UuICIiIg0KKw0KK2NsYXNzIEJhZDEobGFtYmRhIGFiYzogNDIpOiAjIFtpbmhlcml0LW5vbi1jbGFzc10NCisgICAgIiIiIENhbid0IGluaGVyaXQgZnJvbSBsYW1iZGEuICIiIg0KKw0KK2NsYXNzIEJhZDIob2JqZWN0KCkpOiAjIFtpbmhlcml0LW5vbi1jbGFzc10NCisgICAgIiIiIENhbid0IGluaGVyaXQgZnJvbSBhbiBpbnN0YW5jZSBvZiBvYmplY3QuICIiIg0KKw0KK2NsYXNzIEJhZDMocmV0dXJuX2NsYXNzKTogIyBbaW5oZXJpdC1ub24tY2xhc3NdDQorICAgICIiIiBDYW4ndCBpbmhlcml0IGZyb20gZnVuY3Rpb24uICIiIg0KKw0KK2NsYXNzIEJhZDQoRW1wdHkoKSk6ICMgW2luaGVyaXQtbm9uLWNsYXNzXQ0KKyAgICAiIiIgQ2FuJ3QgaW5oZXJpdCBmcm9tIGluc3RhbmNlLiAiIiINCisNCitjbGFzcyBHb29kKG9iamVjdCk6DQorICAgIHBhc3MNCisNCitjbGFzcyBHb29kMShpbnQpOg0KKyAgICBwYXNzDQorDQorY2xhc3MgR29vZDIodHlwZSk6DQorICAgIHBhc3MNCisNCitjbGFzcyBHb29kMyh0eXBlKGludCkpOg0KKyAgICBwYXNzDQorDQorY2xhc3MgR29vZDQocmV0dXJuX2NsYXNzKCkpOg0KKyAgICBwYXNzDQorDQorY2xhc3MgR29vZDUoR29vZDQsIGludCwgb2JqZWN0KToNCisgICAgcGFzcw0KKw0KK2NsYXNzIEdvb2Q2KEFtYmlndW91cyk6DQorICAgICIiIiBJbmhlcml0cyBmcm9tIHNvbWV0aGluZyBhbWJpZ3VvdXMuDQorDQorICAgIFRoaXMgY291bGQgZW1pdCBhIHdhcm5pbmcgd2hlbiB3ZSB3aWxsIGhhdmUNCisgICAgZmxvdyBkZXRlY3Rpb24uDQorICAgICIiIg0KKw0KK2NsYXNzIFVua25vd24oTWlzc2luZyk6DQorICAgIHBhc3MNCisNCitjbGFzcyBVbmtub3duMShHb29kNSBpZiBUcnVlIGVsc2UgQmFkMSk6DQorICAgIHBhc3MNCisNCisNCitjbGFzcyBOb3RJbmhlcml0YWJsZUJvb2woYm9vbCk6ICMgW2luaGVyaXQtbm9uLWNsYXNzXQ0KKyAgICBwYXNzDQorDQorDQorY2xhc3MgTm90SW5oZXJpdGFibGVSYW5nZShyYW5nZSk6ICMgW2luaGVyaXQtbm9uLWNsYXNzXQ0KKyAgICBwYXNzDQorDQorDQorY2xhc3MgTm90SW5oZXJpdGFibGVTbGljZShzbGljZSk6ICMgW2luaGVyaXQtbm9uLWNsYXNzXQ0KKyAgICBwYXNzDQorDQorDQorY2xhc3MgTm90SW5oZXJpdGFibGVNZW1vcnlWaWV3KG1lbW9yeXZpZXcpOiAjIFtpbmhlcml0LW5vbi1jbGFzc10NCisgICAgcGFzcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbmhlcml0X25vbl9jbGFzcy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5oZXJpdF9ub25fY2xhc3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTJjMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5oZXJpdF9ub25fY2xhc3MudHh0CkBAIC0wLDAgKzEsOSBAQAoraW5oZXJpdC1ub24tY2xhc3M6MjE6MDpCYWQ6SW5oZXJpdGluZyAnMScsIHdoaWNoIGlzIG5vdCBhIGNsYXNzLgoraW5oZXJpdC1ub24tY2xhc3M6MjQ6MDpCYWQxOiJJbmhlcml0aW5nICdsYW1iZGEgYWJjOiA0MicsIHdoaWNoIGlzIG5vdCBhIGNsYXNzLiIKK2luaGVyaXQtbm9uLWNsYXNzOjI3OjA6QmFkMjpJbmhlcml0aW5nICdvYmplY3QoKScsIHdoaWNoIGlzIG5vdCBhIGNsYXNzLgoraW5oZXJpdC1ub24tY2xhc3M6MzA6MDpCYWQzOkluaGVyaXRpbmcgJ3JldHVybl9jbGFzcycsIHdoaWNoIGlzIG5vdCBhIGNsYXNzLgoraW5oZXJpdC1ub24tY2xhc3M6MzM6MDpCYWQ0OkluaGVyaXRpbmcgJ0VtcHR5KCknLCB3aGljaCBpcyBub3QgYSBjbGFzcy4KK2luaGVyaXQtbm9uLWNsYXNzOjY4OjA6Tm90SW5oZXJpdGFibGVCb29sOkluaGVyaXRpbmcgJ2Jvb2wnLCB3aGljaCBpcyBub3QgYSBjbGFzcy4KK2luaGVyaXQtbm9uLWNsYXNzOjcyOjA6Tm90SW5oZXJpdGFibGVSYW5nZTpJbmhlcml0aW5nICdyYW5nZScsIHdoaWNoIGlzIG5vdCBhIGNsYXNzLgoraW5oZXJpdC1ub24tY2xhc3M6NzY6MDpOb3RJbmhlcml0YWJsZVNsaWNlOkluaGVyaXRpbmcgJ3NsaWNlJywgd2hpY2ggaXMgbm90IGEgY2xhc3MuCitpbmhlcml0LW5vbi1jbGFzczo4MDowOk5vdEluaGVyaXRhYmxlTWVtb3J5VmlldzpJbmhlcml0aW5nICdtZW1vcnl2aWV3Jywgd2hpY2ggaXMgbm90IGEgY2xhc3MuCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9pc19nZW5lcmF0b3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9pc19nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmOTZkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X2lzX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2NsYXNzIFNvbWVDbGFzcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKTogIyBbaW5pdC1pcy1nZW5lcmF0b3JdCisgICAgICAgIHlpZWxkIE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X2lzX2dlbmVyYXRvci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9pc19nZW5lcmF0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDFhMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9pc19nZW5lcmF0b3IudHh0CkBAIC0wLDAgKzEgQEAKK2luaXQtaXMtZ2VuZXJhdG9yOjQ6NDpTb21lQ2xhc3MuX19pbml0X186X19pbml0X18gbWV0aG9kIGlzIGEgZ2VuZXJhdG9yCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9ub3RfY2FsbGVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luaXRfbm90X2NhbGxlZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY0NmViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luaXRfbm90X2NhbGxlZC5weQpAQCAtMCwwICsxLDg2IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLGltcG9ydC1lcnJvcixtaXNzaW5nLWRvY3N0cmluZyx3cm9uZy1pbXBvcnQtcG9zaXRpb24sdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktcGFzcworIiIidGVzdCBmb3IgX19pbml0X18gbm90IGNhbGxlZAorIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2NsYXNzIEFBQUE6CisgICAgIiIiYW5jZXN0b3IgMSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmludCgnaW5pdCcsIHNlbGYpCisKK2NsYXNzIEJCQkI6CisgICAgIiIiYW5jZXN0b3IgMiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmludCgnaW5pdCcsIHNlbGYpCisKK2NsYXNzIENDQ0M6CisgICAgIiIiYW5jZXN0b3IgMyIiIgorCisKK2NsYXNzIFpaWlooQUFBQSwgQkJCQiwgQ0NDQyk6CisgICAgIiIiZGVyaXZlZCBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiAgIyBbc3VwZXItaW5pdC1ub3QtY2FsbGVkXQorICAgICAgICBBQUFBLl9faW5pdF9fKHNlbGYpCisKK2NsYXNzIE5ld1N0eWxlQShvYmplY3QpOgorICAgICIiIm5ldyBzdHlsZSBjbGFzcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCisgICAgICAgIHByaW50KCdpbml0Jywgc2VsZikKKworY2xhc3MgTmV3U3R5bGVCKE5ld1N0eWxlQSk6CisgICAgIiIiZGVyaXZlZCBuZXcgc3R5bGUgY2xhc3MiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQorCitjbGFzcyBOb0luaXQob2JqZWN0KToKKyAgICAiIiJObyBfX2luaXRfXyBkZWZpbmVkIiIiCisKK2NsYXNzIEluaXQoTm9Jbml0KToKKyAgICAiIiJEb24ndCBjb21wbGFpbiBmb3Igbm90IGNhbGxpbmcgdGhlIHN1cGVyIF9faW5pdF9fIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5hcmcgPSBhcmcKKworY2xhc3MgTmV3U3R5bGVDKG9iamVjdCk6CisgICAgIiIiX19pbml0X18gZGVmaW5lZCBieSBhc3NpZ25tZW50LiIiIgorICAgIGRlZiB4eF9pbml0KHNlbGYpOgorICAgICAgICAiIiJJbml0aWFsaXplci4iIiIKKyAgICAgICAgcGFzcworCisgICAgX19pbml0X18gPSB4eF9pbml0CisKK2NsYXNzIEFzc2lnbmVkSW5pdChOZXdTdHlsZUMpOgorICAgICIiIk5vIGluaXQgY2FsbGVkLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKTogICMgW3N1cGVyLWluaXQtbm90LWNhbGxlZF0KKyAgICAgICAgc2VsZi5hcmcgPSAwCisKK2Zyb20gbWlzc2luZyBpbXBvcnQgTWlzc2luZworCitjbGFzcyBVbmtub3duQmFzZXMoTWlzc2luZyk6CisgICAgIiIiRG9uJ3QgZW1pdCBuby1pbml0IGlmIHRoZSBiYXNlcyBhcmVuJ3Qga25vd24uIiIiCisKKworZnJvbSB0eXBpbmcgaW1wb3J0IG92ZXJsb2FkICAjIHB5bGludDogZGlzYWJsZT13cm9uZy1pbXBvcnQtb3JkZXIKKworY2xhc3MgUGFyZW50OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bTogaW50KToKKyAgICAgICAgc2VsZi5udW1iZXIgPSBudW0KKworCitjbGFzcyBDaGlsZChQYXJlbnQpOgorCisgICAgQG92ZXJsb2FkCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bTogaW50KToKKyAgICAgICAgLi4uCisKKyAgICBAb3ZlcmxvYWQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtOiBmbG9hdCk6CisgICAgICAgIC4uLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18ocm91bmQobnVtKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X25vdF9jYWxsZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2luaXRfbm90X2NhbGxlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyZjFkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X25vdF9jYWxsZWQudHh0CkBAIC0wLDAgKzEsMiBAQAorc3VwZXItaW5pdC1ub3QtY2FsbGVkOjI1OjQ6WlpaWi5fX2luaXRfXzpfX2luaXRfXyBtZXRob2QgZnJvbSBiYXNlIGNsYXNzICdCQkJCJyBpcyBub3QgY2FsbGVkCitzdXBlci1pbml0LW5vdC1jYWxsZWQ6NTg6NDpBc3NpZ25lZEluaXQuX19pbml0X186X19pbml0X18gbWV0aG9kIGZyb20gYmFzZSBjbGFzcyAnTmV3U3R5bGVDJyBpcyBub3QgY2FsbGVkCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9yZXR1cm5fZnJvbV9pbm5lcl9mdW5jdGlvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X3JldHVybl9mcm9tX2lubmVyX2Z1bmN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWExYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9yZXR1cm5fZnJvbV9pbm5lcl9mdW5jdGlvbi5weQpAQCAtMCwwICsxLDEyIEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIiIzEwMDc1IiIiCisKK19fcmV2aXNpb25fXyA9IDEKKworY2xhc3MgQWFhKG9iamVjdCk6CisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBkZWYgaW5uZXJfZnVuY3Rpb24oYXJnKToKKyAgICAgICAgICAgICIiImlubmVyIGRvY3N0cmluZyIiIgorICAgICAgICAgICAgcmV0dXJuIGFyZyArIDQKKyAgICAgICAgc2VsZi5mdW5jID0gaW5uZXJfZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X3N1YmNsYXNzX2NsYXNzbWV0aG9kX3B5MzYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9zdWJjbGFzc19jbGFzc21ldGhvZF9weTM2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzc5NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9zdWJjbGFzc19jbGFzc21ldGhvZF9weTM2LnB5CkBAIC0wLDAgKzEsMTYgQEAKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nLG5vLWluaXQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2NsYXNzIFBsdWdpbkJhc2Uob2JqZWN0KToKKyAgICBzdWJjbGFzc2VzID0gW10KKworICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygqKmt3YXJncykKKyAgICAgICAgY2xzLnN1YmNsYXNzZXMuYXBwZW5kKGNscykKKworCitjbGFzcyBQbHVnaW4xKFBsdWdpbkJhc2UpOgorICAgIHBhc3MKKworCitjbGFzcyBQbHVnaW4yKFBsdWdpbkJhc2UpOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbml0X3N1YmNsYXNzX2NsYXNzbWV0aG9kX3B5MzYucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9zdWJjbGFzc19jbGFzc21ldGhvZF9weTM2LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5pdF9zdWJjbGFzc19jbGFzc21ldGhvZF9weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2lubmVyX2NsYXNzZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW5uZXJfY2xhc3Nlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2U4MTAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2lubmVyX2NsYXNzZXMucHkKQEAgLTAsMCArMSwzMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UsIHVubmVjZXNzYXJ5LXBhc3MKKyIiIkJhY2tlbmQgQmFzZSBDbGFzc2VzIGZvciB0aGUgc2Nod2VsbSB1c2VyIERCIiIiCisKK19fcmV2aXNpb25fXyA9ICJhbHBoYSIKKworY2xhc3MgQWFhKG9iamVjdCk6CisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9fc2V0YXR0cl9fKCdhJywgJ2InKQorCisKKyAgICBkZWYgb25lX3B1YmxpYyhzZWxmKToKKyAgICAgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBhbm90aGVyX3B1YmxpYyhzZWxmKToKKyAgICAgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgICAgIHBhc3MKKworY2xhc3MgQmJiKEFhYSk6CisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgcGFzcworCitjbGFzcyBDY2MoQWFhKToKKyAgICAiIiJkb2NzdHJpbmciIiIKKworICAgIGNsYXNzIERkZChBYWEpOgorICAgICAgICAiIiJkb2NzdHJpbmciIiIKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgRWVlKERkZCk6CisgICAgICAgICIiImRvY3N0cmluZyIiIgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYm9vbF9yZXR1cm5lZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2IvaW52YWxpZF9ib29sX3JldHVybmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjhlZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYm9vbF9yZXR1cm5lZC5weQpAQCAtMCwwICsxLDYyIEBACisiIiJDaGVjayBpbnZhbGlkIHZhbHVlIHJldHVybmVkIGJ5IF9fYm9vbF9fICIiIgorCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG1pc3NpbmctZG9jc3RyaW5nLG5vLXNlbGYtdXNlLGltcG9ydC1lcnJvciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2ltcG9ydCBzaXgKKworZnJvbSBtaXNzaW5nIGltcG9ydCBNaXNzaW5nCisKKworY2xhc3MgRmlyc3RHb29kQm9vbChvYmplY3QpOgorICAgICIiIl9fYm9vbF9fIHJldHVybnMgPHR5cGUgJ2Jvb2wnPiIiIgorCisgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFNlY29uZEdvb2RCb29sKG9iamVjdCk6CisgICAgIiIiX19ib29sX18gcmV0dXJucyA8dHlwZSAnYm9vbCc+IiIiCisKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKDApCisKKworY2xhc3MgQm9vbE1ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19ib29sX18oY2xzKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoQm9vbE1ldGFjbGFzcykKK2NsYXNzIFRoaXJkR29vZEJvb2wob2JqZWN0KToKKyAgICAiIiJCb29sIHRocm91Z2ggdGhlIG1ldGFjbGFzcy4iIiIKKworCitjbGFzcyBGaXJzdEJhZEJvb2wob2JqZWN0KToKKyAgICAiIiIgX19ib29sX18gcmV0dXJucyBhbiBpbnRlZ2VyICIiIgorCisgICAgZGVmIF9fYm9vbF9fKHNlbGYpOiAgIyBbaW52YWxpZC1ib29sLXJldHVybmVkXQorICAgICAgICByZXR1cm4gMQorCisKK2NsYXNzIFNlY29uZEJhZEJvb2wob2JqZWN0KToKKyAgICAiIiIgX19ib29sX18gcmV0dXJucyBzdHIgIiIiCisKKyAgICBkZWYgX19ib29sX18oc2VsZik6ICAjIFtpbnZhbGlkLWJvb2wtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAiVHJ1ZSIKKworCitjbGFzcyBUaGlyZEJhZEJvb2wob2JqZWN0KToKKyAgICAiIiIgX19ib29sX18gcmV0dXJucyBub2RlIHdoaWNoIGRvZXMgbm90IGhhdmUgJ3ZhbHVlJyBpbiBBU1QgIiIiCisKKyAgICBkZWYgX19ib29sX18oc2VsZik6ICAjIFtpbnZhbGlkLWJvb2wtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiBsYW1iZGE6IDMKKworCitjbGFzcyBBbWJpZ291c0Jvb2wob2JqZWN0KToKKyAgICAiIiIgVW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlICIiIgorICAgIF9fYm9vbF9fID0gbGFtYmRhIHNlbGY6IE1pc3NpbmcKKworCitjbGFzcyBBbm90aGVyQW1iaWd1b3VzQm9vbChvYmplY3QpOgorICAgICIiIlBvdGVudGlhbCB1bmluZmVyYWJsZSByZXR1cm4gdmFsdWUiIiIKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKE1pc3NpbmcpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYm9vbF9yZXR1cm5lZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYm9vbF9yZXR1cm5lZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmNWIxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2IvaW52YWxpZF9ib29sX3JldHVybmVkLnR4dApAQCAtMCwwICsxLDMgQEAKK2ludmFsaWQtYm9vbC1yZXR1cm5lZDozNjo0OkZpcnN0QmFkQm9vbC5fX2Jvb2xfXzpfX2Jvb2xfXyBkb2VzIG5vdCByZXR1cm4gYm9vbAoraW52YWxpZC1ib29sLXJldHVybmVkOjQzOjQ6U2Vjb25kQmFkQm9vbC5fX2Jvb2xfXzpfX2Jvb2xfXyBkb2VzIG5vdCByZXR1cm4gYm9vbAoraW52YWxpZC1ib29sLXJldHVybmVkOjUwOjQ6VGhpcmRCYWRCb29sLl9fYm9vbF9fOl9fYm9vbF9fIGRvZXMgbm90IHJldHVybiBib29sCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYnl0ZXNfcmV0dXJuZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYnl0ZXNfcmV0dXJuZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzZmVhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2IvaW52YWxpZF9ieXRlc19yZXR1cm5lZC5weQpAQCAtMCwwICsxLDY0IEBACisiIiJDaGVjayBpbnZhbGlkIHZhbHVlIHJldHVybmVkIGJ5IF9fYnl0ZXNfXyAiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtaXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSxpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgc2l4CisKK2Zyb20gbWlzc2luZyBpbXBvcnQgTWlzc2luZworCisKK2NsYXNzIEZpcnN0R29vZEJ5dGVzKG9iamVjdCk6CisgICAgIiIiX19ieXRlc19fIHJldHVybnMgPHR5cGUgJ2J5dGVzJz4iIiIKKworICAgIGRlZiBfX2J5dGVzX18oc2VsZik6CisgICAgICAgIHJldHVybiBiInNvbWUgYnl0ZXMiCisKKworY2xhc3MgU2Vjb25kR29vZEJ5dGVzKG9iamVjdCk6CisgICAgIiIiX19ieXRlc19fIHJldHVybnMgPHR5cGUgJ2J5dGVzJz4iIiIKKworICAgIGRlZiBfX2J5dGVzX18oc2VsZik6CisgICAgICAgIHJldHVybiBieXRlcygiMTIzIiwgImFzY2lpIikKKworCitjbGFzcyBCeXRlc01ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19ieXRlc19fKGNscyk6CisgICAgICAgIHJldHVybiBiInNvbWUgYnl0ZXMiCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKEJ5dGVzTWV0YWNsYXNzKQorY2xhc3MgVGhpcmRHb29kQnl0ZXMob2JqZWN0KToKKyAgICAiIiJCeXRlcyB0aHJvdWdoIHRoZSBtZXRhY2xhc3MuIiIiCisKKworY2xhc3MgRmlyc3RCYWRCeXRlcyhvYmplY3QpOgorICAgICIiIiBfX2J5dGVzX18gcmV0dXJucyBieXRlcyAiIiIKKworICAgIGRlZiBfX2J5dGVzX18oc2VsZik6ICAjIFtpbnZhbGlkLWJ5dGVzLXJldHVybmVkXQorICAgICAgICByZXR1cm4gIjEyMyIKKworCitjbGFzcyBTZWNvbmRCYWRCeXRlcyhvYmplY3QpOgorICAgICIiIiBfX2J5dGVzX18gcmV0dXJucyBpbnQgIiIiCisKKyAgICBkZWYgX19ieXRlc19fKHNlbGYpOiAgIyBbaW52YWxpZC1ieXRlcy1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIDEKKworCitjbGFzcyBUaGlyZEJhZEJ5dGVzKG9iamVjdCk6CisgICAgIiIiIF9fYnl0ZXNfXyByZXR1cm5zIG5vZGUgd2hpY2ggZG9lcyBub3QgaGF2ZSAndmFsdWUnIGluIEFTVCAiIiIKKworICAgIGRlZiBfX2J5dGVzX18oc2VsZik6ICAjIFtpbnZhbGlkLWJ5dGVzLXJldHVybmVkXQorICAgICAgICByZXR1cm4gbGFtYmRhOiBiInNvbWUgYnl0ZXMiCisKKworY2xhc3MgQW1iaWd1b3VzQnl0ZXMob2JqZWN0KToKKyAgICAiIiIgVW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlICIiIgorCisgICAgX19ieXRlc19fID0gbGFtYmRhIHNlbGY6IE1pc3NpbmcKKworCitjbGFzcyBBbm90aGVyQW1iaWd1b3VzQnl0ZXMob2JqZWN0KToKKyAgICAiIiJQb3RlbnRpYWwgdW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlIiIiCisKKyAgICBkZWYgX19ieXRlc19fKHNlbGYpOgorICAgICAgICByZXR1cm4gYnl0ZXMoTWlzc2luZykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2IvaW52YWxpZF9ieXRlc19yZXR1cm5lZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYnl0ZXNfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDQwY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9iL2ludmFsaWRfYnl0ZXNfcmV0dXJuZWQudHh0CkBAIC0wLDAgKzEsMyBAQAoraW52YWxpZC1ieXRlcy1yZXR1cm5lZDozNjo0OkZpcnN0QmFkQnl0ZXMuX19ieXRlc19fOl9fYnl0ZXNfXyBkb2VzIG5vdCByZXR1cm4gYnl0ZXMKK2ludmFsaWQtYnl0ZXMtcmV0dXJuZWQ6NDM6NDpTZWNvbmRCYWRCeXRlcy5fX2J5dGVzX186X19ieXRlc19fIGRvZXMgbm90IHJldHVybiBieXRlcworaW52YWxpZC1ieXRlcy1yZXR1cm5lZDo1MDo0OlRoaXJkQmFkQnl0ZXMuX19ieXRlc19fOl9fYnl0ZXNfXyBkb2VzIG5vdCByZXR1cm4gYnl0ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2UvaW52YWxpZF9lbnZ2YXJfdmFsdWUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZW52dmFyX3ZhbHVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWE4ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZW52dmFyX3ZhbHVlLnB5CkBAIC0wLDAgKzEsODQgQEAKKyMgcHlsaW50OiBkaXNhYmxlPXVzZWxlc3MtcmV0dXJuLG1pc3NpbmctZG9jc3RyaW5nCitmcm9tIG9zIGltcG9ydCBnZXRlbnYKKworCitkZWYgZnVuY3Rpb25fcmV0dXJuaW5nX2xpc3QoKToKKyAgICByZXR1cm4gW10KKworZGVmIGZ1bmN0aW9uX3JldHVybmluZ19ub25lKCk6CisgICAgcmV0dXJuIE5vbmUKKworZGVmIGZ1bmN0aW9uX3JldHVybmluZ19zdHJpbmcoKToKKyAgICByZXR1cm4gIlJlc3VsdCIKKworZGVmIGZ1bmN0aW9uX3JldHVybmluZ19ieXRlcygpOgorICAgIHJldHVybiBiIlJlc3VsdCIKKworZGVmIGRlZXBfZnVuY3Rpb25fcmV0dXJuaW5nX3N0cmluZygpOgorICAgIHJldHVybiBmdW5jdGlvbl9yZXR1cm5pbmdfc3RyaW5nKCkKKworZGVmIGRlZXBfZnVuY3Rpb25fcmV0dXJuaW5nX2J5dGVzKCk6CisgICAgcmV0dXJuIGZ1bmN0aW9uX3JldHVybmluZ19ieXRlcygpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nIGdldGVudiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIworCitnZXRlbnYoKSAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXZhbHVlLWZvci1wYXJhbWV0ZXIKKworZ2V0ZW52KGIiVEVTVCIpICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudigiVEVTVCIpCitnZXRlbnYoTm9uZSkgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihbIkNyYXAiXSkgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihmdW5jdGlvbl9yZXR1cm5pbmdfYnl0ZXMoKSkgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihkZWVwX2Z1bmN0aW9uX3JldHVybmluZ19ieXRlcygpKSAgICMgW2ludmFsaWQtZW52dmFyLXZhbHVlXQorZ2V0ZW52KGZ1bmN0aW9uX3JldHVybmluZ19saXN0KCkpICAgIyBbaW52YWxpZC1lbnZ2YXItdmFsdWVdCitnZXRlbnYoZnVuY3Rpb25fcmV0dXJuaW5nX25vbmUoKSkgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihmdW5jdGlvbl9yZXR1cm5pbmdfc3RyaW5nKCkpCitnZXRlbnYoZGVlcF9mdW5jdGlvbl9yZXR1cm5pbmdfc3RyaW5nKCkpCisKK2dldGVudihiIlRFU1QiLCAiZGVmYXVsdCIpICAgIyBbaW52YWxpZC1lbnZ2YXItdmFsdWVdCitnZXRlbnYoIlRFU1QiLCAiZGVmYXVsdCIpCitnZXRlbnYoTm9uZSwgImRlZmF1bHQiKSAgIyBbaW52YWxpZC1lbnZ2YXItdmFsdWVdCitnZXRlbnYoWyJDcmFwIl0sICJkZWZhdWx0IikgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihmdW5jdGlvbl9yZXR1cm5pbmdfYnl0ZXMoKSwgImRlZmF1bHQiKSAgICMgW2ludmFsaWQtZW52dmFyLXZhbHVlXQorZ2V0ZW52KGZ1bmN0aW9uX3JldHVybmluZ19saXN0KCksICJkZWZhdWx0IikgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihmdW5jdGlvbl9yZXR1cm5pbmdfbm9uZSgpLCAiZGVmYXVsdCIpICAgIyBbaW52YWxpZC1lbnZ2YXItdmFsdWVdCitnZXRlbnYoZnVuY3Rpb25fcmV0dXJuaW5nX3N0cmluZygpLCAiZGVmYXVsdCIpCisKK2dldGVudihrZXk9YiJURVNUIikgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihrZXk9IlRFU1QiKQorZ2V0ZW52KGtleT1Ob25lKSAgICAjIFtpbnZhbGlkLWVudnZhci12YWx1ZV0KK2dldGVudihrZXk9WyJDcmFwIl0pICAgIyBbaW52YWxpZC1lbnZ2YXItdmFsdWVdCitnZXRlbnYoa2V5PWZ1bmN0aW9uX3JldHVybmluZ19ieXRlcygpKSAgICMgW2ludmFsaWQtZW52dmFyLXZhbHVlXQorZ2V0ZW52KGtleT1mdW5jdGlvbl9yZXR1cm5pbmdfbGlzdCgpKSAgICMgW2ludmFsaWQtZW52dmFyLXZhbHVlXQorZ2V0ZW52KGtleT1mdW5jdGlvbl9yZXR1cm5pbmdfbm9uZSgpKSAgICMgW2ludmFsaWQtZW52dmFyLXZhbHVlXQorZ2V0ZW52KGtleT1mdW5jdGlvbl9yZXR1cm5pbmdfc3RyaW5nKCkpCisKK2dldGVudignVEVTVCcsICJ2YWx1ZSIpCitnZXRlbnYoJ1RFU1QnLCBbXSkgICMgW2ludmFsaWQtZW52dmFyLWRlZmF1bHRdCitnZXRlbnYoJ1RFU1QnLCBOb25lKQorZ2V0ZW52KCdURVNUJywgYiIxMjMiKSAgIyBbaW52YWxpZC1lbnZ2YXItZGVmYXVsdF0KK2dldGVudignVEVTVCcsIGZ1bmN0aW9uX3JldHVybmluZ19saXN0KCkpICMgW2ludmFsaWQtZW52dmFyLWRlZmF1bHRdCitnZXRlbnYoJ1RFU1QnLCBmdW5jdGlvbl9yZXR1cm5pbmdfbm9uZSgpKQorZ2V0ZW52KCdURVNUJywgZnVuY3Rpb25fcmV0dXJuaW5nX3N0cmluZygpKQorZ2V0ZW52KCdURVNUJywgZnVuY3Rpb25fcmV0dXJuaW5nX2J5dGVzKCkpICAgIyBbaW52YWxpZC1lbnZ2YXItZGVmYXVsdF0KKworZ2V0ZW52KCdURVNUJywgZGVmYXVsdD0idmFsdWUiKQorZ2V0ZW52KCdURVNUJywgZGVmYXVsdD1bXSkgICMgW2ludmFsaWQtZW52dmFyLWRlZmF1bHRdCitnZXRlbnYoJ1RFU1QnLCBkZWZhdWx0PU5vbmUpCitnZXRlbnYoJ1RFU1QnLCBkZWZhdWx0PWIiMTIzIikgICMgW2ludmFsaWQtZW52dmFyLWRlZmF1bHRdCitnZXRlbnYoJ1RFU1QnLCBkZWZhdWx0PWZ1bmN0aW9uX3JldHVybmluZ19saXN0KCkpICAjIFtpbnZhbGlkLWVudnZhci1kZWZhdWx0XQorZ2V0ZW52KCdURVNUJywgZGVmYXVsdD1mdW5jdGlvbl9yZXR1cm5pbmdfbm9uZSgpKQorZ2V0ZW52KCdURVNUJywgZGVmYXVsdD1mdW5jdGlvbl9yZXR1cm5pbmdfc3RyaW5nKCkpCitnZXRlbnYoJ1RFU1QnLCBkZWZhdWx0PWZ1bmN0aW9uX3JldHVybmluZ19ieXRlcygpKSAgIyBbaW52YWxpZC1lbnZ2YXItZGVmYXVsdF0KKworZ2V0ZW52KGtleT0nVEVTVCcpCitnZXRlbnYoa2V5PSdURVNUJywgZGVmYXVsdD0idmFsdWUiKQorZ2V0ZW52KGtleT0nVEVTVCcsIGRlZmF1bHQ9YiJ2YWx1ZSIpICAjIFtpbnZhbGlkLWVudnZhci1kZWZhdWx0XQorZ2V0ZW52KGtleT0nVEVTVCcsIGRlZmF1bHQ9WyJDcmFwIl0pICAjIFtpbnZhbGlkLWVudnZhci1kZWZhdWx0XQorZ2V0ZW52KGtleT0nVEVTVCcsIGRlZmF1bHQ9ZnVuY3Rpb25fcmV0dXJuaW5nX2xpc3QoKSkgICMgW2ludmFsaWQtZW52dmFyLWRlZmF1bHRdCitnZXRlbnYoa2V5PSdURVNUJywgZGVmYXVsdD1mdW5jdGlvbl9yZXR1cm5pbmdfbm9uZSgpKQorZ2V0ZW52KGtleT0nVEVTVCcsIGRlZmF1bHQ9ZnVuY3Rpb25fcmV0dXJuaW5nX3N0cmluZygpKQorZ2V0ZW52KGtleT0nVEVTVCcsIGRlZmF1bHQ9ZnVuY3Rpb25fcmV0dXJuaW5nX2J5dGVzKCkpICAjIFtpbnZhbGlkLWVudnZhci1kZWZhdWx0XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2VudnZhcl92YWx1ZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZW52dmFyX3ZhbHVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWMzNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2VudnZhcl92YWx1ZS50eHQKQEAgLTAsMCArMSwzMSBAQAoraW52YWxpZC1lbnZ2YXItdmFsdWU6MzA6MDo6b3MuZ2V0ZW52IGRvZXMgbm90IHN1cHBvcnQgYnVpbHRpbnMuYnl0ZXMgdHlwZSBhcmd1bWVudAoraW52YWxpZC1lbnZ2YXItdmFsdWU6MzI6MDo6b3MuZ2V0ZW52IGRvZXMgbm90IHN1cHBvcnQgYnVpbHRpbnMuTm9uZVR5cGUgdHlwZSBhcmd1bWVudAoraW52YWxpZC1lbnZ2YXItdmFsdWU6MzM6MDo6b3MuZ2V0ZW52IGRvZXMgbm90IHN1cHBvcnQgYnVpbHRpbnMubGlzdCB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTozNDowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5ieXRlcyB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTozNTowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5ieXRlcyB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTozNjowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5saXN0IHR5cGUgYXJndW1lbnQKK2ludmFsaWQtZW52dmFyLXZhbHVlOjM3OjA6Om9zLmdldGVudiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWx0aW5zLk5vbmVUeXBlIHR5cGUgYXJndW1lbnQKK2ludmFsaWQtZW52dmFyLXZhbHVlOjQxOjA6Om9zLmdldGVudiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWx0aW5zLmJ5dGVzIHR5cGUgYXJndW1lbnQKK2ludmFsaWQtZW52dmFyLXZhbHVlOjQzOjA6Om9zLmdldGVudiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWx0aW5zLk5vbmVUeXBlIHR5cGUgYXJndW1lbnQKK2ludmFsaWQtZW52dmFyLXZhbHVlOjQ0OjA6Om9zLmdldGVudiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWx0aW5zLmxpc3QgdHlwZSBhcmd1bWVudAoraW52YWxpZC1lbnZ2YXItdmFsdWU6NDU6MDo6b3MuZ2V0ZW52IGRvZXMgbm90IHN1cHBvcnQgYnVpbHRpbnMuYnl0ZXMgdHlwZSBhcmd1bWVudAoraW52YWxpZC1lbnZ2YXItdmFsdWU6NDY6MDo6b3MuZ2V0ZW52IGRvZXMgbm90IHN1cHBvcnQgYnVpbHRpbnMubGlzdCB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTo0NzowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5Ob25lVHlwZSB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTo1MDowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5ieXRlcyB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTo1MjowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5Ob25lVHlwZSB0eXBlIGFyZ3VtZW50CitpbnZhbGlkLWVudnZhci12YWx1ZTo1MzowOjpvcy5nZXRlbnYgZG9lcyBub3Qgc3VwcG9ydCBidWlsdGlucy5saXN0IHR5cGUgYXJndW1lbnQKK2ludmFsaWQtZW52dmFyLXZhbHVlOjU0OjA6Om9zLmdldGVudiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWx0aW5zLmJ5dGVzIHR5cGUgYXJndW1lbnQKK2ludmFsaWQtZW52dmFyLXZhbHVlOjU1OjA6Om9zLmdldGVudiBkb2VzIG5vdCBzdXBwb3J0IGJ1aWx0aW5zLmxpc3QgdHlwZSBhcmd1bWVudAoraW52YWxpZC1lbnZ2YXItdmFsdWU6NTY6MDo6b3MuZ2V0ZW52IGRvZXMgbm90IHN1cHBvcnQgYnVpbHRpbnMuTm9uZVR5cGUgdHlwZSBhcmd1bWVudAoraW52YWxpZC1lbnZ2YXItZGVmYXVsdDo2MDowOjpvcy5nZXRlbnYgZGVmYXVsdCB0eXBlIGlzIGJ1aWx0aW5zLmxpc3QuIEV4cGVjdGVkIHN0ciBvciBOb25lLgoraW52YWxpZC1lbnZ2YXItZGVmYXVsdDo2MjowOjpvcy5nZXRlbnYgZGVmYXVsdCB0eXBlIGlzIGJ1aWx0aW5zLmJ5dGVzLiBFeHBlY3RlZCBzdHIgb3IgTm9uZS4KK2ludmFsaWQtZW52dmFyLWRlZmF1bHQ6NjM6MDo6b3MuZ2V0ZW52IGRlZmF1bHQgdHlwZSBpcyBidWlsdGlucy5saXN0LiBFeHBlY3RlZCBzdHIgb3IgTm9uZS4KK2ludmFsaWQtZW52dmFyLWRlZmF1bHQ6NjY6MDo6b3MuZ2V0ZW52IGRlZmF1bHQgdHlwZSBpcyBidWlsdGlucy5ieXRlcy4gRXhwZWN0ZWQgc3RyIG9yIE5vbmUuCitpbnZhbGlkLWVudnZhci1kZWZhdWx0OjY5OjA6Om9zLmdldGVudiBkZWZhdWx0IHR5cGUgaXMgYnVpbHRpbnMubGlzdC4gRXhwZWN0ZWQgc3RyIG9yIE5vbmUuCitpbnZhbGlkLWVudnZhci1kZWZhdWx0OjcxOjA6Om9zLmdldGVudiBkZWZhdWx0IHR5cGUgaXMgYnVpbHRpbnMuYnl0ZXMuIEV4cGVjdGVkIHN0ciBvciBOb25lLgoraW52YWxpZC1lbnZ2YXItZGVmYXVsdDo3MjowOjpvcy5nZXRlbnYgZGVmYXVsdCB0eXBlIGlzIGJ1aWx0aW5zLmxpc3QuIEV4cGVjdGVkIHN0ciBvciBOb25lLgoraW52YWxpZC1lbnZ2YXItZGVmYXVsdDo3NTowOjpvcy5nZXRlbnYgZGVmYXVsdCB0eXBlIGlzIGJ1aWx0aW5zLmJ5dGVzLiBFeHBlY3RlZCBzdHIgb3IgTm9uZS4KK2ludmFsaWQtZW52dmFyLWRlZmF1bHQ6Nzk6MDo6b3MuZ2V0ZW52IGRlZmF1bHQgdHlwZSBpcyBidWlsdGlucy5ieXRlcy4gRXhwZWN0ZWQgc3RyIG9yIE5vbmUuCitpbnZhbGlkLWVudnZhci1kZWZhdWx0OjgwOjA6Om9zLmdldGVudiBkZWZhdWx0IHR5cGUgaXMgYnVpbHRpbnMubGlzdC4gRXhwZWN0ZWQgc3RyIG9yIE5vbmUuCitpbnZhbGlkLWVudnZhci1kZWZhdWx0OjgxOjA6Om9zLmdldGVudiBkZWZhdWx0IHR5cGUgaXMgYnVpbHRpbnMubGlzdC4gRXhwZWN0ZWQgc3RyIG9yIE5vbmUuCitpbnZhbGlkLWVudnZhci1kZWZhdWx0Ojg0OjA6Om9zLmdldGVudiBkZWZhdWx0IHR5cGUgaXMgYnVpbHRpbnMuYnl0ZXMuIEV4cGVjdGVkIHN0ciBvciBOb25lLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2V4Y2VwdGlvbnNfY2F1Z2h0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2V4Y2VwdGlvbnNfY2F1Z2h0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjY0MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19jYXVnaHQucHkKQEAgLTAsMCArMSwxMzUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktYW5jZXN0b3JzLCBuby1hYnNvbHV0ZS1pbXBvcnQsIGltcG9ydC1lcnJvciwgbXVsdGlwbGUtaW1wb3J0cyx3cm9uZy1pbXBvcnQtcG9zaXRpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IHNvY2tldCwgYmluYXNjaWksIGFiYywgc2l4CisKK2NsYXNzIE15RXhjZXB0aW9uKG9iamVjdCk6CisgICAgIiIiQ3VzdG9tICdleGNlcHRpb24nLiIiIgorCitjbGFzcyBNeVNlY29uZEV4Y2VwdGlvbihvYmplY3QpOgorICAgICIiIkN1c3RvbSAnZXhjZXB0aW9uJy4iIiIKKworY2xhc3MgTXlHb29kRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQ3VzdG9tIGV4Y2VwdGlvbi4iIiIKKworY2xhc3MgTXlTZWNvbmRHb29kRXhjZXB0aW9uKE15R29vZEV4Y2VwdGlvbik6CisgICAgIiIiQ3VzdG9tIGV4Y2VwdGlvbi4iIiIKKworY2xhc3MgU2tpcEV4Y2VwdGlvbihzb2NrZXQuZXJyb3IpOgorICAgICIiIk5vdCBhbiBleGNlcHRpb24gZm9yIFB5dGhvbiAyLCBidXQgb25lIGluIDMuIiIiCisKK2NsYXNzIFNlY29uZFNraXBFeGNlcHRpb24oU2tpcEV4Y2VwdGlvbik6CisgICAgIiIiQWxzbyBhIGdvb2QgZXhjZXB0aW9uLiIiIgorCit0cnk6CisgICAgMSArIDEKK2V4Y2VwdCBNeUV4Y2VwdGlvbjogICMgW2NhdGNoaW5nLW5vbi1leGNlcHRpb25dCisgICAgcHJpbnQoImNhdWdodCIpCisKK3RyeToKKyAgICAxICsgMgorIyArMTpbY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbixjYXRjaGluZy1ub24tZXhjZXB0aW9uXQorZXhjZXB0IChNeUV4Y2VwdGlvbiwgTXlTZWNvbmRFeGNlcHRpb24pOgorICAgIHByaW50KCJjYXVnaHQiKQorCit0cnk6CisgICAgMSArIDMKK2V4Y2VwdCBNeUdvb2RFeGNlcHRpb246CisgICAgcHJpbnQoImNhdWdodCIpCisKK3RyeToKKyAgICAxICsgMworZXhjZXB0IChNeUdvb2RFeGNlcHRpb24sIE15U2Vjb25kR29vZEV4Y2VwdGlvbik6CisgICAgcHJpbnQoImNhdWdodCIpCisKK3RyeToKKyAgICAxICsgMworZXhjZXB0IChTa2lwRXhjZXB0aW9uLCBTZWNvbmRTa2lwRXhjZXB0aW9uKToKKyAgICBwcmludCgiY2F1Z2h0IikKKwordHJ5OgorICAgIDEgKyA0MgorIyArMTpbY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbixjYXRjaGluZy1ub24tZXhjZXB0aW9uXQorZXhjZXB0IChOb25lLCBsaXN0KCkpOgorICAgIHByaW50KCJjYXVnaHQiKQorCit0cnk6CisgICAgMSArIDI0CitleGNlcHQgTm9uZTogIyBbY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbl0KKyAgICBwcmludCgiY2F1Z2h0IikKKworRVhDRVBUSU9OID0gTm9uZQorRVhDRVBUSU9OID0gWmVyb0RpdmlzaW9uRXJyb3IKK3RyeToKKyAgICAxICsgNDYKK2V4Y2VwdCBFWENFUFRJT046CisgICAgcHJpbnQoImNhdWdodCIpCisKK3RyeToKKyAgICAxICsgNDIKKyMgKzE6W2NhdGNoaW5nLW5vbi1leGNlcHRpb24sY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbixjYXRjaGluZy1ub24tZXhjZXB0aW9uXQorZXhjZXB0IChsaXN0KFs0LCA1LCA2XSksIE5vbmUsIFplcm9EaXZpc2lvbkVycm9yLCA0KToKKyAgICBwcmludCgiY2F1Z2h0IikKKworRVhDRVBUSU9OX1RVUExFID0gKFplcm9EaXZpc2lvbkVycm9yLCBPU0Vycm9yKQorTk9OX0VYQ0VQVElPTl9UVVBMRSA9IChaZXJvRGl2aXNpb25FcnJvciwgT1NFcnJvciwgNCkKKwordHJ5OgorICAgIDEgKyA0MgorZXhjZXB0IEVYQ0VQVElPTl9UVVBMRToKKyAgICBwcmludCgiY2F1Z2h0IikKKwordHJ5OgorICAgIDEgKyA0MgorZXhjZXB0IE5PTl9FWENFUFRJT05fVFVQTEU6ICMgW2NhdGNoaW5nLW5vbi1leGNlcHRpb25dCisgICAgcHJpbnQoImNhdWdodCIpCisKK2Zyb20gbWlzc2luZ19pbXBvcnQgaW1wb3J0IFVua25vd25FcnJvcgorVU5LTk9XTl9DT01QT05FTlRTID0gKFplcm9EaXZpc2lvbkVycm9yLCBVbmtub3duRXJyb3IpCisKK3RyeToKKyAgICAxICsgNDIKK2V4Y2VwdCBVTktOT1dOX0NPTVBPTkVOVFM6CisgICAgcHJpbnQoImNhdWdodCIpCisKK3RyeToKKyAgICAxICsgNDIKK2V4Y2VwdCBiaW5hc2NpaS5FcnJvcjoKKyAgICBwcmludCgnYnVpbHRpbiBhbmQgZGV0ZWN0ZWQnKQorCit0cnk6CisgICAgMSArIDQ1CitleGNlcHQgb2JqZWN0OiAjIFtjYXRjaGluZy1ub24tZXhjZXB0aW9uXQorICAgIHByaW50KCdjYXVnaHQnKQorCit0cnk6CisgICAgMSArIDQyCitleGNlcHQgcmFuZ2U6ICMgW2NhdGNoaW5nLW5vbi1leGNlcHRpb25dCisgICAgcHJpbnQoJ2NhdWdodCcpCisKKworY2xhc3MgSGFzRXJyb3JJbk1STyhzaXgud2l0aF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEsIEV4Y2VwdGlvbikpOgorICAgIHBhc3MKKworCitjbGFzcyBTZWNvbmQoSGFzRXJyb3JJbk1STyk6CisgICAgcGFzcworCisKK3RyeToKKyAgICByYWlzZSBTZWNvbmQKK2V4Y2VwdCBTZWNvbmQ6CisgICAgcGFzcworCisKK2NsYXNzIFNvbWVCYXNlKFVua25vd25FcnJvcik6CisgICAgcGFzcworCisKK0VYQ0VQVElPTlMgPSAoU29tZUJhc2UsIFZhbHVlRXJyb3IpCisKK3RyeToKKyAgICByYWlzZSBWYWx1ZUVycm9yCitleGNlcHQgRVhDRVBUSU9OUzoKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19jYXVnaHQucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19jYXVnaHQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4ZWU5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2UvaW52YWxpZF9leGNlcHRpb25zX2NhdWdodC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK3JlcXVpcmVzID0gc2l4CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19jYXVnaHQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2V4Y2VwdGlvbnNfY2F1Z2h0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVlZDYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2V4Y2VwdGlvbnNfY2F1Z2h0LnR4dApAQCAtMCwwICsxLDEyIEBACitjYXRjaGluZy1ub24tZXhjZXB0aW9uOjI3Ojc6OiJDYXRjaGluZyBhbiBleGNlcHRpb24gd2hpY2ggZG9lc24ndCBpbmhlcml0IGZyb20gRXhjZXB0aW9uOiBNeUV4Y2VwdGlvbiIKK2NhdGNoaW5nLW5vbi1leGNlcHRpb246MzM6Nzo6IkNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBFeGNlcHRpb246IE15RXhjZXB0aW9uIgorY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbjozMzo3OjoiQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbjogTXlTZWNvbmRFeGNlcHRpb24iCitjYXRjaGluZy1ub24tZXhjZXB0aW9uOjU0Ojc6OiJDYXRjaGluZyBhbiBleGNlcHRpb24gd2hpY2ggZG9lc24ndCBpbmhlcml0IGZyb20gRXhjZXB0aW9uOiBOb25lIgorY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbjo1NDo3OjoiQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbjogbGlzdCgpIgorY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbjo1OTo3OjoiQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbjogTm9uZSIKK2NhdGNoaW5nLW5vbi1leGNlcHRpb246NzI6Nzo6IkNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBFeGNlcHRpb246IDQiCitjYXRjaGluZy1ub24tZXhjZXB0aW9uOjcyOjc6OiJDYXRjaGluZyBhbiBleGNlcHRpb24gd2hpY2ggZG9lc24ndCBpbmhlcml0IGZyb20gRXhjZXB0aW9uOiBOb25lIgorY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbjo3Mjo3OjoiQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbjogbGlzdChbNCwgNSwgNl0pIgorY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbjo4NTo3OjoiQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbjogTk9OX0VYQ0VQVElPTl9UVVBMRSIKK2NhdGNoaW5nLW5vbi1leGNlcHRpb246MTAzOjc6OiJDYXRjaGluZyBhbiBleGNlcHRpb24gd2hpY2ggZG9lc24ndCBpbmhlcml0IGZyb20gRXhjZXB0aW9uOiBvYmplY3QiCitjYXRjaGluZy1ub24tZXhjZXB0aW9uOjEwODo3OjoiQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbjogcmFuZ2UiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19yYWlzZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19yYWlzZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzQwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2UvaW52YWxpZF9leGNlcHRpb25zX3JhaXNlZC5weQpAQCAtMCwwICsxLDEwNSBAQAorIyBweWxpbnQ6ZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLWluaXQsaW1wb3J0LWVycm9yLG1pc3NpbmctZG9jc3RyaW5nLCBub3QtY2FsbGFibGUsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLGltcG9ydC1vdXRzaWRlLXRvcGxldmVsCisiIiJ0ZXN0IHBiIHdpdGggZXhjZXB0aW9ucyBhbmQgb2xkL25ldyBzdHlsZSBjbGFzc2VzIiIiCisKKworY2xhc3MgVmFsaWRFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJWYWxpZCBFeGNlcHRpb24uIiIiCisKK2NsYXNzIE9sZFN0eWxlQ2xhc3M6CisgICAgIiIiTm90IGFuIGV4Y2VwdGlvbi4iIiIKKworY2xhc3MgTmV3U3R5bGVDbGFzcyhvYmplY3QpOgorICAgICIiIk5vdCBhbiBleGNlcHRpb24uIiIiCisKKworZGVmIGdvb2RfY2FzZSgpOgorICAgICIiInJhaXNlIiIiCisgICAgcmFpc2UgVmFsaWRFeGNlcHRpb24oJ2hvcCcpCisKK2RlZiBnb29kX2Nhc2UxKCk6CisgICAgIiIiemxpYi5lcnJvciBpcyBkZWZpbmVkIGluIEMgbW9kdWxlLiIiIgorICAgIGltcG9ydCB6bGliCisgICAgcmFpc2UgemxpYi5lcnJvcig0KQorCitkZWYgZ29vZF9jYXNlMigpOgorICAgICIiImRlY2ltYWwuRGl2aXNpb25CeVplcm8gaXMgZGVmaW5lZCBpbiBDIG9uIFB5dGhvbiAzLiIiIgorICAgIGltcG9ydCBkZWNpbWFsCisgICAgcmFpc2UgZGVjaW1hbC5EaXZpc2lvbkJ5WmVybyg0KQorCitkZWYgZ29vZF9jYXNlMygpOgorICAgICIiImlvLkJsb2NraW5nSU9FcnJvciBpcyBkZWZpbmVkIGluIEMuIiIiCisgICAgaW1wb3J0IGlvCisgICAgcmFpc2UgaW8uQmxvY2tpbmdJT0Vycm9yCisKK2RlZiBiYWRfY2FzZTAoKToKKyAgICAiIiJyYWlzZSIiIgorICAgICMgKzI6PDMuMDpbbm9uc3RhbmRhcmQtZXhjZXB0aW9uXQorICAgICMgKzE6Pj0zLjA6W3JhaXNpbmctbm9uLWV4Y2VwdGlvbl0KKyAgICByYWlzZSBPbGRTdHlsZUNsYXNzKCdob3AnKQorCitkZWYgYmFkX2Nhc2UxKCk6CisgICAgIiIicmFpc2UiIiIKKyAgICByYWlzZSBOZXdTdHlsZUNsYXNzKCkgICMgW3JhaXNpbmctbm9uLWV4Y2VwdGlvbl0KKworZGVmIGJhZF9jYXNlMigpOgorICAgICIiInJhaXNlIiIiCisgICAgIyArMjo8My4wOltub25zdGFuZGFyZC1leGNlcHRpb25dCisgICAgIyArMTo+PTMuMDpbcmFpc2luZy1ub24tZXhjZXB0aW9uXQorICAgIHJhaXNlIE9sZFN0eWxlQ2xhc3MoJ2hvcCcpCisKK2RlZiBiYWRfY2FzZTMoKToKKyAgICAiIiJyYWlzZSIiIgorICAgIHJhaXNlIE5ld1N0eWxlQ2xhc3MgICMgW3JhaXNpbmctbm9uLWV4Y2VwdGlvbl0KKworZGVmIGJhZF9jYXNlNCgpOgorICAgICIiInJhaXNlIiIiCisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoJ2hvcCcpICAjIFtub3RpbXBsZW1lbnRlZC1yYWlzZWRdCisKK2RlZiBiYWRfY2FzZTUoKToKKyAgICAiIiJyYWlzZSIiIgorICAgIHJhaXNlIDEgICMgW3JhaXNpbmctYmFkLXR5cGVdCisKK2RlZiBiYWRfY2FzZTYoKToKKyAgICAiIiJyYWlzZSIiIgorICAgIHJhaXNlIE5vbmUgICMgW3JhaXNpbmctYmFkLXR5cGVdCisKK2RlZiBiYWRfY2FzZTcoKToKKyAgICAiIiJyYWlzZSBsaXN0IiIiCisgICAgcmFpc2UgbGlzdCAjIFtyYWlzaW5nLW5vbi1leGNlcHRpb25dCisKK2RlZiBiYWRfY2FzZTgoKToKKyAgICAiIiJyYWlzZSB0dXBsZSIiIgorICAgIHJhaXNlIHR1cGxlICMgW3JhaXNpbmctbm9uLWV4Y2VwdGlvbl0KKworZGVmIGJhZF9jYXNlOSgpOgorICAgICIiInJhaXNlIGRpY3QiIiIKKyAgICByYWlzZSBkaWN0ICMgW3JhaXNpbmctbm9uLWV4Y2VwdGlvbl0KKworZGVmIHVua25vd25fYmFzZXMoKToKKyAgICAiIiJEb24ndCBlbWl0IHdoZW4gd2UgZG9uJ3Qga25vdyB0aGUgYmFzZXMuIiIiCisgICAgZnJvbSBsYWxhIGltcG9ydCBiYWxhICAjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtb3V0c2lkZS10b3BsZXZlbAorICAgIGNsYXNzIE15RXhjZXB0aW9uKGJhbGEpOgorICAgICAgICBwYXNzCisgICAgcmFpc2UgTXlFeGNlcHRpb24KKworCitkZWYgZXhjZXB0aW9uX2luc3RhbmNlX3JlZ3Jlc3Npb24oKToKKyAgICAiIiJFeGNlcHRpb25zIGhhdmUgYSBwYXJ0aWN1bGFyIGNsYXNzIHR5cGUiIiIKKyAgICB0cnk6CisgICAgICAgIGludCgiOWEiKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzoKKyAgICAgICAgcmFpc2UgZXhjCisKKworZGVmIHJldXNpbmdfc2FtZV9uYW1lX3BpY2tzX3RoZV9sYXRlc3RfcmFpc2VkX3ZhbHVlKCk6CisgICAgY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAgICAgIiIic29tZSBlcnJvciIiIgorCisgICAgZXhjZXB0aW9ucyA9IHR1cGxlKFtWYWx1ZUVycm9yLCBUeXBlRXJyb3JdKQorICAgIHRyeToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgIGV4Y2VwdCBleGNlcHRpb25zIGFzIGV4YzogICMgcHlsaW50OiBkaXNhYmxlPWNhdGNoaW5nLW5vbi1leGNlcHRpb24KKyAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8xNzU2CisgICAgICAgIGV4YyA9IEVycm9yKGV4YykKKyAgICAgICAgaWYgZXhjOgorICAgICAgICAgICAgcmFpc2UgZXhjCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9lL2ludmFsaWRfZXhjZXB0aW9uc19yYWlzZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2V4Y2VwdGlvbnNfcmFpc2VkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTg1YTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZS9pbnZhbGlkX2V4Y2VwdGlvbnNfcmFpc2VkLnR4dApAQCAtMCwwICsxLDEwIEBACityYWlzaW5nLW5vbi1leGNlcHRpb246Mzg6NDpiYWRfY2FzZTA6UmFpc2luZyBhIG5ldyBzdHlsZSBjbGFzcyB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uCityYWlzaW5nLW5vbi1leGNlcHRpb246NDI6NDpiYWRfY2FzZTE6UmFpc2luZyBhIG5ldyBzdHlsZSBjbGFzcyB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uCityYWlzaW5nLW5vbi1leGNlcHRpb246NDg6NDpiYWRfY2FzZTI6UmFpc2luZyBhIG5ldyBzdHlsZSBjbGFzcyB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uCityYWlzaW5nLW5vbi1leGNlcHRpb246NTI6NDpiYWRfY2FzZTM6UmFpc2luZyBhIG5ldyBzdHlsZSBjbGFzcyB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uCitub3RpbXBsZW1lbnRlZC1yYWlzZWQ6NTY6NDpiYWRfY2FzZTQ6Tm90SW1wbGVtZW50ZWQgcmFpc2VkIC0gc2hvdWxkIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKK3JhaXNpbmctYmFkLXR5cGU6NjA6NDpiYWRfY2FzZTU6UmFpc2luZyBpbnQgd2hpbGUgb25seSBjbGFzc2VzIG9yIGluc3RhbmNlcyBhcmUgYWxsb3dlZAorcmFpc2luZy1iYWQtdHlwZTo2NDo0OmJhZF9jYXNlNjpSYWlzaW5nIE5vbmVUeXBlIHdoaWxlIG9ubHkgY2xhc3NlcyBvciBpbnN0YW5jZXMgYXJlIGFsbG93ZWQKK3JhaXNpbmctbm9uLWV4Y2VwdGlvbjo2ODo0OmJhZF9jYXNlNzpSYWlzaW5nIGEgbmV3IHN0eWxlIGNsYXNzIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEJhc2VFeGNlcHRpb24KK3JhaXNpbmctbm9uLWV4Y2VwdGlvbjo3Mjo0OmJhZF9jYXNlODpSYWlzaW5nIGEgbmV3IHN0eWxlIGNsYXNzIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEJhc2VFeGNlcHRpb24KK3JhaXNpbmctbm9uLWV4Y2VwdGlvbjo3Njo0OmJhZF9jYXNlOTpSYWlzaW5nIGEgbmV3IHN0eWxlIGNsYXNzIHdoaWNoIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIEJhc2VFeGNlcHRpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2cvaW52YWxpZF9nZXRuZXdhcmdzX2V4X3JldHVybmVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZy9pbnZhbGlkX2dldG5ld2FyZ3NfZXhfcmV0dXJuZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ODk1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2cvaW52YWxpZF9nZXRuZXdhcmdzX2V4X3JldHVybmVkLnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIkNoZWNrIGludmFsaWQgdmFsdWUgcmV0dXJuZWQgYnkgX19nZXRuZXdhcmdzX2V4X18gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1kb2NzdHJpbmcsbm8tc2VsZi11c2UsaW1wb3J0LWVycm9yLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQoraW1wb3J0IHNpeAorCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcKKworCitjbGFzcyBGaXJzdEdvb2RHZXROZXdBcmdzRXgob2JqZWN0KToKKyAgICAiIiJfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5zIDx0eXBlICd0dXBsZSc+IiIiCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX2V4X18oc2VsZik6CisgICAgICAgIHJldHVybiAoKDEsKSwgeyIyIjogIjIifSkKKworCitjbGFzcyBTZWNvbmRHb29kR2V0TmV3QXJnc0V4KG9iamVjdCk6CisgICAgIiIiX19nZXRuZXdhcmdzX2V4X18gcmV0dXJucyA8dHlwZSAndHVwbGUnPiIiIgorCisgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKHR1cGxlKCksIGRpY3QoKSkKKworCitjbGFzcyBHZXROZXdBcmdzRXhNZXRhY2xhc3ModHlwZSk6CisgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKGNscyk6CisgICAgICAgIHJldHVybiAoKDEsKSwgeyIyIjogIjIifSkKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoR2V0TmV3QXJnc0V4TWV0YWNsYXNzKQorY2xhc3MgVGhpcmRHb29kR2V0TmV3QXJnc0V4KG9iamVjdCk6CisgICAgIiIiR2V0TmV3QXJnc0V4IHRocm91Z2ggdGhlIG1ldGFjbGFzcy4iIiIKKworCitjbGFzcyBGaXJzdEJhZEdldE5ld0FyZ3NFeChvYmplY3QpOgorICAgICIiIiBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5zIGFuIGludGVnZXIgIiIiCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX2V4X18oc2VsZik6ICAjIFtpbnZhbGlkLWdldG5ld2FyZ3MtZXgtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAxCisKKworY2xhc3MgU2Vjb25kQmFkR2V0TmV3QXJnc0V4KG9iamVjdCk6CisgICAgIiIiIF9fZ2V0bmV3YXJnc19leF9fIHJldHVybnMgdHVwbGUgd2l0aCBpbmNvcnJlY3QgYXJnIGxlbmd0aCIiIgorCisgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOiAgIyBbaW52YWxpZC1nZXRuZXdhcmdzLWV4LXJldHVybmVkXQorICAgICAgICByZXR1cm4gKHR1cGxlKDEpLCBkaWN0KHg9InkiKSwgMSkKKworCitjbGFzcyBUaGlyZEJhZEdldE5ld0FyZ3NFeChvYmplY3QpOgorICAgICIiIiBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5zIHR1cGxlIHdpdGggd3JvbmcgdHlwZSBmb3IgZmlyc3QgYXJnICIiIgorCisgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOiAgIyBbaW52YWxpZC1nZXRuZXdhcmdzLWV4LXJldHVybmVkXQorICAgICAgICByZXR1cm4gKGRpY3QoeD0ieSIpLCBkaWN0KHg9InkiKSkKKworCitjbGFzcyBGb3VydGhCYWRHZXROZXdBcmdzRXgob2JqZWN0KToKKyAgICAiIiIgX19nZXRuZXdhcmdzX2V4X18gcmV0dXJucyB0dXBsZSB3aXRoIHdyb25nIHR5cGUgZm9yIHNlY29uZCBhcmcgIiIiCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX2V4X18oc2VsZik6ICAjIFtpbnZhbGlkLWdldG5ld2FyZ3MtZXgtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAoKDEsICksICgxLCApKQorCisKK2NsYXNzIEZpZnRoQmFkR2V0TmV3QXJnc0V4KG9iamVjdCk6CisgICAgIiIiIF9fZ2V0bmV3YXJnc19leF9fIHJldHVybnMgdHVwbGUgd2l0aCB3cm9uZyB0eXBlIGZvciBib3RoIGFyZ3MgIiIiCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX2V4X18oc2VsZik6ICAjIFtpbnZhbGlkLWdldG5ld2FyZ3MtZXgtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAoeyd4JzogJ3knfSwgKDIsKSkKKworCitjbGFzcyBTaXh0aEJhZEdldE5ld0FyZ3NFeChvYmplY3QpOgorICAgICIiIiBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5zIG5vZGUgd2hpY2ggZG9lcyBub3QgaGF2ZSAndmFsdWUnIGluIEFTVCAiIiIKKworICAgIGRlZiBfX2dldG5ld2FyZ3NfZXhfXyhzZWxmKTogICMgW2ludmFsaWQtZ2V0bmV3YXJncy1leC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIGxhbWJkYTogKDEsIDIpCisKKworY2xhc3MgQW1iaWdvdXNHZXROZXdBcmdzRXgob2JqZWN0KToKKyAgICAiIiIgVW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlICIiIgorCisgICAgX19nZXRuZXdhcmdzX2V4X18gPSBsYW1iZGEgc2VsZjogTWlzc2luZworCisKK2NsYXNzIEFub3RoZXJBbWJpZ3VvdXNHZXROZXdBcmdzRXgob2JqZWN0KToKKyAgICAiIiJQb3RlbnRpYWwgdW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlIiIiCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX2V4X18oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShNaXNzaW5nKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZy9pbnZhbGlkX2dldG5ld2FyZ3NfZXhfcmV0dXJuZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZy9pbnZhbGlkX2dldG5ld2FyZ3NfZXhfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOGMxNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9nL2ludmFsaWRfZ2V0bmV3YXJnc19leF9yZXR1cm5lZC50eHQKQEAgLTAsMCArMSw2IEBACitpbnZhbGlkLWdldG5ld2FyZ3MtZXgtcmV0dXJuZWQ6MzY6NDpGaXJzdEJhZEdldE5ld0FyZ3NFeC5fX2dldG5ld2FyZ3NfZXhfXzpfX2dldG5ld2FyZ3NfZXhfXyBkb2VzIG5vdCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nICh0dXBsZSwgZGljdCkKK2ludmFsaWQtZ2V0bmV3YXJncy1leC1yZXR1cm5lZDo0Mzo0OlNlY29uZEJhZEdldE5ld0FyZ3NFeC5fX2dldG5ld2FyZ3NfZXhfXzpfX2dldG5ld2FyZ3NfZXhfXyBkb2VzIG5vdCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nICh0dXBsZSwgZGljdCkKK2ludmFsaWQtZ2V0bmV3YXJncy1leC1yZXR1cm5lZDo1MDo0OlRoaXJkQmFkR2V0TmV3QXJnc0V4Ll9fZ2V0bmV3YXJnc19leF9fOl9fZ2V0bmV3YXJnc19leF9fIGRvZXMgbm90IHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgKHR1cGxlLCBkaWN0KQoraW52YWxpZC1nZXRuZXdhcmdzLWV4LXJldHVybmVkOjU3OjQ6Rm91cnRoQmFkR2V0TmV3QXJnc0V4Ll9fZ2V0bmV3YXJnc19leF9fOl9fZ2V0bmV3YXJnc19leF9fIGRvZXMgbm90IHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgKHR1cGxlLCBkaWN0KQoraW52YWxpZC1nZXRuZXdhcmdzLWV4LXJldHVybmVkOjY0OjQ6RmlmdGhCYWRHZXROZXdBcmdzRXguX19nZXRuZXdhcmdzX2V4X186X19nZXRuZXdhcmdzX2V4X18gZG9lcyBub3QgcmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyAodHVwbGUsIGRpY3QpCitpbnZhbGlkLWdldG5ld2FyZ3MtZXgtcmV0dXJuZWQ6NzE6NDpTaXh0aEJhZEdldE5ld0FyZ3NFeC5fX2dldG5ld2FyZ3NfZXhfXzpfX2dldG5ld2FyZ3NfZXhfXyBkb2VzIG5vdCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nICh0dXBsZSwgZGljdCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2cvaW52YWxpZF9nZXRuZXdhcmdzX3JldHVybmVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZy9pbnZhbGlkX2dldG5ld2FyZ3NfcmV0dXJuZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1MzA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2cvaW52YWxpZF9nZXRuZXdhcmdzX3JldHVybmVkLnB5CkBAIC0wLDAgKzEsNjIgQEAKKyIiIkNoZWNrIGludmFsaWQgdmFsdWUgcmV0dXJuZWQgYnkgX19nZXRuZXdhcmdzX18gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1kb2NzdHJpbmcsbm8tc2VsZi11c2UsaW1wb3J0LWVycm9yLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQoraW1wb3J0IHNpeAorCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcKKworCitjbGFzcyBGaXJzdEdvb2RHZXROZXdBcmdzKG9iamVjdCk6CisgICAgIiIiX19nZXRuZXdhcmdzX18gcmV0dXJucyA8dHlwZSAndHVwbGUnPiIiIgorCisgICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOgorICAgICAgICByZXR1cm4gKDEsICIyIiwgMykKKworCitjbGFzcyBTZWNvbmRHb29kR2V0TmV3QXJncyhvYmplY3QpOgorICAgICIiIl9fZ2V0bmV3YXJnc19fIHJldHVybnMgPHR5cGUgJ3R1cGxlJz4iIiIKKworICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKCkKKworCitjbGFzcyBHZXROZXdBcmdzTWV0YWNsYXNzKHR5cGUpOgorICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhjbHMpOgorICAgICAgICByZXR1cm4gKDEsIDIsIDMpCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKEdldE5ld0FyZ3NNZXRhY2xhc3MpCitjbGFzcyBUaGlyZEdvb2RHZXROZXdBcmdzKG9iamVjdCk6CisgICAgIiIiR2V0TmV3QXJncyB0aHJvdWdoIHRoZSBtZXRhY2xhc3MuIiIiCisKKworY2xhc3MgRmlyc3RCYWRHZXROZXdBcmdzKG9iamVjdCk6CisgICAgIiIiIF9fZ2V0bmV3YXJnc19fIHJldHVybnMgYW4gaW50ZWdlciAiIiIKKworICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKTogICMgW2ludmFsaWQtZ2V0bmV3YXJncy1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIDEKKworCitjbGFzcyBTZWNvbmRCYWRHZXROZXdBcmdzKG9iamVjdCk6CisgICAgIiIiIF9fZ2V0bmV3YXJnc19fIHJldHVybnMgc3RyICIiIgorCisgICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOiAgIyBbaW52YWxpZC1nZXRuZXdhcmdzLXJldHVybmVkXQorICAgICAgICByZXR1cm4gIigxLCAyLCAzKSIKKworCitjbGFzcyBUaGlyZEJhZEdldE5ld0FyZ3Mob2JqZWN0KToKKyAgICAiIiIgX19nZXRuZXdhcmdzX18gcmV0dXJucyBub2RlIHdoaWNoIGRvZXMgbm90IGhhdmUgJ3ZhbHVlJyBpbiBBU1QgIiIiCisKKyAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6ICAjIFtpbnZhbGlkLWdldG5ld2FyZ3MtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiBsYW1iZGE6IHR1cGxlKDEsIDIpCisKKworY2xhc3MgQW1iaWdvdXNHZXROZXdBcmdzKG9iamVjdCk6CisgICAgIiIiIFVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSAiIiIKKyAgICBfX2dldG5ld2FyZ3NfXyA9IGxhbWJkYSBzZWxmOiBNaXNzaW5nCisKKworY2xhc3MgQW5vdGhlckFtYmlndW91c0dldE5ld0FyZ3Mob2JqZWN0KToKKyAgICAiIiJQb3RlbnRpYWwgdW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlIiIiCisgICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoTWlzc2luZykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2cvaW52YWxpZF9nZXRuZXdhcmdzX3JldHVybmVkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2cvaW52YWxpZF9nZXRuZXdhcmdzX3JldHVybmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTYwYTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvZy9pbnZhbGlkX2dldG5ld2FyZ3NfcmV0dXJuZWQudHh0CkBAIC0wLDAgKzEsMyBAQAoraW52YWxpZC1nZXRuZXdhcmdzLXJldHVybmVkOjM2OjQ6Rmlyc3RCYWRHZXROZXdBcmdzLl9fZ2V0bmV3YXJnc19fOl9fZ2V0bmV3YXJnc19fIGRvZXMgbm90IHJldHVybiBhIHR1cGxlCitpbnZhbGlkLWdldG5ld2FyZ3MtcmV0dXJuZWQ6NDM6NDpTZWNvbmRCYWRHZXROZXdBcmdzLl9fZ2V0bmV3YXJnc19fOl9fZ2V0bmV3YXJnc19fIGRvZXMgbm90IHJldHVybiBhIHR1cGxlCitpbnZhbGlkLWdldG5ld2FyZ3MtcmV0dXJuZWQ6NTA6NDpUaGlyZEJhZEdldE5ld0FyZ3MuX19nZXRuZXdhcmdzX186X19nZXRuZXdhcmdzX18gZG9lcyBub3QgcmV0dXJuIGEgdHVwbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFjMGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9hbGxfZm9ybWF0LnB5CkBAIC0wLDAgKzEsNyBAQAorIiIiVGVzdCBpbnZhbGlkIF9fYWxsX18gZm9ybWF0LgorCitUdXBsZXMgd2l0aCBvbmUgZWxlbWVudCBNVVNUIGNvbnRhaW4gYSBjb21tYSEgT3RoZXJ3aXNlIGl0J3MgYSBzdHJpbmcuCisiIiIKK19fYWxsX18gPSAoIkNPTlNUIikgICMgW2ludmFsaWQtYWxsLWZvcm1hdF0KKworQ09OU1QgPSA0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9hbGxfZm9ybWF0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjNmZlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdC50eHQKQEAgLTAsMCArMSBAQAoraW52YWxpZC1hbGwtZm9ybWF0OjU6MTE6OkludmFsaWQgZm9ybWF0IGZvciBfX2FsbF9fLCBtdXN0IGJlIHR1cGxlIG9yIGxpc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdF92YWxpZF8xLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9hbGxfZm9ybWF0X3ZhbGlkXzEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkOGI0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdF92YWxpZF8xLnB5CkBAIC0wLDAgKzEsNCBAQAorIiIiVGVzdCB2YWxpZCBfX2FsbF9fIGZvcm1hdC4iIiIKK19fYWxsX18gPSAoIkNPTlNUIiwgKQorCitDT05TVCA9IDQyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2FsbF9mb3JtYXRfdmFsaWRfMi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX2Zvcm1hdF92YWxpZF8yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjQzYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2FsbF9mb3JtYXRfdmFsaWRfMi5weQpAQCAtMCwwICsxLDQgQEAKKyIiIlRlc3QgdmFsaWQgX19hbGxfXyBmb3JtYXQuIiIiCitfX2FsbF9fID0gWyJDT05TVCJdCisKK0NPTlNUID0gNDIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX29iamVjdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX29iamVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDY4Yzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9hbGxfb2JqZWN0LnB5CkBAIC0wLDAgKzEsNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcNCitfX2FsbF9fID0gKA0KKyAgICAxLCAjIFtpbnZhbGlkLWFsbC1vYmplY3RdDQorICAgIGxhbWJkYTogTm9uZSwgIyBbaW52YWxpZC1hbGwtb2JqZWN0XQ0KKyAgICBOb25lLCAjIFtpbnZhbGlkLWFsbC1vYmplY3RdDQorKQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfYWxsX29iamVjdC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2FsbF9vYmplY3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2RiOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2FsbF9vYmplY3QudHh0CkBAIC0wLDAgKzEsMyBAQAoraW52YWxpZC1hbGwtb2JqZWN0OjM6NDo6SW52YWxpZCBvYmplY3QgJzEnIGluIF9fYWxsX18sIG11c3QgY29udGFpbiBvbmx5IHN0cmluZ3MKK2ludmFsaWQtYWxsLW9iamVjdDo0OjQ6PGxhbWJkYT46IkludmFsaWQgb2JqZWN0ICdsYW1iZGE6IE5vbmUnIGluIF9fYWxsX18sIG11c3QgY29udGFpbiBvbmx5IHN0cmluZ3MiCitpbnZhbGlkLWFsbC1vYmplY3Q6NTo0OjpJbnZhbGlkIG9iamVjdCAnTm9uZScgaW4gX19hbGxfXywgbXVzdCBjb250YWluIG9ubHkgc3RyaW5ncwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9jbGFzc19vYmplY3QucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2NsYXNzX29iamVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjc3NTZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9jbGFzc19vYmplY3QucHkKQEAgLTAsMCArMSwxOCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbnZhbGlkLW5hbWUNCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdA0KKw0KK2NsYXNzIEE6DQorICAgIHBhc3MNCisNCitjbGFzcyBCOg0KKyAgICBwYXNzDQorDQorQS5fX2NsYXNzX18gPSBCDQorQS5fX2NsYXNzX18gPSBzdHINCitBLl9fY2xhc3NfXyA9IGZsb2F0DQorQS5fX2NsYXNzX18gPSBkaWN0DQorQS5fX2NsYXNzX18gPSBzZXQNCisNCitBLl9fY2xhc3NfXyA9IGRlZmF1bHRkaWN0DQorQS5fX2NsYXNzX18gPSBkZWZhdWx0ZGljdChzdHIpICAjIFtpbnZhbGlkLWNsYXNzLW9iamVjdF0NCitBLl9fY2xhc3NfXyA9IDEgICMgW2ludmFsaWQtY2xhc3Mtb2JqZWN0XQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfY2xhc3Nfb2JqZWN0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfY2xhc3Nfb2JqZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzA5ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9jbGFzc19vYmplY3QudHh0CkBAIC0wLDAgKzEsMiBAQAoraW52YWxpZC1jbGFzcy1vYmplY3Q6MTc6MDo6SW52YWxpZCBfX2NsYXNzX18gb2JqZWN0CitpbnZhbGlkLWNsYXNzLW9iamVjdDoxODowOjpJbnZhbGlkIF9fY2xhc3NfXyBvYmplY3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfZm9ybWF0X3JldHVybmVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9mb3JtYXRfcmV0dXJuZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0MjhiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfZm9ybWF0X3JldHVybmVkLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyIiIkNoZWNrIGludmFsaWQgdmFsdWUgcmV0dXJuZWQgYnkgX19mb3JtYXRfXyAiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtaXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSxpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgc2l4CisKK2Zyb20gbWlzc2luZyBpbXBvcnQgTWlzc2luZworCisKK2NsYXNzIEZpcnN0R29vZEZvcm1hdChvYmplY3QpOgorICAgICIiIl9fZm9ybWF0X18gcmV0dXJucyA8dHlwZSAnc3RyJz4iIiIKKworICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgcmV0dXJuICJzb21lIGZvcm1hdCIKKworCitjbGFzcyBTZWNvbmRHb29kRm9ybWF0KG9iamVjdCk6CisgICAgIiIiX19mb3JtYXRfXyByZXR1cm5zIDx0eXBlICdzdHInPiIiIgorCisgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICByZXR1cm4gc3RyKDEyMykKKworCitjbGFzcyBGb3JtYXRNZXRhY2xhc3ModHlwZSk6CisgICAgZGVmIF9fZm9ybWF0X18oY2xzLCBmb3JtYXRfc3BlYyk6CisgICAgICAgIHJldHVybiAic29tZSBmb3JtYXQiCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKEZvcm1hdE1ldGFjbGFzcykKK2NsYXNzIFRoaXJkR29vZEZvcm1hdChvYmplY3QpOgorICAgICIiIkZvcm1hdCB0aHJvdWdoIHRoZSBtZXRhY2xhc3MuIiIiCisKKworY2xhc3MgRmlyc3RCYWRGb3JtYXQob2JqZWN0KToKKyAgICAiIiIgX19mb3JtYXRfXyByZXR1cm5zIGJ5dGVzICIiIgorCisgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOiAgIyBbaW52YWxpZC1mb3JtYXQtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiBiIjEyMyIKKworCitjbGFzcyBTZWNvbmRCYWRGb3JtYXQob2JqZWN0KToKKyAgICAiIiIgX19mb3JtYXRfXyByZXR1cm5zIGludCAiIiIKKworICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKTogICMgW2ludmFsaWQtZm9ybWF0LXJldHVybmVkXQorICAgICAgICByZXR1cm4gMQorCisKK2NsYXNzIFRoaXJkQmFkRm9ybWF0KG9iamVjdCk6CisgICAgIiIiIF9fZm9ybWF0X18gcmV0dXJucyBub2RlIHdoaWNoIGRvZXMgbm90IGhhdmUgJ3ZhbHVlJyBpbiBBU1QgIiIiCisKKyAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6ICAjIFtpbnZhbGlkLWZvcm1hdC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIGxhbWJkYTogInNvbWUgZm9ybWF0IgorCisKK2NsYXNzIEFtYmlndW91c0Zvcm1hdChvYmplY3QpOgorICAgICIiIiBVbmluZmVyYWJsZSByZXR1cm4gdmFsdWUgIiIiCisKKyAgICBfX2Zvcm1hdF9fID0gbGFtYmRhIHNlbGYsIGZvcm1hdF9zcGVjOiBNaXNzaW5nCisKKworY2xhc3MgQW5vdGhlckFtYmlndW91c0Zvcm1hdChvYmplY3QpOgorICAgICIiIlBvdGVudGlhbCB1bmluZmVyYWJsZSByZXR1cm4gdmFsdWUiIiIKKworICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgcmV0dXJuIHN0cihNaXNzaW5nKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9mb3JtYXRfcmV0dXJuZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9mb3JtYXRfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2UxYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2Zvcm1hdF9yZXR1cm5lZC50eHQKQEAgLTAsMCArMSwzIEBACitpbnZhbGlkLWZvcm1hdC1yZXR1cm5lZDozNjo0OkZpcnN0QmFkRm9ybWF0Ll9fZm9ybWF0X186X19mb3JtYXRfXyBkb2VzIG5vdCByZXR1cm4gc3RyCitpbnZhbGlkLWZvcm1hdC1yZXR1cm5lZDo0Mzo0OlNlY29uZEJhZEZvcm1hdC5fX2Zvcm1hdF9fOl9fZm9ybWF0X18gZG9lcyBub3QgcmV0dXJuIHN0cgoraW52YWxpZC1mb3JtYXQtcmV0dXJuZWQ6NTA6NDpUaGlyZEJhZEZvcm1hdC5fX2Zvcm1hdF9fOl9fZm9ybWF0X18gZG9lcyBub3QgcmV0dXJuIHN0cgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9oYXNoX3JldHVybmVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9oYXNoX3JldHVybmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjYzZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2hhc2hfcmV0dXJuZWQucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiQ2hlY2sgaW52YWxpZCB2YWx1ZSByZXR1cm5lZCBieSBfX2hhc2hfXyAiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtaXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSxpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgc2l4CisKK2Zyb20gbWlzc2luZyBpbXBvcnQgTWlzc2luZworCisKK2NsYXNzIEZpcnN0R29vZEhhc2gob2JqZWN0KToKKyAgICAiIiJfX2hhc2hfXyByZXR1cm5zIDx0eXBlICdpbnQnPiIiIgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMQorCisKK2NsYXNzIFNlY29uZEdvb2RIYXNoKG9iamVjdCk6CisgICAgIiIiX19oYXNoX18gcmV0dXJucyA8dHlwZSAnaW50Jz4iIiIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworCitjbGFzcyBIYXNoTWV0YWNsYXNzKHR5cGUpOgorICAgIGRlZiBfX2hhc2hfXyhjbHMpOgorICAgICAgICByZXR1cm4gMQorCisKK0BzaXguYWRkX21ldGFjbGFzcyhIYXNoTWV0YWNsYXNzKQorY2xhc3MgVGhpcmRHb29kSGFzaChvYmplY3QpOgorICAgICIiIkhhc2ggdGhyb3VnaCB0aGUgbWV0YWNsYXNzLiIiIgorCisKK2NsYXNzIEZpcnN0QmFkSGFzaChvYmplY3QpOgorICAgICIiIiBfX2hhc2hfXyByZXR1cm5zIGEgZGljdCAiIiIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogICMgW2ludmFsaWQtaGFzaC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIHt9CisKKworY2xhc3MgU2Vjb25kQmFkSGFzaChvYmplY3QpOgorICAgICIiIiBfX2hhc2hfXyByZXR1cm5zIHN0ciAiIiIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogICMgW2ludmFsaWQtaGFzaC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuICJUcnVlIgorCisKK2NsYXNzIFRoaXJkQmFkSGFzaChvYmplY3QpOgorICAgICIiIiBfX2hhc2hfXyByZXR1cm5zIGEgZmxvYXQiIiIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogICMgW2ludmFsaWQtaGFzaC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIDEuMTEKKworCitjbGFzcyBGb3VydGhCYWRIYXNoKG9iamVjdCk6CisgICAgIiIiIF9faGFzaF9fIHJldHVybnMgbm9kZSB3aGljaCBkb2VzIG5vdCBoYXZlICd2YWx1ZScgaW4gQVNUICIiIgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOiAgIyBbaW52YWxpZC1oYXNoLXJldHVybmVkXQorICAgICAgICByZXR1cm4gbGFtYmRhOiAzCisKKworY2xhc3MgQW1iaWdvdXNIYXNoKG9iamVjdCk6CisgICAgIiIiIFVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSAiIiIKKworICAgIF9faGFzaF9fID0gbGFtYmRhIHNlbGY6IE1pc3NpbmcKKworCitjbGFzcyBBbm90aGVyQW1iaWd1b3VzSGFzaChvYmplY3QpOgorICAgICIiIlBvdGVudGlhbCB1bmluZmVyYWJsZSByZXR1cm4gdmFsdWUiIiIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goTWlzc2luZykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfaGFzaF9yZXR1cm5lZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2hhc2hfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGU1MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2hhc2hfcmV0dXJuZWQudHh0CkBAIC0wLDAgKzEsNCBAQAoraW52YWxpZC1oYXNoLXJldHVybmVkOjM2OjQ6Rmlyc3RCYWRIYXNoLl9faGFzaF9fOl9faGFzaF9fIGRvZXMgbm90IHJldHVybiBpbnQKK2ludmFsaWQtaGFzaC1yZXR1cm5lZDo0Mzo0OlNlY29uZEJhZEhhc2guX19oYXNoX186X19oYXNoX18gZG9lcyBub3QgcmV0dXJuIGludAoraW52YWxpZC1oYXNoLXJldHVybmVkOjUwOjQ6VGhpcmRCYWRIYXNoLl9faGFzaF9fOl9faGFzaF9fIGRvZXMgbm90IHJldHVybiBpbnQKK2ludmFsaWQtaGFzaC1yZXR1cm5lZDo1Nzo0OkZvdXJ0aEJhZEhhc2guX19oYXNoX186X19oYXNoX18gZG9lcyBub3QgcmV0dXJuIGludApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9pbmRleF9yZXR1cm5lZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfaW5kZXhfcmV0dXJuZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4ZDlhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfaW5kZXhfcmV0dXJuZWQucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiQ2hlY2sgaW52YWxpZCB2YWx1ZSByZXR1cm5lZCBieSBfX2luZGV4X18gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1kb2NzdHJpbmcsbm8tc2VsZi11c2UsaW1wb3J0LWVycm9yLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQoraW1wb3J0IHNpeAorCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcKKworCitjbGFzcyBGaXJzdEdvb2RJbmRleChvYmplY3QpOgorICAgICIiIl9faW5kZXhfXyByZXR1cm5zIDx0eXBlICdpbnQnPiIiIgorCisgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKworCitjbGFzcyBTZWNvbmRHb29kSW5kZXgob2JqZWN0KToKKyAgICAiIiJfX2luZGV4X18gcmV0dXJucyA8dHlwZSAnaW50Jz4iIiIKKworICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKworY2xhc3MgSW5kZXhNZXRhY2xhc3ModHlwZSk6CisgICAgZGVmIF9faW5kZXhfXyhjbHMpOgorICAgICAgICByZXR1cm4gMQorCisKK0BzaXguYWRkX21ldGFjbGFzcyhJbmRleE1ldGFjbGFzcykKK2NsYXNzIFRoaXJkR29vZEluZGV4KG9iamVjdCk6CisgICAgIiIiSW5kZXggdGhyb3VnaCB0aGUgbWV0YWNsYXNzLiIiIgorCisKK2NsYXNzIEZpcnN0QmFkSW5kZXgob2JqZWN0KToKKyAgICAiIiIgX19pbmRleF9fIHJldHVybnMgYSBkaWN0ICIiIgorCisgICAgZGVmIF9faW5kZXhfXyhzZWxmKTogICMgW2ludmFsaWQtaW5kZXgtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiB7JzEnOiAnMSd9CisKKworY2xhc3MgU2Vjb25kQmFkSW5kZXgob2JqZWN0KToKKyAgICAiIiIgX19pbmRleF9fIHJldHVybnMgc3RyICIiIgorCisgICAgZGVmIF9faW5kZXhfXyhzZWxmKTogICMgW2ludmFsaWQtaW5kZXgtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAiNDIiCisKKworY2xhc3MgVGhpcmRCYWRJbmRleChvYmplY3QpOgorICAgICIiIiBfX2luZGV4X18gcmV0dXJucyBhIGZsb2F0IiIiCisKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOiAgIyBbaW52YWxpZC1pbmRleC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIDEuMTEKKworCitjbGFzcyBGb3VydGhCYWRJbmRleChvYmplY3QpOgorICAgICIiIiBfX2luZGV4X18gcmV0dXJucyBub2RlIHdoaWNoIGRvZXMgbm90IGhhdmUgJ3ZhbHVlJyBpbiBBU1QgIiIiCisKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOiAgIyBbaW52YWxpZC1pbmRleC1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIGxhbWJkYTogMworCisKK2NsYXNzIEFtYmlnb3VzSW5kZXgob2JqZWN0KToKKyAgICAiIiIgVW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlICIiIgorCisgICAgX19pbmRleF9fID0gbGFtYmRhIHNlbGY6IE1pc3NpbmcKKworCitjbGFzcyBBbm90aGVyQW1iaWd1b3VzSW5kZXgob2JqZWN0KToKKyAgICAiIiJQb3RlbnRpYWwgdW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlIiIiCisKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaW50KE1pc3NpbmcpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2luZGV4X3JldHVybmVkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfaW5kZXhfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MGQ3NGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX2luZGV4X3JldHVybmVkLnR4dApAQCAtMCwwICsxLDQgQEAKK2ludmFsaWQtaW5kZXgtcmV0dXJuZWQ6MzY6NDpGaXJzdEJhZEluZGV4Ll9faW5kZXhfXzpfX2luZGV4X18gZG9lcyBub3QgcmV0dXJuIGludAoraW52YWxpZC1pbmRleC1yZXR1cm5lZDo0Mzo0OlNlY29uZEJhZEluZGV4Ll9faW5kZXhfXzpfX2luZGV4X18gZG9lcyBub3QgcmV0dXJuIGludAoraW52YWxpZC1pbmRleC1yZXR1cm5lZDo1MDo0OlRoaXJkQmFkSW5kZXguX19pbmRleF9fOl9faW5kZXhfXyBkb2VzIG5vdCByZXR1cm4gaW50CitpbnZhbGlkLWluZGV4LXJldHVybmVkOjU3OjQ6Rm91cnRoQmFkSW5kZXguX19pbmRleF9fOl9faW5kZXhfXyBkb2VzIG5vdCByZXR1cm4gaW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX25hbWUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX25hbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhZDk5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfbmFtZS5weQpAQCAtMCwwICsxLDY5IEBACisiIiIgVGVzdHMgZm9yIGludmFsaWQtbmFtZSBjaGVja2VyLiAiIiINCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LCBuby1hYnNvbHV0ZS1pbXBvcnQsIHdyb25nLWltcG9ydC1wb3NpdGlvbixpbXBvcnQtb3V0c2lkZS10b3BsZXZlbA0KKw0KK0FBQSA9IDI0DQordHJ5Og0KKyAgICBpbXBvcnQgY29sbGVjdGlvbnMNCitleGNlcHQgSW1wb3J0RXJyb3I6DQorICAgIGNvbGxlY3Rpb25zID0gTm9uZQ0KKw0KK2FhYSA9IDQyICMgW2ludmFsaWQtbmFtZV0NCit0cnk6DQorICAgIGltcG9ydCB0aW1lDQorZXhjZXB0IFZhbHVlRXJyb3I6DQorICAgIHRpbWUgPSBOb25lICMgW2ludmFsaWQtbmFtZV0NCisNCit0cnk6DQorICAgIGZyb20gc3lzIGltcG9ydCBhcmd2LCBleGVjdXRhYmxlIGFzIHB5dGhvbg0KK2V4Y2VwdCBJbXBvcnRFcnJvcjoNCisgICAgYXJndiA9IDQyDQorICAgIHB5dGhvbiA9IDI0DQorDQorZGVmIHRlc3QoKToNCisgICAgIiIiIFNob3VsZG4ndCBlbWl0IGFuIGludmFsaWQtbmFtZSBoZXJlLiAiIiINCisgICAgdHJ5Og0KKyAgICAgICAgaW1wb3J0IHJlDQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoNCisgICAgICAgIHJlID0gTm9uZQ0KKyAgICByZXR1cm4gcmUNCisNCitkZWYgYSgpOiAjIFtpbnZhbGlkLW5hbWVdDQorICAgICIiInlvIiIiDQorDQorDQorZGVmIF9nZW5lcmF0ZV9jbWRsaW5lX3Rlc3RzKCk6DQorICAgIFRlc3RDYXNlID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnVGVzdENhc2UnLCAnY21kLCB2YWxpZCcpDQorICAgIHZhbGlkID0gWydsZWF2ZS1tb2RlJywgJ2hpbnQgYWxsJ10NCisgICAgIyBWYWxpZCBjb21tYW5kIG9ubHkgLT4gdmFsaWQNCisgICAgZm9yIGl0ZW0gaW4gdmFsaWQ6DQorICAgICAgICB5aWVsZCBUZXN0Q2FzZSgnJy5qb2luKGl0ZW0pLCBUcnVlKQ0KKw0KKw0KKyMgV2Ugc2hvdWxkIGVtaXQgZm9yIHRoZSBsb29wIHZhcmlhYmxlLg0KK2ZvciBpIGluIHJhbmdlKDEwKToNCisgICAgRm9vY2FwZm9yID0gMiAgIyBbaW52YWxpZC1uYW1lXQ0KKw0KKw0KK2RlZiBkdW1teV9kZWNvcmF0b3IoYWFhYmMsIGJiYmNkKToNCisgICAgIiIiU29tZSIiIg0KKyAgICBkZWYgcmVhbF9kZWNvcmF0b3IoZmZmKToNCisgICAgICAgICIiInBpZWNlcyBvZiIiIg0KKyAgICAgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToNCisgICAgICAgICAgICAiIiJkb2NzdHJpbmciIiINCisgICAgICAgICAgICBwcmludChhYWFiYywgYmJiY2QpDQorICAgICAgICAgICAgZmZmKCphcmdzLCAqKmt3YXJncykNCisgICAgICAgIHJldHVybiB3cmFwcGVyDQorICAgIHJldHVybiByZWFsX2RlY29yYXRvcg0KKw0KKw0KK0BkdW1teV9kZWNvcmF0b3IoMSwgWw0KKyAgICAwICAjIEZpeGluZyAjMTE5IHNob3VsZCBtYWtlIHRoaXMgZ28gYXdheQ0KKyMgQzAxMDMgYWx3YXlzIHBvaW50cyBoZXJlIC0gbGluZSA2MSAgIyBbaW52YWxpZC1uYW1lXQ0KKw0KKw0KK10pDQorZGVmIGFfdmVyeV92ZXJ5X3ZlcnlfbG9uZ19mdW5jdGlvbl9uYW1lX1dpdGhDYW1lbENhc2VfdG9fbWFrZV9pdF9zYWQoKTogICMgU2hvdWxkIGJlIGxpbmUgNjUNCisgICAgIiIiRG9jc3RyaW5nIiIiDQorICAgIHByaW50KCdMT0wnKQ0KKw0KK2FfdmVyeV92ZXJ5X3ZlcnlfbG9uZ19mdW5jdGlvbl9uYW1lX1dpdGhDYW1lbENhc2VfdG9fbWFrZV9pdF9zYWQoKQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfbmFtZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX25hbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWNiZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX25hbWUudHh0CkBAIC0wLDAgKzEsNSBAQAoraW52YWxpZC1uYW1lOjEwOjA6OiJDb25zdGFudCBuYW1lICIiYWFhIiIgZG9lc24ndCBjb25mb3JtIHRvIFVQUEVSX0NBU0UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjE0OjQ6OiJDb25zdGFudCBuYW1lICIidGltZSIiIGRvZXNuJ3QgY29uZm9ybSB0byBVUFBFUl9DQVNFIG5hbWluZyBzdHlsZSIKK2ludmFsaWQtbmFtZTozMDowOmE6IkZ1bmN0aW9uIG5hbWUgIiJhIiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjQ0OjQ6OiJDb25zdGFudCBuYW1lICIiRm9vY2FwZm9yIiIgZG9lc24ndCBjb25mb3JtIHRvIFVQUEVSX0NBU0UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjYxOjA6YV92ZXJ5X3ZlcnlfdmVyeV9sb25nX2Z1bmN0aW9uX25hbWVfV2l0aENhbWVsQ2FzZV90b19tYWtlX2l0X3NhZDoiRnVuY3Rpb24gbmFtZSAiImFfdmVyeV92ZXJ5X3ZlcnlfbG9uZ19mdW5jdGlvbl9uYW1lX1dpdGhDYW1lbENhc2VfdG9fbWFrZV9pdF9zYWQiIiBkb2Vzbid0IGNvbmZvcm0gdG8gc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX292ZXJyaWRkZW5fbWV0aG9kLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9vdmVycmlkZGVuX21ldGhvZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2YyMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9vdmVycmlkZGVuX21ldGhvZC5weQpAQCAtMCwwICsxLDc4IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcworaW1wb3J0IGFiYworCisKK2NsYXNzIFN1cGVyQ2xhc3MobWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKKyAgICBAcHJvcGVydHkKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIHByb3Aoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBhc3luYyBkZWYgYXN5bmNfbWV0aG9kKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIG1ldGhvZF9hKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIG1ldGhvZF9iKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIFZhbGlkRGVyaXZlZChTdXBlckNsYXNzKToKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvcChzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGFzeW5jIGRlZiBhc3luY19tZXRob2Qoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgbWV0aG9kX2Eoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBtZXRob2RfYihzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBJbnZhbGlkRGVyaXZlZChTdXBlckNsYXNzKToKKyAgICBkZWYgcHJvcChzZWxmKTogICMgW2ludmFsaWQtb3ZlcnJpZGRlbi1tZXRob2RdCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgYXN5bmNfbWV0aG9kKHNlbGYpOiAjIFtpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kXQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG1ldGhvZF9hKHNlbGYpOiAjIFtpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kXQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgYXN5bmMgZGVmIG1ldGhvZF9iKHNlbGYpOiAjIFtpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kXQorICAgICAgICByZXR1cm4gTm9uZQorCitjbGFzcyBQcm9wZXJ0eToKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIFByb3BlcnR5U2V0dGVyKFByb3BlcnR5KToKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsb3NlLnNldHRlcgorICAgIGRlZiBjbG9zZShzZWxmLCBhdHRyKToKKyAgICAgICAgcmV0dXJuIGF0dHIKKworICAgIEBjbG9zZS5kZWxldGVyCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIEFic3RyYWN0UHJvcGVydHk6CisKKyAgICBAcHJvcGVydHkKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIHByb3Aoc2VsZik6CisgICAgICAgIHJldHVybgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9vdmVycmlkZGVuX21ldGhvZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX292ZXJyaWRkZW5fbWV0aG9kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRkYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9vdmVycmlkZGVuX21ldGhvZC50eHQKQEAgLTAsMCArMSw0IEBACitpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kOjM4OjQ6SW52YWxpZERlcml2ZWQucHJvcDpNZXRob2QgJ3Byb3AnIHdhcyBleHBlY3RlZCB0byBiZSAncHJvcGVydHknLCBmb3VuZCBpdCBpbnN0ZWFkIGFzICdtZXRob2QnCitpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kOjQxOjQ6SW52YWxpZERlcml2ZWQuYXN5bmNfbWV0aG9kOk1ldGhvZCAnYXN5bmNfbWV0aG9kJyB3YXMgZXhwZWN0ZWQgdG8gYmUgJ2FzeW5jJywgZm91bmQgaXQgaW5zdGVhZCBhcyAnbm9uLWFzeW5jJworaW52YWxpZC1vdmVycmlkZGVuLW1ldGhvZDo0NTo0OkludmFsaWREZXJpdmVkLm1ldGhvZF9hOk1ldGhvZCAnbWV0aG9kX2EnIHdhcyBleHBlY3RlZCB0byBiZSAnbWV0aG9kJywgZm91bmQgaXQgaW5zdGVhZCBhcyAncHJvcGVydHknCitpbnZhbGlkLW92ZXJyaWRkZW4tbWV0aG9kOjQ4OjQ6SW52YWxpZERlcml2ZWQubWV0aG9kX2I6TWV0aG9kICdtZXRob2RfYicgd2FzIGV4cGVjdGVkIHRvIGJlICdub24tYXN5bmMnLCBmb3VuZCBpdCBpbnN0ZWFkIGFzICdhc3luYycKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfcmVwcl9yZXR1cm5lZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfcmVwcl9yZXR1cm5lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmJkNzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9yZXByX3JldHVybmVkLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyIiIkNoZWNrIGludmFsaWQgdmFsdWUgcmV0dXJuZWQgYnkgX19yZXByX18gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1kb2NzdHJpbmcsbm8tc2VsZi11c2UsaW1wb3J0LWVycm9yLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQoraW1wb3J0IHNpeAorCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcKKworCitjbGFzcyBGaXJzdEdvb2RSZXByKG9iamVjdCk6CisgICAgIiIiX19yZXByX18gcmV0dXJucyA8dHlwZSAnc3RyJz4iIiIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJzb21lIHJlcHIiCisKKworY2xhc3MgU2Vjb25kR29vZFJlcHIob2JqZWN0KToKKyAgICAiIiJfX3JlcHJfXyByZXR1cm5zIDx0eXBlICdzdHInPiIiIgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKDEyMykKKworCitjbGFzcyBSZXByTWV0YWNsYXNzKHR5cGUpOgorICAgIGRlZiBfX3JlcHJfXyhjbHMpOgorICAgICAgICByZXR1cm4gInNvbWUgcmVwciIKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoUmVwck1ldGFjbGFzcykKK2NsYXNzIFRoaXJkR29vZFJlcHIob2JqZWN0KToKKyAgICAiIiJSZXByIHRocm91Z2ggdGhlIG1ldGFjbGFzcy4iIiIKKworCitjbGFzcyBGaXJzdEJhZFJlcHIob2JqZWN0KToKKyAgICAiIiIgX19yZXByX18gcmV0dXJucyBieXRlcyAiIiIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogICMgW2ludmFsaWQtcmVwci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIGIiMTIzIgorCisKK2NsYXNzIFNlY29uZEJhZFJlcHIob2JqZWN0KToKKyAgICAiIiIgX19yZXByX18gcmV0dXJucyBpbnQgIiIiCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6ICAjIFtpbnZhbGlkLXJlcHItcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAxCisKKworY2xhc3MgVGhpcmRCYWRSZXByKG9iamVjdCk6CisgICAgIiIiIF9fcmVwcl9fIHJldHVybnMgbm9kZSB3aGljaCBkb2VzIG5vdCBoYXZlICd2YWx1ZScgaW4gQVNUICIiIgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiAgIyBbaW52YWxpZC1yZXByLXJldHVybmVkXQorICAgICAgICByZXR1cm4gbGFtYmRhOiAic29tZSByZXByIgorCisKK2NsYXNzIEFtYmlndW91c1JlcHIob2JqZWN0KToKKyAgICAiIiIgVW5pbmZlcmFibGUgcmV0dXJuIHZhbHVlICIiIgorCisgICAgX19yZXByX18gPSBsYW1iZGEgc2VsZjogTWlzc2luZworCisKK2NsYXNzIEFub3RoZXJBbWJpZ3VvdXNSZXByKG9iamVjdCk6CisgICAgIiIiUG90ZW50aWFsIHVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSIiIgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKE1pc3NpbmcpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX3JlcHJfcmV0dXJuZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9yZXByX3JldHVybmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmUzNzVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF9yZXByX3JldHVybmVkLnR4dApAQCAtMCwwICsxLDMgQEAKK2ludmFsaWQtcmVwci1yZXR1cm5lZDozNjo0OkZpcnN0QmFkUmVwci5fX3JlcHJfXzpfX3JlcHJfXyBkb2VzIG5vdCByZXR1cm4gc3RyCitpbnZhbGlkLXJlcHItcmV0dXJuZWQ6NDM6NDpTZWNvbmRCYWRSZXByLl9fcmVwcl9fOl9fcmVwcl9fIGRvZXMgbm90IHJldHVybiBzdHIKK2ludmFsaWQtcmVwci1yZXR1cm5lZDo1MDo0OlRoaXJkQmFkUmVwci5fX3JlcHJfXzpfX3JlcHJfXyBkb2VzIG5vdCByZXR1cm4gc3RyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX3VuYXJ5X29wZXJhbmRfdHlwZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfdW5hcnlfb3BlcmFuZF90eXBlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTAxMjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9pbnZhbGlkX3VuYXJ5X29wZXJhbmRfdHlwZS5weQpAQCAtMCwwICsxLDUxIEBACisiIiJEZXRlY3QgcHJvYmxlbXMgd2l0aCBpbnZhbGlkIG9wZXJhbmRzIHVzZWQgb24gaW52YWxpZCBvYmplY3RzLiIiIg0KKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsaW52YWxpZC1uYW1lDQorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLXZhcmlhYmxlLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQ0KKw0KK2ltcG9ydCBjb2xsZWN0aW9ucw0KKw0KKw0KK2NsYXNzIEltcGxlbWVudGVkKG9iamVjdCk6DQorICAgIGRlZiBfX2ludmVydF9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIDQyDQorICAgIGRlZiBfX3Bvc19fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIDQyDQorICAgIGRlZiBfX25lZ19fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIDQyDQorDQorDQorZGVmIHRoZXNlX2FyZV9nb29kKCk6DQorICAgIG5lZ2F0aXZlID0gLTENCisgICAgbmVnYXRpdmUxID0gLTEuMA0KKyAgICBwb3NpdGl2ZSA9ICsxDQorICAgIHBvc2l0aXZlMiA9ICsxLjANCisgICAgaW52ZXJ0ZWQgPSB+MQ0KKyAgICBub3RfaW50ID0gbm90IDENCisgICAgbm90X2Zsb2F0ID0gbm90IDIuMA0KKyAgICBub3Rfc3RyaW5nID0gbm90ICIiDQorICAgIG5vdF9saXN0ID0gbm90IFtdDQorICAgIG5vdF9kaWN0ID0gbm90IHt9DQorICAgIG5vdF90dXBsZSA9IG5vdCAoMSwgMikNCisgICAgaW52ZXJ0ZWRfaW5zdGFuY2UgPSB+SW1wbGVtZW50ZWQoKQ0KKyAgICBwb3NpdGl2ZV9pbnN0YW5jZSA9ICtJbXBsZW1lbnRlZCgpDQorICAgIG5lZ2F0aXZlX2luc3RhbmNlID0gLUltcGxlbWVudGVkKCkNCisgICAgbm90X2luc3RhbmNlID0gbm90IEltcGxlbWVudGVkKCkNCisNCisNCitkZWYgdGhlc2VfYXJlX2JhZCgpOg0KKyAgICBpbnZlcnRfbGlzdCA9IH5bXSAjIFtpbnZhbGlkLXVuYXJ5LW9wZXJhbmQtdHlwZV0NCisgICAgaW52ZXJ0X3R1cGxlID0gfigpICMgW2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlXQ0KKyAgICBpbnZlcnRfZGljdCA9IH5kaWN0KCkgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIGludmVydF9kaWN0XzEgPSB+e30gIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIGludmVydF9zZXQgPSB+c2V0KCkgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIG5lZ19zZXQgPSAtc2V0KCkgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIG5lZ19zdHIgPSAtIiIgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIGludmVydF9zdHIgPSB+IiIgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIHBvc19zdHIgPSArIiIgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIGNsYXNzIEEob2JqZWN0KToNCisgICAgICAgIHBhc3MNCisgICAgaW52ZXJ0X2Z1bmMgPSB+KGxhbWJkYTogTm9uZSkgIyBbaW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGVdDQorICAgIGludmVydF9jbGFzcyA9IH5BICMgW2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlXQ0KKyAgICBpbnZlcnRfaW5zdGFuY2UgPSB+QSgpICMgW2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlXQ0KKyAgICBpbnZlcnRfbW9kdWxlID0gfmNvbGxlY3Rpb25zICMgW2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlXQ0KKyAgICBpbnZlcnRfZmxvYXQgPSB+Mi4wICMgW2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlXQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfdW5hcnlfb3BlcmFuZF90eXBlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2ludmFsaWRfdW5hcnlfb3BlcmFuZF90eXBlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTNkZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvaW52YWxpZF91bmFyeV9vcGVyYW5kX3R5cGUudHh0CkBAIC0wLDAgKzEsMTQgQEAKK2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlOjM2OjE4OnRoZXNlX2FyZV9iYWQ6ImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH46IGxpc3QiCitpbnZhbGlkLXVuYXJ5LW9wZXJhbmQtdHlwZTozNzoxOTp0aGVzZV9hcmVfYmFkOiJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiB0dXBsZSIKK2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlOjM4OjE4OnRoZXNlX2FyZV9iYWQ6ImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH46IGRpY3QiCitpbnZhbGlkLXVuYXJ5LW9wZXJhbmQtdHlwZTozOToyMDp0aGVzZV9hcmVfYmFkOiJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiBkaWN0IgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDA6MTc6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgfjogc2V0IgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDE6MTQ6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogc2V0IgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDI6MTQ6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogc3RyIgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDM6MTc6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgfjogc3RyIgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDQ6MTQ6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogc3RyIgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDc6MTg6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgfjogPGxhbWJkYT4iCitpbnZhbGlkLXVuYXJ5LW9wZXJhbmQtdHlwZTo0ODoxOTp0aGVzZV9hcmVfYmFkOiJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSB+OiBBIgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NDk6MjI6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgfjogQSIKK2ludmFsaWQtdW5hcnktb3BlcmFuZC10eXBlOjUwOjIwOnRoZXNlX2FyZV9iYWQ6ImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH46IGNvbGxlY3Rpb25zIgoraW52YWxpZC11bmFyeS1vcGVyYW5kLXR5cGU6NTE6MTk6dGhlc2VfYXJlX2JhZDoiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgfjogZmxvYXQiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX2hpbnRfcmV0dXJuZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX2hpbnRfcmV0dXJuZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NmJjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2wvaW52YWxpZF9sZW5ndGhfaGludF9yZXR1cm5lZC5weQpAQCAtMCwwICsxLDY0IEBACisiIiJDaGVjayBpbnZhbGlkIHZhbHVlIHJldHVybmVkIGJ5IF9fbGVuZ3RoX2hpbnRfXyAiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtaXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSxpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgc3lzCisKK2ltcG9ydCBzaXgKKworZnJvbSBtaXNzaW5nIGltcG9ydCBNaXNzaW5nCisKKworY2xhc3MgRmlyc3RHb29kTGVuZ3RoSGludChvYmplY3QpOgorICAgICIiIl9fbGVuZ3RoX2hpbnRfXyByZXR1cm5zIDx0eXBlICdpbnQnPiIiIgorCisgICAgZGVmIF9fbGVuZ3RoX2hpbnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworCitjbGFzcyBTZWNvbmRHb29kTGVuZ3RoSGludChvYmplY3QpOgorICAgICIiIl9fbGVuZ3RoX2hpbnRfXyByZXR1cm5zIDx0eXBlICdsb25nJz4iIiIKKworICAgIGRlZiBfX2xlbmd0aF9oaW50X18oc2VsZik6CisgICAgICAgIHJldHVybiBzeXMubWF4c2l6ZSArIDEKKworCitjbGFzcyBMZW5ndGhIaW50TWV0YWNsYXNzKHR5cGUpOgorICAgIGRlZiBfX2xlbmd0aF9oaW50X18oY2xzKToKKyAgICAgICAgcmV0dXJuIDEKKworCitAc2l4LmFkZF9tZXRhY2xhc3MoTGVuZ3RoSGludE1ldGFjbGFzcykKK2NsYXNzIFRoaXJkR29vZExlbmd0aEhpbnQob2JqZWN0KToKKyAgICAiIiJMZW5ndGhIaW50Z3RoIHRocm91Z2ggdGhlIG1ldGFjbGFzcy4iIiIKKworCitjbGFzcyBGaXJzdEJhZExlbmd0aEhpbnQob2JqZWN0KToKKyAgICAiIiIgX19sZW5ndGhfaGludF9fIHJldHVybnMgYSBuZWdhdGl2ZSBpbnRlZ2VyICIiIgorCisgICAgZGVmIF9fbGVuZ3RoX2hpbnRfXyhzZWxmKTogICMgW2ludmFsaWQtbGVuZ3RoLWhpbnQtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiAtMQorCisKK2NsYXNzIFNlY29uZEJhZExlbmd0aEhpbnQob2JqZWN0KToKKyAgICAiIiIgX19sZW5ndGhfaGludF9fIHJldHVybnMgbm9uLWludCAiIiIKKworICAgIGRlZiBfX2xlbmd0aF9oaW50X18oc2VsZik6ICAjIFtpbnZhbGlkLWxlbmd0aC1oaW50LXJldHVybmVkXQorICAgICAgICByZXR1cm4gMy4wCisKKworY2xhc3MgVGhpcmRCYWRMZW5ndGhIaW50KG9iamVjdCk6CisgICAgIiIiIF9fbGVuZ3RoX2hpbnRfXyByZXR1cm5zIG5vZGUgd2hpY2ggZG9lcyBub3QgaGF2ZSAndmFsdWUnIGluIEFTVCAiIiIKKworICAgIGRlZiBfX2xlbmd0aF9oaW50X18oc2VsZik6ICAjIFtpbnZhbGlkLWxlbmd0aC1oaW50LXJldHVybmVkXQorICAgICAgICByZXR1cm4gbGFtYmRhOiAzCisKKworY2xhc3MgQW1iaWdvdXNMZW5ndGhIaW50KG9iamVjdCk6CisgICAgIiIiIFVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSAiIiIKKyAgICBfX2xlbmd0aF9oaW50X18gPSBsYW1iZGEgc2VsZjogTWlzc2luZworCisKK2NsYXNzIEFub3RoZXJBbWJpZ3VvdXNMZW5ndGhIaW50KG9iamVjdCk6CisgICAgIiIiUG90ZW50aWFsIHVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSIiIgorICAgIGRlZiBfX2xlbmd0aF9oaW50X18oc2VsZik6CisgICAgICAgIHJldHVybiBpbnQoTWlzc2luZykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2wvaW52YWxpZF9sZW5ndGhfaGludF9yZXR1cm5lZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX2hpbnRfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzFhZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX2hpbnRfcmV0dXJuZWQudHh0CkBAIC0wLDAgKzEsMyBAQAoraW52YWxpZC1sZW5ndGgtaGludC1yZXR1cm5lZDozODo0OkZpcnN0QmFkTGVuZ3RoSGludC5fX2xlbmd0aF9oaW50X186X19sZW5ndGhfaGludF9fIGRvZXMgbm90IHJldHVybiBub24tbmVnYXRpdmUgaW50ZWdlcgoraW52YWxpZC1sZW5ndGgtaGludC1yZXR1cm5lZDo0NTo0OlNlY29uZEJhZExlbmd0aEhpbnQuX19sZW5ndGhfaGludF9fOl9fbGVuZ3RoX2hpbnRfXyBkb2VzIG5vdCByZXR1cm4gbm9uLW5lZ2F0aXZlIGludGVnZXIKK2ludmFsaWQtbGVuZ3RoLWhpbnQtcmV0dXJuZWQ6NTI6NDpUaGlyZEJhZExlbmd0aEhpbnQuX19sZW5ndGhfaGludF9fOl9fbGVuZ3RoX2hpbnRfXyBkb2VzIG5vdCByZXR1cm4gbm9uLW5lZ2F0aXZlIGludGVnZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2wvaW52YWxpZF9sZW5ndGhfcmV0dXJuZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX3JldHVybmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWYyOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX3JldHVybmVkLnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIkNoZWNrIGludmFsaWQgdmFsdWUgcmV0dXJuZWQgYnkgX19sZW5fXyAiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtaXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSxpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgc3lzCisKK2ltcG9ydCBzaXgKKworZnJvbSBtaXNzaW5nIGltcG9ydCBNaXNzaW5nCisKKworY2xhc3MgRmlyc3RHb29kTGVuKG9iamVjdCk6CisgICAgIiIiX19sZW5fXyByZXR1cm5zIDx0eXBlICdpbnQnPiIiIgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKworY2xhc3MgU2Vjb25kR29vZExlbihvYmplY3QpOgorICAgICIiIl9fbGVuX18gcmV0dXJucyA8dHlwZSAnbG9uZyc+IiIiCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5tYXhzaXplICsgMQorCisKK2NsYXNzIExlbk1ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19sZW5fXyhjbHMpOgorICAgICAgICByZXR1cm4gMQorCisKK0BzaXguYWRkX21ldGFjbGFzcyhMZW5NZXRhY2xhc3MpCitjbGFzcyBUaGlyZEdvb2RMZW4ob2JqZWN0KToKKyAgICAiIiJMZW5ndGggdGhyb3VnaCB0aGUgbWV0YWNsYXNzLiIiIgorCisKK2NsYXNzIEZpcnN0QmFkTGVuKG9iamVjdCk6CisgICAgIiIiIF9fbGVuX18gcmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgIiIiCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogICMgW2ludmFsaWQtbGVuZ3RoLXJldHVybmVkXQorICAgICAgICByZXR1cm4gLTEKKworCitjbGFzcyBTZWNvbmRCYWRMZW4ob2JqZWN0KToKKyAgICAiIiIgX19sZW5fXyByZXR1cm5zIG5vbi1pbnQgIiIiCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogICMgW2ludmFsaWQtbGVuZ3RoLXJldHVybmVkXQorICAgICAgICByZXR1cm4gMy4wCisKKworY2xhc3MgVGhpcmRCYWRMZW4ob2JqZWN0KToKKyAgICAiIiIgX19sZW5fXyByZXR1cm5zIG5vZGUgd2hpY2ggZG9lcyBub3QgaGF2ZSAndmFsdWUnIGluIEFTVCAiIiIKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOiAgIyBbaW52YWxpZC1sZW5ndGgtcmV0dXJuZWRdCisgICAgICAgIHJldHVybiBsYW1iZGE6IDMKKworCitjbGFzcyBOb25SZWdyZXNzaW9uKG9iamVjdCk6CisgICAgIiIiIF9fbGVuX18gcmV0dXJucyBub3RoaW5nICIiIgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6ICAjIFtpbnZhbGlkLWxlbmd0aC1yZXR1cm5lZF0KKyAgICAgICAgcHJpbnQoMy4wKQorCisKK2NsYXNzIEFtYmlnb3VzTGVuKG9iamVjdCk6CisgICAgIiIiIFVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSAiIiIKKyAgICBfX2xlbl9fID0gbGFtYmRhIHNlbGY6IE1pc3NpbmcKKworCitjbGFzcyBBbm90aGVyQW1iaWd1b3VzTGVuKG9iamVjdCk6CisgICAgIiIiUG90ZW50aWFsIHVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSIiIgorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaW50KE1pc3NpbmcpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX3JldHVybmVkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL2wvaW52YWxpZF9sZW5ndGhfcmV0dXJuZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Yjg2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9sL2ludmFsaWRfbGVuZ3RoX3JldHVybmVkLnR4dApAQCAtMCwwICsxLDQgQEAKK2ludmFsaWQtbGVuZ3RoLXJldHVybmVkOjM4OjQ6Rmlyc3RCYWRMZW4uX19sZW5fXzpfX2xlbl9fIGRvZXMgbm90IHJldHVybiBub24tbmVnYXRpdmUgaW50ZWdlcgoraW52YWxpZC1sZW5ndGgtcmV0dXJuZWQ6NDU6NDpTZWNvbmRCYWRMZW4uX19sZW5fXzpfX2xlbl9fIGRvZXMgbm90IHJldHVybiBub24tbmVnYXRpdmUgaW50ZWdlcgoraW52YWxpZC1sZW5ndGgtcmV0dXJuZWQ6NTI6NDpUaGlyZEJhZExlbi5fX2xlbl9fOl9fbGVuX18gZG9lcyBub3QgcmV0dXJuIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCitpbnZhbGlkLWxlbmd0aC1yZXR1cm5lZDo1OTo0Ok5vblJlZ3Jlc3Npb24uX19sZW5fXzpfX2xlbl9fIGRvZXMgbm90IHJldHVybiBub24tbmVnYXRpdmUgaW50ZWdlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvbS9pbnZhbGlkX21ldGFjbGFzcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL20vaW52YWxpZF9tZXRhY2xhc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlOWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL20vaW52YWxpZF9tZXRhY2xhc3MucHkKQEAgLTAsMCArMSwzNCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIGltcG9ydC1lcnJvcix1bnVzZWQtYXJndW1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2ltcG9ydCBhYmMKKworaW1wb3J0IHNpeAorZnJvbSB1bmtub3duIGltcG9ydCBVbmtub3duCisKKworY2xhc3MgSW52YWxpZEFzTWV0YWNsYXNzKG9iamVjdCk6CisgICAgcGFzcworCisKK2NsYXNzIFZhbGlkQXNNZXRhY2xhc3ModHlwZSk6CisgICAgcGFzcworCisKK0BzaXguYWRkX21ldGFjbGFzcyh0eXBlKQorY2xhc3MgRmlyc3RHb29kKG9iamVjdCk6CisgICAgcGFzcworCisKK0BzaXguYWRkX21ldGFjbGFzcyhhYmMuQUJDTWV0YSkKK2NsYXNzIFNlY29uZEdvb2Qob2JqZWN0KToKKyAgICBwYXNzCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKFVua25vd24pCitjbGFzcyBUaGlyZEdvb2Qob2JqZWN0KToKKyAgICBwYXNzCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKFZhbGlkQXNNZXRhY2xhc3MpCitjbGFzcyBGb3VydGhHb29kKG9iamVjdCk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvbS9pbnZhbGlkX21ldGFjbGFzc19weTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9tL2ludmFsaWRfbWV0YWNsYXNzX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmM0NThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvbS9pbnZhbGlkX21ldGFjbGFzc19weTMucHkKQEAgLTAsMCArMSwxOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIGltcG9ydC1lcnJvcix1bnVzZWQtYXJndW1lbnQKKworZnJvbSB1bmtub3duIGltcG9ydCBVbmtub3duCisKKworZGVmIHZhbGlkX21ldGFjbGFzc18xKG5hbWUsIF8sIGF0dHJzKToKKyAgICByZXR1cm4gdHlwZQorCisKK2RlZiB2YWxpZF9tZXRhY2xhc3NfMihfbmFtZSwgX2Jhc2VzLCBfYXR0cnMpOgorICAgIHJldHVybiBVbmtub3duCisKKworY2xhc3MgR29vZE1ldGFjbGFzcyhtZXRhY2xhc3M9dmFsaWRfbWV0YWNsYXNzXzEpOgorICAgIHBhc3MKKworCitjbGFzcyBTZWNvbmRHb29kTWV0YWNsYXNzKG1ldGFjbGFzcz12YWxpZF9tZXRhY2xhc3NfMik6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvbS9pbnZhbGlkX21ldGFjbGFzc19weTMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9tL2ludmFsaWRfbWV0YWNsYXNzX3B5My5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvbS9pbnZhbGlkX21ldGFjbGFzc19weTMucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc2VxdWVuY2VfaW5kZXgucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc2VxdWVuY2VfaW5kZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExMTU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zZXF1ZW5jZV9pbmRleC5weQpAQCAtMCwwICsxLDI0MiBAQAorIiIiRXJyb3JzIGZvciBpbnZhbGlkIHNlcXVlbmNlIGluZGljZXMiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG5vLXNlbGYtdXNlLCBpbXBvcnQtZXJyb3IsIG1pc3NpbmctZG9jc3RyaW5nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktcGFzcworaW1wb3J0IHNpeAorZnJvbSB1bmtub3duIGltcG9ydCBVbmtub3duCisKK1RFU1RMSVNUID0gWzEsIDIsIDNdCitURVNUVFVQTEUgPSAoMSwgMiwgMykKK1RFU1RTVFIgPSAnMTIzJworCisjIGdldGl0ZW0gdGVzdHMgd2l0aCBiYWQgaW5kaWNlcworZGVmIGZ1bmN0aW9uMSgpOgorICAgICIiImxpc3QgaW5kZXggaXMgYSBmdW5jdGlvbiIiIgorICAgIHJldHVybiBURVNUTElTVFtpZF0gIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KKworZGVmIGZ1bmN0aW9uMigpOgorICAgICIiImxpc3QgaW5kZXggaXMgTm9uZSIiIgorICAgIHJldHVybiBURVNUTElTVFtOb25lXSAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorCitkZWYgZnVuY3Rpb24zKCk6CisgICAgIiIibGlzdCBpbmRleCBpcyBhIGZsb2F0IGV4cHJlc3Npb24iIiIKKyAgICByZXR1cm4gVEVTVExJU1RbZmxvYXQoMCldICMgW2ludmFsaWQtc2VxdWVuY2UtaW5kZXhdCisKK2RlZiBmdW5jdGlvbjQoKToKKyAgICAiIiJsaXN0IGluZGV4IGlzIGEgc3RyIGNvbnN0YW50IiIiCisgICAgcmV0dXJuIFRFU1RMSVNUWycwJ10gIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KKworZGVmIGZ1bmN0aW9uNSgpOgorICAgICIiImxpc3QgaW5kZXggZG9lcyBub3QgaW1wbGVtZW50IF9faW5kZXhfXyIiIgorICAgIGNsYXNzIE5vbkluZGV4VHlwZShvYmplY3QpOgorICAgICAgICAiIiJDbGFzcyB3aXRob3V0IF9faW5kZXhfXyBtZXRob2QiIiIKKyAgICAgICAgcGFzcworCisgICAgcmV0dXJuIFRFU1RMSVNUW05vbkluZGV4VHlwZSgpXSAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorCitkZWYgZnVuY3Rpb242KCk6CisgICAgIiIiVHVwbGUgaW5kZXggaXMgTm9uZSIiIgorICAgIHJldHVybiBURVNUVFVQTEVbTm9uZV0gIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KKworZGVmIGZ1bmN0aW9uNygpOgorICAgICIiIlN0cmluZyBpbmRleCBpcyBOb25lIiIiCisgICAgcmV0dXJuIFRFU1RTVFJbTm9uZV0gIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KKworZGVmIGZ1bmN0aW9uOCgpOgorICAgICIiIkluZGV4IG9mIHN1YmNsYXNzIG9mIHR1cGxlIGlzIE5vbmUiIiIKKyAgICBjbGFzcyBUdXBsZVRlc3QodHVwbGUpOgorICAgICAgICAiIiJTdWJjbGFzcyBvZiB0dXBsZSIiIgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIFR1cGxlVGVzdCgpW05vbmVdICMgW2ludmFsaWQtc2VxdWVuY2UtaW5kZXhdCisKKyMgZ2V0aXRlbSB0ZXN0cyB3aXRoIGdvb2QgaW5kaWNlcworZGVmIGZ1bmN0aW9uOSgpOgorICAgICIiImxpc3QgaW5kZXggaXMgYW4gaW50IGNvbnN0YW50IiIiCisgICAgcmV0dXJuIFRFU1RMSVNUWzBdICAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjEwKCk6CisgICAgIiIibGlzdCBpbmRleCBpcyBhbiBpbnRlZ2VyIGV4cHJlc3Npb24iIiIKKyAgICByZXR1cm4gVEVTVExJU1RbaW50KDAuMCldICMgbm8gZXJyb3IKKworZGVmIGZ1bmN0aW9uMTEoKToKKyAgICAiIiJsaXN0IGluZGV4IGlzIGEgc2xpY2UiIiIKKyAgICByZXR1cm4gVEVTVExJU1Rbc2xpY2UoMSwgMiwgMyldICMgbm8gZXJyb3IKKworZGVmIGZ1bmN0aW9uMTIoKToKKyAgICAiIiJsaXN0IGluZGV4IGltcGxlbWVudHMgX19pbmRleF9fIiIiCisgICAgY2xhc3MgSW5kZXhUeXBlKG9iamVjdCk6CisgICAgICAgICIiIkNsYXNzIHdpdGggX19pbmRleF9fIG1ldGhvZCIiIgorICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgIiIiQWxsb3cgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHRvIGJlIHVzZWQgYXMgc2xpY2UgaW5kaWNlcyIiIgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIHJldHVybiBURVNUTElTVFtJbmRleFR5cGUoKV0gIyBubyBlcnJvcgorCitkZWYgZnVuY3Rpb24xMygpOgorICAgICIiImxpc3QgaW5kZXggaW1wbGVtZW50cyBfX2luZGV4X18gaW4gYSBzdXBlcmNsYXNzIiIiCisgICAgY2xhc3MgSW5kZXhUeXBlKG9iamVjdCk6CisgICAgICAgICIiIkNsYXNzIHdpdGggX19pbmRleF9fIG1ldGhvZCIiIgorICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgIiIiQWxsb3cgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHRvIGJlIHVzZWQgYXMgc2xpY2UgaW5kaWNlcyIiIgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGNsYXNzIEluZGV4U3ViVHlwZShJbmRleFR5cGUpOgorICAgICAgICAiIiJDbGFzcyB3aXRoIF9faW5kZXhfXyBpbiBwYXJlbnQiIiIKKyAgICAgICAgcGFzcworCisgICAgcmV0dXJuIFRFU1RMSVNUW0luZGV4U3ViVHlwZSgpXSAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjE0KCk6CisgICAgIiIiVHVwbGUgaW5kZXggaXMgYW4gaW50IGNvbnN0YW50IiIiCisgICAgcmV0dXJuIFRFU1RUVVBMRVswXQorCitkZWYgZnVuY3Rpb24xNSgpOgorICAgICIiIlN0cmluZyBpbmRleCBpcyBhbiBpbnQgY29uc3RhbnQiIiIKKyAgICByZXR1cm4gVEVTVFNUUlswXQorCitkZWYgZnVuY3Rpb24xNigpOgorICAgICIiIkluZGV4IG9mIHN1YmNsYXNzIG9mIHR1cGxlIGlzIGFuIGludCBjb25zdGFudCIiIgorICAgIGNsYXNzIFR1cGxlVGVzdCh0dXBsZSk6CisgICAgICAgICIiIlN1YmNsYXNzIG9mIHR1cGxlIiIiCisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gVHVwbGVUZXN0KClbMF0gIyBubyBlcnJvcgorCitkZWYgZnVuY3Rpb24xNygpOgorICAgICIiIkluZGV4IG9mIHN1YmNsYXNzIG9mIHR1cGxlIHdpdGggY3VzdG9tIF9fZ2V0aXRlbV9fIGlzIE5vbmUiIiIKKyAgICBjbGFzcyBUdXBsZVRlc3QodHVwbGUpOgorICAgICAgICAiIiJTdWJjbGFzcyBvZiB0dXBsZSB3aXRoIGN1c3RvbSBfX2dldGl0ZW1fXyIiIgorICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgIiIiQWxsb3cgbm9uLWludGVnZXIgaW5kaWNlcyIiIgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICByZXR1cm4gVHVwbGVUZXN0KClbTm9uZV0gIyBubyBlcnJvcgorCitkZWYgZnVuY3Rpb24xOCgpOgorICAgICIiIkluZGV4IG9mIHN1YmNsYXNzIG9mIHR1cGxlIHdpdGggX19nZXRpdGVtX18gaW4gc3VwZXJjbGFzcyBpcyBOb25lIiIiCisgICAgY2xhc3MgVHVwbGVUZXN0KHR1cGxlKToKKyAgICAgICAgIiIiU3ViY2xhc3Mgb2YgdHVwbGUgd2l0aCBjdXN0b20gX19nZXRpdGVtX18iIiIKKyAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICIiIkFsbG93IG5vbi1pbnRlZ2VyIGluZGljZXMiIiIKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICBjbGFzcyBTdWJUdXBsZVRlc3QoVHVwbGVUZXN0KToKKyAgICAgICAgIiIiU3ViY2xhc3Mgb2YgYSBzdWJjbGFzcyBvZiB0dXBsZSIiIgorICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gU3ViVHVwbGVUZXN0KClbTm9uZV0gIyBubyBlcnJvcgorCisjIFRlc3Qgd2l0aCBzZXQgYW5kIGRlbGV0ZSBzdGF0ZW1lbnRzCitkZWYgZnVuY3Rpb24xOSgpOgorICAgICIiIlNldCB3aXRoIE5vbmUgYW5kIGludGVnZXIgaW5kaWNlcyIiIgorICAgIFRFU1RMSVNUW05vbmVdID0gMCAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorICAgIFRFU1RMSVNUWzBdID0gMCAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjIwKCk6CisgICAgIiIiRGVsZXRlIHdpdGggTm9uZSBhbmQgaW50ZWdlciBpbmRpY2llcyIiIgorICAgIGRlbCBURVNUTElTVFtOb25lXSAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorICAgIGRlbCBURVNUTElTVFswXSAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjIxKCk6CisgICAgIiIiU2V0IGFuZCBkZWxldGUgb24gYSBzdWJjbGFzcyBvZiBsaXN0IiIiCisgICAgY2xhc3MgTGlzdFRlc3QobGlzdCk6CisgICAgICAgICIiIkluaGVyaXQgYWxsIGxpc3QgZ2V0L3NldC9kZWwgaGFuZGxlcnMiIiIKKyAgICAgICAgcGFzcworICAgIHRlc3QgPSBMaXN0VGVzdCgpCisKKyAgICAjIFNldCBhbmQgZGVsZXRlIHdpdGggaW52YWxpZCBpbmRpY2VzCisgICAgdGVzdFtOb25lXSA9IDAgIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KKyAgICBkZWwgdGVzdFtOb25lXSAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorCisgICAgIyBTZXQgYW5kIGRlbGV0ZSB3aXRoIHZhbGlkIGluZGljZXMKKyAgICB0ZXN0WzBdID0gMCAjIG5vIGVycm9yCisgICAgZGVsIHRlc3RbMF0gIyBubyBlcnJvcgorCitkZWYgZnVuY3Rpb24yMigpOgorICAgICIiIkdldCwgc2V0LCBhbmQgZGVsZXRlIG9uIGEgc3ViY2xhc3Mgb2YgbGlzdCB0aGF0IG92ZXJyaWRlcyBfX3NldGl0ZW1fXyIiIgorICAgIGNsYXNzIExpc3RUZXN0KGxpc3QpOgorICAgICAgICAiIiJPdmVycmlkZSBzZXRpdGVtIGJ1dCBub3QgZ2V0IG9yIGRlbCIiIgorICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICBwYXNzCisgICAgdGVzdCA9IExpc3RUZXN0KCkKKworICAgICMgZmFpbHVyZSBvbiB0aGUgZ2V0aXRlbSB3aXRoIE5vbmUKKyAgICB0ZXN0W05vbmVdWzBdID0gMCAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorICAgICMgZmFpbHVyZSBvbiB0aGUgZ2V0aXRlbSB3aXRoIE5vbmUKKyAgICBkZWwgdGVzdFtOb25lXSAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorCisgICAgdGVzdFswXVswXSA9IDAgIyBnZXRpdGVtIHdpdGggaW50IGFuZCBzZXRpdGVtIHdpdGggaW50LCBubyBlcnJvcgorICAgIHRlc3RbTm9uZV0gPSAwICMgc2V0aXRlbSBvdmVycmlkZGVuLCBubyBlcnJvcgorICAgIHRlc3RbMF0gPSAwICMgc2V0aXRlbSB3aXRoIGludCwgbm8gZXJyb3IKKyAgICBkZWwgdGVzdFswXSAjIGRlbGl0ZW0gd2l0aCBpbnQsIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjIzKCk6CisgICAgIiIiR2V0LCBzZXQsIGFuZCBkZWxldGUgb24gYSBzdWJjbGFzcyBvZiBsaXN0IHRoYXQgb3ZlcnJpZGVzIF9fZGVsaXRlbV9fIiIiCisgICAgY2xhc3MgTGlzdFRlc3QobGlzdCk6CisgICAgICAgICIiIk92ZXJyaWRlIGRlbGl0ZW0gYnV0IG5vdCBnZXQgb3Igc2V0IiIiCisgICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgcGFzcworICAgIHRlc3QgPSBMaXN0VGVzdCgpCisKKyAgICAjIGZhaWx1cmUgb24gdGhlIGdldGl0ZW0gd2l0aCBOb25lCisgICAgdGVzdFtOb25lXVswXSA9IDAgIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KKyAgICAjIHNldGl0ZW0gd2l0aCBpbnZhbGlkIGluZGV4CisgICAgdGVzdFtOb25lXSA9IDAgICMgW2ludmFsaWQtc2VxdWVuY2UtaW5kZXhdCisKKyAgICB0ZXN0WzBdWzBdID0gMCAjIGdldGl0ZW0gd2l0aCBpbnQgYW5kIHNldGl0ZW0gd2l0aCBpbnQsIG5vIGVycm9yCisgICAgdGVzdFswXSA9IDAgIyBzZXRpdGVtIHdpdGggaW50LCBubyBlcnJvcgorICAgIGRlbCB0ZXN0W05vbmVdICMgZGVsaXRlbSBvdmVycmlkZGVuLCBubyBlcnJvcgorICAgIGRlbCB0ZXN0WzBdICMgZGVsaXRlbSB3aXRoIGludCwgbm8gZXJyb3IKKworZGVmIGZ1bmN0aW9uMjQoKToKKyAgICAiIiJHZXQsIHNldCwgYW5kIGRlbGV0ZSBvbiBhIHN1YmNsYXNzIG9mIGxpc3QgdGhhdCBvdmVycmlkZXMgX19nZXRpdGVtX18iIiIKKyAgICBjbGFzcyBMaXN0VGVzdChsaXN0KToKKyAgICAgICAgIiIiT3ZlcnJpZGUgZ2VsaXRlbSBidXQgbm90IGRlbCBvciBzZXQiIiIKKyAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICBwYXNzCisgICAgdGVzdCA9IExpc3RUZXN0KCkKKworICAgICMgc2V0aXRlbSB3aXRoIGludmFsaWQgaW5kZXgKKyAgICB0ZXN0W05vbmVdID0gMCAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorICAgICMgZGVsaXRlbSB3aXRoIGludmFsaWQgaW5kZXgKKyAgICBkZWwgdGVzdFtOb25lXSAjIFtpbnZhbGlkLXNlcXVlbmNlLWluZGV4XQorCisgICAgdGVzdFtOb25lXVswXSA9IDAgIyBnZXRpdGVtIG92ZXJyaWRkZW4sIG5vIGVycm9yCisgICAgdGVzdFswXVswXSA9IDAgIyBnZXRpdGVtIHdpdGggaW50IGFuZCBzZXRpdGVtIHdpdGggaW50LCBubyBlcnJvcgorICAgIHRlc3RbMF0gPSAwICMgc2V0aXRlbSB3aXRoIGludCwgbm8gZXJyb3IKKyAgICBkZWwgdGVzdFswXSAjIGRlbGl0ZW0gd2l0aCBpbnQsIG5vIGVycm9yCisKKyMgVGVlc3QgRXh0U2xpY2UgdXNhZ2UKK2RlZiBmdW5jdGlvbjI1KCk6CisgICAgIiIiRXh0ZW5kZWQgc2xpY2UgdXNlZCB3aXRoIGEgbGlzdCIiIgorICAgIHJldHVybiBURVNUTElTVFsuLi4sIDBdICMgW2ludmFsaWQtc2VxdWVuY2UtaW5kZXhdCisKK2RlZiBmdW5jdGlvbjI2KCk6CisgICAgIiIiRXh0ZW5kZWQgc2xpY2UgdXNlZCB3aXRoIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgX19nZXRpdGVtX18iIiIKKyAgICBjbGFzcyBFeHRTbGljZVRlc3Qob2JqZWN0KToKKyAgICAgICAgIiIiUGVybWl0IGV4dHNsaWNlIHN5bnRheCBieSBpbXBsZW1lbnRpbmcgX19nZXRpdGVtX18iIiIKKyAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIEV4dFNsaWNlVGVzdCgpWy4uLiwgMF0gIyBubyBlcnJvcgorCitkZWYgZnVuY3Rpb24yNygpOgorICAgICIiIkRvbid0IHdhcm4gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGluZGV4ZWQgb2JqZWN0IGhhcyB1bmtub3duIGJhc2UgY2xhc3Nlcy4iIiIKKyAgICBjbGFzcyBVbmtub3duQmFzZShVbmtub3duKToKKyAgICAgICAgcGFzcworICAgIHNsaWNlcyA9IFVua25vd25CYXNlWyJhYWFhIl0gKyBVbmtub3duQmFzZSgpW29iamVjdF0KKyAgICBleHRfc2xpY2VzID0gVW5rbm93bkJhc2VbLi4uLCAwXSArIFVua25vd25CYXNlKClbLi4uLCAwXQorICAgIHJldHVybiBzbGljZXMsIGV4dF9zbGljZXMKKworCitkZWYgZnVuY3Rpb24yOCgpOgorICAgICIiIkRvbid0IGVtaXQgZm9yIGNsYXNzZXMgd2l0aCB0aGUgcmlnaHQgaW1wbGVtZW50YXRpb24uIiIiCisKKyAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICBkZWYgX19nZXRpdGVtX18oY2xzLCBhcmcpOgorICAgICAgICAgICAgcmV0dXJuIDI0CisKKyAgICBAc2l4LmFkZF9tZXRhY2xhc3MoTWV0YSkKKyAgICBjbGFzcyBXb3JrcyhvYmplY3QpOgorICAgICAgICBwYXNzCisKKyAgICBAc2l4LmFkZF9tZXRhY2xhc3MoTWV0YSkKKyAgICBjbGFzcyBFcnJvcihsaXN0KToKKyAgICAgICAgcGFzcworCisgICAgcmV0dXJuIFdvcmtzWydoZWxsbyddICsgRXJyb3JbJ2hlbGxvJ10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zZXF1ZW5jZV9pbmRleC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc2VxdWVuY2VfaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjFiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc2VxdWVuY2VfaW5kZXgudHh0CkBAIC0wLDAgKzEsMTkgQEAKK2ludmFsaWQtc2VxdWVuY2UtaW5kZXg6MTM6MTE6ZnVuY3Rpb24xOlNlcXVlbmNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIHNsaWNlLCBvciBpbnN0YW5jZSB3aXRoIF9faW5kZXhfXworaW52YWxpZC1zZXF1ZW5jZS1pbmRleDoxNzoxMTpmdW5jdGlvbjI6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjIxOjExOmZ1bmN0aW9uMzpTZXF1ZW5jZSBpbmRleCBpcyBub3QgYW4gaW50LCBzbGljZSwgb3IgaW5zdGFuY2Ugd2l0aCBfX2luZGV4X18KK2ludmFsaWQtc2VxdWVuY2UtaW5kZXg6MjU6MTE6ZnVuY3Rpb240OlNlcXVlbmNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIHNsaWNlLCBvciBpbnN0YW5jZSB3aXRoIF9faW5kZXhfXworaW52YWxpZC1zZXF1ZW5jZS1pbmRleDozMzoxMTpmdW5jdGlvbjU6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjM3OjExOmZ1bmN0aW9uNjpTZXF1ZW5jZSBpbmRleCBpcyBub3QgYW4gaW50LCBzbGljZSwgb3IgaW5zdGFuY2Ugd2l0aCBfX2luZGV4X18KK2ludmFsaWQtc2VxdWVuY2UtaW5kZXg6NDE6MTE6ZnVuY3Rpb243OlNlcXVlbmNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIHNsaWNlLCBvciBpbnN0YW5jZSB3aXRoIF9faW5kZXhfXworaW52YWxpZC1zZXF1ZW5jZS1pbmRleDo0ODoxMTpmdW5jdGlvbjg6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjEyODo0OmZ1bmN0aW9uMTk6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjEzMzo4OmZ1bmN0aW9uMjA6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE0NDo0OmZ1bmN0aW9uMjE6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE0NTo4OmZ1bmN0aW9uMjE6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE2MDo0OmZ1bmN0aW9uMjI6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE2Mjo4OmZ1bmN0aW9uMjI6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE3ODo0OmZ1bmN0aW9uMjM6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE4MDo0OmZ1bmN0aW9uMjM6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE5Njo0OmZ1bmN0aW9uMjQ6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjE5ODo4OmZ1bmN0aW9uMjQ6U2VxdWVuY2UgaW5kZXggaXMgbm90IGFuIGludCwgc2xpY2UsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNlcXVlbmNlLWluZGV4OjIwODoxMTpmdW5jdGlvbjI1OlNlcXVlbmNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIHNsaWNlLCBvciBpbnN0YW5jZSB3aXRoIF9faW5kZXhfXwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvcy9pbnZhbGlkX3NsaWNlX2luZGV4LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvcy9pbnZhbGlkX3NsaWNlX2luZGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjJmZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc2xpY2VfaW5kZXgucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiRXJyb3JzIGZvciBpbnZhbGlkIHNsaWNlIGluZGljZXMiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG5vLXNlbGYtdXNlLG1pc3NpbmctZG9jc3RyaW5nLGV4cHJlc3Npb24tbm90LWFzc2lnbmVkLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktcGFzcworCisKK1RFU1RMSVNUID0gWzEsIDIsIDNdCisKKyMgSW52YWxpZCBpbmRpY2VzCitkZWYgZnVuY3Rpb24xKCk6CisgICAgIiIiZnVuY3Rpb25zIHVzZWQgYXMgaW5kaWNlcyIiIgorICAgIHJldHVybiBURVNUTElTVFtpZDppZDpdICAjIFtpbnZhbGlkLXNsaWNlLWluZGV4LGludmFsaWQtc2xpY2UtaW5kZXhdCisKK2RlZiBmdW5jdGlvbjIoKToKKyAgICAiIiJzdHJpbmdzIHVzZWQgYXMgaW5kaWNlcyIiIgorICAgIHJldHVybiBURVNUTElTVFsnMCc6JzEnOl0gICMgW2ludmFsaWQtc2xpY2UtaW5kZXgsaW52YWxpZC1zbGljZS1pbmRleF0KKworZGVmIGZ1bmN0aW9uMygpOgorICAgICIiImNsYXNzIHdpdGhvdXQgX19pbmRleF9fIHVzZWQgYXMgaW5kZXgiIiIKKworICAgIGNsYXNzIE5vSW5kZXhUZXN0KG9iamVjdCk6CisgICAgICAgICIiIkNsYXNzIHdpdGggbm8gX19pbmRleF9fIG1ldGhvZCIiIgorICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gVEVTVExJU1RbTm9JbmRleFRlc3QoKTo6XSAgIyBbaW52YWxpZC1zbGljZS1pbmRleF0KKworIyBWYWxpZCBpbmRpY2VzCitkZWYgZnVuY3Rpb240KCk6CisgICAgIiIiaW50ZWdlcnMgdXNlZCBhcyBpbmRpY2VzIiIiCisgICAgcmV0dXJuIFRFU1RMSVNUWzA6MDowXSAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjUoKToKKyAgICAiIiJOb25lIHVzZWQgYXMgaW5kaWNlcyIiIgorICAgIHJldHVybiBURVNUTElTVFtOb25lOk5vbmU6Tm9uZV0gIyBubyBlcnJvcgorCitkZWYgZnVuY3Rpb242KCk6CisgICAgIiIiY2xhc3Mgd2l0aCBfX2luZGV4X18gdXNlZCBhcyBpbmRleCIiIgorICAgIGNsYXNzIEluZGV4VGVzdChvYmplY3QpOgorICAgICAgICAiIiJDbGFzcyB3aXRoIF9faW5kZXhfXyBtZXRob2QiIiIKKyAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICIiIkFsbG93IG9iamVjdHMgb2YgdGhpcyBjbGFzcyB0byBiZSB1c2VkIGFzIHNsaWNlIGluZGljZXMiIiIKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICByZXR1cm4gVEVTVExJU1RbSW5kZXhUZXN0KCk6Tm9uZTpOb25lXSAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjcoKToKKyAgICAiIiJjbGFzcyB3aXRoIF9faW5kZXhfXyBpbiBzdXBlcmNsYXNzIHVzZWQgYXMgaW5kZXgiIiIKKyAgICBjbGFzcyBJbmRleFR5cGUob2JqZWN0KToKKyAgICAgICAgIiIiQ2xhc3Mgd2l0aCBfX2luZGV4X18gbWV0aG9kIiIiCisgICAgICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgICAgICAiIiJBbGxvdyBvYmplY3RzIG9mIHRoaXMgY2xhc3MgdG8gYmUgdXNlZCBhcyBzbGljZSBpbmRpY2VzIiIiCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgY2xhc3MgSW5kZXhTdWJUeXBlKEluZGV4VHlwZSk6CisgICAgICAgICIiIkNsYXNzIHdpdGggX19pbmRleF9fIGluIHBhcmVudCIiIgorICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gVEVTVExJU1RbSW5kZXhTdWJUeXBlKCk6Tm9uZTpOb25lXSAjIG5vIGVycm9yCisKK2RlZiBmdW5jdGlvbjgoKToKKyAgICAiIiJzbGljZSBvYmplY3QgdXNlZCBhcyBpbmRleCIiIgorICAgIHJldHVybiBURVNUTElTVFtzbGljZSgxLCAyLCAzKV0gIyBubyBlcnJvcgorCisKK2RlZiBmdW5jdGlvbjkoKToKKyAgICAiIiJVc2UgYSBjdXN0b20gY2xhc3MgdGhhdCBrbm93cyBob3cgdG8gaGFuZGxlIHN0cmluZyBzbGljZXMiIiIKKyAgICBjbGFzcyBTdHJpbmdTbGljZToKKyAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pOgorICAgICAgICAgICAgcmV0dXJuIGl0ZW0KKworICAgIFN0cmluZ1NsaWNlKClbImEiOiJiIjoiYyJdCisgICAgU3RyaW5nU2xpY2UoKVsiYSI6ImIiOiJjIiwgImEiOiJiIl0KKyAgICBTdHJpbmdTbGljZSgpW3NsaWNlKCJhIiwgImIiLCAiYyIpXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvcy9pbnZhbGlkX3NsaWNlX2luZGV4LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zbGljZV9pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxNTEzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zbGljZV9pbmRleC50eHQKQEAgLTAsMCArMSw1IEBACitpbnZhbGlkLXNsaWNlLWluZGV4OjEwOjA6ZnVuY3Rpb24xOlNsaWNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIE5vbmUsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNsaWNlLWluZGV4OjEwOjA6ZnVuY3Rpb24xOlNsaWNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIE5vbmUsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNsaWNlLWluZGV4OjE0OjA6ZnVuY3Rpb24yOlNsaWNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIE5vbmUsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNsaWNlLWluZGV4OjE0OjA6ZnVuY3Rpb24yOlNsaWNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIE5vbmUsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCitpbnZhbGlkLXNsaWNlLWluZGV4OjIzOjA6ZnVuY3Rpb24zOlNsaWNlIGluZGV4IGlzIG5vdCBhbiBpbnQsIE5vbmUsIG9yIGluc3RhbmNlIHdpdGggX19pbmRleF9fCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc3Rhcl9hc3NpZ25tZW50X3RhcmdldC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdGFyX2Fzc2lnbm1lbnRfdGFyZ2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MmY5YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc3Rhcl9hc3NpZ25tZW50X3RhcmdldC5weQpAQCAtMCwwICsxLDQgQEAKKyIiIlRlc3QgZm9yICphID0gYiAiIiINCisNCisqRklSU1QgPSBbMSwgMiwgM10gIyBbaW52YWxpZC1zdGFyLWFzc2lnbm1lbnQtdGFyZ2V0XQ0KKygqRklSU1QsICkgPSBbMSwgMiwgM10NCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc3Rhcl9hc3NpZ25tZW50X3RhcmdldC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdGFyX2Fzc2lnbm1lbnRfdGFyZ2V0LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc3Rhcl9hc3NpZ25tZW50X3RhcmdldC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdGFyX2Fzc2lnbm1lbnRfdGFyZ2V0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdGFyX2Fzc2lnbm1lbnRfdGFyZ2V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjlmMjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvcy9pbnZhbGlkX3N0YXJfYXNzaWdubWVudF90YXJnZXQudHh0CkBAIC0wLDAgKzEgQEAKK2ludmFsaWQtc3Rhci1hc3NpZ25tZW50LXRhcmdldDozOjA6OlN0YXJyZWQgYXNzaWdubWVudCB0YXJnZXQgbXVzdCBiZSBpbiBhIGxpc3Qgb3IgdHVwbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdHJfcmV0dXJuZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc3RyX3JldHVybmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaW52YWxpZC9zL2ludmFsaWRfc3RyX3JldHVybmVkLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyIiIkNoZWNrIGludmFsaWQgdmFsdWUgcmV0dXJuZWQgYnkgX19zdHJfXyAiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxtaXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSxpbXBvcnQtZXJyb3IsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgc2l4CisKK2Zyb20gbWlzc2luZyBpbXBvcnQgTWlzc2luZworCisKK2NsYXNzIEZpcnN0R29vZFN0cihvYmplY3QpOgorICAgICIiIl9fc3RyX18gcmV0dXJucyA8dHlwZSAnc3RyJz4iIiIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gInNvbWUgc3RyIgorCisKK2NsYXNzIFNlY29uZEdvb2RTdHIob2JqZWN0KToKKyAgICAiIiJfX3N0cl9fIHJldHVybnMgPHR5cGUgJ3N0cic+IiIiCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cigxMjMpCisKKworY2xhc3MgU3RyTWV0YWNsYXNzKHR5cGUpOgorICAgIGRlZiBfX3N0cl9fKGNscyk6CisgICAgICAgIHJldHVybiAic29tZSBzdHIiCisKKworQHNpeC5hZGRfbWV0YWNsYXNzKFN0ck1ldGFjbGFzcykKK2NsYXNzIFRoaXJkR29vZFN0cihvYmplY3QpOgorICAgICIiIlN0ciB0aHJvdWdoIHRoZSBtZXRhY2xhc3MuIiIiCisKKworY2xhc3MgRmlyc3RCYWRTdHIob2JqZWN0KToKKyAgICAiIiIgX19zdHJfXyByZXR1cm5zIGJ5dGVzICIiIgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6ICAjIFtpbnZhbGlkLXN0ci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIGIiMTIzIgorCisKK2NsYXNzIFNlY29uZEJhZFN0cihvYmplY3QpOgorICAgICIiIiBfX3N0cl9fIHJldHVybnMgaW50ICIiIgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6ICAjIFtpbnZhbGlkLXN0ci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIDEKKworCitjbGFzcyBUaGlyZEJhZFN0cihvYmplY3QpOgorICAgICIiIiBfX3N0cl9fIHJldHVybnMgbm9kZSB3aGljaCBkb2VzIG5vdCBoYXZlICd2YWx1ZScgaW4gQVNUICIiIgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6ICAjIFtpbnZhbGlkLXN0ci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIGxhbWJkYTogInNvbWUgc3RyIgorCisKK2NsYXNzIEFtYmlndW91c1N0cihvYmplY3QpOgorICAgICIiIiBVbmluZmVyYWJsZSByZXR1cm4gdmFsdWUgIiIiCisKKyAgICBfX3N0cl9fID0gbGFtYmRhIHNlbGY6IE1pc3NpbmcKKworCitjbGFzcyBBbm90aGVyQW1iaWd1b3VzU3RyKG9iamVjdCk6CisgICAgIiIiUG90ZW50aWFsIHVuaW5mZXJhYmxlIHJldHVybiB2YWx1ZSIiIgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoTWlzc2luZykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdHJfcmV0dXJuZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2ludmFsaWQvcy9pbnZhbGlkX3N0cl9yZXR1cm5lZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pbnZhbGlkL3MvaW52YWxpZF9zdHJfcmV0dXJuZWQudHh0CkBAIC0wLDAgKzEsMyBAQAoraW52YWxpZC1zdHItcmV0dXJuZWQ6MzY6NDpGaXJzdEJhZFN0ci5fX3N0cl9fOl9fc3RyX18gZG9lcyBub3QgcmV0dXJuIHN0cgoraW52YWxpZC1zdHItcmV0dXJuZWQ6NDM6NDpTZWNvbmRCYWRTdHIuX19zdHJfXzpfX3N0cl9fIGRvZXMgbm90IHJldHVybiBzdHIKK2ludmFsaWQtc3RyLXJldHVybmVkOjUwOjQ6VGhpcmRCYWRTdHIuX19zdHJfXzpfX3N0cl9fIGRvZXMgbm90IHJldHVybiBzdHIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pc2luc3RhbmNlX3NlY29uZF9hcmd1bWVudC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pc2luc3RhbmNlX3NlY29uZF9hcmd1bWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjMyY2JmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2lzaW5zdGFuY2Vfc2Vjb25kX2FyZ3VtZW50LnB5CkBAIC0wLDAgKzEsMzEgQEAKKyNweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHVuZGVmaW5lZC12YXJpYWJsZSwgaW52YWxpZC1uYW1lLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB3cm9uZy1pbXBvcnQtcG9zaXRpb24saW1wb3J0LWVycm9yCisKK2ltcG9ydCBjb2xsZWN0aW9ucworZnJvbSB1bmtub3duIGltcG9ydCBVbmtub3duCisKKyMgUG9zaXRpdmUgdGVzdCBjYXNlcworY2xhc3MgQToKKyAgICBwYXNzCisKK2NsYXNzIEIoQSk6CisgICAgcGFzcworCitpc2luc3RhbmNlKEEoKSwgQSkKK2lzaW5zdGFuY2UoQSgpLCBCKQorCitpc2luc3RhbmNlKC05OTk5LCBpbnQpCitpc2luc3RhbmNlKFRydWUgYW5kIEZhbHNlLCBib29sKQoraXNpbnN0YW5jZSgiYSAnc3RyaW5nJyIsIHR5cGUoInRlc3QiKSkKKworaXNpbnN0YW5jZSgzLjEyMzIxMywgY29sbGVjdGlvbnMuT3JkZXJlZERpY3QpCitpc2luc3RhbmNlKGZvbywgKGludCwgY29sbGVjdGlvbnMuQ291bnRlcikpCitpc2luc3RhbmNlKCJhIHN0cmluZyIsICgoaW50LCB0eXBlKEZhbHNlKSksIChmbG9hdCwgc2V0KSwgc3RyKSkKK2lzaW5zdGFuY2UoMTAsIChpbnQsKSArIChzdHIsIGJvb2wpICsgKGRpY3QsIGxpc3QsIHR1cGxlKSkKK2lzaW5zdGFuY2UoMTAsIHR1cGxlKFVua25vd24pKQorCisjIE5lZ2F0aXZlIHRlc3QgY2FzZXMKK2lzaW5zdGFuY2Uoe2E6MX0sIGhhc2gpICMgW2lzaW5zdGFuY2Utc2Vjb25kLWFyZ3VtZW50LW5vdC12YWxpZC10eXBlXQoraXNpbnN0YW5jZSg2NCwgaGV4KSAjIFtpc2luc3RhbmNlLXNlY29uZC1hcmd1bWVudC1ub3QtdmFsaWQtdHlwZV0KK2lzaW5zdGFuY2Uoe2I6IDEwMH0sIChoYXNoLCBkaWN0KSkgIyBbaXNpbnN0YW5jZS1zZWNvbmQtYXJndW1lbnQtbm90LXZhbGlkLXR5cGVdCitpc2luc3RhbmNlKCJzdHJpbmciLCAoKGRpY3QsIGl0ZXIpLCBzdHIsIChpbnQsIGJvb2wpKSkgIyBbaXNpbnN0YW5jZS1zZWNvbmQtYXJndW1lbnQtbm90LXZhbGlkLXR5cGVdCitpc2luc3RhbmNlKGludCwgMSkgIyBbaXNpbnN0YW5jZS1zZWNvbmQtYXJndW1lbnQtbm90LXZhbGlkLXR5cGVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaXNpbnN0YW5jZV9zZWNvbmRfYXJndW1lbnQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2lzaW5zdGFuY2Vfc2Vjb25kX2FyZ3VtZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYwZGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2lzaW5zdGFuY2Vfc2Vjb25kX2FyZ3VtZW50LnR4dApAQCAtMCwwICsxLDUgQEAKK2lzaW5zdGFuY2Utc2Vjb25kLWFyZ3VtZW50LW5vdC12YWxpZC10eXBlOjI3OjA6OlNlY29uZCBhcmd1bWVudCBvZiBpc2luc3RhbmNlIGlzIG5vdCBhIHR5cGUKK2lzaW5zdGFuY2Utc2Vjb25kLWFyZ3VtZW50LW5vdC12YWxpZC10eXBlOjI4OjA6OlNlY29uZCBhcmd1bWVudCBvZiBpc2luc3RhbmNlIGlzIG5vdCBhIHR5cGUKK2lzaW5zdGFuY2Utc2Vjb25kLWFyZ3VtZW50LW5vdC12YWxpZC10eXBlOjI5OjA6OlNlY29uZCBhcmd1bWVudCBvZiBpc2luc3RhbmNlIGlzIG5vdCBhIHR5cGUKK2lzaW5zdGFuY2Utc2Vjb25kLWFyZ3VtZW50LW5vdC12YWxpZC10eXBlOjMwOjA6OlNlY29uZCBhcmd1bWVudCBvZiBpc2luc3RhbmNlIGlzIG5vdCBhIHR5cGUKK2lzaW5zdGFuY2Utc2Vjb25kLWFyZ3VtZW50LW5vdC12YWxpZC10eXBlOjMxOjA6OlNlY29uZCBhcmd1bWVudCBvZiBpc2luc3RhbmNlIGlzIG5vdCBhIHR5cGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmZWZkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0LnB5CkBAIC0wLDAgKzEsMTkyIEBACisiIiIKK0NoZWNrcyB0aGF0IHByaW1pdGl2ZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGluIGFuCitpdGVyYXRpbmcvbWFwcGluZyBjb250ZXh0LgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxuby1pbml0LG5vLXNlbGYtdXNlLGltcG9ydC1lcnJvcix1bnVzZWQtYXJndW1lbnQsYmFkLW1jcy1tZXRob2QtYXJndW1lbnQsd3JvbmctaW1wb3J0LXBvc2l0aW9uLG5vLWVsc2UtcmV0dXJuLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCisjIHByaW1pdGl2ZXMKK251bWJlcnMgPSBbMSwgMiwgM10KKworZm9yIGkgaW4gbnVtYmVyczoKKyAgICBwYXNzCisKK2ZvciBpIGluIGl0ZXIobnVtYmVycyk6CisgICAgcGFzcworCitmb3IgaSBpbiAiMTIzIjoKKyAgICBwYXNzCisKK2ZvciBpIGluIHUiMTIzIjoKKyAgICBwYXNzCisKK2ZvciBpIGluIGIiMTIzIjoKKyAgICBwYXNzCisKK2ZvciBpIGluIGJ5dGVhcnJheShiIjEyMyIpOgorICAgIHBhc3MKKworZm9yIGkgaW4gc2V0KG51bWJlcnMpOgorICAgIHBhc3MKKworZm9yIGkgaW4gZnJvemVuc2V0KG51bWJlcnMpOgorICAgIHBhc3MKKworZm9yIGkgaW4gZGljdChhPTEsIGI9Mik6CisgICAgcGFzcworCisjIGNvbXByZWhlbnNpb25zCitmb3IgaSBpbiBbeCBmb3IgeCBpbiByYW5nZSgxMCldOgorICAgIHBhc3MKKworZm9yIGkgaW4ge3ggZm9yIHggaW4gcmFuZ2UoMSwgMTAwLCAyKX06CisgICAgcGFzcworCitmb3IgaSBpbiB7eDogMTAgLSB4IGZvciB4IGluIHJhbmdlKDEwKX06CisgICAgcGFzcworCisjIGdlbmVyYXRvcnMKK2RlZiBwb3dlcnNfb2ZfdHdvKCk6CisgICAgayA9IDAKKyAgICB3aGlsZSBrIDwgMTA6CisgICAgICAgIHlpZWxkIDIgKiogaworICAgICAgICBrICs9IDEKKworZm9yIGkgaW4gcG93ZXJzX29mX3R3bygpOgorICAgIHBhc3MKKworZm9yIGkgaW4gcG93ZXJzX29mX3R3bzogICMgW25vdC1hbi1pdGVyYWJsZV0KKyAgICBwYXNzCisKKyMgY2hlY2sgZm9yIGN1c3RvbSBpdGVyYXRvcnMKK2NsYXNzIEEob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIEIob2JqZWN0KToKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKworY2xhc3MgQyhvYmplY3QpOgorICAgICJvbGQtc3R5bGUgaXRlcmF0b3IiCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGspOgorICAgICAgICBpZiBrID4gMTA6CisgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgIHJldHVybiBrICsgMQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAxMAorCitmb3IgaSBpbiBDKCk6CisgICAgcHJpbnQoaSkKKworCitkZWYgdGVzdCgqYXJncyk6CisgICAgcHJpbnQoYXJncykKKworCit0ZXN0KCpBKCkpICAjIFtub3QtYW4taXRlcmFibGVdCit0ZXN0KCpCKCkpCit0ZXN0KCpCKSAgIyBbbm90LWFuLWl0ZXJhYmxlXQorZm9yIGkgaW4gQSgpOiAgIyBbbm90LWFuLWl0ZXJhYmxlXQorICAgIHBhc3MKK2ZvciBpIGluIEIoKToKKyAgICBwYXNzCitmb3IgaSBpbiBCOiAgIyBbbm90LWFuLWl0ZXJhYmxlXQorICAgIHBhc3MKKworZm9yIGkgaW4gcmFuZ2U6ICAjIFtub3QtYW4taXRlcmFibGVdCisgICAgcGFzcworCisjIGNoZWNrIHRoYXQgcHJpbWl0aXZlIG5vbi1pdGVyYWJsZSB0eXBlcyBhcmUgY2F1Z2h0Citmb3IgaSBpbiBUcnVlOiAgIyBbbm90LWFuLWl0ZXJhYmxlXQorICAgIHBhc3MKKworZm9yIGkgaW4gTm9uZTogICMgW25vdC1hbi1pdGVyYWJsZV0KKyAgICBwYXNzCisKK2ZvciBpIGluIDguNTogICMgW25vdC1hbi1pdGVyYWJsZV0KKyAgICBwYXNzCisKK2ZvciBpIGluIDEwOiAgIyBbbm90LWFuLWl0ZXJhYmxlXQorICAgIHBhc3MKKworCisjIHNraXAgdW5pbmZlcmFibGUgaW5zdGFuY2VzCitmcm9tIHNvbWVfbWlzc2luZ19tb2R1bGUgaW1wb3J0IEl0ZXJhYmxlCisKK2NsYXNzIE15Q2xhc3MoSXRlcmFibGUpOgorICAgIHBhc3MKKworbSA9IE15Q2xhc3MoKQorZm9yIGkgaW4gbToKKyAgICBwcmludChpKQorCisjIHNraXAgY2hlY2tzIGlmIHN0YXRlbWVudCBpcyBpbnNpZGUgbWl4aW4vYmFzZS9hYnN0cmFjdCBjbGFzcworY2xhc3MgTWFuYWdlZEFjY2Vzc1ZpZXdNaXhpbihvYmplY3QpOgorICAgIGFjY2Vzc19yZXF1aXJlbWVudHMgPSBOb25lCisKKyAgICBkZWYgZ2V0X2FjY2Vzc19yZXF1aXJlbWVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFjY2Vzc19yZXF1aXJlbWVudHMKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CisgICAgICAgIGtsYXNzZXMgPSBzZWxmLmdldF9hY2Nlc3NfcmVxdWlyZW1lbnRzKCkKKworICAgICAgICAjIG5vIGVycm9yIHNob3VsZCBiZSBlbWl0dGVkIGhlcmUKKyAgICAgICAgZm9yIHJlcXVpcmVtZW50IGluIGtsYXNzZXM6CisgICAgICAgICAgICBwcmludChyZXF1aXJlbWVudCkKKworY2xhc3MgQmFzZVR5cGUob2JqZWN0KToKKyAgICB2YWxpZF92YWx1ZXMgPSBOb25lCisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLnZhbGlkX3ZhbHVlcyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZXJyb3Igc2hvdWxkIG5vdCBiZSBlbWl0dGVkIGhlcmUKKyAgICAgICAgICAgIGZvciB2IGluIHNlbGYudmFsaWRfdmFsdWVzOgorICAgICAgICAgICAgICAgIGlmIHZhbHVlID09IHY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgQWJzdHJhY3RVcmxNYXJrTWFuYWdlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGluZXBhcnNlciA9IE5vbmUKKyAgICAgICAgc2VsZi5faW5pdF9saW5lcGFyc2VyKCkKKyAgICAgICAgIyBlcnJvciBzaG91bGQgbm90IGJlIGVtaXR0ZWQgaGVyZQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9saW5lcGFyc2VyOgorICAgICAgICAgICAgcHJpbnQobGluZSkKKworICAgIGRlZiBfaW5pdF9saW5lcGFyc2VyKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyMgY2xhc3MgaXMgbm90IG5hbWVkIGFzIGFic3RyYWN0CisjIGJ1dCBzdGlsbCBpcyBkZWR1Y2VhYmx5IGFic3RyYWN0CitjbGFzcyBVcmxNYXJrTWFuYWdlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGluZXBhcnNlciA9IE5vbmUKKyAgICAgICAgc2VsZi5faW5pdF9saW5lcGFyc2VyKCkKKyAgICAgICAgIyBlcnJvciBzaG91bGQgbm90IGJlIGVtaXR0ZWQgaGVyZQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9saW5lcGFyc2VyOgorICAgICAgICAgICAgcHJpbnQobGluZSkKKworICAgIGRlZiBfaW5pdF9saW5lcGFyc2VyKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgSGFzRHluYW1pY0dldGF0dHIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fb2JqID0gW10KKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fb2JqLCBhdHRyKQorCisKK2ZvciBlbGVtIGluIEhhc0R5bmFtaWNHZXRhdHRyKCk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzkxYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaXRlcmFibGVfY29udGV4dC50eHQKQEAgLTAsMCArMSwxMCBAQAorbm90LWFuLWl0ZXJhYmxlOjU4Ojk6Ok5vbi1pdGVyYWJsZSB2YWx1ZSBwb3dlcnNfb2ZfdHdvIGlzIHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQKK25vdC1hbi1pdGVyYWJsZTo5Mzo2OjpOb24taXRlcmFibGUgdmFsdWUgQSgpIGlzIHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQKK25vdC1hbi1pdGVyYWJsZTo5NTo2OjpOb24taXRlcmFibGUgdmFsdWUgQiBpcyB1c2VkIGluIGFuIGl0ZXJhdGluZyBjb250ZXh0Citub3QtYW4taXRlcmFibGU6OTY6OTo6Tm9uLWl0ZXJhYmxlIHZhbHVlIEEoKSBpcyB1c2VkIGluIGFuIGl0ZXJhdGluZyBjb250ZXh0Citub3QtYW4taXRlcmFibGU6MTAwOjk6Ok5vbi1pdGVyYWJsZSB2YWx1ZSBCIGlzIHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQKK25vdC1hbi1pdGVyYWJsZToxMDM6OTo6Tm9uLWl0ZXJhYmxlIHZhbHVlIHJhbmdlIGlzIHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQKK25vdC1hbi1pdGVyYWJsZToxMDc6OTo6Tm9uLWl0ZXJhYmxlIHZhbHVlIFRydWUgaXMgdXNlZCBpbiBhbiBpdGVyYXRpbmcgY29udGV4dAorbm90LWFuLWl0ZXJhYmxlOjExMDo5OjpOb24taXRlcmFibGUgdmFsdWUgTm9uZSBpcyB1c2VkIGluIGFuIGl0ZXJhdGluZyBjb250ZXh0Citub3QtYW4taXRlcmFibGU6MTEzOjk6Ok5vbi1pdGVyYWJsZSB2YWx1ZSA4LjUgaXMgdXNlZCBpbiBhbiBpdGVyYXRpbmcgY29udGV4dAorbm90LWFuLWl0ZXJhYmxlOjExNjo5OjpOb24taXRlcmFibGUgdmFsdWUgMTAgaXMgdXNlZCBpbiBhbiBpdGVyYXRpbmcgY29udGV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDQ3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2kvaXRlcmFibGVfY29udGV4dF9weTMucHkKQEAgLTAsMCArMSw1NSBAQAorIiIiCitDaGVja3MgdGhhdCBpdGVyYWJsZSBtZXRhY2xhc3NlcyBhcmUgcmVjb2duaXplZCBieSBweWxpbnQuCisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsbm8taW5pdCxuby1zZWxmLXVzZSx1bnVzZWQtYXJndW1lbnQsYmFkLW1jcy1tZXRob2QtYXJndW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPXdyb25nLWltcG9ydC1wb3NpdGlvbgorIyBtZXRhY2xhc3NlcyBhcyBpdGVyYWJsZXMKK2NsYXNzIE1ldGEodHlwZSk6CisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaXRlcigoMSwgMiwgMykpCisKK2NsYXNzIFNvbWVDbGFzcyhtZXRhY2xhc3M9TWV0YSk6CisgICAgcGFzcworCisKK2ZvciBpIGluIFNvbWVDbGFzczoKKyAgICBwcmludChpKQorZm9yIGkgaW4gU29tZUNsYXNzKCk6ICAjIFtub3QtYW4taXRlcmFibGVdCisgICAgcHJpbnQoaSkKKworCitpbXBvcnQgYXN5bmNpbworCisKK0Bhc3luY2lvLmNvcm91dGluZQorZGVmIGNvcm91dGluZV9mdW5jdGlvbl9yZXR1cm5fbm9uZSgpOgorICAgIHJldHVybgorCisKK0Bhc3luY2lvLmNvcm91dGluZQorZGVmIGNvcm91dGluZV9mdW5jdGlvbl9yZXR1cm5fb2JqZWN0KCk6CisgICAgcmV0dXJuIDEyCisKKworQGFzeW5jaW8uY29yb3V0aW5lCitkZWYgY29yb3V0aW5lX2Z1bmN0aW9uX3JldHVybl9mdXR1cmUoKToKKyAgICByZXR1cm4gYXN5bmNpby5GdXR1cmUoKQorCisKK0Bhc3luY2lvLmNvcm91dGluZQorZGVmIGNvcm91dGluZV9mdW5jdGlvbl9wYXNzKCk6CisgICAgcGFzcworCisKK0Bhc3luY2lvLmNvcm91dGluZQorZGVmIGNvcm91dGluZV9nZW5lcmF0b3IoKToKKyAgICB5aWVsZAorCisKK0Bhc3luY2lvLmNvcm91dGluZQorZGVmIG1haW4oKToKKyAgICB5aWVsZCBmcm9tIGNvcm91dGluZV9mdW5jdGlvbl9yZXR1cm5fbm9uZSgpCisgICAgeWllbGQgZnJvbSBjb3JvdXRpbmVfZnVuY3Rpb25fcmV0dXJuX29iamVjdCgpCisgICAgeWllbGQgZnJvbSBjb3JvdXRpbmVfZnVuY3Rpb25fcmV0dXJuX2Z1dHVyZSgpCisgICAgeWllbGQgZnJvbSBjb3JvdXRpbmVfZnVuY3Rpb25fcGFzcygpCisgICAgeWllbGQgZnJvbSBjb3JvdXRpbmVfZ2VuZXJhdG9yKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0X3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0X3B5My5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0X3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4NDlkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0X3B5My50eHQKQEAgLTAsMCArMSBAQAorbm90LWFuLWl0ZXJhYmxlOjE3Ojk6Ok5vbi1pdGVyYWJsZSB2YWx1ZSBTb21lQ2xhc3MoKSBpcyB1c2VkIGluIGFuIGl0ZXJhdGluZyBjb250ZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaXRlcmFibGVfY29udGV4dF9weTM2LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTBkM2RhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzNi5weQpAQCAtMCwwICsxLDQxIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLHVudXNlZC12YXJpYWJsZSx1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uCitpbXBvcnQgYXN5bmNpbworCitjbGFzcyBBSXRlcjoKKyAgICBhc3luYyBkZWYgX19haXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgdmFsdWUgaW4gcmFuZ2UoMjApOgorICAgICAgICAgICAgeWllbGQgdmFsdWUKKworICAgIGFzeW5jIGRlZiB0b19saXN0KHNlbGYpOgorICAgICAgICB2YWx1ZXMgPSBbbSBhc3luYyBmb3IgbSBpbiBzZWxmXQorICAgICAgICBvdGhlcl92YWx1ZXMgPSBbbSBmb3IgbSBpbiBzZWxmXSAjIFtub3QtYW4taXRlcmFibGVdCisgICAgICAgIGZvciB2YWx1ZSBpbiBzZWxmOiAjIFtub3QtYW4taXRlcmFibGVdCisgICAgICAgICAgICB5aWVsZCB2YWx1ZQorICAgICAgICBhc3luYyBmb3IgdmFsdWUgaW4gc2VsZjoKKyAgICAgICAgICAgIHlpZWxkIHZhbHVlCisKKworYXN5bmMgZGVmIHNvbWVfaXRlcl9mdW5jKG51bWJlcik6CisgICAgIiIiIGVtaXRzIDEgbnVtYmVyIHBlciBzZWNvbmQgICIiIgorICAgIGZvciBpIGluIHJhbmdlKDEsIG51bWJlcik6CisgICAgICAgIHlpZWxkIGkKKyAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKQorCisKK2FzeW5jIGRlZiBjb3VudF90byhudW1iZXIpOgorICAgICIiIiBjb3VudHMgdG8gbiBpbiBhc3luYyBtYW5uZXIiIiIKKyAgICBhc3luYyBmb3IgaSBpbiBzb21lX2l0ZXJfZnVuYyhudW1iZXIpOgorICAgICAgICBwcmludChpKQorCisKK2FzeW5jIGRlZiBnZW5fdmFsdWVzKG51bV92YWx1ZXMpOgorICAgIGZvciB2YWx1ZSBpbiByYW5nZShudW1fdmFsdWVzKToKKyAgICAgICAgeWllbGQgdmFsdWUKKworCithc3luYyBkZWYgZG9fc29tZV9jb21wcmVoZW5zaW9ucygpOgorICAgIHNldHMgPSB7ZWxlbSBhc3luYyBmb3IgZWxlbSBpbiBnZW5fdmFsdWVzKDEwKX0KKyAgICBsaXN0cyA9IFtlbGVtIGFzeW5jIGZvciBlbGVtIGluIGdlbl92YWx1ZXMoMTApXQorICAgIGRpY3RzID0ge2VsZW06IGVsZW0gYXN5bmMgZm9yIGVsZW0gaW4gZ2VuX3ZhbHVlcygxMCl9CisgICAgZ2VuID0gKGVsZW0gYXN5bmMgZm9yIGVsZW0gaW4gZ2VuX3ZhbHVlcygxMCkpCisgICAgcmV0dXJuIHNldHMsIGxpc3RzLCBkaWN0cywgZ2VuCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2kvaXRlcmFibGVfY29udGV4dF9weTM2LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzNi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzNi5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0X3B5MzYudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9pL2l0ZXJhYmxlX2NvbnRleHRfcHkzNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhN2MxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaS9pdGVyYWJsZV9jb250ZXh0X3B5MzYudHh0CkBAIC0wLDAgKzEsMiBAQAorbm90LWFuLWl0ZXJhYmxlOjExOjM1OkFJdGVyLnRvX2xpc3Q6Tm9uLWl0ZXJhYmxlIHZhbHVlIHNlbGYgaXMgdXNlZCBpbiBhbiBpdGVyYXRpbmcgY29udGV4dAorbm90LWFuLWl0ZXJhYmxlOjEyOjIxOkFJdGVyLnRvX2xpc3Q6Tm9uLWl0ZXJhYmxlIHZhbHVlIHNlbGYgaXMgdXNlZCBpbiBhbiBpdGVyYXRpbmcgY29udGV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pbXBvcnRfb3V0c2lkZV90b3BsZXZlbC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvaW1wb3J0X291dHNpZGVfdG9wbGV2ZWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyMWRiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvaW1wb3J0X291dHNpZGVfdG9wbGV2ZWwucHkKQEAgLTAsMCArMSw0MiBAQAorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCxtdWx0aXBsZS1pbXBvcnRzLG5vLXNlbGYtdXNlLG1pc3NpbmctZG9jc3RyaW5nLGludmFsaWQtbmFtZSx0b28tZmV3LXB1YmxpYy1tZXRob2RzCisKK2ltcG9ydCBhYmMKKworaWYgNCA9PSA1OgorICAgIGltcG9ydCBhc3QKKworCitkZWYgZigpOgorICAgIGltcG9ydCBzeW10YWJsZSAgIyBbaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWxdCisKKworZGVmIGcoKToKKyAgICBpbXBvcnQgb3MsIHN5cyAgIyBbaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWxdCisKKworZGVmIGgoKToKKyAgICBpbXBvcnQgdGltZSBhcyB0aHltZSAgIyBbaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWxdCisKKworZGVmIGkoKToKKyAgICBpbXBvcnQgcmFuZG9tIGFzIHJhbmQsIHNvY2tldCBhcyBzb2NrICAjIFtpbXBvcnQtb3V0c2lkZS10b3BsZXZlbF0KKworCitjbGFzcyBDOgorICAgIGltcG9ydCB0b2tlbml6ZSAgIyBbaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWxdCisKKyAgICBkZWYgaihzZWxmKToKKyAgICAgICAgaW1wb3J0IHR1cnRsZSAgIyBbaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWxdCisKKworZGVmIGsoZmxhZyk6CisgICAgaWYgZmxhZzoKKyAgICAgICAgaW1wb3J0IHRhYm5hbm55ICAjIFtpbXBvcnQtb3V0c2lkZS10b3BsZXZlbF0KKworCitkZWYgaigpOgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0ICMgW2ltcG9ydC1vdXRzaWRlLXRvcGxldmVsXQorCisKK2RlZiBtKCk6CisgICAgZnJvbSBtYXRoIGltcG9ydCBzaW4gYXMgc2lnbiwgY29zIGFzIGNvc3BsYXkgICMgW2ltcG9ydC1vdXRzaWRlLXRvcGxldmVsXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9pbXBvcnRfb3V0c2lkZV90b3BsZXZlbC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2ltcG9ydF9vdXRzaWRlX3RvcGxldmVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGIxNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9pbXBvcnRfb3V0c2lkZV90b3BsZXZlbC50eHQKQEAgLTAsMCArMSw5IEBACitpbXBvcnQtb3V0c2lkZS10b3BsZXZlbDoxMDo0OmY6SW1wb3J0IG91dHNpZGUgdG9wbGV2ZWwgKHN5bXRhYmxlKQoraW1wb3J0LW91dHNpZGUtdG9wbGV2ZWw6MTQ6NDpnOkltcG9ydCBvdXRzaWRlIHRvcGxldmVsIChvcywgc3lzKQoraW1wb3J0LW91dHNpZGUtdG9wbGV2ZWw6MTg6NDpoOkltcG9ydCBvdXRzaWRlIHRvcGxldmVsICh0aW1lKQoraW1wb3J0LW91dHNpZGUtdG9wbGV2ZWw6MjI6NDppOkltcG9ydCBvdXRzaWRlIHRvcGxldmVsIChyYW5kb20sIHNvY2tldCkKK2ltcG9ydC1vdXRzaWRlLXRvcGxldmVsOjI2OjQ6QzpJbXBvcnQgb3V0c2lkZSB0b3BsZXZlbCAodG9rZW5pemUpCitpbXBvcnQtb3V0c2lkZS10b3BsZXZlbDoyOTo4OkMuajpJbXBvcnQgb3V0c2lkZSB0b3BsZXZlbCAodHVydGxlKQoraW1wb3J0LW91dHNpZGUtdG9wbGV2ZWw6MzQ6ODprOkltcG9ydCBvdXRzaWRlIHRvcGxldmVsICh0YWJuYW5ueSkKK2ltcG9ydC1vdXRzaWRlLXRvcGxldmVsOjM4OjQ6ajpJbXBvcnQgb3V0c2lkZSB0b3BsZXZlbCAoY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QpCitpbXBvcnQtb3V0c2lkZS10b3BsZXZlbDo0Mjo0Om06SW1wb3J0IG91dHNpZGUgdG9wbGV2ZWwgKG1hdGguc2luLCBtYXRoLmNvcykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvay9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvay9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9rL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2sva2V5d29yZF9hcmdfYmVmb3JlX3ZhcmFyZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvay9rZXl3b3JkX2FyZ19iZWZvcmVfdmFyYXJnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTI4NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2sva2V5d29yZF9hcmdfYmVmb3JlX3ZhcmFyZy5weQpAQCAtMCwwICsxLDM1IEBACisiIiJVbml0dGVzdHMgZm9yIFcxMTI1IChrdyBhcmdzIGJlZm9yZSAqYXJncykiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBwcmludF9mdW5jdGlvbgorCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCB1bm5lY2Vzc2FyeS1wYXNzCitkZWYgY2hlY2tfa3dhcmdzX2JlZm9yZV9hcmdzKHBhcmFtMSwgcGFyYW0yPTIsICphcmdzKTogIyBba2V5d29yZC1hcmctYmVmb3JlLXZhcmFyZ10KKyAgICAiIiJkb2NzdHJpbmciIiIKKyAgICBwYXNzCisKK2NoZWNrX2t3YXJnc19iZWZvcmVfYXJncyg1KQorCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBpbnZhbGlkLW5hbWUKK2NsYXNzIEFBQUEob2JqZWN0KToKKyAgICAiIiJjbGFzcyBBQUFBIiIiCisgICAgZGVmIGZ1bmNfaW5fY2xhc3Moc2VsZiwgcGFyYW0xLCBwYXJhbTI9MiwgKmFyZ3MpOiAjIFtrZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnXQorICAgICAgICAibWV0aG9kIGluIGNsYXNzIEFBQUEiCisgICAgICAgIHBhc3MKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc3RhdGljX21ldGhvZF9pbl9jbGFzcyhwYXJhbTEsIHBhcmFtMj0zLCAqYXJncyk6ICMgW2tleXdvcmQtYXJnLWJlZm9yZS12YXJhcmddCisgICAgICAgICJzdGF0aWMgbWV0aG9kIGluIGNsYXNzIEFBQUEiCisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjbGFzc19tZXRob2RfaW5fY2xhc3MoY2xzLCBwYXJhbTEsIHBhcmFtMj00LCAqYXJncyk6ICMgW2tleXdvcmQtYXJnLWJlZm9yZS12YXJhcmddCisgICAgICAgICJjbGFzcyBtZXRob2QgaW4gY2xhc3MgQUFBQSIKKyAgICAgICAgcGFzcworCitzb21lX3ZhciA9IEFBQUEoKQorc29tZV92YXIuZnVuY19pbl9jbGFzcygzKQorCitzb21lX3Zhci5zdGF0aWNfbWV0aG9kX2luX2NsYXNzKDQpCitBQUFBLnN0YXRpY19tZXRob2RfaW5fY2xhc3MoNCkKKworc29tZV92YXIuY2xhc3NfbWV0aG9kX2luX2NsYXNzKDUpCitBQUFBLmNsYXNzX21ldGhvZF9pbl9jbGFzcyg1KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9rL2tleXdvcmRfYXJnX2JlZm9yZV92YXJhcmcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9rL2tleXdvcmRfYXJnX2JlZm9yZV92YXJhcmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGMwOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2sva2V5d29yZF9hcmdfYmVmb3JlX3ZhcmFyZy50eHQKQEAgLTAsMCArMSw0IEBACitrZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnOjU6MDpjaGVja19rd2FyZ3NfYmVmb3JlX2FyZ3M6S2V5d29yZCBhcmd1bWVudCBiZWZvcmUgdmFyaWFibGUgcG9zaXRpb25hbCBhcmd1bWVudHMgbGlzdCBpbiB0aGUgZGVmaW5pdGlvbiBvZiBjaGVja19rd2FyZ3NfYmVmb3JlX2FyZ3MgZnVuY3Rpb24KK2tleXdvcmQtYXJnLWJlZm9yZS12YXJhcmc6MTQ6NDpBQUFBLmZ1bmNfaW5fY2xhc3M6S2V5d29yZCBhcmd1bWVudCBiZWZvcmUgdmFyaWFibGUgcG9zaXRpb25hbCBhcmd1bWVudHMgbGlzdCBpbiB0aGUgZGVmaW5pdGlvbiBvZiBmdW5jX2luX2NsYXNzIGZ1bmN0aW9uCitrZXl3b3JkLWFyZy1iZWZvcmUtdmFyYXJnOjE5OjQ6QUFBQS5zdGF0aWNfbWV0aG9kX2luX2NsYXNzOktleXdvcmQgYXJndW1lbnQgYmVmb3JlIHZhcmlhYmxlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGxpc3QgaW4gdGhlIGRlZmluaXRpb24gb2Ygc3RhdGljX21ldGhvZF9pbl9jbGFzcyBmdW5jdGlvbgora2V5d29yZC1hcmctYmVmb3JlLXZhcmFyZzoyNDo0OkFBQUEuY2xhc3NfbWV0aG9kX2luX2NsYXNzOktleXdvcmQgYXJndW1lbnQgYmVmb3JlIHZhcmlhYmxlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGxpc3QgaW4gdGhlIGRlZmluaXRpb24gb2YgY2xhc3NfbWV0aG9kX2luX2NsYXNzIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvX19pbml0X18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9sL2xhbWJkYV91c2VfYmVmb3JlX2Fzc2lnbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sYW1iZGFfdXNlX2JlZm9yZV9hc3NpZ24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyNzc1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sYW1iZGFfdXNlX2JlZm9yZV9hc3NpZ24ucHkKQEAgLTAsMCArMSw4IEBACisiIiJodHRwczovL3d3dy5sb2dpbGFiLm5ldC9lbG8vdGlja2V0LzE4ODYyIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitfX3JldmlzaW9uX18gPSAxCitkZWYgZnVuY3Rpb24oKToKKyAgICAiIiJob3AiIiIKKyAgICBnZ2cgPSBsYW1iZGE6IHh4eAorICAgIHh4eCA9IDEKKyAgICBwcmludChnZ2coKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sZW5fY2hlY2tzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xlbl9jaGVja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiZWZjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sZW5fY2hlY2tzLnB5CkBAIC0wLDAgKzEsMTg2IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLGltcG9ydC1lcnJvciwgbm8tYWJzb2x1dGUtaW1wb3J0LG1pc3NpbmctZG9jc3RyaW5nLCBtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudAorIyBweWxpbnQ6IGRpc2FibGU9dXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uLHdyb25nLWltcG9ydC1wb3NpdGlvbixpbnZhbGlkLW5hbWUsIHdyb25nLWltcG9ydC1vcmRlciwgY29uZGl0aW9uLWV2YWxzLXRvLWNvbnN0YW50CisKK2lmIGxlbignVEVTVCcpOiAgIyBbbGVuLWFzLWNvbmRpdGlvbl0KKyAgICBwYXNzCisKK2lmIG5vdCBsZW4oJ1RFU1QnKTogICMgW2xlbi1hcy1jb25kaXRpb25dCisgICAgcGFzcworCit6ID0gW10KK2lmIHogYW5kIGxlbihbJ1QnLCAnRScsICdTJywgJ1QnXSk6ICAjIFtsZW4tYXMtY29uZGl0aW9uXQorICAgIHBhc3MKKworaWYgVHJ1ZSBvciBsZW4oJ1RFU1QnKTogICMgW2xlbi1hcy1jb25kaXRpb25dCisgICAgcGFzcworCitpZiBsZW4oJ1RFU1QnKSA9PSAwOiAgIyBTaG91bGQgYmUgZmluZQorICAgIHBhc3MKKworaWYgbGVuKCdURVNUJykgPCAxOiAgIyBTaG91bGQgYmUgZmluZQorICAgIHBhc3MKKworaWYgbGVuKCdURVNUJykgPD0gMDogICMgU2hvdWxkIGJlIGZpbmUKKyAgICBwYXNzCisKK2lmIDEgPiBsZW4oJ1RFU1QnKTogICMgU2hvdWxkIGJlIGZpbmUKKyAgICBwYXNzCisKK2lmIDAgPj0gbGVuKCdURVNUJyk6ICAjIFNob3VsZCBiZSBmaW5lCisgICAgcGFzcworCitpZiB6IGFuZCBsZW4oJ1RFU1QnKSA9PSAwOiAgIyBTaG91bGQgYmUgZmluZQorICAgIHBhc3MKKworaWYgMCA9PSBsZW4oJ1RFU1QnKSA8IDEwOiAgIyBTaG91bGQgYmUgZmluZQorICAgIHBhc3MKKworaWYgMCA8IDEgPD0gbGVuKCdURVNUJykgPCAxMDogICMgU2hvdWxkIGJlIGZpbmUKKyAgICBwYXNzCisKK2lmIDEwID4gbGVuKCdURVNUJykgIT0gMDogICMgU2hvdWxkIGJlIGZpbmUKKyAgICBwYXNzCisKK2lmIDEwID4gbGVuKCdURVNUJykgPiAxID4gMDogICMgU2hvdWxkIGJlIGZpbmUKKyAgICBwYXNzCisKK2lmIDAgPD0gbGVuKCdURVNUJykgPCAxMDA6ICAjIFNob3VsZCBiZSBmaW5lCisgICAgcGFzcworCitpZiB6IG9yIDEwID4gbGVuKCdURVNUJykgIT0gMDogICMgU2hvdWxkIGJlIGZpbmUKKyAgICBwYXNzCisKK2lmIHo6CisgICAgcGFzcworZWxpZiBsZW4oJ1RFU1QnKTogICMgW2xlbi1hcy1jb25kaXRpb25dCisgICAgcGFzcworCitpZiB6OgorICAgIHBhc3MKK2VsaWYgbm90IGxlbignVEVTVCcpOiAgIyBbbGVuLWFzLWNvbmRpdGlvbl0KKyAgICBwYXNzCisKK3doaWxlIGxlbignVEVTVCcpOiAgIyBbbGVuLWFzLWNvbmRpdGlvbl0KKyAgICBwYXNzCisKK3doaWxlIG5vdCBsZW4oJ1RFU1QnKTogICMgW2xlbi1hcy1jb25kaXRpb25dCisgICAgcGFzcworCit3aGlsZSB6IGFuZCBsZW4oJ1RFU1QnKTogICMgW2xlbi1hcy1jb25kaXRpb25dCisgICAgcGFzcworCit3aGlsZSBub3QgbGVuKCdURVNUJykgYW5kIHo6ICAjIFtsZW4tYXMtY29uZGl0aW9uXQorICAgIHBhc3MKKworYXNzZXJ0IGxlbignVEVTVCcpID4gMCAgIyBTaG91bGQgYmUgZmluZQorCit4ID0gMSBpZiBsZW4oJ1RFU1QnKSAhPSAwIGVsc2UgMiAgIyBTaG91bGQgYmUgZmluZQorCitmX29fbyA9IGxlbignVEVTVCcpIG9yIDQyICAjIFNob3VsZCBiZSBmaW5lCisKK2EgPSB4IGFuZCBsZW4oeCkgICMgU2hvdWxkIGJlIGZpbmUKKworZGVmIHNvbWVfZnVuYygpOgorICAgIHJldHVybiBsZW4oJ1RFU1QnKSA+IDAgICMgU2hvdWxkIGJlIGZpbmUKKworZGVmIGdpdGh1Yl9pc3N1ZV8xMzI1KCk6CisgICAgbCA9IFsxLCAyLCAzXQorICAgIGxlbmd0aCA9IGxlbihsKSBpZiBsIGVsc2UgMCAgIyBTaG91bGQgYmUgZmluZQorICAgIHJldHVybiBsZW5ndGgKKworZGVmIGdpdGh1Yl9pc3N1ZV8xMzMxKCphcmdzKToKKyAgICBhc3NlcnQgRmFsc2UsIGxlbihhcmdzKSAgIyBTaG91bGQgYmUgZmluZQorCitkZWYgZ2l0aHViX2lzc3VlXzEzMzFfdjIoKmFyZ3MpOgorICAgIGFzc2VydCBsZW4oYXJncyksIGFyZ3MgICMgW2xlbi1hcy1jb25kaXRpb25dCisKK2RlZiBnaXRodWJfaXNzdWVfMTMzMV92MygqYXJncyk6CisgICAgYXNzZXJ0IGxlbihhcmdzKSBvciB6LCBhcmdzICAjIFtsZW4tYXMtY29uZGl0aW9uXQorCitkZWYgZ2l0aHViX2lzc3VlXzEzMzFfdjQoKmFyZ3MpOgorICAgIGFzc2VydCB6IGFuZCBsZW4oYXJncyksIGFyZ3MgICMgW2xlbi1hcy1jb25kaXRpb25dCisKK2IgPSBib29sKGxlbih6KSkgIyBbbGVuLWFzLWNvbmRpdGlvbl0KK2MgPSBib29sKGxlbignVEVTVCcpIG9yIDQyKSAjIFtsZW4tYXMtY29uZGl0aW9uXQorCisKK2RlZiBnaXRodWJfaXNzdWVfMTg3OSgpOgorCisgICAgY2xhc3MgQ2xhc3NXaXRoQm9vbChsaXN0KToKKyAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGNsYXNzIENsYXNzV2l0aG91dEJvb2wobGlzdCk6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIENoaWxkQ2xhc3NXaXRoQm9vbChDbGFzc1dpdGhCb29sKToKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgQ2hpbGRDbGFzc1dpdGhvdXRCb29sKENsYXNzV2l0aG91dEJvb2wpOgorICAgICAgICBwYXNzCisKKyAgICBhc3NlcnQgbGVuKENsYXNzV2l0aEJvb2woKSkKKyAgICBhc3NlcnQgbGVuKENoaWxkQ2xhc3NXaXRoQm9vbCgpKQorICAgIGFzc2VydCBsZW4oQ2xhc3NXaXRob3V0Qm9vbCgpKSAgIyBbbGVuLWFzLWNvbmRpdGlvbl0KKyAgICBhc3NlcnQgbGVuKENoaWxkQ2xhc3NXaXRob3V0Qm9vbCgpKSAgIyBbbGVuLWFzLWNvbmRpdGlvbl0KKyAgICBhc3NlcnQgbGVuKHJhbmdlKDApKSAgIyBbbGVuLWFzLWNvbmRpdGlvbl0KKyAgICBhc3NlcnQgbGVuKFt0ICsgMSBmb3IgdCBpbiBbXV0pICAjIFtsZW4tYXMtY29uZGl0aW9uXQorICAgIGFzc2VydCBsZW4odSArIDEgZm9yIHUgaW4gW10pICAjIFtsZW4tYXMtY29uZGl0aW9uXQorICAgIGFzc2VydCBsZW4oeyIxIjoodiArIDEpIGZvciB2IGluIHt9fSkgICMgW2xlbi1hcy1jb25kaXRpb25dCisgICAgYXNzZXJ0IGxlbihzZXQoKHcgKyAxKSBmb3IgdyBpbiBzZXQoKSkpICAjIFtsZW4tYXMtY29uZGl0aW9uXQorCisgICAgIyBweWxpbnQ6IGRpc2FibGU9aW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKKyAgICBpbXBvcnQgbnVtcHkKKyAgICBudW1weV9hcnJheSA9IG51bXB5LmFycmF5KFswXSkKKyAgICBpZiBsZW4obnVtcHlfYXJyYXkpID4gMDoKKyAgICAgICAgcHJpbnQoJ251bXB5X2FycmF5JykKKyAgICBpZiBsZW4obnVtcHlfYXJyYXkpOgorICAgICAgICBwcmludCgnbnVtcHlfYXJyYXknKQorICAgIGlmIG51bXB5X2FycmF5OgorICAgICAgICBwcmludCgnYicpCisKKyAgICBpbXBvcnQgcGFuZGFzIGFzIHBkCisgICAgcGFuZGFzX2RmID0gcGQuRGF0YUZyYW1lKCkKKyAgICBpZiBsZW4ocGFuZGFzX2RmKToKKyAgICAgICAgcHJpbnQoInRoaXMgd29ya3MsIGJ1dCBweWxpbnQgdGVsbHMgbWUgbm90IHRvIHVzZSBsZW4oKSB3aXRob3V0IGNvbXBhcmlzb24iKQorICAgIGlmIGxlbihwYW5kYXNfZGYpID4gMDoKKyAgICAgICAgcHJpbnQoInRoaXMgd29ya3MgYW5kIHB5bGludCBsaWtlcyBpdCwgYnV0IGl0J3Mgbm90IHRoZSBzb2x1dGlvbiBpbnRlbmRlZCBieSBQRVAtOCIpCisgICAgaWYgcGFuZGFzX2RmOgorICAgICAgICBwcmludCgidGhpcyBkb2VzIG5vdCB3b3JrICh0cnV0aCB2YWx1ZSBvZiBkYXRhZnJhbWUgaXMgYW1iaWd1b3VzKSIpCisKKyAgICBkZWYgZnVuY3Rpb25fcmV0dXJuaW5nX2xpc3Qocik6CisgICAgICAgIGlmIHI9PTE6CisgICAgICAgICAgICByZXR1cm4gWzFdCisgICAgICAgIHJldHVybiBbMl0KKworICAgIGRlZiBmdW5jdGlvbl9yZXR1cm5pbmdfaW50KHIpOgorICAgICAgICBpZiByPT0xOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIDIKKworICAgICMgZGVmIGZ1bmN0aW9uX3JldHVybmluZ19nZW5lcmF0b3Iocik6CisgICAgIyAgICAgZm9yIGkgaW4gW3IsIDEsIDIsIDNdOgorICAgICMgICAgICAgICB5aWVsZCBpCisKKyAgICAjIGRlZiBmdW5jdGlvbl9yZXR1cm5pbmdfY29tcHJlaGVuc2lvbihyKToKKyAgICAjICAgICByZXR1cm4gW3grMSBmb3IgeCBpbiBbciwgMSwgMiwgM11dCisKKyAgICAjIGRlZiBmdW5jdGlvbl9yZXR1cm5pbmdfZnVuY3Rpb24ocik6CisgICAgIyAgICAgcmV0dXJuIGZ1bmN0aW9uX3JldHVybmluZ19nZW5lcmF0b3IocikKKworICAgIGFzc2VydCBsZW4oZnVuY3Rpb25fcmV0dXJuaW5nX2xpc3QoeikpICAjIFtsZW4tYXMtY29uZGl0aW9uXQorICAgIGFzc2VydCBsZW4oZnVuY3Rpb25fcmV0dXJuaW5nX2ludCh6KSkKKyAgICAjIFRoaXMgc2hvdWxkIHJhaXNlIGEgbGVuLWFzLWNvbmRpdGlvbnMgb25jZSBhc3Ryb2lkIGNhbiBpbmZlciBpdAorICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvcHVsbC8zODIxI2lzc3VlY29tbWVudC03NDM3NzE1MTQKKyAgICAjIGFzc2VydCBsZW4oZnVuY3Rpb25fcmV0dXJuaW5nX2dlbmVyYXRvcih6KSkKKyAgICAjIGFzc2VydCBsZW4oZnVuY3Rpb25fcmV0dXJuaW5nX2NvbXByZWhlbnNpb24oeikpCisgICAgIyBhc3NlcnQgbGVuKGZ1bmN0aW9uX3JldHVybmluZ19mdW5jdGlvbih6KSkKKworCitkZWYgZ2l0aHViX2lzc3VlXzQyMTUoKToKKyAgICAjIFRlc3QgdW5kZWZpbmVkIHZhcmlhYmxlcworICAgICMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDIxNQorICAgIGlmIGxlbih1bmRlZmluZWRfdmFyKTogICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAgICAgcGFzcworICAgIGlmIGxlbih1bmRlZmluZWRfdmFyMlswXSk6ICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sZW5fY2hlY2tzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sZW5fY2hlY2tzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWI5NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xlbl9jaGVja3MudHh0CkBAIC0wLDAgKzEsMjUgQEAKK2xlbi1hcy1jb25kaXRpb246NDozOjpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246NzozOjpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246MTE6OTo6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjE0OjExOjpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246NTU6NTo6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjYwOjU6OkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eQorbGVuLWFzLWNvbmRpdGlvbjo2Mzo2OjpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246NjY6Njo6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjY5OjEyOjpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246NzI6Njo6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjk1OjExOmdpdGh1Yl9pc3N1ZV8xMzMxX3YyOkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eQorbGVuLWFzLWNvbmRpdGlvbjo5ODoxMTpnaXRodWJfaXNzdWVfMTMzMV92MzpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246MTAxOjE3OmdpdGh1Yl9pc3N1ZV8xMzMxX3Y0OkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eQorbGVuLWFzLWNvbmRpdGlvbjoxMDM6OTo6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjEwNDo5OjpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246MTI0OjExOmdpdGh1Yl9pc3N1ZV8xODc5OkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eQorbGVuLWFzLWNvbmRpdGlvbjoxMjU6MTE6Z2l0aHViX2lzc3VlXzE4Nzk6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjEyNjoxMTpnaXRodWJfaXNzdWVfMTg3OTpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246MTI3OjExOmdpdGh1Yl9pc3N1ZV8xODc5OkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eQorbGVuLWFzLWNvbmRpdGlvbjoxMjg6MTE6Z2l0aHViX2lzc3VlXzE4Nzk6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5CitsZW4tYXMtY29uZGl0aW9uOjEyOToxMTpnaXRodWJfaXNzdWVfMTg3OTpEbyBub3QgdXNlIGBsZW4oU0VRVUVOQ0UpYCB3aXRob3V0IGNvbXBhcmlzb24gdG8gZGV0ZXJtaW5lIGlmIGEgc2VxdWVuY2UgaXMgZW1wdHkKK2xlbi1hcy1jb25kaXRpb246MTMwOjExOmdpdGh1Yl9pc3N1ZV8xODc5OkRvIG5vdCB1c2UgYGxlbihTRVFVRU5DRSlgIHdpdGhvdXQgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgYSBzZXF1ZW5jZSBpcyBlbXB0eQorbGVuLWFzLWNvbmRpdGlvbjoxNzE6MTE6Z2l0aHViX2lzc3VlXzE4Nzk6RG8gbm90IHVzZSBgbGVuKFNFUVVFTkNFKWAgd2l0aG91dCBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiBhIHNlcXVlbmNlIGlzIGVtcHR5Cit1bmRlZmluZWQtdmFyaWFibGU6MTgzOjExOmdpdGh1Yl9pc3N1ZV80MjE1OlVuZGVmaW5lZCB2YXJpYWJsZSAndW5kZWZpbmVkX3ZhcicKK3VuZGVmaW5lZC12YXJpYWJsZToxODU6MTE6Z2l0aHViX2lzc3VlXzQyMTU6VW5kZWZpbmVkIHZhcmlhYmxlICd1bmRlZmluZWRfdmFyMicKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saW5lX2VuZGluZ3MucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV9lbmRpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmU3OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV9lbmRpbmdzLnB5CkBAIC0wLDAgKzEsMyBAQAorIm1peGluZyBsaW5lIGVuZGluZ3MgYXJlIG5vdCB3ZWxjb21lIgorIyArMTogW3VuZXhwZWN0ZWQtbGluZS1lbmRpbmctZm9ybWF0LCBtaXhlZC1saW5lLWVuZGluZ3NdCitDT05TVCA9IDENCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV9lbmRpbmdzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xpbmVfZW5kaW5ncy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUzMmVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xpbmVfZW5kaW5ncy5yYwpAQCAtMCwwICsxLDIgQEAKK1tGb3JtYXRdCitleHBlY3RlZC1saW5lLWVuZGluZy1mb3JtYXQ9TEYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saW5lX2VuZGluZ3MudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xpbmVfZW5kaW5ncy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0NWY0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saW5lX2VuZGluZ3MudHh0CkBAIC0wLDAgKzEsMiBAQAorbWl4ZWQtbGluZS1lbmRpbmdzOjM6MDo6TWl4ZWQgbGluZSBlbmRpbmdzIExGIGFuZCBDUkxGCit1bmV4cGVjdGVkLWxpbmUtZW5kaW5nLWZvcm1hdDozOjA6OlVuZXhwZWN0ZWQgbGluZSBlbmRpbmcgZm9ybWF0LiBUaGVyZSBpcyAnQ1JMRicgd2hpbGUgaXQgc2hvdWxkIGJlICdMRicuCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV90b29fbG9uZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saW5lX3Rvb19sb25nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTQ2MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV90b29fbG9uZy5weQpAQCAtMCwwICsxLDc3IEBACisjIHB5bGludDogZGlzYWJsZT1maXhtZSwgdW5uZWNlc3NhcnktcGFzcw0KKyMgKzE6IFtsaW5lLXRvby1sb25nXQ0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIyArMTogW2xpbmUtdG9vLWxvbmddDQorIiIiIHRoYXQgb25lIGlzIHRvbyBsb25nIHRvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbyBsb29vb29vbmciIiINCisNCisjIFRoZSBuZXh0IGxpbmUgaXMgZXhhY3RseSA4MCBjaGFyYWN0ZXJzIGxvbmcuDQorQSA9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSINCisNCisjIERvIG5vdCB0cmlnZ2VyIHRoZSBsaW5lLXRvby1sb25nIHdhcm5pbmcgaWYgdGhlIG9ubHkgdG9rZW4gdGhhdCBtYWtlcyB0aGUNCisjIGxpbmUgbG9uZ2VyIHRoYW4gODAgY2hhcmFjdGVycyBpcyBhIHRyYWlsaW5nIHB5bGludCBkaXNhYmxlLg0KKyMgcHlsaW50OmRpc2FibGU9aW52YWxpZC1uYW1lDQordmFyID0gKA0KKyAgICAiVGhpcyBsaW5lIGhhcyBhIGRpc2FibGUgcHJhZ21hIGFuZCB3aGl0ZXNwYWNlIHRyYWlsaW5nIGJleW9uZCA4MCBjaGFycy4gIg0KKykNCisNCisjICsxOiBbbGluZS10b28tbG9uZ10NCitiYWRuYW1lID0gIlRoaXMgbGluZSBpcyBhbHJlYWR5IGxvbmdlciB0aGFuIDEwMCBjaGFyYWN0ZXJzIGV2ZW4gd2l0aG91dCB0aGUgcHJhZ21hLiBUcnVzdCBtZS4gUGxlYXNlLiIgICMgcHlsaW50OmRpc2FibGU9aW52YWxpZC1uYW1lDQorDQorIyBodHRwOi8vZXhhbXBsZS5jb20vdGhpcy9pcy9hL3ZlcnkvbG9uZy91cmw/YnV0PXNwbGl0dGluZyZ1cmxzPWlzJmE9cGFpbiZzbz10aGV5JmNhbj1iZSZsb25nDQorDQorDQorIyArMTogW2xpbmUtdG9vLWxvbmddDQorIyBUaGlzIGxpbmUgaXMgdG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyAjcHlsaW50OiBkaXNhYmxlPWZpeG1lDQorDQorIyArMTogW2xpbmUtdG9vLWxvbmddDQorIyBUT0RPOiBUaGlzIGxpbmUgaXMgdG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyAjcHlsaW50OiBkaXNhYmxlPWZpeG1lDQorDQorDQorZGVmIGZ1bmN0aW9uKCk6DQorICAgICMgKzM6IFtsaW5lLXRvby1sb25nXQ0KKyAgICAiIiJUaGlzIGlzIGEgZG9jc3RyaW5nLg0KKw0KKyAgICBUaGF0IGNvbnRhaW5zIGEgdmVyeSwgdmVyeSBsb25nIGxpbmUgdGhhdCBleGNlZWRzIHRoZSAxMDAgY2hhcmFjdGVycyBsaW1pdCBieSBhIGdvb2QgbWFyZ2luLiBTbyBnb29kPw0KKyAgICAiIiINCisgICAgcGFzcw0KKw0KKw0KKyMgRG9uJ3QgY3Jhc2ggd2hlbiB0aGUgbGluZSBpcyBpbiBhIGRvY3N0cmluZw0KK2RlZiBmdW5jX3dpdGhfbG9uZyhwYXJhbWV0ZXIpOg0KKyAgICAiIiINCisgICAgIyBweWxpbnQ6IGRpc2FibGU9bGluZS10b28tbG9uZw0KKyAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MNCisgICAgIiIiDQorICAgIHJldHVybiBwYXJhbWV0ZXINCisNCisNCisjIE5vIGxpbmUtdG9vLWxvbmcgbWVzc2FnZSBzaG91bGQgYmUgZW1pdHRlZCBhcyB0aGUgZGlzYWJsZSBjb21tZW50IHN0YW5kcyBmb3IgYWxsIHRoZSBtdWx0aWxpbmUNCitkZWYgaXNzdWVfMjk1NygpOg0KKyAgICAiIiINCisgICAgVGhpcyBpcyBhIHZlcnkgdmVyeSB2ZXJ5IGxvbmcgbGluZSB3aXRoaW4gYSBkb2NzdHJpbmcgdGhhdCBzaG91bGQgdHJpZ2dlciBhIHB5bGludCBDMDMwMSBlcnJvciBsaW5lLXRvby1sb25nDQorDQorICAgIEV2ZW4gc3ByZWFkIG9uIG11bHRpcGxlIGxpbmVzLCB0aGUgZGlzYWJsZSBjb21tYW5kIGlzIHN0aWxsIGVmZmVjdGl2ZSBvbiB2ZXJ5IHZlcnkgdmVyeSwgbWF5YmUgdG9vIG11Y2ggbG9uZyBkb2NzdHJpbmcNCisgICAgIiIiI3B5bGludDogZGlzYWJsZT1saW5lLXRvby1sb25nDQorICAgIHJldHVybiBUcnVlDQorDQorDQorZGVmIGlzc3VlXzI5NTdfYmlzKCk6DQorICAgICMgKzM6IFtsaW5lLXRvby1sb25nXQ0KKyAgICAjICs0OiBbbGluZS10b28tbG9uZ10NCisgICAgIiIiDQorICAgIFRoaXMgaXMgYSB2ZXJ5IHZlcnkgdmVyeSBsb25nIGxpbmUgd2l0aGluIGEgZG9jc3RyaW5nIHRoYXQgc2hvdWxkIHRyaWdnZXIgYSBweWxpbnQgQzAzMDEgZXJyb3IgbGluZS10b28tbG9uZw0KKw0KKyAgICBFdmVuIHNwcmVhZCBvbiBtdWx0aXBsZSBsaW5lcywgdGhlIGRpc2FibGUgY29tbWFuZCBpcyBzdGlsbCBlZmZlY3RpdmUgb24gdmVyeSB2ZXJ5IHZlcnksIG1heWJlIHRvbyBtdWNoIGxvbmcgZG9jc3RyaW5nDQorICAgICIiIg0KKyAgICByZXR1cm4gVHJ1ZQ0KKw0KKw0KKyMgKzI6IFtsaW5lLXRvby1sb25nXQ0KKyMgKzI6IFtsaW5lLXRvby1sb25nXQ0KK1ZBUiA9ICIiIkEgdmVyeSB2ZXJ5IGxvbmcsIG1heWJlIHRvbyBtdWNoLCBjb25zdGFudC4gSnVzdCBoZXJlIHRvIHRyaWdnZXIgbWVzc2FnZSBlbWlzc2lvbiBhbmQgY2hlY2sgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCBuaWNlIiIiDQorIiIiQnV0IGl0IGlzIGhvd2V2ZXIgdG9vIGxvbmcsIGlzbid0IGl0PyBJIGRvbid0IGtub3cgd2hhdCB0byBzYXkgbW9yZSBoZXJlLiBJIGdvdCBhIGxhY2sgb2YgaW1hZ2luYXRpb24sIGp1c3QgbGlzdGVuaW5nIHRvIG11c2ljLi4uIiIiDQorDQorDQorIyArMTogW2xpbmUtdG9vLWxvbmddDQorVkFSX0JJUyA9ICIiIkEgdmVyeSB2ZXJ5IGxvbmcsIG1heWJlIHRvbyBtdWNoLCBjb25zdGFudC4gSnVzdCBoZXJlIHRvIHRyaWdnZXIgbWVzc2FnZSBlbWlzc2lvbiBhbmQgY2hlY2sgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCBuaWNlIiIiDQorIiIiQnV0IGl0IGlzIGhvd2V2ZXIgdG9vIGxvbmcsIGlzbid0IGl0PyBJIGRvbid0IGtub3cgd2hhdCB0byBzYXkgbW9yZSBoZXJlLiBJIGdvdCBhIGxhY2sgb2YgaW1hZ2luYXRpb24sIGp1c3QgbGlzdGVuaW5nIHRvIG11c2ljLi4uIiIiI3B5bGludDogZGlzYWJsZT1saW5lLXRvby1sb25nDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9sL2xpbmVfdG9vX2xvbmcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xpbmVfdG9vX2xvbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzE5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV90b29fbG9uZy50eHQKQEAgLTAsMCArMSwxMSBAQAorbGluZS10b28tbG9uZzozOjA6OkxpbmUgdG9vIGxvbmcgKDEwMS8xMDApCitsaW5lLXRvby1sb25nOjU6MDo6TGluZSB0b28gbG9uZyAoMTA0LzEwMCkKK2xpbmUtdG9vLWxvbmc6MTg6MDo6TGluZSB0b28gbG9uZyAoMTAyLzEwMCkKK2xpbmUtdG9vLWxvbmc6MjQ6MDo6TGluZSB0b28gbG9uZyAoMTA5LzEwMCkKK2xpbmUtdG9vLWxvbmc6Mjc6MDo6TGluZSB0b28gbG9uZyAoMTE1LzEwMCkKK2xpbmUtdG9vLWxvbmc6MzQ6MDo6TGluZSB0b28gbG9uZyAoMTA1LzEwMCkKK2xpbmUtdG9vLWxvbmc6NjI6MDo6TGluZSB0b28gbG9uZyAoMTEyLzEwMCkKK2xpbmUtdG9vLWxvbmc6NjQ6MDo6TGluZSB0b28gbG9uZyAoMTIyLzEwMCkKK2xpbmUtdG9vLWxvbmc6NzE6MDo6TGluZSB0b28gbG9uZyAoMTMxLzEwMCkKK2xpbmUtdG9vLWxvbmc6NzI6MDo6TGluZSB0b28gbG9uZyAoMTM1LzEwMCkKK2xpbmUtdG9vLWxvbmc6NzY6MDo6TGluZSB0b28gbG9uZyAoMTM1LzEwMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saW5lX3Rvb19sb25nX2VuZF9vZl9tb2R1bGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV90b29fbG9uZ19lbmRfb2ZfbW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxY2I3NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGluZV90b29fbG9uZ19lbmRfb2ZfbW9kdWxlLnB5CkBAIC0wLDAgKzEsNyBAQAorI3B5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgbGluZS10b28tbG9uZw0KKw0KKyMgSGV5IHRoaXMgaXMgYSB2ZXJ5IGxvbmcgY29tbWVudGVkIGxpbmUganVzdCB0byB0cmlnZ2VyIHB5bGludCdzIGxpbmUtdG9vLWxvbmcgbWVzc2FnZS4gSXQgaXMganVzdCBhYm92ZSBhIGR1bW15IGZ1bmN0aW9uIHdpdGggYSB2ZXJ5IGxvbmcgY29kZSBsaW5lLg0KK2RlZiBkdW1teV9mdW5jdGlvbigpOg0KKyAgICBwcmludCgiV2hhdCBhIGJlYXV0aWZ1bCBkdW1teSBmdW5jdGlvbiB3aXRoIHN1Y2ggYSB2ZXJ5IGxvbmcgbGluZSBpbnNpZGUgdGhhdCBpdCBzaG91bGQgdHJpZ2dlciBweWxpbnQncyBsaW5lLXRvby1sb25nIG1lc3NhZ2UgIikNCisNCisjIEhleSB0aGlzIGlzIGEgdmVyeSBsb25nIGNvbW1lbnRlZCBsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIG1vZHVsZS4gSXQgaXMganVzdCBoZXJlIHRvIHRyaWdnZXIgcHlsaW50J3MgbGluZS10b28tbG9uZyBtZXNzYWdlLg0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saXRlcmFsX2NvbXBhcmlzb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGl0ZXJhbF9jb21wYXJpc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmU1N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbGl0ZXJhbF9jb21wYXJpc29uLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBjb21wYXJpc29uLXdpdGgtaXRzZWxmCisKKworaWYgMiBpcyAyOiAjIFtsaXRlcmFsLWNvbXBhcmlzb25dCisgICAgcGFzcworCitpZiAiYSIgaXMgYiJhIjogIyBbbGl0ZXJhbC1jb21wYXJpc29uXQorICAgIHBhc3MKKworaWYgMi4wIGlzIDMuMDogIyBbbGl0ZXJhbC1jb21wYXJpc29uXQorICAgIHBhc3MKKworaWYgKCkgaXMgKDEsIDIsIDMpOiAjIFtsaXRlcmFsLWNvbXBhcmlzb25dCisgICAgcGFzcworCitpZiAoKSBpcyB7MToyLCAyOjN9OiAjIFtsaXRlcmFsLWNvbXBhcmlzb25dCisgICAgcGFzcworCitpZiBbXSBpcyBbNCwgNSwgNl06ICMgW2xpdGVyYWwtY29tcGFyaXNvbl0KKyAgICBwYXNzCisKK2lmICgpIGlzIHsxLCAyLCAzfTogIyBbbGl0ZXJhbC1jb21wYXJpc29uXQorICAgIHBhc3MKKworaWYgKCkgaXMgbm90IHsxOjIsIDI6M306ICMgW2xpdGVyYWwtY29tcGFyaXNvbl0KKyAgICBwYXNzCisKK2lmIFtdIGlzIG5vdCBbNCwgNSwgNl06ICMgW2xpdGVyYWwtY29tcGFyaXNvbl0KKyAgICBwYXNzCisKK2lmICgpIGlzIG5vdCB7MSwgMiwgM306ICMgW2xpdGVyYWwtY29tcGFyaXNvbl0KKyAgICBwYXNzCisKKworQ09OU1QgPSAyNAorCisKK2lmIENPTlNUIGlzIDA6ICMgW2xpdGVyYWwtY29tcGFyaXNvbl0KKyAgICBwYXNzCisKK2lmIENPTlNUIGlzIDE6ICMgW2xpdGVyYWwtY29tcGFyaXNvbl0KKyAgICBwYXNzCisKK2lmIENPTlNUIGlzIDQyOiAjIFtsaXRlcmFsLWNvbXBhcmlzb25dCisgICAgcGFzcworCisjIFdlIGRvIG5vdCBkbyBpbmZlcmVuY2UgZm9yIHRoaXMgY2hlY2ssIHNpbmNlIHRoZSBjb21wYXJpbmcKKyMgb2JqZWN0IG1pZ2h0IGJlIHVzZWQgYXMgYSBzZW50aW5lbC4KK2lmICgpIGlzIENPTlNUOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saXRlcmFsX2NvbXBhcmlzb24udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xpdGVyYWxfY29tcGFyaXNvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxYmZlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9saXRlcmFsX2NvbXBhcmlzb24udHh0CkBAIC0wLDAgKzEsMTMgQEAKK2xpdGVyYWwtY29tcGFyaXNvbjo0OjM6OkNvbXBhcmlzb24gdG8gbGl0ZXJhbAorbGl0ZXJhbC1jb21wYXJpc29uOjc6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MTA6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MTM6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MTY6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MTk6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MjI6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MjU6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246Mjg6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246MzE6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246Mzg6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246NDE6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCitsaXRlcmFsLWNvbXBhcmlzb246NDQ6Mzo6Q29tcGFyaXNvbiB0byBsaXRlcmFsCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2Zvcm1hdF9pbnRlcnBvbGF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWZhOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbi5weQpAQCAtMCwwICsxLDM3IEBACisjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIsIG5vLWFic29sdXRlLWltcG9ydCwgaW1wb3J0LWVycm9yLGxpbmUtdG9vLWxvbmcKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZyx3cm9uZy1pbXBvcnQtb3JkZXIsd3JvbmctaW1wb3J0LXBvc2l0aW9uCit0cnk6CisgICAgaW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGJ1aWx0aW5zCisKKyMgTXVjayB1cCB0aGUgbmFtZXMgaW4gYW4gZWZmb3J0IHRvIGNvbmZ1c2UuLi4KK2ltcG9ydCBsb2dnaW5nIGFzIHJlbmFtZWRfbG9nZ2luZworaW1wb3J0IG9zIGFzIGxvZ2dpbmcKK2Zyb20gdW5pbmZlcmFibGUgaW1wb3J0IFVOSU5GRVJBQkxFCisKK0ZPUk1BVF9TVFIgPSAnezB9LCB7MX0nCisKKyMgU3RhdGVtZW50cyB0aGF0IHNob3VsZCBiZSBmbGFnZ2VkOgorcmVuYW1lZF9sb2dnaW5nLmRlYnVnKCd7MH0sIHsxfScuZm9ybWF0KDQsIDUpKSAjIFtsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uXQorcmVuYW1lZF9sb2dnaW5nLmxvZyhyZW5hbWVkX2xvZ2dpbmcuREVCVUcsICdtc2c6IHt9Jy5mb3JtYXQoJ1J1biEnKSkgIyBbbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbl0KK3JlbmFtZWRfbG9nZ2luZy5kZWJ1ZyhGT1JNQVRfU1RSLmZvcm1hdCg0LCA1KSkgIyBbbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbl0KK3JlbmFtZWRfbG9nZ2luZy5sb2cocmVuYW1lZF9sb2dnaW5nLkRFQlVHLCBGT1JNQVRfU1RSLmZvcm1hdCg0LCA1KSkgIyBbbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbl0KK3JlbmFtZWRfbG9nZ2luZy5pbmZvKCJSZWFkIHtsfSByb3dzIi5mb3JtYXQobD0xMjM0NTY3ODkpKSAjIFtsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uXQorCisjIFN0YXRlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIGZsYWdnZWQ6CityZW5hbWVkX2xvZ2dpbmcuZGVidWcoZm9ybWF0KDY2LCAneCcpKQorcmVuYW1lZF9sb2dnaW5nLmRlYnVnKGJ1aWx0aW5zLmZvcm1hdCg2NiwgJ3gnKSkKK3JlbmFtZWRfbG9nZ2luZy5sb2cocmVuYW1lZF9sb2dnaW5nLkRFQlVHLCAnbXNnOiBSdW4hJy51cHBlcigpKQorbG9nZ2luZy5kZWJ1ZygnezB9LCB7MX0nLmZvcm1hdCg0LCA1KSkKK2xvZ2dpbmcubG9nKGxvZ2dpbmcuREVCVUcsICdtc2c6IHt9Jy5mb3JtYXQoJ1J1biEnKSkKK3JlbmFtZWRfbG9nZ2luZy5pbmZvKCJSZWFkIHtsOixkfSByb3dzIi5mb3JtYXQobD0xMjM0NTY3ODkpKQorcmVuYW1lZF9sb2dnaW5nLmluZm8oVU5JTkZFUkFCTEUuZm9ybWF0KGw9MTIzNDU2Nzg5KSkKKworCitjbGFzcyBMb2dnZXIocmVuYW1lZF9sb2dnaW5nLkxvZ2dlcik6CisgICAgcGFzcworCitjdXN0b21fbG9nZ2VyID0gTG9nZ2VyKCd0aHJlZScpCitjdXN0b21fbG9nZ2VyLmluZm8oJ3Rlc3RpbmcgezB9Jy5mb3JtYXQoJ2luZm8nKSkgICMgW2xvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb25dCitjdXN0b21fbG9nZ2VyLmluZm8oJ3Rlc3RpbmcgJXMnICUgJ2luZm8nKSAgIyBbbG9nZ2luZy1ub3QtbGF6eV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2Zvcm1hdF9pbnRlcnBvbGF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2Zvcm1hdF9pbnRlcnBvbGF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM3YjcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfZm9ybWF0X2ludGVycG9sYXRpb24udHh0CkBAIC0wLDAgKzEsNyBAQAorbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbjoxNjoyMjo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCitsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uOjE3OjQzOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb246MTg6MjI6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbjoxOTo0Mzo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCitsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uOjIwOjIxOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb246MzY6MTk6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1ub3QtbGF6eTozNzowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2Zvcm1hdF9pbnRlcnBvbGF0aW9uX3B5MzYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbl9weTM2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDFjNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbl9weTM2LnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiVGVzdCBsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbiBmb3IgUHl0aG9uIDMuNiIiIgoraW1wb3J0IGxvZ2dpbmcgYXMgcmVuYW1lZF9sb2dnaW5nCisKKworcmVuYW1lZF9sb2dnaW5nLmluZm8oZidSZWFkIHtyZW5hbWVkX2xvZ2dpbmd9IGZyb20gZ2xvYmFscycpICAjIFtsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2Zvcm1hdF9pbnRlcnBvbGF0aW9uX3B5MzYucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbl9weTM2LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbl9weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfZm9ybWF0X2ludGVycG9sYXRpb25fcHkzNi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mb3JtYXRfaW50ZXJwb2xhdGlvbl9weTM2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRlNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfZm9ybWF0X2ludGVycG9sYXRpb25fcHkzNi50eHQKQEAgLTAsMCArMSBAQAorbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb246NTowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2ZzdHJpbmdfaW50ZXJwb2xhdGlvbl9weTM2LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfZnN0cmluZ19pbnRlcnBvbGF0aW9uX3B5MzYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlYmI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2ZzdHJpbmdfaW50ZXJwb2xhdGlvbl9weTM2LnB5CkBAIC0wLDAgKzEsMjEgQEAKKyIiIlRlc3QgbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb24gZm9yIFB5dGhvbiAzLjYiIiIKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorCitmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQorCitpbXBvcnQgbG9nZ2luZyBhcyByZW5hbWVkX2xvZ2dpbmcKKworCitsb2NhbF92YXJfMSA9IDQKK2xvY2FsX3Zhcl8yID0gInJ1biEiCisKK3BpID0gMy4xNDE1OTI2NQorCittYXlfMTQgPSBkYXRldGltZSh5ZWFyPTIwMTgsIG1vbnRoPTUsIGRheT0xNCkKKworIyBTdGF0ZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGZsYWdnZWQ6CityZW5hbWVkX2xvZ2dpbmcuZGVidWcoZid7bG9jYWxfdmFyXzF9IHtsb2NhbF92YXJfMn0nKSAjIFtsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbl0KK3JlbmFtZWRfbG9nZ2luZy5sb2cocmVuYW1lZF9sb2dnaW5nLkRFQlVHLCBmJ21zZzoge2xvY2FsX3Zhcl8yfScpICMgW2xvZ2dpbmctZnN0cmluZy1pbnRlcnBvbGF0aW9uXQorcmVuYW1lZF9sb2dnaW5nLmxvZyhyZW5hbWVkX2xvZ2dpbmcuREVCVUcsIGYncGk6IHtwaTouM2Z9JykgIyBbbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb25dCityZW5hbWVkX2xvZ2dpbmcuaW5mbyhmIntsb2NhbF92YXJfMi51cHBlcigpfSIpICMgW2xvZ2dpbmctZnN0cmluZy1pbnRlcnBvbGF0aW9uXQorcmVuYW1lZF9sb2dnaW5nLmluZm8oZiJ7bWF5XzE0OiclYiAlZDogJVknfSIpICMgW2xvZ2dpbmctZnN0cmluZy1pbnRlcnBvbGF0aW9uXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfZnN0cmluZ19pbnRlcnBvbGF0aW9uX3B5MzYucmMgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mc3RyaW5nX2ludGVycG9sYXRpb25fcHkzNi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfZnN0cmluZ19pbnRlcnBvbGF0aW9uX3B5MzYucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My42CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mc3RyaW5nX2ludGVycG9sYXRpb25fcHkzNi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19mc3RyaW5nX2ludGVycG9sYXRpb25fcHkzNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyOWIzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX2ZzdHJpbmdfaW50ZXJwb2xhdGlvbl9weTM2LnR4dApAQCAtMCwwICsxLDUgQEAKK2xvZ2dpbmctZnN0cmluZy1pbnRlcnBvbGF0aW9uOjE3OjA6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb246MTg6MDo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCitsb2dnaW5nLWZzdHJpbmctaW50ZXJwb2xhdGlvbjoxOTowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctZnN0cmluZy1pbnRlcnBvbGF0aW9uOjIwOjA6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1mc3RyaW5nLWludGVycG9sYXRpb246MjE6MDo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19ub3RfbGF6eS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX25vdF9sYXp5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19ub3RfbGF6eS5weQpAQCAtMCwwICsxLDIzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxuby1tZW1iZXIsZGVwcmVjYXRlZC1tZXRob2QsaW52YWxpZC1uYW1lCisKKyMgTXVjayB1cCB0aGUgbmFtZXMgaW4gYW4gZWZmb3J0IHRvIGNvbmZ1c2UuLi4KK2ltcG9ydCBsb2dnaW5nIGFzIHJlbmFtZWRfbG9nZ2luZworaW1wb3J0IG9zIGFzIGxvZ2dpbmcKKwordmFyID0gIjEyMyIKK3Zhcl9uYW1lID0gJ1ZhcjonCisjIFN0YXRlbWVudHMgdGhhdCBzaG91bGQgYmUgZmxhZ2dlZDoKK3JlbmFtZWRfbG9nZ2luZy53YXJuKCclcywgJXMnICUgKDQsIDUpKSAgICAgICAgICAgICAjIFtsb2dnaW5nLW5vdC1sYXp5XQorcmVuYW1lZF9sb2dnaW5nLmV4Y2VwdGlvbignJXMnICUgJ0V4Y2VwdGlvbmFsIScpICAgICMgW2xvZ2dpbmctbm90LWxhenldCityZW5hbWVkX2xvZ2dpbmcubG9nKHJlbmFtZWRfbG9nZ2luZy5JTkZPLCAnbXNnOiAlcycgJSAnUnVuIScpICAjIFtsb2dnaW5nLW5vdC1sYXp5XQorcmVuYW1lZF9sb2dnaW5nLmxvZyhyZW5hbWVkX2xvZ2dpbmcuSU5GTywgIlZhcjogIiArIHZhcikgICMgW2xvZ2dpbmctbm90LWxhenldCityZW5hbWVkX2xvZ2dpbmcud2FybignJXMnICsgJyB0aGUgcmVzdCBvZiBhIHNpbmdsZSBzdHJpbmcnKSAjIFtsb2dnaW5nLW5vdC1sYXp5XQorcmVuYW1lZF9sb2dnaW5nLmxvZyhyZW5hbWVkX2xvZ2dpbmcuSU5GTywgdmFyX25hbWUgKyB2YXIpICMgW2xvZ2dpbmctbm90LWxhenldCisKK3Zhcl9uYW1lID0gJ1ZhcjonCisjIFN0YXRlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIGZsYWdnZWQ6CityZW5hbWVkX2xvZ2dpbmcud2FybignJXMsICVzJywgNCwgNSkKK3JlbmFtZWRfbG9nZ2luZy5sb2cocmVuYW1lZF9sb2dnaW5nLklORk8sICdtc2c6ICVzJywgJ1J1biEnKQorbG9nZ2luZy53YXJuKCclcywgJXMnICUgKDQsIDUpKQorbG9nZ2luZy5sb2cobG9nZ2luZy5JTkZPLCAnbXNnOiAlcycgJSAnUnVuIScpCitsb2dnaW5nLmxvZygiVmFyOiAiICsgdmFyKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfbm90X2xhenkudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfbm90X2xhenkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTFjMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19ub3RfbGF6eS50eHQKQEAgLTAsMCArMSw2IEBACitsb2dnaW5nLW5vdC1sYXp5OjEwOjA6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1ub3QtbGF6eToxMTowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctbm90LWxhenk6MTI6MDo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCitsb2dnaW5nLW5vdC1sYXp5OjEzOjA6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1ub3QtbGF6eToxNDowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctbm90LWxhenk6MTU6MDo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19ub3RfbGF6eV93aXRoX2xvZ2dlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX25vdF9sYXp5X3dpdGhfbG9nZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMjIyMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9nZ2luZ19ub3RfbGF6eV93aXRoX2xvZ2dlci5weQpAQCAtMCwwICsxLDEzIEBACisiIiJMb2dnaW5nIHdhcm5pbmdzIHVzaW5nIGEgbG9nZ2VyIGNsYXNzLiIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2ltcG9ydCBsb2dnaW5nCisKK19fcmV2aXNpb25fXyA9ICcnCisKK0xPRyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJkb21haW4iKQorTE9HLmRlYnVnKCIlcyIgJSAianVuayIpICAjIFtsb2dnaW5nLW5vdC1sYXp5XQorTE9HLmxvZyhsb2dnaW5nLkRFQlVHLCAiJXMiICUgImp1bmsiKSAgIyBbbG9nZ2luZy1ub3QtbGF6eV0KK0xPRzIgPSBMT0cuZGVidWcKK0xPRzIoIiVzIiAlICJqdW5rIikgICMgW2xvZ2dpbmctbm90LWxhenldCisKK2xvZ2dpbmcuZ2V0TG9nZ2VyKCJkb21haW4iKS5kZWJ1ZygiJXMiICUgImp1bmsiKSAgIyBbbG9nZ2luZy1ub3QtbGF6eV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX25vdF9sYXp5X3dpdGhfbG9nZ2VyLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dnaW5nX25vdF9sYXp5X3dpdGhfbG9nZ2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWZlNDVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2dpbmdfbm90X2xhenlfd2l0aF9sb2dnZXIudHh0CkBAIC0wLDAgKzEsNCBAQAorbG9nZ2luZy1ub3QtbGF6eTo4OjA6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1ub3QtbGF6eTo5OjA6OlVzZSBsYXp5ICUgZm9ybWF0dGluZyBpbiBsb2dnaW5nIGZ1bmN0aW9ucworbG9nZ2luZy1ub3QtbGF6eToxMTowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctbm90LWxhenk6MTM6MDo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9naWNhbF90YXV0b2xvZ3kucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9naWNhbF90YXV0b2xvZ3kucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxMzNiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dpY2FsX3RhdXRvbG9neS5weQpAQCAtMCwwICsxLDQwIEBACisiIiJDaGVjayBmb3IgbG9naWNhbCB0YXV0b2xvZ3ksIHdoZW4gYSB2YWx1ZSBpcyBjb21wYXJlZCBhZ2FpbnN0IGl0c2VsZi4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBkaXNhbGxvd2VkLW5hbWUsIHNpbmdsZXRvbi1jb21wYXJpc29uLCB0b28tbWFueS1yZXR1cm4tc3RhdGVtZW50cywgaW5jb25zaXN0ZW50LXJldHVybi1zdGF0ZW1lbnRzLCBuby1lbHNlLXJldHVybiwgdG9vLW1hbnktYnJhbmNoZXMsIGxpdGVyYWwtY29tcGFyaXNvbgorCitkZWYgZm9vKCk6CisgICAgYXJnID0gNzg2CisgICAgaWYgYXJnID09IGFyZzogIyBbY29tcGFyaXNvbi13aXRoLWl0c2VsZl0KKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIGFyZyAhPSBhcmc6ICMgW2NvbXBhcmlzb24td2l0aC1pdHNlbGZdCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBhcmcgPiBhcmc6ICMgW2NvbXBhcmlzb24td2l0aC1pdHNlbGZdCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBhcmcgPD0gYXJnOiAjIFtjb21wYXJpc29uLXdpdGgtaXRzZWxmXQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsaWYgTm9uZSA9PSBOb25lOiAjIFtjb21wYXJpc29uLXdpdGgtaXRzZWxmXQorICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsaWYgNzg2ID09IDc4NjogIyBbY29tcGFyaXNvbi13aXRoLWl0c2VsZl0KKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIDc4NiBpcyA3ODY6ICMgW2NvbXBhcmlzb24td2l0aC1pdHNlbGZdCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiA3ODYgaXMgbm90IDc4NjogIyBbY29tcGFyaXNvbi13aXRoLWl0c2VsZl0KKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIGFyZyBpcyBhcmc6ICMgW2NvbXBhcmlzb24td2l0aC1pdHNlbGZdCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxpZiBhcmcgaXMgbm90IGFyZzogIyBbY29tcGFyaXNvbi13aXRoLWl0c2VsZl0KKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIFRydWUgaXMgVHJ1ZTogIyBbY29tcGFyaXNvbi13aXRoLWl0c2VsZl0KKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbGlmIDY2NiA9PSA3ODY6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKKworZGVmIGJhcigpOgorICAgIGFyZyA9IDY2NgorICAgIHJldHVybiA2NjYgaWYgYXJnICE9IGFyZyBlbHNlIDc4NiAjIFtjb21wYXJpc29uLXdpdGgtaXRzZWxmXQorCitkZWYgZm9vYmFyKCk6CisgICAgYXJnID0gNzg2CisgICAgcmV0dXJuIGFyZyA+IDc4NgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9sL2xvZ2ljYWxfdGF1dG9sb2d5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dpY2FsX3RhdXRvbG9neS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhNjRjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb2dpY2FsX3RhdXRvbG9neS50eHQKQEAgLTAsMCArMSwxMiBAQAorY29tcGFyaXNvbi13aXRoLWl0c2VsZjo2Ojc6Zm9vOlJlZHVuZGFudCBjb21wYXJpc29uIC0gYXJnID09IGFyZworY29tcGFyaXNvbi13aXRoLWl0c2VsZjo4Ojk6Zm9vOlJlZHVuZGFudCBjb21wYXJpc29uIC0gYXJnICE9IGFyZworY29tcGFyaXNvbi13aXRoLWl0c2VsZjoxMDo5OmZvbzpSZWR1bmRhbnQgY29tcGFyaXNvbiAtIGFyZyA+IGFyZworY29tcGFyaXNvbi13aXRoLWl0c2VsZjoxMjo5OmZvbzpSZWR1bmRhbnQgY29tcGFyaXNvbiAtIGFyZyA8PSBhcmcKK2NvbXBhcmlzb24td2l0aC1pdHNlbGY6MTQ6OTpmb286UmVkdW5kYW50IGNvbXBhcmlzb24gLSBOb25lID09IE5vbmUKK2NvbXBhcmlzb24td2l0aC1pdHNlbGY6MTY6OTpmb286UmVkdW5kYW50IGNvbXBhcmlzb24gLSA3ODYgPT0gNzg2Citjb21wYXJpc29uLXdpdGgtaXRzZWxmOjE4Ojk6Zm9vOlJlZHVuZGFudCBjb21wYXJpc29uIC0gNzg2IGlzIDc4NgorY29tcGFyaXNvbi13aXRoLWl0c2VsZjoyMDo5OmZvbzpSZWR1bmRhbnQgY29tcGFyaXNvbiAtIDc4NiBpcyBub3QgNzg2Citjb21wYXJpc29uLXdpdGgtaXRzZWxmOjIyOjk6Zm9vOlJlZHVuZGFudCBjb21wYXJpc29uIC0gYXJnIGlzIGFyZworY29tcGFyaXNvbi13aXRoLWl0c2VsZjoyNDo5OmZvbzpSZWR1bmRhbnQgY29tcGFyaXNvbiAtIGFyZyBpcyBub3QgYXJnCitjb21wYXJpc29uLXdpdGgtaXRzZWxmOjI2Ojk6Zm9vOlJlZHVuZGFudCBjb21wYXJpc29uIC0gVHJ1ZSBpcyBUcnVlCitjb21wYXJpc29uLXdpdGgtaXRzZWxmOjM2OjE4OmJhcjpSZWR1bmRhbnQgY29tcGFyaXNvbiAtIGFyZyAhPSBhcmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb25nX2xpbmVzX3dpdGhfdXRmOC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb25nX2xpbmVzX3dpdGhfdXRmOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWQ5MGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvbmdfbGluZXNfd2l0aF91dGY4LnB5CkBAIC0wLDAgKzEsNyBAQAorIyBjb2Rpbmc6IHV0Zi04CisiIiJUZXN0IGRhdGEgZmlsZSBmaWxlcyB3aXRoIG5vbi1BU0NJSSBjb250ZW50LiIiIgorCisKK1RISVNfSVNfQV9MT05HX1ZBUklBQkxFX05BTUUgPSAn0KHRg9GJ0LXRgdGC0LLQuNGC0LXQu9GM0L3QvtC1INCn0LDRgdGC0LjRhtCwJyAgIyBidXQgdGhlIGxpbmUgaXMgb2theQorCitUSElTX0lTX0FfVkVSWV9MT05HX1ZBUklBQkxFX05BTUUgPSAn0KHRg9GJ0LXRgdGC0LLQuNGC0LXQu9GM0L3QvtC1INCn0LDRgdGC0LjRhtCwJyAgIyBhbmQgdGhlIGxpbmUgaXMgbm90IG9rYXkgICMgW2xpbmUtdG9vLWxvbmddCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9uZ19saW5lc193aXRoX3V0ZjgudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvbmdfbGluZXNfd2l0aF91dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ0MGZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvbmdfbGluZXNfd2l0aF91dGY4LnR4dApAQCAtMCwwICsxIEBACitsaW5lLXRvby1sb25nOjc6MDo6TGluZSB0b28gbG9uZyAoMTA4LzEwMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb25nX3V0ZjhfbGluZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9uZ191dGY4X2xpbmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTc1OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9uZ191dGY4X2xpbmVzLnB5CkBAIC0wLDAgKzEsOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyIiInRoaXMgdXRmLTggZG9jIHN0cmluZyBoYXZlIHNvbWUgICAgIG5vbiBBU0NJSSBjYXJhY3RlcnMgbGlrZSAnw6knLCBvciAnwqLCu8OfJyIiIgorIyMjIGNoZWNrIGFsc28gY29tbWVudHMgd2l0aCBzb21lICAgICBtb3JlIG5vbiBBU0NJSSBjYXJhY3RlcnMgbGlrZSAnw6knIG9yICfCosK7w58nCisKK19fcmV2aXNpb25fXyA9IDExMDAKKworQVNDSUkgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK1VURl84ID0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tw6nDqSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb29wdmFyX2luX2RpY3RfY29tcF9weTI3LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9sL2xvb3B2YXJfaW5fZGljdF9jb21wX3B5MjcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyZWExYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb29wdmFyX2luX2RpY3RfY29tcF9weTI3LnB5CkBAIC0wLDAgKzEsOCBAQAorIiIiVGVzdHMgZm9yIGxvb3B2YXItaW4tY2xvc3VyZS4iIiIKKworX19yZXZpc2lvbl9fID0gMAorCisKK2RlZiBiYWRfY2FzZSgpOgorICAgICIiIkxvb3AgdmFyaWFibGUgZnJvbSBkaWN0IGNvbXByZWhlbnNpb24uIiIiCisgICAgcmV0dXJuIHt4OiBsYW1iZGE6IHggZm9yIHggaW4gcmFuZ2UoMTApfSAjIFtjZWxsLXZhci1mcm9tLWxvb3BdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9vcHZhcl9pbl9kaWN0X2NvbXBfcHkyNy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9vcHZhcl9pbl9kaWN0X2NvbXBfcHkyNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5OGZjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb29wdmFyX2luX2RpY3RfY29tcF9weTI3LnR4dApAQCAtMCwwICsxIEBACitjZWxsLXZhci1mcm9tLWxvb3A6ODoyMzpiYWRfY2FzZS48bGFtYmRhPjpDZWxsIHZhcmlhYmxlIHggZGVmaW5lZCBpbiBsb29wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL2wvbG9zdF9leGNlcHRpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9zdF9leGNlcHRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmZDNmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb3N0X2V4Y2VwdGlvbi5weQpAQCAtMCwwICsxLDM4IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdXNpbmctY29uc3RhbnQtdGVzdCxjZWxsLXZhci1mcm9tLWxvb3AKKworZGVmIGluc2lkaW91c19icmVha19hbmRfcmV0dXJuKCk6CisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgLTUsIC0xKToKKyAgICAgICAgbXlfdmFyID0gMAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG15X3ZhciArPSAxLjAvaQorICAgICAgICAgICAgaWYgaSA8IC0zOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4gbXlfdmFyCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBpID4gLTI6CisgICAgICAgICAgICAgICAgYnJlYWsgIyBbbG9zdC1leGNlcHRpb25dCisgICAgICAgICAgICByZXR1cm4gbXlfdmFyICMgW2xvc3QtZXhjZXB0aW9uXQorICAgIHJldHVybiBOb25lCisKKworZGVmIGJyZWFrX2FuZF9yZXR1cm4oKToKKyAgICBmb3IgaSBpbiByYW5nZSgwLCAtNSwgLTEpOgorICAgICAgICBteV92YXIgPSAwCisgICAgICAgIGlmIGk6CisgICAgICAgICAgICBicmVhaworICAgICAgICB0cnk6CisgICAgICAgICAgICBteV92YXIgKz0gMS4wL2kKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKDIpOgorICAgICAgICAgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlZiBzdHJhbmdlKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXlfdmFyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgc3RyYW5nZSgpCisgICAgICAgIGlmIGk6CisgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbC9sb3N0X2V4Y2VwdGlvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9zdF9leGNlcHRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzkxZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL2wvbG9zdF9leGNlcHRpb24udHh0CkBAIC0wLDAgKzEsMiBAQAorbG9zdC1leGNlcHRpb246MTQ6MTY6aW5zaWRpb3VzX2JyZWFrX2FuZF9yZXR1cm46YnJlYWsgc3RhdGVtZW50IGluIGZpbmFsbHkgYmxvY2sgbWF5IHN3YWxsb3cgZXhjZXB0aW9uCitsb3N0LWV4Y2VwdGlvbjoxNToxMjppbnNpZGlvdXNfYnJlYWtfYW5kX3JldHVybjpyZXR1cm4gc3RhdGVtZW50IGluIGZpbmFsbHkgYmxvY2sgbWF5IHN3YWxsb3cgZXhjZXB0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vX19pbml0X18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21hcHBpbmdfY29udGV4dC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzYTEzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHQucHkKQEAgLTAsMCArMSwxMDkgQEAKKyIiIgorQ2hlY2tzIHRoYXQgb25seSB2YWxpZCB2YWx1ZXMgYXJlIHVzZWQgaW4gYSBtYXBwaW5nIGNvbnRleHQuCisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLGludmFsaWQtbmFtZSx0b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLXNlbGYtdXNlLGltcG9ydC1lcnJvcix3cm9uZy1pbXBvcnQtcG9zaXRpb24sIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKKworZGVmIHRlc3QoKiprd2FyZ3MpOgorICAgIHByaW50KGt3YXJncykKKworCisjIGRpY3Rpb25hcnkgdmFsdWUvY29tcHJlaGVuc2lvbgorZGljdF92YWx1ZSA9IGRpY3QoYT0xLCBiPTIsIGM9MykKK2RpY3RfY29tcCA9IHtjaHIoeCk6IHggZm9yIHggaW4gcmFuZ2UoMjU2KX0KK3Rlc3QoKipkaWN0X3ZhbHVlKQordGVzdCgqKmRpY3RfY29tcCkKKworCisjIGluIG9yZGVyIHRvIGJlIHVzZWQgaW4ga3dhcmdzIGN1c3RvbSBtYXBwaW5nIGNsYXNzIHNob3VsZCBkZWZpbmUKKyMgX19pdGVyX18oKSwgX19nZXRpdGVtX18oa2V5KSBhbmQga2V5cygpLgorY2xhc3MgQ3VzdG9tTWFwcGluZyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGljdChhPTEsIGI9MiwgYz0zLCBkPTQsIGU9NSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2tleV0KKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmtleXMoKQorCit0ZXN0KCoqQ3VzdG9tTWFwcGluZygpKQordGVzdCgqKkN1c3RvbU1hcHBpbmcpICAjIFtub3QtYS1tYXBwaW5nXQorCitjbGFzcyBOb3RNYXBwaW5nKG9iamVjdCk6CisgICAgcGFzcworCit0ZXN0KCoqTm90TWFwcGluZygpKSAgIyBbbm90LWEtbWFwcGluZ10KKworIyBza2lwIGNoZWNrcyBpZiBzdGF0ZW1lbnQgaXMgaW5zaWRlIG1peGluL2Jhc2UvYWJzdHJhY3QgY2xhc3MKK2NsYXNzIFNvbWVNaXhpbihvYmplY3QpOgorICAgIGt3YXJncyA9IE5vbmUKKworICAgIGRlZiBnZXRfa3dhcmdzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5rd2FyZ3MKKworICAgIGRlZiBydW4oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBwcmludChrd2FyZ3MpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZik6CisgICAgICAgIGt3cyA9IHNlbGYuZ2V0X2t3YXJncygpCisgICAgICAgIHNlbGYucnVuKCoqa3dzKQorCitjbGFzcyBBYnN0cmFjdFRoaW5nKG9iamVjdCk6CisgICAga3dhcmdzID0gTm9uZQorCisgICAgZGVmIGdldF9rd2FyZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmt3YXJncworCisgICAgZGVmIHJ1bihzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHByaW50KGt3YXJncykKKworICAgIGRlZiBkaXNwYXRjaChzZWxmKToKKyAgICAgICAga3dzID0gc2VsZi5nZXRfa3dhcmdzKCkKKyAgICAgICAgc2VsZi5ydW4oKiprd3MpCisKK2NsYXNzIEJhc2VUaGluZyhvYmplY3QpOgorICAgIGt3YXJncyA9IE5vbmUKKworICAgIGRlZiBnZXRfa3dhcmdzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5rd2FyZ3MKKworICAgIGRlZiBydW4oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBwcmludChrd2FyZ3MpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZik6CisgICAgICAgIGt3cyA9IHNlbGYuZ2V0X2t3YXJncygpCisgICAgICAgIHNlbGYucnVuKCoqa3dzKQorCisjIGFic3RyYWN0IGNsYXNzCitjbGFzcyBUaGluZyhvYmplY3QpOgorICAgIGRlZiBnZXRfa3dhcmdzKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgcnVuKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcHJpbnQoa3dhcmdzKQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYpOgorICAgICAgICBrd2FyZ3MgPSBzZWxmLmdldF9rd2FyZ3MoKQorICAgICAgICBzZWxmLnJ1bigqKmt3YXJncykKKworIyBza2lwIHVuaW5mZXJhYmxlIGluc3RhbmNlcworZnJvbSBzb21lX21pc3NpbmdfbW9kdWxlIGltcG9ydCBNYXBwaW5nCisKK2NsYXNzIE15Q2xhc3MoTWFwcGluZyk6CisgICAgcGFzcworCit0ZXN0KCoqTXlDbGFzcygpKQorCisKK2NsYXNzIEhhc0R5bmFtaWNHZXRhdHRyKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX29iaiA9IHt9CisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX29iaiwgYXR0cikKKworCit0ZXN0KCoqSGFzRHluYW1pY0dldGF0dHIoKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21hcHBpbmdfY29udGV4dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyNjM1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHQudHh0CkBAIC0wLDAgKzEsMiBAQAorbm90LWEtbWFwcGluZzozMjo3OjpOb24tbWFwcGluZyB2YWx1ZSBDdXN0b21NYXBwaW5nIGlzIHVzZWQgaW4gYSBtYXBwaW5nIGNvbnRleHQKK25vdC1hLW1hcHBpbmc6Mzc6Nzo6Tm9uLW1hcHBpbmcgdmFsdWUgTm90TWFwcGluZygpIGlzIHVzZWQgaW4gYSBtYXBwaW5nIGNvbnRleHQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHRfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21hcHBpbmdfY29udGV4dF9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyZDRkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHRfcHkzLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLGludmFsaWQtbmFtZSx0b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLXNlbGYtdXNlCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2RlZiB0ZXN0KCoqa3dhcmdzKToKKyAgICBwcmludChrd2FyZ3MpCisKKyMgbWV0YWNsYXNzZXMgYXMgbWFwcGluZ3MKK2NsYXNzIE1ldGEodHlwZSk6CisgICAgZGVmIF9fZ2V0aXRlbV9fKGNscywga2V5KToKKyAgICAgICAgcmV0dXJuIG9yZChrZXkpCisKKyAgICBkZWYga2V5cyhjbHMpOgorICAgICAgICByZXR1cm4gWydhJywgJ2InLCAnYyddCisKK2NsYXNzIFNvbWVDbGFzcyhtZXRhY2xhc3M9TWV0YSk6CisgICAgcGFzcworCit0ZXN0KCoqU29tZUNsYXNzKQordGVzdCgqKlNvbWVDbGFzcygpKSAgIyBbbm90LWEtbWFwcGluZ10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHRfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21hcHBpbmdfY29udGV4dF9weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tYXBwaW5nX2NvbnRleHRfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21hcHBpbmdfY29udGV4dF9weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21hcHBpbmdfY29udGV4dF9weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzQ5MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWFwcGluZ19jb250ZXh0X3B5My50eHQKQEAgLTAsMCArMSBAQAorbm90LWEtbWFwcGluZzoxOTo3OjpOb24tbWFwcGluZyB2YWx1ZSBTb21lQ2xhc3MoKSBpcyB1c2VkIGluIGEgbWFwcGluZyBjb250ZXh0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3MucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3OWQxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrcy5weQpAQCAtMCwwICsxLDIzMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9cHJpbnQtc3RhdGVtZW50LG1pc3NpbmctZG9jc3RyaW5nLG5vLXNlbGYtdXNlLHRvby1mZXctcHVibGljLW1ldGhvZHMsYmFyZS1leGNlcHQsYnJvYWQtZXhjZXB0LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW51c2VkLXByaXZhdGUtbWVtYmVyCisjIHB5bGludDogZGlzYWJsZT11c2luZy1jb25zdGFudC10ZXN0LGV4cHJlc3Npb24tbm90LWFzc2lnbmVkLCBhc3NpZ25pbmctbm9uLXNsb3QsIHVudXNlZC12YXJpYWJsZSxwb2ludGxlc3Mtc3RhdGVtZW50LCB3cm9uZy1pbXBvcnQtb3JkZXIsIHdyb25nLWltcG9ydC1wb3NpdGlvbixpbXBvcnQtb3V0c2lkZS10b3BsZXZlbAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorY2xhc3MgUHJvdmlkZXIob2JqZWN0KToKKyAgICAiIiJwcm92aWRlIHNvbWUgYXR0cmlidXRlcyBhbmQgbWV0aG9kIiIiCisgICAgY2F0dHIgPSA0CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmF0dHIgPSA0CisgICAgZGVmIG1ldGhvZChzZWxmLCB2YWwpOgorICAgICAgICAiIiJpbXByZXNzaXZlIG1ldGhvZCIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyICogdmFsCisgICAgZGVmIGhvcGhvcChzZWxmKToKKyAgICAgICAgIiIiaG9wIG1ldGhvZCIiIgorICAgICAgICBwcmludCgnaG9wIGhvcCBob3AnLCBzZWxmKQorCisKK2NsYXNzIENsaWVudChvYmplY3QpOgorICAgICIiInVzZSBwcm92aWRlciBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9wcm92ID0gUHJvdmlkZXIoKQorICAgICAgICBzZWxmLl9wcm92X2F0dHIgPSBQcm92aWRlci5jYXR0cgorICAgICAgICBzZWxmLl9wcm92X2F0dHIyID0gUHJvdmlkZXIuY2F0dHJpYnV0ZSAgIyBbbm8tbWVtYmVyXQorICAgICAgICBzZWxmLnNldF9sYXRlciA9IDAKKworICAgIGRlZiBzZXRfc2V0X2xhdGVyKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIic2V0IHNldF9sYXRlciBhdHRyaWJ1dGUgKGludHJvZHVjZSBhbiBpbmZlcmVuY2UgYW1iaWd1aXR5KSIiIgorICAgICAgICBzZWxmLnNldF9sYXRlciA9IHZhbHVlCisKKyAgICBkZWYgdXNlX21ldGhvZChzZWxmKToKKyAgICAgICAgIiIidXNlIHByb3ZpZGVyJ3MgbWV0aG9kIiIiCisgICAgICAgIHNlbGYuX3Byb3YuaG9waG9wKCkKKyAgICAgICAgc2VsZi5fcHJvdi5ob3Bob3Bob3AoKSAgIyBbbm8tbWVtYmVyXQorCisgICAgZGVmIHVzZV9hdHRyKHNlbGYpOgorICAgICAgICAiIiJ1c2UgcHJvdmlkZXIncyBhdHRyIiIiCisgICAgICAgIHByaW50KHNlbGYuX3Byb3YuYXR0cikKKyAgICAgICAgcHJpbnQoc2VsZi5fcHJvdi5hdHRyaWJ1dGUpICAjIFtuby1tZW1iZXJdCisKKyAgICBkZWYgZGVidWcoc2VsZik6CisgICAgICAgICIiInByaW50IGRlYnVnIGluZm9ybWF0aW9uIiIiCisgICAgICAgIHByaW50KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQorICAgICAgICBwcmludChzZWxmLl9fZG9jX18pCisgICAgICAgIHByaW50KHNlbGYuX19kaWN0X18pCisgICAgICAgIHByaW50KHNlbGYuX19tb2R1bGVfXykKKworICAgIGRlZiB0ZXN0X2J0X3R5cGVzKHNlbGYpOgorICAgICAgICAiIiJ0ZXN0IGFjY2VzcyB0byB1bmV4aXN0YW50IG1lbWJlciBvZiBidWlsdGluIHR5cGVzIiIiCisgICAgICAgIGxpcyA9IFtdCisgICAgICAgIGxpcy5hcHBwZW5kKHNlbGYpICAjIFtuby1tZW1iZXJdCisgICAgICAgIGRpYyA9IHt9CisgICAgICAgIGRpYy5zZXQoc2VsZikgICMgW25vLW1lbWJlcl0KKyAgICAgICAgdHVwID0gKCkKKyAgICAgICAgdHVwLmFwcGVuZChzZWxmKSAgIyBbbm8tbWVtYmVyXQorICAgICAgICBzdHJpbmcgPSAndG90bycKKyAgICAgICAgcHJpbnQoc3RyaW5nLmxvb3dlcigpKSAgIyBbbm8tbWVtYmVyXQorICAgICAgICBpbnRlZ2VyID0gMQorICAgICAgICBwcmludChpbnRlZ2VyLndoYXRldmVyKSAgIyBbbm8tbWVtYmVyXQorCisgICAgZGVmIHRlc3Rfbm9fZmFsc2VfcG9zaXRpdmVzKHNlbGYpOgorICAgICAgICBub25lID0gTm9uZQorICAgICAgICBwcmludChub25lLndoYXRldmVyKQorICAgICAgICAjIE5vIG1pc3NzaW5nIGluIHRoZSBwYXJlbnRzLgorICAgICAgICBzdXBlcigpLm1pc3NzaW5nKCkgIyBbbm8tbWVtYmVyXQorCisKK2NsYXNzIE1peGluKG9iamVjdCk6CisgICAgIiIiTm8gbm8tbWVtYmVyIHNob3VsZCBiZSBlbWl0dGVkIGZvciBtaXhpbnMuIiIiCisKK2NsYXNzIEdldGF0dHIob2JqZWN0KToKKyAgICAiIiJuby1tZW1iZXIgc2hvdWxkbid0IGJlIGVtaXR0ZWQgZm9yIGNsYXNzZXMgd2l0aCBkdW5kZXIgZ2V0YXR0ci4iIiIKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bYXR0cl0KKworCitjbGFzcyBHZXRhdHRyaWJ1dGUob2JqZWN0KToKKyAgICAiIiJuby1tZW1iZXIgc2hvdWxkbid0IGJlIGVtaXR0ZWQgZm9yIGNsYXNzZXMgd2l0aCBkdW5kZXIgZ2V0YXR0cmlidXRlLiIiIgorCisgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgYXR0cik6CisgICAgICAgIHJldHVybiA0MgorCitwcmludChvYmplY3QuX19pbml0X18pCitwcmludChwcm9wZXJ0eS5fX2luaXRfXykKK3ByaW50KENsaWVudCgpLnNldF9sYXRlci5sb3dlcigpKQorcHJpbnQoTWl4aW4oKS5uYW5hbmEoKSkKK3ByaW50KEdldGF0dHIoKS5uYW5hbmFuKCkpCitwcmludChHZXRhdHRyaWJ1dGUoKS5iYXRtYW4oKSkKKwordHJ5OgorICAgIENsaWVudCgpLm1pc3NpbmdfbWV0aG9kKCkKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBwYXNzCisKK3RyeToKKyAgICBDbGllbnQoKS5pbmRlZWQoKSAjIFtuby1tZW1iZXJdCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCit0cnk6CisgICAgQ2xpZW50Lm1pc3NpbmcoKQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIENsaWVudC5taXNzaW5nKCkgIyBbbm8tbWVtYmVyXQorCit0cnk6CisgICAgQ2xpZW50Lm1pc3NpbmcoKQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHRyeToKKyAgICAgICAgQ2xpZW50Lm1pc3NpbmcoKSAjIFtuby1tZW1iZXJdCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKwordHJ5OgorICAgIGlmIENsaWVudDoKKyAgICAgICAgQ2xpZW50KCkubWlzc2luZygpCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcGFzcworCit0cnk6CisgICAgQ2xpZW50KCkuaW5kZWVkKCkKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICB0cnk6CisgICAgICAgIENsaWVudC5taXNzaW5nKCkgIyBbbm8tbWVtYmVyXQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHBhc3MKKworCitjbGFzcyBTdXBlckNoZWNrcyhzdHIsIHN0cik6ICMgcHlsaW50OiBkaXNhYmxlPWR1cGxpY2F0ZS1iYXNlcworICAgICIiIkRvbid0IGZhaWwgd2hlbiB0aGUgTVJPIGlzIGludmFsaWQuIiIiCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHN1cGVyKCkubGFsYWxhKCkKKwordHlwZShDbGllbnQoKSkuYWxhICMgW25vLW1lbWJlcl0KK3R5cGUoe30pLmJhbGEgIyBbbm8tbWVtYmVyXQordHlwZSgnJykucG9ydG9jYWxhICMgW25vLW1lbWJlcl0KKworCitkZWYgc29ja2V0X2ZhbHNlX3Bvc2l0aXZlKCk6CisgICAgIiIiVGVzdCBhIHJlZ3Jlc3Npb24KKyAgICBWZXJzaW9uIHVzZWQ6CisKKyAgICAtIFB5bGludCAwLjEwLjAKKyAgICAtIExvZ2lsYWIgY29tbW9uIDAuMTUuMAorICAgIC0gTG9naWxhYiBhc3Ryb2lkIDAuMTUuMQorCisgICAgRmFsc2UgRTExMDEgcG9zaXRpdmUsIGxpbmUgMjM6CisgICAgSW5zdGFuY2Ugb2YgJ19zb2NrZXRvYmplY3QnIGhhcyBubyAnY29ubmVjdCcgbWVtYmVyCisgICAgIiIiCisKKyAgICBpbXBvcnQgc29ja2V0CisgICAgc2NrdCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICBzY2t0LmNvbm5lY3QoKCcxMjcuMC4wLjEnLCA4MCkpCisgICAgc2NrdC5jbG9zZSgpCisKKworZGVmIG5vX2Nvbmp1Z2F0ZV9tZW1iZXIobWFnaWNfZmxhZyk6CisgICAgIiIic2hvdWxkIG5vdCByYWlzZSBFMTEwMSBvbiBzb21ldGhpbmcuY29uanVnYXRlIiIiCisgICAgaWYgbWFnaWNfZmxhZzoKKyAgICAgICAgc29tZXRoaW5nID0gMS4wCisgICAgZWxzZToKKyAgICAgICAgc29tZXRoaW5nID0gMS4wagorICAgIGlmIGlzaW5zdGFuY2Uoc29tZXRoaW5nLCBmbG9hdCk6CisgICAgICAgIHJldHVybiBzb21ldGhpbmcKKyAgICByZXR1cm4gc29tZXRoaW5nLmNvbmp1Z2F0ZSgpCisKKworY2xhc3MgTm9EdW5kZXJOYW1lSW5JbnN0YW5jZShvYmplY3QpOgorICAgICIiIkVtaXQgYSB3YXJuaW5nIHdoZW4gYWNjZXNzaW5nIF9fbmFtZV9fIGZyb20gYW4gaW5zdGFuY2UuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhciA9IHNlbGYuX19uYW1lX18gIyBbbm8tbWVtYmVyXQorCisKK2NsYXNzIEludmFsaWRBY2Nlc3NCeVNsb3RzKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdhJywgKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgdmFyID0gc2VsZi50ZXRhICMgW25vLW1lbWJlcl0KKyAgICAgICAgc2VsZi50ZXRhID0gMjQKKworCitjbGFzcyBNZXRhV2l0aER5bmFtaWNHZXRhdHRyKHR5cGUpOgorCisgICAgZGVmIF9fZ2V0YXR0cl9fKGNscywgYXR0cik6CisgICAgICAgIHJldHVybiBhdHRyCisKKworY2xhc3MgU29tZUNsYXNzKG9iamVjdCwgbWV0YWNsYXNzPU1ldGFXaXRoRHluYW1pY0dldGF0dHIpOgorICAgIHBhc3MKKworCitTb21lQ2xhc3MuZG9lc19ub3RfZXhpc3QKKworY2xhc3MgQ2xhc3NXaXRoTWFuZ2xlZEF0dHJpYnV0ZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lID0gJ0J1ZzE2NDMnCisgICAgZGVmIF9fYmFyKHNlbGYpOgorICAgICAgICBwcmludChzZWxmLm5hbWUgKyAieEQiKQorCitDbGFzc1dpdGhNYW5nbGVkQXR0cmlidXRlKCkuX0NsYXNzV2l0aE1hbmdsZWRBdHRyaWJ1dGVfX2JhcigpICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCisKKworaW1wb3J0IGVudW0KKworCitjbGFzcyBDbHMoZW51bS5JbnRFbnVtKToKKyAgICBCQVIgPSAwCisKKworU09NRV9WQUxVRSA9IENscy5CQVogICMgW25vLW1lbWJlcl0KKworCisKKyMgRG9lcyBub3QgY3Jhc2ggd2hlbiBpbmZlcnJpbmcgdGhlIGBhcHBlbmRgIGF0dHJpYnV0ZSBvbiB0aGUgc2xpY2Ugb2JqZWN0CitjbGFzcyBTb21lQ2xhc3NVc2luZ1NsaWNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGFnKToKKyAgICAgICAgaWYgZmxhZzoKKyAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlID0gc2xpY2UoTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlID0gW10KKyAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlLmFwcGVuZCgxKQorCitmcm9tIGVudW0gaW1wb3J0IEVudW0KK2NsYXNzIEFuaW1hbChFbnVtKToKKyAgICBBTlQgPSAxCisgICAgQkVFID0gMgorICAgIENBVCA9IDMKKyAgICBET0cgPSA0CisjIFRvIHRlc3QgZmFsc2UgcG9zaXRpdmUgbm8tbWVtYmVyIG9uIEVudW0uX19tZW1iZXJzX18uaXRlbXMoKQorZm9yIGl0bSBpbiBBbmltYWwuX19tZW1iZXJzX18uaXRlbXMoKToKKyAgICBwcmludChpdG0pCitmb3Iga2V5eSBpbiBBbmltYWwuX19tZW1iZXJzX18ua2V5cygpOiAgIyBweWxpbnQ6IGRpc2FibGU9Y29uc2lkZXItaXRlcmF0aW5nLWRpY3Rpb25hcnkKKyAgICBwcmludChrZXl5KQorZm9yIHZhbGwgaW4gQW5pbWFsLl9fbWVtYmVyc19fLnZhbHVlcygpOgorICAgIHByaW50KHZhbGwpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3MudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdlZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzLnR4dApAQCAtMCwwICsxLDE5IEBACituby1tZW1iZXI6MjM6Mjc6Q2xpZW50Ll9faW5pdF9fOkNsYXNzICdQcm92aWRlcicgaGFzIG5vICdjYXR0cmlidXRlJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MzM6ODpDbGllbnQudXNlX21ldGhvZDpJbnN0YW5jZSBvZiAnUHJvdmlkZXInIGhhcyBubyAnaG9waG9waG9wJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6Mzg6MTQ6Q2xpZW50LnVzZV9hdHRyOkluc3RhbmNlIG9mICdQcm92aWRlcicgaGFzIG5vICdhdHRyaWJ1dGUnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjo1MDo4OkNsaWVudC50ZXN0X2J0X3R5cGVzOkluc3RhbmNlIG9mICdsaXN0JyBoYXMgbm8gJ2FwcHBlbmQnIG1lbWJlcjsgbWF5YmUgJ2FwcGVuZCc/OklORkVSRU5DRQorbm8tbWVtYmVyOjUyOjg6Q2xpZW50LnRlc3RfYnRfdHlwZXM6SW5zdGFuY2Ugb2YgJ2RpY3QnIGhhcyBubyAnc2V0JyBtZW1iZXI7IG1heWJlICdnZXQnPzpJTkZFUkVOQ0UKK25vLW1lbWJlcjo1NDo4OkNsaWVudC50ZXN0X2J0X3R5cGVzOkluc3RhbmNlIG9mICd0dXBsZScgaGFzIG5vICdhcHBlbmQnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjo1NjoxNDpDbGllbnQudGVzdF9idF90eXBlczpJbnN0YW5jZSBvZiAnc3RyJyBoYXMgbm8gJ2xvb3dlcicgbWVtYmVyOyBtYXliZSAnbG93ZXInPzpJTkZFUkVOQ0UKK25vLW1lbWJlcjo1ODoxNDpDbGllbnQudGVzdF9idF90eXBlczpJbnN0YW5jZSBvZiAnaW50JyBoYXMgbm8gJ3doYXRldmVyJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6NjQ6ODpDbGllbnQudGVzdF9ub19mYWxzZV9wb3NpdGl2ZXM6U3VwZXIgb2YgJ0NsaWVudCcgaGFzIG5vICdtaXNzc2luZycgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjk2OjQ6Okluc3RhbmNlIG9mICdDbGllbnQnIGhhcyBubyAnaW5kZWVkJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MTAzOjQ6OkNsYXNzICdDbGllbnQnIGhhcyBubyAnbWlzc2luZycgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjEwOTo4OjpDbGFzcyAnQ2xpZW50JyBoYXMgbm8gJ21pc3NpbmcnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjoxMjM6ODo6Q2xhc3MgJ0NsaWVudCcgaGFzIG5vICdtaXNzaW5nJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MTMzOjA6OkNsYXNzICdDbGllbnQnIGhhcyBubyAnYWxhJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MTM0OjA6OkNsYXNzICdkaWN0JyBoYXMgbm8gJ2JhbGEnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjoxMzU6MDo6Q2xhc3MgJ3N0cicgaGFzIG5vICdwb3J0b2NhbGEnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjoxNzA6MTk6Tm9EdW5kZXJOYW1lSW5JbnN0YW5jZS5fX2luaXRfXzpJbnN0YW5jZSBvZiAnTm9EdW5kZXJOYW1lSW5JbnN0YW5jZScgaGFzIG5vICdfX25hbWVfXycgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjE3NjoxNDpJbnZhbGlkQWNjZXNzQnlTbG90cy5fX2luaXRfXzpJbnN0YW5jZSBvZiAnSW52YWxpZEFjY2Vzc0J5U2xvdHMnIGhhcyBubyAndGV0YScgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjIwODoxMzo6Q2xhc3MgJ0NscycgaGFzIG5vICdCQVonIG1lbWJlcjsgbWF5YmUgJ0JBUic/OklORkVSRU5DRQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2hpbnRzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2hpbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjVmNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaGludHMucHkKQEAgLTAsMCArMSwyNyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIHBvaW50bGVzcy1zdGF0ZW1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKKworY2xhc3MgUGFyZW50KG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3BhcmVudCA9IDQyCisgICAgICAgIHNlbGYuX3JlZ2lzdHJ5ID0ge30KKyAgICAgICAgc2VsZi5fc2ltaWxhcjEgPSAyNAorICAgICAgICBzZWxmLl9zaW1pbGFyMiA9IDIzCisgICAgICAgIHNlbGYuX3NpbWlsYXIzID0gMjQKKyAgICAgICAgc2VsZi5fcmVhbGx5X3NpbWlsYXIxID0gMjMKKyAgICAgICAgc2VsZi5fcmVhbGx5X3NpbWlsYXIyID0gNDIKKworCitjbGFzcyBDaGlsZChQYXJlbnQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKKworICAgICAgICBzZWxmLl9zaW1pbGFyICMgW25vLW1lbWJlcl0KKyAgICAgICAgc2VsZi5fcmVhbGx5X3NpbWlsYXIgIyBbbm8tbWVtYmVyXQorICAgICAgICBzZWxmLl9wYXJlbiAjIFtuby1tZW1iZXJdCisgICAgICAgICMgRGlzdGFuY2UgaXMgdG9vIGJpZworICAgICAgICBzZWxmLl9yZWdpc3RyeXl5eSAjIFtuby1tZW1iZXJdCisgICAgICAgICMgTm90aGluZyBjbG9zZS4KKyAgICAgICAgc2VsZi5fcHJldHR5X3N1cmVfdGhpc193b250X21hdGNoICMgW25vLW1lbWJlcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19oaW50cy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19oaW50cy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDRiNTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2hpbnRzLnJjCkBAIC0wLDAgKzEsMyBAQAorW1RZUEVDSEVDS10KK21pc3NpbmctbWVtYmVyLW1heC1jaG9pY2VzID0gMworbWlzc2luZy1tZW1iZXItaGludC1kaXN0YW5jZSA9IDEKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19oaW50cy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaGludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDk3N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaGludHMudHh0CkBAIC0wLDAgKzEsNSBAQAorbm8tbWVtYmVyOjIxOjg6Q2hpbGQuX19pbml0X186SW5zdGFuY2Ugb2YgJ0NoaWxkJyBoYXMgbm8gJ19zaW1pbGFyJyBtZW1iZXI7IG1heWJlIG9uZSBvZiAnX3NpbWlsYXIxJywgJ19zaW1pbGFyMicgb3IgJ19zaW1pbGFyMyc/OklORkVSRU5DRQorbm8tbWVtYmVyOjIyOjg6Q2hpbGQuX19pbml0X186SW5zdGFuY2Ugb2YgJ0NoaWxkJyBoYXMgbm8gJ19yZWFsbHlfc2ltaWxhcicgbWVtYmVyOyBtYXliZSBvbmUgb2YgJ19yZWFsbHlfc2ltaWxhcjEnIG9yICdfcmVhbGx5X3NpbWlsYXIyJz86SU5GRVJFTkNFCituby1tZW1iZXI6MjM6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3BhcmVuJyBtZW1iZXI7IG1heWJlICdfcGFyZW50Jz86SU5GRVJFTkNFCituby1tZW1iZXI6MjU6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3JlZ2lzdHJ5eXl5JyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6Mjc6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3ByZXR0eV9zdXJlX3RoaXNfd29udF9tYXRjaCcgbWVtYmVyOklORkVSRU5DRQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2lnbm9yZV9ub25lLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2lnbm9yZV9ub25lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZjAxY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaWdub3JlX25vbmUucHkKQEAgLTAsMCArMSw3IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdXNlbGVzcy1yZXR1cm4KKworZGVmIGZ1bmMoKToKKyAgICByZXR1cm4gTm9uZQorCisKK1NPTUVfVkFSID0gZnVuYygpLkRPRVNfTk9UX0VYSVNUICMgW25vLW1lbWJlcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19pZ25vcmVfbm9uZS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19pZ25vcmVfbm9uZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWM3MDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2lnbm9yZV9ub25lLnJjCkBAIC0wLDAgKzEsMiBAQAorW1RZUEVDSEVDS10KK2lnbm9yZS1ub25lPW5vCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaWdub3JlX25vbmUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2lnbm9yZV9ub25lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQwZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX2lnbm9yZV9ub25lLnR4dApAQCAtMCwwICsxIEBACituby1tZW1iZXI6NzoxMTo6SW5zdGFuY2Ugb2YgJ05vbmVUeXBlJyBoYXMgbm8gJ0RPRVNfTk9UX0VYSVNUJyBtZW1iZXI6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaW5mZXJlbmNlX2ltcHJvdmVtZW50cy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19pbmZlcmVuY2VfaW1wcm92ZW1lbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWZhNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfaW5mZXJlbmNlX2ltcHJvdmVtZW50cy5weQpAQCAtMCwwICsxLDExIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCisKK2RlZiB0ZXN0X29zZXJyb3JfaGFzX3N0cmVycm9yKCk6CisgICAgIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8yNTUzCisgICAgdHJ5OgorICAgICAgICByYWlzZSBPU0Vycm9yKCkKKyAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgIGlmIGV4Yy5zdHJlcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBleGMuc3RyZXJyb3IubG93ZXIoKQorICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX25vX2hpbnRzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX25vX2hpbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjVmNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3Nfbm9faGludHMucHkKQEAgLTAsMCArMSwyNyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIHBvaW50bGVzcy1zdGF0ZW1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKKworY2xhc3MgUGFyZW50KG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3BhcmVudCA9IDQyCisgICAgICAgIHNlbGYuX3JlZ2lzdHJ5ID0ge30KKyAgICAgICAgc2VsZi5fc2ltaWxhcjEgPSAyNAorICAgICAgICBzZWxmLl9zaW1pbGFyMiA9IDIzCisgICAgICAgIHNlbGYuX3NpbWlsYXIzID0gMjQKKyAgICAgICAgc2VsZi5fcmVhbGx5X3NpbWlsYXIxID0gMjMKKyAgICAgICAgc2VsZi5fcmVhbGx5X3NpbWlsYXIyID0gNDIKKworCitjbGFzcyBDaGlsZChQYXJlbnQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKKworICAgICAgICBzZWxmLl9zaW1pbGFyICMgW25vLW1lbWJlcl0KKyAgICAgICAgc2VsZi5fcmVhbGx5X3NpbWlsYXIgIyBbbm8tbWVtYmVyXQorICAgICAgICBzZWxmLl9wYXJlbiAjIFtuby1tZW1iZXJdCisgICAgICAgICMgRGlzdGFuY2UgaXMgdG9vIGJpZworICAgICAgICBzZWxmLl9yZWdpc3RyeXl5eSAjIFtuby1tZW1iZXJdCisgICAgICAgICMgTm90aGluZyBjbG9zZS4KKyAgICAgICAgc2VsZi5fcHJldHR5X3N1cmVfdGhpc193b250X21hdGNoICMgW25vLW1lbWJlcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19ub19oaW50cy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19ub19oaW50cy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjljOWNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX25vX2hpbnRzLnJjCkBAIC0wLDAgKzEsMiBAQAorW1RZUEVDSEVDS10KK21pc3NpbmctbWVtYmVyLWhpbnQ9bm8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19ub19oaW50cy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3Nfbm9faGludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODE4NjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3Nfbm9faGludHMudHh0CkBAIC0wLDAgKzEsNSBAQAorbm8tbWVtYmVyOjIxOjg6Q2hpbGQuX19pbml0X186SW5zdGFuY2Ugb2YgJ0NoaWxkJyBoYXMgbm8gJ19zaW1pbGFyJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MjI6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3JlYWxseV9zaW1pbGFyJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MjM6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3BhcmVuJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MjU6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3JlZ2lzdHJ5eXl5JyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6Mjc6ODpDaGlsZC5fX2luaXRfXzpJbnN0YW5jZSBvZiAnQ2hpbGQnIGhhcyBubyAnX3ByZXR0eV9zdXJlX3RoaXNfd29udF9tYXRjaCcgbWVtYmVyOklORkVSRU5DRQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX29wYXF1ZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19vcGFxdWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1OTJhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19vcGFxdWUucHkKQEAgLTAsMCArMSwxMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW1wb3J0LWVycm9yCisKK2Zyb20gdW5rbm93biBpbXBvcnQgVW5rbm93biwgc29tZV92YWx1ZQorCisKK2RlZiB0ZXN0KGFyZ3VtZW50KToKKyAgICBpZiBhcmd1bWVudDoKKyAgICAgICAgcmV0dXJuIDQyCisgICAgcmV0dXJuIFVua25vd24KKworCit0ZXN0KHNvbWVfdmFsdWUpLnRlc3QoKSAjIFtuby1tZW1iZXJdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3Nfb3BhcXVlLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX29wYXF1ZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjVjZDJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX29wYXF1ZS5yYwpAQCAtMCwwICsxLDIgQEAKK1tUWVBFQ0hFQ0tdCitpZ25vcmUtb24tb3BhcXVlLWluZmVyZW5jZT1uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3Nfb3BhcXVlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19vcGFxdWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWJjZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3Nfb3BhcXVlLnR4dApAQCAtMCwwICsxIEBACituby1tZW1iZXI6MTI6MDo6SW5zdGFuY2Ugb2YgJ2ludCcgaGFzIG5vICd0ZXN0JyBtZW1iZXI6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfcHkzNy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19weTM3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYmVkYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfcHkzNy5weQpAQCAtMCwwICsxLDE5IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworaW1wb3J0IGFzeW5jaW8KKworaXNpbnN0YW5jZShbXSwgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlKQorCisKK2FzeW5jIGRlZiBnZW4oKToKKyAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDAuMSkKKyAgICB2YWx1ZSA9IHlpZWxkIDQyCisgICAgcHJpbnQodmFsdWUpCisgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjIpCisKKworYXN5bmMgZGVmIHRlc3QoKToKKyAgICBnZW5lcmF0b3IgPSBnZW4oKQorCisgICAgYXdhaXQgZ2VuZXJhdG9yLmFzZW5kKE5vbmUpCisgICAgYXdhaXQgZ2VuZXJhdG9yLnNlbmQoTm9uZSkgICMgW25vLW1lbWJlcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19weTM3LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX3B5MzcucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc19weTM3LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX3B5MzcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX3B5MzcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmVhYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfcHkzNy50eHQKQEAgLTAsMCArMSBAQAorbm8tbWVtYmVyOjE5OjEwOnRlc3Q6QXN5bmNHZW5lcmF0b3IgJ2FzeW5jX2dlbmVyYXRvcicgaGFzIG5vICdzZW5kJyBtZW1iZXI7IG1heWJlICdhc2VuZCc/OklORkVSRU5DRQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX3R5cGVkX2Fubm90YXRpb25zLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX3R5cGVkX2Fubm90YXRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjc3NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcl9jaGVja3NfdHlwZWRfYW5ub3RhdGlvbnMucHkKQEAgLTAsMCArMSwyNSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHRvby1mZXctcHVibGljLW1ldGhvZHMKK2NsYXNzIEE6CisgICAgbXlmaWVsZDogaW50CisKK2NsYXNzIEIoQSk6CisgICAgcGFzcworCitjbGFzcyBDOgorICAgIHBhc3MKKworY2xhc3MgRChDLCBCKToKKyAgICBwYXNzCisKKworYSA9IEEoKQorcHJpbnQoYS5teWZpZWxkKQorCitiID0gQigpCitwcmludChiLm15ZmllbGQpCisKK2QgPSBEKCkKK3ByaW50KGQubXlmaWVsZCkKKworYyA9IEMoKQorcHJpbnQoYy5teWZpZWxkKSAgIyBbbm8tbWVtYmVyXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJfY2hlY2tzX3R5cGVkX2Fubm90YXRpb25zLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc190eXBlZF9hbm5vdGF0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2MWEzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyX2NoZWNrc190eXBlZF9hbm5vdGF0aW9ucy50eHQKQEAgLTAsMCArMSBAQAorbm8tbWVtYmVyOjI1OjY6Okluc3RhbmNlIG9mICdDJyBoYXMgbm8gJ215ZmllbGQnIG1lbWJlcjpJTkZFUkVOQ0UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyc2hpcF9wcm90b2NvbC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyc2hpcF9wcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDAxZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sLnB5CkBAIC0wLDAgKzEsMTIzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50LGV4cHJlc3Npb24tbm90LWFzc2lnbmVkLHRvby1mZXctcHVibGljLW1ldGhvZHMsaW1wb3J0LWVycm9yLG5vLWluaXQsd3JvbmctaW1wb3J0LXBvc2l0aW9uLG5vLWVsc2UtcmV0dXJuLCBjb21wYXJpc29uLXdpdGgtaXRzZWxmLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCisjIHN0YW5kYXJkIHR5cGVzCisxIGluIFsxLCAyLCAzXQorMSBpbiB7J2EnOiAxLCAnYic6IDJ9CisxIGluIHsxLCAyLCAzfQorMSBpbiAoMSwgMiwgMykKKycxJyBpbiAiMTIzIgorJzEnIGluIHUiMTIzIgorJzEnIGluIGJ5dGVhcnJheShiIjEyMyIpCisxIGluIGZyb3plbnNldChbMSwgMiwgM10pCisKKyMgY29tcHJlaGVuc2lvbnMKKzEgaW4gW3ggKiogMiAlIDEwIGZvciB4IGluIHJhbmdlKDEwKV0KKzEgaW4ge3ggKiogMiAlIDEwIGZvciB4IGluIHJhbmdlKDEwKX0KKzEgaW4ge3g6IHggKiogMiAlIDEwIGZvciB4IGluIHJhbmdlKDEwKX0KKworIyBpdGVyYXRvcnMKKzEgaW4gaXRlcihbMSwgMiwgM10pCisKKyMgZ2VuZXJhdG9yCitkZWYgY291bnQodXB0bz1mbG9hdCgiaW5mIikpOgorICAgIGkgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgaWYgaSA+IHVwdG86CisgICAgICAgICAgICBicmVhaworICAgICAgICB5aWVsZCBpCisgICAgICAgIGkgKz0gMQorCisxMCBpbiBjb3VudCh1cHRvPTEwKQorCisjIGN1c3RvbSBpbnN0YW5jZQorY2xhc3MgVW5pdmVyc2FsQ29udGFpbmVyKG9iamVjdCk6CisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCis0MiBpbiBVbml2ZXJzYWxDb250YWluZXIoKQorCisjIGN1c3RvbSBpdGVyYWJsZQorY2xhc3MgQ3VzdG9tSXRlcmFibGUob2JqZWN0KToKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKCgxLCAyLCAzKSkKKzMgaW4gQ3VzdG9tSXRlcmFibGUoKQorCisjIG9sZC1zdHlsZSBpdGVyYWJsZQorY2xhc3MgT2xkU3R5bGVJdGVyYWJsZShvYmplY3QpOgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgPCAxMDoKKyAgICAgICAgICAgIHJldHVybiAyICoqIGtleQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcigiYmFkIGluZGV4IikKKzY0IGluIE9sZFN0eWxlSXRlcmFibGUoKQorCisjIGRvIG5vdCBlbWl0IHdhcm5pbmcgaWYgY2xhc3MgaGFzIHVua25vd24gYmFzZXMKK2Zyb20gc29tZV9taXNzaW5nX21vZHVsZSBpbXBvcnQgSW1wb3J0ZWRDbGFzcworCitjbGFzcyBNYXliZUl0ZXJhYmxlKEltcG9ydGVkQ2xhc3MpOgorICAgIHBhc3MKKworMTAgaW4gTWF5YmVJdGVyYWJsZSgpCisKKyMgZG8gbm90IGVtaXQgd2FybmluZyBpbnNpZGUgbWl4aW5zL2Fic3RyYWN0L2Jhc2UgY2xhc3NlcworY2xhc3MgVXNlZnVsTWl4aW4ob2JqZWN0KToKKyAgICBzdHVmZiA9IE5vbmUKKworICAgIGRlZiBnZXRfc3R1ZmYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0dWZmCisKKyAgICBkZWYgYWN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgc3R1ZmYgPSBzZWxmLmdldF9zdHVmZigpCisgICAgICAgIGlmIHRoaW5nIGluIHN0dWZmOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBCYXNlVGhpbmcob2JqZWN0KToKKyAgICB2YWxpZF92YWx1ZXMgPSBOb25lCisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLnZhbGlkX3ZhbHVlcyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZXJyb3Igc2hvdWxkIG5vdCBiZSBlbWl0dGVkIGhlcmUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbiBzZWxmLnZhbGlkX3ZhbHVlcworCitjbGFzcyBBYnN0cmFjdFRoaW5nKG9iamVjdCk6CisgICAgdmFsaWRfdmFsdWVzID0gTm9uZQorCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgc2VsZi52YWxpZF92YWx1ZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGVycm9yIHNob3VsZCBub3QgYmUgZW1pdHRlZCBoZXJlCisgICAgICAgICAgICByZXR1cm4gdmFsdWUgaW4gc2VsZi52YWxpZF92YWx1ZXMKKworIyBjbGFzcyBpcyBub3QgbmFtZWQgYXMgYWJzdHJhY3QKKyMgYnV0IHN0aWxsIGlzIGRlZHVjZWFibHkgYWJzdHJhY3QKK2NsYXNzIFRoaW5nKG9iamVjdCk6CisgICAgdmFsaWRfdmFsdWVzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9pbml0X3ZhbHVlcygpCisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLnZhbGlkX3ZhbHVlcyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZXJyb3Igc2hvdWxkIG5vdCBiZSBlbWl0dGVkIGhlcmUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbiBzZWxmLnZhbGlkX3ZhbHVlcworCisgICAgZGVmIF9pbml0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisjIGVycm9yIGNhc2VzCis0MiBpbiA0MiAgIyBbdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0XQorNDIgbm90IGluIE5vbmUgICMgW3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdF0KKzQyIGluIDguNSAgIyBbdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0XQorCitjbGFzcyBFbXB0eUNsYXNzKG9iamVjdCk6CisgICAgcGFzcworCis0MiBub3QgaW4gRW1wdHlDbGFzcygpICAjIFt1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3RdCis0MiBpbiBFbXB0eUNsYXNzICAjIFt1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3RdCis0MiBub3QgaW4gY291bnQgICMgW3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdF0KKzQyIGluIHJhbmdlICAjIFt1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3RdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcnNoaXBfcHJvdG9jb2wudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIxMDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sLnR4dApAQCAtMCwwICsxLDcgQEAKK3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdDoxMTM6Njo6VmFsdWUgJzQyJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MTE0OjEwOjpWYWx1ZSAnTm9uZScgZG9lc24ndCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdAordW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0OjExNTo2OjpWYWx1ZSAnOC41JyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MTIwOjEwOjpWYWx1ZSAnRW1wdHlDbGFzcygpJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MTIxOjY6OlZhbHVlICdFbXB0eUNsYXNzJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MTIyOjEwOjpWYWx1ZSAnY291bnQnIGRvZXNuJ3Qgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3QKK3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdDoxMjM6Njo6VmFsdWUgJ3JhbmdlJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcnNoaXBfcHJvdG9jb2xfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzgwNzIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sX3B5My5weQpAQCAtMCwwICsxLDM2IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLWluaXQsbm8tc2VsZi11c2UsdW51c2VkLWFyZ3VtZW50LHBvaW50bGVzcy1zdGF0ZW1lbnQsZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQKKworIyBtZXRhY2xhc3NlcyB0aGF0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0IHByb3RvY29sCitjbGFzcyBNZXRhSXRlcmFibGUodHlwZSk6CisgICAgZGVmIF9faXRlcl9fKGNscyk6CisgICAgICAgIHJldHVybiBpdGVyKCgxLCAyLCAzKSkKKworY2xhc3MgTWV0YU9sZEl0ZXJhYmxlKHR5cGUpOgorICAgIGRlZiBfX2dldGl0ZW1fXyhjbHMsIGtleSk6CisgICAgICAgIGlmIGtleSA8IDEwOgorICAgICAgICAgICAgcmV0dXJuIGtleSAqKiAyCisKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcigiYmFkIGluZGV4IikKKworY2xhc3MgTWV0YUNvbnRhaW5lcih0eXBlKToKKyAgICBkZWYgX19jb250YWluc19fKGNscywga2V5KToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgSXRlcmFibGVDbGFzcyhtZXRhY2xhc3M9TWV0YU9sZEl0ZXJhYmxlKToKKyAgICBwYXNzCisKK2NsYXNzIE9sZEl0ZXJhYmxlQ2xhc3MobWV0YWNsYXNzPU1ldGFPbGRJdGVyYWJsZSk6CisgICAgcGFzcworCitjbGFzcyBDb250YWluZXJDbGFzcyhtZXRhY2xhc3M9TWV0YUNvbnRhaW5lcik6CisgICAgcGFzcworCisKK2RlZiB0ZXN0KCk6CisgICAgMSBpbiBJdGVyYWJsZUNsYXNzCisgICAgMSBpbiBPbGRJdGVyYWJsZUNsYXNzCisgICAgMSBpbiBDb250YWluZXJDbGFzcworICAgIDEgaW4gSXRlcmFibGVDbGFzcygpICAjIFt1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3RdCisgICAgMSBpbiBPbGRJdGVyYWJsZUNsYXNzKCkgICMgW3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdF0KKyAgICAxIGluIENvbnRhaW5lckNsYXNzKCkgICMgW3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZW1iZXIvbWVtYmVyc2hpcF9wcm90b2NvbF9weTMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcnNoaXBfcHJvdG9jb2xfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcnNoaXBfcHJvdG9jb2xfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sX3B5My50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWVtYmVyL21lbWJlcnNoaXBfcHJvdG9jb2xfcHkzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTVjZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21lbWJlci9tZW1iZXJzaGlwX3Byb3RvY29sX3B5My50eHQKQEAgLTAsMCArMSwzIEBACit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MzQ6OTp0ZXN0OlZhbHVlICdJdGVyYWJsZUNsYXNzKCknIGRvZXNuJ3Qgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3QKK3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdDozNTo5OnRlc3Q6VmFsdWUgJ09sZEl0ZXJhYmxlQ2xhc3MoKScgZG9lc24ndCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdAordW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0OjM2Ojk6dGVzdDpWYWx1ZSAnQ29udGFpbmVyQ2xhc3MoKScgZG9lc24ndCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21ldGFjbGFzc19hdHRyX2FjY2Vzcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZXRhY2xhc3NfYXR0cl9hY2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZXRhY2xhc3NfYXR0cl9hY2Nlc3MucHkKQEAgLTAsMCArMSwyMCBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgbWV0YWNsYXNzLWFzc2lnbm1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiJ0ZXN0IGF0dHJpYnV0ZSBhY2Nlc3Mgb24gbWV0YWNsYXNzIiIiCisKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitjbGFzcyBNZXRhKHR5cGUpOgorICAgICIiInRoZSBtZXRhIGNsYXNzIiIiCisgICAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgorICAgICAgICBzdXBlcihNZXRhLCBjbHMpLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KQorICAgICAgICBwcmludChjbHMsIGNscy5fbWV0YV9hcmdzKQorICAgICAgICBkZWxhdHRyKGNscywgJ19tZXRhX2FyZ3MnKQorCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgIiIibWV0YWNsYXNzZWQgY2xhc3MiIiIKKyAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgIF9tZXRhX2FyZ3MgPSAoJ2ZvbycsICdiYXInKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmludCgnX19pbml0X18nLCBzZWxmKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21ldGhvZF9oaWRkZW4ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWV0aG9kX2hpZGRlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzAzMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21ldGhvZF9oaWRkZW4ucHkKQEAgLTAsMCArMSw5MiBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxwcmludC1zdGF0ZW1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLG1pc3NpbmctZG9jc3RyaW5nCisiIiJjaGVjayBtZXRob2QgaGlkZGluZyBhbmNlc3RvciBhdHRyaWJ1dGUKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitjbGFzcyBBYmNkKG9iamVjdCk6CisgICAgIiIiZHVtbXkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYWJjZCA9IDEKKworY2xhc3MgQ2RlZihBYmNkKToKKyAgICAiIiJkdW1teSIiIgorICAgIGRlZiBhYmNkKHNlbGYpOiAjIFttZXRob2QtaGlkZGVuXQorICAgICAgICAiIiJ0ZXN0CisgICAgICAgICIiIgorICAgICAgICBwcmludChzZWxmKQorCitjbGFzcyBBYmNkTWl4aW46CisgICAgZGVmIGFiY2Qoc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgRGFiYyhBYmNkTWl4aW4sIEFiY2QpOgorICAgIGRlZiBhYmNkKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEN1c3RvbVByb3BlcnR5OgorICAgICIiImR1bW15IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF8pOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIF9fKToKKyAgICAgICAgaWYgbm90IG9iajoKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIHJldHVybiA1CisKKyAgICBkZWYgX19zZXRfXyhzZWxmLCBfLCBfXyk6CisgICAgICAgIHBhc3MKKworY2xhc3MgRGRlZjoKKyAgICAiIiJkdW1teSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5maXZlID0gImZpdmUiCisKKyAgICBAQ3VzdG9tUHJvcGVydHkKKyAgICBkZWYgZml2ZShzZWxmKToKKyAgICAgICAgIiIiQWx3YXlzIDUuIiIiCisgICAgICAgIHJldHVybiBzZWxmCisKKworZGVmIG15X2RlY29yYXRvcigqYXJncywgKiprd2FyZ3MpOgorICAgIHJldHVybiBDdXN0b21Qcm9wZXJ0eSgqYXJncywgKiprd2FyZ3MpCisKKworY2xhc3MgRm9vOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fYmFyID0gNDIKKyAgICAgICAgc2VsZi5fYmF6ID0gODQKKworICAgIEBteV9kZWNvcmF0b3IKKyAgICBkZWYgbWV0aG9kKHNlbGYpOiAgIyBFMDIwMgorICAgICAgICByZXR1cm4gc2VsZi5fYmF6CisKKyAgICBAbWV0aG9kLnNldHRlcgorICAgIGRlZiBtZXRob2Qoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9iYXogPSB2YWx1ZQorCisgICAgZGVmIGRvX3NvbWV0aGluZ193aXRoX2JheihzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYubWV0aG9kID0gdmFsdWUKKworCitjbGFzcyBPbmU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9uZT1Ob25lKToKKyAgICAgICAgaWYgb25lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5vbmUgPSBvbmUKKworICAgIGRlZiBvbmUoc2VsZik6ICMgW21ldGhvZC1oaWRkZW5dCisgICAgICAgIHBhc3MKKworY2xhc3MgVHdvKE9uZSk6CisgICAgZGVmIG9uZShzZWxmKToKKyAgICAgICAgcGFzcworCit0cnk6CisgICAgaW1wb3J0IHVua25vd24gYXMganMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQganNvbiBhcyBqcworCisKK2NsYXNzIEpzb25FbmNvZGVyKGpzLkpTT05FbmNvZGVyKToKKyAgICAjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLXN1cGVyLWRlbGVnYXRpb24sc3VwZXItd2l0aC1hcmd1bWVudHMKKyAgICBkZWYgZGVmYXVsdChzZWxmLCBvKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKEpzb25FbmNvZGVyLCBzZWxmKS5kZWZhdWx0KG8pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWV0aG9kX2hpZGRlbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWV0aG9kX2hpZGRlbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1YmYzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tZXRob2RfaGlkZGVuLnR4dApAQCAtMCwwICsxLDIgQEAKK21ldGhvZC1oaWRkZW46MTM6NDpDZGVmLmFiY2Q6QW4gYXR0cmlidXRlIGRlZmluZWQgaW4gZnVuY3Rpb25hbC5tLm1ldGhvZF9oaWRkZW4gbGluZSA5IGhpZGVzIHRoaXMgbWV0aG9kCittZXRob2QtaGlkZGVuOjc2OjQ6T25lLm9uZTpBbiBhdHRyaWJ1dGUgZGVmaW5lZCBpbiBmdW5jdGlvbmFsLm0ubWV0aG9kX2hpZGRlbiBsaW5lIDc0IGhpZGVzIHRoaXMgbWV0aG9kCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2JhcmVfcmFpc2UucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2JhcmVfcmFpc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE0ODczMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfYmFyZV9yYWlzZS5weQpAQCAtMCwwICsxLDg1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgYnJvYWQtZXhjZXB0LCB1bnJlYWNoYWJsZSwgdHJ5LWV4Y2VwdC1yYWlzZSwgcmFpc2UtbWlzc2luZy1mcm9tDQorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLXZhcmlhYmxlLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCBpbnZhbGlkLW5hbWUsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlDQorDQordHJ5Og0KKyAgICByYWlzZSAjIFttaXNwbGFjZWQtYmFyZS1yYWlzZV0NCitleGNlcHQgRXhjZXB0aW9uOg0KKyAgICBwYXNzDQorDQordHJ5Og0KKyAgICBwYXNzDQorZXhjZXB0IEV4Y2VwdGlvbjoNCisgICAgcmFpc2UNCisNCisjIHB5bGludDogZGlzYWJsZT1taXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudA0KK3RyeToNCisgICAgcGFzcw0KK2V4Y2VwdCBFeGNlcHRpb246DQorICAgIGlmIDEgPT0gMjoNCisgICAgICAgIHJhaXNlDQorDQorZGVmIHRlc3QoKToNCisgICAgdHJ5Og0KKyAgICAgICAgcGFzcw0KKyAgICBleGNlcHQgRXhjZXB0aW9uOg0KKyAgICAgICAgZGVmIGNoZXN0KCk6DQorICAgICAgICAgICAgdHJ5Og0KKyAgICAgICAgICAgICAgICBwYXNzDQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCisgICAgICAgICAgICAgICAgcmFpc2UNCisgICAgICAgIHJhaXNlDQorDQorZGVmIHRlc3QxKCk6DQorICAgIHRyeToNCisgICAgICAgIGlmIDEgPiAyOg0KKyAgICAgICAgICAgIGRlZiBiZXN0KCk6DQorICAgICAgICAgICAgICAgIHJhaXNlICMgW21pc3BsYWNlZC1iYXJlLXJhaXNlXQ0KKyAgICBleGNlcHQgRXhjZXB0aW9uOg0KKyAgICAgICAgcGFzcw0KKyAgICByYWlzZSAjIFttaXNwbGFjZWQtYmFyZS1yYWlzZV0NCityYWlzZSAjIFttaXNwbGFjZWQtYmFyZS1yYWlzZV0NCisNCit0cnk6DQorICAgIHBhc3MNCitmaW5hbGx5Og0KKyAgICAjIFRoaXMgbWlnaHQgd29yayBvciBtaWdodCBub3QgdG8sIGRlcGVuZGluZyBpZiB0aGVyZSdzDQorICAgICMgYW4gZXJyb3IgcmFpc2VkIGluc2lkZSB0aGUgdHJ5IGJsb2NrLiBCdXQgcmVseWluZyBvbiB0aGlzDQorICAgICMgYmVoYXZpb3VyIGNhbiBiZSBlcnJvciBwcm9uZSwgc28gd2UgZGVjaWRlZCB0byB3YXJuDQorICAgICMgYWdhaW5zdCBpdC4NCisgICAgcmFpc2UgIyBbbWlzcGxhY2VkLWJhcmUtcmFpc2VdDQorDQorDQorY2xhc3MgQShvYmplY3QpOg0KKyAgICB0cnk6DQorICAgICAgICBwYXNzDQorICAgIGV4Y2VwdCBFeGNlcHRpb246DQorICAgICAgICByYWlzZQ0KKyAgICByYWlzZSAjIFttaXNwbGFjZWQtYmFyZS1yYWlzZV0NCisNCisjIFRoaXMgd29ya3MgaW4gUHl0aG9uIDIsIGJ1dCB0aGUgaW50ZW50IGlzIG5ldmVydGhlbGVzcw0KKyMgdW5jbGVhci4gSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIFB5dGhvbiAzLCBzbyBpdCdzIGJlc3QNCisjIG5vdCB0byByZWx5IG9uIGl0Lg0KK2V4YyA9IE5vbmUNCit0cnk6DQorICAgIDEvMA0KK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBleGM6DQorICAgIHBhc3MNCitpZiBleGM6DQorICAgIHJhaXNlICMgW21pc3BsYWNlZC1iYXJlLXJhaXNlXQ0KKw0KKyMgRG9uJ3QgZW1pdCBpZiB3ZSdyZSBpbiBgYF9fZXhpdF9fYGAuDQorY2xhc3MgQ29udGV4dE1hbmFnZXIob2JqZWN0KToNCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToNCisgICAgICAgIHJldHVybiBzZWxmDQorICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6DQorICAgICAgICByYWlzZQ0KKw0KKw0KK2RlZiB0ZXN0X2RvbnRfdHJpZ2dlcl9pbl9maW5hbGx5X2NsYXVzZV9mb3VuZF9pbl9leGNlcHRpb25faGFuZGxlcigpOg0KKyAgICB0cnk6DQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdiYWQgdmFsdWUnKQ0KKyAgICBleGNlcHQgVmFsdWVFcnJvcjoNCisgICAgICAgIHRyeToNCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdmYWlsZWQnKQ0KKyAgICAgICAgZmluYWxseToNCisgICAgICAgICAgICByYWlzZQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfYmFyZV9yYWlzZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2JhcmVfcmFpc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTA0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2JhcmVfcmFpc2UudHh0CkBAIC0wLDAgKzEsNyBAQAorbWlzcGxhY2VkLWJhcmUtcmFpc2U6NTo0OjpUaGUgcmFpc2Ugc3RhdGVtZW50IGlzIG5vdCBpbnNpZGUgYW4gZXhjZXB0IGNsYXVzZQorbWlzcGxhY2VkLWJhcmUtcmFpc2U6MzY6MTY6dGVzdDEuYmVzdDpUaGUgcmFpc2Ugc3RhdGVtZW50IGlzIG5vdCBpbnNpZGUgYW4gZXhjZXB0IGNsYXVzZQorbWlzcGxhY2VkLWJhcmUtcmFpc2U6Mzk6NDp0ZXN0MTpUaGUgcmFpc2Ugc3RhdGVtZW50IGlzIG5vdCBpbnNpZGUgYW4gZXhjZXB0IGNsYXVzZQorbWlzcGxhY2VkLWJhcmUtcmFpc2U6NDA6MDo6VGhlIHJhaXNlIHN0YXRlbWVudCBpcyBub3QgaW5zaWRlIGFuIGV4Y2VwdCBjbGF1c2UKK21pc3BsYWNlZC1iYXJlLXJhaXNlOjQ5OjQ6OlRoZSByYWlzZSBzdGF0ZW1lbnQgaXMgbm90IGluc2lkZSBhbiBleGNlcHQgY2xhdXNlCittaXNwbGFjZWQtYmFyZS1yYWlzZTo1Nzo0OkE6VGhlIHJhaXNlIHN0YXRlbWVudCBpcyBub3QgaW5zaWRlIGFuIGV4Y2VwdCBjbGF1c2UKK21pc3BsYWNlZC1iYXJlLXJhaXNlOjY4OjQ6OlRoZSByYWlzZSBzdGF0ZW1lbnQgaXMgbm90IGluc2lkZSBhbiBleGNlcHQgY2xhdXNlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2NvbXBhcmlzb25fY29uc3RhbnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2NvbXBhcmlzb25fY29uc3RhbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMmIxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfY29tcGFyaXNvbl9jb25zdGFudC5weQpAQCAtMCwwICsxLDM2IEBACisiIiJDaGVjayB0aGF0IHRoZSBjb25zdGFudHMgYXJlIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29ucyIiIgorCisjIHB5bGludDogZGlzYWJsZT1zaW5nbGV0b24tY29tcGFyaXNvbiwgbWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2NsYXNzIE15Q2xhc3Mob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYXR0ciA9IDEKKworICAgIGRlZiBkdW1teV9yZXR1cm4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmF0dHIKKworZGVmIGR1bW15X3JldHVybigpOgorICAgIHJldHVybiAyCisKK2RlZiBiYWRfY29tcGFyaXNvbnMoKToKKyAgICAiIiJ0aGlzIGlzIG5vdCBvayIiIgorICAgIGluc3RhbmNlID0gTXlDbGFzcygpCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBpZiA1IDw9IGk6ICAjIFttaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudF0KKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgMSA9PSBpOiAgIyBbbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnRdCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIDMgPCBkdW1teV9yZXR1cm4oKTogICMgW21pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50XQorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiA0ICE9IGluc3RhbmNlLmR1bW15X3JldHVybigpOiAgIyBbbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnRdCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIDEgPT0gaW5zdGFuY2UuYXR0cjogICMgW21pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50XQorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiAiYWFhIiA9PSBpbnN0YW5jZS5hdHRyOiAjIFttaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudF0KKyAgICAgICAgICAgIHBhc3MKKworZGVmIGdvb2RfY29tcGFyaXNvbigpOgorICAgICIiInRoaXMgaXMgb2siIiIKKyAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgIGlmIGkgPT0gNToKKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfY29tcGFyaXNvbl9jb25zdGFudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2NvbXBhcmlzb25fY29uc3RhbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTdiNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2NvbXBhcmlzb25fY29uc3RhbnQudHh0CkBAIC0wLDAgKzEsNiBAQAorbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQ6MTk6MTE6YmFkX2NvbXBhcmlzb25zOkNvbXBhcmlzb24gc2hvdWxkIGJlIGkgPj0gNQorbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQ6MjE6MTE6YmFkX2NvbXBhcmlzb25zOkNvbXBhcmlzb24gc2hvdWxkIGJlIGkgPT0gMQorbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQ6MjM6MTE6YmFkX2NvbXBhcmlzb25zOkNvbXBhcmlzb24gc2hvdWxkIGJlIGR1bW15X3JldHVybigpID4gMworbWlzcGxhY2VkLWNvbXBhcmlzb24tY29uc3RhbnQ6MjU6MTE6YmFkX2NvbXBhcmlzb25zOkNvbXBhcmlzb24gc2hvdWxkIGJlIGluc3RhbmNlLmR1bW15X3JldHVybigpICE9IDQKK21pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50OjI3OjExOmJhZF9jb21wYXJpc29uczpDb21wYXJpc29uIHNob3VsZCBiZSBpbnN0YW5jZS5hdHRyID09IDEKK21pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50OjI5OjExOmJhZF9jb21wYXJpc29uczpDb21wYXJpc29uIHNob3VsZCBiZSBpbnN0YW5jZS5hdHRyID09ICdhYWEnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2Zvcm1hdF9mdW5jdGlvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZm9ybWF0X2Z1bmN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiY2FiZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzcGxhY2VkX2Zvcm1hdF9mdW5jdGlvbi5weQpAQCAtMCwwICsxLDU4IEBACisiIiJUZXN0IHRoYXQgZm9ybWF0IGZ1bmN0aW9uIGlzIHVzZWQgb25seSB3aXRoIHN0cmluZy4iIiIKKworIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lLCBwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudCwgbGluZS10b28tbG9uZywgbm8tbWVtYmVyLCBkaXNhbGxvd2VkLW5hbWUsIHVuZGVmaW5lZC12YXJpYWJsZSwgbWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMKKworcHJpbnQoJ3ZhbHVlOiB7fScpLmZvcm1hdCgxMjMpICAjIFttaXNwbGFjZWQtZm9ybWF0LWZ1bmN0aW9uXQorcHJpbnQoInZhbHVlOiB7fSIpLmZvcm1hdCgxMjMpICAjIFttaXNwbGFjZWQtZm9ybWF0LWZ1bmN0aW9uXQorcHJpbnQoJ3ZhbHVlOiB7fScuZm9ybWF0KDEyMykpCitwcmludCgne30gQ29tZSBGb3J0aCEnLmZvcm1hdCgnTGF6YXJ1cycpKQorcHJpbnQoJ0RlciBIZW0gaXN0IG1laW4gTGljaHQgdW5kIG1laW4gSGVpbCwgdm9yIHdlbSBzb2xsdGUgaWNoIG1pY2ggZnVyY2h0ZW4/ID0+IHt9Jy5mb3JtYXQoJ1BzYWxtIDI3LCAxJykpCitwcmludCgnMTIzJykKK3ByaW50KCkKK3MgPSAndmFsdWU6IHt9Jy5mb3JtYXQoMTIzKQorYSA9ICd2YWx1ZToge30nCithLmZvcm1hdCgxMjMpCisKK2RlZiBmb28oYXJnKToKKyAgICAiIiJUaGUgV29ybGQgaXMgWW91cnMiIiIKKyAgICByZXR1cm4gYXJnLmZvcm1hdCgxMjMpICAjIHdlIGRvbid0IGtub3cgaWYgYXJnIGlzIHN0ciBvciBub3QsIGRvbid0IHJhaXNlIGVycm9yLgorCitkZWYgZ29vKGFyZyk6CisgICAgIiIiVGhlIFdvcmxkIGlzIFlvdXJzIiIiCisgICAgVGV4dFdyaXRlci5mb3JtYXQoYXJnKQorCitkZWYgYmFyKGFyZywgVGV4dFdyaXRlcik6CisgICAgIiIiVGhlIFdvcmxkIGlzIFlvdXJzIiIiCisgICAgVGV4dFdyaXRlcigpLmZvcm1hdChhcmcpCisKK2RlZiBmb29iYXIoYXJnLCBUZXh0V3JpdGVyKToKKyAgICAiIiJUaGUgV29ybGQgaXMgWW91cnMiIiIKKyAgICBUZXh0V3JpdGVyLmZvcm1hdChhcmcpCisKK2RlZiBiYXJmb28oYXJnKToKKyAgICAiIiJUaGUgV29ybGQgaXMgWW91cnMiIiIKKyAgICBUZXh0V3JpdGVyKCkuZm9ybWF0KGFyZykKKworZGVmIF9kaXNwbGF5KHNlbGYsIGxheW91dCk6CisgICAgIiIibGF1bmNoIGxheW91dHMgZGlzcGxheSIiIgorICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgVGV4dFdyaXRlcigpLmZvcm1hdChsYXlvdXQsIHNlbGYub3V0KQorCisKK2NsYXNzIEZha2VDbGFzczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5zdHJpbmcgPSBzdHJpbmcKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdHJpbmcKKworICAgIGRlZiBmb3JtYXRfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLnN0cmluZy5mb3JtYXQoKQorICAgICAgICBzZWxmLmdldF9zdHJpbmcoKS5mb3JtYXQoKQorICAgICAgICBwcmludChzZWxmLmdldF9zdHJpbmcoKSkuZm9ybWF0KCkgICMgW21pc3BsYWNlZC1mb3JtYXQtZnVuY3Rpb25dCisgICAgICAgIHByaW50KHNlbGYuZ2V0X3N0cmluZygpLmZvcm1hdCgpKQorCitvYmogPSBGYWtlQ2xhc3MoJ1ZvaWxhISEhJykKK29iai5nZXRfc3RyaW5nKCkuZm9ybWF0KCkKK3ByaW50KG9iai5nZXRfc3RyaW5nKCkuZm9ybWF0KCkpCitwcmludChvYmouZ2V0X3N0cmluZygpKS5mb3JtYXQoKSAgIyBbbWlzcGxhY2VkLWZvcm1hdC1mdW5jdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZm9ybWF0X2Z1bmN0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZm9ybWF0X2Z1bmN0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc3YTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3BsYWNlZF9mb3JtYXRfZnVuY3Rpb24udHh0CkBAIC0wLDAgKzEsNCBAQAorbWlzcGxhY2VkLWZvcm1hdC1mdW5jdGlvbjo1OjA6OmZvcm1hdCBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIG9uIHN0cgorbWlzcGxhY2VkLWZvcm1hdC1mdW5jdGlvbjo2OjA6OmZvcm1hdCBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIG9uIHN0cgorbWlzcGxhY2VkLWZvcm1hdC1mdW5jdGlvbjo1Mjo4OkZha2VDbGFzcy5mb3JtYXRfc3RyaW5nOmZvcm1hdCBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIG9uIHN0cgorbWlzcGxhY2VkLWZvcm1hdC1mdW5jdGlvbjo1ODowOjpmb3JtYXQgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBvbiBzdHIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZnV0dXJlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3BsYWNlZF9mdXR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMTdkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZnV0dXJlLnB5CkBAIC0wLDAgKzEsNiBAQAorIiIiVGVzdCB0aGF0IF9fZnV0dXJlX18gaXMgbm90IHRoZSBmaXJzdCBzdGF0ZW1lbnQgYWZ0ZXIgdGhlIGRvY3N0cmluZy4iIiINCitpbXBvcnQgY29sbGVjdGlvbnMNCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uICMgW21pc3BsYWNlZC1mdXR1cmVdDQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudA0KKw0KK0RBVEEgPSBjb2xsZWN0aW9ucw0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZnV0dXJlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNwbGFjZWRfZnV0dXJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU2MThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3BsYWNlZF9mdXR1cmUudHh0CkBAIC0wLDAgKzEgQEAKK21pc3BsYWNlZC1mdXR1cmU6MzowOjpfX2Z1dHVyZV9fIGltcG9ydCBpcyBub3QgdGhlIGZpcnN0IG5vbiBkb2NzdHJpbmcgc3RhdGVtZW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2RvY3N0cmluZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZG9jc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDY3NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2RvY3N0cmluZy5weQpAQCAtMCwwICsxLDU4IEBACisjIFttaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmddDQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UNCisNCitkZWYgcHVibGljX2RvY3VtZW50ZWQoKToNCisgICAgIiIiSXQgaGFzIGEgZG9jc3RyaW5nLiIiIg0KKw0KKw0KK2RlZiBfcHJpdmF0ZV91bmRvY3VtZW50ZWQoKToNCisgICAgIyBEb2Vzbid0IG5lZWQgYSBkb2NzdHJpbmcNCisgICAgcGFzcw0KKw0KKw0KK2RlZiBfcHJpdmF0ZV9kb2N1bWVudGVkKCk6DQorICAgICIiIkl0IGhhcyBhIGRvY3N0cmluZy4iIiINCisNCisNCitjbGFzcyBDbGFzc0RvY3VtZW50ZWQob2JqZWN0KToNCisgICAgIiIiSXQgaGFzIGEgZG9jc3RyaW5nLiIiIg0KKw0KKw0KK2NsYXNzIENsYXNzVW5kb2N1bWVudGVkKG9iamVjdCk6ICMgW21pc3NpbmctY2xhc3MtZG9jc3RyaW5nXQ0KKyAgICBwYXNzDQorDQorDQorZGVmIHB1YmxpY191bmRvY3VtZW50ZWQoKTogIyBbbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmddDQorICAgIHBhc3MNCisNCisNCitkZWYgX19zaXplb2ZfXygpOg0KKyAgICAjIFNwZWNpYWwNCisgICAgcGFzcw0KKw0KKw0KK2RlZiBfX21hbmdsZWQoKToNCisgICAgcGFzcw0KKw0KKw0KK2NsYXNzIFByb3BlcnR5KG9iamVjdCk6DQorICAgICIiIkRvbid0IHdhcm4gYWJvdXQgc2V0dGVycyBhbmQgZGVsZXRlcnMuIiIiDQorDQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHNlbGYuX3ZhbHVlID0gTm9uZQ0KKw0KKyAgICBAcHJvcGVydHkNCisgICAgZGVmIHRlc3Qoc2VsZik6DQorICAgICAgICAiIiJEZWZhdWx0IGRvY3N0cmluZyBmb3Igc2V0dGVycyBhbmQgZGVsZXRlcnMuIiIiDQorDQorICAgIEB0ZXN0LnNldHRlcg0KKyAgICBkZWYgdGVzdChzZWxmLCB2YWx1ZSk6DQorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlDQorDQorICAgIEB0ZXN0LmRlbGV0ZXINCisgICAgZGVmIHRlc3Qoc2VsZik6DQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgRG9jdW1lbnRlZFZpYUR1bmRlckRvYyhvYmplY3QpOg0KKyAgICBfX2RvY19fID0gIlRoaXMgb25lIg0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZG9jc3RyaW5nLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZG9jc3RyaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVjNTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19kb2NzdHJpbmcudHh0CkBAIC0wLDAgKzEsMyBAQAorbWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nOjE6MDo6TWlzc2luZyBtb2R1bGUgZG9jc3RyaW5nCittaXNzaW5nLWNsYXNzLWRvY3N0cmluZzoyMTowOkNsYXNzVW5kb2N1bWVudGVkOk1pc3NpbmcgY2xhc3MgZG9jc3RyaW5nCittaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZzoyNTowOnB1YmxpY191bmRvY3VtZW50ZWQ6TWlzc2luZyBmdW5jdGlvbiBvciBtZXRob2QgZG9jc3RyaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2RvY3N0cmluZ19uZXdfc3R5bGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2RvY3N0cmluZ19uZXdfc3R5bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjN2MxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZG9jc3RyaW5nX25ld19zdHlsZS5weQpAQCAtMCwwICsxLDQ3IEBACisjIFttaXNzaW5nLW1vZHVsZS1kb2NzdHJpbmddCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzCisKKworY2xhc3MgQ2xhc3NEb2N1bWVudGVkOgorICAgICIiIkl0IGhhcyBhIGRvY3N0cmluZy4iIiIKKworCitjbGFzcyBVbmRvY3VtZW50ZWRDbGFzczogICMgW21pc3NpbmctY2xhc3MtZG9jc3RyaW5nXQorICAgIHBhc3MKKworCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWNsYXNzLWRvY3N0cmluZworY2xhc3MgQ2xhc3NVbmRvY3VtZW50ZWQ6CisgICAgcGFzcworCisKKyMgcHlsaW50OiBlbmFibGU9bWlzc2luZy1jbGFzcy1kb2NzdHJpbmcKK2NsYXNzIE90aGVyQ2xhc3NVbmRvY3VtZW50ZWQ6ICAjIFttaXNzaW5nLWNsYXNzLWRvY3N0cmluZ10KKyAgICBwYXNzCisKKworZGVmIHB1YmxpY19kb2N1bWVudGVkKCk6CisgICAgIiIiSXQgaGFzIGEgZG9jc3RyaW5nLiIiIgorCisKK2RlZiBfcHJpdmF0ZV91bmRvY3VtZW50ZWQoKToKKyAgICAjIERvZXNuJ3QgbmVlZCBhIGRvY3N0cmluZworICAgIHBhc3MKKworCitkZWYgX3ByaXZhdGVfZG9jdW1lbnRlZCgpOgorICAgICIiIkl0IGhhcyBhIGRvY3N0cmluZy4iIiIKKworCitkZWYgcHVibGljX3VuZG9jdW1lbnRlZCgpOiAgIyBbbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmddCisgICAgcGFzcworCisKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nCitkZWYgdW5kb2N1bWVudGVkX2Z1bmN0aW9uKCk6CisgICAgcGFzcworCisKKyMgcHlsaW50OiBlbmFibGU9bWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcKK2RlZiB1bmRvY3VtZW50ZWRfb3RoZXJfZnVuY3Rpb24oKTogICMgW21pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nXQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZG9jc3RyaW5nX25ld19zdHlsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2RvY3N0cmluZ19uZXdfc3R5bGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTQ2NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2RvY3N0cmluZ19uZXdfc3R5bGUudHh0CkBAIC0wLDAgKzEsNSBAQAorbWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nOjE6MDo6TWlzc2luZyBtb2R1bGUgZG9jc3RyaW5nCittaXNzaW5nLWNsYXNzLWRvY3N0cmluZzo5OjA6VW5kb2N1bWVudGVkQ2xhc3M6TWlzc2luZyBjbGFzcyBkb2NzdHJpbmcKK21pc3NpbmctY2xhc3MtZG9jc3RyaW5nOjE5OjA6T3RoZXJDbGFzc1VuZG9jdW1lbnRlZDpNaXNzaW5nIGNsYXNzIGRvY3N0cmluZworbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmc6MzY6MDpwdWJsaWNfdW5kb2N1bWVudGVkOk1pc3NpbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGRvY3N0cmluZworbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmc6NDY6MDp1bmRvY3VtZW50ZWRfb3RoZXJfZnVuY3Rpb246TWlzc2luZyBmdW5jdGlvbiBvciBtZXRob2QgZG9jc3RyaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2ZpbmFsX25ld2xpbmUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2ZpbmFsX25ld2xpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwZjkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZmluYWxfbmV3bGluZS5weQpAQCAtMCwwICsxLDQgQEAKKyIiIlRoaXMgZmlsZSBkb2VzIG5vdCBoYXZlIGEgZmluYWwgbmV3bGluZS4iIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKyMgKzE6W21pc3NpbmctZmluYWwtbmV3bGluZV0KK3ByaW50KDEpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19maW5hbF9uZXdsaW5lLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZmluYWxfbmV3bGluZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjMzI5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfZmluYWxfbmV3bGluZS50eHQKQEAgLTAsMCArMSBAQAorbWlzc2luZy1maW5hbC1uZXdsaW5lOjQ6MDo6RmluYWwgbmV3bGluZSBtaXNzaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2t3b2FfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19rd29hX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRjNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19rd29hX3B5My5weQpAQCAtMCwwICsxLDczIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtYXJndW1lbnQsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworaW1wb3J0IHR5cGluZworCisKK2RlZiB0YXJnZXQocG9zLCAqLCBrZXl3b3JkKToKKyAgICByZXR1cm4gcG9zICsga2V5d29yZAorCisKK2RlZiBmb3J3YXJkaW5nX2t3ZHMocG9zLCAqKmt3ZHMpOgorICAgIHRhcmdldChwb3MsICoqa3dkcykKKworCitkZWYgZm9yd2FyZGluZ19hcmdzKCphcmdzLCBrZXl3b3JkKToKKyAgICB0YXJnZXQoKmFyZ3MsIGtleXdvcmQ9a2V5d29yZCkKKworZGVmIGZvcndhcmRpbmdfY29udmVyc2lvbigqYXJncywgKiprd2FyZ3MpOgorICAgIHRhcmdldCgqYXJncywgKipkaWN0KGt3YXJncykpCisKKworZGVmIG5vdF9mb3J3YXJkaW5nX2t3YXJncygqYXJncywgKiprd2FyZ3MpOgorICAgIHRhcmdldCgqYXJncykgIyBbbWlzc2luZy1rd29hXQorCisKK3RhcmdldCgxLCBrZXl3b3JkPTIpCisKK1BBUkFNID0gMQordGFyZ2V0KDIsIFBBUkFNKSAjIFt0b28tbWFueS1mdW5jdGlvbi1hcmdzLCBtaXNzaW5nLWt3b2FdCisKKworZGVmIHNvbWVfZnVuY3Rpb24oKiwgcGFyYW0pOgorICAgIHJldHVybiBwYXJhbSArIDIKKworCitkZWYgb3RoZXJfZnVuY3Rpb24oKiprd2FyZ3MpOgorICAgIHJldHVybiBzb21lX2Z1bmN0aW9uKCoqa3dhcmdzKSAgIyBEb2VzIG5vdCB0cmlnZ2VyIG1pc3Npbmcta3dvYQorCisKK290aGVyX2Z1bmN0aW9uKHBhcmFtPTIpCisKKworY2xhc3MgUGFyZW50OgorCisgICAgQHR5cGluZy5vdmVybG9hZAorICAgIGRlZiBfX2luaXRfXyggc2VsZiwgKiwgZmlyc3QsIHNlY29uZCwgdGhpcmQpOgorICAgICAgICBwYXNzCisKKyAgICBAdHlwaW5nLm92ZXJsb2FkCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICosIGZpcnN0LCBzZWNvbmQpOgorICAgICAgICBwYXNzCisKKyAgICBAdHlwaW5nLm92ZXJsb2FkCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICosIGZpcnN0KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICosCisgICAgICAgICAgICBmaXJzdCwKKyAgICAgICAgICAgIHNlY29uZDogdHlwaW5nLk9wdGlvbmFsW3N0cl0gPSBOb25lLAorICAgICAgICAgICAgdGhpcmQ6IHR5cGluZy5PcHRpb25hbFtzdHJdID0gTm9uZSk6CisgICAgICAgIHNlbGYuX2ZpcnN0ID0gZmlyc3QKKyAgICAgICAgc2VsZi5fc2Vjb25kID0gc2Vjb25kCisgICAgICAgIHNlbGYuX3RoaXJkID0gdGhpcmQKKworCitjbGFzcyBDaGlsZChQYXJlbnQpOgorICAgIGRlZiBfX2luaXRfXygKKyAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAqLAorICAgICAgICAgICAgZmlyc3QsCisgICAgICAgICAgICBzZWNvbmQpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKGZpcnN0PWZpcnN0LCBzZWNvbmQ9c2Vjb25kKQorICAgICAgICBzZWxmLl9maXJzdCA9IGZpcnN0ICsgc2Vjb25kCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX2t3b2FfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19rd29hX3B5My5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19rd29hX3B5My5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3Npbmdfa3dvYV9weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19rd29hX3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNjM1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3Npbmdfa3dvYV9weTMudHh0CkBAIC0wLDAgKzEsMyBAQAorbWlzc2luZy1rd29hOjIxOjQ6bm90X2ZvcndhcmRpbmdfa3dhcmdzOk1pc3NpbmcgbWFuZGF0b3J5IGtleXdvcmQgYXJndW1lbnQgJ2tleXdvcmQnIGluIGZ1bmN0aW9uIGNhbGwKK21pc3Npbmcta3dvYToyNzowOjpNaXNzaW5nIG1hbmRhdG9yeSBrZXl3b3JkIGFyZ3VtZW50ICdrZXl3b3JkJyBpbiBmdW5jdGlvbiBjYWxsCit0b28tbWFueS1mdW5jdGlvbi1hcmdzOjI3OjA6OlRvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzIGZvciBmdW5jdGlvbiBjYWxsCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX21vZHVsZV9kb2NzdHJpbmdfZGlzYWJsZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX21vZHVsZV9kb2NzdHJpbmdfZGlzYWJsZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkOWVkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfbW9kdWxlX2RvY3N0cmluZ19kaXNhYmxlZC5weQpAQCAtMCwwICsxLDUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctbW9kdWxlLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCisKK2NsYXNzIERvY3VtZW50ZWQ6CisgICAgIlNvbWV0aGluZy4iCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX3BhcmVudGhlc2VzX2Zvcl9jYWxsX2luX3Rlc3QucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX3BhcmVudGhlc2VzX2Zvcl9jYWxsX2luX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxZDc2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfcGFyZW50aGVzZXNfZm9yX2NhbGxfaW5fdGVzdC5weQpAQCAtMCwwICsxLDk1IEBACisiIiJWZXJpZnkgaWYgY2FsbCB0byBmdW5jdGlvbiBvciBtZXRob2QgaW5zaWRlIHRlc3RzIGFyZSBtaXNzaW5nIHBhcmVudGhlc2VzLiIiIgorIyBweWxpbnQ6IGRpc2FibGU9dXNpbmctY29uc3RhbnQtdGVzdCwgbWlzc2luZy1kb2NzdHJpbmcsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUsIGV4cHJlc3Npb24tbm90LWFzc2lnbmVkCisKK2ltcG9ydCBjb2xsZWN0aW9ucworCisKK2RlZiBib29sX2Z1bmN0aW9uKCk6CisgICAgcmV0dXJuIFRydWUKKworZGVmIG5vbmJvb2xfZnVuY3Rpb24oKToKKyAgICByZXR1cm4gNDIKKworCitjbGFzcyBDbGFzcyhvYmplY3QpOgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBib29sX21ldGhvZCgpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgbm9uYm9vbF9tZXRob2QoKToKKyAgICAgICAgcmV0dXJuIDQyCisKKworaWYgY29sbGVjdGlvbnM6CisgICAgcGFzcworCitpZiBib29sX2Z1bmN0aW9uOiAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCisgICAgcGFzcworCitpZiBub3QgYm9vbF9mdW5jdGlvbigpOgorICAgIHBhc3MKKworaWYgbm9uYm9vbF9mdW5jdGlvbjogICMgW21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdF0KKyAgICBwYXNzCisKK2lmIG5vbmJvb2xfZnVuY3Rpb24oKSAhPSA0MjoKKyAgICBwYXNzCisKK2luc3RhbmNlID0gQ2xhc3MoKQorCitpZiBpbnN0YW5jZS5ib29sX21ldGhvZDogICMgW21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdF0KKyAgICBwYXNzCisKK2lmIG5vdCBpbnN0YW5jZS5ib29sX21ldGhvZCgpOgorICAgIHBhc3MKKworaWYgbm90IGluc3RhbmNlLm5vbmJvb2xfbWV0aG9kOgorICAgIHBhc3MKK2VsaWYgaW5zdGFuY2UuYm9vbF9tZXRob2Q6ICAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCisgICAgcGFzcworCitib29sX2xhbWJkYSA9IGxhbWJkYTogVHJ1ZQorCitpZiBib29sX2xhbWJkYTogICMgW21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdF0KKyAgICBwYXNzCisKK2lmIG5vdCBib29sX2xhbWJkYSgpOgorICAgIHBhc3MKKworbm9uYm9vbF9sYW1iZGEgPSBsYW1iZGE6IDQyCisKK2lmIG5vbmJvb2xfbGFtYmRhOiAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCisgICAgcGFzcworCitpZiBub3Qgbm9uYm9vbF9sYW1iZGEoKToKKyAgICBwYXNzCisKK01ZX1ZBTFVFID0gNDIgaWYgYm9vbF9mdW5jdGlvbiBlbHNlIC0xICAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCitNWV8yTkRfVkFMVUUgPSA0MiBpZiBub3QgYm9vbF9mdW5jdGlvbigpIGVsc2UgLTEKK01ZX1RISVJEX1ZBTFVFID0gNDIgaWYgYm9vbF9sYW1iZGEgZWxzZSAtMSAgIyBbbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0XQorTVlfRk9VUlRIX1ZBTFVFID0gNDIgaWYgbm9uYm9vbF9sYW1iZGEgZWxzZSAtMSAgIyBbbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0XQorCitbeCBmb3IgeCBpbiByYW5nZSgxMDApIGlmIGJvb2xfZnVuY3Rpb25dICAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCitbeCBmb3IgeCBpbiByYW5nZSgxMDApIGlmIGJvb2xfbGFtYmRhXSAgIyBbbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0XQorW3ggZm9yIHggaW4gcmFuZ2UoMTAwKSBpZiBub3QgYm9vbF9mdW5jdGlvbigpXQorW3ggZm9yIHggaW4gcmFuZ2UoMTAwKSBpZiBub3QgYm9vbF9sYW1iZGEoKV0KK1t4IGZvciB4IGluIHJhbmdlKDEwMCkgaWYgbm9uYm9vbF9sYW1iZGFdICAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCitbeCBmb3IgeCBpbiByYW5nZSgxMDApIGlmIG5vbmJvb2xfZnVuY3Rpb25dICAjIFttaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3RdCisKK2RlZiBub25fY29uc3Rfbm9kZV9mdW5jdGlvbigpOgorICAgIHJldHVybiAoMSwgMiwgNDIpCisKK2lmIG5vbl9jb25zdF9ub2RlX2Z1bmN0aW9uOiAgIyBbbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0XQorICAgIHBhc3MKKworZGVmIHlpZWxkaW5nX2Z1bmN0aW9uKCk6CisgICAgeWllbGQgNDIKKworaWYgeWllbGRpbmdfZnVuY3Rpb246ICMgW21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdF0KKyAgICBwYXNzCisKK2lmIG5vdCB5aWVsZGluZ19mdW5jdGlvbigpOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3NpbmdfcGFyZW50aGVzZXNfZm9yX2NhbGxfaW5fdGVzdC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX3BhcmVudGhlc2VzX2Zvcl9jYWxsX2luX3Rlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDdjNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX3BhcmVudGhlc2VzX2Zvcl9jYWxsX2luX3Rlc3QudHh0CkBAIC0wLDAgKzEsMTUgQEAKK21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdDoyOTowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIHBvdGVudGlhbGx5IHdyb25nIGZ1bmN0aW9uIG9yIG1ldGhvZCBjYWxsIGR1ZSB0byBtaXNzaW5nIHBhcmVudGhlc2VzCittaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3Q6MzU6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBwb3RlbnRpYWxseSB3cm9uZyBmdW5jdGlvbiBvciBtZXRob2QgY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcworbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0OjQzOjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggcG90ZW50aWFsbHkgd3JvbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwgZHVlIHRvIG1pc3NpbmcgcGFyZW50aGVzZXMKK21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdDo1MTowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIHBvdGVudGlhbGx5IHdyb25nIGZ1bmN0aW9uIG9yIG1ldGhvZCBjYWxsIGR1ZSB0byBtaXNzaW5nIHBhcmVudGhlc2VzCittaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3Q6NTY6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBwb3RlbnRpYWxseSB3cm9uZyBmdW5jdGlvbiBvciBtZXRob2QgY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcworbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0OjY0OjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggcG90ZW50aWFsbHkgd3JvbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwgZHVlIHRvIG1pc3NpbmcgcGFyZW50aGVzZXMKK21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdDo3MDoxMTo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBwb3RlbnRpYWxseSB3cm9uZyBmdW5jdGlvbiBvciBtZXRob2QgY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcworbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0OjcyOjE3OjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIHBvdGVudGlhbGx5IHdyb25nIGZ1bmN0aW9uIG9yIG1ldGhvZCBjYWxsIGR1ZSB0byBtaXNzaW5nIHBhcmVudGhlc2VzCittaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3Q6NzM6MTg6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggcG90ZW50aWFsbHkgd3JvbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwgZHVlIHRvIG1pc3NpbmcgcGFyZW50aGVzZXMKK21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdDo3NTowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIHBvdGVudGlhbGx5IHdyb25nIGZ1bmN0aW9uIG9yIG1ldGhvZCBjYWxsIGR1ZSB0byBtaXNzaW5nIHBhcmVudGhlc2VzCittaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3Q6NzY6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBwb3RlbnRpYWxseSB3cm9uZyBmdW5jdGlvbiBvciBtZXRob2QgY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcworbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0Ojc5OjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggcG90ZW50aWFsbHkgd3JvbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwgZHVlIHRvIG1pc3NpbmcgcGFyZW50aGVzZXMKK21pc3NpbmctcGFyZW50aGVzZXMtZm9yLWNhbGwtaW4tdGVzdDo4MDowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIHBvdGVudGlhbGx5IHdyb25nIGZ1bmN0aW9uIG9yIG1ldGhvZCBjYWxsIGR1ZSB0byBtaXNzaW5nIHBhcmVudGhlc2VzCittaXNzaW5nLXBhcmVudGhlc2VzLWZvci1jYWxsLWluLXRlc3Q6ODU6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBwb3RlbnRpYWxseSB3cm9uZyBmdW5jdGlvbiBvciBtZXRob2QgY2FsbCBkdWUgdG8gbWlzc2luZyBwYXJlbnRoZXNlcworbWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0OjkxOjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggcG90ZW50aWFsbHkgd3JvbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwgZHVlIHRvIG1pc3NpbmcgcGFyZW50aGVzZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3Npbmdfc2VsZl9hcmd1bWVudC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3Npbmdfc2VsZl9hcmd1bWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWFlMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21pc3NpbmcvbWlzc2luZ19zZWxmX2FyZ3VtZW50LnB5CkBAIC0wLDAgKzEsMjEgQEAKKyIiIkNoZWNrcyB0aGF0IG1pc3Npbmcgc2VsZiBpbiBtZXRob2QgZGVmcyBkb24ndCBjcmFzaCBQeWxpbnQuIiIiCisjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCisKKworY2xhc3MgTXlDbGFzcyhvYmplY3QpOgorICAgICIiIkEgY2xhc3Mgd2l0aCBzb21lIG1ldGhvZHMgbWlzc2luZyBzZWxmIGFyZ3MuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFyID0gInZhciIKKworICAgIGRlZiBtZXRob2QoKTogICMgW25vLW1ldGhvZC1hcmd1bWVudF0KKyAgICAgICAgIiIiQSBtZXRob2Qgd2l0aG91dCBhIHNlbGYgYXJndW1lbnQuIiIiCisKKyAgICBkZWYgc2V0dXAoKTogICMgW25vLW1ldGhvZC1hcmd1bWVudF0KKyAgICAgICAgIiIiQSBtZXRob2Qgd2l0aG91dCBhIHNlbGYgYXJndW1lbnQsIGJ1dCB1c2FnZS4iIiIKKyAgICAgICAgc2VsZi52YXIgPSAxICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKKyAgICBkZWYgY29ycmVjdChzZWxmKToKKyAgICAgICAgIiIiQ29ycmVjdC4iIiIKKyAgICAgICAgc2VsZi52YXIgPSAiY29ycmVjdCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9taXNzaW5nL21pc3Npbmdfc2VsZl9hcmd1bWVudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX3NlbGZfYXJndW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzYyNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbWlzc2luZy9taXNzaW5nX3NlbGZfYXJndW1lbnQudHh0CkBAIC0wLDAgKzEsMyBAQAorbm8tbWV0aG9kLWFyZ3VtZW50OjEyOjQ6TXlDbGFzcy5tZXRob2Q6TWV0aG9kIGhhcyBubyBhcmd1bWVudAorbm8tbWV0aG9kLWFyZ3VtZW50OjE1OjQ6TXlDbGFzcy5zZXR1cDpNZXRob2QgaGFzIG5vIGFyZ3VtZW50Cit1bmRlZmluZWQtdmFyaWFibGU6MTc6ODpNeUNsYXNzLnNldHVwOlVuZGVmaW5lZCB2YXJpYWJsZSAnc2VsZicKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tb2R1bGVfX19kaWN0X18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbW9kdWxlX19fZGljdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjE1NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL20vbW9kdWxlX19fZGljdF9fLnB5CkBAIC0wLDAgKzEsOSBAQAorIiIiaHR0cHM6Ly93d3cubG9naWxhYi5vcmcvdGlja2V0LzY5NDkuIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitfX3JldmlzaW9uX18gPSBOb25lCisKK3ByaW50KF9fZGljdF9fIGlzIG5vdCBOb25lKSAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKworX19kaWN0X18gPSB7fQorCitwcmludChfX2RpY3RfXyBpcyBub3QgTm9uZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tb2R1bGVfX19kaWN0X18udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21vZHVsZV9fX2RpY3RfXy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNjVhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tb2R1bGVfX19kaWN0X18udHh0CkBAIC0wLDAgKzEgQEAKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6NTo2OjpVc2luZyB2YXJpYWJsZSAnX19kaWN0X18nIGJlZm9yZSBhc3NpZ25tZW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbW9ua2V5cGF0Y2hfbWV0aG9kLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9tL21vbmtleXBhdGNoX21ldGhvZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGJkMDNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL21vbmtleXBhdGNoX21ldGhvZC5weQpAQCAtMCwwICsxLDE2IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorJycnVGVzdCB0aGF0IGEgZnVuY3Rpb24gaXMgY29uc2lkZXJlZCBhIG1ldGhvZCB3aGVuIGxvb2tlZCB1cCB0aHJvdWdoIGEgY2xhc3MuJycnCisKK2NsYXNzIENsYXp6KG9iamVjdCk6CisgICAgJ3Rlc3QgY2xhc3MnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKworZGVmIGZ1bmMoYXJnMSwgYXJnMik6CisgICAgJ2Z1bmN0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgbWV0aG9kJworICAgIHJldHVybiBhcmcxLnZhbHVlICsgYXJnMgorCitDbGF6ei5tZXRob2QgPSBmdW5jCisKK1ZBUiA9IENsYXp6KDEpLm1ldGhvZCgyKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9tL211bHRpcGxlX2ltcG9ydHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL20vbXVsdGlwbGVfaW1wb3J0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDA4ZGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9tL211bHRpcGxlX2ltcG9ydHMucHkKQEAgLTAsMCArMSwyIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdW51c2VkLWltcG9ydAoraW1wb3J0IG9zLCBzb2NrZXQgICMgW211bHRpcGxlLWltcG9ydHNdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL20vbXVsdGlwbGVfaW1wb3J0cy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL20vbXVsdGlwbGVfaW1wb3J0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzODBjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbS9tdWx0aXBsZV9pbXBvcnRzLnR4dApAQCAtMCwwICsxIEBACittdWx0aXBsZS1pbXBvcnRzOjI6MDo6TXVsdGlwbGUgaW1wb3J0cyBvbiBvbmUgbGluZSAob3MsIHNvY2tldCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lUHJlc2V0Q2FtZWxDYXNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZVByZXNldENhbWVsQ2FzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ4ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZVByZXNldENhbWVsQ2FzZS5weQpAQCAtMCwwICsxLDIzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCitfX3ZlcnNpb25fXyA9ICIxLjAiCitTT01FX0NPTlNUQU5UID0gNDIgICMgW2ludmFsaWQtbmFtZV0KKworCitkZWYgc2F5SGVsbG8oc29tZUFyZ3VtZW50KToKKyAgICByZXR1cm4gW3NvbWVBcmd1bWVudCAqIHNvbWVWYWx1ZSBmb3Igc29tZVZhbHVlIGluIHJhbmdlKDEwKV0KKworCitjbGFzcyBNeUNsYXNzOiAgIyBbaW52YWxpZC1uYW1lXQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdYKToKKyAgICAgICAgc2VsZi5fbXlTZWNyZXRYID0gYXJnWAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG15UHVibGljWChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX215U2VjcmV0WCAqIDIKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgTXlDbGFzcykgYW5kIHNlbGYubXlQdWJsaWNYID09IG90aGVyLm15UHVibGljWAorCisKK2RlZiBzYXlfaGVsbG8oKTogICMgW2ludmFsaWQtbmFtZV0KKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lUHJlc2V0Q2FtZWxDYXNlLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZVByZXNldENhbWVsQ2FzZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY0NDUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZVByZXNldENhbWVsQ2FzZS5yYwpAQCAtMCwwICsxLDEzIEBACitbQkFTSUNdCitmdW5jdGlvbi1uYW1pbmctc3R5bGU9Y2FtZWxDYXNlCitjb25zdC1uYW1pbmctc3R5bGU9Y2FtZWxDYXNlCithdHRyLW5hbWluZy1zdHlsZT1jYW1lbENhc2UKK2FyZ3VtZW50LW5hbWluZy1zdHlsZT1jYW1lbENhc2UKK21vZHVsZS1uYW1pbmctc3R5bGU9Y2FtZWxDYXNlCittZXRob2QtbmFtaW5nLXN0eWxlPWNhbWVsQ2FzZQordmFyaWFibGUtbmFtaW5nLXN0eWxlPWNhbWVsQ2FzZQorY2xhc3MtYXR0cmlidXRlLW5hbWluZy1zdHlsZT1jYW1lbENhc2UKK2lubGluZXZhci1uYW1pbmctc3R5bGU9Y2FtZWxDYXNlCitjbGFzcy1uYW1pbmctc3R5bGU9Y2FtZWxDYXNlCisKK2luY2x1ZGUtbmFtaW5nLWhpbnQ9eWVzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lUHJlc2V0Q2FtZWxDYXNlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVQcmVzZXRDYW1lbENhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGIwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lUHJlc2V0Q2FtZWxDYXNlLnR4dApAQCAtMCwwICsxLDMgQEAKK2ludmFsaWQtbmFtZTozOjA6OiJDb25zdGFudCBuYW1lICIiU09NRV9DT05TVEFOVCIiIGRvZXNuJ3QgY29uZm9ybSB0byBjYW1lbENhc2UgbmFtaW5nIHN0eWxlICgnKFteXFxXXFxkQS1aXVteXFxXX10qfF9fLipfXykkJyBwYXR0ZXJuKSIKK2ludmFsaWQtbmFtZToxMDowOk15Q2xhc3M6IkNsYXNzIG5hbWUgIiJNeUNsYXNzIiIgZG9lc24ndCBjb25mb3JtIHRvIGNhbWVsQ2FzZSBuYW1pbmcgc3R5bGUgKCdbXlxcV1xcZEEtWl1bXlxcV19dKyQnIHBhdHRlcm4pIgoraW52YWxpZC1uYW1lOjIyOjA6c2F5X2hlbGxvOiJGdW5jdGlvbiBuYW1lICIic2F5X2hlbGxvIiIgZG9lc24ndCBjb25mb3JtIHRvIGNhbWVsQ2FzZSBuYW1pbmcgc3R5bGUgKCcoW15cXFdcXGRBLVpdW15cXFdfXXsyLH18X19bXlxcV1xcZEEtWl9dXFx3K19fKSQnIHBhdHRlcm4pIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiOTJjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWwucHkKQEAgLTAsMCArMSwxNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworIiIiVGVzdCB0eXBpbmcuRmluYWwiIiIKK2ltcG9ydCB0eXBpbmcKK2Zyb20gdHlwaW5nIGltcG9ydCBGaW5hbAorCitjbGFzcyBGb286CisgICAgIiIiQ2xhc3Mgd2l0aCBjbGFzcyBjb25zdGFudHMgYW5ub3RhdGVkIHdpdGggRmluYWwuIiIiCisgICAgQ0xBU1NfQ09OU1Q6IEZpbmFsW2ludF0gPSA0MgorICAgIENMQVNTX0NPTlNUMjogRmluYWwgPSAiY29uc3QiCisgICAgdmFyaWFibGU6IEZpbmFsW3N0cl0gPSAiaW52YWxpZCBuYW1lIiAgIyBbaW52YWxpZC1uYW1lXQorICAgIENMQVNTX0NPTlNUMzogdHlwaW5nLkZpbmFsCisgICAgdmFyaWFibGUyOiB0eXBpbmcuRmluYWxbaW50XSAgIyBbaW52YWxpZC1uYW1lXQorICAgIENMQVNTX0NPTlNUNDogRmluYWxbdHlwaW5nLkNsYXNzVmFyW3N0cl1dID0gInZhbGlkIgorCitNT0RVTEVfQ09OU1Q6IEZpbmFsID0gMQorbW9kdWxlX3ZhcjogdHlwaW5nLkZpbmFsW3N0cl0gPSAiY29uc3QiICAjIFtpbnZhbGlkLW5hbWVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX2ZpbmFsLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZjNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWwudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmZGQyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWwudHh0CkBAIC0wLDAgKzEsMyBAQAoraW52YWxpZC1uYW1lOjEwOjQ6Rm9vOiJDbGFzcyBjb25zdGFudCBuYW1lICIidmFyaWFibGUiIiBkb2Vzbid0IGNvbmZvcm0gdG8gVVBQRVJfQ0FTRSBuYW1pbmcgc3R5bGUiCitpbnZhbGlkLW5hbWU6MTI6NDpGb286IkNsYXNzIGNvbnN0YW50IG5hbWUgIiJ2YXJpYWJsZTIiIiBkb2Vzbid0IGNvbmZvcm0gdG8gVVBQRVJfQ0FTRSBuYW1pbmcgc3R5bGUiCitpbnZhbGlkLW5hbWU6MTY6MDo6IkNvbnN0YW50IG5hbWUgIiJtb2R1bGVfdmFyIiIgZG9lc24ndCBjb25mb3JtIHRvIFVQUEVSX0NBU0UgbmFtaW5nIHN0eWxlIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbF9zbmFrZV9jYXNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbF9zbmFrZV9jYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmMzNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX2ZpbmFsX3NuYWtlX2Nhc2UucHkKQEAgLTAsMCArMSwxNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworIiIiVGVzdCB0eXBpbmcuRmluYWwgd2l0aCBuYW1lIHN0eWxlIHNuYWtlX2Nhc2UuIiIiCitpbXBvcnQgdHlwaW5nCitmcm9tIHR5cGluZyBpbXBvcnQgRmluYWwKKworY2xhc3MgRm9vOgorICAgICIiIkNsYXNzIHdpdGggY2xhc3MgY29uc3RhbnRzIGFubm90YXRlZCB3aXRoIEZpbmFsLiIiIgorICAgIENMQVNTX0NPTlNUOiBGaW5hbFtpbnRdID0gNDIgICMgW2ludmFsaWQtbmFtZV0KKyAgICBDTEFTU19DT05TVDI6IEZpbmFsID0gImNvbnN0IiAgIyBbaW52YWxpZC1uYW1lXQorICAgIHZhcmlhYmxlOiBGaW5hbFtzdHJdID0gImludmFsaWQgbmFtZSIKKyAgICBDTEFTU19DT05TVDM6IHR5cGluZy5GaW5hbCAgIyBbaW52YWxpZC1uYW1lXQorICAgIHZhcmlhYmxlMjogdHlwaW5nLkZpbmFsW2ludF0KKyAgICBDTEFTU19DT05TVDQ6IEZpbmFsW3R5cGluZy5DbGFzc1ZhcltzdHJdXSA9ICJpbnZhbGlkIG5hbWUiICAjIFtpbnZhbGlkLW5hbWVdCisKK01PRFVMRV9DT05TVDogRmluYWwgPSAxICAjIFtpbnZhbGlkLW5hbWVdCittb2R1bGVfdmFyOiB0eXBpbmcuRmluYWxbc3RyXSA9ICJjb25zdCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWxfc25ha2VfY2FzZS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWxfc25ha2VfY2FzZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzcwMGE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9maW5hbF9zbmFrZV9jYXNlLnJjCkBAIC0wLDAgKzEsNiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOAorCitbQkFTSUNdCitjbGFzcy1jb25zdC1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorY29uc3QtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZmluYWxfc25ha2VfY2FzZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX2ZpbmFsX3NuYWtlX2Nhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZjAzZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX2ZpbmFsX3NuYWtlX2Nhc2UudHh0CkBAIC0wLDAgKzEsNSBAQAoraW52YWxpZC1uYW1lOjg6NDpGb286IkNsYXNzIGNvbnN0YW50IG5hbWUgIiJDTEFTU19DT05TVCIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSIKK2ludmFsaWQtbmFtZTo5OjQ6Rm9vOiJDbGFzcyBjb25zdGFudCBuYW1lICIiQ0xBU1NfQ09OU1QyIiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjExOjQ6Rm9vOiJDbGFzcyBjb25zdGFudCBuYW1lICIiQ0xBU1NfQ09OU1QzIiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjEzOjQ6Rm9vOiJDbGFzcyBjb25zdGFudCBuYW1lICIiQ0xBU1NfQ09OU1Q0IiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjE1OjA6OiJDb25zdGFudCBuYW1lICIiTU9EVUxFX0NPTlNUIiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9nb29kX2JhZF9uYW1lc19yZWdleC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZ29vZF9iYWRfbmFtZXNfcmVnZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyMDhjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZ29vZF9iYWRfbmFtZXNfcmVnZXgucHkKQEAgLTAsMCArMSwyMCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworX192ZXJzaW9uX18gPSAiMS4wIgoraWdub3JlZF9TT01FX0NPTlNUQU5UID0gNDIKKworZXhwbGljaXRfYmFkX3NvbWVfY29uc3RhbnQgPSA0MiAgIyBbZGlzYWxsb3dlZC1uYW1lXQorCitzbmFrZV9jYXNlX2JhZF9TT01FX0NPTlNUQU5UID0gNDIgICMgW2ludmFsaWQtbmFtZV0KKworCitjbGFzcyBteV9jbGFzczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnX3gpOgorICAgICAgICBzZWxmLl9teV9zZWNyZXRfeCA9IGFyZ194CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbXlfcHVibGljX3goc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9teV9zZWNyZXRfeCAqIDIKKworCitkZWYgZGlzYWxsb3dlZF8yX3NuYWtlX2Nhc2UoKTogICMgW2Rpc2FsbG93ZWQtbmFtZV0KKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX2dvb2RfYmFkX25hbWVzX3JlZ2V4LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9nb29kX2JhZF9uYW1lc19yZWdleC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmIwOGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9nb29kX2JhZF9uYW1lc19yZWdleC5yYwpAQCAtMCwwICsxLDE1IEBACitbQkFTSUNdCitmdW5jdGlvbi1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorY29uc3QtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKK2F0dHItbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKK2FyZ3VtZW50LW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCittb2R1bGUtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKK21ldGhvZC1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQordmFyaWFibGUtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKK2NsYXNzLWF0dHJpYnV0ZS1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQoraW5saW5ldmFyLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCitjbGFzcy1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorCitnb29kLW5hbWVzLXJneHM9aWdub3JlZC4qCitiYWQtbmFtZXMtcmd4cz1leHBsaWNpdC4qLGRpc2FsbG93ZWQuKgoraW5jbHVkZS1uYW1pbmctaGludD15ZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZ29vZF9iYWRfbmFtZXNfcmVnZXgudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9nb29kX2JhZF9uYW1lc19yZWdleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3YzQyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfZ29vZF9iYWRfbmFtZXNfcmVnZXgudHh0CkBAIC0wLDAgKzEsMyBAQAorZGlzYWxsb3dlZC1uYW1lOjU6MDo6RGlzYWxsb3dlZCBuYW1lICJleHBsaWNpdF9iYWRfc29tZV9jb25zdGFudCIKK2ludmFsaWQtbmFtZTo3OjA6OiJDb25zdGFudCBuYW1lICIic25ha2VfY2FzZV9iYWRfU09NRV9DT05TVEFOVCIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSAoJyhbXlxcV1xcZEEtWl1bXlxcV0EtWl0qfF9fLipfXykkJyBwYXR0ZXJuKSIKK2Rpc2FsbG93ZWQtbmFtZToxOTowOmRpc2FsbG93ZWRfMl9zbmFrZV9jYXNlOkRpc2FsbG93ZWQgbmFtZSAiZGlzYWxsb3dlZF8yX3NuYWtlX2Nhc2UiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX3ByZXNldF9zbmFrZV9jYXNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9wcmVzZXRfc25ha2VfY2FzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTM1MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9wcmVzZXRfc25ha2VfY2FzZS5weQpAQCAtMCwwICsxLDM1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCitmcm9tIGVudW0gaW1wb3J0IEVudW0KK2Zyb20gdHlwaW5nIGltcG9ydCBDbGFzc1ZhcgorCitfX3ZlcnNpb25fXyA9ICIxLjAiCitTT01FX0NPTlNUQU5UID0gNDIgICMgW2ludmFsaWQtbmFtZV0KKworCitkZWYgc2F5X2hlbGxvKHNvbWVfYXJndW1lbnQpOgorICAgIHJldHVybiBbc29tZV9hcmd1bWVudCAqIHNvbWVfdmFsdWUgZm9yIHNvbWVfdmFsdWUgaW4gcmFuZ2UoMTApXQorCisKK2NsYXNzIE15Q2xhc3M6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ194KToKKyAgICAgICAgc2VsZi5fbXlfc2VjcmV0X3ggPSBhcmdfeAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG15X3B1YmxpY194KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbXlfc2VjcmV0X3ggKiAyCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIE15Q2xhc3MpIGFuZCBzZWxmLm15X3B1YmxpY194ID09IG90aGVyLm15X3B1YmxpY194CisKKworZGVmIHNheUhlbGxvKCk6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgcGFzcworCisKK2NsYXNzIEZvb0VudW0oRW51bSk6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgY29uc3Rfd2l0aF9zbmFrZV9jYXNlID0gNDIKKyAgICBhbm90aGVyX2NvbnN0ID0gNDMKKworCitjbGFzcyBCYXI6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgY29uc3Rfd2l0aF9zbmFrZV9jYXNlOiBDbGFzc1ZhcltpbnRdID0gNDIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfcHJlc2V0X3NuYWtlX2Nhc2UucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX3ByZXNldF9zbmFrZV9jYXNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX3ByZXNldF9zbmFrZV9jYXNlLnJjCkBAIC0wLDAgKzEsMTQgQEAKK1tCQVNJQ10KK2Z1bmN0aW9uLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCitjb25zdC1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorYXR0ci1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorYXJndW1lbnQtbmFtaW5nLXN0eWxlPXNuYWtlX2Nhc2UKK21vZHVsZS1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorbWV0aG9kLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCit2YXJpYWJsZS1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorY2xhc3MtYXR0cmlidXRlLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCitjbGFzcy1jb25zdC1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQoraW5saW5ldmFyLW5hbWluZy1zdHlsZT1zbmFrZV9jYXNlCitjbGFzcy1uYW1pbmctc3R5bGU9c25ha2VfY2FzZQorCitpbmNsdWRlLW5hbWluZy1oaW50PXllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9wcmVzZXRfc25ha2VfY2FzZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX3ByZXNldF9zbmFrZV9jYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTg5Nzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9wcmVzZXRfc25ha2VfY2FzZS50eHQKQEAgLTAsMCArMSw1IEBACitpbnZhbGlkLW5hbWU6NjowOjoiQ29uc3RhbnQgbmFtZSAiIlNPTUVfQ09OU1RBTlQiIiBkb2Vzbid0IGNvbmZvcm0gdG8gc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUgKCcoW15cXFdcXGRBLVpdW15cXFdBLVpdKnxfXy4qX18pJCcgcGF0dGVybikiCitpbnZhbGlkLW5hbWU6MTM6MDpNeUNsYXNzOiJDbGFzcyBuYW1lICIiTXlDbGFzcyIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSAoJ1teXFxXXFxkQS1aXVteXFxXQS1aXSskJyBwYXR0ZXJuKSIKK2ludmFsaWQtbmFtZToyNTowOnNheUhlbGxvOiJGdW5jdGlvbiBuYW1lICIic2F5SGVsbG8iIiBkb2Vzbid0IGNvbmZvcm0gdG8gc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUgKCcoW15cXFdcXGRBLVpdW15cXFdBLVpdezIsfXxfW15cXFdBLVpdKnxfX1teXFxXQS1aXFxkX11bXlxcV0EtWl0rX18pJCcgcGF0dGVybikiCitpbnZhbGlkLW5hbWU6Mjk6MDpGb29FbnVtOiJDbGFzcyBuYW1lICIiRm9vRW51bSIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSAoJ1teXFxXXFxkQS1aXVteXFxXQS1aXSskJyBwYXR0ZXJuKSIKK2ludmFsaWQtbmFtZTozNDowOkJhcjoiQ2xhc3MgbmFtZSAiIkJhciIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSAoJ1teXFxXXFxkQS1aXVteXFxXQS1aXSskJyBwYXR0ZXJuKSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfc3R5bGVzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9zdHlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkNzQzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfc3R5bGVzLnB5CkBAIC0wLDAgKzEsMTYwIEBACisiIiJUZXN0IGZvciB0aGUgaW52YWxpZC1uYW1lIHdhcm5pbmcuIiIiCisjIHB5bGludDogZGlzYWJsZT1uby1hYnNvbHV0ZS1pbXBvcnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCB1bm5lY2Vzc2FyeS1wYXNzLCB1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uLCB1bnVzZWQtcHJpdmF0ZS1tZW1iZXIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBhYmMKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHR5cGluZworZnJvbSBlbnVtIGltcG9ydCBFbnVtCitmcm9tIHR5cGluZyBpbXBvcnQgQ2xhc3NWYXIKKworR09PRF9DT05TVF9OQU1FID0gJycKK2JhZF9jb25zdF9uYW1lID0gMCAgIyBbaW52YWxpZC1uYW1lXQorCisKK2RlZiBCQURGVU5DVElPTl9uYW1lKCk6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgIiIiQmFkIGZ1bmN0aW9uIG5hbWUuIiIiCisgICAgQkFEX0xPQ0FMX1ZBUiA9IDEgICMgW2ludmFsaWQtbmFtZV0KKyAgICBwcmludChCQURfTE9DQUxfVkFSKQorCisKK2RlZiBmdW5jX2JhZF9hcmduYW1lKE5PVF9HT09EKTogICMgW2ludmFsaWQtbmFtZV0KKyAgICAiIiJGdW5jdGlvbiB3aXRoIGEgYmFkbHkgbmFtZWQgYXJndW1lbnQuIiIiCisgICAgcmV0dXJuIE5PVF9HT09ECisKKworZGVmIG5vX25lc3RlZF9hcmdzKGFyZzEsIGFyZzIxLCBhcmcyMik6CisgICAgIiIiV2VsbC1mb3JtZWQgZnVuY3Rpb24uIiIiCisgICAgcHJpbnQoYXJnMSwgYXJnMjEsIGFyZzIyKQorCisKK2NsYXNzIGJhZF9jbGFzc19uYW1lKG9iamVjdCk6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgIiIiQ2xhc3Mgd2l0aCBhIGJhZCBuYW1lLiIiIgorCisKK2NsYXNzIENvcnJlY3RDbGFzc05hbWUob2JqZWN0KToKKyAgICAiIiJDbGFzcyB3aXRoIGEgZ29vZCBuYW1lLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9nb29kX3ByaXZhdGVfbmFtZSA9IDEwCisgICAgICAgIHNlbGYuX19nb29kX3JlYWxfcHJpdmF0ZV9uYW1lID0gMTEKKyAgICAgICAgc2VsZi5nb29kX2F0dHJpYnV0ZV9uYW1lID0gMTIKKyAgICAgICAgc2VsZi5fQmFkX0F0VFJfbmFtZSA9IE5vbmUgICMgW2ludmFsaWQtbmFtZV0KKyAgICAgICAgc2VsZi5CYWRfUFVCTElDX25hbWUgPSBOb25lICAjIFtpbnZhbGlkLW5hbWVdCisKKyAgICB6eiA9ICdXaHkgV2FzIEl0IEJhZCBDbGFzcyBBdHRyaWJ1dGU/JworICAgIEdPT0RfQ0xBU1NfQVRUUiA9ICdHb29kIENsYXNzIEF0dHJpYnV0ZScKKworICAgIGRlZiBCYWRNZXRob2ROYW1lKHNlbGYpOiAgIyBbaW52YWxpZC1uYW1lXQorICAgICAgICAiIiJBIE1ldGhvZCB3aXRoIGEgYmFkIG5hbWUuIiIiCisKKyAgICBkZWYgZ29vZF9tZXRob2RfbmFtZShzZWxmKToKKyAgICAgICAgIiIiQSBtZXRob2Qgd2l0aCBhIGdvb2QgbmFtZS4iIiIKKworICAgIGRlZiBfX0R1bkRFUl9JU19ub3RfZnJlZV9mb3JfYWxsX18oc2VsZik6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgICAgICIiIkFub3RoZXIgYmFkbHkgbmFtZWQgbWV0aG9kLiIiIgorCisKK2NsYXNzIERlcml2ZWRGcm9tQ29ycmVjdChDb3JyZWN0Q2xhc3NOYW1lKToKKyAgICAiIiJBIGRlcml2ZWQgY2xhc3Mgd2l0aCBhbiBpbnZhbGlkIGluaGVyaXRlZCBtZW1iZXJzLgorCisgICAgRGVyaXZlZCBhdHRyaWJ1dGVzIGFuZCBtZXRob2RzIHdpdGggaW52YWxpZCBuYW1lcyBkbyBub3QgdHJpZ2dlciB3YXJuaW5ncy4KKyAgICAiIiIKKyAgICB6eiA9ICdOb3cgYSBnb29kIGNsYXNzIGF0dHJpYnV0ZScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuX0JhZF9BdFRSX25hbWUgPSBOb25lICAjIElnbm9yZWQKKworICAgIGRlZiBCYWRNZXRob2ROYW1lKHNlbGYpOgorICAgICAgICAiIiJJZ25vcmVkIHNpbmNlIHRoZSBtZXRob2QgaXMgaW4gdGhlIGludGVyZmFjZS4iIiIKKworCitWID0gW1dIQVRfRXZlcl9pbkxpc3RDb21wIGZvciBXSEFUX0V2ZXJfaW5MaXN0Q29tcCBpbiBHT09EX0NPTlNUX05BTUVdCisKK2RlZiBjbGFzc19idWlsZGVyKCk6CisgICAgIiIiRnVuY3Rpb24gcmV0dXJuaW5nIGEgY2xhc3Mgb2JqZWN0LiIiIgorCisgICAgY2xhc3MgRW1iZWRkZWRDbGFzcyhvYmplY3QpOgorICAgICAgICAiIiJVc2VsZXNzIGNsYXNzLiIiIgorCisgICAgcmV0dXJuIEVtYmVkZGVkQ2xhc3MKKworIyArMTpbaW52YWxpZC1uYW1lXQorQkFEX05BTUVfRk9SX0NMQVNTID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgnTmFtZWQnLCBbJ3R1cGxlJ10pCitORVhUX0JBRF9OQU1FX0ZPUl9DTEFTUyA9IGNsYXNzX2J1aWxkZXIoKSAgIyBbaW52YWxpZC1uYW1lXQorCitHb29kTmFtZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ05hbWVkJywgWyd0dXBsZSddKQorVG9wbGV2ZWxDbGFzcyA9IGNsYXNzX2J1aWxkZXIoKQorCisjIEFsaWFzZXMgZm9yIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZSBuYW1lIGNvbnN0cmFpbnRzLgorQWxzb0NvcnJlY3QgPSBDb3JyZWN0Q2xhc3NOYW1lCitOT1RfQ09SUkVDVCA9IENvcnJlY3RDbGFzc05hbWUgICMgW2ludmFsaWQtbmFtZV0KKworCitkZWYgdGVzdF9nbG9iYWxzKCk6CisgICAgIiIiTmFtZXMgaW4gZ2xvYmFsIHN0YXRlbWVudHMgYXJlIGFsc28gY2hlY2tlZC4iIiIKKyAgICBnbG9iYWwgTk9UX0NPUlJFQ1QKKyAgICBnbG9iYWwgQWxzb0NvcnJlY3QgICMgW2ludmFsaWQtbmFtZV0KKyAgICBOT1RfQ09SUkVDVCA9IDEKKyAgICBBbHNvQ29ycmVjdCA9IDIKKworCitjbGFzcyBGb29DbGFzcyhvYmplY3QpOgorICAgICIiIkEgdGVzdCBjYXNlIGZvciBwcm9wZXJ0eSBuYW1lcy4KKworICAgIFNpbmNlIGJ5IGRlZmF1bHQsIHRoZSByZWdleCBmb3IgYXR0cmlidXRlcyBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCisgICAgZm9yIG1ldGhvZCBuYW1lcywgd2UgY2hlY2sgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdG8gY29udGFpbiB0aGUKKyAgICBzdHJpbmcgJ2F0dHJpYnV0ZScuCisgICAgIiIiCisgICAgQHByb3BlcnR5CisgICAgZGVmIFBST1BFUlRZX05BTUUoc2VsZik6ICAjIFtpbnZhbGlkLW5hbWVdCisgICAgICAgICIiIklnbm9yZWQuIiIiCisgICAgICAgIHBhc3MKKworICAgIEBwcm9wZXJ0eQorICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgQUJTVFJBQ1RfUFJPUEVSVFlfTkFNRShzZWxmKTogICMgW2ludmFsaWQtbmFtZV0KKyAgICAgICAgIiIiSWdub3JlZC4iIiIKKyAgICAgICAgcGFzcworCisgICAgQFBST1BFUlRZX05BTUUuc2V0dGVyCisgICAgZGVmIFBST1BFUlRZX05BTUVfU0VUVEVSKHNlbGYpOiAgIyBbaW52YWxpZC1uYW1lXQorICAgICAgICAiIiJJZ25vcmVkLiIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX25pY2VfYW5kX2xvbmdfZGVzY3JpcHRpdmVfcHJpdmF0ZV9tZXRob2RfbmFtZShzZWxmKToKKyAgICAgICAgIiIicHJpdmF0ZSBtZXRob2Qgd2l0aCBsb25nIG5hbWUiIiIKKyAgICAgICAgcGFzcworCisKK2RlZiBnb29kX3B1YmxpY19mdW5jdGlvbl9uYW1lKGdvb2RfYXJnX25hbWUpOgorICAgICIiIlRoaXMgaXMgYSBwZXJmZWN0IHB1YmxpYyBmdW5jdGlvbiIiIgorICAgIGdvb2RfdmFyaWFibGVfbmFtZSA9IDEKKyAgICByZXR1cm4gZ29vZF92YXJpYWJsZV9uYW1lICsgZ29vZF9hcmdfbmFtZQorCisKK2RlZiBfcHJpdmF0ZV9zY29wZV9mdW5jdGlvbl93aXRoX2xvbmdfZGVzY3JpcHRpdmVfbmFtZSgpOgorICAgICIiIlByaXZhdGUgc2NvcGUgZnVuY3Rpb24gYXJlIGNvb2wgd2l0aCBsb25nIGRlc2NyaXB0aXZlIG5hbWVzIiIiCisgICAgcmV0dXJuIDEyCisKK0xPTkdfQ09OU1RBTlRfTkFNRV9JTl9QVUJMSUNfU0NPUEVfQVJFX09LQVkgPSBUcnVlCisjIFdlIGRvbid0IGVtaXQgZm9yIG5vbi1jb25zdCBub2RlcworZ29vZF9uYW1lX2Zvcl9mdW5jcyA9IGxhbWJkYTogTm9uZQorZ29vZF9uYW1lX2Zvcl9saXN0cyA9IFsxLCAyLCAzXQorCitjbGFzcyBfQW5FeGNlcHRpb25hbEV4Y2VwdGlvblRoYXRPY2N1cnNWZXJ5VmVyeVJhcmVseShFeGNlcHRpb24pOgorICAgICIiIkEgdmVyeSBleGNlcHRpb25hbCBleGNlcHRpb24gd2l0aCBhIG5pY2UgZGVzY3JpcHRpdmUgbmFtZSIiIgorICAgIHBhc3MKKworY2xhc3MgRm9vRW51bShFbnVtKToKKyAgICAiIiJBIHRlc3QgY2FzZSBmb3IgZW51bSBuYW1lcy4iIiIKKyAgICBHT09EX0VOVU1fTkFNRSA9IDEKKyAgICBiYWRfZW51bV9uYW1lID0gMiAgIyBbaW52YWxpZC1uYW1lXQorCitjbGFzcyBCYXI6CisgICAgIiIiQ2xhc3Mgd2l0aCBjbGFzcyB2YXJpYWJsZXMgYW5ub3RhdGVkIHdpdGggQ2xhc3NWYXIuIiIiCisgICAgQ0xBU1NfQ09OU1Q6IENsYXNzVmFyW2ludF0gPSA0MgorICAgIENMQVNTX0NPTlNUMjogQ2xhc3NWYXIgPSAiY29uc3QiCisgICAgdmFyaWFibGU6IENsYXNzVmFyW3N0cl0gPSAiaW52YWxpZCBuYW1lIgorICAgIENMQVNTX0NPTlNUMzogdHlwaW5nLkNsYXNzVmFyCisgICAgdmFyaWFibGUyOiB0eXBpbmcuQ2xhc3NWYXJbaW50XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9zdHlsZXMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lX3N0eWxlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTYzZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9zdHlsZXMucmMKQEAgLTAsMCArMSw1IEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9Mi42CisKK1tNZXNzYWdlcyBDb250cm9sXQorZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLGFic3RyYWN0LWNsYXNzLW5vdC11c2VkLGdsb2JhbC1zdGF0ZW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfc3R5bGVzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVfc3R5bGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTgyZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbWUvbmFtZV9zdHlsZXMudHh0CkBAIC0wLDAgKzEsMTcgQEAKK2ludmFsaWQtbmFtZToxMTowOjoiQ29uc3RhbnQgbmFtZSAiImJhZF9jb25zdF9uYW1lIiIgZG9lc24ndCBjb25mb3JtIHRvIFVQUEVSX0NBU0UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjE0OjA6QkFERlVOQ1RJT05fbmFtZToiRnVuY3Rpb24gbmFtZSAiIkJBREZVTkNUSU9OX25hbWUiIiBkb2Vzbid0IGNvbmZvcm0gdG8gc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUiCitpbnZhbGlkLW5hbWU6MTY6NDpCQURGVU5DVElPTl9uYW1lOiJWYXJpYWJsZSBuYW1lICIiQkFEX0xPQ0FMX1ZBUiIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSIKK2ludmFsaWQtbmFtZToyMDowOmZ1bmNfYmFkX2FyZ25hbWU6IkFyZ3VtZW50IG5hbWUgIiJOT1RfR09PRCIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSIKK2ludmFsaWQtbmFtZTozMDowOmJhZF9jbGFzc19uYW1lOiJDbGFzcyBuYW1lICIiYmFkX2NsYXNzX25hbWUiIiBkb2Vzbid0IGNvbmZvcm0gdG8gUGFzY2FsQ2FzZSBuYW1pbmcgc3R5bGUiCitpbnZhbGlkLW5hbWU6NDE6ODpDb3JyZWN0Q2xhc3NOYW1lLl9faW5pdF9fOiJBdHRyaWJ1dGUgbmFtZSAiIl9CYWRfQXRUUl9uYW1lIiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjQyOjg6Q29ycmVjdENsYXNzTmFtZS5fX2luaXRfXzoiQXR0cmlidXRlIG5hbWUgIiJCYWRfUFVCTElDX25hbWUiIiBkb2Vzbid0IGNvbmZvcm0gdG8gc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUiCitpbnZhbGlkLW5hbWU6NDc6NDpDb3JyZWN0Q2xhc3NOYW1lLkJhZE1ldGhvZE5hbWU6Ik1ldGhvZCBuYW1lICIiQmFkTWV0aG9kTmFtZSIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSI6SU5GRVJFTkNFCitpbnZhbGlkLW5hbWU6NTM6NDpDb3JyZWN0Q2xhc3NOYW1lLl9fRHVuREVSX0lTX25vdF9mcmVlX2Zvcl9hbGxfXzoiTWV0aG9kIG5hbWUgIiJfX0R1bkRFUl9JU19ub3RfZnJlZV9mb3JfYWxsX18iIiBkb2Vzbid0IGNvbmZvcm0gdG8gc25ha2VfY2FzZSBuYW1pbmcgc3R5bGUiOklORkVSRU5DRQoraW52YWxpZC1uYW1lOjgzOjA6OiJDbGFzcyBuYW1lICIiQkFEX05BTUVfRk9SX0NMQVNTIiIgZG9lc24ndCBjb25mb3JtIHRvIFBhc2NhbENhc2UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjg0OjA6OiJDbGFzcyBuYW1lICIiTkVYVF9CQURfTkFNRV9GT1JfQ0xBU1MiIiBkb2Vzbid0IGNvbmZvcm0gdG8gUGFzY2FsQ2FzZSBuYW1pbmcgc3R5bGUiCitpbnZhbGlkLW5hbWU6OTE6MDo6IkNsYXNzIG5hbWUgIiJOT1RfQ09SUkVDVCIiIGRvZXNuJ3QgY29uZm9ybSB0byBQYXNjYWxDYXNlIG5hbWluZyBzdHlsZSIKK2ludmFsaWQtbmFtZTo5Nzo0OnRlc3RfZ2xvYmFsczoiQ29uc3RhbnQgbmFtZSAiIkFsc29Db3JyZWN0IiIgZG9lc24ndCBjb25mb3JtIHRvIFVQUEVSX0NBU0UgbmFtaW5nIHN0eWxlIgoraW52YWxpZC1uYW1lOjExMDo0OkZvb0NsYXNzLlBST1BFUlRZX05BTUU6IkF0dHJpYnV0ZSBuYW1lICIiUFJPUEVSVFlfTkFNRSIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSI6SU5GRVJFTkNFCitpbnZhbGlkLW5hbWU6MTE2OjQ6Rm9vQ2xhc3MuQUJTVFJBQ1RfUFJPUEVSVFlfTkFNRToiQXR0cmlidXRlIG5hbWUgIiJBQlNUUkFDVF9QUk9QRVJUWV9OQU1FIiIgZG9lc24ndCBjb25mb3JtIHRvIHNuYWtlX2Nhc2UgbmFtaW5nIHN0eWxlIjpJTkZFUkVOQ0UKK2ludmFsaWQtbmFtZToxMjE6NDpGb29DbGFzcy5QUk9QRVJUWV9OQU1FX1NFVFRFUjoiQXR0cmlidXRlIG5hbWUgIiJQUk9QRVJUWV9OQU1FX1NFVFRFUiIiIGRvZXNuJ3QgY29uZm9ybSB0byBzbmFrZV9jYXNlIG5hbWluZyBzdHlsZSI6SU5GRVJFTkNFCitpbnZhbGlkLW5hbWU6MTUyOjQ6Rm9vRW51bToiQ2xhc3MgY29uc3RhbnQgbmFtZSAiImJhZF9lbnVtX25hbWUiIiBkb2Vzbid0IGNvbmZvcm0gdG8gVVBQRVJfQ0FTRSBuYW1pbmcgc3R5bGUiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lZHR1cGxlX21lbWJlcl9pbmZlcmVuY2UucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lZHR1cGxlX21lbWJlcl9pbmZlcmVuY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4OGNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVkdHVwbGVfbWVtYmVyX2luZmVyZW5jZS5weQpAQCAtMCwwICsxLDIyIEBACisiIiJUZXN0IG5hbWVkdHVwbGUgYXR0cmlidXRlcy4KKworUmVncmVzc2lvbiB0ZXN0IGZvcjoKK2h0dHBzOi8vYml0YnVja2V0Lm9yZy9sb2dpbGFiL3B5bGludC9pc3N1ZS85My9weWxpbnQtY3Jhc2hlcy1vbi1uYW1lZHR1cGxlLWF0dHJpYnV0ZQorIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgcHJpbnRfZnVuY3Rpb24KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKKworX19yZXZpc2lvbl9fID0gTm9uZQorCitUaGluZyA9IG5hbWVkdHVwbGUoJ1RoaW5nJywgKCkpCisKK0ZhbnRhc3RpYyA9IG5hbWVkdHVwbGUoJ0ZhbnRhc3RpYycsIFsnZm9vJ10pCisKK2RlZiB0ZXN0KCk6CisgICAgIiIiVGVzdCBtZW1iZXIgYWNjZXNzIGluIG5hbWVkIHR1cGxlcy4iIiIKKyAgICBwcmludChUaGluZy54KSAgIyBbbm8tbWVtYmVyXQorICAgIGZhbiA9IEZhbnRhc3RpYygxKQorICAgIHByaW50KGZhbi5mb28pCisgICAgIyBTaG91bGQgbm90IHJhaXNlIHByb3RlY3RlZC1hY2Nlc3MuCisgICAgZmFuMiA9IGZhbi5fcmVwbGFjZShmb289MikKKyAgICBwcmludChmYW4yLmZvbykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVkdHVwbGVfbWVtYmVyX2luZmVyZW5jZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lZHR1cGxlX21lbWJlcl9pbmZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NTRlOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lZHR1cGxlX21lbWJlcl9pbmZlcmVuY2UudHh0CkBAIC0wLDAgKzEgQEAKK25vLW1lbWJlcjoxNzoxMDp0ZXN0OkNsYXNzICdUaGluZycgaGFzIG5vICd4JyBtZW1iZXI6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lc19pbl9fYWxsX18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lc19pbl9fYWxsX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyODQwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVzX2luX19hbGxfXy5weQpAQCAtMCwwICsxLDQ5IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLXNlbGYtdXNlLCBuby1hYnNvbHV0ZS1pbXBvcnQsaW1wb3J0LWVycm9yLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktcGFzcworIiIiVGVzdCBQeWxpbnQncyB1c2Ugb2YgX19hbGxfXy4KKworKiBOb25FeGlzdGFudCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSwgYW5kIGl0IGlzIGxpc3RlZCBpbgorICBfX2FsbF9fLiBBbiBlcnJvciBpcyBleHBlY3RlZC4KKworKiBUaGlzIG1vZHVsZSBpbXBvcnRzIHBhdGggYW5kIHJlcHVibGlzaGVkIGl0IGluIF9fYWxsX18uIE5vIGVycm9ycworICBhcmUgZXhwZWN0ZWQuCisiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gb3MgaW1wb3J0IHBhdGgKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcKKworX19hbGxfXyA9IFsKKyAgICAnRHVtbXknLAorICAgICcnLCAjIFt1bmRlZmluZWQtYWxsLXZhcmlhYmxlXQorICAgIE1pc3NpbmcsCisgICAgU29tZVVuZGVmaW5lZCwgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorICAgICdOb25FeGlzdGFudCcsICAjIFt1bmRlZmluZWQtYWxsLXZhcmlhYmxlXQorICAgICdwYXRoJywKKyAgICAnZnVuYycsICAjIFt1bmRlZmluZWQtYWxsLXZhcmlhYmxlXQorICAgICdpbm5lcicsICAjIFt1bmRlZmluZWQtYWxsLXZhcmlhYmxlXQorICAgICdJbm5lcktsYXNzJywgZGVxdWUuX19uYW1lX19dICAjIFt1bmRlZmluZWQtYWxsLXZhcmlhYmxlXQorCisKK2NsYXNzIER1bW15KG9iamVjdCk6CisgICAgIiIiQSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlLiIiIgorICAgIHBhc3MKKworRFVNTVkgPSBEdW1teSgpCisKK2RlZiBmdW5jdGlvbigpOgorICAgICIiIkZ1bmN0aW9uIGRvY3N0cmluZworICAgICIiIgorICAgIHBhc3MKKworZnVuY3Rpb24oKQorCitjbGFzcyBLbGFzcyhvYmplY3QpOgorICAgICIiIkEga2xhc3Mgd2hpY2ggY29udGFpbnMgYSBmdW5jdGlvbiIiIgorICAgIGRlZiBmdW5jKHNlbGYpOgorICAgICAgICAiIiJBIGtsYXNzIG1ldGhvZCIiIgorICAgICAgICBpbm5lciA9IE5vbmUKKyAgICAgICAgcHJpbnQoaW5uZXIpCisKKyAgICBjbGFzcyBJbm5lcktsYXNzKG9iamVjdCk6CisgICAgICAgICIiIkFuIGlubmVyIGtsYXNzIiIiCisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW1lL25hbWVzX2luX19hbGxfXy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lc19pbl9fYWxsX18udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTAxNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFtZS9uYW1lc19pbl9fYWxsX18udHh0CkBAIC0wLDAgKzEsNiBAQAordW5kZWZpbmVkLWFsbC12YXJpYWJsZToxNzo0OjpVbmRlZmluZWQgdmFyaWFibGUgbmFtZSAnJyBpbiBfX2FsbF9fCit1bmRlZmluZWQtdmFyaWFibGU6MTk6NDo6VW5kZWZpbmVkIHZhcmlhYmxlICdTb21lVW5kZWZpbmVkJwordW5kZWZpbmVkLWFsbC12YXJpYWJsZToyMDo0OjpVbmRlZmluZWQgdmFyaWFibGUgbmFtZSAnTm9uRXhpc3RhbnQnIGluIF9fYWxsX18KK3VuZGVmaW5lZC1hbGwtdmFyaWFibGU6MjI6NDo6VW5kZWZpbmVkIHZhcmlhYmxlIG5hbWUgJ2Z1bmMnIGluIF9fYWxsX18KK3VuZGVmaW5lZC1hbGwtdmFyaWFibGU6MjM6NDo6VW5kZWZpbmVkIHZhcmlhYmxlIG5hbWUgJ2lubmVyJyBpbiBfX2FsbF9fCit1bmRlZmluZWQtYWxsLXZhcmlhYmxlOjI0OjQ6OlVuZGVmaW5lZCB2YXJpYWJsZSBuYW1lICdJbm5lcktsYXNzJyBpbiBfX2FsbF9fCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFuX2NvbXBhcmlzb25fY2hlY2sucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmFuX2NvbXBhcmlzb25fY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxY2YyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uYW5fY29tcGFyaXNvbl9jaGVjay5weQpAQCAtMCwwICsxLDIxIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCBtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudAorIyBweWxpbnQ6IGRpc2FibGU9bGl0ZXJhbC1jb21wYXJpc29uLGNvbXBhcmlzb24td2l0aC1pdHNlbGYsIGltcG9ydC1lcnJvcgorIiIiVGVzdCBkZXRlY3Rpb24gb2YgTmFOIHZhbHVlIGNvbXBhcmlzb24uIiIiCitpbXBvcnQgbnVtcHkKK3ggPSA0MgorYSA9IHggaXMgbnVtcHkuTmFOICAjIFtuYW4tY29tcGFyaXNvbl0KK2IgPSB4ID09IG51bXB5Lk5hTiAgIyBbbmFuLWNvbXBhcmlzb25dCitjID0geCA9PSBmbG9hdCgnbmFuJykgICMgW25hbi1jb21wYXJpc29uXQorZSA9IG51bXB5Lk5hTiA9PSBudW1weS5OYU4gICMgW25hbi1jb21wYXJpc29uXQorZiA9IHggaXMgMQorZyA9IDEyMyBpcyAiMTIzIgoraCA9IG51bXB5Lk5hTiBpcyBub3QgeCAgIyBbbmFuLWNvbXBhcmlzb25dCitpID0gbnVtcHkuTmFOICE9IHggICMgW25hbi1jb21wYXJpc29uXQorCitqID0geCAhPSBudW1weS5OYU4gICMgW25hbi1jb21wYXJpc29uXQorajEgPSB4ICE9IGZsb2F0KCduYW4nKSAgIyBbbmFuLWNvbXBhcmlzb25dCithc3NlcnQgeCA9PSBudW1weS5OYU4gICMgW25hbi1jb21wYXJpc29uXQorYXNzZXJ0IHggaXMgbm90IGZsb2F0KCduYW4nKSAgIyBbbmFuLWNvbXBhcmlzb25dCitpZiB4ID09IG51bXB5Lk5hTjogICMgW25hbi1jb21wYXJpc29uXQorICAgIHBhc3MKK3ogPSBib29sKHggaXMgbnVtcHkuTmFOKSAgIyBbbmFuLWNvbXBhcmlzb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmFuX2NvbXBhcmlzb25fY2hlY2sudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbl9jb21wYXJpc29uX2NoZWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUxZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25hbl9jb21wYXJpc29uX2NoZWNrLnR4dApAQCAtMCwwICsxLDEyIEBACituYW4tY29tcGFyaXNvbjo2OjQ6OkNvbXBhcmlzb24gJ3ggaXMgbnVtcHkuTmFOJyBzaG91bGQgYmUgJ21hdGguaXNuYW4oeCknCituYW4tY29tcGFyaXNvbjo3OjQ6OkNvbXBhcmlzb24gJ3ggPT0gbnVtcHkuTmFOJyBzaG91bGQgYmUgJ21hdGguaXNuYW4oeCknCituYW4tY29tcGFyaXNvbjo4OjQ6OkNvbXBhcmlzb24gJ3ggPT0gZmxvYXQoJ25hbicpJyBzaG91bGQgYmUgJ21hdGguaXNuYW4oeCknCituYW4tY29tcGFyaXNvbjo5OjQ6OkNvbXBhcmlzb24gJ251bXB5Lk5hTiA9PSBudW1weS5OYU4nIHNob3VsZCBiZSAnbWF0aC5pc25hbihudW1weS5OYU4pJworbmFuLWNvbXBhcmlzb246MTI6NDo6Q29tcGFyaXNvbiAnbnVtcHkuTmFOIGlzIG5vdCB4JyBzaG91bGQgYmUgJ25vdCBtYXRoLmlzbmFuKHgpJworbmFuLWNvbXBhcmlzb246MTM6NDo6Q29tcGFyaXNvbiAnbnVtcHkuTmFOICE9IHgnIHNob3VsZCBiZSAnbm90IG1hdGguaXNuYW4oeCknCituYW4tY29tcGFyaXNvbjoxNTo0OjpDb21wYXJpc29uICd4ICE9IG51bXB5Lk5hTicgc2hvdWxkIGJlICdub3QgbWF0aC5pc25hbih4KScKK25hbi1jb21wYXJpc29uOjE2OjU6OkNvbXBhcmlzb24gJ3ggIT0gZmxvYXQoJ25hbicpJyBzaG91bGQgYmUgJ25vdCBtYXRoLmlzbmFuKHgpJworbmFuLWNvbXBhcmlzb246MTc6Nzo6Q29tcGFyaXNvbiAneCA9PSBudW1weS5OYU4nIHNob3VsZCBiZSAnbWF0aC5pc25hbih4KScKK25hbi1jb21wYXJpc29uOjE4Ojc6OkNvbXBhcmlzb24gJ3ggaXMgbm90IGZsb2F0KCduYW4nKScgc2hvdWxkIGJlICdub3QgbWF0aC5pc25hbih4KScKK25hbi1jb21wYXJpc29uOjE5OjM6OkNvbXBhcmlzb24gJ3ggPT0gbnVtcHkuTmFOJyBzaG91bGQgYmUgJ21hdGguaXNuYW4oeCknCituYW4tY29tcGFyaXNvbjoyMTo5OjpDb21wYXJpc29uICd4IGlzIG51bXB5Lk5hTicgc2hvdWxkIGJlICdtYXRoLmlzbmFuKHgpJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9ibG9ja3NfaXNzdWUxMDg4LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9ibG9ja3NfaXNzdWUxMDg4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NGE5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmVzdGVkX2Jsb2Nrc19pc3N1ZTEwODgucHkKQEAgLTAsMCArMSwyMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworZGVmIGhhZF9idWcobnVtKToKKyAgICBpZiBudW0gPiAxOiAgIyBbdG9vLW1hbnktbmVzdGVkLWJsb2Nrc10KKyAgICAgICAgaWYgbnVtID4gMjoKKyAgICAgICAgICAgIGlmIG51bSA+IDM6CisgICAgICAgICAgICAgICAgaWYgbnVtID4gNDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbnVtID4gNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bSA+IDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gTm9uZQorCisKK2RlZiB3YXNfY29ycmVjdChudW0pOgorICAgIGlmIG51bSA+IDE6ICAjIFt0b28tbWFueS1uZXN0ZWQtYmxvY2tzXQorICAgICAgICBpZiBudW0gPiAyOgorICAgICAgICAgICAgaWYgbnVtID4gMzoKKyAgICAgICAgICAgICAgICBpZiBudW0gPiA0OgorICAgICAgICAgICAgICAgICAgICBpZiBudW0gPiA1OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVtID4gNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIG51bSA9PSAwOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9ibG9ja3NfaXNzdWUxMDg4LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uZXN0ZWRfYmxvY2tzX2lzc3VlMTA4OC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkYWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uZXN0ZWRfYmxvY2tzX2lzc3VlMTA4OC50eHQKQEAgLTAsMCArMSwyIEBACit0b28tbWFueS1uZXN0ZWQtYmxvY2tzOjM6NDpoYWRfYnVnOlRvbyBtYW55IG5lc3RlZCBibG9ja3MgKDYvNSkKK3Rvby1tYW55LW5lc3RlZC1ibG9ja3M6MTQ6NDp3YXNfY29ycmVjdDpUb28gbWFueSBuZXN0ZWQgYmxvY2tzICg2LzUpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmVzdGVkX2Z1bmNfZGVmaW5lZF9pbl9sb29wLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9mdW5jX2RlZmluZWRfaW5fbG9vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQyODg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9mdW5jX2RlZmluZWRfaW5fbG9vcC5weQpAQCAtMCwwICsxLDEwIEBACisiIiJDaGVjayBhIG5lc3RlZCBmdW5jdGlvbiBkZWZpbmVkIGluIGEgbG9vcC4iIiIKKworZGVmIGV4YW1wbGUoYXJncyk6CisgICAgIiIiVGhlIGNoZWNrIiIiCisgICAgZm9yIGkgaW4gYXJnczoKKyAgICAgICAgZGVmIG5lc3RlZCgpOgorICAgICAgICAgICAgcHJpbnQoaSkgICMgW2NlbGwtdmFyLWZyb20tbG9vcF0KKyAgICAgICAgbmVzdGVkKCkKKyAgICBmb3IgaSBpbiBhcmdzOgorICAgICAgICBwcmludChpKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9mdW5jX2RlZmluZWRfaW5fbG9vcC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmVzdGVkX2Z1bmNfZGVmaW5lZF9pbl9sb29wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjcwZWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25lc3RlZF9mdW5jX2RlZmluZWRfaW5fbG9vcC50eHQKQEAgLTAsMCArMSBAQAorY2VsbC12YXItZnJvbS1sb29wOjc6MTg6ZXhhbXBsZS5uZXN0ZWQ6Q2VsbCB2YXJpYWJsZSBpIGRlZmluZWQgaW4gbG9vcApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25ld19zdHlsZV9jbGFzc19weV8zMC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uZXdfc3R5bGVfY2xhc3NfcHlfMzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3OGM1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uZXdfc3R5bGVfY2xhc3NfcHlfMzAucHkKQEAgLTAsMCArMSwzNSBAQAorIiIiY2hlY2sgYnVpbHRpbiBkYXRhIGRlc2NyaXB0b3JzIHN1Y2ggYXMgbW9kZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIG9uIGEgZmlsZSBhcmUgY29ycmVjdGx5IGhhbmRsZWQKKworYnVnIG5vdGlmaWVkIGJ5IFBpZXJyZSBSb3VsZWF1IG9uIDIwMDUtMDQtMjQKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorX19yZXZpc2lvbl9fID0gTm9uZQorCisKK2NsYXNzIEZpbGUoZmlsZSk6ICAjIHB5bGludDogZGlzYWJsZT1maWxlLWJ1aWx0aW4sdW5kZWZpbmVkLXZhcmlhYmxlCisgICAgIiIiIFRlc3RpbmcgbmV3LXN0eWxlIGNsYXNzIGluaGVyaXRhbmNlIGZyb20gZmlsZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlPSJyIiwgYnVmZmVyaW5nPS0xLCB2ZXJib3NlPUZhbHNlKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IiIiIKKyAgICAgICAgc2VsZi53YXNfbW9kaWZpZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIHN1cGVyKEZpbGUsIHNlbGYpLl9faW5pdF9fKG5hbWUsIG1vZGUsIGJ1ZmZlcmluZykgICMgW3N1cGVyLXdpdGgtYXJndW1lbnRzXQorICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiRmlsZSAlcyBpcyBvcGVuZWQuICBUaGUgbW9kZSBpczogJXMiICUgKHNlbGYubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlKSkKKworICAgIGRlZiB3cml0ZShzZWxmLCBhX3N0cmluZyk6CisgICAgICAgICIiIiBXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS4iIiIKKyAgICAgICAgc3VwZXIoRmlsZSwgc2VsZikud3JpdGUoYV9zdHJpbmcpICAjIFtzdXBlci13aXRoLWFyZ3VtZW50c10KKyAgICAgICAgc2VsZi53YXNfbW9kaWZpZWQgPSBUcnVlCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBzZXF1ZW5jZSk6CisgICAgICAgICIiIiBXcml0ZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MgdG8gdGhlIGZpbGUuICIiIgorICAgICAgICBzdXBlcihGaWxlLCBzZWxmKS53cml0ZWxpbmVzKHNlcXVlbmNlKSAgIyBbc3VwZXItd2l0aC1hcmd1bWVudHNdCisgICAgICAgIHNlbGYud2FzX21vZGlmaWVkID0gVHJ1ZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgZmlsZS4iIiIKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIkNsb3NpbmcgZmlsZSAlcyIgJSBzZWxmLm5hbWUpCisgICAgICAgIHN1cGVyKEZpbGUsIHNlbGYpLmNsb3NlKCkgICMgW3N1cGVyLXdpdGgtYXJndW1lbnRzXQorICAgICAgICBzZWxmLndhc19tb2RpZmllZCA9IEZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbmV3X3N0eWxlX2NsYXNzX3B5XzMwLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uZXdfc3R5bGVfY2xhc3NfcHlfMzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzQzNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbmV3X3N0eWxlX2NsYXNzX3B5XzMwLnR4dApAQCAtMCwwICsxLDQgQEAKK3N1cGVyLXdpdGgtYXJndW1lbnRzOjE1Ojg6RmlsZS5fX2luaXRfXzpDb25zaWRlciB1c2luZyBQeXRob24gMyBzdHlsZSBzdXBlcigpIHdpdGhvdXQgYXJndW1lbnRzCitzdXBlci13aXRoLWFyZ3VtZW50czoyMjo4OkZpbGUud3JpdGU6Q29uc2lkZXIgdXNpbmcgUHl0aG9uIDMgc3R5bGUgc3VwZXIoKSB3aXRob3V0IGFyZ3VtZW50cworc3VwZXItd2l0aC1hcmd1bWVudHM6Mjc6ODpGaWxlLndyaXRlbGluZXM6Q29uc2lkZXIgdXNpbmcgUHl0aG9uIDMgc3R5bGUgc3VwZXIoKSB3aXRob3V0IGFyZ3VtZW50cworc3VwZXItd2l0aC1hcmd1bWVudHM6MzQ6ODpGaWxlLmNsb3NlOkNvbnNpZGVyIHVzaW5nIFB5dGhvbiAzIHN0eWxlIHN1cGVyKCkgd2l0aG91dCBhcmd1bWVudHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fY2xhc3NtZXRob2RfZGVjb3JhdG9yLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2NsYXNzbWV0aG9kX2RlY29yYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNjMGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2NsYXNzbWV0aG9kX2RlY29yYXRvci5weQpAQCAtMCwwICsxLDM1IEBACisiIiJDaGVja3MgY2xhc3MgbWV0aG9kcyBhcmUgZGVjbGFyZWQgd2l0aCBhIGRlY29yYXRvciBpZiB3aXRoaW4gdGhlIGNsYXNzCitzY29wZSBhbmQgaWYgY2xhc3NtZXRob2QncyBhcmd1bWVudCBpcyBhIG1lbWJlciBvZiB0aGUgY2xhc3MKKyIiIgorCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2luZy1jb25zdGFudC10ZXN0LCBuby1zZWxmLWFyZ3VtZW50LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitjbGFzcyBNeUNsYXNzKG9iamVjdCk6CisgICAgIiIiU29tZSBjbGFzcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNtZXRob2QoY2xzKToKKyAgICAgICAgIiIiY2xhc3MgbWV0aG9kLXRvLWJlIiIiCisgICAgY21ldGhvZCA9IGNsYXNzbWV0aG9kKGNtZXRob2QpICAjIFtuby1jbGFzc21ldGhvZC1kZWNvcmF0b3JdCisKKyAgICBpZiBUcnVlOgorICAgICAgICBjbWV0aG9kID0gY2xhc3NtZXRob2QoY21ldGhvZCkgICMgW25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcl0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBteV9zZWNvbmRfbWV0aG9kKGNscyk6CisgICAgICAgICIiImNvcnJlY3QgY2xhc3MgbWV0aG9kIGRlZmluaXRpb24iIiIKKworICAgIGRlZiBvdGhlcl9tZXRob2QoY2xzKToKKyAgICAgICAgIiIic29tZSBtZXRob2QiIiIKKyAgICBjbWV0aG9kMiA9IGNsYXNzbWV0aG9kKG90aGVyX21ldGhvZCkgICMgW25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcl0KKworZGVmIGhlbGxvd29ybGQoKToKKyAgICAiIiJzYXlzIGhlbGxvIiIiCisKKworTXlDbGFzcy5uZXdfY2xhc3NfbWV0aG9kID0gY2xhc3NtZXRob2QoaGVsbG93b3JsZCkKKworY2xhc3MgTXlPdGhlckNsYXNzKG9iamVjdCk6CisgICAgIiIiU29tZSBvdGhlciBjbGFzcyIiIgorICAgIF9tYWtlID0gY2xhc3NtZXRob2QodHVwbGUuX19uZXdfXykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19jbGFzc21ldGhvZF9kZWNvcmF0b3IudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2NsYXNzbWV0aG9kX2RlY29yYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiMTBmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19jbGFzc21ldGhvZF9kZWNvcmF0b3IudHh0CkBAIC0wLDAgKzEsMyBAQAorbm8tY2xhc3NtZXRob2QtZGVjb3JhdG9yOjE0OjQ6TXlDbGFzczpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgY2xhc3NtZXRob2QKK25vLWNsYXNzbWV0aG9kLWRlY29yYXRvcjoxNzo4Ok15Q2xhc3M6Q29uc2lkZXIgdXNpbmcgYSBkZWNvcmF0b3IgaW5zdGVhZCBvZiBjYWxsaW5nIGNsYXNzbWV0aG9kCituby1jbGFzc21ldGhvZC1kZWNvcmF0b3I6MjU6NDpNeUNsYXNzOkNvbnNpZGVyIHVzaW5nIGEgZGVjb3JhdG9yIGluc3RlYWQgb2YgY2FsbGluZyBjbGFzc21ldGhvZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2R1bW15X3JlZGVmaW5lZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19kdW1teV9yZWRlZmluZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiMDkzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19kdW1teV9yZWRlZmluZWQucHkKQEAgLTAsMCArMSwxNCBAQAorIiIiTWFrZSBzdXJlIHdhcm5pbmdzIGFib3V0IHJlZGVmaW5pdGlvbnMgZG8gbm90IHRyaWdnZXIgZm9yIGR1bW15IHZhcmlhYmxlcy4iIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworCitfLCBJTlRFUkVTVElORyA9ICdhPWInLnNwbGl0KCc9JykKKwordmFsdWUgPSAxMCAgIyBbaW52YWxpZC1uYW1lXQorCisKK2RlZiBjbG9iYmVyaW5nKCk6CisgICAgIiIiQ2xvYmJlcnMgYSBkdW1teSBuYW1lIGZyb20gdGhlIG91dGVyIHNjb3BlLiIiIgorICAgIHZhbHVlID0gOSAgIyBbcmVkZWZpbmVkLW91dGVyLW5hbWVdCisgICAgZm9yIF8gaW4gcmFuZ2UoNyk6CisgICAgICAgIHByaW50KHZhbHVlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2R1bW15X3JlZGVmaW5lZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZHVtbXlfcmVkZWZpbmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTY4NTRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2R1bW15X3JlZGVmaW5lZC50eHQKQEAgLTAsMCArMSwyIEBACitpbnZhbGlkLW5hbWU6NzowOjoiQ29uc3RhbnQgbmFtZSAiInZhbHVlIiIgZG9lc24ndCBjb25mb3JtIHRvIFVQUEVSX0NBU0UgbmFtaW5nIHN0eWxlIgorcmVkZWZpbmVkLW91dGVyLW5hbWU6MTI6NDpjbG9iYmVyaW5nOlJlZGVmaW5pbmcgbmFtZSAndmFsdWUnIGZyb20gb3V0ZXIgc2NvcGUgKGxpbmUgNykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19lbHNlX2JyZWFrLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfYnJlYWsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyM2YzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19lbHNlX2JyZWFrLnB5CkBAIC0wLDAgKzEsMTM3IEBACisiIiIgVGVzdCB0aGF0IHN1cGVyZmx1b3VzIGVsc2UgcmV0dXJuIGFyZSBkZXRlY3RlZC4gIiIiCisKKyMgcHlsaW50OmRpc2FibGU9aW52YWxpZC1uYW1lLG1pc3NpbmctZG9jc3RyaW5nLHVudXNlZC12YXJpYWJsZQorCisKK2RlZiBmb28xKHgsIHksIHopOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPiB5OiAgIyBbbm8tZWxzZS1icmVha10KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhID0gegorCisKK2RlZiBmb28yKHgsIHksIHcsIHopOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPiB5OiAgIyBbbm8tZWxzZS1icmVha10KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgaSA+IHc6CisgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYSA9IHoKKworCitkZWYgZm9vMyh4LCB5LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpID4geToKKyAgICAgICAgICAgIGEgPSAxCisgICAgICAgICAgICBpZiB6OiAgIyBbbm8tZWxzZS1icmVha10KKyAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGMgPSAzCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGQgPSA0CisgICAgICAgICAgICBicmVhaworCisKK2RlZiBmb280KHgsIHkpOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPiB4OiAgIyBbbm8tZWxzZS1icmVha10KKyAgICAgICAgICAgIGlmIHk6CisgICAgICAgICAgICAgICAgYSA9IDQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gMworICAgICAgICBicmVhaworCisKK2RlZiBmb281KHgsIHksIHopOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPiB5OiAgIyBbbm8tZWxzZS1icmVha10KKyAgICAgICAgICAgIGlmIHk6CisgICAgICAgICAgICAgICAgYSA9IDQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgejoKKyAgICAgICAgICAgIGMgPSAyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gMworICAgICAgICBicmVhaworCisKK2RlZiBmb282KHgsIHkpOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPiB4OgorICAgICAgICAgICAgaWYgeTogICMgW25vLWVsc2UtYnJlYWtdCisgICAgICAgICAgICAgICAgYSA9IDQKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiID0gMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgYnJlYWsKKworCitkZWYgYmFyMSh4LCB5LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpID4geToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiB6CisKKworZGVmIGJhcjIodywgeCwgeSwgeik6CisgICAgZm9yIGkgaW4gdzoKKyAgICAgICAgaWYgaSA+IHg6CisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiB6IDwgaToKKyAgICAgICAgICAgIGEgPSB5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4KKworCitkZWYgYmFyMyh4LCB5LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpID4geToKKyAgICAgICAgICAgIGlmIHo6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB6CisgICAgICAgIHJldHVybiBOb25lCisKKworZGVmIGJhcjQoeCk6CisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBpZiB4OiAgIyBbbm8tZWxzZS1icmVha10KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworCisKK2RlZiBuZXN0ZWQxKHgsIHksIHopOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPiB4OgorICAgICAgICAgICAgZm9yIGogaW4geToKKyAgICAgICAgICAgICAgICBpZiBqIDwgejoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGEgPSB6CisKKworZGVmIG5lc3RlZDIoeCwgeSwgeik6CisgICAgZm9yIGkgaW4geDoKKyAgICAgICAgaWYgaSA+IHg6CisgICAgICAgICAgICBmb3IgaiBpbiB5OgorICAgICAgICAgICAgICAgIGlmIGogPiB6OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhID0gegpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfYnJlYWsudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfYnJlYWsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTI3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9icmVhay50eHQKQEAgLTAsMCArMSw3IEBACituby1lbHNlLWJyZWFrOjg6ODpmb28xOiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiImJyZWFrIiIiCituby1lbHNlLWJyZWFrOjE2Ojg6Zm9vMjoiVW5uZWNlc3NhcnkgIiJlbGlmIiIgYWZ0ZXIgIiJicmVhayIiIgorbm8tZWxzZS1icmVhazoyODoxMjpmb28zOiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiImJyZWFrIiIiCituby1lbHNlLWJyZWFrOjQxOjg6Zm9vNDoiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJicmVhayIiIgorbm8tZWxzZS1icmVhazo1NDo4OmZvbzU6IlVubmVjZXNzYXJ5ICIiZWxpZiIiIGFmdGVyICIiYnJlYWsiIiIKK25vLWVsc2UtYnJlYWs6NzA6MTI6Zm9vNjoiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJicmVhayIiIgorbm8tZWxzZS1icmVhazoxMTA6ODpiYXI0OiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiImJyZWFrIiIiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9jb250aW51ZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19lbHNlX2NvbnRpbnVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjcwZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9jb250aW51ZS5weQpAQCAtMCwwICsxLDEzNyBAQAorIiIiIFRlc3QgdGhhdCBzdXBlcmZsdW91cyBlbHNlIHJldHVybiBhcmUgZGV0ZWN0ZWQuICIiIgorCisjIHB5bGludDpkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtdmFyaWFibGUKKworCitkZWYgZm9vMSh4LCB5LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpIDwgeTogICMgW25vLWVsc2UtY29udGludWVdCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYSA9IHoKKworCitkZWYgZm9vMih4LCB5LCB3LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpIDwgeTogICMgW25vLWVsc2UtY29udGludWVdCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbGlmIGkgPCB3OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGEgPSB6CisKKworZGVmIGZvbzMoeCwgeSwgeik6CisgICAgZm9yIGkgaW4geDoKKyAgICAgICAgaWYgaSA8IHk6CisgICAgICAgICAgICBhID0gMQorICAgICAgICAgICAgaWYgejogICMgW25vLWVsc2UtY29udGludWVdCisgICAgICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjID0gMworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkID0gNAorICAgICAgICAgICAgY29udGludWUKKworCitkZWYgZm9vNCh4LCB5KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpIDwgeDogICMgW25vLWVsc2UtY29udGludWVdCisgICAgICAgICAgICBpZiB5OgorICAgICAgICAgICAgICAgIGEgPSA0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGIgPSAyCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgY29udGludWUKKworCitkZWYgZm9vNSh4LCB5LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpIDwgeTogICMgW25vLWVsc2UtY29udGludWVdCisgICAgICAgICAgICBpZiB5OgorICAgICAgICAgICAgICAgIGEgPSA0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGIgPSAyCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbGlmIHo6CisgICAgICAgICAgICBjID0gMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IDMKKyAgICAgICAgY29udGludWUKKworCitkZWYgZm9vNih4LCB5KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpIDwgeDoKKyAgICAgICAgICAgIGlmIHk6ICAjIFtuby1lbHNlLWNvbnRpbnVlXQorICAgICAgICAgICAgICAgIGEgPSA0CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGMgPSAzCisgICAgICAgIGNvbnRpbnVlCisKKworZGVmIGJhcjEoeCwgeSwgeik6CisgICAgZm9yIGkgaW4geDoKKyAgICAgICAgaWYgaSA8IHk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICByZXR1cm4gegorCisKK2RlZiBiYXIyKHcsIHgsIHksIHopOgorICAgIGZvciBpIGluIHc6CisgICAgICAgIGlmIGkgPCB4OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgeiA8IGk6CisgICAgICAgICAgICBhID0geQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmV0dXJuCisKKworZGVmIGJhcjMoeCwgeSwgeik6CisgICAgZm9yIGkgaW4geDoKKyAgICAgICAgaWYgaSA8IHk6CisgICAgICAgICAgICBpZiB6OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gegorICAgICAgICByZXR1cm4gTm9uZQorCisKK2RlZiBiYXI0KHgpOgorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgaWYgeDogICMgW25vLWVsc2UtY29udGludWVdCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworCitkZWYgbmVzdGVkMSh4LCB5LCB6KToKKyAgICBmb3IgaSBpbiB4OgorICAgICAgICBpZiBpIDwgeDoKKyAgICAgICAgICAgIGZvciBqIGluIHk6CisgICAgICAgICAgICAgICAgaWYgaiA8IHo6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhID0gegorCisKK2RlZiBuZXN0ZWQyKHgsIHksIHopOgorICAgIGZvciBpIGluIHg6CisgICAgICAgIGlmIGkgPCB4OgorICAgICAgICAgICAgZm9yIGogaW4geToKKyAgICAgICAgICAgICAgICBpZiBqIDwgejoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYSA9IHoKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19lbHNlX2NvbnRpbnVlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19lbHNlX2NvbnRpbnVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY1OWVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfY29udGludWUudHh0CkBAIC0wLDAgKzEsNyBAQAorbm8tZWxzZS1jb250aW51ZTo4Ojg6Zm9vMToiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJjb250aW51ZSIiIgorbm8tZWxzZS1jb250aW51ZToxNjo4OmZvbzI6IlVubmVjZXNzYXJ5ICIiZWxpZiIiIGFmdGVyICIiY29udGludWUiIiIKK25vLWVsc2UtY29udGludWU6Mjg6MTI6Zm9vMzoiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJjb250aW51ZSIiIgorbm8tZWxzZS1jb250aW51ZTo0MTo4OmZvbzQ6IlVubmVjZXNzYXJ5ICIiZWxzZSIiIGFmdGVyICIiY29udGludWUiIiIKK25vLWVsc2UtY29udGludWU6NTQ6ODpmb281OiJVbm5lY2Vzc2FyeSAiImVsaWYiIiBhZnRlciAiImNvbnRpbnVlIiIiCituby1lbHNlLWNvbnRpbnVlOjcwOjEyOmZvbzY6IlVubmVjZXNzYXJ5ICIiZWxzZSIiIGFmdGVyICIiY29udGludWUiIiIKK25vLWVsc2UtY29udGludWU6MTEwOjg6YmFyNDoiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJjb250aW51ZSIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmFpc2UucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9yYWlzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTgwN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmFpc2UucHkKQEAgLTAsMCArMSwxMTAgQEAKKyIiIiBUZXN0IHRoYXQgc3VwZXJmbHVvdXMgZWxzZSByZXR1cm4gYXJlIGRldGVjdGVkLiAiIiIKKworIyBweWxpbnQ6ZGlzYWJsZT1pbnZhbGlkLW5hbWUsbWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLXZhcmlhYmxlLHJhaXNlLW1pc3NpbmctZnJvbQorCitkZWYgZm9vMSh4LCB5LCB6KToKKyAgICBpZiB4OiAgIyBbbm8tZWxzZS1yYWlzZV0KKyAgICAgICAgYSA9IDEKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHkpCisgICAgZWxzZToKKyAgICAgICAgYiA9IDIKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHopCisKKworZGVmIGZvbzIoeCwgeSwgdywgeik6CisgICAgaWYgeDogICMgW25vLWVsc2UtcmFpc2VdCisgICAgICAgIGEgPSAxCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbih5KQorICAgIGVsaWYgejoKKyAgICAgICAgYiA9IDIKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHcpCisgICAgZWxzZToKKyAgICAgICAgYyA9IDMKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHopCisKKworZGVmIGZvbzMoeCwgeSwgeik6CisgICAgaWYgeDoKKyAgICAgICAgYSA9IDEKKyAgICAgICAgaWYgeTogICMgW25vLWVsc2UtcmFpc2VdCisgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gMworICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHgpCisgICAgZWxzZToKKyAgICAgICAgZCA9IDQKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHopCisKKworZGVmIGZvbzQoeCwgeSk6CisgICAgaWYgeDogIyBbbm8tZWxzZS1yYWlzZV0KKyAgICAgICAgaWYgeToKKyAgICAgICAgICAgIGEgPSA0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiID0gMgorICAgICAgICByYWlzZSBFeGNlcHRpb24oeCkKKyAgICBlbHNlOgorICAgICAgICBjID0gMworICAgIHJhaXNlIEV4Y2VwdGlvbih5KQorCisKK2RlZiBmb281KHgsIHksIHopOgorICAgIGlmIHg6ICMgW25vLWVsc2UtcmFpc2VdCisgICAgICAgIGlmIHk6CisgICAgICAgICAgICBhID0gNAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKHgpCisgICAgZWxpZiB6OgorICAgICAgICByYWlzZSBFeGNlcHRpb24oeSkKKyAgICBlbHNlOgorICAgICAgICBjID0gMworICAgIHJhaXNlIEV4Y2VwdGlvbih6KQorCisKK2RlZiBmb282KHgsIHkpOgorICAgIGlmIHg6CisgICAgICAgIGlmIHk6ICAgIyBbbm8tZWxzZS1yYWlzZV0KKyAgICAgICAgICAgIGEgPSA0CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oeCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGIgPSAyCisgICAgZWxzZToKKyAgICAgICAgYyA9IDMKKyAgICByYWlzZSBFeGNlcHRpb24oeSkKKworCitkZWYgYmFyMSh4LCB5LCB6KToKKyAgICBpZiB4OgorICAgICAgICByYWlzZSBFeGNlcHRpb24oeSkKKyAgICByYWlzZSBFeGNlcHRpb24oeikKKworCitkZWYgYmFyMih3LCB4LCB5LCB6KToKKyAgICBpZiB4OgorICAgICAgICByYWlzZSBFeGNlcHRpb24oeSkKKyAgICBpZiB6OgorICAgICAgICBhID0gMQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbih3KQorICAgIHJhaXNlIEV4Y2VwdGlvbihOb25lKQorCisKK2RlZiBiYXIzKHgsIHksIHopOgorICAgIGlmIHg6CisgICAgICAgIGlmIHo6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oeSkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oeikKKyAgICByYWlzZSBFeGNlcHRpb24oTm9uZSkKKworCitkZWYgYmFyNCh4KToKKyAgICBpZiB4OiAgIyBbbm8tZWxzZS1yYWlzZV0KKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKFRydWUpCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKEZhbHNlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihOb25lKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmFpc2UudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmFpc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWY3MTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9yYWlzZS50eHQKQEAgLTAsMCArMSw3IEBACituby1lbHNlLXJhaXNlOjY6NDpmb28xOiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiInJhaXNlIiIiCituby1lbHNlLXJhaXNlOjE1OjQ6Zm9vMjoiVW5uZWNlc3NhcnkgIiJlbGlmIiIgYWZ0ZXIgIiJyYWlzZSIiIgorbm8tZWxzZS1yYWlzZToyOTo4OmZvbzM6IlVubmVjZXNzYXJ5ICIiZWxzZSIiIGFmdGVyICIicmFpc2UiIiIKK25vLWVsc2UtcmFpc2U6NDE6NDpmb280OiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiInJhaXNlIiIiCituby1lbHNlLXJhaXNlOjUzOjQ6Zm9vNToiVW5uZWNlc3NhcnkgIiJlbGlmIiIgYWZ0ZXIgIiJyYWlzZSIiIgorbm8tZWxzZS1yYWlzZTo2ODo4OmZvbzY6IlVubmVjZXNzYXJ5ICIiZWxzZSIiIGFmdGVyICIicmFpc2UiIiIKK25vLWVsc2UtcmFpc2U6MTA0OjQ6YmFyNDoiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJyYWlzZSIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmV0dXJuLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmV0dXJuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODc1NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9yZXR1cm4ucHkKQEAgLTAsMCArMSwxMTAgQEAKKyIiIiBUZXN0IHRoYXQgc3VwZXJmbHVvdXMgZWxzZSByZXR1cm4gYXJlIGRldGVjdGVkLiAiIiIKKworCisjIHB5bGludDpkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtdmFyaWFibGUKK2RlZiBmb28xKHgsIHksIHopOgorICAgIGlmIHg6ICAjIFtuby1lbHNlLXJldHVybl0KKyAgICAgICAgYSA9IDEKKyAgICAgICAgcmV0dXJuIHkKKyAgICBlbHNlOgorICAgICAgICBiID0gMgorICAgICAgICByZXR1cm4gegorCisKK2RlZiBmb28yKHgsIHksIHcsIHopOgorICAgIGlmIHg6ICAjIFtuby1lbHNlLXJldHVybl0KKyAgICAgICAgYSA9IDEKKyAgICAgICAgcmV0dXJuIHkKKyAgICBlbGlmIHo6CisgICAgICAgIGIgPSAyCisgICAgICAgIHJldHVybiB3CisgICAgZWxzZToKKyAgICAgICAgYyA9IDMKKyAgICAgICAgcmV0dXJuIHoKKworCitkZWYgZm9vMyh4LCB5LCB6KToKKyAgICBpZiB4OgorICAgICAgICBhID0gMQorICAgICAgICBpZiB5OiAgIyBbbm8tZWxzZS1yZXR1cm5dCisgICAgICAgICAgICBiID0gMgorICAgICAgICAgICAgcmV0dXJuIHkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGMgPSAzCisgICAgICAgICAgICByZXR1cm4geAorICAgIGVsc2U6CisgICAgICAgIGQgPSA0CisgICAgICAgIHJldHVybiB6CisKKworZGVmIGZvbzQoeCwgeSk6CisgICAgaWYgeDogICAjIFtuby1lbHNlLXJldHVybl0KKyAgICAgICAgaWYgeToKKyAgICAgICAgICAgIGEgPSA0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiID0gMgorICAgICAgICByZXR1cm4KKyAgICBlbHNlOgorICAgICAgICBjID0gMworICAgIHJldHVybgorCisKK2RlZiBmb281KHgsIHksIHopOgorICAgIGlmIHg6ICAgIyBbbm8tZWxzZS1yZXR1cm5dCisgICAgICAgIGlmIHk6CisgICAgICAgICAgICBhID0gNAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgcmV0dXJuCisgICAgZWxpZiB6OgorICAgICAgICBjID0gMgorICAgIGVsc2U6CisgICAgICAgIGMgPSAzCisgICAgcmV0dXJuCisKKworZGVmIGZvbzYoeCwgeSk6CisgICAgaWYgeDoKKyAgICAgICAgaWYgeTogICAjIFtuby1lbHNlLXJldHVybl0KKyAgICAgICAgICAgIGEgPSA0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGIgPSAyCisgICAgZWxzZToKKyAgICAgICAgYyA9IDMKKyAgICByZXR1cm4KKworCitkZWYgYmFyMSh4LCB5LCB6KToKKyAgICBpZiB4OgorICAgICAgICByZXR1cm4geQorICAgIHJldHVybiB6CisKKworZGVmIGJhcjIodywgeCwgeSwgeik6CisgICAgaWYgeDoKKyAgICAgICAgcmV0dXJuIHkKKyAgICBpZiB6OgorICAgICAgICBhID0gMQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB3CisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgYmFyMyh4LCB5LCB6KToKKyAgICBpZiB4OgorICAgICAgICBpZiB6OgorICAgICAgICAgICAgcmV0dXJuIHkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gegorICAgIHJldHVybiBOb25lCisKKworZGVmIGJhcjQoeCk6CisgICAgaWYgeDogICMgW25vLWVsc2UtcmV0dXJuXQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fZWxzZV9yZXR1cm4udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmV0dXJuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYwZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX2Vsc2VfcmV0dXJuLnR4dApAQCAtMCwwICsxLDcgQEAKK25vLWVsc2UtcmV0dXJuOjY6NDpmb28xOiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiInJldHVybiIiIgorbm8tZWxzZS1yZXR1cm46MTU6NDpmb28yOiJVbm5lY2Vzc2FyeSAiImVsaWYiIiBhZnRlciAiInJldHVybiIiIgorbm8tZWxzZS1yZXR1cm46Mjk6ODpmb28zOiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiInJldHVybiIiIgorbm8tZWxzZS1yZXR1cm46NDE6NDpmb280OiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiInJldHVybiIiIgorbm8tZWxzZS1yZXR1cm46NTM6NDpmb281OiJVbm5lY2Vzc2FyeSAiImVsaWYiIiBhZnRlciAiInJldHVybiIiIgorbm8tZWxzZS1yZXR1cm46Njg6ODpmb282OiJVbm5lY2Vzc2FyeSAiImVsc2UiIiBhZnRlciAiInJldHVybiIiIgorbm8tZWxzZS1yZXR1cm46MTA0OjQ6YmFyNDoiVW5uZWNlc3NhcnkgIiJlbHNlIiIgYWZ0ZXIgIiJyZXR1cm4iIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19tZXRob2RfYXJndW1lbnRfcHkzOC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19tZXRob2RfYXJndW1lbnRfcHkzOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc0NTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX21ldGhvZF9hcmd1bWVudF9weTM4LnB5CkBAIC0wLDAgKzEsNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCisKK2NsYXNzIENsczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqLCAvKToKKyAgICAgICAgc2VsZi5vYmogPSBvYmoKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19tZXRob2RfYXJndW1lbnRfcHkzOC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19tZXRob2RfYXJndW1lbnRfcHkzOC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZjNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX21ldGhvZF9hcmd1bWVudF9weTM4LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX25hbWVfaW5fbW9kdWxlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX25hbWVfaW5fbW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWE5NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fbmFtZV9pbl9tb2R1bGUucHkKQEAgLTAsMCArMSw2NiBAQAorIyBweWxpbnQ6IGRpc2FibGU9d2lsZGNhcmQtaW1wb3J0LHVudXNlZC1pbXBvcnQsbm8tYWJzb2x1dGUtaW1wb3J0LGludmFsaWQtbmFtZSxpbXBvcnQtZXJyb3IsCisjIHB5bGludDogZGlzYWJsZT1iYXJlLWV4Y2VwdCxicm9hZC1leGNlcHQsd3JvbmctaW1wb3J0LW9yZGVyLHVuZ3JvdXBlZC1pbXBvcnRzLHdyb25nLWltcG9ydC1wb3NpdGlvbgorIiIiY2hlY2sgbm9uZXhpc3RlbnQgbmFtZXMgaW1wb3J0ZWQgYXJlIHJlcG9ydGVkIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgY29sbGVjdGlvbnMudHV0dSAgIyBbbm8tbmFtZS1pbi1tb2R1bGVdCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCB0b3RvICAjIFtuby1uYW1lLWluLW1vZHVsZV0KK3RvdG8ueW8oKQorCitmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKK0VsZW1lbnRUcmVlLm5vbmV4aXN0YW50X2Z1bmN0aW9uKCkgICMgW25vLW1lbWJlcl0KK0VsZW1lbnRUcmVlLmFub3RoZXIubm9uZXhpc3RhbnQuZnVuY3Rpb24oKSAgIyBbbm8tbWVtYmVyXQorCisKK2ltcG9ydCBzeXMKK3ByaW50KHN5cy5zdGRvdXQsICdoZWxsbyB3b3JsZCcpCitwcmludChzeXMuc3Rkb291dCwgJ2J5ZSBieWUgd29ybGQnKSAgIyBbbm8tbWVtYmVyXQorCisKK2ltcG9ydCByZQorcmUuZmluZGl0ZXIoJyonLCAneW8nKQorCitmcm9tIHJpZSBpbXBvcnQgKgorZnJvbSByZSBpbXBvcnQgZmluZGlpdGVyLCBjb21waWlsZSAgIyBbbm8tbmFtZS1pbi1tb2R1bGUsbm8tbmFtZS1pbi1tb2R1bGVdCisKK2ltcG9ydCBvcworJ1NPTUVWQVInIGluIG9zLmVudmlyb24gICMgW3BvaW50bGVzcy1zdGF0ZW1lbnRdCisKK3RyeToKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBzb21ldGhpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBzb21ldGhpbmcgPSBOb25lCisKK3RyeToKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBhbnl0aGluZyAjIFtuby1uYW1lLWluLW1vZHVsZV0KK2V4Y2VwdCBWYWx1ZUVycm9yOgorICAgIGFueXRoaW5nID0gTm9uZQorCit0cnk6CisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLm1pc3NpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKK3RyeToKKyAgICBpbXBvcnQgY29sbGVjdGlvbnMuaW5kZWVkX21pc3NpbmcgIyBbbm8tbmFtZS1pbi1tb2R1bGVdCitleGNlcHQgVmFsdWVFcnJvcjoKKyAgICBwYXNzCisKK3RyeToKKyAgICBpbXBvcnQgY29sbGVjdGlvbnMuZW1pdCAjIFtuby1uYW1lLWluLW1vZHVsZV0KK2V4Y2VwdCBFeGNlcHRpb246CisgICAgcGFzcworCit0cnk6CisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLmVtaXQxCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCit0cnk6CisgICAgaWYgc29tZXRoaW5nOgorICAgICAgICBpbXBvcnQgY29sbGVjdGlvbnMuZW1pdDIgIyBbbm8tbmFtZS1pbi1tb2R1bGVdCitleGNlcHQgRXhjZXB0aW9uOgorICAgIHBhc3MKKworZnJvbSAubm9fc2VsZl91c2UgaW1wb3J0IFN1cGVyCitmcm9tIC5ub19zZWxmX3VzZSBpbXBvcnQgbGFsYSAgIyBbbm8tbmFtZS1pbi1tb2R1bGVdCitmcm9tIC5ub19zZWxmX3VzZS5ibGEgaW1wb3J0IGxhbGExICMgW25vLW5hbWUtaW4tbW9kdWxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX25hbWVfaW5fbW9kdWxlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19uYW1lX2luX21vZHVsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzZTZiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19uYW1lX2luX21vZHVsZS50eHQKQEAgLTAsMCArMSwxNCBAQAorbm8tbmFtZS1pbi1tb2R1bGU6NTowOjpObyBuYW1lICd0dXR1JyBpbiBtb2R1bGUgJ2NvbGxlY3Rpb25zJworbm8tbmFtZS1pbi1tb2R1bGU6NjowOjpObyBuYW1lICd0b3RvJyBpbiBtb2R1bGUgJ2NvbGxlY3Rpb25zJworbm8tbWVtYmVyOjEwOjA6Ok1vZHVsZSAneG1sLmV0cmVlLkVsZW1lbnRUcmVlJyBoYXMgbm8gJ25vbmV4aXN0YW50X2Z1bmN0aW9uJyBtZW1iZXI6SU5GRVJFTkNFCituby1tZW1iZXI6MTE6MDo6TW9kdWxlICd4bWwuZXRyZWUuRWxlbWVudFRyZWUnIGhhcyBubyAnYW5vdGhlcicgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjE2OjY6Ok1vZHVsZSAnc3lzJyBoYXMgbm8gJ3N0ZG9vdXQnIG1lbWJlcjsgbWF5YmUgJ3N0ZG91dCc/OklORkVSRU5DRQorbm8tbmFtZS1pbi1tb2R1bGU6MjM6MDo6Tm8gbmFtZSAnY29tcGlpbGUnIGluIG1vZHVsZSAncmUnCituby1uYW1lLWluLW1vZHVsZToyMzowOjpObyBuYW1lICdmaW5kaWl0ZXInIGluIG1vZHVsZSAncmUnCitwb2ludGxlc3Mtc3RhdGVtZW50OjI2OjA6OlN0YXRlbWVudCBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdAorbm8tbmFtZS1pbi1tb2R1bGU6MzQ6NDo6Tm8gbmFtZSAnYW55dGhpbmcnIGluIG1vZHVsZSAnY29sbGVjdGlvbnMnCituby1uYW1lLWluLW1vZHVsZTo0NDo0OjpObyBuYW1lICdpbmRlZWRfbWlzc2luZycgaW4gbW9kdWxlICdjb2xsZWN0aW9ucycKK25vLW5hbWUtaW4tbW9kdWxlOjQ5OjQ6Ok5vIG5hbWUgJ2VtaXQnIGluIG1vZHVsZSAnY29sbGVjdGlvbnMnCituby1uYW1lLWluLW1vZHVsZTo2MDo4OjpObyBuYW1lICdlbWl0MicgaW4gbW9kdWxlICdjb2xsZWN0aW9ucycKK25vLW5hbWUtaW4tbW9kdWxlOjY1OjA6Ok5vIG5hbWUgJ2xhbGEnIGluIG1vZHVsZSAnZnVuY3Rpb25hbC5uLm5vLm5vX3NlbGZfdXNlJworbm8tbmFtZS1pbi1tb2R1bGU6NjY6MDo6Tm8gbmFtZSAnYmxhJyBpbiBtb2R1bGUgJ2Z1bmN0aW9uYWwubi5uby5ub19zZWxmX3VzZScKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19zZWxmX2FyZ3VtZW50LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfYXJndW1lbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNjA0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19zZWxmX2FyZ3VtZW50LnB5CkBAIC0wLDAgKzEsMTggQEAKKyIiIkNoZWNrIGZvciBtZXRob2Qgd2l0aG91dCBzZWxmIGFzIGZpcnN0IGFyZ3VtZW50IiIiCisjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitjbGFzcyBOb1NlbGZBcmd1bWVudChvYmplY3QpOgorICAgICIiImR1bW15IGNsYXNzIiIiCisKKyAgICBkZWYgX19pbml0X18odHJ1Yyk6ICAjIFtuby1zZWxmLWFyZ3VtZW50XQorICAgICAgICAiIiJtZXRob2Qgd2l0aG91dCBzZWxmIiIiCisgICAgICAgIHByaW50KDEpCisKKyAgICBkZWYgYWJkYyh5b28pOiAgIyBbbm8tc2VsZi1hcmd1bWVudF0KKyAgICAgICAgIiIiYW5vdGhlciB0ZXN0IiIiCisgICAgICAgIHByaW50KHlvbykKKworICAgIGRlZiBlZGYoc2VsZik6CisgICAgICAgICIiImp1c3QgYW5vdGhlciBtZXRob2QiIiIKKyAgICAgICAgcHJpbnQoJ3lhcHVkanUgaW4nLCBzZWxmKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfYXJndW1lbnQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfYXJndW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTFjNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl9hcmd1bWVudC50eHQKQEAgLTAsMCArMSwyIEBACituby1zZWxmLWFyZ3VtZW50Ojg6NDpOb1NlbGZBcmd1bWVudC5fX2luaXRfXzoiTWV0aG9kIHNob3VsZCBoYXZlICIic2VsZiIiIGFzIGZpcnN0IGFyZ3VtZW50Igorbm8tc2VsZi1hcmd1bWVudDoxMjo0Ok5vU2VsZkFyZ3VtZW50LmFiZGM6Ik1ldGhvZCBzaG91bGQgaGF2ZSAiInNlbGYiIiBhcyBmaXJzdCBhcmd1bWVudCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19zZWxmX2FyZ3VtZW50X3B5MzcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl9hcmd1bWVudF9weTM3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNmQ2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl9hcmd1bWVudF9weTM3LnB5CkBAIC0wLDAgKzEsMTUgQEAKKyIiIlRlc3QgZGV0ZWN0aW9uIG9mIHNlbGYgYXMgYXJndW1lbnQgb2YgZmlyc3QgbWV0aG9kIGluIFB5dGhvbiAzLjcgYW5kIGFib3ZlLiIiIgorCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKKworY2xhc3MgVG90byhvYmplY3QpOgorCisgICAgZGVmIF9fY2xhc3NfZ2V0aXRlbV9fKGNscywgcGFyYW1zKToKKyAgICAgICAgIyBUaGlzIGlzIGFjdHVhbGx5IGEgc3BlY2lhbCBtZXRob2Qgd2hpY2ggaXMgYWx3YXlzIGEgY2xhc3MgbWV0aG9kLgorICAgICAgICAjIFNlZSBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNTYwLyNjbGFzcy1nZXRpdGVtCisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2NsYXNzX290aGVyX18oY2xzLCBwYXJhbXMpOiAgIyBbbm8tc2VsZi1hcmd1bWVudF0KKyAgICAgICAgIyBUaGlzIGlzIG5vdCBhIHNwZWNpYWwgY2FzZSBhbmQgYXMgc3VjaCBpcyBhbiBpbnN0YW5jZSBtZXRob2QuCisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19zZWxmX2FyZ3VtZW50X3B5MzcucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl9hcmd1bWVudF9weTM3LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2JiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl9hcmd1bWVudF9weTM3LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfYXJndW1lbnRfcHkzNy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl9hcmd1bWVudF9weTM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGFiYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfYXJndW1lbnRfcHkzNy50eHQKQEAgLTAsMCArMSBAQAorbm8tc2VsZi1hcmd1bWVudDoxMzo0OlRvdG8uX19jbGFzc19vdGhlcl9fOiJNZXRob2Qgc2hvdWxkIGhhdmUgIiJzZWxmIiIgYXMgZmlyc3QgYXJndW1lbnQiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl91c2UucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl91c2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0YWIxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19zZWxmX3VzZS5weQpAQCAtMCwwICsxLDc4IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLG1pc3NpbmctZG9jc3RyaW5nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIidGVzdCBkZXRlY3Rpb24gb2YgbWV0aG9kIHdoaWNoIGNvdWxkIGJlIGEgZnVuY3Rpb24iIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitjbGFzcyBUb3RvKG9iamVjdCk6CisgICAgIiIiYmxhIGJhbCBhYmwiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hYWEgPSAyCisKKyAgICBkZWYgcmVndWxhcl9tZXRob2Qoc2VsZik6CisgICAgICAgICIiInRoaXMgbWV0aG9kIGlzIGEgcmVhbCBtZXRob2Qgc2luY2UgaXQgYWNjZXNzIHRvIHNlbGYiIiIKKyAgICAgICAgc2VsZi5mdW5jdGlvbl9tZXRob2QoKQorCisgICAgZGVmIGZ1bmN0aW9uX21ldGhvZChzZWxmKTogIyBbbm8tc2VsZi11c2VdCisgICAgICAgICIiInRoaXMgbWV0aG9kIGlzbicgYSByZWFsIG1ldGhvZCBzaW5jZSBpdCBkb2Vzbid0IG5lZWQgc2VsZiIiIgorICAgICAgICBwcmludCgnaGVsbG8nKQorCisKK2NsYXNzIEJhc2Uob2JqZWN0KToKKyAgICAiIiJhbiBhYnN0cmFjdCBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFhYSA9IDIKKworICAgIGRlZiBjaGVjayhzZWxmLCBhcmcpOgorICAgICAgICAiIiJhbiBhYnN0cmFjdCBtZXRob2QsIGNvdWxkIG5vdCBiZSBhIGZ1bmN0aW9uIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBTdWIoQmFzZSk6CisgICAgIiIiYSBjb25jcmV0ZSBjbGFzcyIiIgorCisgICAgZGVmIGNoZWNrKHNlbGYsIGFyZyk6CisgICAgICAgICIiImEgY29uY3JldGUgbWV0aG9kLCBjb3VsZCBub3QgYmUgYSBmdW5jdGlvbiBzaW5jZSBpdCBuZWVkCisgICAgICAgIHBvbHltb3JwaGlzbSBiZW5lZml0cworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGFyZyA9PSAwCisKK2NsYXNzIFN1cGVyKG9iamVjdCk6CisgICAgIiIic2FtZSBhcyBiZWZvcmUgd2l0aG91dCBhYnN0cmFjdCIiIgorICAgIGF0dHIgPSAxCisgICAgZGVmIG1ldGhvZChzZWxmKToKKyAgICAgICAgIiIicmVndWxhciIiIgorICAgICAgICBwcmludChzZWxmLmF0dHIpCisKK2NsYXNzIFN1YjEoU3VwZXIpOgorICAgICIiIm92ZXJyaWRlIG1ldGhvZCB3aXRoIG5lZWQgZm9yIHNlbGYiIiIKKyAgICBkZWYgbWV0aG9kKHNlbGYpOgorICAgICAgICAiIiJubyBpIGNhbiBub3QgYmUgYSBmdW5jdGlvbiIiIgorICAgICAgICBwcmludCg0MikKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJubyBpIGNhbiBub3QgYmUgYSBmdW5jdGlvbiIiIgorICAgICAgICByZXR1cm4gNDIKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIibm8gaSBjYW4gbm90IGJlIGEgZnVuY3Rpb24iIiIKKyAgICAgICAgcHJpbnQoNDIpCisKKyAgICBkZWYgX19jb3B5X18oc2VsZik6CisgICAgICAgIHJldHVybiAyNAorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDQyCisKKworY2xhc3MgUHJvcChvYmplY3QpOgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvdW50KHNlbGYpOgorICAgICAgICAiIiJEb24ndCBlbWl0IG5vLXNlbGYtdXNlIGZvciBwcm9wZXJ0aWVzLgorCisgICAgICAgIFRoZXkgY2FuJ3QgYmUgZnVuY3Rpb25zIGFuZCB0aGV5IGNhbiBiZSBwYXJ0IG9mIGFuCisgICAgICAgIEFQSSBzcGVjaWZpY2F0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIDQyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl91c2UudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfdXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRlZTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfdXNlLnR4dApAQCAtMCwwICsxIEBACituby1zZWxmLXVzZToxNjo0OlRvdG8uZnVuY3Rpb25fbWV0aG9kOk1ldGhvZCBjb3VsZCBiZSBhIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl91c2VfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfdXNlX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDAxNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3NlbGZfdXNlX3B5My5weQpAQCAtMCwwICsxLDEyIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxuby1pbml0LHVudXNlZC1hcmd1bWVudCxpbnZhbGlkLW5hbWUsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCitjbGFzcyBBOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdG9yZSA9IHt9CisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RvcmUuZ2V0KGtleSwgZGVmYXVsdCkKKworY2xhc3MgQihBKToKKyAgICBkZWYgZ2V0X21lbW8oc2VsZiwgb2JqKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuZ2V0KG9iaikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub19zZWxmX3VzZV9weTMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl91c2VfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc2VsZl91c2VfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3N0YXRpY21ldGhvZF9kZWNvcmF0b3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc3RhdGljbWV0aG9kX2RlY29yYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUwZWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3N0YXRpY21ldGhvZF9kZWNvcmF0b3IucHkKQEAgLTAsMCArMSwzNSBAQAorIiIiQ2hlY2tzIHN0YXRpYyBtZXRob2RzIGFyZSBkZWNsYXJlZCB3aXRoIGEgZGVjb3JhdG9yIGlmIHdpdGhpbiB0aGUgY2xhc3MKK3Njb3BlIGFuZCBpZiBzdGF0aWMgbWV0aG9kJ3MgYXJndW1lbnQgaXMgYSBtZW1iZXIgb2YgdGhlIGNsYXNzCisiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNpbmctY29uc3RhbnQtdGVzdCwgbm8tbWV0aG9kLWFyZ3VtZW50LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitjbGFzcyBNeUNsYXNzKG9iamVjdCk6CisgICAgIiIiU29tZSBjbGFzcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNtZXRob2QoKToKKyAgICAgICAgIiIic3RhdGljIG1ldGhvZC10by1iZSIiIgorICAgIHNtZXRob2QgPSBzdGF0aWNtZXRob2Qoc21ldGhvZCkgIyBbbm8tc3RhdGljbWV0aG9kLWRlY29yYXRvcl0KKworICAgIGlmIFRydWU6CisgICAgICAgIHNtZXRob2QgPSBzdGF0aWNtZXRob2Qoc21ldGhvZCkgICMgW25vLXN0YXRpY21ldGhvZC1kZWNvcmF0b3JdCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIG15X3NlY29uZF9tZXRob2QoKToKKyAgICAgICAgIiIiY29ycmVjdCBzdGF0aWMgbWV0aG9kIGRlZmluaXRpb24iIiIKKworICAgIGRlZiBvdGhlcl9tZXRob2QoKToKKyAgICAgICAgIiIic29tZSBtZXRob2QiIiIKKyAgICBzbWV0aG9kMiA9IHN0YXRpY21ldGhvZChvdGhlcl9tZXRob2QpICAjIFtuby1zdGF0aWNtZXRob2QtZGVjb3JhdG9yXQorCitkZWYgaGVsbG93b3JsZCgpOgorICAgICIiInNheXMgaGVsbG8iIiIKKworCitNeUNsYXNzLm5ld19zdGF0aWNfbWV0aG9kID0gc3RhdGljbWV0aG9kKGhlbGxvd29ybGQpCisKK2NsYXNzIE15T3RoZXJDbGFzcyhvYmplY3QpOgorICAgICIiIlNvbWUgb3RoZXIgY2xhc3MiIiIKKyAgICBfbWFrZSA9IHN0YXRpY21ldGhvZCh0dXBsZS5fX25ld19fKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3N0YXRpY21ldGhvZF9kZWNvcmF0b3IudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vL25vX3N0YXRpY21ldGhvZF9kZWNvcmF0b3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODk3NjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fc3RhdGljbWV0aG9kX2RlY29yYXRvci50eHQKQEAgLTAsMCArMSwzIEBACituby1zdGF0aWNtZXRob2QtZGVjb3JhdG9yOjE0OjQ6TXlDbGFzczpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgc3RhdGljbWV0aG9kCituby1zdGF0aWNtZXRob2QtZGVjb3JhdG9yOjE3Ojg6TXlDbGFzczpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgc3RhdGljbWV0aG9kCituby1zdGF0aWNtZXRob2QtZGVjb3JhdG9yOjI1OjQ6TXlDbGFzczpDb25zaWRlciB1c2luZyBhIGRlY29yYXRvciBpbnN0ZWFkIG9mIGNhbGxpbmcgc3RhdGljbWV0aG9kCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fd2FybmluZ19kb2NzdHJpbmcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm8vbm9fd2FybmluZ19kb2NzdHJpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1ZWVlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9uby9ub193YXJuaW5nX2RvY3N0cmluZy5weQpAQCAtMCwwICsxLDQyIEBACisnJycgVGVzdCBmb3IgaW5oZXJpdGFuY2UgJycnCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitfX3JldmlzaW9uX18gPSAxCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2luZy1jb25zdGFudC10ZXN0LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorY2xhc3MgQUFBQShvYmplY3QpOgorICAgICcnJyBjbGFzcyBBQUFBICcnJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbWV0aG9kMShzZWxmKToKKyAgICAgICAgJycnIG1ldGhvZCAxICcnJworICAgICAgICBwcmludChzZWxmKQorCisgICAgZGVmIG1ldGhvZDIoc2VsZik6CisgICAgICAgICcnJyBtZXRob2QgMiAnJycKKyAgICAgICAgcHJpbnQoc2VsZikKKworY2xhc3MgQkJCQihBQUFBKToKKyAgICAnJycgY2xhc3MgQkJCQiAnJycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQUFBQS5fX2luaXRfXyhzZWxmKQorCisgICAgIyBzaG91bGQgaWdub3JlIGRvY3N0cmluZyBjYWxsaW5nIGZyb20gY2xhc3MgQUFBQQorICAgIGRlZiBtZXRob2QxKHNlbGYpOgorICAgICAgICBBQUFBLm1ldGhvZDEoc2VsZikKKworY2xhc3MgQ0NDQyhCQkJCKToKKyAgICAnJycgY2xhc3MgQ0NDQyAnJycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQkJCQi5fX2luaXRfXyhzZWxmKQorCisgICAgIyBzaG91bGQgaWdub3JlIGRvY3N0cmluZyBzaW5jZSBDQ0NDIGlzIGluaGVyaXRlZCBmcm9tIEJCQkIgd2hpY2ggaXMKKyAgICAjIGluaGVyaXRlZCBmcm9tIEFBQUEgY29udGFpbmluZyBtZXRob2QyCisgICAgaWYgX19yZXZpc2lvbl9fOgorICAgICAgICBkZWYgbWV0aG9kMihzZWxmKToKKyAgICAgICAgICAgIEFBQUEubWV0aG9kMihzZWxmKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBtZXRob2QyKHNlbGYpOgorICAgICAgICAgICAgQUFBQS5tZXRob2QxKHNlbGYpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25fYXNjaWlfbmFtZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX2FzY2lpX25hbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2YTIzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX2FzY2lpX25hbWUucHkKQEAgLTAsMCArMSw2IEBACisiIiIgVGVzdHMgZm9yIG5vbi1hc2NpaS1uYW1lIGNoZWNrZXIuICIiIgorCivDocOpw63Ds8O6ID0gNDQ0NCAjIFtub24tYXNjaWktbmFtZV0KKworZGVmIMO6w7PDrcOpw6EoKTogIyBbbm9uLWFzY2lpLW5hbWVdCisgICAgIiIieW8iIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX2FzY2lpX25hbWUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9hc2NpaV9uYW1lLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDllYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9hc2NpaV9uYW1lLnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorIyBUaGlzIHRlc3QgY2Fubm90IHJ1biBvbiBXaW5kb3dzIGR1ZSB0byBVbmljb2RlIGVycm9yIGZvcm1hdHRpbmcuCitleGNsdWRlX3BsYXRmb3Jtcz13aW4zMgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25fYXNjaWlfbmFtZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9hc2NpaV9uYW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZkNzI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25fYXNjaWlfbmFtZS50eHQKQEAgLTAsMCArMSwyIEBACitub24tYXNjaWktbmFtZTozOjA6OiJDb25zdGFudCBuYW1lICIiw6HDqcOtw7PDuiIiIGNvbnRhaW5zIGEgbm9uLUFTQ0lJIHVuaWNvZGUgY2hhcmFjdGVyIgorbm9uLWFzY2lpLW5hbWU6NTowOsO6w7PDrcOpw6E6IkZ1bmN0aW9uIG5hbWUgIiLDusOzw63DqcOhIiIgY29udGFpbnMgYSBub24tQVNDSUkgdW5pY29kZSBjaGFyYWN0ZXIiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9pbml0X3BhcmVudF9jYWxsZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9pbml0X3BhcmVudF9jYWxsZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjYzhmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX2luaXRfcGFyZW50X2NhbGxlZC5weQpAQCAtMCwwICsxLDUxIEBACisjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzLGltcG9ydC1zZWxmLHRvby1mZXctcHVibGljLW1ldGhvZHMsbGluZS10b28tbG9uZworIyBweWxpbnQ6IGRpc2FibGU9bm8tYWJzb2x1dGUtaW1wb3J0LHdyb25nLWltcG9ydC1vcmRlciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UsCisiIiJ0ZXN0IGZvciBjYWxsIHRvIF9faW5pdF9fIGZyb20gYSBub24gYW5jZXN0b3IgY2xhc3MKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSAuIGltcG9ydCBub25faW5pdF9wYXJlbnRfY2FsbGVkCitpbXBvcnQgbm9uZXhpc3RhbnQgICMgW2ltcG9ydC1lcnJvcl0KK19fcmV2aXNpb25fXyA9ICckSWQ6IG5vbl9pbml0X3BhcmVudF9jYWxsZWQucHksdiAxLjIgMjAwNC0wOS0yOSAwODozNToxMyBzeXQgRXhwICQnCisKK2NsYXNzIEFBQUEob2JqZWN0KToKKyAgICAiIiJhbmNlc3RvciAxIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHByaW50KCdpbml0Jywgc2VsZikKKyAgICAgICAgQkJCQk1peGluLl9faW5pdF9fKHNlbGYpICAjIFtub24tcGFyZW50LWluaXQtY2FsbGVkXQorCitjbGFzcyBCQkJCTWl4aW4ob2JqZWN0KToKKyAgICAiIiJhbmNlc3RvciAyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHByaW50KCdpbml0Jywgc2VsZikKKworY2xhc3MgQ0NDKEJCQkJNaXhpbiwgbm9uX2luaXRfcGFyZW50X2NhbGxlZC5BQUFBLCBub25faW5pdF9wYXJlbnRfY2FsbGVkLkJCQkIsIG5vbmV4aXN0YW50LkFDbGFzcyk6ICAjIFtuby1tZW1iZXJdCisgICAgIiIibWl4IGRpZmZlcmVudCB0aGluZ3MsIHNvbWUgaW5mZXJhYmxlIHNvbWUgbm90IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBCQkJCTWl4aW4uX19pbml0X18oc2VsZikKKyAgICAgICAgbm9uX2luaXRfcGFyZW50X2NhbGxlZC5BQUFBLl9faW5pdF9fKHNlbGYpCisgICAgICAgIG5vbl9pbml0X3BhcmVudF9jYWxsZWQuQkJCQi5fX2luaXRfXyhzZWxmKSAgIyBbbm8tbWVtYmVyXQorICAgICAgICBub25leGlzdGFudC5BQ2xhc3MuX19pbml0X18oc2VsZikKKworY2xhc3MgRERERChBQUFBKToKKyAgICAiIiJjYWxsIHN1cGVyY2xhc3MgY29uc3RydWN0b3IgaW4gZGlzanVuY3QgYnJhbmNoZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIEFBQUEuX19pbml0X18oc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEFBQUEuX19pbml0X18oc2VsZikKKworY2xhc3MgU3VwZXIoZGljdCk6CisgICAgIiIiIHRlc3QgbGF0ZSBiaW5kaW5nIHN1cGVyKCkgY2FsbCAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGJhc2UgPSBzdXBlcigpCisgICAgICAgIGJhc2UuX19pbml0X18oKQorCitjbGFzcyBTdXBlcjIoZGljdCk6CisgICAgIiIiIFVzaW5nIHRoZSBzYW1lIGlkaW9tIGFzIFN1cGVyLCBidXQgd2l0aG91dCBjYWxsaW5nCisgICAgdGhlIF9faW5pdF9fIG1ldGhvZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6ICAjIFtzdXBlci1pbml0LW5vdC1jYWxsZWRdCisgICAgICAgIGJhc2UgPSBzdXBlcigpCisgICAgICAgIGJhc2UuX193b29ob29fXygpICAjIFtuby1tZW1iZXJdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9pbml0X3BhcmVudF9jYWxsZWQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25faW5pdF9wYXJlbnRfY2FsbGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjA3M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25faW5pdF9wYXJlbnRfY2FsbGVkLnR4dApAQCAtMCwwICsxLDYgQEAKK2ltcG9ydC1lcnJvcjo3OjA6OlVuYWJsZSB0byBpbXBvcnQgJ25vbmV4aXN0YW50Jworbm9uLXBhcmVudC1pbml0LWNhbGxlZDoxNTo4OkFBQUEuX19pbml0X186X19pbml0X18gbWV0aG9kIGZyb20gYSBub24gZGlyZWN0IGJhc2UgY2xhc3MgJ0JCQkJNaXhpbicgaXMgY2FsbGVkCituby1tZW1iZXI6MjM6NTA6Q0NDOk1vZHVsZSAnZnVuY3Rpb25hbC5uLm5vbi5ub25faW5pdF9wYXJlbnRfY2FsbGVkJyBoYXMgbm8gJ0JCQkInIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjoyODo4OkNDQy5fX2luaXRfXzpNb2R1bGUgJ2Z1bmN0aW9uYWwubi5ub24ubm9uX2luaXRfcGFyZW50X2NhbGxlZCcgaGFzIG5vICdCQkJCJyBtZW1iZXI6SU5GRVJFTkNFCitzdXBlci1pbml0LW5vdC1jYWxsZWQ6NDk6NDpTdXBlcjIuX19pbml0X186X19pbml0X18gbWV0aG9kIGZyb20gYmFzZSBjbGFzcyAnZGljdCcgaXMgbm90IGNhbGxlZAorbm8tbWVtYmVyOjUxOjg6U3VwZXIyLl9faW5pdF9fOlN1cGVyIG9mICdTdXBlcjInIGhhcyBubyAnX193b29ob29fXycgbWVtYmVyOklORkVSRU5DRQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25faXRlcmF0b3JfcmV0dXJuZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9pdGVyYXRvcl9yZXR1cm5lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGMzNjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25faXRlcmF0b3JfcmV0dXJuZWQucHkKQEAgLTAsMCArMSwxMDEgQEAKKyIiIkNoZWNrIG5vbi1pdGVyYXRvcnMgcmV0dXJuZWQgYnkgX19pdGVyX18gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nLCBuby1zZWxmLXVzZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UsIGNvbnNpZGVyLXVzaW5nLXdpdGgKKworCitjbGFzcyBGaXJzdEdvb2RJdGVyYXRvcihvYmplY3QpOgorICAgICIiIiB5aWVsZHMgaW4gaXRlcmF0b3IuICIiIgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgeWllbGQgaW5kZXgKKworCitjbGFzcyBTZWNvbmRHb29kSXRlcmF0b3Iob2JqZWN0KToKKyAgICAiIiIgX19pdGVyX18gYW5kIG5leHQgIiIiCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgICIiIiBJbmZpbml0ZSBpdGVyYXRvciwgYnV0IHN0aWxsIGFuIGl0ZXJhdG9yICIiIgorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIlNhbWUgYXMgX19uZXh0X18sIGJ1dCBmb3IgUHl0aG9uIDIuIiIiCisgICAgICAgIHJldHVybiAxCisKKworY2xhc3MgVGhpcmRHb29kSXRlcmF0b3Iob2JqZWN0KToKKyAgICAiIiIgUmV0dXJucyBvdGhlciBpdGVyYXRvciwgbm90IHRoZSBjdXJyZW50IGluc3RhbmNlICIiIgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gU2Vjb25kR29vZEl0ZXJhdG9yKCkKKworCitjbGFzcyBGb3VydGhHb29kSXRlcmF0b3Iob2JqZWN0KToKKyAgICAiIiIgX19pdGVyX18gcmV0dXJucyBpdGVyKC4uLikgIiIiCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHJhbmdlKDEwKSkKKworCitjbGFzcyBJdGVyYXRvck1ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19uZXh0X18oY2xzKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBuZXh0KGNscyk6CisgICAgICAgIHJldHVybiAyCisKKworY2xhc3MgSXRlcmF0b3JDbGFzcyhvYmplY3QsIG1ldGFjbGFzcz1JdGVyYXRvck1ldGFjbGFzcyk6CisgICAgIiIiSXRlcmFibGUgdGhyb3VnaCB0aGUgbWV0YWNsYXNzLiIiIgorCisKK2NsYXNzIEZpZnRoR29vZEl0ZXJhdG9yKG9iamVjdCk6CisgICAgIiIiX19pdGVyX18gcmV0dXJucyBhIGNsYXNzIHdoaWNoIHVzZXMgYW4gaXRlcmF0b3ItbWV0YWNsYXNzLiIiIgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gSXRlcmF0b3JDbGFzcworCisKK2NsYXNzIEZpbGVCYXNlZEl0ZXJhdG9yKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYuZmlsZSA9IE5vbmUKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5maWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5maWxlID0gb3BlbihzZWxmLnBhdGgpCisgICAgICAgICMgc2VsZiBmaWxlIGhhcyB0d28gaW5mZXJlZCB2YWx1ZXM6IE5vbmUgYW5kIDxpbnN0YW5jZSBvZiAnZmlsZSc+CisgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0byBlbWl0IGVycm9yIGluIHRoaXMgY2FzZQorICAgICAgICByZXR1cm4gc2VsZi5maWxlCisKKworY2xhc3MgRmlyc3RCYWRJdGVyYXRvcihvYmplY3QpOgorICAgICIiIiBfX2l0ZXJfXyByZXR1cm5zIGEgbGlzdCAiIiIKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTogICMgW25vbi1pdGVyYXRvci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIFtdCisKKworY2xhc3MgU2Vjb25kQmFkSXRlcmF0b3Iob2JqZWN0KToKKyAgICAiIiIgX19pdGVyX18gd2l0aG91dCBuZXh0ICIiIgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOiAgIyBbbm9uLWl0ZXJhdG9yLXJldHVybmVkXQorICAgICAgICByZXR1cm4gc2VsZgorCisKK2NsYXNzIFRoaXJkQmFkSXRlcmF0b3Iob2JqZWN0KToKKyAgICAiIiIgX19pdGVyX18gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhbm90aGVyIG5vbi1pdGVyYXRvciAiIiIKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTogICMgW25vbi1pdGVyYXRvci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIFNlY29uZEJhZEl0ZXJhdG9yKCkKKworCitjbGFzcyBGb3VydGhCYWRJdGVyYXRvcihvYmplY3QpOgorICAgICIiIl9faXRlcl9fIHJldHVybnMgYSBjbGFzcy4iIiIKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTogICMgW25vbi1pdGVyYXRvci1yZXR1cm5lZF0KKyAgICAgICAgcmV0dXJuIFRoaXJkQmFkSXRlcmF0b3IKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX2l0ZXJhdG9yX3JldHVybmVkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX2l0ZXJhdG9yX3JldHVybmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg5NDgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25faXRlcmF0b3JfcmV0dXJuZWQudHh0CkBAIC0wLDAgKzEsNCBAQAorbm9uLWl0ZXJhdG9yLXJldHVybmVkOjc5OjQ6Rmlyc3RCYWRJdGVyYXRvci5fX2l0ZXJfXzpfX2l0ZXJfXyByZXR1cm5zIG5vbi1pdGVyYXRvcgorbm9uLWl0ZXJhdG9yLXJldHVybmVkOjg2OjQ6U2Vjb25kQmFkSXRlcmF0b3IuX19pdGVyX186X19pdGVyX18gcmV0dXJucyBub24taXRlcmF0b3IKK25vbi1pdGVyYXRvci1yZXR1cm5lZDo5Mzo0OlRoaXJkQmFkSXRlcmF0b3IuX19pdGVyX186X19pdGVyX18gcmV0dXJucyBub24taXRlcmF0b3IKK25vbi1pdGVyYXRvci1yZXR1cm5lZDoxMDA6NDpGb3VydGhCYWRJdGVyYXRvci5fX2l0ZXJfXzpfX2l0ZXJfXyByZXR1cm5zIG5vbi1pdGVyYXRvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25fc3RyX2Fzc2lnbm1lbnRfdG9fZHVuZGVyX25hbWUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uL25vbl9zdHJfYXNzaWdubWVudF90b19kdW5kZXJfbmFtZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTEwY2JkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25fc3RyX2Fzc2lnbm1lbnRfdG9fZHVuZGVyX25hbWUucHkKQEAgLTAsMCArMSw1MyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nLCBtaXNzaW5nLWNsYXNzLWRvY3N0cmluZworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcKKyMgcHlsaW50OiBkaXNhYmxlPWltcG9ydC1lcnJvcgorCitpbXBvcnQgcmFuZG9tCisKK2Zyb20gdW5rbm93biBpbXBvcnQgVW5rbm93bgorCisKK2NsYXNzIEV4YW1wbGVDbGFzcygpOgorICAgIHBhc3MKKworCitkZWYgZXhhbXBsZV9mdW5jdGlvbigpOgorICAgIHBhc3MKKworCitkZWYgcmV0dXJuc19zdHIoKToKKyAgICByZXR1cm4gImFiY2QiCisKKworZGVmIHJldHVybnNfaW50KCk6CisgICAgcmV0dXJuIDAKKworCitkZWYgcmV0dXJuc190dXBsZSgpOgorICAgIHJldHVybiAwLCAiYWJjIgorCisKKyMgTWlnaHQgbm90IGJlIHRob3JvdWdoIGlmIHNhbWUgaGFzaCBzZWVkIGlzIHVzZWQgaW4gdGVzdGluZy4uLgorZGVmIHJldHVybnNfcmFuZG9tX3R5cGUoKToKKyAgICBpZiByYW5kb20ucmFuZGludCgwLCAxKSA+IDA6CisgICAgICAgIHJldHVybiAwCisKKyAgICByZXR1cm4gImFiYyIKKworRXhhbXBsZUNsYXNzLl9fbmFtZV9fID0gMSAgIyBbbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lXQorRXhhbXBsZUNsYXNzLl9fbmFtZV9fID0gVHJ1ZSAgIyBbbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lXQorRXhhbXBsZUNsYXNzLl9fbmFtZV9fID0gcmV0dXJuc190dXBsZSgpICMgW25vbi1zdHItYXNzaWdubWVudC10by1kdW5kZXItbmFtZV0KK0V4YW1wbGVDbGFzcy5fX25hbWVfXyA9IHJldHVybnNfaW50KCkgIyBbbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lXQorRXhhbXBsZUNsYXNzLl9fbmFtZV9fID0gImZvbyIKK0V4YW1wbGVDbGFzcy5fX25hbWVfXyA9IHJldHVybnNfc3RyKCkKK0V4YW1wbGVDbGFzcy5fX25hbWVfXyA9IHJldHVybnNfcmFuZG9tX3R5cGUoKQorRXhhbXBsZUNsYXNzLl9fbmFtZV9fID0gVW5rbm93bgorCitleGFtcGxlX2Z1bmN0aW9uLl9fbmFtZV9fID0gMSAgIyBbbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lXQorZXhhbXBsZV9mdW5jdGlvbi5fX25hbWVfXyA9IFRydWUgICMgW25vbi1zdHItYXNzaWdubWVudC10by1kdW5kZXItbmFtZV0KK2V4YW1wbGVfZnVuY3Rpb24uX19uYW1lX18gPSByZXR1cm5zX3R1cGxlKCkgIyBbbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lXQorZXhhbXBsZV9mdW5jdGlvbi5fX25hbWVfXyA9IHJldHVybnNfaW50KCkgIyBbbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lXQorZXhhbXBsZV9mdW5jdGlvbi5fX25hbWVfXyA9ICJmb28iCitleGFtcGxlX2Z1bmN0aW9uLl9fbmFtZV9fID0gcmV0dXJuc19zdHIoKQorZXhhbXBsZV9mdW5jdGlvbi5fX25hbWVfXyA9IHJldHVybnNfcmFuZG9tX3R5cGUoKQorZXhhbXBsZV9mdW5jdGlvbi5fX25hbWVfXyA9IFVua25vd24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX3N0cl9hc3NpZ25tZW50X3RvX2R1bmRlcl9uYW1lLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub24vbm9uX3N0cl9hc3NpZ25tZW50X3RvX2R1bmRlcl9uYW1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmNjMGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbi9ub25fc3RyX2Fzc2lnbm1lbnRfdG9fZHVuZGVyX25hbWUudHh0CkBAIC0wLDAgKzEsOCBAQAorbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lOjM3OjA6Ok5vbi1zdHJpbmcgdmFsdWUgYXNzaWduZWQgdG8gX19uYW1lX18KK25vbi1zdHItYXNzaWdubWVudC10by1kdW5kZXItbmFtZTozODowOjpOb24tc3RyaW5nIHZhbHVlIGFzc2lnbmVkIHRvIF9fbmFtZV9fCitub24tc3RyLWFzc2lnbm1lbnQtdG8tZHVuZGVyLW5hbWU6Mzk6MDo6Tm9uLXN0cmluZyB2YWx1ZSBhc3NpZ25lZCB0byBfX25hbWVfXworbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lOjQwOjA6Ok5vbi1zdHJpbmcgdmFsdWUgYXNzaWduZWQgdG8gX19uYW1lX18KK25vbi1zdHItYXNzaWdubWVudC10by1kdW5kZXItbmFtZTo0NjowOjpOb24tc3RyaW5nIHZhbHVlIGFzc2lnbmVkIHRvIF9fbmFtZV9fCitub24tc3RyLWFzc2lnbm1lbnQtdG8tZHVuZGVyLW5hbWU6NDc6MDo6Tm9uLXN0cmluZyB2YWx1ZSBhc3NpZ25lZCB0byBfX25hbWVfXworbm9uLXN0ci1hc3NpZ25tZW50LXRvLWR1bmRlci1uYW1lOjQ4OjA6Ok5vbi1zdHJpbmcgdmFsdWUgYXNzaWduZWQgdG8gX19uYW1lX18KK25vbi1zdHItYXNzaWdubWVudC10by1kdW5kZXItbmFtZTo0OTowOjpOb24tc3RyaW5nIHZhbHVlIGFzc2lnbmVkIHRvIF9fbmFtZV9fCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9uZV9kdW5kZXJfcHJvdG9jb2xzX3B5MzYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9uZV9kdW5kZXJfcHJvdG9jb2xzX3B5MzYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3M2NlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25lX2R1bmRlcl9wcm90b2NvbHNfcHkzNi5weQpAQCAtMCwwICsxLDM0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxwb2ludGxlc3Mtc3RhdGVtZW50CisjIHB5bGludDogZGlzYWJsZT1leHByZXNzaW9uLW5vdC1hc3NpZ25lZAorCitjbGFzcyBNZXRhSXRlcmFibGUodHlwZSk6CisgICAgX19pdGVyX18gPSBOb25lCisKKworY2xhc3MgTWV0YU9sZEl0ZXJhYmxlKHR5cGUpOgorICAgIF9fZ2V0aXRlbV9fID0gTm9uZQorCisKK2NsYXNzIE1ldGFDb250YWluZXIodHlwZSk6CisgICAgX19jb250YWluc19fID0gTm9uZQorCisKK2NsYXNzIE5vbkl0ZXJhYmxlQ2xhc3MobWV0YWNsYXNzPU1ldGFPbGRJdGVyYWJsZSk6CisgICAgX19jb250YWluc19fID0gTm9uZQorCisKK2NsYXNzIE9sZE5vbkl0ZXJhYmxlQ2xhc3MobWV0YWNsYXNzPU1ldGFPbGRJdGVyYWJsZSk6CisgICAgX19jb250YWluc19fID0gTm9uZQorCisKK2NsYXNzIE5vbkNvbnRhaW5lckNsYXNzKG1ldGFjbGFzcz1NZXRhQ29udGFpbmVyKToKKyAgICBfX2l0ZXJfXyA9IE5vbmUKKworCitkZWYgdGVzdCgpOgorICAgIDEgaW4gTm9uSXRlcmFibGVDbGFzcyAgIyBbdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0XQorICAgIDEgaW4gT2xkTm9uSXRlcmFibGVDbGFzcyAgIyBbdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0XQorICAgIDEgaW4gTm9uQ29udGFpbmVyQ2xhc3MgIyBbdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0XQorICAgIDEgaW4gTm9uSXRlcmFibGVDbGFzcygpICAjIFt1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3RdCisgICAgMSBpbiBPbGROb25JdGVyYWJsZUNsYXNzKCkgICMgW3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdF0KKyAgICAxIGluIE5vbkNvbnRhaW5lckNsYXNzKCkgICMgW3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25lX2R1bmRlcl9wcm90b2NvbHNfcHkzNi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25lX2R1bmRlcl9wcm90b2NvbHNfcHkzNi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmVfZHVuZGVyX3Byb3RvY29sc19weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmVfZHVuZGVyX3Byb3RvY29sc19weTM2LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25lX2R1bmRlcl9wcm90b2NvbHNfcHkzNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1MDAwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25lX2R1bmRlcl9wcm90b2NvbHNfcHkzNi50eHQKQEAgLTAsMCArMSw2IEBACit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6Mjk6OTp0ZXN0OlZhbHVlICdOb25JdGVyYWJsZUNsYXNzJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MzA6OTp0ZXN0OlZhbHVlICdPbGROb25JdGVyYWJsZUNsYXNzJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MzE6OTp0ZXN0OlZhbHVlICdOb25Db250YWluZXJDbGFzcycgZG9lc24ndCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdAordW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0OjMyOjk6dGVzdDpWYWx1ZSAnTm9uSXRlcmFibGVDbGFzcygpJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Cit1bnN1cHBvcnRlZC1tZW1iZXJzaGlwLXRlc3Q6MzM6OTp0ZXN0OlZhbHVlICdPbGROb25JdGVyYWJsZUNsYXNzKCknIGRvZXNuJ3Qgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3QKK3Vuc3VwcG9ydGVkLW1lbWJlcnNoaXAtdGVzdDozNDo5OnRlc3Q6VmFsdWUgJ05vbkNvbnRhaW5lckNsYXNzKCknIGRvZXNuJ3Qgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25leGlzdGVudF9vcGVyYXRvci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25leGlzdGVudF9vcGVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDVhNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmV4aXN0ZW50X29wZXJhdG9yLnB5CkBAIC0wLDAgKzEsMTUgQEAKKyIiImNoZWNrIG9wZXJhdG9yIHVzZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lLCBwb2ludGxlc3Mtc3RhdGVtZW50CithID0gMQorYSArPSA1CithID0gK2EKK2IgPSArK2EgIyBbbm9uZXhpc3RlbnQtb3BlcmF0b3JdCisrK2EgIyBbbm9uZXhpc3RlbnQtb3BlcmF0b3JdCitjID0gKCsrYSkgKiBiICMgW25vbmV4aXN0ZW50LW9wZXJhdG9yXQorCithID0gMQorYSAtPSA1CitiID0gLS1hICMgW25vbmV4aXN0ZW50LW9wZXJhdG9yXQorYiA9IGEKKy0tYSAjIFtub25leGlzdGVudC1vcGVyYXRvcl0KK2MgPSAoLS1hKSAqIGIgIyBbbm9uZXhpc3RlbnQtb3BlcmF0b3JdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9uZXhpc3RlbnRfb3BlcmF0b3IudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmV4aXN0ZW50X29wZXJhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QwNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmV4aXN0ZW50X29wZXJhdG9yLnR4dApAQCAtMCwwICsxLDYgQEAKK25vbmV4aXN0ZW50LW9wZXJhdG9yOjY6NDo6VXNlIG9mIHRoZSBub24tZXhpc3RlbnQgKysgb3BlcmF0b3IKK25vbmV4aXN0ZW50LW9wZXJhdG9yOjc6MDo6VXNlIG9mIHRoZSBub24tZXhpc3RlbnQgKysgb3BlcmF0b3IKK25vbmV4aXN0ZW50LW9wZXJhdG9yOjg6NTo6VXNlIG9mIHRoZSBub24tZXhpc3RlbnQgKysgb3BlcmF0b3IKK25vbmV4aXN0ZW50LW9wZXJhdG9yOjEyOjQ6OlVzZSBvZiB0aGUgbm9uLWV4aXN0ZW50IC0tIG9wZXJhdG9yCitub25leGlzdGVudC1vcGVyYXRvcjoxNDowOjpVc2Ugb2YgdGhlIG5vbi1leGlzdGVudCAtLSBvcGVyYXRvcgorbm9uZXhpc3RlbnQtb3BlcmF0b3I6MTU6NTo6VXNlIG9mIHRoZSBub24tZXhpc3RlbnQgLS0gb3BlcmF0b3IKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF9hbmRfZ2xvYmFsLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmxvY2FsX2FuZF9nbG9iYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMDUyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF9hbmRfZ2xvYmFsLnB5CkBAIC0wLDAgKzEsMTIgQEAKKyIiIlRlc3QgdGhhdCBhIG5hbWUgaXMgYm90aCBub25sb2NhbCBhbmQgZ2xvYmFsIGluIHRoZSBzYW1lIHNjb3BlLiIiIg0KKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLGdsb2JhbC12YXJpYWJsZS1ub3QtYXNzaWduZWQsaW52YWxpZC1uYW1lLG5vbmxvY2FsLXdpdGhvdXQtYmluZGluZw0KKw0KK2RlZiBiYWQoKTogIyBbbm9ubG9jYWwtYW5kLWdsb2JhbF0NCisgICAgbm9ubG9jYWwgbWlzc2luZw0KKyAgICBnbG9iYWwgbWlzc2luZw0KKw0KK2RlZiBnb29kKCk6DQorICAgIG5vbmxvY2FsIG1pc3NpbmcNCisgICAgZGVmIHRlc3QoKToNCisgICAgICAgIGdsb2JhbCBtaXNzaW5nDQorICAgIHJldHVybiB0ZXN0DQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmxvY2FsX2FuZF9nbG9iYWwucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9ubG9jYWxfYW5kX2dsb2JhbC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmxvY2FsX2FuZF9nbG9iYWwucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9ubG9jYWxfYW5kX2dsb2JhbC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9ubG9jYWxfYW5kX2dsb2JhbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NjY4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF9hbmRfZ2xvYmFsLnR4dApAQCAtMCwwICsxIEBACitub25sb2NhbC1hbmQtZ2xvYmFsOjQ6MDpiYWQ6TmFtZSAnbWlzc2luZycgaXMgbm9ubG9jYWwgYW5kIGdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmxvY2FsX3dpdGhvdXRfYmluZGluZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF93aXRob3V0X2JpbmRpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzYzAwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF93aXRob3V0X2JpbmRpbmcucHkKQEAgLTAsMCArMSw0MiBAQAorIiIiIENoZWNrcyB0aGF0IHJldmVyc2VkKCkgcmVjZWl2ZSBwcm9wZXIgYXJndW1lbnQgIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdW51c2VkLXZhcmlhYmxlLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxuby1zZWxmLXVzZSxuby1hYnNvbHV0ZS1pbXBvcnQKKworZGVmIHRlc3QoKToKKyAgICBkZWYgcGFyZW50KCk6CisgICAgICAgIGEgPSA0MgorICAgICAgICBkZWYgc3R1ZmYoKToKKyAgICAgICAgICAgIG5vbmxvY2FsIGEKKworICAgIGMgPSAyNAorICAgIGRlZiBwYXJlbnQyKCk6CisgICAgICAgIGEgPSA0MgorICAgICAgICBkZWYgc3R1ZmYoKToKKyAgICAgICAgICAgIGRlZiBvdGhlcl9zdHVmZigpOgorICAgICAgICAgICAgICAgIG5vbmxvY2FsIGEKKyAgICAgICAgICAgICAgICBub25sb2NhbCBjCisKK2IgPSA0MgorZGVmIGZ1bmMoKToKKyAgICBkZWYgb3RoZXJfZnVuYygpOgorICAgICAgICBub25sb2NhbCBiICAjIFtub25sb2NhbC13aXRob3V0LWJpbmRpbmddCisKK2NsYXNzIFNvbWVDbGFzcyhvYmplY3QpOgorICAgIG5vbmxvY2FsIHggIyBbbm9ubG9jYWwtd2l0aG91dC1iaW5kaW5nXQorCisgICAgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgIG5vbmxvY2FsIHNvbWVfYXR0ciAjIFtub25sb2NhbC13aXRob3V0LWJpbmRpbmddCisKKworZGVmIGZ1bmMyKCk6CisgICAgbm9ubG9jYWxfID0gTm9uZQorICAgIGxvY2FsID0gTm9uZQorCisgICAgY2xhc3MgQ2xhc3M6CisKKyAgICAgICAgbm9ubG9jYWwgbm9ubG9jYWxfCisKKyAgICAgICAgbm9ubG9jYWxfID0gMQorICAgICAgICBsb2NhbCA9IDEKKworICAgIHJldHVybiBsb2NhbCArIG5vbmxvY2FsXwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vbmxvY2FsX3dpdGhvdXRfYmluZGluZy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF93aXRob3V0X2JpbmRpbmcucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF93aXRob3V0X2JpbmRpbmcucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm9ubG9jYWxfd2l0aG91dF9iaW5kaW5nLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub25sb2NhbF93aXRob3V0X2JpbmRpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm9ubG9jYWxfd2l0aG91dF9iaW5kaW5nLnR4dApAQCAtMCwwICsxLDMgQEAKK25vbmxvY2FsLXdpdGhvdXQtYmluZGluZzoyMjo4OmZ1bmMub3RoZXJfZnVuYzpub25sb2NhbCBuYW1lIGIgZm91bmQgd2l0aG91dCBiaW5kaW5nCitub25sb2NhbC13aXRob3V0LWJpbmRpbmc6MjU6NDpTb21lQ2xhc3M6bm9ubG9jYWwgbmFtZSB4IGZvdW5kIHdpdGhvdXQgYmluZGluZworbm9ubG9jYWwtd2l0aG91dC1iaW5kaW5nOjI4Ojg6U29tZUNsYXNzLmZ1bmM6bm9ubG9jYWwgbmFtZSBzb21lX2F0dHIgZm91bmQgd2l0aG91dCBiaW5kaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfYXN5bmNfY29udGV4dF9tYW5hZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOGQ3NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlci5weQpAQCAtMCwwICsxLDcxIEBACisiIiJUZXN0IHRoYXQgYW4gYXN5bmMgY29udGV4dCBtYW5hZ2VyIHJlY2VpdmVzIGEgcHJvcGVyIG9iamVjdC4iIiINCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW1wb3J0LWVycm9yLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQ0KK2ltcG9ydCBjb250ZXh0bGliDQorDQorZnJvbSBhbGEgaW1wb3J0IFBvcnRvY2FsYQ0KKw0KKw0KK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyDQorZGVmIGN0eF9tYW5hZ2VyKCk6DQorICAgIHlpZWxkDQorDQorDQorY2xhc3MgQ29udGV4dE1hbmFnZXIob2JqZWN0KToNCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToNCisgICAgICAgIHBhc3MNCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBQYXJ0aWFsQXN5bmNDb250ZXh0TWFuYWdlcihvYmplY3QpOg0KKyAgICBkZWYgX19hZW50ZXJfXyhzZWxmKToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBTZWNvbmRQYXJ0aWFsQXN5bmNDb250ZXh0TWFuYWdlcihvYmplY3QpOg0KKyAgICBkZWYgX19hZXhpdF9fKHNlbGYsICphcmdzKToNCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBVbmtub3duQmFzZXMoUG9ydG9jYWxhKToNCisgICAgZGVmIF9fYWVudGVyX18oc2VsZik6DQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgQXN5bmNNYW5hZ2VyTWl4aW4ob2JqZWN0KToNCisgICAgcGFzcw0KKw0KK2NsYXNzIEdvb2RBc3luY01hbmFnZXIob2JqZWN0KToNCisgICAgZGVmIF9fYWVudGVyX18oc2VsZik6DQorICAgICAgICBwYXNzDQorICAgIGRlZiBfX2FleGl0X18oc2VsZiwgKmFyZ3MpOg0KKyAgICAgICAgcGFzcw0KKw0KK2NsYXNzIEluaGVyaXRFeGl0KG9iamVjdCk6DQorICAgIGRlZiBfX2FleGl0X18oc2VsZiwgKmFyZ3MpOg0KKyAgICAgICAgcGFzcw0KKw0KK2NsYXNzIFNlY29uZEdvb2RBc3luY01hbmFnZXIoSW5oZXJpdEV4aXQpOg0KKyAgICBkZWYgX19hZW50ZXJfXyhzZWxmKToNCisgICAgICAgIHBhc3MNCisNCisNCithc3luYyBkZWYgYmFkX2Nvcm8oKToNCisgICAgYXN5bmMgd2l0aCA0MjogIyBbbm90LWFzeW5jLWNvbnRleHQtbWFuYWdlcl0NCisgICAgICAgIHBhc3MNCisgICAgYXN5bmMgd2l0aCBjdHhfbWFuYWdlcigpOiAjIFtub3QtYXN5bmMtY29udGV4dC1tYW5hZ2VyXQ0KKyAgICAgICAgcGFzcw0KKyAgICBhc3luYyB3aXRoIENvbnRleHRNYW5hZ2VyKCk6ICMgW25vdC1hc3luYy1jb250ZXh0LW1hbmFnZXJdDQorICAgICAgICBwYXNzDQorICAgIGFzeW5jIHdpdGggUGFydGlhbEFzeW5jQ29udGV4dE1hbmFnZXIoKTogIyBbbm90LWFzeW5jLWNvbnRleHQtbWFuYWdlcl0NCisgICAgICAgIHBhc3MNCisgICAgYXN5bmMgd2l0aCBTZWNvbmRQYXJ0aWFsQXN5bmNDb250ZXh0TWFuYWdlcigpOiAjIFtub3QtYXN5bmMtY29udGV4dC1tYW5hZ2VyXQ0KKyAgICAgICAgcGFzcw0KKw0KKw0KK2FzeW5jIGRlZiBnb29kX2Nvcm8oKToNCisgICAgYXN5bmMgd2l0aCBVbmtub3duQmFzZXMoKToNCisgICAgICAgIHBhc3MNCisgICAgYXN5bmMgd2l0aCBBc3luY01hbmFnZXJNaXhpbigpOg0KKyAgICAgICAgcGFzcw0KKyAgICBhc3luYyB3aXRoIEdvb2RBc3luY01hbmFnZXIoKToNCisgICAgICAgIHBhc3MNCisgICAgYXN5bmMgd2l0aCBTZWNvbmRHb29kQXN5bmNNYW5hZ2VyKCk6DQorICAgICAgICBwYXNzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9hc3luY19jb250ZXh0X21hbmFnZXIucmMgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlci5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRlOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9hc3luY19jb250ZXh0X21hbmFnZXIucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My41CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiNDExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfYXN5bmNfY29udGV4dF9tYW5hZ2VyLnR4dApAQCAtMCwwICsxLDUgQEAKK25vdC1hc3luYy1jb250ZXh0LW1hbmFnZXI6NTE6NDpiYWRfY29ybzpBc3luYyBjb250ZXh0IG1hbmFnZXIgJ2ludCcgZG9lc24ndCBpbXBsZW1lbnQgX19hZW50ZXJfXyBhbmQgX19hZXhpdF9fLgorbm90LWFzeW5jLWNvbnRleHQtbWFuYWdlcjo1Mzo0OmJhZF9jb3JvOkFzeW5jIGNvbnRleHQgbWFuYWdlciAnZ2VuZXJhdG9yJyBkb2Vzbid0IGltcGxlbWVudCBfX2FlbnRlcl9fIGFuZCBfX2FleGl0X18uCitub3QtYXN5bmMtY29udGV4dC1tYW5hZ2VyOjU1OjQ6YmFkX2Nvcm86QXN5bmMgY29udGV4dCBtYW5hZ2VyICdDb250ZXh0TWFuYWdlcicgZG9lc24ndCBpbXBsZW1lbnQgX19hZW50ZXJfXyBhbmQgX19hZXhpdF9fLgorbm90LWFzeW5jLWNvbnRleHQtbWFuYWdlcjo1Nzo0OmJhZF9jb3JvOkFzeW5jIGNvbnRleHQgbWFuYWdlciAnUGFydGlhbEFzeW5jQ29udGV4dE1hbmFnZXInIGRvZXNuJ3QgaW1wbGVtZW50IF9fYWVudGVyX18gYW5kIF9fYWV4aXRfXy4KK25vdC1hc3luYy1jb250ZXh0LW1hbmFnZXI6NTk6NDpiYWRfY29ybzpBc3luYyBjb250ZXh0IG1hbmFnZXIgJ1NlY29uZFBhcnRpYWxBc3luY0NvbnRleHRNYW5hZ2VyJyBkb2Vzbid0IGltcGxlbWVudCBfX2FlbnRlcl9fIGFuZCBfX2FleGl0X18uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlcl9weTM3LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9hc3luY19jb250ZXh0X21hbmFnZXJfcHkzNy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWNhMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9hc3luY19jb250ZXh0X21hbmFnZXJfcHkzNy5weQpAQCAtMCwwICsxLDIzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGFzeW5jY29udGV4dG1hbmFnZXIKKworCitAYXN5bmNjb250ZXh0bWFuYWdlcgorYXN5bmMgZGVmIGNvbnRleHRfbWFuYWdlcih2YWx1ZSk6CisgICAgeWllbGQgdmFsdWUKKworCithc3luYyB3aXRoIGNvbnRleHRfbWFuYWdlcig0MikgYXMgYW5zOgorICAgIGFzc2VydCBhbnMgPT0gNDIKKworCitkZWYgYXN5bmNfY29udGV4dF9tYW5hZ2VyKCk6CisgICAgQGFzeW5jY29udGV4dG1hbmFnZXIKKyAgICBhc3luYyBkZWYgd3JhcHBlcigpOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHdyYXBwZXIKKworYXN5bmMgZGVmIGZ1bmMoKToKKyAgICBhc3luYyB3aXRoIGFzeW5jX2NvbnRleHRfbWFuYWdlcigpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2FzeW5jX2NvbnRleHRfbWFuYWdlcl9weTM3LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9hc3luY19jb250ZXh0X21hbmFnZXJfcHkzNy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9hc3luY19jb250ZXh0X21hbmFnZXJfcHkzNy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfY2FsbGFibGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NhbGxhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNWIwMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NhbGxhYmxlLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSx0b28tZmV3LXB1YmxpYy1tZXRob2RzLHdyb25nLWltcG9ydC1wb3NpdGlvbiwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworUkVWSVNJT04gPSBOb25lCisKK1JFVklTSU9OKCkgIyBbbm90LWNhbGxhYmxlXQorCitkZWYgY29ycmVjdCgpOgorICAgIHJldHVybiAxCisKK1JFVklTSU9OID0gY29ycmVjdCgpCisKK2NsYXNzIENvcnJlY3Qob2JqZWN0KToKKyAgICAiIiJjYWxsYWJsZSBvYmplY3QiIiIKKworY2xhc3MgTWV0YUNvcnJlY3Qob2JqZWN0KToKKyAgICAiIiJjYWxsYWJsZSBvYmplY3QiIiIKKyAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK0lOU1RBTkNFID0gQ29ycmVjdCgpCitDQUxMQUJMRV9JTlNUQU5DRSA9IE1ldGFDb3JyZWN0KCkKK0NPUlJFQ1QgPSBDQUxMQUJMRV9JTlNUQU5DRSgpCitJTkNPUlJFQ1QgPSBJTlNUQU5DRSgpICMgW25vdC1jYWxsYWJsZV0KK0xJU1QgPSBbXQorSU5DT1JSRUNUID0gTElTVCgpICMgW25vdC1jYWxsYWJsZV0KK0RJQ1QgPSB7fQorSU5DT1JSRUNUID0gRElDVCgpICMgW25vdC1jYWxsYWJsZV0KK1RVUExFID0gKCkKK0lOQ09SUkVDVCA9IFRVUExFKCkgIyBbbm90LWNhbGxhYmxlXQorSU5UID0gMQorSU5DT1JSRUNUID0gSU5UKCkgIyBbbm90LWNhbGxhYmxlXQorCisjIFRlc3QgY2FsbGluZyBwcm9wZXJ0aWVzLiBQeWxpbnQgY2FuIGRldGVjdCB3aGVuIHVzaW5nIG9ubHkgdGhlCisjIGdldHRlciwgYnV0IGl0IGRvZXNuJ3QgaW5mZXIgcHJvcGVybHkgd2hlbiBoYXZpbmcgYSBnZXR0ZXIKKyMgYW5kIGEgc2V0dGVyLgorY2xhc3MgTXlQcm9wZXJ0eShwcm9wZXJ0eSk6CisgICAgIiIiIHRlc3Qgc3ViY2xhc3NlcyAiIiIKKworY2xhc3MgUHJvcGVydHlUZXN0KG9iamVjdCk6CisgICAgIiIiIGNsYXNzICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmF0dHIgPSA0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiIEdldCB0aGUgYXR0cmlidXRlICIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyCisKKyAgICBAdGVzdC5zZXR0ZXIKKyAgICBkZWYgdGVzdChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIiBTZXQgdGhlIGF0dHJpYnV0ZSAiIiIKKyAgICAgICAgc2VsZi5hdHRyID0gdmFsdWUKKworICAgIEBNeVByb3BlcnR5CisgICAgZGVmIGN1c3RvbShzZWxmKToKKyAgICAgICAgIiIiIEdldCB0aGUgYXR0cmlidXRlICIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyCisKKyAgICBAY3VzdG9tLnNldHRlcgorICAgIGRlZiBjdXN0b20oc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiIgU2V0IHRoZSBhdHRyaWJ1dGUgIiIiCisgICAgICAgIHNlbGYuYXR0ciA9IHZhbHVlCisKK1BST1AgPSBQcm9wZXJ0eVRlc3QoKQorUFJPUC50ZXN0KDQwKSAjIFtub3QtY2FsbGFibGVdCitQUk9QLmN1c3RvbSgpICMgW25vdC1jYWxsYWJsZV0KKworIyBTYWZlIGZyb20gbm90LWNhbGxhYmxlIHdoZW4gdXNpbmcgcHJvcGVydGllcy4KKworY2xhc3MgU2FmZVByb3BlcnR5KG9iamVjdCk6CisgICAgQHByb3BlcnR5CisgICAgZGVmIHN0YXRpYyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0YXRpY21ldGhvZAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGtsYXNzKHNlbGYpOgorICAgICAgICByZXR1cm4gY2xhc3NtZXRob2QKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBnZXRfbGFtYmRhKHNlbGYpOgorICAgICAgICByZXR1cm4gbGFtYmRhOiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgb3RoZXJfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIGRlZiBmdW5jdGlvbihhcmcpOgorICAgICAgICAgICAgcmV0dXJuIGFyZworICAgICAgICByZXR1cm4gZnVuY3Rpb24KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkaWN0X2J1aWx0aW4oc2VsZik6CisgICAgICAgIHJldHVybiBkaWN0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcmFuZ2VfYnVpbHRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHJhbmdlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEVtcHR5KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIHJldHVybiBFbXB0eSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZG9lc19ub3RfbWFrZV9zZW5zZShzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCitQUk9QMSA9IFNhZmVQcm9wZXJ0eSgpCitQUk9QMS5zdGF0aWMoMikKK1BST1AxLmtsYXNzKDIpCitQUk9QMS5nZXRfbGFtYmRhKCkKK1BST1AxLm90aGVyX2Z1bmN0aW9uKDQpCitQUk9QMS5kaWN0X2J1aWx0aW4oKQorUFJPUDEucmFuZ2VfYnVpbHRpbig0KQorUFJPUDEuaW5zdGFuY2UoKQorUFJPUDEuZG9lc19ub3RfbWFrZV9zZW5zZSgpCisKKworaW1wb3J0IG1pc3NpbmcgIyBweWxpbnQ6IGRpc2FibGU9aW1wb3J0LWVycm9yCisKK2NsYXNzIFVua25vd25CYXNlQ2FsbGFibGUobWlzc2luZy5CbGFoKToKKyAgICBwYXNzCisKK1Vua25vd25CYXNlQ2FsbGFibGUoKSgpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NhbGxhYmxlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfY2FsbGFibGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2U2MTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NhbGxhYmxlLnR4dApAQCAtMCwwICsxLDggQEAKK25vdC1jYWxsYWJsZTo1OjA6OlJFVklTSU9OIGlzIG5vdCBjYWxsYWJsZQorbm90LWNhbGxhYmxlOjIzOjEyOjpJTlNUQU5DRSBpcyBub3QgY2FsbGFibGUKK25vdC1jYWxsYWJsZToyNToxMjo6TElTVCBpcyBub3QgY2FsbGFibGUKK25vdC1jYWxsYWJsZToyNzoxMjo6RElDVCBpcyBub3QgY2FsbGFibGUKK25vdC1jYWxsYWJsZToyOToxMjo6VFVQTEUgaXMgbm90IGNhbGxhYmxlCitub3QtY2FsbGFibGU6MzE6MTI6OklOVCBpcyBub3QgY2FsbGFibGUKK25vdC1jYWxsYWJsZTo2NjowOjpQUk9QLnRlc3QgaXMgbm90IGNhbGxhYmxlCitub3QtY2FsbGFibGU6Njc6MDo6UFJPUC5jdXN0b20gaXMgbm90IGNhbGxhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NvbnRleHRfbWFuYWdlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfY29udGV4dF9tYW5hZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWY1YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NvbnRleHRfbWFuYWdlci5weQpAQCAtMCwwICsxLDEzNSBAQAorIiIiVGVzdHMgdGhhdCBvbmplY3RzIHVzZWQgaW4gYSB3aXRoIHN0YXRlbWVudCBpbXBsZW1lbnQgY29udGV4dCBtYW5hZ2VyIHByb3RvY29sIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIGludmFsaWQtbmFtZSwgaW1wb3J0LWVycm9yLCBtaXNzaW5nLWRvY3N0cmluZworIyBweWxpbnQ6IGRpc2FibGU9bm8taW5pdCx3cm9uZy1pbXBvcnQtcG9zaXRpb24sIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisjIFRlc3RzIG5vIG1lc3NhZ2VzIGZvciBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBwcm90b2NvbAorY2xhc3MgTWFuYWdlcihvYmplY3QpOgorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHBhc3MKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZV8sIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICBwYXNzCit3aXRoIE1hbmFnZXIoKToKKyAgICBwYXNzCisKK2NsYXNzIEFub3RoZXJNYW5hZ2VyKE1hbmFnZXIpOgorICAgIHBhc3MKK3dpdGggQW5vdGhlck1hbmFnZXIoKToKKyAgICBwYXNzCisKKworIyBUZXN0cyBtZXNzYWdlIGZvciBjbGFzcyB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZSBwcm90b2NvbAorY2xhc3MgTm90QU1hbmFnZXIob2JqZWN0KToKKyAgICBwYXNzCit3aXRoIE5vdEFNYW5hZ2VyKCk6ICAjW25vdC1jb250ZXh0LW1hbmFnZXJdCisgICAgcGFzcworCisjIFRlc3RzIGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIgdXNhZ2UgaXMgcmVjb2duaXplZCBhcyBjb3JyZWN0LgorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorQGNvbnRleHRtYW5hZ2VyCitkZWYgZGVjKCk6CisgICAgeWllbGQKK3dpdGggZGVjKCk6ICAjIHZhbGlkIHVzZQorICAgIHBhc3MKKworCisjIFRlc3RzIGEgbWVzc2FnZSBpcyBwcm9kdWNlZCB3aGVuIGEgY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorIyBkZWNvcmF0ZWQgZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIGNhbGxlZC4KK3dpdGggZGVjOiAgIyBbbm90LWNvbnRleHQtbWFuYWdlcl0KKyAgICBwYXNzCisKKworIyBUZXN0cyBubyBtZXNzYWdlcyBhYm91dCBjb250ZXh0IG1hbmFnZXIgcHJvdG9jb2wKKyMgaWYgdGhlIHR5cGUgY2FuJ3QgYmUgaW5mZXJyZWQuCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcKK3dpdGggTWlzc2luZygpOgorICAgIHBhc3MKKworIyBUZXN0cyBjb250ZXh0IG1hbmFnZXJzIGFzIG5hbWVzLgorCitkZWYgcGVuZWxvcGEoKToKKyAgICByZXR1cm4gNDIKKworaG9wYSA9IGRlYygpCit0cm9wYSA9IHBlbmVsb3BhKCkKKword2l0aCB0cm9wYTogIyBbbm90LWNvbnRleHQtbWFuYWdlcl0KKyAgICBwYXNzCisKK3dpdGggaG9wYToKKyAgICBwYXNzCisKKworIyBUZXN0cyB0aGF0IG5vIG1lc3NhZ2VzIGFyZSBlbWl0dGVkIGZvciBmdW5jdGlvbiBjYWxscworIyB3aGljaCByZXR1cm4gbWFuYWdlcnMKKworZGVmIHdyYXBwZXIoKToKKyAgICByZXR1cm4gZGVjKCkKKword2l0aCB3cmFwcGVyKCk6CisgICAgcGFzcworCisjIFRlc3RzIGZvciBwcm9wZXJ0aWVzIHJldHVybmluZyBtYW5hZ2Vycy4KKworY2xhc3MgUHJvcGVydHkob2JqZWN0KToKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjdHgoc2VsZik6CisgICAgICAgIHJldHVybiBkZWMoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5vdF9jdHgoc2VsZik6CisgICAgICAgIHJldHVybiA0MgorCisKK2xhbGEgPSBQcm9wZXJ0eSgpCit3aXRoIGxhbGEuY3R4OgorICAgICMgRG9uJ3QgZW1pdCB3aGVuIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgdGhlCisgICAgIyByZXN1bHQgb2YgYWNjZXNzaW5nIGEgcHJvcGVydHkuCisgICAgcGFzcworCit3aXRoIGxhbGEubm90X2N0eDogIyBbbm90LWNvbnRleHQtbWFuYWdlcl0KKyAgICBwYXNzCisKKworY2xhc3MgVGVzdEtub3duQmFzZXMoTWlzc2luZyk6CisgICAgcGFzcworCit3aXRoIFRlc3RLbm93bkJhc2VzKCk6CisgICAgcGFzcworCisjIElnbm9yZSBtaXhpbnMuCitjbGFzcyBNYW5hZ2VyTWl4aW4ob2JqZWN0KToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBGdWxsQ29udGV4dE1hbmFnZXIoTWFuYWdlck1peGluKToKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHBhc3MKKworIyBUZXN0IGEgZmFsc2UgcG9zaXRpdmUgd2l0aCByZXR1cm5pbmcgYSBnZW5lcmF0b3IKKyMgZnJvbSBhIGNvbnRleHQgbWFuYWdlci4KK2RlZiBnZW5lcmF0b3IoKToKKyAgICB5aWVsZCA0MgorCitAY29udGV4dG1hbmFnZXIKK2RlZiBjb250ZXh0X21hbmFnZXJfcmV0dXJuaW5nX2dlbmVyYXRvcigpOgorICAgIHJldHVybiBnZW5lcmF0b3IoKQorCit3aXRoIGNvbnRleHRfbWFuYWdlcl9yZXR1cm5pbmdfZ2VuZXJhdG9yKCk6CisgICAgcGFzcworCitGSVJTVCA9IFtjb250ZXh0X21hbmFnZXJfcmV0dXJuaW5nX2dlbmVyYXRvcigpXQord2l0aCBGSVJTVFswXToKKyAgICBwYXNzCisKK2RlZiBvdGhlcl9pbmRpcmVjdF9mdW5jKCk6CisgICAgcmV0dXJuIGdlbmVyYXRvcigpCisKK2RlZiBub3RfY29udGV4dF9tYW5hZ2VyKCk6CisgICAgcmV0dXJuIG90aGVyX2luZGlyZWN0X2Z1bmMoKQorCit3aXRoIG5vdF9jb250ZXh0X21hbmFnZXIoKTogIyBbbm90LWNvbnRleHQtbWFuYWdlcl0KKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NvbnRleHRfbWFuYWdlci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2NvbnRleHRfbWFuYWdlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiM2FmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfY29udGV4dF9tYW5hZ2VyLnR4dApAQCAtMCwwICsxLDUgQEAKK25vdC1jb250ZXh0LW1hbmFnZXI6MjM6MDo6Q29udGV4dCBtYW5hZ2VyICdOb3RBTWFuYWdlcicgZG9lc24ndCBpbXBsZW1lbnQgX19lbnRlcl9fIGFuZCBfX2V4aXRfXy4KK25vdC1jb250ZXh0LW1hbmFnZXI6Mzc6MDo6Q29udGV4dCBtYW5hZ2VyICdkZWMnIGRvZXNuJ3QgaW1wbGVtZW50IF9fZW50ZXJfXyBhbmQgX19leGl0X18uCitub3QtY29udGV4dC1tYW5hZ2VyOjU1OjA6OkNvbnRleHQgbWFuYWdlciAnaW50JyBkb2Vzbid0IGltcGxlbWVudCBfX2VudGVyX18gYW5kIF9fZXhpdF9fLgorbm90LWNvbnRleHQtbWFuYWdlcjo5MDowOjpDb250ZXh0IG1hbmFnZXIgJ2ludCcgZG9lc24ndCBpbXBsZW1lbnQgX19lbnRlcl9fIGFuZCBfX2V4aXRfXy4KK25vdC1jb250ZXh0LW1hbmFnZXI6MTM0OjA6OkNvbnRleHQgbWFuYWdlciAnZ2VuZXJhdG9yJyBkb2Vzbid0IGltcGxlbWVudCBfX2VudGVyX18gYW5kIF9fZXhpdF9fLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9pbl9sb29wLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9uL25vdF9pbl9sb29wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzE5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2luX2xvb3AucHkKQEAgLTAsMCArMSw1NSBAQAorIiIiVGVzdCB0aGF0IG5vdC1pbi1sb29wIGlzIGRldGVjdGVkIHByb3Blcmx5LiIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZSwgdG9vLWZldy1wdWJsaWMtbWV0aG9kcworIyBweWxpbnQ6IGRpc2FibGU9dXNlbGVzcy1lbHNlLW9uLWxvb3AsIHVzaW5nLWNvbnN0YW50LXRlc3QsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisjIHB5bGludDogZGlzYWJsZT1uby1lbHNlLWNvbnRpbnVlCisKK3doaWxlIFRydWU6CisgICAgZGVmIGFsYSgpOgorICAgICAgICBjb250aW51ZSAjIFtub3QtaW4tbG9vcF0KKword2hpbGUgVHJ1ZToKKyAgICBwYXNzCitlbHNlOgorICAgIGNvbnRpbnVlICMgW25vdC1pbi1sb29wXQorCitkZWYgbGFsYSgpOgorICAgIGNvbnRpbnVlICMgW25vdC1pbi1sb29wXQorCit3aGlsZSBUcnVlOgorICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgY29udGludWUgIyBbbm90LWluLWxvb3BdCisKK2ZvciBfIGluIHJhbmdlKDEwKToKKyAgICBwYXNzCitlbHNlOgorICAgIGNvbnRpbnVlICMgW25vdC1pbi1sb29wXQorCitmb3IgXyBpbiByYW5nZSg0Mik6CisgICAgcGFzcworZWxzZToKKyAgICBicmVhayAjIFtub3QtaW4tbG9vcF0KKworaWYgVHJ1ZToKKyAgICBjb250aW51ZSAjIFtub3QtaW4tbG9vcF0KK2Vsc2U6CisgICAgYnJlYWsgIyBbbm90LWluLWxvb3BdCisKK2ZvciBfIGluIHJhbmdlKDEwKToKKyAgICBmb3IgXyBpbiByYW5nZSgyMCk6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjb250aW51ZQorCit3aGlsZSBUcnVlOgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgYnJlYWsKKyAgICBicmVhaworZWxzZToKKyAgICBwYXNzCisKK2ZvciBfIGluIHJhbmdlKDEpOgorICAgIGNvbnRpbnVlCitmb3IgXyBpbiByYW5nZSg0Mik6CisgICAgYnJlYWsKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvbi9ub3RfaW5fbG9vcC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2luX2xvb3AudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjgyZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL24vbm90X2luX2xvb3AudHh0CkBAIC0wLDAgKzEsOCBAQAorbm90LWluLWxvb3A6ODo4OmFsYTonY29udGludWUnIG5vdCBwcm9wZXJseSBpbiBsb29wCitub3QtaW4tbG9vcDoxMzo0OjonY29udGludWUnIG5vdCBwcm9wZXJseSBpbiBsb29wCitub3QtaW4tbG9vcDoxNjo0OmxhbGE6J2NvbnRpbnVlJyBub3QgcHJvcGVybHkgaW4gbG9vcAorbm90LWluLWxvb3A6MjA6ODpBOidjb250aW51ZScgbm90IHByb3Blcmx5IGluIGxvb3AKK25vdC1pbi1sb29wOjI1OjQ6Oidjb250aW51ZScgbm90IHByb3Blcmx5IGluIGxvb3AKK25vdC1pbi1sb29wOjMwOjQ6OidicmVhaycgbm90IHByb3Blcmx5IGluIGxvb3AKK25vdC1pbi1sb29wOjMzOjQ6Oidjb250aW51ZScgbm90IHByb3Blcmx5IGluIGxvb3AKK25vdC1pbi1sb29wOjM1OjQ6OidicmVhaycgbm90IHByb3Blcmx5IGluIGxvb3AKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvby9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvby9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9vL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL28vb2JqZWN0X2FzX2NsYXNzX2F0dHJpYnV0ZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvby9vYmplY3RfYXNfY2xhc3NfYXR0cmlidXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzcyOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL28vb2JqZWN0X2FzX2NsYXNzX2F0dHJpYnV0ZS5weQpAQCAtMCwwICsxLDE4IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisiIiJUZXN0IGNhc2UgZm9yIHRoZSBwcm9ibGVtIGRlc2NyaWJlZCBiZWxvdyA6CisgLSBBIGNsYXNzIGV4dGVuZHMgJ29iamVjdCcKKyAtIFRoaXMgY2xhc3MgZGVmaW5lcyBpdHMgb3duIF9faW5pdF9fKCkKKyAgICogcHlsaW50IHdpbGwgdGhlcmVmb3JlIGNoZWNrIHRoYXQgYmFzZWNsYXNzZXMnIGluaXQoKQorICAgICBhcmUgY2FsbGVkCisgLSBJZiB0aGlzIGNsYXNzIGRlZmluZXMgYW4gJ29iamVjdCcgYXR0cmlidXRlLCB0aGVuIHB5bGludAorICAgd2lsbCB1c2UgdGhpcyBuZXcgZGVmaW5pdGlvbiB3aGVuIHRyeWluZyB0byByZXRyaWV2ZQorICAgb2JqZWN0Ll9faW5pdF9fKCkKKyIiIgorCitfX3JldmlzaW9uX18gPSBOb25lCisKK2NsYXNzIFN0YXRlbWVudChvYmplY3QpOgorICAgICIiIiAuLi4gIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgb2JqZWN0ID0gTm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9vL29sZF9kaXZpc2lvbl9mbG9hdHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL28vb2xkX2RpdmlzaW9uX2Zsb2F0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM5Y2RlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9vL29sZF9kaXZpc2lvbl9mbG9hdHMucHkKQEAgLTAsMCArMSwzIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK3ByaW50KGZsb2F0KDEpIC8gMikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvby9vbGRfZGl2aXNpb25fZmxvYXRzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9vL29sZF9kaXZpc2lvbl9mbG9hdHMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU0MTNmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvby9vbGRfZGl2aXNpb25fZmxvYXRzLnJjCkBAIC0wLDAgKzEsMyBAQAorW01lc3NhZ2VzIENvbnRyb2xdCitkaXNhYmxlPWFsbAorZW5hYmxlPW9sZC1kaXZpc2lvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9vL29sZF9kaXZpc2lvbl9tYW51YWxseS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvby9vbGRfZGl2aXNpb25fbWFudWFsbHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViNDhlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvby9vbGRfZGl2aXNpb25fbWFudWFsbHkucHkKQEAgLTAsMCArMSwzIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgorCitwcmludCgxIC8gMykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvby9vbGRfZGl2aXNpb25fbWFudWFsbHkucmMgYi90ZXN0cy9mdW5jdGlvbmFsL28vb2xkX2RpdmlzaW9uX21hbnVhbGx5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDEzZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL28vb2xkX2RpdmlzaW9uX21hbnVhbGx5LnJjCkBAIC0wLDAgKzEsMyBAQAorW01lc3NhZ2VzIENvbnRyb2xdCitkaXNhYmxlPWFsbAorZW5hYmxlPW9sZC1kaXZpc2lvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9vL292ZXJsb2FkZWRfb3BlcmF0b3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL28vb3ZlcmxvYWRlZF9vcGVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzA1YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9vL292ZXJsb2FkZWRfb3BlcmF0b3IucHkKQEAgLTAsMCArMSwyMSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyx1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIiIiIzMyOTEiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworY2xhc3MgTXlhcnJheShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcnJheSk6CisgICAgICAgIHNlbGYuYXJyYXkgPSBhcnJheQorCisgICAgZGVmIF9fbXVsX18oc2VsZiwgdmFsKToKKyAgICAgICAgcmV0dXJuIE15YXJyYXkodmFsKQorCisgICAgZGVmIGFzdHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuICJBU1RZUEUiLCBzZWxmCisKK2RlZiByYW5kaW50KG1heGltdW0pOgorICAgIGlmIG1heGltdW0gaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBNeWFycmF5KFsxLCAyLCAzXSkgKiAyCisKKyAgICByZXR1cm4gaW50KDUpCisKK3ByaW50KHJhbmRpbnQoMSkuYXN0eXBlKCkpICMgd2UgZG9uJ3Qgd2FuJ3QgYW4gZXJyb3IgZm9yIGFzdHlwZSBhY2Nlc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcGF0dGVybl9tYXRjaGluZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wYXR0ZXJuX21hdGNoaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjE5MGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcGF0dGVybl9tYXRjaGluZy5weQpAQCAtMCwwICsxLDI0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCitjbGFzcyBQb2ludDJEOgorICAgIF9fbWF0Y2hfYXJnc19fID0gKCJ4IiwgInkiKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgorICAgICAgICBzZWxmLnggPSB4CisgICAgICAgIHNlbGYueSA9IHkKKworCisjIERvbid0IGVtaXQgZmFsc2UtcG9zaXRpdmUgJ3VudXNlZC12YXJpYWJsZScgYW5kICd1bmRlZmluZWQtdmFyaWJhYmxlJwordmFyID0gNDIKK21hdGNoIHZhcjoKKyAgICBjYXNlIFsqcmVzdDFdOgorICAgICAgICBwcmludChyZXN0MSkKKyAgICBjYXNlIHsqKnJlc3QyfToKKyAgICAgICAgcHJpbnQocmVzdDIpCisgICAgY2FzZSBQb2ludDJEKDAsIGEpOgorICAgICAgICBwcmludChhKQorICAgIGNhc2UgUG9pbnQyRCh4PTAsIHk9YikgYXMgbmV3X3BvaW50OgorICAgICAgICBwcmludChiKQorICAgICAgICBwcmludChuZXdfcG9pbnQpCisgICAgY2FzZSBuZXdfdmFyOgorICAgICAgICBwcmludChuZXdfdmFyKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3BhdHRlcm5fbWF0Y2hpbmcucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcGF0dGVybl9tYXRjaGluZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE4YzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3BhdHRlcm5fbWF0Y2hpbmcucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4xMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3BsdWdpbl9kb2VzX25vdF9leGlzdHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcGx1Z2luX2RvZXNfbm90X2V4aXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjMxZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3BsdWdpbl9kb2VzX25vdF9leGlzdHMucHkKQEAgLTAsMCArMSw1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitmcm9tIHNoYWRvayBpbXBvcnQgU2hhZG9rSW50ZWdlciAgIyBbaW1wb3J0LWVycm9yXQorCitTaGFkb2tJbnRlZ2VyKCJCdWdhIFpvTWV1IikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wbHVnaW5fZG9lc19ub3RfZXhpc3RzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3BsdWdpbl9kb2VzX25vdF9leGlzdHMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlN2MxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wbHVnaW5fZG9lc19ub3RfZXhpc3RzLnJjCkBAIC0wLDAgKzEsMyBAQAorW21hc3Rlcl0KK2xvYWQtcGx1Z2lucz0KKyAgICBweWxpbnQuZXh0ZW5zaW9ucy5jaGVja19kb2VzX25vdF9leGlzdHNfaW5fdmVudiwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wbHVnaW5fZG9lc19ub3RfZXhpc3RzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wbHVnaW5fZG9lc19ub3RfZXhpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDVhNzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3BsdWdpbl9kb2VzX25vdF9leGlzdHMudHh0CkBAIC0wLDAgKzEgQEAKK2ltcG9ydC1lcnJvcjozOjA6OlVuYWJsZSB0byBpbXBvcnQgJ3NoYWRvayc6SElHSApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2FjdGl2YXRlZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWQucHkKQEAgLTAsMCArMSwyOCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsbm8tc2VsZi11c2UsdW51c2VkLWFyZ3VtZW50LHBvaW50bGVzcy1zdGF0ZW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbm8tbmFtZS1pbi1tb2R1bGUKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKKworCitjbGFzcyBDbGFzczoKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9zdHJpbmcoY2xzLCBzb3VyY2UpIC0+IENsYXNzOgorICAgICAgICAuLi4KKworICAgIGRlZiB2YWxpZGF0ZV9iKHNlbGYsIG9iajogT3RoZXJDbGFzcykgLT4gYm9vbDoKKyAgICAgICAgLi4uCisKKworY2xhc3MgT3RoZXJDbGFzczoKKyAgICAuLi4KKworCitjbGFzcyBFeGFtcGxlOgorICAgIG9iajogT3RoZXIKKworCitjbGFzcyBPdGhlcjoKKyAgICAuLi4KKworCitjbGFzcyBFeGFtcGxlU2VsZjoKKyAgICBuZXh0OiBFeGFtcGxlU2VsZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2FjdGl2YXRlZC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWQucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fYWN0aXZhdGVkX3dpdGhfYWxpYXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fYWN0aXZhdGVkX3dpdGhfYWxpYXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NzI0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWRfd2l0aF9hbGlhcy5weQpAQCAtMCwwICsxLDI4IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxuby1zZWxmLXVzZSx1bnVzZWQtYXJndW1lbnQscG9pbnRsZXNzLXN0YXRlbWVudAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxuby1uYW1lLWluLW1vZHVsZQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucyBhcyBfX2Fubm90YXRpb25zX18KKworCitjbGFzcyBNeUNsYXNzOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX3N0cmluZyhjbHMsIHNvdXJjZSkgLT4gTXlDbGFzczoKKyAgICAgICAgLi4uCisKKyAgICBkZWYgdmFsaWRhdGVfYihzZWxmLCBvYmo6IE90aGVyQ2xhc3MpIC0+IGJvb2w6CisgICAgICAgIC4uLgorCisKK2NsYXNzIE90aGVyQ2xhc3M6CisgICAgLi4uCisKKworY2xhc3MgRXhhbXBsZToKKyAgICBvYmo6IE90aGVyCisKKworY2xhc3MgT3RoZXI6CisgICAgLi4uCisKKworY2xhc3MgRXhhbXBsZVNlbGY6CisgICAgbmV4dDogRXhhbXBsZVNlbGYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWRfd2l0aF9hbGlhcy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9hY3RpdmF0ZWRfd2l0aF9hbGlhcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX2FjdGl2YXRlZF93aXRoX2FsaWFzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX25vdF9hY3RpdmF0ZWQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fbm90X2FjdGl2YXRlZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODkyNDE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX25vdF9hY3RpdmF0ZWQucHkKQEAgLTAsMCArMSwxNCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsbm8tc2VsZi11c2UsdW51c2VkLWFyZ3VtZW50LHBvaW50bGVzcy1zdGF0ZW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMKKworY2xhc3MgQ2xhc3M6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fc3RyaW5nKGNscywgc291cmNlKSAtPiBDbGFzczogICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAgICAgLi4uCisKKyAgICBkZWYgdmFsaWRhdGVfYihzZWxmLCBvYmo6IE90aGVyQ2xhc3MpIC0+IGJvb2w6ICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorICAgICAgICAuLi4KKworCitjbGFzcyBPdGhlckNsYXNzOgorICAgIC4uLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX25vdF9hY3RpdmF0ZWQucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fbm90X2FjdGl2YXRlZC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX25vdF9hY3RpdmF0ZWQucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fbm90X2FjdGl2YXRlZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fbm90X2FjdGl2YXRlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlOGExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9ub3RfYWN0aXZhdGVkLnR4dApAQCAtMCwwICsxLDIgQEAKK3VuZGVmaW5lZC12YXJpYWJsZTo2OjM2OkNsYXNzLmZyb21fc3RyaW5nOlVuZGVmaW5lZCB2YXJpYWJsZSAnQ2xhc3MnCit1c2VkLWJlZm9yZS1hc3NpZ25tZW50Ojk6MzA6Q2xhc3MudmFsaWRhdGVfYjpVc2luZyB2YXJpYWJsZSAnT3RoZXJDbGFzcycgYmVmb3JlIGFzc2lnbm1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTE1NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1LnB5CkBAIC0wLDAgKzEsMTMzIEBACisiIiJUZXN0IFBFUCA1ODUgaW4gY29tYmluYXRpb24gd2l0aCBwb3N0cG9uZWQgZXZhbHVhdGlvbiBQRVAgNTYzLgorCitUaGlzIGNoZWNrIHJlcXVpcmVzIFB5dGhvbiAzLjcgb3IgMy44IQorVGVzdGluZyB3aXRoIDMuOCBvbmx5LCB0byBzdXBwb3J0IFR5cGVkRGljdC4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLWFyZ3VtZW50LHVudXNlZC1pbXBvcnQsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbnZhbGlkLW5hbWUsaW5oZXJpdC1ub24tY2xhc3MsdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbix3cm9uZy1pbXBvcnQtcG9zaXRpb24sdW5ncm91cGVkLWltcG9ydHMsdW51c2VkLXZhcmlhYmxlCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCBkYXRhY2xhc3NlcworaW1wb3J0IHR5cGluZworZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBOYW1lZFR1cGxlLCBUeXBlZERpY3QsIFVuaW9uLCBUdXBsZQorCisKK0FsaWFzSW52YWxpZCA9IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworY2xhc3MgQ3VzdG9tSW50TGlzdCh0eXBpbmcuTGlzdFtpbnRdKToKKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbUludExpc3RFcnJvcihsaXN0W2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKK2Nhc3RfdmFyaWFibGUgPSBbMSwgMiwgM10KK2Nhc3RfdmFyaWFibGUgPSB0eXBpbmcuY2FzdChsaXN0W2ludF0sIGNhc3RfdmFyaWFibGUpICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitUID0gdHlwaW5nLlR5cGVWYXIoIlQiLCBsaXN0W2ludF0sIHN0cikgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyhsYW1iZGEgeDogMikobGlzdFtpbnRdKSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCisjIENoZWNrIHR5cGluZy5OYW1lZFR1cGxlCitDdXN0b21OYW1lZFR1cGxlID0gdHlwaW5nLk5hbWVkVHVwbGUoCisgICAgIkN1c3RvbU5hbWVkVHVwbGUiLCBbKCJteV92YXIiLCBsaXN0W2ludF0pXSkgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUyKE5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogbGlzdFtpbnRdCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUzKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IGxpc3RbaW50XQorCisKKyMgQ2hlY2sgdHlwaW5nLlR5cGVkRGljdAorQ3VzdG9tVHlwZWREaWN0ID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QiLCBteV92YXI9bGlzdFtpbnRdKSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworQ3VzdG9tVHlwZWREaWN0MiA9IFR5cGVkRGljdCgiQ3VzdG9tVHlwZWREaWN0MiIsIHsibXlfdmFyIjogbGlzdFtpbnRdfSkgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK2NsYXNzIEN1c3RvbVR5cGVkRGljdDMoVHlwZWREaWN0KToKKyAgICBteV92YXI6IGxpc3RbaW50XQorCitjbGFzcyBDdXN0b21UeXBlZERpY3Q0KHR5cGluZy5UeXBlZERpY3QpOgorICAgIG15X3ZhcjogbGlzdFtpbnRdCisKKworIyBDaGVjayBkYXRhY2xhc3NlcworZGVmIG15X2RlY29yYXRvcigqYXJncywgKiprd2FyZ3MpOgorICAgIGRlZiB3cmFwcygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHdyYXBzCisKK0BkYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczoKKyAgICBteV92YXI6IGxpc3RbaW50XQorCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3MyOgorICAgIG15X3ZhcjogbGlzdFtpbnRdCisKK0BkYXRhY2xhc3MoKQorY2xhc3MgQ3VzdG9tRGF0YUNsYXNzMzoKKyAgICBteV92YXI6IGxpc3RbaW50XQorCitAbXlfZGVjb3JhdG9yCitAZGF0YWNsYXNzZXMuZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3M0OgorICAgIG15X3ZhcjogbGlzdFtpbnRdCisKKwordmFyMTogc2V0W2ludF0KK3ZhcjI6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W3N0ciwgaW50XQordmFyMzogZGljdFtzdHIsIGxpc3RbaW50XV0KK3ZhcjQ6IERpY3Rbc3RyLCBsaXN0W2ludF1dCit2YXI1OiBkaWN0W3R1cGxlW2ludCwgaW50XSwgc3RyXQordmFyNjogRGljdFt0dXBsZVtpbnQsIGludF0sIHN0cl0KK3Zhcjc6IGxpc3RbbGlzdFtpbnRdXQordmFyODogdHVwbGVbbGlzdFtpbnRdXQordmFyOTogaW50IHwgbGlzdFtzdHIgfCBpbnRdCit2YXIxMDogVW5pb25bbGlzdFtzdHJdLCBOb25lXQordmFyMTE6IFVuaW9uW1VuaW9uW2xpc3RbaW50XSwgaW50XV0KKworZGVmIGZ1bmMoYXJnOiBsaXN0W2ludF0pOgorICAgIHBhc3MKKworZGVmIGZ1bmMyKCkgLT4gbGlzdFtpbnRdOgorICAgIHBhc3MKKworQWxpYXMyID0gVW5pb25bbGlzdFtzdHJdLCBOb25lXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK0FsaWFzMyA9IFVuaW9uW1VuaW9uW2xpc3RbaW50XSwgaW50XV0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitBbGlhczQgPSBUdXBsZVtsaXN0W2ludF1dICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorQWxpYXM1ID0gRGljdFtzdHIsIGxpc3RbaW50XV0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitBbGlhczYgPSBpbnQgfCBsaXN0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitBbGlhczcgPSBsaXN0W2xpc3RbaW50XV0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QsdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCitpbXBvcnQgY29sbGVjdGlvbnMuYWJjCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IHJlCisKK2NsYXNzIE9yZGVyZWREaWN0OgorICAgIHBhc3MKKwordmFyMTI6IE9yZGVyZWREaWN0W3N0ciwgaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3ZhcjEzOiBsaXN0W2ludF0KK3ZhcjE0OiBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdFtzdHIsIGludF0KK3ZhcjE1OiBjb2xsZWN0aW9ucy5Db3VudGVyW2ludF0KK3ZhcjE2OiBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVbaW50XQordmFyMTc6IGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcltpbnRdCit2YXIxODogcmUuUGF0dGVybltzdHJdCisKKworZGVmIGZ1bmMzKCk6CisgICAgQWxpYXNJbnZhbGlkMiA9IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBjYXN0X3ZhcmlhYmxlMiA9IFsxLCAyLCAzXQorICAgIGNhc3RfdmFyaWFibGUyID0gdHlwaW5nLmNhc3QobGlzdFtpbnRdLCBjYXN0X3ZhcmlhYmxlMikgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgdmFyMTk6IGxpc3RbaW50XQorCitkZWYgZnVuYzQoYXJnPWxpc3RbaW50XSk6ICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorICAgIHBhc3MKKworZGVmIGZ1bmM1KGFyZzE6IGxpc3RbaW50XSwgYXJnMj1zZXRbaW50XSk6ICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorICAgIHBhc3MKKworZGVmIGZ1bmM2KGFyZzE6IGxpc3RbaW50XSwgLywgKmFyZ3M6IHR1cGxlW3N0cl0sIGFyZzI6IHNldFtpbnRdLCAqKmt3YXJnczogZGljdFtzdHIsIEFueV0pOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjE4NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1LnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOAorbWF4X3B5dmVyPTMuOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDU5NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NS50eHQKQEAgLTAsMCArMSwyMCBAQAordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxNToxNTo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyMDoyNTpDdXN0b21JbnRMaXN0RXJyb3I6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyNDoyODo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyNjoyNDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoyODoxNDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDozMzozNjo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0Mzo1NDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NTo2MDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5NjoxNTo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5NzoyMTo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5ODoxNTo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5OToxOTo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMDA6MTU6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTAxOjk6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTAxOjE0OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExMTo3OjpWYWx1ZSAnT3JkZXJlZERpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjE6MjA6ZnVuYzM6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjM6MzM6ZnVuYzM6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjY6MTQ6ZnVuYzQ6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMjk6MzI6ZnVuYzU6VmFsdWUgJ3NldCcgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X2Vycm9yLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NV9lcnJvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWYwOWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NV9lcnJvci5weQpAQCAtMCwwICsxLDExNiBAQAorIiIiVGVzdCBQRVAgNTg1IHdpdGhvdXQgcG9zdHBvbmVkIGV2YWx1YXRpb24uIEV2ZXJ5dGhpbmcgc2hvdWxkIGZhaWwuCisKK1RoaXMgY2hlY2sgcmVxdWlyZXMgUHl0aG9uIDMuNyBvciBQeXRob24gMy44IQorVGVzdGluZyB3aXRoIDMuOCBvbmx5LCB0byBzdXBwb3J0IFR5cGVkRGljdC4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLWFyZ3VtZW50LHVudXNlZC1pbXBvcnQsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbnZhbGlkLW5hbWUsaW5oZXJpdC1ub24tY2xhc3MsdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbix1bnVzZWQtdmFyaWFibGUsbGluZS10b28tbG9uZworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgZGF0YWNsYXNzZXMKK2ltcG9ydCB0eXBpbmcKK2Zyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcworZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgRGljdCwgTmFtZWRUdXBsZSwgVHlwZWREaWN0LCBVbmlvbgorCisKK0FsaWFzSW52YWxpZCA9IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworY2xhc3MgQ3VzdG9tSW50TGlzdCh0eXBpbmcuTGlzdFtpbnRdKToKKyAgICBwYXNzCisKK2NsYXNzIEN1c3RvbUludExpc3RFcnJvcihsaXN0W2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKK2Nhc3RfdmFyaWFibGUgPSBbMSwgMiwgM10KK2Nhc3RfdmFyaWFibGUgPSB0eXBpbmcuY2FzdChsaXN0W2ludF0sIGNhc3RfdmFyaWFibGUpICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitUID0gdHlwaW5nLlR5cGVWYXIoIlQiLCBsaXN0W2ludF0sIHN0cikgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyhsYW1iZGEgeDogMikobGlzdFtpbnRdKSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCisjIENoZWNrIHR5cGluZy5OYW1lZFR1cGxlCitDdXN0b21OYW1lZFR1cGxlID0gdHlwaW5nLk5hbWVkVHVwbGUoCisgICAgIkN1c3RvbU5hbWVkVHVwbGUiLCBbKCJteV92YXIiLCBsaXN0W2ludF0pXSkgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUyKE5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogbGlzdFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitjbGFzcyBDdXN0b21OYW1lZFR1cGxlMyh0eXBpbmcuTmFtZWRUdXBsZSk6CisgICAgbXlfdmFyOiBsaXN0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKworIyBDaGVjayB0eXBpbmcuVHlwZWREaWN0CitDdXN0b21UeXBlZERpY3QgPSBUeXBlZERpY3QoIkN1c3RvbVR5cGVkRGljdCIsIG15X3Zhcj1saXN0W2ludF0pICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitDdXN0b21UeXBlZERpY3QyID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QyIiwgeyJteV92YXIiOiBsaXN0W2ludF19KSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworY2xhc3MgQ3VzdG9tVHlwZWREaWN0MyhUeXBlZERpY3QpOgorICAgIG15X3ZhcjogbGlzdFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCitjbGFzcyBDdXN0b21UeXBlZERpY3Q0KHR5cGluZy5UeXBlZERpY3QpOgorICAgIG15X3ZhcjogbGlzdFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisKKyMgQ2hlY2sgZGF0YWNsYXNzZXMKK2RlZiBteV9kZWNvcmF0b3IoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBkZWYgd3JhcHMoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcGFzcworICAgIHJldHVybiB3cmFwcworCitAZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3M6CisgICAgbXlfdmFyOiBsaXN0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKK2NsYXNzIEN1c3RvbURhdGFDbGFzczI6CisgICAgbXlfdmFyOiBsaXN0W2ludF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKK0BkYXRhY2xhc3MoKQorY2xhc3MgQ3VzdG9tRGF0YUNsYXNzMzoKKyAgICBteV92YXI6IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworQG15X2RlY29yYXRvcgorQGRhdGFjbGFzc2VzLmRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzNDoKKyAgICBteV92YXI6IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworCit2YXIxOiBzZXRbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3ZhcjI6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W3N0ciwgaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3ZhcjM6IGRpY3Rbc3RyLCBsaXN0W2ludF1dICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0LHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXI0OiBEaWN0W3N0ciwgbGlzdFtpbnRdXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3ZhcjU6IGRpY3RbdHVwbGVbaW50LCBpbnRdLCBzdHJdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0LHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdCit2YXI2OiBEaWN0W3R1cGxlW2ludCwgaW50XSwgc3RyXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3Zhcjc6IGxpc3RbbGlzdFtpbnRdXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdCx1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyODogdHVwbGVbbGlzdFtpbnRdXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdCx1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyOTogaW50IHwgbGlzdFtzdHIgfCBpbnRdICAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3ZhcjEwOiBVbmlvbltsaXN0W3N0cl0sIE5vbmVdICAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK3ZhcjExOiBVbmlvbltVbmlvbltsaXN0W2ludF0sIGludF1dICAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworZGVmIGZ1bmMoYXJnOiBsaXN0W2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKK2RlZiBmdW5jMigpIC0+IGxpc3RbaW50XTogICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcworCitBbGlhczIgPSBVbmlvbltsaXN0W3N0cl0sIE5vbmVdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorQWxpYXMzID0gVW5pb25bVW5pb25bbGlzdFtpbnRdLCBpbnRdXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK0FsaWFzNSA9IERpY3Rbc3RyLCBsaXN0W2ludF1dICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorQWxpYXM2ID0gaW50IHwgbGlzdFtpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorQWxpYXM3ID0gbGlzdFtsaXN0W2ludF1dICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0LHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKworZGVmIGZ1bmMzKCk6CisgICAgQWxpYXNJbnZhbGlkMiA9IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBjYXN0X3ZhcmlhYmxlMiA9IFsxLCAyLCAzXQorICAgIGNhc3RfdmFyaWFibGUyID0gdHlwaW5nLmNhc3QobGlzdFtpbnRdLCBjYXN0X3ZhcmlhYmxlMikgICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgdmFyMTI6IGxpc3RbaW50XSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworZGVmIGZ1bmM0KHZhcj1saXN0W2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKyAgICBwYXNzCisKK2RlZiBmdW5jNShhcmcxOiBsaXN0W2ludF0sIGFyZzI9c2V0W2ludF0pOiAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdCx1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorICAgIHBhc3MKKworZGVmIGZ1bmM2KGFyZzE6IGxpc3RbaW50XSwgLywgKmFyZ3M6IHR1cGxlW3N0cl0sIGFyZzI6IHNldFtpbnRdLCAqKmt3YXJnczogZGljdFtzdHIsIEFueV0pOgorICAgICMgLTE6W3Vuc3Vic2NyaXB0YWJsZS1vYmplY3QsdW5zdWJzY3JpcHRhYmxlLW9iamVjdCx1bnN1YnNjcmlwdGFibGUtb2JqZWN0LHVuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NV9lcnJvci5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODVfZXJyb3IucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViMTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODVfZXJyb3IucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CittYXhfcHl2ZXI9My45CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X2Vycm9yLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODVfZXJyb3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDlhNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X2Vycm9yLnR4dApAQCAtMCwwICsxLDQ5IEBACit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjE0OjE1OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjE5OjI1OkN1c3RvbUludExpc3RFcnJvcjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjIzOjI4OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjI1OjI0OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjI3OjE0OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMyOjM2OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjM1OjEyOkN1c3RvbU5hbWVkVHVwbGUyOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6Mzg6MTI6Q3VzdG9tTmFtZWRUdXBsZTM6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0Mjo1NDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NDo2MDo6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NzoxMjpDdXN0b21UeXBlZERpY3QzOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTA6MTI6Q3VzdG9tVHlwZWREaWN0NDpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjYxOjEyOkN1c3RvbURhdGFDbGFzczpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjY1OjEyOkN1c3RvbURhdGFDbGFzczI6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo2OToxMjpDdXN0b21EYXRhQ2xhc3MzOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NzQ6MTI6Q3VzdG9tRGF0YUNsYXNzNDpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojc3OjY6OlZhbHVlICdzZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo3ODo2OjpWYWx1ZSAnY29sbGVjdGlvbnMuT3JkZXJlZERpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo3OTo2OjpWYWx1ZSAnZGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojc5OjE2OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjgwOjE2OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjgxOjY6OlZhbHVlICdkaWN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6ODE6MTE6OlZhbHVlICd0dXBsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjgyOjExOjpWYWx1ZSAndHVwbGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo4Mzo2OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjgzOjExOjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg0OjEyOjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg0OjY6OlZhbHVlICd0dXBsZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg1OjEyOjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg2OjEzOjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg3OjE5OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojg5OjE0OmZ1bmM6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo5MjoxNTpmdW5jMjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk1OjE1OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk2OjIxOjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk3OjE5OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk4OjE1OjpWYWx1ZSAnbGlzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0Ojk5Ojk6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6OTk6MTQ6OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTAzOjIwOmZ1bmMzOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTA1OjMzOmZ1bmMzOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTA2OjExOmZ1bmMzOlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTA4OjE0OmZ1bmM0OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTExOjE2OmZ1bmM1OlZhbHVlICdsaXN0JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTExOjMyOmZ1bmM1OlZhbHVlICdzZXQnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMTQ6NzU6ZnVuYzY6VmFsdWUgJ2RpY3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMTQ6MTY6ZnVuYzY6VmFsdWUgJ2xpc3QnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDoxMTQ6NTU6ZnVuYzY6VmFsdWUgJ3NldCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjExNDozNzpmdW5jNjpWYWx1ZSAndHVwbGUnIGlzIHVuc3Vic2NyaXB0YWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NV9weTM5LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Bvc3Rwb25lZF9ldmFsdWF0aW9uX3BlcDU4NV9weTM5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjAxYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X3B5MzkucHkKQEAgLTAsMCArMSwxMjggQEAKKyIiIlRlc3QgUEVQIDU4NSB3b3JrcyBhcyBleHBlY3RlZCwgc3RhcnRpbmcgd2l0aCBQeXRob24gMy45IiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtYXJndW1lbnQsdW51c2VkLWltcG9ydCx0b28tZmV3LXB1YmxpYy1tZXRob2RzLGludmFsaWQtbmFtZSxpbmhlcml0LW5vbi1jbGFzcyx1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uLHdyb25nLWltcG9ydC1wb3NpdGlvbix1bmdyb3VwZWQtaW1wb3J0cyx1bnVzZWQtdmFyaWFibGUKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGRhdGFjbGFzc2VzCitpbXBvcnQgdHlwaW5nCitmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKK2Zyb20gdHlwaW5nIGltcG9ydCBBbnksIERpY3QsIE5hbWVkVHVwbGUsIFR5cGVkRGljdCwgVW5pb24sIFR1cGxlCisKKworQWxpYXNWYWxpZCA9IGxpc3RbaW50XQorCitjbGFzcyBDdXN0b21JbnRMaXN0KHR5cGluZy5MaXN0W2ludF0pOgorICAgIHBhc3MKKworY2xhc3MgQ3VzdG9tSW50TGlzdEVycm9yKGxpc3RbaW50XSk6CisgICAgcGFzcworCitjYXN0X3ZhcmlhYmxlID0gWzEsIDIsIDNdCitjYXN0X3ZhcmlhYmxlID0gdHlwaW5nLmNhc3QobGlzdFtpbnRdLCBjYXN0X3ZhcmlhYmxlKQorCitUID0gdHlwaW5nLlR5cGVWYXIoIlQiLCBsaXN0W2ludF0sIHN0cikKKworKGxhbWJkYSB4OiAyKShsaXN0W2ludF0pCisKKworIyBDaGVjayB0eXBpbmcuTmFtZWRUdXBsZQorQ3VzdG9tTmFtZWRUdXBsZSA9IHR5cGluZy5OYW1lZFR1cGxlKAorICAgICJDdXN0b21OYW1lZFR1cGxlIiwgWygibXlfdmFyIiwgbGlzdFtpbnRdKV0pCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUyKE5hbWVkVHVwbGUpOgorICAgIG15X3ZhcjogbGlzdFtpbnRdCisKK2NsYXNzIEN1c3RvbU5hbWVkVHVwbGUzKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBteV92YXI6IGxpc3RbaW50XQorCisKKyMgQ2hlY2sgdHlwaW5nLlR5cGVkRGljdAorQ3VzdG9tVHlwZWREaWN0ID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QiLCBteV92YXI9bGlzdFtpbnRdKQorCitDdXN0b21UeXBlZERpY3QyID0gVHlwZWREaWN0KCJDdXN0b21UeXBlZERpY3QyIiwgeyJteV92YXIiOiBsaXN0W2ludF19KQorCitjbGFzcyBDdXN0b21UeXBlZERpY3QzKFR5cGVkRGljdCk6CisgICAgbXlfdmFyOiBsaXN0W2ludF0KKworY2xhc3MgQ3VzdG9tVHlwZWREaWN0NCh0eXBpbmcuVHlwZWREaWN0KToKKyAgICBteV92YXI6IGxpc3RbaW50XQorCisKKyMgQ2hlY2sgZGF0YWNsYXNzZXMKK2RlZiBteV9kZWNvcmF0b3IoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBkZWYgd3JhcHMoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcGFzcworICAgIHJldHVybiB3cmFwcworCitAZGF0YWNsYXNzCitjbGFzcyBDdXN0b21EYXRhQ2xhc3M6CisgICAgbXlfdmFyOiBsaXN0W2ludF0KKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzMjoKKyAgICBteV92YXI6IGxpc3RbaW50XQorCitAZGF0YWNsYXNzKCkKK2NsYXNzIEN1c3RvbURhdGFDbGFzczM6CisgICAgbXlfdmFyOiBsaXN0W2ludF0KKworQG15X2RlY29yYXRvcgorQGRhdGFjbGFzc2VzLmRhdGFjbGFzcworY2xhc3MgQ3VzdG9tRGF0YUNsYXNzNDoKKyAgICBteV92YXI6IGxpc3RbaW50XQorCisKK3ZhcjE6IHNldFtpbnRdCit2YXIyOiBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdFtzdHIsIGludF0KK3ZhcjM6IGRpY3Rbc3RyLCBsaXN0W2ludF1dCit2YXI0OiBEaWN0W3N0ciwgbGlzdFtpbnRdXQordmFyNTogZGljdFt0dXBsZVtpbnQsIGludF0sIHN0cl0KK3ZhcjY6IERpY3RbdHVwbGVbaW50LCBpbnRdLCBzdHJdCit2YXI3OiBsaXN0W2xpc3RbaW50XV0KK3Zhcjg6IHR1cGxlW2xpc3RbaW50XV0KK3Zhcjk6IGludCB8IGxpc3Rbc3RyIHwgaW50XQordmFyMTA6IFVuaW9uW2xpc3Rbc3RyXSwgTm9uZV0KK3ZhcjExOiBVbmlvbltVbmlvbltsaXN0W2ludF0sIGludF1dCisKK2RlZiBmdW5jKGFyZzogbGlzdFtpbnRdKToKKyAgICBwYXNzCisKK2RlZiBmdW5jMigpIC0+IGxpc3RbaW50XToKKyAgICBwYXNzCisKK0FsaWFzMiA9IFVuaW9uW2xpc3Rbc3RyXSwgTm9uZV0KK0FsaWFzMyA9IFVuaW9uW1VuaW9uW2xpc3RbaW50XSwgaW50XV0KK0FsaWFzNCA9IFR1cGxlW2xpc3RbaW50XV0KK0FsaWFzNSA9IERpY3Rbc3RyLCBsaXN0W2ludF1dCitBbGlhczYgPSBpbnQgfCBsaXN0W2ludF0KK0FsaWFzNyA9IGxpc3RbbGlzdFtpbnRdXQorCisKK2ltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgcmUKKworY2xhc3MgT3JkZXJlZERpY3Q6CisgICAgcGFzcworCit2YXIxMjogT3JkZXJlZERpY3Rbc3RyLCBpbnRdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQordmFyMTM6IGxpc3RbaW50XQordmFyMTQ6IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0W3N0ciwgaW50XQordmFyMTU6IGNvbGxlY3Rpb25zLkNvdW50ZXJbaW50XQordmFyMTY6IGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZVtpbnRdCit2YXIxNzogY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyW2ludF0KK3ZhcjE4OiByZS5QYXR0ZXJuW3N0cl0KKworCitkZWYgZnVuYzMoKToKKyAgICBBbGlhc0ludmFsaWQyID0gbGlzdFtpbnRdCisgICAgY2FzdF92YXJpYWJsZTIgPSBbMSwgMiwgM10KKyAgICBjYXN0X3ZhcmlhYmxlMiA9IHR5cGluZy5jYXN0KGxpc3RbaW50XSwgY2FzdF92YXJpYWJsZTIpCisgICAgdmFyMTk6IGxpc3RbaW50XQorCitkZWYgZnVuYzQodmFyPWxpc3RbaW50XSk6CisgICAgcGFzcworCitkZWYgZnVuYzUoYXJnMTogbGlzdFtpbnRdLCBhcmcyPXNldFtpbnRdKToKKyAgICBwYXNzCisKK2RlZiBmdW5jNihhcmcxOiBsaXN0W2ludF0sIC8sICphcmdzOiB0dXBsZVtzdHJdLCBhcmcyOiBzZXRbaW50XSwgKiprd2FyZ3M6IGRpY3Rbc3RyLCBBbnldKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X3B5MzkucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X3B5MzkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiNzVlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODVfcHkzOS5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wb3N0cG9uZWRfZXZhbHVhdGlvbl9wZXA1ODVfcHkzOS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X3B5MzkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcG9zdHBvbmVkX2V2YWx1YXRpb25fcGVwNTg1X3B5MzkudHh0CkBAIC0wLDAgKzEgQEAKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MTA2Ojc6OlZhbHVlICdPcmRlcmVkRGljdCcgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcHJhZ21hX2FmdGVyX2JhY2tzbGFzaC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcmFnbWFfYWZ0ZXJfYmFja3NsYXNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTQ0YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJhZ21hX2FmdGVyX2JhY2tzbGFzaC5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUZXN0IHRoYXQgYSBwcmFnbWEgaGFzIGFuIGVmZmVjdCB3aGVuIHNlcGFyYXRlZCBieSBhIGJhY2tzbGFzaC4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMKKworY2xhc3MgRm9vOgorICAgICIiImJsb2NrLWRpc2FibGUgdGVzdCIiIgorCisgICAgZGVmIG1ldGgzKHNlbGYpOgorICAgICAgICAiIiJ0ZXN0IG9uZSBsaW5lIGRpc2FibGluZyIiIgorICAgICAgICBwcmludChzZWxmLmJsYSkgXAorICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcmVmZXJyZWRfbW9kdWxlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9wL3ByZWZlcnJlZF9tb2R1bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxZjFjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcmVmZXJyZWRfbW9kdWxlLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiVGVzdCBwcmVmZXJyZWQgbW9kdWxlcy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKKworaW1wb3J0IGpzb24gICMgW3ByZWZlcnJlZC1tb2R1bGVdCitmcm9tIHJlIGltcG9ydCBzZWFyY2ggICMgW3ByZWZlcnJlZC1tb2R1bGVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcHJlZmVycmVkX21vZHVsZS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcmVmZXJyZWRfbW9kdWxlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTgyZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJlZmVycmVkX21vZHVsZS5yYwpAQCAtMCwwICsxLDIgQEAKK1tJTVBPUlRTXQorcHJlZmVycmVkLW1vZHVsZXM9anNvbjp1anNvbixyZTpyZWdleApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3ByZWZlcnJlZF9tb2R1bGUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9wL3ByZWZlcnJlZF9tb2R1bGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzNiZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJlZmVycmVkX21vZHVsZS50eHQKQEAgLTAsMCArMSwyIEBACitwcmVmZXJyZWQtbW9kdWxlOjQ6MDo6UHJlZmVyIGltcG9ydGluZyAndWpzb24nIGluc3RlYWQgb2YgJ2pzb24nCitwcmVmZXJyZWQtbW9kdWxlOjU6MDo6UHJlZmVyIGltcG9ydGluZyAncmVnZXgnIGluc3RlYWQgb2YgJ3JlJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3BlcnR5X2FmZmVjdGF0aW9uX3B5MjYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvcGVydHlfYWZmZWN0YXRpb25fcHkyNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNjZjJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3BlcnR5X2FmZmVjdGF0aW9uX3B5MjYucHkKQEAgLTAsMCArMSwyNCBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKyIiIgorU2ltcGxlIHRlc3QgY2FzZSBmb3IgYW4gYW5ub3lpbmcgYmVoYXZpb3IgaW4gcHlsaW50LgorIiIiCisKK19fcmV2aXNpb25fXyA9ICdwb3VldCcKKworY2xhc3MgVGVzdChvYmplY3QpOgorICAgICIiIlNtYWxsZXN0IHRlc3QgY2FzZSBmb3IgcmVwb3J0ZWQgaXNzdWUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3RoaW5nID0gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG15YXR0cihzZWxmKToKKyAgICAgICAgIiIiR2V0dGVyIGZvciBteWF0dHIiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RoaW5nCisKKyAgICBAbXlhdHRyLnNldHRlcgorICAgIGRlZiBteWF0dHIoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJTZXR0ZXIgZm9yIG15YXR0ci4iIiIKKyAgICAgICAgc2VsZi5fdGhpbmcgPSB2YWx1ZQorCitUZXN0KCkubXlhdHRyID0gJ2dyb3UnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvcGVydHlfd2l0aF9wYXJhbWV0ZXJzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3BlcnR5X3dpdGhfcGFyYW1ldGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEwYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3BlcnR5X3dpdGhfcGFyYW1ldGVycy5weQpAQCAtMCwwICsxLDIyIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcworZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEsIGFic3RyYWN0bWV0aG9kCisKKworY2xhc3MgQ2xzOgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBhdHRyaWJ1dGUoc2VsZiwgcGFyYW0sIHBhcmFtMSk6ICMgW3Byb3BlcnR5LXdpdGgtcGFyYW1ldGVyc10KKyAgICAgICAgcmV0dXJuIHBhcmFtICsgcGFyYW0xCisKKworY2xhc3MgTXlDbGFzc0Jhc2UobWV0YWNsYXNzPUFCQ01ldGEpOgorICAgICIiIk15Q2xhc3NCYXNlLiIiIgorCisgICAgQHByb3BlcnR5CisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIGV4YW1wbGUoc2VsZik6CisgICAgICAgICIiIkdldHRlci4iIiIKKworICAgIEBleGFtcGxlLnNldHRlcgorICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBleGFtcGxlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiU2V0dGVyLiIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3BlcnR5X3dpdGhfcGFyYW1ldGVycy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvcGVydHlfd2l0aF9wYXJhbWV0ZXJzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI2NDBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3BlcnR5X3dpdGhfcGFyYW1ldGVycy50eHQKQEAgLTAsMCArMSBAQAorcHJvcGVydHktd2l0aC1wYXJhbWV0ZXJzOjc6NDpDbHMuYXR0cmlidXRlOkNhbm5vdCBoYXZlIGRlZmluZWQgcGFyYW1ldGVycyBmb3IgcHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3RlY3RlZF9hY2Nlc3NfYWNjZXNzX2RpZmZlcmVudF9zY29wZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdGVjdGVkX2FjY2Vzc19hY2Nlc3NfZGlmZmVyZW50X3Njb3Blcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA5YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3RlY3RlZF9hY2Nlc3NfYWNjZXNzX2RpZmZlcmVudF9zY29wZXMucHkKQEAgLTAsMCArMSwxMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMKK2NsYXNzIE15Q2xhc3M6CisKKyAgICBhc3luYyBkZWYgbWV0aG9kKHNlbGYpOgorICAgICAgICBwYXNzCisKKworZGVmIGZ1bmN0aW9uKCk6CisgICAgYXNzZXJ0IHNlbGYuYXR0ciAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKKworZGVmIGZ1bmMoKToKKyAgICBzZWxmLmF0dHIgKz0gMiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdGVjdGVkX2FjY2Vzc19hY2Nlc3NfZGlmZmVyZW50X3Njb3Blcy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcm90ZWN0ZWRfYWNjZXNzX2FjY2Vzc19kaWZmZXJlbnRfc2NvcGVzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGU4YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdGVjdGVkX2FjY2Vzc19hY2Nlc3NfZGlmZmVyZW50X3Njb3Blcy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcm90ZWN0ZWRfYWNjZXNzX2FjY2Vzc19kaWZmZXJlbnRfc2NvcGVzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcm90ZWN0ZWRfYWNjZXNzX2FjY2Vzc19kaWZmZXJlbnRfc2NvcGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzczNmNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3RlY3RlZF9hY2Nlc3NfYWNjZXNzX2RpZmZlcmVudF9zY29wZXMudHh0CkBAIC0wLDAgKzEsMiBAQAordW5kZWZpbmVkLXZhcmlhYmxlOjk6MTE6ZnVuY3Rpb246VW5kZWZpbmVkIHZhcmlhYmxlICdzZWxmJwordW5kZWZpbmVkLXZhcmlhYmxlOjEzOjQ6ZnVuYzpVbmRlZmluZWQgdmFyaWFibGUgJ3NlbGYnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdG9jb2xfY2xhc3Nlcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcm90b2NvbF9jbGFzc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NGRhNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdG9jb2xfY2xhc3Nlcy5weQpAQCAtMCwwICsxLDM0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworaW1wb3J0IHR5cGluZworCisKK2NsYXNzIEhhc2hlcih0eXBpbmcuUHJvdG9jb2wpOgorICAgICIiIkEgaGFzaGluZyBhbGdvcml0aG0sIGUuZy4gOmZ1bmM6YGhhc2hsaWIuc2hhMjU2YC4iIiIKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgYmxvYjogYnl0ZXMpOgorICAgICAgICAuLi4KKworICAgIGRlZiBkaWdlc3Qoc2VsZikgLT4gYnl0ZXM6CisgICAgICAgIC4uLgorCisKK0dlbmVyaWMgPSB0eXBpbmcuVHlwZVZhcigiR2VuZXJpYyIpCisKKworY2xhc3MgSGFzaGVyR2VuZXJpYyh0eXBpbmcuUHJvdG9jb2xbR2VuZXJpY10pOgorICAgICIiIkEgaGFzaGluZyBhbGdvcml0aG0sIGUuZy4gOmZ1bmM6YGhhc2hsaWIuc2hhMjU2YC4iIiIKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGJsb2I6IGJ5dGVzKToKKyAgICAgICAgLi4uCisgICAgZGVmIGRpZ2VzdChzZWxmKSAtPiBieXRlczoKKyAgICAgICAgLi4uCisKKworY2xhc3MgUHJvdG9jb2w6ICAjcHlsaW50OmRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcworICAgIHBhc3MKKworY2xhc3MgSGFzaGVyRmFrZShQcm90b2NvbCk6CisgICAgIiIiQSBoYXNoaW5nIGFsZ29yaXRobSwgZS5nLiA6ZnVuYzpgaGFzaGxpYi5zaGEyNTZgLiIiIgorICAgIGRlZiB1cGRhdGUoc2VsZiwgYmxvYjogYnl0ZXMpOiAjIFtuby1zZWxmLXVzZSwgdW51c2VkLWFyZ3VtZW50XQorICAgICAgICAuLi4KKyAgICBkZWYgZGlnZXN0KHNlbGYpIC0+IGJ5dGVzOiAjwqBbbm8tc2VsZi11c2VdCisgICAgICAgIC4uLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3RvY29sX2NsYXNzZXMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdG9jb2xfY2xhc3Nlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZjNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9wL3Byb3RvY29sX2NsYXNzZXMucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdG9jb2xfY2xhc3Nlcy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3AvcHJvdG9jb2xfY2xhc3Nlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1OTUzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcC9wcm90b2NvbF9jbGFzc2VzLnR4dApAQCAtMCwwICsxLDMgQEAKK25vLXNlbGYtdXNlOjMxOjQ6SGFzaGVyRmFrZS51cGRhdGU6TWV0aG9kIGNvdWxkIGJlIGEgZnVuY3Rpb24KK3VudXNlZC1hcmd1bWVudDozMToyMTpIYXNoZXJGYWtlLnVwZGF0ZTpVbnVzZWQgYXJndW1lbnQgJ2Jsb2InOklORkVSRU5DRQorbm8tc2VsZi11c2U6MzM6NDpIYXNoZXJGYWtlLmRpZ2VzdDpNZXRob2QgY291bGQgYmUgYSBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzZV9taXNzaW5nX2Zyb20ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmFpc2UvcmFpc2VfbWlzc2luZ19mcm9tLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyM2NlZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmFpc2UvcmFpc2VfbWlzc2luZ19mcm9tLnB5CkBAIC0wLDAgKzEsMTU3IEBACisjIHB5bGludDpkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB1bnJlYWNoYWJsZSwgdXNpbmctY29uc3RhbnQtdGVzdCwgaW52YWxpZC1uYW1lLCBiYXJlLWV4Y2VwdAorIyBweWxpbnQ6ZGlzYWJsZT10cnktZXhjZXB0LXJhaXNlLCB1bmRlZmluZWQtdmFyaWFibGUsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIHN1cGVyZmx1b3VzLXBhcmVucworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQb3NpdGl2ZXM6CisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICMgKzE6IFtyYWlzZS1taXNzaW5nLWZyb21dCisgICAgcmFpc2UgS2V5RXJyb3IKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgIyBPdXIgYWxnb3JpdGhtIGRvZXNuJ3QgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IHRoZSBjb21wbGljYXRlZCBleHByZXNzaW9uIGJlbG93LCBiZWNhdXNlCisgICAgIyB0aGUgZXhjZXB0aW9uIGFib3ZlIHdhc24ndCBib3VuZCB0byBhIG5hbWUuCisgICAgIyArMTogW3JhaXNlLW1pc3NpbmctZnJvbV0KKyAgICByYWlzZSAoZm9vICsgYmFyKS5iYXoKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZToKKyAgICAjICsxOiBbcmFpc2UtbWlzc2luZy1mcm9tXQorICAgIHJhaXNlIEtleUVycm9yCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgIyArMTogW3JhaXNlLW1pc3NpbmctZnJvbV0KKyAgICByYWlzZSBLZXlFcnJvcgorZWxzZToKKyAgICBwYXNzCitmaW5hbGx5OgorICAgIHBhc3MKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZToKKyAgICBpZiAxOgorICAgICAgICBpZiAxOgorICAgICAgICAgICAgd2l0aCB3aGF0ZXZlcjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgKzE6IFtyYWlzZS1taXNzaW5nLWZyb21dCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgIyArMTogW3JhaXNlLW1pc3NpbmctZnJvbV0KKyAgICByYWlzZSBLZXlFcnJvcigpCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgIyArMTogW3JhaXNlLW1pc3NpbmctZnJvbV0KKyAgICByYWlzZSBLZXlFcnJvcih3aGF0ZXZlciwgd2hhdGV2ZXI9d2hhdGV2ZXIpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTmVnYXRpdmVzIChTYW1lIGNhc2VzIGFzIGFib3ZlLCBleGNlcHQgd2l0aCBgZnJvbWApOgorCit0cnk6CisgICAgMSAvIDAKK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICByYWlzZSBLZXlFcnJvciBmcm9tIGZvbworCit0cnk6CisgICAgMSAvIDAKK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICByYWlzZSAoZm9vICsgYmFyKS5iYXogZnJvbSBmb28KKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZToKKyAgICByYWlzZSBLZXlFcnJvciBmcm9tIGZvbworCit0cnk6CisgICAgMSAvIDAKK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBlOgorICAgIHJhaXNlIEtleUVycm9yIGZyb20gZm9vCitlbHNlOgorICAgIHBhc3MKK2ZpbmFsbHk6CisgICAgcGFzcworCit0cnk6CisgICAgMSAvIDAKK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBlOgorICAgIGlmIDE6CisgICAgICAgIGlmIDE6CisgICAgICAgICAgICB3aXRoIHdoYXRldmVyOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IgZnJvbSBmb28KKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZToKKyAgICByYWlzZSBLZXlFcnJvcigpIGZyb20gZm9vCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgcmFpc2UgS2V5RXJyb3Iod2hhdGV2ZXIsIHdoYXRldmVyPXdoYXRldmVyKSBmcm9tIGZvbworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE90aGVyIG5lZ2F0aXZlczoKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgcmFpc2UKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZToKKyAgICByYWlzZQorCit0cnk6CisgICAgMSAvIDAKK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBlOgorICAgIHJhaXNlIGUKKwordHJ5OgorICAgIDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZToKKyAgICBpZiAxOgorICAgICAgICBpZiAxOgorICAgICAgICAgICAgaWYgMToKKyAgICAgICAgICAgICAgICByYWlzZSBlCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgcmFpc2UgZS53aXRoX3RyYWNlYmFjayhlLl9fdHJhY2ViYWNrX18pCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgcmFpc2UgKGUgKyA3KQorCit0cnk6CisgICAgMSAvIDAKK2V4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBlOgorICAgIGRlZiBmKCk6CisgICAgICAgIHJhaXNlIEtleUVycm9yCisKK3RyeToKKyAgICAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGU6CisgICAgY2xhc3MgRm9vOgorICAgICAgICByYWlzZSBLZXlFcnJvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNlX21pc3NpbmdfZnJvbS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmFpc2UvcmFpc2VfbWlzc2luZ19mcm9tLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTEzODcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNlX21pc3NpbmdfZnJvbS50eHQKQEAgLTAsMCArMSw3IEBACityYWlzZS1taXNzaW5nLWZyb206MTE6NDo6Q29uc2lkZXIgZXhwbGljaXRseSByZS1yYWlzaW5nIHVzaW5nIHRoZSAnZnJvbScga2V5d29yZAorcmFpc2UtbWlzc2luZy1mcm9tOjE5OjQ6OkNvbnNpZGVyIGV4cGxpY2l0bHkgcmUtcmFpc2luZyB1c2luZyB0aGUgJ2Zyb20nIGtleXdvcmQKK3JhaXNlLW1pc3NpbmctZnJvbToyNTo0OjpDb25zaWRlciBleHBsaWNpdGx5IHJlLXJhaXNpbmcgdXNpbmcgdGhlICdmcm9tJyBrZXl3b3JkCityYWlzZS1taXNzaW5nLWZyb206MzE6NDo6Q29uc2lkZXIgZXhwbGljaXRseSByZS1yYWlzaW5nIHVzaW5nIHRoZSAnZnJvbScga2V5d29yZAorcmFpc2UtbWlzc2luZy1mcm9tOjQ1OjIwOjpDb25zaWRlciBleHBsaWNpdGx5IHJlLXJhaXNpbmcgdXNpbmcgdGhlICdmcm9tJyBrZXl3b3JkCityYWlzZS1taXNzaW5nLWZyb206NTM6NDo6Q29uc2lkZXIgZXhwbGljaXRseSByZS1yYWlzaW5nIHVzaW5nIHRoZSAnZnJvbScga2V5d29yZAorcmFpc2UtbWlzc2luZy1mcm9tOjU5OjQ6OkNvbnNpZGVyIGV4cGxpY2l0bHkgcmUtcmFpc2luZyB1c2luZyB0aGUgJ2Zyb20nIGtleXdvcmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX2Zvcm1hdF90dXBsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX2Zvcm1hdF90dXBsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNhMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfZm9ybWF0X3R1cGxlLnB5CkBAIC0wLDAgKzEsNTEgQEAKKycnJworQ29tcGxhaW4gYWJvdXQgbXVsdGktYXJndW1lbnQgZXhjZXB0aW9uIGNvbnN0cnVjdG9ycyB3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQKK2NvbnRhaW5zIGEgcGVyY2VudCBzaWduLCB0aHVzIHN1Z2dlc3RpbmcgYSAlIHN0cmluZyBmb3JtYXR0aW5nIHdhcyBpbnRlbmRlZAoraW5zdGVhZC4gIFRoZSBzYW1lIGhvbGRzIGZvciBhIHN0cmluZyBjb250YWluaW5nIHsuLi59IHN1Z2dlc3Rpbmcgc3RyLmZvcm1hdCgpCit3YXMgaW50ZW5kZWQuCisnJycKKworZGVmIGJhZF9wZXJjZW50KGFyZyk6CisgICAgJycnUmFpc2luZyBhIHBlcmNlbnQtZm9ybWF0dGVkIHN0cmluZyBhbmQgYW4gYXJndW1lbnQnJycKKyAgICByYWlzZSBLZXlFcnJvcignQmFkIGtleTogJXInLCBhcmcpICAjIFtyYWlzaW5nLWZvcm1hdC10dXBsZV0KKworZGVmIGdvb2RfcGVyY2VudChhcmcpOgorICAgICcnJ0luc3RlYWQgb2YgcGFzc2luZyBtdWx0aXBsZSBhcmd1bWVudHMsIGZvcm1hdCB0aGUgbWVzc2FnZScnJworICAgIHJhaXNlIEtleUVycm9yKCdCYWQga2V5OiAlcicgJSBhcmcpCisKK2RlZiBiYWRfbXVsdGlhcmcobmFtZSwgdmFsdWUpOgorICAgICcnJ1JhaXNpbmcgYSBmb3JtYXR0ZWQgc3RyaW5nIGFuZCBtdWx0aXBsZSBhZGRpdGlvbmFsIGFyZ3VtZW50cycnJworICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIG1lYXN1cmVzICUuMmYnLCBuYW1lLCB2YWx1ZSkgICMgW3JhaXNpbmctZm9ybWF0LXR1cGxlXQorCitkZWYgZ29vZF9tdWx0aWFyZyhuYW1lLCB2YWx1ZSk6CisgICAgJycnVGhlIGFyZ3VtZW50cyBoYXZlIHRvIGJlIHdyaXR0ZW4gYXMgYSB0dXBsZSBmb3IgZm9ybWF0dGluZycnJworICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIG1lYXN1cmVzICUuMmYnICUgKG5hbWUsIHZhbHVlKSkKKworZGVmIGJhZF9icmFjZXMoYXJnKToKKyAgICAnJydDdXJseSBicmFjZXMgYXMgcGxhY2Vob2xkZXJzJycnCisgICAgcmFpc2UgS2V5RXJyb3IoJ0JhZCBrZXk6IHs6cn0nLCBhcmcpICAjIFtyYWlzaW5nLWZvcm1hdC10dXBsZV0KKworZGVmIGdvb2RfYnJhY2VzKGFyZyk6CisgICAgJycnQ2FsbCBzdHIuZm9ybWF0KCkgaW5zdGVhZCcnJworICAgIHJhaXNlIEtleUVycm9yKCdCYWQga2V5OiB7OnJ9Jy5mb3JtYXQoYXJnKSkKKworZGVmIGJhZF9tdWx0aXN0cmluZyhhcmcpOgorICAgICcnJ011bHRpcGxlIGFkamFjZW50IHN0cmluZyBsaXRlcmFscycnJworICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCAgIyBbcmFpc2luZy1mb3JtYXQtdHVwbGVdCisgICAgICAgICdMb25nIG1lc3NhZ2UgYWJvdXQgJXMgJworICAgICAgICAic3BsaXQgb3ZlciBzZXZlcmFsIGFkamFjZW50IGxpdGVyYWxzIiwgYXJnKQorCitkZWYgYmFkX3RyaXBsZXF1b3RlKGFyZyk6CisgICAgJycnU3RyaW5nIGxpdGVyYWxzIHdpdGggdHJpcGxlIHF1b3RlcycnJworICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCAgIyBbcmFpc2luZy1mb3JtYXQtdHVwbGVdCisgICAgICAgICcnJ0xvbmcgbWVzc2FnZSBhYm91dCAlcworICAgICAgICBzcGxpdCBvdmVyIHNldmVyYWwgYWRqYWNlbnQgbGl0ZXJhbHMnJycsIGFyZykKKworZGVmIGJhZF91bmljb2RlKGFyZyk6CisgICAgJycnVW5pY29kZSBzdHJpbmcgbGl0ZXJhbCcnJworICAgIHJhaXNlIFZhbHVlRXJyb3IodSdCYWQgJXMnLCBhcmcpICAjIFtyYWlzaW5nLWZvcm1hdC10dXBsZV0KKworZGVmIHJhaXNlX3NvbWV0aGluZ193aXRob3V0X25hbWUoYXJnKToKKyAgICAnJydSZWdyZXNzaW9uIHRlc3QgZm9yIG5vZGVzIHdpdGhvdXQgLm5vZGUgYXR0cmlidXRlJycnCisgICAgaW1wb3J0IHN0YW5kYXJkX2V4Y2VwdGlvbnMgICMgcHlsaW50OiBkaXNhYmxlPWltcG9ydC1lcnJvcixpbXBvcnQtb3V0c2lkZS10b3BsZXZlbAorICAgIHJhaXNlIHN0YW5kYXJkX2V4Y2VwdGlvbnMuTXlFeGNlcHRpb24odSdBbiAlcycsIGFyZykgICMgW3JhaXNpbmctZm9ybWF0LXR1cGxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfZm9ybWF0X3R1cGxlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX2Zvcm1hdF90dXBsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2ZmQxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX2Zvcm1hdF90dXBsZS50eHQKQEAgLTAsMCArMSw3IEBACityYWlzaW5nLWZvcm1hdC10dXBsZToxMDo0OmJhZF9wZXJjZW50OkV4Y2VwdGlvbiBhcmd1bWVudHMgc3VnZ2VzdCBzdHJpbmcgZm9ybWF0dGluZyBtaWdodCBiZSBpbnRlbmRlZAorcmFpc2luZy1mb3JtYXQtdHVwbGU6MTg6NDpiYWRfbXVsdGlhcmc6RXhjZXB0aW9uIGFyZ3VtZW50cyBzdWdnZXN0IHN0cmluZyBmb3JtYXR0aW5nIG1pZ2h0IGJlIGludGVuZGVkCityYWlzaW5nLWZvcm1hdC10dXBsZToyNjo0OmJhZF9icmFjZXM6RXhjZXB0aW9uIGFyZ3VtZW50cyBzdWdnZXN0IHN0cmluZyBmb3JtYXR0aW5nIG1pZ2h0IGJlIGludGVuZGVkCityYWlzaW5nLWZvcm1hdC10dXBsZTozNDo0OmJhZF9tdWx0aXN0cmluZzpFeGNlcHRpb24gYXJndW1lbnRzIHN1Z2dlc3Qgc3RyaW5nIGZvcm1hdHRpbmcgbWlnaHQgYmUgaW50ZW5kZWQKK3JhaXNpbmctZm9ybWF0LXR1cGxlOjQwOjQ6YmFkX3RyaXBsZXF1b3RlOkV4Y2VwdGlvbiBhcmd1bWVudHMgc3VnZ2VzdCBzdHJpbmcgZm9ybWF0dGluZyBtaWdodCBiZSBpbnRlbmRlZAorcmFpc2luZy1mb3JtYXQtdHVwbGU6NDY6NDpiYWRfdW5pY29kZTpFeGNlcHRpb24gYXJndW1lbnRzIHN1Z2dlc3Qgc3RyaW5nIGZvcm1hdHRpbmcgbWlnaHQgYmUgaW50ZW5kZWQKK3JhaXNpbmctZm9ybWF0LXR1cGxlOjUxOjQ6cmFpc2Vfc29tZXRoaW5nX3dpdGhvdXRfbmFtZTpFeGNlcHRpb24gYXJndW1lbnRzIHN1Z2dlc3Qgc3RyaW5nIGZvcm1hdHRpbmcgbWlnaHQgYmUgaW50ZW5kZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX25vbl9leGNlcHRpb25fcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfbm9uX2V4Y2VwdGlvbl9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2MWM1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX25vbl9leGNlcHRpb25fcHkzLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyIiIlRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgZW1pdCBhIHJhaXNpbmctbm9uLWV4Y2VwdGlvbi4KKworUHJldmlvdXNseSwgaXQgZGlkbid0LCBkdWUgdG8gYSBidWcgaW4gdGhlIGNoZWNrIGZvciBiYWQtZXhjZXB0aW9uLWNvbnRleHQsCit3aGljaCBwcmV2ZW50ZWQgZnVydGhlciBjaGVja2luZyBvbiB0aGUgUmFpc2Ugbm9kZS4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9aW1wb3J0LWVycm9yLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitmcm9tIG1pc3NpbmdfbW9kdWxlIGltcG9ydCBtaXNzaW5nCisKK2NsYXNzIEV4YyhvYmplY3QpOgorICAgICIiIk5vdCBhbiBhY3R1YWwgZXhjZXB0aW9uLiIiIgorCityYWlzZSBFeGMgZnJvbSBtaXNzaW5nICMgW3JhaXNpbmctbm9uLWV4Y2VwdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX25vbl9leGNlcHRpb25fcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfbm9uX2V4Y2VwdGlvbl9weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX25vbl9leGNlcHRpb25fcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfbm9uX2V4Y2VwdGlvbl9weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfbm9uX2V4Y2VwdGlvbl9weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMmU0OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmFpc2UvcmFpc2luZ19ub25fZXhjZXB0aW9uX3B5My50eHQKQEAgLTAsMCArMSBAQAorcmFpc2luZy1ub24tZXhjZXB0aW9uOjEzOjA6OlJhaXNpbmcgYSBuZXcgc3R5bGUgY2xhc3Mgd2hpY2ggZG9lc24ndCBpbmhlcml0IGZyb20gQmFzZUV4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JhaXNlL3JhaXNpbmdfc2VsZi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX3NlbGYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmMjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yYWlzZS9yYWlzaW5nX3NlbGYucHkKQEAgLTAsMCArMSwxMCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworY2xhc3MgTXVsdGlFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmKQorICAgIGRlZiByZXR1cm5fc2VsZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworCityYWlzZSBNdWx0aUV4Y2VwdGlvbigpLnJldHVybl9zZWxmKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzI2NjcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yNjY3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NWNmN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yNjY3LnB5CkBAIC0wLDAgKzEsOSBAQAorIiIiQWRkIHJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjY2NyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMKKworY2xhc3MgTXlDbGFzczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3NsaWNlID0gc2xpY2UoMCwgMTApCisKKyAgICBkZWYgaW5jcihzZWxmKToKKyAgICAgICAgc2VsZi5fc2xpY2UgPSBzbGljZSgwLCBzZWxmLl9zbGljZS5zdG9wICsgMSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzI4MzYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yODM2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTY4YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yODM2LnB5CkBAIC0wLDAgKzEsMTggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitjbGFzcyBEYXRhOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zaGFwZSA9IFtOb25lLCAxN10KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZGltKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc2hhcGUpCisKKyAgICBkZWYgY29weV9tb3ZlX2F4aXMoc2VsZiwgb2xkX2F4aXMpOgorICAgICAgICBpZiBvbGRfYXhpcyA8IDA6CisgICAgICAgICAgICBvbGRfYXhpcyArPSBzZWxmLm5kaW0KKyAgICAgICAgICAgIGFzc2VydCBvbGRfYXhpcyA+PSAwCisgICAgICAgIGFzc2VydCAwIDw9IG9sZF9heGlzIDwgc2VsZi5uZGltCisKKyAgICAgICAgbmV3X3NoYXBlID0gW05vbmVdICogc2VsZi5uZGltCisgICAgICAgIHNlbGYuc2hhcGUgPSBuZXdfc2hhcGUKKyAgICAgICAgcmV0dXJuIHNlbGYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzI4NjEucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yODYxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTBhNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yODYxLnB5CkBAIC0wLDAgKzEsOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcscmVkZWZpbmVkLWJ1aWx0aW4sdW5zdWJzY3JpcHRhYmxlLW9iamVjdAorIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lLHRvby1mZXctcHVibGljLW1ldGhvZHMsYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0CitjbGFzcyBSZXBvc2l0b3J5OgorICAgIGRlZiBfdHJhbnNmZXIoc2VsZiwgYnl0ZXM9LTEpOgorICAgICAgICBzZWxmLl9ieXRlc1RyYW5zZmVyZWQgPSAwCisgICAgICAgIGJ1ZmZmID0gVHJ1ZQorICAgICAgICB3aGlsZSBidWZmZiBhbmQgKGJ5dGVzIDwgMCBvciBzZWxmLl9ieXRlc1RyYW5zZmVyZWQgPCBieXRlcyk6CisgICAgICAgICAgICBidWZmZiA9IGJ1ZmZmWzogYnl0ZXMgLSBzZWxmLl9ieXRlc1RyYW5zZmVyZWRdCisgICAgICAgICAgICBzZWxmLl9ieXRlc1RyYW5zZmVyZWQgKz0gbGVuKGJ1ZmZmKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfMjg5OS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzI4OTkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlZTI4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzI4OTkucHkKQEAgLTAsMCArMSw5IEBACisjIHB5bGludDogZGlzYWJsZT1nbG9iYWwtc3RhdGVtZW50LG1pc3NpbmctZG9jc3RyaW5nLGRpc2FsbG93ZWQtbmFtZQorZm9vID0gInRlc3QiCisKKworZGVmIGJyb2tlbigpOgorICAgIGdsb2JhbCBmb28KKworICAgIGJhciA9IGxlbihmb28pCisgICAgZm9vID0gZm9vW2Jhcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzI5MDYucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yOTA2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGIwOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8yOTA2LnB5CkBAIC0wLDAgKzEsMTQgQEAKKyIiIlJlY3Vyc2lvbiBlcnJvciBmb3IgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjkwNiIiIgorIyBweWxpbnQ6IGRpc2FibGU9ZGlzYWxsb3dlZC1uYW1lLGdsb2JhbC1zdGF0ZW1lbnQsaW52YWxpZC1uYW1lLG1pc3NpbmctZG9jc3RyaW5nCitsc3QgPSBbXQorCisKK2RlZiBmb28oKToKKyAgICBsc3QuYXBwZW5kKDApCisKKworZGVmIGJhcigpOgorICAgIGdsb2JhbCBsc3QKKworICAgIGxlbmd0aCA9IGxlbihsc3QpCisgICAgbHN0ICs9IFtsZW5ndGhdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl8zMTUyLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfMzE1Mi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2VjMTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfMzE1Mi5weQpAQCAtMCwwICsxLDcgQEAKKyIiIkNoZWNrIHRoYXQgd2UgZG8gbm90IGNyYXNoIHdpdGggYSByZWN1cnNpb24gZXJyb3IiIiIKK2ltcG9ydCBzZXR1cHRvb2xzCisKKworIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworY2xhc3MgQ3VzdG9tKHNldHVwdG9vbHMuQ29tbWFuZCk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfMzE1OS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzMxNTkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2Y2NlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzMxNTkucHkKQEAgLTAsMCArMSwyNiBAQAorIiIiQ2hlY2sgdGhhdCB3ZSBkbyBub3QgY3Jhc2ggd2l0aCBhIHJlY3Vyc2lvbiBlcnJvcgorCitodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zMTU5CisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQsIGZpbmRfcGFja2FnZXMsIHNldHVwCisKKworY2xhc3MgQW55Q29tbWFuZChDb21tYW5kKToKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBydW4oKToKKyAgICAgICAgcHJpbnQoIkRvIGFueXRoaW5nIikKKworCitzZXR1cCgKKyAgICBuYW1lPSJUaGluZyIsCisgICAgdmVyc2lvbj0iMS4wIiwKKyAgICBwYWNrYWdlcz1maW5kX3BhY2thZ2VzKCksCisgICAgY21kY2xhc3M9eyJhbnljb21tYW5kIjogQW55Q29tbWFuZH0sCispCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl85NDAucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl85NDAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5ZjM0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWN1cnNpb24vcmVjdXJzaW9uX2Vycm9yXzk0MC5weQpAQCAtMCwwICsxLDEzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2ltcG9ydCBkYXRldGltZQorCisKK2NsYXNzIE5ld0RhdGUoZGF0ZXRpbWUuZGF0ZSk6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRvZGF5KGNscyk6CisgICAgICAgIHJldHVybiBjbHMoMjAxMCwgMSwgMSkKKworCitjbGFzcyBOZXh0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBkYXRldGltZS5kYXRlID0gTmV3RGF0ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfY3Jhc2gucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl9jcmFzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhiYzJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfY3Jhc2gucHkKQEAgLTAsMCArMSw5IEBACisiIiJUZXN0IHRoYXQgYSByZWN1cnNpb24gZXJyb3IgZG9lcyBub3QgaGFwcGVuCisKK2h0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzI0NjMKKyIiIgoraW1wb3J0IG9zCisKK0FCQyA9IG9zLnBhdGgucmVhbHBhdGgoJ2FiYycpCitERUYgPSBvcy5wYXRoLnJlYWxwYXRoKEFCQyArICdkZWYnKQorR0hJID0gb3MucGF0aC5qb2luKERFRiwgJ2doaScpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl9jcmFzaF8yNjgzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfY3Jhc2hfMjY4My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTk3OGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfY3Jhc2hfMjY4My5weQpAQCAtMCwwICsxLDEzIEBACisiIiJUZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8yNjgzIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCisKK2NsYXNzIENsczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY291bnQgPSA1CisKKyAgICBkZWYgbWV0aG9kKHNlbGYpOgorICAgICAgICByZWNvcmRzID0gW10KKyAgICAgICAgZm9yIF8gaW4gW106CisgICAgICAgICAgICByZWNvcmRzICs9IFtdCisgICAgICAgIHJlY29yZHMgPSByZWNvcmRzWzpzZWxmLmNvdW50XQorICAgICAgICByZWNvcmRzLnNvcnQoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfY3Jhc2hfYXN0cm9pZF82MjMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9lcnJvcl9jcmFzaF9hc3Ryb2lkXzYyMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjJkYTYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fZXJyb3JfY3Jhc2hfYXN0cm9pZF82MjMucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGVzdCB0aGF0IGEgcmVjdXJzaW9uIGVycm9yIGRvZXMgbm90IGhhcHBlbgorCitodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvYXN0cm9pZC9pc3N1ZXMvNjIzCisiIiIKK2Zyb20gb3MgaW1wb3J0IHBhdGgKKworRklSU1QgPSBwYXRoLm5vcm1wYXRoKHBhdGguZGlybmFtZShwYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpCitTRUNPTkQgPSBwYXRoLm5vcm1wYXRoKHBhdGguYWJzcGF0aChwYXRoLmpvaW4oRklSU1QsICIuLiIpKSkKK1RISVJEID0gcGF0aC5ub3JtcGF0aChwYXRoLmFic3BhdGgocGF0aC5qb2luKFNFQ09ORCwgIi4uIikpKQorRk9VUlRIID0gcGF0aC5qb2luKFRISVJEKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fcmVncmVzc2lvbl8yOTYwLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlY3Vyc2lvbi9yZWN1cnNpb25fcmVncmVzc2lvbl8yOTYwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTBmYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVjdXJzaW9uL3JlY3Vyc2lvbl9yZWdyZXNzaW9uXzI5NjAucHkKQEAgLTAsMCArMSw0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworZnJvbSBydW5weSBpbXBvcnQgcnVuX3BhdGgKKworX1NUSCA9IHJ1bl9wYXRoKCdoZWxsby5weScpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWNsYXJlZF9hc3NpZ25lZF9uYW1lLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVjbGFyZWRfYXNzaWduZWRfbmFtZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmZmMTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVjbGFyZWRfYXNzaWduZWRfbmFtZS5weQpAQCAtMCwwICsxLDE4IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitGSVJTVCwgRklSU1QgPSAoMSwgMikgICMgW3JlZGVjbGFyZWQtYXNzaWduZWQtbmFtZV0KKworZm9yIFNFQ09ORCwgU0VDT05EIGluIGVudW1lcmF0ZShyYW5nZSg1LCAxMCkpOiAgIyBbcmVkZWNsYXJlZC1hc3NpZ25lZC1uYW1lXQorICAgIHByaW50KFNFQ09ORCkKKworZm9yIEZJUlNULCAoU0VDT05ELCBGSVJTVCwgU0VDT05EKSBpbiBlbnVtZXJhdGUocmFuZ2UoNSwgMTApKTogICMgW3JlZGVjbGFyZWQtYXNzaWduZWQtbmFtZV0KKyAgICBwcmludChTRUNPTkQpCisKK2ZvciBEVU1NLCBEVU1NIGluIGVudW1lcmF0ZShyYW5nZSg1LCAxMCkpOiAgIyBbcmVkZWNsYXJlZC1hc3NpZ25lZC1uYW1lXQorICAgIHByaW50KERVTU0pCisKK2ZvciBEVU1NWSwgRFVNTVkgaW4gZW51bWVyYXRlKHJhbmdlKDUsIDEwKSk6CisgICAgcHJpbnQoRFVNTVkpCisKK2ZvciBfLCBfIGluIGVudW1lcmF0ZShyYW5nZSg1LCAxMCkpOgorICAgIHByaW50KF8pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWNsYXJlZF9hc3NpZ25lZF9uYW1lLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVjbGFyZWRfYXNzaWduZWRfbmFtZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQzYzUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVjbGFyZWRfYXNzaWduZWRfbmFtZS5yYwpAQCAtMCwwICsxLDIgQEAKK1tCQVNJQ10KK2R1bW15LXZhcmlhYmxlcy1yZ3g9RFVNTVkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlY2xhcmVkX2Fzc2lnbmVkX25hbWUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVjbGFyZWRfYXNzaWduZWRfbmFtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxYzhhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlY2xhcmVkX2Fzc2lnbmVkX25hbWUudHh0CkBAIC0wLDAgKzEsNCBAQAorcmVkZWNsYXJlZC1hc3NpZ25lZC1uYW1lOjM6MDo6UmVkZWNsYXJlZCB2YXJpYWJsZSAnRklSU1QnIGluIGFzc2lnbm1lbnQKK3JlZGVjbGFyZWQtYXNzaWduZWQtbmFtZTo1OjQ6OlJlZGVjbGFyZWQgdmFyaWFibGUgJ1NFQ09ORCcgaW4gYXNzaWdubWVudAorcmVkZWNsYXJlZC1hc3NpZ25lZC1uYW1lOjg6MTE6OlJlZGVjbGFyZWQgdmFyaWFibGUgJ1NFQ09ORCcgaW4gYXNzaWdubWVudAorcmVkZWNsYXJlZC1hc3NpZ25lZC1uYW1lOjExOjQ6OlJlZGVjbGFyZWQgdmFyaWFibGUgJ0RVTU0nIGluIGFzc2lnbm1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZV9sb29wLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lX2xvb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyYmExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZV9sb29wLnB5CkBAIC0wLDAgKzEsOCBAQAorIiIiVGVzdCBjYXNlIGZvciB2YXJpYWJsZSByZWRlZmluZWQgaW4gaW5uZXIgbG9vcC4iIiIKK2ZvciBpdGVtIGluIHJhbmdlKDAsIDUpOgorICAgIHByaW50KCJoZWxsbyIpCisgICAgZm9yIGl0ZW0gaW4gcmFuZ2UoNSwgMTApOiAjW3JlZGVmaW5lZC1vdXRlci1uYW1lXQorICAgICAgICBwcmludChpdGVtKQorICAgICAgICBwcmludCgieWF5IikKKyAgICBwcmludChpdGVtKQorICAgIHByaW50KCJkb25lIikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZV9sb29wLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZV9sb29wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM3MzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lX2xvb3AudHh0CkBAIC0wLDAgKzEgQEAKK3JlZGVmaW5lZC1vdXRlci1uYW1lOjQ6NDo6UmVkZWZpbmluZyBuYW1lICdpdGVtJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDIpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2FyZ3VtZW50X2Zyb21fbG9jYWwucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2FyZ3VtZW50X2Zyb21fbG9jYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwMjUyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYXJndW1lbnRfZnJvbV9sb2NhbC5weQpAQCAtMCwwICsxLDY3IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdW51c2VkLXZhcmlhYmxlLCB1bnVzZWQtYXJndW1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1vdXRlci1uYW1lLCBpbnZhbGlkLW5hbWUKKworZGVmIHRlc3RfcmVkZWZpbmVkX2luX3dpdGgobmFtZSk6CisgICAgd2l0aCBvcGVuKCdzb21ldGhpbmcnKSBhcyBuYW1lOiAjIFtyZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbF0KKyAgICAgICAgcGFzcworICAgIHdpdGggb3Blbignc29tZXRoaW5nJykgYXMgKHNlY29uZCwgbmFtZSk6ICMgW3JlZGVmaW5lZC1hcmd1bWVudC1mcm9tLWxvY2FsXQorICAgICAgICBwYXNzCisgICAgd2l0aCBvcGVuKCdzb21ldGhpbmcnKSBhcyAoc2Vjb25kLCAobmFtZSwgdGhpcmQpKTogIyBbcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWxdCisgICAgICAgIHBhc3MKKyAgICBvdGhlciA9IE5vbmUKKyAgICB3aXRoIG9wZW4oJ3NvbWV0aGluZycpIGFzIG90aGVyOgorICAgICAgICBwYXNzCisKKworCitkZWYgdGVzdF9ub3RfcmVkZWZpbmVkX2luX3dpdGgobmFtZSk6CisgICAgd2l0aCBvcGVuKCdzb21ldGhpbmcnKSBhcyB0ZXN0X3JlZGVmaW5lZF9pbl93aXRoOgorICAgICAgICBwYXNzCisKKworCitkZWYgdGVzdF9yZWRlZmluZWRfaW5fZm9yKG5hbWUpOgorICAgIGZvciBuYW1lIGluIFtdOiAjIFtyZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbF0KKyAgICAgICAgcGFzcworICAgIGZvciAobmFtZSwgaXNfKSBpbiBbXTogIyBbcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWxdCisgICAgICAgIHBhc3MKKyAgICBmb3IgKGlzXywgKG5hbWUsIF8pKSBpbiBbXTogIyBbcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWxdCisgICAgICAgIHBhc3MKKyAgICBmb3IgXyBpbiBbXToKKyAgICAgICAgcGFzcworCisKK2RlZiB0ZXN0X25vdF9yZWRlZmluZWRfaW5fZm9yKG5hbWUpOgorICAgIGZvciBuYW1lXzEgaW4gW106CisgICAgICAgIHBhc3MKKworICAgICMgVGhpcyBvbmUgY2FuIGJlIG9rYXkgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoZSBsYXN0IHZhbHVlCisgICAgIyBvZiB0aGUgaXRlcmF0aW9uCisgICAgb3RoZXIgPSBOb25lCisgICAgZm9yIG90aGVyIGluIFtdOgorICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfcmVkZWZpbmVkX2luX2V4Y2VwdF9oYW5kbGVyKG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgMSAvIDAKKyAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgbmFtZTogIyBbcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWxdCisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9ub3RfcmVkZWZpbmVkX2luX2V4Y2VwdF9oYW5kbGVyKG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgMSAvIDAKKyAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgdGVzdF9yZWRlZmluZWRfaW5fZXhjZXB0X2hhbmRsZXI6CisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9ub3RfcmVkZWZpbmVkKG5hbWUpOgorICAgIGlmIG5vdCBuYW1lOgorICAgICAgICBuYW1lID0gJycKKworCitkZWYgYXBwbHlfZmlsdGVyKG9iamVjdHMsIGZpbHQ9bGFtYmRhIG9iajogVHJ1ZSk6CisgICAgZm9yIG9iaiBpbiBvYmplY3RzOgorICAgICAgICBpZiBmaWx0KG9iaik6CisgICAgICAgICAgICB5aWVsZCBvYmoKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYXJndW1lbnRfZnJvbV9sb2NhbC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2FyZ3VtZW50X2Zyb21fbG9jYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZWM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2FyZ3VtZW50X2Zyb21fbG9jYWwudHh0CkBAIC0wLDAgKzEsNyBAQAorcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWw6NTozMDp0ZXN0X3JlZGVmaW5lZF9pbl93aXRoOlJlZGVmaW5pbmcgYXJndW1lbnQgd2l0aCB0aGUgbG9jYWwgbmFtZSAnbmFtZScKK3JlZGVmaW5lZC1hcmd1bWVudC1mcm9tLWxvY2FsOjc6Mzk6dGVzdF9yZWRlZmluZWRfaW5fd2l0aDpSZWRlZmluaW5nIGFyZ3VtZW50IHdpdGggdGhlIGxvY2FsIG5hbWUgJ25hbWUnCityZWRlZmluZWQtYXJndW1lbnQtZnJvbS1sb2NhbDo5OjQwOnRlc3RfcmVkZWZpbmVkX2luX3dpdGg6UmVkZWZpbmluZyBhcmd1bWVudCB3aXRoIHRoZSBsb2NhbCBuYW1lICduYW1lJworcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWw6MjQ6ODp0ZXN0X3JlZGVmaW5lZF9pbl9mb3I6UmVkZWZpbmluZyBhcmd1bWVudCB3aXRoIHRoZSBsb2NhbCBuYW1lICduYW1lJworcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWw6MjY6OTp0ZXN0X3JlZGVmaW5lZF9pbl9mb3I6UmVkZWZpbmluZyBhcmd1bWVudCB3aXRoIHRoZSBsb2NhbCBuYW1lICduYW1lJworcmVkZWZpbmVkLWFyZ3VtZW50LWZyb20tbG9jYWw6Mjg6MTU6dGVzdF9yZWRlZmluZWRfaW5fZm9yOlJlZGVmaW5pbmcgYXJndW1lbnQgd2l0aCB0aGUgbG9jYWwgbmFtZSAnbmFtZScKK3JlZGVmaW5lZC1hcmd1bWVudC1mcm9tLWxvY2FsOjQ4OjQ6dGVzdF9yZWRlZmluZWRfaW5fZXhjZXB0X2hhbmRsZXI6UmVkZWZpbmluZyBhcmd1bWVudCB3aXRoIHRoZSBsb2NhbCBuYW1lICduYW1lJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lZF9idWlsdGluLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lZF9idWlsdGluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDBmOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2J1aWx0aW4ucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiVGVzdHMgZm9yIHJlZGVmaW5pbmcgYnVpbHRpbnMuIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2RlZiBmdW5jdGlvbigpOgorICAgICIiIlJlZGVmaW5lZCBsb2NhbC4iIiIKKyAgICB0eXBlID0gMSAgIyBbcmVkZWZpbmVkLWJ1aWx0aW5dCisgICAgcHJpbnQodHlwZSkKKworIyBweWxpbnQ6ZGlzYWJsZT1pbnZhbGlkLW5hbWUKK21hcCA9IHt9ICAjIFtyZWRlZmluZWQtYnVpbHRpbl0KK19fZG9jX18gPSAncmVzZXQgdGhlIGRvYycKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYnVpbHRpbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2J1aWx0aW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjUyNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2J1aWx0aW4udHh0CkBAIC0wLDAgKzEsMiBAQAorcmVkZWZpbmVkLWJ1aWx0aW46Njo0OmZ1bmN0aW9uOlJlZGVmaW5pbmcgYnVpbHQtaW4gJ3R5cGUnCityZWRlZmluZWQtYnVpbHRpbjoxMDowOjpSZWRlZmluaW5nIGJ1aWx0LWluICdtYXAnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2J1aWx0aW5fYWxsb3dlZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYnVpbHRpbl9hbGxvd2VkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzY5N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX2J1aWx0aW5fYWxsb3dlZC5weQpAQCAtMCwwICsxLDkgQEAKKyIiIlRlc3RzIGZvciByZWRlZmluaW5nIGJ1aWx0aW5zLiIiIgorCitkZWYgZnVuY3Rpb24oKToKKyAgICAiIiJBbGxvdyBzb21lIHJlZGVmaW5lcy4iIiIKKyAgICBkaXIgPSAicGF0aCIgICMgYWxsb3dlZCBpbiBjb25maWcKKyAgICBkaWN0ID0gIndyb25nIiAgIyBbcmVkZWZpbmVkLWJ1aWx0aW5dCisgICAgcHJpbnQoZGlyLCBkaWN0KQorCitsaXN0ID0gIm5vdCBpbiBnbG9iYWxzIiAjIFtyZWRlZmluZWQtYnVpbHRpbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYnVpbHRpbl9hbGxvd2VkLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lZF9idWlsdGluX2FsbG93ZWQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1NzI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYnVpbHRpbl9hbGxvd2VkLnJjCkBAIC0wLDAgKzEsNCBAQAorW21lc3NhZ2VzIGNvbnRyb2xdCitkaXNhYmxlID0gaW52YWxpZC1uYW1lCitbdmFyaWFibGVzXQorYWxsb3dlZC1yZWRlZmluZWQtYnVpbHRpbnMgPSBkaXIsIGxpc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYnVpbHRpbl9hbGxvd2VkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfYnVpbHRpbl9hbGxvd2VkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDk3ZjMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lZF9idWlsdGluX2FsbG93ZWQudHh0CkBAIC0wLDAgKzEsMiBAQAorcmVkZWZpbmVkLWJ1aWx0aW46Njo0OmZ1bmN0aW9uOlJlZGVmaW5pbmcgYnVpbHQtaW4gJ2RpY3QnCityZWRlZmluZWQtYnVpbHRpbjo5OjA6OlJlZGVmaW5pbmcgYnVpbHQtaW4gJ2xpc3QnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX291dGVyX25hbWVfdHlwZV9jaGVja2luZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWRlZmluZWRfb3V0ZXJfbmFtZV90eXBlX2NoZWNraW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OWZjOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX291dGVyX25hbWVfdHlwZV9jaGVja2luZy5weQpAQCAtMCwwICsxLDIxIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLW1vZHVsZS1kb2NzdHJpbmcsbWlzc2luZy1jbGFzcy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UsbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKKworZnJvbSB0eXBpbmcgaW1wb3J0IFRZUEVfQ0hFQ0tJTkcKKworCitjbGFzcyBDbHM6CisgICAgZGVmIGZ1bmMoc2VsZiwgc3R1ZmY6IGRlZmF1bHRkaWN0KToKKyAgICAgICAgIyBUaGlzIGltcG9ydCBtYWtlcyB0aGUgZGVmaW5pdGlvbiB3b3JrLgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtb3V0c2lkZS10b3BsZXZlbAorICAgICAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAorCisgICAgICAgIG9iaiA9IGRlZmF1bHRkaWN0KCkKKyAgICAgICAgb2JqLnVwZGF0ZShzdHVmZikKKyAgICAgICAgcmV0dXJuIG9iagorCisKK2lmIFRZUEVfQ0hFQ0tJTkc6CisgICAgIyBUaGlzIGltcG9ydCBtYWtlcyB0aGUgYW5ub3RhdGlvbnMgd29yay4KKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lZF9vdXRlcl9uYW1lX3R5cGVfY2hlY2tpbmcucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkZWZpbmVkX291dGVyX25hbWVfdHlwZV9jaGVja2luZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZGVmaW5lZF9vdXRlcl9uYW1lX3R5cGVfY2hlY2tpbmcucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkdW5kYW50X3VuaXR0ZXN0X2Fzc2VydC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWR1bmRhbnRfdW5pdHRlc3RfYXNzZXJ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWZmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVkdW5kYW50X3VuaXR0ZXN0X2Fzc2VydC5weQpAQCAtMCwwICsxLDM4IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCisiIiIKK2h0dHBzOi8vd3d3LmxvZ2lsYWIub3JnL3RpY2tldC8zNTUKK0lmIHlvdSBhcmUgdXNpbmcgYXNzZXJ0VHJ1ZSBvciBhc3NlcnRGYWxzZSBhbmQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKK2NvbnN0YW50KGxpa2UgYSBzdHJpbmcpLCB0aGVuIHRoZSBhc3NlcnQgd2lsbCBhbHdheXMgYmUgdHJ1ZS4gVGhlcmVmb3JlLAoraXQgc2hvdWxkIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UuCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0CisKK0B1bml0dGVzdC5za2lwKCJkb24ndCBydW4gdGhpcyIpCitjbGFzcyBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc29tZXRoaW5nKHNlbGYpOgorICAgICAgICAnJycgU2ltcGxlIHRlc3QgJycnCisgICAgICAgIHNvbWVfdmFyID0gJ0l0IHNob3VsZCBiZSBhc3NlcnRFcXVhbCcKKyAgICAgICAgIyArMTpbcmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdJIG1lYW50IGFzc2VydEVxdWFsIG5vdCBhc3NlcnRUcnVlJywgc29tZV92YXIpCisgICAgICAgICMgKzE6W3JlZHVuZGFudC11bml0dGVzdC1hc3NlcnRdCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ0kgbWVhbnQgYXNzZXJ0RXF1YWwgbm90IGFzc2VydEZhbHNlJywgc29tZV92YXIpCisgICAgICAgICMgKzE6W3JlZHVuZGFudC11bml0dGVzdC1hc3NlcnRdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShUcnVlLCBzb21lX3ZhcikKKyAgICAgICAgIyArMTpbcmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydF0KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGYWxzZSwgc29tZV92YXIpCisgICAgICAgICMgKzE6W3JlZHVuZGFudC11bml0dGVzdC1hc3NlcnRdCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoTm9uZSwgc29tZV92YXIpCisgICAgICAgICMgKzE6W3JlZHVuZGFudC11bml0dGVzdC1hc3NlcnRdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwLCBzb21lX3ZhcikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3Nob3VsZCBiZScgaW4gc29tZV92YXIsIHNvbWVfdmFyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29tZV92YXIsIHNvbWVfdmFyKQorCisKK0B1bml0dGVzdC5za2lwKCJkb24ndCBydW4gdGhpcyIpCitjbGFzcyBSZWdyZXNzaW9uV2l0aEFyZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ0Rvbid0IGZhaWwgaWYgdGhlIGJvdW5kIG1ldGhvZCBkb2Vzbid0IGhhdmUgYXJndW1lbnRzLicnJworCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYucnVuKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWR1bmRhbnRfdW5pdHRlc3RfYXNzZXJ0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWR1bmRhbnRfdW5pdHRlc3RfYXNzZXJ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDlkMjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZHVuZGFudF91bml0dGVzdF9hc3NlcnQudHh0CkBAIC0wLDAgKzEsNiBAQAorcmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydDoxNzo4OlRlc3RzLnRlc3Rfc29tZXRoaW5nOlJlZHVuZGFudCB1c2Ugb2YgYXNzZXJ0VHJ1ZSB3aXRoIGNvbnN0YW50IHZhbHVlICdJIG1lYW50IGFzc2VydEVxdWFsIG5vdCBhc3NlcnRUcnVlJworcmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydDoxOTo4OlRlc3RzLnRlc3Rfc29tZXRoaW5nOlJlZHVuZGFudCB1c2Ugb2YgYXNzZXJ0RmFsc2Ugd2l0aCBjb25zdGFudCB2YWx1ZSAnSSBtZWFudCBhc3NlcnRFcXVhbCBub3QgYXNzZXJ0RmFsc2UnCityZWR1bmRhbnQtdW5pdHRlc3QtYXNzZXJ0OjIxOjg6VGVzdHMudGVzdF9zb21ldGhpbmc6UmVkdW5kYW50IHVzZSBvZiBhc3NlcnRUcnVlIHdpdGggY29uc3RhbnQgdmFsdWUgVHJ1ZQorcmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydDoyMzo4OlRlc3RzLnRlc3Rfc29tZXRoaW5nOlJlZHVuZGFudCB1c2Ugb2YgYXNzZXJ0RmFsc2Ugd2l0aCBjb25zdGFudCB2YWx1ZSBGYWxzZQorcmVkdW5kYW50LXVuaXR0ZXN0LWFzc2VydDoyNTo4OlRlc3RzLnRlc3Rfc29tZXRoaW5nOlJlZHVuZGFudCB1c2Ugb2YgYXNzZXJ0RmFsc2Ugd2l0aCBjb25zdGFudCB2YWx1ZSBOb25lCityZWR1bmRhbnQtdW5pdHRlc3QtYXNzZXJ0OjI3Ojg6VGVzdHMudGVzdF9zb21ldGhpbmc6UmVkdW5kYW50IHVzZSBvZiBhc3NlcnRUcnVlIHdpdGggY29uc3RhbnQgdmFsdWUgMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8xMzI2X2NyYXNoX3VuaW5mZXJhYmxlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8xMzI2X2NyYXNoX3VuaW5mZXJhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzEzMjZfY3Jhc2hfdW5pbmZlcmFibGUucHkKQEAgLTAsMCArMSwxMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworaW1wb3J0IHNvY2tldAorCitSRVRSWUFCTEVfRVhDRVBUSU9OUyA9IChzb2NrZXQuZXJyb3IsKQorCisjIHB5bGludDogZGlzYWJsZT13cm9uZy1leGNlcHRpb24tb3BlcmF0aW9uCitkZWYgZXhjZXB0aW9uX2hhbmRsZXIoKToKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIDEKKyAgICBleGNlcHQgUkVUUllBQkxFX0VYQ0VQVElPTlMgKyB0dXBsZSgpOgorICAgICAgICB5aWVsZCAyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzIzMDZfZW51bV92YWx1ZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMjMwNl9lbnVtX3ZhbHVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzIzYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzIzMDZfZW51bV92YWx1ZS5weQpAQCAtMCwwICsxLDExIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUKKworZnJvbSBlbnVtIGltcG9ydCBFbnVtCisKK2NsYXNzIENvbG9yKEVudW0pOgorICAgIHJlZCA9IDEKKyAgICBncmVlbiA9IDIKKyAgICBibHVlID0gMworCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDwgb3RoZXIudmFsdWUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMjQ0M19kdXBsaWNhdGVfYmFzZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzI0NDNfZHVwbGljYXRlX2Jhc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjQ5MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzI0NDNfZHVwbGljYXRlX2Jhc2VzLnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB0b28tbWFueS1hbmNlc3RvcnMsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworZnJvbSB0eXBpbmcgaW1wb3J0IEdlbmVyaWMsIFR5cGVWYXIKKworSU4gPSBUeXBlVmFyKCdJTicsIGNvbnRyYXZhcmlhbnQ9VHJ1ZSkKK09VVCA9IFR5cGVWYXIoJ09VVCcsIGNvdmFyaWFudD1UcnVlKQorCisKK2NsYXNzIFNlcnZpY2U6CisgICAgcGFzcworCisKK2NsYXNzIENvbnN1bWluZ01peGluKEdlbmVyaWNbSU5dKToKKyAgICBwYXNzCisKKworY2xhc3MgUHJvZHVjaW5nTWl4aW4oR2VuZXJpY1tPVVRdKToKKyAgICBwYXNzCisKKworY2xhc3MgU3RyZWFtaW5nTWl4aW4oR2VuZXJpY1tJTiwgT1VUXSwgQ29uc3VtaW5nTWl4aW5bSU5dLCBQcm9kdWNpbmdNaXhpbltPVVRdKToKKyAgICBwYXNzCisKKworY2xhc3MgRXhhbXBsZShTdHJlYW1pbmdNaXhpbltzdHIsIGludF0sIFNlcnZpY2UpOgorICAgIHBhc3MKKworCitwcmludChFeGFtcGxlLl9fbXJvX18pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzI0NDNfZHVwbGljYXRlX2Jhc2VzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8yNDQzX2R1cGxpY2F0ZV9iYXNlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8yNDQzX2R1cGxpY2F0ZV9iYXNlcy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMjkzN19pZmV4cC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMjkzN19pZmV4cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWIyNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8yOTM3X2lmZXhwLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLG5vLWVsc2UtcmV0dXJuLHVzaW5nLWNvbnN0YW50LXRlc3QKK2RlZiBnZXRfbGlzdCgpOgorICAgIHJldHVybiBbMV0gaWYgVHJ1ZSBlbHNlIFsyXQorCisKK2RlZiBmaW5kX2ludCgpOgorICAgIHJldHVybiBpbnQoZ2V0X2xpc3QoKVswXSkKKworCitkZWYgZnVuYygpOgorICAgIGlmIFRydWU6CisgICAgICAgIHJldHVybiBmaW5kX2ludCgpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGZpbmRfaW50KCkKKworCitkZWYgdGVzdCgpOgorICAgIHJlc3AgPSBmdW5jKCkKKyAgICBhc3NlcnQgcmVzcCAvIHJlc3AgPiAwCisgICAgcmV0dXJuIHJlc3AKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMzA5MS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMzA5MS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTk2ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8zMDkxLnB5CkBAIC0wLDAgKzEsNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbnZhbGlkLW5hbWUsbWlzc2luZy1kb2NzdHJpbmcKK2NsYXNzIE15Q2xhc3MoKToKKyAgICBmdW4gPSBsYW1iZGEgc2VsZiwgeDogeCAqIDIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHggPSBzZWxmLmZ1bigxKSAjIENyYXNoZXMgcHlsaW50IDIuMy4xCisgICAgICAgIHByaW50KHgpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzMyMzFfbm9fbWVtYmVyX3Byb3BlcnR5LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8zMjMxX25vX21lbWJlcl9wcm9wZXJ0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M5Y2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8zMjMxX25vX21lbWJlcl9wcm9wZXJ0eS5weQpAQCAtMCwwICsxLDIwIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEsIGFic3RyYWN0bWV0aG9kCisKKworY2xhc3MgQ2xzKG1ldGFjbGFzcz1BQkNNZXRhKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBwcm9wZXJ0eQorICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzb21lX21ldGhvZChjbHMpOgorICAgICAgICByZXR1cm4gY2xzLnZhbHVlcy5pc3N1YnNldCh7MiwgM30pCisKKworY2xhc3MgU3ViY2xzKENscyk6CisgICAgdmFsdWVzID0gezEsIDIsIDN9CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzM0MTZfdW51c2VkX2FyZ3VtZW50X3JhaXNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8zNDE2X3VudXNlZF9hcmd1bWVudF9yYWlzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM3NjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8zNDE2X3VudXNlZF9hcmd1bWVudF9yYWlzZS5weQpAQCAtMCwwICsxLDE0IEBACisiIiJUZXN0IHRoYXQgd2UgZW1pdCB1bnVzZWQtYXJndW1lbnQgd2hlbiBhIGZ1bmN0aW9uIHVzZXMgYHJhaXNlCisKK2h0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzM0MTYKKyIiIgorCisjIHB5bGludDpkaXNhYmxlPXJhaXNlLW1pc3NpbmctZnJvbQorCisjICsxOiBbdW51c2VkLWFyZ3VtZW50LCB1bnVzZWQtYXJndW1lbnQsIHVudXNlZC1hcmd1bWVudF0KK2RlZiBmdW4oYXJnX2EsIGFyZ19iLCBhcmdfYykgLT4gTm9uZToKKyAgICAiIiJSb3V0aW5lIGRvY3N0cmluZyIiIgorICAgIHRyeToKKyAgICAgICAgcGFzcworICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiIikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMzQxNl91bnVzZWRfYXJndW1lbnRfcmFpc2UudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl8zNDE2X3VudXNlZF9hcmd1bWVudF9yYWlzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkN2E2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMzQxNl91bnVzZWRfYXJndW1lbnRfcmFpc2UudHh0CkBAIC0wLDAgKzEsMyBAQAordW51c2VkLWFyZ3VtZW50Ojk6ODpmdW46VW51c2VkIGFyZ3VtZW50ICdhcmdfYScKK3VudXNlZC1hcmd1bWVudDo5OjE1OmZ1bjpVbnVzZWQgYXJndW1lbnQgJ2FyZ19iJwordW51c2VkLWFyZ3VtZW50Ojk6MjI6ZnVuOlVudXNlZCBhcmd1bWVudCAnYXJnX2MnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzM1MzVfZG91YmxlX2VudW1faW5oZXJpdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMzUzNV9kb3VibGVfZW51bV9pbmhlcml0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NGI1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzM1MzVfZG91YmxlX2VudW1faW5oZXJpdC5weQpAQCAtMCwwICsxLDEyIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMzUzNQorCitpbXBvcnQgZW51bQorCitjbGFzcyBBKGVudW0uRW51bSk6CisgICAgcGFzcworCitjbGFzcyBCKEEpOgorICAgIHggPSBlbnVtLmF1dG8oKQorCitwcmludChCLl9fbWVtYmVyc19fWyd4J10pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzM1OTVfbm90Y2FsbGFibGVfY29sbGVjdGlvbnMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uXzM1OTVfbm90Y2FsbGFibGVfY29sbGVjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwYjI2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fMzU5NV9ub3RjYWxsYWJsZV9jb2xsZWN0aW9ucy5weQpAQCAtMCwwICsxLDEzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtaW1wb3J0CisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzM1OTUKKworaW1wb3J0IGNvbGxlY3Rpb25zCisKK2NsYXNzIEV4YW1wbGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnByZXYoKQorICAgICAgICBzZWxmLm5leHQoKQorICAgIGRlZiBwcmV2KHNlbGYpOgorICAgICAgICBwYXNzCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fNDIyMV9vYmplY3RfaW5zdGFuY2VhdHRyLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl80MjIxX29iamVjdF9pbnN0YW5jZWF0dHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzNDZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fNDIyMV9vYmplY3RfaW5zdGFuY2VhdHRyLnB5CkBAIC0wLDAgKzEsOCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDIyMQorCitpbXBvcnQgcmFuZG9tCitvID0gb2JqZWN0KCkKK2lmIHJhbmRvbS5jaG9pY2UoW1RydWUsIEZhbHNlXSk6CisgICAgby5jb3VudCA9IE5vbmUKKyJhYmMiLmNvdW50KCJhIikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fNDM1OF91bnN1YnNjcmlwdGFibGVfZW51bS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fNDM1OF91bnN1YnNjcmlwdGFibGVfZW51bS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2E5ZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl80MzU4X3Vuc3Vic2NyaXB0YWJsZV9lbnVtLnB5CkBAIC0wLDAgKzEsOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9cG9pbnRsZXNzLXN0YXRlbWVudCxtaXNzaW5nLWRvY3N0cmluZworIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80MzU4CisKK2Zyb20gZW51bSBpbXBvcnQgRW51bQorCitjbGFzcyBGb28oRW51bSk6CisgICAgQkFSID0gMQorCitGb28uX19tZW1iZXJzX19bJ0JBUiddICAjIDwtLSBlcnJvcjogVmFsdWUgJ0Zvby5fX21lbWJlcnNfXycgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX19fZmlsZV9fX2dsb2JhbC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fX19maWxlX19fZ2xvYmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDJlZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX19fZmlsZV9fX2dsb2JhbC5weQpAQCAtMCwwICsxLDggQEAKKyIiInRlc3Qgbm8gY3Jhc2ggb24gX19maWxlX18gZ2xvYmFsIiIiCisKK2RlZiBmdW5jKCk6CisgICAgIiIib3ZlcnJpZGUgX19maWxlX18iIiIKKyAgICBnbG9iYWwgX19maWxlX18gICMgW2dsb2JhbC1zdGF0ZW1lbnQsIHJlZGVmaW5lZC1idWlsdGluXQorICAgIF9fZmlsZV9fID0gJ2hvcCcKKworX19yZXZpc2lvbl9fID0gJ3BvdWV0JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9fX2ZpbGVfX19nbG9iYWwudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9fX2ZpbGVfX19nbG9iYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmI0NTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX19fZmlsZV9fX2dsb2JhbC50eHQKQEAgLTAsMCArMSwyIEBACitnbG9iYWwtc3RhdGVtZW50OjU6NDpmdW5jOlVzaW5nIHRoZSBnbG9iYWwgc3RhdGVtZW50CityZWRlZmluZWQtYnVpbHRpbjo1OjQ6ZnVuYzpSZWRlZmluaW5nIGJ1aWx0LWluICdfX2ZpbGVfXycKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25faW1wbGljaXRfbm9uZV93aXRoX25vX3JldHVybi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25faW1wbGljaXRfbm9uZV93aXRoX25vX3JldHVybi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTZmYzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9pbXBsaWNpdF9ub25lX3dpdGhfbm9fcmV0dXJuLnB5CkBAIC0wLDAgKzEsMTggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHBvaW50bGVzcy1zdGF0ZW1lbnQsaW52YWxpZC1uYW1lLG5vLXNlbGYtdXNlCisKK2NsYXNzIEE6CisgICAgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgIHByaW50KCdoZWxsbycpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaW5kZXgoc2VsZik6CisgICAgICAgIHByaW50KCd3b3JsZCcpCisKKworIyBTaW5jZSB0aGVzZSBhcmUgbm90IGFzc2lnbmVkIGFueXdoZXJlLCBhc3NpZ25tZW50LWZyb20tbm9uZSBldGMuCisjIGluIHR5cGVjaGVjayBkb2VzIG5vdCB3YXJuCisKK2EgPSBBKCkKKyMgZG91YmxlIGNhbGwgaXMgd29ya2Fyb3VuZCBmb3IgIzQ0MjYKK2EuZnVuYygpKCkgICMgW25vdC1jYWxsYWJsZV0KK1sxLCAyLCAzXVthLmluZGV4XSAgIyBbaW52YWxpZC1zZXF1ZW5jZS1pbmRleF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25faW1wbGljaXRfbm9uZV93aXRoX25vX3JldHVybi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX2ltcGxpY2l0X25vbmVfd2l0aF9ub19yZXR1cm4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNjNiN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX2ltcGxpY2l0X25vbmVfd2l0aF9ub19yZXR1cm4udHh0CkBAIC0wLDAgKzEsMiBAQAorbm90LWNhbGxhYmxlOjE3OjA6OmEuZnVuYygpIGlzIG5vdCBjYWxsYWJsZQoraW52YWxpZC1zZXF1ZW5jZS1pbmRleDoxODowOjpTZXF1ZW5jZSBpbmRleCBpcyBub3QgYW4gaW50LCBzbGljZSwgb3IgaW5zdGFuY2Ugd2l0aCBfX2luZGV4X18KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25faW5mZXJfY2FsbF9yZXN1bHRfMzY5MC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25faW5mZXJfY2FsbF9yZXN1bHRfMzY5MC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTRiNDBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9pbmZlcl9jYWxsX3Jlc3VsdF8zNjkwLnB5CkBAIC0wLDAgKzEsMTEgQEAKKyMgcHlsaW50OiBkaXNhYmxlLW1zZz1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLHVzaW5nLWNvbnN0YW50LXRlc3QgICMgW2RlcHJlY2F0ZWQtcHJhZ21hXQorCitjbGFzcyBDbGFzczoKKyAgICBAcHJvcGVydHkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnVuYyhjbHMpOgorICAgICAgICBwYXNzCisKKworaWYgQ2xhc3MuZnVuYzoKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX2luZmVyX2NhbGxfcmVzdWx0XzM2OTAudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9pbmZlcl9jYWxsX3Jlc3VsdF8zNjkwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY5ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9pbmZlcl9jYWxsX3Jlc3VsdF8zNjkwLnR4dApAQCAtMCwwICsxIEBACitkZXByZWNhdGVkLXByYWdtYToxOjA6OiJQcmFnbWEgIiJkaXNhYmxlLW1zZyIiIGlzIGRlcHJlY2F0ZWQsIHVzZSAiImRpc2FibGUiIiBpbnN0ZWFkIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9ub19tZW1iZXJfMTA3OC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fbm9fbWVtYmVyXzEwNzgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiZTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fbm9fbWVtYmVyXzEwNzgucHkKQEAgLTAsMCArMSwxNCBAQAorIiIiTWFrZSBzdXJlIG5vLW1lbWJlciBpcyBub3QgZW1pdHRlZCB3aGVuIG1vZGlmeWluZyBfX2RvY19fIHZpYSBhdWdtZW50ZWQgYXNzaWdubWVudAorCitodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8xMDc4CisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsbWlzc2luZy1jbGFzcy1kb2NzdHJpbmcKK2NsYXNzIENsczoKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgImEiCisKKyAgICB0ZXN0Ll9fZG9jX18gKz0gImIiCisKKworcHJpbnQoQ2xzKCkudGVzdC5fX2RvY19fKQorcHJpbnQoQ2xzLnRlc3QuX19kb2NfXykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fbm9fdmFsdWVfZm9yX3BhcmFtZXRlci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fbm9fdmFsdWVfZm9yX3BhcmFtZXRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQyZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9ub192YWx1ZV9mb3JfcGFyYW1ldGVyLnB5CkBAIC0wLDAgKzEsNDIgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLGltcG9ydC1lcnJvcgoraW1wb3J0IG9zCisKK2Zyb20gVW5rbm93biBpbXBvcnQgVW5rbm93bgorCisKK2NsYXNzIENvbmZpZ01hbmFnZXIoVW5rbm93bik6CisKKworICAgIFJFTkFNRURfU0VDVElPTlMgPSB7CisgICAgICAgICdwZXJtaXNzaW9ucyc6ICdjb250ZW50JworICAgIH0KKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLlJFTkFNRURfU0VDVElPTlMuaXRlbXMoKSAjQAorCisgICAgZGVmIGl0ZW1zKHNlbGYsIHNlY3RuYW1lLCByYXc9VHJ1ZSk6CisgICAgICAgIHBhc3MKKworCitkZWYgZnVuYygqLCBrZXk9Tm9uZSk6CisgICAgcmV0dXJuIGtleQorCisKK2RlZiB2YXJhcmdzX2dvb2QoKnBhcnRzKToKKyAgICAiIiJBbGwgZ29vZCIiIgorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKnBhcnRzKQorCisKK2RlZiB2YXJhcmdzX25vX2V4cHIoKnBhcnRzKToKKyAgICAiIiJGYWxzZSBwb3NpdGl2ZSBiZWxvdyB0aGlzIGxpbmUiIiIKKyAgICByZXQgPSBvcy5wYXRoLmpvaW4oKnBhcnRzKQorICAgIHJldHVybiByZXQKKworCitkZWYga3dhcmdzX2dvb2QoKiprd2FyZ3MpOgorICAgIHJldHVybiBmdW5jKCoqa3dhcmdzKQorCisKK2RlZiBrd2FyZ3Nfbm9fZXhwcigqKmt3YXJncyk6CisgICAgcmV0ID0gZnVuYygqKmt3YXJncykKKyAgICByZXR1cm4gcmV0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Bvc29ubHlfYXJncy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcG9zb25seV9hcmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGIxZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Bvc29ubHlfYXJncy5weQpAQCAtMCwwICsxLDIxIEBACisiIiJUZXN0IGxpbnRpbmcuCisKK1RoaXMgaXMgb25seSBpbnRlbmRlZCB0byB0ZXN0IHB5bGludCBzdXBwb3J0IGZvciBweXRob24gMy44J3MKK3Bvc2l0aW9uYWwtb25seSBhcmd1bWVudHMgKFBFUCA1NzApLgorIiIiCisKKworY2xhc3MgRm9vYmFyOgorICAgICIiIkNsYXNzIGZvciBmcm9idWxhdGluZyB0aGUgRm9vYmFyLiIiIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGJ1aWxkbWUoY2xzLCAvLCB2YWx1ZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBvYmplY3QgdXNpbmcgYWx0ZXJuYXRlIG1ldGhvZC4iIiIKKyAgICAgICAgcmV0dXJuIGNscyh2YWx1ZSkuYWJjCisKKyAgICBkZWYgcnVubWUoc2VsZiwgcXJzLCAvLCB4eXo9Tm9uZSk6CisgICAgICAgICIiIkRvIHNvbWV0aGluZyBmdW5jeS4iIiIKKyAgICAgICAgaWYgc2VsZi5hYmMgYW5kIHFycyBhbmQgeHl6OgorICAgICAgICAgICAgcHJpbnQoImZvdW5kIHNvbWV0aGluZyBlbHNlIikKKworICAgIGFiYyA9IDQyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Bvc29ubHlfYXJncy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcG9zb25seV9hcmdzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmM1MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Bvc29ubHlfYXJncy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydGllc19pbl9jbGFzc19jb250ZXh0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0aWVzX2luX2NsYXNzX2NvbnRleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwNmE3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydGllc19pbl9jbGFzc19jb250ZXh0LnB5CkBAIC0wLDAgKzEsNDQgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMKKworY2xhc3MgTWV0YSh0eXBlKToKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmFsdWVzKGNscyk6CisgICAgICAgIHJldHVybiBbJ2ZvbycsICdiYXInXQorCisKK2NsYXNzIFBhcmVudChtZXRhY2xhc3M9TWV0YSk6CisgICAgcGFzcworCisKK2Fzc2VydCAnZm9vJyBpbiBQYXJlbnQudmFsdWVzICAjIG5vIHdhcm5pbmcKK2ZvciB2YWx1ZSBpbiBQYXJlbnQudmFsdWVzOiAgIyBubyB3YXJuaW5nCisgICAgcHJpbnQodmFsdWUpCisKKworY2xhc3MgQ2hpbGQoUGFyZW50KToKKyAgICBwYXNzCisKKworYXNzZXJ0ICdmb28nIGluIENoaWxkLnZhbHVlcyAgIyBmYWxzZS1wb3NpdGl2ZTogdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0Citmb3IgdmFsdWUgaW4gQ2hpbGQudmFsdWVzOiAgIyBmYWxzZS1wb3NpdGl2ZTogbm90LWFuLWl0ZXJhYmxlCisgICAgcHJpbnQodmFsdWUpCisKKworY2xhc3MgTWV0YTIodHlwZSk6CisgICAgZGVmIGFfbWV0aG9kKGNscyk6ICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICAgICAgICByZXR1cm4gWzEyM10KKworCitjbGFzcyBQYXJlbnQyKG1ldGFjbGFzcz1NZXRhMik6CisgICAgQHByb3BlcnR5CisgICAgZGVmIGFfbWV0aG9kKHNlbGYpOgorICAgICAgICByZXR1cm4gImFjdHVhbGx5IGEgcHJvcGVydHkiCisKKworY2xhc3MgQ2hpbGQyKFBhcmVudDIpOgorICAgIHBhc3MKKworCithc3NlcnQgMTIzIGluIENoaWxkMi5hX21ldGhvZCAgIyBbdW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0XQorZm9yIHZhbHVlIGluIENoaWxkMi5hX21ldGhvZDogICMgW25vdC1hbi1pdGVyYWJsZV0KKyAgICBwcmludCh2YWx1ZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydGllc19pbl9jbGFzc19jb250ZXh0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydGllc19pbl9jbGFzc19jb250ZXh0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc1NGJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0aWVzX2luX2NsYXNzX2NvbnRleHQudHh0CkBAIC0wLDAgKzEsMiBAQAordW5zdXBwb3J0ZWQtbWVtYmVyc2hpcC10ZXN0OjQyOjE0OjpWYWx1ZSAnQ2hpbGQyLmFfbWV0aG9kJyBkb2Vzbid0IHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0Citub3QtYW4taXRlcmFibGU6NDM6MTM6Ok5vbi1pdGVyYWJsZSB2YWx1ZSBDaGlsZDIuYV9tZXRob2QgaXMgdXNlZCBpbiBhbiBpdGVyYXRpbmcgY29udGV4dApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0eV9ub19tZW1iZXJfMjY0MS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzI2NDEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZjc4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzI2NDEucHkKQEAgLTAsMCArMSw0MCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLWFyZ3VtZW50LHRvby1mZXctcHVibGljLW1ldGhvZHMKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjY0MQorZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEsIGFic3RyYWN0bWV0aG9kCisKKworY2xhc3MgUGVyc29uKG1ldGFjbGFzcz1BQkNNZXRhKToKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYWdlKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmFnZSA9IGFnZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQorCisgICAgQG5hbWUuc2V0dGVyCisgICAgZGVmIG5hbWUoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9fbmFtZSA9IHZhbHVlCisKKworY2xhc3MgTXlzZWxmKFBlcnNvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGFnZSwgdGVsKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhuYW1lLCBhZ2UpCisgICAgICAgIHNlbGYudGVsID0gdGVsCisKKyAgICBAUGVyc29uLm5hbWUuc2V0dGVyCisgICAgZGVmIG5hbWUoc2VsZiwgdmFsdWUpOgorICAgICAgICBzdXBlcihzZWxmLl9fY2xhc3NfXywgc2VsZi5fX2NsYXNzX18pLm5hbWUuZnNldChzZWxmLCAib3ZlcnJpZGUiKQorCisKK2NsYXNzIFdpZmUoUGVyc29uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYWdlLCB0ZWwpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUsIGFnZSkKKyAgICAgICAgc2VsZi50ZWwgPSB0ZWwKKworCittcyA9IE15c2VsZigiTWF0aGV1cyBTYXJhaXZhIiwgMzYsICI5ODgwNzAzNTAiKQord2kgPSBXaWZlKCJKb2ljZSBTYXJhaXZhIiwgMzQsICI5OTk5MjM1NTQiKQorCitwcmludCh3aS5uYW1lKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0eV9ub19tZW1iZXJfMzI2OS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzMyNjkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0ZGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzMyNjkucHkKQEAgLTAsMCArMSwyMyBAQAorIiIiQ2FsbGluZyBhIHN1cGVyIHByb3BlcnR5IiIiCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLGludmFsaWQtbmFtZQorCitjbGFzcyBBOgorICAgICIiIkEgcGFyZW50IGNsYXNzIiIiCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiQSBwcm9wZXJ0eSIiIgorICAgICAgICByZXR1cm4gInRlc3QiCisKKworY2xhc3MgQjoKKyAgICAiIiJBIGNoaWxkIGNsYXNzIiIiCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGluZyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9wIHdoaWNoIGNhbGxzIHRoZSBwYXJlbnQiIiIKKyAgICAgICAgcmV0dXJuIEEudGVzdC5mZ2V0KHNlbGYpICsgIiBvdmVycmlkZW4iCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBwcmludChCKCkudGVzdCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzg0NC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzg0NC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTliN2JmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0eV9ub19tZW1iZXJfODQ0LnB5CkBAIC0wLDAgKzEsMTggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsaW52YWxpZC1vdmVycmlkZGVuLW1ldGhvZAorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy84NDQKK2NsYXNzIFBhcmVudDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX190aGluZyA9ICdmb28nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGhpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdGhpbmcKKworCitjbGFzcyBDaGlsZChQYXJlbnQpOgorICAgIEBQYXJlbnQudGhpbmcuZ2V0dGVyCisgICAgZGVmIHRoaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc3VwZXIoKS50aGluZyArICchJworCisKK3ByaW50KENoaWxkKCkudGhpbmcpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Byb3BlcnR5X25vX21lbWJlcl84NzAucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Byb3BlcnR5X25vX21lbWJlcl84NzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5YWUxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWdyZXNzaW9uL3JlZ3Jlc3Npb25fcHJvcGVydHlfbm9fbWVtYmVyXzg3MC5weQpAQCAtMCwwICsxLDE1IEBACisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLGludmFsaWQtbmFtZSxtaXNzaW5nLWRvY3N0cmluZworIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy84NzAKKworY2xhc3MgWDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsPU5vbmUpOgorICAgICAgICBzZWxmLl92YWwgPSB2YWwKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmFsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsCisgICAgQHZhbC5zZXR0ZXIKKyAgICBkZWYgdmFsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsID0gdmFsdWUKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwcmludChYKFtdKS52YWwuYXBwZW5kKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0eV9zbG90c18yNDM5LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl9wcm9wZXJ0eV9zbG90c18yNDM5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2Y4NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Byb3BlcnR5X3Nsb3RzXzI0MzkucHkKQEAgLTAsMCArMSwyMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHRvby1mZXctcHVibGljLW1ldGhvZHMKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjQzOQorY2xhc3MgVGVzdENsYXNzOgorICAgIF9fc2xvdHNfXyA9IFsiX2kiXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9pID0gMAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pCisKKyAgICBAaS5zZXR0ZXIKKyAgICBkZWYgaShzZWxmLCB2KToKKyAgICAgICAgc2VsZi5faSA9IHYKKworICAgIG90aGVyID0gaQorCisKK2luc3RhbmNlID0gVGVzdENsYXNzKCkKK2luc3RhbmNlLm90aGVyID0gNDIKK3ByaW50KGluc3RhbmNlLmkpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVncmVzc2lvbi9yZWdyZXNzaW9uX3Rvb19tYW55X2FyZ3VtZW50c18yMzM1LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl90b29fbWFueV9hcmd1bWVudHNfMjMzNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc1OWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlZ3Jlc3Npb24vcmVncmVzc2lvbl90b29fbWFueV9hcmd1bWVudHNfMjMzNS5weQpAQCAtMCwwICsxLDExIEBACisiIiJUZXN0IHRoYXQgYGFiYy5BQkNNZXRhLl9fbmV3X19gIGRvZXMgbm90IHRyaWdnZXIgdG9vLW1hbnktZnVuY3Rpb24tYXJndW1lbnRzIHdoZW4gcmVmZXJyZWQKKworaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjMzNQorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWNsYXNzLWRvY3N0cmluZyx1bnVzZWQtYXJndW1lbnQsYXJndW1lbnRzLWRpZmZlcgorZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEKKworCitjbGFzcyBOb2RlQ2hlY2tNZXRhQ2xhc3MoQUJDTWV0YSk6CisgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBBQkNNZXRhLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlaW1wb3J0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmU1MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVpbXBvcnQucHkKQEAgLTAsMCArMSwzMSBAQAorIiIiY2hlY2sgcmVpbXBvcnQKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHByaW50X2Z1bmN0aW9uCisKKyMgcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QsdW5ncm91cGVkLWltcG9ydHMsd3JvbmctaW1wb3J0LXBvc2l0aW9uLGltcG9ydC1vdXRzaWRlLXRvcGxldmVsCitpbXBvcnQgb3MKK2Zyb20gb3MucGF0aCBpbXBvcnQgam9pbiwgZXhpc3RzCitpbXBvcnQgb3MgICMgW3JlaW1wb3J0ZWRdCitpbXBvcnQgcmUgYXMgX3JlCisKK19fcmV2aXNpb25fXyA9IDAKK19yZS5tYXRjaCgneW8nLCAnLionKQorCitpZiBfX3JldmlzaW9uX186CisgICAgcHJpbnQob3MpCisgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBleGlzdHMgICMgW3JlaW1wb3J0ZWRdCisgICAgcHJpbnQoam9pbiwgZXhpc3RzKQorCitkZWYgZnVuYyh5b29vKToKKyAgICAiIiJyZWltcG9ydCBpbiBkaWZmZXJlbnQgc2NvcGUiIiIKKyAgICBpbXBvcnQgb3MgYXMgYXNzICAjIFtyZWltcG9ydGVkXQorICAgIGFzcy5yZW1vdmUoeW9vbykKKyAgICBpbXBvcnQgcmUgICMgW3JlaW1wb3J0ZWRdCisgICAgcmUuY29tcGlsZSgnLionKQorCitpZiAxOiAjIHB5bGludDogZGlzYWJsZT11c2luZy1jb25zdGFudC10ZXN0CisgICAgaW1wb3J0IHN5cworICAgIHByaW50KHN5cy5tb2R1bGVzKQorZWxzZToKKyAgICBwcmludCgnYmxhJykKKyAgICBpbXBvcnQgc3lzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVpbXBvcnQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdkMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlaW1wb3J0LnR4dApAQCAtMCwwICsxLDQgQEAKK3JlaW1wb3J0ZWQ6ODowOjpSZWltcG9ydCAnb3MnIChpbXBvcnRlZCBsaW5lIDYpCityZWltcG9ydGVkOjE2OjQ6OlJlaW1wb3J0ICdleGlzdHMnIChpbXBvcnRlZCBsaW5lIDcpCityZWltcG9ydGVkOjIxOjQ6ZnVuYzpSZWltcG9ydCAnb3MnIChpbXBvcnRlZCBsaW5lIDYpCityZWltcG9ydGVkOjIzOjQ6ZnVuYzpSZWltcG9ydCAncmUnIChpbXBvcnRlZCBsaW5lIDkpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVpbXBvcnRlZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWltcG9ydGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjA3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVpbXBvcnRlZC5weQpAQCAtMCwwICsxLDQ0IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx1bnVzZWQtaW1wb3J0LGltcG9ydC1lcnJvciwgd2lsZGNhcmQtaW1wb3J0LHVudXNlZC13aWxkY2FyZC1pbXBvcnQscmVkZWZpbmVkLWJ1aWx0aW4sbm8tbmFtZS1pbi1tb2R1bGUsdW5ncm91cGVkLWltcG9ydHMsd3JvbmctaW1wb3J0LW9yZGVyDQorDQorZnJvbSB0aW1lIGltcG9ydCBzbGVlcCwgc2xlZXAgICMgW3JlaW1wb3J0ZWRdDQorZnJvbSBsYWxhIGltcG9ydCBtaXNzaW5nLCBtaXNzaW5nICAjIFtyZWltcG9ydGVkXQ0KKw0KK2ltcG9ydCBtaXNzaW5nMQ0KK2ltcG9ydCBtaXNzaW5nMSAjIFtyZWltcG9ydGVkXQ0KKw0KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlDQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGRlcXVlICMgW3JlaW1wb3J0ZWRdDQorDQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QNCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgTm90T3JkZXJlZERpY3QNCisNCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgKg0KK2Zyb20gb3MgaW1wb3J0ICoNCisNCisjIHB5bGludDogZGlzYWJsZT1taXNwbGFjZWQtZnV0dXJlDQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIHByaW50X2Z1bmN0aW9uDQorDQoraW1wb3J0IHN5cw0KKw0KK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUNCitmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgICMgW3JlaW1wb3J0ZWRdDQorDQorZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMNCitpbXBvcnQgZW1haWwuZW5jb2RlcnMgICMgW3JlaW1wb3J0ZWRdDQorDQoraW1wb3J0IHN5cyAgIyBbcmVpbXBvcnRlZF0gICNweWxpbnQ6IGRpc2FibGU9dW5ncm91cGVkLWltcG9ydHMsd3JvbmctaW1wb3J0LW9yZGVyDQorX19yZXZpc2lvbl9fID0gMA0KKw0KK2RlZiBub19yZWltcG9ydCgpOg0KKyAgICAiIiJkb2NzdHJpbmciIiINCisgICAgaW1wb3J0IG9zICAjcHlsaW50OiBkaXNhYmxlPWltcG9ydC1vdXRzaWRlLXRvcGxldmVsDQorICAgIHByaW50KG9zKQ0KKw0KKw0KK2RlZiByZWltcG9ydCgpOg0KKyAgICAiIiJUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGEgcmVpbXBvcnQuIiIiDQorICAgIGltcG9ydCBzeXMgICMgW3JlaW1wb3J0ZWQscmVkZWZpbmVkLW91dGVyLW5hbWVdICNweWxpbnQ6IGRpc2FibGU9aW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwNCisgICAgZGVsIHN5cw0KKw0KKw0KK2RlbCBzeXMsIEVsZW1lbnRUcmVlLCB4bWwuZXRyZWUuRWxlbWVudFRyZWUsIGVuY29kZXJzLCBlbWFpbC5lbmNvZGVycw0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWltcG9ydGVkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZWltcG9ydGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ3MDEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlaW1wb3J0ZWQudHh0CkBAIC0wLDAgKzEsOSBAQAorcmVpbXBvcnRlZDozOjA6OlJlaW1wb3J0ICdzbGVlcCcgKGltcG9ydGVkIGxpbmUgMykKK3JlaW1wb3J0ZWQ6NDowOjpSZWltcG9ydCAnbWlzc2luZycgKGltcG9ydGVkIGxpbmUgNCkKK3JlaW1wb3J0ZWQ6NzowOjpSZWltcG9ydCAnbWlzc2luZzEnIChpbXBvcnRlZCBsaW5lIDYpCityZWltcG9ydGVkOjEwOjA6OlJlaW1wb3J0ICdkZXF1ZScgKGltcG9ydGVkIGxpbmUgOSkKK3JlaW1wb3J0ZWQ6MjQ6MDo6UmVpbXBvcnQgJ0VsZW1lbnRUcmVlJyAoaW1wb3J0ZWQgbGluZSAyMykKK3JlaW1wb3J0ZWQ6Mjc6MDo6UmVpbXBvcnQgJ2VtYWlsLmVuY29kZXJzJyAoaW1wb3J0ZWQgbGluZSAyNikKK3JlaW1wb3J0ZWQ6Mjk6MDo6UmVpbXBvcnQgJ3N5cycgKGltcG9ydGVkIGxpbmUgMjEpCityZWRlZmluZWQtb3V0ZXItbmFtZTo0MDo0OnJlaW1wb3J0OlJlZGVmaW5pbmcgbmFtZSAnc3lzJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDE2KQorcmVpbXBvcnRlZDo0MDo0OnJlaW1wb3J0OlJlaW1wb3J0ICdzeXMnIChpbXBvcnRlZCBsaW5lIDIxKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JlbmFtZWRfaW1wb3J0X2xvZ2dpbmdfbm90X2xhenkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVuYW1lZF9pbXBvcnRfbG9nZ2luZ19ub3RfbGF6eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGNhMWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlbmFtZWRfaW1wb3J0X2xvZ2dpbmdfbm90X2xhenkucHkKQEAgLTAsMCArMSwyMCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIG5vLW1lbWJlcgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorIyBNdWNrIHVwIHRoZSBuYW1lcyBpbiBhbiBlZmZvcnQgdG8gY29uZnVzZS4uLgoraW1wb3J0IGxvZ2dpbmcgYXMgcmVuYW1lZF9sb2dnaW5nCisKKworY2xhc3MgTG9nZ2VyOgorICAgICIiIkZha2UgbG9nZ2VyIiIiCisKKworbG9nZ2VyID0gcmVuYW1lZF9sb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK2Zha2VfbG9nZ2VyID0gTG9nZ2VyKCkKKworIyBTdGF0ZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGZsYWdnZWQKK3JlbmFtZWRfbG9nZ2luZy53YXJuaW5nKCclcywgJXMnICUgKDQsIDUpKSAgIyBbbG9nZ2luZy1ub3QtbGF6eV0KK2xvZ2dlci53YXJuaW5nKCclcycgJSA1KSAgIyBbbG9nZ2luZy1ub3QtbGF6eV0KKworIyBTdGF0ZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSBmbGFnZ2VkOgorZmFrZV9sb2dnZXIud2FybignJXMnICUgNSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZW5hbWVkX2ltcG9ydF9sb2dnaW5nX25vdF9sYXp5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZW5hbWVkX2ltcG9ydF9sb2dnaW5nX25vdF9sYXp5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjA1NzFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JlbmFtZWRfaW1wb3J0X2xvZ2dpbmdfbm90X2xhenkudHh0CkBAIC0wLDAgKzEsMiBAQAorbG9nZ2luZy1ub3QtbGF6eToxNjowOjpVc2UgbGF6eSAlIGZvcm1hdHRpbmcgaW4gbG9nZ2luZyBmdW5jdGlvbnMKK2xvZ2dpbmctbm90LWxhenk6MTc6MDo6VXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVwZWF0ZWRfa2V5d29yZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXBlYXRlZF9rZXl3b3JkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NmM1M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVwZWF0ZWRfa2V5d29yZC5weQpAQCAtMCwwICsxLDEzIEBACisiIiJDaGVjayB0aGF0IGEga2V5d29yZCBpcyBub3QgcmVwZWF0ZWQgaW4gYSBmdW5jdGlvbiBjYWxsDQorDQorVGhpcyBpcyBzb21laG93IHJlbGF0ZWQgdG8gcmVkdW5kYW50LWtleXdvcmQsIGJ1dCBpdCdzIG5vdCB0aGUgc2FtZS4NCisiIiINCisNCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lDQorDQorZGVmIHRlc3QoYSwgYik6DQorICAgIHJldHVybiBhLCBiDQorDQordGVzdCgxLCAyNCkNCit0ZXN0KDEsIGI9MjQsICoqe30pDQordGVzdCgxLCBiPTI0LCAqKnsnYic6IDI0fSkgIyBbcmVwZWF0ZWQta2V5d29yZF0NCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmVwZWF0ZWRfa2V5d29yZC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmVwZWF0ZWRfa2V5d29yZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjliMjNlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXBlYXRlZF9rZXl3b3JkLnR4dApAQCAtMCwwICsxIEBACityZXBlYXRlZC1rZXl3b3JkOjEzOjA6OkdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgJ2InIGluIGZ1bmN0aW9uIGNhbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXR1cm5faW5faW5pdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXR1cm5faW5faW5pdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBhYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JldHVybl9pbl9pbml0LnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsdXNlbGVzcy1yZXR1cm4sIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2NsYXNzIE15Q2xhc3Mob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKTogIyBbcmV0dXJuLWluLWluaXRdCisgICAgICAgIHJldHVybiAxCisKK2NsYXNzIE15Q2xhc3MyKG9iamVjdCk6CisgICAgIiIiZHVtbXkgY2xhc3MiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuCisKKworY2xhc3MgTXlDbGFzczMob2JqZWN0KToKKyAgICAiIiJkdW1teSBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCitjbGFzcyBNeUNsYXNzNShvYmplY3QpOgorICAgICIiImR1bW15IGNsYXNzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2FsbGFibGUgPSBsYW1iZGE6ICh5aWVsZCBOb25lKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JldHVybl9pbl9pbml0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXR1cm5faW5faW5pdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlY2MzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXR1cm5faW5faW5pdC50eHQKQEAgLTAsMCArMSBAQAorcmV0dXJuLWluLWluaXQ6NTo0Ok15Q2xhc3MuX19pbml0X186RXhwbGljaXQgcmV0dXJuIGluIF9faW5pdF9fCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3IvcmV0dXJuX291dHNpZGVfZnVuY3Rpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmV0dXJuX291dHNpZGVfZnVuY3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5ZGFmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXR1cm5fb3V0c2lkZV9mdW5jdGlvbi5weQpAQCAtMCwwICsxLDIgQEAKKyIiIlRoaXMgaXMgZ3JhbWF0aWNhbGx5IGNvcnJlY3QsIGJ1dCBpdCdzIHN0aWxsIGEgU3ludGF4RXJyb3IiIiIKK3JldHVybiAjIFtyZXR1cm4tb3V0c2lkZS1mdW5jdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXR1cm5fb3V0c2lkZV9mdW5jdGlvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmV0dXJuX291dHNpZGVfZnVuY3Rpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWU0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmV0dXJuX291dHNpZGVfZnVuY3Rpb24udHh0CkBAIC0wLDAgKzEgQEAKK3JldHVybi1vdXRzaWRlLWZ1bmN0aW9uOjI6MDo6UmV0dXJuIG91dHNpZGUgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjQ0ZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JldXNlZF9vdXRlcl9sb29wX3ZhcmlhYmxlLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyIiIlRlc3RzIGZvciByZWRlZmluaW5nIGFuIG91dGVyIGxvb3AgdmFyaWFibGUuIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitfX3JldmlzaW9uX18gPSAwCisKKyMgU2ltcGxlIG5lc3RlZCBsb29wCitmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOiAjW3JlZGVmaW5lZC1vdXRlci1uYW1lXQorICAgICAgICBwcmludChpKQorCisjIFdoZW4gb3V0ZXIgbG9vcCB1bnBhY2tzIGEgdHVwbGUKK2ZvciBpLCBpX2FnYWluIGluIGVudW1lcmF0ZShyYW5nZSgxMCkpOgorICAgIGZvciBpIGluIHJhbmdlKDEwKTogI1tyZWRlZmluZWQtb3V0ZXItbmFtZV0KKyAgICAgICAgcHJpbnQoaSwgaV9hZ2FpbikKKworIyBXaGVuIGlubmVyIGxvb3AgdW5wYWNrcyBhIHR1cGxlCitmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgZm9yIGksIGlfYWdhaW4gaW4gcmFuZ2UoMTApOiAjW3JlZGVmaW5lZC1vdXRlci1uYW1lXQorICAgICAgICBwcmludChpLCBpX2FnYWluKQorCisjIFdpdGggbmVzdGVkIHR1cGxlIHVucGFja3MKK2ZvciAoYSwgKGIsIGMpKSBpbiBbKDEsICgyLCAzKSldOgorICAgIGZvciBpLCBhIGluIHJhbmdlKDEwKTogI1tyZWRlZmluZWQtb3V0ZXItbmFtZV0KKyAgICAgICAgcHJpbnQoaSwgYSwgYiwgYykKKworIyBJZ25vcmVzIHdoZW4gaW4gZWxzZQorZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgIHByaW50KGkpCisgICAgaWYgaSA+IDU6CisgICAgICAgIGJyZWFrCitlbHNlOgorICAgIGZvciBpIGluIHJhbmdlKDIpOgorICAgICAgICBwcmludChpKQorCisjIElnbm9yZXMgZHVtbXkgdmFyaWFibGVzCitmb3IgXyBpbiByYW5nZSgxMCk6CisgICAgZm9yIF8gaW4gcmFuZ2UoMTApOgorICAgICAgICBwcmludCgiSGVsbG8iKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JldXNlZF9vdXRlcl9sb29wX3ZhcmlhYmxlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkZWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZS50eHQKQEAgLTAsMCArMSw0IEBACityZWRlZmluZWQtb3V0ZXItbmFtZTo3OjQ6OlJlZGVmaW5pbmcgbmFtZSAnaScgZnJvbSBvdXRlciBzY29wZSAobGluZSA2KQorcmVkZWZpbmVkLW91dGVyLW5hbWU6MTI6NDo6UmVkZWZpbmluZyBuYW1lICdpJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDExKQorcmVkZWZpbmVkLW91dGVyLW5hbWU6MTc6NDo6UmVkZWZpbmluZyBuYW1lICdpJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDE2KQorcmVkZWZpbmVkLW91dGVyLW5hbWU6MjI6NDo6UmVkZWZpbmluZyBuYW1lICdhJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDIxKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JldXNlZF9vdXRlcl9sb29wX3ZhcmlhYmxlX3B5My5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZV9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhYTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZV9weTMucHkKQEAgLTAsMCArMSw1IEBACisiIiJQeXRob24gPj0gMyB0ZXN0cyBmb3IgcmVkZWZpbmluZyBhbiBvdXRlciBsb29wJ3MgdmFyaWFibGUuIiIiCisKK2ZvciBpLCAqaiBpbiBbKDEsIDIsIDMsIDQpXToKKyAgICBmb3IgaiBpbiByYW5nZShpKTogI1tyZWRlZmluZWQtb3V0ZXItbmFtZV0KKyAgICAgICAgcHJpbnQoaikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvci9yZXVzZWRfb3V0ZXJfbG9vcF92YXJpYWJsZV9weTMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmV1c2VkX291dGVyX2xvb3BfdmFyaWFibGVfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmV1c2VkX291dGVyX2xvb3BfdmFyaWFibGVfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9yL3JldXNlZF9vdXRlcl9sb29wX3ZhcmlhYmxlX3B5My50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3IvcmV1c2VkX291dGVyX2xvb3BfdmFyaWFibGVfcHkzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2MzMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9yL3JldXNlZF9vdXRlcl9sb29wX3ZhcmlhYmxlX3B5My50eHQKQEAgLTAsMCArMSBAQAorcmVkZWZpbmVkLW91dGVyLW5hbWU6NDo0OjpSZWRlZmluaW5nIG5hbWUgJ2onIGZyb20gb3V0ZXIgc2NvcGUgKGxpbmUgMykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2VsZi9zZWxmX2Fzc2lnbmluZ192YXJpYWJsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zZWxmL3NlbGZfYXNzaWduaW5nX3ZhcmlhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjI3ODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2VsZi9zZWxmX2Fzc2lnbmluZ192YXJpYWJsZS5weQpAQCAtMCwwICsxLDI4IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCisjIHB5bGludDogZGlzYWJsZT11bnBhY2tpbmctbm9uLXNlcXVlbmNlLGF0dHJpYnV0ZS1kZWZpbmVkLW91dHNpZGUtaW5pdCxpbnZhbGlkLW5hbWUKKworY2xhc3MgQ2xhc3M6CisgICAgcGFzcworCitDTFMgPSBDbGFzcygpCitGSVJTVCA9IDEKKyMgTm90IGVub3VnaCB2YWx1ZXMgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZQorRklSU1QsIFNFQ09ORCA9IEZJUlNUCisjIE5vdCBlbm91Z2ggdmFsdWVzIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZQorRklSU1QgPSBGSVJTVCwgU0VDT05ECisjIE5vdCBlcXVpdmFsZW50IHRvIGEgc2VsZiBhc3NpZ25tZW50CitGSVJTVCA9IChGSVJTVCwgKQorIyBOb3QgYXNzaWduaW5nIHRvIGFuIGF0dHJpYnV0ZQorQ0xTLkZJUlNUID0gRklSU1QKKyMgTm90IGEgbmFtZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlCitGSVJTVCA9IENsYXNzKCkKK0ZJUlNUID0gRklSU1QgIyBbc2VsZi1hc3NpZ25pbmctdmFyaWFibGVdCitGSVJTVCwgU0VDT05EID0gRklSU1QsIENMUy5GSVJTVCAjIFtzZWxmLWFzc2lnbmluZy12YXJpYWJsZV0KKworCitGT08gPSAxCitGT08sID0gW0ZPT10KKworCitjbGFzcyBSZWRlZmluZWRNb2R1bGVMZXZlbDoKKyAgICBGT08gPSBGT08KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zZWxmL3NlbGZfYXNzaWduaW5nX3ZhcmlhYmxlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zZWxmL3NlbGZfYXNzaWduaW5nX3ZhcmlhYmxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTI2MmRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NlbGYvc2VsZl9hc3NpZ25pbmdfdmFyaWFibGUudHh0CkBAIC0wLDAgKzEsMiBAQAorc2VsZi1hc3NpZ25pbmctdmFyaWFibGU6MTk6MDo6QXNzaWduaW5nIHRoZSBzYW1lIHZhcmlhYmxlICdGSVJTVCcgdG8gaXRzZWxmCitzZWxmLWFzc2lnbmluZy12YXJpYWJsZToyMDowOjpBc3NpZ25pbmcgdGhlIHNhbWUgdmFyaWFibGUgJ0ZJUlNUJyB0byBpdHNlbGYKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zZWxmL3NlbGZfY2xzX2Fzc2lnbm1lbnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2VsZi9zZWxmX2Nsc19hc3NpZ25tZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjNiYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2VsZi9zZWxmX2Nsc19hc3NpZ25tZW50LnB5CkBAIC0wLDAgKzEsNDcgQEAKKyIiIldhcm5pbmcgYWJvdXQgYXNzaWduaW5nIHNlbGYvY2xzIHZhcmlhYmxlLiIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgRm9vKG9iamVjdCk6CisgICAgIiIiQ2xhc3Mgd2l0aCBtZXRob2RzIHRoYXQgY2hlY2sgZm9yIHNlbGYvY2xzIGFzc2lnbm1lbnQiIiIKKworICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtYXJndW1lbnQsbm8tc2VsZi11c2UKKyAgICBkZWYgc2VsZl9mb28oYmFyXyk6CisgICAgICAgICIiIkluc3RhbmNlIG1ldGhvZCwgc2hvdWxkIHdhcm4gZm9yIGJhciIiIgorICAgICAgICBiYXJfID0gMTAgICMgW3NlbGYtY2xzLWFzc2lnbm1lbnRdCisKKyAgICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICAgIGRlZiBzZWxmX2Zvb2ZvbyhzZWxmLCBsYWxhKToKKyAgICAgICAgIiIiSW5zdGFuY2UgbWV0aG9kLCBzaG91bGQgd2FybiBmb3Igc2VsZiIiIgorICAgICAgICBzZWxmID0gbGFsYSAgIyBbc2VsZi1jbHMtYXNzaWdubWVudF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjbHNfZm9vKGNscyk6CisgICAgICAgICIiIkNsYXNzIG1ldGhvZCwgc2hvdWxkIHdhcm4gZm9yIGNscyIiIgorICAgICAgICBjbHMgPSAndGFkYScgICMgW3NlbGYtY2xzLWFzc2lnbm1lbnRdCisKKyAgICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHN0YXRpY19mb28obGFsYSk6CisgICAgICAgICIiIlN0YXRpYyBtZXRob2QsIG5vIHdhcm5pbmdzIiIiCisgICAgICAgIGxhbGEgPSAxMAorCisKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorZGVmIGZyZWVfZm9vKGJhcl8sIGxhbGEpOgorICAgICIiIkZyZWUgZnVuY3Rpb24sIG5vIHdhcm5pbmdzIiIiCisgICAgYmFyXyA9IGxhbGEKKworCitjbGFzcyBUZXN0Tm9uTG9jYWw6CisgICAgIiIiVGVzdCBjbGFzcyBmb3Igbm9ubG9jYWwgYXNzaWdubWVudCBvZiBzZWxmIiIiCisKKyAgICBkZWYgZnVuY3Rpb24oc2VsZiwgcGFyYW0pOgorICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIHVzZXMgbm9ubG9jYWwgdG8gcmVhc3NpZ24gc2VsZiIiIgorCisgICAgICAgIGRlZiBfc2V0X3BhcmFtKHBhcmFtKToKKyAgICAgICAgICAgIG5vbmxvY2FsIHNlbGYKKyAgICAgICAgICAgIHNlbGYgPSBwYXJhbSAgIyBbc2VsZi1jbHMtYXNzaWdubWVudF0KKworICAgICAgICBfc2V0X3BhcmFtKHBhcmFtKQorICAgICAgICByZXR1cm4gc2VsZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3NlbGYvc2VsZl9jbHNfYXNzaWdubWVudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2VsZi9zZWxmX2Nsc19hc3NpZ25tZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIyY2EyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NlbGYvc2VsZl9jbHNfYXNzaWdubWVudC50eHQKQEAgLTAsMCArMSw0IEBACitzZWxmLWNscy1hc3NpZ25tZW50OjExOjg6Rm9vLnNlbGZfZm9vOkludmFsaWQgYXNzaWdubWVudCB0byBiYXJfIGluIG1ldGhvZAorc2VsZi1jbHMtYXNzaWdubWVudDoxNjo4OkZvby5zZWxmX2Zvb2ZvbzpJbnZhbGlkIGFzc2lnbm1lbnQgdG8gc2VsZiBpbiBtZXRob2QKK3NlbGYtY2xzLWFzc2lnbm1lbnQ6MjE6ODpGb28uY2xzX2ZvbzpJbnZhbGlkIGFzc2lnbm1lbnQgdG8gY2xzIGluIG1ldGhvZAorc2VsZi1jbHMtYXNzaWdubWVudDo0NDoxMjpUZXN0Tm9uTG9jYWwuZnVuY3Rpb24uX3NldF9wYXJhbTpJbnZhbGlkIGFzc2lnbm1lbnQgdG8gc2VsZiBpbiBtZXRob2QKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaWduYXR1cmVfZGlmZmVycy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaWduYXR1cmVfZGlmZmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGY4MGNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpZ25hdHVyZV9kaWZmZXJzLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nLCBuby1zZWxmLXVzZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgQWJjZChvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFhcmcgPSBGYWxzZQorCisgICAgZGVmIGFiY2Qoc2VsZiwgYWFhPTEsIGJiYmI9Tm9uZSk6CisgICAgICAgIHJldHVybiBhYWEsIGJiYmIKKworICAgIGRlZiBhcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFhcmcgPSBUcnVlCisKKworY2xhc3MgQ2RlZihBYmNkKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhYWEpOgorICAgICAgICBBYmNkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuYWFhID0gYWFhCisKKyAgICBkZWYgYWJjZChzZWxmLCBhYWEsIGJiYmI9Tm9uZSk6ICMgW3NpZ25hdHVyZS1kaWZmZXJzXQorICAgICAgICByZXR1cm4gYWFhLCBiYmJiCisKKworY2xhc3MgR2hpaihBYmNkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWFhKToKKyAgICAgICAgQWJjZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmFhYSA9IGFhYQorCisgICAgZGVmIGFiY2Qoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGEgbWV0aG9kIHdpdGggdmFyaWFkaWNzIGRvZXMgbm90IHRyaWdnZXIgdGhlIHdhcm5pbmciIiIKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuYWJjZCgqYXJncywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2lnbmF0dXJlX2RpZmZlcnMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpZ25hdHVyZV9kaWZmZXJzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgxOTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpZ25hdHVyZV9kaWZmZXJzLnR4dApAQCAtMCwwICsxIEBACitzaWduYXR1cmUtZGlmZmVyczoyMTo0OkNkZWYuYWJjZDpTaWduYXR1cmUgZGlmZmVycyBmcm9tIG92ZXJyaWRkZW4gJ2FiY2QnIG1ldGhvZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmaWFibGVfY29uZGl0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmaWFibGVfY29uZGl0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYmYzNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZpYWJsZV9jb25kaXRpb24ucHkKQEAgLTAsMCArMSwzNiBAQAorIiIiVGVzdCB0aGF0IGJvb2xlYW4gY29uZGl0aW9ucyBjYW4gYmUgc2ltcGxpZmllZCIiIgorIyBweWxpbnQ6IGRpc2FibGU9cG9pbnRsZXNzLXN0YXRlbWVudAorCisKK2RlZiBmdW5jKF8pOgorICAgICIiIlBvaW50bGVzcyBmdW5jdGlvbiIiIgorCisKK0NPTlNUQU5UID0gMTAwCitPVEhFUiA9IDIwMAorCisjIFNpbXBsaWZpZXMgYW55IGJvb2xlYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGNvZXJjZWQgaW50byBhIFRydWUvRmFsc2UgdmFsdWUKK2Jvb2woQ09OU1RBTlQgb3IgRmFsc2UpICAjIFtzaW1wbGlmaWFibGUtY29uZGl0aW9uXQorYXNzZXJ0IENPTlNUQU5UIG9yIEZhbHNlICAjIFtzaW1wbGlmaWFibGUtY29uZGl0aW9uXQoraWYgQ09OU1RBTlQgYW5kIFRydWU6ICAjIFtzaW1wbGlmaWFibGUtY29uZGl0aW9uXQorICAgIHBhc3MKK2VsaWYgQ09OU1RBTlQgYW5kIFRydWU6ICAjIFtzaW1wbGlmaWFibGUtY29uZGl0aW9uXQorICAgIHBhc3MKK3doaWxlIENPTlNUQU5UIGFuZCBUcnVlOiAgIyBbc2ltcGxpZmlhYmxlLWNvbmRpdGlvbl0KKyAgICBicmVhaworMSBpZiBDT05TVEFOVCBvciBGYWxzZSBlbHNlIDIgICMgW3NpbXBsaWZpYWJsZS1jb25kaXRpb25dCit6ID0gW3ggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHggb3IgRmFsc2VdICAjIFtzaW1wbGlmaWFibGUtY29uZGl0aW9uXQorCisjIFNpbXBsaWZpZXMgcmVjdXJzaXZlbHkKK2Fzc2VydCBDT05TVEFOVCBvciAoVHJ1ZSBhbmQgRmFsc2UpICAjIFtzaW1wbGlmaWFibGUtY29uZGl0aW9uXQorYXNzZXJ0IFRydWUgYW5kIENPTlNUQU5UIGFuZCBPVEhFUiAgIyBbc2ltcGxpZmlhYmxlLWNvbmRpdGlvbl0KK2Fzc2VydCAoQ09OU1RBTlQgb3IgRmFsc2UpIGFuZCAoT1RIRVIgb3IgVHJ1ZSkgICMgW3NpbXBsaWZpYWJsZS1jb25kaXRpb25dCisKKyMgV2lsbCB0cnkgdG8gaW5mZXIgdGhlIHRydXRoaW5lc3Mgb2YgYW4gZXhwcmVzc2lvbiBhcyBsb25nIGFzIGl0IGRvZXNuJ3QgY29udGFpbiBhbnkgdmFyaWFibGVzCithc3NlcnQgW10gb3IgQ09OU1RBTlQgICMgW3NpbXBsaWZpYWJsZS1jb25kaXRpb25dCithc3NlcnQge30gb3IgQ09OU1RBTlQgICMgW3NpbXBsaWZpYWJsZS1jb25kaXRpb25dCisKKyMgRXhwcmVzc2lvbnMgbm90IGluIG9uZSBvZiB0aGUgYWJvdmUgc2l0dWF0aW9ucyB3aWxsIG5vdCBlbWl0IGEgbWVzc2FnZQorQ09OU1RBTlQgb3IgVHJ1ZQorYm9vbChDT05TVEFOVCBvciBPVEhFUikKK2Jvb2woZnVuYyhDT05TVEFOVCBvciBUcnVlKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZmlhYmxlX2NvbmRpdGlvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZpYWJsZV9jb25kaXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTUyYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZpYWJsZV9jb25kaXRpb24udHh0CkBAIC0wLDAgKzEsMTIgQEAKK3NpbXBsaWZpYWJsZS1jb25kaXRpb246MTM6NTo6Qm9vbGVhbiBjb25kaXRpb24gJ0NPTlNUQU5UIG9yIEZhbHNlJyBtYXkgYmUgc2ltcGxpZmllZCB0byAnQ09OU1RBTlQnCitzaW1wbGlmaWFibGUtY29uZGl0aW9uOjE0Ojc6OkJvb2xlYW4gY29uZGl0aW9uICdDT05TVEFOVCBvciBGYWxzZScgbWF5IGJlIHNpbXBsaWZpZWQgdG8gJ0NPTlNUQU5UJworc2ltcGxpZmlhYmxlLWNvbmRpdGlvbjoxNTozOjpCb29sZWFuIGNvbmRpdGlvbiAnQ09OU1RBTlQgYW5kIFRydWUnIG1heSBiZSBzaW1wbGlmaWVkIHRvICdDT05TVEFOVCcKK3NpbXBsaWZpYWJsZS1jb25kaXRpb246MTc6NTo6Qm9vbGVhbiBjb25kaXRpb24gJ0NPTlNUQU5UIGFuZCBUcnVlJyBtYXkgYmUgc2ltcGxpZmllZCB0byAnQ09OU1RBTlQnCitzaW1wbGlmaWFibGUtY29uZGl0aW9uOjE5OjY6OkJvb2xlYW4gY29uZGl0aW9uICdDT05TVEFOVCBhbmQgVHJ1ZScgbWF5IGJlIHNpbXBsaWZpZWQgdG8gJ0NPTlNUQU5UJworc2ltcGxpZmlhYmxlLWNvbmRpdGlvbjoyMTo1OjpCb29sZWFuIGNvbmRpdGlvbiAnQ09OU1RBTlQgb3IgRmFsc2UnIG1heSBiZSBzaW1wbGlmaWVkIHRvICdDT05TVEFOVCcKK3NpbXBsaWZpYWJsZS1jb25kaXRpb246MjI6Mjk6OkJvb2xlYW4gY29uZGl0aW9uICd4IG9yIEZhbHNlJyBtYXkgYmUgc2ltcGxpZmllZCB0byAneCcKK3NpbXBsaWZpYWJsZS1jb25kaXRpb246MjU6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ0NPTlNUQU5UIG9yIFRydWUgYW5kIEZhbHNlJyBtYXkgYmUgc2ltcGxpZmllZCB0byAnQ09OU1RBTlQnCitzaW1wbGlmaWFibGUtY29uZGl0aW9uOjI2Ojc6OkJvb2xlYW4gY29uZGl0aW9uICdUcnVlIGFuZCBDT05TVEFOVCBhbmQgT1RIRVInIG1heSBiZSBzaW1wbGlmaWVkIHRvICdDT05TVEFOVCBhbmQgT1RIRVInCitzaW1wbGlmaWFibGUtY29uZGl0aW9uOjI3Ojc6OkJvb2xlYW4gY29uZGl0aW9uICcoQ09OU1RBTlQgb3IgRmFsc2UpIGFuZCAoT1RIRVIgb3IgVHJ1ZSknIG1heSBiZSBzaW1wbGlmaWVkIHRvICdDT05TVEFOVCcKK3NpbXBsaWZpYWJsZS1jb25kaXRpb246MzA6Nzo6Qm9vbGVhbiBjb25kaXRpb24gJ1tdIG9yIENPTlNUQU5UJyBtYXkgYmUgc2ltcGxpZmllZCB0byAnQ09OU1RBTlQnCitzaW1wbGlmaWFibGUtY29uZGl0aW9uOjMxOjc6OkJvb2xlYW4gY29uZGl0aW9uICd7fSBvciBDT05TVEFOVCcgbWF5IGJlIHNpbXBsaWZpZWQgdG8gJ0NPTlNUQU5UJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmaWFibGVfaWZfZXhwcmVzc2lvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZmlhYmxlX2lmX2V4cHJlc3Npb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmZGY4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZmlhYmxlX2lmX2V4cHJlc3Npb24ucHkKQEAgLTAsMCArMSwyNyBAQAorIiIiVGVzdCB0aGF0IHNvbWUgaWYgZXhwcmVzc2lvbnMgY2FuIGJlIHNpbXBsaWZpZWQuIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBpbnZhbGlkLW5hbWUKKworCitkZWYgdGVzdF9zaW1wbGlmaWFibGVfMShhcmcpOgorICAgICMgU2ltcGxlIHRlc3QgdGhhdCBjYW4gYmUgcmVwbGFjZWQgYnkgYm9vbChhcmcpCisgICAgcmV0dXJuIFRydWUgaWYgYXJnIGVsc2UgRmFsc2UgIyBbc2ltcGxpZmlhYmxlLWlmLWV4cHJlc3Npb25dCisKK2RlZiB0ZXN0X3NpbXBsaWZpYWJsZV8yKGFyZyk6CisgICAgIyBTaW1wbGUgdGVzdCB0aGF0IGNhbiBiZSByZXBsYWNlZCBieSBub3QgYXJnCisgICAgcmV0dXJuIEZhbHNlIGlmIGFyZyBlbHNlIFRydWUgIyBbc2ltcGxpZmlhYmxlLWlmLWV4cHJlc3Npb25dCisKK2RlZiB0ZXN0X3NpbXBsaWZpYWJsZV8zKGFyZyk6CisgICAgIyBTaW1wbGUgdGVzdCB0aGF0IGNhbiBiZSByZXBsYWNlZCBieSBhcmcgPT0gMQorICAgIHJldHVybiBUcnVlIGlmIGFyZyA9PSAxIGVsc2UgRmFsc2UgIyBbc2ltcGxpZmlhYmxlLWlmLWV4cHJlc3Npb25dCisKK2RlZiB0ZXN0X3NpbXBsaWZpYWJsZV80KGFyZyk6CisgICAgIyBTaW1wbGUgdGVzdCB0aGF0IGNhbiBiZSByZXBsYWNlZCBieSBub3QgKGFyZyA9PSAxKQorICAgIHJldHVybiBGYWxzZSBpZiBhcmcgPT0gMSBlbHNlIFRydWUgIyBbc2ltcGxpZmlhYmxlLWlmLWV4cHJlc3Npb25dCisKK2RlZiB0ZXN0X25vdF9zaW1wbGlmaWFibGUoYXJnKToKKyAgICB4ID0gVHJ1ZSBpZiBhcmcgZWxzZSBUcnVlCisgICAgeSA9IDAgaWYgYXJnIGVsc2UgMQorICAgIHQgPSBGYWxzZSBpZiBhcmcgIT0gMSBlbHNlIEZhbHNlCisgICAgdDIgPSBOb25lIGlmIGFyZyA+IDMgZWxzZSBGYWxzZQorICAgIHJldHVybiB4LCB5LCB0LCB0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmaWFibGVfaWZfZXhwcmVzc2lvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZpYWJsZV9pZl9leHByZXNzaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzJkZjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmaWFibGVfaWZfZXhwcmVzc2lvbi50eHQKQEAgLTAsMCArMSw0IEBACitzaW1wbGlmaWFibGUtaWYtZXhwcmVzc2lvbjo4OjExOnRlc3Rfc2ltcGxpZmlhYmxlXzE6VGhlIGlmIGV4cHJlc3Npb24gY2FuIGJlIHJlcGxhY2VkIHdpdGggJ2Jvb2wodGVzdCknCitzaW1wbGlmaWFibGUtaWYtZXhwcmVzc2lvbjoxMjoxMTp0ZXN0X3NpbXBsaWZpYWJsZV8yOlRoZSBpZiBleHByZXNzaW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoICdub3QgdGVzdCcKK3NpbXBsaWZpYWJsZS1pZi1leHByZXNzaW9uOjE2OjExOnRlc3Rfc2ltcGxpZmlhYmxlXzM6VGhlIGlmIGV4cHJlc3Npb24gY2FuIGJlIHJlcGxhY2VkIHdpdGggJ3Rlc3QnCitzaW1wbGlmaWFibGUtaWYtZXhwcmVzc2lvbjoyMDoxMTp0ZXN0X3NpbXBsaWZpYWJsZV80OlRoZSBpZiBleHByZXNzaW9uIGNhbiBiZSByZXBsYWNlZCB3aXRoICdub3QgdGVzdCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZmlhYmxlX2lmX3N0YXRlbWVudC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZmlhYmxlX2lmX3N0YXRlbWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRjOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmaWFibGVfaWZfc3RhdGVtZW50LnB5CkBAIC0wLDAgKzEsMTQ2IEBACisiIiJUZXN0IHRoYXQgc29tZSBpZiBzdGF0ZW1lbnQgdGVzdHMgY2FuIGJlIHNpbXBsaWZpZWQuIiIiDQorDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZSwgbm8tZWxzZS1yZXR1cm4sIGFyZ3VtZW50cy1vdXQtb2Ytb3JkZXINCisNCisNCitkZWYgdGVzdF9zaW1wbGlmaWFibGVfMShhcmcpOg0KKyAgICAjIFNpbXBsZSB0ZXN0IHRoYXQgY2FuIGJlIHJlcGxhY2VkIGJ5IGJvb2woYXJnKQ0KKyAgICBpZiBhcmc6ICMgW3NpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnRdDQorICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICBlbHNlOg0KKyAgICAgICAgcmV0dXJuIEZhbHNlDQorDQorDQorZGVmIHRlc3Rfc2ltcGxpZmlhYmxlXzIoYXJnLCBhcmcyKToNCisgICAgIyBDYW4gYmUgcmVkdWNlZCB0byBib29sKGFyZyBhbmQgbm90IGFyZzIpDQorICAgIGlmIGFyZyBhbmQgbm90IGFyZzI6ICMgW3NpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnRdDQorICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICBlbHNlOg0KKyAgICAgICAgcmV0dXJuIEZhbHNlDQorDQorDQorZGVmIHRlc3Rfc2ltcGxpZmlhYmxlXzMoYXJnLCBhcmcyKToNCisgICAgIyBDYW4gYmUgcmVkdWNlZCB0byBib29sKGFyZyBhbmQgbm90IGFyZzIpDQorICAgIGlmIGFyZyBhbmQgbm90IGFyZzI6ICMgW3NpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnRdDQorICAgICAgICB2YXIgPSBUcnVlDQorICAgIGVsc2U6DQorICAgICAgICB2YXIgPSBGYWxzZQ0KKyAgICByZXR1cm4gdmFyDQorDQorDQorZGVmIHRlc3Rfc2ltcGxpZmlhYmxlXzQoYXJnKToNCisgICAgaWYgYXJnOg0KKyAgICAgICAgdmFyID0gVHJ1ZQ0KKyAgICBlbHNlOg0KKyAgICAgICAgaWYgYXJnID09ICJhcmcxIjogIyBbc2ltcGxpZmlhYmxlLWlmLXN0YXRlbWVudF0NCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICAgICAgZWxzZToNCisgICAgICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgcmV0dXJuIHZhcg0KKw0KKw0KK2RlZiB0ZXN0X25vdF9uZWNlc3NhcmlseV9zaW1wbGlmaWFibGVfMShhcmcsIGFyZzIpOg0KKyAgICAjIENhbiBiZSByZWR1Y2VkIHRvIGJvb2wobm90IGFyZyBhbmQgbm90IGFyZzIpIG9yIHRvDQorICAgICMgYG5vdCBhbGwoTilgLCB3aGljaCBpcyBhIGJpdCBoYXJkZXIgdG8gdW5kZXJzdGFuZA0KKyAgICAjIHRoYW4gYGFueShOKWAgd2hlbiB2YXIgc2hvdWxkIGJlIEZhbHNlLg0KKyAgICBpZiBhcmcgb3IgYXJnMjoNCisgICAgICAgIHZhciA9IEZhbHNlDQorICAgIGVsc2U6DQorICAgICAgICB2YXIgPSBUcnVlDQorICAgIHJldHVybiB2YXINCisNCisNCitkZWYgdGVzdF9ub3RfbmVjZXNzYXJpbHlfc2ltcGxpZmlhYmlsZV8yKGFyZyk6DQorICAgICMgVGhpcyBjb3VsZCB0aGVvcmV0aWNhbGx5IGJlIHJlZHVjZWQgdG8gYG5vdCBhcmcgb3IgYXJnID4gM2ANCisgICAgIyBidXQgdGhlIG5ldCByZXN1bHQgaXMgdGhhdCBub3cgdGhlIGNvbmRpdGlvbiBpcyBoYXJkZXIgdG8gdW5kZXJzdGFuZCwNCisgICAgIyBiZWNhdXNlIGl0IHJlcXVpcmVzIHVuZGVyc3RhbmRpbmcgb2YgYW4gZXh0cmEgY2xhdXNlOg0KKyAgICAjICAgKiBmaXJzdCwgdGhlcmUgaXMgdGhlIG5lZ2F0aW9uIG9mIHRydXRobmVzcyB3aXRoIGBub3QgYXJnYA0KKyAgICAjICAgKiB0aGUgc2Vjb25kIGNsYXVzZSBpcyBgYXJnID4gM2AsIHdoaWNoIG9jY3VycyB3aGVuIGFyZyBoYXMgYQ0KKyAgICAjICAgICBhIHRydXRoIHZhbHVlLCBidXQgaXQgaW1wbGllcyB0aGF0IGBhcmcgPiAzYCBpcyBlcXVpdmFsZW50DQorICAgICMgICAgIHdpdGggYGFyZyBhbmQgYXJnID4gM2AsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgbXVzdA0KKyAgICAjICAgICB0aGluayBhYm91dCB0aGlzIGFzc3VtcHRpb24gd2hlbiBldmFsdWF0aW5nIGBhcmcgPiAzYC4NCisgICAgIyAgICAgVGhlIG9yaWdpbmFsIGZvcm0gaXMgZWFzaWVyIHRvIGdyYXNwLg0KKyAgICBpZiBhcmcgYW5kIGFyZyA8PSAzOg0KKyAgICAgICAgcmV0dXJuIEZhbHNlDQorICAgIGVsc2U6DQorICAgICAgICByZXR1cm4gVHJ1ZQ0KKw0KKw0KK2RlZiB0ZXN0X25vdF9zaW1wbGlmaWFibGVfMyhhcmcpOg0KKyAgICBpZiBhcmc6DQorICAgICAgICB0ZXN0X25vdF9uZWNlc3NhcmlseV9zaW1wbGlmaWFiaWxlXzIoYXJnKQ0KKyAgICAgICAgdGVzdF9ub3RfbmVjZXNzYXJpbHlfc2ltcGxpZmlhYmxlXzEoYXJnLCBhcmcpDQorICAgICAgICByZXR1cm4gRmFsc2UNCisgICAgZWxzZToNCisgICAgICAgIGlmIGFyZyA8IDM6DQorICAgICAgICAgICAgdGVzdF9zaW1wbGlmaWFibGVfMyhhcmcsIDQyKQ0KKyAgICAgICAgcmV0dXJuIFRydWUNCisNCisNCitkZWYgdGVzdF9ub3Rfc2ltcGxpZmlhYmxlXzQoYXJnKToNCisgICAgIyBOb3QgaW50ZXJlc3RlZCBpbiBtdWx0aXBsZSBlbGlmcw0KKyAgICBpZiBhcmcgPT0gImFueSI6DQorICAgICAgICByZXR1cm4gVHJ1ZQ0KKyAgICBlbGlmIHRlc3Rfbm90X3NpbXBsaWZpYWJsZV8zKGFyZykgPT0gYXJnOg0KKyAgICAgICAgcmV0dXJuIFRydWUNCisgICAgZWxzZToNCisgICAgICAgIHJldHVybiBGYWxzZQ0KKw0KKw0KK2RlZiB0ZXN0X25vdF9zaW1wbGlmaWFibGVfNShhcmcpOg0KKyAgICAjIERpZmZlcmVudCBhY3Rpb25zIGluIGVhY2ggYnJhbmNoDQorICAgIGlmIGFyZyA9PSAiYW55IjoNCisgICAgICAgIHJldHVybiBUcnVlDQorICAgIGVsc2U6DQorICAgICAgICB2YXIgPSA0Mg0KKyAgICByZXR1cm4gdmFyDQorDQorDQorZGVmIHRlc3Rfbm90X3NpbXBsaWZpYWJsZV82KGFyZyk6DQorICAgICMgRGlmZmVyZW50IGFjdGlvbnMgaW4gZWFjaCBicmFuY2gNCisgICAgaWYgYXJnID09ICJhbnkiOg0KKyAgICAgICAgdmFyID0gNDINCisgICAgZWxzZToNCisgICAgICAgIHJldHVybiBUcnVlDQorICAgIHJldHVybiB2YXINCisNCitkZWYgdGVzdF9ub3Rfc2ltcGxpZmlhYmxlXzcoYXJnKToNCisgICAgIyBSZXR1cm5pbmcgc29tZXRoaW5nIGRpZmZlcmVudA0KKyAgICBpZiBhcmcgPT0gImFueSI6DQorICAgICAgICByZXR1cm4gNA0KKyAgICBlbHNlOg0KKyAgICAgICAgcmV0dXJuIDUNCisNCisNCitkZWYgdGVzdF9ub3Rfc2ltcGxpZmlhYmxlXzgoYXJnKToNCisgICAgIyBPbmx5IG9uZSBvZiB0aGUgYnJhbmNoIHJldHVybnMgc29tZXRoaW5nIGJvb2xlYW4NCisgICAgaWYgYXJnID09ICJhbnkiOg0KKyAgICAgICAgcmV0dXJuIFRydWUNCisgICAgZWxzZToNCisgICAgICAgIHJldHVybiAwDQorDQorDQorZGVmIHRlc3Rfbm90X3NpbXBsaWZpYWJsZV85KCk6DQorICAgICMgTm90IHRoZSBzYW1lIHRhcmdldHMNCisgICAgZmlyc3QgPSBUcnVlDQorICAgIHNlY29uZCA9IDENCisgICAgdGhpcmQgPSBbMV0NCisgICAgZm91cnRoID0gRmFsc2UNCisgICAgZmlmdGggPSBGYWxzZQ0KKw0KKyAgICBpZiBmaXJzdCBhbmQgc2Vjb25kIGluIHRoaXJkOg0KKyAgICAgICAgZm91cnRoID0gVHJ1ZQ0KKyAgICBlbHNlOg0KKyAgICAgICAgZmlmdGggPSBUcnVlDQorICAgIHJldHVybiBmb3VydGggKyBmaWZ0aA0KKw0KKw0KK2RlZiB0ZXN0X25vdF9zaW1wbGlmaWFibGVfMTAoKToNCisgICAgIyBTdWJzY3JpcHRzIGFyZSBub3QgY29uc2lkZXJlZA0KKyAgICBvYmplY3RfdHlwZSA9ICdyZWFkJw0KKyAgICBmaWx0ZXJfa3dhcmdzID0ge30NCisgICAgaWYgb2JqZWN0X3R5cGUgPT0gJ3JlYWQnOg0KKyAgICAgICAgZmlsdGVyX2t3YXJnc1snYSddID0gVHJ1ZQ0KKyAgICBlbHNlOg0KKyAgICAgICAgZmlsdGVyX2t3YXJnc1snYiddID0gVHJ1ZQ0KKyAgICByZXR1cm4gZmlsdGVyX2t3YXJncw0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZmlhYmxlX2lmX3N0YXRlbWVudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZpYWJsZV9pZl9zdGF0ZW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjFmNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZpYWJsZV9pZl9zdGF0ZW1lbnQudHh0CkBAIC0wLDAgKzEsNCBAQAorc2ltcGxpZmlhYmxlLWlmLXN0YXRlbWVudDo4OjQ6dGVzdF9zaW1wbGlmaWFibGVfMTpUaGUgaWYgc3RhdGVtZW50IGNhbiBiZSByZXBsYWNlZCB3aXRoICdyZXR1cm4gYm9vbCh0ZXN0KScKK3NpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnQ6MTY6NDp0ZXN0X3NpbXBsaWZpYWJsZV8yOlRoZSBpZiBzdGF0ZW1lbnQgY2FuIGJlIHJlcGxhY2VkIHdpdGggJ3JldHVybiBib29sKHRlc3QpJworc2ltcGxpZmlhYmxlLWlmLXN0YXRlbWVudDoyNDo0OnRlc3Rfc2ltcGxpZmlhYmxlXzM6VGhlIGlmIHN0YXRlbWVudCBjYW4gYmUgcmVwbGFjZWQgd2l0aCAndmFyID0gYm9vbCh0ZXN0KScKK3NpbXBsaWZpYWJsZS1pZi1zdGF0ZW1lbnQ6MzU6ODp0ZXN0X3NpbXBsaWZpYWJsZV80OlRoZSBpZiBzdGF0ZW1lbnQgY2FuIGJlIHJlcGxhY2VkIHdpdGggJ3JldHVybiBib29sKHRlc3QpJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU5ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbXBsaWZpYWJsZS9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb24ucHkKQEAgLTAsMCArMSw4OSBAQAorIiIiVGVzdCB0aGF0IHNvbWUgYm9vbGVhbiBleHByZXNzaW9uIHN0YXRlbWVudCB0ZXN0cyBjYW4gYmUgc2ltcGxpZmllZC4iIiIKKworIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZSwgbm8tZWxzZS1yZXR1cm4sIHRvby1tYW55LWJyYW5jaGVzCisKKworZGVmIHRlc3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzEoKToKKyAgICBhID0gMQorICAgIGIgPSAyCisgICAgYyA9IDMKKyAgICByZXR1cm4gYSA8IGIgYW5kIGIgPCBjICMgW2NoYWluZWQtY29tcGFyaXNvbl0KKworCitkZWYgdGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMigpOgorICAgIGEgPSAxCisgICAgcmV0dXJuIGEgPCAxMCBhbmQgYSA+IDEgIyBbY2hhaW5lZC1jb21wYXJpc29uXQorCisKK2RlZiB0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8zKCk6CisgICAgYSA9IDEKKyAgICBiID0gMgorICAgIGMgPSAzCisgICAgZCA9IDQKKyAgICBpZiBhIDwgMTAgYW5kIGEgPiAxOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPiAxIGFuZCBhIDwgMTA6ICMgW2NoYWluZWQtY29tcGFyaXNvbl0KKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA+IDEgYW5kIGEgPD0gMTA6ICMgW2NoYWluZWQtY29tcGFyaXNvbl0KKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA+IDEgYW5kIGEgPCAxMCBhbmQgYiA9PSAyOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPiAxIGFuZCBjID09IGIgYW5kIGEgPCAxMDogIyBbY2hhaW5lZC1jb21wYXJpc29uXQorICAgICAgICBwYXNzCisgICAgZWxpZiBhID4gMTAwIGFuZCBjID09IGIgYW5kIGEgPCAxMDogIyBbY2hhaW5lZC1jb21wYXJpc29uXQorICAgICAgICAjIEluIHRoaXMgY29tcGFyaXNvbiB3ZSBhcmUgbm90IGNoZWNraW5nIHdoZXRoZXIgbGVmdCBib3VuZCBpcyBhY3R1YWxseQorICAgICAgICAjIGxvd2VyIHRoYW4gcmlnaHQgYm91bmQgb3Igbm90LgorICAgICAgICBwYXNzCisgICAgZWxpZiBhIDwgYiBhbmQgYiA8IGM6ICMgW2NoYWluZWQtY29tcGFyaXNvbl0KKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA+IGIgYW5kIGIgPiBjOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPCBiIGFuZCBhID09IDEgYW5kIGIgPCBjOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPCBiIGFuZCBiIDwgYyBhbmQgYyA9PSA3ODY6ICMgW2NoYWluZWQtY29tcGFyaXNvbl0KKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA8IGIgYW5kIGIgPCAwIGFuZCBjID09IDc4NjogIyBbY2hhaW5lZC1jb21wYXJpc29uXQorICAgICAgICBwYXNzCisgICAgZWxpZiBhIDwgYiBhbmQgYyA9PSA3ODYgYW5kIGIgPCAwOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKyAgICBlbGlmIGMgPT0gNzg2IGFuZCBiIDwgMCBhbmQgYSA8IGI6ICMgW2NoYWluZWQtY29tcGFyaXNvbl0KKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA8IGIgPCBjIGFuZCBjIDwgZDogIyBbY2hhaW5lZC1jb21wYXJpc29uXQorICAgICAgICBwYXNzCisgICAgZWxpZiBiIDwgYyA8IGQgYW5kIGEgPCBiOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPCBiIDwgYyBhbmQgYSA8IGIgYW5kIGIgPCBjOiAjIFtjaGFpbmVkLWNvbXBhcmlzb25dCisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9ub3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzEoKToKKyAgICBhID0gMQorICAgIGIgPSAyCisgICAgYyA9IDMKKyAgICBkID0gNAorICAgIGlmIGEgPCAxMCBhbmQgYiA+IDE6CisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPiAxIGFuZCBiIDwgMTA6CisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPiAxIGFuZCBhID09IDEwOgorICAgICAgICBwYXNzCisgICAgZWxpZiBhID09IDEgYW5kIGIgPT0gMjoKKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA+IDEgYW5kIGEgPiAxMDoKKyAgICAgICAgcGFzcworICAgIGVsaWYgYSA8IDEwMCBhbmQgYSA8IDEwOgorICAgICAgICBwYXNzCisgICAgZWxpZiBhIDwgYiBhbmQgYSA8IGM6CisgICAgICAgIHBhc3MKKyAgICBlbGlmIGEgPCBiIGFuZCBhID09IDEgYW5kIGEgPCBjOgorICAgICAgICBwYXNzCisgICAgZWxpZiBhIDwgYiBhbmQgYSA8IGMgYW5kIGMgPT0gNzg2OgorICAgICAgICBwYXNzCisgICAgZWxpZiBhIDwgYiA8IGMgYW5kIGIgPCBkOgorICAgICAgICBwYXNzCisgICAgZWxpZiBhIDwgYiA8IGMgYW5kIGEgPCBkOgorICAgICAgICBwYXNzCisgICAgZWxpZiBiIDwgYyA8IGQgYW5kIGEgPCBjOgorICAgICAgICBwYXNzCisgICAgZWxpZiBiIDwgYyA8IGQgYW5kIGEgPCBkOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2ltcGxpZmlhYmxlL3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZDNjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW1wbGlmaWFibGUvc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uLnR4dApAQCAtMCwwICsxLDE4IEBACitjaGFpbmVkLWNvbXBhcmlzb246MTA6MTE6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMTpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKK2NoYWluZWQtY29tcGFyaXNvbjoxNToxMTp0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8yOlNpbXBsaWZ5IGNoYWluZWQgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcGVyYW5kcworY2hhaW5lZC1jb21wYXJpc29uOjIzOjc6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMzpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKK2NoYWluZWQtY29tcGFyaXNvbjoyNTo5OnRlc3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzM6U2ltcGxpZnkgY2hhaW5lZCBjb21wYXJpc29uIGJldHdlZW4gdGhlIG9wZXJhbmRzCitjaGFpbmVkLWNvbXBhcmlzb246Mjc6OTp0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8zOlNpbXBsaWZ5IGNoYWluZWQgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcGVyYW5kcworY2hhaW5lZC1jb21wYXJpc29uOjI5Ojk6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMzpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKK2NoYWluZWQtY29tcGFyaXNvbjozMTo5OnRlc3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzM6U2ltcGxpZnkgY2hhaW5lZCBjb21wYXJpc29uIGJldHdlZW4gdGhlIG9wZXJhbmRzCitjaGFpbmVkLWNvbXBhcmlzb246MzM6OTp0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8zOlNpbXBsaWZ5IGNoYWluZWQgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcGVyYW5kcworY2hhaW5lZC1jb21wYXJpc29uOjM3Ojk6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMzpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKK2NoYWluZWQtY29tcGFyaXNvbjozOTo5OnRlc3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzM6U2ltcGxpZnkgY2hhaW5lZCBjb21wYXJpc29uIGJldHdlZW4gdGhlIG9wZXJhbmRzCitjaGFpbmVkLWNvbXBhcmlzb246NDE6OTp0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8zOlNpbXBsaWZ5IGNoYWluZWQgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcGVyYW5kcworY2hhaW5lZC1jb21wYXJpc29uOjQzOjk6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMzpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKK2NoYWluZWQtY29tcGFyaXNvbjo0NTo5OnRlc3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzM6U2ltcGxpZnkgY2hhaW5lZCBjb21wYXJpc29uIGJldHdlZW4gdGhlIG9wZXJhbmRzCitjaGFpbmVkLWNvbXBhcmlzb246NDc6OTp0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8zOlNpbXBsaWZ5IGNoYWluZWQgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcGVyYW5kcworY2hhaW5lZC1jb21wYXJpc29uOjQ5Ojk6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMzpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKK2NoYWluZWQtY29tcGFyaXNvbjo1MTo5OnRlc3Rfc2ltcGxpZnlfY2hhaW5lZF9jb21wYXJpc29uXzM6U2ltcGxpZnkgY2hhaW5lZCBjb21wYXJpc29uIGJldHdlZW4gdGhlIG9wZXJhbmRzCitjaGFpbmVkLWNvbXBhcmlzb246NTM6OTp0ZXN0X3NpbXBsaWZ5X2NoYWluZWRfY29tcGFyaXNvbl8zOlNpbXBsaWZ5IGNoYWluZWQgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBvcGVyYW5kcworY2hhaW5lZC1jb21wYXJpc29uOjU1Ojk6dGVzdF9zaW1wbGlmeV9jaGFpbmVkX2NvbXBhcmlzb25fMzpTaW1wbGlmeSBjaGFpbmVkIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgb3BlcmFuZHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW5nbGVkaXNwYXRjaF9mdW5jdGlvbnNfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbmdsZWRpc3BhdGNoX2Z1bmN0aW9uc19weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNGQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW5nbGVkaXNwYXRjaF9mdW5jdGlvbnNfcHkzLnB5CkBAIC0wLDAgKzEsNzYgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLGltcG9ydC1lcnJvcix1bnVzZWQtaW1wb3J0LGFzc2lnbm1lbnQtZnJvbS1uby1yZXR1cm4KKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSwgdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gVU5JTkZFUkFCTEUgaW1wb3J0IHVuaW5mZXJhYmxlX2Z1bmMKKwordHJ5OgorICAgIGZyb20gZnVuY3Rvb2xzIGltcG9ydCBzaW5nbGVkaXNwYXRjaAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gc2luZ2xlZGlzcGF0Y2ggaW1wb3J0IHNpbmdsZWRpc3BhdGNoCisKK215X3NpbmdsZV9kaXNwYXRjaCA9IHNpbmdsZWRpc3BhdGNoCisKKworY2xhc3MgRmFrZVNpbmdsZURpc3BhdGNoKG9iamVjdCk6CisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHJlZ2lzdGVyKGZ1bmN0aW9uKToKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICByZXR1cm4gZnVuY3Rpb24KKworZmFrZV9zaW5nbGVkaXNwYXRjaF9kZWNvcmF0b3IgPSBGYWtlU2luZ2xlRGlzcGF0Y2goKQorCitAc2luZ2xlZGlzcGF0Y2gKK2RlZiBmdW5jKGFyZyk6CisgICAgcmV0dXJuIGFyZworCisKK0BmdW5jLnJlZ2lzdGVyKHN0cikKK2RlZiBfKGFyZyk6CisgICAgcmV0dXJuIDQyCisKKworQGZ1bmMucmVnaXN0ZXIoZmxvYXQpCitAZnVuYy5yZWdpc3RlcihpbnQpCitkZWYgXyhhcmcpOgorICAgIHJldHVybiA0MgorCisKK0BteV9zaW5nbGVfZGlzcGF0Y2gKK2RlZiBmdW5jMihhcmcpOgorICAgIHJldHVybiBhcmcKKworCitAZnVuYzIucmVnaXN0ZXIoaW50KQorZGVmIF8oYXJnKToKKyAgICByZXR1cm4gNDIKKworCitAc2luZ2xlZGlzcGF0Y2gKK2RlZiB3aXRoX2V4dHJhX2FyZyhhcmcsIHZlcmJvc2U9RmFsc2UpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50KGFyZykKKyAgICByZXR1cm4gYXJnCisKKworQHdpdGhfZXh0cmFfYXJnLnJlZ2lzdGVyKHN0cikKK2RlZiBfKGFyZywgdmVyYm9zZT1GYWxzZSk6CisgICAgdW51c2VkID0gNDIgIyBbdW51c2VkLXZhcmlhYmxlXQorICAgIHJldHVybiBhcmdbOjotMV0KKworCitAZmFrZV9zaW5nbGVkaXNwYXRjaF9kZWNvcmF0b3IKK2RlZiBub3Rfc2luZ2xlX2Rpc3BhdGNoKGFyZyk6ICMgW3VudXNlZC1hcmd1bWVudF0KKyAgICByZXR1cm4gJ25vdCB5ZXQgaW1wbGVtZW50ZWQnCisKKworQGZha2Vfc2luZ2xlZGlzcGF0Y2hfZGVjb3JhdG9yLnJlZ2lzdGVyKHN0cikKK2RlZiBiYWRfc2luZ2xlX2Rpc3BhdGNoKGFyZyk6ICMgW3VudXNlZC1hcmd1bWVudF0KKyAgICByZXR1cm4gNDIKKworCitAZmFrZV9zaW5nbGVkaXNwYXRjaF9kZWNvcmF0b3IucmVnaXN0ZXIoc3RyKQorZGVmIGJhZF9zaW5nbGVfZGlzcGF0Y2goYXJnKTogIyBbdW51c2VkLWFyZ3VtZW50LCBmdW5jdGlvbi1yZWRlZmluZWRdCisgICAgcmV0dXJuIDI0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xlZGlzcGF0Y2hfZnVuY3Rpb25zX3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW5nbGVkaXNwYXRjaF9mdW5jdGlvbnNfcHkzLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODFjM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xlZGlzcGF0Y2hfZnVuY3Rpb25zX3B5My5yYwpAQCAtMCwwICsxLDMgQEAKK1t0ZXN0b3B0aW9uc10KKztodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwNDQ1CittaW5fcHl2ZXI9My40CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xlZGlzcGF0Y2hfZnVuY3Rpb25zX3B5My50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xlZGlzcGF0Y2hfZnVuY3Rpb25zX3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyNmU3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW5nbGVkaXNwYXRjaF9mdW5jdGlvbnNfcHkzLnR4dApAQCAtMCwwICsxLDUgQEAKK3VudXNlZC12YXJpYWJsZTo2MDo0Ol86VW51c2VkIHZhcmlhYmxlICd1bnVzZWQnCit1bnVzZWQtYXJndW1lbnQ6NjU6MjQ6bm90X3NpbmdsZV9kaXNwYXRjaDpVbnVzZWQgYXJndW1lbnQgJ2FyZycKK3VudXNlZC1hcmd1bWVudDo3MDoyNDpiYWRfc2luZ2xlX2Rpc3BhdGNoOlVudXNlZCBhcmd1bWVudCAnYXJnJworZnVuY3Rpb24tcmVkZWZpbmVkOjc1OjA6YmFkX3NpbmdsZV9kaXNwYXRjaDpmdW5jdGlvbiBhbHJlYWR5IGRlZmluZWQgbGluZSA3MAordW51c2VkLWFyZ3VtZW50Ojc1OjI0OmJhZF9zaW5nbGVfZGlzcGF0Y2g6VW51c2VkIGFyZ3VtZW50ICdhcmcnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xldG9uX2NvbXBhcmlzb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xldG9uX2NvbXBhcmlzb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlYmRhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zaW5nbGV0b25fY29tcGFyaXNvbi5weQpAQCAtMCwwICsxLDIwIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCBtaXNwbGFjZWQtY29tcGFyaXNvbi1jb25zdGFudCxsaXRlcmFsLWNvbXBhcmlzb24sIGNvbXBhcmlzb24td2l0aC1pdHNlbGYKK3ggPSA0MgorYSA9IHggaXMgTm9uZQorYiA9IHggPT0gTm9uZSAgIyBbc2luZ2xldG9uLWNvbXBhcmlzb25dCitjID0geCA9PSBUcnVlICAjIFtzaW5nbGV0b24tY29tcGFyaXNvbl0KK2QgPSB4ID09IEZhbHNlICAjIFtzaW5nbGV0b24tY29tcGFyaXNvbl0KK2UgPSBUcnVlID09IFRydWUgICMgW3NpbmdsZXRvbi1jb21wYXJpc29uXQorZiA9IHggaXMgMQorZyA9IDEyMyBpcyAiMTIzIgoraCA9IE5vbmUgaXMgeAoraSA9IE5vbmUgPT0geCAgIyBbc2luZ2xldG9uLWNvbXBhcmlzb25dCisKK2ogPSB4ICE9IFRydWUgICMgW3NpbmdsZXRvbi1jb21wYXJpc29uXQorajEgPSB4ICE9IEZhbHNlICAjIFtzaW5nbGV0b24tY29tcGFyaXNvbl0KK2oyID0geCAhPSBOb25lICAjIFtzaW5nbGV0b24tY29tcGFyaXNvbl0KK2Fzc2VydCB4ID09IFRydWUgICMgW3NpbmdsZXRvbi1jb21wYXJpc29uXQorYXNzZXJ0IHggIT0gRmFsc2UgICMgW3NpbmdsZXRvbi1jb21wYXJpc29uXQoraWYgeCA9PSBUcnVlOiAgIyBbc2luZ2xldG9uLWNvbXBhcmlzb25dCisgICAgcGFzcworeiA9IGJvb2woeCA9PSBUcnVlKSAgIyBbc2luZ2xldG9uLWNvbXBhcmlzb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2luZ2xldG9uX2NvbXBhcmlzb24udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbmdsZXRvbl9jb21wYXJpc29uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA3ZGNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3NpbmdsZXRvbl9jb21wYXJpc29uLnR4dApAQCAtMCwwICsxLDEyIEBACitzaW5nbGV0b24tY29tcGFyaXNvbjo0OjQ6OkNvbXBhcmlzb24gJ3ggPT0gTm9uZScgc2hvdWxkIGJlICd4IGlzIE5vbmUnCitzaW5nbGV0b24tY29tcGFyaXNvbjo1OjQ6OkNvbXBhcmlzb24gJ3ggPT0gVHJ1ZScgc2hvdWxkIGJlICd4IGlzIFRydWUnIGlmIGNoZWNraW5nIGZvciB0aGUgc2luZ2xldG9uIHZhbHVlIFRydWUsIG9yICdib29sKHgpJyBpZiB0ZXN0aW5nIGZvciB0cnV0aGluZXNzCitzaW5nbGV0b24tY29tcGFyaXNvbjo2OjQ6OkNvbXBhcmlzb24gJ3ggPT0gRmFsc2UnIHNob3VsZCBiZSAneCBpcyBGYWxzZScgaWYgY2hlY2tpbmcgZm9yIHRoZSBzaW5nbGV0b24gdmFsdWUgRmFsc2UsIG9yICdub3QgeCcgaWYgdGVzdGluZyBmb3IgZmFsc2luZXNzCitzaW5nbGV0b24tY29tcGFyaXNvbjo3OjQ6OkNvbXBhcmlzb24gJ1RydWUgPT0gVHJ1ZScgc2hvdWxkIGJlICdUcnVlIGlzIFRydWUnIGlmIGNoZWNraW5nIGZvciB0aGUgc2luZ2xldG9uIHZhbHVlIFRydWUsIG9yICdib29sKFRydWUpJyBpZiB0ZXN0aW5nIGZvciB0cnV0aGluZXNzCitzaW5nbGV0b24tY29tcGFyaXNvbjoxMTo0OjpDb21wYXJpc29uICdOb25lID09IHgnIHNob3VsZCBiZSAnTm9uZSBpcyB4Jworc2luZ2xldG9uLWNvbXBhcmlzb246MTM6NDo6Q29tcGFyaXNvbiAneCAhPSBUcnVlJyBzaG91bGQgYmUgJ3ggaXMgbm90IFRydWUnIGlmIGNoZWNraW5nIGZvciB0aGUgc2luZ2xldG9uIHZhbHVlIFRydWUsIG9yICdub3QgeCcgaWYgdGVzdGluZyBmb3IgZmFsc2luZXNzCitzaW5nbGV0b24tY29tcGFyaXNvbjoxNDo1OjpDb21wYXJpc29uICd4ICE9IEZhbHNlJyBzaG91bGQgYmUgJ3ggaXMgbm90IEZhbHNlJyBpZiBjaGVja2luZyBmb3IgdGhlIHNpbmdsZXRvbiB2YWx1ZSBGYWxzZSwgb3IgJ2Jvb2woeCknIGlmIHRlc3RpbmcgZm9yIHRydXRoaW5lc3MKK3NpbmdsZXRvbi1jb21wYXJpc29uOjE1OjU6OkNvbXBhcmlzb24gJ3ggIT0gTm9uZScgc2hvdWxkIGJlICd4IGlzIG5vdCBOb25lJworc2luZ2xldG9uLWNvbXBhcmlzb246MTY6Nzo6Q29tcGFyaXNvbiAneCA9PSBUcnVlJyBzaG91bGQgYmUgJ3ggaXMgVHJ1ZScgaWYgY2hlY2tpbmcgZm9yIHRoZSBzaW5nbGV0b24gdmFsdWUgVHJ1ZSwgb3IgJ3gnIGlmIHRlc3RpbmcgZm9yIHRydXRoaW5lc3MKK3NpbmdsZXRvbi1jb21wYXJpc29uOjE3Ojc6OkNvbXBhcmlzb24gJ3ggIT0gRmFsc2UnIHNob3VsZCBiZSAneCBpcyBub3QgRmFsc2UnIGlmIGNoZWNraW5nIGZvciB0aGUgc2luZ2xldG9uIHZhbHVlIEZhbHNlLCBvciAneCcgaWYgdGVzdGluZyBmb3IgdHJ1dGhpbmVzcworc2luZ2xldG9uLWNvbXBhcmlzb246MTg6Mzo6Q29tcGFyaXNvbiAneCA9PSBUcnVlJyBzaG91bGQgYmUgJ3ggaXMgVHJ1ZScgaWYgY2hlY2tpbmcgZm9yIHRoZSBzaW5nbGV0b24gdmFsdWUgVHJ1ZSwgb3IgJ3gnIGlmIHRlc3RpbmcgZm9yIHRydXRoaW5lc3MKK3NpbmdsZXRvbi1jb21wYXJpc29uOjIwOjk6OkNvbXBhcmlzb24gJ3ggPT0gVHJ1ZScgc2hvdWxkIGJlICd4IGlzIFRydWUnIGlmIGNoZWNraW5nIGZvciB0aGUgc2luZ2xldG9uIHZhbHVlIFRydWUsIG9yICd4JyBpZiB0ZXN0aW5nIGZvciB0cnV0aGluZXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2xvdHNfY2hlY2tzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3Nsb3RzX2NoZWNrcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RjZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3Nsb3RzX2NoZWNrcy5weQpAQCAtMCwwICsxLDEwMSBAQAorIiIiIENoZWNrcyB0aGF0IGNsYXNzZXMgdXNlcyB2YWxpZCBfX3Nsb3RzX18gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nLCBuby1hYnNvbHV0ZS1pbXBvcnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisjIHB5bGludDogZGlzYWJsZT11c2luZy1jb25zdGFudC10ZXN0LCB3cm9uZy1pbXBvcnQtcG9zaXRpb24sIG5vLWVsc2UtcmV0dXJuLCBsaW5lLXRvby1sb25nLCB1bnVzZWQtcHJpdmF0ZS1tZW1iZXIKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisKK2RlZiBmdW5jKCk6CisgICAgaWYgVHJ1ZToKKyAgICAgICAgcmV0dXJuICgiYSIsICJiIiwgImMiKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBbc3RyKHZhcikgZm9yIHZhciBpbiByYW5nZSgzKV0KKworCitjbGFzcyBOb3RJdGVyYWJsZShvYmplY3QpOgorICAgIGRlZiBfX2l0ZXJfKHNlbGYpOgorICAgICAgICAiIiIgZG8gbm90aGluZyAiIiIKKworY2xhc3MgR29vZChvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKK2NsYXNzIFNlY29uZEdvb2Qob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbXQorCitjbGFzcyBUaGlyZEdvb2Qob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ2EnXQorCitjbGFzcyBGb3VydGhHb29kKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdhJXMnICUgaSBmb3IgaSBpbiByYW5nZSgxMCkpCisKK2NsYXNzIEZpZnRoR29vZChvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IGRlcXVlKFsiYSIsICJiIiwgImMiXSkKKworY2xhc3MgU2l4dGhHb29kKG9iamVjdCk6CisgICAgX19zbG90c19fID0geyJhIjogImIiLCAiYyI6ICJkIn0KKworY2xhc3MgQmFkKG9iamVjdCk6ICMgW2ludmFsaWQtc2xvdHNdCisgICAgX19zbG90c19fID0gbGlzdAorCitjbGFzcyBTZWNvbmRCYWQob2JqZWN0KTogICMgW2ludmFsaWQtc2xvdHNdCisgICAgX19zbG90c19fID0gMQorCitjbGFzcyBUaGlyZEJhZChvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgnYScsIDIpICAjIFtpbnZhbGlkLXNsb3RzLW9iamVjdF0KKworY2xhc3MgRm91cnRoQmFkKG9iamVjdCk6ICAjIFtpbnZhbGlkLXNsb3RzXQorICAgIF9fc2xvdHNfXyA9IE5vdEl0ZXJhYmxlKCkKKworY2xhc3MgRmlmdGhCYWQob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoImEiLCAiYiIsICIiKSAgIyBbaW52YWxpZC1zbG90cy1vYmplY3RdCisKK2NsYXNzIFNpeHRoQmFkKG9iamVjdCk6ICAjIFtzaW5nbGUtc3RyaW5nLXVzZWQtZm9yLXNsb3RzXQorICAgIF9fc2xvdHNfXyA9ICJhIgorCitjbGFzcyBTZXZlbnRoQmFkKG9iamVjdCk6ICAjIFtzaW5nbGUtc3RyaW5nLXVzZWQtZm9yLXNsb3RzXQorICAgIF9fc2xvdHNfXyA9ICgnZm9vJykKKworY2xhc3MgRWlnaHRoQmFkKG9iamVjdCk6ICAjIFtzaW5nbGUtc3RyaW5nLXVzZWQtZm9yLXNsb3RzXQorICAgIF9fc2xvdHNfXyA9IGRlcXVlLl9fbmFtZV9fCisKK2NsYXNzIFBvdGVudGlhbGx5R29vZChvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IGZ1bmMoKQorCitjbGFzcyBQb3RlbnRpYWxseVNlY29uZEdvb2Qob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoJ2EnLCBkZXF1ZS5fX25hbWVfXykKKworCitjbGFzcyBNZXRhY2xhc3ModHlwZSk6CisKKyAgICBkZWYgX19pdGVyX18oY2xzKToKKyAgICAgICAgZm9yIHZhbHVlIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHlpZWxkIHN0cih2YWx1ZSkKKworCitjbGFzcyBJdGVyYWJsZUNsYXNzKG9iamVjdCwgbWV0YWNsYXNzPU1ldGFjbGFzcyk6CisgICAgcGFzcworCitjbGFzcyBQb3RlbnRpYWxseVRoaXJkR29vZChvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IEl0ZXJhYmxlQ2xhc3MKKworY2xhc3MgUG90ZW50aWFsbHlGb3VydGhHb29kKG9iamVjdCk6CisgICAgX19zbG90c19fID0gR29vZC5fX3Nsb3RzX18KKworCitjbGFzcyBWYWx1ZUluU2xvdENvbmZsaWN0KG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnLCAnZm91cnRoJykgIyBbY2xhc3MtdmFyaWFibGUtc2xvdHMtY29uZmxpY3QsIGNsYXNzLXZhcmlhYmxlLXNsb3RzLWNvbmZsaWN0LCBjbGFzcy12YXJpYWJsZS1zbG90cy1jb25mbGljdF0KKyAgICBmaXJzdCA9IE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0aGlyZChzZWxmKToKKyAgICAgICAgcmV0dXJuIDQyCisKKyAgICBkZWYgZm91cnRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50aGlyZAorCisKK2NsYXNzIFBhcmVudChvYmplY3QpOgorICAgIGZpcnN0ID0gNDIKKworCitjbGFzcyBDaGlsZE5vdEFmZmVjdGVkQnlWYWx1ZUluU2xvdChQYXJlbnQpOgorICAgIF9fc2xvdHNfXyA9ICgnZmlyc3QnLCApCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc2xvdHNfY2hlY2tzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zbG90c19jaGVja3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTgyZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc2xvdHNfY2hlY2tzLnR4dApAQCAtMCwwICsxLDExIEBACitpbnZhbGlkLXNsb3RzOjM2OjA6QmFkOkludmFsaWQgX19zbG90c19fIG9iamVjdAoraW52YWxpZC1zbG90czozOTowOlNlY29uZEJhZDpJbnZhbGlkIF9fc2xvdHNfXyBvYmplY3QKK2ludmFsaWQtc2xvdHMtb2JqZWN0OjQzOjIyOlRoaXJkQmFkOkludmFsaWQgb2JqZWN0ICcyJyBpbiBfX3Nsb3RzX18sIG11c3QgY29udGFpbiBvbmx5IG5vbiBlbXB0eSBzdHJpbmdzCitpbnZhbGlkLXNsb3RzOjQ1OjA6Rm91cnRoQmFkOkludmFsaWQgX19zbG90c19fIG9iamVjdAoraW52YWxpZC1zbG90cy1vYmplY3Q6NDk6Mjc6RmlmdGhCYWQ6IkludmFsaWQgb2JqZWN0ICIiJyciIiBpbiBfX3Nsb3RzX18sIG11c3QgY29udGFpbiBvbmx5IG5vbiBlbXB0eSBzdHJpbmdzIgorc2luZ2xlLXN0cmluZy11c2VkLWZvci1zbG90czo1MTowOlNpeHRoQmFkOkNsYXNzIF9fc2xvdHNfXyBzaG91bGQgYmUgYSBub24tc3RyaW5nIGl0ZXJhYmxlCitzaW5nbGUtc3RyaW5nLXVzZWQtZm9yLXNsb3RzOjU0OjA6U2V2ZW50aEJhZDpDbGFzcyBfX3Nsb3RzX18gc2hvdWxkIGJlIGEgbm9uLXN0cmluZyBpdGVyYWJsZQorc2luZ2xlLXN0cmluZy11c2VkLWZvci1zbG90czo1NzowOkVpZ2h0aEJhZDpDbGFzcyBfX3Nsb3RzX18gc2hvdWxkIGJlIGEgbm9uLXN0cmluZyBpdGVyYWJsZQorY2xhc3MtdmFyaWFibGUtc2xvdHMtY29uZmxpY3Q6ODU6MTc6VmFsdWVJblNsb3RDb25mbGljdDpWYWx1ZSAnZmlyc3QnIGluIHNsb3RzIGNvbmZsaWN0cyB3aXRoIGNsYXNzIHZhcmlhYmxlCitjbGFzcy12YXJpYWJsZS1zbG90cy1jb25mbGljdDo4NTo0NTpWYWx1ZUluU2xvdENvbmZsaWN0OlZhbHVlICdmb3VydGgnIGluIHNsb3RzIGNvbmZsaWN0cyB3aXRoIGNsYXNzIHZhcmlhYmxlCitjbGFzcy12YXJpYWJsZS1zbG90cy1jb25mbGljdDo4NTozNjpWYWx1ZUluU2xvdENvbmZsaWN0OlZhbHVlICd0aGlyZCcgaW4gc2xvdHMgY29uZmxpY3RzIHdpdGggY2xhc3MgdmFyaWFibGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zb2NrZXRlcnJvcl9pbXBvcnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc29ja2V0ZXJyb3JfaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc29ja2V0ZXJyb3JfaW1wb3J0LnB5CkBAIC0wLDAgKzEsNiBAQAorIiIiZHMiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBwcmludF9mdW5jdGlvbgorZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yCitfX3JldmlzaW9uX18gPSAnJElkOiBzb2NrZXRlcnJvcl9pbXBvcnQucHksdiAxLjIgMjAwNS0xMi0yOCAxNDo1ODoyMiBzeXQgRXhwICQnCisKK3ByaW50KGVycm9yKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXIvc3Rhcl9uZWVkc19hc3NpZ25tZW50X3RhcmdldC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyMWMyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXQucHkKQEAgLTAsMCArMSw0IEBACisiIiJUZXN0IGZvciBhID0gKmIiIiINCisNCitGSVJTVCA9ICpbMSwgMl0gICMgW3N0YXItbmVlZHMtYXNzaWdubWVudC10YXJnZXRdDQorKlRISVJELCBGT1VSVEggPSBbMSwgMiwgMyxdDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXIvc3Rhcl9uZWVkc19hc3NpZ25tZW50X3RhcmdldC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXQucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3Rhci9zdGFyX25lZWRzX2Fzc2lnbm1lbnRfdGFyZ2V0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjY2OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3Rhci9zdGFyX25lZWRzX2Fzc2lnbm1lbnRfdGFyZ2V0LnR4dApAQCAtMCwwICsxIEBACitzdGFyLW5lZWRzLWFzc2lnbm1lbnQtdGFyZ2V0OjM6ODo6Q2FuIHVzZSBzdGFycmVkIGV4cHJlc3Npb24gb25seSBpbiBhc3NpZ25tZW50IHRhcmdldApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXIvc3Rhcl9uZWVkc19hc3NpZ25tZW50X3RhcmdldF9weTM1LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXIvc3Rhcl9uZWVkc19hc3NpZ25tZW50X3RhcmdldF9weTM1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNWVlYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3Rhci9zdGFyX25lZWRzX2Fzc2lnbm1lbnRfdGFyZ2V0X3B5MzUucHkKQEAgLTAsMCArMSwxNSBAQAorIiIiCitUZXN0IFBFUCAwNDQ4IC0tIEFkZGl0aW9uYWwgVW5wYWNraW5nIEdlbmVyYWxpemF0aW9ucworaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ0OC8KKyIiIgorCisjIHB5bGludDogZGlzYWJsZT1zdXBlcmZsdW91cy1wYXJlbnMsIHVubmVjZXNzYXJ5LWNvbXByZWhlbnNpb24KKworVU5QQUNLX1RVUExFID0gKCpyYW5nZSg0KSwgNCkKK1VOUEFDS19MSVNUID0gWypyYW5nZSg0KSwgNF0KK1VOUEFDS19TRVQgPSB7KnJhbmdlKDQpLCA0fQorVU5QQUNLX0RJQ1QgPSB7J2EnOiAxLCAqKnsnYic6ICcyJ319CitVTlBBQ0tfRElDVDIgPSB7KipVTlBBQ0tfRElDVCwgIngiOiAxLCAieSI6IDJ9CitVTlBBQ0tfRElDVDMgPSB7Kip7J2EnOiAxfSwgJ2EnOiAyLCAqKnsnYSc6IDN9fQorCitVTlBBQ0tfSU5fQ09NUCA9IHtlbGVtIGZvciBlbGVtIGluICgqcmFuZ2UoMTApKX0gIyBbc3Rhci1uZWVkcy1hc3NpZ25tZW50LXRhcmdldF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXRfcHkzNS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXRfcHkzNS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQzZThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXIvc3Rhcl9uZWVkc19hc3NpZ25tZW50X3RhcmdldF9weTM1LnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNQorbWF4X3B5dmVyPTMuOApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXIvc3Rhcl9uZWVkc19hc3NpZ25tZW50X3RhcmdldF9weTM1LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXRfcHkzNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmYTJjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGFyL3N0YXJfbmVlZHNfYXNzaWdubWVudF90YXJnZXRfcHkzNS50eHQKQEAgLTAsMCArMSBAQAorc3Rhci1uZWVkcy1hc3NpZ25tZW50LXRhcmdldDoxNTozNzo6Q2FuIHVzZSBzdGFycmVkIGV4cHJlc3Npb24gb25seSBpbiBhc3NpZ25tZW50IHRhcmdldApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGF0ZW1lbnRfd2l0aG91dF9lZmZlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNGY2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGF0ZW1lbnRfd2l0aG91dF9lZmZlY3QucHkKQEAgLTAsMCArMSw3NSBAQAorIiIiVGVzdCBmb3Igc3RhdGVtZW50cyB3aXRob3V0IGVmZmVjdHMuIiIiCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbgorCisjICsxOltwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudF0KKyIiImlubGluZSBkb2Mgc3RyaW5nIHNob3VsZCB1c2UgYSBzZXBhcmF0ZWQgbWVzc2FnZSIiIgorCitfX3JldmlzaW9uX18gPSAnJworCitfX3JldmlzaW9uX18gICMgW3BvaW50bGVzcy1zdGF0ZW1lbnRdCisKK19fcmV2aXNpb25fXyA8PSAxICAjIFtwb2ludGxlc3Mtc3RhdGVtZW50XQorCitfX3JldmlzaW9uX18ubG93ZXIoKQorCitbaSBmb3IgaSBpbiBfX3JldmlzaW9uX19dICAjIFtwb2ludGxlc3Mtc3RhdGVtZW50XQorCisjICsxOltwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudF0KKyIiImlubGluZSBkb2Mgc3RyaW5nIHNob3VsZCB1c2UgYSBzZXBhcmF0ZWQgbWVzc2FnZSIiIgorCisKK19fcmV2aXNpb25fXy5sb3dlcigpOyAgIyBbdW5uZWNlc3Nhcnktc2VtaWNvbG9uXQorCitsaXN0KCkgYW5kIHR1cGxlKCkgICMgW2V4cHJlc3Npb24tbm90LWFzc2lnbmVkXQorCitkZWYgdG9fYmUoKToKKyAgICAiIiJyZXR1cm4gNDIiIiIKKyAgICByZXR1cm4gIjQyIgorCitBTlNXRVIgPSB0b19iZSgpICMgb2sKK0FOU1dFUiA9PSB0b19iZSgpICAjIFtleHByZXNzaW9uLW5vdC1hc3NpZ25lZF0KKwordG9fYmUoKSBvciBub3QgdG9fYmUoKSAgIyBbZXhwcmVzc2lvbi1ub3QtYXNzaWduZWRdCit0b19iZSgpLnRpdGxlICAjIFtleHByZXNzaW9uLW5vdC1hc3NpZ25lZF0KKworR09PRF9BVFRSSUJVVEVfRE9DU1RSSU5HID0gNDIKKyIiIk1vZHVsZSBsZXZlbCBhdHRyaWJ1dGUgZG9jc3RyaW5nIGlzIGZpbmUuICIiIgorCitjbGFzcyBDbGFzc0xldmVsQXR0cmlidXRlVGVzdChvYmplY3QpOgorICAgICIiIiB0ZXN0IGF0dHJpYnV0ZSBkb2NzdHJpbmdzLiAiIiIKKworICAgIGdvb2RfYXR0cmlidXRlX2RvY3N0cmluZyA9IDI0CisgICAgIiIiIGNsYXNzIGxldmVsIGF0dHJpYnV0ZSBkb2NzdHJpbmcgaXMgZmluZSBlaXRoZXIuICIiIgorICAgIHNlY29uZF9nb29kX2F0dHJpYnV0ZV9kb2NzdHJpbmcgPSA0MgorICAgICMgQ29tbWVudHMgYXJlIGdvb2QuCisKKyAgICAjIGVtcHR5IGxpbmVzIGFyZSBnb29kLCB0b28uCisgICAgIiIiIFN0aWxsIGEgdmFsaWQgY2xhc3MgbGV2ZWwgYXR0cmlidXRlIGRvY3N0cmluZy4gIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYXR0ciA9IDQyCisgICAgICAgICIiIiBHb29kIGF0dHJpYnV0ZSBkb2NzdHJpbmcgIiIiCisgICAgICAgIGF0dHIgPSAyNAorICAgICAgICAiIiIgU3RpbGwgYSBnb29kIF9faW5pdF9fIGxldmVsIGF0dHJpYnV0ZSBkb2NzdHJpbmcuICIiIgorICAgICAgICB2YWwgPSAwCisgICAgICAgIGZvciB2YWwgaW4gcmFuZ2UoNDIpOgorICAgICAgICAgICAgdmFsICs9IGF0dHIKKyAgICAgICAgIyArMTpbcG9pbnRsZXNzLXN0cmluZy1zdGF0ZW1lbnRdCisgICAgICAgICIiIiBJbnZhbGlkIGF0dHJpYnV0ZSBkb2NzdHJpbmcgIiIiCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiIGludmFsaWQgYXR0cmlidXRlIGRvY3N0cmluZ3MgaGVyZS4gIiIiCisgICAgICAgIHNlbGYudmFsID0gNDIKKyAgICAgICAgIyArMTpbcG9pbnRsZXNzLXN0cmluZy1zdGF0ZW1lbnRdCisgICAgICAgICIiIiB0aGlzIGlzIGFuIGludmFsaWQgYXR0cmlidXRlIGRvY3N0cmluZy4gIiIiCisKKworZGVmIGVsbGlwc2lzKCk6CisgICAgIiIiVGVzdCB0aGF0IGFuIEVsbGlwc2lzIGFzIGEgYm9keSBkb2VzIG5vdCB0cmlnZ2VyIHRoZSBlcnJvciIiIgorICAgIC4uLgorCisKK2NsYXNzIEVsbGlwc2lzQm9keToKKyAgICAiIiJUZXN0IHRoYXQgYW4gRWxsaXBzaXMgYXMgYSBib2R5IGRvZXMgbm90IHRyaWdnZXIgdGhlIGVycm9yIiIiCisgICAgLi4uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RhdGVtZW50X3dpdGhvdXRfZWZmZWN0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdGF0ZW1lbnRfd2l0aG91dF9lZmZlY3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2NmOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RhdGVtZW50X3dpdGhvdXRfZWZmZWN0LnR4dApAQCAtMCwwICsxLDEyIEBACitwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudDo1OjA6OlN0cmluZyBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdAorcG9pbnRsZXNzLXN0YXRlbWVudDo5OjA6OlN0YXRlbWVudCBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdAorcG9pbnRsZXNzLXN0YXRlbWVudDoxMTowOjpTdGF0ZW1lbnQgc2VlbXMgdG8gaGF2ZSBubyBlZmZlY3QKK3BvaW50bGVzcy1zdGF0ZW1lbnQ6MTU6MDo6U3RhdGVtZW50IHNlZW1zIHRvIGhhdmUgbm8gZWZmZWN0Citwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudDoxODowOjpTdHJpbmcgc3RhdGVtZW50IGhhcyBubyBlZmZlY3QKK3VubmVjZXNzYXJ5LXNlbWljb2xvbjoyMTowOjpVbm5lY2Vzc2FyeSBzZW1pY29sb24KK2V4cHJlc3Npb24tbm90LWFzc2lnbmVkOjIzOjA6OiJFeHByZXNzaW9uICIibGlzdCgpIGFuZCB0dXBsZSgpIiIgaXMgYXNzaWduZWQgdG8gbm90aGluZyIKK2V4cHJlc3Npb24tbm90LWFzc2lnbmVkOjMwOjA6OiJFeHByZXNzaW9uICIiQU5TV0VSID09IHRvX2JlKCkiIiBpcyBhc3NpZ25lZCB0byBub3RoaW5nIgorZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQ6MzI6MDo6IkV4cHJlc3Npb24gIiJ0b19iZSgpIG9yIG5vdCB0b19iZSgpIiIgaXMgYXNzaWduZWQgdG8gbm90aGluZyIKK2V4cHJlc3Npb24tbm90LWFzc2lnbmVkOjMzOjA6OiJFeHByZXNzaW9uICIidG9fYmUoKS50aXRsZSIiIGlzIGFzc2lnbmVkIHRvIG5vdGhpbmciCitwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudDo1ODo4OkNsYXNzTGV2ZWxBdHRyaWJ1dGVUZXN0Ll9faW5pdF9fOlN0cmluZyBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdAorcG9pbnRsZXNzLXN0cmluZy1zdGF0ZW1lbnQ6NjU6ODpDbGFzc0xldmVsQXR0cmlidXRlVGVzdC50ZXN0OlN0cmluZyBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdF9weTM2LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdF9weTM2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzQ1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RhdGVtZW50X3dpdGhvdXRfZWZmZWN0X3B5MzYucHkKQEAgLTAsMCArMSwxOCBAQAorIiIiVGVzdCBmb3Igc3RhdGVtZW50cyB3aXRob3V0IGVmZmVjdHMuIiIiCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCisKK2NsYXNzIENsYXNzTGV2ZWxBdHRyaWJ1dGVUZXN0KG9iamVjdCk6CisgICAgIiIiIHRlc3QgYXR0cmlidXRlIGRvY3N0cmluZ3MuICIiIgorCisgICAgc29tZV92YXJpYWJsZTogaW50ID0gNDIKKyAgICAiIiJEYXRhIGRvY3N0cmluZyIiIgorCisgICAgc29tZV9vdGhlcl92YXJpYWJsZTogaW50ID0gNDIKKyAgICAiIiJEYXRhIGRvY3N0cmluZyIiIgorCisgICAgZGVmIGZ1bmMoc2VsZik6CisgICAgICAgICIiIlNvbWUgRW1wdHkgRG9jc3RyaW5nIiIiCisKKyAgICAjICsxOiBbcG9pbnRsZXNzLXN0cmluZy1zdGF0ZW1lbnRdCisgICAgIiIidXNlbGVzcyIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdF9weTM2LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdF9weTM2LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RhdGVtZW50X3dpdGhvdXRfZWZmZWN0X3B5MzYucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My42CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RhdGVtZW50X3dpdGhvdXRfZWZmZWN0X3B5MzYudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdF9weTM2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZjMzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0YXRlbWVudF93aXRob3V0X2VmZmVjdF9weTM2LnR4dApAQCAtMCwwICsxIEBACitwb2ludGxlc3Mtc3RyaW5nLXN0YXRlbWVudDoxODo0OkNsYXNzTGV2ZWxBdHRyaWJ1dGVUZXN0OlN0cmluZyBzdGF0ZW1lbnQgaGFzIG5vIGVmZmVjdApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0b3BfaXRlcmF0aW9uX2luc2lkZV9nZW5lcmF0b3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RvcF9pdGVyYXRpb25faW5zaWRlX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJmNjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0b3BfaXRlcmF0aW9uX2luc2lkZV9nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxMjkgQEAKKyIiIgorVGVzdCB0aGF0IG5vIFN0b3BJdGVyYXRpb24gaXMgcmFpc2VkIGluc2lkZSBhIGdlbmVyYXRvcgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsaW1wb3J0LWVycm9yLCB0cnktZXhjZXB0LXJhaXNlLCB3cm9uZy1pbXBvcnQtcG9zaXRpb24sbm90LWNhbGxhYmxlLHJhaXNlLW1pc3NpbmctZnJvbQoraW1wb3J0IGFzeW5jaW8KKworY2xhc3MgUmVib3JuU3RvcEl0ZXJhdGlvbihTdG9wSXRlcmF0aW9uKToKKyAgICAiIiIKKyAgICBBIGNsYXNzIGluaGVyaXRpbmcgZnJvbSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbgorICAgICIiIgorCisjIFRoaXMgb25lIGlzIG9rCitkZWYgZ2VuX29rKCk6CisgICAgeWllbGQgMQorICAgIHlpZWxkIDIKKyAgICB5aWVsZCAzCisKKyMgcHlsaW50IHNob3VsZCB3YXJuIGFib3V0IHRoaXMgb25lCisjIGJlY2F1c2Ugb2YgYSBkaXJlY3QgcmFpc2luZyBvZiBTdG9wSXRlcmF0aW9uIGluc2lkZSBnZW5lcmF0b3IKK2RlZiBnZW5fc3RvcGl0ZXIoKToKKyAgICB5aWVsZCAxCisgICAgeWllbGQgMgorICAgIHlpZWxkIDMKKyAgICByYWlzZSBTdG9wSXRlcmF0aW9uICAjIFtzdG9wLWl0ZXJhdGlvbi1yZXR1cm5dCisKKyMgcHlsaW50IHNob3VsZCB3YXJuIGFib3V0IHRoaXMgb25lCisjIGJlY2F1c2Ugb2YgYSBkaXJlY3QgcmFpc2luZyBvZiBhbiBleGNlcHRpb24gaW5oZXJpdGluZyBmcm9tIFN0b3BJdGVyYXRpb24gaW5zaWRlIGdlbmVyYXRvcgorZGVmIGdlbl9zdG9waXRlcmNoaWxkKCk6CisgICAgeWllbGQgMQorICAgIHlpZWxkIDIKKyAgICB5aWVsZCAzCisgICAgcmFpc2UgUmVib3JuU3RvcEl0ZXJhdGlvbiAgIyBbc3RvcC1pdGVyYXRpb24tcmV0dXJuXQorCisjIHB5bGludCBzaG91bGQgd2FybiBoZXJlCisjIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IHRoYXQgbmV4dCByYWlzZXMgYSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbgorZGVmIGdlbl9uZXh0X3JhaXNlc19zdG9waXRlcigpOgorICAgIGcgPSBnZW5fb2soKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHlpZWxkIG5leHQoZykgICMgW3N0b3AtaXRlcmF0aW9uLXJldHVybl0KKworIyBUaGlzIG9uZSBpcyB0aGUgc2FtZSBhcyBnZW5fbmV4dF9yYWlzZXNfc3RvcGl0ZXIKKyMgYnV0IGlzIG9rIGJlY2F1c2UgdGhlIG5leHQgZnVuY3Rpb24gaXMgaW5zaWRlCisjIGEgdHJ5L2V4Y2VwdCBibG9jayBoYW5kbGluZyBTdG9wSXRlcmF0aW9uCitkZWYgZ2VuX25leHRfaW5zaWRlX3RyeV9leGNlcHQoKToKKyAgICBnID0gZ2VuX29rKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZCBuZXh0KGcpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmV0dXJuCisKKyMgVGhpcyBvbmUgaXMgdGhlIHNhbWUgYXMgZ2VuX25leHRfaW5zaWRlX3RyeV9leGNlcHQKKyMgYnV0IGlzIG5vdCBvayBiZWNhdXNlIHRoZSBuZXh0IGZ1bmN0aW9uIGlzIGluc2lkZQorIyBhIHRyeS9leGNlcHQgYmxvY2sgdGhhdCBkb24ndCBoYW5kbGUgU3RvcEl0ZXJhdGlvbgorZGVmIGdlbl9uZXh0X2luc2lkZV93cm9uZ190cnlfZXhjZXB0KCk6CisgICAgZyA9IGdlbl9vaygpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgbmV4dChnKSAgIyBbc3RvcC1pdGVyYXRpb24tcmV0dXJuXQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisjIFRoaXMgb25lIGlzIHRoZSBzYW1lIGFzIGdlbl9uZXh0X2luc2lkZV90cnlfZXhjZXB0CisjIGJ1dCBpcyBub3Qgb2sgYmVjYXVzZSB0aGUgbmV4dCBmdW5jdGlvbiBpcyBpbnNpZGUKKyMgYSB0cnkvZXhjZXB0IGJsb2NrIHRoYXQgaGFuZGxlIFN0b3BJdGVyYXRpb24gYnV0IHJlcmFpc2UgaXQKK2RlZiBnZW5fbmV4dF9pbnNpZGVfd3JvbmdfdHJ5X2V4Y2VwdDIoKToKKyAgICBnID0gZ2VuX29rKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZCBuZXh0KGcpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbiAgIyBbc3RvcC1pdGVyYXRpb24tcmV0dXJuXQorCisjIFRob3NlIHR3byBsYXN0IGFyZSBvaworZGVmIGdlbl9pbl9mb3IoKToKKyAgICBmb3IgZWwgaW4gZ2VuX29rKCk6CisgICAgICAgIHlpZWxkIGVsCisKK2RlZiBnZW5feWllbGRfZnJvbSgpOgorICAgIHlpZWxkIGZyb20gZ2VuX29rKCkKKworCitkZWYgZ2VuX2RvbnRfY3Jhc2hfb25fbm9fZXhjZXB0aW9uKCk6CisgICAgZyA9IGdlbl9vaygpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgbmV4dChnKSAjIFtzdG9wLWl0ZXJhdGlvbi1yZXR1cm5dCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UKKworCitkZWYgZ2VuX2RvbnRfY3Jhc2hfb25fdW5pbmZlcmFibGUoKToKKyAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzE3NzkKKyAgICB5aWVsZCBmcm9tIGl0ZXIoKQorICAgIHJhaXNlIGFzeW5jaW8uVGltZW91dEVycm9yKCkKKworCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzE4MzAKK2RlZiBnZW5fbmV4dF93aXRoX3NlbnRpbmVsKCk6CisgICAgeWllbGQgbmV4dChbXSwgNDIpICMgTm8gYmFkIHJldHVybgorCisKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjb3VudAorCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzIxNTgKK2RlZiBnZW5lcmF0b3JfdXNpbmdfbmV4dCgpOgorICAgIGNvdW50ZXIgPSBjb3VudCgpCisgICAgbnVtYmVyID0gbmV4dChjb3VudGVyKQorICAgIHlpZWxkIG51bWJlciAqIDIKKworCisjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZSx0b28tZmV3LXB1YmxpYy1tZXRob2RzCitjbGFzcyBTb21lQ2xhc3NXaXRoTmV4dDoKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoWzEsIDIsIDNdKQorICAgIGRlZiBzb21lX2dlbihzZWxmKToKKyAgICAgICAgZm9yIHZhbHVlIGluIHNlbGYubmV4dCgpOgorICAgICAgICAgICAgeWllbGQgdmFsdWUKKworCitTb21lQ2xhc3NXaXRoTmV4dCgpLnNvbWVfZ2VuKCkKKworCitkZWYgc29tZXRoaW5nX2ludmFsaWQoKToKKyAgICByYWlzZSBFeGNlcHRpb24oJ2Nhbm5vdCBpdGVyYXRlIHRoaXMnKQorCisKK2RlZiBpbnZhbGlkX29iamVjdF9wYXNzZWRfdG9fbmV4dCgpOgorICAgIHlpZWxkIG5leHQoc29tZXRoaW5nX2ludmFsaWQoKSkgIyBbc3RvcC1pdGVyYXRpb24tcmV0dXJuXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0b3BfaXRlcmF0aW9uX2luc2lkZV9nZW5lcmF0b3IucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RvcF9pdGVyYXRpb25faW5zaWRlX2dlbmVyYXRvci5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0b3BfaXRlcmF0aW9uX2luc2lkZV9nZW5lcmF0b3IucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RvcF9pdGVyYXRpb25faW5zaWRlX2dlbmVyYXRvci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RvcF9pdGVyYXRpb25faW5zaWRlX2dlbmVyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxODI4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdG9wX2l0ZXJhdGlvbl9pbnNpZGVfZ2VuZXJhdG9yLnR4dApAQCAtMCwwICsxLDcgQEAKK3N0b3AtaXRlcmF0aW9uLXJldHVybjoyNDo0Omdlbl9zdG9waXRlcjpEbyBub3QgcmFpc2UgU3RvcEl0ZXJhdGlvbiBpbiBnZW5lcmF0b3IsIHVzZSByZXR1cm4gc3RhdGVtZW50IGluc3RlYWQKK3N0b3AtaXRlcmF0aW9uLXJldHVybjozMjo0Omdlbl9zdG9waXRlcmNoaWxkOkRvIG5vdCByYWlzZSBTdG9wSXRlcmF0aW9uIGluIGdlbmVyYXRvciwgdXNlIHJldHVybiBzdGF0ZW1lbnQgaW5zdGVhZAorc3RvcC1pdGVyYXRpb24tcmV0dXJuOjM5OjE0Omdlbl9uZXh0X3JhaXNlc19zdG9waXRlcjpEbyBub3QgcmFpc2UgU3RvcEl0ZXJhdGlvbiBpbiBnZW5lcmF0b3IsIHVzZSByZXR1cm4gc3RhdGVtZW50IGluc3RlYWQKK3N0b3AtaXRlcmF0aW9uLXJldHVybjo1OToxODpnZW5fbmV4dF9pbnNpZGVfd3JvbmdfdHJ5X2V4Y2VwdDpEbyBub3QgcmFpc2UgU3RvcEl0ZXJhdGlvbiBpbiBnZW5lcmF0b3IsIHVzZSByZXR1cm4gc3RhdGVtZW50IGluc3RlYWQKK3N0b3AtaXRlcmF0aW9uLXJldHVybjo3MjoxMjpnZW5fbmV4dF9pbnNpZGVfd3JvbmdfdHJ5X2V4Y2VwdDI6RG8gbm90IHJhaXNlIFN0b3BJdGVyYXRpb24gaW4gZ2VuZXJhdG9yLCB1c2UgcmV0dXJuIHN0YXRlbWVudCBpbnN0ZWFkCitzdG9wLWl0ZXJhdGlvbi1yZXR1cm46ODc6MTg6Z2VuX2RvbnRfY3Jhc2hfb25fbm9fZXhjZXB0aW9uOkRvIG5vdCByYWlzZSBTdG9wSXRlcmF0aW9uIGluIGdlbmVyYXRvciwgdXNlIHJldHVybiBzdGF0ZW1lbnQgaW5zdGVhZAorc3RvcC1pdGVyYXRpb24tcmV0dXJuOjEyOToxMDppbnZhbGlkX29iamVjdF9wYXNzZWRfdG9fbmV4dDpEbyBub3QgcmFpc2UgU3RvcEl0ZXJhdGlvbiBpbiBnZW5lcmF0b3IsIHVzZSByZXR1cm4gc3RhdGVtZW50IGluc3RlYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzMyZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nLnB5CkBAIC0wLDAgKzEsMjE4IEBACisiIiJUZXN0IGZvciBQeXRob24gMyBzdHJpbmcgZm9ybWF0dGluZyBlcnJvciIiIg0KKw0KKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIGltcG9ydC1lcnJvciwgdW51c2VkLWFyZ3VtZW50LCBsaW5lLXRvby1sb25nLCBuby1hYnNvbHV0ZS1pbXBvcnQsDQorIyBweWxpbnQ6IGRpc2FibGU9dXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UNCitpbXBvcnQgb3MNCitpbXBvcnQgc3lzDQoraW1wb3J0IGxvZ2dpbmcNCitmcm9tIG1pc3NpbmcgaW1wb3J0IE1pc3NpbmcNCisNCisNCitjbGFzcyBDdXN0b20ob2JqZWN0KToNCisgICAgIiIiIEhhcyBhIF9fZ2V0YXR0cl9fICIiIg0KKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgXyk6DQorICAgICAgICByZXR1cm4gc2VsZg0KKw0KKw0KK2NsYXNzIFRlc3Qob2JqZWN0KToNCisgICAgIiIiIHRlc3QgZm9ybWF0IGF0dHJpYnV0ZSBhY2Nlc3MgIiIiDQorICAgIGN1c3RvbSA9IEN1c3RvbSgpDQorICAgIGlkcyA9IFsxLCAyLCAzLCBbNCwgNSwgNl1dDQorDQorDQorY2xhc3MgR2V0aXRlbShvYmplY3QpOg0KKyAgICAiIiIgdGVzdCBjdXN0b20gZ2V0aXRlbSBmb3IgbG9va3VwIGFjY2VzcyAiIiINCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToNCisgICAgICAgIHJldHVybiA0Mg0KKw0KKw0KK2NsYXNzIFJldHVyblllcyhvYmplY3QpOg0KKyAgICAiIiIgY2FuJ3QgYmUgcHJvcGVybHkgaW5mZXJlZCAiIiINCisgICAgbWlzc2luZyA9IE1pc3NpbmcoKQ0KKw0KKw0KK2RlZiBsb2cobWVzc2FnZSwgbWVzc2FnZV90eXBlPSJlcnJvciIpOg0KKyAgICAiIiIgVGVzdCAiIiINCisgICAgcmV0dXJuIG1lc3NhZ2UNCisNCisNCitkZWYgcHJpbnRfZ29vZCgpOg0KKyAgICAiIiIgR29vZCBmb3JtYXQgc3RyaW5ncyAiIiINCisgICAgInswfSB7MX0iLmZvcm1hdCgxLCAyKQ0KKyAgICAiezAhcjoyMH0iLmZvcm1hdCgiSGVsbG8iKQ0KKyAgICAieyFyOjIwfSIuZm9ybWF0KCJIZWxsbyIpDQorICAgICJ7YSFyOjIwfSIuZm9ybWF0KGE9IkhlbGxvIikNCisgICAgIntwaWR9Ii5mb3JtYXQocGlkPW9zLmdldHBpZCgpKQ0KKyAgICBzdHIoInt9IikuZm9ybWF0KDIpDQorICAgICJ7MC5taXNzaW5nLmxlbmd0aH0iLmZvcm1hdChSZXR1cm5ZZXMoKSkNCisgICAgInsxLm1pc3NpbmcubGVuZ3RofSIuZm9ybWF0KFJldHVyblllcygpKQ0KKyAgICAie2EuaWRzWzNdWzFdfSIuZm9ybWF0KGE9VGVzdCgpKQ0KKyAgICAie2FbMF1bMF19Ii5mb3JtYXQoYT1bWzFdXSkNCisgICAgIntbMF1bMF19Ii5mb3JtYXQoezA6IHswOiAxfX0pDQorICAgICJ7YS50ZXN0fSIuZm9ybWF0KGE9Q3VzdG9tKCkpDQorICAgICJ7YS5fX2xlbl9ffSIuZm9ybWF0KGE9W10pDQorICAgICJ7YS5pZHMuX19sZW5fX30iLmZvcm1hdChhPVRlc3QoKSkNCisgICAgInthWzBdfSIuZm9ybWF0KGE9R2V0aXRlbSgpKQ0KKyAgICAie2FbMF1bMF19Ii5mb3JtYXQoYT1bR2V0aXRlbSgpXSkNCisgICAgIntbMF1bMF19Ii5mb3JtYXQoWyJ0ZXN0Il0pDQorICAgICMgdGhlc2UgYXJlIHNraXBwZWQNCisgICAgInswfSB7MX0iLmZvcm1hdCgqWzEsIDJdKQ0KKyAgICAie2F9IHtifSIuZm9ybWF0KCoqeydhJzogMSwgJ2InOiAyfSkNCisgICAgInthfSIuZm9ybWF0KGE9TWlzc2luZygpKQ0KKyAgICBsb2dnaW5nLmRlYnVnKCIlcyIsIDQyKQ0KKyAgICBsb2dnaW5nLmRlYnVnKCIlcyAlcyIsIDQyLCA0MykNCisNCisNCitkZWYgcHByaW50X2JhZCgpOg0KKyAgICAiIiJUZXN0IHN0cmluZyBmb3JtYXQgIiIiDQorICAgICJ7e319Ii5mb3JtYXQoMSkgIyBbdG9vLW1hbnktZm9ybWF0LWFyZ3NdDQorICAgICJ7fSB7Ii5mb3JtYXQoKSAjIFtiYWQtZm9ybWF0LXN0cmluZ10NCisgICAgInt9IH0iLmZvcm1hdCgpICMgW2JhZC1mb3JtYXQtc3RyaW5nXQ0KKyAgICAiezB9IHt9Ii5mb3JtYXQoMSwgMikgIyBbZm9ybWF0LWNvbWJpbmVkLXNwZWNpZmljYXRpb25dDQorICAgICMgKzE6IFttaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXksIHVudXNlZC1mb3JtYXQtc3RyaW5nLWFyZ3VtZW50XQ0KKyAgICAie2F9IHtifSIuZm9ybWF0KGE9MSwgYz0yKQ0KKyAgICAie30ge2F9Ii5mb3JtYXQoMSwgMikgIyBbbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5XQ0KKyAgICAie30ge30iLmZvcm1hdCgxKSAjIFt0b28tZmV3LWZvcm1hdC1hcmdzXQ0KKyAgICAie30ge30iLmZvcm1hdCgxLCAyLCAzKSAjIFt0b28tbWFueS1mb3JtYXQtYXJnc10NCisgICAgIyArMTogW21pc3NpbmctZm9ybWF0LWFyZ3VtZW50LWtleSxtaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXksbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5XQ0KKyAgICAie2F9IHtifSB7Y30iLmZvcm1hdCgpDQorICAgICJ7fSB7fSIuZm9ybWF0KGE9MSwgYj0yKSAjIFt0b28tZmV3LWZvcm1hdC1hcmdzXQ0KKyAgICAjICsxOiBbbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5LCBtaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXldDQorICAgICJ7YX0ge2J9Ii5mb3JtYXQoMSwgMikNCisgICAgInswfSB7MX0ge2F9Ii5mb3JtYXQoMSwgMiwgMykgIyBbbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5XQ0KKyAgICAjICsxOiBbbWlzc2luZy1mb3JtYXQtYXR0cmlidXRlXQ0KKyAgICAie2EuaWRzLl9fbGVuX18ubGVuZ3RofSIuZm9ybWF0KGE9VGVzdCgpKQ0KKyAgICAie2EuaWRzWzNdWzQwMF19Ii5mb3JtYXQoYT1UZXN0KCkpICMgW2ludmFsaWQtZm9ybWF0LWluZGV4XQ0KKyAgICAie2EuaWRzWzNdWydzdHJpbmcnXX0iLmZvcm1hdChhPVRlc3QoKSkgIyBbaW52YWxpZC1mb3JtYXQtaW5kZXhdDQorICAgICJ7WzBdWzFdfSIuZm9ybWF0KFsiYSJdKSAjIFtpbnZhbGlkLWZvcm1hdC1pbmRleF0NCisgICAgIntbMF1bMF19Ii5mb3JtYXQoKCgxLCApKSkgIyBbaW52YWxpZC1mb3JtYXQtaW5kZXhdDQorICAgICMgKzE6IFttaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXksIHVudXNlZC1mb3JtYXQtc3RyaW5nLWFyZ3VtZW50XQ0KKyAgICAie2JbMF19Ii5mb3JtYXQoYT0yMykNCisgICAgInthWzBdfSIuZm9ybWF0KGE9b2JqZWN0KSAjIFtpbnZhbGlkLWZvcm1hdC1pbmRleF0NCisgICAgbG9nKCJ7fSIuZm9ybWF0KDIsICJpbmZvIikpICMgW3Rvby1tYW55LWZvcm1hdC1hcmdzXQ0KKyAgICAiezAubWlzc2luZ30iLmZvcm1hdCgyKSAjIFttaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGVdDQorICAgICJ7MH0gezF9IHsyfSIuZm9ybWF0KDEsIDIpICMgW3Rvby1mZXctZm9ybWF0LWFyZ3NdDQorICAgICJ7MH0gezF9Ii5mb3JtYXQoMSwgMiwgMykgIyBbdG9vLW1hbnktZm9ybWF0LWFyZ3NdDQorICAgICJ7MH0ge2F9Ii5mb3JtYXQoYT00KSAjIFt0b28tZmV3LWZvcm1hdC1hcmdzXQ0KKyAgICAie1swXX0ge30iLmZvcm1hdChbNF0pICMgW3Rvby1mZXctZm9ybWF0LWFyZ3NdDQorICAgICJ7WzBdfSB7fSIuZm9ybWF0KFs0XSwgNSwgNikgIyBbdG9vLW1hbnktZm9ybWF0LWFyZ3NdDQorICAgIGxvZ2dpbmcuZGVidWcoIiVzICVzIiwgNDIpICMgW2xvZ2dpbmctdG9vLWZldy1hcmdzXQ0KKyAgICBsb2dnaW5nLmRlYnVnKCIlcyIsIDQyLCA0MykgIyBbbG9nZ2luZy10b28tbWFueS1hcmdzXQ0KKw0KKw0KK2RlZiBnb29kX2lzc3VlMjg4KCphcmdzLCAqKmt3YXJncyk6DQorICAgICIiIiBUZXN0IHRoYXQgdXNpbmcga3dhcmdzIGRvZXMgbm90IGVtaXQgYSBmYWxzZQ0KKyAgICBwb3NpdGl2ZS4NCisgICAgIiIiDQorICAgICdIZWxsbyBKb2huIERvZSB7MFswXX0nLmZvcm1hdChhcmdzKQ0KKyAgICAnSGVsbG8gezBbbmFtZV19Jy5mb3JtYXQoa3dhcmdzKQ0KKw0KKw0KK2RlZiBnb29kX2lzc3VlMjg3KCk6DQorICAgICIiIiBUZXN0IHRoYXQgdGhlIHN0cmluZyBmb3JtYXQgY2hlY2tlciBza2lwcw0KKyAgICBmb3JtYXQgbm9kZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHN0cmluZyBhcyBhIHBhcmVudA0KKyAgICAoYnV0IGEgc3Vic2NyaXB0LCBuYW1lIGV0YykuDQorICAgICIiIg0KKyAgICBuYW1lID0gJ3F3ZXJ0eScNCisgICAgcmV0ID0geydjb21tZW50JzogJyd9DQorICAgIHJldFsnY29tbWVudCddID0gJ015U1FMIGdyYW50IHswfSBpcyBzZXQgdG8gYmUgcmV2b2tlZCcNCisgICAgcmV0Wydjb21tZW50J10gPSByZXRbJ2NvbW1lbnQnXS5mb3JtYXQobmFtZSkNCisgICAgcmV0dXJuIHJldCwgbmFtZQ0KKw0KKw0KK2RlZiBuZXN0ZWRfaXNzdWUyOTQoKToNCisgICAgIiIiIFRlc3QgbmVzdGVkIGZvcm1hdCBmaWVsZHMuICIiIg0KKyAgICAnezA6PnsxfX0nLmZvcm1hdCg0MiwgMjQpDQorICAgICd7MDp7YVsxXX19IHthfScuZm9ybWF0KDEsIGE9WzEsIDJdKQ0KKyAgICAnezo+e319Jy5mb3JtYXQoNDIsIDI0KQ0KKyAgICAnezA6PnsxfX0nLmZvcm1hdCg0MikgIyBbdG9vLWZldy1mb3JtYXQtYXJnc10NCisgICAgJ3swOj57MX19Jy5mb3JtYXQoNDIsIDI0LCA1NCkgIyBbdG9vLW1hbnktZm9ybWF0LWFyZ3NdDQorICAgICd7MDp7YVsxXX19Jy5mb3JtYXQoMSkgIyBbbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5XQ0KKyAgICAnezA6e2EueH19Jy5mb3JtYXQoMSwgYT0yKSAjIFttaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGVdDQorDQorDQorZGVmIGlzc3VlMzEwKCk6DQorICAgICIiIiBUZXN0IGEgcmVncmVzc2lvbiB1c2luZyBkdXBsaWNhdGUgbWFudWFsIHBvc2l0aW9uIGFyZ3VtZW50cy4gIiIiDQorICAgICd7MH0gezF9IHswfScuZm9ybWF0KDEsIDIpDQorICAgICd7MH0gezF9IHswfScuZm9ybWF0KDEpICMgW3Rvby1mZXctZm9ybWF0LWFyZ3NdDQorDQorDQorZGVmIGlzc3VlMzIyKCk6DQorICAgICIiIiBUZXN0IGEgcmVncmVzc2lvbiB1c2luZyBtaXhlZCBtYW51YWwgcG9zaXRpb24gYXJndW1lbnRzDQorICAgIGFuZCBhdHRyaWJ1dGUgYWNjZXNzIGFyZ3VtZW50cy4NCisgICAgIiIiDQorICAgICd7MH17MVtGT09dfScuZm9ybWF0KDEyMywgeydGT08nOiA0NTZ9KQ0KKyAgICAnezB9ezFbRk9PXX0nLmZvcm1hdCgxMjMsIHsnRk9PJzogNDU2fSwgMzIxKSAjIFt0b28tbWFueS1mb3JtYXQtYXJnc10NCisgICAgJ3swfXsxW0ZPT119Jy5mb3JtYXQoMTIzKSAjIFt0b28tZmV3LWZvcm1hdC1hcmdzXQ0KKw0KKw0KK2RlZiBpc3N1ZTMzOCgpOg0KKyAgICAiIiINCisgICAgQ2hlY2sgdGhhdCB1c2luZyBhIG5hbWVkdHVwbGUgc3ViY2xhc3MgZG9lc24ndCBjcmFzaCB3aGVuDQorICAgIHRyeWluZyB0byBpbmZlciBFbXB0eU5vZGVzIChyZXN1bHRlZCBhZnRlciBtb2NraW5nIHRoZQ0KKyAgICBtZW1iZXJzIG9mIG5hbWVkdHVwbGVzKS4NCisgICAgIiIiDQorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUgIyBweWxpbnQ6IGRpc2FibGU9aW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwNCisNCisgICAgY2xhc3MgQ3Jhc2gobmFtZWR0dXBsZSgiQyIsICJmb28gYmFyIikpOg0KKyAgICAgICAgIiIiIExvb2tpbmcgZm9yIGF0dHJpYnV0ZXMgaW4gX19zdHJfXyB3aWxsIGNyYXNoLA0KKyAgICAgICAgYmVjYXVzZSBFbXB0eU5vZGVzIGNhbid0IGJlIGluZmVyZWQuDQorICAgICAgICAiIiINCisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KKyAgICAgICAgICAgIHJldHVybiAiezAuZm9vfTogezAuYmFyfSIuZm9ybWF0KHNlbGYpDQorICAgIHJldHVybiBDcmFzaA0KKw0KKw0KK2RlZiBpc3N1ZTM1MSgpOg0KKyAgICAiIiINCisgICAgQ2hlY2sgdGhhdCB0aGUgZm9ybWF0IG1ldGhvZCBjYW4gYmUgYXNzaWduZWQgdG8gYSB2YXJpYWJsZSwgaWU6DQorICAgICIiIg0KKyAgICBmbXQgPSAndGVzdCB7fSB7fScuZm9ybWF0DQorICAgIGZtdCgnYXJnMScpICMgW3Rvby1mZXctZm9ybWF0LWFyZ3NdDQorICAgIGZtdCgnYXJnMScsICdhcmcyJykNCisgICAgZm10KCdhcmcxJywgJ2FyZzInLCAnYXJnMycpICMgW3Rvby1tYW55LWZvcm1hdC1hcmdzXQ0KKw0KKw0KK2RlZiBpc3N1ZTM3MygpOg0KKyAgICAiIiINCisgICAgSWdub3JlIGFueSBvYmplY3QgY29taW5nIGZyb20gYW4gYXJndW1lbnQuDQorICAgICIiIg0KKyAgICBjbGFzcyBTb21lQ2xhc3Mob2JqZWN0KToNCisgICAgICAgICIiIiBlbXB0eSBkb2NzdHJpbmcuICIiIg0KKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdHM9Tm9uZSk6DQorICAgICAgICAgICAgc2VsZi5vcHRzID0gb3B0cw0KKw0KKyAgICAgICAgZGVmIGR1bmMoc2VsZiwgYXJnKToNCisgICAgICAgICAgICAiIiJEb24ndCB0cnkgdG8gYW5hbHl6ZSB0aGlzLiIiIg0KKyAgICAgICAgICAgIHJldHVybiAiQXswfXsxfSIuZm9ybWF0KGFyZywgc2VsZi5vcHRzKQ0KKw0KKyAgICAgICAgZGVmIGZ1bmMoc2VsZik6DQorICAgICAgICAgICAgIiIiRG9uJ3QgdHJ5IHRvIGFuYWx5emUgdGhlIGZvbGxvd2luZyBzdHJpbmcuIiIiDQorICAgICAgICAgICAgcmV0dXJuICdBQUF7MFtpZmFjZV19QkJCezBbcG9ydF19Jy5mb3JtYXQoc2VsZi5vcHRzKQ0KKw0KKyAgICByZXR1cm4gU29tZUNsYXNzDQorDQorDQorZGVmIGlzc3VlXzQ2MygpOg0KKyAgICAiIiINCisgICAgTWl4IHBvc2l0aW9uYWwgYXJndW1lbnRzLCBgezB9YCwgd2l0aCBwb3NpdGlvbmFsDQorICAgIGFyZ3VtZW50cyB3aXRoIGF0dHJpYnV0ZSBhY2Nlc3MsIGB7MC5fX3hfX31gLg0KKyAgICAiIiINCisgICAgZGF0YSA9ICJ7MC5fX2NsYXNzX18uX19uYW1lX199OiB7MH0iLmZvcm1hdCg0MikNCisgICAgZGF0YTIgPSAiezBbMF19OiB7MH0iLmZvcm1hdChbMV0pDQorICAgIHJldHVybiAoZGF0YSwgZGF0YTIpDQorDQorDQorZGVmIGF2b2lkX2VtcHR5X2F0dHJpYnV0ZSgpOg0KKyAgICAiIiJUaGUgZm9sbG93aW5nIHN0cmluZyBpcyBpbnZhbGlkLCBhdm9pZCBjcmFzaGluZy4iIiINCisNCisgICAgcmV0dXJuICJUaGVyZSBhcmUgey46MmZ9IHVuZGlzY292ZXJlZCBlcnJvcnMuIi5mb3JtYXQoMSkgIyBbYmFkLWZvcm1hdC1zdHJpbmddDQorDQorDQorZGVmIGludmFsaWRfZm9ybWF0X2luZGV4X29uX2luZmVyZW5jZV9hbWJpZ3VpdHkoKToNCisgICAgIiIiVGVzdCBpbmZlcmVuY2UgYnVnIGZvciBpbnZhbGlkLWZvcm1hdC1pbmRleCIiIg0KKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToNCisgICAgICAgIG9wdGlvbnMgPSBbWyJXb29mISJdXQ0KKyAgICBlbHNlOg0KKyAgICAgICAgb3B0aW9ucyA9IFtbIkJhcmYhIl1dDQorICAgIHJldHVybiAnV2h5IGlzIHRoaXMgYmFkPyB7b3B0aW9uc1swXVswXX0nLmZvcm1hdChvcHRpb25zPW9wdGlvbnMpDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTIyZGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZy50eHQKQEAgLTAsMCArMSw0MyBAQAordG9vLW1hbnktZm9ybWF0LWFyZ3M6Njg6NDpwcHJpbnRfYmFkOlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZworYmFkLWZvcm1hdC1zdHJpbmc6Njk6NDpwcHJpbnRfYmFkOkludmFsaWQgZm9ybWF0IHN0cmluZworYmFkLWZvcm1hdC1zdHJpbmc6NzA6NDpwcHJpbnRfYmFkOkludmFsaWQgZm9ybWF0IHN0cmluZworZm9ybWF0LWNvbWJpbmVkLXNwZWNpZmljYXRpb246NzE6NDpwcHJpbnRfYmFkOkZvcm1hdCBzdHJpbmcgY29udGFpbnMgYm90aCBhdXRvbWF0aWMgZmllbGQgbnVtYmVyaW5nIGFuZCBtYW51YWwgZmllbGQgc3BlY2lmaWNhdGlvbgorbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5OjczOjQ6cHByaW50X2JhZDpNaXNzaW5nIGtleXdvcmQgYXJndW1lbnQgJ2InIGZvciBmb3JtYXQgc3RyaW5nCit1bnVzZWQtZm9ybWF0LXN0cmluZy1hcmd1bWVudDo3Mzo0OnBwcmludF9iYWQ6VW51c2VkIGZvcm1hdCBhcmd1bWVudCAnYycKK21pc3NpbmctZm9ybWF0LWFyZ3VtZW50LWtleTo3NDo0OnBwcmludF9iYWQ6TWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50ICdhJyBmb3IgZm9ybWF0IHN0cmluZwordG9vLWZldy1mb3JtYXQtYXJnczo3NTo0OnBwcmludF9iYWQ6Tm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK3Rvby1tYW55LWZvcm1hdC1hcmdzOjc2OjQ6cHByaW50X2JhZDpUb28gbWFueSBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK21pc3NpbmctZm9ybWF0LWFyZ3VtZW50LWtleTo3ODo0OnBwcmludF9iYWQ6TWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50ICdhJyBmb3IgZm9ybWF0IHN0cmluZworbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5Ojc4OjQ6cHByaW50X2JhZDpNaXNzaW5nIGtleXdvcmQgYXJndW1lbnQgJ2InIGZvciBmb3JtYXQgc3RyaW5nCittaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXk6Nzg6NDpwcHJpbnRfYmFkOk1pc3Npbmcga2V5d29yZCBhcmd1bWVudCAnYycgZm9yIGZvcm1hdCBzdHJpbmcKK3Rvby1mZXctZm9ybWF0LWFyZ3M6Nzk6NDpwcHJpbnRfYmFkOk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nCittaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXk6ODE6NDpwcHJpbnRfYmFkOk1pc3Npbmcga2V5d29yZCBhcmd1bWVudCAnYScgZm9yIGZvcm1hdCBzdHJpbmcKK21pc3NpbmctZm9ybWF0LWFyZ3VtZW50LWtleTo4MTo0OnBwcmludF9iYWQ6TWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50ICdiJyBmb3IgZm9ybWF0IHN0cmluZworbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5OjgyOjQ6cHByaW50X2JhZDpNaXNzaW5nIGtleXdvcmQgYXJndW1lbnQgJ2EnIGZvciBmb3JtYXQgc3RyaW5nCittaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGU6ODQ6NDpwcHJpbnRfYmFkOk1pc3NpbmcgZm9ybWF0IGF0dHJpYnV0ZSAnbGVuZ3RoJyBpbiBmb3JtYXQgc3BlY2lmaWVyICdhLmlkcy5fX2xlbl9fLmxlbmd0aCcKK2ludmFsaWQtZm9ybWF0LWluZGV4Ojg1OjQ6cHByaW50X2JhZDpVc2luZyBpbnZhbGlkIGxvb2t1cCBrZXkgNDAwIGluIGZvcm1hdCBzcGVjaWZpZXIgJ2EuaWRzWzNdWzQwMF0nCitpbnZhbGlkLWZvcm1hdC1pbmRleDo4Njo0OnBwcmludF9iYWQ6IlVzaW5nIGludmFsaWQgbG9va3VwIGtleSAiIidzdHJpbmcnIiIgaW4gZm9ybWF0IHNwZWNpZmllciAnYS5pZHNbM11bIiJcJ3N0cmluZ1wnIiJdJyIKK2ludmFsaWQtZm9ybWF0LWluZGV4Ojg3OjQ6cHByaW50X2JhZDpVc2luZyBpbnZhbGlkIGxvb2t1cCBrZXkgMSBpbiBmb3JtYXQgc3BlY2lmaWVyICcwWzBdWzFdJworaW52YWxpZC1mb3JtYXQtaW5kZXg6ODg6NDpwcHJpbnRfYmFkOlVzaW5nIGludmFsaWQgbG9va3VwIGtleSAwIGluIGZvcm1hdCBzcGVjaWZpZXIgJzBbMF1bMF0nCittaXNzaW5nLWZvcm1hdC1hcmd1bWVudC1rZXk6OTA6NDpwcHJpbnRfYmFkOk1pc3Npbmcga2V5d29yZCBhcmd1bWVudCAnYicgZm9yIGZvcm1hdCBzdHJpbmcKK3VudXNlZC1mb3JtYXQtc3RyaW5nLWFyZ3VtZW50OjkwOjQ6cHByaW50X2JhZDpVbnVzZWQgZm9ybWF0IGFyZ3VtZW50ICdhJworaW52YWxpZC1mb3JtYXQtaW5kZXg6OTE6NDpwcHJpbnRfYmFkOlVzaW5nIGludmFsaWQgbG9va3VwIGtleSAwIGluIGZvcm1hdCBzcGVjaWZpZXIgJ2FbMF0nCit0b28tbWFueS1mb3JtYXQtYXJnczo5Mjo4OnBwcmludF9iYWQ6VG9vIG1hbnkgYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nCittaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGU6OTM6NDpwcHJpbnRfYmFkOk1pc3NpbmcgZm9ybWF0IGF0dHJpYnV0ZSAnbWlzc2luZycgaW4gZm9ybWF0IHNwZWNpZmllciAnMC5taXNzaW5nJwordG9vLWZldy1mb3JtYXQtYXJnczo5NDo0OnBwcmludF9iYWQ6Tm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK3Rvby1tYW55LWZvcm1hdC1hcmdzOjk1OjQ6cHByaW50X2JhZDpUb28gbWFueSBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK3Rvby1mZXctZm9ybWF0LWFyZ3M6OTY6NDpwcHJpbnRfYmFkOk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nCit0b28tZmV3LWZvcm1hdC1hcmdzOjk3OjQ6cHByaW50X2JhZDpOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZwordG9vLW1hbnktZm9ybWF0LWFyZ3M6OTg6NDpwcHJpbnRfYmFkOlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZworbG9nZ2luZy10b28tZmV3LWFyZ3M6OTk6NDpwcHJpbnRfYmFkOk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBsb2dnaW5nIGZvcm1hdCBzdHJpbmcKK2xvZ2dpbmctdG9vLW1hbnktYXJnczoxMDA6NDpwcHJpbnRfYmFkOlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgbG9nZ2luZyBmb3JtYXQgc3RyaW5nCit0b28tZmV3LWZvcm1hdC1hcmdzOjEyODo0Om5lc3RlZF9pc3N1ZTI5NDpOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZwordG9vLW1hbnktZm9ybWF0LWFyZ3M6MTI5OjQ6bmVzdGVkX2lzc3VlMjk0OlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZworbWlzc2luZy1mb3JtYXQtYXJndW1lbnQta2V5OjEzMDo0Om5lc3RlZF9pc3N1ZTI5NDpNaXNzaW5nIGtleXdvcmQgYXJndW1lbnQgJ2EnIGZvciBmb3JtYXQgc3RyaW5nCittaXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGU6MTMxOjQ6bmVzdGVkX2lzc3VlMjk0Ok1pc3NpbmcgZm9ybWF0IGF0dHJpYnV0ZSAneCcgaW4gZm9ybWF0IHNwZWNpZmllciAnYS54JwordG9vLWZldy1mb3JtYXQtYXJnczoxMzc6NDppc3N1ZTMxMDpOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgZm9ybWF0IHN0cmluZwordG9vLW1hbnktZm9ybWF0LWFyZ3M6MTQ1OjQ6aXNzdWUzMjI6VG9vIG1hbnkgYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nCit0b28tZmV3LWZvcm1hdC1hcmdzOjE0Njo0Omlzc3VlMzIyOk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nCit0b28tZmV3LWZvcm1hdC1hcmdzOjE3MTo0Omlzc3VlMzUxOk5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nCit0b28tbWFueS1mb3JtYXQtYXJnczoxNzM6NDppc3N1ZTM1MTpUb28gbWFueSBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK2JhZC1mb3JtYXQtc3RyaW5nOjIwOToxMTphdm9pZF9lbXB0eV9hdHRyaWJ1dGU6SW52YWxpZCBmb3JtYXQgc3RyaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Rpc2FibGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Rpc2FibGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmM2RjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZGlzYWJsZS5weQpAQCAtMCwwICsxIEBACisiYSB7fSB7Ii5mb3JtYXQoMSkgIyBbYmFkLWZvcm1hdC1zdHJpbmddCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Rpc2FibGUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Rpc2FibGUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5MzMzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZGlzYWJsZS5yYwpAQCAtMCwwICsxLDMgQEAKK1tNZXNzYWdlcyBDb250cm9sXQorZGlzYWJsZT1hbGwKK2VuYWJsZT1iYWQtZm9ybWF0LXN0cmluZwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19kaXNhYmxlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZGlzYWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlMzkwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZGlzYWJsZS50eHQKQEAgLTAsMCArMSBAQAorYmFkLWZvcm1hdC1zdHJpbmc6MTowOjpJbnZhbGlkIGZvcm1hdCBzdHJpbmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZXJyb3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Vycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Vycm9yLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyIiInRlc3Qgc3RyaW5nIGZvcm1hdCBlcnJvciIiIgorIyBweWxpbnQ6IGRpc2FibGU9cHJpbnQtc3RhdGVtZW50LHVuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb24sbGluZS10b28tbG9uZworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitQQVJHXzEgPSBQQVJHXzIgPSBQQVJHXzMgPSAxCisKKworZGVmIHBwcmludCgpOgorICAgICIiIlRlc3Qgc3RyaW5nIGZvcm1hdCIiIgorICAgIHByaW50KCIlcyAlcyIgJSB7J1BBUkdfMSc6IDEsICdQQVJHXzInOiAyfSkgICMgW3Rvby1mZXctZm9ybWF0LWFyZ3NdCisgICAgcHJpbnQoIiVzIiAlIChQQVJHXzEsIFBBUkdfMikpICAjIFt0b28tbWFueS1mb3JtYXQtYXJnc10KKyAgICBwcmludCgiJShQQVJHXzEpZCAlZCIgJSB7J1BBUkdfMSc6IDEsICdQQVJHXzInOiAyfSkgICMgW21peGVkLWZvcm1hdC1zdHJpbmddCisgICAgcHJpbnQoIiUoUEFSR18xKWQgJShQQVJHXzIpZCIgJSB7J1BBUkdfMSc6IDF9KSAgIyBbbWlzc2luZy1mb3JtYXQtc3RyaW5nLWtleV0KKyAgICBwcmludCgiJShQQVJHXzEpZCAlKFBBUkdfMilkIiAlIHsnUEFSR18xJzogMSwgJ1BBUkdfMic6MiwgJ1BBUkdfMyc6M30pICAjIFt1bnVzZWQtZm9ybWF0LXN0cmluZy1rZXldCisgICAgcHJpbnQoIiUoUEFSR18xKWQgJShQQVJHXzIpZCIgJSB7J1BBUkdfMSc6IDEsIDI6M30pICMgW21pc3NpbmctZm9ybWF0LXN0cmluZy1rZXksYmFkLWZvcm1hdC1zdHJpbmcta2V5XQorICAgIHByaW50KCIlKFBBUkdfMSlkICUoUEFSR18yKWQiICUgKDIsIDMpKSAjIFtmb3JtYXQtbmVlZHMtbWFwcGluZ10KKyAgICBwcmludCgiJShQQVJHXzEpZCAlKFBBUkdfMilkIiAlIFsyLCAzXSkgIyBbZm9ybWF0LW5lZWRzLW1hcHBpbmddCisgICAgcHJpbnQoIiUyeiIgJSBQQVJHXzEpICAjIFtiYWQtZm9ybWF0LWNoYXJhY3Rlcl0KKyAgICBwcmludCgic3RyYW5nZSBmb3JtYXQgJTIiICUgUEFSR18yKSAjIFt0cnVuY2F0ZWQtZm9ybWF0LXN0cmluZ10KKyAgICBwcmludCgid29ya3MgaW4gMyAlYSIgJSAxKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19lcnJvci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX2Vycm9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmI2N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19lcnJvci50eHQKQEAgLTAsMCArMSwxMSBAQAordG9vLWZldy1mb3JtYXQtYXJnczoxMDoxMDpwcHJpbnQ6Tm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK3Rvby1tYW55LWZvcm1hdC1hcmdzOjExOjEwOnBwcmludDpUb28gbWFueSBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK21peGVkLWZvcm1hdC1zdHJpbmc6MTI6MTA6cHByaW50Ok1peGluZyBuYW1lZCBhbmQgdW5uYW1lZCBjb252ZXJzaW9uIHNwZWNpZmllcnMgaW4gZm9ybWF0IHN0cmluZworbWlzc2luZy1mb3JtYXQtc3RyaW5nLWtleToxMzoxMDpwcHJpbnQ6TWlzc2luZyBrZXkgJ1BBUkdfMicgaW4gZm9ybWF0IHN0cmluZyBkaWN0aW9uYXJ5Cit1bnVzZWQtZm9ybWF0LXN0cmluZy1rZXk6MTQ6MTA6cHByaW50OlVudXNlZCBrZXkgJ1BBUkdfMycgaW4gZm9ybWF0IHN0cmluZyBkaWN0aW9uYXJ5CitiYWQtZm9ybWF0LXN0cmluZy1rZXk6MTU6MTA6cHByaW50OkZvcm1hdCBzdHJpbmcgZGljdGlvbmFyeSBrZXkgc2hvdWxkIGJlIGEgc3RyaW5nLCBub3QgMgorbWlzc2luZy1mb3JtYXQtc3RyaW5nLWtleToxNToxMDpwcHJpbnQ6TWlzc2luZyBrZXkgJ1BBUkdfMicgaW4gZm9ybWF0IHN0cmluZyBkaWN0aW9uYXJ5Citmb3JtYXQtbmVlZHMtbWFwcGluZzoxNjoxMDpwcHJpbnQ6RXhwZWN0ZWQgbWFwcGluZyBmb3IgZm9ybWF0IHN0cmluZywgbm90IFR1cGxlCitmb3JtYXQtbmVlZHMtbWFwcGluZzoxNzoxMDpwcHJpbnQ6RXhwZWN0ZWQgbWFwcGluZyBmb3IgZm9ybWF0IHN0cmluZywgbm90IExpc3QKK2JhZC1mb3JtYXQtY2hhcmFjdGVyOjE4OjEwOnBwcmludDpVbnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICd6JyAoMHg3YSkgYXQgaW5kZXggMgordHJ1bmNhdGVkLWZvcm1hdC1zdHJpbmc6MTk6MTA6cHByaW50OkZvcm1hdCBzdHJpbmcgZW5kcyBpbiBtaWRkbGUgb2YgY29udmVyc2lvbiBzcGVjaWZpZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZmFpbGVkX2luZmVyZW5jZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZmFpbGVkX2luZmVyZW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFkZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19mYWlsZWRfaW5mZXJlbmNlLnB5CkBAIC0wLDAgKzEsNCBAQAorIiIiIFRlc3Rpbmcgc3RyaW5nIGZvcm1hdCB3aXRoIGEgZmFpbGVkIGluZmVyZW5jZS4gVGhpcyBzaG91bGQgbm90IGNyYXNoLiAiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QKK2ltcG9ydCBjb2xsZWN0aW9ucworIntkaWN0WzBdfSIuZm9ybWF0KGRpY3Q9Y29sbGVjdGlvbnMuZGVmYXVsdGRpY3QoaW50KSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZmFpbGVkX2luZmVyZW5jZV9weTM1LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19mYWlsZWRfaW5mZXJlbmNlX3B5MzUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMWZmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZmFpbGVkX2luZmVyZW5jZV9weTM1LnB5CkBAIC0wLDAgKzEsNiBAQAorIiIiIFRlc3Rpbmcgc3RyaW5nIGZvcm1hdCB3aXRoIGEgZmFpbGVkIGluZmVyZW5jZS4gVGhpcyBzaG91bGQgbm90IGNyYXNoLiAiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QKK2ltcG9ydCBjb2xsZWN0aW9ucworIntkaWN0WzBdfSIuZm9ybWF0KGRpY3Q9Y29sbGVjdGlvbnMuZGVmYXVsdGRpY3QoaW50KSkKKworQ09NTUVOVCA9ICJtZXNzYWdlICVzICVzICVzIiAlICgwLCAqKDEgaWYgImNvbmQiIGVsc2UgMiwpICogMikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZmFpbGVkX2luZmVyZW5jZV9weTM1LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19mYWlsZWRfaW5mZXJlbmNlX3B5MzUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkZThiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfZmFpbGVkX2luZmVyZW5jZV9weTM1LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19weTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX3B5My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RkNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19weTMucHkKQEAgLTAsMCArMSwyMSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW1wb3J0LWVycm9yCisKKworZGVmIGlzc3VlXzk1N19nb29kKCk6CisgICAgbWVhdCA9IFsnc3BhbScsICdoYW0nXQorICAgIHByaW50KCclcyVzJXMnICUgKCdlZ2dzJywgKm1lYXQpKQorCisKK2RlZiBpc3N1ZV85NTdfYmFkMSgpOgorICAgIG1lYXQgPSBbJ3NwYW0nLCAnaGFtJywgJ21vbnR5IHB5dGhvbiddCisgICAgcHJpbnQoJyVzJXMlcycgJSAoJ2VnZ3MnLCAqbWVhdCkpICAjIFt0b28tbWFueS1mb3JtYXQtYXJnc10KKworCitkZWYgaXNzdWVfOTU3X2JhZDIoKToKKyAgICBtZWF0ID0gWydzcGFtJ10KKyAgICBwcmludCgnJXMlcyVzJyAlICgnZWdncycsICptZWF0KSkgICMgW3Rvby1mZXctZm9ybWF0LWFyZ3NdCisKKworZGVmIGlzc3VlXzk1N191bmluZmVyYWJsZSgpOgorICAgIGZyb20gYnV0Y2hlcnkgaW1wb3J0IG1lYXQgIyBweWxpbnQ6IGRpc2FibGU9aW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKKyAgICBwcmludCgnJXMlcyVzJyAlICgnZWdncycsICptZWF0KSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfcHkzLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2Zvcm1hdHRpbmdfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19weTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfZm9ybWF0dGluZ19weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOTBlMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19mb3JtYXR0aW5nX3B5My50eHQKQEAgLTAsMCArMSwyIEBACit0b28tbWFueS1mb3JtYXQtYXJnczoxMToxMDppc3N1ZV85NTdfYmFkMTpUb28gbWFueSBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKK3Rvby1mZXctZm9ybWF0LWFyZ3M6MTY6MTA6aXNzdWVfOTU3X2JhZDI6Tm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2xvZ19mb3JtYXR0aW5nLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfbG9nX2Zvcm1hdHRpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzZDQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdHJpbmcvc3RyaW5nX2xvZ19mb3JtYXR0aW5nLnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydAorIiIiVGVzdCBjaGVja2luZyBvZiBsb2cgZm9ybWF0IHN0cmluZ3MKKyIiIgorCitpbXBvcnQgbG9nZ2luZworCitfX3JldmlzaW9uX18gPSAnJworCisKK2RlZiBwcHJpbnQoKToKKyAgICAiIiJUZXN0IHN0cmluZyBmb3JtYXQgaW4gbG9nZ2luZyBzdGF0ZW1lbnRzLgorICAgICIiIgorICAgICMgVGhlc2Ugc2hvdWxkIGFsbCBlbWl0IGxpbnQgZXJyb3JzOgorICAgIGxvZ2dpbmcuaW5mbygwLCAnJykgICMgW2xvZ2dpbmctdG9vLW1hbnktYXJnc10KKyAgICBsb2dnaW5nLmluZm8oJycsICcnKSAjIFtsb2dnaW5nLXRvby1tYW55LWFyZ3NdCisgICAgbG9nZ2luZy5pbmZvKCclcyUnLCAnJykgIyBbbG9nZ2luZy1mb3JtYXQtdHJ1bmNhdGVkXQorICAgIGxvZ2dpbmcuaW5mbygnJXMlcycsICcnKSAjIFtsb2dnaW5nLXRvby1mZXctYXJnc10KKyAgICBsb2dnaW5nLmluZm8oJyVzJXknLCAnJywgJycpICMgW2xvZ2dpbmctdW5zdXBwb3J0ZWQtZm9ybWF0XQorICAgIGxvZ2dpbmcuaW5mbygnJXMlcycsICcnLCAnJywgJycpICMgW2xvZ2dpbmctdG9vLW1hbnktYXJnc10KKworICAgICMgVGhlc2Ugc2hvdWxkIGJlIG9rYXk6CisgICAgbG9nZ2luZy5pbmZvKDEpCisgICAgbG9nZ2luZy5pbmZvKFRydWUpCisgICAgbG9nZ2luZy5pbmZvKCcnKQorICAgIGxvZ2dpbmcuaW5mbygnJXMlJykKKyAgICBsb2dnaW5nLmluZm8oJyVzJywgJycpCisgICAgbG9nZ2luZy5pbmZvKCclcyUlJywgJycpCisgICAgbG9nZ2luZy5pbmZvKCclcyVzJywgJycsICcnKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfbG9nX2Zvcm1hdHRpbmcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N0cmluZy9zdHJpbmdfbG9nX2Zvcm1hdHRpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzljMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3RyaW5nL3N0cmluZ19sb2dfZm9ybWF0dGluZy50eHQKQEAgLTAsMCArMSw2IEBACitsb2dnaW5nLXRvby1tYW55LWFyZ3M6MTQ6NDpwcHJpbnQ6VG9vIG1hbnkgYXJndW1lbnRzIGZvciBsb2dnaW5nIGZvcm1hdCBzdHJpbmcKK2xvZ2dpbmctdG9vLW1hbnktYXJnczoxNTo0OnBwcmludDpUb28gbWFueSBhcmd1bWVudHMgZm9yIGxvZ2dpbmcgZm9ybWF0IHN0cmluZworbG9nZ2luZy1mb3JtYXQtdHJ1bmNhdGVkOjE2OjQ6cHByaW50OkxvZ2dpbmcgZm9ybWF0IHN0cmluZyBlbmRzIGluIG1pZGRsZSBvZiBjb252ZXJzaW9uIHNwZWNpZmllcgorbG9nZ2luZy10b28tZmV3LWFyZ3M6MTc6NDpwcHJpbnQ6Tm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGxvZ2dpbmcgZm9ybWF0IHN0cmluZworbG9nZ2luZy11bnN1cHBvcnRlZC1mb3JtYXQ6MTg6NDpwcHJpbnQ6VW5zdXBwb3J0ZWQgbG9nZ2luZyBmb3JtYXQgY2hhcmFjdGVyICd5JyAoMHg3OSkgYXQgaW5kZXggMworbG9nZ2luZy10b28tbWFueS1hcmdzOjE5OjQ6cHByaW50OlRvbyBtYW55IGFyZ3VtZW50cyBmb3IgbG9nZ2luZyBmb3JtYXQgc3RyaW5nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VicHJvY2Vzc19wb3Blbl9wcmVleGVjX2ZuLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1YnByb2Nlc3NfcG9wZW5fcHJlZXhlY19mbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI2MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1YnByb2Nlc3NfcG9wZW5fcHJlZXhlY19mbi5weQpAQCAtMCwwICsxLDExIEBACisjIHB5bGludDogZGlzYWJsZT1kaXNhbGxvd2VkLW5hbWUsbm8tdmFsdWUtZm9yLXBhcmFtZXRlcixtaXNzaW5nLWRvY3N0cmluZyxjb25zaWRlci11c2luZy13aXRoCisKK2ltcG9ydCBzdWJwcm9jZXNzCisKK2RlZiBmb28oKToKKyAgICBwYXNzCisKKworc3VicHJvY2Vzcy5Qb3BlbihwcmVleGVjX2ZuPWZvbykgIyBbc3VicHJvY2Vzcy1wb3Blbi1wcmVleGVjLWZuXQorCitzdWJwcm9jZXNzLlBvcGVuKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdWJwcm9jZXNzX3BvcGVuX3ByZWV4ZWNfZm4udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1YnByb2Nlc3NfcG9wZW5fcHJlZXhlY19mbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViODg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdWJwcm9jZXNzX3BvcGVuX3ByZWV4ZWNfZm4udHh0CkBAIC0wLDAgKzEgQEAKK3N1YnByb2Nlc3MtcG9wZW4tcHJlZXhlYy1mbjo5OjA6OlVzaW5nIHByZWV4ZWNfZm4ga2V5d29yZCB3aGljaCBtYXkgYmUgdW5zYWZlIGluIHRoZSBwcmVzZW5jZSBvZiB0aHJlYWRzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VicHJvY2Vzc19ydW5fY2hlY2szNS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdWJwcm9jZXNzX3J1bl9jaGVjazM1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNGQ5OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VicHJvY2Vzc19ydW5fY2hlY2szNS5weQpAQCAtMCwwICsxLDYgQEAKKyMgcHlsaW50OiBkaXNhYmxlPWRpc2FsbG93ZWQtbmFtZSxuby12YWx1ZS1mb3ItcGFyYW1ldGVyLG1pc3NpbmctZG9jc3RyaW5nCisKK2ltcG9ydCBzdWJwcm9jZXNzCisKKworc3VicHJvY2Vzcy5ydW4oKSAjIFtzdWJwcm9jZXNzLXJ1bi1jaGVja10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdWJwcm9jZXNzX3J1bl9jaGVjazM1LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1YnByb2Nlc3NfcnVuX2NoZWNrMzUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkZThiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdWJwcm9jZXNzX3J1bl9jaGVjazM1LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N1YnByb2Nlc3NfcnVuX2NoZWNrMzUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1YnByb2Nlc3NfcnVuX2NoZWNrMzUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODU0YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VicHJvY2Vzc19ydW5fY2hlY2szNS50eHQKQEAgLTAsMCArMSBAQAorc3VicHJvY2Vzcy1ydW4tY2hlY2s6NjowOjpVc2luZyBzdWJwcm9jZXNzLnJ1biB3aXRob3V0IGV4cGxpY2l0bHkgc2V0IGBjaGVja2AgaXMgbm90IHJlY29tbWVuZGVkLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N1cGVyL3N1cGVyX2NoZWNrcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl9jaGVja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxMzJkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl9jaGVja3MucHkKQEAgLTAsMCArMSwxMjUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsaW1wb3J0LWVycm9yLCBuby1hYnNvbHV0ZS1pbXBvcnQsbWlzc2luZy1kb2NzdHJpbmcsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLXN1cGVyLWRlbGVnYXRpb24sd3JvbmctaW1wb3J0LXBvc2l0aW9uLGludmFsaWQtbmFtZSwgd3JvbmctaW1wb3J0LW9yZGVyCisjIHB5bGludDogZGlzYWJsZT1zdXBlci13aXRoLWFyZ3VtZW50cworZnJvbSB1bmtub3duIGltcG9ydCBNaXNzaW5nCisKK2NsYXNzIEFhYWE6CisgICAgIiIib2xkIHN0eWxlIiIiCisgICAgZGVmIGhvcChzZWxmKToKKyAgICAgICAgIiIiaG9wIiIiCisgICAgICAgIHN1cGVyKEFhYWEsIHNlbGYpLmhvcCgpICMgPj0zLjA6W25vLW1lbWJlcl0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoQWFhYSwgc2VsZikuX19pbml0X18oKQorCitjbGFzcyBOZXdBYWFhKG9iamVjdCk6CisgICAgIiIib2xkIHN0eWxlIiIiCisgICAgZGVmIGhvcChzZWxmKToKKyAgICAgICAgIiIiaG9wIiIiCisgICAgICAgIHN1cGVyKE5ld0FhYWEsIHNlbGYpLmhvcCgpICMgW25vLW1lbWJlcl0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoQWFhYSwgc2VsZikuX19pbml0X18oKSAgIyBbYmFkLXN1cGVyLWNhbGxdCisKK2NsYXNzIFB5M2tBYWFhKE5ld0FhYWEpOgorICAgICIiIm5ldyBzdHlsZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpICAjIDwzLjA6W21pc3Npbmctc3VwZXItYXJndW1lbnRdCisKK2NsYXNzIFB5M2tXcm9uZ1N1cGVyKFB5M2tBYWFhKToKKyAgICAiIiJuZXcgc3R5bGUiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKE5ld0FhYWEsIHNlbGYpLl9faW5pdF9fKCkgICMgW2JhZC1zdXBlci1jYWxsXQorCitjbGFzcyBXcm9uZ05hbWVSZWdyZXNzaW9uKFB5M2tBYWFhKToKKyAgICAiIiIgdGVzdCBhIHJlZ3Jlc3Npb24gd2l0aCB0aGUgbWVzc2FnZSAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKE1pc3NpbmcsIHNlbGYpLl9faW5pdF9fKCkgICMgW2JhZC1zdXBlci1jYWxsXQorCitjbGFzcyBHZXRhdHRyKG9iamVjdCk6CisgICAgIiIiIGNyYXNoICIiIgorICAgIG5hbWUgPSBOZXdBYWFhCisKK2NsYXNzIENyYXNoU3VwZXIob2JqZWN0KToKKyAgICAiIiIgdGVzdCBhIGNyYXNoIHdpdGggdGhpcyBjaGVja2VyICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoR2V0YXR0ci5uYW1lLCBzZWxmKS5fX2luaXRfXygpICAjIFtiYWQtc3VwZXItY2FsbF0KKworY2xhc3MgRW1wdHkob2JqZWN0KToKKyAgICAiIiJKdXN0IGFuIGVtcHR5IGNsYXNzLiIiIgorCitjbGFzcyBTdXBlckRpZmZlcmVudFNjb3BlKG9iamVjdCk6CisgICAgIiIiRG9uJ2VtaXQgYmFkLXN1cGVyLWNhbGwgd2hlbiB0aGUgc3VwZXIgY2FsbCBpcyBpbiBhbm90aGVyIHNjb3BlLgorICAgIEZvciByZWZlcmVuY2UsIHNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvbG9naWxhYi9weWxpbnQvaXNzdWUvNDAzLgorICAgICIiIgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgdGVzdCgpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYSBiYWQtc3VwZXItY2FsbCBpcyBub3QgZW1pdHRlZCBmb3IgdGhpcyBjYXNlLiIiIgorICAgICAgICBjbGFzcyBGYWxzZVBvc2l0aXZlKEVtcHR5KToKKyAgICAgICAgICAgICIiIlRoZSBmb2xsb3dpbmcgc3VwZXIgaXMgaW4gYW5vdGhlciBzY29wZSB0aGFuIGB0ZXN0YC4iIiIKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZhbHNlUG9zaXRpdmUsIHNlbGYpLl9faW5pdF9fKGFyZykKKyAgICAgICAgc3VwZXIob2JqZWN0LCAxKS5fX2luaXRfXygpICMgW2JhZC1zdXBlci1jYWxsXQorCisKK2NsYXNzIFVua25vd25CYXNlcyhNaXNzaW5nKToKKyAgICAiIiJEb24ndCBlbWl0IGlmIHdlIGRvbid0IGtub3cgYWxsIHRoZSBiYXNlcy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKFVua25vd25CYXNlcywgc2VsZikuX19pbml0X18oKQorICAgICAgICBzdXBlcihVbmtub3duQmFzZXMsIHNlbGYpLnRlc3QoKQorICAgICAgICBzdXBlcihNaXNzaW5nLCBzZWxmKS50ZXN0KCkgIyBbYmFkLXN1cGVyLWNhbGxdCisKKworIyBUZXN0IHRoYXQgd2UgYXJlIGRldGVjdGluZyBwcm9wZXIgc3VwZXIgZXJyb3JzLgorCitjbGFzcyBCYXNlQ2xhc3Mob2JqZWN0KToKKworICAgIG5vdF9hX21ldGhvZCA9IDQyCisKKyAgICBkZWYgZnVuY3Rpb24oc2VsZiwgcGFyYW0pOgorICAgICAgICByZXR1cm4gcGFyYW0gKyBzZWxmLm5vdF9hX21ldGhvZAorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICByZXR1cm4gYXR0cgorCisKK2NsYXNzIEludmFsaWRTdXBlckNoZWNrcyhCYXNlQ2xhc3MpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcihJbnZhbGlkU3VwZXJDaGVja3MsIHNlbGYpLm5vdF9hX21ldGhvZCgpICMgW25vdC1jYWxsYWJsZV0KKyAgICAgICAgc3VwZXIoSW52YWxpZFN1cGVyQ2hlY2tzLCBzZWxmKS5hdHRyaWJ1dGVfZXJyb3IoKSAjIFtuby1tZW1iZXJdCisgICAgICAgIHN1cGVyKEludmFsaWRTdXBlckNoZWNrcywgc2VsZikuZnVuY3Rpb24oNDIpCisgICAgICAgIHN1cGVyKEludmFsaWRTdXBlckNoZWNrcywgc2VsZikuZnVuY3Rpb24oKSAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQorICAgICAgICBzdXBlcihJbnZhbGlkU3VwZXJDaGVja3MsIHNlbGYpLmZ1bmN0aW9uKDQyLCAyNCwgMjQpICMgW3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3NdCisgICAgICAgICMgKzE6IFt1bmV4cGVjdGVkLWtleXdvcmQtYXJnLG5vLXZhbHVlLWZvci1wYXJhbWV0ZXJdCisgICAgICAgIHN1cGVyKEludmFsaWRTdXBlckNoZWNrcywgc2VsZikuZnVuY3Rpb24obGFsYT00MikKKyAgICAgICAgIyBFdmVuIHRob3VnaCBCYXNlQ2xhc3MgaGFzIGEgX19nZXRhdHRyX18sIHRoYXQgd29uJ3QKKyAgICAgICAgIyBiZSBjYWxsZWQuCisgICAgICAgIHN1cGVyKEludmFsaWRTdXBlckNoZWNrcywgc2VsZikuYXR0cmlidXRlX2Vycm9yKCkgIyBbbm8tbWVtYmVyXQorCisKKworIyBSZWdyZXNzaW9uIGZvciBQeUNRQS9weWxpbnQvaXNzdWVzLzc3MworaW1wb3J0IHN1YnByb2Nlc3MKKworIyBUaGUgcHJvYmxlbSB3YXMgcmVsYXRlZCB0byBhc3Ryb2lkIG5vdCBmaWx0ZXJpbmcgc3RhdGVtZW50cworIyBhdCBzY29wZSBsZXZlbCBwcm9wZXJseSwgYmFzaWNhbGx5IG5vdCBkb2luZyBzdHJvbmcgdXBkYXRlcy4KK3RyeToKKyAgICBUaW1lb3V0RXhwaXJlZCA9IHN1YnByb2Nlc3MuVGltZW91dEV4cGlyZWQKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBjbGFzcyBUaW1lb3V0RXhwaXJlZChzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcik6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybmNvZGUgPSAtMQorICAgICAgICAgICAgc2VsZi50aW1lb3V0ID0gLTEKKyAgICAgICAgICAgIHN1cGVyKFRpbWVvdXRFeHBpcmVkLCBzZWxmKS5fX2luaXRfXygiIiwgcmV0dXJuY29kZSkKKworCitjbGFzcyBTdXBlcldpdGhUeXBlKG9iamVjdCk6CisgICAgIiIidHlwZShzZWxmKSBtYXkgbGVhZCB0byByZWN1cnNpb24gbG9vcCBpbiBkZXJpdmVkIGNsYXNzZXMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyKHR5cGUoc2VsZiksIHNlbGYpLl9faW5pdF9fKCkgIyBbYmFkLXN1cGVyLWNhbGxdCisKK2NsYXNzIFN1cGVyV2l0aFNlbGZDbGFzcyhvYmplY3QpOgorICAgICIiInNlbGYuX19jbGFzc19fIG1heSBsZWFkIHRvIHJlY3Vyc2lvbiBsb29wIGluIGRlcml2ZWQgY2xhc3NlcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoc2VsZi5fX2NsYXNzX18sIHNlbGYpLl9faW5pdF9fKCkgIyBbYmFkLXN1cGVyLWNhbGxdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VwZXIvc3VwZXJfY2hlY2tzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl9jaGVja3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzYwYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VwZXIvc3VwZXJfY2hlY2tzLnR4dApAQCAtMCwwICsxLDE3IEBACituby1tZW1iZXI6MTA6ODpBYWFhLmhvcDpTdXBlciBvZiAnQWFhYScgaGFzIG5vICdob3AnIG1lbWJlcjpJTkZFUkVOQ0UKK25vLW1lbWJlcjoxOTo4Ok5ld0FhYWEuaG9wOlN1cGVyIG9mICdOZXdBYWFhJyBoYXMgbm8gJ2hvcCcgbWVtYmVyOklORkVSRU5DRQorYmFkLXN1cGVyLWNhbGw6MjI6ODpOZXdBYWFhLl9faW5pdF9fOkJhZCBmaXJzdCBhcmd1bWVudCAnQWFhYScgZ2l2ZW4gdG8gc3VwZXIoKQorYmFkLXN1cGVyLWNhbGw6MzI6ODpQeTNrV3JvbmdTdXBlci5fX2luaXRfXzpCYWQgZmlyc3QgYXJndW1lbnQgJ05ld0FhYWEnIGdpdmVuIHRvIHN1cGVyKCkKK2JhZC1zdXBlci1jYWxsOjM3Ojg6V3JvbmdOYW1lUmVncmVzc2lvbi5fX2luaXRfXzpCYWQgZmlyc3QgYXJndW1lbnQgJ01pc3NpbmcnIGdpdmVuIHRvIHN1cGVyKCkKK2JhZC1zdXBlci1jYWxsOjQ2Ojg6Q3Jhc2hTdXBlci5fX2luaXRfXzpCYWQgZmlyc3QgYXJndW1lbnQgJ05ld0FhYWEnIGdpdmVuIHRvIHN1cGVyKCkKK2JhZC1zdXBlci1jYWxsOjYyOjg6U3VwZXJEaWZmZXJlbnRTY29wZS50ZXN0OkJhZCBmaXJzdCBhcmd1bWVudCAnb2JqZWN0JyBnaXZlbiB0byBzdXBlcigpCitiYWQtc3VwZXItY2FsbDo3MDo4OlVua25vd25CYXNlcy5fX2luaXRfXzpCYWQgZmlyc3QgYXJndW1lbnQgJ01pc3NpbmcnIGdpdmVuIHRvIHN1cGVyKCkKK25vdC1jYWxsYWJsZTo4OTo4OkludmFsaWRTdXBlckNoZWNrcy5fX2luaXRfXzpzdXBlcihJbnZhbGlkU3VwZXJDaGVja3MsIHNlbGYpLm5vdF9hX21ldGhvZCBpcyBub3QgY2FsbGFibGUKK25vLW1lbWJlcjo5MDo4OkludmFsaWRTdXBlckNoZWNrcy5fX2luaXRfXzpTdXBlciBvZiAnSW52YWxpZFN1cGVyQ2hlY2tzJyBoYXMgbm8gJ2F0dHJpYnV0ZV9lcnJvcicgbWVtYmVyOklORkVSRU5DRQorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjo5Mjo4OkludmFsaWRTdXBlckNoZWNrcy5fX2luaXRfXzpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ3BhcmFtJyBpbiBtZXRob2QgY2FsbAordG9vLW1hbnktZnVuY3Rpb24tYXJnczo5Mzo4OkludmFsaWRTdXBlckNoZWNrcy5fX2luaXRfXzpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgbWV0aG9kIGNhbGwKK25vLXZhbHVlLWZvci1wYXJhbWV0ZXI6OTU6ODpJbnZhbGlkU3VwZXJDaGVja3MuX19pbml0X186Tm8gdmFsdWUgZm9yIGFyZ3VtZW50ICdwYXJhbScgaW4gbWV0aG9kIGNhbGwKK3VuZXhwZWN0ZWQta2V5d29yZC1hcmc6OTU6ODpJbnZhbGlkU3VwZXJDaGVja3MuX19pbml0X186VW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdsYWxhJyBpbiBtZXRob2QgY2FsbAorbm8tbWVtYmVyOjk4Ojg6SW52YWxpZFN1cGVyQ2hlY2tzLl9faW5pdF9fOlN1cGVyIG9mICdJbnZhbGlkU3VwZXJDaGVja3MnIGhhcyBubyAnYXR0cmlidXRlX2Vycm9yJyBtZW1iZXI6SU5GRVJFTkNFCitiYWQtc3VwZXItY2FsbDoxMjA6ODpTdXBlcldpdGhUeXBlLl9faW5pdF9fOkJhZCBmaXJzdCBhcmd1bWVudCAndHlwZScgZ2l2ZW4gdG8gc3VwZXIoKQorYmFkLXN1cGVyLWNhbGw6MTI1Ojg6U3VwZXJXaXRoU2VsZkNsYXNzLl9faW5pdF9fOkJhZCBmaXJzdCBhcmd1bWVudCAnc2VsZi5fX2NsYXNzX18nIGdpdmVuIHRvIHN1cGVyKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl93aXRoX2FyZ3VtZW50cy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl93aXRoX2FyZ3VtZW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI3YzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1cGVyL3N1cGVyX3dpdGhfYXJndW1lbnRzLnB5CkBAIC0wLDAgKzEsMzUgQEAKK2NsYXNzIEZvbzoKKyAgICBwYXNzCisKKworY2xhc3MgQmFyKEZvbyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcihCYXIsIHNlbGYpLl9faW5pdF9fKCkgICMgW3N1cGVyLXdpdGgtYXJndW1lbnRzXQorCisKK2NsYXNzIEJheihGb28pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCisKKworY2xhc3MgUXV4KEZvbyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzdXBlcihCYXIsIHNlbGYpLl9faW5pdF9fKCkKKworCitjbGFzcyBOb3RTdXBlckNhbGwoRm9vKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHN1cGVyLnRlc3QoQmFyLCBzZWxmKS5fX2luaXRfXygpCisKKworY2xhc3MgSW52YWxpZFN1cGVyQ2FsbChGb28pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc3VwZXIoSW52YWxpZFN1cGVyQ2FsbC5fX2NsYXNzX18sIHNlbGYpLl9faW5pdF9fKCkKKworCitkZWYgbWV0aG9kX2FjY2VwdGluZ19jbHMoY2xzLCBzZWxmKToKKyAgICAjIFVzaW5nIHBsYWluIGBzdXBlcigpYCBpcyBub3QgdmFsaWQgaGVyZSwgc2luY2UgdGhlcmUncyBubyBgX19jbGFzc19fYCBjZWxsIGZvdW5kCisgICAgIyAoRXhhY3QgZXhjZXB0aW9uIHdvdWxkIGJlICdSdW50aW1lRXJyb3I6IHN1cGVyKCk6IF9fY2xhc3NfXyBjZWxsIG5vdCBmb3VuZCcpCisgICAgIyBJbnN0ZWFkLCB3ZSBleHBlY3QgdG8gKm5vdCogc2VlIGEgd2FybmluZyBhYm91dCBgc3VwZXItd2l0aC1hcmd1bWVudHNgLgorICAgICMgRXhwbGljaXRseSBwYXNzaW5nIGBjbHNgLCBhbmQgYHNlbGZgIHRvIGBzdXBlcigpYCBpcyB3aGF0J3MgcmVxdWlyZWQuCisgICAgc3VwZXIoY2xzLCBzZWxmKS5fX2luaXRfXygpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VwZXIvc3VwZXJfd2l0aF9hcmd1bWVudHMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VwZXIvc3VwZXJfd2l0aF9hcmd1bWVudHMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3MDE2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl93aXRoX2FyZ3VtZW50cy5yYwpAQCAtMCwwICsxLDMgQEAKK1tNZXNzYWdlcyBDb250cm9sXQorZGlzYWJsZT1hbGwKK2VuYWJsZT1zdXBlci13aXRoLWFyZ3VtZW50cwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N1cGVyL3N1cGVyX3dpdGhfYXJndW1lbnRzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl93aXRoX2FyZ3VtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4Mjg0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlci9zdXBlcl93aXRoX2FyZ3VtZW50cy50eHQKQEAgLTAsMCArMSBAQAorc3VwZXItd2l0aC1hcmd1bWVudHM6Nzo4OkJhci5fX2luaXRfXzpDb25zaWRlciB1c2luZyBQeXRob24gMyBzdHlsZSBzdXBlcigpIHdpdGhvdXQgYXJndW1lbnRzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VwZXJmbHVvdXNfcGFyZW5zLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1cGVyZmx1b3VzX3BhcmVucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQxOGNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1cGVyZmx1b3VzX3BhcmVucy5weQpAQCAtMCwwICsxLDE5IEBACisiIiJUZXN0IHRoZSBzdXBlcmZsdW91cy1wYXJlbnMgd2FybmluZy4iIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKyMgcHlsaW50OiBkaXNhYmxlPXVubmVlZGVkLW5vdAoraSA9IDMKK2lmIChpID09IDUpOiAgIyBbc3VwZXJmbHVvdXMtcGFyZW5zXQorICAgIHBhc3MKK2lmIG5vdCAoaSA9PSA1KTogICMgW3N1cGVyZmx1b3VzLXBhcmVuc10KKyAgICBwYXNzCitpZiBub3QgKDMgb3IgNSk6CisgICAgcGFzcworZm9yICh4KSBpbiAoMSwgMiwgMyk6ICAjIFtzdXBlcmZsdW91cy1wYXJlbnNdCisgICAgcHJpbnQoeCkKK2lmICgxKSBpbiAoMSwgMiwgMyk6ICAjIFtzdXBlcmZsdW91cy1wYXJlbnNdCisgICAgcGFzcworaWYgKDEsIDIpIGluICgxLCAyLCAzKToKKyAgICBwYXNzCitESUNUID0geydhJzogMSwgJ2InOiAyfQorZGVsKERJQ1RbJ2InXSkgICMgW3N1cGVyZmx1b3VzLXBhcmVuc10KK2RlbCBESUNUWydhJ10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlcmZsdW91c19wYXJlbnMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1cGVyZmx1b3VzX3BhcmVucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjMWQxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXBlcmZsdW91c19wYXJlbnMudHh0CkBAIC0wLDAgKzEsNSBAQAorc3VwZXJmbHVvdXMtcGFyZW5zOjU6MDo6VW5uZWNlc3NhcnkgcGFyZW5zIGFmdGVyICdpZicga2V5d29yZAorc3VwZXJmbHVvdXMtcGFyZW5zOjc6MDo6VW5uZWNlc3NhcnkgcGFyZW5zIGFmdGVyICdub3QnIGtleXdvcmQKK3N1cGVyZmx1b3VzLXBhcmVuczoxMTowOjpVbm5lY2Vzc2FyeSBwYXJlbnMgYWZ0ZXIgJ2Zvcicga2V5d29yZAorc3VwZXJmbHVvdXMtcGFyZW5zOjEzOjA6OlVubmVjZXNzYXJ5IHBhcmVucyBhZnRlciAnaWYnIGtleXdvcmQKK3N1cGVyZmx1b3VzLXBhcmVuczoxODowOjpVbm5lY2Vzc2FyeSBwYXJlbnMgYWZ0ZXIgJ2RlbCcga2V5d29yZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N1c3BpY2lvdXNfc3RyX3N0cmlwX2NhbGxfcHkzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N1c3BpY2lvdXNfc3RyX3N0cmlwX2NhbGxfcHkzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTlmMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VzcGljaW91c19zdHJfc3RyaXBfY2FsbF9weTMucHkKQEAgLTAsMCArMSw5IEBACisiIiJTdXNwaWNpb3VzIHN0ci5zdHJpcCBjYWxscy4iIiIKK19fcmV2aXNpb25fXyA9IDEKKworJycuc3RyaXAoJ3lvJykKKycnLnN0cmlwKCkKKwordScnLnN0cmlwKCdodHRwOi8vJykgICMgW2JhZC1zdHItc3RyaXAtY2FsbF0KK3UnJy5sc3RyaXAoJ2h0dHA6Ly8nKSAgIyBbYmFkLXN0ci1zdHJpcC1jYWxsXQorYicnLnJzdHJpcCgnaHR0cDovLycpICAjIFtiYWQtc3RyLXN0cmlwLWNhbGxdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VzcGljaW91c19zdHJfc3RyaXBfY2FsbF9weTMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VzcGljaW91c19zdHJfc3RyaXBfY2FsbF9weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXNwaWNpb3VzX3N0cl9zdHJpcF9jYWxsX3B5My5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zdXNwaWNpb3VzX3N0cl9zdHJpcF9jYWxsX3B5My50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VzcGljaW91c19zdHJfc3RyaXBfY2FsbF9weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNTBkNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3VzcGljaW91c19zdHJfc3RyaXBfY2FsbF9weTMudHh0CkBAIC0wLDAgKzEsMyBAQAorYmFkLXN0ci1zdHJpcC1jYWxsOjc6MDo6U3VzcGljaW91cyBhcmd1bWVudCBpbiBzdHIuc3RyaXAgY2FsbAorYmFkLXN0ci1zdHJpcC1jYWxsOjg6MDo6U3VzcGljaW91cyBhcmd1bWVudCBpbiBzdHIubHN0cmlwIGNhbGwKK2JhZC1zdHItc3RyaXAtY2FsbDo5OjA6OlN1c3BpY2lvdXMgYXJndW1lbnQgaW4gYnl0ZXMucnN0cmlwIGNhbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeW50YXhfZXJyb3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2RmNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yLnB5CkBAIC0wLDAgKzEgQEAKK2RlZiB0b3RvICMgW3N5bnRheC1lcnJvcl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeW50YXhfZXJyb3IucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0N2E3NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorZXhjZXB0X2ltcGxlbWVudGF0aW9ucz1QeVB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeW50YXhfZXJyb3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjI1OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yLnR4dApAQCAtMCwwICsxIEBACitzeW50YXgtZXJyb3I6MToxMDo6aW52YWxpZCBzeW50YXggKDx1bmtub3duPiwgbGluZSAxKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N5bnRheF9lcnJvcl9qeXRob24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yX2p5dGhvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTNkZjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N5bnRheF9lcnJvcl9qeXRob24ucHkKQEAgLTAsMCArMSBAQAorZGVmIHRvdG8gIyBbc3ludGF4LWVycm9yXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N5bnRheF9lcnJvcl9qeXRob24ucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3ludGF4X2Vycm9yX2p5dGhvbi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWJkM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N5bnRheF9lcnJvcl9qeXRob24ucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCitleGNlcHRfaW1wbGVtZW50YXRpb25zPUNQeXRob24sIFB5UHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeW50YXhfZXJyb3Jfanl0aG9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeW50YXhfZXJyb3Jfanl0aG9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM3NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N5bnRheF9lcnJvcl9qeXRob24udHh0CkBAIC0wLDAgKzEgQEAKK3N5bnRheC1lcnJvcjoxOjoibWlzbWF0Y2hlZCBpbnB1dCAnXG5cblxuXG4nIGV4cGVjdGluZyBMUEFSRU4iCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3Mvc3lzX3N0cmVhbV9yZWdyZXNzaW9uXzEwMDQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3lzX3N0cmVhbV9yZWdyZXNzaW9uXzEwMDQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzOTE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeXNfc3RyZWFtX3JlZ3Jlc3Npb25fMTAwNC5weQpAQCAtMCwwICsxLDcgQEAKKycnJ1JlZ3Jlc3Npb24gZm9yIGlzc3VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzEwMDQnJycKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBwb2ludGxlc3Mtc3RhdGVtZW50CisKK2ltcG9ydCBzeXMKK3N5cy5fX3N0ZG91dF9fLmJ1ZmZlci53cml0ZSgndGVzdCcpCitzeXMuX19zdGRvdXRfXy5idWZmICMgW25vLW1lbWJlcl0KK3N5cy5fX3N0ZG91dF9fLmJ1ZmZlci53cml0ZTEgIyBbbm8tbWVtYmVyXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC9zL3N5c19zdHJlYW1fcmVncmVzc2lvbl8xMDA0LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC9zL3N5c19zdHJlYW1fcmVncmVzc2lvbl8xMDA0LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzA0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3lzX3N0cmVhbV9yZWdyZXNzaW9uXzEwMDQucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My41CitleGNlcHRfaW1wbGVtZW50YXRpb25zPVB5UHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvcy9zeXNfc3RyZWFtX3JlZ3Jlc3Npb25fMTAwNC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3lzX3N0cmVhbV9yZWdyZXNzaW9uXzEwMDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjEyMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3Mvc3lzX3N0cmVhbV9yZWdyZXNzaW9uXzEwMDQudHh0CkBAIC0wLDAgKzEsMiBAQAorbm8tbWVtYmVyOjY6MDo6SW5zdGFuY2Ugb2YgJ1RleHRJT1dyYXBwZXInIGhhcyBubyAnYnVmZicgbWVtYmVyOklORkVSRU5DRQorbm8tbWVtYmVyOjc6MDo6SW5zdGFuY2Ugb2YgJ0J1ZmZlcmVkV3JpdGVyJyBoYXMgbm8gJ3dyaXRlMScgbWVtYmVyOyBtYXliZSAnd3JpdGUnPzpJTkZFUkVOQ0UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdGVybmFyeS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90ZXJuYXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWMwMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdGVybmFyeS5weQpAQCAtMCwwICsxLDMzIEBACisiIiJUZXN0IGZvciBvbGQgdGVybmFyeSBjb25zdHJ1Y3RzIiIiCitmcm9tIFVOSU5GRVJBQkxFIGltcG9ydCBjb25kaXRpb24sIHRydWVfdmFsdWUsIGZhbHNlX3ZhbHVlLCBzb21lX2NhbGxhYmxlICAjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtZXJyb3IKKworU09NRV9WQUxVRTEgPSB0cnVlX3ZhbHVlIGlmIGNvbmRpdGlvbiBlbHNlIGZhbHNlX3ZhbHVlCitTT01FX1ZBTFVFMiA9IGNvbmRpdGlvbiBhbmQgdHJ1ZV92YWx1ZSBvciBmYWxzZV92YWx1ZSAgIyBbY29uc2lkZXItdXNpbmctdGVybmFyeV0KK1NPTUVfVkFMVUUzID0gY29uZGl0aW9uCisKK2RlZiBmdW5jMSgpOgorICAgICIiIlRlcm5hcnkgcmV0dXJuIHZhbHVlIGNvcnJlY3QiIiIKKyAgICByZXR1cm4gdHJ1ZV92YWx1ZSBpZiBjb25kaXRpb24gZWxzZSBmYWxzZV92YWx1ZQorCisKK2RlZiBmdW5jMigpOgorICAgICIiIlRlcm5hcnkgcmV0dXJuIHZhbHVlIGluY29ycmVjdCIiIgorICAgIHJldHVybiBjb25kaXRpb24gYW5kIHRydWVfdmFsdWUgb3IgZmFsc2VfdmFsdWUgICMgW2NvbnNpZGVyLXVzaW5nLXRlcm5hcnldCisKKworU09NRV9WQUxVRTQgPSBzb21lX2NhbGxhYmxlKGNvbmRpdGlvbikgYW5kICdFUlJPUicgb3IgJ1NVQ0NFU1MnICAjIFtjb25zaWRlci11c2luZy10ZXJuYXJ5XQorU09NRV9WQUxVRTUgPSBTT01FX1ZBTFVFMSA+IDMgYW5kICdncmVhdGVyJyBvciAnbm90IGdyZWF0ZXInICAjIFtjb25zaWRlci11c2luZy10ZXJuYXJ5XQorU09NRV9WQUxVRTYgPSAoU09NRV9WQUxVRTIgPiA0IGFuZCBTT01FX1ZBTFVFMykgYW5kICdib3RoJyBvciAnbm90JyAgIyBbY29uc2lkZXItdXNpbmctdGVybmFyeV0KK1NPTUVfVkFMVUU3ID0gJ2JvdGgnIGlmIChTT01FX1ZBTFVFMiA+IDQpIGFuZCAoU09NRV9WQUxVRTMpIGVsc2UgJ25vdCcKK1NPTUVfVkFMVUU4ID0gU09NRV9WQUxVRTEgYW5kIFNPTUVfVkFMVUUyIGFuZCBTT01FX1ZBTFVFMyBvciBTT01FX1ZBTFVFNAorU09NRV9WQUxVRTkgPSBTT01FX1ZBTFVFMSBhbmQgRmFsc2Ugb3IgU09NRV9WQUxVRTIgICMgW3NpbXBsaWZ5LWJvb2xlYW4tZXhwcmVzc2lvbl0KKworWUVBUiA9IDE5OTIKKyMgQ2Fubm90IGJlIHNpbXBsaWZpZWQgd2l0aCBhIHRlcm5hcnkuCitJU19MRUFQX1lFQVIgPSBZRUFSICUgNCA9PSAwIGFuZCBZRUFSICUgMTAwICE9IDAgb3IgWUVBUiAlIDQwMCA9PSAwCisKKworZGVmIGZ1bmM0KCk6CisgICAgIiIiIlVzaW5nIGEgTmFtZSBhcyBhIGNvbmRpdGlvbiBidXQgc3RpbGwgZW1pdHMiIiIKKyAgICB0cnV0aF92YWx1ZSA9IDQyCisgICAgcmV0dXJuIGNvbmRpdGlvbiBhbmQgdHJ1dGhfdmFsdWUgb3IgZmFsc2VfdmFsdWUgIyBbY29uc2lkZXItdXNpbmctdGVybmFyeV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90ZXJuYXJ5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90ZXJuYXJ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzhhYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rlcm5hcnkudHh0CkBAIC0wLDAgKzEsNyBAQAorY29uc2lkZXItdXNpbmctdGVybmFyeTo1OjA6OkNvbnNpZGVyIHVzaW5nIHRlcm5hcnkgKHRydWVfdmFsdWUgaWYgY29uZGl0aW9uIGVsc2UgZmFsc2VfdmFsdWUpCitjb25zaWRlci11c2luZy10ZXJuYXJ5OjE1OjQ6ZnVuYzI6Q29uc2lkZXIgdXNpbmcgdGVybmFyeSAodHJ1ZV92YWx1ZSBpZiBjb25kaXRpb24gZWxzZSBmYWxzZV92YWx1ZSkKK2NvbnNpZGVyLXVzaW5nLXRlcm5hcnk6MTg6MDo6Q29uc2lkZXIgdXNpbmcgdGVybmFyeSAoJ0VSUk9SJyBpZiBzb21lX2NhbGxhYmxlKGNvbmRpdGlvbikgZWxzZSAnU1VDQ0VTUycpCitjb25zaWRlci11c2luZy10ZXJuYXJ5OjE5OjA6OkNvbnNpZGVyIHVzaW5nIHRlcm5hcnkgKCdncmVhdGVyJyBpZiBTT01FX1ZBTFVFMSA+IDMgZWxzZSAnbm90IGdyZWF0ZXInKQorY29uc2lkZXItdXNpbmctdGVybmFyeToyMDowOjpDb25zaWRlciB1c2luZyB0ZXJuYXJ5ICgnYm90aCcgaWYgU09NRV9WQUxVRTIgPiA0IGFuZCBTT01FX1ZBTFVFMyBlbHNlICdub3QnKQorc2ltcGxpZnktYm9vbGVhbi1leHByZXNzaW9uOjIzOjA6OkJvb2xlYW4gZXhwcmVzc2lvbiBtYXkgYmUgc2ltcGxpZmllZCB0byBTT01FX1ZBTFVFMgorY29uc2lkZXItdXNpbmctdGVybmFyeTozMzo0OmZ1bmM0OkNvbnNpZGVyIHVzaW5nIHRlcm5hcnkgKHRydXRoX3ZhbHVlIGlmIGNvbmRpdGlvbiBlbHNlIGZhbHNlX3ZhbHVlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rlc3RfY29tcGlsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90ZXN0X2NvbXBpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNGFjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90ZXN0X2NvbXBpbGUucHkKQEAgLTAsMCArMSw2IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdW51c2VkLXZhcmlhYmxlLCBwb2ludGxlc3Mtc3RhdGVtZW50LCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitjbGFzcyBXcmFwcGVyQ2xhc3Mob2JqZWN0KToKKyAgICBkZWYgbWV0aG9kKHNlbGYpOgorICAgICAgICB2YXIgPSArNDI5NDk2NzI5NgorICAgICAgICBzZWxmLm1ldGhvZC5fX2NvZGVfXy5jb19jb25zdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvci5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM5NTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rva2VuaXplX2Vycm9yLnB5CkBAIC0wLDAgKzEsNiBAQAorIiIiQSBtb2R1bGUgdGhhdCBpcyBhY2NlcHRlZCBieSBQeXRob24gYnV0IHJlamVjdGVkIGJ5IHRva2VuaXplLgorCitUaGUgcHJvYmxlbSBpcyB0aGUgdHJhaWxpbmcgbGluZSBjb250aW51YXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwKK3doaWNoIHByb2R1Y2VzIGEgVG9rZW5FcnJvci4iIiIKKyMgKzI6IFtzeW50YXgtZXJyb3JdCisiIlwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvci5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvci5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGI1YTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rva2VuaXplX2Vycm9yLnJjCkBAIC0wLDAgKzEgQEAKK1t0ZXN0b3B0aW9uc10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9rZW5pemVfZXJyb3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzgwZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9rZW5pemVfZXJyb3IudHh0CkBAIC0wLDAgKzEgQEAKK3N5bnRheC1lcnJvcjo3OjA6OkVPRiBpbiBtdWx0aS1saW5lIHN0YXRlbWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rva2VuaXplX2Vycm9yX2p5dGhvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvcl9qeXRob24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1ZjVmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvcl9qeXRob24ucHkKQEAgLTAsMCArMSw3IEBACisjIFtzeW50YXgtZXJyb3JdCisiIiJBIG1vZHVsZSB0aGF0IGlzIGFjY2VwdGVkIGJ5IFB5dGhvbiBidXQgcmVqZWN0ZWQgYnkgdG9rZW5pemUuCisKK1RoZSBwcm9ibGVtIGlzIHRoZSB0cmFpbGluZyBsaW5lIGNvbnRpbnVhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLAord2hpY2ggcHJvZHVjZXMgYSBUb2tlbkVycm9yLiIiIgorCisiIlwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b2tlbml6ZV9lcnJvcl9qeXRob24ucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9rZW5pemVfZXJyb3Jfanl0aG9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDA3ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9rZW5pemVfZXJyb3Jfanl0aG9uLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorZXhjZXB0X2ltcGxlbWVudGF0aW9ucz1DUHl0aG9uLFB5UHksSXJvblB5dGhvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rva2VuaXplX2Vycm9yX2p5dGhvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9rZW5pemVfZXJyb3Jfanl0aG9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFhYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rva2VuaXplX2Vycm9yX2p5dGhvbi50eHQKQEAgLTAsMCArMSBAQAorc3ludGF4LWVycm9yOjE6OnVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX2Zld19wdWJsaWNfbWV0aG9kcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX2Zld19wdWJsaWNfbWV0aG9kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE1MjhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fZmV3X3B1YmxpY19tZXRob2RzLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCisKK2Zyb20gZW51bSBpbXBvcnQgRW51bQorCisKK2NsYXNzIEFhYWEob2JqZWN0KTogIyBbdG9vLWZldy1wdWJsaWMtbWV0aG9kc10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG1ldGgxKHNlbGYpOgorICAgICAgICBwcmludChzZWxmKQorCisgICAgZGVmIF9kb250Y291bnQoc2VsZik6CisgICAgICAgIHByaW50KHNlbGYpCisKKworIyBEb24ndCBlbWl0IGZvciB0aGVzZSBjYXNlcy4KK2NsYXNzIEtsYXNzKG9iamVjdCk6CisgICAgIiIiZG9jc3RyaW5nIiIiCisKKyAgICBkZWYgbWV0aDEoc2VsZik6CisgICAgICAgICIiImZpcnN0IiIiCisKKyAgICBkZWYgbWV0aDIoc2VsZik6CisgICAgICAgICIiInNlY29uZCIiIgorCisKK2NsYXNzIEVub3VnaFB1YmxpY01ldGhvZHMoS2xhc3MpOgorICAgICIiIldlIHNob3VsZG4ndCBlbWl0IHRvby1mZXctcHVibGljLW1ldGhvZHMgZm9yIHRoaXMuIiIiCisKKworY2xhc3MgQm9zc01vbnN0ZXIoRW51bSk6CisgICAgIiIiQW4gZW51bSBkb2VzIG5vdCBuZWVkIG1ldGhvZHMgdG8gYmUgdXNlZnVsLiIiIgorICAgIE1FR0FTSEFSSyA9IDEKKyAgICBPQ1RPUFVTID0gMgorCisKK2NsYXNzIER1bWJMaXN0OgorICAgICIiIkEgY2xhc3MgY2FuIGRlZmluZSBvbmx5IHNwZWNpYWwgbWV0aG9kcy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlcmFibGUpOgorICAgICAgICBzZWxmLl9saXN0ID0gbGlzdChpdGVyYWJsZSkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2xpc3QpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGlzdFtpbmRleF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX2Zld19wdWJsaWNfbWV0aG9kcy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19mZXdfcHVibGljX21ldGhvZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmJhNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19mZXdfcHVibGljX21ldGhvZHMudHh0CkBAIC0wLDAgKzEgQEAKK3Rvby1mZXctcHVibGljLW1ldGhvZHM6ODowOkFhYWE6VG9vIGZldyBwdWJsaWMgbWV0aG9kcyAoMS8yKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fZmV3X3B1YmxpY19tZXRob2RzXzM3LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fZmV3X3B1YmxpY19tZXRob2RzXzM3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZmM1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19mZXdfcHVibGljX21ldGhvZHNfMzcucHkKQEAgLTAsMCArMSwzNyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKK2ltcG9ydCBkYXRhY2xhc3NlcworaW1wb3J0IHR5cGluZworZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcworY2xhc3MgU2NoZWR1bGVkVHhTZWFyY2hNb2RlbDoKKyAgICBkYXRlX2Zyb20gPSBOb25lCisgICAgZGF0ZV90byA9IE5vbmUKKworCitAZGF0YWNsYXNzCitjbGFzcyBTY2hlZHVsZWRUeFNlYXJjaE1vZGVsT25lOgorICAgIGRhdGUgPSBOb25lCisKKworQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIFRlc3Q6CisgICAgc29tZV9pbnRlZ2VyOiBpbnQKKworCitjbGFzcyBFeGFtcGxlKHR5cGluZy5OYW1lZFR1cGxlKToKKyAgICBzb21lX2ludDogaW50CisKKworQGRhdGFjbGFzc2VzLmRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKK2NsYXNzIFBvaW50OgorICAgICIiIkEgdGhyZWUgZGltZW5zaW9uYWwgcG9pbnQgd2l0aCB4LCB5IGFuZCB6IGNvbXBvbmVudHMuIiIiCisKKyAgICBhdHRyMTogZmxvYXQKKyAgICBhdHRyMjogZmxvYXQKKyAgICBhdHRyMzogZmxvYXQKKworICAgIGRlZiB0b19hcnJheShzZWxmKToKKyAgICAgICAgIiIiQ29udmVydCB0byBhIE51bVB5IGFycmF5IGBucC5hcnJheSgoeCwgeSwgeikpYC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXR0cjEKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX2Zld19wdWJsaWNfbWV0aG9kc18zNy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX2Zld19wdWJsaWNfbWV0aG9kc18zNy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdiYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fZmV3X3B1YmxpY19tZXRob2RzXzM3LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hbmNlc3RvcnMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FuY2VzdG9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzEwNWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hbmNlc3RvcnMucHkKQEAgLTAsMCArMSw0NSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLCBhcmd1bWVudHMtZGlmZmVyCitmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTXV0YWJsZVNlcXVlbmNlCisKK2NsYXNzIEFhYWEob2JqZWN0KToKKyAgICBwYXNzCitjbGFzcyBCYmJiKG9iamVjdCk6CisgICAgcGFzcworY2xhc3MgQ2NjYyhvYmplY3QpOgorICAgIHBhc3MKK2NsYXNzIERkZGQob2JqZWN0KToKKyAgICBwYXNzCitjbGFzcyBFZWVlKG9iamVjdCk6CisgICAgcGFzcworY2xhc3MgRmZmZihvYmplY3QpOgorICAgIHBhc3MKK2NsYXNzIEdnZ2cob2JqZWN0KToKKyAgICBwYXNzCitjbGFzcyBIaGhoKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBJaWlpKEFhYWEsIEJiYmIsIENjY2MsIERkZGQsIEVlZWUsIEZmZmYsIEdnZ2csIEhoaGgpOiAjIFt0b28tbWFueS1hbmNlc3RvcnNdCisgICAgcGFzcworCitjbGFzcyBKampqKElpaWkpOiAjIFt0b28tbWFueS1hbmNlc3RvcnNdCisgICAgcGFzcworCisKKyMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDE2NgorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy80NDE1CitjbGFzcyBJdGVtU2VxdWVuY2UoTXV0YWJsZVNlcXVlbmNlKToKKyAgICAiIiJNaW5pbWFsIE11dGFibGVTZXF1ZW5jZS4iIiIKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBfID0ga2V5LCB2YWx1ZQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIF8gPSBrZXkKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIHZhbHVlKToKKyAgICAgICAgXyA9IGluZGV4LCB2YWx1ZQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAxCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FuY2VzdG9ycy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FuY2VzdG9ycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxM2NlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYW5jZXN0b3JzLnR4dApAQCAtMCwwICsxLDIgQEAKK3Rvby1tYW55LWFuY2VzdG9yczoyMTowOklpaWk6VG9vIG1hbnkgYW5jZXN0b3JzICg4LzcpCit0b28tbWFueS1hbmNlc3RvcnM6MjQ6MDpKampqOlRvbyBtYW55IGFuY2VzdG9ycyAoOS83KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hcmd1bWVudHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FyZ3VtZW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODk3NDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hcmd1bWVudHMucHkKQEAgLTAsMCArMSwzMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsd3JvbmctaW1wb3J0LXBvc2l0aW9uCisKK2RlZiBzdHVwaWRfZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSk6ICMgW3Rvby1tYW55LWFyZ3VtZW50c10KKyAgICByZXR1cm4gYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgYXJnOQorCisKK2NsYXNzIE15Q2xhc3M6CisgICAgdGV4dCA9ICJNeVRleHQiCisKKyAgICBkZWYgbXltZXRob2QxKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisKKyAgICBkZWYgbXltZXRob2QyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5teW1ldGhvZDEuX19nZXRfXyhzZWxmLCBNeUNsYXNzKQorCisKK015Q2xhc3MoKS5teW1ldGhvZDIoKSgpCisKKworIyBDaGVjayBhIGZhbHNlIHBvc2l0aXZlIGRvZXMgbm90IG9jY3VyCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbAorCisKK2RlZiByb290X2Z1bmN0aW9uKGZpcnN0LCBzZWNvbmQsIHRoaXJkKToKKyAgICByZXR1cm4gZmlyc3QgKyBzZWNvbmQgKyB0aGlyZAorCisKK2RlZiBmdW5jX2NhbGwoKToKKyAgICAiIiJUZXN0IHdlIGRvbid0IGVtaXQgYSBGUCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMjU4OCIiIgorICAgIHBhcnRpYWxfZnVuYyA9IHBhcnRpYWwocm9vdF9mdW5jdGlvbiwgMSwgMiwgMykKKyAgICBwYXJ0aWFsX2Z1bmMoKQorICAgIHJldHVybiByb290X2Z1bmN0aW9uKDEsIDIsIDMpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FyZ3VtZW50cy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FyZ3VtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmNTUxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYXJndW1lbnRzLnR4dApAQCAtMCwwICsxIEBACit0b28tbWFueS1hcmd1bWVudHM6MzowOnN0dXBpZF9mdW5jdGlvbjpUb28gbWFueSBhcmd1bWVudHMgKDkvNSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYXJndW1lbnRzX2lzc3VlXzEwNDUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FyZ3VtZW50c19pc3N1ZV8xMDQ1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YWE3NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FyZ3VtZW50c19pc3N1ZV8xMDQ1LnB5CkBAIC0wLDAgKzEsMTMgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsIHVuZGVmaW5lZC12YXJpYWJsZTsgZmFsc2UgcG9zaXRpdmVzIDotKAorCitpbXBvcnQgZnVuY3Rvb2xzCisKKworQGZ1bmN0b29scy5scnVfY2FjaGUoKQorZGVmIGZ1bmMoKToKKyAgICBwYXNzCisKKworZnVuYy5jYWNoZV9jbGVhcigpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2FyZ3VtZW50c19pc3N1ZV8xMDQ1LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hcmd1bWVudHNfaXNzdWVfMTA0NS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI1ZTdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hcmd1bWVudHNfaXNzdWVfMTA0NS5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYXJndW1lbnRzX292ZXJsb2FkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9hcmd1bWVudHNfb3ZlcmxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1NWRlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYXJndW1lbnRzX292ZXJsb2FkLnB5CkBAIC0wLDAgKzEsMzggQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nLG1pc3NpbmctbW9kdWxlLWRvY3N0cmluZyxtaXNzaW5nLWNsYXNzLWRvY3N0cmluZworIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcworZnJvbSB0eXBpbmcgaW1wb3J0IG92ZXJsb2FkCisKKworY2xhc3MgQ2xhc3NBOgorICAgIEBjbGFzc21ldGhvZAorICAgIEBvdmVybG9hZAorICAgIGRlZiBtZXRob2QoY2xzLCBhcmcxKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgQG92ZXJsb2FkCisgICAgZGVmIG1ldGhvZChjbHMsIGFyZzEsIGFyZzIpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgbWV0aG9kKGNscywgYXJnMSwgYXJnMj1Ob25lKToKKyAgICAgICAgcGFzcworCisKK0NsYXNzQS5tZXRob2QoMSwgMikKKworCitjbGFzcyBDbGFzc0I6CisgICAgQG92ZXJsb2FkCisgICAgZGVmIG1ldGhvZChzZWxmLCBhcmcxKToKKyAgICAgICAgcGFzcworCisgICAgQG92ZXJsb2FkCisgICAgZGVmIG1ldGhvZChzZWxmLCBhcmcxLCBhcmcyKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG1ldGhvZChzZWxmLCBhcmcxLCBhcmcyPU5vbmUpOgorICAgICAgICBwYXNzCisKKworQ2xhc3NCKCkubWV0aG9kKDEsIGFyZzI9MikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYm9vbGVhbl9leHByZXNzaW9ucy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYm9vbGVhbl9leHByZXNzaW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1Mzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9ib29sZWFuX2V4cHJlc3Npb25zLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyIiIkNoZWNrcyBmb3IgaWYgc3RhdGVtZW50cyBjb250YWluaW5nIHRvbyBtYW55IGJvb2xlYW4gZXhwcmVzc2lvbnMiIiIKKworIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lLCBjb21wYXJpc29uLXdpdGgtaXRzZWxmLCBjaGFpbmVkLWNvbXBhcmlzb24sIGNvbmRpdGlvbi1ldmFscy10by1jb25zdGFudAorCit4ID0geSA9IHogPSA1CitpZiB4ID4gLTUgYW5kIHggPCA1IGFuZCB5ID4gLTUgYW5kIHkgPCA1IGFuZCB6ID4gLTUgYW5kIHogPCA1OiAgIyBbdG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9uc10KKyAgICBwYXNzCitlbGlmIFRydWUgYW5kIEZhbHNlIGFuZCAxIGFuZCAyIGFuZCAzOgorICAgIHBhc3MKK2VsaWYgVHJ1ZSBhbmQgRmFsc2UgYW5kIDEgYW5kIDIgYW5kIDMgYW5kIDQgYW5kIDU6ICMgW3Rvby1tYW55LWJvb2xlYW4tZXhwcmVzc2lvbnNdCisgICAgcGFzcworZWxpZiBUcnVlIGFuZCAoVHJ1ZSBhbmQgVHJ1ZSkgYW5kICh4ID09IDUgb3IgVHJ1ZSBvciBUcnVlKTogIyBbdG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9uc10KKyAgICBwYXNzCitlbGlmIFRydWUgYW5kIChUcnVlIG9yICh4ID4gLTUgYW5kIHggPCA1IGFuZCAoeiA+IC01IG9yIHogPCA1KSkpOiAjIFt0b28tbWFueS1ib29sZWFuLWV4cHJlc3Npb25zXQorICAgIHBhc3MKK2VsaWYgVHJ1ZSA9PSBUcnVlID09IFRydWUgPT0gVHJ1ZSA9PSBUcnVlID09IFRydWU6CisgICAgcGFzcworCitpZiBUcnVlIGFuZCBGYWxzZSBhbmQgMSBhbmQgMiBhbmQgMzoKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2Jvb2xlYW5fZXhwcmVzc2lvbnMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9ib29sZWFuX2V4cHJlc3Npb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU1ZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9ib29sZWFuX2V4cHJlc3Npb25zLnR4dApAQCAtMCwwICsxLDQgQEAKK3Rvby1tYW55LWJvb2xlYW4tZXhwcmVzc2lvbnM6NjozOjpUb28gbWFueSBib29sZWFuIGV4cHJlc3Npb25zIGluIGlmIHN0YXRlbWVudCAoNi81KQordG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9uczoxMDo1OjpUb28gbWFueSBib29sZWFuIGV4cHJlc3Npb25zIGluIGlmIHN0YXRlbWVudCAoNy81KQordG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9uczoxMjo1OjpUb28gbWFueSBib29sZWFuIGV4cHJlc3Npb25zIGluIGlmIHN0YXRlbWVudCAoNi81KQordG9vLW1hbnktYm9vbGVhbi1leHByZXNzaW9uczoxNDo1OjpUb28gbWFueSBib29sZWFuIGV4cHJlc3Npb25zIGluIGlmIHN0YXRlbWVudCAoNi81KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9icmFuY2hlcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYnJhbmNoZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwYjA2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYnJhbmNoZXMucHkKQEAgLTAsMCArMSw2OSBAQAorIiIiIFRlc3QgZm9yIHRvbyBtYW55IGJyYW5jaGVzLiAiIiINCisjIHB5bGludDogZGlzYWJsZT11c2luZy1jb25zdGFudC10ZXN0DQorZGVmIHdyb25nKCk6ICMgW3Rvby1tYW55LWJyYW5jaGVzXQ0KKyAgICAiIiIgSGFzIHRvbyBtYW55IGJyYW5jaGVzLiAiIiINCisgICAgaWYgMToNCisgICAgICAgIHBhc3MNCisgICAgZWxpZiAxOg0KKyAgICAgICAgcGFzcw0KKyAgICBlbGlmIDE6DQorICAgICAgICBwYXNzDQorICAgIGVsaWYgMToNCisgICAgICAgIHBhc3MNCisgICAgZWxpZiAxOg0KKyAgICAgICAgcGFzcw0KKyAgICBlbGlmIDE6DQorICAgICAgICBwYXNzDQorICAgIHRyeToNCisgICAgICAgIHBhc3MNCisgICAgZmluYWxseToNCisgICAgICAgIHBhc3MNCisgICAgaWYgMjoNCisgICAgICAgIHBhc3MNCisgICAgd2hpbGUgVHJ1ZToNCisgICAgICAgIHBhc3MNCisgICAgaWYgMToNCisgICAgICAgIHBhc3MNCisgICAgZWxpZiAyOg0KKyAgICAgICAgcGFzcw0KKyAgICBlbGlmIDM6DQorICAgICAgICBwYXNzDQorDQorZGVmIGdvb2QoKToNCisgICAgIiIiIFRvbyBtYW55IGJyYW5jaGVzIG9ubHkgaWYgd2UgdGFrZQ0KKyAgICBpbnRvIGNvbnNpZGVyYXRpb24gdGhlIG5lc3RlZCBmdW5jdGlvbnMuDQorICAgICIiIg0KKyAgICBkZWYgbmVzdGVkXzEoKToNCisgICAgICAgICIiIiBlbXB0eSAiIiINCisgICAgICAgIGlmIDE6DQorICAgICAgICAgICAgcGFzcw0KKyAgICAgICAgZWxpZiAyOg0KKyAgICAgICAgICAgIHBhc3MNCisgICAgICAgIGVsaWYgMzoNCisgICAgICAgICAgICBwYXNzDQorICAgICAgICBlbGlmIDQ6DQorICAgICAgICAgICAgcGFzcw0KKw0KKyAgICBuZXN0ZWRfMSgpDQorICAgIHRyeToNCisgICAgICAgIHBhc3MNCisgICAgZmluYWxseToNCisgICAgICAgIHBhc3MNCisgICAgdHJ5Og0KKyAgICAgICAgcGFzcw0KKyAgICBmaW5hbGx5Og0KKyAgICAgICAgcGFzcw0KKyAgICBpZiAxOg0KKyAgICAgICAgcGFzcw0KKyAgICBlbGlmIDI6DQorICAgICAgICBwYXNzDQorICAgIGVsaWYgMzoNCisgICAgICAgIHBhc3MNCisgICAgZWxpZiA0Og0KKyAgICAgICAgcGFzcw0KKyAgICBlbGlmIDU6DQorICAgICAgICBwYXNzDQorICAgIGVsaWYgNjoNCisgICAgICAgIHBhc3MNCisgICAgZWxpZiA3Og0KKyAgICAgICAgcGFzcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYnJhbmNoZXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9icmFuY2hlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTViZmQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfYnJhbmNoZXMudHh0CkBAIC0wLDAgKzEgQEAKK3Rvby1tYW55LWJyYW5jaGVzOjM6MDp3cm9uZzpUb28gbWFueSBicmFuY2hlcyAoMTMvMTIpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2luc3RhbmNlX2F0dHJpYnV0ZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2luc3RhbmNlX2F0dHJpYnV0ZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3MDNlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfaW5zdGFuY2VfYXR0cmlidXRlcy5weQpAQCAtMCwwICsxLDI2IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgQWFhYShvYmplY3QpOiAjIFt0b28tbWFueS1pbnN0YW5jZS1hdHRyaWJ1dGVzXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFhYWEgPSAxCisgICAgICAgIHNlbGYuYmJiYiA9IDIKKyAgICAgICAgc2VsZi5jY2NjID0gMworICAgICAgICBzZWxmLmRkZGQgPSA0CisgICAgICAgIHNlbGYuZWVlZSA9IDUKKyAgICAgICAgc2VsZi5mZmZmID0gNgorICAgICAgICBzZWxmLmdnZ2cgPSA3CisgICAgICAgIHNlbGYuaGhoaCA9IDgKKyAgICAgICAgc2VsZi5paWlpID0gOQorICAgICAgICBzZWxmLmpqamogPSAxMAorICAgICAgICBzZWxmLl9hYWFhID0gMQorICAgICAgICBzZWxmLl9iYmJiID0gMgorICAgICAgICBzZWxmLl9jY2NjID0gMworICAgICAgICBzZWxmLl9kZGRkID0gNAorICAgICAgICBzZWxmLl9lZWVlID0gNQorICAgICAgICBzZWxmLl9mZmZmID0gNgorICAgICAgICBzZWxmLl9nZ2dnID0gNworICAgICAgICBzZWxmLl9oaGhoID0gOAorICAgICAgICBzZWxmLl9paWlpID0gOQorICAgICAgICBzZWxmLl9qampqID0gMTAKKyAgICAgICAgc2VsZi50b211Y2ggPSBOb25lCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2luc3RhbmNlX2F0dHJpYnV0ZXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9pbnN0YW5jZV9hdHRyaWJ1dGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmM4NTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9pbnN0YW5jZV9hdHRyaWJ1dGVzLnR4dApAQCAtMCwwICsxIEBACit0b28tbWFueS1pbnN0YW5jZS1hdHRyaWJ1dGVzOjM6MDpBYWFhOlRvbyBtYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgKDIxLzcpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2xpbmVzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9saW5lcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGU1NjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9saW5lcy5weQpAQCAtMCwwICsxLDEwMTUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisjIC0xOiBbdG9vLW1hbnktbGluZXNdCitfX3JldmlzaW9uX18gPSAwCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK1pFUkZaQUVSID0gMworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitIRUhFSEUgPSAyCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2xpbmVzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbGluZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjI4YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2xpbmVzLnR4dApAQCAtMCwwICsxIEBACit0b28tbWFueS1saW5lczoxOjA6OlRvbyBtYW55IGxpbmVzIGluIG1vZHVsZSAoMTAxNS8xMDAwKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9saW5lc19kaXNhYmxlZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbGluZXNfZGlzYWJsZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwODY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbGluZXNfZGlzYWJsZWQucHkKQEAgLTAsMCArMSwxMDE4IEBACisiIiJUZXN0IHRoYXQgZGlzYWJsaW5nIHRvby1tYW55LWxpbmVzIG9uIGFueSBsaW5lIHdvcmtzLiIiIgorCisKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktbGluZXMKK19fcmV2aXNpb25fXyA9IDAKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworWkVSRlpBRVIgPSAzCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0hFSEVIRSA9IDIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbG9jYWxzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9sb2NhbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzOGE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbG9jYWxzLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2RlZiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTogIyBbdG9vLW1hbnktbG9jYWxzXQorICAgIGFyZzYsIGFyZzcsIGFyZzgsIGFyZzkgPSBhcmcxLCBhcmcyLCBhcmczLCBhcmc0CisgICAgcHJpbnQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSkKKyAgICBsb2MxLCBsb2MyLCBsb2MzLCBsb2M0LCBsb2M1LCBsb2M2LCBsb2M3ID0gYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgXAorIGFyZzYsIGFyZzcKKyAgICBwcmludChsb2MxLCBsb2MyLCBsb2MzLCBsb2M0LCBsb2M1LCBsb2M2LCBsb2M3KQorCisKK2RlZiB0b29fbWFueV9sb2NhbHNfZnVuY3Rpb24oKTogIyBbdG9vLW1hbnktbG9jYWxzXQorICAgICIiInB5bGludCB3aWxsIGNvbXBsYWlucyBhYm91dCB0b28gbWFueSBsb2NhbCB2YXJpYWJsZXMiIiIKKyAgICBhcmdzMCA9IDAKKyAgICBhcmdzMSA9IGFyZ3MwICogMQorICAgIGFyZ3MyID0gYXJnczEgKiAyCisgICAgYXJnczMgPSBhcmdzMiAqIDMKKyAgICBhcmdzNCA9IGFyZ3MzICogNAorICAgIGFyZ3M1ID0gYXJnczQgKiA1CisgICAgYXJnczYgPSBhcmdzNSAqIDYKKyAgICBhcmdzNyA9IGFyZ3M2ICogNworICAgIGFyZ3M4ID0gYXJnczcgKiA4CisgICAgYXJnczkgPSBhcmdzOCAqIDkKKyAgICBhcmdzMTAgPSBhcmdzOSAqIDEwCisgICAgYXJnczExID0gYXJnczEwICogMTEKKyAgICBhcmdzMTIgPSBhcmdzMTEgKiAxMgorICAgIGFyZ3MxMyA9IGFyZ3MxMiAqIDEzCisgICAgYXJnczE0ID0gYXJnczEzICogMTQKKyAgICBhcmdzMTUgPSBhcmdzMTQgKiAxNQorICAgIHJldHVybiBhcmdzMTUKKworZGVmIHRvb19tYW55X2FyZ3VtZW50c19mdW5jdGlvbihhcmdhLCBhcmd1LCBhcmdpLCBhcmdlLCBhcmd0LCBhcmdzKTogIyBbdG9vLW1hbnktYXJndW1lbnRzXQorICAgICIiInB5bGludCB3aWxsIGNvbXBsYWlucyBhYm91dCB0b28gbWFueSBhcmd1bWVudHMuIiIiCisgICAgYXJnYSA9IGFyZ3UKKyAgICBhcmdhICs9IGFyZ2kKKyAgICBhcmdhICs9IGFyZ2UKKyAgICBhcmdhICs9IGFyZ3QKKyAgICBhcmdhICs9IGFyZ3MKKyAgICByZXR1cm4gYXJnYQorCitkZWYgaWdub3JlZF9hcmd1bWVudHNfZnVuY3Rpb24oYXJnYSwgYXJndSwgYXJnaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYXJnZT0wLCBfYXJndD0xLCBfYXJncz1Ob25lKToKKyAgICAiIiJweWxpbnQgd2lsbCBpZ25vcmUgX2FyZ2UsIF9hcmd0LCBfYXJncy4KKworICAgIENvbnNlcXVlbnRseSBweWxpbnQgd2lsbCBvbmx5IGNvdW4gMTMgYXJndW1lbnRzLgorICAgICIiIgorICAgIGFyZzAgPSAwCisgICAgYXJnMSA9IGFyZzAgKiAxICsgYXJnYQorICAgIGFyZzIgPSBhcmcxICogMiArIGFyZ3UKKyAgICBhcmczID0gYXJnMiAqIDMgKyBhcmdpCisgICAgYXJnNCA9IGFyZzMgKiA0ICsgX2FyZ2UKKyAgICBhcmc1ID0gYXJnNCAqIDUgKyBfYXJndAorICAgIGFyZzYgPSBhcmc1ICogNgorICAgIGFyZzcgPSBhcmc2ICogNworICAgIGFyZzggPSBhcmc3ICogOAorICAgIGFyZzkgPSBhcmc4ICogOQorICAgIGFyZzkgKz0gYXJnMAorICAgIGlmIF9hcmdzOgorICAgICAgICBhcmc5ICs9IHN1bShfYXJncykKKyAgICByZXR1cm4gYXJnOQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9sb2NhbHMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9sb2NhbHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjdmMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X2xvY2Fscy50eHQKQEAgLTAsMCArMSwzIEBACit0b28tbWFueS1sb2NhbHM6NDowOmZ1bmN0aW9uOlRvbyBtYW55IGxvY2FsIHZhcmlhYmxlcyAoMTYvMTUpCit0b28tbWFueS1sb2NhbHM6MTI6MDp0b29fbWFueV9sb2NhbHNfZnVuY3Rpb246VG9vIG1hbnkgbG9jYWwgdmFyaWFibGVzICgxNi8xNSkKK3Rvby1tYW55LWFyZ3VtZW50czozMjowOnRvb19tYW55X2FyZ3VtZW50c19mdW5jdGlvbjpUb28gbWFueSBhcmd1bWVudHMgKDYvNSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbmVzdGVkX2Jsb2Nrcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfbmVzdGVkX2Jsb2Nrcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2MwMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9uZXN0ZWRfYmxvY2tzLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyIiIkNoZWNrcyB0aGUgbWF4aW11bSBibG9jayBsZXZlbCBpcyBzbWFsbGVyIHRoYW4gNiBpbiBmdW5jdGlvbiBkZWZpbml0aW9ucyIiIgorCisjcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QsIG1pc3NpbmctZG9jc3RyaW5nLCB0b28tbWFueS1yZXR1cm4tc3RhdGVtZW50cyxuby1lbHNlLXJldHVybgorCitkZWYgbXlfZnVuY3Rpb24oKToKKyAgICBpZiAxOiAgIyBbdG9vLW1hbnktbmVzdGVkLWJsb2Nrc10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgaWYgaSA9PSAyOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgaWYgMToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgaWYgaSA9PSAyOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBuZXN0ZWRfZnVuYygpOgorICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGlmIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGkKKworICAgIG5lc3RlZF9mdW5jKCkKKworZGVmIG1vcmVfY29tcGxleF9mdW5jdGlvbigpOgorICAgIGF0dHIxID0gYXR0cjIgPSBhdHRyMyA9IFsxLCAyLCAzXQorICAgIGlmIGF0dHIxOgorICAgICAgICBmb3IgaSBpbiBhdHRyMToKKyAgICAgICAgICAgIGlmIGF0dHIyOgorICAgICAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAnZHVoJworICAgIGVsaWYgYXR0cjI6CisgICAgICAgIGZvciBpIGluIGF0dHIyOgorICAgICAgICAgICAgaWYgYXR0cjI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdkdWgnCisgICAgZWxzZToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTUpOgorICAgICAgICAgICAgaWYgYXR0cjM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdkb2gnCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgZWxpZl9mdW5jdGlvbigpOgorICAgIGFyZyA9IE5vbmUKKyAgICBpZiBhcmcgPT0gMToKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIGFyZyA9PSAyOgorICAgICAgICByZXR1cm4gMgorICAgIGVsaWYgYXJnID09IDM6CisgICAgICAgIHJldHVybiAzCisgICAgZWxpZiBhcmcgPT0gNDoKKyAgICAgICAgcmV0dXJuIDQKKyAgICBlbGlmIGFyZyA9PSA1OgorICAgICAgICByZXR1cm4gNQorICAgIGVsaWYgYXJnID09IDY6CisgICAgICAgIHJldHVybiA2CisgICAgZWxpZiBhcmcgPT0gNzoKKyAgICAgICAgcmV0dXJuIDcKKyAgICByZXR1cm4gTm9uZQorCitkZWYgZWxzZV9pZl9mdW5jdGlvbigpOgorICAgIGFyZyA9IE5vbmUKKyAgICBpZiBhcmcgPT0gMTogICMgW3Rvby1tYW55LW5lc3RlZC1ibG9ja3NdCisgICAgICAgIHJldHVybiAxCisgICAgZWxzZToKKyAgICAgICAgaWYgYXJnID09IDI6CisgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYXJnID09IDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgYXJnID09IDQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgYXJnID09IDU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXJnID09IDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXJnID09IDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3CisgICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X25lc3RlZF9ibG9ja3MudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9uZXN0ZWRfYmxvY2tzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjMyYjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9uZXN0ZWRfYmxvY2tzLnR4dApAQCAtMCwwICsxLDIgQEAKK3Rvby1tYW55LW5lc3RlZC1ibG9ja3M6Njo0Om15X2Z1bmN0aW9uOlRvbyBtYW55IG5lc3RlZCBibG9ja3MgKDYvNSkKK3Rvby1tYW55LW5lc3RlZC1ibG9ja3M6Nzc6NDplbHNlX2lmX2Z1bmN0aW9uOlRvbyBtYW55IG5lc3RlZCBibG9ja3MgKDcvNSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfcHVibGljX21ldGhvZHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3B1YmxpY19tZXRob2RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjRiMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3B1YmxpY19tZXRob2RzLnB5CkBAIC0wLDAgKzEsNzkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitjbGFzcyBBYWFhKG9iamVjdCk6ICMgW3Rvby1tYW55LXB1YmxpYy1tZXRob2RzXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbWV0aDEoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGgyKHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoMyhzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgbWV0aDQoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGg1KHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoNihzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgbWV0aDcoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGg4KHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoOShzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgbWV0aDEwKHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoMTEoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGgxMihzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgbWV0aDEzKHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoMTQoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGgxNShzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgbWV0aDE2KHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoMTcoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGgxOChzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgbWV0aDE5KHNlbGYpOgorICAgICAgICAiIiJoZWhlaGUiIiIKKworICAgIGRlZiBtZXRoMjAoc2VsZik6CisgICAgICAgICIiImhlaGVoZSIiIgorCisgICAgZGVmIG1ldGgyMShzZWxmKToKKyAgICAgICAgIiIiaGVoZWhlIiIiCisKKyAgICBkZWYgX2RvbnRjb3VudChzZWxmKToKKyAgICAgICAgIiIibm90IHB1YmxpYyIiIgorCitjbGFzcyBCQkIoQWFhYSk6CisgICAgIiIiRG9uJ3QgZW1pdCBmb3IgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBwYXJlbnQuIiIiCisgICAgZGVmIG1ldGgxKHNlbGYpOgorICAgICAgICAiIiJ0cm9wIiIiCisgICAgZGVmIG1ldGgyKHNlbGYpOgorICAgICAgICAiIiJ0em9wIiIiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3B1YmxpY19tZXRob2RzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfcHVibGljX21ldGhvZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTQ3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3B1YmxpY19tZXRob2RzLnR4dApAQCAtMCwwICsxIEBACit0b28tbWFueS1wdWJsaWMtbWV0aG9kczozOjA6QWFhYTpUb28gbWFueSBwdWJsaWMgbWV0aG9kcyAoMjEvMjApCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3JldHVybl9zdGF0ZW1lbnRzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9yZXR1cm5fc3RhdGVtZW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE4NWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9yZXR1cm5fc3RhdGVtZW50cy5weQpAQCAtMCwwICsxLDQwIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitkZWYgc3R1cGlkX2Z1bmN0aW9uKGFyZyk6ICMgW3Rvby1tYW55LXJldHVybi1zdGF0ZW1lbnRzXQorICAgIGlmIGFyZyA9PSAxOgorICAgICAgICByZXR1cm4gMQorICAgIGlmIGFyZyA9PSAyOgorICAgICAgICByZXR1cm4gMgorICAgIGlmIGFyZyA9PSAzOgorICAgICAgICByZXR1cm4gMworICAgIGlmIGFyZyA9PSA0OgorICAgICAgICByZXR1cm4gNAorICAgIGlmIGFyZyA9PSA1OgorICAgICAgICByZXR1cm4gNQorICAgIGlmIGFyZyA9PSA2OgorICAgICAgICByZXR1cm4gNgorICAgIGlmIGFyZyA9PSA3OgorICAgICAgICByZXR1cm4gNworICAgIGlmIGFyZyA9PSA4OgorICAgICAgICByZXR1cm4gOAorICAgIGlmIGFyZyA9PSA5OgorICAgICAgICByZXR1cm4gOQorICAgIGlmIGFyZyA9PSAxMDoKKyAgICAgICAgcmV0dXJuIDEwCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgbWFueV95aWVsZCh0ZXh0KToKKyAgICAiIiJOb3QgYSBwcm9ibGVtIiIiCisgICAgaWYgdGV4dDoKKyAgICAgICAgeWllbGQgIiAgICBsaW5lIDE6ICVzXG4iICUgdGV4dAorICAgICAgICB5aWVsZCAiICAgIGxpbmUgMlxuIgorICAgICAgICB5aWVsZCAiICAgIGxpbmUgM1xuIgorICAgICAgICB5aWVsZCAiICAgIGxpbmUgNFxuIgorICAgICAgICB5aWVsZCAiICAgIGxpbmUgNVxuIgorICAgIGVsc2U6CisgICAgICAgIHlpZWxkICIgICAgbGluZSA2XG4iCisgICAgICAgIHlpZWxkICIgICAgbGluZSA3XG4iCisgICAgICAgIHlpZWxkICIgICAgbGluZSA4XG4iCisgICAgICAgIHlpZWxkICIgICAgbGluZSA5XG4iCisgICAgICAgIHlpZWxkICIgICAgbGluZSAxMFxuIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9yZXR1cm5fc3RhdGVtZW50cy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3JldHVybl9zdGF0ZW1lbnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJiYjcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9yZXR1cm5fc3RhdGVtZW50cy50eHQKQEAgLTAsMCArMSBAQAordG9vLW1hbnktcmV0dXJuLXN0YXRlbWVudHM6MzowOnN0dXBpZF9mdW5jdGlvbjpUb28gbWFueSByZXR1cm4gc3RhdGVtZW50cyAoMTEvNikKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3Rhcl9leHByZXNzaW9ucy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3Rhcl9leHByZXNzaW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWJiZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9zdGFyX2V4cHJlc3Npb25zLnB5CkBAIC0wLDAgKzEsNyBAQAorIiIiVGVzdCBmb3IgdG9vLW1hbnktc3Rhci1leHByZXNzaW9ucy4iIiINCisjIHB5bGludDogZGlzYWJsZT11bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZw0KKypGSVJTVCwgKlNFQ09ORCA9IFsxLCAyLCAzXSAjIFt0b28tbWFueS1zdGFyLWV4cHJlc3Npb25zXQ0KKyhGSVJTVCwgKlNFQ09ORCksICpUSElSRCA9ICgoMSwgMiwgMyksIDQsIDUpDQorKkZJUlNUXzEsIFNFQ09ORCA9ICgxLCAyLCAzKQ0KKygqRklSU1QsICpTRUNPTkQpLCBUSElSRCA9IFsuLi5dICAjIFt0b28tbWFueS1zdGFyLWV4cHJlc3Npb25zXQ0KKygoKkZJUlNULCBTRUNPTkQpLCAqVEhJUkQpLCAqRk9VUlRIID0gWy4uLl0NCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3N0YXJfZXhwcmVzc2lvbnMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3N0YXJfZXhwcmVzc2lvbnMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3Rhcl9leHByZXNzaW9ucy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3Rhcl9leHByZXNzaW9ucy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3N0YXJfZXhwcmVzc2lvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTc0YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3N0YXJfZXhwcmVzc2lvbnMudHh0CkBAIC0wLDAgKzEsMiBAQAordG9vLW1hbnktc3Rhci1leHByZXNzaW9uczozOjA6Ok1vcmUgdGhhbiBvbmUgc3RhcnJlZCBleHByZXNzaW9uIGluIGFzc2lnbm1lbnQKK3Rvby1tYW55LXN0YXItZXhwcmVzc2lvbnM6NjowOjpNb3JlIHRoYW4gb25lIHN0YXJyZWQgZXhwcmVzc2lvbiBpbiBhc3NpZ25tZW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3N0YXRlbWVudHMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdG9vL3Rvb19tYW55X3N0YXRlbWVudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlNzJiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3RhdGVtZW50cy5weQpAQCAtMCwwICsxLDEzMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2RlZiBzdHVwaWRfZnVuY3Rpb24oYXJnKTogIyBbdG9vLW1hbnktc3RhdGVtZW50c10KKyAgICBpZiBhcmcgPT0gMToKKyAgICAgICAgcHJpbnQoMSkKKyAgICBlbGlmIGFyZyA9PSAyOgorICAgICAgICBwcmludCgxKQorICAgIGVsaWYgYXJnID09IDM6CisgICAgICAgIHByaW50KDEpCisgICAgZWxpZiBhcmcgPT0gNDoKKyAgICAgICAgcHJpbnQoMSkKKyAgICBlbGlmIGFyZyA9PSA1OgorICAgICAgICBwcmludCgxKQorICAgIGVsaWYgYXJnID09IDY6CisgICAgICAgIHByaW50KDEpCisgICAgZWxpZiBhcmcgPT0gNzoKKyAgICAgICAgcHJpbnQoMSkKKyAgICBlbGlmIGFyZyA9PSA4OgorICAgICAgICBwcmludCgxKQorICAgIGVsaWYgYXJnID09IDk6CisgICAgICAgIHByaW50KDEpCisgICAgZWxpZiBhcmcgPT0gMTA6CisgICAgICAgIHByaW50KDEpCisgICAgZWxpZiBhcmcgPCAxOgorICAgICAgICBwcmludCgxKQorICAgICAgICBwcmludCgxKQorICAgICAgICBhcmcgPSAwCisgICAgZm9yIF8gaW4gcmFuZ2UoYXJnKToKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKyAgICAgICAgcHJpbnQoMSkKKworZGVmIGxvbmdfZnVuY3Rpb25fd2l0aF9pbmxpbmVfZGVmKGZha2UpOiAjIFt0b28tbWFueS1zdGF0ZW1lbnRzXQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGZha2UgKz0gMQorICAgIGRlZiBhbl9pbmxpbmVfZnVuY3Rpb24odmFyKToKKyAgICAgICAgcmV0dXJuIHZhciArIHZhcgorICAgIGZha2UgPSBhbl9pbmxpbmVfZnVuY3Rpb24oZmFrZSkKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKyAgICBmYWtlICs9IDEKKworCitkZWYgZXhtYXBsZV9mdW5jdGlvbigpOiAgIyBbdG9vLW1hbnktc3RhdGVtZW50c10KKyAgICBhID0gMQorICAgIGIgPSAyCisgICAgYyA9IDMKKyAgICBkID0gYSAqIGIgKyBjCisgICAgcHJpbnQoZCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3RhdGVtZW50cy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3RhdGVtZW50cy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQyMmYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9zdGF0ZW1lbnRzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWF4LXN0YXRlbWVudHM9NQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3Rvby90b29fbWFueV9zdGF0ZW1lbnRzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3RhdGVtZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyM2RiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90b28vdG9vX21hbnlfc3RhdGVtZW50cy50eHQKQEAgLTAsMCArMSwzIEBACit0b28tbWFueS1zdGF0ZW1lbnRzOjU6MDpzdHVwaWRfZnVuY3Rpb246VG9vIG1hbnkgc3RhdGVtZW50cyAoNTUvNSk6SElHSAordG9vLW1hbnktc3RhdGVtZW50czo2MjowOmxvbmdfZnVuY3Rpb25fd2l0aF9pbmxpbmVfZGVmOlRvbyBtYW55IHN0YXRlbWVudHMgKDYyLzUpOkhJR0gKK3Rvby1tYW55LXN0YXRlbWVudHM6MTI4OjA6ZXhtYXBsZV9mdW5jdGlvbjpUb28gbWFueSBzdGF0ZW1lbnRzICg2LzUpOkhJR0gKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19jb21tYV90dXBsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19jb21tYV90dXBsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTYwMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX2NvbW1hX3R1cGxlLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyIiIkNoZWNrIHRyYWlsaW5nIGNvbW1hIG9uZSBlbGVtZW50IHR1cGxlcy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitBQUEgPSAxLCAjIFt0cmFpbGluZy1jb21tYS10dXBsZV0KK0JCQiA9ICJhYWFhIiwgIyBbdHJhaWxpbmctY29tbWEtdHVwbGVdCitDQ0M9ImFhYSIsICMgW3RyYWlsaW5nLWNvbW1hLXR1cGxlXQorRkZGPVsnZiddLCAjIFt0cmFpbGluZy1jb21tYS10dXBsZV0KKworQkJCID0gMSwgMgorQ0NDID0gKDEsIDIsIDMpCitEREQgPSAoCisgICAgMSwgMiwgMywKKykKK0VFRSA9ICgKKyAgICAiYWFhIiwKKykKKworCitkZWYgdGVzdCgqYXJncywgKiprd2FyZ3MpOgorICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKKworCit0ZXN0KHdpZGdldD0xLCBsYWJlbD0ndGVzdCcpCit0ZXN0KHdpZGdldD0xLAorICAgICBsYWJlbD0ndGVzdCcpCit0ZXN0KHdpZGdldD0xLCBcCisgICAgIGxhYmVsPSd0ZXN0JykKKworCitkZWYgc29tZV9mdW5jKGZpcnN0LCBzZWNvbmQpOgorICAgIGlmIGZpcnN0OgorICAgICAgICByZXR1cm4gZmlyc3QsICMgW3RyYWlsaW5nLWNvbW1hLXR1cGxlXQorICAgIGlmIHNlY29uZDoKKyAgICAgICAgcmV0dXJuIChmaXJzdCwgc2Vjb25kLCkKKyAgICByZXR1cm4gZmlyc3QsIHNlY29uZCwgICMgW3RyYWlsaW5nLWNvbW1hLXR1cGxlXQorCisKK2RlZiBzb21lX290aGVyX2Z1bmMoKToKKyAgICB5aWVsZCAnaGVsbG8nLCAgIyBbdHJhaWxpbmctY29tbWEtdHVwbGVdCisKK0dHRyA9IFsiYWFhIgorXSwgIyBbdHJhaWxpbmctY29tbWEtdHVwbGVdCisKK0hISCA9IFsiYWFhIgorXQorCitJSUkgPSBzb21lX2Z1bmMoMCwKKyAgICAwKSwgIyBbdHJhaWxpbmctY29tbWEtdHVwbGVdCisKK0pKSiA9IHNvbWVfZnVuYygwLAorICAgIDApCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfY29tbWFfdHVwbGUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfY29tbWFfdHVwbGUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19jb21tYV90dXBsZS5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19jb21tYV90dXBsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfY29tbWFfdHVwbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOThiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfY29tbWFfdHVwbGUudHh0CkBAIC0wLDAgKzEsOSBAQAordHJhaWxpbmctY29tbWEtdHVwbGU6MzowOjpEaXNhbGxvdyB0cmFpbGluZyBjb21tYSB0dXBsZQordHJhaWxpbmctY29tbWEtdHVwbGU6NDowOjpEaXNhbGxvdyB0cmFpbGluZyBjb21tYSB0dXBsZQordHJhaWxpbmctY29tbWEtdHVwbGU6NTowOjpEaXNhbGxvdyB0cmFpbGluZyBjb21tYSB0dXBsZQordHJhaWxpbmctY29tbWEtdHVwbGU6NjowOjpEaXNhbGxvdyB0cmFpbGluZyBjb21tYSB0dXBsZQordHJhaWxpbmctY29tbWEtdHVwbGU6MzE6MDo6RGlzYWxsb3cgdHJhaWxpbmcgY29tbWEgdHVwbGUKK3RyYWlsaW5nLWNvbW1hLXR1cGxlOjM0OjA6OkRpc2FsbG93IHRyYWlsaW5nIGNvbW1hIHR1cGxlCit0cmFpbGluZy1jb21tYS10dXBsZTozODowOjpEaXNhbGxvdyB0cmFpbGluZyBjb21tYSB0dXBsZQordHJhaWxpbmctY29tbWEtdHVwbGU6NDE6MDo6RGlzYWxsb3cgdHJhaWxpbmcgY29tbWEgdHVwbGUKK3RyYWlsaW5nLWNvbW1hLXR1cGxlOjQ3OjA6OkRpc2FsbG93IHRyYWlsaW5nIGNvbW1hIHR1cGxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfbmV3bGluZXMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfbmV3bGluZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiYWRiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19uZXdsaW5lcy5weQpAQCAtMCwwICsxLDMgQEAKKyIiIlJlZ3Jlc3Npb24gdGVzdCBmb3IgdHJhaWxpbmctbmV3bGluZXMgKEMwMzA0KS4iIiIKKyMgKzE6IFt0cmFpbGluZy1uZXdsaW5lc10KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX25ld2xpbmVzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19uZXdsaW5lcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1OGE3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cmFpbGluZ19uZXdsaW5lcy50eHQKQEAgLTAsMCArMSBAQAordHJhaWxpbmctbmV3bGluZXM6MzowOjpUcmFpbGluZyBuZXdsaW5lcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX3doaXRlc3BhY2VzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX3doaXRlc3BhY2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGU4MDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfd2hpdGVzcGFjZXMucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiUmVncmVzc2lvbiB0ZXN0IGZvciB0cmFpbGluZy13aGl0ZXNwYWNlIChDMDMwMykuIiIiCisjIHB5bGludDogZGlzYWJsZT1taXhlZC1saW5lLWVuZGluZ3MKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworIyArMTogW3RyYWlsaW5nLXdoaXRlc3BhY2VdCitwcmludCgnc29tZSB0cmFpbGluZyB3aGl0ZXNwYWNlJykgICAKKyMgKzE6IFt0cmFpbGluZy13aGl0ZXNwYWNlXQorcHJpbnQoJ3RyYWlsaW5nIHdoaXRlc3BhY2UgZG9lcyBub3QgY291bnQgdG93YXJkcyB0aGUgbGluZSBsZW5ndGggbGltaXQnKSAgICAgICAgICAgICAgICAgICAKK3ByaW50KCd3aW5kb3dzIGxpbmUgZW5kcyBhcmUgb2snKQ0KKyMgKzE6IFt0cmFpbGluZy13aGl0ZXNwYWNlXQ0KK3ByaW50KCdidXQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiB3aW4gaXMgbm90JykgICANCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHJhaWxpbmdfd2hpdGVzcGFjZXMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX3doaXRlc3BhY2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFhYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyYWlsaW5nX3doaXRlc3BhY2VzLnR4dApAQCAtMCwwICsxLDMgQEAKK3RyYWlsaW5nLXdoaXRlc3BhY2U6NjozMzo6VHJhaWxpbmcgd2hpdGVzcGFjZQordHJhaWxpbmctd2hpdGVzcGFjZTo4OjczOjpUcmFpbGluZyB3aGl0ZXNwYWNlCit0cmFpbGluZy13aGl0ZXNwYWNlOjExOjQ2OjpUcmFpbGluZyB3aGl0ZXNwYWNlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHJ5X2V4Y2VwdF9yYWlzZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cnlfZXhjZXB0X3JhaXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmEyOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJ5X2V4Y2VwdF9yYWlzZS5weQpAQCAtMCwwICsxLDExMSBAQAorIyBweWxpbnQ6ZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdW5yZWFjaGFibGUsIGJhZC1leGNlcHQtb3JkZXIsIGJhcmUtZXhjZXB0LCB1bm5lY2Vzc2FyeS1wYXNzCisjIHB5bGludDogZGlzYWJsZT11bmRlZmluZWQtdmFyaWFibGUsIGJyb2FkLWV4Y2VwdCwgcmFpc2UtbWlzc2luZy1mcm9tCit0cnk6CisgICAgaW50KCI5YSIpCitleGNlcHQ6ICAjIFt0cnktZXhjZXB0LXJhaXNlXQorICAgIHJhaXNlCisKK3RyeToKKyAgICBpbnQoIjlhIikKK2V4Y2VwdDoKKyAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIGludGVnZXInKQorCisKK3RyeToKKyAgICBpbnQoIjlhIikKK2V4Y2VwdDogICMgW3RyeS1leGNlcHQtcmFpc2VdCisgICAgcmFpc2UKKyAgICBwcmludCgnY2F1Z2h0IGV4Y2VwdGlvbicpCisKK3RyeToKKyAgICBpbnQoIjlhIikKK2V4Y2VwdDoKKyAgICBwcmludCgnY2F1Z2h0IGV4Y2VwdGlvbicpCisgICAgcmFpc2UKKworCitjbGFzcyBBQUFFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJBQUFFeGNlcHRpb24iIiIKKyAgICBwYXNzCisKK2NsYXNzIEJCQkV4Y2VwdGlvbihBQUFFeGNlcHRpb24pOgorICAgICIiIkJCQkV4Y2VwdGlvbiIiIgorICAgIHBhc3MKKworZGVmIGNjYygpOgorICAgICIiInRyeS1leGNlcHQtcmFpc2UgdGVzdCBmdW5jdGlvbiIiIgorCisgICAgdHJ5OgorICAgICAgICByYWlzZSBCQkJFeGNlcHRpb24oImFzZGYiKQorICAgIGV4Y2VwdCBCQkJFeGNlcHRpb246CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0IEFBQUV4Y2VwdGlvbjoKKyAgICAgICAgcmFpc2UgQkJCRXhjZXB0aW9uKCJyYWlzZWQgZnJvbSBBQUFFeGNlcHRpb24iKQorCisKK2RlZiBkZGQoKToKKyAgICAiIiJ0cnktZXhjZXB0LXJhaXNlIHRlc3QgZnVuY3Rpb24iIiIKKworICAgIHRyeToKKyAgICAgICAgcmFpc2UgQkJCRXhjZXB0aW9uKCJhc2RmIikKKyAgICBleGNlcHQgQUFBRXhjZXB0aW9uOgorICAgICAgICByYWlzZSBCQkJFeGNlcHRpb24oInJhaXNlZCBmcm9tIEFBQUV4Y2VwdGlvbiIpCisgICAgZXhjZXB0OiAgIyBbdHJ5LWV4Y2VwdC1yYWlzZV0KKyAgICAgICAgcmFpc2UKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgcmFpc2UKK2V4Y2VwdDoKKyAgICBwcmludCgiYSBmYWlsdXJlIikKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdDoKKyAgICBwcmludCgiYSBmYWlsdXJlIikKK2V4Y2VwdCBSdW50aW1lRXJyb3I6ICAjIFt0cnktZXhjZXB0LXJhaXNlXQorICAgIHJhaXNlCisKK3RyeToKKyAgICBwYXNzCitleGNlcHQ6ICAjIFt0cnktZXhjZXB0LXJhaXNlXQorICAgIHJhaXNlCitleGNlcHQgUnVudGltZUVycm9yOgorICAgIHByaW50KCJhIGZhaWx1cmUiKQorCit0cnk6CisgICAgcGFzcworZXhjZXB0IChGaWxlTm90Rm91bmRFcnJvciwgUGVybWlzc2lvbkVycm9yKToKKyAgICByYWlzZQorZXhjZXB0IE9TRXJyb3I6CisgICAgcHJpbnQoImEgZmFpbHVyZSIpCisKKyMgYWxzbyBjb25zaWRlciB0dXBsZXMgZm9yIHN1YnNlcXVlbnQgZXhjZXB0aW9uIGhhbmRsZXIgaW5zdGVhZCBvZiBqdXN0IGJhcmUgZXhjZXB0IGhhbmRsZXIKK3RyeToKKyAgICBwYXNzCitleGNlcHQgKEZpbGVOb3RGb3VuZEVycm9yLCBQZXJtaXNzaW9uRXJyb3IpOgorICAgIHJhaXNlCitleGNlcHQgKE92ZXJmbG93RXJyb3IsIE9TRXJyb3IpOgorICAgIHByaW50KCJhIGZhaWx1cmUiKQorCit0cnk6CisgICAgcGFzcworZXhjZXB0IChGaWxlTm90Rm91bmRFcnJvciwgUGVybWlzc2lvbkVycm9yKTogICMgW3RyeS1leGNlcHQtcmFpc2VdCisgICAgcmFpc2UKK2V4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgIHByaW50KCJhIGZhaWx1cmUiKQorCit0cnk6CisgICAgcGFzcworZXhjZXB0IChGaWxlTm90Rm91bmRFcnJvciwgUGVybWlzc2lvbkVycm9yKToKKyAgICByYWlzZQorZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICBwcmludCgiYSBmYWlsdXJlIikKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdCAoRmlsZU5vdEZvdW5kRXJyb3IsIFBlcm1pc3Npb25FcnJvcik6CisgICAgcmFpc2UKK2V4Y2VwdCAoRXhjZXB0aW9uLCk6CisgICAgcHJpbnQoImEgZmFpbHVyZSIpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHJ5X2V4Y2VwdF9yYWlzZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJ5X2V4Y2VwdF9yYWlzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMWZkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cnlfZXhjZXB0X3JhaXNlLnR4dApAQCAtMCwwICsxLDYgQEAKK3RyeS1leGNlcHQtcmFpc2U6NTowOjpUaGUgZXhjZXB0IGhhbmRsZXIgcmFpc2VzIGltbWVkaWF0ZWx5Cit0cnktZXhjZXB0LXJhaXNlOjE2OjA6OlRoZSBleGNlcHQgaGFuZGxlciByYWlzZXMgaW1tZWRpYXRlbHkKK3RyeS1leGNlcHQtcmFpc2U6NTM6NDpkZGQ6VGhlIGV4Y2VwdCBoYW5kbGVyIHJhaXNlcyBpbW1lZGlhdGVseQordHJ5LWV4Y2VwdC1yYWlzZTo2NzowOjpUaGUgZXhjZXB0IGhhbmRsZXIgcmFpc2VzIGltbWVkaWF0ZWx5Cit0cnktZXhjZXB0LXJhaXNlOjcyOjA6OlRoZSBleGNlcHQgaGFuZGxlciByYWlzZXMgaW1tZWRpYXRlbHkKK3RyeS1leGNlcHQtcmFpc2U6OTQ6MDo6VGhlIGV4Y2VwdCBoYW5kbGVyIHJhaXNlcyBpbW1lZGlhdGVseQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3RyeV9leGNlcHRfcmFpc2VfY3Jhc2gucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJ5X2V4Y2VwdF9yYWlzZV9jcmFzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGEwNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyeV9leGNlcHRfcmFpc2VfY3Jhc2gucHkKQEAgLTAsMCArMSwyNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLW1hbnktYW5jZXN0b3JzLCBicm9hZC1leGNlcHQKK2ltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2Zyb20gdHlwaW5nIGltcG9ydCBUWVBFX0NIRUNLSU5HLCBTaXplZAorCitpZiBUWVBFX0NIRUNLSU5HOgorICAgIEJhc2VDbGFzcyA9IFNpemVkCitlbHNlOgorICAgIEJhc2VDbGFzcyA9IGNvbGxlY3Rpb25zLmFiYy5TaXplZAorCisKK2NsYXNzIFRlc3RCYXNlRXhjZXB0aW9uKEJhc2VDbGFzcyk6CisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKworY2xhc3MgVGVzdEV4Y2VwdGlvbihUZXN0QmFzZUV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2RlZiB0ZXN0KCk6CisgICAgdHJ5OgorICAgICAgICAxIC8gMAorICAgIGV4Y2VwdCBUZXN0RXhjZXB0aW9uOiAgIyBbY2F0Y2hpbmctbm9uLWV4Y2VwdGlvbix0cnktZXhjZXB0LXJhaXNlXQorICAgICAgICByYWlzZQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cnlfZXhjZXB0X3JhaXNlX2NyYXNoLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyeV9leGNlcHRfcmFpc2VfY3Jhc2gucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90cnlfZXhjZXB0X3JhaXNlX2NyYXNoLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3RyeV9leGNlcHRfcmFpc2VfY3Jhc2gudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3RyeV9leGNlcHRfcmFpc2VfY3Jhc2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWI5MTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHJ5X2V4Y2VwdF9yYWlzZV9jcmFzaC50eHQKQEAgLTAsMCArMSwyIEBACitjYXRjaGluZy1ub24tZXhjZXB0aW9uOjIzOjExOnRlc3Q6IkNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aGljaCBkb2Vzbid0IGluaGVyaXQgZnJvbSBFeGNlcHRpb246IFRlc3RFeGNlcHRpb24iCit0cnktZXhjZXB0LXJhaXNlOjIzOjQ6dGVzdDpUaGUgZXhjZXB0IGhhbmRsZXIgcmFpc2VzIGltbWVkaWF0ZWx5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHlwZWREaWN0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGVkRGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJhNGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGVkRGljdC5weQpAQCAtMCwwICsxLDE4IEBACisiIiJUZXN0IHR5cGluZy5UeXBlZERpY3QiIiIKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSxtaXNzaW5nLWNsYXNzLWRvY3N0cmluZworaW1wb3J0IHR5cGluZworZnJvbSB0eXBpbmcgaW1wb3J0IFR5cGVkRGljdAorCisKK2NsYXNzIEN1c3RvbVREKFR5cGVkRGljdCk6CisgICAgdmFyOiBpbnQKKworY2xhc3MgQ3VzdG9tVEQyKHR5cGluZy5UeXBlZERpY3QsIHRvdGFsPUZhbHNlKToKKyAgICB2YXIyOiBzdHIKKworY2xhc3MgQ3VzdG9tVEQzKEN1c3RvbVREMik6CisgICAgdmFyMzogaW50CisKK0N1c3RvbVRENCA9IFR5cGVkRGljdCgiQ3VzdG9tVEQ0IiwgdmFyND1ib29sKQorCitDdXN0b21URDUgPSBUeXBlZERpY3QoIkN1c3RvbVRENSIsIHsidmFyNSI6IGJvb2x9KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGVkRGljdC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBlZERpY3QucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmYzUwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBlZERpY3QucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My44CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHlwaW5nX2dlbmVyaWMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHlwaW5nX2dlbmVyaWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxZDk5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBpbmdfZ2VuZXJpYy5weQpAQCAtMCwwICsxLDMyIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxpbnZhbGlkLW5hbWUsdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzI4MjIKKyMgQmFzZSBzaG91bGQgYmUgc3Vic2NyaXB0YWJsZSwgZXZlbiB3aXRoIEFCQ01ldGEgYXMgbWV0YWNsYXNzCitmcm9tIGFiYyBpbXBvcnQgQUJDLCBBQkNNZXRhCitmcm9tIHR5cGluZyBpbXBvcnQgR2VuZXJpYywgVHlwZVZhcgorCitUID0gVHlwZVZhcigiVCIpCisKK2NsYXNzIEJhc2UoR2VuZXJpY1tUXSwgbWV0YWNsYXNzPUFCQ01ldGEpOgorICAgICIiIkJhc2UiIiIKKworY2xhc3MgSW1wbChCYXNlW3N0cl0pOgorICAgICIiIkltcGwiIiIKKworCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9hc3Ryb2lkL2lzc3Vlcy85NDIKK0FueXRoaW5nID0gVHlwZVZhcigiQW55dGhpbmciKQorTW9yZVNwZWNpZmljID0gVHlwZVZhcigiTW9yZVNwZWNpZmljIiwgc3RyLCBpbnQpCisKK2NsYXNzIEEoQUJDLCBHZW5lcmljW0FueXRoaW5nXSk6CisgICAgZGVmIGFfbWV0aG9kKHNlbGYpIC0+IE5vbmU6ICAjIHB5bGludDogZGlzYWJsZT1uby1zZWxmLXVzZQorICAgICAgICBwcmludCgiaGVsbG8iKQorCitjbGFzcyBCKEFbTW9yZVNwZWNpZmljXSk6CisgICAgcGFzcworCitjbGFzcyBDKEJbc3RyXSk6CisgICAgcGFzcworCitjID0gQygpCitjLmFfbWV0aG9kKCkgICMgc2hvdWxkIE5PVCBlbWl0IGBuby1tZW1iZXJgIGVycm9yCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3QvdHlwaW5nX2dlbmVyaWMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHlwaW5nX2dlbmVyaWMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3YmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBpbmdfZ2VuZXJpYy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBpbmdfdXNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGluZ191c2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyYTA4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBpbmdfdXNlLnB5CkBAIC0wLDAgKzEsNjUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKK2ltcG9ydCB0eXBpbmcKK2Zyb20gdHlwaW5nIGltcG9ydCBvdmVybG9hZAorCitAdHlwaW5nLm92ZXJsb2FkCitkZWYgZG91YmxlX3dpdGhfZG9jc3RyaW5nKGFyZzogc3RyKSAtPiBzdHI6CisgICAgIiIiUmV0dXJuIGFyZywgY29uY2F0ZW5hdGVkIHdpdGggaXRzZWxmLiIiIgorCisKK0B0eXBpbmcub3ZlcmxvYWQKK2RlZiBkb3VibGVfd2l0aF9kb2NzdHJpbmcoYXJnOiBpbnQpIC0+IGludDoKKyAgICAiIiJSZXR1cm4gdHdpY2UgYXJnLiIiIgorCisKK2RlZiBkb3VibGVfd2l0aF9kb2NzdHJpbmcoYXJnKToKKyAgICAiIiJSZXR1cm4gMiAqIGFyZy4iIiIKKyAgICByZXR1cm4gMiAqIGFyZworCisKK2RlZiBkb3VibGVfd2l0aF9kb2NzdHJpbmcoYXJnKTogICMgW2Z1bmN0aW9uLXJlZGVmaW5lZF0KKyAgICAiIiJSZWRlZmluZWQgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24iIiIKKyAgICByZXR1cm4gMiAqIGFyZworCisKK0B0eXBpbmcub3ZlcmxvYWQKK2RlZiBkb3VibGVfd2l0aF9lbGxpcHNpcyhhcmc6IHN0cikgLT4gc3RyOgorICAgIC4uLgorCisKK0B0eXBpbmcub3ZlcmxvYWQKK2RlZiBkb3VibGVfd2l0aF9lbGxpcHNpcyhhcmc6IGludCkgLT4gaW50OgorICAgIC4uLgorCisKK2RlZiBkb3VibGVfd2l0aF9lbGxpcHNpcyhhcmcpOgorICAgIHJldHVybiAyICogYXJnCisKKworQHR5cGluZy5vdmVybG9hZAorZGVmIGRvdWJsZV93aXRoX3Bhc3MoYXJnOiBzdHIpIC0+IHN0cjoKKyAgICBwYXNzCisKKworQHR5cGluZy5vdmVybG9hZAorZGVmIGRvdWJsZV93aXRoX3Bhc3MoYXJnOiBpbnQpIC0+IGludDoKKyAgICBwYXNzCisKKworZGVmIGRvdWJsZV93aXRoX3Bhc3MoYXJnKToKKyAgICByZXR1cm4gMiAqIGFyZworCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzCitjbGFzcyBDbHM6CisgICAgQHR5cGluZy5vdmVybG9hZAorICAgIGRlZiBtZXRob2Qoc2VsZiwgcGFyYW06IGludCkgLT4gTm9uZToKKyAgICAgICAgLi4uCisKKyAgICBAb3ZlcmxvYWQKKyAgICBkZWYgbWV0aG9kKHNlbGYsIHBhcmFtOiBzdHIpIC0+IE5vbmU6CisgICAgICAgIC4uLgorCisgICAgZGVmIG1ldGhvZChzZWxmLCBwYXJhbSk6CisgICAgICAgIHJldHVybiAoc2VsZiwgcGFyYW0pCisjIHB5bGludDogZW5hYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBpbmdfdXNlLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGluZ191c2UucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkZThiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdC90eXBpbmdfdXNlLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGluZ191c2UudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC90L3R5cGluZ191c2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjUzYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3QvdHlwaW5nX3VzZS50eHQKQEAgLTAsMCArMSBAQAorZnVuY3Rpb24tcmVkZWZpbmVkOjIxOjA6ZG91YmxlX3dpdGhfZG9jc3RyaW5nOmZ1bmN0aW9uIGFscmVhZHkgZGVmaW5lZCBsaW5lIDE2CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvX19pbml0X18ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuYmFsYW5jZWRfdHVwbGVfdW5wYWNraW5nLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuYmFsYW5jZWRfdHVwbGVfdW5wYWNraW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODA3YzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5iYWxhbmNlZF90dXBsZV91bnBhY2tpbmcucHkKQEAgLTAsMCArMSwxMDggQEAKKyIiIkNoZWNrIHBvc3NpYmxlIHVuYmFsYW5jZWQgdHVwbGUgdW5wYWNraW5nICIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gZnVuY3Rpb25hbC51LnVucGFja2luZyBpbXBvcnQgdW5wYWNrCisKKyMgcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLGltcG9ydC1vdXRzaWRlLXRvcGxldmVsCisKK2RlZiBkb19zdHVmZigpOgorICAgICIiIlRoaXMgaXMgbm90IHJpZ2h0LiIiIgorICAgIGZpcnN0LCBzZWNvbmQgPSAxLCAyLCAzICMgW3VuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nXQorICAgIHJldHVybiBmaXJzdCArIHNlY29uZAorCitkZWYgZG9fc3R1ZmYxKCk6CisgICAgIiIiVGhpcyBpcyBub3QgcmlnaHQuIiIiCisgICAgZmlyc3QsIHNlY29uZCA9IFsxLCAyLCAzXSAjIFt1bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZ10KKyAgICByZXR1cm4gZmlyc3QgKyBzZWNvbmQKKworZGVmIGRvX3N0dWZmMigpOgorICAgICIiIlRoaXMgaXMgbm90IHJpZ2h0LiIiIgorICAgIChmaXJzdCwgc2Vjb25kKSA9IDEsIDIsIDMgIyBbdW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmddCisgICAgcmV0dXJuIGZpcnN0ICsgc2Vjb25kCisKK2RlZiBkb19zdHVmZjMoKToKKyAgICAiIiJUaGlzIGlzIG5vdCByaWdodC4iIiIKKyAgICBmaXJzdCwgc2Vjb25kID0gcmFuZ2UoMTAwKQorICAgIHJldHVybiBmaXJzdCArIHNlY29uZAorCitkZWYgZG9fc3R1ZmY0KCk6CisgICAgIiIiIFRoaXMgaXMgcmlnaHQgIiIiCisgICAgZmlyc3QsIHNlY29uZCA9IDEsIDIKKyAgICByZXR1cm4gZmlyc3QgKyBzZWNvbmQKKworZGVmIGRvX3N0dWZmNSgpOgorICAgICIiIiBUaGlzIGlzIGFsc28gcmlnaHQgIiIiCisgICAgZmlyc3QsIHNlY29uZCA9ICgxLCAyKQorICAgIHJldHVybiBmaXJzdCArIHNlY29uZAorCitkZWYgZG9fc3R1ZmY2KCk6CisgICAgIiIiIFRoaXMgaXMgcmlnaHQgIiIiCisgICAgKGZpcnN0LCBzZWNvbmQpID0gKDEsIDIpCisgICAgcmV0dXJuIGZpcnN0ICsgc2Vjb25kCisKK2RlZiB0ZW1wKCk6CisgICAgIiIiIFRoaXMgaXMgbm90IHdlaXJkICIiIgorICAgIGlmIFRydWU6CisgICAgICAgIHJldHVybiBbMSwgMl0KKyAgICByZXR1cm4gWzIsIDMsIDRdCisKK2RlZiBkb19zdHVmZjcoKToKKyAgICAiIiIgVGhpcyBpcyBub3QgcmlnaHQsIGJ1dCB3ZSdyZSBub3Qgc3VyZSAiIiIKKyAgICBmaXJzdCwgc2Vjb25kID0gdGVtcCgpCisgICAgcmV0dXJuIGZpcnN0ICsgc2Vjb25kCisKK2RlZiB0ZW1wMigpOgorICAgICIiIiBUaGlzIGlzIHdlaXJkLCBidXQgY29ycmVjdCAiIiIKKyAgICBpZiBUcnVlOgorICAgICAgICByZXR1cm4gKDEsIDIpCisKKyAgICBpZiBUcnVlOgorICAgICAgICByZXR1cm4gKDIsIDMpCisgICAgcmV0dXJuICg0LCA1KQorCitkZWYgZG9fc3R1ZmY4KCk6CisgICAgIiIiIFRoaXMgaXMgY29ycmVjdCAiIiIKKyAgICBmaXJzdCwgc2Vjb25kID0gdGVtcDIoKQorICAgIHJldHVybiBmaXJzdCArIHNlY29uZAorCitkZWYgZG9fc3R1ZmY5KCk6CisgICAgIiIiIFRoaXMgaXMgbm90IGNvcnJlY3QgIiIiCisgICAgZmlyc3QsIHNlY29uZCA9IHVucGFjaygpICMgW3VuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nXQorICAgIHJldHVybiBmaXJzdCArIHNlY29uZAorCitjbGFzcyBVbmJhbGFuY2VkVW5wYWNraW5nKG9iamVjdCk6CisgICAgIiIiIFRlc3QgdW5iYWxhbmNlZCB0dXBsZSB1bnBhY2tpbmcgaW4gaW5zdGFuY2UgYXR0cmlidXRlcy4gIiIiCisgICAgIyBweWxpbnQ6IGRpc2FibGU9YXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0LCBpbnZhbGlkLW5hbWUsIHRvby1mZXctcHVibGljLW1ldGhvZHMKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiIHVucGFja2luZyBpbiBpbnN0YW5jZSBhdHRyaWJ1dGVzICIiIgorICAgICAgICAjIHdlJ3JlIG5vdCBzdXJlIGlmIHRlbXAoKSByZXR1cm5zIHR3byBvciB0aHJlZSB2YWx1ZXMKKyAgICAgICAgIyBzbyB3ZSBzaG91bGRuJ3QgZW1pdCBhbiBlcnJvcgorICAgICAgICBzZWxmLmEsIHNlbGYuYiA9IHRlbXAoKQorICAgICAgICBzZWxmLmEsIHNlbGYuYiA9IHRlbXAyKCkKKyAgICAgICAgc2VsZi5hLCBzZWxmLmIgPSB1bnBhY2soKSAjIFt1bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZ10KKworCitkZWYgaXNzdWUzMjkoKmFyZ3MpOgorICAgICIiIiBEb24ndCBlbWl0IHVuYmFsYW5jZWQgdHVwbGUgdW5wYWNraW5nIGlmIHRoZQorICAgIHJocyBvZiB0aGUgYXNzaWdubWVudCBpcyBhIHZhcmlhYmxlLWxlbmd0aCBhcmd1bWVudCwKKyAgICBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIHR1cGxlLgorICAgICIiIgorICAgIGZpcnN0LCBzZWNvbmQsIHRoaXJkID0gYXJncworICAgIHJldHVybiBmaXJzdCwgc2Vjb25kLCB0aGlyZAorCisKK2RlZiB0ZXN0X2RlY2ltYWwoKToKKyAgICAiIiJUZXN0IGEgZmFsc2UgcG9zaXRpdmUgd2l0aCBkZWNpbWFsLkRlY2ltYWwuYXNfdHVwbGUKKworICAgIFNlZSBhc3Ryb2lkIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9sb2dpbGFiL2FzdHJvaWQvaXNzdWVzLzkyLworICAgICIiIgorICAgIGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAorICAgIGRlYyA9IERlY2ltYWwoMikKKyAgICBmaXJzdCwgc2Vjb25kLCB0aGlyZCA9IGRlYy5hc190dXBsZSgpCisgICAgcmV0dXJuIGZpcnN0LCBzZWNvbmQsIHRoaXJkCisKKworZGVmIHRlc3RfaXNzdWVfNTU5KCk6CisgICAgIiIiVGVzdCB0aGF0IHdlIGRvbid0IGhhdmUgYSBmYWxzZSBwb3NpdGl2ZSB3cnQgdG8gaXNzdWUgIzU1OS4iIiIKKyAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19pbnQKKyAgICByb290X3gsIHJvb3RfeSwgd2luX3gsIHdpbl95ID0gW2NfaW50KCldICogNAorICAgIHJldHVybiByb290X3gsIHJvb3RfeSwgd2luX3gsIHdpbl95CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5iYWxhbmNlZF90dXBsZV91bnBhY2tpbmcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuYmFsYW5jZWRfdHVwbGVfdW5wYWNraW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTNkOTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuYmFsYW5jZWRfdHVwbGVfdW5wYWNraW5nLnR4dApAQCAtMCwwICsxLDUgQEAKK3VuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nOjk6NDpkb19zdHVmZjoiUG9zc2libGUgdW5iYWxhbmNlZCB0dXBsZSB1bnBhY2tpbmcgd2l0aCBzZXF1ZW5jZSAoMSwgMiwgMyk6IGxlZnQgc2lkZSBoYXMgMiBsYWJlbChzKSwgcmlnaHQgc2lkZSBoYXMgMyB2YWx1ZShzKSIKK3VuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nOjE0OjQ6ZG9fc3R1ZmYxOiJQb3NzaWJsZSB1bmJhbGFuY2VkIHR1cGxlIHVucGFja2luZyB3aXRoIHNlcXVlbmNlIFsxLCAyLCAzXTogbGVmdCBzaWRlIGhhcyAyIGxhYmVsKHMpLCByaWdodCBzaWRlIGhhcyAzIHZhbHVlKHMpIgordW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmc6MTk6NDpkb19zdHVmZjI6IlBvc3NpYmxlIHVuYmFsYW5jZWQgdHVwbGUgdW5wYWNraW5nIHdpdGggc2VxdWVuY2UgKDEsIDIsIDMpOiBsZWZ0IHNpZGUgaGFzIDIgbGFiZWwocyksIHJpZ2h0IHNpZGUgaGFzIDMgdmFsdWUocykiCit1bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZzo2OTo0OmRvX3N0dWZmOToiUG9zc2libGUgdW5iYWxhbmNlZCB0dXBsZSB1bnBhY2tpbmcgd2l0aCBzZXF1ZW5jZSBkZWZpbmVkIGF0IGxpbmUgNyBvZiBmdW5jdGlvbmFsLnUudW5wYWNraW5nOiBsZWZ0IHNpZGUgaGFzIDIgbGFiZWwocyksIHJpZ2h0IHNpZGUgaGFzIDMgdmFsdWUocykiCit1bmJhbGFuY2VkLXR1cGxlLXVucGFja2luZzo4MTo4OlVuYmFsYW5jZWRVbnBhY2tpbmcudGVzdDoiUG9zc2libGUgdW5iYWxhbmNlZCB0dXBsZSB1bnBhY2tpbmcgd2l0aCBzZXF1ZW5jZSBkZWZpbmVkIGF0IGxpbmUgNyBvZiBmdW5jdGlvbmFsLnUudW5wYWNraW5nOiBsZWZ0IHNpZGUgaGFzIDIgbGFiZWwocyksIHJpZ2h0IHNpZGUgaGFzIDMgdmFsdWUocykiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5iYWxhbmNlZF90dXBsZV91bnBhY2tpbmdfcHkzMC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmJhbGFuY2VkX3R1cGxlX3VucGFja2luZ19weTMwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjVmYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5iYWxhbmNlZF90dXBsZV91bnBhY2tpbmdfcHkzMC5weQpAQCAtMCwwICsxLDExIEBACisiIiIgVGVzdCB0aGF0IHVzaW5nIHN0YXJyZWQgbm9kZXMgaW4gdW5wYWNraW5nCitkb2VzIG5vdCB0cmlnZ2VyIGEgZmFsc2UgcG9zaXRpdmUgb24gUHl0aG9uIDMuCisiIiIKKworX19yZXZpc2lvbl9fID0gMQorCitkZWYgdGVzdCgpOgorICAgICIiIiBUZXN0IHRoYXQgc3RhcnJlZCBleHByZXNzaW9ucyBkb24ndCBnaXZlIGZhbHNlIHBvc2l0aXZlcy4gIiIiCisgICAgZmlyc3QsIHNlY29uZCwgKmxhc3QgPSAoMSwgMiwgMywgNCkKKyAgICAqbGFzdCwgPSAoMSwgMikKKyAgICByZXR1cm4gKGZpcnN0LCBzZWNvbmQsIGxhc3QpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5iYWxhbmNlZF90dXBsZV91bnBhY2tpbmdfcHkzMC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmJhbGFuY2VkX3R1cGxlX3VucGFja2luZ19weTMwLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDkwYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5iYWxhbmNlZF90dXBsZV91bnBhY2tpbmdfcHkzMC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10NCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF9sb29wX3ZhcmlhYmxlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfbG9vcF92YXJpYWJsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg0ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfbG9vcF92YXJpYWJsZS5weQpAQCAtMCwwICsxLDc1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxyZWRlZmluZWQtYnVpbHRpbgorCitkZWYgZG9fc3R1ZmYoc29tZV9yYW5kb21fbGlzdCk6CisgICAgZm9yIHZhciBpbiBzb21lX3JhbmRvbV9saXN0OgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHZhciAjIFt1bmRlZmluZWQtbG9vcC12YXJpYWJsZV0KKworCitkZWYgZG9fZWxzZShzb21lX3JhbmRvbV9saXN0KToKKyAgICBmb3IgdmFyIGluIHNvbWVfcmFuZG9tX2xpc3Q6CisgICAgICAgIGlmIHZhciA9PSA0MjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgdmFyID0gODQKKyAgICByZXR1cm4gdmFyCisKK19fcmV2aXNpb25fXyA9ICd5bycKKworVEVTVF9MQyA9IFtDIGZvciBDIGluIF9fcmV2aXNpb25fXyBpZiBDLmlzYWxwaGEoKV0KK0IgPSBbQiBmb3IgQiBpbiAgX19yZXZpc2lvbl9fIGlmIEIuaXNhbHBoYSgpXQorVkFSMiA9IEIgIyBub3IgdGhpcyBvbmUKKworZm9yIHZhcjEsIHZhcjIgaW4gVEVTVF9MQzoKKyAgICB2YXIxID0gdmFyMiArIDQKK1ZBUjMgPSB2YXIxICMgW3VuZGVmaW5lZC1sb29wLXZhcmlhYmxlXQorCitmb3Igbm90ZSBpbiBfX3JldmlzaW9uX186CisgICAgbm90ZS5zb21ldGhpbmcoKQorZm9yIGxpbmUgaW4gX19yZXZpc2lvbl9fOgorICAgIGZvciBub3RlIGluIGxpbmU6CisgICAgICAgIEEgPSBub3RlLmFub3RoZXJ0aGluZygpCisKKworZm9yIHggaW4gW106CisgICAgcGFzcworZm9yIHggaW4gcmFuZ2UoMyk6CisgICAgVkFSNSA9IChsYW1iZGE6IHgpKCkKKworCitkZWYgZG9fc3R1ZmZfd2l0aF9hX2xpc3QoKToKKyAgICBmb3IgdmFyIGluIFsxLCAyLCAzXToKKyAgICAgICAgcGFzcworICAgIHJldHVybiB2YXIKKworCitkZWYgZG9fc3R1ZmZfd2l0aF9hX3NldCgpOgorICAgIGZvciB2YXIgaW4gezEsIDIsIDN9OgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHZhcgorCisKK2RlZiBkb19zdHVmZl93aXRoX2FfZGljdCgpOgorICAgIGZvciB2YXIgaW4gezE6IDIsIDM6IDR9OgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIHZhcgorCisKK2RlZiBkb19zdHVmZl93aXRoX2FfdHVwbGUoKToKKyAgICBmb3IgdmFyIGluICgxLCAyLCAzKToKKyAgICAgICAgcGFzcworICAgIHJldHVybiB2YXIKKworCitkZWYgZG9fc3R1ZmZfd2l0aF9hX3JhbmdlKCk6CisgICAgZm9yIHZhciBpbiByYW5nZSgxLCAyKToKKyAgICAgICAgcGFzcworICAgIHJldHVybiB2YXIKKworCitkZWYgZG9fc3R1ZmZfd2l0aF9yZWRlZmluZWRfcmFuZ2UoKToKKyAgICBkZWYgcmFuZ2Uoa2V5KToKKyAgICAgICAgeWllbGQgZnJvbSBbMSwga2V5XQorICAgIGZvciB2YXIgaW4gcmFuZ2UoMyk6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gdmFyICMgW3VuZGVmaW5lZC1sb29wLXZhcmlhYmxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfbG9vcF92YXJpYWJsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF9sb29wX3ZhcmlhYmxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTE5NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfbG9vcF92YXJpYWJsZS50eHQKQEAgLTAsMCArMSwzIEBACit1bmRlZmluZWQtbG9vcC12YXJpYWJsZTo2OjExOmRvX3N0dWZmOlVzaW5nIHBvc3NpYmx5IHVuZGVmaW5lZCBsb29wIHZhcmlhYmxlICd2YXInCit1bmRlZmluZWQtbG9vcC12YXJpYWJsZToyNTo3OjpVc2luZyBwb3NzaWJseSB1bmRlZmluZWQgbG9vcCB2YXJpYWJsZSAndmFyMScKK3VuZGVmaW5lZC1sb29wLXZhcmlhYmxlOjc1OjExOmRvX3N0dWZmX3dpdGhfcmVkZWZpbmVkX3JhbmdlOlVzaW5nIHBvc3NpYmx5IHVuZGVmaW5lZCBsb29wIHZhcmlhYmxlICd2YXInCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTIwNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZS5weQpAQCAtMCwwICsxLDI5NiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIG11bHRpcGxlLXN0YXRlbWVudHMsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlLGltcG9ydC1vdXRzaWRlLXRvcGxldmVsCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBuby1pbml0LCBuby1zZWxmLXVzZSxiYXJlLWV4Y2VwdCxicm9hZC1leGNlcHQsIGltcG9ydC1lcnJvcgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCisjIHB5bGludDogZGlzYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24KK2Zyb20gdHlwaW5nIGltcG9ydCBUWVBFX0NIRUNLSU5HCisKK0RFRklORUQgPSAxCisKK2lmIERFRklORUQgIT0gMToKKyAgICBpZiBERUZJTkVEIGluICh1bmtub3duLCBERUZJTkVEKTogICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAgICAgREVGSU5FRCArPSAxCisKKworZGVmIGluX21ldGhvZCh2YXIpOgorICAgICIiIm1ldGhvZCBkb2MiIiIKKyAgICB2YXIgPSBub21vcmVrbm93biAgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorICAgIGFzc2VydCB2YXIKKworREVGSU5FRCA9IHtERUZJTkVEOl9fcmV2aXNpb25fX30gICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyMgKzE6W3VuZGVmaW5lZC12YXJpYWJsZV0KK0RFRklORURbX19yZXZpc2lvbl9fXSA9IE9USEVSID0gJ21vdmUgdGhpcyBpcyBhc3Ryb2lkIHRlc3QnCisKK09USEVSICs9ICckJworCitkZWYgYmFkX2RlZmF1bHQodmFyLCBkZWZhdWx0PXVua25vd24yKTogICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAiIiJmdW5jdGlvbiB3aXRoIGRlZmF1dCBhcmcncyB2YWx1ZSBzZXQgdG8gYW4gdW5leGlzdGFudCBuYW1lIiIiCisgICAgcHJpbnQodmFyLCBkZWZhdWx0KQorICAgIHByaW50KHh4eHgpICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgYXVndmFyICs9IDEgICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICBkZWwgdmFyZGVsICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKK0xNQkQgPSBsYW1iZGEgeCwgeT1kb2Vzbm90ZXhpc3Q6IHgreSAgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorTE1CRDIgPSBsYW1iZGEgeCwgeTogeCt6ICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKK3RyeToKKyAgICBQT1VFVCAjIGRvbid0IGNhdGNoIG1lCitleGNlcHQgTmFtZUVycm9yOgorICAgIFBPVUVUID0gJ3NvbWV0aGluZycKKwordHJ5OgorICAgIFBPVUVUVCAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorZXhjZXB0IEV4Y2VwdGlvbjogIyBweWxpbnQ6ZGlzYWJsZSA9IGJyb2FkLWV4Y2VwdAorICAgIFBPVUVUVCA9ICdzb21ldGhpbmcnCisKK3RyeToKKyAgICBQT1VFVFRUICMgZG9uJ3QgY2F0Y2ggbWUKK2V4Y2VwdDogIyBweWxpbnQ6ZGlzYWJsZSA9IGJhcmUtZXhjZXB0CisgICAgUE9VRVRUVCA9ICdzb21ldGhpbmcnCisKK3ByaW50KFBPVUVULCBQT1VFVFQsIFBPVUVUVFQpCisKKwordHJ5OgorICAgIFBMT1VGICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgUExPVUYgPSAnc29tZXRoaW5nJworCitwcmludChQTE9VRikKKworZGVmIGlmX2JyYW5jaF90ZXN0KHNvbWV0aGluZyk6CisgICAgIiIiaG9wIiIiCisgICAgaWYgc29tZXRoaW5nID09IDA6CisgICAgICAgIGlmIHh4eCA9PSAxOiAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBwcmludCh4eHgpCisgICAgICAgIHh4eCA9IDMKKworCitkZWYgZGVjb3JhdG9yKGFyZyk6CisgICAgIiIiRGVjb3JhdG9yIHdpdGggb25lIGFyZ3VtZW50LiIiIgorICAgIHJldHVybiBsYW1iZGE6IGxpc3QoYXJnKQorCisKK0BkZWNvcmF0b3IoYXJnPVtpICogMiBmb3IgaSBpbiByYW5nZSgxNSldKQorZGVmIGZ1bmMxKCk6CisgICAgIiIiQSBmdW5jdGlvbiB3aXRoIGEgZGVjb3JhdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0Y29tcC4iIiIKKworQGRlY29yYXRvcihhcmc9KGkgKiAyIGZvciBpIGluIHJhbmdlKDE1KSkpCitkZWYgZnVuYzIoKToKKyAgICAiIiJBIGZ1bmN0aW9uIHdpdGggYSBkZWNvcmF0b3IgdGhhdCBjb250YWlucyBhIGdlbmV4cHIuIiIiCisKK0BkZWNvcmF0b3IobGFtYmRhIHg6IHggPiAwKQorZGVmIG1haW4oKToKKyAgICAiIiJBIGZ1bmN0aW9uIHdpdGggYSBkZWNvcmF0b3IgdGhhdCBjb250YWlucyBhIGxhbWJkYS4iIiIKKworIyBUZXN0IHNoYXJlZCBzY29wZS4KKworZGVmIHRlc3RfYXJndW1lbnRzKGFyZz1UZXN0Q2xhc3MpOiAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAiIiIgVGVzdENsYXNzIGlzbid0IGRlZmluZWQgeWV0LiAiIiIKKyAgICByZXR1cm4gYXJnCisKK2NsYXNzIFRlc3RDbGFzcyhBbmNlc3Rvcik6ICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorICAgICIiIiBjb250YWlucyBhbm90aGVyIGNsYXNzLCB3aGljaCB1c2VzIGFuIHVuZGVmaW5lZCBhbmNlc3Rvci4gIiIiCisKKyAgICBjbGFzcyBNaXNzaW5nQW5jZXN0b3IoQW5jZXN0b3IxKTogICMgW3VzZWQtYmVmb3JlLWFzc2lnbm1lbnRdCisgICAgICAgICIiIiBubyBvcCAiIiIKKworICAgIGRlZiB0ZXN0MShzZWxmKToKKyAgICAgICAgIiIiIEl0IHNob3VsZCB0cmlnZ2VyIGhlcmUsIGJlY2F1c2UgdGhlIHR3byBjbGFzc2VzCisgICAgICAgIGhhdmUgdGhlIHNhbWUgc2NvcGUuCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBVc2luZ0JlZm9yZURlZmluaXRpb24oRW1wdHkpOiAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAgICAgICAgICIiIiB1c2VzIEVtcHR5IGJlZm9yZSBkZWZpbml0aW9uICIiIgorICAgICAgICBjbGFzcyBFbXB0eShvYmplY3QpOgorICAgICAgICAgICAgIiIiIG5vIG9wICIiIgorICAgICAgICByZXR1cm4gVXNpbmdCZWZvcmVEZWZpbml0aW9uCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiIEFuY2VzdG9yIGlzbid0IGRlZmluZWQgeWV0LCBidXQgd2UgZG9uJ3QgY2FyZS4gIiIiCisgICAgICAgIGNsYXNzIE1pc3NpbmdBbmNlc3RvcjEoQW5jZXN0b3IpOgorICAgICAgICAgICAgIiIiIG5vIG9wICIiIgorICAgICAgICByZXR1cm4gTWlzc2luZ0FuY2VzdG9yMQorCitjbGFzcyBTZWxmKG9iamVjdCk6CisgICAgIiIiIERldGVjdCB3aGVuIHVzaW5nIHRoZSBzYW1lIG5hbWUgaW5zaWRlIHRoZSBjbGFzcyBzY29wZS4gIiIiCisgICAgb2JqID0gU2VsZiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKK2NsYXNzIFNlbGYxKG9iamVjdCk6CisgICAgIiIiIE5vIGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZS4gIiIiCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiIGVtcHR5ICIiIgorICAgICAgICByZXR1cm4gU2VsZjEKKworCitjbGFzcyBBbmNlc3RvcihvYmplY3QpOgorICAgICIiIiBObyBvcCAiIiIKKworY2xhc3MgQW5jZXN0b3IxKG9iamVjdCk6CisgICAgIiIiIE5vIG9wICIiIgorCitOQU5BID0gQkFUICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KK2RlbCBCQVQKKworCitjbGFzcyBLZXl3b3JkQXJndW1lbnQob2JqZWN0KToKKyAgICAiIiJUZXN0IGtleXdvcmQgYXJndW1lbnRzLiIiIgorCisgICAgZW5hYmxlID0gVHJ1ZQorICAgIGRlZiB0ZXN0KHNlbGYsIGlzX2VuYWJsZWQ9ZW5hYmxlKToKKyAgICAgICAgIiIiZG8gbm90aGluZy4iIiIKKworICAgIGRlZiB0ZXN0MShzZWxmLCBpc19lbmFibGVkPWVuYWJsZWQpOiAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorICAgICAgICAiIiJlbmFibGVkIGlzIHVuZGVmaW5lZCBhdCB0aGlzIHBvaW50LCBidXQgaXQgaXMgdXNlZCBiZWZvcmUgYXNzaWdubWVudC4iIiIKKworICAgIGRlZiB0ZXN0MihzZWxmLCBpc19kaXNhYmxlZD1kaXNhYmxlZCk6ICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAgICAgIiIiZGlzYWJsZWQgaXMgdW5kZWZpbmVkIiIiCisKKyAgICBlbmFibGVkID0gVHJ1ZQorCisgICAgZnVuYyA9IGxhbWJkYSBhcmc9YXJnOiBhcmcgKiBhcmcgIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorCisgICAgYXJnMiA9IDAKKyAgICBmdW5jMiA9IGxhbWJkYSBhcmcyPWFyZzI6IGFyZzIgKiBhcmcyCisKKyMgRG9uJ3QgZW1pdCBpZiB0aGUgY29kZSBpcyBwcm90ZWN0ZWQgYnkgTmFtZUVycm9yCit0cnk6CisgICAgdW5pY29kZV8xCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKKwordHJ5OgorICAgIHVuaWNvZGVfMiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCitleGNlcHQgRXhjZXB0aW9uOgorICAgIHBhc3MKKwordHJ5OgorICAgIHVuaWNvZGVfMyAjIFt1bmRlZmluZWQtdmFyaWFibGVdCitleGNlcHQgVmFsdWVFcnJvcjoKKyAgICBwYXNzCisKKyMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9sb2dpbGFiL3B5bGludC9pc3N1ZS8xMTEvCit0cnk6IHJhaXNlIElPRXJyb3IoMSwgImEiKQorZXhjZXB0IElPRXJyb3IgYXMgZXJyOiBwcmludChlcnIpCisKKworZGVmIHRlc3RfY29uZGl0aW9uYWxfY29tcHJlaGVuc2lvbigpOgorICAgIG1ldGhvZHMgPSBbJ2EnLCAnYicsICdfYycsICdfZCddCisgICAgbXlfbWV0aG9kcyA9IHN1bSgxIGZvciBtZXRob2QgaW4gbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1ldGhvZC5zdGFydHN3aXRoKCdfJykpCisgICAgcmV0dXJuIG15X21ldGhvZHMKKworCitjbGFzcyBNeUVycm9yKG9iamVjdCk6CisgICAgcGFzcworCisKK2NsYXNzIE15Q2xhc3Mob2JqZWN0KToKKyAgICBjbGFzcyBNeUVycm9yKE15RXJyb3IpOgorICAgICAgICBwYXNzCisKKworZGVmIGRlYyhpbnApOgorICAgIGRlZiBpbm5lcihmdW5jKToKKyAgICAgICAgcHJpbnQoaW5wKQorICAgICAgICByZXR1cm4gZnVuYworICAgIHJldHVybiBpbm5lcgorCisjIE1ha2Ugc3VyZSBsYW1iZGFzIHdpdGggZXhwcmVzc2lvbnMKKyMgcmVmZXJlbmNpbmcgcGFyZW50IGNsYXNzIGRvIG5vdCByYWlzZSB1bmRlZmluZWQgdmFyaWFibGUKKyMgYmVjYXVzZSBhdCB0aGUgdGltZSBvZiB0aGVpciBjYWxsaW5nLCB0aGUgY2xhc3MgbmFtZSB3aWxsCisjIGJlIHBvcHVsYXRlZAorIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNzA0CitjbGFzcyBMYW1iZGFDbGFzczoKKyAgICBteWF0dHIgPSAxCisgICAgbXlsYW1iZGEgPSBsYW1iZGE6IExhbWJkYUNsYXNzLm15YXR0cgorCisjIE5lZWQgZGlmZmVyZW50IGNsYXNzZXMgdG8gbWFrZSBzdXJlCisjIGNvbnN1bWVkIHZhcmlhYmxlcyBkb24ndCBnZXQgaW4gdGhlIHdheQorY2xhc3MgTGFtYmRhQ2xhc3MyOgorICAgIG15YXR0ciA9IDEKKyAgICAjIERpZmZlcmVudCBiYXNlX3Njb3BlIHNjb3BlIGJ1dCBzdGlsbCBhcHBsaWVzCisgICAgbXlsYW1iZGEyID0gbGFtYmRhOiBbTGFtYmRhQ2xhc3MyLm15YXR0ciBmb3IgXyBpbiBbMSwgMl1dCisKK2NsYXNzIExhbWJkYUNsYXNzMzoKKyAgICBteWF0dHIgPSAxCisgICAgIyBOZXN0ZWQgZGVmYXVsdCBhcmd1bWVudCBpbiBsYW1iZGEKKyAgICAjIFNob3VsZCBub3QgcmFpc2UgZXJyb3IKKyAgICBteWxhbWJkYTMgPSBsYW1iZGE6IGxhbWJkYSBhPUxhbWJkYUNsYXNzMzogYQorCitjbGFzcyBMYW1iZGFDbGFzczQ6CisgICAgbXlhdHRyID0gMQorICAgIG15bGFtYmRhNCA9IGxhbWJkYSBhPUxhbWJkYUNsYXNzNDogbGFtYmRhOiBhICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKworIyBNYWtlIHN1cmUgdGhlIGZpcnN0IGxhbWJkYSBkb2VzIG5vdCBjb25zdW1lIHRoZSBMYW1iZGFDbGFzczUgY2xhc3MKKyMgbmFtZSBhbHRob3VnaCB0aGUgZXhwcmVzc2lvbiBpcyBpcyB2YWxpZAorIyBDb25zdW1pbmcgdGhlIGNsYXNzIHdvdWxkIGNhdXNlIHRoZSBzdWJzZXF1ZW50IHVuZGVmaW5lZC12YXJpYWJsZSB0byBiZSBtYXNrZWQKK2NsYXNzIExhbWJkYUNsYXNzNToKKyAgICBteWF0dHIgPSAxCisgICAgbXlsYW1iZGEgPSBsYW1iZGE6IExhbWJkYUNsYXNzNS5teWF0dHIKKyAgICBteWxhbWJkYTQgPSBsYW1iZGEgYT1MYW1iZGFDbGFzczU6IGxhbWJkYTogYSAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisKKworZGVmIG5vbmxvY2FsX2luX2lmZXhwKCk6CisgICAgaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAorICAgIGRlZiBvbmNsaWNrKGV2ZW50KToKKyAgICAgICAgaWYgZXZlbnQ6CisgICAgICAgICAgICBub25sb2NhbCBpCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIHByaW50KGkpCisgICAgaSA9IDAKKyAgICBmaWcgPSBwbHQuZmlndXJlKCkKKyAgICBmaWcuY2FudmFzLm1wbF9jb25uZWN0KCdidXR0b25fcHJlc3NfZXZlbnQnLCBvbmNsaWNrKQorICAgIHBsdC5zaG93KGJsb2NrPVRydWUpCisKKworCitpZiBUWVBFX0NIRUNLSU5HOgorICAgIGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisKKworZGVmIGZ1bmNfc2hvdWxkX2ZhaWwoX2R0OiBkYXRldGltZSk6ICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorICAgIHBhc3MKKworCisjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBlbWl0IGFuIGVycm9yLgorIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lCitpZiBUWVBFX0NIRUNLSU5HOgorICAgIGZyb20gdHlwaW5nX2V4dGVuc2lvbnMgaW1wb3J0IExpdGVyYWwKKworICAgIEFsbG93ZWRWYWx1ZXMgPSBMaXRlcmFsWydoZWxsbycsICd3b3JsZCddCisKKworaWYgVFlQRV9DSEVDS0lORzoKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyCisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2Vsc2U6CisgICAgQ291bnRlciA9IG9iamVjdAorICAgIE9yZGVyZWREaWN0ID0gb2JqZWN0CisKKworZGVmIHRpY2soY291bnRlcjogQ291bnRlciwgbmFtZTogc3RyLCBkaWN0aW9uYXJ5OiBPcmRlcmVkRGljdCkgLT4gT3JkZXJlZERpY3Q6CisgICAgY291bnRlcltuYW1lXSArPSAxCisgICAgcmV0dXJuIGRpY3Rpb25hcnkKKworCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKK2RlZiBub3RfdXNpbmdfbG9vcF92YXJpYWJsZV9hY2NvcmRpbmdseShpdGVyYXRvcik6CisgICAgZm9yIGl0ZXJlZSBpbiBpdGVyZWU6ICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAgICAgeWllbGQgaXRlcmVlCisjIHB5bGludDogZW5hYmxlPXVudXNlZC1hcmd1bWVudAorCisKK2NsYXNzIER1bmRlckNsYXNzOgorICAgIGRlZiBtZXRob2Qoc2VsZik6CisgICAgICAgICMgVGhpcyBuYW1lIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBBU1QgYnV0IGl0J3MgcHJlc2VudCBhdCBydW50aW1lCisgICAgICAgIHJldHVybiBfX2NsYXNzX18KKworCitkZWYgdW5kZWZpbmVkX2Fubm90YXRpb24oYTp4KTogIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorICAgIGlmIHggPT0gMjogIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAgICAgZm9yIHggaW4gWzEsIDJdOgorICAgICAgICAgICAgcGFzcworICAgIHJldHVybiBhCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YTNhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlLnR4dApAQCAtMCwwICsxLDMwIEBACit1bmRlZmluZWQtdmFyaWFibGU6MTE6MTk6OlVuZGVmaW5lZCB2YXJpYWJsZSAndW5rbm93bicKK3VuZGVmaW5lZC12YXJpYWJsZToxNzoxMDppbl9tZXRob2Q6VW5kZWZpbmVkIHZhcmlhYmxlICdub21vcmVrbm93bicKK3VuZGVmaW5lZC12YXJpYWJsZToyMDoxOTo6VW5kZWZpbmVkIHZhcmlhYmxlICdfX3JldmlzaW9uX18nCit1bmRlZmluZWQtdmFyaWFibGU6MjI6ODo6VW5kZWZpbmVkIHZhcmlhYmxlICdfX3JldmlzaW9uX18nCit1bmRlZmluZWQtdmFyaWFibGU6MjY6Mjk6YmFkX2RlZmF1bHQ6VW5kZWZpbmVkIHZhcmlhYmxlICd1bmtub3duMicKK3VuZGVmaW5lZC12YXJpYWJsZToyOToxMDpiYWRfZGVmYXVsdDpVbmRlZmluZWQgdmFyaWFibGUgJ3h4eHgnCit1bmRlZmluZWQtdmFyaWFibGU6MzA6NDpiYWRfZGVmYXVsdDpVbmRlZmluZWQgdmFyaWFibGUgJ2F1Z3ZhcicKK3VuZGVmaW5lZC12YXJpYWJsZTozMTo4OmJhZF9kZWZhdWx0OlVuZGVmaW5lZCB2YXJpYWJsZSAndmFyZGVsJwordW5kZWZpbmVkLXZhcmlhYmxlOjMzOjE5OjxsYW1iZGE+OlVuZGVmaW5lZCB2YXJpYWJsZSAnZG9lc25vdGV4aXN0JwordW5kZWZpbmVkLXZhcmlhYmxlOjM0OjIzOjxsYW1iZGE+OlVuZGVmaW5lZCB2YXJpYWJsZSAneicKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6NDI6NDo6VXNpbmcgdmFyaWFibGUgJ1BPVUVUVCcgYmVmb3JlIGFzc2lnbm1lbnQKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6NTU6NDo6VXNpbmcgdmFyaWFibGUgJ1BMT1VGJyBiZWZvcmUgYXNzaWdubWVudAordXNlZC1iZWZvcmUtYXNzaWdubWVudDo2NDoxMTppZl9icmFuY2hfdGVzdDpVc2luZyB2YXJpYWJsZSAneHh4JyBiZWZvcmUgYXNzaWdubWVudAordXNlZC1iZWZvcmUtYXNzaWdubWVudDo5MDoyMzp0ZXN0X2FyZ3VtZW50czpVc2luZyB2YXJpYWJsZSAnVGVzdENsYXNzJyBiZWZvcmUgYXNzaWdubWVudAordXNlZC1iZWZvcmUtYXNzaWdubWVudDo5NDoxNjpUZXN0Q2xhc3M6VXNpbmcgdmFyaWFibGUgJ0FuY2VzdG9yJyBiZWZvcmUgYXNzaWdubWVudAordXNlZC1iZWZvcmUtYXNzaWdubWVudDo5NzoyNjpUZXN0Q2xhc3MuTWlzc2luZ0FuY2VzdG9yOlVzaW5nIHZhcmlhYmxlICdBbmNlc3RvcjEnIGJlZm9yZSBhc3NpZ25tZW50Cit1c2VkLWJlZm9yZS1hc3NpZ25tZW50OjEwNDozNjpUZXN0Q2xhc3MudGVzdDEuVXNpbmdCZWZvcmVEZWZpbml0aW9uOlVzaW5nIHZhcmlhYmxlICdFbXB0eScgYmVmb3JlIGFzc2lnbm1lbnQKK3VuZGVmaW5lZC12YXJpYWJsZToxMTg6MTA6U2VsZjpVbmRlZmluZWQgdmFyaWFibGUgJ1NlbGYnCit1bmRlZmluZWQtdmFyaWFibGU6MTM0Ojc6OlVuZGVmaW5lZCB2YXJpYWJsZSAnQkFUJwordXNlZC1iZWZvcmUtYXNzaWdubWVudDoxNDU6MzE6S2V5d29yZEFyZ3VtZW50LnRlc3QxOlVzaW5nIHZhcmlhYmxlICdlbmFibGVkJyBiZWZvcmUgYXNzaWdubWVudAordW5kZWZpbmVkLXZhcmlhYmxlOjE0ODozMjpLZXl3b3JkQXJndW1lbnQudGVzdDI6VW5kZWZpbmVkIHZhcmlhYmxlICdkaXNhYmxlZCcKK3VuZGVmaW5lZC12YXJpYWJsZToxNTM6MjI6S2V5d29yZEFyZ3VtZW50LjxsYW1iZGE+OlVuZGVmaW5lZCB2YXJpYWJsZSAnYXJnJwordW5kZWZpbmVkLXZhcmlhYmxlOjE2NTo0OjpVbmRlZmluZWQgdmFyaWFibGUgJ3VuaWNvZGVfMicKK3VuZGVmaW5lZC12YXJpYWJsZToxNzA6NDo6VW5kZWZpbmVkIHZhcmlhYmxlICd1bmljb2RlXzMnCit1bmRlZmluZWQtdmFyaWFibGU6MjI1OjI1OkxhbWJkYUNsYXNzNC48bGFtYmRhPjpVbmRlZmluZWQgdmFyaWFibGUgJ0xhbWJkYUNsYXNzNCcKK3VuZGVmaW5lZC12YXJpYWJsZToyMzM6MjU6TGFtYmRhQ2xhc3M1LjxsYW1iZGE+OlVuZGVmaW5lZCB2YXJpYWJsZSAnTGFtYmRhQ2xhc3M1JwordXNlZC1iZWZvcmUtYXNzaWdubWVudDoyNTQ6MjY6ZnVuY19zaG91bGRfZmFpbDpVc2luZyB2YXJpYWJsZSAnZGF0ZXRpbWUnIGJlZm9yZSBhc3NpZ25tZW50Cit1bmRlZmluZWQtdmFyaWFibGU6MjgxOjE4Om5vdF91c2luZ19sb29wX3ZhcmlhYmxlX2FjY29yZGluZ2x5OlVuZGVmaW5lZCB2YXJpYWJsZSAnaXRlcmVlJwordW5kZWZpbmVkLXZhcmlhYmxlOjI5MjoyNzp1bmRlZmluZWRfYW5ub3RhdGlvbjpVbmRlZmluZWQgdmFyaWFibGUgJ3gnCit1c2VkLWJlZm9yZS1hc3NpZ25tZW50OjI5Mzo3OnVuZGVmaW5lZF9hbm5vdGF0aW9uOlVzaW5nIHZhcmlhYmxlICd4JyBiZWZvcmUgYXNzaWdubWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfdmFyaWFibGVfY3Jhc2hfb25fYXR0cmlidXRlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfdmFyaWFibGVfY3Jhc2hfb25fYXR0cmlidXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MWVmYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZV9jcmFzaF9vbl9hdHRyaWJ1dGUucHkKQEAgLTAsMCArMSw2IEBACisjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtZXJyb3IsbWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nLG1pc3NpbmctY2xhc3MtZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMKK2ltcG9ydCB1bmtub3duCisKKworY2xhc3MgQ2xzKG1ldGFjbGFzcz11bmtub3duLnBhdGguTWV0YUZvbyk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfdmFyaWFibGVfcHkzMC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlX3B5MzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkNmRkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlX3B5MzAucHkKQEAgLTAsMCArMSw4NiBAQAorIiIiVGVzdCB3YXJuaW5ncyBhYm91dCBhY2Nlc3MgdG8gdW5kZWZpbmVkIHZhcmlhYmxlcworZm9yIHZhcmlvdXMgUHl0aG9uIDMgY29uc3RydWN0cy4gIiIiCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBuby1pbml0LCBuby1zZWxmLXVzZSwgaW1wb3J0LWVycm9yCisjIHB5bGludDogZGlzYWJsZT13cm9uZy1pbXBvcnQtcG9zaXRpb24sIGludmFsaWQtbWV0YWNsYXNzLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorY2xhc3MgVW5kZWZpbmVkOgorICAgICIiIiB0ZXN0IHZhcmlvdXMgYW5ub3RhdGlvbiBwcm9ibGVtcy4gIiIiCisKKyAgICBkZWYgdGVzdChzZWxmKS0+VW5kZWZpbmVkOiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgICIiIiB1c2VkIFVuZGVmaW5lZCwgd2hpY2ggaXMgVW5kZWZpbmVkIGluIHRoaXMgc2NvcGUuICIiIgorCisgICAgVW5kZWZpbmVkID0gVHJ1ZQorCisgICAgZGVmIHRlc3QxKHNlbGYpLT5VbmRlZmluZWQ6CisgICAgICAgICIiIiBUaGlzIFVuZGVmaW5lZCBleGlzdHMgYXQgbG9jYWwgc2NvcGUuICIiIgorCisgICAgZGVmIHRlc3QyKHNlbGYpOgorICAgICAgICAiIiIgVGhpcyBzaG91bGQgbm90IGVtaXQuICIiIgorICAgICAgICBkZWYgZnVuYygpLT5VbmRlZmluZWQ6CisgICAgICAgICAgICAiIiIgZW1wdHkgIiIiCisgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICByZXR1cm4gZnVuYworCisKK2NsYXNzIFVuZGVmaW5lZDE6CisgICAgIiIiIE90aGVyIGFubm90YXRpb24gcHJvYmxlbXMuICIiIgorCisgICAgVW5kZWYgPSA0MgorICAgIEFCQyA9IDQyCisKKyAgICBjbGFzcyBJbm5lclNjb3BlOgorICAgICAgICAiIiIgVGVzdCBpbm5lciBzY29wZSBkZWZpbml0aW9uLiAiIiIKKworICAgICAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZiktPlVuZGVmOiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgICAgICAiIiIgTG9va2luZyBhdCBhIGhpZ2hlciBzY29wZSBpcyBpbXBvc3NpYmxlLiAiIiIKKworICAgICAgICBkZWYgdGVzdDEoc2VsZiktPkFCQzogIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorICAgICAgICAgICAgIiIiIFRyaWdnZXJzIHVuZGVmaW5lZC12YXJpYWJsZS4gIiIiCisKKworY2xhc3MgRmFsc2VQb3NpdGl2ZTM0MihvYmplY3QpOgorICAgICMgcHlsaW50OiBkaXNhYmxlPWxpbmUtdG9vLWxvbmcKKyAgICAiIiIgRml4IHNvbWUgZmFsc2UgcG9zaXRpdmVzIGZvdW5kIGluCisgICAgaHR0cHM6Ly9iaXRidWNrZXQub3JnL2xvZ2lsYWIvcHlsaW50L2lzc3VlLzM0Mi9zcHVyaW91cy11bmRlZmluZWQtdmFyaWFibGUtZm9yLWNsYXNzCisgICAgIiIiCisKKyAgICB0b3AgPSA0MgorCisgICAgZGVmIHRlc3RfZ29vZChzZWxmLCBiYWM6IHRvcCk6CisgICAgICAgICIiIiB0b3AgaXMgZGVmaW5lZCBhdCB0aGlzIG1vbWVudC4gIiIiCisKKyAgICBkZWYgdGVzdF9iYWQoc2VsZiwgYmFjOiB0cm9wKTogIyBbdW5kZWZpbmVkLXZhcmlhYmxlXQorICAgICAgICAiIiIgdHJvcCBpcyB1bmRlZmluZWQgYXQgdGhpcyBtb21lbnQuICIiIgorCisgICAgZGVmIHRlc3RfYmFkMShzZWxmLCAqYXJnczogdHJvcDEpOiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgICIiIiB0cm9wMSBpcyB1bmRlZmluZWQgYXQgdGhpcyBtb21lbnQuICIiIgorCisgICAgZGVmIHRlc3RfYmFkMihzZWxmLCAqKmJhYzogdHJvcDIpOiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgICIiIiB0cm9wMiBpcyB1bmRlZmluZWQgYXQgdGhpcyBtb21lbnQuICIiIgorCitpbXBvcnQgYWJjCitmcm9tIGFiYyBpbXBvcnQgQUJDTWV0YQorCitjbGFzcyBCYWQobWV0YWNsYXNzPUFCQ01ldCk6ICMgW3VuZGVmaW5lZC12YXJpYWJsZV0KKyAgICAiIiIgTm90aWNlIHRoZSB0eXBvICIiIgorCitjbGFzcyBTZWNvbmRCYWQobWV0YWNsYXNzPWFiLkFCQ01ldGEpOiAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgIiIiIE5vdGljZSB0aGUgYGFiYCBtb2R1bGUuICIiIgorCitjbGFzcyBHb29kKG1ldGFjbGFzcz1pbnQpOgorICAgICIiIiBpbnQgaXMgbm90IGEgcHJvcGVyIG1ldGFjbGFzcywgYnV0IGl0IGlzIGRlZmluZWQuICIiIgorCitjbGFzcyBTZWNvbmRHb29kKG1ldGFjbGFzcz1Hb29kKToKKyAgICAiIiIgZW1wdHkgIiIiCisKK2NsYXNzIFRoaXJkR29vZChtZXRhY2xhc3M9QUJDTWV0YSk6CisgICAgIiIiIGVtcHR5ICIiIgorCitjbGFzcyBGb3VydGhHb29kKFRoaXJkR29vZCk6CisgICAgIiIiIFRoaXMgc2hvdWxkIG5vdCB0cmlnZ2VyIGFueXRoaW5nLiAiIiIKKworY2xhc3MgRmlmdGhHb29kKG1ldGFjbGFzcz1hYmMuTWV0YWNsYXNzKToKKyAgICAiIiJNZXRhY2xhc3NlcyBjYW4gY29tZSBmcm9tIGltcG9ydGVkIG1vZHVsZXMuIiIiCisKKyMgVGhlIGZvbGxvd2luZyB1c2VkIHRvIHJhaXNlIHVzZWQtYmVmb3JlLWFzc2lnbm1lbnQKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBtdWx0aXBsZS1zdGF0ZW1lbnRzCitkZWYgdXNlZF9iZWZvcmVfYXNzaWdubWVudCgqLCBhcmcpOiByZXR1cm4gYXJnICsgMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuZGVmaW5lZC91bmRlZmluZWRfdmFyaWFibGVfcHkzMC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlX3B5MzAucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlX3B5MzAucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZV9weTMwLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmRlZmluZWQvdW5kZWZpbmVkX3ZhcmlhYmxlX3B5MzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MGVjZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5kZWZpbmVkL3VuZGVmaW5lZF92YXJpYWJsZV9weTMwLnR4dApAQCAtMCwwICsxLDggQEAKK3VuZGVmaW5lZC12YXJpYWJsZTo4OjIwOlVuZGVmaW5lZC50ZXN0OlVuZGVmaW5lZCB2YXJpYWJsZSAnVW5kZWZpbmVkJwordW5kZWZpbmVkLXZhcmlhYmxlOjMzOjM0OlVuZGVmaW5lZDEuSW5uZXJTY29wZS50ZXN0X3VuZGVmaW5lZDpVbmRlZmluZWQgdmFyaWFibGUgJ1VuZGVmJwordW5kZWZpbmVkLXZhcmlhYmxlOjM2OjI1OlVuZGVmaW5lZDEuSW5uZXJTY29wZS50ZXN0MTpVbmRlZmluZWQgdmFyaWFibGUgJ0FCQycKK3VuZGVmaW5lZC12YXJpYWJsZTo1MToyODpGYWxzZVBvc2l0aXZlMzQyLnRlc3RfYmFkOlVuZGVmaW5lZCB2YXJpYWJsZSAndHJvcCcKK3VuZGVmaW5lZC12YXJpYWJsZTo1NDozMTpGYWxzZVBvc2l0aXZlMzQyLnRlc3RfYmFkMTpVbmRlZmluZWQgdmFyaWFibGUgJ3Ryb3AxJwordW5kZWZpbmVkLXZhcmlhYmxlOjU3OjMxOkZhbHNlUG9zaXRpdmUzNDIudGVzdF9iYWQyOlVuZGVmaW5lZCB2YXJpYWJsZSAndHJvcDInCit1bmRlZmluZWQtdmFyaWFibGU6NjM6MDpCYWQ6VW5kZWZpbmVkIHZhcmlhYmxlICdBQkNNZXQnCit1bmRlZmluZWQtdmFyaWFibGU6NjY6MDpTZWNvbmRCYWQ6VW5kZWZpbmVkIHZhcmlhYmxlICdhYicKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmV4cGVjdGVkX3NwZWNpYWxfbWV0aG9kX3NpZ25hdHVyZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmV4cGVjdGVkX3NwZWNpYWxfbWV0aG9kX3NpZ25hdHVyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE2ODExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZXhwZWN0ZWRfc3BlY2lhbF9tZXRob2Rfc2lnbmF0dXJlLnB5CkBAIC0wLDAgKzEsMTIwIEBACisiIiJUZXN0IGZvciBzcGVjaWFsIG1ldGhvZHMgaW1wbGVtZW50ZWQgaW5jb3JyZWN0bHkuIiIiDQorDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHVudXNlZC1hcmd1bWVudCwgdG9vLWZldy1wdWJsaWMtbWV0aG9kcw0KKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSx0b28tbWFueS1hcmd1bWVudHMsYmFkLXN0YXRpY21ldGhvZC1hcmd1bWVudCwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UNCisNCitjbGFzcyBJbnZhbGlkKG9iamVjdCk6DQorDQorICAgIGRlZiBfX2VudGVyX18oc2VsZiwgb3RoZXIpOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fZGVsX18oc2VsZiwgb3RoZXIpOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgb3RoZXIsIG90aGVyMik6ICMgW3VuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlXQ0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZik6ICMgW3VuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlXQ0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19yb3VuZF9fKHNlbGYsIGludmFsaWQsIGFyZ3MpOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vLCBvdGhlcik6ICMgW3VuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlXQ0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19pdGVyX18oKTogIyBbbm8tbWV0aG9kLWFyZ3VtZW50XQ0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBAc3RhdGljbWV0aG9kDQorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW5hbmEpOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisNCisNCitjbGFzcyBGaXJzdEJhZENvbnRleHRNYW5hZ2VyKG9iamVjdCk6DQorICAgIGRlZiBfX2VudGVyX18oc2VsZik6DQorICAgICAgICByZXR1cm4gc2VsZg0KKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUpOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisNCitjbGFzcyBTZWNvbmRCYWRDb250ZXh0TWFuYWdlcihvYmplY3QpOg0KKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIHNlbGYNCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCB2YWx1ZSwgdGIsIHN0YWNrKTogIyBbdW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmVdDQorICAgICAgICBwYXNzDQorDQorY2xhc3MgVGhpcmRCYWRDb250ZXh0TWFuYWdlcihvYmplY3QpOg0KKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIHNlbGYNCisNCisgICAgIyArMTogW3VuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlXQ0KKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIHZhbHVlLCB0Yiwgc3RhY2ssICphcmdzKToNCisgICAgICAgIHBhc3MNCisNCisNCitjbGFzcyBBc3luYyhvYmplY3QpOg0KKw0KKyAgICBkZWYgX19haXRlcl9fKHNlbGYsIGV4dHJhKTogIyBbdW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmVdDQorICAgICAgICBwYXNzDQorICAgIGRlZiBfX2FuZXh0X18oc2VsZiwgZXh0cmEsIGFyZ3VtZW50KTogIyBbdW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmVdDQorICAgICAgICBwYXNzDQorICAgIGRlZiBfX2F3YWl0X18oc2VsZiwgcGFyYW0pOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisgICAgZGVmIF9fYWVudGVyX18oc2VsZiwgZmlyc3QpOiAjIFt1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZV0NCisgICAgICAgIHBhc3MNCisgICAgZGVmIF9fYWV4aXRfXyhzZWxmKTogIyBbdW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmVdDQorICAgICAgICBwYXNzDQorDQorDQorY2xhc3MgVmFsaWQob2JqZWN0KToNCisNCisgICAgZGVmIF9fbmV3X18oY2xzLCB0ZXN0LCBtdWx0aXBsZSwgYXJncyk6DQorICAgICAgICBwYXNzDQorDQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aGlzLCBjYW4sIGhhdmUsIG11bHRpcGxlLCBhcmdzLCBhc193ZWxsKToNCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGFsc28sIHRydiwgZm9yX3RoaXMpOg0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19yb3VuZF9fKHNlbGYsIG4pOg0KKyAgICAgICAgcGFzcw0KKw0KKyAgICBkZWYgX19pbmRleF9fKHNlbGYsIG49NDIpOg0KKyAgICAgICAgIiIiRXhwZWN0cyAwIGFyZ3MsIGJ1dCB3ZSBhcmUgdGFraW5nIGluIGFjY291bnQgYXJndW1lbnRzIHdpdGggZGVmYXVsdHMuIiIiDQorDQorICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6DQorICAgICAgICBwYXNzDQorDQorICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjaWZpY2F0aW9uPScnKToNCisgICAgICAgIHBhc3MNCisNCisgICAgZGVmIF9fY29weV9fKHNlbGYsIHRoaXM9Tm9uZSwgaXNfbm90PU5vbmUsIG5lY2Vzc2FyeT1Ob25lKToNCisgICAgICAgIHBhc3MNCisNCisgICAgQHN0YXRpY21ldGhvZA0KKyAgICBkZWYgX19lbnRlcl9fKCk6DQorICAgICAgICBwYXNzDQorDQorICAgIEBzdGF0aWNtZXRob2QNCisgICAgZGVmIF9fZ2V0aXRlbV9fKGluZGV4KToNCisgICAgICAgIHBhc3MNCisNCisNCitjbGFzcyBGaXJzdEdvb2RDb250ZXh0TWFuYWdlcihvYmplY3QpOg0KKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIHNlbGYNCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCB2YWx1ZSwgdGIpOg0KKyAgICAgICAgcGFzcw0KKw0KK2NsYXNzIFNlY29uZEdvb2RDb250ZXh0TWFuYWdlcihvYmplY3QpOg0KKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIHNlbGYNCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlPU5vbmUsIHZhbHVlPU5vbmUsIHRiPU5vbmUpOg0KKyAgICAgICAgcGFzcw0KKw0KK2NsYXNzIFRoaXJkR29vZENvbnRleHRNYW5hZ2VyKG9iamVjdCk6DQorICAgIGRlZiBfX2VudGVyX18oc2VsZik6DQorICAgICAgICByZXR1cm4gc2VsZg0KKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsICphcmdzKToNCisgICAgICAgIHBhc3MNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5leHBlY3RlZF9zcGVjaWFsX21ldGhvZF9zaWduYXR1cmUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZXhwZWN0ZWRfc3BlY2lhbF9tZXRob2Rfc2lnbmF0dXJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdmN2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZXhwZWN0ZWRfc3BlY2lhbF9tZXRob2Rfc2lnbmF0dXJlLnR4dApAQCAtMCwwICsxLDE2IEBACit1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZTo4OjQ6SW52YWxpZC5fX2VudGVyX186VGhlIHNwZWNpYWwgbWV0aG9kICdfX2VudGVyX18nIGV4cGVjdHMgMCBwYXJhbShzKSwgMSB3YXMgZ2l2ZW4KK3VuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlOjExOjQ6SW52YWxpZC5fX2RlbF9fOlRoZSBzcGVjaWFsIG1ldGhvZCAnX19kZWxfXycgZXhwZWN0cyAwIHBhcmFtKHMpLCAxIHdhcyBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6MTQ6NDpJbnZhbGlkLl9fZm9ybWF0X186VGhlIHNwZWNpYWwgbWV0aG9kICdfX2Zvcm1hdF9fJyBleHBlY3RzIDEgcGFyYW0ocyksIDIgd2VyZSBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6MTc6NDpJbnZhbGlkLl9fc2V0YXR0cl9fOlRoZSBzcGVjaWFsIG1ldGhvZCAnX19zZXRhdHRyX18nIGV4cGVjdHMgMiBwYXJhbShzKSwgMCB3YXMgZ2l2ZW4KK3VuZXhwZWN0ZWQtc3BlY2lhbC1tZXRob2Qtc2lnbmF0dXJlOjIwOjQ6SW52YWxpZC5fX3JvdW5kX186VGhlIHNwZWNpYWwgbWV0aG9kICdfX3JvdW5kX18nIGV4cGVjdHMgYmV0d2VlbiAwIG9yIDEgcGFyYW0ocyksIDIgd2VyZSBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6MjM6NDpJbnZhbGlkLl9fZGVlcGNvcHlfXzpUaGUgc3BlY2lhbCBtZXRob2QgJ19fZGVlcGNvcHlfXycgZXhwZWN0cyAxIHBhcmFtKHMpLCAyIHdlcmUgZ2l2ZW4KK25vLW1ldGhvZC1hcmd1bWVudDoyNjo0OkludmFsaWQuX19pdGVyX186TWV0aG9kIGhhcyBubyBhcmd1bWVudAordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6MzA6NDpJbnZhbGlkLl9fZ2V0YXR0cl9fOlRoZSBzcGVjaWFsIG1ldGhvZCAnX19nZXRhdHRyX18nIGV4cGVjdHMgMSBwYXJhbShzKSwgMiB3ZXJlIGdpdmVuCit1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZTozNzo0OkZpcnN0QmFkQ29udGV4dE1hbmFnZXIuX19leGl0X186VGhlIHNwZWNpYWwgbWV0aG9kICdfX2V4aXRfXycgZXhwZWN0cyAzIHBhcmFtKHMpLCAxIHdhcyBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6NDM6NDpTZWNvbmRCYWRDb250ZXh0TWFuYWdlci5fX2V4aXRfXzpUaGUgc3BlY2lhbCBtZXRob2QgJ19fZXhpdF9fJyBleHBlY3RzIDMgcGFyYW0ocyksIDQgd2VyZSBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6NTE6NDpUaGlyZEJhZENvbnRleHRNYW5hZ2VyLl9fZXhpdF9fOlRoZSBzcGVjaWFsIG1ldGhvZCAnX19leGl0X18nIGV4cGVjdHMgMyBwYXJhbShzKSwgNCB3ZXJlIGdpdmVuCit1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZTo1Nzo0OkFzeW5jLl9fYWl0ZXJfXzpUaGUgc3BlY2lhbCBtZXRob2QgJ19fYWl0ZXJfXycgZXhwZWN0cyAwIHBhcmFtKHMpLCAxIHdhcyBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6NTk6NDpBc3luYy5fX2FuZXh0X186VGhlIHNwZWNpYWwgbWV0aG9kICdfX2FuZXh0X18nIGV4cGVjdHMgMCBwYXJhbShzKSwgMiB3ZXJlIGdpdmVuCit1bmV4cGVjdGVkLXNwZWNpYWwtbWV0aG9kLXNpZ25hdHVyZTo2MTo0OkFzeW5jLl9fYXdhaXRfXzpUaGUgc3BlY2lhbCBtZXRob2QgJ19fYXdhaXRfXycgZXhwZWN0cyAwIHBhcmFtKHMpLCAxIHdhcyBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6NjM6NDpBc3luYy5fX2FlbnRlcl9fOlRoZSBzcGVjaWFsIG1ldGhvZCAnX19hZW50ZXJfXycgZXhwZWN0cyAwIHBhcmFtKHMpLCAxIHdhcyBnaXZlbgordW5leHBlY3RlZC1zcGVjaWFsLW1ldGhvZC1zaWduYXR1cmU6NjU6NDpBc3luYy5fX2FleGl0X186VGhlIHNwZWNpYWwgbWV0aG9kICdfX2FleGl0X18nIGV4cGVjdHMgMyBwYXJhbShzKSwgMCB3YXMgZ2l2ZW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmdyb3VwZWRfaW1wb3J0cy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmdyb3VwZWRfaW1wb3J0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzA4NjJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZ3JvdXBlZF9pbXBvcnRzLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyIiIkNoZWNrcyBpbXBvcnQgb3JkZXIgcnVsZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCx3cm9uZy1pbXBvcnQtcG9zaXRpb24sd3JvbmctaW1wb3J0LW9yZGVyLHVzaW5nLWNvbnN0YW50LXRlc3QKKyMgcHlsaW50OiBkaXNhYmxlPWltcG9ydC1lcnJvcgoraW1wb3J0IHNpeAoraW1wb3J0IGxvZ2dpbmcuY29uZmlnCitpbXBvcnQgb3MucGF0aAorZnJvbSBhc3Ryb2lkIGltcG9ydCBhcmVfZXhjbHVzaXZlCitpbXBvcnQgbG9nZ2luZyAgIyBbdW5ncm91cGVkLWltcG9ydHNdCitpbXBvcnQgdW51c2VkX2ltcG9ydAordHJ5OgorICAgIGltcG9ydCBvcyAgIyBbdW5ncm91cGVkLWltcG9ydHNdCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZnJvbSBvcyBpbXBvcnQgcGFyZGlyCitpbXBvcnQgc2NpcHkKK2Zyb20gb3MgaW1wb3J0IHNlcAorZnJvbSBhc3Ryb2lkIGltcG9ydCBleGNlcHRpb25zICMgW3VuZ3JvdXBlZC1pbXBvcnRzXQoraWYgVHJ1ZToKKyAgICBpbXBvcnQgbG9nZ2luZy5oYW5kbGVycyAgIyBbdW5ncm91cGVkLWltcG9ydHNdCitmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4gICMgW3VuZ3JvdXBlZC1pbXBvcnRzXQorIyBUZXN0IHJlbGF0ZWQgdG8gY29tcGF0aWJpbGl0eSB3aXRoIGlzb3J0OgorIyBXZSBjaGVjayB0aGF0IHdlIGRvIG5vdCBjcmVhdGUgZXJyb3Igd2l0aCB0aGUgb2xkIHdheSBweWxpbnQgd2FzIGhhbmRsaW5nIGl0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBNYWdpY01vY2sKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmdyb3VwZWRfaW1wb3J0cy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5ncm91cGVkX2ltcG9ydHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2Q5OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5ncm91cGVkX2ltcG9ydHMudHh0CkBAIC0wLDAgKzEsNSBAQAordW5ncm91cGVkLWltcG9ydHM6ODowOjpJbXBvcnRzIGZyb20gcGFja2FnZSBsb2dnaW5nIGFyZSBub3QgZ3JvdXBlZAordW5ncm91cGVkLWltcG9ydHM6MTE6NDo6SW1wb3J0cyBmcm9tIHBhY2thZ2Ugb3MgYXJlIG5vdCBncm91cGVkCit1bmdyb3VwZWQtaW1wb3J0czoxNzowOjpJbXBvcnRzIGZyb20gcGFja2FnZSBhc3Ryb2lkIGFyZSBub3QgZ3JvdXBlZAordW5ncm91cGVkLWltcG9ydHM6MTk6NDo6SW1wb3J0cyBmcm9tIHBhY2thZ2UgbG9nZ2luZyBhcmUgbm90IGdyb3VwZWQKK3VuZ3JvdXBlZC1pbXBvcnRzOjIwOjA6OkltcG9ydHMgZnJvbSBwYWNrYWdlIG9zIGFyZSBub3QgZ3JvdXBlZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuZ3JvdXBlZF9pbXBvcnRzX2lzb3J0X2NvbXBhdGlibGUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5ncm91cGVkX2ltcG9ydHNfaXNvcnRfY29tcGF0aWJsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY0ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuZ3JvdXBlZF9pbXBvcnRzX2lzb3J0X2NvbXBhdGlibGUucHkKQEAgLTAsMCArMSw2IEBACisiIiJDaGVja3MgaW1wb3J0IG9yZGVyIHJ1bGUgd2l0aCBpbXBvcnRzIHRoYXQgaXNvcnQgY291bGQgZ2VuZXJhdGUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKK2ltcG9ydCBhc3Ryb2lkCitpbXBvcnQgaXNvcnQKK2Zyb20gYXN0cm9pZCBpbXBvcnQgYXJlX2V4Y2x1c2l2ZSwgZGVjb3JhdG9ycworZnJvbSBhc3Ryb2lkLm1vZHV0aWxzIGltcG9ydCBnZXRfbW9kdWxlX3BhcnQsIGlzX3N0YW5kYXJkX21vZHVsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuaGFzaGFibGVfZGljdF9rZXkucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5oYXNoYWJsZV9kaWN0X2tleS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTYxNDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuaGFzaGFibGVfZGljdF9rZXkucHkKQEAgLTAsMCArMSwxMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxwb2ludGxlc3Mtc3RhdGVtZW50LCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCisKK2NsYXNzIFVuaGFzaGFibGUob2JqZWN0KToKKyAgICBfX2hhc2hfXyA9IGxpc3QuX19oYXNoX18KKwore31bWzEsIDIsIDNdXSAjIFt1bmhhc2hhYmxlLWRpY3Qta2V5XQore31be31dICMgW3VuaGFzaGFibGUtZGljdC1rZXldCit7fVtVbmhhc2hhYmxlKCldICMgW3VuaGFzaGFibGUtZGljdC1rZXldCit7fVsxOjJdICAjIFt1bmhhc2hhYmxlLWRpY3Qta2V5XQoreydmb28nOiAnYmFyJ31bJ2ZvbyddCit7J2Zvbyc6ICdiYXInfVs0Ml0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmhhc2hhYmxlX2RpY3Rfa2V5LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmhhc2hhYmxlX2RpY3Rfa2V5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTA4NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuaGFzaGFibGVfZGljdF9rZXkudHh0CkBAIC0wLDAgKzEsNCBAQAordW5oYXNoYWJsZS1kaWN0LWtleTo3OjA6OkRpY3Qga2V5IGlzIHVuaGFzaGFibGUKK3VuaGFzaGFibGUtZGljdC1rZXk6ODowOjpEaWN0IGtleSBpcyB1bmhhc2hhYmxlCit1bmhhc2hhYmxlLWRpY3Qta2V5Ojk6MDo6RGljdCBrZXkgaXMgdW5oYXNoYWJsZQordW5oYXNoYWJsZS1kaWN0LWtleToxMDowOjpEaWN0IGtleSBpcyB1bmhhc2hhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5pZGlvbWF0aWNfdHlwZWNoZWNrLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuaWRpb21hdGljX3R5cGVjaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDJiY2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuaWRpb21hdGljX3R5cGVjaGVjay5weQpAQCAtMCwwICsxLDcwIEBACisiIiJXYXJuaW5ncyBmb3IgdXNpbmcgdHlwZSh4KSA9PSBZIG9yIHR5cGUoeCkgaXMgWSBpbnN0ZWFkIG9mIGlzaW5zdGFuY2UoeCwgWSkuIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxleHByZXNzaW9uLW5vdC1hc3NpZ25lZCxyZWRlZmluZWQtYnVpbHRpbixpbnZhbGlkLW5hbWUKKworZGVmIHNpbXBsZV9wb3NpdGl2ZXMoKToKKyAgICB0eXBlKDQyKSBpcyBpbnQgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQorICAgIHR5cGUoNDIpIGlzIG5vdCBpbnQgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQorICAgIHR5cGUoNDIpID09IGludCAjIFt1bmlkaW9tYXRpYy10eXBlY2hlY2tdCisgICAgdHlwZSg0MikgIT0gaW50ICMgW3VuaWRpb21hdGljLXR5cGVjaGVja10KKworZGVmIHNpbXBsZV9pbmZlcmVuY2VfcG9zaXRpdmVzKCk6CisgICAgYWxpYXMgPSB0eXBlCisgICAgYWxpYXMoNDIpIGlzIGludCAjIFt1bmlkaW9tYXRpYy10eXBlY2hlY2tdCisgICAgYWxpYXMoNDIpIGlzIG5vdCBpbnQgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQorICAgIGFsaWFzKDQyKSA9PSBpbnQgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQorICAgIGFsaWFzKDQyKSAhPSBpbnQgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQorCitkZWYgdHlwZV9jcmVhdGlvbl9uZWdhdGl2ZXMoKToKKyAgICB0eXBlKCdRJywgKG9iamVjdCwpLCBkaWN0KGE9MSkpIGlzIGludAorICAgIHR5cGUoJ1EnLCAob2JqZWN0LCksIGRpY3QoYT0xKSkgaXMgbm90IGludAorICAgIHR5cGUoJ1EnLCAob2JqZWN0LCksIGRpY3QoYT0xKSkgPT0gaW50CisgICAgdHlwZSgnUScsIChvYmplY3QsKSwgZGljdChhPTEpKSAhPSBpbnQKKworZGVmIGludmFsaWRfdHlwZV9jYWxsX25lZ2F0aXZlcygqKmt3YXJncyk6CisgICAgdHlwZShiYWQ9NykgaXMgaW50CisgICAgdHlwZShiYWQ9NykgaXMgbm90IGludAorICAgIHR5cGUoYmFkPTcpID09IGludAorICAgIHR5cGUoYmFkPTcpICE9IGludAorICAgIHR5cGUoYmFkPTcpIGluIFtpbnRdCisgICAgdHlwZShiYWQ9Nykgbm90IGluIFtpbnRdCisgICAgdHlwZSgnYmFkJywgNykgaXMgaW50CisgICAgdHlwZSgnYmFkJywgNykgaXMgbm90IGludAorICAgIHR5cGUoJ2JhZCcsIDcpID09IGludAorICAgIHR5cGUoJ2JhZCcsIDcpICE9IGludAorICAgIHR5cGUoJ2JhZCcsIDcpIGluIFtpbnRdCisgICAgdHlwZSgnYmFkJywgNykgbm90IGluIFtpbnRdCisgICAgdHlwZSgqKmt3YXJncykgaXMgaW50CisgICAgdHlwZSgqKmt3YXJncykgaXMgbm90IGludAorICAgIHR5cGUoKiprd2FyZ3MpID09IGludAorICAgIHR5cGUoKiprd2FyZ3MpICE9IGludAorICAgIHR5cGUoKiprd2FyZ3MpIGluIFtpbnRdCisgICAgdHlwZSgqKmt3YXJncykgbm90IGluIFtpbnRdCisKK2RlZiBsb2NhbF92YXJfc2hhZG93aW5nX2luZmVyZW5jZV9uZWdhdGl2ZXMoKToKKyAgICB0eXBlID0gbGFtYmRhIGR1bW15OiA3CisgICAgdHlwZSg0MikgaXMgaW50CisgICAgdHlwZSg0MikgaXMgbm90IGludAorICAgIHR5cGUoNDIpID09IGludAorICAgIHR5cGUoNDIpICE9IGludAorICAgIHR5cGUoNDIpIGluIFtpbnRdCisgICAgdHlwZSg0Mikgbm90IGluIFtpbnRdCisKK2RlZiBwYXJhbWV0ZXJfc2hhZG93aW5nX2luZmVyZW5jZV9uZWdhdGl2ZXModHlwZSk6CisgICAgdHlwZSg0MikgaXMgaW50CisgICAgdHlwZSg0MikgaXMgbm90IGludAorICAgIHR5cGUoNDIpID09IGludAorICAgIHR5cGUoNDIpICE9IGludAorICAgIHR5cGUoNDIpIGluIFtpbnRdCisgICAgdHlwZSg0Mikgbm90IGluIFtpbnRdCisKK2RlZiBkZWxpYmVyYXRlX3N1YmNsYXNzX2NoZWNrX25lZ2F0aXZlcyhiKToKKyAgICB0eXBlKDQyKSBpcyB0eXBlKGIpCisgICAgdHlwZSg0MikgaXMgbm90IHR5cGUoYikKKworZGVmIHR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzKGEpOgorICAgIHR5cGUoYSkgaXMgdHlwZShbXSkgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQorICAgIHR5cGUoYSkgaXMgbm90IHR5cGUoW10pICMgW3VuaWRpb21hdGljLXR5cGVjaGVja10KKyAgICB0eXBlKGEpIGlzIHR5cGUoe30pICMgW3VuaWRpb21hdGljLXR5cGVjaGVja10KKyAgICB0eXBlKGEpIGlzIG5vdCB0eXBlKHt9KSAjIFt1bmlkaW9tYXRpYy10eXBlY2hlY2tdCisgICAgdHlwZShhKSBpcyB0eXBlKCIiKSAjIFt1bmlkaW9tYXRpYy10eXBlY2hlY2tdCisgICAgdHlwZShhKSBpcyBub3QgdHlwZSgiIikgIyBbdW5pZGlvbWF0aWMtdHlwZWNoZWNrXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VuaWRpb21hdGljX3R5cGVjaGVjay50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5pZGlvbWF0aWNfdHlwZWNoZWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzAyYjVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuaWRpb21hdGljX3R5cGVjaGVjay50eHQKQEAgLTAsMCArMSwxNCBAQAordW5pZGlvbWF0aWMtdHlwZWNoZWNrOjU6NDpzaW1wbGVfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo2OjQ6c2ltcGxlX3Bvc2l0aXZlczpVc2UgaXNpbnN0YW5jZSgpIHJhdGhlciB0aGFuIHR5cGUoKSBmb3IgYSB0eXBlY2hlY2suCit1bmlkaW9tYXRpYy10eXBlY2hlY2s6Nzo0OnNpbXBsZV9wb3NpdGl2ZXM6VXNlIGlzaW5zdGFuY2UoKSByYXRoZXIgdGhhbiB0eXBlKCkgZm9yIGEgdHlwZWNoZWNrLgordW5pZGlvbWF0aWMtdHlwZWNoZWNrOjg6NDpzaW1wbGVfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazoxMjo0OnNpbXBsZV9pbmZlcmVuY2VfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazoxMzo0OnNpbXBsZV9pbmZlcmVuY2VfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazoxNDo0OnNpbXBsZV9pbmZlcmVuY2VfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazoxNTo0OnNpbXBsZV9pbmZlcmVuY2VfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo2NTo0OnR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo2Njo0OnR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo2Nzo0OnR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo2ODo0OnR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo2OTo0OnR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KK3VuaWRpb21hdGljLXR5cGVjaGVjazo3MDo0OnR5cGVfb2ZfbGl0ZXJhbHNfcG9zaXRpdmVzOlVzZSBpc2luc3RhbmNlKCkgcmF0aGVyIHRoYW4gdHlwZSgpIGZvciBhIHR5cGVjaGVjay4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmluZmVyYWJsZV9hbGxfb2JqZWN0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VuaW5mZXJhYmxlX2FsbF9vYmplY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1NjVmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmluZmVyYWJsZV9hbGxfb2JqZWN0LnB5CkBAIC0wLDAgKzEsOSBAQAorIiIiVGVzdCB0aGF0IG5vbi1pbmZlcmFibGUgX19hbGxfXyB2YXJpYWJsZXMgZG8gbm90IG1ha2UgUHlsaW50IGNyYXNoLiIiIgorCitfX2FsbF9fID0gc29ydGVkKFsKKyAgICAnRHVtbXknLAorICAgICdOb25FeGlzdGFudCcsCisgICAgJ3BhdGgnLAorICAgICdmdW5jJywKKyAgICAnaW5uZXInLAorICAgICdJbm5lcktsYXNzJ10pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5rbm93bl9lbmNvZGluZ19qeXRob24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5rbm93bl9lbmNvZGluZ19qeXRob24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2MzI4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmtub3duX2VuY29kaW5nX2p5dGhvbi5weQpAQCAtMCwwICsxLDYgQEAKK++7vyMgW3N5bnRheC1lcnJvcl0NCisjIC0qLSBjb2Rpbmc6IElCTy04ODU5LTEgLSotDQorIiIiIGNoZWNrIGNvcnJlY3QgdW5rbm93biBlbmNvZGluZyBkZWNsYXJhdGlvbg0KKyIiIg0KKw0KK19fcmV2aXNpb25fXyA9ICfXmdeZ15nXmScNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5rbm93bl9lbmNvZGluZ19qeXRob24ucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5rbm93bl9lbmNvZGluZ19qeXRob24ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwYzAxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmtub3duX2VuY29kaW5nX2p5dGhvbi5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK2V4Y2VwdF9pbXBsZW1lbnRhdGlvbnM9UHlQeSxDUHl0aG9uLElyb25QeXRob24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bmtub3duX2VuY29kaW5nX2p5dGhvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5rbm93bl9lbmNvZGluZ19qeXRob24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmY3MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5rbm93bl9lbmNvZGluZ19qeXRob24udHh0CkBAIC0wLDAgKzEgQEAKK3N5bnRheC1lcnJvcjoxOjoiVW5rbm93biBlbmNvZGluZzogSUJPLTg4NTktMSINCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfY29tcHJlaGVuc2lvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9jb21wcmVoZW5zaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YTNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfY29tcHJlaGVuc2lvbi5weQpAQCAtMCwwICsxLDQ5IEBACisjIHB5bGludDogZGlzYWJsZT11bmRlZmluZWQtdmFyaWFibGUsIHBvaW50bGVzcy1zdGF0ZW1lbnQsIG1pc3NpbmctZG9jc3RyaW5nLCBsaW5lLXRvby1sb25nLCBleHByZXNzaW9uLW5vdC1hc3NpZ25lZAorIyBGb3IgbmFtZS1yZWZlcmVuY2Ugc2VlIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvcmVmZXJlbmNlL2V4cHJlc3Npb25zLmh0bWwjZGlzcGxheXMtZm9yLWxpc3RzLXNldHMtYW5kLWRpY3Rpb25hcmllcworCisjIExpc3QgY29tcHJlaGVuc2lvbnMKK1t4IGZvciB4IGluIGl0ZXJhYmxlXSAgIyBbdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbl0KK1t5IGZvciB4IGluIGl0ZXJhYmxlXSAgIyBleHByZXNzaW9uICE9IHRhcmdldF9saXN0CitbeCBmb3IgeCx5LHogaW4gaXRlcmFibGVdICAjIGV4cHJlc3Npb24gIT0gdGFyZ2V0X2xpc3QKK1soeCx5LHopIGZvciB4LHkseiBpbiBpdGVyYWJsZV0gICMgW3VubmVjZXNzYXJ5LWNvbXByZWhlbnNpb25dCitbKHgseSx6KSBmb3IgKHgseSx6KSBpbiBpdGVyYWJsZV0gICMgW3VubmVjZXNzYXJ5LWNvbXByZWhlbnNpb25dCitbeCBmb3IgeCwgKnkgaW4gaXRlcmFibGVdICAjIGV4cHJlc3Npb24gIT0gdGFyZ2V0X2xpc3QKK1t4IGZvciB4IGluIGl0ZXJhYmxlIGlmIGNvbmRpdGlvbl0gICMgZXhjbHVkZSBjb21wX2lmCitbeSBmb3IgeCBpbiBpdGVyYWJsZSBmb3IgeSBpbiB4XSAgIyBleGNsdWRlIG5lc3RlZCBjb21wcmVoZW5zaW9ucworWzIgKiB4IGZvciB4IGluIGl0ZXJhYmxlXSAgIyBleGNsdWRlIHVzZWZ1bCBjb21wcmVoZW5zaW9ucworWyh4LCB5LCAxKSBmb3IgeCwgeSBpbiBpdGVyYWJsZV0gICMgZXhjbHVkZSB1c2VmdWwgY29tcHJlaGVuc2lvbnMKKyMgVGVzdCBjYXNlIGZvciBpc3N1ZSAjNDQ5OQorYV9kaWN0ID0gZGljdCgpCitbKGssIHYpIGZvciBrLCB2IGluIGFfZGljdC5pdGVtcygpXSAgIyBbdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbl0KKworIyBTZXQgY29tcHJlaGVuc2lvbnMKK3t4IGZvciB4IGluIGl0ZXJhYmxlfSAgIyBbdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbl0KK3t5IGZvciB4IGluIGl0ZXJhYmxlfSAgIyBleHByZXNzaW9uICE9IHRhcmdldF9saXN0Cit7eCBmb3IgeCx5LHogaW4gaXRlcmFibGV9ICAjIGV4cHJlc3Npb24gIT0gdGFyZ2V0X2xpc3QKK3soeCx5LHopIGZvciB4LHkseiBpbiBpdGVyYWJsZX0gICMgW3VubmVjZXNzYXJ5LWNvbXByZWhlbnNpb25dCit7KHgseSx6KSBmb3IgKHgsIHksIHopIGluIGl0ZXJhYmxlfSAgIyBbdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbl0KK3soeCx5LHopIGZvciB4IGluIGl0ZXJhYmxlfSAgIyBleHByZXNzaW9uICE9IHRhcmdldF9saXN0Cit7KHgseSwoYSxiLGMpKSBmb3IgeCBpbiBpdGVyYWJsZX0gICMgZXhwcmVzc2lvbiAhPSB0YXJnZXRfbGlzdAore3ggZm9yIHgsICp5IGluIGl0ZXJhYmxlfSAgIyBleHByZXNzaW9uICE9IHRhcmdldF9saXN0Cit7eCBmb3IgeCBpbiBpdGVyYWJsZSBpZiBjb25kaXRpb259ICAjIGV4Y2x1ZGUgY29tcF9pZgore3kgZm9yIHggaW4gaXRlcmFibGUgZm9yIHkgaW4geH0gICMgZXhjbHVkZSBuZXN0ZWQgY29tcHJlaGVuc2lvbnMKKworIyBEaWN0aW9uYXJ5IGNvbXByZWhlbnNpb25zCit7eDogeSBmb3IgeCwgeSBpbiBpdGVyYWJsZX0gICMgW3VubmVjZXNzYXJ5LWNvbXByZWhlbnNpb25dCit7eTogeCBmb3IgeCwgeSBpbiBpdGVyYWJsZX0gICMga2V5IHZhbHVlIHdyb25nIG9yZGVyCit7eDogeSBmb3IgKHgsIHkpIGluIGl0ZXJhYmxlfSAgIyBbdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbl0KK3t4OiB5IGZvciB4LHkseiBpbiBpdGVyYWJsZX0gICMgZXhwcmVzc2lvbiAhPSB0YXJnZXRfbGlzdAore3g6IHkgZm9yIHgsIHkgaW4gaXRlcmFibGUgaWYgY29uZGl0aW9ufSAgIyBleGNsdWRlIGNvbXBfaWYKK3t5OiB6IGZvciB4IGluIGl0ZXJhYmxlIGZvciB5LCB6IGluIHh9ICAjIGV4Y2x1ZGUgbmVzdGVkIGNvbXByZWhlbnNpb25zCit7eDogMSBmb3IgeCBpbiBpdGVyYWJsZX0gICMgZXhwcmVzc2lvbiAhPSB0YXJnZXRfbGlzdAorezIgKiB4OiAzICsgeCBmb3IgeCBpbiBpdGVyYWJsZX0gICMgZXhjbHVkZSB1c2VmdWwgY29tcHJlaGVuc2lvbnMKKworIyBTb21lIGFkZGl0aW9uYWwgdGVzdHMgb24gaGVscHRleHQgLS0gd2hlbiBvYmplY3QgaXMgYWxyZWFkeSBhIGxpc3Qvc2V0L2RpY3QKK215X2xpc3QgPSBsaXN0KCkKK215X2RpY3QgPSBkaWN0KCkKK215X3NldCA9IHNldCgpCisKK1tlbGVtIGZvciBlbGVtIGluIG15X2xpc3RdICAjIFt1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uXQore2s6IHYgZm9yIGssIHYgaW4gbXlfZGljdC5pdGVtcygpfSAjIFt1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uXQore2s6IG15X2RpY3Rba10gZm9yIGsgaW4gbXlfZGljdH0gIyBbY29uc2lkZXItdXNpbmctZGljdC1pdGVtc10KK3tlbGVtIGZvciBlbGVtIGluIG15X3NldH0gICMgW3VubmVjZXNzYXJ5LWNvbXByZWhlbnNpb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfY29tcHJlaGVuc2lvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfY29tcHJlaGVuc2lvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5YmNjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9jb21wcmVoZW5zaW9uLnR4dApAQCAtMCwwICsxLDEzIEBACit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjU6MDo6VW5uZWNlc3NhcnkgdXNlIG9mIGEgY29tcHJlaGVuc2lvbiwgdXNlIGxpc3QoaXRlcmFibGUpIGluc3RlYWQuCit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjg6MDo6VW5uZWNlc3NhcnkgdXNlIG9mIGEgY29tcHJlaGVuc2lvbiwgdXNlIGxpc3QoaXRlcmFibGUpIGluc3RlYWQuCit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjk6MDo6VW5uZWNlc3NhcnkgdXNlIG9mIGEgY29tcHJlaGVuc2lvbiwgdXNlIGxpc3QoaXRlcmFibGUpIGluc3RlYWQuCit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjE3OjA6OlVubmVjZXNzYXJ5IHVzZSBvZiBhIGNvbXByZWhlbnNpb24sIHVzZSBsaXN0KGFfZGljdC5pdGVtcygpKSBpbnN0ZWFkLgordW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbjoyMDowOjpVbm5lY2Vzc2FyeSB1c2Ugb2YgYSBjb21wcmVoZW5zaW9uLCB1c2Ugc2V0KGl0ZXJhYmxlKSBpbnN0ZWFkLgordW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbjoyMzowOjpVbm5lY2Vzc2FyeSB1c2Ugb2YgYSBjb21wcmVoZW5zaW9uLCB1c2Ugc2V0KGl0ZXJhYmxlKSBpbnN0ZWFkLgordW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbjoyNDowOjpVbm5lY2Vzc2FyeSB1c2Ugb2YgYSBjb21wcmVoZW5zaW9uLCB1c2Ugc2V0KGl0ZXJhYmxlKSBpbnN0ZWFkLgordW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbjozMjowOjpVbm5lY2Vzc2FyeSB1c2Ugb2YgYSBjb21wcmVoZW5zaW9uLCB1c2UgZGljdChpdGVyYWJsZSkgaW5zdGVhZC4KK3VubmVjZXNzYXJ5LWNvbXByZWhlbnNpb246MzQ6MDo6VW5uZWNlc3NhcnkgdXNlIG9mIGEgY29tcHJlaGVuc2lvbiwgdXNlIGRpY3QoaXRlcmFibGUpIGluc3RlYWQuCit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjQ2OjA6OlVubmVjZXNzYXJ5IHVzZSBvZiBhIGNvbXByZWhlbnNpb24sIHVzZSBteV9saXN0IGluc3RlYWQuCit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjQ3OjA6OlVubmVjZXNzYXJ5IHVzZSBvZiBhIGNvbXByZWhlbnNpb24sIHVzZSBteV9kaWN0IGluc3RlYWQuCitjb25zaWRlci11c2luZy1kaWN0LWl0ZW1zOjQ4OjA6OkNvbnNpZGVyIGl0ZXJhdGluZyB3aXRoIC5pdGVtcygpCit1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uOjQ5OjA6OlVubmVjZXNzYXJ5IHVzZSBvZiBhIGNvbXByZWhlbnNpb24sIHVzZSBteV9zZXQgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9kaWN0X2luZGV4X2xvb2t1cC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9kaWN0X2luZGV4X2xvb2t1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFlMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X2RpY3RfaW5kZXhfbG9va3VwLnB5CkBAIC0wLDAgKzEsNjMgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCBleHByZXNzaW9uLW5vdC1hc3NpZ25lZCwgbGluZS10b28tbG9uZworCithX2RpY3QgPSBkaWN0KCkKK2JfZGljdCA9IGRpY3QoKQorCitmb3IgaywgdiBpbiBhX2RpY3QuaXRlbXMoKToKKyAgICBwcmludChhX2RpY3Rba10pICAjIFt1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cF0KKyAgICBwcmludChiX2RpY3Rba10pICAjIFNob3VsZCBub3QgZW1pdCB3YXJuaW5nLCBhY2Nlc3Npbmcgb3RoZXIgZGljdGlvbmFyeQorICAgIGFfZGljdFtrXSA9IDEyMyAgIyBTaG91bGQgbm90IGVtaXQgd2FybmluZywga2V5IGFjY2VzcyBuZWNlc3NhcnkKKyAgICBhX2RpY3Rba10gKz0gMTIzICAjIFNob3VsZCBub3QgZW1pdCB3YXJuaW5nLCBrZXkgYWNjZXNzIG5lY2Vzc2FyeQorICAgIHByaW50KGFfZGljdFtrXSkgICMgW3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorICAgIGsgPSAiYW5vdGhlciBrZXkiCisgICAgcHJpbnQoYV9kaWN0W2tdKSAgIyBUaGlzIGlzIGZpbmUsIGtleSByZWFzc2lnbmVkCisKKworIyBUZXN0cyBvbiBjb21wcmVoZW5zaW9ucwore3Y6IDEgZm9yIGssIHYgaW4gYV9kaWN0Lml0ZW1zKCkgaWYgYV9kaWN0W2tdfSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBdCit7djogMSBmb3IgaywgdiBpbiBhX2RpY3QuaXRlbXMoKSBpZiBrfSAgIyBUaGlzIGlzIGZpbmUsIG5vIGluZGV4aW5nCit7YV9kaWN0W2tdOiAxIGZvciBrLCB2IGluIGFfZGljdC5pdGVtcygpIGlmIGt9ICAjIFt1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cF0KK3thX2RpY3Rba106IDEgZm9yIGssIHYgaW4gYV9kaWN0Lml0ZW1zKCkgaWYgYV9kaWN0W2tdfSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXAsIHVubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorCitbdiBmb3IgaywgdiBpbiBhX2RpY3QuaXRlbXMoKSBpZiBhX2RpY3Rba11dICAjIFt1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cF0KK1t2IGZvciBrLCB2IGluIGFfZGljdC5pdGVtcygpIGlmIGtdICAjIFRoaXMgaXMgZmluZSwgbm8gaW5kZXhpbmcKK1thX2RpY3Rba10gZm9yIGssIHYgaW4gYV9kaWN0Lml0ZW1zKCkgaWYga10gICMgW3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorW2FfZGljdFtrXSBmb3IgaywgdiBpbiBhX2RpY3QuaXRlbXMoKSBpZiBhX2RpY3Rba11dICAjIFt1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cCwgdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBdCisKKworIyBUZXN0cyBvbiBkaWN0IGF0dHJpYnV0ZSBvZiBhIGNsYXNzCitjbGFzcyBGb286CisgICAgY19kaWN0ID0ge30KKworZm9yIGssIHYgaW4gRm9vLmNfZGljdC5pdGVtcygpOgorICAgIHByaW50KGJfZGljdFtrXSkgICMgU2hvdWxkIG5vdCBlbWl0IHdhcm5pbmcsIGFjY2Vzc2luZyBvdGhlciBkaWN0aW9uYXJ5CisgICAgcHJpbnQoRm9vLmNfZGljdFtrXSkgICMgW3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorICAgIEZvby5jX2RpY3Rba10gKz0gRm9vLmNfZGljdFtrXSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBdCisgICAgRm9vLmNfZGljdFtrXSArPSB2ICAjIGtleSBhY2Nlc3MgbmVjZXNzYXJ5CisKKyMgVGVzdHMgb24gY29tcHJlaGVuc2lvbnMKK3t2OiAxIGZvciBrLCB2IGluIEZvby5jX2RpY3QuaXRlbXMoKSBpZiBGb28uY19kaWN0W2tdfSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBdCit7djogMSBmb3IgaywgdiBpbiBGb28uY19kaWN0Lml0ZW1zKCkgaWYga30gICMgVGhpcyBpcyBmaW5lLCBubyBpbmRleGluZwore0Zvby5jX2RpY3Rba106IDEgZm9yIGssIHYgaW4gRm9vLmNfZGljdC5pdGVtcygpIGlmIGt9ICAjIFt1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cF0KK3tGb28uY19kaWN0W2tdOiAxIGZvciBrLCB2IGluIEZvby5jX2RpY3QuaXRlbXMoKSBpZiBGb28uY19kaWN0W2tdfSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXAsIHVubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorCitbdiBmb3IgaywgdiBpbiBGb28uY19kaWN0Lml0ZW1zKCkgaWYgRm9vLmNfZGljdFtrXV0gICMgW3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorW3YgZm9yIGssIHYgaW4gRm9vLmNfZGljdC5pdGVtcygpIGlmIGtdICAjIFRoaXMgaXMgZmluZSwgbm8gaW5kZXhpbmcKK1tGb28uY19kaWN0W2tdIGZvciBrLCB2IGluIEZvby5jX2RpY3QuaXRlbXMoKSBpZiBrXSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBdCitbRm9vLmNfZGljdFtrXSBmb3IgaywgdiBpbiBGb28uY19kaWN0Lml0ZW1zKCkgaWYgRm9vLmNfZGljdFtrXV0gICMgW3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwLCB1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cF0KKworIyBUZXN0IGFzc2lnbmluZyBkLml0ZW1zKCkgdG8gYSBzaW5nbGUgdmFyaWFibGUKK2QgPSB7MTogImEiLCAyOiAiYiJ9Citmb3IgaXRlbSBpbiBkLml0ZW1zKCk6CisgICAgcHJpbnQoaXRlbVswXSkKKyAgICBwcmludChkW2l0ZW1bMF1dKSAgIyBbdW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXBdCisKK1tpdGVtWzBdIGZvciBpdGVtIGluIGQuaXRlbXMoKV0KK1tkW2l0ZW1bMF1dIGZvciBpdGVtIGluIGQuaXRlbXMoKV0gICMgW3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwXQorCisjIFJlYXNzaWduaW5nIHNpbmdsZSB2YXIKK2ZvciBpdGVtIGluIGQuaXRlbXMoKToKKyAgICBwcmludChpdGVtWzBdKQorICAgIHByaW50KGRbaXRlbVswXV0pICAjIFt1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cF0KKyAgICBpdGVtID0gKDIsICJiIikKKyAgICBwcmludChkW2l0ZW1bMF1dKSAgIyBUaGlzIGlzIGZpbmUsIG5vIHdhcm5pbmcgdGhyb3duIGFzIGtleSBoYXMgYmVlbiByZWFzc2lnbmVkCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfZGljdF9pbmRleF9sb29rdXAudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X2RpY3RfaW5kZXhfbG9va3VwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRmOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X2RpY3RfaW5kZXhfbG9va3VwLnR4dApAQCAtMCwwICsxLDIzIEBACit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDo3OjEwOjpVbm5lY2Vzc2FyeSBkaWN0aW9uYXJ5IGluZGV4IGxvb2t1cCwgdXNlICd2JyBpbnN0ZWFkCit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDoxMToxMDo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6MTc6MzY6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjE5OjE6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjIwOjE6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjIwOjQ0OjpVbm5lY2Vzc2FyeSBkaWN0aW9uYXJ5IGluZGV4IGxvb2t1cCwgdXNlICd2JyBpbnN0ZWFkCit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDoyMjozMzo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6MjQ6MTo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6MjU6MTo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6MjU6NDE6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjM0OjEwOjpVbm5lY2Vzc2FyeSBkaWN0aW9uYXJ5IGluZGV4IGxvb2t1cCwgdXNlICd2JyBpbnN0ZWFkCit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDozNToyMTo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6Mzk6NDA6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjQxOjE6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjQyOjE6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjQyOjUyOjpVbm5lY2Vzc2FyeSBkaWN0aW9uYXJ5IGluZGV4IGxvb2t1cCwgdXNlICd2JyBpbnN0ZWFkCit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDo0NDozNzo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6NDY6MTo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6NDc6MTo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAndicgaW5zdGVhZAordW5uZWNlc3NhcnktZGljdC1pbmRleC1sb29rdXA6NDc6NDk6OlVubmVjZXNzYXJ5IGRpY3Rpb25hcnkgaW5kZXggbG9va3VwLCB1c2UgJ3YnIGluc3RlYWQKK3VubmVjZXNzYXJ5LWRpY3QtaW5kZXgtbG9va3VwOjUzOjEwOjpVbm5lY2Vzc2FyeSBkaWN0aW9uYXJ5IGluZGV4IGxvb2t1cCwgdXNlICdpdGVtWzFdJyBpbnN0ZWFkCit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDo1NjoxOjpVbm5lY2Vzc2FyeSBkaWN0aW9uYXJ5IGluZGV4IGxvb2t1cCwgdXNlICdpdGVtWzFdJyBpbnN0ZWFkCit1bm5lY2Vzc2FyeS1kaWN0LWluZGV4LWxvb2t1cDo2MToxMDo6VW5uZWNlc3NhcnkgZGljdGlvbmFyeSBpbmRleCBsb29rdXAsIHVzZSAnaXRlbVsxXScgaW5zdGVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X2xhbWJkYS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9sYW1iZGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiZDc3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9sYW1iZGEucHkKQEAgLTAsMCArMSw1MyBAQAorIyBweWxpbnQ6IGRpc2FibGU9dW5kZWZpbmVkLXZhcmlhYmxlDQorIiIidGVzdCBzdXNwaWNpb3VzIGxhbWJkYSBleHByZXNzaW9ucw0KKyIiIg0KKw0KK19fcmV2aXNpb25fXyA9ICcnDQorDQorIyBTb21lIHNpbXBsZSBleGFtcGxlcyBvZiB0aGUgbW9zdCBjb21tb25seSBlbmNvdW50ZXJlZCBmb3Jtcy4NCisjICsxOiBbdW5uZWNlc3NhcnktbGFtYmRhXQ0KK18gPSBsYW1iZGE6IGxpc3QoKSAgIyByZXBsYWNlYWJsZSB3aXRoICJsaXN0Ig0KKyMgKzE6IFt1bm5lY2Vzc2FyeS1sYW1iZGFdDQorXyA9IGxhbWJkYSB4OiBoYXNoKHgpICAjIHJlcGxhY2VhYmxlIHdpdGggImhhc2giDQorIyArMTogW3VubmVjZXNzYXJ5LWxhbWJkYV0NCitfID0gbGFtYmRhIHgsIHk6IG1pbih4LCB5KSAgIyByZXBsYWNlYWJsZSB3aXRoICJtaW4iDQorDQorIyBBIGZ1bmN0aW9uIHRoYXQgY2FuIHRha2UgYW55IGFyZ3VtZW50cyBnaXZlbiB0byBpdC4NCitfQU5ZQVJHUyA9IGxhbWJkYSAqYXJncywgKiprd2FyZ3M6ICdjb21wbGV0ZWx5IGFyYml0cmFyeSByZXR1cm4gdmFsdWUnDQorDQorIyBTb21lIG1vcmUgY29tcGxleCBmb3JtcyBvZiB1bm5lY2Vzc2FyeSBsYW1iZGEgZXhwcmVzc2lvbnMuDQorIyArMTogW3VubmVjZXNzYXJ5LWxhbWJkYV0NCitfID0gbGFtYmRhICphcmdzOiBfQU5ZQVJHUygqYXJncykNCisjICsxOiBbdW5uZWNlc3NhcnktbGFtYmRhXQ0KK18gPSBsYW1iZGEgKiprd2FyZ3M6IF9BTllBUkdTKCoqa3dhcmdzKQ0KKyMgKzE6IFt1bm5lY2Vzc2FyeS1sYW1iZGFdDQorXyA9IGxhbWJkYSAqYXJncywgKiprd2FyZ3M6IF9BTllBUkdTKCphcmdzLCAqKmt3YXJncykNCisjICsxOiBbdW5uZWNlc3NhcnktbGFtYmRhXQ0KK18gPSBsYW1iZGEgeCwgeSwgeiwgKmFyZ3MsICoqa3dhcmdzOiBfQU5ZQVJHUyh4LCB5LCB6LCAqYXJncywgKiprd2FyZ3MpDQorDQorIyBMYW1iZGFzIHRoYXQgYXJlICpub3QqIHVubmVjZXNzYXJ5IGFuZCBzaG91bGQgKm5vdCogdHJpZ2dlciB3YXJuaW5ncy4NCitfID0gbGFtYmRhIHg6IHgNCitfID0gbGFtYmRhIHg6IHgoKQ0KK18gPSBsYW1iZGEgeD00OiBoYXNoKHgpDQorXyA9IGxhbWJkYSB4LCB5OiBsaXN0KHJhbmdlKHksIHgpKQ0KK18gPSBsYW1iZGEgeDogbGlzdChyYW5nZSg1LCB4KSkNCitfID0gbGFtYmRhIHgsIHk6IGxpc3QocmFuZ2UoeCwgNSkpDQorXyA9IGxhbWJkYSB4LCB5LCB6OiB4LnkoeikNCitfID0gbGFtYmRhOiA1DQorXyA9IGxhbWJkYSAqKmt3YXJnczogX0FOWUFSR1MoKQ0KK18gPSBsYW1iZGEgKiprd2FyZ3M6IF9BTllBUkdTKCoqZGljdChbKCd0aHJlZScsIDMpXSkpDQorXyA9IGxhbWJkYSAqKmt3YXJnczogX0FOWUFSR1MoKip7J3RocmVlJzogM30pDQorXyA9IGxhbWJkYSBkaWN0X2FyZywgKiprd2FyZ3M6IF9BTllBUkdTKGt3YXJncywgKipkaWN0X2FyZykNCitfID0gbGFtYmRhICphcmdzOiBfQU5ZQVJHUygpDQorXyA9IGxhbWJkYSAqYXJnczogX0FOWUFSR1MoKmxpc3QoWzMsIDRdKSkNCitfID0gbGFtYmRhICphcmdzOiBfQU5ZQVJHUygqWzMsIDRdKQ0KK18gPSBsYW1iZGEgbGlzdF9hcmcsICphcmdzOiBfQU5ZQVJHUyhhcmdzLCAqbGlzdF9hcmcpDQorXyA9IGxhbWJkYTogX0FOWUFSR1MoKlszXSkNCitfID0gbGFtYmRhOiBfQU5ZQVJHUygqKnsndGhyZWUnOiAzfSkNCitfID0gbGFtYmRhOiBfQU5ZQVJHUygqWzNdLCAqKnsndGhyZWUnOiAzfSkNCitfID0gbGFtYmRhOiBfQU5ZQVJHUyhmdW5jPTQyKQ0KKw0KKyMgRG9uJ3Qgd2FybiBhYm91dCB0aGlzLg0KK18gPSBsYW1iZGE6IGNvZGUoKS5hbmFseXNpcygpDQorDQorXyA9IGxhbWJkYSAqKmt3YXJnczogZGljdChiYXI9NDIsICoqa3dhcmdzKQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9sYW1iZGEudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X2xhbWJkYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5ODNiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9sYW1iZGEudHh0CkBAIC0wLDAgKzEsNyBAQAordW5uZWNlc3NhcnktbGFtYmRhOjk6NDo8bGFtYmRhPjpMYW1iZGEgbWF5IG5vdCBiZSBuZWNlc3NhcnkKK3VubmVjZXNzYXJ5LWxhbWJkYToxMTo0OjxsYW1iZGE+OkxhbWJkYSBtYXkgbm90IGJlIG5lY2Vzc2FyeQordW5uZWNlc3NhcnktbGFtYmRhOjEzOjQ6PGxhbWJkYT46TGFtYmRhIG1heSBub3QgYmUgbmVjZXNzYXJ5Cit1bm5lY2Vzc2FyeS1sYW1iZGE6MjA6NDo8bGFtYmRhPjpMYW1iZGEgbWF5IG5vdCBiZSBuZWNlc3NhcnkKK3VubmVjZXNzYXJ5LWxhbWJkYToyMjo0OjxsYW1iZGE+OkxhbWJkYSBtYXkgbm90IGJlIG5lY2Vzc2FyeQordW5uZWNlc3NhcnktbGFtYmRhOjI0OjQ6PGxhbWJkYT46TGFtYmRhIG1heSBub3QgYmUgbmVjZXNzYXJ5Cit1bm5lY2Vzc2FyeS1sYW1iZGE6MjY6NDo8bGFtYmRhPjpMYW1iZGEgbWF5IG5vdCBiZSBuZWNlc3NhcnkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9ub3QucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3Nhcnlfbm90LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YWNlY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3Nhcnlfbm90LnB5CkBAIC0wLDAgKzEsNjMgQEAKKyIiIkNoZWNrIGV4Y2VlZGluZyBuZWdhdGlvbnMgaW4gYm9vbGVhbiBleHByZXNzaW9ucyB0cmlnZ2VyIHdhcm5pbmdzIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXNpbmdsZXRvbi1jb21wYXJpc29uLHRvby1tYW55LWJyYW5jaGVzLHRvby1mZXctcHVibGljLW1ldGhvZHMsdW5kZWZpbmVkLXZhcmlhYmxlCisjIHB5bGludDogZGlzYWJsZT1saXRlcmFsLWNvbXBhcmlzb24sIGNvbXBhcmlzb24td2l0aC1pdHNlbGYsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitkZWYgdW5uZWVkZWRfbm90KCk6CisgICAgIiIiVGhpcyBpcyBub3Qgb2sKKyAgICAiIiIKKyAgICBib29sX3ZhciA9IFRydWUKKyAgICBzb21laW50ID0gMgorICAgIGlmIG5vdCBub3QgYm9vbF92YXI6ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKyAgICBpZiBub3Qgc29tZWludCA9PSAxOiAgIyBbdW5uZWVkZWQtbm90XQorICAgICAgICBwYXNzCisgICAgaWYgbm90IHNvbWVpbnQgIT0gMTogICMgW3VubmVlZGVkLW5vdF0KKyAgICAgICAgcGFzcworICAgIGlmIG5vdCBzb21laW50IDwgMTogICMgW3VubmVlZGVkLW5vdF0KKyAgICAgICAgcGFzcworICAgIGlmIG5vdCBzb21laW50ID4gMTogICMgW3VubmVlZGVkLW5vdF0KKyAgICAgICAgcGFzcworICAgIGlmIG5vdCBzb21laW50IDw9IDE6ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKyAgICBpZiBub3Qgc29tZWludCA+PSAxOiAgIyBbdW5uZWVkZWQtbm90XQorICAgICAgICBwYXNzCisgICAgaWYgbm90IG5vdCBzb21laW50OiAgIyBbdW5uZWVkZWQtbm90XQorICAgICAgICBwYXNzCisgICAgaWYgbm90IGJvb2xfdmFyID09IFRydWU6ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKyAgICBpZiBub3QgYm9vbF92YXIgPT0gRmFsc2U6ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKyAgICBpZiBub3QgYm9vbF92YXIgIT0gVHJ1ZTogICMgW3VubmVlZGVkLW5vdF0KKyAgICAgICAgcGFzcworICAgIGlmIG5vdCBUcnVlID09IFRydWU6ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKyAgICBpZiBub3QgMiBpbiBbMywgNF06ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKyAgICBpZiBub3Qgc29tZWludCBpcyAndGVzdCc6ICAjIFt1bm5lZWRlZC1ub3RdCisgICAgICAgIHBhc3MKKworCitkZWYgdG9sZXJhdGVkX3N0YXRlbWVudHMoKToKKyAgICAiIiJUaGlzIGlzIG9rIiIiCisgICAgYm9vbF92YXIgPSBUcnVlCisgICAgc29tZWludCA9IDIKKyAgICBpZiBub3QoYm9vbF92YXIgPT0gRmFsc2UgYW5kIHNvbWVpbnQgPT0gMSk6CisgICAgICAgIHBhc3MKKyAgICBpZiAyIG5vdCBpbiBbMywgNF06CisgICAgICAgIHBhc3MKKyAgICBpZiBub3Qgc29tZWludCA9PSBib29sX3ZhciA9PSAyOgorICAgICAgICBwYXNzCisgICAgaWYgbm90IDIgPD0gc29tZWludCA8IDMgPCA0OgorICAgICAgICBwYXNzCisgICAgaWYgbm90IHNldCgnYmFyJykgPD0gc2V0KCdmb29iYXonKToKKyAgICAgICAgcGFzcworICAgIGlmIG5vdCBzZXQoc29tZXRoaW5nKSA8PSAzOgorICAgICAgICBwYXNzCisgICAgaWYgbm90IGZyb3plbnNldChzb21ldGhpbmcpIDw9IDM6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBLbGFzcyhvYmplY3QpOgorICAgICIiIlRoaXMgaXMgYWxzbyBvayIiIgorICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9ub3QudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X25vdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyZjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9ub3QudHh0CkBAIC0wLDAgKzEsMTQgQEAKK3VubmVlZGVkLW5vdDoxMDo3OnVubmVlZGVkX25vdDoiQ29uc2lkZXIgY2hhbmdpbmcgIiJub3Qgbm90IGJvb2xfdmFyIiIgdG8gIiJib29sX3ZhciIiIgordW5uZWVkZWQtbm90OjEyOjc6dW5uZWVkZWRfbm90OiJDb25zaWRlciBjaGFuZ2luZyAiIm5vdCBzb21laW50ID09IDEiIiB0byAiInNvbWVpbnQgIT0gMSIiIgordW5uZWVkZWQtbm90OjE0Ojc6dW5uZWVkZWRfbm90OiJDb25zaWRlciBjaGFuZ2luZyAiIm5vdCBzb21laW50ICE9IDEiIiB0byAiInNvbWVpbnQgPT0gMSIiIgordW5uZWVkZWQtbm90OjE2Ojc6dW5uZWVkZWRfbm90OiJDb25zaWRlciBjaGFuZ2luZyAiIm5vdCBzb21laW50IDwgMSIiIHRvICIic29tZWludCA+PSAxIiIiCit1bm5lZWRlZC1ub3Q6MTg6Nzp1bm5lZWRlZF9ub3Q6IkNvbnNpZGVyIGNoYW5naW5nICIibm90IHNvbWVpbnQgPiAxIiIgdG8gIiJzb21laW50IDw9IDEiIiIKK3VubmVlZGVkLW5vdDoyMDo3OnVubmVlZGVkX25vdDoiQ29uc2lkZXIgY2hhbmdpbmcgIiJub3Qgc29tZWludCA8PSAxIiIgdG8gIiJzb21laW50ID4gMSIiIgordW5uZWVkZWQtbm90OjIyOjc6dW5uZWVkZWRfbm90OiJDb25zaWRlciBjaGFuZ2luZyAiIm5vdCBzb21laW50ID49IDEiIiB0byAiInNvbWVpbnQgPCAxIiIiCit1bm5lZWRlZC1ub3Q6MjQ6Nzp1bm5lZWRlZF9ub3Q6IkNvbnNpZGVyIGNoYW5naW5nICIibm90IG5vdCBzb21laW50IiIgdG8gIiJzb21laW50IiIiCit1bm5lZWRlZC1ub3Q6MjY6Nzp1bm5lZWRlZF9ub3Q6IkNvbnNpZGVyIGNoYW5naW5nICIibm90IGJvb2xfdmFyID09IFRydWUiIiB0byAiImJvb2xfdmFyICE9IFRydWUiIiIKK3VubmVlZGVkLW5vdDoyODo3OnVubmVlZGVkX25vdDoiQ29uc2lkZXIgY2hhbmdpbmcgIiJub3QgYm9vbF92YXIgPT0gRmFsc2UiIiB0byAiImJvb2xfdmFyICE9IEZhbHNlIiIiCit1bm5lZWRlZC1ub3Q6MzA6Nzp1bm5lZWRlZF9ub3Q6IkNvbnNpZGVyIGNoYW5naW5nICIibm90IGJvb2xfdmFyICE9IFRydWUiIiB0byAiImJvb2xfdmFyID09IFRydWUiIiIKK3VubmVlZGVkLW5vdDozMjo3OnVubmVlZGVkX25vdDoiQ29uc2lkZXIgY2hhbmdpbmcgIiJub3QgVHJ1ZSA9PSBUcnVlIiIgdG8gIiJUcnVlICE9IFRydWUiIiIKK3VubmVlZGVkLW5vdDozNDo3OnVubmVlZGVkX25vdDoiQ29uc2lkZXIgY2hhbmdpbmcgIiJub3QgMiBpbiBbMywgNF0iIiB0byAiIjIgbm90IGluIFszLCA0XSIiIgordW5uZWVkZWQtbm90OjM2Ojc6dW5uZWVkZWRfbm90OiJDb25zaWRlciBjaGFuZ2luZyAiIm5vdCBzb21laW50IGlzICd0ZXN0JyIiIHRvICIic29tZWludCBpcyBub3QgJ3Rlc3QnIiIiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfcGFzcy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9wYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzMzMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5uZWNlc3NhcnkvdW5uZWNlc3NhcnlfcGFzcy5weQpAQCAtMCwwICsxLDQ5IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdG9vLWZldy1wdWJsaWMtbWV0aG9kcworCit0cnk6CisgICAgQSA9IDIKK2V4Y2VwdCBWYWx1ZUVycm9yOgorICAgIEEgPSAyNAorICAgIHBhc3MgIyBbdW5uZWNlc3NhcnktcGFzc10KKworZGVmIGRvY3N0cmluZ19vbmx5KCk6CisgICAgJycnSW4gUHl0aG9uLCBzdHViYmVkIGZ1bmN0aW9ucyBvZnRlbiBoYXZlIGEgYm9keSB0aGF0IGNvbnRhaW5zIGp1c3QgYQorICAgIHNpbmdsZSBgcGFzc2Agc3RhdGVtZW50LCBpbmRpY2F0aW5nIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgZG8KKyAgICBhbnl0aGluZy4gSG93ZXZlciwgYSBzdHViYmVkIGZ1bmN0aW9uIGNhbiBhbHNvIGhhdmUganVzdCBhCisgICAgZG9jc3RyaW5nLCBhbmQgZnVuY3Rpb24gd2l0aCBhIGRvY3N0cmluZyBhbmQgbm8gYm9keSBhbHNvIGRvZXMKKyAgICBub3RoaW5nLgorICAgICcnJworCisKKyMgVGhpcyBmdW5jdGlvbiBoYXMgbm8gZG9jc3RyaW5nLCBzbyBpdCBuZWVkcyBhIGBwYXNzYCBzdGF0ZW1lbnQuCitkZWYgcGFzc19vbmx5KCk6CisgICAgcGFzcworCisKK2RlZiBkb2NzdHJpbmdfYW5kX3Bhc3MoKToKKyAgICAnJydUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcsIGJ1dCBpdCBoYXMgYSBkb2NzdHJpbmcsIHNvIGl0cworICAgIGBwYXNzYCBzdGF0ZW1lbnQgaXMgdXNlbGVzcyBjbHV0dGVyLgorCisgICAgTkVXIENIRUNLOiB1c2VsZXNzLXBhc3MKKworICAgIFRoaXMgd291bGQgY2hlY2sgZm9yIHN0dWJzIHdpdGggYm90aCBkb2NzdHJpbmdzIGFuZCBgcGFzc2AKKyAgICBzdGF0ZW1lbnRzLCBzdWdnZXN0aW5nIHRoZSByZW1vdmFsIG9mIHRoZSB1c2VsZXNzIGBwYXNzYAorICAgIHN0YXRlbWVudHMKKyAgICAnJycKKyAgICBwYXNzICMgW3VubmVjZXNzYXJ5LXBhc3NdCisKKworY2xhc3MgRG9jc3RyaW5nT25seToKKyAgICAnJydUaGUgc2FtZSBnb2VzIGZvciBjbGFzcyBzdHViczogZG9jc3RyaW5nLCBvciBgcGFzc2AsIGJ1dCBub3QgYm90aC4KKyAgICAnJycKKworCisjIE5vIHByb2JsZW0KK2NsYXNzIFBhc3NPbmx5OgorICAgIHBhc3MKKworCitjbGFzcyBEb2NzdHJpbmdBbmRQYXNzOgorICAgICcnJ1dob29wcyEgTWFyayB0aGlzIG9uZSBhcyBiYWQgdG9vLgorICAgICcnJworICAgIHBhc3MgIyBbdW5uZWNlc3NhcnktcGFzc10KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9wYXNzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bm5lY2Vzc2FyeS91bm5lY2Vzc2FyeV9wYXNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFiY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VubmVjZXNzYXJ5L3VubmVjZXNzYXJ5X3Bhc3MudHh0CkBAIC0wLDAgKzEsMyBAQAordW5uZWNlc3NhcnktcGFzczo3OjQ6OlVubmVjZXNzYXJ5IHBhc3Mgc3RhdGVtZW50Cit1bm5lY2Vzc2FyeS1wYXNzOjMzOjQ6ZG9jc3RyaW5nX2FuZF9wYXNzOlVubmVjZXNzYXJ5IHBhc3Mgc3RhdGVtZW50Cit1bm5lY2Vzc2FyeS1wYXNzOjQ5OjQ6RG9jc3RyaW5nQW5kUGFzczpVbm5lY2Vzc2FyeSBwYXNzIHN0YXRlbWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VucGFja2luZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkOWFiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmcucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiIENvZGUgZm9yIGNoZWNraW5nIHRoZSBkaXNwbGF5IG9mIHRoZSBtb2R1bGUNCitmb3IgdW5iYWxhbmNlZC10dXBsZS11bnBhY2tpbmcgYW5kIHVucGFja2luZy1ub24tc2VxdWVuY2UNCisiIiINCisNCitkZWYgdW5wYWNrKCk6DQorICAgICIiIiBSZXR1cm4gc29tZXRoaW5nIiIiDQorICAgIHJldHVybiAoMSwgMiwgMykNCisNCitkZWYgbm9uc2VxKCk6DQorICAgICIiIiBSZXR1cm4gbm9uIHNlcXVlbmNlICIiIg0KKyAgICByZXR1cm4gMQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfZ2VuZXJhbGl6YXRpb25zLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucGFja2luZ19nZW5lcmFsaXphdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1ZmIxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfZ2VuZXJhbGl6YXRpb25zLnB5CkBAIC0wLDAgKzEsMjkgQEAKKyIiIlZhcmlvdXMgdGVzdHMgZm9yIHVucGFja2luZyBnZW5lcmFsaXphdGlvbnMgYWRkZWQgaW4gUHl0aG9uIDMuNSIiIg0KKw0KKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBpbnZhbGlkLW5hbWUNCisNCitkZWYgZnVuY192YXJpYWRpY19hcmdzKCphcmdzKToNCisgICAgcmV0dXJuIGFyZ3MNCisNCisNCitkZWYgZnVuY192YXJpYWRpY19wb3NpdGlvbmFsX2FyZ3MoYSwgYiwgKmFyZ3MpOg0KKyAgICByZXR1cm4gYSwgYiwgYXJncw0KKw0KK2RlZiBmdW5jX3Bvc2l0aW9uYWxfYXJncyhhLCBiLCBjLCBkKToNCisgICAgcmV0dXJuIGEsIGIsIGMsIGQNCisNCisNCitmdW5jX3ZhcmlhZGljX2FyZ3MoKigyLCAzKSwgKigzLCA0KSwgKig0LCA1KSkNCitmdW5jX3ZhcmlhZGljX2FyZ3MoMSwgMiwgKigyLCAzKSwgMiwgMywgKig0LCA1KSkNCitmdW5jX3ZhcmlhZGljX3Bvc2l0aW9uYWxfYXJncygxLCAyLCAqKDQsIDUpLCAqKDUsIDYpKQ0KK2Z1bmNfdmFyaWFkaWNfcG9zaXRpb25hbF9hcmdzKCooMiwgMyksICooNCwgNSksICooNSwgNikpDQorZnVuY192YXJpYWRpY19wb3NpdGlvbmFsX2FyZ3MoKigyLCAzKSkNCitmdW5jX3ZhcmlhZGljX3Bvc2l0aW9uYWxfYXJncygqKDIsIDMsIDQpKQ0KK2Z1bmNfdmFyaWFkaWNfcG9zaXRpb25hbF9hcmdzKDEsIDIsIDMsICooMywgNCkpDQorDQorZnVuY19wb3NpdGlvbmFsX2FyZ3MoKigyLCAzLCA0KSwgKigyLCAzKSkgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJnc10NCitmdW5jX3Bvc2l0aW9uYWxfYXJncygqKDEsIDIpLCAzKSAjIFtuby12YWx1ZS1mb3ItcGFyYW1ldGVyXQ0KK2Z1bmNfcG9zaXRpb25hbF9hcmdzKDEsICooMiwgKSwgMywgKig0LCA1KSkgIyBbdG9vLW1hbnktZnVuY3Rpb24tYXJnc10NCitmdW5jX3Bvc2l0aW9uYWxfYXJncygxLCAyLCBjPTI0LCBkPTMyLCAqKnsnZCc6IDMyfSkgIyBbcmVwZWF0ZWQta2V5d29yZF0NCisjICsxOiBbcmVwZWF0ZWQta2V5d29yZCxyZXBlYXRlZC1rZXl3b3JkXQ0KK2Z1bmNfcG9zaXRpb25hbF9hcmdzKDEsIDIsIGM9MjQsICoqeydjJzogMzQsICdkJzogMzN9LCAqKnsnZCc6IDI0fSkNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5wYWNraW5nX2dlbmVyYWxpemF0aW9ucy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfZ2VuZXJhbGl6YXRpb25zLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGU4YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5wYWNraW5nX2dlbmVyYWxpemF0aW9ucy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfZ2VuZXJhbGl6YXRpb25zLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfZ2VuZXJhbGl6YXRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM0NzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucGFja2luZ19nZW5lcmFsaXphdGlvbnMudHh0CkBAIC0wLDAgKzEsNiBAQAordG9vLW1hbnktZnVuY3Rpb24tYXJnczoyNDowOjpUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gY2FsbAorbm8tdmFsdWUtZm9yLXBhcmFtZXRlcjoyNTowOjpObyB2YWx1ZSBmb3IgYXJndW1lbnQgJ2QnIGluIGZ1bmN0aW9uIGNhbGwKK3Rvby1tYW55LWZ1bmN0aW9uLWFyZ3M6MjY6MDo6VG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIGNhbGwKK3JlcGVhdGVkLWtleXdvcmQ6Mjc6MDo6R290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnZCcgaW4gZnVuY3Rpb24gY2FsbAorcmVwZWF0ZWQta2V5d29yZDoyOTowOjpHb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICdjJyBpbiBmdW5jdGlvbiBjYWxsCityZXBlYXRlZC1rZXl3b3JkOjI5OjA6OkdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgJ2QnIGluIGZ1bmN0aW9uIGNhbGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfbm9uX3NlcXVlbmNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucGFja2luZ19ub25fc2VxdWVuY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4MTY0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfbm9uX3NlcXVlbmNlLnB5CkBAIC0wLDAgKzEsMTM5IEBACisiIiJDaGVjayB1bnBhY2tpbmcgbm9uLXNlcXVlbmNlcyBpbiBhc3NpZ25tZW50cy4gIiIiCisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIGludmFsaWQtbmFtZSwgYXR0cmlidXRlLWRlZmluZWQtb3V0c2lkZS1pbml0LCB1bnVzZWQtdmFyaWFibGUsIG5vLWFic29sdXRlLWltcG9ydAorIyBweWxpbnQ6IGRpc2FibGU9dXNpbmctY29uc3RhbnQtdGVzdCwgbm8taW5pdCwgbWlzc2luZy1kb2NzdHJpbmcsIHdyb25nLWltcG9ydC1vcmRlcix3cm9uZy1pbXBvcnQtcG9zaXRpb24sbm8tZWxzZS1yZXR1cm4sIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitmcm9tIG9zIGltcG9ydCByZW5hbWUgYXMgbm9uc2VxX2Z1bmMKK2Zyb20gZnVuY3Rpb25hbC51LnVucGFja2luZyBpbXBvcnQgbm9uc2VxCisKK19fcmV2aXNpb25fXyA9IDAKKworIyBXb3JraW5nCisKK2NsYXNzIFNlcShvYmplY3QpOgorICAgICIiIiBzZXF1ZW5jZSAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuaXRlbXMgPSByYW5nZSgyKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gc2VsZi5pdGVtc1tpdGVtXQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5pdGVtcykKKworY2xhc3MgSXRlcihvYmplY3QpOgorICAgICIiIiBJdGVyYXRvciAiIiIKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciBudW1iZXIgaW4gcmFuZ2UoMik6CisgICAgICAgICAgICB5aWVsZCBudW1iZXIKKworZGVmIGdvb2RfdW5wYWNraW5nKCk6CisgICAgIiIiIHJldHVybnMgc2hvdWxkIGJlIHVucGFja2FibGUgIiIiCisgICAgaWYgVHJ1ZToKKyAgICAgICAgcmV0dXJuIFsxLCAyXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAoMywgNCkKKworZGVmIGdvb2RfdW5wYWNraW5nMigpOgorICAgICIiIiByZXR1cm5zIHNob3VsZCBiZSB1bnBhY2thYmxlICIiIgorICAgIHJldHVybiBnb29kX3VucGFja2luZygpCisKK2NsYXNzIE1ldGFJdGVyKHR5cGUpOgorICAgICJtZXRhY2xhc3MgdGhhdCBtYWtlcyBjbGFzc2VzIHRoYXQgdXNlIGl0IGl0ZXJhYmxlcyIKKyAgICBkZWYgX19pdGVyX18oY2xzKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoKDEsIDIpKQorCitjbGFzcyBJdGVyQ2xhc3MobWV0YWNsYXNzPU1ldGFJdGVyKToKKyAgICAiY2xhc3MgdGhhdCBpcyBpdGVyYWJsZSAoYW5kIHVucGFja2FibGUpIgorCitjbGFzcyBBYnN0ckNsYXNzKG9iamVjdCk6CisgICAgImFic3RyYWN0IGNsYXNzIgorICAgIHBhaXIgPSBOb25lCisKKyAgICBkZWYgc2V0dXBfcGFpcihzZWxmKToKKyAgICAgICAgImFic3RyYWN0IG1ldGhvZCIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiZXJyb3Igc2hvdWxkIG5vdCBiZSBlbWl0dGVkIGJlY2F1c2Ugc2V0dXBfcGFpciBpcyBhYnN0cmFjdCIKKyAgICAgICAgc2VsZi5zZXR1cF9wYWlyKCkKKyAgICAgICAgeCwgeSA9IHNlbGYucGFpcgorCithLCBiID0gWzEsIDJdCithLCBiID0gKDEsIDIpCithLCBiID0gc2V0KFsxLCAyXSkKK2EsIGIgPSB7MTogMiwgMjogM30KK2EsIGIgPSAieHkiCithLCBiID0gU2VxKCkKK2EsIGIgPSBJdGVyKCkKK2EsIGIgPSAobnVtYmVyIGZvciBudW1iZXIgaW4gcmFuZ2UoMikpCithLCBiID0gZ29vZF91bnBhY2tpbmcoKQorYSwgYiA9IGdvb2RfdW5wYWNraW5nMigpCithLCBiID0gSXRlckNsYXNzCisKKyMgTm90IHdvcmtpbmcKK2NsYXNzIE5vblNlcShvYmplY3QpOgorICAgICIiIiBkb2VzIG5vdGhpbmcgIiIiCisKK2EsIGIgPSBOb25TZXEoKSAjIFt1bnBhY2tpbmctbm9uLXNlcXVlbmNlXQorYSwgYiA9IFZhbHVlRXJyb3IgIyBbdW5wYWNraW5nLW5vbi1zZXF1ZW5jZV0KK2EsIGIgPSBOb25lICMgW3VucGFja2luZy1ub24tc2VxdWVuY2VdCithLCBiID0gMSAjIFt1bnBhY2tpbmctbm9uLXNlcXVlbmNlXQorYSwgYiA9IG5vbnNlcSAjIFt1bnBhY2tpbmctbm9uLXNlcXVlbmNlXQorYSwgYiA9IG5vbnNlcSgpICMgW3VucGFja2luZy1ub24tc2VxdWVuY2VdCithLCBiID0gbm9uc2VxX2Z1bmMgIyBbdW5wYWNraW5nLW5vbi1zZXF1ZW5jZV0KKworY2xhc3MgQ2xhc3NVbnBhY2tpbmcob2JqZWN0KToKKyAgICAiIiIgQ2hlY2sgdW5wYWNraW5nIGFzIGluc3RhbmNlIGF0dHJpYnV0ZXMuICIiIgorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICIiIiB0ZXN0IHVucGFja2luZyBpbiBpbnN0YW5jZSBhdHRyaWJ1dGVzLiAiIiIKKworICAgICAgICBzZWxmLmEsIHNlbGYuYiA9IDEsIDIKKyAgICAgICAgc2VsZi5hLCBzZWxmLmIgPSB7MTogMiwgMjogM30KKyAgICAgICAgc2VsZi5hLCBzZWxmLmIgPSAieHkiCisgICAgICAgIHNlbGYuYSwgYyA9ICJ4eSIKKyAgICAgICAgYywgc2VsZi5hID0gZ29vZF91bnBhY2tpbmcoKQorICAgICAgICBzZWxmLmEsIHNlbGYuYiA9IEl0ZXIoKQorCisgICAgICAgIHNlbGYuYSwgc2VsZi5iID0gTm9uU2VxKCkgIyBbdW5wYWNraW5nLW5vbi1zZXF1ZW5jZV0KKyAgICAgICAgc2VsZi5hLCBzZWxmLmIgPSBWYWx1ZUVycm9yICMgW3VucGFja2luZy1ub24tc2VxdWVuY2VdCisgICAgICAgIHNlbGYuYSwgYyA9IG5vbnNlcV9mdW5jICMgW3VucGFja2luZy1ub24tc2VxdWVuY2VdCisKK2NsYXNzIFRlc3RCYXNlKG9iamVjdCk6CisgICAgJ2Jhc2UgY2xhc3Mgd2l0aCBgdGVzdGAgbWV0aG9kIGltcGxlbWVudGF0aW9uJworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgdGVzdChkYXRhKToKKyAgICAgICAgJ2RlZmF1bHQgaW1wbGVtZW50YXRpb24nCisgICAgICAgIHJldHVybiBkYXRhCisKK2NsYXNzIFRlc3QoVGVzdEJhc2UpOgorICAgICdjaGlsZCBjbGFzcyB0aGF0IG92ZXJyaWRlcyBgdGVzdGAgbWV0aG9kJworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBubyBlcnJvciBzaG91bGQgYmUgZW1pdHRlZCBoZXJlIGFzIGB0ZXN0YCBpcyBvdmVycmlkZGVuIGluIHRoaXMgY2xhc3MKKyAgICAgICAgKHNlbGYuYWFhLCBzZWxmLmJiYiwgc2VsZi5jY2MpID0gc2VsZi50ZXN0KE5vbmUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHRlc3QoZGF0YSk6CisgICAgICAgICdvdmVycmlkZGVuIGltcGxlbWVudGF0aW9uJworICAgICAgICByZXR1cm4gKDEsIDIsIDMpCisKKworaW1wb3J0IHBsYXRmb3JtCisKKworZGVmIGZsb3dfY29udHJvbF9mYWxzZV9wb3NpdGl2ZSgpOgorICAgICMgVGhpcyB1c2VkIHRvIHRyaWdnZXIgYW4gdW5wYWNraW5nLW5vbi1zZXF1ZW5jZSBlcnJvci4gVGhlIHByb2JsZW0gd2FzCisgICAgIyBwYXJ0aWFsbHkgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0IHB5bGludCBkb2VzIG5vdCB1bmRlcnN0YW5kIGZsb3cgY29udHJvbCwKKyAgICAjIGJ1dCBub3cgaXQgZG9lcyBub3QgZW1pdCBhbnltb3JlLCBmb3IgdGhpcyBleGFtcGxlLCBkdWUgdG8gc2tpcHBpbmcgaXQgd2hlbgorICAgICMgZGV0ZXJtaW5pbmcgYW4gaW5mZXJlbmNlIG9mIG11bHRpcGxlIHBvdGVudGlhbCB2YWx1ZXMuCisgICAgIyBJbiBhbnkgY2FzZSwgaXQgaXMgZ29vZCBoYXZpbmcgdGhpcyByZXBybyBhcyBhIHRlc3QuCisgICAgc3lzdGVtLCBub2RlLCByZWxlYXNlLCB2ZXJzaW9uLCBtYWNoaW5lLCBwcm9jZXNzb3IgPSBwbGF0Zm9ybS51bmFtZSgpCisgICAgIyBUaGUgcHJldmlvdXMgbGluZSByYWlzZXMgVzA2MzMKKyAgICByZXR1cm4gc3lzdGVtLCBub2RlLCByZWxlYXNlLCB2ZXJzaW9uLCBtYWNoaW5lLCBwcm9jZXNzb3IKKworCitkZWYgZmxvd19jb250cm9sX3VucGFja2luZyh2YXI9Tm9uZSk6CisgICAgaWYgdmFyIGlzIG5vdCBOb25lOgorICAgICAgICB2YXIwLCB2YXIxID0gdmFyCisgICAgICAgIHJldHVybiB2YXIwLCB2YXIxCisgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfbm9uX3NlcXVlbmNlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnBhY2tpbmdfbm9uX3NlcXVlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMyYmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucGFja2luZ19ub25fc2VxdWVuY2UudHh0CkBAIC0wLDAgKzEsMTAgQEAKK3VucGFja2luZy1ub24tc2VxdWVuY2U6Nzc6MDo6QXR0ZW1wdGluZyB0byB1bnBhY2sgYSBub24tc2VxdWVuY2UgZGVmaW5lZCBhdCBsaW5lIDc0Cit1bnBhY2tpbmctbm9uLXNlcXVlbmNlOjc4OjA6OkF0dGVtcHRpbmcgdG8gdW5wYWNrIGEgbm9uLXNlcXVlbmNlCit1bnBhY2tpbmctbm9uLXNlcXVlbmNlOjc5OjA6OkF0dGVtcHRpbmcgdG8gdW5wYWNrIGEgbm9uLXNlcXVlbmNlIE5vbmUKK3VucGFja2luZy1ub24tc2VxdWVuY2U6ODA6MDo6QXR0ZW1wdGluZyB0byB1bnBhY2sgYSBub24tc2VxdWVuY2UgMQordW5wYWNraW5nLW5vbi1zZXF1ZW5jZTo4MTowOjpBdHRlbXB0aW5nIHRvIHVucGFjayBhIG5vbi1zZXF1ZW5jZSBkZWZpbmVkIGF0IGxpbmUgOSBvZiBmdW5jdGlvbmFsLnUudW5wYWNraW5nCit1bnBhY2tpbmctbm9uLXNlcXVlbmNlOjgyOjA6OkF0dGVtcHRpbmcgdG8gdW5wYWNrIGEgbm9uLXNlcXVlbmNlIGRlZmluZWQgYXQgbGluZSAxMSBvZiBmdW5jdGlvbmFsLnUudW5wYWNraW5nCit1bnBhY2tpbmctbm9uLXNlcXVlbmNlOjgzOjA6OkF0dGVtcHRpbmcgdG8gdW5wYWNrIGEgbm9uLXNlcXVlbmNlCit1bnBhY2tpbmctbm9uLXNlcXVlbmNlOjk4Ojg6Q2xhc3NVbnBhY2tpbmcudGVzdDpBdHRlbXB0aW5nIHRvIHVucGFjayBhIG5vbi1zZXF1ZW5jZSBkZWZpbmVkIGF0IGxpbmUgNzQKK3VucGFja2luZy1ub24tc2VxdWVuY2U6OTk6ODpDbGFzc1VucGFja2luZy50ZXN0OkF0dGVtcHRpbmcgdG8gdW5wYWNrIGEgbm9uLXNlcXVlbmNlCit1bnBhY2tpbmctbm9uLXNlcXVlbmNlOjEwMDo4OkNsYXNzVW5wYWNraW5nLnRlc3Q6QXR0ZW1wdGluZyB0byB1bnBhY2sgYSBub24tc2VxdWVuY2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnJlYWNoYWJsZS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnJlYWNoYWJsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNkZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucmVhY2hhYmxlLnB5CkBAIC0wLDAgKzEsMjIgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworZGVmIGZ1bmMxKCk6CisgICAgcmV0dXJuIDEKKyAgICBwcmludCgndW5yZWFjaGFibGUnKSAjIFt1bnJlYWNoYWJsZV0KKworZGVmIGZ1bmMyKCk6CisgICAgd2hpbGUgMToKKyAgICAgICAgYnJlYWsKKyAgICAgICAgcHJpbnQoJ3VucmVhY2hhYmxlJykgIyBbdW5yZWFjaGFibGVdCisKK2RlZiBmdW5jMygpOgorICAgIGZvciBpIGluICgxLCAyLCAzKToKKyAgICAgICAgcHJpbnQoaSkKKyAgICAgICAgY29udGludWUKKyAgICAgICAgcHJpbnQoJ3VucmVhY2hhYmxlJykgIyBbdW5yZWFjaGFibGVdCisKK2RlZiBmdW5jNCgpOgorICAgIHJhaXNlIEV4Y2VwdGlvbgorICAgIHJldHVybiAxIC8gMCAjIFt1bnJlYWNoYWJsZV0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnJlYWNoYWJsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5yZWFjaGFibGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDMzZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5yZWFjaGFibGUudHh0CkBAIC0wLDAgKzEsNCBAQAordW5yZWFjaGFibGU6Nzo0OmZ1bmMxOlVucmVhY2hhYmxlIGNvZGUKK3VucmVhY2hhYmxlOjEyOjg6ZnVuYzI6VW5yZWFjaGFibGUgY29kZQordW5yZWFjaGFibGU6MTg6ODpmdW5jMzpVbnJlYWNoYWJsZSBjb2RlCit1bnJlYWNoYWJsZToyMjo0OmZ1bmM0OlVucmVhY2hhYmxlIGNvZGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnJlY29nbml6ZWRfaW5saW5lX29wdGlvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnJlY29nbml6ZWRfaW5saW5lX29wdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTYzYjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucmVjb2duaXplZF9pbmxpbmVfb3B0aW9uLnB5CkBAIC0wLDAgKzEsMyBAQAorIyArMTogW3VucmVjb2duaXplZC1pbmxpbmUtb3B0aW9uXQorIyBweWxpbnQ6Ym91Ym91bGU9MQorIiIiQ2hlY2sgdW5rbm93biBvcHRpb24iIiINCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5yZWNvZ25pemVkX2lubGluZV9vcHRpb24udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucmVjb2duaXplZF9pbmxpbmVfb3B0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODkzNzMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VucmVjb2duaXplZF9pbmxpbmVfb3B0aW9uLnR4dApAQCAtMCwwICsxIEBACit1bnJlY29nbml6ZWQtaW5saW5lLW9wdGlvbjoyOjA6OlVucmVjb2duaXplZCBmaWxlIG9wdGlvbiAnYm91Ym91bGUnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2MzYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZS5weQpAQCAtMCwwICsxLDEyNyBAQAorIiIiCitDaGVja3MgdGhhdCB2YWx1ZSB1c2VkIGluIGEgc3Vic2NyaXB0IHN1cHBvcnRzIHN1YnNjcmlwdGlvbgorKGkuZS4gZGVmaW5lcyBfX2dldGl0ZW1fXyBtZXRob2QpLgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxwb2ludGxlc3Mtc3RhdGVtZW50LGV4cHJlc3Npb24tbm90LWFzc2lnbmVkLHdyb25nLWltcG9ydC1wb3NpdGlvbiwgdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbgorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbXBvcnQtZXJyb3IsaW52YWxpZC1uYW1lLHdyb25nLWltcG9ydC1vcmRlciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2ltcG9ydCBzaXgKKworIyBwcmltaXRpdmVzCitudW1iZXJzID0gWzEsIDIsIDNdCitudW1iZXJzWzBdCisiMTIzIlswXQordSIxMjMiWzBdCitiIjEyMyJbMF0KK2J5dGVhcnJheShiIjEyMyIpWzBdCitkaWN0KGE9MSwgYj0yKVsnYSddCisoMSwgMiwgMylbMF0KKworIyBsaXN0L2RpY3QgY29tcHJlaGVuc2lvbnMgYXJlIGZpbmUKK1t4IGZvciB4IGluIHJhbmdlKDEwKV1bMF0KK3t4OiAxMCAtIHggZm9yIHggaW4gcmFuZ2UoMTApfVswXQorCisKKyMgaW5zdGFuY2VzCitjbGFzcyBOb25TdWJzY3JpcHRhYmxlKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBTdWJzY3JpcHRhYmxlKG9iamVjdCk6CisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgKyBrZXkKKworTm9uU3Vic2NyaXB0YWJsZSgpWzBdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorTm9uU3Vic2NyaXB0YWJsZVswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK1N1YnNjcmlwdGFibGUoKVswXQorU3Vic2NyaXB0YWJsZVswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBnZW5lcmF0b3JzIGFyZSBub3Qgc3Vic2NyaXB0YWJsZQorZGVmIHBvd2Vyc19vZl90d28oKToKKyAgICBrID0gMAorICAgIHdoaWxlIGsgPCAxMDoKKyAgICAgICAgeWllbGQgMiAqKiBrCisgICAgICAgIGsgKz0gMQorCitwb3dlcnNfb2ZfdHdvKClbMF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCitwb3dlcnNfb2ZfdHdvWzBdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisKKyMgY2hlY2sgdGhhdCBwcmltaXRpdmUgbm9uIHN1YnNjcmlwdGFibGUgdHlwZXMgYXJlIGNhdWdodAorVHJ1ZVswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KK05vbmVbMF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCis4LjVbMF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisxMFswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBzZXRzIGFyZSBub3Qgc3Vic2NyaXB0YWJsZQore3ggKiogMiBmb3IgeCBpbiByYW5nZSgxMCl9WzBdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorc2V0KG51bWJlcnMpWzBdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorZnJvemVuc2V0KG51bWJlcnMpWzBdICAjIFt1bnN1YnNjcmlwdGFibGUtb2JqZWN0XQorCisjIHNraXAgaW5zdGFuY2VzIHdpdGggdW5rbm93biBiYXNlIGNsYXNzZXMKK2Zyb20gc29tZV9taXNzaW5nX21vZHVsZSBpbXBvcnQgTGliU3Vic2NyaXB0YWJsZQorCitjbGFzcyBNYXliZVN1YnNjcmlwdGFibGUoTGliU3Vic2NyaXB0YWJsZSk6CisgICAgcGFzcworCitNYXliZVN1YnNjcmlwdGFibGUoKVswXQorCisjIHN1YnNjcmlwdGFibGUgY2xhc3NlcyAodGhyb3VnaCBtZXRhY2xhc3NlcykKKworY2xhc3MgTWV0YVN1YnNjcmlwdGFibGUodHlwZSk6CisgICAgZGVmIF9fZ2V0aXRlbV9fKGNscywga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSArIGtleQorCitjbGFzcyBTdWJzY3JpcHRhYmxlQ2xhc3Moc2l4LndpdGhfbWV0YWNsYXNzKE1ldGFTdWJzY3JpcHRhYmxlLCBvYmplY3QpKToKKyAgICBwYXNzCisKK1N1YnNjcmlwdGFibGVDbGFzc1swXQorU3Vic2NyaXB0YWJsZUNsYXNzKClbMF0gICMgW3Vuc3Vic2NyaXB0YWJsZS1vYmplY3RdCisKKyMgZnVuY3Rpb25zIGFyZSBub3Qgc3Vic2NyaXB0YWJsZQorZGVmIHRlc3QoKmFyZ3MsICoqa3dhcmdzKToKKyAgICByZXR1cm4gYXJncywga3dhcmdzCisKK3Rlc3QoKVswXQordGVzdFswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworIyBkZXF1ZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2RlcSA9IGRlcXVlKG1heGxlbj0xMCkKK2RlcS5hcHBlbmQoNDIpCitkZXFbMF0KKworCitjbGFzcyBBYnN0cmFjdENsYXNzKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYWxhID0ge2kgZm9yIGkgaW4gcmFuZ2UoMTApfQorICAgICAgICBzZWxmLmJhbGEgPSBbaSBmb3IgaSBpbiByYW5nZSgxMCldCisgICAgICAgIHNlbGYucG9ydG9jYWxhID0gTm9uZQorCisgICAgZGVmIHRlc3RfdW5zdWJzY3JpcHRhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmJhbGFbMF0KKyAgICAgICAgc2VsZi5wb3J0b2NhbGFbMF0KKworCitjbGFzcyBDbGFzc01peGluKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYWxhID0ge2kgZm9yIGkgaW4gcmFuZ2UoMTApfQorICAgICAgICBzZWxmLmJhbGEgPSBbaSBmb3IgaSBpbiByYW5nZSgxMCldCisgICAgICAgIHNlbGYucG9ydG9jYWxhID0gTm9uZQorCisgICAgZGVmIHRlc3RfdW5zdWJzY3JpcHRhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmJhbGFbMF0KKyAgICAgICAgc2VsZi5wb3J0b2NhbGFbMF0KKworCitkZWYgcmV0dXJuX2FuX2ludChwYXJhbSk6CisgICAgIiIiUmV0dXJucyBhbiBpbnQiIiIKKyAgICBpZiBwYXJhbSA9PSAwOgorICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisKKworZGVmIHRlc3Rfb25lKHBhcmFtKToKKyAgICAiIiJTaG91bGQgY29tcGxhaW4gYWJvdXQgdmFyX29uZVswXSwgYnV0IGRvZXNuJ3QiIiIKKyAgICB2YXJfb25lID0gcmV0dXJuX2FuX2ludChwYXJhbSkKKyAgICByZXR1cm4gdmFyX29uZVswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1YnNjcmlwdGFibGVfdmFsdWUucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGVlOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorcmVxdWlyZXMgPSBzaXgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1YnNjcmlwdGFibGVfdmFsdWUudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZTA1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1YnNjcmlwdGFibGVfdmFsdWUudHh0CkBAIC0wLDAgKzEsMTUgQEAKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MzI6MDo6VmFsdWUgJ05vblN1YnNjcmlwdGFibGUoKScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjMzOjA6OlZhbHVlICdOb25TdWJzY3JpcHRhYmxlJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6MzU6MDo6VmFsdWUgJ1N1YnNjcmlwdGFibGUnIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0NDowOjpWYWx1ZSAncG93ZXJzX29mX3R3bygpJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NDU6MDo6VmFsdWUgJ3Bvd2Vyc19vZl90d28nIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo0OTowOjpWYWx1ZSAnVHJ1ZScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjUwOjA6OlZhbHVlICdOb25lJyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTE6MDo6VmFsdWUgJzguNScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjUyOjA6OlZhbHVlICcxMCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU1OjA6OlZhbHVlICd7eCoqMiBmb3IgeCBpbiByYW5nZSgxMCl9JyBpcyB1bnN1YnNjcmlwdGFibGUKK3Vuc3Vic2NyaXB0YWJsZS1vYmplY3Q6NTY6MDo6VmFsdWUgJ3NldChudW1iZXJzKScgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjU3OjA6OlZhbHVlICdmcm96ZW5zZXQobnVtYmVycyknIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo3NzowOjpWYWx1ZSAnU3Vic2NyaXB0YWJsZUNsYXNzKCknIGlzIHVuc3Vic2NyaXB0YWJsZQordW5zdWJzY3JpcHRhYmxlLW9iamVjdDo4NDowOjpWYWx1ZSAndGVzdCcgaXMgdW5zdWJzY3JpcHRhYmxlCit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjEyNzoxMTp0ZXN0X29uZTpWYWx1ZSAndmFyX29uZScgaXMgdW5zdWJzY3JpcHRhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlX3B5MzcucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlX3B5MzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYmU2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1YnNjcmlwdGFibGVfdmFsdWVfcHkzNy5weQpAQCAtMCwwICsxLDE3IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWNsYXNzLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLHBvaW50bGVzcy1zdGF0ZW1lbnQsZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQKKyIiIgorQ2hlY2tzIHRoYXQgY2xhc3MgdXNlZCBpbiBhIHN1YnNjcmlwdCBzdXBwb3J0cyBzdWJzY3JpcHRpb24KKyhpLmUuIGRlZmluZXMgX19jbGFzc19nZXRpdGVtX18gbWV0aG9kKS4KKyIiIgoraW1wb3J0IHR5cGluZworCisKK2NsYXNzIFN1YnNjcmlwdGFibGU6CisKKyAgICBkZWYgX19jbGFzc19nZXRpdGVtX18oY2xzLCBwYXJhbXMpOgorICAgICAgICBwYXNzCisKK1N1YnNjcmlwdGFibGVbMF0KK1N1YnNjcmlwdGFibGUoKVswXSAgIyBbdW5zdWJzY3JpcHRhYmxlLW9iamVjdF0KKworYTogdHlwaW5nLkxpc3RbaW50XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZV9weTM3LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZV9weTM3LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2JiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlX3B5MzcucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My43CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdWJzY3JpcHRhYmxlX3ZhbHVlX3B5MzcudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZV9weTM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk1OTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3Vic2NyaXB0YWJsZV92YWx1ZV9weTM3LnR4dApAQCAtMCwwICsxIEBACit1bnN1YnNjcmlwdGFibGUtb2JqZWN0OjE1OjA6OlZhbHVlICdTdWJzY3JpcHRhYmxlKCknIGlzIHVuc3Vic2NyaXB0YWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2Fzc2lnbm1lbnRfb3BlcmF0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2Fzc2lnbm1lbnRfb3BlcmF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjU4NjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdXBwb3J0ZWQvdW5zdXBwb3J0ZWRfYXNzaWdubWVudF9vcGVyYXRpb24ucHkKQEAgLTAsMCArMSw5NCBAQAorIiIiCitDaGVja3MgdGhhdCB2YWx1ZSB1c2VkIGluIGEgc3Vic2NyaXB0IHN1cHBvcnQgYXNzaWdubWVudHMKKyhpLmUuIGRlZmluZXMgX19zZXRpdGVtX18gbWV0aG9kKS4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcscG9pbnRsZXNzLXN0YXRlbWVudCxleHByZXNzaW9uLW5vdC1hc3NpZ25lZCx3cm9uZy1pbXBvcnQtcG9zaXRpb24sdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbgorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbXBvcnQtZXJyb3IsaW52YWxpZC1uYW1lLHdyb25nLWltcG9ydC1vcmRlciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2ltcG9ydCBzaXgKKworIyBwcmltaXRpdmVzCitudW1iZXJzID0gWzEsIDIsIDNdCitudW1iZXJzWzBdID0gNDIKKworCitieXRlYXJyYXkoYiIxMjMiKVswXSA9IDQyCitkaWN0KGE9MSwgYj0yKVsnYSddID0gNDIKKygxLCAyLCAzKVswXSA9IDQyICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorCisjIGxpc3QvZGljdCBjb21wcmVoZW5zaW9ucyBhcmUgZmluZQorW3ggZm9yIHggaW4gcmFuZ2UoMTApXVswXSA9IDQyCit7eDogMTAgLSB4IGZvciB4IGluIHJhbmdlKDEwKX1bMF0gPSA0MgorCisKKyMgaW5zdGFuY2VzCitjbGFzcyBOb25TdWJzY3JpcHRhYmxlKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBTdWJzY3JpcHRhYmxlKG9iamVjdCk6CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICByZXR1cm4ga2V5ICsgdmFsdWUKKworTm9uU3Vic2NyaXB0YWJsZSgpWzBdID0gMjQgICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorTm9uU3Vic2NyaXB0YWJsZVswXSA9IDI0ICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorU3Vic2NyaXB0YWJsZSgpWzBdID0gMjQKK1N1YnNjcmlwdGFibGVbMF0gPSAyNCAjIFt1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbl0KKworIyBnZW5lcmF0b3JzIGFyZSBub3Qgc3Vic2NyaXB0YWJsZQorZGVmIHBvd2Vyc19vZl90d28oKToKKyAgICBrID0gMAorICAgIHdoaWxlIGsgPCAxMDoKKyAgICAgICAgeWllbGQgMiAqKiBrCisgICAgICAgIGsgKz0gMQorCitwb3dlcnNfb2ZfdHdvKClbMF0gPSA0MiAjIFt1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbl0KK3Bvd2Vyc19vZl90d29bMF0gPSA0MiAgIyBbdW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb25dCisKKworIyBjaGVjayB0aGF0IHByaW1pdGl2ZSBub24gc3Vic2NyaXB0YWJsZSB0eXBlcyBhcmUgY2F1Z2h0CitUcnVlWzBdID0gMjQgICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorTm9uZVswXSA9IDQyICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorOC41WzBdID0gMjQgIyBbdW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb25dCisxMFswXSA9IDI0ICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorCisjIHNldHMgYXJlIG5vdCBzdWJzY3JpcHRhYmxlCit7eCAqKiAyIGZvciB4IGluIHJhbmdlKDEwKX1bMF0gPSAyNCAjIFt1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbl0KK3NldChudW1iZXJzKVswXSA9IDI0ICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQorZnJvemVuc2V0KG51bWJlcnMpWzBdID0gNDIgIyBbdW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb25dCisKKyMgc2tpcCBpbnN0YW5jZXMgd2l0aCB1bmtub3duIGJhc2UgY2xhc3NlcworZnJvbSBzb21lX21pc3NpbmdfbW9kdWxlIGltcG9ydCBMaWJTdWJzY3JpcHRhYmxlCisKK2NsYXNzIE1heWJlU3Vic2NyaXB0YWJsZShMaWJTdWJzY3JpcHRhYmxlKToKKyAgICBwYXNzCisKK01heWJlU3Vic2NyaXB0YWJsZSgpWzBdID0gNDIKKworIyBzdWJzY3JpcHRhYmxlIGNsYXNzZXMgKHRocm91Z2ggbWV0YWNsYXNzZXMpCisKK2NsYXNzIE1ldGFTdWJzY3JpcHRhYmxlKHR5cGUpOgorICAgIGRlZiBfX3NldGl0ZW1fXyhjbHMsIGtleSwgdmFsdWUpOgorICAgICAgICByZXR1cm4ga2V5ICsgdmFsdWUKKworY2xhc3MgU3Vic2NyaXB0YWJsZUNsYXNzKHNpeC53aXRoX21ldGFjbGFzcyhNZXRhU3Vic2NyaXB0YWJsZSwgb2JqZWN0KSk6CisgICAgcGFzcworCitTdWJzY3JpcHRhYmxlQ2xhc3NbMF0gPSAyNAorU3Vic2NyaXB0YWJsZUNsYXNzKClbMF0gPSAyNCAjIFt1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbl0KKworIyBmdW5jdGlvbnMgYXJlIG5vdCBzdWJzY3JpcHRhYmxlCitkZWYgdGVzdCgqYXJncywgKiprd2FyZ3MpOgorICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKKwordGVzdCgpWzBdID0gMjQgIyBbdW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb25dCit0ZXN0WzBdID0gMjQgIyBbdW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb25dCisKKyMgZGVxdWUKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitkZXEgPSBkZXF1ZShtYXhsZW49MTApCitkZXEuYXBwZW5kKDQyKQorZGVxWzBdID0gNDIKKworIyB0dXBsZXMgYXNzaWdubWVudAordmFsdWVzID0gWzEsIDIsIDMsIDRdCisodmFsdWVzWzBdLCB2YWx1ZXNbMV0pID0gMywgNAorKHZhbHVlc1swXSwgU3Vic2NyaXB0YWJsZUNsYXNzKClbMF0pID0gNDIsIDQyICMgW3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2Fzc2lnbm1lbnRfb3BlcmF0aW9uLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2Fzc2lnbm1lbnRfb3BlcmF0aW9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGVlOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdXBwb3J0ZWQvdW5zdXBwb3J0ZWRfYXNzaWdubWVudF9vcGVyYXRpb24ucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCityZXF1aXJlcyA9IHNpeApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2Fzc2lnbm1lbnRfb3BlcmF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9hc3NpZ25tZW50X29wZXJhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU0ZThiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9hc3NpZ25tZW50X29wZXJhdGlvbi50eHQKQEAgLTAsMCArMSwxNyBAQAordW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb246MTY6MDo6JygxLCAyLCAzKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKK3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uOjMxOjA6OidOb25TdWJzY3JpcHRhYmxlKCknIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Cit1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbjozMjowOjonTm9uU3Vic2NyaXB0YWJsZScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKK3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uOjM0OjA6OidTdWJzY3JpcHRhYmxlJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudAordW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb246NDM6MDo6J3Bvd2Vyc19vZl90d28oKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKK3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uOjQ0OjA6Oidwb3dlcnNfb2ZfdHdvJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudAordW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb246NDg6MDo6J1RydWUnIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Cit1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbjo0OTowOjonTm9uZScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKK3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uOjUwOjA6Oic4LjUnIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Cit1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbjo1MTowOjonMTAnIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Cit1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbjo1NDowOjone3gqKjIgZm9yIHggaW4gcmFuZ2UoMTApfScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKK3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uOjU1OjA6OidzZXQobnVtYmVycyknIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Cit1bnN1cHBvcnRlZC1hc3NpZ25tZW50LW9wZXJhdGlvbjo1NjowOjonZnJvemVuc2V0KG51bWJlcnMpJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudAordW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb246NzY6MDo6J1N1YnNjcmlwdGFibGVDbGFzcygpJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudAordW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb246ODI6MDo6J3Rlc3QoKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKK3Vuc3VwcG9ydGVkLWFzc2lnbm1lbnQtb3BlcmF0aW9uOjgzOjA6Oid0ZXN0JyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudAordW5zdXBwb3J0ZWQtYXNzaWdubWVudC1vcGVyYXRpb246OTQ6MTI6OidTdWJzY3JpcHRhYmxlQ2xhc3MoKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9iaW5hcnlfb3BlcmF0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2JpbmFyeV9vcGVyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmZTFkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9iaW5hcnlfb3BlcmF0aW9uLnB5CkBAIC0wLDAgKzEsNjYgQEAKKyIiIlRlc3QgZm9yIHVuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb24uIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcyxwb2ludGxlc3Mtc3RhdGVtZW50DQorIyBweWxpbnQ6IGRpc2FibGU9ZXhwcmVzc2lvbi1ub3QtYXNzaWduZWQsIGludmFsaWQtbmFtZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UNCisNCisNCitpbXBvcnQgY29sbGVjdGlvbnMNCisNCisNCisxICsgImEiICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorMSAtIFtdICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorMSAqIHt9ICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorMSAvIGNvbGxlY3Rpb25zICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorMSAqKiAobGFtYmRhIHg6IHgpICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQore30gKiB7fSAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQ0KK3t9IC0ge30gIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0NCit7fSB8IHt9ICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQore30gPj4ge30gIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0NCitbXSArICgpICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorKCkgKyBbXSAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQ0KK1tdICogMi4wICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorKCkgKiAyLjAgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0NCisyLjAgPj4gMi4wICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorY2xhc3MgQShvYmplY3QpOg0KKyAgICBwYXNzDQorY2xhc3MgQihvYmplY3QpOg0KKyAgICBwYXNzDQorQSgpICsgQigpICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorY2xhc3MgQTEob2JqZWN0KToNCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOg0KKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkDQorDQorQTEoKSArIEExKCkgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0NCisNCitjbGFzcyBBMihvYmplY3QpOg0KKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6DQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQNCitjbGFzcyBCMihvYmplY3QpOg0KKyAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOg0KKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkDQorQTIoKSArIEIyKCkgIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0NCisNCitjbGFzcyBQYXJlbnQob2JqZWN0KToNCisgICAgcGFzcw0KK2NsYXNzIENoaWxkKFBhcmVudCk6DQorICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToNCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZA0KK0NoaWxkKCkgKyBQYXJlbnQoKSAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQ0KK2NsYXNzIEEzKG9iamVjdCk6DQorICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToNCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZA0KK2NsYXNzIEIzKEEzKToNCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToNCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZA0KK0EzKCkgKyBCMygpICMgW3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb25dDQorIyBBdWdtZW50ZWQNCitGRkYgPSAxDQorRkZGICs9IEEoKSAjIFt1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uXQ0KK1RUVCA9IDENCitUVFQgKz0gW10gIyBbdW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbl0NCisNCisNCisjIERvbid0IGVtaXQgZm9yIHRoaXMgY2FzZSBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQgdW5rbm93biBpcy4NCitmcm9tIHVua25vd24gaW1wb3J0IFVua25vd24NCitjbGFzcyBCYXNlKFVua25vd24pOg0KKyAgICBwYXNzDQorQmFzZSgpICogMjMNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdXBwb3J0ZWQvdW5zdXBwb3J0ZWRfYmluYXJ5X29wZXJhdGlvbi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9iaW5hcnlfb3BlcmF0aW9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMWNjZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdXBwb3J0ZWQvdW5zdXBwb3J0ZWRfYmluYXJ5X29wZXJhdGlvbi5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj00LjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9iaW5hcnlfb3BlcmF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9iaW5hcnlfb3BlcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGU0M2NiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2JpbmFyeV9vcGVyYXRpb24udHh0CkBAIC0wLDAgKzEsMjEgQEAKK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246OTo6InVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ2ludCcgYW5kICdzdHInIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTA6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIC06ICdpbnQnIGFuZCAnbGlzdCciDQordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoxMTo6InVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKjogJ2ludCcgYW5kICdkaWN0JyINCit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjEyOjoidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAvOiAnaW50JyBhbmQgJ21vZHVsZSciDQordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoxMzo6InVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKio6ICdpbnQnIGFuZCAnZnVuY3Rpb24nIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTQ6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICo6ICdkaWN0JyBhbmQgJ2RpY3QnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTU6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIC06ICdkaWN0JyBhbmQgJ2RpY3QnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTY6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHw6ICdkaWN0JyBhbmQgJ2RpY3QnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MTc6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yID4+OiAnZGljdCcgYW5kICdkaWN0JyINCit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjE4OjoidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciArOiAnbGlzdCcgYW5kICd0dXBsZSciDQordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjoxOTo6InVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ3R1cGxlJyBhbmQgJ2xpc3QnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MjA6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICo6ICdsaXN0JyBhbmQgJ2Zsb2F0JyINCit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjIxOjoidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAqOiAndHVwbGUnIGFuZCAnZmxvYXQnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MjI6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yID4+OiAnZmxvYXQnIGFuZCAnZmxvYXQnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246Mjc6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdBJyBhbmQgJ0InIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246MzI6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdBMScgYW5kICdBMSciDQordW5zdXBwb3J0ZWQtYmluYXJ5LW9wZXJhdGlvbjo0MDo6InVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ0EyJyBhbmQgJ0IyJyINCit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjQ3OjoidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciArOiAnQ2hpbGQnIGFuZCAnUGFyZW50JyINCit1bnN1cHBvcnRlZC1iaW5hcnktb3BlcmF0aW9uOjU0OjoidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciArOiAnQTMnIGFuZCAnQjMnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246NTc6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs9OiAnaW50JyBhbmQgJ0EnIg0KK3Vuc3VwcG9ydGVkLWJpbmFyeS1vcGVyYXRpb246NTk6OiJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs9OiAnaW50JyBhbmQgJ2xpc3QnIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2RlbGV0ZV9vcGVyYXRpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW5zdXBwb3J0ZWQvdW5zdXBwb3J0ZWRfZGVsZXRlX29wZXJhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI4ODJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2RlbGV0ZV9vcGVyYXRpb24ucHkKQEAgLTAsMCArMSw5NCBAQAorIiIiCitDaGVja3MgdGhhdCB2YWx1ZSB1c2VkIGluIGEgc3Vic2NyaXB0IHN1cHBvcnQgZGVsZXRpb24KKyhpLmUuIGRlZmluZXMgX19kZWxpdGVtX18gbWV0aG9kKS4KKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcscG9pbnRsZXNzLXN0YXRlbWVudCxleHByZXNzaW9uLW5vdC1hc3NpZ25lZCx3cm9uZy1pbXBvcnQtcG9zaXRpb24sdW5uZWNlc3NhcnktY29tcHJlaGVuc2lvbgorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcyxpbXBvcnQtZXJyb3IsaW52YWxpZC1uYW1lLHdyb25nLWltcG9ydC1vcmRlciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKK2ltcG9ydCBzaXgKKworIyBwcmltaXRpdmVzCitudW1iZXJzID0gWzEsIDIsIDNdCitkZWwgbnVtYmVyc1swXQorCisKK2RlbCBieXRlYXJyYXkoYiIxMjMiKVswXQorZGVsIGRpY3QoYT0xLCBiPTIpWydhJ10KK2RlbCAoMSwgMiwgMylbMF0gIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KKworIyBsaXN0L2RpY3QgY29tcHJlaGVuc2lvbnMgYXJlIGZpbmUKK2RlbCBbeCBmb3IgeCBpbiByYW5nZSgxMCldWzBdCitkZWwge3g6IDEwIC0geCBmb3IgeCBpbiByYW5nZSgxMCl9WzBdCisKKworIyBpbnN0YW5jZXMKK2NsYXNzIE5vblN1YnNjcmlwdGFibGUob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIFN1YnNjcmlwdGFibGUob2JqZWN0KToKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcGFzcworCitkZWwgTm9uU3Vic2NyaXB0YWJsZSgpWzBdICAjIFt1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uXQorZGVsIE5vblN1YnNjcmlwdGFibGVbMF0gIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KK2RlbCBTdWJzY3JpcHRhYmxlKClbMF0KK2RlbCBTdWJzY3JpcHRhYmxlWzBdICMgW3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb25dCisKKyMgZ2VuZXJhdG9ycyBhcmUgbm90IHN1YnNjcmlwdGFibGUKK2RlZiBwb3dlcnNfb2ZfdHdvKCk6CisgICAgayA9IDAKKyAgICB3aGlsZSBrIDwgMTA6CisgICAgICAgIHlpZWxkIDIgKiogaworICAgICAgICBrICs9IDEKKworZGVsIHBvd2Vyc19vZl90d28oKVswXSAjIFt1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uXQorZGVsIHBvd2Vyc19vZl90d29bMF0gICMgW3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb25dCisKKworIyBjaGVjayB0aGF0IHByaW1pdGl2ZSBub24gc3Vic2NyaXB0YWJsZSB0eXBlcyBhcmUgY2F1Z2h0CitkZWwgVHJ1ZVswXSAgIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KK2RlbCBOb25lWzBdICMgW3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb25dCitkZWwgOC41WzBdICMgW3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb25dCitkZWwgMTBbMF0gIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KKworIyBzZXRzIGFyZSBub3Qgc3Vic2NyaXB0YWJsZQorZGVsIHt4ICoqIDIgZm9yIHggaW4gcmFuZ2UoMTApfVswXSAjIFt1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uXQorZGVsIHNldChudW1iZXJzKVswXSAjIFt1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uXQorZGVsIGZyb3plbnNldChudW1iZXJzKVswXSAjIFt1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uXQorCisjIHNraXAgaW5zdGFuY2VzIHdpdGggdW5rbm93biBiYXNlIGNsYXNzZXMKK2Zyb20gc29tZV9taXNzaW5nX21vZHVsZSBpbXBvcnQgTGliU3Vic2NyaXB0YWJsZQorCitjbGFzcyBNYXliZVN1YnNjcmlwdGFibGUoTGliU3Vic2NyaXB0YWJsZSk6CisgICAgcGFzcworCitkZWwgTWF5YmVTdWJzY3JpcHRhYmxlKClbMF0KKworIyBzdWJzY3JpcHRhYmxlIGNsYXNzZXMgKHRocm91Z2ggbWV0YWNsYXNzZXMpCisKK2NsYXNzIE1ldGFTdWJzY3JpcHRhYmxlKHR5cGUpOgorICAgIGRlZiBfX2RlbGl0ZW1fXyhjbHMsIGtleSk6CisgICAgICAgIHBhc3MKKworY2xhc3MgU3Vic2NyaXB0YWJsZUNsYXNzKHNpeC53aXRoX21ldGFjbGFzcyhNZXRhU3Vic2NyaXB0YWJsZSwgb2JqZWN0KSk6CisgICAgcGFzcworCitkZWwgU3Vic2NyaXB0YWJsZUNsYXNzWzBdCitkZWwgU3Vic2NyaXB0YWJsZUNsYXNzKClbMF0gIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KKworIyBmdW5jdGlvbnMgYXJlIG5vdCBzdWJzY3JpcHRhYmxlCitkZWYgdGVzdCgqYXJncywgKiprd2FyZ3MpOgorICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKKworZGVsIHRlc3QoKVswXSAjIFt1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uXQorZGVsIHRlc3RbMF0gIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KKworIyBkZXF1ZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2RlcSA9IGRlcXVlKG1heGxlbj0xMCkKK2RlcS5hcHBlbmQoNDIpCitkZWwgZGVxWzBdCisKKyMgdHVwbGVzIGFzc2lnbm1lbnQKK3ZhbHVlcyA9IFsxLCAyLCAzLCA0XQorZGVsICh2YWx1ZXNbMF0sIHZhbHVlc1sxXSkKK2RlbCAodmFsdWVzWzBdLCBTdWJzY3JpcHRhYmxlQ2xhc3MoKVswXSkgIyBbdW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9kZWxldGVfb3BlcmF0aW9uLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2RlbGV0ZV9vcGVyYXRpb24ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4ZWU5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9kZWxldGVfb3BlcmF0aW9uLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorcmVxdWlyZXMgPSBzaXgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9kZWxldGVfb3BlcmF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnN1cHBvcnRlZC91bnN1cHBvcnRlZF9kZWxldGVfb3BlcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQ5MmViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3Vuc3VwcG9ydGVkL3Vuc3VwcG9ydGVkX2RlbGV0ZV9vcGVyYXRpb24udHh0CkBAIC0wLDAgKzEsMTcgQEAKK3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb246MTY6NDo6JygxLCAyLCAzKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCit1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uOjMxOjQ6OidOb25TdWJzY3JpcHRhYmxlKCknIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbgordW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbjozMjo0OjonTm9uU3Vic2NyaXB0YWJsZScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCit1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uOjM0OjQ6OidTdWJzY3JpcHRhYmxlJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24KK3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb246NDM6NDo6J3Bvd2Vyc19vZl90d28oKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCit1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uOjQ0OjQ6Oidwb3dlcnNfb2ZfdHdvJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24KK3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb246NDg6NDo6J1RydWUnIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbgordW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbjo0OTo0OjonTm9uZScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCit1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uOjUwOjQ6Oic4LjUnIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbgordW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbjo1MTo0OjonMTAnIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbgordW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbjo1NDo0Ojone3gqKjIgZm9yIHggaW4gcmFuZ2UoMTApfScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCit1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uOjU1OjQ6OidzZXQobnVtYmVycyknIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbgordW5zdXBwb3J0ZWQtZGVsZXRlLW9wZXJhdGlvbjo1Njo0OjonZnJvemVuc2V0KG51bWJlcnMpJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24KK3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb246NzY6NDo6J1N1YnNjcmlwdGFibGVDbGFzcygpJyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24KK3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb246ODI6NDo6J3Rlc3QoKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCit1bnN1cHBvcnRlZC1kZWxldGUtb3BlcmF0aW9uOjgzOjQ6Oid0ZXN0JyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24KK3Vuc3VwcG9ydGVkLWRlbGV0ZS1vcGVyYXRpb246OTQ6MTY6OidTdWJzY3JpcHRhYmxlQ2xhc3MoKScgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfYXJndW1lbnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9hcmd1bWVudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdlYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfYXJndW1lbnQucHkKQEAgLTAsMCArMSw4OSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworZGVmIHRlc3RfdW51c2VkKGZpcnN0LCBzZWNvbmQsIF9ub3RfdXNlZCk6ICMgW3VudXNlZC1hcmd1bWVudCwgdW51c2VkLWFyZ3VtZW50XQorICAgIHBhc3MKKworCitkZWYgdGVzdF9wcmVmaXhlZF93aXRoX2lnbm9yZWQoZmlyc3QsIGlnbm9yZWRfc2Vjb25kKToKKyAgICBmaXJzdCgpCisKKworZGVmIHRlc3RfcHJlZml4ZWRfd2l0aF91bnVzZWQoZmlyc3QsIHVudXNlZF9zZWNvbmQpOgorICAgIGZpcnN0KCkKKworIyBmb3IgU3ViLmluaGVyaXRlZCwgb25seSB0aGUgd2FybmluZyBmb3IgImFheSIgaXMgZGVzaXJlZC4KKyMgVGhlIHdhcm5pbmdzIGZvciAiYWFiIiBhbmQgImFhYyIgIGFyZSBtb3N0IGxpa2VseSBmYWxzZSBwb3NpdGl2ZXMgdGhvdWdoLAorIyBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGFub3RoZXIgc3ViY2xhc3MgdGhhdCBvdmVycmlkZXMgdGhlIHNhbWUgbWV0aG9kIGFuZCBkb2VzCisjIHVzZSB0aGUgYXJndW1lbnRzIChlZyBTdWIyKQorCisKK2NsYXNzIEJhc2Uob2JqZWN0KToKKyAgICAicGFyZW50IgorICAgIGRlZiBpbmhlcml0ZWQoc2VsZiwgYWFhLCBhYWIsIGFhYyk6CisgICAgICAgICJhYnN0cmFjdCBtZXRob2QiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworY2xhc3MgU3ViKEJhc2UpOgorICAgICJjaGlsZCAxIgorICAgIGRlZiBpbmhlcml0ZWQoc2VsZiwgYWFhLCBhYWIsIGFhYyk6CisgICAgICAgICJvdmVycmlkZGVuIG1ldGhvZCwgdGhvdWdoIGRvbid0IHVzZSBldmVyeSBhcmd1bWVudCIKKyAgICAgICAgcmV0dXJuIGFhYQorCisgICAgZGVmIG5ld21ldGhvZChzZWxmLCBhYXgsIGFheSk6ICAjIFt1bnVzZWQtYXJndW1lbnRdCisgICAgICAgICJhbm90aGVyIG1ldGhvZCwgd2FybmluZyBmb3IgYWF5IGRlc2lyZWQiCisgICAgICAgIHJldHVybiBzZWxmLCBhYXgKKworY2xhc3MgU3ViMihCYXNlKToKKyAgICAiY2hpbGQgMSIKKworICAgIGRlZiBpbmhlcml0ZWQoc2VsZiwgYWFhLCBhYWIsIGFhYyk6CisgICAgICAgICJvdmVycmlkZGVuIG1ldGhvZCwgdXNlIGV2ZXJ5IGFyZ3VtZW50IgorICAgICAgICByZXR1cm4gYWFhICsgYWFiICsgYWFjCisKK2RlZiBtZXRhZGF0YV9mcm9tX2RpY3Qoa2V5KToKKyAgICAiIiIKKyAgICBTaG91bGQgbm90IHJhaXNlIHVudXNlZC1hcmd1bWVudCBtZXNzYWdlIGJlY2F1c2Uga2V5IGlzCisgICAgdXNlZCBpbnNpZGUgY29tcHJlaGVuc2lvbiBkaWN0CisgICAgIiIiCisgICAgcmV0dXJuIHtrZXk6IHN0cih2YWx1ZSkgZm9yIGtleSwgdmFsdWUgaW4ga2V5Lml0ZW1zKCl9CisKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsIHByaW50LXN0YXRlbWVudCwgbWlzcGxhY2VkLWZ1dHVyZSx3cm9uZy1pbXBvcnQtcG9zaXRpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworCitkZWYgZnVuY3Rpb24oYXJnPTEpOiAgIyBbdW51c2VkLWFyZ3VtZW50XQorICAgICIiImlnbm9yZSBhcmciIiIKKworCitjbGFzcyBBQUFBKG9iamVjdCk6CisgICAgIiIiZHVtbXkgY2xhc3MiIiIKKworICAgIGRlZiBtZXRob2Qoc2VsZiwgYXJnKTogICMgW3VudXNlZC1hcmd1bWVudF0KKyAgICAgICAgIiIiZHVtbXkgbWV0aG9kIiIiCisgICAgICAgIHByaW50KHNlbGYpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICp1bnVzZWRfYXJncywgKip1bnVzZWRfa3dhcmdzKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNlbGVjdGVkKGNscywgKmFyZ3MsICoqa3dhcmdzKTogICMgW3VudXNlZC1hcmd1bWVudCwgdW51c2VkLWFyZ3VtZW50XQorICAgICAgICAiIiJjYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IHdoZW4gdGhlIHZvYmplY3QgaGFzIGJlZW4gc2VsZWN0ZWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gY2xzCisKKyAgICBkZWYgdXNpbmdfaW5uZXJfZnVuY3Rpb24oc2VsZiwgZXR5cGUsIHNpemU9MSk6CisgICAgICAgICIiInJldHVybiBhIGZha2UgcmVzdWx0IHNldCBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB0eXBlIiIiCisgICAgICAgIHJzZXQgPSBBQUFBKFsoJ0EnLCldKnNpemUsICclcyBYJyAlIGV0eXBlLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1bKGV0eXBlLCldKnNpemUpCisgICAgICAgIGRlZiBpbm5lcihyb3csIGNvbD0wLCBldHlwZT1ldHlwZSwgcmVxPXNlbGYsIHJzZXQ9cnNldCk6CisgICAgICAgICAgICAiIiJpbm5lciB1c2luZyBhbGwgaXRzIGFyZ3VtZW50IiIiCisgICAgICAgICAgICAjIHB5bGludDogZGlzYWJsZT1tYXliZS1uby1tZW1iZXIKKyAgICAgICAgICAgIHJldHVybiByZXEudnJlZy5ldHlwZV9jbGFzcyhldHlwZSkocmVxLCByc2V0LCByb3csIGNvbCkKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGUgPSBhdHRyaWJ1dGUtZGVmaW5lZC1vdXRzaWRlLWluaXQKKyAgICAgICAgcnNldC5nZXRfZW50aXR5ID0gaW5uZXIKKworY2xhc3MgQkJCQihvYmplY3QpOgorICAgICIiImR1bW15IGNsYXNzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKTogICMgW3VudXNlZC1hcmd1bWVudF0KKyAgICAgICAgIiIiQ29uc3RydWN0b3Igd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFNob3VsZCByYWlzZSBhIHdhcm5pbmciIiIKKyAgICAgICAgc2VsZi5zcGFtID0gMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfYXJndW1lbnQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfYXJndW1lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWQ0YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9hcmd1bWVudC50eHQKQEAgLTAsMCArMSw4IEBACit1bnVzZWQtYXJndW1lbnQ6MzoxNjp0ZXN0X3VudXNlZDpVbnVzZWQgYXJndW1lbnQgJ2ZpcnN0JwordW51c2VkLWFyZ3VtZW50OjM6MjM6dGVzdF91bnVzZWQ6VW51c2VkIGFyZ3VtZW50ICdzZWNvbmQnCit1bnVzZWQtYXJndW1lbnQ6MzI6Mjk6U3ViLm5ld21ldGhvZDpVbnVzZWQgYXJndW1lbnQgJ2FheSc6SU5GRVJFTkNFCit1bnVzZWQtYXJndW1lbnQ6NTQ6MTM6ZnVuY3Rpb246VW51c2VkIGFyZ3VtZW50ICdhcmcnCit1bnVzZWQtYXJndW1lbnQ6NjE6MjE6QUFBQS5tZXRob2Q6VW51c2VkIGFyZ3VtZW50ICdhcmcnOklORkVSRU5DRQordW51c2VkLWFyZ3VtZW50OjY4OjA6QUFBQS5zZWxlY3RlZDpVbnVzZWQgYXJndW1lbnQgJ2FyZ3MnOklORkVSRU5DRQordW51c2VkLWFyZ3VtZW50OjY4OjA6QUFBQS5zZWxlY3RlZDpVbnVzZWQgYXJndW1lbnQgJ2t3YXJncyc6SU5GRVJFTkNFCit1bnVzZWQtYXJndW1lbnQ6ODc6MjM6QkJCQi5fX2luaXRfXzpVbnVzZWQgYXJndW1lbnQgJ2FyZyc6SU5GRVJFTkNFCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9hcmd1bWVudF9weTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9hcmd1bWVudF9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwZmQ5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2FyZ3VtZW50X3B5My5weQpAQCAtMCwwICsxLDkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCisKK2RlZiBmdW5jKGZpcnN0LCAqLCBzZWNvbmQpOiAjIFt1bnVzZWQtYXJndW1lbnQsIHVudXNlZC1hcmd1bWVudF0KKyAgICBwYXNzCisKKworZGVmIG9ubHlfcmFpc2VzKGZpcnN0LCBzZWNvbmQ9NDIpOiAjIFt1bnVzZWQtYXJndW1lbnRdCisgICAgaWYgZmlyc3QgPT0gMjQ6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2FyZ3VtZW50X3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2FyZ3VtZW50X3B5My5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDkzYmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfYXJndW1lbnRfcHkzLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuMApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfYXJndW1lbnRfcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2FyZ3VtZW50X3B5My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkZGI1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2FyZ3VtZW50X3B5My50eHQKQEAgLTAsMCArMSwzIEBACit1bnVzZWQtYXJndW1lbnQ6Mzo5OmZ1bmM6VW51c2VkIGFyZ3VtZW50ICdmaXJzdCcKK3VudXNlZC1hcmd1bWVudDozOjE5OmZ1bmM6VW51c2VkIGFyZ3VtZW50ICdzZWNvbmQnCit1bnVzZWQtYXJndW1lbnQ6NzoyMzpvbmx5X3JhaXNlczpVbnVzZWQgYXJndW1lbnQgJ3NlY29uZCcKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTEucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9nbG9iYWxfdmFyaWFibGUxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzBjMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9nbG9iYWxfdmFyaWFibGUxLnB5CkBAIC0wLDAgKzEsMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKK1ZBUiA9ICdweWxpbnQnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9nbG9iYWxfdmFyaWFibGUyLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIyNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlMi5weQpAQCAtMCwwICsxLDIgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitWQVIgPSAncHlsaW50JyAgIyBbdW51c2VkLXZhcmlhYmxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlMi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTIucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjZDRhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTIucmMKQEAgLTAsMCArMSwyIEBACitbdmFyaWFibGVzXQorYWxsb3ctZ2xvYmFsLXVudXNlZC12YXJpYWJsZXM9bm8KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTIudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3MGFhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTIudHh0CkBAIC0wLDAgKzEgQEAKK3VudXNlZC12YXJpYWJsZToyOjA6OlVudXNlZCB2YXJpYWJsZSAnVkFSJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlMy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2Nzg5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2dsb2JhbF92YXJpYWJsZTMucHkKQEAgLTAsMCArMSw2IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworVkFSID0gJ3B5bGludCcKKworCitkZWYgZnVuYyhhcmd1bWVudCk6CisgICAgcmV0dXJuIFZBUiArIGFyZ3VtZW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9nbG9iYWxfdmFyaWFibGU0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY0OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlNC5weQpAQCAtMCwwICsxLDMgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitWQVIgPSAncHlsaW50JyAgIyBbdW51c2VkLXZhcmlhYmxlXQorVkFSID0gJ3B5bGludDInICAjIFt1bnVzZWQtdmFyaWFibGVdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9nbG9iYWxfdmFyaWFibGU0LnJjIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlNC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNkNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlNC5yYwpAQCAtMCwwICsxLDIgQEAKK1t2YXJpYWJsZXNdCithbGxvdy1nbG9iYWwtdW51c2VkLXZhcmlhYmxlcz1ubwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlNC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9nbG9iYWxfdmFyaWFibGU0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2U2ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfZ2xvYmFsX3ZhcmlhYmxlNC50eHQKQEAgLTAsMCArMSwyIEBACit1bnVzZWQtdmFyaWFibGU6MjowOjpVbnVzZWQgdmFyaWFibGUgJ1ZBUicKK3VudXNlZC12YXJpYWJsZTozOjA6OlVudXNlZCB2YXJpYWJsZSAnVkFSJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzJmMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnQucHkKQEAgLTAsMCArMSw2MyBAQAorIiIidW51c2VkIGltcG9ydCIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW5kZWZpbmVkLWFsbC12YXJpYWJsZSwgaW1wb3J0LWVycm9yLCBuby1hYnNvbHV0ZS1pbXBvcnQsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nLHdyb25nLWltcG9ydC1wb3NpdGlvbiwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UsIG11bHRpcGxlLWltcG9ydHMKK2ltcG9ydCB4bWwuZXRyZWUgICMgW3VudXNlZC1pbXBvcnRdCitpbXBvcnQgeG1sLnNheCAgIyBbdW51c2VkLWltcG9ydF0KK2ltcG9ydCBvcy5wYXRoIGFzIHRlc3QgICMgW3VudXNlZC1pbXBvcnRdCitmcm9tIHN5cyBpbXBvcnQgYXJndiBhcyB0ZXN0MiAgIyBbdW51c2VkLWltcG9ydF0KK2Zyb20gc3lzIGltcG9ydCBmbGFncyAgIyBbdW51c2VkLWltcG9ydF0KKyMgKzE6W3VudXNlZC1pbXBvcnQsdW51c2VkLWltcG9ydF0KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlLCBPcmRlcmVkRGljdCwgQ291bnRlcgoraW1wb3J0IHJlLCBodG1sLnBhcnNlciAgIyBbdW51c2VkLWltcG9ydF0KK0RBVEEgPSBDb3VudGVyKCkKKyMgcHlsaW50OiBkaXNhYmxlPXNlbGYtYXNzaWduaW5nLXZhcmlhYmxlCitmcm9tIGZha2UgaW1wb3J0IFNvbWVOYW1lLCBTb21lT3RoZXJOYW1lICAjIFt1bnVzZWQtaW1wb3J0XQorY2xhc3MgU29tZUNsYXNzKG9iamVjdCk6CisgICAgU29tZU5hbWUgPSBTb21lTmFtZSAjIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9sb2dpbGFiL3B5bGludC9pc3N1ZS80NzUKKyAgICBTb21lT3RoZXJOYW1lID0gMQorICAgIFNvbWVPdGhlck5hbWUgPSBTb21lT3RoZXJOYW1lCisKK2Zyb20gbmV2ZXIgaW1wb3J0IF9fYWxsX18KKyMgcHlsaW50OiBkaXNhYmxlPXdyb25nLWltcG9ydC1vcmRlcix1bmdyb3VwZWQtaW1wb3J0cworaW1wb3J0IHR5cGluZworZnJvbSB0eXBpbmcgaW1wb3J0IFRZUEVfQ0hFQ0tJTkcKKworCitpZiB0eXBpbmcuVFlQRV9DSEVDS0lORzoKKyAgICBpbXBvcnQgY29sbGVjdGlvbnMKK2lmIFRZUEVfQ0hFQ0tJTkc6CisgICAgaW1wb3J0IGl0ZXJ0b29scworCisKK2RlZiBnZXRfb3JkZXJlZF9kaWN0KCkgLT4gJ2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0JzoKKyAgICByZXR1cm4gW10KKworCitkZWYgZ2V0X2l0ZXJ0b29sc19vYmooKSAtPiAnaXRlcnRvb2xzLmNvdW50JzoKKyAgICByZXR1cm4gW10KKworZGVmIHVzZV9odG1sX3BhcnNlcigpIC0+ICdodG1sLnBhcnNlci5IVE1MUGFyc2VyJzoKKyAgICByZXR1cm4gaHRtbC5wYXJzZXIuSFRNTFBhcnNlcgorCisjIHB5bGludDogZGlzYWJsZT1taXNwbGFjZWQtZnV0dXJlCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IG9zICAjIFt1bnVzZWQtaW1wb3J0XQoraW1wb3J0IHN5cworCitjbGFzcyBOb25SZWdyKG9iamVjdCk6CisgICAgIiIiPz8/IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwcmludCgnaW5pdGlhbGl6ZWQnKQorCisgICAgZGVmIHN5cyhzZWxmKToKKyAgICAgICAgIiIic2hvdWxkIG5vdCBnZXQgc3lzIGZyb20gdGhlcmUuLi4iIiIKKyAgICAgICAgcHJpbnQoc2VsZiwgc3lzKQorCisgICAgZGVmIGR1bW15KHNlbGYsIHRydWMpOgorICAgICAgICAiIiJ5byIiIgorICAgICAgICByZXR1cm4gc2VsZiwgdHJ1YworCisgICAgZGVmIGJsb3Aoc2VsZik6CisgICAgICAgICIiInlvIiIiCisgICAgICAgIHByaW50KHNlbGYsICdibGlwJykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWM0MmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnQudHh0CkBAIC0wLDAgKzEsMTAgQEAKK3VudXNlZC1pbXBvcnQ6MzowOjpVbnVzZWQgaW1wb3J0IHhtbC5ldHJlZQordW51c2VkLWltcG9ydDo0OjA6OlVudXNlZCBpbXBvcnQgeG1sLnNheAordW51c2VkLWltcG9ydDo1OjA6OlVudXNlZCBvcy5wYXRoIGltcG9ydGVkIGFzIHRlc3QKK3VudXNlZC1pbXBvcnQ6NjowOjpVbnVzZWQgYXJndiBpbXBvcnRlZCBmcm9tIHN5cyBhcyB0ZXN0MgordW51c2VkLWltcG9ydDo3OjA6OlVudXNlZCBmbGFncyBpbXBvcnRlZCBmcm9tIHN5cwordW51c2VkLWltcG9ydDo5OjA6OlVudXNlZCBPcmRlcmVkRGljdCBpbXBvcnRlZCBmcm9tIGNvbGxlY3Rpb25zCit1bnVzZWQtaW1wb3J0Ojk6MDo6VW51c2VkIGRlcXVlIGltcG9ydGVkIGZyb20gY29sbGVjdGlvbnMKK3VudXNlZC1pbXBvcnQ6MTA6MDo6VW51c2VkIGltcG9ydCByZQordW51c2VkLWltcG9ydDoxMzowOjpVbnVzZWQgU29tZU90aGVyTmFtZSBpbXBvcnRlZCBmcm9tIGZha2UKK3VudXNlZC1pbXBvcnQ6NDU6MDo6VW51c2VkIGltcG9ydCBvcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X2Fzc2lnbmVkX3RvLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X2Fzc2lnbmVkX3RvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzM5YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfYXNzaWduZWRfdG8ucHkKQEAgLTAsMCArMSwyNSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGltcG9ydC1lcnJvciwgaW52YWxpZC1uYW1lCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLCBkaXNhbGxvd2VkLW5hbWUsIG5vLW1lbWJlciwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworaW1wb3J0IHV1aWQKKworIyBOb3RlIHRoaXMgaW1wb3J0IGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QKK2ltcG9ydCBmb28KKworZnJvbSAuYSBpbXBvcnQgeAorCisKK2NsYXNzIFkob2JqZWN0KToKKyAgICB4ID0geFswXQorCisKK2RlZiB0ZXN0KGRlZmF1bHQ9Tm9uZSk6CisgICAgcmV0dXJuIGRlZmF1bHQKKworCitjbGFzcyBCYXNlTW9kZWwob2JqZWN0KToKKyAgICB1dWlkID0gdGVzdChkZWZhdWx0PXV1aWQudXVpZDQpCisKKworY2xhc3MgYmFyKG9iamVjdCk6CisgICAgZm9vID0gZm9vLmJhegpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X2NsYXNzX2RlZl9rZXl3b3JkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X2NsYXNzX2RlZl9rZXl3b3JkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmI1OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfY2xhc3NfZGVmX2tleXdvcmQucHkKQEAgLTAsMCArMSwzOCBAQAorIiIiCitUZXN0IGZhbHNlLXBvc2l0aXZlIGZvciB1bnVzZWQtaW1wb3J0IG9uIGNsYXNzIGtleXdvcmQgYXJndW1lbnRzCisKKyAgICBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zMjAyCisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLHRvby1mZXctcHVibGljLW1ldGhvZHMsaW52YWxpZC1uYW1lLGltcG9ydC1lcnJvcgorCisjIEltcG9ydHMgZG9uJ3QgZXhpc3QhIE9ubHkgY2hlY2sgYHVudXNlZC1pbXBvcnRgCitmcm9tIGNvbnN0IGltcG9ydCBET01BSU4KK2Zyb20gY29uc3QgaW1wb3J0IERPTUFJTl8yCitmcm9tIGNvbnN0IGltcG9ydCBET01BSU5fMworCisKK2NsYXNzIENoaWxkOgorICAgIGRlZiBfX2luaXRfc3ViY2xhc3NfXyhjbHMsICoqa3dhcmdzKToKKyAgICAgICAgcGFzcworCitjbGFzcyBQYXJlbnQoQ2hpbGQsIGRvbWFpbj1ET01BSU4pOgorICAgIHBhc3MKKworCisjIEFsdGVybmF0aXZlIDEKK2NsYXNzIFBhcmVudF8yKENoaWxkLCBkb21haW49RE9NQUlOXzIpOgorICAgIERPTUFJTl8yID0gRE9NQUlOXzIKKworCisjIEFsdGVybmF0aXZlIDIKK2NsYXNzIEE6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgIHBhc3MKKworY2xhc3MgQjoKKyAgICBDT05GID0gIkhlbGxvIFdvcmxkIgorICAgIFNDSEVNQSA9IEEoYXJnPUNPTkYpCisKKworIyBUZXN0IG5vcm1hbCBpbnN0YW50aWF0aW9uCitBKGFyZz1ET01BSU5fMykKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydF9ldmVyeXRoaW5nX2Rpc2FibGVkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X2V2ZXJ5dGhpbmdfZGlzYWJsZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2Y2NlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydF9ldmVyeXRoaW5nX2Rpc2FibGVkLnB5CkBAIC0wLDAgKzEsOCBAQAorIiIiVGVzdCB0aGF0IHVudXNlZC1pbXBvcnQgaXMgbm90IGVtaXR0ZWQgaGVyZSB3aGVuIGV2ZXJ5dGhpbmcgZWxzZSBpcyBkaXNhYmxlZAorCitodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zNDQ1CisiIiIKK2Zyb20gb3MgaW1wb3J0IGVudmlyb24KKworZm9yIGssIHYgaW4gZW52aXJvbi5pdGVtcygpOgorICAgIHByaW50KGssIHYpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfZXZlcnl0aGluZ19kaXNhYmxlZC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydF9ldmVyeXRoaW5nX2Rpc2FibGVkLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Zjg5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfZXZlcnl0aGluZ19kaXNhYmxlZC5yYwpAQCAtMCwwICsxLDMgQEAKK1tNZXNzYWdlcyBDb250cm9sXQorZGlzYWJsZT1hbGwKK2VuYWJsZT11bnVzZWQtaW1wb3J0CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfcG9zaXRpb25hbF9vbmx5X3B5MzgucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfcG9zaXRpb25hbF9vbmx5X3B5MzgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzYTM3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydF9wb3NpdGlvbmFsX29ubHlfcHkzOC5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUZXN0IHRoYXQgcG9zaXRpb25hbCBvbmx5IGFyZ3VtZW50IGFubm90YXRpb25zIGFyZSBwcm9wZXJseSBtYXJrZWQgYXMgY29uc3VtZWQKKworaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMzQ2MgorIiIiCitmcm9tIHR5cGluZyBpbXBvcnQgQW55U3RyLCBTZXQKKworCitkZWYgZnVuYyhhcmc6IEFueVN0ciwgLywgYXJnMjogU2V0W3N0cl0pOgorICAgICIiIlVzZXMgcG9zaXRpb25hbCBvbmx5IGFyZ3VtZW50cyIiIgorICAgIHJldHVybiBhcmcsIGFyZzIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydF9wb3NpdGlvbmFsX29ubHlfcHkzOC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX2ltcG9ydF9wb3NpdGlvbmFsX29ubHlfcHkzOC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZjNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X3Bvc2l0aW9uYWxfb25seV9weTM4LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuOApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X3B5MzAucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfcHkzMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZlZDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X3B5MzAucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiY2hlY2sgdW51c2VkIGltcG9ydCBmb3IgbWV0YWNsYXNzZXMiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMsd3JvbmctaW1wb3J0LXBvc2l0aW9uLHVuZ3JvdXBlZC1pbXBvcnRzCitfX3JldmlzaW9uX18gPSAxCitpbXBvcnQgYWJjCitpbXBvcnQgc3lzCitmcm9tIGFiYyBpbXBvcnQgQUJDTWV0YQorZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEgYXMgU29tZXRoaW5nRWxzZSAgIyBbcmVpbXBvcnRlZF0KKworY2xhc3MgTWV0YShtZXRhY2xhc3M9YWJjLkFCQ01ldGEpOgorICAgICIiIiBUZXN0ICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kYXRhID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgc2VsZi50ZXN0ID0gYWJjCisKK2NsYXNzIE1ldGEyKG1ldGFjbGFzcz1BQkNNZXRhKToKKyAgICAiIiIgVGVzdCAiIiIKKworY2xhc3MgTWV0YTMobWV0YWNsYXNzPVNvbWV0aGluZ0Vsc2UpOgorICAgICIiIiB0ZXN0ICIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X3B5MzAudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfaW1wb3J0X3B5MzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmZmNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9pbXBvcnRfcHkzMC50eHQKQEAgLTAsMCArMSBAQAorcmVpbXBvcnRlZDo3OjA6OlJlaW1wb3J0ICdBQkNNZXRhJyAoaW1wb3J0ZWQgbGluZSA2KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfbmFtZV9mcm9tX3dpbGNhcmRfaW1wb3J0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfbmFtZV9mcm9tX3dpbGNhcmRfaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjViNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9uYW1lX2Zyb21fd2lsY2FyZF9pbXBvcnQucHkKQEAgLTAsMCArMSwzIEBACisiIiJjaGVjayB1bnVzZWQgaW1wb3J0IGZyb20gYSB3aWxkY2FyZCBpbXBvcnQiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydCxsaW5lLXRvby1sb25nCitmcm9tIC51bnVzZWRfYXJndW1lbnRfcHkzIGltcG9ydCAqICAjIFt1bnVzZWQtd2lsZGNhcmQtaW1wb3J0LCB1bnVzZWQtd2lsZGNhcmQtaW1wb3J0LCB3aWxkY2FyZC1pbXBvcnRdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9uYW1lX2Zyb21fd2lsY2FyZF9pbXBvcnQudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfbmFtZV9mcm9tX3dpbGNhcmRfaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc2MjhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfbmFtZV9mcm9tX3dpbGNhcmRfaW1wb3J0LnR4dApAQCAtMCwwICsxLDMgQEAKK3VudXNlZC13aWxkY2FyZC1pbXBvcnQ6MzowOjpVbnVzZWQgaW1wb3J0IGZ1bmMgZnJvbSB3aWxkY2FyZCBpbXBvcnQKK3VudXNlZC13aWxkY2FyZC1pbXBvcnQ6MzowOjpVbnVzZWQgaW1wb3J0IG9ubHlfcmFpc2VzIGZyb20gd2lsZGNhcmQgaW1wb3J0Cit3aWxkY2FyZC1pbXBvcnQ6MzowOjpXaWxkY2FyZCBpbXBvcnQgdW51c2VkX2FyZ3VtZW50X3B5MwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfcHJpdmF0ZV9tZW1iZXIucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9wcml2YXRlX21lbWJlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjU0Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfcHJpdmF0ZV9tZW1iZXIucHkKQEAgLTAsMCArMSw2OCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZSwgdG9vLWZldy1wdWJsaWMtbWV0aG9kcywgbm8tc2VsZi11c2UsIGxpbmUtdG9vLWxvbmcsIHVudXNlZC1hcmd1bWVudCwgcHJvdGVjdGVkLWFjY2VzcworCitjbGFzcyBBbm90aGVyQ2xhc3MoKToKKyAgICBkZWYgX190ZXN0KHNlbGYpOiAgIyBbdW51c2VkLXByaXZhdGUtbWVtYmVyXQorICAgICAgICBwYXNzCisKK2NsYXNzIEhhc1VudXNlZEluQ2xhc3MoKToKKyAgICBfX215X3NlY3JldCA9ICJJIGhhdmUgbm8gc2VjcmV0cyIgICMgW3VudXNlZC1wcml2YXRlLW1lbWJlcl0KKyAgICBfX215X3VzZWRfc2VjcmV0ID0gIkkgaGF2ZSBubyBzZWNyZXRzIHVudXNlZCIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3ByaXZhdGVfY2xhc3NfbWV0aG9kX3VudXNlZChjbHMpOiAgIyBbdW51c2VkLXByaXZhdGUtbWVtYmVyXQorICAgICAgICBwcmludChjbHMuX19teV91c2VkX3NlY3JldCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3ByaXZhdGVfY2xhc3NfbWV0aG9kX3VzZWQoY2xzKToKKyAgICAgICAgcGFzcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfX3ByaXZhdGVfc3RhdGljX21ldGhvZF91bnVzZWQoKTogICMgW3VudXNlZC1wcml2YXRlLW1lbWJlcl0KKyAgICAgICAgcGFzcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfX3ByaXZhdGVfc3RhdGljX21ldGhvZF91c2VkKCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKTogICMgV2lsbCBub3QgdHJpZ2dlciBhcyBpdCBiZWdpbnMgd2l0aCBfXyBhbmQgZW5kcyB3aXRoIF9fCisgICAgICAgIHNlbGYuX19pbnN0YW5jZV9zZWNyZXQgPSAiSSB3aWxsIG5ldmVyIGJlIGluaXRpYWxpemVkIiAgIyBbdW51c2VkLXByaXZhdGUtbWVtYmVyXQorICAgICAgICBzZWxmLl9fYW5vdGhlcl9zZWNyZXQgPSAiaGVsbG8gd29ybGQiCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKTogICMgV2lsbCBub3QgdHJpZ2dlciBhcyBpdCBiZWdpbnMgd2l0aCBfXyBhbmQgZW5kcyB3aXRoIF9fCisgICAgICAgIHJldHVybiAiaGVsbG8iCisKKyAgICBkZWYgX190ZXN0KHNlbGYsIHgsIHksIHopOiAgIyBbdW51c2VkLXByaXZhdGUtbWVtYmVyXQorICAgICAgICBmbiA9IEhhc1VudXNlZEluQ2xhc3MuX19wcml2YXRlX2NsYXNzX21ldGhvZF91c2VkCisgICAgICAgIGZuKCkKKyAgICAgICAgZm4yID0gSGFzVW51c2VkSW5DbGFzcy5fX3ByaXZhdGVfc3RhdGljX21ldGhvZF91c2VkCisgICAgICAgIGZuMigpCisKKyAgICBkZWYgX19teV9wcmludChzZWxmLCBzdHJpbmcpOgorICAgICAgICBwcmludChzZWxmLl9fYW5vdGhlcl9zZWNyZXQgKyBzdHJpbmcpCisgICAgICAgIGFub3RoZXJfb2JqID0gQW5vdGhlckNsYXNzKCkKKyAgICAgICAgYW5vdGhlcl9vYmouX190ZXN0KCkgICMgdGhpcyBjbGFzcydzIHRlc3Qgc2hvdWxkIHN0aWxsIGJlIHVudXNlZAorCisgICAgZGVmIGhleShzZWxmKTogICMgV2lsbCBub3QgdHJpZ2dlciBhcyBpdCBkb2VzIG5vdCBiZWdpbiB3aXRoIF9fCisgICAgICAgIHNlbGYuX19teV9wcmludCgiISIpCisKKyAgICBkZWYgX190ZXN0X2ZuX2FzX3ZhcihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGFzc2lnbl9mbl90b192YXIoc2VsZik6CisgICAgICAgIGZuID0gc2VsZi5fX3Rlc3RfZm5fYXNfdmFyCisgICAgICAgIGZuKCkKKworICAgIGRlZiBfX3Rlc3RfcmVjdXJzaXZlKHNlbGYpOiAgIyBbdW51c2VkLXByaXZhdGUtbWVtYmVyXQorICAgICAgICBzZWxmLl9fdGVzdF9yZWN1cnNpdmUoKQorCisjIEZhbHNlIHBvc2l0aXZlOiBTaW5nbGV0b24gUGF0dGVybgorY2xhc3MgTXlDbHM6CisgICAgX19jbGFzc192YXIgPSBOb25lCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0X2NsYXNzX3ZhcihjbHMsIHZhcik6CisgICAgICAgIGNscy5fX2NsYXNzX3ZhciA9IHZhciAgIyBzaG91bGQgbm90IGVtaXQgYSBtZXNzYWdlLCB1c2VkIGluIGdldF9jbGFzc192YXIoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGdldF9jbGFzc192YXIoY2xzKToKKyAgICAgICAgcmV0dXJuIGNscy5fX2NsYXNzX3ZhcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfcHJpdmF0ZV9tZW1iZXIudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfcHJpdmF0ZV9tZW1iZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWE0NWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF9wcml2YXRlX21lbWJlci50eHQKQEAgLTAsMCArMSw3IEBACit1bnVzZWQtcHJpdmF0ZS1tZW1iZXI6NDo0OkFub3RoZXJDbGFzcy5fX3Rlc3Q6VW51c2VkIHByaXZhdGUgbWVtYmVyIGBBbm90aGVyQ2xhc3MuX190ZXN0KHNlbGYpYAordW51c2VkLXByaXZhdGUtbWVtYmVyOjg6NDpIYXNVbnVzZWRJbkNsYXNzOlVudXNlZCBwcml2YXRlIG1lbWJlciBgSGFzVW51c2VkSW5DbGFzcy5fX215X3NlY3JldGAKK3VudXNlZC1wcml2YXRlLW1lbWJlcjoxMjo0Okhhc1VudXNlZEluQ2xhc3MuX19wcml2YXRlX2NsYXNzX21ldGhvZF91bnVzZWQ6VW51c2VkIHByaXZhdGUgbWVtYmVyIGBIYXNVbnVzZWRJbkNsYXNzLl9fcHJpdmF0ZV9jbGFzc19tZXRob2RfdW51c2VkKGNscylgCit1bnVzZWQtcHJpdmF0ZS1tZW1iZXI6MjA6NDpIYXNVbnVzZWRJbkNsYXNzLl9fcHJpdmF0ZV9zdGF0aWNfbWV0aG9kX3VudXNlZDpVbnVzZWQgcHJpdmF0ZSBtZW1iZXIgYEhhc1VudXNlZEluQ2xhc3MuX19wcml2YXRlX3N0YXRpY19tZXRob2RfdW51c2VkKClgCit1bnVzZWQtcHJpdmF0ZS1tZW1iZXI6Mjg6ODpIYXNVbnVzZWRJbkNsYXNzLl9faW5pdF9fOlVudXNlZCBwcml2YXRlIG1lbWJlciBgSGFzVW51c2VkSW5DbGFzcy5fX2luc3RhbmNlX3NlY3JldGAKK3VudXNlZC1wcml2YXRlLW1lbWJlcjozNDo0Okhhc1VudXNlZEluQ2xhc3MuX190ZXN0OlVudXNlZCBwcml2YXRlIG1lbWJlciBgSGFzVW51c2VkSW5DbGFzcy5fX3Rlc3Qoc2VsZiwgeCwgeSwgeilgCit1bnVzZWQtcHJpdmF0ZS1tZW1iZXI6NTU6NDpIYXNVbnVzZWRJbkNsYXNzLl9fdGVzdF9yZWN1cnNpdmU6VW51c2VkIHByaXZhdGUgbWVtYmVyIGBIYXNVbnVzZWRJbkNsYXNzLl9fdGVzdF9yZWN1cnNpdmUoc2VsZilgCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF90eXBpbmdfaW1wb3J0cy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX3R5cGluZ19pbXBvcnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTRlNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF90eXBpbmdfaW1wb3J0cy5weQpAQCAtMCwwICsxLDg1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworIiIiUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8xMTY4CisKK1RoZSBwcm9ibGVtIHdhcyB0aGF0IHdlIHdlcmVuJ3QgaGFuZGxpbmcga2V5d29yZC1vbmx5IGFyZ3VtZW50cyBhbm5vdGF0aW9ucywKK3doaWNoIG1lYW5zIHdlIHdlcmUgbmV2ZXIgcHJvY2Vzc2luZyB0aGVtLgorIiIiCisKK2ltcG9ydCByZQoraW1wb3J0IHR5cGluZworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ291bnRlciBhcyBDb2xsZWN0aW9uQ291bnRlcgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCitmcm9tIHR5cGluZyBpbXBvcnQgKAorICAgIEFueSwKKyAgICBDYWxsYWJsZSwKKyAgICBJdGVyYWJsZSwKKyAgICBMaXN0LAorICAgIE5hbWVkVHVwbGUsCisgICAgT3B0aW9uYWwsCisgICAgUGF0dGVybiwKKyAgICBTZXF1ZW5jZSwKKyAgICBTZXQsCisgICAgVHVwbGUsCispCisKKworZGVmIGZ1bmMxKGFyZzogT3B0aW9uYWxbQ2FsbGFibGVdPU5vbmUpOgorICAgIHJldHVybiBhcmcKKworCitkZWYgZnVuYzIoKiwgYXJnOiBPcHRpb25hbFtJdGVyYWJsZV09Tm9uZSk6CisgICAgcmV0dXJuIGFyZworCisKK1NPTUVfVkFMVUUgPSBbMV0gIyB0eXBlOiBMaXN0W0FueV0KK2ZvciBWQUxVRSBpbiBbWzFdLCBbMl0sIFszXV06ICAjIHR5cGU6IFR1cGxlW0FueV0KKyAgICBwcmludChWQUxVRSkKKworCitjbGFzcyBDb250ZXh0TWFuYWdlcjoKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gezF9CisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKl9hcmdzKToKKyAgICAgICAgcGFzcworCisKK3dpdGggQ29udGV4dE1hbmFnZXIoKSBhcyBTT01FX0RJQ1Q6ICMgdHlwZTogU2V0W2ludF0KKyAgICBwcmludChTT01FX0RJQ1QpCisKKworZGVmIGZ1bmNfdGVzdF90eXBlX2NvbW1lbnQocGFyYW0pOgorICAgICMgdHlwZTogKE5hbWVkVHVwbGUpIC0+IFR1cGxlW05hbWVkVHVwbGUsIFBhdHRlcm5dCisgICAgcmV0dXJuIHBhcmFtLCByZS5jb21waWxlKCdnb29kJykKKworCitkZWYgdHlwaW5nX2Z1bGx5X3F1YWxpZmllZCgpOgorICAgIHZhcmlhYmxlID0gTm9uZSAgIyB0eXBlOiB0eXBpbmcuT3B0aW9uYWxbc3RyXQorICAgIG90aGVyX3ZhcmlhYmxlOiAndHlwaW5nLk9wdGlvbmFsW3N0cl0nID0gTm9uZQorICAgIHJldHVybiB2YXJpYWJsZSwgb3RoZXJfdmFyaWFibGUKKworCitkZWYgZnVuY3Rpb24oYXJnMSwgICMgdHlwZTogSXRlcmFibGUKKyAgICAgICAgICAgICBhcmcyICAjIHR5cGU6IExpc3QKKyAgICAgICAgICAgICk6CisgICAgIyB0eXBlOiAoLi4uKSAtPiBTZXF1ZW5jZQorICAgICIiImRvY3N0cmluZyIiIgorICAgIHByaW50KGFyZzEsIGFyZzIpCisKKworZGVmIG1hZ2ljKGFscGhhLCBiZXRhLCBnYW1tYSk6CisgICAgIyB0eXBlOiAoc3RyLCBPcHRpb25hbFtzdHJdLCBPcHRpb25hbFtkYXRldGltZV0pIC0+IEFueQorICAgICIiImdvaW5nIHN0cm9uZyIiIgorICAgIHJldHVybiBhbHBoYSwgYmV0YSwgZ2FtbWEKKworCitkZWYgdW51c2VkX2Fzc2lnbm1lbnRfaW1wb3J0KCk6CisgICAgZm9vX29yX2JhciA9IDQyICAjIHR5cGU6IGRlZmF1bHRkaWN0CisgICAgcmV0dXJuIGZvb19vcl9iYXIKKworCitkZWYgdW51c2VkX3JlYXNzaWduZWRfaW1wb3J0KGNvdW50ZXIpOgorICAgICMgdHlwZTogKENvbGxlY3Rpb25Db3VudGVyKSAtPiBpbnQKKyAgICBwcmludChjb3VudGVyKQorICAgIHJldHVybiA0MgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfdHlwaW5nX2ltcG9ydHMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF90eXBpbmdfaW1wb3J0cy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM5ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfdHlwaW5nX2ltcG9ydHMucmMKQEAgLTAsMCArMSwzIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My42CitleGNlcHRfaW1wbGVtZW50YXRpb25zPVB5UHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX3ZhcmlhYmxlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfdmFyaWFibGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjNDA4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX3ZhcmlhYmxlLnB5CkBAIC0wLDAgKzEsMTU5IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lLCB0b28tZmV3LXB1YmxpYy1tZXRob2RzLCBuby1zZWxmLXVzZSwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UsaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwsIGZpeG1lCisKK2RlZiB0ZXN0X3JlZ3Jlc3Npb25fNzM3KCk6CisgICAgaW1wb3J0IHhtbCAjIFt1bnVzZWQtaW1wb3J0XQorCitkZWYgdGVzdF9yZWdyZXNzaW9uXzkyMygpOgorICAgIGltcG9ydCB1bml0dGVzdC5jYXNlICAjIFt1bnVzZWQtaW1wb3J0XQorICAgIGltcG9ydCB4bWwgYXMgc3FsICMgW3VudXNlZC1pbXBvcnRdCisKK2RlZiB0ZXN0X3VudXNlZF93aXRoX3ByZXBlbmRlZF91bmRlcnNjb3JlKCk6CisgICAgX2ZvbyA9IDQyCisgICAgXyA9IDI0CisgICAgX19hID0gMjQKKyAgICBkdW1teSA9IDI0CisgICAgX2FfID0gNDIgIyBbdW51c2VkLXZhcmlhYmxlXQorICAgIF9fYV9fID0gMjQgIyBbdW51c2VkLXZhcmlhYmxlXQorICAgIF9fbmV2ZXJfdXNlZCA9IDQyCisKK2RlZiB0ZXN0X2xvY2FsX2ZpZWxkX3ByZWZpeGVkX3dpdGhfdW51c2VkX29yX2lnbm9yZWQoKToKKyAgICBmbGFnZ2VkX2xvY2FsX2ZpZWxkID0gNDIgIyBbdW51c2VkLXZhcmlhYmxlXQorICAgIHVudXNlZF9sb2NhbF9maWVsZCA9IDQyCisgICAgaWdub3JlZF9sb2NhbF9maWVsZCA9IDQyCisKKworY2xhc3MgSGFzVW51c2VkRHVuZGVyQ2xhc3Mob2JqZWN0KToKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBfX2NsYXNzX18gPSA0MiAgIyBbdW51c2VkLXZhcmlhYmxlXQorCisgICAgZGVmIGJlc3Qoc2VsZik6CisgICAgICAgIHNlbGYudGVzdCgpCisKKworZGVmIGxvY2Fsc19leGFtcGxlX2RlZmluZWRfYmVmb3JlKCk6CisgICAgdmFsdWUgPSA0MiAgIyBbcG9zc2libHktdW51c2VkLXZhcmlhYmxlXQorICAgIHJldHVybiBsb2NhbHMoKQorCisKK2RlZiBsb2NhbHNfZXhhbXBsZV9kZWZpbmVkX2FmdGVyKCk6CisgICAgbG9jYWxfdmFyaWFibGVzID0gbG9jYWxzKCkKKyAgICB2YWx1ZSA9IDQyICAjIFt1bnVzZWQtdmFyaWFibGVdCisgICAgcmV0dXJuIGxvY2FsX3ZhcmlhYmxlcworCisKK2RlZiBsb2NhbHNfZG9lc19ub3RfYWNjb3VudF9mb3Jfc3Vic2NvcGVzKCk6CisgICAgdmFsdWUgPSA0MiAgIyBbdW51c2VkLXZhcmlhYmxlXQorCisgICAgZGVmIHNvbWVfb3RoZXJfc2NvcGUoKToKKyAgICAgICAgcmV0dXJuIGxvY2FscygpCisgICAgcmV0dXJuIHNvbWVfb3RoZXJfc2NvcGUKKworCitkZWYgdW51c2VkX2ltcG9ydF9mcm9tKCk6CisgICAgZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzIGFzIGFiYyAjIFt1bnVzZWQtaW1wb3J0XQorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUgIyBbdW51c2VkLWltcG9ydF0KKworCitkZWYgdW51c2VkX2ltcG9ydF9pbl9mdW5jdGlvbih2YWx1ZSk6CisgICAgZnJvbSBzdHJpbmcgaW1wb3J0IGRpZ2l0cywgaGV4ZGlnaXRzICMgW3VudXNlZC1pbXBvcnRdCisgICAgcmV0dXJuIHZhbHVlIGlmIHZhbHVlIGluIGRpZ2l0cyBlbHNlICJOb3BlIgorCisKK2RlZiBoZWxsbyhhcmcpOgorICAgIG15X3ZhciA9ICdzb21ldGhpbmcnICMgW3VudXNlZC12YXJpYWJsZV0KKyAgICBpZiBhcmc6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmFpc2UgRXhjZXB0aW9uCisKKyMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1vdXRlci1uYW1lLCB3cm9uZy1pbXBvcnQtcG9zaXRpb24sbWlzcGxhY2VkLWZ1dHVyZQorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorUEFUSCA9IE9TID0gY29sbGVjdGlvbnMgPSBkZXF1ZSA9IE5vbmUKKworCitkZWYgZnVuY3Rpb24obWF0Y2hlcyk6CisgICAgIiIiInlvIiIiCisgICAgYWFhYSA9IDEgICMgW3VudXNlZC12YXJpYWJsZV0KKyAgICBpbmRleCA9IC0xCisgICAgZm9yIG1hdGNoIGluIG1hdGNoZXM6CisgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgcHJpbnQobWF0Y2gpCisKKworZGVmIHZpc2l0X2lmKHNlbGYsIG5vZGUpOgorICAgICIiImluY3JlbWVudHMgdGhlIGJyYW5jaGVzIGNvdW50ZXIiIiIKKyAgICBicmFuY2hlcyA9IDEKKyAgICAjIGRvbid0IGRvdWJsZSBjb3VudCBJZiBub2RlcyBjb21pbmcgZnJvbSBzb21lICdlbGlmJworICAgIGlmIG5vZGUub3JlbHNlIGFuZCBsZW4obm9kZS5vcmVsc2UpID4gMToKKyAgICAgICAgYnJhbmNoZXMgKz0gMQorICAgIHNlbGYuaW5jX2JyYW5jaChicmFuY2hlcykKKyAgICBzZWxmLnN0bXRzICs9IGJyYW5jaGVzCisKKworZGVmIHRlc3RfZ2xvYmFsKCk6CisgICAgIiIiIFRlc3QgdmFyaW91cyBhc3NpZ25tZW50cyBvZiBnbG9iYWwKKyAgICB2YXJpYWJsZXMgdGhyb3VnaCBpbXBvcnRzLgorICAgICIiIgorICAgIGdsb2JhbCBQQVRILCBPUywgY29sbGVjdGlvbnMsIGRlcXVlICAjIFtnbG9iYWwtc3RhdGVtZW50XQorICAgIGZyb20gb3MgaW1wb3J0IHBhdGggYXMgUEFUSAorICAgIGltcG9ydCBvcyBhcyBPUworICAgIGltcG9ydCBjb2xsZWN0aW9ucworICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisgICAgIyBtYWtlIHN1cmUgdGhhdCB0aGVzZSB0cmlnZ2VycyB1bnVzZWQtdmFyaWFibGUKKyAgICBmcm9tIHN5cyBpbXBvcnQgcGxhdGZvcm0gICMgW3VudXNlZC1pbXBvcnRdCisgICAgZnJvbSBzeXMgaW1wb3J0IHZlcnNpb24gYXMgVkVSU0lPTiAgIyBbdW51c2VkLWltcG9ydF0KKyAgICBpbXBvcnQgdGhpcyAgIyBbdW51c2VkLWltcG9ydF0KKyAgICBpbXBvcnQgcmUgYXMgUkUgICMgW3VudXNlZC1pbXBvcnRdCisKKyMgdGVzdCBjYXNlcyB0aGF0IGluY2x1ZGUgZXhjZXB0aW9ucworZGVmIGZ1bmN0aW9uMigpOgorICAgIHVudXNlZCA9IDEgICMgW3VudXNlZC12YXJpYWJsZV0KKyAgICB0cnk6CisgICAgICAgIDEgLyAwCisgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGVycm9yOgorICAgICMgVE9ETyBmaXggYnVnIGZvciBub3QgaWRlbnRpZnlpbmcgdW51c2VkIHZhcmlhYmxlcyBpbiBuZXN0ZWQgZXhjZXB0aW9ucyBzZWUgaXNzdWUgIzQzOTEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMSAvIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCIiKSBmcm9tIGVycm9yCisKK2RlZiBmdW5jKCk6CisgICAgdHJ5OgorICAgICAgICAxIC8gMAorICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBlcnJvcjoKKyAgICAjIFRPRE8gZml4IGJ1ZyBmb3Igbm90IGlkZW50aWZ5aW5nIHVudXNlZCB2YXJpYWJsZXMgaW4gbmVzdGVkIGV4Y2VwdGlvbnMgc2VlIGlzc3VlICM0MzkxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEgLyAwCisgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJlcnJvciIpCisKK2RlZiBmdW5jMigpOgorICAgIHRyeToKKyAgICAgICAgMSAvIDAKKyAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZXJyb3I6CisgICAgIyBUT0RPIGZpeCBidWcgZm9yIG5vdCBpZGVudGlmeWluZyB1bnVzZWQgdmFyaWFibGVzIGluIG5lc3RlZCBleGNlcHRpb25zIHNlZSBpc3N1ZSAjNDM5MQorICAgICAgICB0cnk6CisgICAgICAgICAgICAxIC8gMAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIiIpIGZyb20gZXJyb3IKKworZGVmIGZ1bmMzKCk6CisgICAgdHJ5OgorICAgICAgICAxIC8gMAorICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciBhcyBlcnJvcjoKKyAgICAgICAgcHJpbnQoZiJ7ZXJyb3J9IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMSAvIDIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlcnJvcjoKKyAgICAgICAgIyBUT0RPIGZpeCBidWcgZm9yIG5vdCBpZGVudGlmeWluZyB1bnVzZWQgdmFyaWFibGVzIGluIG5lc3RlZCBleGNlcHRpb25zIHNlZSBpc3N1ZSAjNDM5MQorICAgICAgICAgICAgcHJpbnQoIndhcm5pbmciKQorCitkZWYgZnVuYzQoKToKKyAgICB0cnk6CisgICAgICAgIDEgLyAwCisgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yIGFzIGVycm9yOiAgIyBbdW51c2VkLXZhcmlhYmxlXQorICAgICAgICB0cnk6CisgICAgICAgICAgICAxIC8gMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IgYXMgZXJyb3I6CisgICAgICAgICMgVE9ETyBmaXggYnVnIGZvciBub3QgaWRlbnRpZnlpbmcgdW51c2VkIHZhcmlhYmxlcyBpbiBuZXN0ZWQgZXhjZXB0aW9ucyBzZWUgaXNzdWUgIzQzOTEKKyAgICAgICAgICAgIHByaW50KCJlcnJvciIpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF92YXJpYWJsZS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF92YXJpYWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZDhiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX3ZhcmlhYmxlLnR4dApAQCAtMCwwICsxLDIyIEBACit1bnVzZWQtaW1wb3J0OjQ6NDp0ZXN0X3JlZ3Jlc3Npb25fNzM3OlVudXNlZCBpbXBvcnQgeG1sCit1bnVzZWQtaW1wb3J0Ojc6NDp0ZXN0X3JlZ3Jlc3Npb25fOTIzOlVudXNlZCBpbXBvcnQgdW5pdHRlc3QuY2FzZQordW51c2VkLWltcG9ydDo4OjQ6dGVzdF9yZWdyZXNzaW9uXzkyMzpVbnVzZWQgeG1sIGltcG9ydGVkIGFzIHNxbAordW51c2VkLXZhcmlhYmxlOjE1OjQ6dGVzdF91bnVzZWRfd2l0aF9wcmVwZW5kZWRfdW5kZXJzY29yZTpVbnVzZWQgdmFyaWFibGUgJ19hXycKK3VudXNlZC12YXJpYWJsZToxNjo0OnRlc3RfdW51c2VkX3dpdGhfcHJlcGVuZGVkX3VuZGVyc2NvcmU6VW51c2VkIHZhcmlhYmxlICdfX2FfXycKK3VudXNlZC12YXJpYWJsZToyMDo0OnRlc3RfbG9jYWxfZmllbGRfcHJlZml4ZWRfd2l0aF91bnVzZWRfb3JfaWdub3JlZDpVbnVzZWQgdmFyaWFibGUgJ2ZsYWdnZWRfbG9jYWxfZmllbGQnCit1bnVzZWQtdmFyaWFibGU6Mjg6ODpIYXNVbnVzZWREdW5kZXJDbGFzcy50ZXN0OlVudXNlZCB2YXJpYWJsZSAnX19jbGFzc19fJworcG9zc2libHktdW51c2VkLXZhcmlhYmxlOjM1OjQ6bG9jYWxzX2V4YW1wbGVfZGVmaW5lZF9iZWZvcmU6UG9zc2libHkgdW51c2VkIHZhcmlhYmxlICd2YWx1ZScKK3VudXNlZC12YXJpYWJsZTo0MTo0OmxvY2Fsc19leGFtcGxlX2RlZmluZWRfYWZ0ZXI6VW51c2VkIHZhcmlhYmxlICd2YWx1ZScKK3VudXNlZC12YXJpYWJsZTo0Njo0OmxvY2Fsc19kb2VzX25vdF9hY2NvdW50X2Zvcl9zdWJzY29wZXM6VW51c2VkIHZhcmlhYmxlICd2YWx1ZScKK3VudXNlZC1pbXBvcnQ6NTQ6NDp1bnVzZWRfaW1wb3J0X2Zyb206VW51c2VkIHdyYXBzIGltcG9ydGVkIGZyb20gZnVuY3Rvb2xzIGFzIGFiYwordW51c2VkLWltcG9ydDo1NTo0OnVudXNlZF9pbXBvcnRfZnJvbTpVbnVzZWQgbmFtZWR0dXBsZSBpbXBvcnRlZCBmcm9tIGNvbGxlY3Rpb25zCit1bnVzZWQtaW1wb3J0OjU5OjQ6dW51c2VkX2ltcG9ydF9pbl9mdW5jdGlvbjpVbnVzZWQgaGV4ZGlnaXRzIGltcG9ydGVkIGZyb20gc3RyaW5nCit1bnVzZWQtdmFyaWFibGU6NjQ6NDpoZWxsbzpVbnVzZWQgdmFyaWFibGUgJ215X3ZhcicKK3VudXNlZC12YXJpYWJsZTo3Njo0OmZ1bmN0aW9uOlVudXNlZCB2YXJpYWJsZSAnYWFhYScKK2dsb2JhbC1zdGF0ZW1lbnQ6OTc6NDp0ZXN0X2dsb2JhbDpVc2luZyB0aGUgZ2xvYmFsIHN0YXRlbWVudAordW51c2VkLWltcG9ydDoxMDM6NDp0ZXN0X2dsb2JhbDpVbnVzZWQgcGxhdGZvcm0gaW1wb3J0ZWQgZnJvbSBzeXMKK3VudXNlZC1pbXBvcnQ6MTA0OjQ6dGVzdF9nbG9iYWw6VW51c2VkIHZlcnNpb24gaW1wb3J0ZWQgZnJvbSBzeXMgYXMgVkVSU0lPTgordW51c2VkLWltcG9ydDoxMDU6NDp0ZXN0X2dsb2JhbDpVbnVzZWQgaW1wb3J0IHRoaXMKK3VudXNlZC1pbXBvcnQ6MTA2OjQ6dGVzdF9nbG9iYWw6VW51c2VkIHJlIGltcG9ydGVkIGFzIFJFCit1bnVzZWQtdmFyaWFibGU6MTEwOjQ6ZnVuY3Rpb24yOlVudXNlZCB2YXJpYWJsZSAndW51c2VkJwordW51c2VkLXZhcmlhYmxlOjE1NDo0OmZ1bmM0OlVudXNlZCB2YXJpYWJsZSAnZXJyb3InCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF92YXJpYWJsZV9weTM2LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfdmFyaWFibGVfcHkzNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTZkMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VudXNlZC91bnVzZWRfdmFyaWFibGVfcHkzNi5weQpAQCAtMCwwICsxLDEzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitkZWYgZnVuY3Rpb24oKToKKyAgICBhbm46IGludCA9IDAKKyAgICBhc3NpZ24gPSAwCisKKyAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgbm9ubG9jYWwgYW5uLCBhc3NpZ24KKyAgICAgICAgYW5uICs9IDEKKyAgICAgICAgYXNzaWduICs9IDEKKyAgICAgICAgcmV0dXJuIGFubiArIGFzc2lnbgorCisgICAgcmV0dXJuIGlubmVyKCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91bnVzZWQvdW51c2VkX3ZhcmlhYmxlX3B5MzYucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF92YXJpYWJsZV9weTM2LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdW51c2VkL3VudXNlZF92YXJpYWJsZV9weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VfYV9nZW5lcmF0b3IucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZV9hX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzlkZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VfYV9nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxMSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIGludmFsaWQtbmFtZQorIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zMTY1CisKK2FueShbXSkKK2FsbChbXSkKKworYW55KFswIGZvciB4IGluIGxpc3QocmFuZ2UoMTApKV0pICMgW3VzZS1hLWdlbmVyYXRvcl0KK2FsbChbMCBmb3IgeSBpbiBsaXN0KHJhbmdlKDEwKSldKSAjIFt1c2UtYS1nZW5lcmF0b3JdCisKK2FueSgwIGZvciB4IGluIGxpc3QocmFuZ2UoMTApKSkKK2FsbCgwIGZvciB5IGluIGxpc3QocmFuZ2UoMTApKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX2FfZ2VuZXJhdG9yLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX2FfZ2VuZXJhdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JlMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VfYV9nZW5lcmF0b3IudHh0CkBAIC0wLDAgKzEsMiBAQAordXNlLWEtZ2VuZXJhdG9yOjc6MDo6VXNlIGEgZ2VuZXJhdG9yIGluc3RlYWQgJ2FueSgwIGZvciB4IGluIGxpc3QocmFuZ2UoMTApKSknCit1c2UtYS1nZW5lcmF0b3I6ODowOjpVc2UgYSBnZW5lcmF0b3IgaW5zdGVhZCAnYWxsKDAgZm9yIHkgaW4gbGlzdChyYW5nZSgxMCkpKScKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX21heHNwbGl0X2FyZy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX21heHNwbGl0X2FyZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk5OGU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VfbWF4c3BsaXRfYXJnLnB5CkBAIC0wLDAgKzEsODQgQEAKKyIiIkVtaXQgYSBtZXNzYWdlIGZvciBhY2Nlc3NpbmcgZmlyc3QvbGFzdCBlbGVtZW50IG9mIHN0cmluZy5zcGxpdCIiIg0KKyMgcHlsaW50OiBkaXNhYmxlPWxpbmUtdG9vLWxvbmcsbWlzc2luZy1kb2NzdHJpbmcsdW5zdWJzY3JpcHRhYmxlLW9iamVjdCx0b28tZmV3LXB1YmxpYy1tZXRob2RzLGludmFsaWQtbmFtZSxyZWRlZmluZWQtYnVpbHRpbg0KKw0KKyMgVGVzdCBzdWJzY3JpcHRpbmcgLnNwbGl0KCkNCitnZXRfZmlyc3QgPSAnMSwyLDMnLnNwbGl0KCcsJylbMF0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorZ2V0X2xhc3QgPSAnMSwyLDMnWzo6LTFdLnNwbGl0KCcsJylbMF0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorDQorU0VRID0gJzEsMiwzJw0KK2dldF9maXJzdCA9IFNFUS5zcGxpdCgnLCcpWzBdICAjIFt1c2UtbWF4c3BsaXQtYXJnXQ0KK2dldF9sYXN0ID0gU0VRLnNwbGl0KCcsJylbLTFdICAjIFt1c2UtbWF4c3BsaXQtYXJnXQ0KK2dldF9maXJzdCA9IFNFUS5yc3BsaXQoJywnKVswXSAgIyBbdXNlLW1heHNwbGl0LWFyZ10NCitnZXRfbGFzdCA9IFNFUS5yc3BsaXQoJywnKVstMV0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorDQorIyBEb24ndCBzdWdnZXN0IG1heHNwbGl0PTEgaWYgbm90IGFjY2Vzc2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50DQorZ2V0X21pZCA9IFNFUS5zcGxpdCgnLCcpWzFdDQorZ2V0X21pZCA9IFNFUS5zcGxpdCgnLCcpWy0yXQ0KKw0KKw0KKyMgVGVzdCB2YXJ5aW5nIG1heHNwbGl0IGFyZ3VtZW50IC0tIGFsbCB0aGVzZSB3aWxsIGJlIG9rYXkNCisjICMjIHN0ci5zcGxpdCgpIHRlc3RzDQorZ29vZF9zcGxpdCA9ICcxLDIsMycuc3BsaXQoc2VwPScsJywgbWF4c3BsaXQ9MSlbLTFdDQorZ29vZF9zcGxpdCA9ICcxLDIsMycuc3BsaXQoc2VwPScsJywgbWF4c3BsaXQ9MSlbMF0NCitnb29kX3NwbGl0ID0gJzEsMiwzJy5zcGxpdChzZXA9JywnLCBtYXhzcGxpdD0yKVstMV0NCitnb29kX3NwbGl0ID0gJzEsMiwzJy5zcGxpdChzZXA9JywnLCBtYXhzcGxpdD0yKVswXQ0KK2dvb2Rfc3BsaXQgPSAnMSwyLDMnLnNwbGl0KHNlcD0nLCcsIG1heHNwbGl0PTIpWzFdDQorDQorIyAjIyBzdHIucnNwbGl0KCkgdGVzdHMNCitnb29kX3NwbGl0ID0gJzEsMiwzJy5yc3BsaXQoc2VwPScsJywgbWF4c3BsaXQ9MSlbLTFdDQorZ29vZF9zcGxpdCA9ICcxLDIsMycucnNwbGl0KHNlcD0nLCcsIG1heHNwbGl0PTEpWzBdDQorZ29vZF9zcGxpdCA9ICcxLDIsMycucnNwbGl0KHNlcD0nLCcsIG1heHNwbGl0PTIpWy0xXQ0KK2dvb2Rfc3BsaXQgPSAnMSwyLDMnLnJzcGxpdChzZXA9JywnLCBtYXhzcGxpdD0yKVswXQ0KK2dvb2Rfc3BsaXQgPSAnMSwyLDMnLnJzcGxpdChzZXA9JywnLCBtYXhzcGxpdD0yKVsxXQ0KKw0KKw0KKyMgVGVzdHMgb24gY2xhc3MgYXR0cmlidXRlcw0KK2NsYXNzIEZvbygpOg0KKyAgICBjbGFzc19zdHIgPSAnMSwyLDMnDQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToNCisgICAgICAgIHNlbGYubXlfc3RyID0gJzEsMiwzJw0KKw0KKyAgICBkZWYgZ2V0X3N0cmluZyhzZWxmKSAtPiBzdHI6DQorICAgICAgICByZXR1cm4gc2VsZi5teV9zdHINCisNCisjIENsYXNzIGF0dHJpYnV0ZXMNCitnZXRfZmlyc3QgPSBGb28uY2xhc3Nfc3RyLnNwbGl0KCcsJylbMF0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorZ2V0X2xhc3QgPSBGb28uY2xhc3Nfc3RyLnNwbGl0KCcsJylbLTFdICAjIFt1c2UtbWF4c3BsaXQtYXJnXQ0KK2dldF9maXJzdCA9IEZvby5jbGFzc19zdHIucnNwbGl0KCcsJylbMF0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorZ2V0X2xhc3QgPSBGb28uY2xhc3Nfc3RyLnJzcGxpdCgnLCcpWy0xXSAgIyBbdXNlLW1heHNwbGl0LWFyZ10NCisNCitnZXRfbWlkID0gRm9vLmNsYXNzX3N0ci5zcGxpdCgnLCcpWzFdDQorZ2V0X21pZCA9IEZvby5jbGFzc19zdHIuc3BsaXQoJywnKVstMl0NCisNCisNCisjIFRlc3Qgd2l0aCBhY2Nlc3NvcnMNCitiYXIgPSBGb28oKQ0KK2dldF9maXJzdCA9IGJhci5nZXRfc3RyaW5nKCkuc3BsaXQoJywnKVswXSAgIyBbdXNlLW1heHNwbGl0LWFyZ10NCitnZXRfbGFzdCA9IGJhci5nZXRfc3RyaW5nKCkuc3BsaXQoJywnKVstMV0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorDQorZ2V0X21pZCA9IGJhci5nZXRfc3RyaW5nKCkuc3BsaXQoJywnKVsxXQ0KK2dldF9taWQgPSBiYXIuZ2V0X3N0cmluZygpLnNwbGl0KCcsJylbLTJdDQorDQorDQorIyBUZXN0IHdpdGggaXRlcmF0aW5nIG92ZXIgc3RyaW5ncw0KK2xpc3Rfb2Zfc3RycyA9IFsiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiXQ0KK2ZvciBzIGluIGxpc3Rfb2Zfc3RyczoNCisgICAgcHJpbnQocy5zcGxpdCgiICIpWzBdKSAgIyBbdXNlLW1heHNwbGl0LWFyZ10NCisgICAgcHJpbnQocy5zcGxpdCgiICIpWy0xXSkgICMgW3VzZS1tYXhzcGxpdC1hcmddDQorICAgIHByaW50KHMuc3BsaXQoIiAiKVstMl0pDQorDQorDQorIyBUZXN0IHdhcm5pbmcgbWVzc2FnZXMgKG1hdGNoaW5nIGFuZCByZXBsYWNpbmcgLnNwbGl0IC8gLnJzcGxpdCkNCitjbGFzcyBCYXIoKToNCisgICAgc3BsaXQgPSAnMSwyLDMnDQorDQorIyBFcnJvciBtZXNzYWdlIHNob3VsZCBzaG93IEJhci5zcGxpdC5zcGxpdCgnLCcsIG1heHNwbGl0PTEpIG9yIEJhci5zcGxpdC5yc3BsaXQoJywnLCBtYXhzcGxpdD0xKQ0KK3ByaW50KEJhci5zcGxpdC5zcGxpdCgiLCIpWzBdKSAgIyBbdXNlLW1heHNwbGl0LWFyZ10NCitwcmludChCYXIuc3BsaXQuc3BsaXQoIiwiKVstMV0pICAjIFt1c2UtbWF4c3BsaXQtYXJnXQ0KK3ByaW50KEJhci5zcGxpdC5yc3BsaXQoIiwiKVswXSkgICMgW3VzZS1tYXhzcGxpdC1hcmddDQorcHJpbnQoQmFyLnNwbGl0LnJzcGxpdCgiLCIpWy0xXSkgICMgW3VzZS1tYXhzcGxpdC1hcmddDQorDQorIyBTcGVjaWFsIGNhc2VzDQorYSA9ICIxLDIsMyIuc3BsaXQoJ1xuJylbMF0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQorYSA9ICIxLDIsMyIuc3BsaXQoJ3NwbGl0JylbLTFdICAjIFt1c2UtbWF4c3BsaXQtYXJnXQ0KK2EgPSAiMSwyLDMiLnJzcGxpdCgncnNwbGl0JylbMF0gICMgW3VzZS1tYXhzcGxpdC1hcmddDQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VfbWF4c3BsaXRfYXJnLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX21heHNwbGl0X2FyZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNzM3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX21heHNwbGl0X2FyZy50eHQKQEAgLTAsMCArMSwyMSBAQAordXNlLW1heHNwbGl0LWFyZzo1OjEyOjpVc2UgJzEsMiwzJy5zcGxpdCgnLCcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6NjoxMTo6IlVzZSAnMSwyLDMnWzo6LTFdLnNwbGl0KCcsJywgbWF4c3BsaXQ9MSlbMF0gaW5zdGVhZCIKK3VzZS1tYXhzcGxpdC1hcmc6OToxMjo6VXNlIFNFUS5zcGxpdCgnLCcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6MTA6MTE6OlVzZSBTRVEucnNwbGl0KCcsJywgbWF4c3BsaXQ9MSlbLTFdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6MTE6MTI6OlVzZSBTRVEuc3BsaXQoJywnLCBtYXhzcGxpdD0xKVswXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjEyOjExOjpVc2UgU0VRLnJzcGxpdCgnLCcsIG1heHNwbGl0PTEpWy0xXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjQ1OjEyOjpVc2UgRm9vLmNsYXNzX3N0ci5zcGxpdCgnLCcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6NDY6MTE6OlVzZSBGb28uY2xhc3Nfc3RyLnJzcGxpdCgnLCcsIG1heHNwbGl0PTEpWy0xXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjQ3OjEyOjpVc2UgRm9vLmNsYXNzX3N0ci5zcGxpdCgnLCcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6NDg6MTE6OlVzZSBGb28uY2xhc3Nfc3RyLnJzcGxpdCgnLCcsIG1heHNwbGl0PTEpWy0xXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjU2OjEyOjpVc2UgYmFyLmdldF9zdHJpbmcoKS5zcGxpdCgnLCcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6NTc6MTE6OlVzZSBiYXIuZ2V0X3N0cmluZygpLnJzcGxpdCgnLCcsIG1heHNwbGl0PTEpWy0xXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjY2OjEwOjpVc2Ugcy5zcGxpdCgnICcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6Njc6MTA6OlVzZSBzLnJzcGxpdCgnICcsIG1heHNwbGl0PTEpWy0xXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjc2OjY6OlVzZSBCYXIuc3BsaXQuc3BsaXQoJywnLCBtYXhzcGxpdD0xKVswXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjc3OjY6OlVzZSBCYXIuc3BsaXQucnNwbGl0KCcsJywgbWF4c3BsaXQ9MSlbLTFdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6Nzg6Njo6VXNlIEJhci5zcGxpdC5zcGxpdCgnLCcsIG1heHNwbGl0PTEpWzBdIGluc3RlYWQKK3VzZS1tYXhzcGxpdC1hcmc6Nzk6Njo6VXNlIEJhci5zcGxpdC5yc3BsaXQoJywnLCBtYXhzcGxpdD0xKVstMV0gaW5zdGVhZAordXNlLW1heHNwbGl0LWFyZzo4Mjo0OjpVc2UgJzEsMiwzJy5zcGxpdCgnXG4nLCBtYXhzcGxpdD0xKVswXSBpbnN0ZWFkCit1c2UtbWF4c3BsaXQtYXJnOjgzOjQ6OlVzZSAnMSwyLDMnLnJzcGxpdCgnc3BsaXQnLCBtYXhzcGxpdD0xKVstMV0gaW5zdGVhZAordXNlLW1heHNwbGl0LWFyZzo4NDo0OjpVc2UgJzEsMiwzJy5zcGxpdCgncnNwbGl0JywgbWF4c3BsaXQ9MSlbMF0gaW5zdGVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2Vfc3ltYm9saWNfbWVzc2FnZV9pbnN0ZWFkLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2Vfc3ltYm9saWNfbWVzc2FnZV9pbnN0ZWFkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGQ5M2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZV9zeW1ib2xpY19tZXNzYWdlX2luc3RlYWQucHkKQEAgLTAsMCArMSwyNSBAQAorIyBweWxpbnQ6IGRpc2FibGU9QzAxMTEsUjA5MDMsVDEyMzQgICMgW2JhZC1vcHRpb24tdmFsdWUsdXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZCx1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkXQorIyBweWxpbnQ6IGVuYWJsZT1DMDExMSAgICMgW3VzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWRdCisKK2RlZiBteV9mdW5jdGlvbihhcmcpOiAgIyBbbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmddCisgICAgcmV0dXJuIGFyZyBvciBUcnVlCisKKyMgcHlsaW50OiBkaXNhYmxlPUMwMTExICAjIFt1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkXQorIyBweWxpbnQ6IGVuYWJsZT1SMDkwMyAgIyBbdXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZF0KKyMgcHlsaW50OiBkaXNhYmxlPVIwOTAzICAjIFt1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkXQorCisKK2RlZiBmb28oKTogICMgcHlsaW50OiBkaXNhYmxlPUMwMTAyICAjIFt1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkXQorICAgIHJldHVybiAxCisKKworZGVmIHRvdG8oKTogICMgcHlsaW50OiBkaXNhYmxlPUMwMTAyLFIxNzExICAjIFt1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkLHVzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWRdCisgICAgcmV0dXJuCisKKworZGVmIHRlc3RfZW5hYmxlZF9ieV9pZF9tc2coKTogICMgcHlsaW50OiBlbmFibGU9QzAxMTEgICMgW3VzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWQsbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmddCisgICAgcGFzcworCisKK2RlZiBiYXooKTogICMgcHlsaW50OiBkaXNhYmxlPWJsYWNrbGlzdGVkLW5hbWUKKyAgICByZXR1cm4gMQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2Vfc3ltYm9saWNfbWVzc2FnZV9pbnN0ZWFkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX3N5bWJvbGljX21lc3NhZ2VfaW5zdGVhZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NjFiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlX3N5bWJvbGljX21lc3NhZ2VfaW5zdGVhZC50eHQKQEAgLTAsMCArMSwxMyBAQAorYmFkLW9wdGlvbi12YWx1ZToxOjA6OkJhZCBvcHRpb24gdmFsdWUgJ1QxMjM0JwordXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZDoxOjA6OiInQzAxMTEnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcnIGluc3RlYWQiCit1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkOjE6MDo6IidSMDkwMycgaXMgY3J5cHRpYzogdXNlICcjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzJyBpbnN0ZWFkIgordXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZDoyOjA6OiInQzAxMTEnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGVuYWJsZT1taXNzaW5nLWRvY3N0cmluZycgaW5zdGVhZCIKK21pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nOjQ6MDpteV9mdW5jdGlvbjpNaXNzaW5nIGZ1bmN0aW9uIG9yIG1ldGhvZCBkb2NzdHJpbmcKK3VzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWQ6NzowOjoiJ0MwMTExJyBpcyBjcnlwdGljOiB1c2UgJyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nJyBpbnN0ZWFkIgordXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZDo4OjA6OiInUjA5MDMnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGVuYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzJyBpbnN0ZWFkIgordXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZDo5OjA6OiInUjA5MDMnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcycgaW5zdGVhZCIKK3VzZS1zeW1ib2xpYy1tZXNzYWdlLWluc3RlYWQ6MTI6MDo6IidDMDEwMicgaXMgY3J5cHRpYzogdXNlICcjIHB5bGludDogZGlzYWJsZT1ibGFja2xpc3RlZC1uYW1lJyBpbnN0ZWFkIgordXNlLXN5bWJvbGljLW1lc3NhZ2UtaW5zdGVhZDoxNjowOjoiJ0MwMTAyJyBpcyBjcnlwdGljOiB1c2UgJyMgcHlsaW50OiBkaXNhYmxlPWJsYWNrbGlzdGVkLW5hbWUnIGluc3RlYWQiCit1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkOjE2OjA6OiInUjE3MTEnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGRpc2FibGU9dXNlbGVzcy1yZXR1cm4nIGluc3RlYWQiCittaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZzoyMDowOnRlc3RfZW5hYmxlZF9ieV9pZF9tc2c6TWlzc2luZyBmdW5jdGlvbiBvciBtZXRob2QgZG9jc3RyaW5nCit1c2Utc3ltYm9saWMtbWVzc2FnZS1pbnN0ZWFkOjIwOjA6OiInQzAxMTEnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGVuYWJsZT1taXNzaW5nLWRvY3N0cmluZycgaW5zdGVhZCIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWduZW1lbnQucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbmVtZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzViMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbmVtZW50LnB5CkBAIC0wLDAgKzEsOCBAQAorIiIicHlsaW50IGRvZXNuJ3Qgc2VlIHRoZSBOYW1lRXJyb3IgaW4gdGhpcyBtb2R1bGUiIiIKKworX19yZXZpc2lvbl9fID0gTm9uZQorCitNU0cgPSAiaGVsbG8gJXMiICUgTVNHICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorCitNU0cyID0gKCJoZWxsbyAlcyIgJQorICAgICAgICBNU0cyKSAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25lbWVudC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbmVtZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTlmZTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25lbWVudC50eHQKQEAgLTAsMCArMSwyIEBACit1c2VkLWJlZm9yZS1hc3NpZ25tZW50OjU6MTk6OlVzaW5nIHZhcmlhYmxlICdNU0cnIGJlZm9yZSBhc3NpZ25tZW50Cit1c2VkLWJlZm9yZS1hc3NpZ25tZW50Ojg6ODo6VXNpbmcgdmFyaWFibGUgJ01TRzInIGJlZm9yZSBhc3NpZ25tZW50CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfNDg4LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25tZW50XzQ4OC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmMxMzNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25tZW50XzQ4OC5weQpAQCAtMCwwICsxLDkgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitkZWYgZnVuYygpOgorICAgICIiIlRlc3QgdGhhdCBhIHZhcmlhYmxlIGRlZmluZWQgaW4gYSBmaW5hbGx5IGNsYXVzZSBkb2VzIG5vdCB0cmlnZ2VyIGEgZmFsc2UgcG9zaXRpdmUiIiIKKyAgICB0cnk6CisgICAgICAgIHZhcmlhYmxlID0gMQorICAgICAgICB5aWVsZCB2YXJpYWJsZQorICAgIGZpbmFsbHk6CisgICAgICAgIHZhcmlhYmxlID0gMgorICAgICAgICB5aWVsZCB2YXJpYWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25tZW50X2lzc3VlMTA4MS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWdubWVudF9pc3N1ZTEwODEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1OWNjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWdubWVudF9pc3N1ZTEwODEucHkKQEAgLTAsMCArMSw0MCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsaW52YWxpZC1uYW1lLHRvby1mZXctcHVibGljLW1ldGhvZHMsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK3ggPSAyNAorCisKK2RlZiB1c2VkX2JlZm9yZV9hc3NpZ25tZW50XzEoYSk6CisgICAgaWYgeCA9PSBhOiAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAgICAgZm9yIHggaW4gWzEsIDJdOiAgIyBbcmVkZWZpbmVkLW91dGVyLW5hbWVdCisgICAgICAgICAgICBwYXNzCisKKworZGVmIHVzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfMihhKToKKyAgICBpZiB4ID09IGE6ICAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQorICAgICAgICBwYXNzCisgICAgeCA9IDIgICMgW3JlZGVmaW5lZC1vdXRlci1uYW1lXQorCisKK2RlZiB1c2VkX2JlZm9yZV9hc3NpZ25tZW50XzMoYSk6CisgICAgaWYgeCA9PSBhOiAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAgICAgaWYgeCA+IDM6CisgICAgICAgICAgICB4ID0gMiAgIyBbcmVkZWZpbmVkLW91dGVyLW5hbWVdCisKKworZGVmIG5vdF91c2VkX2JlZm9yZV9hc3NpZ25tZW50KGEpOgorICAgIGlmIHggPT0gYToKKyAgICAgICAgcGFzcworCisKK2RlZiBub3RfdXNlZF9iZWZvcmVfYXNzaWdubWVudF8yKGEpOgorICAgIHggPSAzICAjIFtyZWRlZmluZWQtb3V0ZXItbmFtZV0KKyAgICBpZiB4ID09IGE6CisgICAgICAgIHBhc3MKKworCitkZWYgZnVuYyhzb21ldGhpbmcpOgorICAgIHJldHVybiBzb21ldGhpbmcgKiogMworCisKK2NsYXNzIEZhbHNlUG9zaXRpdmUob2JqZWN0KToKKyAgICB4ID0gZnVuYyh4KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25tZW50X2lzc3VlMTA4MS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfaXNzdWUxMDgxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQzYzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX2JlZm9yZV9hc3NpZ25tZW50X2lzc3VlMTA4MS50eHQKQEAgLTAsMCArMSw3IEBACit1c2VkLWJlZm9yZS1hc3NpZ25tZW50Ojc6Nzp1c2VkX2JlZm9yZV9hc3NpZ25tZW50XzE6VXNpbmcgdmFyaWFibGUgJ3gnIGJlZm9yZSBhc3NpZ25tZW50CityZWRlZmluZWQtb3V0ZXItbmFtZTo4OjEyOnVzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfMTpSZWRlZmluaW5nIG5hbWUgJ3gnIGZyb20gb3V0ZXIgc2NvcGUgKGxpbmUgMykKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MTM6Nzp1c2VkX2JlZm9yZV9hc3NpZ25tZW50XzI6VXNpbmcgdmFyaWFibGUgJ3gnIGJlZm9yZSBhc3NpZ25tZW50CityZWRlZmluZWQtb3V0ZXItbmFtZToxNTo0OnVzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfMjpSZWRlZmluaW5nIG5hbWUgJ3gnIGZyb20gb3V0ZXIgc2NvcGUgKGxpbmUgMykKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MTk6Nzp1c2VkX2JlZm9yZV9hc3NpZ25tZW50XzM6VXNpbmcgdmFyaWFibGUgJ3gnIGJlZm9yZSBhc3NpZ25tZW50CityZWRlZmluZWQtb3V0ZXItbmFtZToyMToxMjp1c2VkX2JlZm9yZV9hc3NpZ25tZW50XzM6UmVkZWZpbmluZyBuYW1lICd4JyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDMpCityZWRlZmluZWQtb3V0ZXItbmFtZTozMDo0Om5vdF91c2VkX2JlZm9yZV9hc3NpZ25tZW50XzI6UmVkZWZpbmluZyBuYW1lICd4JyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDMpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfaXNzdWU4NTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfaXNzdWU4NTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiNDEyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWdubWVudF9pc3N1ZTg1My5weQpAQCAtMCwwICsxLDIzIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyxiYXJlLWV4Y2VwdCxwb2ludGxlc3Mtc3RhdGVtZW50LHN1cGVyZmx1b3VzLXBhcmVucworZGVmIHN0cmFuZ2Vwcm9ibGVtKCk6CisgICAgdHJ5OgorICAgICAgICBmb3IgXyBpbiByYW5nZSgwLCA0KToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBvYmplY3QoKQorICAgICAgICAgICAgcHJpbnQodHlwZShtZXNzYWdlKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBtZXNzYWdlID0gb2JqZWN0KCkKKworCit0cnk6CisgICAgTVlfSU5UID0gMQorICAgIHByaW50KCJNWV9JTlQgPSAlZCIgJSBNWV9JTlQpCitmaW5hbGx5OgorICAgIE1ZX0lOVCA9IDIKKwordHJ5OgorICAgIHBhc3MKK2V4Y2VwdDoKKyAgICBGQUxTRV9QT1NJVElWRSA9IDEKKyAgICBGQUxTRV9QT1NJVElWRSAgIyBoZXJlIHB5bGludCBjbGFpbXMgdXNlZC1iZWZvcmUtYXNzaWdubWVudAorZmluYWxseToKKyAgICBGQUxTRV9QT1NJVElWRSA9IDIgICMgdGhpcyBsaW5lIGlzIG5lZWRlZCB0byByZXByb2R1Y2UgdGhlIGlzc3VlCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfbm9ubG9jYWwucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfbm9ubG9jYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiZGQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWdubWVudF9ub25sb2NhbC5weQpAQCAtMCwwICsxLDYwIEBACisiIiJDaGVjayBmb3Igbm9ubG9jYWwgYW5kIHVzZWQtYmVmb3JlLWFzc2lnbm1lbnQiIiINCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdW51c2VkLXZhcmlhYmxlLCBuby1pbml0LCB0b28tZmV3LXB1YmxpYy1tZXRob2RzDQorDQorX19yZXZpc2lvbl9fID0gMA0KKw0KK2RlZiB0ZXN0X29rKCk6DQorICAgICIiIiB1c2VzIG5vbmxvY2FsICIiIg0KKyAgICBjbnQgPSAxDQorICAgIGRlZiB3cmFwKCk6DQorICAgICAgICBub25sb2NhbCBjbnQNCisgICAgICAgIGNudCA9IGNudCArIDENCisgICAgd3JhcCgpDQorDQorZGVmIHRlc3RfZmFpbCgpOg0KKyAgICAiIiIgZG9lc24ndCB1c2Ugbm9ubG9jYWwgIiIiDQorICAgIGNudCA9IDENCisgICAgZGVmIHdyYXAoKToNCisgICAgICAgIGNudCA9IGNudCArIDEgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0NCisgICAgd3JhcCgpDQorDQorZGVmIHRlc3RfZmFpbDIoKToNCisgICAgIiIiIHVzZSBub25sb2NhbCwgYnV0IGZvciBvdGhlciB2YXJpYWJsZSAiIiINCisgICAgY250ID0gMQ0KKyAgICBjb3VudCA9IDENCisgICAgZGVmIHdyYXAoKToNCisgICAgICAgIG5vbmxvY2FsIGNvdW50DQorICAgICAgICBjbnQgPSBjbnQgKyAxICMgW3VzZWQtYmVmb3JlLWFzc2lnbm1lbnRdDQorICAgIHdyYXAoKQ0KKw0KK2RlZiB0ZXN0X2ZhaWwzKGFyZzogdGVzdF9mYWlsNCk6ICMgW3VzZWQtYmVmb3JlLWFzc2lnbm1lbnRdDQorICAgICIiIiBEZXBlbmRzIG9uIGB0ZXN0X2ZhaWw0YCwgaW4gYXJndW1lbnQgYW5ub3RhdGlvbi4gIiIiDQorICAgIHJldHVybiBhcmcNCisjICsxOiBbdXNlZC1iZWZvcmUtYXNzaWdubWVudCwgdXNlZC1iZWZvcmUtYXNzaWdubWVudF0NCitkZWYgdGVzdF9mYWlsNCgqYXJnczogdGVzdF9mYWlsNSwgKiprd2FyZ3M6IHVuZGVmaW5lZCk6DQorICAgICIiIiBEZXBlbmRzIG9uIGB0ZXN0X2ZhaWw1YCBhbmQgYHVuZGVmaW5lZGAgaW4NCisgICAgdmFyaWFibGUgYW5kIG5hbWVkIGFyZ3VtZW50cyBhbm5vdGF0aW9ucy4NCisgICAgIiIiDQorICAgIHJldHVybiBhcmdzLCBrd2FyZ3MNCisNCitkZWYgdGVzdF9mYWlsNSgpLT51bmRlZmluZWQxOiAjIFt1c2VkLWJlZm9yZS1hc3NpZ25tZW50XQ0KKyAgICAiIiIgRGVwZW5kcyBvbiBgdW5kZWZpbmVkMWAgaW4gZnVuY3Rpb24gcmV0dXJuIGFubm90YXRpb24uICIiIg0KKw0KK2RlZiB1bmRlZmluZWQoKToNCisgICAgIiIiIG5vIG9wICIiIg0KKw0KK2RlZiB1bmRlZmluZWQxKCk6DQorICAgICIiIiBubyBvcCAiIiINCisNCisNCitkZWYgbm9ubG9jYWxfaW5faWZleHAoKToNCisgICAgIiIiYmFyIiIiDQorICAgIGJ1ZzIgPSBUcnVlDQorICAgIGRlZiBvbl9jbGljayhldmVudCk6DQorICAgICAgICAiIiJvbl9jbGljayIiIg0KKyAgICAgICAgaWYgZXZlbnQ6DQorICAgICAgICAgICAgbm9ubG9jYWwgYnVnMg0KKyAgICAgICAgICAgIGJ1ZzIgPSBub3QgYnVnMg0KKyAgICBvbl9jbGljayhUcnVlKQ0KKw0KK25vbmxvY2FsX2luX2lmZXhwKCkNCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfbm9ubG9jYWwucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfbm9ubG9jYWwucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWdubWVudF9ub25sb2NhbC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9iZWZvcmVfYXNzaWdubWVudF9ub25sb2NhbC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfbm9ubG9jYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfYmVmb3JlX2Fzc2lnbm1lbnRfbm9ubG9jYWwudHh0CkBAIC0wLDAgKzEsNiBAQAordXNlZC1iZWZvcmUtYXNzaWdubWVudDoxODoxNDp0ZXN0X2ZhaWwud3JhcDpVc2luZyB2YXJpYWJsZSAnY250JyBiZWZvcmUgYXNzaWdubWVudAordXNlZC1iZWZvcmUtYXNzaWdubWVudDoyNzoxNDp0ZXN0X2ZhaWwyLndyYXA6VXNpbmcgdmFyaWFibGUgJ2NudCcgYmVmb3JlIGFzc2lnbm1lbnQKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MzA6MjA6dGVzdF9mYWlsMzpVc2luZyB2YXJpYWJsZSAndGVzdF9mYWlsNCcgYmVmb3JlIGFzc2lnbm1lbnQKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MzQ6MjI6dGVzdF9mYWlsNDpVc2luZyB2YXJpYWJsZSAndGVzdF9mYWlsNScgYmVmb3JlIGFzc2lnbm1lbnQKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MzQ6NDQ6dGVzdF9mYWlsNDpVc2luZyB2YXJpYWJsZSAndW5kZWZpbmVkJyBiZWZvcmUgYXNzaWdubWVudAordXNlZC1iZWZvcmUtYXNzaWdubWVudDo0MDoxODp0ZXN0X2ZhaWw1OlVzaW5nIHZhcmlhYmxlICd1bmRlZmluZWQxJyBiZWZvcmUgYXNzaWdubWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX3ByaW9yX2dsb2JhbF9kZWNsYXJhdGlvbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9wcmlvcl9nbG9iYWxfZGVjbGFyYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NTAxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9wcmlvcl9nbG9iYWxfZGVjbGFyYXRpb24ucHkKQEAgLTAsMCArMSwzOSBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHBvaW50bGVzcy1zdGF0ZW1lbnQsIGdsb2JhbC12YXJpYWJsZS1ub3QtYXNzaWduZWQsIGdsb2JhbC1zdGF0ZW1lbnQKKworCitDT05TVCA9IDEKKworCitkZWYgdGVzdCgpOgorICAgIENPTlNUICAjIFt1c2VkLXByaW9yLWdsb2JhbC1kZWNsYXJhdGlvbl0KKworICAgIGdsb2JhbCBDT05TVAorCisKK2RlZiBvdGhlcl90ZXN0KCk6CisgICAgQ09OU1QKKworICAgIGdsb2JhbCBTT01FVEhJTkcKKworCitkZWYgb3RoZXJfdGVzdF8xKCk6CisgICAgZ2xvYmFsIFNPTUVUSElORworCisgICAgQ09OU1QKKworCitkZWYgb3RoZXJfdGVzdF8yKCk6CisgICAgQ09OU1QKKworICAgIGRlZiBpbm5lcigpOgorICAgICAgICBnbG9iYWwgQ09OU1QKKworICAgIHJldHVybiBpbm5lcgorCisKK2RlZiBvdGhlcl90ZXN0XzMoKToKKyAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgcmV0dXJuIENPTlNUCisKKyAgICBnbG9iYWwgQ09OU1QKKyAgICByZXR1cm4gaW5uZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNlZF9wcmlvcl9nbG9iYWxfZGVjbGFyYXRpb24ucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfcHJpb3JfZ2xvYmFsX2RlY2xhcmF0aW9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfcHJpb3JfZ2xvYmFsX2RlY2xhcmF0aW9uLnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX3ByaW9yX2dsb2JhbF9kZWNsYXJhdGlvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzZWRfcHJpb3JfZ2xvYmFsX2RlY2xhcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzU0ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZS91c2VkX3ByaW9yX2dsb2JhbF9kZWNsYXJhdGlvbi50eHQKQEAgLTAsMCArMSBAQAordXNlZC1wcmlvci1nbG9iYWwtZGVjbGFyYXRpb246ODo0OnRlc3Q6TmFtZSAnQ09OU1QnIGlzIHVzZWQgcHJpb3IgdG8gZ2xvYmFsIGRlY2xhcmF0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzaW5nX2NvbnN0YW50X3Rlc3QucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzaW5nX2NvbnN0YW50X3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkMDYyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNpbmdfY29uc3RhbnRfdGVzdC5weQpAQCAtMCwwICsxLDE1MCBAQAorIiIiVmVyaWZ5IGlmIGNvbnN0YW50IHRlc3RzIGFyZSB1c2VkIGluc2lkZSBpZiBzdGF0ZW1lbnRzLiIiIgorIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lLCBtaXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCisjIHB5bGludDogZGlzYWJsZT1uby1pbml0LGV4cHJlc3Npb24tbm90LWFzc2lnbmVkLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1wYXJlbnRoZXNlcy1mb3ItY2FsbC1pbi10ZXN0LCB1bm5lY2Vzc2FyeS1jb21wcmVoZW5zaW9uLCBjb25kaXRpb24tZXZhbHMtdG8tY29uc3RhbnQKKworCitpbXBvcnQgY29sbGVjdGlvbnMKKworCitkZWYgZnVuY3Rpb24oKToKKyAgICB5aWVsZAorCisKK2NsYXNzIENsYXNzKG9iamVjdCk6CisKKyAgICBkZWYgbWV0aG9kKHNlbGYpOgorICAgICAgICBwYXNzCisKKworaW5zdGFuY2UgPSBDbGFzcygpCisKK2lmIGNvbGxlY3Rpb25zOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworIyBHZW5FeHByCitpZiAobm9kZSBmb3Igbm9kZSBpbiByYW5nZSgxMCkpOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworaWYgbGFtYmRhOiBOb25lOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworaWYgZnVuY3Rpb246ICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCitpZiBDbGFzczogIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICBwYXNzCisKK2lmIDI6ICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCitpZiBUcnVlOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworaWYgJyc6ICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCitpZiBiJyc6ICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCitpZiAyLjA6ICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCitpZiB7fTogIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICBwYXNzCisKK2lmIHsxLCAyLCAzfTogIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICBwYXNzCisKK2lmICgxLCAyLCAzKTogIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICBwYXNzCisKK2lmICgpOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworaWYgWzEsIDIsIDNdOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworaWYgW106ICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCisjIEdlbmVyYXRvcgorZ2VuZXJhdG9yID0gZnVuY3Rpb24oKQoraWYgZ2VuZXJhdG9yOiAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIHBhc3MKKworaWYgMSBpZiAyIGVsc2UgMzogIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICBwYXNzCisKK2RlZiB0ZXN0X2NvbXByZWhlbnNpb25zKCk6CisgICAgW2RhdGEgZm9yIGRhdGEgaW4gcmFuZ2UoMTAwKSBpZiBhYnNdICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgW2RhdGEgZm9yIGRhdGEgaW4gcmFuZ2UoMTAwKSBpZiAxXSAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIChkYXRhIGZvciBkYXRhIGluIHJhbmdlKDEwMCkgaWYgYWJzKSAjIFt1c2luZy1jb25zdGFudC10ZXN0XQorICAgIChkYXRhIGZvciBkYXRhIGluIHJhbmdlKDEwMCkgaWYgMSkgIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICB7ZGF0YSBmb3IgZGF0YSBpbiByYW5nZSgxMDApIGlmIGFic30gIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICB7ZGF0YTogMSBmb3IgZGF0YSBpbiByYW5nZSgxMDApIGlmIGFic30gIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKworCisjIFVuYm91bmRNZXRob2QgLyBGdW5jdGlvbgoraWYgQ2xhc3MubWV0aG9kOiAgIyBbdXNpbmctY29uc3RhbnQtdGVzdF0KKyAgICBwYXNzCisKKyMgQm91bmRNZXRob2QKK2lmIGluc3RhbmNlLm1ldGhvZDogICMgW3VzaW5nLWNvbnN0YW50LXRlc3RdCisgICAgcGFzcworCisjIEZvciB0aGVzZSwgd2UgcmVxdWlyZSB0byBkbyBpbmZlcmVuY2UsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgY2FuIGJlIGEKKyMgY29uc3RhbnQgdmFsdWUuIEZvciBzb21lIG9mIHRoZW0sIHdlIGNvdWxkIGRldGVybWluZSB0aGF0IHRoZSB0ZXN0CisjIGlzIGNvbnN0YW50LCBzdWNoIGFzIDIgKyAzLCBidXQgdGhlIGNvbXBvbmVudHMgb2YgdGhlIEJpbk9wCisjIGNhbiBiZSBhbnl0aGluZyBlbHNlICgyICsgc29tZWZ1bmNjYWxsKS4KKworbmFtZSA9IDQyCitpZiBuYW1lOgorICAgIHBhc3MKKworaWYgMyArIDQ6CisgICAgcGFzcworCitpZiAzIGFuZCA0OgorICAgIHBhc3MKKworaWYgbm90IDM6CisgICAgcGFzcworCitpZiBpbnN0YW5jZS5tZXRob2QoKToKKyAgICBwYXNzCisKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3BsYWNlZC1jb21wYXJpc29uLWNvbnN0YW50CitpZiAyIDwgMzoKKyAgICBwYXNzCisKK2lmIHR1cGxlKCgxLCAyLCAzKSk6CisgICAgcGFzcworCitpZiBkaWN0KCk6CisgICAgcGFzcworCitpZiB0dXBsZSgpOgorICAgIHBhc3MKKworaWYgbGlzdCgpOgorICAgIHBhc3MKKworaWYgWzEsIDIsIDNdWzoxXToKKyAgICBwYXNzCisKK2RlZiB0ZXN0KCphcmdzKToKKyAgICBpZiBhcmdzOgorICAgICAgICByZXR1cm4gNDIKKyAgICByZXR1cm4gTm9uZQorCitkZWYgdGVzdF9nb29kX2NvbXByZWhlbnNpb25fY2hlY2tzKCk6CisgICAgW2RhdGEgZm9yIGRhdGEgaW4gcmFuZ2UoMTAwKV0KKyAgICBbZGF0YSBmb3IgZGF0YSBpbiByYW5nZSgxMDApIGlmIGRhdGFdCisgICAgW2RhdGEgZm9yIGRhdGEgaW4gcmFuZ2UoMTAwKSBpZiBhYnMoZGF0YSldCisgICAgKGRhdGEgZm9yIGRhdGEgaW4gcmFuZ2UoMTAwKSBpZiBkYXRhKQorICAgIChkYXRhIGZvciBkYXRhIGluIHJhbmdlKDEwMCkgaWYgYWJzKGRhdGEpKQorICAgIHtkYXRhIGZvciBkYXRhIGluIHJhbmdlKDEwMCkgaWYgZGF0YX0KKyAgICB7ZGF0YSBmb3IgZGF0YSBpbiByYW5nZSgxMDApIGlmIGFicyhkYXRhKX0KKyAgICB7ZGF0YTogMSBmb3IgZGF0YSBpbiByYW5nZSgxMDApIGlmIGRhdGF9CisgICAge2RhdGE6IDEgZm9yIGRhdGEgaW4gcmFuZ2UoMTAwKX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2UvdXNpbmdfY29uc3RhbnRfdGVzdC50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzaW5nX2NvbnN0YW50X3Rlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTEyMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlL3VzaW5nX2NvbnN0YW50X3Rlc3QudHh0CkBAIC0wLDAgKzEsMjYgQEAKK3VzaW5nLWNvbnN0YW50LXRlc3Q6MjI6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjI2OjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDoyOTowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6MzI6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjM1OjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDozODowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6NDE6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjQ0OjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDo0NzowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6NTA6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjUzOjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDo1NjowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6NTk6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjYyOjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDo2NTowOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6Njg6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjczOjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDo3NjozOjpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6ODA6MDp0ZXN0X2NvbXByZWhlbnNpb25zOlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDo4MTowOnRlc3RfY29tcHJlaGVuc2lvbnM6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjgyOjA6dGVzdF9jb21wcmVoZW5zaW9uczpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6ODM6MDp0ZXN0X2NvbXByZWhlbnNpb25zOlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQordXNpbmctY29uc3RhbnQtdGVzdDo4NDowOnRlc3RfY29tcHJlaGVuc2lvbnM6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0Ojg1OjA6dGVzdF9jb21wcmVoZW5zaW9uczpVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK3VzaW5nLWNvbnN0YW50LXRlc3Q6ODk6MDo6VXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCit1c2luZy1jb25zdGFudC10ZXN0OjkzOjA6OlVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19lbHNlX29uX2xvb3AucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX2Vsc2Vfb25fbG9vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjg2ZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19lbHNlX29uX2xvb3AucHkKQEAgLTAsMCArMSwxMDMgQEAKKyIiIkNoZWNrIGZvciBlbHNlIGJyYW5jaGVzIG9uIGxvb3BzIHdpdGggYnJlYWsgYW5kIHJldHVybiBvbmx5LiIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorX19yZXZpc2lvbl9fID0gMAorCitkZWYgdGVzdF9yZXR1cm5fZm9yKCk6CisgICAgIiIiZWxzZSArIHJldHVybiBpcyBub3QgYWNjZXRhYmxlLiIiIgorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgaWYgaSAlIDI6CisgICAgICAgICAgICByZXR1cm4gaQorICAgIGVsc2U6ICAjIFt1c2VsZXNzLWVsc2Utb24tbG9vcF0KKyAgICAgICAgcHJpbnQoJ21hdGggaXMgYnJva2VuJykKKyAgICByZXR1cm4gTm9uZQorCitkZWYgdGVzdF9yZXR1cm5fd2hpbGUoKToKKyAgICAiIiJlbHNlICsgcmV0dXJuIGlzIG5vdCBhY2NldGFibGUuIiIiCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOiAgIyBbdXNlbGVzcy1lbHNlLW9uLWxvb3BdCisgICAgICAgIHByaW50KCdtYXRoIGlzIGJyb2tlbicpCisgICAgcmV0dXJuIE5vbmUKKworCit3aGlsZSBUcnVlOgorICAgIGRlZiBzaG9ydF9mdW4oKToKKyAgICAgICAgIiIiQSBmdW5jdGlvbiB3aXRoIGEgbG9vcC4iIiIKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgYnJlYWsKK2Vsc2U6ICAjIFt1c2VsZXNzLWVsc2Utb24tbG9vcF0KKyAgICBwcmludCgnb3IgZWxzZSEnKQorCisKK3doaWxlIFRydWU6CisgICAgd2hpbGUgRmFsc2U6CisgICAgICAgIGJyZWFrCitlbHNlOiAgIyBbdXNlbGVzcy1lbHNlLW9uLWxvb3BdCisgICAgcHJpbnQoJ29yIGVsc2UhJykKKworZm9yIGogaW4gcmFuZ2UoMTApOgorICAgIHBhc3MKK2Vsc2U6ICAjIFt1c2VsZXNzLWVsc2Utb24tbG9vcF0KKyAgICBwcmludCgnZmF0IGNoYW5jZScpCisgICAgZm9yIGogaW4gcmFuZ2UoMTApOgorICAgICAgICBicmVhaworCisKK2RlZiB0ZXN0X3JldHVybl9mb3IyKCk6CisgICAgIiIibm8gZmFsc2UgcG9zaXRpdmUgZm9yIGJyZWFrIGluIGVsc2UKKworICAgIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9sb2dpbGFiL3B5bGludC9pc3N1ZS8xMTcvdXNlbGVzcy1lbHNlLW9uLWxvb3AtZmFsc2UtcG9zaXRpdmVzCisgICAgIiIiCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBmb3IgXyBpbiByYW5nZShpKToKKyAgICAgICAgICAgIGlmIGkgJSAyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHByaW50KCdncmVhdCBtYXRoJykKKworCitkZWYgdGVzdF9icmVha19pbl9vcmVsc2VfZGVlcCgpOgorICAgICIiIm5vIGZhbHNlIHBvc2l0aXZlIGZvciBicmVhayBpbiBlbHNlIGRlZXBseSBuZXN0ZWQKKyAgICAiIiIKKyAgICBmb3IgXyBpbiByYW5nZSgxMCk6CisgICAgICAgIGlmIDEgPCAyOgorICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICAgICAgaWYgMyA8IDI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgdGVzdF9icmVha19pbl9vcmVsc2VfZGVlcDIoKToKKyAgICAiIiJzaG91bGQgcmlzZSBhIHVzZWxlc3MtZWxzZS1vbi1sb29wIG1lc3NhZ2UsIGFzIHRoZSBicmVhayBzdGF0ZW1lbnQgaXMgb25seQorICAgIGZvciB0aGUgaW5uZXIgZm9yIGxvb3AKKyAgICAiIiIKKyAgICBmb3IgXyBpbiByYW5nZSgxMCk6CisgICAgICAgIGlmIDEgPCAyOgorICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICAgICAgaWYgMyA8IDI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCJhbGwgcmlnaHQiKQorICAgIGVsc2U6ICAjIFt1c2VsZXNzLWVsc2Utb24tbG9vcF0KKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgdGVzdF9icmVha19pbl9vcmVsc2VfZGVlcDMoKToKKyAgICAiIiJubyBmYWxzZSBwb3NpdGl2ZSBmb3IgYnJlYWsgZGVlcGx5IG5lc3RlZCBpbiBlbHNlCisgICAgIiIiCisgICAgZm9yIF8gaW4gcmFuZ2UoMTApOgorICAgICAgICBmb3IgXyBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIDEgPCAyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3NfZWxzZV9vbl9sb29wLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3NfZWxzZV9vbl9sb29wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY4ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19lbHNlX29uX2xvb3AudHh0CkBAIC0wLDAgKzEsNiBAQAordXNlbGVzcy1lbHNlLW9uLWxvb3A6MTA6NDp0ZXN0X3JldHVybl9mb3I6RWxzZSBjbGF1c2Ugb24gbG9vcCB3aXRob3V0IGEgYnJlYWsgc3RhdGVtZW50Cit1c2VsZXNzLWVsc2Utb24tbG9vcDoxODo0OnRlc3RfcmV0dXJuX3doaWxlOkVsc2UgY2xhdXNlIG9uIGxvb3Agd2l0aG91dCBhIGJyZWFrIHN0YXRlbWVudAordXNlbGVzcy1lbHNlLW9uLWxvb3A6Mjg6MDo6RWxzZSBjbGF1c2Ugb24gbG9vcCB3aXRob3V0IGEgYnJlYWsgc3RhdGVtZW50Cit1c2VsZXNzLWVsc2Utb24tbG9vcDozNTowOjpFbHNlIGNsYXVzZSBvbiBsb29wIHdpdGhvdXQgYSBicmVhayBzdGF0ZW1lbnQKK3VzZWxlc3MtZWxzZS1vbi1sb29wOjQwOjA6OkVsc2UgY2xhdXNlIG9uIGxvb3Agd2l0aG91dCBhIGJyZWFrIHN0YXRlbWVudAordXNlbGVzcy1lbHNlLW9uLWxvb3A6ODc6NDp0ZXN0X2JyZWFrX2luX29yZWxzZV9kZWVwMjpFbHNlIGNsYXVzZSBvbiBsb29wIHdpdGhvdXQgYSBicmVhayBzdGF0ZW1lbnQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfb2JqZWN0X2luaGVyaXRhbmNlLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19vYmplY3RfaW5oZXJpdGFuY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyYzgxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfb2JqZWN0X2luaGVyaXRhbmNlLnB5CkBAIC0wLDAgKzEsMjcgQEAKKyIiIkNoZWNrIGlmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBvYmplY3QuCitJbiBweXRob24zIGV2ZXJ5IGNsYXNzIGltcGxpY2l0bHkgaW5oZXJpdHMgZnJvbSBvYmplY3QsIHRoZXJlZm9yZSBnaXZlIHJlZmFjdG9yaW5nIG1lc3NhZ2UgdG8KKyByZW1vdmUgb2JqZWN0IGZyb20gYmFzZXMiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWluaXQsIGludmFsaWQtbmFtZSwgbWlzc2luZy1kb2NzdHJpbmcsIHRvby1mZXctcHVibGljLW1ldGhvZHMKKyMgcHlsaW50OiBkaXNhYmxlPWluY29uc2lzdGVudC1tcm8KK2ltcG9ydCBhYmMKKworY2xhc3MgQShvYmplY3QpOiAgICAjIFt1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZV0KKyAgICBwYXNzCisKK2NsYXNzIEI6CisgICAgcGFzcworCitjbGFzcyBDKEIsIG9iamVjdCk6ICMgW3VzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlXQorICAgIHBhc3MKKworY2xhc3MgRChvYmplY3QsIEMsIG1ldGFjbGFzcz1hYmMuQUJDTWV0YSk6ICAgIyBbdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2VdCisgICAgcGFzcworCitjbGFzcyBFKEQsIEMsIG9iamVjdCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKTogICAjIFt1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZV0KKyAgICBwYXNzCisKK2NsYXNzIEYoQSk6ICMgcG9zaXRpdmUgdGVzdCBjYXNlCisgICAgcGFzcworCitjbGFzcyBHKEIpOiAjIHBvc2l0aXZlIHRlc3QgY2FzZQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfb2JqZWN0X2luaGVyaXRhbmNlLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfb2JqZWN0X2luaGVyaXRhbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE4NjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19vYmplY3RfaW5oZXJpdGFuY2UudHh0CkBAIC0wLDAgKzEsNCBAQAordXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2U6ODowOkE6Q2xhc3MgJ0EnIGluaGVyaXRzIGZyb20gb2JqZWN0LCBjYW4gYmUgc2FmZWx5IHJlbW92ZWQgZnJvbSBiYXNlcyBpbiBweXRob24zCit1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZToxNDowOkM6Q2xhc3MgJ0MnIGluaGVyaXRzIGZyb20gb2JqZWN0LCBjYW4gYmUgc2FmZWx5IHJlbW92ZWQgZnJvbSBiYXNlcyBpbiBweXRob24zCit1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZToxNzowOkQ6Q2xhc3MgJ0QnIGluaGVyaXRzIGZyb20gb2JqZWN0LCBjYW4gYmUgc2FmZWx5IHJlbW92ZWQgZnJvbSBiYXNlcyBpbiBweXRob24zCit1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZToyMDowOkU6Q2xhc3MgJ0UnIGluaGVyaXRzIGZyb20gb2JqZWN0LCBjYW4gYmUgc2FmZWx5IHJlbW92ZWQgZnJvbSBiYXNlcyBpbiBweXRob24zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3JldHVybi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3NfcmV0dXJuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3JldHVybi5weQpAQCAtMCwwICsxLDE1IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLXNlbGYtdXNlLGJhZC1vcHRpb24tdmFsdWUsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2RlZiBteWZ1bmMoKTogIyBbdXNlbGVzcy1yZXR1cm5dCisgICAgcHJpbnQoJy0tLS0gdGVzdGluZyAtLS0nKQorICAgIHJldHVybgorCitjbGFzcyBTb21lQ2xhc3Mob2JqZWN0KToKKyAgICBkZWYgbXltZXRob2Qoc2VsZik6ICMgW3VzZWxlc3MtcmV0dXJuXQorICAgICAgICBwcmludCgnLS0tLSB0ZXN0aW5nIC0tLScpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFRoZXNlIGFyZSBub3QgZW1pdHRlZAorICAgIGRlZiBpdGVtX2F0KHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19yZXR1cm4udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19yZXR1cm4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTliNDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3JldHVybi50eHQKQEAgLTAsMCArMSwyIEBACit1c2VsZXNzLXJldHVybjo0OjA6bXlmdW5jOlVzZWxlc3MgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiBvciBtZXRob2QKK3VzZWxlc3MtcmV0dXJuOjk6NDpTb21lQ2xhc3MubXltZXRob2Q6VXNlbGVzcyByZXR1cm4gYXQgZW5kIG9mIGZ1bmN0aW9uIG9yIG1ldGhvZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMmM3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb24ucHkKQEAgLTAsMCArMSwyNjIgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBuby1tZW1iZXIsIG5vLXNlbGYtdXNlLCBiYWQtc3VwZXItY2FsbAorIyBweWxpbnQ6IGRpc2FibGU9dG9vLWZldy1wdWJsaWMtbWV0aG9kcywgdW51c2VkLWFyZ3VtZW50LCBpbnZhbGlkLW5hbWUsIHRvby1tYW55LXB1YmxpYy1tZXRob2RzCisjIHB5bGludDogZGlzYWJsZT1saW5lLXRvby1sb25nLCB1c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZSwgYXJndW1lbnRzLW91dC1vZi1vcmRlcgorIyBweWxpbnQ6IGRpc2FibGU9c3VwZXItd2l0aC1hcmd1bWVudHMsIGRhbmdlcm91cy1kZWZhdWx0LXZhbHVlCisKK2RlZiBub3RfYV9tZXRob2QocGFyYW0sIHBhcmFtMik6CisgICAgcmV0dXJuIHN1cGVyKE5vbmUsIE5vbmUpLm5vdF9hX21ldGhvZChwYXJhbSwgcGFyYW0yKQorCisKK2NsYXNzIFN1cGVyQmFzZShvYmplY3QpOgorICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0ib25seV9pbl9zdXBlcl9iYXNlIik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnX2JpcyhzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9Im9ubHlfaW5fc3VwZXJfYmFzZSIpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ190ZXIoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPSJ3aWxsX2JlX2NoYW5nZWQiKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmdfcXVhZChzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9IndpbGxfYmVfY2hhbmdlZCIpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgQmFzZShTdXBlckJhc2UpOgorCisgICAgZmFrZV9tZXRob2QgPSBub3RfYV9tZXRob2QKKworICAgIGRlZiBzb21ldGhpbmcoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnQoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPSJkZWZhdWx0Iik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnRfYmlzKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0iZGVmYXVsdCIpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2l0aG91dF9kZWZhdWx0X2FyZ3VtZW50KHNlbGYsIGZpcnN0LCBzZWNvbmQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ3VtZW50X25vbmUoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPU5vbmUpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2l0aG91dF9kZWZhdWx0X2FyZ3VtZW50MihzZWxmLCBmaXJzdCwgc2Vjb25kKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmd1bWVudF9pbnQoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPTQyKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmd1bWVudF90dXBsZShzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9KCkpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ3VtZW50X2RpY3Qoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPXt9KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmdfdGVyKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0iaGFzX2JlZW5fY2hhbmdlZCIpOgorICAgICAgICBzdXBlcigpLndpdGhfZGVmYXVsdF9hcmdfdGVyKGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnX3F1YWQoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPSJoYXNfYmVlbl9jaGFuZ2VkIik6CisgICAgICAgIHN1cGVyKCkud2l0aF9kZWZhdWx0X2FyZ19xdWFkKGZpcnN0LCBkZWZhdWx0X2FyZykKKworY2xhc3MgTm90VXNlbGVzc1N1cGVyKEJhc2UpOgorCisgICAgZGVmIG11bHRpcGxlX3N0YXRlbWVudHMoc2VsZik6CisgICAgICAgIGZpcnN0ID0gNDIgKiAyNAorICAgICAgICByZXR1cm4gc3VwZXIoKS5tdWx0aXBsZV9zdGF0ZW1lbnRzKCkgKyBmaXJzdAorCisgICAgZGVmIG5vdF9hX2NhbGwoc2VsZik6CisgICAgICAgIHJldHVybiAxICsgMgorCisgICAgZGVmIG5vdF9zdXBlcl9jYWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5fX2NsYXNzX18KKworICAgIGRlZiBub3Rfc3VwZXJfYXR0cmlidXRlX2FjY2VzcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkKKworICAgIGRlZiBpbnZhbGlkX3N1cGVyX2NhbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIDEpLmludmFsaWRfc3VwZXJfY2FsbCgpCisKKyAgICBkZWYgb3RoZXJfaW52YWxpZF9zdXBlcl9jYWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc3VwZXIoMiwgMywgNCwgNSkub3RoZXJfaW52YWxpZF9zdXBlcl9jYWxsKCkKKworICAgIGRlZiBkaWZmZXJlbnRfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuc29tZXRoaW5nKCkKKworICAgIGRlZiBkaWZmZXJlbnRfc3VwZXJfbXJvX3BvaW50ZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzdXBlcihCYXNlLCBzZWxmKS5kaWZmZXJlbnRfc3VwZXJfbXJvX3BvaW50ZXIoKQorCisgICAgZGVmIGRpZmZlcmVudF9zdXBlcl90eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBOb3RVc2VsZXNzU3VwZXIpLmRpZmZlcmVudF9zdXBlcl90eXBlKCkKKworICAgIGRlZiBvdGhlcl9kaWZmZXJlbnRfc3VwZXJfdHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgMSkub3RoZXJfZGlmZmVyZW50X3N1cGVyX3R5cGUoKQorCisgICAgZGVmIG5vdF9wYXNzaW5nX3BhcmFtKHNlbGYsIGZpcnN0KToKKyAgICAgICAgcmV0dXJuIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikubm90X3Bhc3NpbmdfcGFyYW0oKQorCisgICAgZGVmIG1vZGlmeWluZ19wYXJhbShzZWxmLCBmaXJzdCk6CisgICAgICAgIHJldHVybiBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLm1vZGlmeWluZ19wYXJhbShmaXJzdCArIDEpCisKKyAgICBkZWYgdHJhbnNmb3JtaW5nX3BhcmFtKHNlbGYsIGZpcnN0KToKKyAgICAgICAgcmV0dXJuIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikudHJhbnNmb3JtaW5nX3BhcmFtKHR5cGUoZmlyc3QpKQorCisgICAgZGVmIG1vZGlmeWluZ192YXJpYWRpYyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLm1vZGlmeWluZ192YXJpYWRpYyh0dXBsZShhcmdzKSkKKworICAgIGRlZiBub3RfcGFzc2luZ19rZXl3b3JkX3ZhcmlhZGljcyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS5ub3RfcGFzc2luZ19rZXl3b3JkX3ZhcmlhZGljcygqYXJncykKKworICAgIGRlZiBub3RfcGFzc2luZ19kZWZhdWx0KHNlbGYsIGZpcnN0LCBzZWNvbmQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLm5vdF9wYXNzaW5nX2RlZmF1bHQoZmlyc3QpCisKKyAgICBkZWYgcGFzc2luZ19vbmx5X2FfaGFuZGZ1bChzZWxmLCBmaXJzdCwgc2Vjb25kLCB0aGlyZCwgZm91cnRoKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikucGFzc2luZ19vbmx5X2FfaGFuZGZ1bCgKKyAgICAgICAgICAgIGZpcnN0LCBzZWNvbmQpCisKKyAgICBkZWYgbm90X3RoZV9zYW1lX29yZGVyKHNlbGYsIGZpcnN0LCBzZWNvbmQsIHRoaXJkKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikubm90X3RoZV9zYW1lX29yZGVyKHRoaXJkLCBmaXJzdCwgc2Vjb25kKQorCisgICAgZGVmIG5vX2t3YXJnc19pbl9zaWduYXR1cmUoc2VsZiwga2V5PU5vbmUpOgorICAgICAgICB2YWx1ZXMgPSB7J2tleSc6ICdzb21ldGhpbmcnfQorICAgICAgICByZXR1cm4gc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS5ub19rd2FyZ3NfaW5fc2lnbmF0dXJlKCoqdmFsdWVzKQorCisgICAgZGVmIG5vX2FyZ3NfaW5fc2lnbmF0dXJlKHNlbGYsIGZpcnN0LCBzZWNvbmQpOgorICAgICAgICB2YWx1ZXMgPSAoZmlyc3QgKyAxLCBzZWNvbmQgKyAyKQorICAgICAgICByZXR1cm4gc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS5ub19hcmdzX2luX3NpZ25hdHVyZSgqdmFsdWVzKQorCisgICAgZGVmIHZhcmlhZGljc193aXRoX211bHRpcGxlX2tleXdvcmRfYXJndW1lbnRzKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikudmFyaWFkaWNzX3dpdGhfbXVsdGlwbGVfa2V5d29yZF9hcmd1bWVudHMoCisgICAgICAgICAgICBmaXJzdD1Ob25lLAorICAgICAgICAgICAgc2Vjb25kPU5vbmUsCisgICAgICAgICAgICAqKmt3YXJncykKKworICAgIGRlZiBleHRyYW5lb3VzX2tleXdvcmRfcGFyYW1zKHNlbGYsIG5vbmVfb2s9RmFsc2UpOgorICAgICAgICBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLmV4dHJhbmVvdXNfa2V5d29yZF9wYXJhbXMoCisgICAgICAgICAgICBub25lX29rLAorICAgICAgICAgICAgdmFsaWRfdmFsdWVzPVsyMywgNDJdKQorCisgICAgZGVmIGV4dHJhbmVvdXNfcG9zaXRpb25hbF9hcmdzKHNlbGYsICoqYXJncyk6CisgICAgICAgIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikuZXh0cmFuZW91c19wb3NpdGlvbmFsX2FyZ3MoCisgICAgICAgICAgICAxLCAyLCAqKmFyZ3MpCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ3VtZW50KHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0ib3RoZXIiKToKKyAgICAgICAgIyBOb3QgdXNlbGVzcyBiZWNhdXNlIHRoZSBkZWZhdWx0X2FyZyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluIHRoZSBiYXNlIGNsYXNzCisgICAgICAgIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikud2l0aF9kZWZhdWx0X2FyZ3VtZW50KGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiB3aXRob3V0X2RlZmF1bHRfYXJndW1lbnQoc2VsZiwgZmlyc3QsIHNlY29uZD1UcnVlKToKKyAgICAgICAgIyBOb3QgdXNlbGVzcyBiZWNhdXNlIGluIHRoZSBiYXNlIGNsYXNzIHRoZXJlIGlzIG5vdCBkZWZhdWx0IHZhbHVlIGZvciBzZWNvbmQgYXJndW1lbnQKKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS53aXRob3V0X2RlZmF1bHRfYXJndW1lbnQoZmlyc3QsIHNlY29uZCkKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnRfbm9uZShzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9J05vdE5vbmUnKToKKyAgICAgICAgIyBOb3QgdXNlbGVzcyBiZWNhdXNlIHRoZSBkZWZhdWx0X2FyZyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluIHRoZSBiYXNlIGNsYXNzCisgICAgICAgIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikud2l0aF9kZWZhdWx0X2FyZ3VtZW50X25vbmUoZmlyc3QsIGRlZmF1bHRfYXJnKQorCisgICAgZGVmIHdpdGhvdXRfZGVmYXVsdF9hcmd1bWVudDIoc2VsZiwgZmlyc3QsIHNlY29uZD1Ob25lKToKKyAgICAgICAgIyBOb3QgdXNlbGVzcyBiZWNhdXNlIGluIHRoZSBiYXNlIGNsYXNzIHRoZXJlIGlzIG5vdCBkZWZhdWx0IHZhbHVlIGZvciBzZWNvbmQgYXJndW1lbnQKKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS53aXRob3V0X2RlZmF1bHRfYXJndW1lbnQyKGZpcnN0LCBzZWNvbmQpCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ3VtZW50X2ludChzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9IjQyIik6CisgICAgICAgICMgTm90IHVzZWxlc3MgYmVjYXVzZSB0aGUgZGVmYXVsdF9hcmcgaXMgYSBzdHJpbmcgd2hlcmVhcyBpbiB0aGUgYmFzZSBjbGFzcyBpdCdzIGFuIGludAorICAgICAgICBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmd1bWVudF9pbnQoZmlyc3QsIGRlZmF1bHRfYXJnKQorCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmd1bWVudF90dXBsZShzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9KCI0MiIsICJhIikpOgorICAgICAgICAjIE5vdCB1c2VsZXNzIGJlY2F1c2UgdGhlIGRlZmF1bHRfYXJnIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgaW4gdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJndW1lbnRfdHVwbGUoZmlyc3QsIGRlZmF1bHRfYXJnKQorCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmd1bWVudF9kaWN0KHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz17J2Zvbyc6ICdiYXInfSk6CisgICAgICAgICMgTm90IHVzZWxlc3MgYmVjYXVzZSB0aGUgZGVmYXVsdF9hcmcgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbiB0aGUgYmFzZSBjbGFzcworICAgICAgICBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmd1bWVudF9kaWN0KGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnRfYmlzKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0iZGVmYXVsdCIpOgorICAgICAgICAjIEFsdGhvdWdoIHRoZSBkZWZhdWx0X2FyZyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgYmFzZSBjbGFzcywgdGhlIGNhbGwgc2lnbmF0dXJlCisgICAgICAgICMgZGlmZmVycy4gVGh1cyBpdCBpcyBub3QgdXNlbGVzcy4KKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJndW1lbnRfYmlzKGRlZmF1bHRfYXJnICsgIl9hcmd1bWVudCIpCisKKyAgICBkZWYgZmFrZV9tZXRob2Qoc2VsZiwgcGFyYW0yPSJvdGhlciIpOgorICAgICAgICBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLmZha2VfbWV0aG9kKHBhcmFtMikKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0ib25seV9pbl9zdXBlcl9iYXNlIik6CisgICAgICAgICMgTm90IHVzZWxlc3MgYmVjYXVzZSB0aGUgY2FsbCBvZiB0aGlzIG1ldGhvZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlCisgICAgICAgIHN1cGVyKE5vdFVzZWxlc3NTdXBlciwgc2VsZikud2l0aF9kZWZhdWx0X2FyZyhmaXJzdCwgZGVmYXVsdF9hcmcgKyAiX2FuZF9oZXJlIikKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnX2JpcyhzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9ImRlZmF1bHRfY2hhbmdlZCIpOgorICAgICAgICAjIE5vdCB1c2VsZXNzIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIFN1cGVyQmFzZSBvbmUKKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJnX2JpcyhmaXJzdCwgZGVmYXVsdF9hcmcpCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ190ZXIoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPSJoYXNfYmVlbl9jaGFuZ2VkX2FnYWluIik6CisgICAgICAgICMgTm90IHVzZWxlc3MgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgQmFzZSBvbmUKKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJnX3RlcihmaXJzdCwgZGVmYXVsdF9hcmcpCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ19xdWFkKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0iaGFzX2JlZW5fY2hhbmdlZCIpOgorICAgICAgICAjIE5vdCB1c2VsZXNzIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIGJhc2UgYnV0IHRoZQorICAgICAgICAjIGNhbGwgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpZ25hdHVyZQorICAgICAgICBzdXBlcihOb3RVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmdfcXVhZChmaXJzdCwgZGVmYXVsdF9hcmcgKyAiX2FuZF9tb2RpZmllZCIpCisKKworY2xhc3MgVXNlbGVzc1N1cGVyKEJhc2UpOgorCisgICAgZGVmIGVxdWl2YWxlbnRfcGFyYW1zKHNlbGYpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHJldHVybiBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLmVxdWl2YWxlbnRfcGFyYW1zKCkKKworICAgIGRlZiBlcXVpdmFsZW50X3BhcmFtc18xKHNlbGYsIGZpcnN0KTogIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICByZXR1cm4gc3VwZXIoVXNlbGVzc1N1cGVyLCBzZWxmKS5lcXVpdmFsZW50X3BhcmFtc18xKGZpcnN0KQorCisgICAgZGVmIGVxdWl2YWxlbnRfcGFyYW1zXzIoc2VsZiwgKmFyZ3MpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHJldHVybiBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLmVxdWl2YWxlbnRfcGFyYW1zXzIoKmFyZ3MpCisKKyAgICBkZWYgZXF1aXZhbGVudF9wYXJhbXNfMyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHJldHVybiBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLmVxdWl2YWxlbnRfcGFyYW1zXzMoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGVxdWl2YWxlbnRfcGFyYW1zXzQoc2VsZiwgZmlyc3QpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHN1cGVyKFVzZWxlc3NTdXBlciwgc2VsZikuZXF1aXZhbGVudF9wYXJhbXNfNChmaXJzdCkKKworICAgIGRlZiBlcXVpdmFsZW50X3BhcmFtc181KHNlbGYsIGZpcnN0LCAqYXJncyk6ICMgW3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbl0KKyAgICAgICAgc3VwZXIoVXNlbGVzc1N1cGVyLCBzZWxmKS5lcXVpdmFsZW50X3BhcmFtc181KGZpcnN0LCAqYXJncykKKworICAgIGRlZiBlcXVpdmFsZW50X3BhcmFtc182KHNlbGYsIGZpcnN0LCAqYXJncywgKiprd2FyZ3MpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHJldHVybiBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLmVxdWl2YWxlbnRfcGFyYW1zXzYoZmlyc3QsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnQoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPSJkZWZhdWx0Iik6ICMgW3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbl0KKyAgICAgICAgIyB1c2VsZXNzIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZSBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgYmFzZSBjbGFzcworICAgICAgICByZXR1cm4gc3VwZXIoVXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJndW1lbnQoZmlyc3QsIGRlZmF1bHRfYXJnKQorCisgICAgZGVmIHdpdGhvdXRfZGVmYXVsdF9hcmd1bWVudChzZWxmLCBmaXJzdCwgc2Vjb25kKTogIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICByZXR1cm4gc3VwZXIoVXNlbGVzc1N1cGVyLCBzZWxmKS53aXRob3V0X2RlZmF1bHRfYXJndW1lbnQoZmlyc3QsIHNlY29uZCkKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnRfbm9uZShzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9Tm9uZSk6ICMgW3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbl0KKyAgICAgICAgIyB1c2VsZXNzIGJlY2F1c2UgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZSBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgYmFzZSBjbGFzcworICAgICAgICBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmd1bWVudF9ub25lKGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnRfaW50KHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz00Mik6ICMgW3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbl0KKyAgICAgICAgc3VwZXIoVXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJndW1lbnRfaW50KGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJndW1lbnRfdHVwbGUoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPSgpKTogIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmd1bWVudF90dXBsZShmaXJzdCwgZGVmYXVsdF9hcmcpCisKKyAgICBkZWYgd2l0aF9kZWZhdWx0X2FyZ3VtZW50X2RpY3Qoc2VsZiwgZmlyc3QsIGRlZmF1bHRfYXJnPXt9KTogIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmd1bWVudF9kaWN0KGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKTogIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLl9faW5pdF9fKCkKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0ib25seV9pbl9zdXBlcl9iYXNlIik6ICMgW3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbl0KKyAgICAgICAgc3VwZXIoVXNlbGVzc1N1cGVyLCBzZWxmKS53aXRoX2RlZmF1bHRfYXJnKGZpcnN0LCBkZWZhdWx0X2FyZykKKworICAgIGRlZiB3aXRoX2RlZmF1bHRfYXJnX2JpcyhzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9Im9ubHlfaW5fc3VwZXJfYmFzZSIpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHN1cGVyKFVzZWxlc3NTdXBlciwgc2VsZikud2l0aF9kZWZhdWx0X2FyZ19iaXMoZmlyc3QsIGRlZmF1bHRfYXJnKQorCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmdfdGVyKHNlbGYsIGZpcnN0LCBkZWZhdWx0X2FyZz0iaGFzX2JlZW5fY2hhbmdlZCIpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHN1cGVyKFVzZWxlc3NTdXBlciwgc2VsZikud2l0aF9kZWZhdWx0X2FyZ190ZXIoZmlyc3QsIGRlZmF1bHRfYXJnKQorCisgICAgZGVmIHdpdGhfZGVmYXVsdF9hcmdfcXVhZChzZWxmLCBmaXJzdCwgZGVmYXVsdF9hcmc9Imhhc19iZWVuX2NoYW5nZWQiKTogIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICBzdXBlcihVc2VsZXNzU3VwZXIsIHNlbGYpLndpdGhfZGVmYXVsdF9hcmdfcXVhZChmaXJzdCwgZGVmYXVsdF9hcmcpCisKKworZGVmIHRyaWdnZXJfc29tZXRoaW5nKHZhbHVlX3RvX3RyaWdnZXIpOgorICAgIHBhc3MKKworCitjbGFzcyBOb3RVc2VsZXNzU3VwZXJEZWNvcmF0b3JzKEJhc2UpOgorICAgIEB0cmlnZ2VyX3NvbWV0aGluZygndmFsdWUxJykKKyAgICBkZWYgbWV0aG9kX2RlY29yYXRlZChzZWxmKToKKyAgICAgICAgc3VwZXIoTm90VXNlbGVzc1N1cGVyRGVjb3JhdG9ycywgc2VsZikubWV0aG9kX2RlY29yYXRlZCgpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb24udHh0IGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmRhZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uLnR4dApAQCAtMCwwICsxLDE4IEBACit1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb246MTk4OjQ6VXNlbGVzc1N1cGVyLmVxdWl2YWxlbnRfcGFyYW1zOlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJ2VxdWl2YWxlbnRfcGFyYW1zJwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIwMTo0OlVzZWxlc3NTdXBlci5lcXVpdmFsZW50X3BhcmFtc18xOlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJ2VxdWl2YWxlbnRfcGFyYW1zXzEnCit1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb246MjA0OjQ6VXNlbGVzc1N1cGVyLmVxdWl2YWxlbnRfcGFyYW1zXzI6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnZXF1aXZhbGVudF9wYXJhbXNfMicKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoyMDc6NDpVc2VsZXNzU3VwZXIuZXF1aXZhbGVudF9wYXJhbXNfMzpVc2VsZXNzIHN1cGVyIGRlbGVnYXRpb24gaW4gbWV0aG9kICdlcXVpdmFsZW50X3BhcmFtc18zJwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIxMDo0OlVzZWxlc3NTdXBlci5lcXVpdmFsZW50X3BhcmFtc180OlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJ2VxdWl2YWxlbnRfcGFyYW1zXzQnCit1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb246MjEzOjQ6VXNlbGVzc1N1cGVyLmVxdWl2YWxlbnRfcGFyYW1zXzU6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnZXF1aXZhbGVudF9wYXJhbXNfNScKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoyMTY6NDpVc2VsZXNzU3VwZXIuZXF1aXZhbGVudF9wYXJhbXNfNjpVc2VsZXNzIHN1cGVyIGRlbGVnYXRpb24gaW4gbWV0aG9kICdlcXVpdmFsZW50X3BhcmFtc182JwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIxOTo0OlVzZWxlc3NTdXBlci53aXRoX2RlZmF1bHRfYXJndW1lbnQ6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnd2l0aF9kZWZhdWx0X2FyZ3VtZW50JwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIyMzo0OlVzZWxlc3NTdXBlci53aXRob3V0X2RlZmF1bHRfYXJndW1lbnQ6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnd2l0aG91dF9kZWZhdWx0X2FyZ3VtZW50JwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIyNjo0OlVzZWxlc3NTdXBlci53aXRoX2RlZmF1bHRfYXJndW1lbnRfbm9uZTpVc2VsZXNzIHN1cGVyIGRlbGVnYXRpb24gaW4gbWV0aG9kICd3aXRoX2RlZmF1bHRfYXJndW1lbnRfbm9uZScKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoyMzA6NDpVc2VsZXNzU3VwZXIud2l0aF9kZWZhdWx0X2FyZ3VtZW50X2ludDpVc2VsZXNzIHN1cGVyIGRlbGVnYXRpb24gaW4gbWV0aG9kICd3aXRoX2RlZmF1bHRfYXJndW1lbnRfaW50JwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIzMzo0OlVzZWxlc3NTdXBlci53aXRoX2RlZmF1bHRfYXJndW1lbnRfdHVwbGU6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnd2l0aF9kZWZhdWx0X2FyZ3VtZW50X3R1cGxlJwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjIzNjo0OlVzZWxlc3NTdXBlci53aXRoX2RlZmF1bHRfYXJndW1lbnRfZGljdDpVc2VsZXNzIHN1cGVyIGRlbGVnYXRpb24gaW4gbWV0aG9kICd3aXRoX2RlZmF1bHRfYXJndW1lbnRfZGljdCcKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoyMzk6NDpVc2VsZXNzU3VwZXIuX19pbml0X186VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnX19pbml0X18nCit1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb246MjQyOjQ6VXNlbGVzc1N1cGVyLndpdGhfZGVmYXVsdF9hcmc6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnd2l0aF9kZWZhdWx0X2FyZycKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoyNDU6NDpVc2VsZXNzU3VwZXIud2l0aF9kZWZhdWx0X2FyZ19iaXM6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnd2l0aF9kZWZhdWx0X2FyZ19iaXMnCit1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb246MjQ4OjQ6VXNlbGVzc1N1cGVyLndpdGhfZGVmYXVsdF9hcmdfdGVyOlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJ3dpdGhfZGVmYXVsdF9hcmdfdGVyJwordXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uOjI1MTo0OlVzZWxlc3NTdXBlci53aXRoX2RlZmF1bHRfYXJnX3F1YWQ6VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnd2l0aF9kZWZhdWx0X2FyZ19xdWFkJwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uX3B5My5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyY2VkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTMucHkKQEAgLTAsMCArMSw0MyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIG5vLW1lbWJlciwgdW51c2VkLWFyZ3VtZW50LCBpbnZhbGlkLW5hbWUsdW51c2VkLXZhcmlhYmxlCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzLHdyb25nLWltcG9ydC1wb3NpdGlvbiwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKworY2xhc3MgTm90VXNlbGVzc1N1cGVyKG9iamVjdCk6CisKKyAgICBkZWYgbm90X3Bhc3Npbmdfa2V5d29yZF9vbmx5KHNlbGYsIGZpcnN0LCAqLCBzZWNvbmQpOgorICAgICAgICByZXR1cm4gc3VwZXIoKS5ub3RfcGFzc2luZ19rZXl3b3JkX29ubHkoZmlyc3QpCisKKyAgICBkZWYgcGFzc2luZ19rZXl3b3JkX29ubHlfd2l0aF9tb2RpZmljYXRpb25zKHNlbGYsIGZpcnN0LCAqLCBzZWNvbmQpOgorICAgICAgICByZXR1cm4gc3VwZXIoKS5wYXNzaW5nX2tleXdvcmRfb25seV93aXRoX21vZGlmaWNhdGlvbnMoCisgICAgICAgICAgICBmaXJzdCwgc2Vjb25kICsgMSkKKworCitjbGFzcyBBbHNvTm90VXNlbGVzc1N1cGVyKE5vdFVzZWxlc3NTdXBlcik6CisgICAgZGVmIG5vdF9wYXNzaW5nX2tleXdvcmRfb25seShzZWxmLCBmaXJzdCwgKiwgc2Vjb25kPSJzZWNvbmQiKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkubm90X3Bhc3Npbmdfa2V5d29yZF9vbmx5KGZpcnN0LCBzZWNvbmQ9c2Vjb25kKQorCisKK2NsYXNzIFVzZWxlc3NTdXBlcihvYmplY3QpOgorCisgICAgZGVmIHVzZWxlc3Moc2VsZiwgKiwgZmlyc3QpOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHN1cGVyKCkudXNlbGVzcyhmaXJzdD1maXJzdCkKKworCitjbGFzcyBFZ2coKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGhpbmc6IG9iamVjdCkgLT4gTm9uZToKKyAgICAgICAgcGFzcworCitjbGFzcyBTcGFtKEVnZyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRoaW5nOiBpbnQpIC0+IE5vbmU6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18odGhpbmcpCisKK2NsYXNzIEhhbShFZ2cpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aGluZzogb2JqZWN0KSAtPiBOb25lOiAjIFt1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb25dCisgICAgICAgIHN1cGVyKCkuX19pbml0X18odGhpbmcpCisKKworZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKKworCitjbGFzcyBUZXN0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfYXJnOiBMaXN0W2ludF0pIC0+IE5vbmU6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uX3B5My5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5M2JlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTMucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4wCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWZkYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzLnR4dApAQCAtMCwwICsxLDIgQEAKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoyMTo0OlVzZWxlc3NTdXBlci51c2VsZXNzOlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJ3VzZWxlc3MnCit1c2VsZXNzLXN1cGVyLWRlbGVnYXRpb246MzQ6NDpIYW0uX19pbml0X186VXNlbGVzcyBzdXBlciBkZWxlZ2F0aW9uIGluIG1ldGhvZCAnX19pbml0X18nCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzNS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDMwZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzNS5weQpAQCAtMCwwICsxLDEyIEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzLG5vLW1lbWJlcix1bnVzZWQtYXJndW1lbnQsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCisKK2NsYXNzIE5vdFVzZWxlc3NTdXBlcihvYmplY3QpOgorCisgICAgZGVmIG5vdF9wYXNzaW5nX2FsbF9wYXJhbXMoc2VsZiwgZmlyc3QsICphcmdzLCBzZWNvbmQ9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc3VwZXIoKS5ub3RfcGFzc2luZ19hbGxfcGFyYW1zKCphcmdzLCBzZWNvbmQsICoqa3dhcmdzKQorCisKK2NsYXNzIFVzZWxlc3NTdXBlcihvYmplY3QpOgorCisgICAgZGVmIHVzZWxlc3Moc2VsZiwgZmlyc3QsICosIHNlY29uZD1Ob25lLCAqKmt3YXJncyk6ICMgW3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbl0KKyAgICAgICAgcmV0dXJuIHN1cGVyKCkudXNlbGVzcyhmaXJzdCwgc2Vjb25kPXNlY29uZCwgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzNS5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM1LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGU4YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzNS5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM1LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJjZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uX3B5MzUudHh0CkBAIC0wLDAgKzEgQEAKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoxMTo0OlVzZWxlc3NTdXBlci51c2VsZXNzOlVzZWxlc3Mgc3VwZXIgZGVsZWdhdGlvbiBpbiBtZXRob2QgJ3VzZWxlc3MnCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzOC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDAyMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzOC5weQpAQCAtMCwwICsxLDE3IEBACisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZyx0b28tZmV3LXB1YmxpYy1tZXRob2RzCitmcm9tIHR5cGluZyBpbXBvcnQgQW55CisKKworY2xhc3MgRWdnOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdDogQW55LCAvLCBzZWNvbmQ6IEFueSkgLT4gTm9uZToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIFNwYW0oRWdnKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3Q6IGZsb2F0LCAvLCBzZWNvbmQ6IGZsb2F0KSAtPiBOb25lOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKGZpcnN0LCBzZWNvbmQpCisKKworY2xhc3MgSGFtKEVnZyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0OiBBbnksIC8sIHNlY29uZDogQW55KSAtPiBOb25lOiAgIyBbdXNlbGVzcy1zdXBlci1kZWxlZ2F0aW9uXQorICAgICAgICBzdXBlcigpLl9faW5pdF9fKGZpcnN0LCBzZWNvbmQpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzOC5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM4LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmM1MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3UvdXNlbGVzcy91c2VsZXNzX3N1cGVyX2RlbGVnYXRpb25fcHkzOC5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjgKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM4LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdS91c2VsZXNzL3VzZWxlc3Nfc3VwZXJfZGVsZWdhdGlvbl9weTM4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzM0NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC91L3VzZWxlc3MvdXNlbGVzc19zdXBlcl9kZWxlZ2F0aW9uX3B5MzgudHh0CkBAIC0wLDAgKzEgQEAKK3VzZWxlc3Mtc3VwZXItZGVsZWdhdGlvbjoxNjo0OkhhbS5fX2luaXRfXzpVc2VsZXNzIHN1cGVyIGRlbGVnYXRpb24gaW4gbWV0aG9kICdfX2luaXRfXycKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy9fX2luaXRfXy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd2lsZGNhcmRfaW1wb3J0LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dpbGRjYXJkX2ltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmFlNjNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dpbGRjYXJkX2ltcG9ydC5weQpAQCAtMCwwICsxLDUgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydCxtaXNzaW5nLWRvY3N0cmluZyxpbXBvcnQtZXJyb3IsdW51c2VkLXdpbGRjYXJkLWltcG9ydAorZnJvbSBpbmRpcmVjdDEgaW1wb3J0ICogIyBbd2lsZGNhcmQtaW1wb3J0XQorIyBUaGlzIGlzIGFuIHVucmVzb2x2ZWQgaW1wb3J0IHdoaWNoIHN0aWxsIGdlbmVyYXRlcyB0aGUgd2lsZGNhcmQtaW1wb3J0CisjIHdhcm5pbmcuCitmcm9tIHVua25vd24ucGFja2FnZSBpbXBvcnQgKiAjIFt3aWxkY2FyZC1pbXBvcnRdCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd2lsZGNhcmRfaW1wb3J0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aWxkY2FyZF9pbXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzIxYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd2lsZGNhcmRfaW1wb3J0LnR4dApAQCAtMCwwICsxLDIgQEAKK3dpbGRjYXJkLWltcG9ydDoyOjA6OldpbGRjYXJkIGltcG9ydCBpbmRpcmVjdDEKK3dpbGRjYXJkLWltcG9ydDo1OjA6OldpbGRjYXJkIGltcG9ydCB1bmtub3duLnBhY2thZ2UKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aWxkY2FyZF9pbXBvcnRfYWxsb3dlZC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aWxkY2FyZF9pbXBvcnRfYWxsb3dlZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZlYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dpbGRjYXJkX2ltcG9ydF9hbGxvd2VkLnB5CkBAIC0wLDAgKzEsNCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLXdpbGRjYXJkLWltcG9ydCxyZWRlZmluZWQtYnVpbHRpbixpbXBvcnQtZXJyb3IKK2Zyb20gY3N2IGltcG9ydCAqCitmcm9tIGFiYyBpbXBvcnQgKiAgIyBbd2lsZGNhcmQtaW1wb3J0XQorZnJvbSBVTklORkVSQUJMRSBpbXBvcnQgKiAgIyBbd2lsZGNhcmQtaW1wb3J0XQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dpbGRjYXJkX2ltcG9ydF9hbGxvd2VkLnJjIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dpbGRjYXJkX2ltcG9ydF9hbGxvd2VkLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmQ4MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd2lsZGNhcmRfaW1wb3J0X2FsbG93ZWQucmMKQEAgLTAsMCArMSwyIEBACitbSU1QT1JUU10KK2FsbG93LXdpbGRjYXJkLXdpdGgtYWxsPXllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dpbGRjYXJkX2ltcG9ydF9hbGxvd2VkLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aWxkY2FyZF9pbXBvcnRfYWxsb3dlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxM2FmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aWxkY2FyZF9pbXBvcnRfYWxsb3dlZC50eHQKQEAgLTAsMCArMSwyIEBACit3aWxkY2FyZC1pbXBvcnQ6MzowOjpXaWxkY2FyZCBpbXBvcnQgYWJjCit3aWxkY2FyZC1pbXBvcnQ6NDowOjpXaWxkY2FyZCBpbXBvcnQgVU5JTkZFUkFCTEUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aXRoX3VzZWRfYmVmb3JlX2Fzc2lnbi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aXRoX3VzZWRfYmVmb3JlX2Fzc2lnbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGE0NzVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dpdGhfdXNlZF9iZWZvcmVfYXNzaWduLnB5CkBAIC0wLDAgKzEsMTEgQEAKKycnJworUmVncmVzc2lvbiB0ZXN0IGZvcgoraHR0cHM6Ly9iaXRidWNrZXQub3JnL2xvZ2lsYWIvcHlsaW50L2lzc3VlLzEyOC9hdHRyaWJ1dGVlcnJvci13aGVuLXBhcnNpbmcKKycnJworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCitkZWYgZG9fbm90aGluZygpOgorICAgICIiIiBlbXB0eSAiIiIKKyAgICB3aXRoIG9wZW4oIiIpIGFzIGN0eC5vYmo6ICAjIFt1bmRlZmluZWQtdmFyaWFibGVdCisgICAgICAgIGNvbnRleHQuZG8oKSAgIyBbdXNlZC1iZWZvcmUtYXNzaWdubWVudF0KKyAgICAgICAgY29udGV4dCA9IE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aXRoX3VzZWRfYmVmb3JlX2Fzc2lnbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd2l0aF91c2VkX2JlZm9yZV9hc3NpZ24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOThjZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd2l0aF91c2VkX2JlZm9yZV9hc3NpZ24udHh0CkBAIC0wLDAgKzEsMiBAQAordW5kZWZpbmVkLXZhcmlhYmxlOjk6MjE6ZG9fbm90aGluZzpVbmRlZmluZWQgdmFyaWFibGUgJ2N0eCcKK3VzZWQtYmVmb3JlLWFzc2lnbm1lbnQ6MTA6ODpkb19ub3RoaW5nOlVzaW5nIHZhcmlhYmxlICdjb250ZXh0JyBiZWZvcmUgYXNzaWdubWVudApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dpdGhfdXNpbmdfZ2VuZXJhdG9yLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dpdGhfdXNpbmdfZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4N2JkY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd2l0aF91c2luZ19nZW5lcmF0b3IucHkKQEAgLTAsMCArMSwxNSBAQAorIiIiIFRlc3Rpbmcgd2l0aCBzdGF0ZW1lbnRzIHRoYXQgdXNlIGdlbmVyYXRvcnMuIFRoaXMgc2hvdWxkIG5vdCBjcmFzaC4gIiIiCisjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitjbGFzcyBCYXNlKG9iamVjdCk6CisgICAgIiIiIEJhc2UgY2xhc3MuICIiIgorICAgIHZhbCA9IDAKKworICAgIGRlZiBnZW4oc2VsZik6CisgICAgICAgICIiIiBBIGdlbmVyYXRvci4gIiIiCisgICAgICAgIHlpZWxkIHNlbGYudmFsCisKKyAgICBkZWYgZnVuKHNlbGYpOgorICAgICAgICAiIiIgV2l0aCBzdGF0ZW1lbnQgdXNpbmcgYSBnZW5lcmF0b3IuICIiIgorICAgICAgICB3aXRoIHNlbGYuZ2VuKCk6ICAjIFtub3QtY29udGV4dC1tYW5hZ2VyXQorICAgICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dpdGhfdXNpbmdfZ2VuZXJhdG9yLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aXRoX3VzaW5nX2dlbmVyYXRvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNjVmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93aXRoX3VzaW5nX2dlbmVyYXRvci50eHQKQEAgLTAsMCArMSBAQAorbm90LWNvbnRleHQtbWFuYWdlcjoxNDo4OkJhc2UuZnVuOkNvbnRleHQgbWFuYWdlciAnZ2VuZXJhdG9yJyBkb2Vzbid0IGltcGxlbWVudCBfX2VudGVyX18gYW5kIF9fZXhpdF9fLgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2V4Y2VwdGlvbl9vcGVyYXRpb24ucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfZXhjZXB0aW9uX29wZXJhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNjNGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2V4Y2VwdGlvbl9vcGVyYXRpb24ucHkKQEAgLTAsMCArMSwxOCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHN1cGVyZmx1b3VzLXBhcmVucworCisKK3RyeToKKyAgICAxLzAKK2V4Y2VwdCAoVmFsdWVFcnJvciB8IFR5cGVFcnJvcik6ICMgW3dyb25nLWV4Y2VwdGlvbi1vcGVyYXRpb25dCisgICAgcGFzcworCit0cnk6CisgICAgMS8wCitleGNlcHQgKFZhbHVlRXJyb3IgKyBUeXBlRXJyb3IpOiAjIFt3cm9uZy1leGNlcHRpb24tb3BlcmF0aW9uXQorICAgIHBhc3MKKworCit0cnk6CisgICAgMS8wCitleGNlcHQgKFZhbHVlRXJyb3IgPCBUeXBlRXJyb3IpOiAjIFt3cm9uZy1leGNlcHRpb24tb3BlcmF0aW9uXQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19leGNlcHRpb25fb3BlcmF0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19leGNlcHRpb25fb3BlcmF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTYyNGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2V4Y2VwdGlvbl9vcGVyYXRpb24udHh0CkBAIC0wLDAgKzEsMyBAQAord3JvbmctZXhjZXB0aW9uLW9wZXJhdGlvbjo2Ojg6OkludmFsaWQgZXhjZXB0aW9uIG9wZXJhdGlvbi4gRGlkIHlvdSBtZWFuICcoVmFsdWVFcnJvciwgVHlwZUVycm9yKScgaW5zdGVhZD8KK3dyb25nLWV4Y2VwdGlvbi1vcGVyYXRpb246MTE6ODo6SW52YWxpZCBleGNlcHRpb24gb3BlcmF0aW9uLiBEaWQgeW91IG1lYW4gJyhWYWx1ZUVycm9yLCBUeXBlRXJyb3IpJyBpbnN0ZWFkPword3JvbmctZXhjZXB0aW9uLW9wZXJhdGlvbjoxNzo4OjpJbnZhbGlkIGV4Y2VwdGlvbiBvcGVyYXRpb24uIERpZCB5b3UgbWVhbiAnKFZhbHVlRXJyb3IsIFR5cGVFcnJvciknIGluc3RlYWQ/CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X29yZGVyLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9vcmRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDA2MTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9vcmRlci5weQpAQCAtMCwwICsxLDQzIEBACisiIiJDaGVja3MgaW1wb3J0IG9yZGVyIHJ1bGUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsdW5ncm91cGVkLWltcG9ydHMsaW1wb3J0LWVycm9yLG5vLW5hbWUtaW4tbW9kdWxlLHJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cit0cnk6CisgICAgZnJvbSBzaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBjb25maWdwYXJzZXIKKworaW1wb3J0IGxvZ2dpbmcKKworaW1wb3J0IHNpeAoraW1wb3J0IG9zLnBhdGggICMgW3dyb25nLWltcG9ydC1vcmRlcl0KK2Zyb20gYXN0cm9pZCBpbXBvcnQgYXJlX2V4Y2x1c2l2ZQoraW1wb3J0IHN5cyAgIyBbd3JvbmctaW1wb3J0LW9yZGVyXQoraW1wb3J0IGRhdGV0aW1lICAjIFt3cm9uZy1pbXBvcnQtb3JkZXJdCitpbXBvcnQgdW51c2VkX2ltcG9ydAorZnJvbSAucGFja2FnZSBpbXBvcnQgQ2xhc3MKK2ltcG9ydCB0b3RhbGx5X21pc3NpbmcgICMgW3dyb25nLWltcG9ydC1vcmRlcl0KK2Zyb20gLiBpbXBvcnQgcGFja2FnZQoraW1wb3J0IGFzdHJvaWQgICMgW3dyb25nLWltcG9ydC1vcmRlcl0KK2Zyb20gLiBpbXBvcnQgcGFja2FnZTIKK2Zyb20gLnBhY2thZ2UyIGltcG9ydCBDbGFzczIKK2Zyb20gLi5wYWNrYWdlMyBpbXBvcnQgQ2xhc3MzCitmcm9tIHNpeC5tb3Zlcy51cmxsaWIucGFyc2UgaW1wb3J0IHF1b3RlICMgW3dyb25nLWltcG9ydC1vcmRlcl0KKworCitMT0dHRVIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitpZiBMT0dHRVI6CisgICAgIyBpbXBvcnRzIG5lc3RlZCBza2lwcGVkCisgICAgZnJvbSAuIGltcG9ydCBwYWNrYWdlNAorICAgIGltcG9ydCBwcHJpbnQKKyAgICBmcm9tIHBwcmludCBpbXBvcnQgUHJldHR5UHJpbnRlcgorCisKK3RyeToKKyAgICAjIGltcG9ydHMgbmVzdGVkIHNraXBwZWQKKyAgICBmcm9tIC4gaW1wb3J0IHBhY2thZ2U0CisgICAgaW1wb3J0IHJhbmRvbQorICAgIGZyb20gcmFuZG9tIGltcG9ydCBkaXZpc2lvbgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIExPR0dFUi5pbmZvKCdBIHVzZWZ1bCBtZXNzYWdlIGhlcmUnKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9vcmRlci50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X29yZGVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTIwZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9vcmRlci50eHQKQEAgLTAsMCArMSw2IEBACit3cm9uZy1pbXBvcnQtb3JkZXI6MTI6MDo6InN0YW5kYXJkIGltcG9ydCAiImltcG9ydCBvcy5wYXRoIiIgc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgIiJpbXBvcnQgc2l4IiIiCit3cm9uZy1pbXBvcnQtb3JkZXI6MTQ6MDo6InN0YW5kYXJkIGltcG9ydCAiImltcG9ydCBzeXMiIiBzaG91bGQgYmUgcGxhY2VkIGJlZm9yZSAiImltcG9ydCBzaXgiIiIKK3dyb25nLWltcG9ydC1vcmRlcjoxNTowOjoic3RhbmRhcmQgaW1wb3J0ICIiaW1wb3J0IGRhdGV0aW1lIiIgc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgIiJpbXBvcnQgc2l4IiIiCit3cm9uZy1pbXBvcnQtb3JkZXI6MTg6MDo6InRoaXJkIHBhcnR5IGltcG9ydCAiImltcG9ydCB0b3RhbGx5X21pc3NpbmciIiBzaG91bGQgYmUgcGxhY2VkIGJlZm9yZSAiImZyb20gLnBhY2thZ2UgaW1wb3J0IENsYXNzIiIiCit3cm9uZy1pbXBvcnQtb3JkZXI6MjA6MDo6InRoaXJkIHBhcnR5IGltcG9ydCAiImltcG9ydCBhc3Ryb2lkIiIgc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgIiJmcm9tIC5wYWNrYWdlIGltcG9ydCBDbGFzcyIiIgord3JvbmctaW1wb3J0LW9yZGVyOjI0OjA6OiJ0aGlyZCBwYXJ0eSBpbXBvcnQgIiJmcm9tIHNpeC5tb3Zlcy51cmxsaWIucGFyc2UgaW1wb3J0IHF1b3RlIiIgc2hvdWxkIGJlIHBsYWNlZCBiZWZvcmUgIiJmcm9tIC5wYWNrYWdlIGltcG9ydCBDbGFzcyIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9vcmRlcjIucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X29yZGVyMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU3NTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9vcmRlcjIucHkKQEAgLTAsMCArMSwxNiBAQAorIiIiQ2hlY2tzIGltcG9ydCBvcmRlciBydWxlIGluIGEgcmlnaHQgY2FzZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCx1bmdyb3VwZWQtaW1wb3J0cyxpbXBvcnQtZXJyb3Isbm8tbmFtZS1pbi1tb2R1bGUKKworCisjIFN0YW5kYXJkIGltcG9ydHMKK2ltcG9ydCBvcworZnJvbSBzeXMgaW1wb3J0IGFyZ3YKKworIyBleHRlcm5hbCBpbXBvcnRzCitpbXBvcnQgaXNvcnQKKworZnJvbSBzaXggaW1wb3J0IG1vdmVzCisKKyMgbG9jYWxfaW1wb3J0cworZnJvbSAuIGltcG9ydCBteV9wYWNrYWdlCitmcm9tIC5teV9wYWNrYWdlIGltcG9ydCBteUNsYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDZmOWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbi5weQpAQCAtMCwwICsxLDMzIEBACisiIiJDaGVja3MgaW1wb3J0IG9yZGVyIHJ1bGUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsdW5ncm91cGVkLWltcG9ydHMsd3JvbmctaW1wb3J0LW9yZGVyCisjIHB5bGludDogZGlzYWJsZT1pbXBvcnQtZXJyb3IsIHRvby1mZXctcHVibGljLW1ldGhvZHMsIG1pc3NpbmctZG9jc3RyaW5nLHVzaW5nLWNvbnN0YW50LXRlc3QsIHVzZWxlc3Mtb2JqZWN0LWluaGVyaXRhbmNlCitpbXBvcnQgb3MucGF0aAorCitpZiBUcnVlOgorICAgIGZyb20gYXN0cm9pZCBpbXBvcnQgYXJlX2V4Y2x1c2l2ZQordHJ5OgorICAgIGltcG9ydCBzeXMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjbGFzcyBNeWNsYXNzKG9iamVjdCk6CisgICAgICAgICIiImRvY3N0cmluZyIiIgorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2Vsc2U6CisgICAgY2xhc3MgT3JkZXJlZERpY3Qob2JqZWN0KToKKyAgICAgICAgIiIiTm90aGluZyB0byBzZWUgaGVyZS4iIiIKKyAgICAgICAgZGVmIHNvbWVfZnVuYyhzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworaW1wb3J0IHNpeCAgIyBbd3JvbmctaW1wb3J0LXBvc2l0aW9uXQorCitDT05TVEFOVCA9IFRydWUKKworaW1wb3J0IGRhdGV0aW1lICAjIFt3cm9uZy1pbXBvcnQtcG9zaXRpb25dCisKK1ZBUiA9IDAKK2ZvciBpIGluIHJhbmdlKDEwKToKKyAgICBWQVIgKz0gaQorCitpbXBvcnQgc2NpcHkgICMgW3dyb25nLWltcG9ydC1wb3NpdGlvbl0KK2ltcG9ydCBhc3Ryb2lkICAjIFt3cm9uZy1pbXBvcnQtcG9zaXRpb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzQyNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnR4dApAQCAtMCwwICsxLDQgQEAKK3dyb25nLWltcG9ydC1wb3NpdGlvbjoyMjowOjoiSW1wb3J0ICIiaW1wb3J0IHNpeCIiIHNob3VsZCBiZSBwbGFjZWQgYXQgdGhlIHRvcCBvZiB0aGUgbW9kdWxlIgord3JvbmctaW1wb3J0LXBvc2l0aW9uOjI2OjA6OiJJbXBvcnQgIiJpbXBvcnQgZGF0ZXRpbWUiIiBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSIKK3dyb25nLWltcG9ydC1wb3NpdGlvbjozMjowOjoiSW1wb3J0ICIiaW1wb3J0IHNjaXB5IiIgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUiCit3cm9uZy1pbXBvcnQtcG9zaXRpb246MzM6MDo6IkltcG9ydCAiImltcG9ydCBhc3Ryb2lkIiIgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTAucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhODY4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xMC5weQpAQCAtMCwwICsxLDE1IEBACisiIiJDaGVja3MgaW1wb3J0IHBvc2l0aW9uIHJ1bGUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQKK2ltcG9ydCBvcworCit0cnk6CisgICAgaW1wb3J0IGFzdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRlZiBtZXRob2QoaXRlbXMpOgorICAgICAgICAiIiJkb2NzdHJpbmciIiIKKyAgICAgICAgdmFsdWUgPSAwCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgdmFsdWUgKz0gaXRlbQorICAgICAgICByZXR1cm4gdmFsdWUKKworaW1wb3J0IHN5cwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjExLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjExLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjcyYzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTEucHkKQEAgLTAsMCArMSw0IEBACisiIiJDaGVja3MgaW1wb3J0IHBvc2l0aW9uIHJ1bGUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQscG9pbnRsZXNzLXN0cmluZy1zdGF0ZW1lbnQKK0EgPSAxCitpbXBvcnQgb3MgICMgW3dyb25nLWltcG9ydC1wb3NpdGlvbl0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xMS50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOGFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTEudHh0CkBAIC0wLDAgKzEgQEAKK3dyb25nLWltcG9ydC1wb3NpdGlvbjo0OjA6OiJJbXBvcnQgIiJpbXBvcnQgb3MiIiBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xMi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA5NjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjEyLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiQ2hlY2tzIGltcG9ydCBwb3NpdGlvbiBydWxlIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LHBvaW50bGVzcy1zdHJpbmctc3RhdGVtZW50CisiVHdvIHN0cmluZyIKKworaW1wb3J0IG9zICAjIFt3cm9uZy1pbXBvcnQtcG9zaXRpb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTIudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjEyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY1NWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjEyLnR4dApAQCAtMCwwICsxIEBACit3cm9uZy1pbXBvcnQtcG9zaXRpb246NTowOjoiSW1wb3J0ICIiaW1wb3J0IG9zIiIgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTMucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzZDAzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xMy5weQpAQCAtMCwwICsxLDQgQEAKKyIiIkNoZWNrcyBpbXBvcnQgcG9zaXRpb24gcnVsZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCxuby1uYW1lLWluLW1vZHVsZQorQSA9IDEKK2Zyb20gc3lzIGltcG9ydCB4ICAjIFt3cm9uZy1pbXBvcnQtcG9zaXRpb25dCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTMudHh0IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjEzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDEwZDlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjEzLnR4dApAQCAtMCwwICsxIEBACit3cm9uZy1pbXBvcnQtcG9zaXRpb246NDowOjoiSW1wb3J0ICIiZnJvbSBzeXMgaW1wb3J0IHgiIiBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xNC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWM5YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjE0LnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiQ2hlY2tzIGltcG9ydCBwb3NpdGlvbiBydWxlIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LHVuZGVmaW5lZC12YXJpYWJsZSxpbXBvcnQtZXJyb3IKK2lmIHg6CisgICAgaW1wb3J0IG9zCitpbXBvcnQgeSAgIyBbd3JvbmctaW1wb3J0LXBvc2l0aW9uXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjE0LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlMDllMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xNC50eHQKQEAgLTAsMCArMSBAQAord3JvbmctaW1wb3J0LXBvc2l0aW9uOjU6MDo6IkltcG9ydCAiImltcG9ydCB5IiIgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUiCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTUucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMTUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhMTliNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24xNS5weQpAQCAtMCwwICsxLDkgQEAKKyIiIkNoZWNrcyBpbXBvcnQgcG9zaXRpb24gcnVsZSB3aXRoIHBlcC0wMDA4IiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0CisKK19fYXV0aG9yX18gPSAnc29tZSBhdXRob3InCitfX2VtYWlsX18gPSAnc29tZS5hdXRob3JAc29tZV9lbWFpbCcKK19fY29weXJpZ2h0X18gPSAnU29tZSBjb3B5cmlnaHQnCisKKworaW1wb3J0IHN5cwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjIucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzQ0MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjIucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiQ2hlY2tzIGltcG9ydCBvcmRlciBydWxlIHdpdGggbmVzdGVkIG5vbl9pbXBvcnQgc2VudGVuY2UiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsdW5ncm91cGVkLWltcG9ydHMsaW1wb3J0LWVycm9yLG5vLW5hbWUtaW4tbW9kdWxlLHJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwKK3RyeToKKyAgICBmcm9tIHN5cyBpbXBvcnQgYXJndgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgcGFzcworCitpbXBvcnQgb3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24zLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4MDhhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb24zLnB5CkBAIC0wLDAgKzEsMyBAQAorIiIiQ2hlY2tzIGltcG9ydCBwb3NpdGlvbiBydWxlIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LHVuZ3JvdXBlZC1pbXBvcnRzLGltcG9ydC1lcnJvcixuby1uYW1lLWluLW1vZHVsZSxyZWxhdGl2ZS1iZXlvbmQtdG9wLWxldmVsCitpbXBvcnQgb3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb240LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmMzljZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb240LnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiQ2hlY2tzIGltcG9ydCBwb3NpdGlvbiBydWxlIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LHVuZ3JvdXBlZC1pbXBvcnRzLGltcG9ydC1lcnJvcixuby1uYW1lLWluLW1vZHVsZSxyZWxhdGl2ZS1iZXlvbmQtdG9wLWxldmVsLHVudXNlZC12YXJpYWJsZSxpbXBvcnQtb3V0c2lkZS10b3BsZXZlbAorZGVmIG1ldGhvZDEoKToKKyAgICAiIiJNZXRob2QgMSIiIgorICAgIGltcG9ydCB4CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uNS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb241LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOWMyOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uNS5weQpAQCAtMCwwICsxLDQgQEAKK3IiIiJDaGVja3MgaW1wb3J0IHBvc2l0aW9uIHJ1bGUiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1pbXBvcnQsdW5ncm91cGVkLWltcG9ydHMsaW1wb3J0LWVycm9yLG5vLW5hbWUtaW4tbW9kdWxlLHJlbGF0aXZlLWJleW9uZC10b3AtbGV2ZWwKKworaW1wb3J0IG9zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uNi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb242LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTlkMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uNi5weQpAQCAtMCwwICsxLDcgQEAKKyIiIkNoZWNrcyBpbXBvcnQgcG9zaXRpb24gcnVsZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCx1bmdyb3VwZWQtaW1wb3J0cyxpbXBvcnQtZXJyb3Isbm8tbmFtZS1pbi1tb2R1bGUscmVsYXRpdmUtYmV5b25kLXRvcC1sZXZlbCx1bmRlZmluZWQtdmFyaWFibGUKKworaW1wb3J0IHkKKworaWYgeDoKKyAgICBpbXBvcnQgb3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb243LnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbjcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhNzliOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb243LnB5CkBAIC0wLDAgKzEsOSBAQAorIiIiQ2hlY2tzIGltcG9ydCBwb3NpdGlvbiBydWxlIiIiCisjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0LHVuZ3JvdXBlZC1pbXBvcnRzLGltcG9ydC1lcnJvcixuby1uYW1lLWluLW1vZHVsZSxyZWxhdGl2ZS1iZXlvbmQtdG9wLWxldmVsCit0cnk6CisgICAgaW1wb3J0IHgKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitmaW5hbGx5OgorICAgIHBhc3MKK2ltcG9ydCB5CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uOC5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb244LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWQ5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uOC5weQpAQCAtMCwwICsxLDQgQEAKKyIiIkNoZWNrcyBpbXBvcnQgcG9zaXRpb24gcnVsZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCx1bmdyb3VwZWQtaW1wb3J0cyxpbXBvcnQtZXJyb3Isbm8tbmFtZS1pbi1tb2R1bGUscmVsYXRpdmUtYmV5b25kLXRvcC1sZXZlbCx1bmRlZmluZWQtdmFyaWFibGUKK2lmIHg6CisgICAgaW1wb3J0IG9zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uOS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwvdy93cm9uZ19pbXBvcnRfcG9zaXRpb245LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmM0NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uOS5weQpAQCAtMCwwICsxLDkgQEAKKyIiIkNoZWNrcyBpbXBvcnQgcG9zaXRpb24gcnVsZSIiIgorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCx1bmdyb3VwZWQtaW1wb3J0cyxpbXBvcnQtZXJyb3Isbm8tbmFtZS1pbi1tb2R1bGUscmVsYXRpdmUtYmV5b25kLXRvcC1sZXZlbAoraW1wb3J0IHkKK3RyeToKKyAgICBpbXBvcnQgeAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbl9leGNsdWRlX2R1bmRlcl9tYWluLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC93L3dyb25nX2ltcG9ydF9wb3NpdGlvbl9leGNsdWRlX2R1bmRlcl9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjY4MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3cvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uX2V4Y2x1ZGVfZHVuZGVyX21haW4ucHkKQEAgLTAsMCArMSwxMiBAQAorIyBweWxpbnQ6IGRpc2FibGU9aW1wb3J0LWVycm9yLCB1bnVzZWQtaW1wb3J0LCBtaXNzaW5nLWRvY3N0cmluZworQ09OUyA9IDQyCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgQ09OU1RBTlQgPSBUcnVlCisgICAgVkFSID0gMAorICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgVkFSICs9IGkKKworICAgIGltcG9ydCBzaXgKKyAgICBpbXBvcnQgZGF0ZXRpbWUKKyAgICBpbXBvcnQgYXN0cm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC95L19faW5pdF9fLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC95L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3kvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9hc3NpZ25fcHkyNS5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9hc3NpZ25fcHkyNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVhZTAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2Fzc2lnbl9weTI1LnB5CkBAIC0wLDAgKzEsMjEgQEAKKyIiImh0dHBzOi8vd3d3LmxvZ2lsYWIub3JnL3RpY2tldC84NzcxIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworZGVmIGdlbmVyYXRvcigpOgorICAgICIiInlpZWxkIGFzIGFzc2lnbm1lbnQiIiIKKyAgICB5aWVsZCA0NQorICAgIHh4eHggPSB5aWVsZCAxMjMKKyAgICBwcmludCh4eHh4KQorCitkZWYgZ2VuZXJhdG9yX2ZwMShzZXEpOgorICAgICIiIlcwNjMxIGZhbHNlIHBvc2l0aXZlIiIiCisgICAgZm9yIHZhbCBpbiBzZXE6CisgICAgICAgIHBhc3MKKyAgICBmb3IgdmFsIGluIHNlcToKKyAgICAgICAgeWllbGQgdmFsCisKK2RlZiBnZW5lcmF0b3JfZnAyKCk6CisgICAgIiIiRTA2MDEgZmFsc2UgcG9zaXRpdmUiIiIKKyAgICB4eHh4ID0gMTIKKyAgICB5aWVsZCB4eHh4CmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9pdGVyYWJsZV9weTMzLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2Zyb21faXRlcmFibGVfcHkzMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODAzOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2Zyb21faXRlcmFibGVfcHkzMy5weQpAQCAtMCwwICsxLDcgQEAKKyIiIgorQ2hlY2sgdGhhdCBgeWllbGQgZnJvbWAtc3RhdGVtZW50IHRha2VzIGFuIGl0ZXJhYmxlLgorIiIiCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZworCitkZWYgdG9fdGVuKCk6CisgICAgeWllbGQgZnJvbSAxMCAgIyBbbm90LWFuLWl0ZXJhYmxlXQpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2Zyb21faXRlcmFibGVfcHkzMy5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX2l0ZXJhYmxlX3B5MzMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjOTliYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX2l0ZXJhYmxlX3B5MzMucmMKQEAgLTAsMCArMSwyIEBACitbdGVzdG9wdGlvbnNdCittaW5fcHl2ZXI9My4zCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9pdGVyYWJsZV9weTMzLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX2l0ZXJhYmxlX3B5MzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MWIxMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9pdGVyYWJsZV9weTMzLnR4dApAQCAtMCwwICsxIEBACitub3QtYW4taXRlcmFibGU6NzoxNTp0b190ZW46Tm9uLWl0ZXJhYmxlIHZhbHVlIDEwIGlzIHVzZWQgaW4gYW4gaXRlcmF0aW5nIGNvbnRleHQKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX291dHNpZGVfZnVuYy5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX291dHNpZGVfZnVuYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRiOTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2Zyb21fb3V0c2lkZV9mdW5jLnB5CkBAIC0wLDAgKzEsNCBAQAorIiIiVGhpcyBpcyBncmFtYXRpY2FsbHkgY29ycmVjdCwgYnV0IGl0J3Mgc3RpbGwgYSBTeW50YXhFcnJvciIiIgoreWllbGQgZnJvbSBbMSwgMl0gICMgW3lpZWxkLW91dHNpZGUtZnVuY3Rpb25dCisKK0xBTUJEQV9XSVRIX1lJRUxEID0gbGFtYmRhOiAoeWllbGQgZnJvbSBbMSwgMl0pCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9vdXRzaWRlX2Z1bmMucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9vdXRzaWRlX2Z1bmMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjOTliYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX291dHNpZGVfZnVuYy5yYwpAQCAtMCwwICsxLDIgQEAKK1t0ZXN0b3B0aW9uc10KK21pbl9weXZlcj0zLjMKZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9mcm9tX291dHNpZGVfZnVuYy50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9vdXRzaWRlX2Z1bmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTYzN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfZnJvbV9vdXRzaWRlX2Z1bmMudHh0CkBAIC0wLDAgKzEgQEAKK3lpZWxkLW91dHNpZGUtZnVuY3Rpb246MjowOjpZaWVsZCBvdXRzaWRlIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfaW5zaWRlX2FzeW5jX2Z1bmN0aW9uLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzU4NWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbi5weQpAQCAtMCwwICsxLDEyIEBACisiIiJUZXN0IHRoYXQgYHlpZWxkYCBvciBgeWllbGQgZnJvbWAgY2FuJ3QgYmUgdXNlZCBpbnNpZGUgYW4gYXN5bmMgZnVuY3Rpb24uIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsIHVudXNlZC12YXJpYWJsZQ0KKw0KK2FzeW5jIGRlZiBnb29kX2Nvcm8oKToNCisgICAgZGVmIF9pbm5lcigpOg0KKyAgICAgICAgeWllbGQgNDINCisgICAgICAgIHlpZWxkIGZyb20gWzEsIDIsIDNdDQorDQorDQorYXN5bmMgZGVmIGJhZF9jb3JvKCk6DQorICAgIHlpZWxkIDQyICMgW3lpZWxkLWluc2lkZS1hc3luYy1mdW5jdGlvbl0NCisgICAgeWllbGQgZnJvbSBbMSwgMiwgM10gIyBbeWllbGQtaW5zaWRlLWFzeW5jLWZ1bmN0aW9uXQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb24ucmMgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfaW5zaWRlX2FzeW5jX2Z1bmN0aW9uLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDQwY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfaW5zaWRlX2FzeW5jX2Z1bmN0aW9uLnJjCkBAIC0wLDAgKzEsMyBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNQorbWF4X3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbi50eHQgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfaW5zaWRlX2FzeW5jX2Z1bmN0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjQ4Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbi50eHQKQEAgLTAsMCArMSwyIEBACit5aWVsZC1pbnNpZGUtYXN5bmMtZnVuY3Rpb246MTE6OmJhZF9jb3JvOllpZWxkIGluc2lkZSBhc3luYyBmdW5jdGlvbgoreWllbGQtaW5zaWRlLWFzeW5jLWZ1bmN0aW9uOjEyOjpiYWRfY29ybzpZaWVsZCBpbnNpZGUgYXN5bmMgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb25fcHkzNi5weSBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb25fcHkzNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGY1MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbl9weTM2LnB5CkBAIC0wLDAgKzEsMTIgQEAKKyIiIlRlc3QgdGhhdCBgeWllbGRgIG9yIGB5aWVsZCBmcm9tYCBjYW4ndCBiZSB1c2VkIGluc2lkZSBhbiBhc3luYyBmdW5jdGlvbi4iIiINCisjIHB5bGludDogZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgdW51c2VkLXZhcmlhYmxlDQorDQorYXN5bmMgZGVmIGdvb2RfY29ybygpOg0KKyAgICBkZWYgX2lubmVyKCk6DQorICAgICAgICB5aWVsZCA0Mg0KKyAgICAgICAgeWllbGQgZnJvbSBbMSwgMiwgM10NCisNCisNCithc3luYyBkZWYgYmFkX2Nvcm8oKToNCisgICAgeWllbGQgNDINCisgICAgeWllbGQgZnJvbSBbMSwgMiwgM10gIyBbeWllbGQtaW5zaWRlLWFzeW5jLWZ1bmN0aW9uXQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb25fcHkzNi5yYyBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb25fcHkzNi5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmEyYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbl9weTM2LnJjCkBAIC0wLDAgKzEsMiBAQAorW3Rlc3RvcHRpb25zXQorbWluX3B5dmVyPTMuNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX2luc2lkZV9hc3luY19mdW5jdGlvbl9weTM2LnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb25fcHkzNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4NDkyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9pbnNpZGVfYXN5bmNfZnVuY3Rpb25fcHkzNi50eHQKQEAgLTAsMCArMSBAQAoreWllbGQtaW5zaWRlLWFzeW5jLWZ1bmN0aW9uOjEyOjQ6YmFkX2Nvcm86WWllbGQgaW5zaWRlIGFzeW5jIGZ1bmN0aW9uCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfb3V0c2lkZV9mdW5jLnB5IGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX291dHNpZGVfZnVuYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODI0YmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX291dHNpZGVfZnVuYy5weQpAQCAtMCwwICsxLDQgQEAKKyIiIlRoaXMgaXMgZ3JhbWF0aWNhbGx5IGNvcnJlY3QsIGJ1dCBpdCdzIHN0aWxsIGEgU3ludGF4RXJyb3IiIiIKK3lpZWxkIDEgICMgW3lpZWxkLW91dHNpZGUtZnVuY3Rpb25dCisKK0xBTUJEQV9XSVRIX1lJRUxEID0gbGFtYmRhOiAoeWllbGQpCmRpZmYgLS1naXQgYS90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfb3V0c2lkZV9mdW5jLnR4dCBiL3Rlc3RzL2Z1bmN0aW9uYWwveS95aWVsZF9vdXRzaWRlX2Z1bmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTYzN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfb3V0c2lkZV9mdW5jLnR4dApAQCAtMCwwICsxIEBACit5aWVsZC1vdXRzaWRlLWZ1bmN0aW9uOjI6MDo6WWllbGQgb3V0c2lkZSBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX3JldHVybl9taXgucHkgYi90ZXN0cy9mdW5jdGlvbmFsL3kveWllbGRfcmV0dXJuX21peC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTA1MGYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZnVuY3Rpb25hbC95L3lpZWxkX3JldHVybl9taXgucHkKQEAgLTAsMCArMSw4IEBACisiIiIgbW9kdWxlIGRvYyAiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXVzZWxlc3MtcmV0dXJuCitfX3JldmlzaW9uX18gPSBOb25lCisKK2RlZiBzb21lZ2VuKCk6CisgICAgIiIidGhpcyBraW5kIG9mIG1peCBpcyBPSyIiIgorICAgIHlpZWxkIDEKKyAgICByZXR1cm4KZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L19faW5pdF9fLnB5IGIvdGVzdHMvaW5wdXQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlOTJiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyIiInRlc3QiIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2JlbmNobWFya19taW5pbWFsX2ZpbGUucHkgYi90ZXN0cy9pbnB1dC9iZW5jaG1hcmtfbWluaW1hbF9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9iZW5jaG1hcmtfbWluaW1hbF9maWxlLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9mdW5jXzNrX3JlbW92ZWRfc3R1ZmZfcHlfMzAucHkgYi90ZXN0cy9pbnB1dC9mdW5jXzNrX3JlbW92ZWRfc3R1ZmZfcHlfMzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZDkzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfM2tfcmVtb3ZlZF9zdHVmZl9weV8zMC5weQpAQCAtMCwwICsxLDEzIEBACisiIiJ0ZXN0IHJlbGF0aXZlIGltcG9ydCIiIgorIyBweWxpbnQ6IGRpc2FibGU9bm8tYWJzb2x1dGUtaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgZnVuY193MDQwMQorX19yZXZpc2lvbl9fID0gZmlsdGVyKE5vbmUsIG1hcChzdHIsICgxLCAyLCAzKSkpCisKKworZGVmIGZ1bmN0aW9uKCk6CisgICAgIiIic29tZXRoaW5nIiIiCisgICAgcHJpbnQoZnVuY193MDQwMSkKKyAgICB1bmljID0gdSJ1bmljb2RlIgorICAgIGxvdyA9IHVuaWMubG9vb3dlcgorICAgIHJldHVybiBsb3cKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTEucHkgYi90ZXN0cy9pbnB1dC9mdW5jX2kwMDExLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZWYyMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9mdW5jX2kwMDExLnB5CkBAIC0wLDAgKzEsNCBAQAorIyBweWxpbnQ6ZGlzYWJsZT1XMDQwNAorIiIiY2hlY2sgd2FybmluZyBvbiBsb2NhbCBkaXNhYmxpbmcKKyIiIgorX19yZXZpc2lvbl9fID0gMQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY19pMDAxMi5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2ZmJlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTIucHkKQEAgLTAsMCArMSw0IEBACisjIHB5bGludDplbmFibGU9VzA0MDQKKyIiImNoZWNrIHdhcm5pbmcgb24gbG9jYWwgZW5hYmxpbmcKKyIiIgorX19yZXZpc2lvbl9fID0gMQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY19pMDAxMy5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZjgzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTMucHkKQEAgLTAsMCArMSw4IEBACisjIHB5bGludDogc2tpcC1maWxlCisiIiJkaXNhYmxlLWFsbCBpcyB1c2FibGUgYXMgYW4gaW5saW5lIG9wdGlvbiIiIgorCisjIG5vIHdhcm5pbmcgc2hvdWxkIGJlIGlzc3VlZAordHJ5OgorICAgIGltcG9ydCB0aGlzCitleGNlcHQ6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY19pMDAxNC5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmZjM3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMTQucHkKQEAgLTAsMCArMSw4IEBACisjIHB5bGludDogZGlzYWJsZS1hbGwKKyIiImRpc2FibGUtYWxsIGlzIHVzYWJsZSBhcyBhbiBpbmxpbmUgb3B0aW9uIiIiCisKKyMgbm8gd2FybmluZyBzaG91bGQgYmUgaXNzdWVkCit0cnk6CisgICAgaW1wb3J0IHRoaXMKK2V4Y2VwdDoKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9mdW5jX2kwMDIwLnB5IGIvdGVzdHMvaW5wdXQvZnVuY19pMDAyMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBmZTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvZnVuY19pMDAyMC5weQpAQCAtMCwwICsxLDggQEAKKyIiIlRlc3QgZm9yIHJlcG9ydGluZyBvZiBzdXBwcmVzc2VkIG1lc3NhZ2VzLiIiIgorCitfX3JldmlzaW9uX18gPSAwCisKK2RlZiBzdXBwcmVzc2VkKCk6CisgICAgIiIiQSBmdW5jdGlvbiB3aXRoIGFuIHVudXNlZCB2YXJpYWJsZS4iIiIKKyAgICAjIHB5bGludDogZGlzYWJsZT1XMDYxMgorICAgIHZhciA9IDAKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2Z1bmNfaTAwMjIucHkgYi90ZXN0cy9pbnB1dC9mdW5jX2kwMDIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjMwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9mdW5jX2kwMDIyLnB5CkBAIC0wLDAgKzEsMjIgQEAKKyIiIkRlcHJlY2F0ZWQgc3VwcHJlc3Npb24gc3R5bGUuIiIiCisKK19fcmV2aXNpb25fXyA9IE5vbmUKKworYSA9IDEgICMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZQorYiA9IDEgICMgcHlsaW50OiBkaXNhYmxlLW1zZz1pbnZhbGlkLW5hbWUKKworIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lCitjID0gMQorIyBweWxpbnQ6IGVuYWJsZT1pbnZhbGlkLW5hbWUKKworIyBweWxpbnQ6IGRpc2FibGUtbXNnPWludmFsaWQtbmFtZQorZCA9IDEKKyMgcHlsaW50OiBlbmFibGUtbXNnPWludmFsaWQtbmFtZQorCisjIHB5bGludDogZGlzYWJsZS1tc2c9QzAxMDMKK2UgPSAxCisjIHB5bGludDogZW5hYmxlLW1zZz1DMDEwMworCisjIHB5bGludDogZGlzYWJsZT1DMDEwMworZiA9IDEKKyMgcHlsaW50OiBlbmFibGU9QzAxMDMKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2Z1bmNfcmV0dXJuX3lpZWxkX21peF9weV8zMy5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfcmV0dXJuX3lpZWxkX21peF9weV8zMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTIwYjgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvZnVuY19yZXR1cm5feWllbGRfbWl4X3B5XzMzLnB5CkBAIC0wLDAgKzEsMTUgQEAKKyIiInB5bGludCBzaG91bGQgZGV0ZWN0IHlpZWxkIGFuZCByZXR1cm4gbWl4IGluc2lkZSBnZW5lcmF0b3JzIiIiCisjIHB5bGludDogZGlzYWJsZT11c2luZy1jb25zdGFudC10ZXN0LCBpbmNvbnNpc3RlbnQtcmV0dXJuLXN0YXRlbWVudHMKK2RlZiBzb21lZ2VuKCk6CisgICAgIiIidGhpcyBpcyBhIGJhZCBnZW5lcmF0b3IiIiIKKyAgICBpZiBUcnVlOgorICAgICAgICByZXR1cm4gMQorICAgIGVsc2U6CisgICAgICAgIHlpZWxkIDIKKworZGVmIG1vcmVnZW4oKToKKyAgICAiIiJ0aGlzIGlzIGFub3RoZXIgYmFkIGdlbmVyYXRvciIiIgorICAgIGlmIFRydWU6CisgICAgICAgIHlpZWxkIDEKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gMgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY193MDEyMl9weV8zMC5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfdzAxMjJfcHlfMzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4NjY5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfdzAxMjJfcHlfMzAucHkKQEAgLTAsMCArMSwxMiBAQAorIiIidGVzdCBnbG9iYWwgc3RhdGVtZW50IiIiCisKK19fcmV2aXNpb25fXyA9IDAKKworZXhlYyAnYSA9IF9fcmV2aXNpb25fXycKK2V4ZWMgJ2EgPSAxJyBpbiB7fQorCitleGVjICdhID0gMScgaW4gZ2xvYmFscygpCisKK2RlZiBmdW5jKCk6CisgICAgIiIiZXhlYyBpbiBsb2NhbCBzY29wZSIiIgorICAgIGV4ZWMgJ2IgPSAxJwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY193MDMzMl9weV8zMC5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfdzAzMzJfcHlfMzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzOGU4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfdzAzMzJfcHlfMzAucHkKQEAgLTAsMCArMSw0IEBACisiIiJjaGVjayB1c2Ugb2YgbCBhcyBsb25nIGludCBtYXJrZXIKKyIiIgorIyBweWxpbnQ6IGRpc2FibGU9bG9uZy1zdWZmaXgKK19fcmV2aXNpb25fXyA9IDFsCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxLnB5IGIvdGVzdHMvaW5wdXQvZnVuY193MDQwMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjIyN2JjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvZnVuY193MDQwMS5weQpAQCAtMCwwICsxLDkgQEAKKyIiInRlc3QgY3ljbGljIGltcG9ydAorIiIiCisjIHB5bGludDogZGlzYWJsZT1uby1hYnNvbHV0ZS1pbXBvcnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworZnJvbSAuIGltcG9ydCB3MDQwMV9jeWNsZQorCitpZiB3MDQwMV9jeWNsZToKKyAgICBwcmludCh3MDQwMV9jeWNsZSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2Z1bmNfdzA0MDFfZGlzYWJsZWQucHkgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX2Rpc2FibGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjcwNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX2Rpc2FibGVkLnB5CkBAIC0wLDAgKzEsOSBAQAorIiIidGVzdCBjeWNsaWMgaW1wb3J0CisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitmcm9tIC4gaW1wb3J0IHcwNDAxX2N5Y2xlICAjIHB5bGludDogZGlzYWJsZT1jeWNsaWMtaW1wb3J0CisKK2lmIHcwNDAxX2N5Y2xlOgorICAgIHByaW50KHcwNDAxX2N5Y2xlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY193MDQwMV9kaXNhYmxlZF9pbl9mdW5jLnB5IGIvdGVzdHMvaW5wdXQvZnVuY193MDQwMV9kaXNhYmxlZF9pbl9mdW5jLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjI2NjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX2Rpc2FibGVkX2luX2Z1bmMucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiVGVzdCBkaXNhYmxpbmcgb2YgY3ljbGljIGltcG9ydCBjaGVjayBpbnNpZGUgYSBmdW5jdGlvbgorIiIiCisjIHB5bGludDogZGlzYWJsZT1uby1hYnNvbHV0ZS1pbXBvcnQsaW1wb3J0LW91dHNpZGUtdG9wbGV2ZWwKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworCitkZWYgZnVuYygpOgorICAgICIiIlRlc3QgZGlzYWJsaW5nIG9mIGN5Y2xpYyBpbXBvcnQgY2hlY2sgaW5zaWRlIGEgZnVuY3Rpb24iIiIKKyAgICBmcm9tIC4gaW1wb3J0IHcwNDAxX2N5Y2xlICAjIHB5bGludDogZGlzYWJsZT1jeWNsaWMtaW1wb3J0CisgICAgaWYgdzA0MDFfY3ljbGU6CisgICAgICAgIHByaW50KHcwNDAxX2N5Y2xlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY193MDQwMV9wYWNrYWdlL19faW5pdF9fLnB5IGIvdGVzdHMvaW5wdXQvZnVuY193MDQwMV9wYWNrYWdlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZGVmNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX3BhY2thZ2UvX19pbml0X18ucHkKQEAgLTAsMCArMSwyIEBACisiIiJPdXIgYmlnIHBhY2thZ2UuIiIiCitfX3JldmlzaW9uX18gPSBOb25lCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX3BhY2thZ2UvYWxsX3RoZV90aGluZ3MucHkgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX3BhY2thZ2UvYWxsX3RoZV90aGluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiZDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfdzA0MDFfcGFja2FnZS9hbGxfdGhlX3RoaW5ncy5weQpAQCAtMCwwICsxLDkgQEAKKyIiIkFsbCB0aGUgdGhpbmdzISIiIgorIyBweWxpbnQ6IGRpc2FibGU9bm8tYWJzb2x1dGUtaW1wb3J0Citmcm9tIC50aGluZzEgaW1wb3J0IFRISU5HMQorZnJvbSAudGhpbmcyIGltcG9ydCBUSElORzIKK2Zyb20gLnRoaW5nMiBpbXBvcnQgVEhJTkcxX1BMVVNfVEhJTkcyCitfX3JldmlzaW9uX18gPSBOb25lCisKK18gPSAoVEhJTkcxLCBUSElORzIsIFRISU5HMV9QTFVTX1RISU5HMikKK2RlbCBfCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX3BhY2thZ2UvdGhpbmcxLnB5IGIvdGVzdHMvaW5wdXQvZnVuY193MDQwMV9wYWNrYWdlL3RoaW5nMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDk3MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvZnVuY193MDQwMV9wYWNrYWdlL3RoaW5nMS5weQpAQCAtMCwwICsxLDMgQEAKKyIiIlRoZSBmaXJzdCB0aGluZy4iIiIKK19fcmV2aXNpb25fXyA9IE5vbmUKK1RISU5HMSA9ICJJIGFtIHRoaW5nMSIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2Z1bmNfdzA0MDFfcGFja2FnZS90aGluZzIucHkgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX3BhY2thZ2UvdGhpbmcyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9mdW5jX3cwNDAxX3BhY2thZ2UvdGhpbmcyLnB5CkBAIC0wLDAgKzEsNyBAQAorIiIiVGhlIHNlY29uZCB0aGluZy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydAorZnJvbSAuYWxsX3RoZV90aGluZ3MgaW1wb3J0IFRISU5HMQorX19yZXZpc2lvbl9fID0gTm9uZQorCitUSElORzIgPSAiSSBhbSB0aGluZzIiCitUSElORzFfUExVU19USElORzIgPSAiJXMsIHBsdXMgJXMiICUgKFRISU5HMSwgVEhJTkcyKQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvZnVuY193MDgwMS5weSBiL3Rlc3RzL2lucHV0L2Z1bmNfdzA4MDEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzODZmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L2Z1bmNfdzA4MDEucHkKQEAgLTAsMCArMSwxMSBAQAorIiIidGVzdCBjb2RlIHNpbWlsYXJpdGllcworYnkgZGVmYXV0IGRvY3N0cmluZyBhcmUgbm90IGNvbnNpZGVyZWQKKyIiIgorX19yZXZpc2lvbl9fID0gJ2lkJworQSA9IDIKK0IgPSAzCitDID0gQSArIEIKKyMgbmVlZCBtb3JlIHRoYW4gWCBsaW5lcyB0byB0cmlnZ2VyIHRoZSBtZXNzYWdlCitDICo9IDIKK0EgLT0gQgorIyBhbGwgdGhpcyBzaG91bGQgYmUgZGV0ZWN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L2hpZGVfY29kZV93aXRoX2ltcG9ydHMucHkgYi90ZXN0cy9pbnB1dC9oaWRlX2NvZGVfd2l0aF9pbXBvcnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDQ5YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9oaWRlX2NvZGVfd2l0aF9pbXBvcnRzLnB5CkBAIC0wLDAgKzEsMTYgQEAKK3F1aWNrc29ydCA9IGxhbWJkYSBhOiBxczEoYSwwLGxlbihhKS0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGltcG9ydCBhCitxczEgPSBsYW1iZGEgYSxsbyxoaTogcXMyKGEsbG8saGkpIGlmIGxvPGhpIGVsc2UgYSAgICAgICAgICAgICAgICAgICAgOyBpbXBvcnQgYgorcXMyID0gbGFtYmRhIGEsbG8saGk6IHFzMyhsbyxoaSwqcXNwKGEsbG8saGkpKSAgICAgICAgICAgICAgICAgICAgICAgIDsgaW1wb3J0IGMKK3FzMyA9IGxhbWJkYSBsbyxoaSxhLHA6IHFzMShxczEoYSxwKzEsaGkpLGxvLHAtMSkgICAgICAgICAgICAgICAgICAgICA7IGltcG9ydCBkCitxc3AgPSBsYW1iZGEgYSxsbyxoaTogcXNwMShhLGxvLGhpLGFbaGldLGxvLGxvKSAgICAgICAgICAgICAgICAgICAgICAgOyBpbXBvcnQgZQorcXNwMSA9IGxhbWJkYSBhLGxvLGhpLHAsaSxqOiBxc3AyKGEsbG8saGkscCxpLGosajxoaSkgICAgICAgICAgICAgICAgIDsgaW1wb3J0IGYKK3FzcDIgPSBsYW1iZGEgYSxsbyxoaSxwLGksaixjOiBxc3B0KGEsbG8saGkscCxpLGoscXNwMyBpZiBjIGVsc2UgcXNwNyk7IGltcG9ydCBnCitxc3B0ID0gbGFtYmRhIGEsbG8saGkscCxpLGosbjogbihhLGxvLGhpLHAsaSxqKSAgICAgICAgICAgICAgICAgICAgICAgOyBpbXBvcnQgaAorcXNwMyA9IGxhbWJkYSBhLGxvLGhpLHAsaSxqOiBxc3A0KGEsbG8saGkscCxpLGosYVtqXTxwKSAgICAgICAgICAgICAgIDsgaW1wb3J0IGkKK3FzcDQgPSBsYW1iZGEgYSxsbyxoaSxwLGksaixjOiBxc3B0KGEsbG8saGkscCxpLGoscXNwNSBpZiBjIGVsc2UgcXNwNik7IGltcG9ydCBqCitxc3A1ID0gbGFtYmRhIGEsbG8saGkscCxpLGo6IHFzcDEoc3coYSxpLGopLGxvLGhpLHAsaSsxLGorMSkgICAgICAgICAgOyBpbXBvcnQgaworcXNwNiA9IGxhbWJkYSBhLGxvLGhpLHAsaSxqOiBxc3AxKGEsbG8saGkscCxpLGorMSkgICAgICAgICAgICAgICAgICAgIDsgaW1wb3J0IGwKK3FzcDcgPSBsYW1iZGEgYSxsbyxoaSxwLGksajogKHN3KGEsaSxoaSksIGkpICAgICAgICAgICAgICAgICAgICAgICAgICA7IGltcG9ydCBtCitzdyA9IGxhbWJkYSBhLGksajogc3cxKGVudW1lcmF0ZShhKSxpLGosYVtpXSwoLTEsYVtqXSkpICAgICAgICAgICAgICAgOyBpbXBvcnQgbgorc3cxID0gbGFtYmRhIGEsaSxqLGFpLGFqOiBzdzIoW2FqIGlmIHhbMF09PWkgZWxzZSB4IGZvciB4IGluIGFdLGosYWkpIDsgaW1wb3J0IG8KK3N3MiA9IGxhbWJkYSBhLGosYWk6IFthaSBpZiB4WzBdPT1qIGVsc2UgeFsxXSBmb3IgeCBpbiBhXSAgICAgICAgICAgICA7IGltcG9ydCBwCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9pZ25vcmVfZXhjZXB0X3Bhc3NfYnlfZGVmYXVsdC5weSBiL3Rlc3RzL2lucHV0L2lnbm9yZV9leGNlcHRfcGFzc19ieV9kZWZhdWx0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGU1NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9pZ25vcmVfZXhjZXB0X3Bhc3NfYnlfZGVmYXVsdC5weQpAQCAtMCwwICsxLDYgQEAKKyIiIiM1NTc1OiBieSBkZWZhdWx0IG5vIFcwNzA0IHdhcm5pbmcgb24gYmFyZSBwYXNzIGluIGV4Y2VwdCIiIgorCit0cnk6CisgICAgX19leGNlcHRpb25fXyA9IDAKK2V4Y2VwdCBWYWx1ZUVycm9yOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L211bHRpbGluZS1pbXBvcnQgYi90ZXN0cy9pbnB1dC9tdWx0aWxpbmUtaW1wb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTA3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9tdWx0aWxpbmUtaW1wb3J0CkBAIC0wLDAgKzEsOCBAQAorZnJvbSBmb28gaW1wb3J0ICgKKyAgYmFyLAorICBiYXosCisgIHF1dXgsCisgIHF1dXV4LAorICBxdXV1dXgsCisgIHF1dXV1dXgsCispCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9ub19hYnNvbHV0ZV9pbXBvcnQucHkgYi90ZXN0cy9pbnB1dC9ub19hYnNvbHV0ZV9pbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwNTk0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L25vX2Fic29sdXRlX2ltcG9ydC5weQpAQCAtMCwwICsxLDUgQEAKKyIiIiBQdXRzIGlzc3VlICMyNjcyIHVuZGVyIHRlc3QgKC1qIDEgdnMgLWogTikKKworSGVyZSB3ZSB1c2UgYSBzaW1wbGUgZmlsZSB0byBlbnN1cmUgY29uZmlncyBhcmUgdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lIHdheSBpbiAtaiAxIGFuZAorLWogTiAiIiIKK2ltcG9ydCBvcyAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydApkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvbm9leHQgYi90ZXN0cy9pbnB1dC9ub2V4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVkYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvbm9leHQKQEAgLTAsMCArMSw0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyIiImEgcHl0aG9uIGZpbGUgd2l0aG91dCAucHkgZXh0ZW5zaW9uIiIiCisKK19fcmV2aXNpb25fXyA9IE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L25vdF9faW5pdF9fLnB5IGIvdGVzdHMvaW5wdXQvbm90X19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlOTJiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L25vdF9faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyIiInRlc3QiIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NpbWlsYXIxIGIvdGVzdHMvaW5wdXQvc2ltaWxhcjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzM2UyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NpbWlsYXIxCkBAIC0wLDAgKzEsMzAgQEAKK2ltcG9ydCBvbmUKK2Zyb20gdHdvIGltcG9ydCB0d28KK3RocmVlCitmb3VyCitmaXZlCitzaXggIyBjb21tZW50cyBvcHRpb25hbGx5IGlnbm9yZWQKK3NldmVuCitlaWdodAorbmluZQorJycnIHRlbgorZWxldmVuCit0d2VsdmUgJycnCit0aGlydGVlbgorZm91cnRlZW4KK2ZpZnRlZW4KKworCisKKworc2l4dGVlbgorc2V2ZW50ZWVuCitlaWdodGVlbgorCisKKworCituaW5ldGVlbgorciIiIgordHdlbnR5CisiIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NpbWlsYXIyIGIvdGVzdHMvaW5wdXQvc2ltaWxhcjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliY2FiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NpbWlsYXIyCkBAIC0wLDAgKzEsMzAgQEAKK2ltcG9ydCBvbmUKK2Zyb20gdHdvIGltcG9ydCB0d28KK3RocmVlCitmb3VyCitmaXZlCitzaXgKK3NldmVuCitlaWdodAorbmluZQorJycnIHRlbgorRUxFVkVOCit0d2VsdmUgJycnCit0aGlydGVlbgorZm91cnRlZW4KK0ZJRlRFRU4KKworCisKKworc2l4dGVlbgorc2V2ZW50ZWVuCitlaWdodGVlbgorCisKKworCitOSU5FVEVFTgorciIiIgordHdlbnR5CisiIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NpbWlsYXIzIGIvdGVzdHMvaW5wdXQvc2ltaWxhcjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NDMxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NpbWlsYXIzCkBAIC0wLDAgKzEsMjUgQEAKK2EgPSAoCisgICAgKAorICAgICAgICBbCisgICAgICAgICAgICAiTGluZXMgMS04IHVzZWQgdG8gdHJpZ2dlciBhIHNpbWlsYXJpdHkgd2FybmluZywgYnV0IG5vdyB0aGV5IGRvbid0IGJlY2F1c2UuLi4iLAorICAgICAgICAgICAgIi4uLmxpbmVzIHdpdGggb25seSBzeW1ib2xzIGFyZSBpZ25vcmVkIGFuZCBkb24ndCBjb3VudCBpbiB0aGUgbGluZSBjb3VudCBsaW1pdC4iCisgICAgICAgIF0KKyAgICApLAorKQorCisiVGhpcyBsaW5lIGluIHNpbWlsYXIzIGJyZWFrcyB1cCB0aGUgc2VjdGlvbnMgb2YgY29kZSBieSBiZWluZyBkaWZmZXJlbnQgdGhhbiBzaW1pbGFyNCIKKworYiA9ICgKKyAgICAoCisgICAgICAgIFsKKyAgICAgICAgICAgICJMaW5lcyAxMi0yNSBzdGlsbCB0cmlnZ2VyIGEgc2ltaWxhcml0eS4uLiIsCisgICAgICAgICAgICAiLi4ud2FybmluZywgYmVjYXVzZS4uLiIKKyAgICAgICAgXSwKKyAgICAgICAgWworICAgICAgICAgICAgIi4uLmV2ZW4gYWZ0ZXIgaWdub3JpbmcgbGluZXMgd2l0aCBvbmx5IHN5bWJvbHMuLi4iCisgICAgICAgIF0sCisgICAgKSwKKyAgICAoCisgICAgICAgICIuLi50aGVyZSBhcmUgc3RpbGwgNSBzaW1pbGFyIGxpbmVzIGluIHRoaXMgY29kZSBibG9jay4iLAorICAgICkKKykKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NpbWlsYXI0IGIvdGVzdHMvaW5wdXQvc2ltaWxhcjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYWQyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NpbWlsYXI0CkBAIC0wLDAgKzEsMjUgQEAKK2EgPSAoCisgICAgKAorICAgICAgICBbCisgICAgICAgICAgICAiTGluZXMgMS04IHVzZWQgdG8gdHJpZ2dlciBhIHNpbWlsYXJpdHkgd2FybmluZywgYnV0IG5vdyB0aGV5IGRvbid0IGJlY2F1c2UuLi4iLAorICAgICAgICAgICAgIi4uLmxpbmVzIHdpdGggb25seSBzeW1ib2xzIGFyZSBpZ25vcmVkIGFuZCBkb24ndCBjb3VudCBpbiB0aGUgbGluZSBjb3VudCBsaW1pdC4iCisgICAgICAgIF0KKyAgICApLAorKQorCisiVGhpcyBsaW5lIGluIHNpbWlsYXI0IGJyZWFrcyB1cCB0aGUgc2VjdGlvbnMgb2YgY29kZSBieSBiZWluZyBkaWZmZXJlbnQgdGhhbiBzaW1pbGFyMyIKKworYiA9ICgKKyAgICAoCisgICAgICAgIFsKKyAgICAgICAgICAgICJMaW5lcyAxMi0yNSBzdGlsbCB0cmlnZ2VyIGEgc2ltaWxhcml0eS4uLiIsCisgICAgICAgICAgICAiLi4ud2FybmluZywgYmVjYXVzZS4uLiIKKyAgICAgICAgXSwKKyAgICAgICAgWworICAgICAgICAgICAgIi4uLmV2ZW4gYWZ0ZXIgaWdub3JpbmcgbGluZXMgd2l0aCBvbmx5IHN5bWJvbHMuLi4iCisgICAgICAgIF0sCisgICAgKSwKKyAgICAoCisgICAgICAgICIuLi50aGVyZSBhcmUgc3RpbGwgNSBzaW1pbGFyIGxpbmVzIGluIHRoaXMgY29kZSBibG9jay4iLAorICAgICkKKykKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NpbWlsYXI1IGIvdGVzdHMvaW5wdXQvc2ltaWxhcjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NjEwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NpbWlsYXI1CkBAIC0wLDAgKzEsOCBAQAorZGVmIGZ1bmMxKAorICAgIGFyZzE6IGludCA9IDMsCisgICAgYXJnMjogQ2xhc3MxID0gdmFsMSwKKyAgICBhcmczOiBDbGFzczIgPSBmdW5jMyh2YWwyKSwKKyAgICBhcmc0OiBpbnQgPSA0LAorICAgIGFyZzU6IGludCA9IDUKKykgLT4gUmV0MToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9zaW1pbGFyNiBiL3Rlc3RzL2lucHV0L3NpbWlsYXI2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNzdlOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnB1dC9zaW1pbGFyNgpAQCAtMCwwICsxLDE1IEBACisKK0BkZWNvMShkdmFsMSkKK0BkZWNvMihkdmFsMikKK0BkZWNvMygKKyAgICBkdmFsMywKKyAgICBkdmFsNAorKQorYXN5bmMgZGVmIGZ1bmMyKAorICAgIGFyZzE6IGludCA9IDMsCisgICAgYXJnMjogQ2xhc3MxID0gdmFsMSwKKyAgICBhcmczOiBDbGFzczIgPSBmdW5jMyh2YWwyKSwKKyAgICBhcmc0OiBpbnQgPSA0LAorICAgIGFyZzU6IGludCA9IDUKKykgLT4gUmV0MToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9pbnB1dC9zaW1pbGFyX2xpbmVzX2EucHkgYi90ZXN0cy9pbnB1dC9zaW1pbGFyX2xpbmVzX2EucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhNzJhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3NpbWlsYXJfbGluZXNfYS5weQpAQCAtMCwwICsxLDYzIEBACisiIiIgQSBmaWxlIGRlc2lnbmVkIHRvIGhhdmUgbGluZXMgb2Ygc2ltaWxhcml0eSB3aGVuIGNvbXBhcmVkIHRvIHNpbWlsYXJfbGluZXNfYgorCitXZSB1c2UgbG9ybS1pcHN1bSB0byBnZW5lcmF0ZSAncmFuZG9tJyBjb2RlLiAiIiIKKyMgQ29weXJpZ2h0IChjKSAyMDIwIEZyYW5rIEhhcnJpc29uIDxmcmFua0Bkb3VibGV0aGVmaXNoLmNvbT4KKworCitkZWYgYWRpcGlzY2luZyhlbGl0KToKKyAgICBldGlhbSA9ICJpZCIKKyAgICBkaWN0dW0gPSAicHVydXMsIgorICAgIHZpdGFlID0gInByZXRpdW0iCisgICAgbmVxdWUgPSAiVml2YW11cyIKKyAgICBuZWMgPSAib3JuYXJlIgorICAgIHRvcnRvciA9ICJzaXQiCisgICAgcmV0dXJuIGV0aWFtLCBkaWN0dW0sIHZpdGFlLCBuZXF1ZSwgbmVjLCB0b3J0b3IKKworCitjbGFzcyBBbWV0OgorICAgIGRlZiBzaW1pbGFyX2Z1bmN0aW9uXzNfbGluZXMoc2VsZiwgdGVsbHVzKTogICMgbGluZSBzYW1lICMxCisgICAgICAgIGFnaXR0aXMgPSAxMCAgIyBsaW5lIHNhbWUgIzIKKyAgICAgICAgdGVsbHVzICo9IDMwMCAgIyBsaW5lIHNhbWUgIzMKKyAgICAgICAgcmV0dXJuIGFnaXR0aXMsIHRlbGx1cyAgIyBsaW5lIGRpZmYKKworICAgIGRlZiBsb3JlbShzZWxmLCBpcHN1bSk6CisgICAgICAgIGRvbG9yID0gInNpdCIKKyAgICAgICAgYW1ldCA9ICJjb25zZWN0ZXR1ciIKKyAgICAgICAgcmV0dXJuIChsb3JlbSwgZG9sb3IsIGFtZXQpCisKKyAgICBkZWYgc2ltaWxhcl9mdW5jdGlvbl81X2xpbmVzKHNlbGYsIHNpbWlsYXIpOiAgIyBsaW5lIHNhbWUgIzEKKyAgICAgICAgc29tZV92YXIgPSAxMCAgIyBsaW5lIHNhbWUgIzIKKyAgICAgICAgc29tZW90aGVyX3ZhciAqPSAzMDAgICMgbGluZSBzYW1lICMzCisgICAgICAgIGZ1c2NlID0gInNpdCIgICMgbGluZSBzYW1lICM0CisgICAgICAgIGFtZXQgPSAidG9ydG9yIiAgIyBsaW5lIHNhbWUgIzUKKyAgICAgICAgcmV0dXJuIHNvbWVfdmFyLCBzb21lb3RoZXJfdmFyLCBmdXNjZSwgYW1ldCAgIyBsaW5lIGRpZmYKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2xlc2tpZSwgbGVjdHVzPSJNYXVyaXMiLCBhYz0icGVsbGVudGVzcXVlIik6CisgICAgICAgIG1ldHVzID0gInV0IgorICAgICAgICBsb2JvcnRpcyA9ICJ1cm5hLiIKKyAgICAgICAgSW50ZWdlciA9ICJuaXNsIgorICAgICAgICAobWF1cmlzLCkgPSAiaW50ZXJkdW0iCisgICAgICAgIG5vbiA9ICJvZGlvIgorICAgICAgICBzZW1wZXIgPSAiYWxpcXVhbSIKKyAgICAgICAgbWFsZXN1YWRhID0gIm51bmMuIgorICAgICAgICBpYWN1bGlzID0gImRvbG9yIgorICAgICAgICBmYWNpbGlzaXMgPSAidWx0cmljZXMiCisgICAgICAgIHZpdGFlID0gInV0LiIKKworICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgbWV0dXMsCisgICAgICAgICAgICBsb2JvcnRpcywKKyAgICAgICAgICAgIEludGVnZXIsCisgICAgICAgICAgICBtYXVyaXMsCisgICAgICAgICAgICBub24sCisgICAgICAgICAgICBzZW1wZXIsCisgICAgICAgICAgICBtYWxlc3VhZGEsCisgICAgICAgICAgICBpYWN1bGlzLAorICAgICAgICAgICAgZmFjaWxpc2lzLAorICAgICAgICAgICAgdml0YWUsCisgICAgICAgICkKKworICAgIGRlZiBzaW1pbGFyX2Z1bmN0aW9uXzNfbGluZXMoc2VsZiwgdGVsbHVzKTogICMgbGluZSBzYW1lICMxCisgICAgICAgIGFnaXR0aXMgPSAxMCAgIyBsaW5lIHNhbWUgIzIKKyAgICAgICAgdGVsbHVzICo9IDMwMCAgIyBsaW5lIHNhbWUgIzMKKyAgICAgICAgcmV0dXJuIGFnaXR0aXMsIHRlbGx1cyAgIyBsaW5lIGRpZmYKZGlmZiAtLWdpdCBhL3Rlc3RzL2lucHV0L3NpbWlsYXJfbGluZXNfYi5weSBiL3Rlc3RzL2lucHV0L3NpbWlsYXJfbGluZXNfYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYzNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvc2ltaWxhcl9saW5lc19iLnB5CkBAIC0wLDAgKzEsMzYgQEAKKyIiIiBUaGUgc2lzdGVyIGZpbGUgb2Ygc2ltaWxhcl9saW5lc19hLCBhbm90aGVyIGZpbGUgZGVzaWduZWQgdG8gaGF2ZSBsaW5lcyBvZgorc2ltaWxhcml0eSB3aGVuIGNvbXBhcmVkIHRvIGl0cyBzaXN0ZXIgZmlsZQorCitBcyB3aXRoIHRoZSBzaXN0ZXIgZmlsZSwgd2UgdXNlIGxvcm0taXBzdW0gdG8gZ2VuZXJhdGUgJ3JhbmRvbScgY29kZS4gIiIiCisjIENvcHlyaWdodCAoYykgMjAyMCBGcmFuayBIYXJyaXNvbiA8ZnJhbmtAZG91YmxldGhlZmlzaC5jb20+CisKKworY2xhc3MgTnVsbGE6CisgICAgdG9ydG9yID0gInVsdHJpY2VzIHF1aXMgcG9ydGEgaW4iCisgICAgc2FnaXR0aXMgPSAidXQgdGVsbHVzIgorCisgICAgZGVmIHB1bHZpbmFyKHNlbGYsIGJsYW5kaXQsIG1ldHVzKToKKyAgICAgICAgZWdlc3RhcyA9IFttYXVyaXMgZm9yIG1hdXJpcyBpbiB6aXAoYmxhbmRpdCwgbWV0dXMpXQorICAgICAgICBuZXF1ZSA9IChlZ2VzdGFzLCBibGFuZGl0KQorCisgICAgZGVmIHNpbWlsYXJfZnVuY3Rpb25fNV9saW5lcyhzZWxmLCBzaW1pbGFyKTogICMgbGluZSBzYW1lICMxCisgICAgICAgIHNvbWVfdmFyID0gMTAgICMgbGluZSBzYW1lICMyCisgICAgICAgIHNvbWVvdGhlcl92YXIgKj0gMzAwICAjIGxpbmUgc2FtZSAjMworICAgICAgICBmdXNjZSA9ICJzaXQiICAjIGxpbmUgc2FtZSAjNAorICAgICAgICBhbWV0ID0gInRvcnRvciIgICMgbGluZSBzYW1lICM1CisgICAgICAgIGlhY3VsaXMgPSAiZG9sb3IiICAjIGxpbmUgZGlmZgorICAgICAgICByZXR1cm4gc29tZV92YXIsIHNvbWVvdGhlcl92YXIsIGZ1c2NlLCBhbWV0LCBpYWN1bGlzLCBpYWN1bGlzICAjIGxpbmUgZGlmZgorCisKK2RlZiB0b3J0b3Ioc2VsZik6CisgICAgdWx0cmljZXMgPSAyCisgICAgcXVpcyA9IHVsdHJpY2llcyAqICJwb3J0YSIKKyAgICByZXR1cm4gdWx0cmljaWVzLCBxdWlzCisKKworY2xhc3MgQ29tbW9kbzoKKyAgICBkZWYgc2ltaWxhcl9mdW5jdGlvbl8zX2xpbmVzKHNlbGYsIHRlbGx1cyk6ICAjIGxpbmUgc2FtZSAjMQorICAgICAgICBhZ2l0dGlzID0gMTAgICMgbGluZSBzYW1lICMyCisgICAgICAgIHRlbGx1cyAqPSAzMDAgICMgbGluZSBzYW1lICMzCisgICAgICAgIGxhb3JlZXQgPSAiY29tbW9kbyAiICAjIGxpbmUgZGlmZgorICAgICAgICByZXR1cm4gYWdpdHRpcywgdGVsbHVzLCBsYW9yZWV0ICAjIGxpbmUgZGlmZgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvdzA0MDFfY3ljbGUucHkgYi90ZXN0cy9pbnB1dC93MDQwMV9jeWNsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGI0MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW5wdXQvdzA0MDFfY3ljbGUucHkKQEAgLTAsMCArMSw5IEBACisiIiJ3MDQwMSBkZXBlbmRlbmN5CisiIiIKKyMgcHlsaW50OiBkaXNhYmxlPXByaW50LXN0YXRlbWVudCwgbm8tYWJzb2x1dGUtaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2Zyb20gLiBpbXBvcnQgZnVuY193MDQwMQorCitpZiBmdW5jX3cwNDAxOgorICAgIHByaW50KGlucHV0KQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW5wdXQvdzA4MDFfc2FtZS5weSBiL3Rlc3RzL2lucHV0L3cwODAxX3NhbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzODZmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lucHV0L3cwODAxX3NhbWUucHkKQEAgLTAsMCArMSwxMSBAQAorIiIidGVzdCBjb2RlIHNpbWlsYXJpdGllcworYnkgZGVmYXV0IGRvY3N0cmluZyBhcmUgbm90IGNvbnNpZGVyZWQKKyIiIgorX19yZXZpc2lvbl9fID0gJ2lkJworQSA9IDIKK0IgPSAzCitDID0gQSArIEIKKyMgbmVlZCBtb3JlIHRoYW4gWCBsaW5lcyB0byB0cmlnZ2VyIHRoZSBtZXNzYWdlCitDICo9IDIKK0EgLT0gQgorIyBhbGwgdGhpcyBzaG91bGQgYmUgZGV0ZWN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpbnQvX19pbml0X18ucHkgYi90ZXN0cy9saW50L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9saW50L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0cy9saW50L3VuaXR0ZXN0X2V4cGFuZF9tb2R1bGVzLnB5IGIvdGVzdHMvbGludC91bml0dGVzdF9leHBhbmRfbW9kdWxlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYxOGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGludC91bml0dGVzdF9leHBhbmRfbW9kdWxlcy5weQpAQCAtMCwwICsxLDg5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKworaW1wb3J0IHJlCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5saW50LmV4cGFuZF9tb2R1bGVzIGltcG9ydCBfaXNfaW5faWdub3JlX2xpc3RfcmUsIGV4cGFuZF9tb2R1bGVzCisKKworZGVmIHRlc3RfX2lzX2luX2lnbm9yZV9saXN0X3JlX21hdGNoKCk6CisgICAgcGF0dGVybnMgPSBbCisgICAgICAgIHJlLmNvbXBpbGUoIi4qZW5jaGlsYWRhLioiKSwKKyAgICAgICAgcmUuY29tcGlsZSgidW5pdHRlc3RfLioiKSwKKyAgICAgICAgcmUuY29tcGlsZSgiLip0ZXN0cy8uKiIpLAorICAgIF0KKyAgICBhc3NlcnQgX2lzX2luX2lnbm9yZV9saXN0X3JlKCJ1bml0dGVzdF91dGlscy5weSIsIHBhdHRlcm5zKQorICAgIGFzc2VydCBfaXNfaW5faWdub3JlX2xpc3RfcmUoImNoZWVzZV9lbmNoaWxhZGFzLnhtbCIsIHBhdHRlcm5zKQorICAgIGFzc2VydCBfaXNfaW5faWdub3JlX2xpc3RfcmUoInNyYy90ZXN0cy93aGF0ZXZlci54bWwiLCBwYXR0ZXJucykKKworCitkZWYgdGVzdF9faXNfaW5faWdub3JlX2xpc3RfcmVfbm9tYXRjaCgpOgorICAgIHBhdHRlcm5zID0gWworICAgICAgICByZS5jb21waWxlKCIuKmVuY2hpbGFkYS4qIiksCisgICAgICAgIHJlLmNvbXBpbGUoInVuaXR0ZXN0Xy4qIiksCisgICAgICAgIHJlLmNvbXBpbGUoIi4qdGVzdHMvLioiKSwKKyAgICBdCisgICAgYXNzZXJ0IG5vdCBfaXNfaW5faWdub3JlX2xpc3RfcmUoInRlc3RfdXRpbHMucHkiLCBwYXR0ZXJucykKKyAgICBhc3NlcnQgbm90IF9pc19pbl9pZ25vcmVfbGlzdF9yZSgiZW5jaGlsYWQucHkiLCBwYXR0ZXJucykKKyAgICBhc3NlcnQgbm90IF9pc19pbl9pZ25vcmVfbGlzdF9yZSgic3JjL3Rlc3RzLnB5IiwgcGF0dGVybnMpCisKKworVEVTVF9ESVJFQ1RPUlkgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50CitJTklUX1BBVEggPSBzdHIoVEVTVF9ESVJFQ1RPUlkgLyAibGludC9fX2luaXRfXy5weSIpCitFWFBBTkRfTU9EVUxFUyA9IHN0cihURVNUX0RJUkVDVE9SWSAvICJsaW50L3VuaXR0ZXN0X2V4cGFuZF9tb2R1bGVzLnB5IikKK3RoaXNfZmlsZSA9IHsKKyAgICAiYmFzZW5hbWUiOiAibGludC51bml0dGVzdF9leHBhbmRfbW9kdWxlcyIsCisgICAgImJhc2VwYXRoIjogRVhQQU5EX01PRFVMRVMsCisgICAgImlzYXJnIjogVHJ1ZSwKKyAgICAibmFtZSI6ICJsaW50LnVuaXR0ZXN0X2V4cGFuZF9tb2R1bGVzIiwKKyAgICAicGF0aCI6IEVYUEFORF9NT0RVTEVTLAorfQorCit0aGlzX2ZpbGVfZnJvbV9pbml0ID0geworICAgICJiYXNlbmFtZSI6ICJsaW50IiwKKyAgICAiYmFzZXBhdGgiOiBJTklUX1BBVEgsCisgICAgImlzYXJnIjogRmFsc2UsCisgICAgIm5hbWUiOiAibGludC51bml0dGVzdF9leHBhbmRfbW9kdWxlcyIsCisgICAgInBhdGgiOiBFWFBBTkRfTU9EVUxFUywKK30KKwordW5pdHRlc3RfbGludCA9IHsKKyAgICAiYmFzZW5hbWUiOiAibGludCIsCisgICAgImJhc2VwYXRoIjogSU5JVF9QQVRILAorICAgICJpc2FyZyI6IEZhbHNlLAorICAgICJuYW1lIjogImxpbnQudW5pdHRlc3RfbGludCIsCisgICAgInBhdGgiOiBzdHIoVEVTVF9ESVJFQ1RPUlkgLyAibGludC91bml0dGVzdF9saW50LnB5IiksCit9CisKKworaW5pdF9vZl9wYWNrYWdlID0geworICAgICJiYXNlbmFtZSI6ICJsaW50IiwKKyAgICAiYmFzZXBhdGgiOiBJTklUX1BBVEgsCisgICAgImlzYXJnIjogVHJ1ZSwKKyAgICAibmFtZSI6ICJsaW50IiwKKyAgICAicGF0aCI6IElOSVRfUEFUSCwKK30KKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgImZpbGVzX29yX21vZHVsZXMsZXhwZWN0ZWQiLAorICAgIFsKKyAgICAgICAgKFtfX2ZpbGVfX10sIFt0aGlzX2ZpbGVdKSwKKyAgICAgICAgKAorICAgICAgICAgICAgW1BhdGgoX19maWxlX18pLnBhcmVudF0sCisgICAgICAgICAgICBbaW5pdF9vZl9wYWNrYWdlLCB0aGlzX2ZpbGVfZnJvbV9pbml0LCB1bml0dGVzdF9saW50XSwKKyAgICAgICAgKSwKKyAgICBdLAorKQorZGVmIHRlc3RfZXhwYW5kX21vZHVsZXMoZmlsZXNfb3JfbW9kdWxlcywgZXhwZWN0ZWQpOgorICAgIGlnbm9yZV9saXN0LCBpZ25vcmVfbGlzdF9yZSwgaWdub3JlX2xpc3RfcGF0aHNfcmUgPSBbXSwgW10sIFtdCisgICAgbW9kdWxlcywgZXJyb3JzID0gZXhwYW5kX21vZHVsZXMoCisgICAgICAgIGZpbGVzX29yX21vZHVsZXMsIGlnbm9yZV9saXN0LCBpZ25vcmVfbGlzdF9yZSwgaWdub3JlX2xpc3RfcGF0aHNfcmUKKyAgICApCisgICAgbW9kdWxlcy5zb3J0KGtleT1sYW1iZGEgZDogZFsibmFtZSJdKQorICAgIGFzc2VydCBtb2R1bGVzID09IGV4cGVjdGVkCisgICAgYXNzZXJ0IG5vdCBlcnJvcnMKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpbnQvdW5pdHRlc3RfbGludC5weSBiL3Rlc3RzL2xpbnQvdW5pdHRlc3RfbGludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg1YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGludC91bml0dGVzdF9saW50LnB5CkBAIC0wLDAgKzEsODQxIEBACisjIENvcHlyaWdodCAoYykgMjAwNi0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMiBLZXZpbiBKaW5nIFFpdSA8a2V2aW4uamluZy5xaXVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgQW50aG9ueSBWRVJFWiA8YW50aG9ueS52ZXJlei5leHRlcm5hbEBjYXNzaWRpYW4uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgRkVMRCBCb3JpcyA8bG90aGlyYWxkYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBCcnVoaW4gPG1lQHRoZS1jb21waWxlci5vcmc+CisjIENvcHlyaWdodCAoYykgMjAxNSBOb2FtIFlvcmF2LVJhcGhhZWwgPG5vYW1yYXBoQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxNyBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbGVubkBlLWRhZC5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNiBHbGVubiBNYXR0aGV3cyA8Z2xtYXR0aGVAY2lzY28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IENyYWlnIENpdHJvIDxjcmFpZ2NpdHJvQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOCwgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IE1hdHVzIFZhbG8gPG1hdHVzdmFsb0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTY290dCBXb3JsZXkgPHNjb3R0d29ybGV5QHNjb3R0d29ybGV5LmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFJhbmRhbGwgTGVlZHMgPHJhbmRhbGxAYmxlZWRzLmluZm8+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFJldmVyYiBDIDxyZXZlcmJjQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEphbm5lIFLDtm5ra8O2IDxqYW5uZXJvQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IFRyZXZvciBCZWtvbGF5IDx0YmVrb2xheUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBbmRyZXMgUGVyZXogSG9ydGFsIDxhbmRyZXNwZXJlemNiYUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgTWFydGluIFZpZWxzbWFpZXIgPG1hcnRpbkB2aWVsc21haWVyLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIERhbWllbiBCYXR5IDxkYW1pZW4uYmF0eUBwb2x5Y29uc2VpbC5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIEFuZHJlYXMgRmlua2xlciA8YW5kaS5maW5rbGVyQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLW91dGVyLW5hbWUKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorZnJvbSBpbXBvcnRsaWIgaW1wb3J0IHJlbG9hZAorZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gb3MgaW1wb3J0IGNoZGlyLCBnZXRjd2QKK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgYmFzZW5hbWUsIGRpcm5hbWUsIGlzZGlyLCBqb2luLCBzZXAKK2Zyb20gc2h1dGlsIGltcG9ydCBybXRyZWUKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMsIGNvbmZpZywgZXhjZXB0aW9ucywgaW50ZXJmYWNlcywgbGludCwgdGVzdHV0aWxzCitmcm9tIHB5bGludC5jaGVja2Vycy51dGlscyBpbXBvcnQgY2hlY2tfbWVzc2FnZXMKK2Zyb20gcHlsaW50LmNvbnN0YW50cyBpbXBvcnQgKAorICAgIE1TR19TVEFURV9DT05GSURFTkNFLAorICAgIE1TR19TVEFURV9TQ09QRV9DT05GSUcsCisgICAgTVNHX1NUQVRFX1NDT1BFX01PRFVMRSwKKykKK2Zyb20gcHlsaW50LmV4Y2VwdGlvbnMgaW1wb3J0IEludmFsaWRNZXNzYWdlRXJyb3IKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IEFyZ3VtZW50UHJlcHJvY2Vzc2luZ0Vycm9yLCBQeUxpbnRlciwgUnVuLCBwcmVwcm9jZXNzX29wdGlvbnMKK2Zyb20gcHlsaW50LnJlcG9ydGVycyBpbXBvcnQgdGV4dAorZnJvbSBweWxpbnQudXRpbHMgaW1wb3J0IEZpbGVTdGF0ZSwgdG9rZW5pemVfbW9kdWxlCisKK2lmIG9zLm5hbWUgPT0gImphdmEiOgorICAgICMgcHlsaW50OiBkaXNhYmxlPW5vLW1lbWJlcgorICAgICMgb3MuX25hbWUgaXMgdmFsaWQgc2VlIGh0dHBzOi8vd3d3LnByb2dyYW1jcmVlay5jb20vcHl0aG9uL2V4YW1wbGUvMzg0Mi9vcy5fbmFtZQorICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgSE9NRSA9ICJVU0VSUFJPRklMRSIKKyAgICBlbHNlOgorICAgICAgICBIT01FID0gIkhPTUUiCitlbGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgIEhPTUUgPSAiVVNFUlBST0ZJTEUiCitlbHNlOgorICAgIEhPTUUgPSAiSE9NRSIKKworCitAY29udGV4dG1hbmFnZXIKK2RlZiBmYWtlX2hvbWUoKToKKyAgICBmb2xkZXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCJmYWtlLWhvbWUiKQorICAgIG9sZF9ob21lID0gb3MuZW52aXJvbi5nZXQoSE9NRSkKKyAgICB0cnk6CisgICAgICAgIG9zLmVudmlyb25bSE9NRV0gPSBmb2xkZXIKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5lbnZpcm9uLnBvcCgiUFlMSU5UUkMiLCAiIikKKyAgICAgICAgaWYgb2xkX2hvbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uW0hPTUVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5lbnZpcm9uW0hPTUVdID0gb2xkX2hvbWUKKyAgICAgICAgcm10cmVlKGZvbGRlciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisKK2RlZiByZW1vdmUoZmlsZSk6CisgICAgdHJ5OgorICAgICAgICBvcy5yZW1vdmUoZmlsZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworCisKK0hFUkUgPSBhYnNwYXRoKGRpcm5hbWUoX19maWxlX18pKQorSU5QVVRfRElSID0gam9pbihIRVJFLCAiLi4iLCAiaW5wdXQiKQorUkVHUlRFU1RfREFUQV9ESVIgPSBqb2luKEhFUkUsICIuLiIsICJyZWdydGVzdF9kYXRhIikKK0RBVEFfRElSID0gam9pbihIRVJFLCAiLi4iLCAiZGF0YSIpCisKKworQGNvbnRleHRtYW5hZ2VyCitkZWYgdGVtcGRpcigpOgorICAgICIiIkNyZWF0ZSBhIHRlbXAgZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gaXQuCisKKyAgICBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgd2l0aCBhICp3aXRoKiBzdGF0ZW1lbnQuCisgICAgIiIiCisgICAgdG1wID0gdGVtcGZpbGUubWtkdGVtcCgpCisKKyAgICAjIEdldCByZWFsIHBhdGggb2YgdGVtcGZpbGUsIG90aGVyd2lzZSB0ZXN0IGZhaWwgb24gbWFjIG9zIHgKKyAgICBjdXJyZW50X2RpciA9IGdldGN3ZCgpCisgICAgY2hkaXIodG1wKQorICAgIGFic190bXAgPSBhYnNwYXRoKCIuIikKKworICAgIHRyeToKKyAgICAgICAgeWllbGQgYWJzX3RtcAorICAgIGZpbmFsbHk6CisgICAgICAgIGNoZGlyKGN1cnJlbnRfZGlyKQorICAgICAgICBybXRyZWUoYWJzX3RtcCkKKworCitkZWYgY3JlYXRlX2ZpbGVzKHBhdGhzLCBjaHJvb3Q9Ii4iKToKKyAgICAiIiJDcmVhdGVzIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyBmb3VuZCBpbiA8cGF0aD4uCisKKyAgICA6cGFyYW0gbGlzdCBwYXRoczogbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB0byBmaWxlcyBvciBkaXJlY3RvcmllcworICAgIDpwYXJhbSBzdHIgY2hyb290OiB0aGUgcm9vdCBkaXJlY3RvcnkgaW4gd2hpY2ggcGF0aHMgd2lsbCBiZSBjcmVhdGVkCisKKyAgICA+Pj4gZnJvbSBvcy5wYXRoIGltcG9ydCBpc2RpciwgaXNmaWxlCisgICAgPj4+IGlzZGlyKCcvdG1wL2EnKQorICAgIEZhbHNlCisgICAgPj4+IGNyZWF0ZV9maWxlcyhbJ2EvYi9mb28ucHknLCAnYS9iL2MvJywgJ2EvYi9jL2QvZS5weSddLCAnL3RtcCcpCisgICAgPj4+IGlzZGlyKCcvdG1wL2EnKQorICAgIFRydWUKKyAgICA+Pj4gaXNkaXIoJy90bXAvYS9iL2MnKQorICAgIFRydWUKKyAgICA+Pj4gaXNmaWxlKCcvdG1wL2EvYi9jL2QvZS5weScpCisgICAgVHJ1ZQorICAgID4+PiBpc2ZpbGUoJy90bXAvYS9iL2Zvby5weScpCisgICAgVHJ1ZQorICAgICIiIgorICAgIGRpcnMsIGZpbGVzID0gc2V0KCksIHNldCgpCisgICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgIHBhdGggPSBqb2luKGNocm9vdCwgcGF0aCkKKyAgICAgICAgZmlsZW5hbWUgPSBiYXNlbmFtZShwYXRoKQorICAgICAgICAjIHBhdGggaXMgYSBkaXJlY3RvcnkgcGF0aAorICAgICAgICBpZiBmaWxlbmFtZSA9PSAiIjoKKyAgICAgICAgICAgIGRpcnMuYWRkKHBhdGgpCisgICAgICAgICMgcGF0aCBpcyBhIGZpbGVuYW1lIHBhdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpcnMuYWRkKGRpcm5hbWUocGF0aCkpCisgICAgICAgICAgICBmaWxlcy5hZGQocGF0aCkKKyAgICBmb3IgZGlycGF0aCBpbiBkaXJzOgorICAgICAgICBpZiBub3QgaXNkaXIoZGlycGF0aCk6CisgICAgICAgICAgICBvcy5tYWtlZGlycyhkaXJwYXRoKQorICAgIGZvciBmaWxlcGF0aCBpbiBmaWxlczoKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAidyIpOgorICAgICAgICAgICAgcGFzcworCisKK0BweXRlc3QuZml4dHVyZQorZGVmIGZha2VfcGF0aCgpOgorICAgIG9yaWcgPSBsaXN0KHN5cy5wYXRoKQorICAgIGZha2UgPSBbMSwgMiwgM10KKyAgICBzeXMucGF0aFs6XSA9IGZha2UKKyAgICB5aWVsZCBmYWtlCisgICAgc3lzLnBhdGhbOl0gPSBvcmlnCisKKworZGVmIHRlc3Rfbm9fYXJncyhmYWtlX3BhdGgpOgorICAgIHdpdGggbGludC5maXhfaW1wb3J0X3BhdGgoW10pOgorICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gZmFrZV9wYXRoCisgICAgYXNzZXJ0IHN5cy5wYXRoID09IGZha2VfcGF0aAorCisKK0BweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAiY2FzZSIsIFtbImEvYi8iXSwgWyJhL2IiXSwgWyJhL2IvX19pbml0X18ucHkiXSwgWyJhLyJdLCBbImEiXV0KKykKK2RlZiB0ZXN0X29uZV9hcmcoZmFrZV9wYXRoLCBjYXNlKToKKyAgICB3aXRoIHRlbXBkaXIoKSBhcyBjaHJvb3Q6CisgICAgICAgIGNyZWF0ZV9maWxlcyhbImEvYi9fX2luaXRfXy5weSJdKQorICAgICAgICBleHBlY3RlZCA9IFtqb2luKGNocm9vdCwgImEiKV0gKyBmYWtlX3BhdGgKKworICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gZmFrZV9wYXRoCisgICAgICAgIHdpdGggbGludC5maXhfaW1wb3J0X3BhdGgoY2FzZSk6CisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gZXhwZWN0ZWQKKyAgICAgICAgYXNzZXJ0IHN5cy5wYXRoID09IGZha2VfcGF0aAorCisKK0BweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAiY2FzZSIsCisgICAgWworICAgICAgICBbImEvYiIsICJhL2MiXSwKKyAgICAgICAgWyJhL2MvIiwgImEvYi8iXSwKKyAgICAgICAgWyJhL2IvX19pbml0X18ucHkiLCAiYS9jL19faW5pdF9fLnB5Il0sCisgICAgICAgIFsiYSIsICJhL2MvX19pbml0X18ucHkiXSwKKyAgICBdLAorKQorZGVmIHRlc3RfdHdvX3NpbWlsYXJfYXJncyhmYWtlX3BhdGgsIGNhc2UpOgorICAgIHdpdGggdGVtcGRpcigpIGFzIGNocm9vdDoKKyAgICAgICAgY3JlYXRlX2ZpbGVzKFsiYS9iL19faW5pdF9fLnB5IiwgImEvYy9fX2luaXRfXy5weSJdKQorICAgICAgICBleHBlY3RlZCA9IFtqb2luKGNocm9vdCwgImEiKV0gKyBmYWtlX3BhdGgKKworICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gZmFrZV9wYXRoCisgICAgICAgIHdpdGggbGludC5maXhfaW1wb3J0X3BhdGgoY2FzZSk6CisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gZXhwZWN0ZWQKKyAgICAgICAgYXNzZXJ0IHN5cy5wYXRoID09IGZha2VfcGF0aAorCisKK0BweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAiY2FzZSIsCisgICAgWworICAgICAgICBbImEvYi9jL19faW5pdF9fLnB5IiwgImEvZC9fX2luaXRfXy5weSIsICJhL2UvZi5weSJdLAorICAgICAgICBbImEvYi9jIiwgImEiLCAiYS9lIl0sCisgICAgICAgIFsiYS9iL2MiLCAiYSIsICJhL2IvYyIsICJhL2UiLCAiYSJdLAorICAgIF0sCispCitkZWYgdGVzdF9tb3JlX2FyZ3MoZmFrZV9wYXRoLCBjYXNlKToKKyAgICB3aXRoIHRlbXBkaXIoKSBhcyBjaHJvb3Q6CisgICAgICAgIGNyZWF0ZV9maWxlcyhbImEvYi9jL19faW5pdF9fLnB5IiwgImEvZC9fX2luaXRfXy5weSIsICJhL2UvZi5weSJdKQorICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgIGpvaW4oY2hyb290LCBzdWZmaXgpCisgICAgICAgICAgICBmb3Igc3VmZml4IGluIChzZXAuam9pbigoImEiLCAiYiIpKSwgImEiLCBzZXAuam9pbigoImEiLCAiZSIpKSkKKyAgICAgICAgXSArIGZha2VfcGF0aAorCisgICAgICAgIGFzc2VydCBzeXMucGF0aCA9PSBmYWtlX3BhdGgKKyAgICAgICAgd2l0aCBsaW50LmZpeF9pbXBvcnRfcGF0aChjYXNlKToKKyAgICAgICAgICAgIGFzc2VydCBzeXMucGF0aCA9PSBleHBlY3RlZAorICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gZmFrZV9wYXRoCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGRpc2FibGUoKToKKyAgICByZXR1cm4gWyJJIl0KKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgcmVwb3J0ZXIoKToKKyAgICByZXR1cm4gdGVzdHV0aWxzLkdlbmVyaWNUZXN0UmVwb3J0ZXIKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBpbml0X2xpbnRlcihsaW50ZXIpOgorICAgIGxpbnRlci5vcGVuKCkKKyAgICBsaW50ZXIuc2V0X2N1cnJlbnRfbW9kdWxlKCJ0b3RvIikKKyAgICBsaW50ZXIuZmlsZV9zdGF0ZSA9IEZpbGVTdGF0ZSgidG90byIpCisgICAgcmV0dXJuIGxpbnRlcgorCisKK2RlZiB0ZXN0X3B5bGludF92aXNpdF9tZXRob2RfdGFrZW5faW5fYWNjb3VudChsaW50ZXIpOgorICAgIGNsYXNzIEN1c3RvbUNoZWNrZXIoY2hlY2tlcnMuQmFzZUNoZWNrZXIpOgorICAgICAgICBfX2ltcGxlbWVudHNfXyA9IGludGVyZmFjZXMuSUFzdHJvaWRDaGVja2VyCisgICAgICAgIG5hbWUgPSAiY3VzdG9tIgorICAgICAgICBtc2dzID0geyJXOTk5OSI6ICgiIiwgImN1c3RvbSIsICIiKX0KKworICAgICAgICBAY2hlY2tfbWVzc2FnZXMoImN1c3RvbSIpCisgICAgICAgIGRlZiB2aXNpdF9jbGFzcyhzZWxmLCBfKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKEN1c3RvbUNoZWNrZXIobGludGVyKSkKKyAgICBsaW50ZXIub3BlbigpCisgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgIGxpbnRlci5zZXRfcmVwb3J0ZXIodGV4dC5UZXh0UmVwb3J0ZXIob3V0KSkKKyAgICBsaW50ZXIuY2hlY2soImFiYyIpCisKKworZGVmIHRlc3RfZW5hYmxlX21lc3NhZ2UoaW5pdF9saW50ZXIpOgorICAgIGxpbnRlciA9IGluaXRfbGludGVyCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAxIikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDIiKQorICAgIGxpbnRlci5kaXNhYmxlKCJXMDEwMSIsIHNjb3BlPSJwYWNrYWdlIikKKyAgICBsaW50ZXIuZGlzYWJsZSgiVzAxMDIiLCBzY29wZT0ibW9kdWxlIiwgbGluZT0xKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDEiKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDIiLCAxKQorICAgIGxpbnRlci5zZXRfY3VycmVudF9tb2R1bGUoInR1dHUiKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDEiKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJXMDEwMiIpCisgICAgbGludGVyLmVuYWJsZSgiVzAxMDEiLCBzY29wZT0icGFja2FnZSIpCisgICAgbGludGVyLmVuYWJsZSgiVzAxMDIiLCBzY29wZT0ibW9kdWxlIiwgbGluZT0xKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJXMDEwMSIpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAyIiwgMSkKKworCitkZWYgdGVzdF9lbmFibGVfbWVzc2FnZV9jYXRlZ29yeShpbml0X2xpbnRlcik6CisgICAgbGludGVyID0gaW5pdF9saW50ZXIKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDEiKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJDMDIwMiIpCisgICAgbGludGVyLmRpc2FibGUoIlciLCBzY29wZT0icGFja2FnZSIpCisgICAgbGludGVyLmRpc2FibGUoIkMiLCBzY29wZT0ibW9kdWxlIiwgbGluZT0xKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDEiKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJDMDIwMiIpCisgICAgYXNzZXJ0IG5vdCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJDMDIwMiIsIGxpbmU9MSkKKyAgICBsaW50ZXIuc2V0X2N1cnJlbnRfbW9kdWxlKCJ0dXR1IikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAxIikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiQzAyMDIiKQorICAgIGxpbnRlci5lbmFibGUoIlciLCBzY29wZT0icGFja2FnZSIpCisgICAgbGludGVyLmVuYWJsZSgiQyIsIHNjb3BlPSJtb2R1bGUiLCBsaW5lPTEpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAxIikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiQzAyMDIiKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJDMDIwMiIsIGxpbmU9MSkKKworCitkZWYgdGVzdF9tZXNzYWdlX3N0YXRlX3Njb3BlKGluaXRfbGludGVyKToKKyAgICBjbGFzcyBGYWtlQ29uZmlnOgorICAgICAgICBjb25maWRlbmNlID0gWyJISUdIIl0KKworICAgIGxpbnRlciA9IGluaXRfbGludGVyCisgICAgbGludGVyLmRpc2FibGUoIkMwMjAyIikKKyAgICBhc3NlcnQgTVNHX1NUQVRFX1NDT1BFX0NPTkZJRyA9PSBsaW50ZXIuZ2V0X21lc3NhZ2Vfc3RhdGVfc2NvcGUoIkMwMjAyIikKKyAgICBsaW50ZXIuZGlzYWJsZSgiVzAxMDEiLCBzY29wZT0ibW9kdWxlIiwgbGluZT0zKQorICAgIGFzc2VydCBNU0dfU1RBVEVfU0NPUEVfQ09ORklHID09IGxpbnRlci5nZXRfbWVzc2FnZV9zdGF0ZV9zY29wZSgiQzAyMDIiKQorICAgIGFzc2VydCBNU0dfU1RBVEVfU0NPUEVfTU9EVUxFID09IGxpbnRlci5nZXRfbWVzc2FnZV9zdGF0ZV9zY29wZSgiVzAxMDEiLCAzKQorICAgIGxpbnRlci5lbmFibGUoIlcwMTAyIiwgc2NvcGU9Im1vZHVsZSIsIGxpbmU9MykKKyAgICBhc3NlcnQgTVNHX1NUQVRFX1NDT1BFX01PRFVMRSA9PSBsaW50ZXIuZ2V0X21lc3NhZ2Vfc3RhdGVfc2NvcGUoIlcwMTAyIiwgMykKKyAgICBsaW50ZXIuY29uZmlnID0gRmFrZUNvbmZpZygpCisgICAgYXNzZXJ0IE1TR19TVEFURV9DT05GSURFTkNFID09IGxpbnRlci5nZXRfbWVzc2FnZV9zdGF0ZV9zY29wZSgKKyAgICAgICAgInRoaXMtaXMtYmFkIiwgY29uZmlkZW5jZT1pbnRlcmZhY2VzLklORkVSRU5DRQorICAgICkKKworCitkZWYgdGVzdF9lbmFibGVfbWVzc2FnZV9ibG9jayhpbml0X2xpbnRlcik6CisgICAgbGludGVyID0gaW5pdF9saW50ZXIKKyAgICBsaW50ZXIub3BlbigpCisgICAgZmlsZXBhdGggPSBqb2luKFJFR1JURVNUX0RBVEFfRElSLCAiZnVuY19ibG9ja19kaXNhYmxlX21zZy5weSIpCisgICAgbGludGVyLnNldF9jdXJyZW50X21vZHVsZSgiZnVuY19ibG9ja19kaXNhYmxlX21zZyIpCisgICAgYXN0cm9pZCA9IGxpbnRlci5nZXRfYXN0KGZpbGVwYXRoLCAiZnVuY19ibG9ja19kaXNhYmxlX21zZyIpCisgICAgbGludGVyLnByb2Nlc3NfdG9rZW5zKHRva2VuaXplX21vZHVsZShhc3Ryb2lkKSkKKyAgICBmcyA9IGxpbnRlci5maWxlX3N0YXRlCisgICAgZnMuY29sbGVjdF9ibG9ja19saW5lcyhsaW50ZXIubXNnc19zdG9yZSwgYXN0cm9pZCkKKyAgICAjIGdsb2JhbCAobW9kdWxlIGxldmVsKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJXMDYxMyIpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUxMTAxIikKKyAgICAjIG1ldGgxCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwNjEzIiwgMTMpCisgICAgIyBtZXRoMgorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzA2MTMiLCAxOCkKKyAgICAjIG1ldGgzCisgICAgYXNzZXJ0IG5vdCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJFMTEwMSIsIDI0KQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJFMTEwMSIsIDI2KQorICAgICMgbWV0aDQKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUxMTAxIiwgMzIpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUxMTAxIiwgMzYpCisgICAgIyBtZXRoNQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA0MikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUxMTAxIiwgNDMpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUxMTAxIiwgNDYpCisgICAgYXNzZXJ0IG5vdCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJFMTEwMSIsIDQ5KQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA1MSkKKyAgICAjIG1ldGg2CisgICAgYXNzZXJ0IG5vdCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJFMTEwMSIsIDU3KQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJFMTEwMSIsIDYxKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA2NCkKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUxMTAxIiwgNjYpCisKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTA2MDIiLCA1NykKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTA2MDIiLCA2MSkKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUwNjAyIiwgNjIpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUwNjAyIiwgNjQpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkUwNjAyIiwgNjYpCisgICAgIyBtZXRoNworICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA3MCkKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA3MikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA3NSkKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiRTExMDEiLCA3NykKKworICAgIGZzID0gbGludGVyLmZpbGVfc3RhdGUKKyAgICBhc3NlcnQgZnMuX3N1cHByZXNzaW9uX21hcHBpbmdbIlcwNjEzIiwgMThdID09IDE3CisgICAgYXNzZXJ0IGZzLl9zdXBwcmVzc2lvbl9tYXBwaW5nWyJFMTEwMSIsIDMzXSA9PSAzMAorICAgIGFzc2VydCAoIkUxMTAxIiwgNDYpIG5vdCBpbiBmcy5fc3VwcHJlc3Npb25fbWFwcGluZworICAgIGFzc2VydCBmcy5fc3VwcHJlc3Npb25fbWFwcGluZ1siQzAzMDIiLCAxOF0gPT0gMQorICAgIGFzc2VydCBmcy5fc3VwcHJlc3Npb25fbWFwcGluZ1siQzAzMDIiLCA1MF0gPT0gMQorICAgICMgVGhpcyBpcyB0cmlja3kuIFdoaWxlIHRoZSBkaXNhYmxlIGluIGxpbmUgMTA2IGlzIGRpc2FibGluZworICAgICMgYm90aCAxMDggYW5kIDExMCwgdGhpcyBpcyB1c3VhbGx5IG5vdCB3aGF0IHRoZSB1c2VyIHdhbnRlZC4KKyAgICAjIFRoZXJlZm9yZSwgd2UgcmVwb3J0IHRoZSBjbG9zZXN0IHByZXZpb3VzIGRpc2FibGUgY29tbWVudC4KKyAgICBhc3NlcnQgZnMuX3N1cHByZXNzaW9uX21hcHBpbmdbIkUxMTAxIiwgMTA4XSA9PSAxMDYKKyAgICBhc3NlcnQgZnMuX3N1cHByZXNzaW9uX21hcHBpbmdbIkUxMTAxIiwgMTEwXSA9PSAxMDkKKworCitkZWYgdGVzdF9lbmFibGVfYnlfc3ltYm9sKGluaXRfbGludGVyKToKKyAgICAiIiJtZXNzYWdlcyBjYW4gYmUgY29udHJvbGxlZCBieSBzeW1ib2xpYyBuYW1lcy4KKworICAgIFRoZSBzdGF0ZSBpcyBjb25zaXN0ZW50IGFjcm9zcyBzeW1ib2xzIGFuZCBudW1iZXJzLgorICAgICIiIgorICAgIGxpbnRlciA9IGluaXRfbGludGVyCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAxIikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgidW5yZWFjaGFibGUiKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJXMDEwMiIpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoImRhbmdlcm91cy1kZWZhdWx0LXZhbHVlIikKKyAgICBsaW50ZXIuZGlzYWJsZSgidW5yZWFjaGFibGUiLCBzY29wZT0icGFja2FnZSIpCisgICAgbGludGVyLmRpc2FibGUoImRhbmdlcm91cy1kZWZhdWx0LXZhbHVlIiwgc2NvcGU9Im1vZHVsZSIsIGxpbmU9MSkKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAxIikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoInVucmVhY2hhYmxlIikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAyIiwgMSkKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoImRhbmdlcm91cy1kZWZhdWx0LXZhbHVlIiwgMSkKKyAgICBsaW50ZXIuc2V0X2N1cnJlbnRfbW9kdWxlKCJ0dXR1IikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMTAxIikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoInVucmVhY2hhYmxlIikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDIiKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZSIpCisgICAgbGludGVyLmVuYWJsZSgidW5yZWFjaGFibGUiLCBzY29wZT0icGFja2FnZSIpCisgICAgbGludGVyLmVuYWJsZSgiZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWUiLCBzY29wZT0ibW9kdWxlIiwgbGluZT0xKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJXMDEwMSIpCisgICAgYXNzZXJ0IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoInVucmVhY2hhYmxlIikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMDIiLCAxKQorICAgIGFzc2VydCBsaW50ZXIuaXNfbWVzc2FnZV9lbmFibGVkKCJkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZSIsIDEpCisKKworZGVmIHRlc3RfZW5hYmxlX3JlcG9ydChsaW50ZXIpOgorICAgIGFzc2VydCBsaW50ZXIucmVwb3J0X2lzX2VuYWJsZWQoIlJQMDAwMSIpCisgICAgbGludGVyLmRpc2FibGUoIlJQMDAwMSIpCisgICAgYXNzZXJ0IG5vdCBsaW50ZXIucmVwb3J0X2lzX2VuYWJsZWQoIlJQMDAwMSIpCisgICAgbGludGVyLmVuYWJsZSgiUlAwMDAxIikKKyAgICBhc3NlcnQgbGludGVyLnJlcG9ydF9pc19lbmFibGVkKCJSUDAwMDEiKQorCisKK2RlZiB0ZXN0X3JlcG9ydF9vdXRwdXRfZm9ybWF0X2FsaWFzZWQobGludGVyKToKKyAgICB0ZXh0LnJlZ2lzdGVyKGxpbnRlcikKKyAgICBsaW50ZXIuc2V0X29wdGlvbigib3V0cHV0LWZvcm1hdCIsICJ0ZXh0IikKKyAgICBhc3NlcnQgbGludGVyLnJlcG9ydGVyLl9fY2xhc3NfXy5fX25hbWVfXyA9PSAiVGV4dFJlcG9ydGVyIgorCisKK2RlZiB0ZXN0X3NldF91bnN1cHBvcnRlZF9yZXBvcnRlcihsaW50ZXIpOgorICAgIHRleHQucmVnaXN0ZXIobGludGVyKQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhleGNlcHRpb25zLkludmFsaWRSZXBvcnRlckVycm9yKToKKyAgICAgICAgbGludGVyLnNldF9vcHRpb24oIm91dHB1dC1mb3JtYXQiLCAibWlzc2luZy5tb2R1bGUuQ2xhc3MiKQorCisKK2RlZiB0ZXN0X3NldF9vcHRpb25fMShsaW50ZXIpOgorICAgIGxpbnRlci5zZXRfb3B0aW9uKCJkaXNhYmxlIiwgIkMwMTExLFcwMjM0IikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkMwMTExIikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMjM0IikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMTMiKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgibWlzc2luZy1kb2NzdHJpbmciKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgibm9uLWl0ZXJhdG9yLXJldHVybmVkIikKKworCitkZWYgdGVzdF9zZXRfb3B0aW9uXzIobGludGVyKToKKyAgICBsaW50ZXIuc2V0X29wdGlvbigiZGlzYWJsZSIsICgiQzAxMTEiLCAiVzAyMzQiKSkKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIkMwMTExIikKKyAgICBhc3NlcnQgbm90IGxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQoIlcwMjM0IikKKyAgICBhc3NlcnQgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgiVzAxMTMiKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgibWlzc2luZy1kb2NzdHJpbmciKQorICAgIGFzc2VydCBub3QgbGludGVyLmlzX21lc3NhZ2VfZW5hYmxlZCgibm9uLWl0ZXJhdG9yLXJldHVybmVkIikKKworCitkZWYgdGVzdF9lbmFibGVfY2hlY2tlcnMobGludGVyKToKKyAgICBsaW50ZXIuZGlzYWJsZSgiZGVzaWduIikKKyAgICBhc3NlcnQgbm90ICgiZGVzaWduIiBpbiBbYy5uYW1lIGZvciBjIGluIGxpbnRlci5wcmVwYXJlX2NoZWNrZXJzKCldKQorICAgIGxpbnRlci5lbmFibGUoImRlc2lnbiIpCisgICAgYXNzZXJ0ICJkZXNpZ24iIGluIFtjLm5hbWUgZm9yIGMgaW4gbGludGVyLnByZXBhcmVfY2hlY2tlcnMoKV0KKworCitkZWYgdGVzdF9lcnJvcnNfb25seShsaW50ZXIpOgorICAgIGxpbnRlci5lcnJvcl9tb2RlKCkKKyAgICBjaGVja2VycyA9IGxpbnRlci5wcmVwYXJlX2NoZWNrZXJzKCkKKyAgICBjaGVja2VyX25hbWVzID0ge2MubmFtZSBmb3IgYyBpbiBjaGVja2Vyc30KKyAgICBzaG91bGRfbm90ID0geyJkZXNpZ24iLCAiZm9ybWF0IiwgIm1ldHJpY3MiLCAibWlzY2VsbGFuZW91cyIsICJzaW1pbGFyaXRpZXMifQorICAgIGFzc2VydCBzZXQoKSA9PSBzaG91bGRfbm90ICYgY2hlY2tlcl9uYW1lcworCisKK2RlZiB0ZXN0X2Rpc2FibGVfc2ltaWxhcihsaW50ZXIpOgorICAgIGxpbnRlci5zZXRfb3B0aW9uKCJkaXNhYmxlIiwgIlJQMDgwMSIpCisgICAgbGludGVyLnNldF9vcHRpb24oImRpc2FibGUiLCAiUjA4MDEiKQorICAgIGFzc2VydCBub3QgKCJzaW1pbGFyaXRpZXMiIGluIFtjLm5hbWUgZm9yIGMgaW4gbGludGVyLnByZXBhcmVfY2hlY2tlcnMoKV0pCisKKworZGVmIHRlc3RfZGlzYWJsZV9hbG90KGxpbnRlcik6CisgICAgIiIiY2hlY2sgdGhhdCB3ZSBkaXNhYmxlZCBhIGxvdCBvZiBjaGVja2VycyIiIgorICAgIGxpbnRlci5zZXRfb3B0aW9uKCJyZXBvcnRzIiwgRmFsc2UpCisgICAgbGludGVyLnNldF9vcHRpb24oImRpc2FibGUiLCAiUixDLFciKQorICAgIGNoZWNrZXJfbmFtZXMgPSBbYy5uYW1lIGZvciBjIGluIGxpbnRlci5wcmVwYXJlX2NoZWNrZXJzKCldCisgICAgZm9yIGNuYW1lIGluICgiZGVzaWduIiwgIm1ldHJpY3MiLCAic2ltaWxhcml0aWVzIik6CisgICAgICAgIGFzc2VydCBub3QgKGNuYW1lIGluIGNoZWNrZXJfbmFtZXMpLCBjbmFtZQorCisKK2RlZiB0ZXN0X2FkZG1lc3NhZ2UobGludGVyKToKKyAgICBsaW50ZXIuc2V0X3JlcG9ydGVyKHRlc3R1dGlscy5HZW5lcmljVGVzdFJlcG9ydGVyKCkpCisgICAgbGludGVyLm9wZW4oKQorICAgIGxpbnRlci5zZXRfY3VycmVudF9tb2R1bGUoIjAxMjMiKQorICAgIGxpbnRlci5hZGRfbWVzc2FnZSgiQzAzMDEiLCBsaW5lPTEsIGFyZ3M9KDEsIDIpKQorICAgIGxpbnRlci5hZGRfbWVzc2FnZSgibGluZS10b28tbG9uZyIsIGxpbmU9MiwgYXJncz0oMywgNCkpCisgICAgYXNzZXJ0IFsKKyAgICAgICAgIkM6ICAxOiBMaW5lIHRvbyBsb25nICgxLzIpIiwKKyAgICAgICAgIkM6ICAyOiBMaW5lIHRvbyBsb25nICgzLzQpIiwKKyAgICBdID09IGxpbnRlci5yZXBvcnRlci5tZXNzYWdlcworCisKK2RlZiB0ZXN0X2FkZG1lc3NhZ2VfaW52YWxpZChsaW50ZXIpOgorICAgIGxpbnRlci5zZXRfcmVwb3J0ZXIodGVzdHV0aWxzLkdlbmVyaWNUZXN0UmVwb3J0ZXIoKSkKKyAgICBsaW50ZXIub3BlbigpCisgICAgbGludGVyLnNldF9jdXJyZW50X21vZHVsZSgiMDEyMyIpCisKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoSW52YWxpZE1lc3NhZ2VFcnJvcikgYXMgY206CisgICAgICAgIGxpbnRlci5hZGRfbWVzc2FnZSgibGluZS10b28tbG9uZyIsIGFyZ3M9KDEsIDIpKQorICAgIGFzc2VydCBzdHIoY20udmFsdWUpID09ICJNZXNzYWdlIEMwMzAxIG11c3QgcHJvdmlkZSBsaW5lLCBnb3QgTm9uZSIKKworICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkTWVzc2FnZUVycm9yKSBhcyBjbToKKyAgICAgICAgbGludGVyLmFkZF9tZXNzYWdlKCJsaW5lLXRvby1sb25nIiwgbGluZT0yLCBub2RlPSJmYWtlX25vZGUiLCBhcmdzPSgxLCAyKSkKKyAgICBhc3NlcnQgKAorICAgICAgICBzdHIoY20udmFsdWUpCisgICAgICAgID09ICJNZXNzYWdlIEMwMzAxIG11c3Qgb25seSBwcm92aWRlIGxpbmUsIGdvdCBsaW5lPTIsIG5vZGU9ZmFrZV9ub2RlIgorICAgICkKKworICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkTWVzc2FnZUVycm9yKSBhcyBjbToKKyAgICAgICAgbGludGVyLmFkZF9tZXNzYWdlKCJDMDMyMSIpCisgICAgYXNzZXJ0IHN0cihjbS52YWx1ZSkgPT0gIk1lc3NhZ2UgQzAzMjEgbXVzdCBwcm92aWRlIE5vZGUsIGdvdCBOb25lIgorCisKK2RlZiB0ZXN0X2xvYWRfcGx1Z2luX2NvbW1hbmRfbGluZSgpOgorICAgIGR1bW15X3BsdWdpbl9wYXRoID0gam9pbihSRUdSVEVTVF9EQVRBX0RJUiwgImR1bW15X3BsdWdpbiIpCisgICAgc3lzLnBhdGguYXBwZW5kKGR1bW15X3BsdWdpbl9wYXRoKQorCisgICAgcnVuID0gUnVuKAorICAgICAgICBbIi0tbG9hZC1wbHVnaW5zIiwgImR1bW15X3BsdWdpbiIsIGpvaW4oUkVHUlRFU1RfREFUQV9ESVIsICJlbXB0eS5weSIpXSwKKyAgICAgICAgZXhpdD1GYWxzZSwKKyAgICApCisgICAgYXNzZXJ0ICgKKyAgICAgICAgbGVuKFtjaC5uYW1lIGZvciBjaCBpbiBydW4ubGludGVyLmdldF9jaGVja2VycygpIGlmIGNoLm5hbWUgPT0gImR1bW15X3BsdWdpbiJdKQorICAgICAgICA9PSAyCisgICAgKQorCisgICAgc3lzLnBhdGgucmVtb3ZlKGR1bW15X3BsdWdpbl9wYXRoKQorCisKK2RlZiB0ZXN0X2xvYWRfcGx1Z2luX2NvbmZpZ19maWxlKCk6CisgICAgZHVtbXlfcGx1Z2luX3BhdGggPSBqb2luKFJFR1JURVNUX0RBVEFfRElSLCAiZHVtbXlfcGx1Z2luIikKKyAgICBzeXMucGF0aC5hcHBlbmQoZHVtbXlfcGx1Z2luX3BhdGgpCisgICAgY29uZmlnX3BhdGggPSBqb2luKFJFR1JURVNUX0RBVEFfRElSLCAiZHVtbXlfcGx1Z2luLnJjIikKKworICAgIHJ1biA9IFJ1bigKKyAgICAgICAgWyItLXJjZmlsZSIsIGNvbmZpZ19wYXRoLCBqb2luKFJFR1JURVNUX0RBVEFfRElSLCAiZW1wdHkucHkiKV0sCisgICAgICAgIGV4aXQ9RmFsc2UsCisgICAgKQorICAgIGFzc2VydCAoCisgICAgICAgIGxlbihbY2gubmFtZSBmb3IgY2ggaW4gcnVuLmxpbnRlci5nZXRfY2hlY2tlcnMoKSBpZiBjaC5uYW1lID09ICJkdW1teV9wbHVnaW4iXSkKKyAgICAgICAgPT0gMgorICAgICkKKworICAgIHN5cy5wYXRoLnJlbW92ZShkdW1teV9wbHVnaW5fcGF0aCkKKworCitkZWYgdGVzdF9sb2FkX3BsdWdpbl9jb25maWd1cmF0aW9uKCk6CisgICAgZHVtbXlfcGx1Z2luX3BhdGggPSBqb2luKFJFR1JURVNUX0RBVEFfRElSLCAiZHVtbXlfcGx1Z2luIikKKyAgICBzeXMucGF0aC5hcHBlbmQoZHVtbXlfcGx1Z2luX3BhdGgpCisKKyAgICBydW4gPSBSdW4oCisgICAgICAgIFsKKyAgICAgICAgICAgICItLWxvYWQtcGx1Z2lucyIsCisgICAgICAgICAgICAiZHVtbXlfY29uZl9wbHVnaW4iLAorICAgICAgICAgICAgIi0taWdub3JlIiwKKyAgICAgICAgICAgICJmb28sYmFyIiwKKyAgICAgICAgICAgIGpvaW4oUkVHUlRFU1RfREFUQV9ESVIsICJlbXB0eS5weSIpLAorICAgICAgICBdLAorICAgICAgICBleGl0PUZhbHNlLAorICAgICkKKyAgICBhc3NlcnQgcnVuLmxpbnRlci5jb25maWcuYmxhY2tfbGlzdCA9PSBbImZvbyIsICJiYXIiLCAiYmluIl0KKworCitkZWYgdGVzdF9pbml0X2hvb2tzX2NhbGxlZF9iZWZvcmVfbG9hZF9wbHVnaW5zKCk6CisgICAgd2l0aCBweXRlc3QucmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgIFJ1bihbIi0tbG9hZC1wbHVnaW5zIiwgInVuZXhpc3RhbnQiLCAiLS1pbml0LWhvb2siLCAicmFpc2UgUnVudGltZUVycm9yIl0pCisgICAgd2l0aCBweXRlc3QucmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgIFJ1bihbIi0taW5pdC1ob29rIiwgInJhaXNlIFJ1bnRpbWVFcnJvciIsICItLWxvYWQtcGx1Z2lucyIsICJ1bmV4aXN0YW50Il0pCisKKworZGVmIHRlc3RfYW5hbHl6ZV9leHBsaWNpdF9zY3JpcHQobGludGVyKToKKyAgICBsaW50ZXIuc2V0X3JlcG9ydGVyKHRlc3R1dGlscy5HZW5lcmljVGVzdFJlcG9ydGVyKCkpCisgICAgbGludGVyLmNoZWNrKG9zLnBhdGguam9pbihEQVRBX0RJUiwgImFzY3JpcHQiKSkKKyAgICBhc3NlcnQgWyJDOiAgMjogTGluZSB0b28gbG9uZyAoMTc1LzEwMCkiXSA9PSBsaW50ZXIucmVwb3J0ZXIubWVzc2FnZXMKKworCitkZWYgdGVzdF9weXRob24zX2NoZWNrZXJfZGlzYWJsZWQobGludGVyKToKKyAgICBjaGVja2VyX25hbWVzID0gW2MubmFtZSBmb3IgYyBpbiBsaW50ZXIucHJlcGFyZV9jaGVja2VycygpXQorICAgIGFzc2VydCAicHl0aG9uMyIgbm90IGluIGNoZWNrZXJfbmFtZXMKKworICAgIGxpbnRlci5zZXRfb3B0aW9uKCJlbmFibGUiLCAicHl0aG9uMyIpCisgICAgY2hlY2tlcl9uYW1lcyA9IFtjLm5hbWUgZm9yIGMgaW4gbGludGVyLnByZXBhcmVfY2hlY2tlcnMoKV0KKyAgICBhc3NlcnQgInB5dGhvbjMiIGluIGNoZWNrZXJfbmFtZXMKKworCitkZWYgdGVzdF9mdWxsX2RvY3VtZW50YXRpb24obGludGVyKToKKyAgICBvdXQgPSBTdHJpbmdJTygpCisgICAgbGludGVyLnByaW50X2Z1bGxfZG9jdW1lbnRhdGlvbihvdXQpCisgICAgb3V0cHV0ID0gb3V0LmdldHZhbHVlKCkKKyAgICAjIEEgZmV3IHNwb3QgY2hlY2tzIG9ubHkKKyAgICBmb3IgcmVfc3RyIGluICgKKyAgICAgICAgIyBhdXRvZ2VuZXJhdGVkIHRleHQKKyAgICAgICAgIl5QeWxpbnQgZ2xvYmFsIG9wdGlvbnMgYW5kIHN3aXRjaGVzJCIsCisgICAgICAgICJWZXJiYXRpbSBuYW1lIG9mIHRoZSBjaGVja2VyIGlzIGBgcHl0aG9uM2BgIiwKKyAgICAgICAgIyBtZXNzYWdlcworICAgICAgICAiXjpvbGQtb2N0YWwtbGl0ZXJhbCBcXChFMTYwOFxcKToiLAorICAgICAgICAjIG9wdGlvbnMKKyAgICAgICAgIl46ZHVtbXktdmFyaWFibGVzLXJneDoiLAorICAgICk6CisgICAgICAgIHJlZ2V4cCA9IHJlLmNvbXBpbGUocmVfc3RyLCByZS5NVUxUSUxJTkUpCisgICAgICAgIGFzc2VydCByZS5zZWFyY2gocmVnZXhwLCBvdXRwdXQpCisKKworZGVmIHRlc3RfbGlzdF9tc2dzX2VuYWJsZWQoaW5pdF9saW50ZXIsIGNhcHN5cyk6CisgICAgbGludGVyID0gaW5pdF9saW50ZXIKKyAgICBsaW50ZXIuZW5hYmxlKCJXMDEwMSIsIHNjb3BlPSJwYWNrYWdlIikKKyAgICBsaW50ZXIuZGlzYWJsZSgiVzAxMDIiLCBzY29wZT0icGFja2FnZSIpCisgICAgbGludGVyLmxpc3RfbWVzc2FnZXNfZW5hYmxlZCgpCisKKyAgICBsaW5lcyA9IGNhcHN5cy5yZWFkb3V0ZXJyKCkub3V0LnNwbGl0bGluZXMoKQorCisgICAgYXNzZXJ0ICJFbmFibGVkIG1lc3NhZ2VzOiIgaW4gbGluZXMKKyAgICBhc3NlcnQgIiAgdW5yZWFjaGFibGUgKFcwMTAxKSIgaW4gbGluZXMKKworICAgIGFzc2VydCAiRGlzYWJsZWQgbWVzc2FnZXM6IiBpbiBsaW5lcworICAgIGRpc2FibGVkX2l4ID0gbGluZXMuaW5kZXgoIkRpc2FibGVkIG1lc3NhZ2VzOiIpCisKKyAgICAjIFcwMTAxIHNob3VsZCBiZSBpbiB0aGUgZW5hYmxlZCBzZWN0aW9uCisgICAgYXNzZXJ0IGxpbmVzLmluZGV4KCIgIHVucmVhY2hhYmxlIChXMDEwMSkiKSA8IGRpc2FibGVkX2l4CisKKyAgICBhc3NlcnQgIiAgZGFuZ2Vyb3VzLWRlZmF1bHQtdmFsdWUgKFcwMTAyKSIgaW4gbGluZXMKKyAgICAjIFcwMTAyIHNob3VsZCBiZSBpbiB0aGUgZGlzYWJsZWQgc2VjdGlvbgorICAgIGFzc2VydCBsaW5lcy5pbmRleCgiICBkYW5nZXJvdXMtZGVmYXVsdC12YWx1ZSAoVzAxMDIpIikgPiBkaXNhYmxlZF9peAorCisKK0BweXRlc3QuZml4dHVyZQorZGVmIHBvcF9weWxpbnRyYygpOgorICAgIG9zLmVudmlyb24ucG9wKCJQWUxJTlRSQyIsIE5vbmUpCisKKworQHB5dGVzdC5tYXJrLnVzZWZpeHR1cmVzKCJwb3BfcHlsaW50cmMiKQorZGVmIHRlc3RfcHlsaW50X2hvbWUoKToKKyAgICB1aG9tZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifiIpCisgICAgaWYgdWhvbWUgPT0gIn4iOgorICAgICAgICBleHBlY3RlZCA9ICIucHlsaW50LmQiCisgICAgZWxzZToKKyAgICAgICAgZXhwZWN0ZWQgPSBvcy5wYXRoLmpvaW4odWhvbWUsICIucHlsaW50LmQiKQorICAgIGFzc2VydCBjb25maWcuUFlMSU5UX0hPTUUgPT0gZXhwZWN0ZWQKKworICAgIHRyeToKKyAgICAgICAgcHlsaW50ZCA9IGpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAiLnB5bGludC5kIikKKyAgICAgICAgb3MuZW52aXJvblsiUFlMSU5USE9NRSJdID0gcHlsaW50ZAorICAgICAgICB0cnk6CisgICAgICAgICAgICByZWxvYWQoY29uZmlnKQorICAgICAgICAgICAgYXNzZXJ0IGNvbmZpZy5QWUxJTlRfSE9NRSA9PSBweWxpbnRkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHB5bGludGQpCisgICAgICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIGRlbCBvcy5lbnZpcm9uWyJQWUxJTlRIT01FIl0KKworCitAcHl0ZXN0Lm1hcmsudXNlZml4dHVyZXMoInBvcF9weWxpbnRyYyIpCitkZWYgdGVzdF9weWxpbnRyYygpOgorICAgIHdpdGggZmFrZV9ob21lKCk6CisgICAgICAgIGN1cnJlbnRfZGlyID0gZ2V0Y3dkKCkKKyAgICAgICAgY2hkaXIob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzeXMuZXhlY3V0YWJsZSkpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhc3NlcnQgY29uZmlnLmZpbmRfcHlsaW50cmMoKSBpcyBOb25lCisgICAgICAgICAgICBvcy5lbnZpcm9uWyJQWUxJTlRSQyJdID0gam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICIucHlsaW50cmMiKQorICAgICAgICAgICAgYXNzZXJ0IGNvbmZpZy5maW5kX3B5bGludHJjKCkgaXMgTm9uZQorICAgICAgICAgICAgb3MuZW52aXJvblsiUFlMSU5UUkMiXSA9ICIuIgorICAgICAgICAgICAgYXNzZXJ0IGNvbmZpZy5maW5kX3B5bGludHJjKCkgaXMgTm9uZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY2hkaXIoY3VycmVudF9kaXIpCisgICAgICAgICAgICByZWxvYWQoY29uZmlnKQorCisKK0BweXRlc3QubWFyay51c2VmaXh0dXJlcygicG9wX3B5bGludHJjIikKK2RlZiB0ZXN0X3B5bGludHJjX3BhcmVudGRpcigpOgorICAgIHdpdGggdGVtcGRpcigpIGFzIGNocm9vdDoKKworICAgICAgICBjcmVhdGVfZmlsZXMoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgImEvcHlsaW50cmMiLAorICAgICAgICAgICAgICAgICJhL2IvX19pbml0X18ucHkiLAorICAgICAgICAgICAgICAgICJhL2IvcHlsaW50cmMiLAorICAgICAgICAgICAgICAgICJhL2IvYy9fX2luaXRfXy5weSIsCisgICAgICAgICAgICAgICAgImEvYi9jL2QvX19pbml0X18ucHkiLAorICAgICAgICAgICAgICAgICJhL2IvYy9kL2UvLnB5bGludHJjIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorICAgICAgICB3aXRoIGZha2VfaG9tZSgpOgorICAgICAgICAgICAgYXNzZXJ0IGNvbmZpZy5maW5kX3B5bGludHJjKCkgaXMgTm9uZQorICAgICAgICByZXN1bHRzID0geworICAgICAgICAgICAgImEiOiBqb2luKGNocm9vdCwgImEiLCAicHlsaW50cmMiKSwKKyAgICAgICAgICAgICJhL2IiOiBqb2luKGNocm9vdCwgImEiLCAiYiIsICJweWxpbnRyYyIpLAorICAgICAgICAgICAgImEvYi9jIjogam9pbihjaHJvb3QsICJhIiwgImIiLCAicHlsaW50cmMiKSwKKyAgICAgICAgICAgICJhL2IvYy9kIjogam9pbihjaHJvb3QsICJhIiwgImIiLCAicHlsaW50cmMiKSwKKyAgICAgICAgICAgICJhL2IvYy9kL2UiOiBqb2luKGNocm9vdCwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICIucHlsaW50cmMiKSwKKyAgICAgICAgfQorICAgICAgICBmb3IgYmFzZWRpciwgZXhwZWN0ZWQgaW4gcmVzdWx0cy5pdGVtcygpOgorICAgICAgICAgICAgb3MuY2hkaXIoam9pbihjaHJvb3QsIGJhc2VkaXIpKQorICAgICAgICAgICAgYXNzZXJ0IGNvbmZpZy5maW5kX3B5bGludHJjKCkgPT0gZXhwZWN0ZWQKKworCitAcHl0ZXN0Lm1hcmsudXNlZml4dHVyZXMoInBvcF9weWxpbnRyYyIpCitkZWYgdGVzdF9weWxpbnRyY19wYXJlbnRkaXJfbm9fcGFja2FnZSgpOgorICAgIHdpdGggdGVtcGRpcigpIGFzIGNocm9vdDoKKyAgICAgICAgd2l0aCBmYWtlX2hvbWUoKToKKyAgICAgICAgICAgIGNyZWF0ZV9maWxlcyhbImEvcHlsaW50cmMiLCAiYS9iL3B5bGludHJjIiwgImEvYi9jL2QvX19pbml0X18ucHkiXSkKKyAgICAgICAgICAgIGFzc2VydCBjb25maWcuZmluZF9weWxpbnRyYygpIGlzIE5vbmUKKyAgICAgICAgICAgIHJlc3VsdHMgPSB7CisgICAgICAgICAgICAgICAgImEiOiBqb2luKGNocm9vdCwgImEiLCAicHlsaW50cmMiKSwKKyAgICAgICAgICAgICAgICAiYS9iIjogam9pbihjaHJvb3QsICJhIiwgImIiLCAicHlsaW50cmMiKSwKKyAgICAgICAgICAgICAgICAiYS9iL2MiOiBOb25lLAorICAgICAgICAgICAgICAgICJhL2IvYy9kIjogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciBiYXNlZGlyLCBleHBlY3RlZCBpbiByZXN1bHRzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIoam9pbihjaHJvb3QsIGJhc2VkaXIpKQorICAgICAgICAgICAgICAgIGFzc2VydCBjb25maWcuZmluZF9weWxpbnRyYygpID09IGV4cGVjdGVkCisKKworY2xhc3MgVGVzdFByZXByb2Nlc3NPcHRpb25zOgorICAgIGRlZiBfY2FsbGJhY2soc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBzZWxmLmFyZ3MuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCisKKyAgICBkZWYgdGVzdF92YWx1ZV9lcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hcmdzID0gW10KKyAgICAgICAgcHJlcHJvY2Vzc19vcHRpb25zKAorICAgICAgICAgICAgWyItLWZvbyIsICItLWJhcj1iYXoiLCAiLS1xdT11eCJdLAorICAgICAgICAgICAgeyJmb28iOiAoc2VsZi5fY2FsbGJhY2ssIEZhbHNlKSwgInF1IjogKHNlbGYuX2NhbGxiYWNrLCBUcnVlKX0sCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0IFsoImZvbyIsIE5vbmUpLCAoInF1IiwgInV4IildID09IHNlbGYuYXJncworCisgICAgZGVmIHRlc3RfdmFsdWVfc3BhY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXJncyA9IFtdCisgICAgICAgIHByZXByb2Nlc3Nfb3B0aW9ucyhbIi0tcXUiLCAidXgiXSwgeyJxdSI6IChzZWxmLl9jYWxsYmFjaywgVHJ1ZSl9KQorICAgICAgICBhc3NlcnQgWygicXUiLCAidXgiKV0gPT0gc2VsZi5hcmdzCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHRlc3RfZXJyb3JfbWlzc2luZ19leHBlY3RlZF92YWx1ZSgpOgorICAgICAgICB3aXRoIHB5dGVzdC5yYWlzZXMoQXJndW1lbnRQcmVwcm9jZXNzaW5nRXJyb3IpOgorICAgICAgICAgICAgcHJlcHJvY2Vzc19vcHRpb25zKFsiLS1mb28iLCAiLS1iYXIiLCAiLS1xdT11eCJdLCB7ImJhciI6IChOb25lLCBUcnVlKX0pCisgICAgICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhBcmd1bWVudFByZXByb2Nlc3NpbmdFcnJvcik6CisgICAgICAgICAgICBwcmVwcm9jZXNzX29wdGlvbnMoWyItLWZvbyIsICItLWJhciJdLCB7ImJhciI6IChOb25lLCBUcnVlKX0pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHRlc3RfZXJyb3JfdW5leHBlY3RlZF92YWx1ZSgpOgorICAgICAgICB3aXRoIHB5dGVzdC5yYWlzZXMoQXJndW1lbnRQcmVwcm9jZXNzaW5nRXJyb3IpOgorICAgICAgICAgICAgcHJlcHJvY2Vzc19vcHRpb25zKAorICAgICAgICAgICAgICAgIFsiLS1mb28iLCAiLS1iYXI9c3BhbSIsICItLXF1PXV4Il0sIHsiYmFyIjogKE5vbmUsIEZhbHNlKX0KKyAgICAgICAgICAgICkKKworCitjbGFzcyBfQ3VzdG9tUHlMaW50ZXIoUHlMaW50ZXIpOgorICAgICMgcHlsaW50OiBkaXNhYmxlPXRvby1tYW55LWFuY2VzdG9ycworICAgIGRlZiBzaG91bGRfYW5hbHl6ZV9maWxlKHNlbGYsIG1vZG5hbWUsIHBhdGgsIGlzX2FyZ3VtZW50PUZhbHNlKToKKyAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShwYXRoKSA9PSAid3JvbmcucHkiOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIHN1cGVyKCkuc2hvdWxkX2FuYWx5emVfZmlsZShtb2RuYW1lLCBwYXRoLCBpc19hcmd1bWVudD1pc19hcmd1bWVudCkKKworCitkZWYgdGVzdF9jdXN0b21fc2hvdWxkX2FuYWx5emVfZmlsZSgpOgorICAgICIiIkNoZWNrIHRoYXQgd2UgY2FuIHdyaXRlIGN1c3RvbSBzaG91bGRfYW5hbHl6ZV9maWxlIHRoYXQgd29yaworICAgIGV2ZW4gZm9yIGFyZ3VtZW50cy4KKyAgICAiIiIKKyAgICBwYWNrYWdlX2RpciA9IG9zLnBhdGguam9pbihSRUdSVEVTVF9EQVRBX0RJUiwgImJhZF9wYWNrYWdlIikKKyAgICB3cm9uZ19maWxlID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCAid3JvbmcucHkiKQorCisgICAgZm9yIGpvYnMgaW4gKDEsIDIpOgorICAgICAgICByZXBvcnRlciA9IHRlc3R1dGlscy5HZW5lcmljVGVzdFJlcG9ydGVyKCkKKyAgICAgICAgbGludGVyID0gX0N1c3RvbVB5TGludGVyKCkKKyAgICAgICAgbGludGVyLmNvbmZpZy5qb2JzID0gam9icworICAgICAgICBsaW50ZXIuY29uZmlnLnBlcnNpc3RlbnQgPSAwCisgICAgICAgIGxpbnRlci5vcGVuKCkKKyAgICAgICAgbGludGVyLnNldF9yZXBvcnRlcihyZXBvcnRlcikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5kaXJuYW1lKHBhY2thZ2VfZGlyKSkKKyAgICAgICAgICAgIGxpbnRlci5jaGVjayhbcGFja2FnZV9kaXIsIHdyb25nX2ZpbGVdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnBhdGgucG9wKCkKKworICAgICAgICBtZXNzYWdlcyA9IHJlcG9ydGVyLm1lc3NhZ2VzCisgICAgICAgIGFzc2VydCBsZW4obWVzc2FnZXMpID09IDEKKyAgICAgICAgYXNzZXJ0ICJpbnZhbGlkIHN5bnRheCIgaW4gbWVzc2FnZXNbMF0KKworCisjIHdlIGRvIHRoZSBjaGVjayB3aXRoIGpvYnM9MSBhcyB3ZWxsLCBzbyB0aGF0IHdlIGFyZSBzdXJlIHRoYXQgdGhlIGR1cGxpY2F0ZXMKKyMgYXJlIGNyZWF0ZWQgYnkgdGhlIG11bHRpcHJvY2Vzc2luZyBwcm9ibGVtLgorQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJqb2JzIiwgWzEsIDJdKQorZGVmIHRlc3RfbXVsdGlwcm9jZXNzaW5nKGpvYnMpOgorICAgICIiIkNoZWNrIHRoYXQgbXVsdGlwcm9jZXNzaW5nIGRvZXMgbm90IGNyZWF0ZSBkdXBsaWNhdGVzLiIiIgorICAgICMgRm9yIHRoZSBidWcgKCMzNTg0KSB0byBzaG93IHVwIHdlIG5lZWQgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggaXNzdWVzCisgICAgIyBwZXIgcHJvY2VzcworICAgIGZpbGVuYW1lcyA9IFsKKyAgICAgICAgInNwZWNpYWxfYXR0cl9zY29wZV9sb29rdXBfY3Jhc2gucHkiLAorICAgICAgICAic3ludGF4X2Vycm9yLnB5IiwKKyAgICAgICAgInVudXNlZF92YXJpYWJsZS5weSIsCisgICAgICAgICJ3aWxkY2FyZC5weSIsCisgICAgICAgICJ3cm9uZ19pbXBvcnRfcG9zaXRpb24ucHkiLAorICAgIF0KKworICAgIHJlcG9ydGVyID0gdGVzdHV0aWxzLkdlbmVyaWNUZXN0UmVwb3J0ZXIoKQorICAgIGxpbnRlciA9IFB5TGludGVyKCkKKyAgICBsaW50ZXIuY29uZmlnLmpvYnMgPSBqb2JzCisgICAgbGludGVyLmNvbmZpZy5wZXJzaXN0ZW50ID0gMAorICAgIGxpbnRlci5vcGVuKCkKKyAgICBsaW50ZXIuc2V0X3JlcG9ydGVyKHJlcG9ydGVyKQorCisgICAgdHJ5OgorICAgICAgICBzeXMucGF0aC5hcHBlbmQob3MucGF0aC5kaXJuYW1lKFJFR1JURVNUX0RBVEFfRElSKSkKKyAgICAgICAgbGludGVyLmNoZWNrKFtvcy5wYXRoLmpvaW4oUkVHUlRFU1RfREFUQV9ESVIsIGZuYW1lKSBmb3IgZm5hbWUgaW4gZmlsZW5hbWVzXSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMucGF0aC5wb3AoKQorCisgICAgbWVzc2FnZXMgPSByZXBvcnRlci5tZXNzYWdlcworICAgIGFzc2VydCBsZW4obWVzc2FnZXMpID09IGxlbihzZXQobWVzc2FnZXMpKQorCisKK2RlZiB0ZXN0X2ZpbGVuYW1lX3dpdGhfX2luaXRfXyhpbml0X2xpbnRlcik6CisgICAgIyBUaGlzIHRyYWNrcyBhIHJlZ3Jlc3Npb24gd2hlcmUgYSBmaWxlIHdob3NlIG5hbWUgZW5kcyBpbiBfX2luaXRfXy5weSwKKyAgICAjIHN1Y2ggYXMgZmx5Y2hlY2tfX2luaXRfXy5weSwgd291bGQgYWNjaWRlbnRhbGx5IGxlYWQgdG8gbGludGluZyB0aGUKKyAgICAjIGVudGlyZSBjb250YWluaW5nIGRpcmVjdG9yeS4KKyAgICByZXBvcnRlciA9IHRlc3R1dGlscy5HZW5lcmljVGVzdFJlcG9ydGVyKCkKKyAgICBsaW50ZXIgPSBpbml0X2xpbnRlcgorICAgIGxpbnRlci5vcGVuKCkKKyAgICBsaW50ZXIuc2V0X3JlcG9ydGVyKHJlcG9ydGVyKQorICAgIGZpbGVwYXRoID0gam9pbihJTlBVVF9ESVIsICJub3RfX2luaXRfXy5weSIpCisgICAgbGludGVyLmNoZWNrKFtmaWxlcGF0aF0pCisgICAgbWVzc2FnZXMgPSByZXBvcnRlci5tZXNzYWdlcworICAgIGFzc2VydCBsZW4obWVzc2FnZXMpID09IDAKKworCitkZWYgdGVzdF9ieV9tb2R1bGVfc3RhdGVtZW50X3ZhbHVlKGluaXRfbGludGVyKToKKyAgICAiIiJUZXN0ICJzdGF0ZW1lbnQiIGZvciBlYWNoIG1vZHVsZSBhbmFsaXplZCBvZiBjb21wdXRlZCBjb3JyZWN0bHkuIiIiCisgICAgbGludGVyID0gaW5pdF9saW50ZXIKKyAgICBsaW50ZXIuY2hlY2sob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIikpCisKKyAgICBmb3IgbW9kdWxlLCBtb2R1bGVfc3RhdHMgaW4gbGludGVyLnN0YXRzWyJieV9tb2R1bGUiXS5pdGVtcygpOgorCisgICAgICAgIGxpbnRlcjIgPSBpbml0X2xpbnRlcgorICAgICAgICBpZiBtb2R1bGUgPT0gImRhdGEiOgorICAgICAgICAgICAgbGludGVyMi5jaGVjayhvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImRhdGEvX19pbml0X18ucHkiKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbnRlcjIuY2hlY2sob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksIG1vZHVsZSkpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBieV9tb2R1bGUgInN0YXRlbWVudCIgaXMgZXF1YWwgdG8gdGhlIGdsb2JhbCAic3RhdGVtZW50IgorICAgICAgICAjIGNvbXB1dGVkIGZvciB0aGF0IG1vZHVsZQorICAgICAgICBhc3NlcnQgbW9kdWxlX3N0YXRzWyJzdGF0ZW1lbnQiXSA9PSBsaW50ZXIyLnN0YXRzWyJzdGF0ZW1lbnQiXQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZS9fX2luaXRfXy5weSBiL3Rlc3RzL21lc3NhZ2UvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lc3NhZ2UvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2UvY29uZnRlc3QucHkgYi90ZXN0cy9tZXNzYWdlL2NvbmZ0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTAzNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlL2NvbmZ0ZXN0LnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyMgcHlsaW50OiBkaXNhYmxlPXJlZGVmaW5lZC1vdXRlci1uYW1lCisKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIKK2Zyb20gcHlsaW50Lm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2VEZWZpbml0aW9uU3RvcmUsIE1lc3NhZ2VJZFN0b3JlCisKKworQHB5dGVzdC5maXh0dXJlCitkZWYgbXNnaWQoKToKKyAgICByZXR1cm4gIlcxMjM0IgorCisKK0BweXRlc3QuZml4dHVyZQorZGVmIHN5bWJvbCgpOgorICAgIHJldHVybiAibXNnLXN5bWJvbCIKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBlbXB0eV9zdG9yZSgpOgorICAgIHJldHVybiBNZXNzYWdlRGVmaW5pdGlvblN0b3JlKCkKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBzdG9yZSgpOgorICAgIHN0b3JlXyA9IE1lc3NhZ2VEZWZpbml0aW9uU3RvcmUoKQorCisgICAgY2xhc3MgQ2hlY2tlcihCYXNlQ2hlY2tlcik6CisgICAgICAgIG5hbWUgPSAiYWNoZWNrZXIiCisgICAgICAgIG1zZ3MgPSB7CisgICAgICAgICAgICAiVzEyMzQiOiAoCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICJtc2ctc3ltYm9sIiwKKyAgICAgICAgICAgICAgICAibXNnIGRlc2NyaXB0aW9uLiIsCisgICAgICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMDAwMSIsICJvbGQtc3ltYm9sIildfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAiRTEyMzQiOiAoCisgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSBrZXl3b3JkIGFyZ3VtZW50ICVyIGluICVzIGNhbGwiLAorICAgICAgICAgICAgICAgICJkdXBsaWNhdGUta2V5d29yZC1hcmciLAorICAgICAgICAgICAgICAgICJVc2VkIHdoZW4gYSBmdW5jdGlvbiBjYWxsIHBhc3NlcyB0aGUgc2FtZSBrZXl3b3JkIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLiIsCisgICAgICAgICAgICAgICAgeyJtYXh2ZXJzaW9uIjogKDIsIDYpfSwKKyAgICAgICAgICAgICksCisgICAgICAgIH0KKworICAgIHN0b3JlXy5yZWdpc3Rlcl9tZXNzYWdlc19mcm9tX2NoZWNrZXIoQ2hlY2tlcigpKQorICAgIHJldHVybiBzdG9yZV8KKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBtZXNzYWdlX2RlZmluaXRpb25zKHN0b3JlKToKKyAgICByZXR1cm4gc3RvcmUubWVzc2FnZXMKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBtc2dpZHMoKToKKyAgICByZXR1cm4geworICAgICAgICAiVzEyMzQiOiAid2FybmluZy1zeW1ib2wiLAorICAgICAgICAiVzEyMzUiOiAid2FybmluZy1zeW1ib2wtdHdvIiwKKyAgICAgICAgIkMxMjM0IjogImNvbnZlbnRpb24tc3ltYm9sIiwKKyAgICAgICAgIkUxMjM0IjogImVycm9yLXN5bWJvbCIsCisgICAgfQorCisKK0BweXRlc3QuZml4dHVyZQorZGVmIGVtcHR5X21zZ2lkX3N0b3JlKCk6CisgICAgcmV0dXJuIE1lc3NhZ2VJZFN0b3JlKCkKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBtc2dpZF9zdG9yZShtc2dpZHMpOgorICAgIG1zZ2lkX3N0b3JlID0gTWVzc2FnZUlkU3RvcmUoKQorICAgIGZvciBtc2dpZCwgc3ltYm9sIGluIG1zZ2lkcy5pdGVtcygpOgorICAgICAgICBtc2dpZF9zdG9yZS5hZGRfbXNnaWRfYW5kX3N5bWJvbChtc2dpZCwgc3ltYm9sKQorICAgIHJldHVybiBtc2dpZF9zdG9yZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZS91bml0dGVzdF9tZXNzYWdlLnB5IGIvdGVzdHMvbWVzc2FnZS91bml0dGVzdF9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4M2ViMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlL3VuaXR0ZXN0X21lc3NhZ2UucHkKQEAgLTAsMCArMSw1MiBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitmcm9tIHB5bGludC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKKworZGVmIHRlc3RfbmV3X21lc3NhZ2UobWVzc2FnZV9kZWZpbml0aW9ucyk6CisgICAgZGVmIGJ1aWxkX21lc3NhZ2UobWVzc2FnZV9kZWZpbml0aW9uLCBsb2NhdGlvbl92YWx1ZSk6CisgICAgICAgIHJldHVybiBNZXNzYWdlKAorICAgICAgICAgICAgc3ltYm9sPW1lc3NhZ2VfZGVmaW5pdGlvbi5zeW1ib2wsCisgICAgICAgICAgICBtc2dfaWQ9bWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkLAorICAgICAgICAgICAgbG9jYXRpb249WworICAgICAgICAgICAgICAgIGxvY2F0aW9uX3ZhbHVlWyJhYnNwYXRoIl0sCisgICAgICAgICAgICAgICAgbG9jYXRpb25fdmFsdWVbInBhdGgiXSwKKyAgICAgICAgICAgICAgICBsb2NhdGlvbl92YWx1ZVsibW9kdWxlIl0sCisgICAgICAgICAgICAgICAgbG9jYXRpb25fdmFsdWVbIm9iaiJdLAorICAgICAgICAgICAgICAgIGxvY2F0aW9uX3ZhbHVlWyJsaW5lIl0sCisgICAgICAgICAgICAgICAgbG9jYXRpb25fdmFsdWVbImNvbHVtbiJdLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIG1zZz1tZXNzYWdlX2RlZmluaXRpb24ubXNnLAorICAgICAgICAgICAgY29uZmlkZW5jZT0iaGlnaCIsCisgICAgICAgICkKKworICAgIHRlbXBsYXRlID0gIntwYXRofTp7bGluZX06e2NvbHVtbn06IHttc2dfaWR9OiB7bXNnfSAoe3N5bWJvbH0pIgorICAgIGZvciBtZXNzYWdlX2RlZmluaXRpb24gaW4gbWVzc2FnZV9kZWZpbml0aW9uczoKKyAgICAgICAgaWYgbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkID09ICJFMTIzNCI6CisgICAgICAgICAgICBlMTIzNF9tZXNzYWdlX2RlZmluaXRpb24gPSBtZXNzYWdlX2RlZmluaXRpb24KKyAgICAgICAgaWYgbWVzc2FnZV9kZWZpbml0aW9uLm1zZ2lkID09ICJXMTIzNCI6CisgICAgICAgICAgICB3MTIzNF9tZXNzYWdlX2RlZmluaXRpb24gPSBtZXNzYWdlX2RlZmluaXRpb24KKyAgICBlMTIzNF9sb2NhdGlvbl92YWx1ZXMgPSB7CisgICAgICAgICJhYnNwYXRoIjogIjEiLAorICAgICAgICAicGF0aCI6ICIyIiwKKyAgICAgICAgIm1vZHVsZSI6ICIzIiwKKyAgICAgICAgIm9iaiI6ICI0IiwKKyAgICAgICAgImxpbmUiOiAiNSIsCisgICAgICAgICJjb2x1bW4iOiAiNiIsCisgICAgfQorICAgIHcxMjM0X2xvY2F0aW9uX3ZhbHVlcyA9IHsKKyAgICAgICAgImFic3BhdGgiOiAiNyIsCisgICAgICAgICJwYXRoIjogIjgiLAorICAgICAgICAibW9kdWxlIjogIjkiLAorICAgICAgICAib2JqIjogIjEwIiwKKyAgICAgICAgImxpbmUiOiAiMTEiLAorICAgICAgICAiY29sdW1uIjogIjEyIiwKKyAgICB9CisgICAgZXhwZWN0ZWQgPSAoCisgICAgICAgICIyOjU6NjogRTEyMzQ6IER1cGxpY2F0ZSBrZXl3b3JkIGFyZ3VtZW50ICVyIGluICVzIGNhbGwgKGR1cGxpY2F0ZS1rZXl3b3JkLWFyZykiCisgICAgKQorICAgIGUxMjM0ID0gYnVpbGRfbWVzc2FnZShlMTIzNF9tZXNzYWdlX2RlZmluaXRpb24sIGUxMjM0X2xvY2F0aW9uX3ZhbHVlcykKKyAgICB3MTIzNCA9IGJ1aWxkX21lc3NhZ2UodzEyMzRfbWVzc2FnZV9kZWZpbml0aW9uLCB3MTIzNF9sb2NhdGlvbl92YWx1ZXMpCisgICAgYXNzZXJ0IGUxMjM0LmZvcm1hdCh0ZW1wbGF0ZSkgPT0gZXhwZWN0ZWQKKyAgICBhc3NlcnQgdzEyMzQuZm9ybWF0KHRlbXBsYXRlKSA9PSAiODoxMToxMjogVzEyMzQ6IG1lc3NhZ2UgKG1zZy1zeW1ib2wpIgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZS91bml0dGVzdF9tZXNzYWdlX2RlZmluaXRpb24ucHkgYi90ZXN0cy9tZXNzYWdlL3VuaXR0ZXN0X21lc3NhZ2VfZGVmaW5pdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM1ZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZS91bml0dGVzdF9tZXNzYWdlX2RlZmluaXRpb24ucHkKQEAgLTAsMCArMSwxMTcgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IHN5cworZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jaworCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQuY29uc3RhbnRzIGltcG9ydCBXYXJuaW5nU2NvcGUKK2Zyb20gcHlsaW50LmV4Y2VwdGlvbnMgaW1wb3J0IEludmFsaWRNZXNzYWdlRXJyb3IKK2Zyb20gcHlsaW50Lm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2VEZWZpbml0aW9uCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICJtc2dpZCxleHBlY3RlZCIsCisgICAgWworICAgICAgICAoIlExMjM0IiwgIkJhZCBtZXNzYWdlIHR5cGUgUSBpbiAnUTEyMzQnIiksCisgICAgICAgICgiVzEyMzQ1IiwgIkludmFsaWQgbWVzc2FnZSBpZCAnVzEyMzQ1JyIpLAorICAgIF0sCispCitkZWYgdGVzdF9jcmVhdGVfaW52YWxpZF9tZXNzYWdlX3R5cGUobXNnaWQsIGV4cGVjdGVkKToKKyAgICBjaGVja2VyX21vY2sgPSBtb2NrLk1vY2sobmFtZT0iQ2hlY2tlciIpCisgICAgY2hlY2tlcl9tb2NrLm5hbWUgPSAiY2hlY2tlciIKKworICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkTWVzc2FnZUVycm9yKSBhcyBpbnZhbGlkX21lc3NhZ2VfZXJyb3I6CisgICAgICAgIE1lc3NhZ2VEZWZpbml0aW9uLmNoZWNrX21zZ2lkKG1zZ2lkKQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkTWVzc2FnZUVycm9yKSBhcyBvdGhlcl9pbnZhbGlkX21lc3NhZ2VfZXJyb3I6CisgICAgICAgIE1lc3NhZ2VEZWZpbml0aW9uKGNoZWNrZXJfbW9jaywgbXNnaWQsICJtc2ciLCAiZGVzY3IiLCAic3ltYm9sIiwgInNjb3BlIikKKyAgICBhc3NlcnQgc3RyKGludmFsaWRfbWVzc2FnZV9lcnJvci52YWx1ZSkgPT0gZXhwZWN0ZWQKKyAgICBhc3NlcnQgc3RyKG90aGVyX2ludmFsaWRfbWVzc2FnZV9lcnJvci52YWx1ZSkgPT0gZXhwZWN0ZWQKKworCitjbGFzcyBGYWxzZUNoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgIG5hbWUgPSAiRmFsc2VDaGVja2VyIgorICAgIG1zZ3MgPSB7CisgICAgICAgICJXMTIzNCI6ICgibWVzc2FnZSBvbmUiLCAibXNnLXN5bWJvbC1vbmUiLCAibXNnIGRlc2NyaXB0aW9uIiksCisgICAgICAgICJXMTIzNSI6ICgKKyAgICAgICAgICAgICJtZXNzYWdlIHR3byIsCisgICAgICAgICAgICAibXNnLXN5bWJvbC10d28iLAorICAgICAgICAgICAgIm1zZyBkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcxMjMwIiwgIm1zZy1zeW1ib2wtb25lIildfSwKKyAgICAgICAgKSwKKyAgICB9CisKKworY2xhc3MgVGVzdE1lc3NhZ2VzRGVmaW5pdGlvbjoKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGFzc2VydF93aXRoX2ZhaWxfbXNnKG1zZywgZXhwZWN0ZWQ9VHJ1ZSk6CisgICAgICAgIGZhaWxfbXNnID0gKAorICAgICAgICAgICAgZiJXaXRoIG1pbnZlcnNpb249J3ttc2cubWludmVyc2lvbn0nIGFuZCBtYXh2ZXJzaW9uPSd7bXNnLm1heHZlcnNpb259JywiCisgICAgICAgICAgICBmIiBhbmQgdGhlIHB5dGhvbiBpbnRlcnByZXRlciBiZWluZyB7c3lzLnZlcnNpb25faW5mb30gIgorICAgICAgICAgICAgInRoZSBtZXNzYWdlIHNob3VsZHt9YmUgZW1pdGFibGUiCisgICAgICAgICkKKyAgICAgICAgaWYgZXhwZWN0ZWQ6CisgICAgICAgICAgICBhc3NlcnQgbXNnLm1heV9iZV9lbWl0dGVkKCksIGZhaWxfbXNnLmZvcm1hdCgiICIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgbm90IG1zZy5tYXlfYmVfZW1pdHRlZCgpLCBmYWlsX21zZy5mb3JtYXQoIiBub3QgIikKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbigpOgorICAgICAgICBhcmdzID0gWworICAgICAgICAgICAgRmFsc2VDaGVja2VyKCksCisgICAgICAgICAgICAiVzEyMzQiLAorICAgICAgICAgICAgIm1lc3NhZ2UiLAorICAgICAgICAgICAgImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICJtc2ctc3ltYm9sIiwKKyAgICAgICAgICAgIFdhcm5pbmdTY29wZS5OT0RFLAorICAgICAgICBdCisgICAgICAgIGt3YXJncyA9IHsibWludmVyc2lvbiI6IE5vbmUsICJtYXh2ZXJzaW9uIjogTm9uZX0KKyAgICAgICAgcmV0dXJuIE1lc3NhZ2VEZWZpbml0aW9uKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X21heV9iZV9lbWl0dGVkKHNlbGYpOgorICAgICAgICBtYWpvciA9IHN5cy52ZXJzaW9uX2luZm8ubWFqb3IKKyAgICAgICAgbWlub3IgPSBzeXMudmVyc2lvbl9pbmZvLm1pbm9yCisgICAgICAgIG1zZyA9IHNlbGYuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0X3dpdGhfZmFpbF9tc2cobXNnLCBleHBlY3RlZD1UcnVlKQorICAgICAgICBtc2cubWludmVyc2lvbiA9IChtYWpvciwgbWlub3IgLSAxKQorICAgICAgICBtc2cubWF4dmVyc2lvbiA9IChtYWpvciwgbWlub3IgKyAxKQorICAgICAgICBzZWxmLmFzc2VydF93aXRoX2ZhaWxfbXNnKG1zZywgZXhwZWN0ZWQ9VHJ1ZSkKKyAgICAgICAgbXNnLm1pbnZlcnNpb24gPSAobWFqb3IsIG1pbm9yICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfd2l0aF9mYWlsX21zZyhtc2csIGV4cGVjdGVkPUZhbHNlKQorICAgICAgICBtc2cubWludmVyc2lvbiA9IChtYWpvciwgbWlub3IgLSAxKQorICAgICAgICBzZWxmLmFzc2VydF93aXRoX2ZhaWxfbXNnKG1zZywgZXhwZWN0ZWQ9VHJ1ZSkKKyAgICAgICAgbXNnLm1heHZlcnNpb24gPSAobWFqb3IsIG1pbm9yIC0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRfd2l0aF9mYWlsX21zZyhtc2csIGV4cGVjdGVkPUZhbHNlKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5nZXRfbWVzc2FnZV9kZWZpbml0aW9uKCkKKyAgICAgICAgcmVwcl9zdHIgPSBzdHIoW21zZywgbXNnXSkKKyAgICAgICAgYXNzZXJ0ICJXMTIzNCIgaW4gcmVwcl9zdHIKKyAgICAgICAgYXNzZXJ0ICJtc2ctc3ltYm9sIiBpbiByZXByX3N0cgorICAgICAgICBleHBlY3RlZCA9ICJbTWVzc2FnZURlZmluaXRpb246bXNnLXN5bWJvbC1vbmUgKFcxMjM0KSwgTWVzc2FnZURlZmluaXRpb246bXNnLXN5bWJvbC10d28gKFcxMjM1KV0iCisgICAgICAgIGFzc2VydCBzdHIoRmFsc2VDaGVja2VyKCkubWVzc2FnZXMpID09IGV4cGVjdGVkCisKKyAgICBkZWYgdGVzdF9zdHIoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbigpCisgICAgICAgIHN0cl9tc2cgPSBzdHIobXNnKQorICAgICAgICBhc3NlcnQgIlcxMjM0IiBpbiBzdHJfbXNnCisgICAgICAgIGFzc2VydCAibXNnLXN5bWJvbCIgaW4gc3RyX21zZworICAgICAgICBleHBlY3RlZCA9ICIiIk1lc3NhZ2VEZWZpbml0aW9uOm1zZy1zeW1ib2wtb25lIChXMTIzNCk6CittZXNzYWdlIG9uZSBtc2cgZGVzY3JpcHRpb24iIiIKKyAgICAgICAgYXNzZXJ0IHN0cihGYWxzZUNoZWNrZXIoKS5tZXNzYWdlc1swXSkgPT0gZXhwZWN0ZWQKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9oZWxwKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLmdldF9tZXNzYWdlX2RlZmluaXRpb24oKQorICAgICAgICBtYWpvciA9IHN5cy52ZXJzaW9uX2luZm8ubWFqb3IKKyAgICAgICAgbWlub3IgPSBzeXMudmVyc2lvbl9pbmZvLm1pbm9yCisgICAgICAgIG1zZy5taW52ZXJzaW9uID0gKG1ham9yLCBtaW5vciAtIDEpCisgICAgICAgIG1zZy5tYXh2ZXJzaW9uID0gKG1ham9yLCBtaW5vciArIDEpCisgICAgICAgIGZvcm1hdF9zdHJfY2hlY2tlcl9yZWYgPSBtc2cuZm9ybWF0X2hlbHAoY2hlY2tlcnJlZj1GYWxzZSkKKyAgICAgICAgZm9ybWF0X3N0ciA9IG1zZy5mb3JtYXRfaGVscChjaGVja2VycmVmPVRydWUpCisgICAgICAgIGFzc2VydCBzdHIobWlub3IgLSAxKSBpbiBmb3JtYXRfc3RyCisgICAgICAgIGFzc2VydCBzdHIobWFqb3IgKyAxKSBpbiBmb3JtYXRfc3RyX2NoZWNrZXJfcmVmCisgICAgICAgIGV4cGVjdGVkX2Zvcm1hdF9oZWxwID0gIiIiOm1zZy1zeW1ib2wtb25lIChXMTIzNCk6ICptZXNzYWdlIG9uZSoKKyAgbXNnIGRlc2NyaXB0aW9uIiIiCisgICAgICAgIGFzc2VydCBGYWxzZUNoZWNrZXIoKS5tZXNzYWdlc1swXS5mb3JtYXRfaGVscCgpID09IGV4cGVjdGVkX2Zvcm1hdF9oZWxwCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlL3VuaXR0ZXN0X21lc3NhZ2VfZGVmaW5pdGlvbl9zdG9yZS5weSBiL3Rlc3RzL21lc3NhZ2UvdW5pdHRlc3RfbWVzc2FnZV9kZWZpbml0aW9uX3N0b3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDBhZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlL3VuaXR0ZXN0X21lc3NhZ2VfZGVmaW5pdGlvbl9zdG9yZS5weQpAQCAtMCwwICsxLDI2OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IHJlZGlyZWN0X3N0ZG91dAorZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5jaGVja2VycyBpbXBvcnQgQmFzZUNoZWNrZXIKK2Zyb20gcHlsaW50LmV4Y2VwdGlvbnMgaW1wb3J0IEludmFsaWRNZXNzYWdlRXJyb3IsIFVua25vd25NZXNzYWdlRXJyb3IKK2Zyb20gcHlsaW50Lm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2VEZWZpbml0aW9uCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICJtZXNzYWdlcyxleHBlY3RlZCIsCisgICAgWworICAgICAgICAoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIlcxMjM0IjogKCJtZXNzYWdlIG9uZSIsICJtc2ctc3ltYm9sLW9uZSIsICJtc2cgZGVzY3JpcHRpb24iKSwKKyAgICAgICAgICAgICAgICAiVzQzMjEiOiAoIm1lc3NhZ2UgdHdvIiwgIm1zZy1zeW1ib2wtdHdvIiwgIm1zZyBkZXNjcmlwdGlvbiIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHIiSW5jb25zaXN0ZW50IGNoZWNrZXIgcGFydCBpbiBtZXNzYWdlIGlkICdXNDMyMScgKGV4cGVjdGVkICd4MTJ4eCcgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhZCBbJ1cxMjM0J10pLiIsCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiVzEyMzMiOiAoCisgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIHR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2ctc3ltYm9sLXR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2cgZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcxMjM0IiwgIm9sZC1zeW1ib2wiKV19LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIlcxMjM0IjogKCJtZXNzYWdlIG9uZSIsICJtc2ctc3ltYm9sLW9uZSIsICJtc2cgZGVzY3JpcHRpb24iKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiTWVzc2FnZSBpZCAnVzEyMzQnIGNhbm5vdCBoYXZlIGJvdGggJ21zZy1zeW1ib2wtb25lJyBhbmQgJ29sZC1zeW1ib2wnIGFzIHN5bWJvbGljIG5hbWUuIiwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJXMTIzNCI6ICgibWVzc2FnZSBvbmUiLCAibXNnLXN5bWJvbC1vbmUiLCAibXNnIGRlc2NyaXB0aW9uIiksCisgICAgICAgICAgICAgICAgIlcxMjM1IjogKAorICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0d28iLAorICAgICAgICAgICAgICAgICAgICAibXNnLXN5bWJvbC10d28iLAorICAgICAgICAgICAgICAgICAgICAibXNnIGRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMTIzNCIsICJvbGQtc3ltYm9sIildfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJNZXNzYWdlIGlkICdXMTIzNCcgY2Fubm90IGhhdmUgYm90aCAnbXNnLXN5bWJvbC1vbmUnIGFuZCAnb2xkLXN5bWJvbCcgYXMgc3ltYm9saWMgbmFtZS4iLAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIlcxMjM0IjogKAorICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBvbmUiLAorICAgICAgICAgICAgICAgICAgICAibXNnLXN5bWJvbC1vbmUiLAorICAgICAgICAgICAgICAgICAgICAibXNnIGRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMTIwMSIsICJvbGQtc3ltYm9sLW9uZSIpXX0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAiVzEyMzUiOiAoCisgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIHR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2ctc3ltYm9sLXR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2cgZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcxMjAxIiwgIm9sZC1zeW1ib2wtdHdvIildfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJNZXNzYWdlIGlkICdXMTIwMScgY2Fubm90IGhhdmUgYm90aCAnb2xkLXN5bWJvbC1vbmUnIGFuZCAnb2xkLXN5bWJvbC10d28nIGFzIHN5bWJvbGljIG5hbWUuIiwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJXMTIzNCI6ICgibWVzc2FnZSBvbmUiLCAibXNnLXN5bWJvbCIsICJtc2cgZGVzY3JpcHRpb24iKSwKKyAgICAgICAgICAgICAgICAiVzEyMzUiOiAoIm1lc3NhZ2UgdHdvIiwgIm1zZy1zeW1ib2wiLCAibXNnIGRlc2NyaXB0aW9uIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIk1lc3NhZ2Ugc3ltYm9sICdtc2ctc3ltYm9sJyBjYW5ub3QgYmUgdXNlZCBmb3IgJ1cxMjM0JyBhbmQgJ1cxMjM1JyBhdCB0aGUgc2FtZSB0aW1lLiAiCisgICAgICAgICAgICAiSWYgeW91J3JlIGNyZWF0aW5nIGFuICdvbGRfbmFtZXMnIHVzZSAnb2xkLW1zZy1zeW1ib2wnIGFzIHRoZSBvbGQgc3ltYm9sLiIsCisgICAgICAgICksCisgICAgICAgICgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiVzEyMzMiOiAoCisgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIHR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2ctc3ltYm9sLXR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2cgZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcxMjMwIiwgIm1zZy1zeW1ib2wtb25lIildfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICJXMTIzNCI6ICgibWVzc2FnZSBvbmUiLCAibXNnLXN5bWJvbC1vbmUiLCAibXNnIGRlc2NyaXB0aW9uIiksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgIk1lc3NhZ2Ugc3ltYm9sICdtc2ctc3ltYm9sLW9uZScgY2Fubm90IGJlIHVzZWQgZm9yICdXMTIzMCcgYW5kICdXMTIzNCcgYXQgdGhlIHNhbWUgdGltZS4iCisgICAgICAgICAgICAiIElmIHlvdSdyZSBjcmVhdGluZyBhbiAnb2xkX25hbWVzJyB1c2UgJ29sZC1tc2ctc3ltYm9sLW9uZScgYXMgdGhlIG9sZCBzeW1ib2wuIiwKKyAgICAgICAgKSwKKyAgICAgICAgKAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJXMTIzNCI6ICgibWVzc2FnZSBvbmUiLCAibXNnLXN5bWJvbC1vbmUiLCAibXNnIGRlc2NyaXB0aW9uIiksCisgICAgICAgICAgICAgICAgIlcxMjM1IjogKAorICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0d28iLAorICAgICAgICAgICAgICAgICAgICAibXNnLXN5bWJvbC10d28iLAorICAgICAgICAgICAgICAgICAgICAibXNnIGRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMTIzMCIsICJtc2ctc3ltYm9sLW9uZSIpXX0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiTWVzc2FnZSBzeW1ib2wgJ21zZy1zeW1ib2wtb25lJyBjYW5ub3QgYmUgdXNlZCBmb3IgJ1cxMjMwJyBhbmQgJ1cxMjM0JyBhdCB0aGUgc2FtZSB0aW1lLiAiCisgICAgICAgICAgICAiSWYgeW91J3JlIGNyZWF0aW5nIGFuICdvbGRfbmFtZXMnIHVzZSAnb2xkLW1zZy1zeW1ib2wtb25lJyBhcyB0aGUgb2xkIHN5bWJvbC4iLAorICAgICAgICApLAorICAgICAgICAoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIlcxMjM0IjogKAorICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBvbmUiLAorICAgICAgICAgICAgICAgICAgICAibXNnLXN5bWJvbC1vbmUiLAorICAgICAgICAgICAgICAgICAgICAibXNnIGRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgeyJvbGRfbmFtZXMiOiBbKCJXMTIzMCIsICJvbGQtc3ltYm9sLW9uZSIpXX0sCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAiVzEyMzUiOiAoCisgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIHR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2ctc3ltYm9sLXR3byIsCisgICAgICAgICAgICAgICAgICAgICJtc2cgZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICB7Im9sZF9uYW1lcyI6IFsoIlcxMjMxIiwgIm9sZC1zeW1ib2wtb25lIildfSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJNZXNzYWdlIHN5bWJvbCAnb2xkLXN5bWJvbC1vbmUnIGNhbm5vdCBiZSB1c2VkIGZvciAnVzEyMzAnIGFuZCAnVzEyMzEnIGF0IHRoZSBzYW1lIHRpbWUuICIKKyAgICAgICAgICAgICJJZiB5b3UncmUgY3JlYXRpbmcgYW4gJ29sZF9uYW1lcycgdXNlICdvbGQtb2xkLXN5bWJvbC1vbmUnIGFzIHRoZSBvbGQgc3ltYm9sLiIsCisgICAgICAgICksCisgICAgXSwKKykKK2RlZiB0ZXN0X3JlZ2lzdGVyX2Vycm9yKGVtcHR5X3N0b3JlLCBtZXNzYWdlcywgZXhwZWN0ZWQpOgorICAgIGNsYXNzIENoZWNrZXIoQmFzZUNoZWNrZXIpOgorICAgICAgICBuYW1lID0gImNoZWNrZXIiCisgICAgICAgIG1zZ3MgPSBtZXNzYWdlcworCisgICAgd2l0aCBweXRlc3QucmFpc2VzKEludmFsaWRNZXNzYWdlRXJyb3IpIGFzIGNtOgorICAgICAgICBlbXB0eV9zdG9yZS5yZWdpc3Rlcl9tZXNzYWdlc19mcm9tX2NoZWNrZXIoQ2hlY2tlcigpKQorICAgIGFzc2VydCBzdHIoY20udmFsdWUpID09IGV4cGVjdGVkCisKKworZGVmIHRlc3RfcmVnaXN0ZXJfZXJyb3JfbmV3X2lkX2R1cGxpY2F0ZV9vZl9uZXcoZW1wdHlfc3RvcmUpOgorICAgIGNsYXNzIENoZWNrZXJPbmUoQmFzZUNoZWNrZXIpOgorICAgICAgICBuYW1lID0gImNoZWNrZXJfb25lIgorICAgICAgICBtc2dzID0geyJXMTIzNCI6ICgibWVzc2FnZSBvbmUiLCAibXNnLXN5bWJvbC1vbmUiLCAibXNnIGRlc2NyaXB0aW9uLiIpfQorCisgICAgY2xhc3MgQ2hlY2tlclR3byhCYXNlQ2hlY2tlcik6CisgICAgICAgIG5hbWUgPSAiY2hlY2tlcl90d28iCisgICAgICAgIG1zZ3MgPSB7IlcxMjM0IjogKCJtZXNzYWdlIHR3byIsICJtc2ctc3ltYm9sLXR3byIsICJhbm90aGVyIG1zZyBkZXNjcmlwdGlvbi4iKX0KKworICAgIGVtcHR5X3N0b3JlLnJlZ2lzdGVyX21lc3NhZ2VzX2Zyb21fY2hlY2tlcihDaGVja2VyT25lKCkpCisgICAgdGVzdF9yZWdpc3Rlcl9lcnJvcigKKyAgICAgICAgZW1wdHlfc3RvcmUsCisgICAgICAgIENoZWNrZXJUd28ubXNncywKKyAgICAgICAgIk1lc3NhZ2UgaWQgJ1cxMjM0JyBjYW5ub3QgaGF2ZSBib3RoICdtc2ctc3ltYm9sLW9uZScgYW5kICdtc2ctc3ltYm9sLXR3bycgYXMgc3ltYm9saWMgbmFtZS4iLAorICAgICkKKworCitkZWYgdGVzdF9mb3JtYXRfaGVscChjYXBzeXMsIHN0b3JlKToKKyAgICBzdG9yZS5oZWxwX21lc3NhZ2UoW10pCisgICAgY2FwdHVyZWQgPSBjYXBzeXMucmVhZG91dGVycigpCisgICAgYXNzZXJ0IGNhcHR1cmVkLm91dCA9PSAiIgorICAgIHN0b3JlLmhlbHBfbWVzc2FnZShbIlcxMjM0IiwgIkUxMjM0IiwgIkMxMjM0Il0pCisgICAgY2FwdHVyZWQgPSBjYXBzeXMucmVhZG91dGVycigpCisgICAgYXNzZXJ0ICgKKyAgICAgICAgY2FwdHVyZWQub3V0CisgICAgICAgID09ICIiIjptc2ctc3ltYm9sIChXMTIzNCk6ICptZXNzYWdlKgorICBtc2cgZGVzY3JpcHRpb24uIFRoaXMgbWVzc2FnZSBiZWxvbmdzIHRvIHRoZSBhY2hlY2tlciBjaGVja2VyLgorCis6ZHVwbGljYXRlLWtleXdvcmQtYXJnIChFMTIzNCk6ICpEdXBsaWNhdGUga2V5d29yZCBhcmd1bWVudCAlciBpbiAlcyBjYWxsKgorICBVc2VkIHdoZW4gYSBmdW5jdGlvbiBjYWxsIHBhc3NlcyB0aGUgc2FtZSBrZXl3b3JkIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLgorICBUaGlzIG1lc3NhZ2UgYmVsb25ncyB0byB0aGUgYWNoZWNrZXIgY2hlY2tlci4gSXQgY2FuJ3QgYmUgZW1pdHRlZCB3aGVuIHVzaW5nCisgIFB5dGhvbiA+PSAyLjYuCisKK05vIHN1Y2ggbWVzc2FnZSBpZCBvciBzeW1ib2wgJ0MxMjM0Jy4KKworIiIiCisgICAgKQorCisKK2RlZiB0ZXN0X2dldF9tc2dfZGlzcGxheV9zdHJpbmcoc3RvcmUpOgorICAgIGFzc2VydCBzdG9yZS5nZXRfbXNnX2Rpc3BsYXlfc3RyaW5nKCJXMTIzNCIpID09ICInbXNnLXN5bWJvbCciCisgICAgYXNzZXJ0IHN0b3JlLmdldF9tc2dfZGlzcGxheV9zdHJpbmcoIkUxMjM0IikgPT0gIidkdXBsaWNhdGUta2V5d29yZC1hcmcnIgorCisKK2RlZiB0ZXN0X2NoZWNrX21lc3NhZ2VfaWQoc3RvcmUpOgorICAgIHcxMjM0ID0gc3RvcmUuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbnMoIlcxMjM0IilbMF0KKyAgICB3MDAwMSA9IHN0b3JlLmdldF9tZXNzYWdlX2RlZmluaXRpb25zKCJXMDAwMSIpWzBdCisgICAgZTEyMzQgPSBzdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucygiRTEyMzQiKVswXQorICAgIG9sZF9zeW1ib2wgPSBzdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucygib2xkLXN5bWJvbCIpWzBdCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UodzEyMzQsIE1lc3NhZ2VEZWZpbml0aW9uKQorICAgIGFzc2VydCBpc2luc3RhbmNlKGUxMjM0LCBNZXNzYWdlRGVmaW5pdGlvbikKKyAgICBhc3NlcnQgdzEyMzQgPT0gdzAwMDEKKyAgICBhc3NlcnQgdzEyMzQgPT0gb2xkX3N5bWJvbAorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhVbmtub3duTWVzc2FnZUVycm9yKToKKyAgICAgICAgc3RvcmUuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbnMoIllCMTIiKQorCisKK2NsYXNzIFRlc3RNZXNzYWdlRGVmaW5pdGlvblN0b3JlOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NvbXBhcmVfbWVzc2FnZXMoZGVzYywgbXNnLCBjaGVja2VycmVmPUZhbHNlKToKKyAgICAgICAgYXNzZXJ0IGRlc2MgPT0gbXNnLmZvcm1hdF9oZWxwKGNoZWNrZXJyZWY9Y2hlY2tlcnJlZikKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfaGVscChzZWxmLCBzdG9yZSk6CisgICAgICAgIG1lc3NhZ2VfZGVmaW5pdGlvbiA9IHN0b3JlLmdldF9tZXNzYWdlX2RlZmluaXRpb25zKCJXMTIzNCIpWzBdCisgICAgICAgIHNlbGYuX2NvbXBhcmVfbWVzc2FnZXMoCisgICAgICAgICAgICAiIiI6bXNnLXN5bWJvbCAoVzEyMzQpOiAqbWVzc2FnZSoKKyAgbXNnIGRlc2NyaXB0aW9uLiBUaGlzIG1lc3NhZ2UgYmVsb25ncyB0byB0aGUgYWNoZWNrZXIgY2hlY2tlci4iIiIsCisgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24sCisgICAgICAgICAgICBjaGVja2VycmVmPVRydWUsCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fY29tcGFyZV9tZXNzYWdlcygKKyAgICAgICAgICAgICIiIjptc2ctc3ltYm9sIChXMTIzNCk6ICptZXNzYWdlKgorICBtc2cgZGVzY3JpcHRpb24uIiIiLAorICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uLAorICAgICAgICAgICAgY2hlY2tlcnJlZj1GYWxzZSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9oZWxwX21pbm1heChzZWxmLCBzdG9yZSk6CisgICAgICAgICMgYnVpbGQgdGhlIG1lc3NhZ2UgbWFudWFsbHkgdG8gYmUgcHl0aG9uIHZlcnNpb24gaW5kZXBlbmRlbnQKKyAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uID0gc3RvcmUuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbnMoIkUxMjM0IilbMF0KKyAgICAgICAgc2VsZi5fY29tcGFyZV9tZXNzYWdlcygKKyAgICAgICAgICAgICIiIjpkdXBsaWNhdGUta2V5d29yZC1hcmcgKEUxMjM0KTogKkR1cGxpY2F0ZSBrZXl3b3JkIGFyZ3VtZW50ICVyIGluICVzIGNhbGwqCisgIFVzZWQgd2hlbiBhIGZ1bmN0aW9uIGNhbGwgcGFzc2VzIHRoZSBzYW1lIGtleXdvcmQgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuCisgIFRoaXMgbWVzc2FnZSBiZWxvbmdzIHRvIHRoZSBhY2hlY2tlciBjaGVja2VyLiBJdCBjYW4ndCBiZSBlbWl0dGVkIHdoZW4gdXNpbmcKKyAgUHl0aG9uID49IDIuNi4iIiIsCisgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24sCisgICAgICAgICAgICBjaGVja2VycmVmPVRydWUsCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fY29tcGFyZV9tZXNzYWdlcygKKyAgICAgICAgICAgICIiIjpkdXBsaWNhdGUta2V5d29yZC1hcmcgKEUxMjM0KTogKkR1cGxpY2F0ZSBrZXl3b3JkIGFyZ3VtZW50ICVyIGluICVzIGNhbGwqCisgIFVzZWQgd2hlbiBhIGZ1bmN0aW9uIGNhbGwgcGFzc2VzIHRoZSBzYW1lIGtleXdvcmQgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuCisgIFRoaXMgbWVzc2FnZSBjYW4ndCBiZSBlbWl0dGVkIHdoZW4gdXNpbmcgUHl0aG9uID49IDIuNi4iIiIsCisgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24sCisgICAgICAgICAgICBjaGVja2VycmVmPUZhbHNlLAorICAgICAgICApCisKKworZGVmIHRlc3RfbGlzdF9tZXNzYWdlcyhzdG9yZSk6CisgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQorICAgIHdpdGggcmVkaXJlY3Rfc3Rkb3V0KG91dHB1dCk6CisgICAgICAgIHN0b3JlLmxpc3RfbWVzc2FnZXMoKQorICAgICMgY3Vyc29yeSBleGFtaW5hdGlvbiBvZiB0aGUgb3V0cHV0OiB3ZSdyZSBtb3N0bHkgdGVzdGluZyBpdCBjb21wbGV0ZXMKKyAgICBhc3NlcnQgIjptc2ctc3ltYm9sIChXMTIzNCk6ICptZXNzYWdlKiIgaW4gb3V0cHV0LmdldHZhbHVlKCkKKworCitkZWYgdGVzdF9yZW5hbWVkX21lc3NhZ2VfcmVnaXN0ZXIoc3RvcmUpOgorICAgIGFzc2VydCBzdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucygiVzAwMDEiKVswXS5zeW1ib2wgPT0gIm1zZy1zeW1ib2wiCisgICAgYXNzZXJ0IHN0b3JlLmdldF9tZXNzYWdlX2RlZmluaXRpb25zKCJvbGQtc3ltYm9sIilbMF0uc3ltYm9sID09ICJtc2ctc3ltYm9sIgorCisKK2RlZiB0ZXN0X211bHRpcGxlX2NoaWxkX29mX29sZF9uYW1lKHN0b3JlKToKKyAgICAiIiJXZSBjYW4gZGVmaW5lIG11bHRpcGxlIG5hbWUgd2l0aCB0aGUgc2FtZSBvbGQgbmFtZS4iIiIKKworICAgIGNsYXNzIEZhbWlsbHlDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAgICAgbmFtZSA9ICJmYW1pbGx5Y2hlY2tlciIKKyAgICAgICAgbXNncyA9IHsKKyAgICAgICAgICAgICJXMTIzNSI6ICgKKyAgICAgICAgICAgICAgICAiQ2hpbGQgMSIsCisgICAgICAgICAgICAgICAgImNoaWxkLW9uZSIsCisgICAgICAgICAgICAgICAgIkNoaWxkIG9uZSBkZXNjcmlwdGlvbi4iLAorICAgICAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiQzEyMzQiLCAibW90aGVyIildfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAiVzEyMzYiOiAoCisgICAgICAgICAgICAgICAgIkNoaWxkIDIiLAorICAgICAgICAgICAgICAgICJjaGlsZC10d28iLAorICAgICAgICAgICAgICAgICJDaGlsZCB0d28gZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgIHsib2xkX25hbWVzIjogWygiQzEyMzQiLCAibW90aGVyIildfSwKKyAgICAgICAgICAgICksCisgICAgICAgIH0KKworICAgIHN0b3JlLnJlZ2lzdGVyX21lc3NhZ2VzX2Zyb21fY2hlY2tlcihGYW1pbGx5Q2hlY2tlcigpKQorICAgIG1vdGhlciA9IHN0b3JlLmdldF9tZXNzYWdlX2RlZmluaXRpb25zKCJDMTIzNCIpCisgICAgY2hpbGQgPSBzdG9yZS5nZXRfbWVzc2FnZV9kZWZpbml0aW9ucygiVzEyMzUiKQorICAgIG90aGVyX2NoaWxkID0gc3RvcmUuZ2V0X21lc3NhZ2VfZGVmaW5pdGlvbnMoIlcxMjM2IikKKyAgICBhc3NlcnQgbGVuKG1vdGhlcikgPT0gMgorICAgIGFzc2VydCBsZW4oY2hpbGQpID09IDEKKyAgICBhc3NlcnQgbGVuKG90aGVyX2NoaWxkKSA9PSAxCisgICAgY2hpbGQgPSBjaGlsZFswXQorICAgIG90aGVyX2NoaWxkID0gb3RoZXJfY2hpbGRbMF0KKyAgICBhc3NlcnQgY2hpbGQgaW4gbW90aGVyCisgICAgYXNzZXJ0IG90aGVyX2NoaWxkIGluIG1vdGhlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZS91bml0dGVzdF9tZXNzYWdlX2lkX3N0b3JlLnB5IGIvdGVzdHMvbWVzc2FnZS91bml0dGVzdF9tZXNzYWdlX2lkX3N0b3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTFmZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlL3VuaXR0ZXN0X21lc3NhZ2VfaWRfc3RvcmUucHkKQEAgLTAsMCArMSw4NSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmV4Y2VwdGlvbnMgaW1wb3J0IEludmFsaWRNZXNzYWdlRXJyb3IsIFVua25vd25NZXNzYWdlRXJyb3IKKworCitkZWYgdGVzdF9sZW5fc3RyKG1zZ2lkX3N0b3JlLCBtc2dpZHMpOgorICAgIGFzc2VydCBsZW4obXNnaWRfc3RvcmUpID09IGxlbihtc2dpZHMpCisgICAgc3RyX3Jlc3VsdCA9IHN0cihtc2dpZF9zdG9yZSkKKyAgICBhc3NlcnQgIk1lc3NhZ2VJZFN0b3JlOiBbIiBpbiBzdHJfcmVzdWx0CisgICAgYXNzZXJ0ICIgIC0gVzEyMzQgKHdhcm5pbmctc3ltYm9sKSIgaW4gc3RyX3Jlc3VsdAorICAgIGFzc2VydCAiICAtIFcxMjM1ICh3YXJuaW5nLXN5bWJvbC10d28pIiBpbiBzdHJfcmVzdWx0CisgICAgYXNzZXJ0ICIgIC0gQzEyMzQgKGNvbnZlbnRpb24tc3ltYm9sKSIgaW4gc3RyX3Jlc3VsdAorICAgIGFzc2VydCAiICAtIEUxMjM0IChlcnJvci1zeW1ib2wpIiBpbiBzdHJfcmVzdWx0CisgICAgYXNzZXJ0ICJdIiBpbiBzdHJfcmVzdWx0CisKKworZGVmIHRlc3RfZ2V0X21lc3NhZ2VfaWRzKG1zZ2lkX3N0b3JlLCBtc2dpZHMpOgorICAgICIiIldlIGNhbiBnZXQgbWVzc2FnZSBpZCBldmVuIHdpdGggY2FwaXRhbGl6YXRpb24gcHJvYmxlbS4iIiIKKyAgICBtc2dpZCA9IGxpc3QobXNnaWRzLmtleXMoKSlbMF0KKyAgICBtc2dpZHNfcmVzdWx0ID0gbXNnaWRfc3RvcmUuZ2V0X2FjdGl2ZV9tc2dpZHMobXNnaWQubG93ZXIoKSkKKyAgICBhc3NlcnQgbGVuKG1zZ2lkc19yZXN1bHQpID09IDEKKyAgICBhc3NlcnQgbXNnaWQgPT0gbXNnaWRzX3Jlc3VsdFswXQorCisKK2RlZiB0ZXN0X2dldF9tZXNzYWdlX2lkc19ub3RfZXhpc3RpbmcoZW1wdHlfbXNnaWRfc3RvcmUpOgorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhVbmtub3duTWVzc2FnZUVycm9yKSBhcyBlcnJvcjoKKyAgICAgICAgdzk4NzYgPSAiVzk4NzYiCisgICAgICAgIGVtcHR5X21zZ2lkX3N0b3JlLmdldF9hY3RpdmVfbXNnaWRzKHc5ODc2KQorICAgIGFzc2VydCB3OTg3NiBpbiBzdHIoZXJyb3IudmFsdWUpCisKKworZGVmIHRlc3RfcmVnaXN0ZXJfbWVzc2FnZV9kZWZpbml0aW9ucyhlbXB0eV9tc2dpZF9zdG9yZSwgbWVzc2FnZV9kZWZpbml0aW9ucyk6CisgICAgbnVtYmVyX29mX21zZ2lkID0gbGVuKG1lc3NhZ2VfZGVmaW5pdGlvbnMpCisgICAgZm9yIG1lc3NhZ2VfZGVmaW5pdGlvbiBpbiBtZXNzYWdlX2RlZmluaXRpb25zOgorICAgICAgICBlbXB0eV9tc2dpZF9zdG9yZS5yZWdpc3Rlcl9tZXNzYWdlX2RlZmluaXRpb24oCisgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24ubXNnaWQsCisgICAgICAgICAgICBtZXNzYWdlX2RlZmluaXRpb24uc3ltYm9sLAorICAgICAgICAgICAgbWVzc2FnZV9kZWZpbml0aW9uLm9sZF9uYW1lcywKKyAgICAgICAgKQorICAgICAgICBpZiBtZXNzYWdlX2RlZmluaXRpb24ub2xkX25hbWVzOgorICAgICAgICAgICAgbnVtYmVyX29mX21zZ2lkICs9IGxlbihtZXNzYWdlX2RlZmluaXRpb24ub2xkX25hbWVzKQorICAgIGFzc2VydCBsZW4oZW1wdHlfbXNnaWRfc3RvcmUpID09IG51bWJlcl9vZl9tc2dpZAorCisKK2RlZiB0ZXN0X2FkZF9tc2dpZF9hbmRfc3ltYm9sKGVtcHR5X21zZ2lkX3N0b3JlKToKKyAgICBlbXB0eV9tc2dpZF9zdG9yZS5hZGRfbXNnaWRfYW5kX3N5bWJvbCgiRTEyMzUiLCAibmV3LXNja2lpbCIpCisgICAgZW1wdHlfbXNnaWRfc3RvcmUuYWRkX2xlZ2FjeV9tc2dpZF9hbmRfc3ltYm9sKCJDMTIzNSIsICJvbGQtc2NraWlsIiwgIkUxMjM1IikKKyAgICBhc3NlcnQgbGVuKGVtcHR5X21zZ2lkX3N0b3JlKSA9PSAyCisgICAgbWVzc2FnZV9pZHMgPSBlbXB0eV9tc2dpZF9zdG9yZS5nZXRfYWN0aXZlX21zZ2lkcygiRTEyMzUiKQorICAgIGFzc2VydCBsZW4obWVzc2FnZV9pZHMpID09IDEKKyAgICBhc3NlcnQgbWVzc2FnZV9pZHNbMF0gPT0gIkUxMjM1IgorICAgIG1lc3NhZ2VfaWRzID0gZW1wdHlfbXNnaWRfc3RvcmUuZ2V0X2FjdGl2ZV9tc2dpZHMoIm9sZC1zY2tpaWwiKQorICAgIGFzc2VydCBsZW4obWVzc2FnZV9pZHMpID09IDEKKyAgICBhc3NlcnQgbWVzc2FnZV9pZHNbMF0gPT0gIkUxMjM1IgorICAgIGFzc2VydCBlbXB0eV9tc2dpZF9zdG9yZS5nZXRfc3ltYm9sKCJDMTIzNSIpID09ICJvbGQtc2NraWlsIgorICAgIGFzc2VydCBlbXB0eV9tc2dpZF9zdG9yZS5nZXRfc3ltYm9sKCJFMTIzNSIpID09ICJuZXctc2NraWlsIgorICAgIGFzc2VydCBlbXB0eV9tc2dpZF9zdG9yZS5nZXRfbXNnaWQoIm9sZC1zY2tpaWwiKSA9PSAiQzEyMzUiCisgICAgYXNzZXJ0IGVtcHR5X21zZ2lkX3N0b3JlLmdldF9tc2dpZCgibmV3LXNja2lpbCIpID09ICJFMTIzNSIKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoVW5rbm93bk1lc3NhZ2VFcnJvcik6CisgICAgICAgIGVtcHR5X21zZ2lkX3N0b3JlLmdldF9zeW1ib2woIkMxMjM0IikKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoVW5rbm93bk1lc3NhZ2VFcnJvcik6CisgICAgICAgIGVtcHR5X21zZ2lkX3N0b3JlLmdldF9tc2dpZCgibm90LWV4aXN0IikKKworCitkZWYgdGVzdF9kdXBsaWNhdGVfc3ltYm9sKGVtcHR5X21zZ2lkX3N0b3JlKToKKyAgICBlbXB0eV9tc2dpZF9zdG9yZS5hZGRfbXNnaWRfYW5kX3N5bWJvbCgiVzEyMzQiLCAid2FybmluZy1zeW1ib2wiKQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkTWVzc2FnZUVycm9yKSBhcyBlcnJvcjoKKyAgICAgICAgZW1wdHlfbXNnaWRfc3RvcmUuY2hlY2tfbXNnaWRfYW5kX3N5bWJvbCgiVzEyMzQiLCAib3RoZXItc3ltYm9sIikKKyAgICBhc3NlcnQgKAorICAgICAgICAiTWVzc2FnZSBpZCAnVzEyMzQnIGNhbm5vdCBoYXZlIGJvdGggJ290aGVyLXN5bWJvbCcgYW5kICd3YXJuaW5nLXN5bWJvbCcgYXMgc3ltYm9saWMgbmFtZS4iCisgICAgICAgIGluIHN0cihlcnJvci52YWx1ZSkKKyAgICApCisKKworZGVmIHRlc3RfZHVwbGljYXRlX21zZ2lkKG1zZ2lkX3N0b3JlKToKKyAgICBtc2dpZF9zdG9yZS5hZGRfbXNnaWRfYW5kX3N5bWJvbCgiVzEyMzQiLCAid2FybmluZy1zeW1ib2wiKQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkTWVzc2FnZUVycm9yKSBhcyBlcnJvcjoKKyAgICAgICAgbXNnaWRfc3RvcmUuY2hlY2tfbXNnaWRfYW5kX3N5bWJvbCgiVzEyMzUiLCAid2FybmluZy1zeW1ib2wiKQorICAgIGFzc2VydCAoCisgICAgICAgICJNZXNzYWdlIHN5bWJvbCAnd2FybmluZy1zeW1ib2wnIGNhbm5vdCBiZSB1c2VkIGZvciAnVzEyMzQnIGFuZCAnVzEyMzUnIgorICAgICAgICBpbiBzdHIoZXJyb3IudmFsdWUpCisgICAgKQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvYnVpbHRpbl9tb2R1bGUudHh0IGIvdGVzdHMvbWVzc2FnZXMvYnVpbHRpbl9tb2R1bGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTZjMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9idWlsdGluX21vZHVsZS50eHQKQEAgLTAsMCArMSBAQAorRjogIDE6IGlnbm9yZWQgYnVpbHRpbiBtb2R1bGUgc3lzCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jXzNrX3JlbW92ZWRfc3R1ZmZfcHlfMzAudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY18za19yZW1vdmVkX3N0dWZmX3B5XzMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTIwZjFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY18za19yZW1vdmVkX3N0dWZmX3B5XzMwLnR4dApAQCAtMCwwICsxLDIgQEAKK0U6IDEyOmZ1bmN0aW9uOiBJbnN0YW5jZSBvZiAndW5pY29kZScgaGFzIG5vICdsb29vd2VyJyBtZW1iZXIKK1c6ICA0OiBSZWxhdGl2ZSBpbXBvcnQgJ2Z1bmNfdzA0MDEnLCBzaG91bGQgYmUgJ2lucHV0LmZ1bmNfdzA0MDEnCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2JhZF9jb250X2RpY3Rjb21wX3B5MjcudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY19iYWRfY29udF9kaWN0Y29tcF9weTI3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJkZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY19iYWRfY29udF9kaWN0Y29tcF9weTI3LnR4dApAQCAtMCwwICsxLDYgQEAKK0M6IDM1OiBXcm9uZyBjb250aW51ZWQgaW5kZW50YXRpb24gKGFkZCAyIHNwYWNlcykuCisgICAgZm9yIHggaW4gcmFuZ2UoMyl9ICAjIFtiYWQtY29udGludWF0aW9uXQorICAgIF4gfAorQzogMzg6IFdyb25nIGNvbnRpbnVlZCBpbmRlbnRhdGlvbiAocmVtb3ZlIDQgc3BhY2VzKS4KKyAgICAgICAgICBmb3IgeCBpbiByYW5nZSgzKX0gICMgW2JhZC1jb250aW51YXRpb25dCisgICAgICB8ICAgXgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY19idWcxMTMyMzEudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY19idWcxMTMyMzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNWYxNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2J1ZzExMzIzMS50eHQKQEAgLTAsMCArMSwyIEBACitXOiAyMDogVXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCitXOiAyMTogVXNlIGxhenkgJSBmb3JtYXR0aW5nIGluIGxvZ2dpbmcgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2Rpc2FibGVfbGluZWJhc2VkLnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfZGlzYWJsZV9saW5lYmFzZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTM5MWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2Rpc2FibGVfbGluZWJhc2VkLnR4dApAQCAtMCwwICsxLDIgQEAKK0M6ICAxOiBMaW5lIHRvbyBsb25nICgxMjcvMTAwKQorQzogMTQ6IExpbmUgdG9vIGxvbmcgKDExNC8xMDApCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2Rpc2FibGVfbGluZWJhc2VkX3B5MzAudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY19kaXNhYmxlX2xpbmViYXNlZF9weTMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmUzOTFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY19kaXNhYmxlX2xpbmViYXNlZF9weTMwLnR4dApAQCAtMCwwICsxLDIgQEAKK0M6ICAxOiBMaW5lIHRvbyBsb25nICgxMjcvMTAwKQorQzogMTQ6IExpbmUgdG9vIGxvbmcgKDExNC8xMDApCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDExLnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfaTAwMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOWYyMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDExLnR4dApAQCAtMCwwICsxLDMgQEAKK0k6ICAxOiAnVzA0MDQnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGRpc2FibGU9cmVpbXBvcnRlZCcgaW5zdGVhZAorSTogIDE6IExvY2FsbHkgZGlzYWJsaW5nIHJlaW1wb3J0ZWQgKFcwNDA0KQorSTogIDE6IFVzZWxlc3Mgc3VwcHJlc3Npb24gb2YgJ3JlaW1wb3J0ZWQnCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDEyLnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfaTAwMTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTQ3NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDEyLnR4dApAQCAtMCwwICsxIEBACitJOiAgMTogJ1cwNDA0JyBpcyBjcnlwdGljOiB1c2UgJyMgcHlsaW50OiBlbmFibGU9cmVpbXBvcnRlZCcgaW5zdGVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY19pMDAxMy50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDEzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQ3YWZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY19pMDAxMy50eHQKQEAgLTAsMCArMSBAQAorSTogIDE6IElnbm9yaW5nIGVudGlyZSBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDE0LnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfaTAwMTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjUyMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDE0LnR4dApAQCAtMCwwICsxLDIgQEAKK0k6ICAxOiBJZ25vcmluZyBlbnRpcmUgZmlsZQorSTogIDE6IFByYWdtYSAiZGlzYWJsZS1hbGwiIGlzIGRlcHJlY2F0ZWQsIHVzZSAic2tpcC1maWxlIiBpbnN0ZWFkCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDIwLnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfaTAwMjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTc4YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX2kwMDIwLnR4dApAQCAtMCwwICsxLDMgQEAKK0k6ICA3OiAnVzA2MTInIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLXZhcmlhYmxlJyBpbnN0ZWFkCitJOiAgNzogTG9jYWxseSBkaXNhYmxpbmcgdW51c2VkLXZhcmlhYmxlIChXMDYxMikKK0k6ICA4OiBTdXBwcmVzc2VkICd1bnVzZWQtdmFyaWFibGUnIChmcm9tIGxpbmUgNykKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfaTAwMjIudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY19pMDAyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwOGZiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfaTAwMjIudHh0CkBAIC0wLDAgKzEsMjEgQEAKK0k6ICA1OiBMb2NhbGx5IGRpc2FibGluZyBpbnZhbGlkLW5hbWUgKEMwMTAzKQorSTogIDU6IFN1cHByZXNzZWQgJ2ludmFsaWQtbmFtZScgKGZyb20gbGluZSA1KQorSTogIDY6IExvY2FsbHkgZGlzYWJsaW5nIGludmFsaWQtbmFtZSAoQzAxMDMpCitJOiAgNjogUHJhZ21hICJkaXNhYmxlLW1zZyIgaXMgZGVwcmVjYXRlZCwgdXNlICJkaXNhYmxlIiBpbnN0ZWFkCitJOiAgNjogU3VwcHJlc3NlZCAnaW52YWxpZC1uYW1lJyAoZnJvbSBsaW5lIDYpCitJOiAgODogTG9jYWxseSBkaXNhYmxpbmcgaW52YWxpZC1uYW1lIChDMDEwMykKK0k6ICA5OiBTdXBwcmVzc2VkICdpbnZhbGlkLW5hbWUnIChmcm9tIGxpbmUgOCkKK0k6IDEyOiBMb2NhbGx5IGRpc2FibGluZyBpbnZhbGlkLW5hbWUgKEMwMTAzKQorSTogMTI6IFByYWdtYSAiZGlzYWJsZS1tc2ciIGlzIGRlcHJlY2F0ZWQsIHVzZSAiZGlzYWJsZSIgaW5zdGVhZAorSTogMTM6IFN1cHByZXNzZWQgJ2ludmFsaWQtbmFtZScgKGZyb20gbGluZSAxMikKK0k6IDE0OiBQcmFnbWEgImVuYWJsZS1tc2ciIGlzIGRlcHJlY2F0ZWQsIHVzZSAiZW5hYmxlIiBpbnN0ZWFkCitJOiAxNjogJ0MwMTAzJyBpcyBjcnlwdGljOiB1c2UgJyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZScgaW5zdGVhZAorSTogMTY6IExvY2FsbHkgZGlzYWJsaW5nIGludmFsaWQtbmFtZSAoQzAxMDMpCitJOiAxNjogUHJhZ21hICJkaXNhYmxlLW1zZyIgaXMgZGVwcmVjYXRlZCwgdXNlICJkaXNhYmxlIiBpbnN0ZWFkCitJOiAxNzogU3VwcHJlc3NlZCAnaW52YWxpZC1uYW1lJyAoZnJvbSBsaW5lIDE2KQorSTogMTg6ICdDMDEwMycgaXMgY3J5cHRpYzogdXNlICcjIHB5bGludDogZW5hYmxlPWludmFsaWQtbmFtZScgaW5zdGVhZAorSTogMTg6IFByYWdtYSAiZW5hYmxlLW1zZyIgaXMgZGVwcmVjYXRlZCwgdXNlICJlbmFibGUiIGluc3RlYWQKK0k6IDIwOiAnQzAxMDMnIGlzIGNyeXB0aWM6IHVzZSAnIyBweWxpbnQ6IGRpc2FibGU9aW52YWxpZC1uYW1lJyBpbnN0ZWFkCitJOiAyMDogTG9jYWxseSBkaXNhYmxpbmcgaW52YWxpZC1uYW1lIChDMDEwMykKK0k6IDIxOiBTdXBwcmVzc2VkICdpbnZhbGlkLW5hbWUnIChmcm9tIGxpbmUgMjApCitJOiAyMjogJ0MwMTAzJyBpcyBjcnlwdGljOiB1c2UgJyMgcHlsaW50OiBlbmFibGU9aW52YWxpZC1uYW1lJyBpbnN0ZWFkCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX3Jhd19lc2NhcGVzLnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfcmF3X2VzY2FwZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MWZiYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3Jhd19lc2NhcGVzLnR4dApAQCAtMCwwICsxLDMgQEAKK1c6ICA1OiBBbm9tYWxvdXMgVW5pY29kZSBlc2NhcGUgaW4gYnl0ZSBzdHJpbmc6ICdcdScuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgb3IgdSBwcmVmaXguCitXOiAgNjogQW5vbWFsb3VzIFVuaWNvZGUgZXNjYXBlIGluIGJ5dGUgc3RyaW5nOiAnXFUnLiBTdHJpbmcgY29uc3RhbnQgbWlnaHQgYmUgbWlzc2luZyBhbiByIG9yIHUgcHJlZml4LgorVzogIDc6IEFub21hbG91cyBVbmljb2RlIGVzY2FwZSBpbiBieXRlIHN0cmluZzogJ1xOJy4gU3RyaW5nIGNvbnN0YW50IG1pZ2h0IGJlIG1pc3NpbmcgYW4gciBvciB1IHByZWZpeC4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfcmV0dXJuX3lpZWxkX21peF9weV8zMy50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3JldHVybl95aWVsZF9taXhfcHlfMzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MWNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3JldHVybl95aWVsZF9taXhfcHlfMzMudHh0CkBAIC0wLDAgKzEsMiBAQAorRTogIDY6c29tZWdlbjogUmV0dXJuIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvcgorRTogMTU6bW9yZWdlbjogUmV0dXJuIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY190b29sb25nbGluZXNfcHkzMC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3Rvb2xvbmdsaW5lc19weTMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDU5NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY190b29sb25nbGluZXNfcHkzMC50eHQKQEAgLTAsMCArMSw0IEBACitDOiAgMTogTGluZSB0b28gbG9uZyAoMTAxLzEwMCkKK0M6ICAyOiBMaW5lIHRvbyBsb25nICgxMDQvMTAwKQorQzogMTc6IExpbmUgdG9vIGxvbmcgKDEwMi8xMDApCitDOiAyNTogTGluZSB0b28gbG9uZyAoMTA1LzEwMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdHlwZWNoZWNrX2NhbGxmdW5jX2Fzc2lnbWVudC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3R5cGVjaGVja19jYWxsZnVuY19hc3NpZ21lbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjU3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3R5cGVjaGVja19jYWxsZnVuY19hc3NpZ21lbnQudHh0CkBAIC0wLDAgKzEsMyBAQAorRTogMTg6IEFzc2lnbmluZyByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCB3aGVyZSB0aGUgZnVuY3Rpb24gaGFzIG5vIHJldHVybgorRTogMjY6IEFzc2lnbmluZyByZXN1bHQgb2YgYSBmdW5jdGlvbiBjYWxsLCB3aGVyZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBOb25lCitFOiAzMzogQXNzaWduaW5nIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIHdoZXJlIHRoZSBmdW5jdGlvbiByZXR1cm5zIE5vbmUKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdHlwZWNoZWNrX2dldGF0dHJfcHkzMC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3R5cGVjaGVja19nZXRhdHRyX3B5MzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmYxNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3R5cGVjaGVja19nZXRhdHRyX3B5MzAudHh0CkBAIC0wLDAgKzEsOSBAQAorRTogMjU6Q2xpZW50Ll9faW5pdF9fOiBDbGFzcyAnUHJvdmlkZXInIGhhcyBubyAnY2F0dHJpYnV0ZScgbWVtYmVyCitFOiAzNTpDbGllbnQudXNlX21ldGhvZDogSW5zdGFuY2Ugb2YgJ1Byb3ZpZGVyJyBoYXMgbm8gJ2hvcGhvcGhvcCcgbWVtYmVyCitFOiA0MDpDbGllbnQudXNlX2F0dHI6IEluc3RhbmNlIG9mICdQcm92aWRlcicgaGFzIG5vICdhdHRyaWJ1dGUnIG1lbWJlcgorRTogNTI6Q2xpZW50LnRlc3RfYnRfdHlwZXM6IEluc3RhbmNlIG9mICdsaXN0JyBoYXMgbm8gJ2FwcHBlbmQnIG1lbWJlcgorRTogNTQ6Q2xpZW50LnRlc3RfYnRfdHlwZXM6IEluc3RhbmNlIG9mICdkaWN0JyBoYXMgbm8gJ3NldCcgbWVtYmVyCitFOiA1NjpDbGllbnQudGVzdF9idF90eXBlczogSW5zdGFuY2Ugb2YgJ3R1cGxlJyBoYXMgbm8gJ2FwcGVuZCcgbWVtYmVyCitFOiA1ODpDbGllbnQudGVzdF9idF90eXBlczogSW5zdGFuY2Ugb2YgJ3N0cicgaGFzIG5vICdsb293ZXInIG1lbWJlcgorRTogNjI6Q2xpZW50LnRlc3RfYnRfdHlwZXM6IEluc3RhbmNlIG9mICdpbnQnIGhhcyBubyAnd2hhdGV2ZXInIG1lbWJlcgorRTogNjY6IEluc3RhbmNlIG9mICdpbnQnIGhhcyBubyAnbG93ZXInIG1lbWJlciAoYnV0IHNvbWUgdHlwZXMgY291bGQgbm90IGJlIGluZmVycmVkKQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY190eXBlY2hlY2tfbm9uX2NhbGxhYmxlX2NhbGwudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY190eXBlY2hlY2tfbm9uX2NhbGxhYmxlX2NhbGwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTg5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3R5cGVjaGVja19ub25fY2FsbGFibGVfY2FsbC50eHQKQEAgLTAsMCArMSw4IEBACitFOiAxMDogX19yZXZpc2lvbl9fIGlzIG5vdCBjYWxsYWJsZQorRTogMjk6IElOU1RBTkNFIGlzIG5vdCBjYWxsYWJsZQorRTogMzE6IExJU1QgaXMgbm90IGNhbGxhYmxlCitFOiAzMzogRElDVCBpcyBub3QgY2FsbGFibGUKK0U6IDM1OiBUVVBMRSBpcyBub3QgY2FsbGFibGUKK0U6IDM3OiBJTlQgaXMgbm90IGNhbGxhYmxlCitFOiA3MjogUFJPUC50ZXN0IGlzIG5vdCBjYWxsYWJsZQorRTogNzM6IFBST1AuY3VzdG9tIGlzIG5vdCBjYWxsYWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY191bmljb2RlX2xpdGVyYWxfcHkyNi50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3VuaWNvZGVfbGl0ZXJhbF9weTI2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY191bmljb2RlX2xpdGVyYWxfcHkyNi50eHQKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdW5pY29kZV9saXRlcmFsX3B5Mjc0LnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdW5pY29kZV9saXRlcmFsX3B5Mjc0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWVmYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY191bmljb2RlX2xpdGVyYWxfcHkyNzQudHh0CkBAIC0wLDAgKzEgQEAKK1c6ICA2OiBBbm9tYWxvdXMgVW5pY29kZSBlc2NhcGUgaW4gYnl0ZSBzdHJpbmc6ICdcdScuIFN0cmluZyBjb25zdGFudCBtaWdodCBiZSBtaXNzaW5nIGFuIHIgb3IgdSBwcmVmaXguCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX3VzZV9mb3Jfb3JfbGlzdGNvbXBfdmFyX3B5MjkudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY191c2VfZm9yX29yX2xpc3Rjb21wX3Zhcl9weTI5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI3YjUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY191c2VfZm9yX29yX2xpc3Rjb21wX3Zhcl9weTI5LnR4dApAQCAtMCwwICsxLDIgQEAKK1c6ICA2OiBVc2luZyBwb3NzaWJseSB1bmRlZmluZWQgbG9vcCB2YXJpYWJsZSAnQycKK1c6IDE1OiBVc2luZyBwb3NzaWJseSB1bmRlZmluZWQgbG9vcCB2YXJpYWJsZSAndmFyMScKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdXNlX2Zvcl9vcl9saXN0Y29tcF92YXJfcHkzMC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3VzZV9mb3Jfb3JfbGlzdGNvbXBfdmFyX3B5MzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTg1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3VzZV9mb3Jfb3JfbGlzdGNvbXBfdmFyX3B5MzAudHh0CkBAIC0wLDAgKzEsMiBAQAorRTogIDY6IFVzaW5nIHZhcmlhYmxlICdDJyBiZWZvcmUgYXNzaWdubWVudAorVzogMTU6IFVzaW5nIHBvc3NpYmx5IHVuZGVmaW5lZCBsb29wIHZhcmlhYmxlICd2YXIxJwpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY192YXJpYWJsZXNfdW51c2VkX25hbWVfZnJvbV93aWxjYXJkX2ltcG9ydC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3ZhcmlhYmxlc191bnVzZWRfbmFtZV9mcm9tX3dpbGNhcmRfaW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWM1N2FmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY192YXJpYWJsZXNfdW51c2VkX25hbWVfZnJvbV93aWxjYXJkX2ltcG9ydC50eHQKQEAgLTAsMCArMSw0IEBACitXOiAgMzogVW51c2VkIGltcG9ydCBOb25SZWdyIGZyb20gd2lsZGNhcmQgaW1wb3J0CitXOiAgMzogVW51c2VkIGltcG9ydCBvcyBmcm9tIHdpbGRjYXJkIGltcG9ydAorVzogIDM6IFVudXNlZCBpbXBvcnQgc3lzIGZyb20gd2lsZGNhcmQgaW1wb3J0CitXOiAgMzogV2lsZGNhcmQgaW1wb3J0IGlucHV0LmZ1bmNfdzA2MTEKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzAxMjJfcHlfMzAudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDEyMl9weV8zMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxNjM2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzAxMjJfcHlfMzAudHh0CkBAIC0wLDAgKzEsNCBAQAorVzogIDU6IFVzZSBvZiBleGVjCitXOiAgNjogVXNlIG9mIGV4ZWMKK1c6ICA4OiBVc2Ugb2YgZXhlYworVzogMTI6ZnVuYzogVXNlIG9mIGV4ZWMKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzAzMTIudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDMxMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3ZThkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzAzMTIudHh0CkBAIC0wLDAgKzEsMiBAQAorVzogMTA6IEZvdW5kIGluZGVudGF0aW9uIHdpdGggdGFicyBpbnN0ZWFkIG9mIHNwYWNlcworVzogMTE6IEZvdW5kIGluZGVudGF0aW9uIHdpdGggdGFicyBpbnN0ZWFkIG9mIHNwYWNlcwpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY193MDMzMl9weV8zMC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwMzMyX3B5XzMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYxZDgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDMzMl9weV8zMC50eHQKQEAgLTAsMCArMSBAQAorVzogIDQ6IFVzZSBvZiAibCIgYXMgbG9uZyBpbnRlZ2VyIGlkZW50aWZpZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzA0MDEudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDQwMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NDhmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzA0MDEudHh0CkBAIC0wLDAgKzEsMyBAQAorUjogIDE6IEN5Y2xpYyBpbXBvcnQgKGlucHV0LmZ1bmNfdzA0MDEgLT4gaW5wdXQudzA0MDFfY3ljbGUpCitXOiAgODogVXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCitXOiAgODogVXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNDAxX2Rpc2FibGVkLnR4dCBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzA0MDFfZGlzYWJsZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YThkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNDAxX2Rpc2FibGVkLnR4dApAQCAtMCwwICsxLDIgQEAKK1c6ICA4OiBVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKK1c6ICA4OiBVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzA0MDFfZGlzYWJsZWRfaW5fZnVuYy50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNDAxX2Rpc2FibGVkX2luX2Z1bmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2U0NTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNDAxX2Rpc2FibGVkX2luX2Z1bmMudHh0CkBAIC0wLDAgKzEsMiBAQAorVzogIDg6IFVzaW5nIGEgY29uZGl0aW9uYWwgc3RhdGVtZW50IHdpdGggYSBjb25zdGFudCB2YWx1ZQorVzogMTA6ZnVuYzogVXNpbmcgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgd2l0aCBhIGNvbnN0YW50IHZhbHVlCmRpZmYgLS1naXQgYS90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNDAxX3BhY2thZ2UudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDQwMV9wYWNrYWdlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA1MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDQwMV9wYWNrYWdlLnR4dApAQCAtMCwwICsxLDIgQEAKK1I6ICAxOiBDeWNsaWMgaW1wb3J0IChpbnB1dC5mdW5jX3cwNDAxX3BhY2thZ2UuYWxsX3RoZV90aGluZ3MgLT4gaW5wdXQuZnVuY193MDQwMV9wYWNrYWdlLnRoaW5nMikKK1c6ICA4OiBVc2luZyBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB3aXRoIGEgY29uc3RhbnQgdmFsdWUKZGlmZiAtLWdpdCBhL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzA2MjIudHh0IGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDYyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MTM0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lc3NhZ2VzL2Z1bmNfdzA2MjIudHh0CkBAIC0wLDAgKzEsMiBAQAorVzogIDg6ZnVuY3Rpb246IFJlZGVmaW5pbmcgYnVpbHQtaW4gJ3R5cGUnCitXOiAxMTogUmVkZWZpbmluZyBidWlsdC1pbiAnbWFwJwpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY193MDYyMy50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNjIzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGZlOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDYyMy50eHQKQEAgLTAsMCArMSwxMSBAQAorQzogMjg6c29tZV9mdW5jdGlvbjogVmFyaWFibGUgbmFtZSAiRk9PIiBkb2Vzbid0IGNvbmZvcm0gdG8gJ3ZhcmlhYmxlLW5hbWUtaGludCcgdGVtcGxhdGUKK0M6IDQxOiBDb25zdGFudCBuYW1lICJleGMzIiBkb2Vzbid0IGNvbmZvcm0gdG8gJ2NvbnN0YW50LW5hbWUtaGludCcgdGVtcGxhdGUKK0M6IDU1OiBWYXJpYWJsZSBuYW1lICJPT1BTIiBkb2Vzbid0IGNvbmZvcm0gdG8gJ3ZhcmlhYmxlLW5hbWUtaGludCcgdGVtcGxhdGUKK1c6IDE4OnNvbWVfZnVuY3Rpb246IFJlZGVmaW5pbmcgbmFtZSAnUnVudGltZUVycm9yJyBmcm9tIG9iamVjdCAnZXhjZXB0aW9ucycgaW4gZXhjZXB0aW9uIGhhbmRsZXIKK1c6IDIwOnNvbWVfZnVuY3Rpb246IFJlZGVmaW5pbmcgbmFtZSAnT1NFcnJvcicgZnJvbSBidWlsdGlucyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogMjA6c29tZV9mdW5jdGlvbjogVW51c2VkIHZhcmlhYmxlICdPU0Vycm9yJworVzogMjI6c29tZV9mdW5jdGlvbjogUmVkZWZpbmluZyBuYW1lICdNeUVycm9yJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDcpIGluIGV4Y2VwdGlvbiBoYW5kbGVyCitXOiAyMjpzb21lX2Z1bmN0aW9uOiBVbnVzZWQgdmFyaWFibGUgJ015RXJyb3InCitXOiA0NTogUmVkZWZpbmluZyBuYW1lICdSdW50aW1lRXJyb3InIGZyb20gb2JqZWN0ICdleGNlcHRpb25zJyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogNDc6IFJlZGVmaW5pbmcgbmFtZSAnT1NFcnJvcicgZnJvbSBidWlsdGlucyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogNDk6IFJlZGVmaW5pbmcgbmFtZSAnTXlPdGhlckVycm9yJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDM2KSBpbiBleGNlcHRpb24gaGFuZGxlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY193MDYyM19weV8zMC50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwNjIzX3B5XzMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMyOWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDYyM19weV8zMC50eHQKQEAgLTAsMCArMSwxMiBAQAorQzogMjg6c29tZV9mdW5jdGlvbjogVmFyaWFibGUgbmFtZSAiRk9PIiBkb2Vzbid0IGNvbmZvcm0gdG8gJ3ZhcmlhYmxlLW5hbWUtaGludCcgdGVtcGxhdGUKK0M6IDQxOiBDb25zdGFudCBuYW1lICJleGMzIiBkb2Vzbid0IGNvbmZvcm0gdG8gJ2NvbnN0YW50LW5hbWUtaGludCcgdGVtcGxhdGUKK0M6IDU3OiBWYXJpYWJsZSBuYW1lICJPT1BTIiBkb2Vzbid0IGNvbmZvcm0gdG8gJ3ZhcmlhYmxlLW5hbWUtaGludCcgdGVtcGxhdGUKK1c6IDE4OnNvbWVfZnVuY3Rpb246IFJlZGVmaW5pbmcgbmFtZSAnUnVudGltZUVycm9yJyBmcm9tIG9iamVjdCAnZXhjZXB0aW9ucycgaW4gZXhjZXB0aW9uIGhhbmRsZXIKK1c6IDIwOnNvbWVfZnVuY3Rpb246IFJlZGVmaW5pbmcgbmFtZSAnT1NFcnJvcicgZnJvbSBidWlsdGlucyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogMjA6c29tZV9mdW5jdGlvbjogVW51c2VkIHZhcmlhYmxlICdPU0Vycm9yJworVzogMjI6c29tZV9mdW5jdGlvbjogUmVkZWZpbmluZyBuYW1lICdNeUVycm9yJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDcpIGluIGV4Y2VwdGlvbiBoYW5kbGVyCitXOiAyMjpzb21lX2Z1bmN0aW9uOiBVbnVzZWQgdmFyaWFibGUgJ015RXJyb3InCitXOiA0NTogUmVkZWZpbmluZyBuYW1lICdSdW50aW1lRXJyb3InIGZyb20gb2JqZWN0ICdleGNlcHRpb25zJyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogNDc6IFJlZGVmaW5pbmcgbmFtZSAnYXJncycgZnJvbSBvYmplY3QgJ2V4Y2VwdGlvbnMuUnVudGltZUVycm9yJyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogNDk6IFJlZGVmaW5pbmcgbmFtZSAnT1NFcnJvcicgZnJvbSBidWlsdGlucyBpbiBleGNlcHRpb24gaGFuZGxlcgorVzogNTE6IFJlZGVmaW5pbmcgbmFtZSAnTXlPdGhlckVycm9yJyBmcm9tIG91dGVyIHNjb3BlIChsaW5lIDM2KSBpbiBleGNlcHRpb24gaGFuZGxlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY193MDgwMS50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3cwODAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNjZTkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY193MDgwMS50eHQKQEAgLTAsMCArMSwxMSBAQAorUjogIDE6IFNpbWlsYXIgbGluZXMgaW4gMiBmaWxlcworPT1pbnB1dC5mdW5jX3cwODAxOjMKKz09aW5wdXQudzA4MDFfc2FtZTozCitfX3JldmlzaW9uX18gPSAnaWQnCitBID0gMgorQiA9IDMKK0MgPSBBICsgQgorIyBuZWVkIG1vcmUgdGhhbiBYIGxpbmVzIHRvIHRyaWdnZXIgdGhlIG1lc3NhZ2UKK0MgKj0gMgorQSAtPSBCCisjIGFsbCB0aGlzIHNob3VsZCBiZSBkZXRlY3RlZApkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzc2FnZXMvZnVuY193aXRoX3dpdGhvdXRfYXNfcHkyNS50eHQgYi90ZXN0cy9tZXNzYWdlcy9mdW5jX3dpdGhfd2l0aG91dF9hc19weTI1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjJiNjliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVzc2FnZXMvZnVuY193aXRoX3dpdGhvdXRfYXNfcHkyNS50eHQKQEAgLTAsMCArMSwyIEBACitFOiAxMTpkb19ub3RoaW5nOiBVc2luZyB2YXJpYWJsZSAnYmFzZScgYmVmb3JlIGFzc2lnbm1lbnQKK1c6IDExOmRvX25vdGhpbmc6IFN0YXRlbWVudCBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdApkaWZmIC0tZ2l0IGEvdGVzdHMvcHJvZmlsZS90ZXN0X3Byb2ZpbGVfYWdhaW5zdF9leHRlcm5hbHMucHkgYi90ZXN0cy9wcm9maWxlL3Rlc3RfcHJvZmlsZV9hZ2FpbnN0X2V4dGVybmFscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODYwNDExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJvZmlsZS90ZXN0X3Byb2ZpbGVfYWdhaW5zdF9leHRlcm5hbHMucHkKQEAgLTAsMCArMSw1NyBAQAorIiIiIFByb2ZpbGVzIGJhc2ljIC1qWCBmdW5jdGlvbmFsaXR5ICIiIgorIyBDb3B5cmlnaHQgKGMpIDIwMjAtMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEZyYW5rIEhhcnJpc29uIDxmcmFua0Bkb3VibGV0aGVmaXNoLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzLG1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nLG5vLXNlbGYtdXNlCisKK2ltcG9ydCBvcworaW1wb3J0IHBwcmludAorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IFJ1bgorZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBHZW5lcmljVGVzdFJlcG9ydGVyIGFzIFJlcG9ydGVyCisKKworZGVmIF9nZXRfcHlfZmlsZXMoc2NhbnBhdGgpOgorICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhzY2FucGF0aCksICJEaXIgbm90IGZvdW5kICVzIiAlIHNjYW5wYXRoCisKKyAgICBmaWxlcGF0aHMgPSBbXQorICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoc2NhbnBhdGgpOgorICAgICAgICBkaXJuYW1lc1s6XSA9IFtkaXJuYW1lIGZvciBkaXJuYW1lIGluIGRpcm5hbWVzIGlmIGRpcm5hbWUgIT0gIl9fcHljYWNoZV9fIl0KKyAgICAgICAgZmlsZXBhdGhzLmV4dGVuZCgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lcworICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIucHkiKQorICAgICAgICAgICAgXQorICAgICAgICApCisgICAgcmV0dXJuIGZpbGVwYXRocworCisKK0BweXRlc3QubWFyay5za2lwaWYoCisgICAgbm90IG9zLmVudmlyb24uZ2V0KCJQWVRFU1RfUFJPRklMRV9FWFRFUk5BTCIsIEZhbHNlKSwKKyAgICByZWFzb249IlBZVEVTVF9QUk9GSUxFX0VYVEVSTkFMLCBub3Qgc2V0LCBhc3N1bWluZyBub3QgYSBwcm9maWxlIHJ1biIsCispCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgIm5hbWUsZ2l0X3JlcG8iLCBbKCJudW1weSIsICJodHRwczovL2dpdGh1Yi5jb20vbnVtcHkvbnVtcHkuZ2l0IildCispCitkZWYgdGVzdF9ydW4odG1wX3BhdGgsIG5hbWUsIGdpdF9yZXBvKToKKyAgICAiIiJSdW5zIHB5bGludCBhZ2FpbnN0IGV4dGVybmFsIHNvdXJjZXMiIiIKKyAgICBjaGVja291dGRpciA9IHRtcF9wYXRoIC8gbmFtZQorICAgIGNoZWNrb3V0ZGlyLm1rZGlyKCkKKyAgICBvcy5zeXN0ZW0oZiJnaXQgY2xvbmUgLS1kZXB0aD0xIHtnaXRfcmVwb30ge2NoZWNrb3V0ZGlyfSIpCisgICAgZmlsZXBhdGhzID0gX2dldF9weV9maWxlcyhzY2FucGF0aD1zdHIoY2hlY2tvdXRkaXIpKQorICAgIHByaW50KCJIYXZlICVkIGZpbGVzIiAlIGxlbihmaWxlcGF0aHMpKQorCisgICAgcnVubmVyID0gUnVuKGZpbGVwYXRocywgcmVwb3J0ZXI9UmVwb3J0ZXIoKSwgZG9fZXhpdD1GYWxzZSkKKworICAgIHByaW50KAorICAgICAgICAiSGFkICVkIGZpbGVzIHdpdGggJWQgbWVzc2FnZXMiCisgICAgICAgICUgKGxlbihmaWxlcGF0aHMpLCBsZW4ocnVubmVyLmxpbnRlci5yZXBvcnRlci5tZXNzYWdlcykpCisgICAgKQorICAgIHBwcmludC5wcHJpbnQocnVubmVyLmxpbnRlci5yZXBvcnRlci5tZXNzYWdlcykKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvLnB5bGludHJjIGIvdGVzdHMvcmVncnRlc3RfZGF0YS8ucHlsaW50cmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxMzAzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvLnB5bGludHJjCkBAIC0wLDAgKzEsMyBAQAor77u/W01BU1RFUl0KKworb3B0aW1pemUtYXN0PW5vCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2Fic2ltcC9fX2luaXRfXy5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYWJzaW1wL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYWJlOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2Fic2ltcC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQgQEAKKyIiImEgcGFja2FnZSB3aXRoIGFic29sdXRlIGltcG9ydCBhY3RpdmF0ZWQKKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9hYnNpbXAvc3RyaW5nLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9hYnNpbXAvc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjBlMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2Fic2ltcC9zdHJpbmcucHkKQEAgLTAsMCArMSw3IEBACisiIiIKK2h0dHBzOi8vd3d3LmxvZ2lsYWIub3JnL3RpY2tldC83MDQ5NQoraHR0cHM6Ly93d3cubG9naWxhYi5vcmcvdGlja2V0LzcwNTY1CisiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN0cmluZworcHJpbnQoc3RyaW5nKQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9hcHBsaWNhdGlvbl9jcmFzaC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYXBwbGljYXRpb25fY3Jhc2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzZWIxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYXBwbGljYXRpb25fY3Jhc2gucHkKQEAgLTAsMCArMSBAQAorQUJDID0gc29tZXRoaW5nX3VuZGVmaW5lZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9iYWRfcGFja2FnZS9fX2luaXRfXy5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYmFkX3BhY2thZ2UvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjM2ExNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYmFkX3BhY2thZ2UvX19pbml0X18ucHkKQEAgLTAsMCArMSwyIEBACitpbXBvcnQgbWlzc2luZw0KK3JhaXNlIG1pc3NpbmcuTWlzc2luZy4uCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2JhZF9wYWNrYWdlL3dyb25nLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9iYWRfcGFja2FnZS93cm9uZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJkNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9iYWRfcGFja2FnZS93cm9uZy5weQpAQCAtMCwwICsxLDUgQEAKKyIiIg0KK1Rlc3QgdGhhdCBweWxpbnQgZG9lc24ndCBjcmFzaCB3aGVuIGEgcmVsYXRpdmUgaW1wb3J0DQorZGVwZW5kcyBvbiB0aGUgbG9jYWwgX19pbml0X18sIHdoaWNoIGNvbnRhaW5zIGFuIGV4cGVjdGVkIHN5bnRheCBlcnJvci4NCisiIiINCitmcm9tIC4gaW1wb3J0IG1pc3NpbmcNCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2JleW9uZF90b3AvX19pbml0X18ucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2JleW9uZF90b3AvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4Y2Y0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYmV5b25kX3RvcC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDYgQEAKK2Zyb20gLi4uIGltcG9ydCBTb21ldGhpbmcNCitmcm9tIC4gaW1wb3J0IGRhdGENCit0cnk6DQorICAgIGZyb20gLi4uIGltcG9ydCBMYWxhDQorZXhjZXB0IEltcG9ydEVycm9yOg0KKyAgICBwYXNzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2JleW9uZF90b3AvZGF0YS5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvYmV5b25kX3RvcC9kYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzM1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2JleW9uZF90b3AvZGF0YS5weQpAQCAtMCwwICsxIEBACitBbnl0aGluZyA9IDQyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2NsYXNzZG9jX3VzYWdlLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9jbGFzc2RvY191c2FnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDlkZjUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9jbGFzc2RvY191c2FnZS5weQpAQCAtMCwwICsxLDE3IEBACisiIiJkcyIiIgorCitfX3JldmlzaW9uX18gPSBOb25lCisjIHB5bGludDogZGlzYWJsZT11c2VsZXNzLW9iamVjdC1pbmhlcml0YW5jZQorCitjbGFzcyBTb21lQ2xhc3Mob2JqZWN0KToKKyAgICAiIiJjZHMiIiIKKyAgICBkb2MgPSBfX2RvY19fCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIm9ubHkgdG8gbWFrZSBweWxpbnQgaGFwcGllciIiIgorCisgICAgZGVmIHBsZWFzZShzZWxmKToKKyAgICAgICAgIiIicHVibGljIG1ldGhvZCAxLzIiIiIKKworICAgIGRlZiBiZXNpbGVudChzZWxmKToKKyAgICAgICAgIiIicHVibGljIG1ldGhvZCAyLzIiIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvY29tbWVudHNfcHlsaW50cmMgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2NvbW1lbnRzX3B5bGludHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMWNkMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2NvbW1lbnRzX3B5bGludHJjCkBAIC0wLDAgKzEsNyBAQAorW01FU1NBR0VTIENPTlRST0xdCitkaXNhYmxlPWFsbAorZW5hYmxlPQorICB0cmFpbGluZy13aGl0ZXNwYWNlLCAjIENhcmluZyBhYm91dCBpdAorICBiYWQtaW5kZW50YXRpb24sICMgQW5kIGFib3V0IHRoaXMKKyAgIyBBbmQgYWJvdXQgdGhpcworICBtaXNzaW5nLWRvY3N0cmluZwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9kYXRhY2xhc3Nlc19weXJldmVyc2UvX19pbml0X18ucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2RhdGFjbGFzc2VzX3B5cmV2ZXJzZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGM5MjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kYXRhY2xhc3Nlc19weXJldmVyc2UvX19pbml0X18ucHkKQEAgLTAsMCArMSwxMyBAQAorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCisKKworQGRhdGFjbGFzcworY2xhc3MgSW52ZW50b3J5SXRlbToKKyAgICAiIiJDbGFzcyBmb3Iga2VlcGluZyB0cmFjayBvZiBhbiBpdGVtIGluIGludmVudG9yeS4iIiIKKworICAgIG5hbWU6IHN0cgorICAgIHVuaXRfcHJpY2U6IGZsb2F0CisgICAgcXVhbnRpdHlfb25faGFuZDogaW50ID0gMAorCisgICAgZGVmIHRvdGFsX2Nvc3Qoc2VsZikgLT4gZmxvYXQ6CisgICAgICAgIHJldHVybiBzZWxmLnVuaXRfcHJpY2UgKiBzZWxmLnF1YW50aXR5X29uX2hhbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZGVjaW1hbF9pbmZlcmVuY2UucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2RlY2ltYWxfaW5mZXJlbmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzkxMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2RlY2ltYWxfaW5mZXJlbmNlLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiImh1bSBFMTAxMSBvbiAucHJlYyBtZW1iZXIgaXMganVzdGlmaWFibGUgc2luY2UgQ29udGV4dCBpbnN0YW5jZSBhcmUgYnVpbHQKK3VzaW5nIHNldGF0dHIvbG9jYWxzIDooCisKKzIwMDcvMDIvMTcgdXBkYXRlOiAucHJlYyBhdHRyaWJ1dGUgaXMgbm93IGRldGVjdGVkIGJ5IGFzdHJvaWQgOm8pCisiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBkZWNpbWFsCisKK2RlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMgPSAyMDAKK3ByaW50KGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMpCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2Rlc2NyaXB0b3JfY3Jhc2gucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2Rlc2NyaXB0b3JfY3Jhc2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzYWRjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZGVzY3JpcHRvcl9jcmFzaC5weQpAQCAtMCwwICsxLDIwIEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisKK2ltcG9ydCB1cmxsaWIKKworY2xhc3MgUGFnZShvYmplY3QpOgorICAgIF91cmxPcGVuID0gc3RhdGljbWV0aG9kKHVybGxpYi51cmxvcGVuKQorCisgICAgZGVmIGdldFBhZ2Uoc2VsZiwgdXJsKToKKyAgICAgICAgaGFuZGxlID0gc2VsZi5fdXJsT3Blbih1cmwpCisgICAgICAgIGRhdGEgPSBoYW5kbGUucmVhZCgpCisgICAgICAgIGhhbmRsZS5jbG9zZSgpCisgICAgICAgIHJldHVybiBkYXRhCisgICAgI19nZXRQYWdlCisKKyNQYWdlCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHN5cworICAgIHAgPSBQYWdlKCkKKyAgICBwcmludCBwLmdldFBhZ2Uoc3lzLmFyZ3ZbMV0pCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2R1bW15L19faW5pdF9fLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQzYTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitmcm9tIC5kdW1teSBpbXBvcnQgRFVNTVkKK2Zyb20gLmFub3RoZXIgaW1wb3J0IEFOT1RIRVIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVtbXkvYW5vdGhlci5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVtbXkvYW5vdGhlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE4NzEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teS9hbm90aGVyLnB5CkBAIC0wLDAgKzEsMyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworQU5PVEhFUiA9IDQyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2R1bW15L2R1bW15LnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teS9kdW1teS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDM0NWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teS9kdW1teS5weQpAQCAtMCwwICsxLDIgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nCitEVU1NWSA9IDQyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2R1bW15X3BsdWdpbi5yYyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVtbXlfcGx1Z2luLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmRlZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2R1bW15X3BsdWdpbi5yYwpAQCAtMCwwICsxLDYgQEAKK1tNQVNURVJdCitsb2FkLXBsdWdpbnM9ZHVtbXlfcGx1Z2luCisKK1tEVU1NWV9QTFVHSU5dCitkdW1teV9vcHRpb25fMT0iZHVtbXkgdmFsdWUgMSIKK2R1bW15X29wdGlvbl8yPSJkdW1teSB2YWx1ZSAyIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teV9wbHVnaW4vZHVtbXlfY29uZl9wbHVnaW4ucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2R1bW15X3BsdWdpbi9kdW1teV9jb25mX3BsdWdpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTgzODdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teV9wbHVnaW4vZHVtbXlfY29uZl9wbHVnaW4ucHkKQEAgLTAsMCArMSw2IEBACitkZWYgcmVnaXN0ZXIobGludGVyKToKKyAgICBwYXNzCisKKworZGVmIGxvYWRfY29uZmlndXJhdGlvbihsaW50ZXIpOgorICAgIGxpbnRlci5jb25maWcuYmxhY2tfbGlzdCArPSAoJ2JpbicsKQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teV9wbHVnaW4vZHVtbXlfcGx1Z2luLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdW1teV9wbHVnaW4vZHVtbXlfcGx1Z2luLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YjBiOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2R1bW15X3BsdWdpbi9kdW1teV9wbHVnaW4ucHkKQEAgLTAsMCArMSwzMCBAQAorZnJvbSBweWxpbnQuY2hlY2tlcnMgaW1wb3J0IEJhc2VDaGVja2VyCisKKworY2xhc3MgRHVtbXlQbHVnaW4xKEJhc2VDaGVja2VyKToKKyAgICBuYW1lID0gJ2R1bW15X3BsdWdpbicKKyAgICBtc2dzID0geydJOTA2MSc6ICgnRHVtbXkgc2hvcnQgZGVzYyAwMScsICdkdW1teS1tZXNzYWdlLTAxJywgJ0R1bW15IGxvbmcgZGVzYycpfQorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgnZHVtbXlfb3B0aW9uXzEnLCB7CisgICAgICAgICAgICAndHlwZSc6ICdzdHJpbmcnLAorICAgICAgICAgICAgJ21ldGF2YXInOiAnPHN0cmluZz4nLAorICAgICAgICAgICAgJ2hlbHAnOiAnRHVtbXkgb3B0aW9uIDEnLAorICAgICAgICB9KSwKKyAgICApCisKKworY2xhc3MgRHVtbXlQbHVnaW4yKEJhc2VDaGVja2VyKToKKyAgICBuYW1lID0gJ2R1bW15X3BsdWdpbicKKyAgICBtc2dzID0geydJOTA2MCc6ICgnRHVtbXkgc2hvcnQgZGVzYyAwMicsICdkdW1teS1tZXNzYWdlLTAyJywgJ0R1bW15IGxvbmcgZGVzYycpfQorICAgIG9wdGlvbnMgPSAoCisgICAgICAgICgnZHVtbXlfb3B0aW9uXzInLCB7CisgICAgICAgICAgICAndHlwZSc6ICdzdHJpbmcnLAorICAgICAgICAgICAgJ21ldGF2YXInOiAnPHN0cmluZz4nLAorICAgICAgICAgICAgJ2hlbHAnOiAnRHVtbXkgb3B0aW9uIDInLAorICAgICAgICB9KSwKKyAgICApCisKKworZGVmIHJlZ2lzdGVyKGxpbnRlcik6CisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoRHVtbXlQbHVnaW4xKGxpbnRlcikpCisgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoRHVtbXlQbHVnaW4yKGxpbnRlcikpCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2R1cGxpY2F0ZV9kYXRhX3Jhd19zdHJpbmdzL19faW5pdF9fLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdXBsaWNhdGVfZGF0YV9yYXdfc3RyaW5ncy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdXBsaWNhdGVfZGF0YV9yYXdfc3RyaW5ncy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9kdXBsaWNhdGVfZGF0YV9yYXdfc3RyaW5ncy9maXJzdC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVwbGljYXRlX2RhdGFfcmF3X3N0cmluZ3MvZmlyc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3YzU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVwbGljYXRlX2RhdGFfcmF3X3N0cmluZ3MvZmlyc3QucHkKQEAgLTAsMCArMSwxMSBAQAorciIiIkEgcmF3IGRvY3N0cmluZy4KKyIiIgorCisKK2RlZiBsb29rX2J1c3koKToKKyAgICB4eHh4ID0gMQorICAgIHl5eXkgPSAyCisgICAgenp6eiA9IDMKKyAgICB3d3d3ID0gNAorICAgIHZ2dnYgPSB4eHh4ICsgeXl5eSArIHp6enogKyB3d3d3CisgICAgcmV0dXJuIHZ2dnYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVwbGljYXRlX2RhdGFfcmF3X3N0cmluZ3Mvc2Vjb25kLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9kdXBsaWNhdGVfZGF0YV9yYXdfc3RyaW5ncy9zZWNvbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3YzU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZHVwbGljYXRlX2RhdGFfcmF3X3N0cmluZ3Mvc2Vjb25kLnB5CkBAIC0wLDAgKzEsMTEgQEAKK3IiIiJBIHJhdyBkb2NzdHJpbmcuCisiIiIKKworCitkZWYgbG9va19idXN5KCk6CisgICAgeHh4eCA9IDEKKyAgICB5eXl5ID0gMgorICAgIHp6enogPSAzCisgICAgd3d3dyA9IDQKKyAgICB2dnZ2ID0geHh4eCArIHl5eXkgKyB6enp6ICsgd3d3dworICAgIHJldHVybiB2dnZ2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2VtcHR5LnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9lbXB0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9lbXB0eS5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9mYWlsX3VuZGVyX21pbnVzMTAucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2ZhaWxfdW5kZXJfbWludXMxMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UzNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9mYWlsX3VuZGVyX21pbnVzMTAucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiCisJUHlsaW50IHNjb3JlOiAgLTEwCisiIiIKK2ltcG9ydCBub25leGlzdGVudAorCisKK2RlZiBsb29wKCk6CisJY291bnQgPSAwCisJZm9yIGkgaW4gcmFuZ2UoNSk6CisJCWNvdW50ICs9IDEKKwlwcmludChjb3VudCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZmFpbF91bmRlcl9wbHVzN181LnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9mYWlsX3VuZGVyX3BsdXM3XzUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhMjdmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZmFpbF91bmRlcl9wbHVzN181LnB5CkBAIC0wLDAgKzEsOSBAQAorIiIiIgorICAgIHB5bGludCBzY29yZTogICs3LjUwCisiIiIKKworaW1wb3J0IG9zCisKK2RlZiBmdW5jKCk6CisgICAgcGF0aCA9ICcvdG1wJworICAgIG9zLnBhdGguZXhpc3RzKHBhdGgpCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2Z1bmNfYmxvY2tfZGlzYWJsZV9tc2cucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2Z1bmNfYmxvY2tfZGlzYWJsZV9tc2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxOThkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvZnVuY19ibG9ja19kaXNhYmxlX21zZy5weQpAQCAtMCwwICsxLDEwMjYgQEAKKyMgcHlsaW50OiBkaXNhYmxlPUMwMzAyLGJhcmUtZXhjZXB0LHByaW50LXN0YXRlbWVudCwgdXNlbGVzcy1vYmplY3QtaW5oZXJpdGFuY2UKKyIiInB5bGludCBvcHRpb24gYmxvY2stZGlzYWJsZSIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitjbGFzcyBGb28ob2JqZWN0KToKKyAgICAiIiJibG9jay1kaXNhYmxlIHRlc3QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCA9ICI0MiIKKworICAgIGRlZiBtZXRoMShzZWxmLCBhcmcpOgorICAgICAgICAiIiJ0aGlzIGlzc3VlcyBhIG1lc3NhZ2UiIiIKKyAgICAgICAgcHJpbnQoc2VsZikKKworICAgIGRlZiBtZXRoMihzZWxmLCBhcmcpOgorICAgICAgICAiIiJhbmQgdGhpcyBvbmUgbm90IiIiCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPVcwNjEzCisgICAgICAgIHByaW50KHNlbGYuX3Rlc3RcCisgICAgICAgICAgICAgICsgImZvbyIpCisKKyAgICBkZWYgbWV0aDMoc2VsZik6CisgICAgICAgICIiInRlc3Qgb25lIGxpbmUgZGlzYWJsaW5nIiIiCisgICAgICAgICMgbm8gZXJyb3IKKyAgICAgICAgcHJpbnQoc2VsZi5ibGEpICMgcHlsaW50OiBkaXNhYmxlPUUxMTAxCisgICAgICAgICMgZXJyb3IKKyAgICAgICAgcHJpbnQoc2VsZi5ibG9wKQorCisgICAgZGVmIG1ldGg0KHNlbGYpOgorICAgICAgICAiIiJ0ZXN0IHJlLWVuYWJsaW5nIiIiCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPUUxMTAxCisgICAgICAgICMgbm8gZXJyb3IKKyAgICAgICAgcHJpbnQoc2VsZi5ibGEpCisgICAgICAgIHByaW50KHNlbGYuYmxvcCkKKyAgICAgICAgIyBweWxpbnQ6IGVuYWJsZT1FMTEwMQorICAgICAgICAjIGVycm9yCisgICAgICAgIHByaW50KHNlbGYuYmxpcCkKKworICAgIGRlZiBtZXRoNShzZWxmKToKKyAgICAgICAgIiIidGVzdCBJRiBzdWItYmxvY2sgcmUtZW5hYmxpbmciIiIKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9RTExMDEKKyAgICAgICAgIyBubyBlcnJvcgorICAgICAgICBwcmludChzZWxmLmJsYSkKKyAgICAgICAgaWYgc2VsZi5ibG9wOgorICAgICAgICAgICAgIyBweWxpbnQ6IGVuYWJsZT1FMTEwMQorICAgICAgICAgICAgIyBlcnJvcgorICAgICAgICAgICAgcHJpbnQoc2VsZi5ibGlwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBubyBlcnJvcgorICAgICAgICAgICAgcHJpbnQoc2VsZi5ibGlwKQorICAgICAgICAjIG5vIGVycm9yCisgICAgICAgIHByaW50KHNlbGYuYmxpcCkKKworICAgIGRlZiBtZXRoNihzZWxmKToKKyAgICAgICAgIiIidGVzdCBUUlkvRVhDRVBUIHN1Yi1ibG9jayByZS1lbmFibGluZyIiIgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1FMTEwMQorICAgICAgICAjIG5vIGVycm9yCisgICAgICAgIHByaW50KHNlbGYuYmxhKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHB5bGludDogZW5hYmxlPUUxMTAxCisgICAgICAgICAgICAjIGVycm9yCisgICAgICAgICAgICBwcmludChzZWxmLmJsaXApCisgICAgICAgIGV4Y2VwdCBVbmRlZmluZWROYW1lOiAjIHB5bGludDogZGlzYWJsZT1FMDYwMgorICAgICAgICAgICAgIyBubyBlcnJvcgorICAgICAgICAgICAgcHJpbnQoc2VsZi5ibGlwKQorICAgICAgICAjIG5vIGVycm9yCisgICAgICAgIHByaW50KHNlbGYuYmxpcCkKKworICAgIGRlZiBtZXRoNyhzZWxmKToKKyAgICAgICAgIiIidGVzdCBvbmUgbGluZSBibG9jayBvcGVuaW5nIGRpc2FibGluZyIiIgorICAgICAgICBpZiBzZWxmLmJsb3A6ICMgcHlsaW50OiBkaXNhYmxlPUUxMTAxCisgICAgICAgICAgICAjIGVycm9yCisgICAgICAgICAgICBwcmludChzZWxmLmJsaXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGVycm9yCisgICAgICAgICAgICBwcmludChzZWxmLmJsaXApCisgICAgICAgICMgZXJyb3IKKyAgICAgICAgcHJpbnQoc2VsZi5ibGlwKQorCisKKyAgICBkZWYgbWV0aDgoc2VsZik6CisgICAgICAgICIiInRlc3QgbGF0ZSBkaXNhYmxpbmciIiIKKyAgICAgICAgIyBlcnJvcgorICAgICAgICBwcmludChzZWxmLmJsaXApCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPUUxMTAxCisgICAgICAgICMgbm8gZXJyb3IKKyAgICAgICAgcHJpbnQoc2VsZi5ibGEpCisgICAgICAgIHByaW50KHNlbGYuYmxvcCkKKworICAgIGRlZiBtZXRoOShzZWxmKToKKyAgICAgICAgIiIidGVzdCByZS1lbmFibGluZyByaWdodCBhZnRlciBhIGJsb2NrIHdpdGggd2hpdGVzcGFjZSIiIgorICAgICAgICBlcmlzID0gNQorCisgICAgICAgIGlmIGVyaXM6ICMgcHlsaW50OiBkaXNhYmxlPXVzaW5nLWNvbnN0YW50LXRlc3QKKyAgICAgICAgICAgIHByaW50KCJJbiBibG9jayIpCisKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9RTExMDEKKyAgICAgICAgIyBubyBlcnJvcgorICAgICAgICBwcmludChzZWxmLmJsYSkKKyAgICAgICAgcHJpbnQoc2VsZi5ibHUpCisgICAgICAgICMgcHlsaW50OiBlbmFibGU9RTExMDEKKyAgICAgICAgIyBlcnJvcgorICAgICAgICBwcmludChzZWxmLmJsaXApCisKKyAgICBkZWYgbWV0aDEwKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGRvdWJsZSBkaXNhYmxlIiIiCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPUUxMTAxCisgICAgICAgICMgbm8gZXJyb3IKKyAgICAgICAgcHJpbnQoc2VsZi5ibGEpCisgICAgICAgICMgcHlsaW50OiBkaXNhYmxlPUUxMTAxCisgICAgICAgIHByaW50KHNlbGYuYmx1KQorCisKK2NsYXNzIENsYXNzTGV2ZWxNZXNzYWdlKG9iamVjdCk6CisgICAgIiIic2hvdWxkbid0IGRpc3BsYXkgdG8gbXVjaCBhdHRyaWJ1dGVzL25vdCBlbm91Z2ggbWV0aG9kcyBtZXNzYWdlcworICAgICIiIgorICAgICMgcHlsaW50OiBkaXNhYmxlPVIwOTAyLFIwOTAzCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYXR0cjEgPSAxCisgICAgICAgIHNlbGYuYXR0cjIgPSAxCisgICAgICAgIHNlbGYuYXR0cjMgPSAxCisgICAgICAgIHNlbGYuYXR0cjQgPSAxCisgICAgICAgIHNlbGYuYXR0cjUgPSAxCisgICAgICAgIHNlbGYuYXR0cjYgPSAxCisgICAgICAgIHNlbGYuYXR0cjcgPSAxCisgICAgICAgIHNlbGYuYXR0cjggPSAxCisgICAgICAgIHNlbGYuYXR0cjkgPSAxCisgICAgICAgIHNlbGYuYXR0cjAgPSAxCisKKyAgICBkZWYgdG9vX2NvbXBsZXhfYnV0X3RoYXRzX29rKHNlbGYsIGF0dHIxLCBhdHRyMik6CisgICAgICAgICIiIlRISVMgTWV0aG9kIGhhcyB0b28gbXVjaCBicmFuY2hlcyBhbmQgcmV0dXJucyBidXQgaSBkb24ndCBjYXJlCisgICAgICAgICIiIgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1SMDkxMixSMDkxMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhdHRyMyA9IGF0dHIxK2F0dHIyCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgYXR0cjMgPSBOb25lCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiAnZHVoJywgc2VsZgorICAgICAgICBpZiBhdHRyMToKKyAgICAgICAgICAgIGZvciBpIGluIGF0dHIxOgorICAgICAgICAgICAgICAgIGlmIGF0dHIyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2R1aCcKKyAgICAgICAgZWxpZiBhdHRyMjoKKyAgICAgICAgICAgIGZvciBpIGluIGF0dHIyOgorICAgICAgICAgICAgICAgIGlmIGF0dHIyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2R1aCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDE1KToKKyAgICAgICAgICAgICAgICBpZiBhdHRyMzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdkb2gnCisgICAgICAgIHJldHVybiBOb25lCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitwcmludCgnaG9wLCB0b28gbWFueSBsaW5lcyBidXQgaSBkb25cJ3QgY2FyZScpCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2ltcG9ydF9hc3NpZ24ucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2ltcG9ydF9hc3NpZ24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxY2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvaW1wb3J0X2Fzc2lnbi5weQpAQCAtMCwwICsxLDUgQEAKK2ltcG9ydCBzaG1peG1sLmRvbS5taW5pZG9tCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tCisKK2lmICdkb20nIG5vdCBpbiB4bWwuX19kaWN0X186CisgIHhtbC5kb20gPSBzaG1peG1sLmRvbQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9pbXBvcnRfcGFja2FnZV9zdWJwYWNrYWdlX21vZHVsZS5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvaW1wb3J0X3BhY2thZ2Vfc3VicGFja2FnZV9tb2R1bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2NGUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvaW1wb3J0X3BhY2thZ2Vfc3VicGFja2FnZV9tb2R1bGUucHkKQEAgLTAsMCArMSw0OSBAQAorIyBweWxpbnQ6IGRpc2FibGU9STAwMTEsQzAzMDEsVzA2MTEKKyIiIkkgZm91bmQgc29tZSBvZiBteSBzY3JpcHRzIHRyaWdnZXIgb2ZmIGFuIEF0dHJpYnV0ZUVycm9yIGluIHB5bGludAorMC44LjEgKHdpdGggY29tbW9uIDAuMTIuMCBhbmQgYXN0cm9pZCAwLjEzLjEpLgorCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIi91c3IvYmluL3B5bGludCIsIGxpbmUgNCwgaW4gPworICAgIGxpbnQuUnVuKHN5cy5hcmd2WzE6XSkKKyAgRmlsZSAiL3Vzci9saWIvcHl0aG9uMi40L3NpdGUtcGFja2FnZXMvcHlsaW50L2xpbnQucHkiLCBsaW5lIDcyOSwgaW4gX19pbml0X18KKyAgICBsaW50ZXIuY2hlY2soYXJncykKKyAgRmlsZSAiL3Vzci9saWIvcHl0aG9uMi40L3NpdGUtcGFja2FnZXMvcHlsaW50L2xpbnQucHkiLCBsaW5lIDQxMiwgaW4gY2hlY2sKKyAgICBzZWxmLmNoZWNrX2ZpbGUoZmlsZXBhdGgsIG1vZG5hbWUsIGNoZWNrZXJzKQorICBGaWxlICIvdXNyL2xpYi9weXRob24yLjQvc2l0ZS1wYWNrYWdlcy9weWxpbnQvbGludC5weSIsIGxpbmUgNDI2LCBpbiBjaGVja19maWxlCisgICAgYXN0cm9pZCA9IHNlbGYuX2NoZWNrX2ZpbGUoZmlsZXBhdGgsIG1vZG5hbWUsIGNoZWNrZXJzKQorICBGaWxlICIvdXNyL2xpYi9weXRob24yLjQvc2l0ZS1wYWNrYWdlcy9weWxpbnQvbGludC5weSIsIGxpbmUgNDUwLCBpbiBfY2hlY2tfZmlsZQorICAgIHNlbGYuY2hlY2tfYXN0cm9pZF9tb2R1bGUoYXN0cm9pZCwgY2hlY2tlcnMpCisgIEZpbGUgIi91c3IvbGliL3B5dGhvbjIuNC9zaXRlLXBhY2thZ2VzL3B5bGludC9saW50LnB5IiwgbGluZSA0OTQsIGluIGNoZWNrX2FzdHJvaWRfbW9kdWxlCisgICAgc2VsZi5hc3Ryb2lkX2V2ZW50cyhhc3Ryb2lkLCBbY2hlY2tlciBmb3IgY2hlY2tlciBpbiBjaGVja2VycworICBGaWxlICIvdXNyL2xpYi9weXRob24yLjQvc2l0ZS1wYWNrYWdlcy9weWxpbnQvbGludC5weSIsIGxpbmUgNTExLCBpbiBhc3Ryb2lkX2V2ZW50cworICAgIHNlbGYuYXN0cm9pZF9ldmVudHMoY2hpbGQsIGNoZWNrZXJzLCBfcmV2ZXJzZWRfY2hlY2tlcnMpCisgIEZpbGUgIi91c3IvbGliL3B5dGhvbjIuNC9zaXRlLXBhY2thZ2VzL3B5bGludC9saW50LnB5IiwgbGluZSA1MTEsIGluIGFzdHJvaWRfZXZlbnRzCisgICAgc2VsZi5hc3Ryb2lkX2V2ZW50cyhjaGlsZCwgY2hlY2tlcnMsIF9yZXZlcnNlZF9jaGVja2VycykKKyAgRmlsZSAiL3Vzci9saWIvcHl0aG9uMi40L3NpdGUtcGFja2FnZXMvcHlsaW50L2xpbnQucHkiLCBsaW5lIDUwOCwgaW4gYXN0cm9pZF9ldmVudHMKKyAgICBjaGVja2VyLnZpc2l0KGFzdHJvaWQpCisgIEZpbGUgIi91c3IvbGliL3B5dGhvbjIuNC9zaXRlLXBhY2thZ2VzL2xvZ2lsYWIvYXN0cm9pZC91dGlscy5weSIsIGxpbmUgODQsIGluIHZpc2l0CisgICAgbWV0aG9kKG5vZGUpCisgIEZpbGUgIi91c3IvbGliL3B5dGhvbjIuNC9zaXRlLXBhY2thZ2VzL3B5bGludC9jaGVja2Vycy92YXJpYWJsZXMucHkiLCBsaW5lIDI5NSwgaW4gdmlzaXRfaW1wb3J0CisgICAgc2VsZi5fY2hlY2tfbW9kdWxlX2F0dHJzKG5vZGUsIG1vZHVsZSwgbmFtZV9wYXJ0c1sxOl0pCisgIEZpbGUgIi91c3IvbGliL3B5dGhvbjIuNC9zaXRlLXBhY2thZ2VzL3B5bGludC9jaGVja2Vycy92YXJpYWJsZXMucHkiLCBsaW5lIDM1NywgaW4gX2NoZWNrX21vZHVsZV9hdHRycworICAgIHNlbGYuYWRkX21lc3NhZ2UoJ0UwNjExJywgYXJncz0obmFtZSwgbW9kdWxlLm5hbWUpLAorQXR0cmlidXRlRXJyb3I6IEltcG9ydCBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICduYW1lJworCisKK1lvdSBjYW4gcmVwcm9kdWNlIGl0IGJ5OgorKDEpIGNyZWF0ZSBwYWNrYWdlIHN0cnVjdHVyZSBsaWtlIHRoZSBmb2xsb3dpbmc6CisKK3BhY2thZ2UvCisgICAgICAgIF9faW5pdF9fLnB5CisgICAgICAgIHN1YnBhY2thZ2UvCisgICAgICAgICAgICAgICAgICAgX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICBtb2R1bGUucHkKKworKDIpIGluIHBhY2thZ2UvX19pbml0X18ucHkgd3JpdGU6CisKK2ltcG9ydCBzdWJwYWNrYWdlCisKKygzKSBydW4gcHlsaW50IHdpdGggYSBzY3JpcHQgaW1wb3J0aW5nIHBhY2thZ2Uuc3VicGFja2FnZS5tb2R1bGUuCisiIiIKK2ltcG9ydCBwYWNrYWdlLnN1YnBhY2thZ2UubW9kdWxlCitfX3JldmlzaW9uX18gPSAnJElkOiBpbXBvcnRfcGFja2FnZV9zdWJwYWNrYWdlX21vZHVsZS5weSx2IDEuMSAyMDA1LTExLTEwIDE2OjA4OjU0IHN5dCBFeHAgJCcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvaW1wb3J0X3NvbWV0aGluZy5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvaW1wb3J0X3NvbWV0aGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc0YTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9pbXBvcnRfc29tZXRoaW5nLnB5CkBAIC0wLDAgKzEsNCBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcsdW51c2VkLWltcG9ydA0KKw0KK2ltcG9ydCBvcw0KK2ltcG9ydCBzeXMNCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL2luaXRfd2lsZGNhcmQvX19pbml0X18ucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL2luaXRfd2lsZGNhcmQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0YjMxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvaW5pdF93aWxkY2FyZC9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACitmcm9tIGVtcHR5IGltcG9ydCAqCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL21ldGEucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL21ldGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMTIwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvbWV0YS5weQpAQCAtMCwwICsxLDMgQEAKKyMgcHlsaW50OiBkaXNhYmxlPWludmFsaWQtbmFtZSwgbWlzc2luZy1kb2NzdHJpbmcKKyMgcHlsaW50OiBkaXNhYmxlPXVuYmFsYW5jZWQtdHVwbGUtdW5wYWNraW5nCituID0gNDIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvbW9kdWxlX2dsb2JhbC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvbW9kdWxlX2dsb2JhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDdkNjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9tb2R1bGVfZ2xvYmFsLnB5CkBAIC0wLDAgKzEsNyBAQAorIyBweWxpbnQ6IGRpc2FibGU9VzA2MDMsVzA2MDEsVzA2MDQsRTA2MDIsVzAxMDQKKyIiIndhcyBjYXVzaW5nIGluZmluaXRlIHJlY3Vyc2lvbgorIiIiCitfX3JldmlzaW9uX18gPSAxCisKK2dsb2JhbCBHTE9CQUxfVkFSCitHTE9CQUxfVkFSLmZvbwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9ub19zdGRvdXRfZW5jb2RpbmcucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL25vX3N0ZG91dF9lbmNvZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJhYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9ub19zdGRvdXRfZW5jb2RpbmcucHkKQEAgLTAsMCArMSw0IEBACisjLSotIGNvZGluZzppc28tODg1OS0xIC0qLQorY2xhc3MgdGVzdDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyKToKKyAgICAgICAgdGVzdFN0cmluZyA9IHUicsOpcGVydG9pcmUgOlxuJXMgISIlZGlyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL251bWFycmF5X2ltcG9ydC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvbnVtYXJyYXlfaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTc1N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL251bWFycmF5X2ltcG9ydC5weQpAQCAtMCwwICsxLDcgQEAKKyIiIiMxMDA3NyIiIgorCitfX3JldmlzaW9uX18gPSAxCisKK2Zyb20gbnVtYXJyYXkgaW1wb3J0IHplcm9zCisKK3plcm9zKHNoYXBlPSg0LCA1KSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvbnVtYXJyYXlfaW5mLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9udW1hcnJheV9pbmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhMjJhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvbnVtYXJyYXlfaW5mLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiIzMyMTYiIiIKKworaW1wb3J0IG51bWFycmF5IGFzIG5hCitpbXBvcnQgbnVtYXJyYXkucmFuZG9tX2FycmF5IGFzIG5hcgorSU0xNiA9IG5hci5yYW5kaW50KDAsIDI1NiwgMzAwKS5hc3R5cGUobmEuVUludDgpCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL3BhY2thZ2UvQXVkaW9UaW1lLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlL0F1ZGlvVGltZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY1MTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlL0F1ZGlvVGltZS5weQpAQCAtMCwwICsxLDMgQEAKKyIiInRlc3QgcHJlY2VkZWQgYnkgdGhlIEF1ZGlvVGltZSBjbGFzcyBpbiBfX2luaXRfXy5weSIiIgorCitfX3JldmlzaW9uX18gPSAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL3BhY2thZ2UvX19pbml0X18ucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3BhY2thZ2UvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYzQwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE1IEBACisjIHB5bGludDogZGlzYWJsZT1SMDkwMworCisiIiJwYWNrYWdlJ3MgX19pbml0X18gZmlsZSIiIgorCitmcm9tIC4gaW1wb3J0IHN1YnBhY2thZ2UKKworX19yZXZpc2lvbl9fID0gMAorCisjIEUwNjAyIC0gVW5kZWZpbmVkIHZhcmlhYmxlICdfX3BhdGhfXycKK19fcGF0aF9fICs9ICJmb2xkZXIiCisKK2NsYXNzIEF1ZGlvVGltZToKKyAgICAiIiJ0ZXN0IHByZWNlZGVuY2Ugb3ZlciB0aGUgQXVkaW9UaW1lIHN1Ym1vZHVsZSIiIgorCisgICAgREVDSU1BTCA9IDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZS9zdWJwYWNrYWdlL19faW5pdF9fLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlL3N1YnBhY2thZ2UvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NzgyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZS9zdWJwYWNrYWdlL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyIiInBhY2thZ2Uuc3VicGFja2FnZSIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlL3N1YnBhY2thZ2UvbW9kdWxlLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlL3N1YnBhY2thZ2UvbW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzI0NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3BhY2thZ2Uvc3VicGFja2FnZS9tb2R1bGUucHkKQEAgLTAsMCArMSBAQAorIiIicGFja2FnZS5zdWJwYWNrYWdlLm1vZHVsZSIiIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlX2FsbC9fX2luaXRfXy5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZV9hbGwvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNjk2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZV9hbGwvX19pbml0X18ucHkKQEAgLTAsMCArMSwzIEBACisiIiIgQ2hlY2sgZm9yIEUwNjAzIGZvciBtaXNzaW5nIHN1Ym1vZHVsZSBmb3VuZCBpbiBfX2FsbF9fICIiIg0KK19fcmV2aXNpb25fXyA9IDENCitfX2FsbF9fID0gWydub3RtaXNzaW5nJywgJ21pc3NpbmcnXQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZV9hbGwvbm90bWlzc2luZy5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcGFja2FnZV9hbGwvbm90bWlzc2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Y4NTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9wYWNrYWdlX2FsbC9ub3RtaXNzaW5nLnB5CkBAIC0wLDAgKzEsMiBAQAorIiIiIGVtcHR5ICIiIg0KK19fcmV2aXNpb25fXyA9IDENCmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL3ByZWNlZGVuY2VfdGVzdC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcHJlY2VkZW5jZV90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTg3MWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3ByZWNlZGVuY2VfdGVzdC5weQpAQCAtMCwwICsxLDIxIEBACisiIiIKKyAgIyBwYWNrYWdlL19faW5pdF9fLnB5CisgIGNsYXNzIEF1ZGlvVGltZShvYmplY3QpOgorICAgIERFQ0lNQUwgPSAzCisKKyAgIyBwYWNrYWdlL0F1ZGlvVGltZS5weQorICBjbGFzcyBBdWRpb1RpbWUob2JqZWN0KToKKyAgICBwYXNzCisKKyAgIyB0ZXN0LnB5CisgIGZyb20gcGFja2FnZSBpbXBvcnQgQXVkaW9UaW1lCisgICMgRTA2MTEgLSBObyBuYW1lICdERUNJTUFMJyBpbiBtb2R1bGUgJ0F1ZGlvVGltZS5BdWRpb1RpbWUnCisgIHByaW50IEF1ZGlvVGltZS5ERUNJTUFMCisKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBwYWNrYWdlIGltcG9ydCBBdWRpb1RpbWUKK19fcmV2aXNpb25fXyA9IDAKKworCitwcmludChBdWRpb1RpbWUuREVDSU1BTCkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcHkzay1kaXNhYmxlZC5yYyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvcHkzay1kaXNhYmxlZC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQ3NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9weTNrLWRpc2FibGVkLnJjCkBAIC0wLDAgKzEsMiBAQAorW01FU1NBR0VTIENPTlRST0xdCitkaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9weTNrX2Vycm9yX2ZsYWcucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3B5M2tfZXJyb3JfZmxhZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmVhZDQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9weTNrX2Vycm9yX2ZsYWcucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiQ29udGFpbnMgYm90aCBub3JtYWwgZXJyb3IgbWVzc2FnZXMgYW5kIFB5dGhvbjMgcG9ydGluZyBlcnJvciBtZXNzYWdlcy4iIiINCisjIHB5bGludDogZGlzYWJsZT10b28tZmV3LXB1YmxpYy1tZXRob2RzDQorDQorcmFpc2UgRXhjZXB0aW9uLCAxICAjIEVycm9yIGVtaXR0ZWQgaGVyZSB3aXRoIHRoZSBQeXRob24gMyBjaGVja2VyLg0KKw0KKw0KK2NsYXNzIFRlc3Qob2JqZWN0KToNCisgICAgIiIiZHVtbXkiIiINCisNCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuIDQyDQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9weTNrX2Vycm9yc19hbmRfd2FybmluZ3MucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3B5M2tfZXJyb3JzX2FuZF93YXJuaW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDAzM2U4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9weTNrX2Vycm9yc19hbmRfd2FybmluZ3MucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiQ29udGFpbnMgYm90aCBub3JtYWwgZXJyb3IgbWVzc2FnZXMgYW5kIFB5dGhvbjMgcG9ydGluZyBlcnJvciBtZXNzYWdlcy4iIiIKKyMgcHlsaW50OiBkaXNhYmxlPXRvby1mZXctcHVibGljLW1ldGhvZHMKKworIyBlcnJvcjogaW1wb3J0IG1pc3NpbmcgYGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0YAoraW1wb3J0IHN5cworCisjIGVycm9yOiBVc2UgcmFpc2UgRXJyb3JDbGFzcyhhcmdzKSBpbnN0ZWFkIG9mIHJhaXNlIEVycm9yQ2xhc3MsIGFyZ3MuCityYWlzZSBFeGNlcHRpb24sIDEKKworY2xhc3MgVGVzdChvYmplY3QpOgorICAgICIiImR1bW15IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgd2FybmluZzogQ2FsbGluZyBhIGRpY3QuaXRlciooKSBtZXRob2QKKyAgICAgICAgezE6IDJ9Lml0ZXJpdGVtcygpCisgICAgICAgIHJldHVybiA0MgorCisjIGVycm9yOiBwcmludCBzdGF0ZW1lbnQgdXNlZAorcHJpbnQgJ25vdCBpbiBweXRob24zJwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS9yZWdyZXNzaW9uX21pc3NpbmdfaW5pdF8zNTY0L3N1YmRpcmVjdG9yeS9maWxlLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9yZWdyZXNzaW9uX21pc3NpbmdfaW5pdF8zNTY0L3N1YmRpcmVjdG9yeS9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3JlZ3Jlc3Npb25fbWlzc2luZ19pbml0XzM1NjQvc3ViZGlyZWN0b3J5L2ZpbGUucHkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvc3BlY2lhbF9hdHRyX3Njb3BlX2xvb2t1cF9jcmFzaC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvc3BlY2lhbF9hdHRyX3Njb3BlX2xvb2t1cF9jcmFzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjkzYTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVncnRlc3RfZGF0YS9zcGVjaWFsX2F0dHJfc2NvcGVfbG9va3VwX2NyYXNoLnB5CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgS2xhc3Mob2JqZWN0KToKKyAgICAiIiJBIiIiCisgICAgX19kb2NfXyArPSAiQiIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvc3ludGF4X2Vycm9yLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS9zeW50YXhfZXJyb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjN2MxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvc3ludGF4X2Vycm9yLnB5CkBAIC0wLDAgKzEgQEAKK2NsYXNzIEEgZXh0ZW5kcyBCIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9yZWdydGVzdF9kYXRhL3Rlc3RfcHlsaW50cmNfY29tbWVudHMucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3Rlc3RfcHlsaW50cmNfY29tbWVudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4YzQwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvdGVzdF9weWxpbnRyY19jb21tZW50cy5weQpAQCAtMCwwICsxLDIgQEAKK2RlZiBmKHgpOgorIHJldHVybiB4ICMgMSBzcGFjZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncnRlc3RfZGF0YS90cnlfZmluYWxseV9kaXNhYmxlX21zZ19jcmFzaC5weSBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvdHJ5X2ZpbmFsbHlfZGlzYWJsZV9tc2dfY3Jhc2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxOTMwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvdHJ5X2ZpbmFsbHlfZGlzYWJsZV9tc2dfY3Jhc2gucHkKQEAgLTAsMCArMSw1IEBACit0cnk6CisgICAgcGFzcworZmluYWxseToKKyAgICAjIHB5bGludDogZGlzYWJsZT1XMDIwMQorICAgIHBhc3MKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvdW51c2VkX3ZhcmlhYmxlLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS91bnVzZWRfdmFyaWFibGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlOTA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvdW51c2VkX3ZhcmlhYmxlLnB5CkBAIC0wLDAgKzEsNiBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1kb2NzdHJpbmcKKworZGVmIHRlc3QoKToKKyAgICB2YXJpYWJsZSA9ICcnCisgICAgdmFyaWFibGUyID0gTm9uZQorICAgIHJldHVybiB2YXJpYWJsZTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvd2lsZGNhcmQucHkgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3dpbGRjYXJkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNGIzMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWdydGVzdF9kYXRhL3dpbGRjYXJkLnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gZW1wdHkgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnB5IGIvdGVzdHMvcmVncnRlc3RfZGF0YS93cm9uZ19pbXBvcnRfcG9zaXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyZDA5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZ3J0ZXN0X2RhdGEvd3JvbmdfaW1wb3J0X3Bvc2l0aW9uLnB5CkBAIC0wLDAgKzEsMTEgQEAKKyIiIlRlc3QgdGhhdCB3cm9uZy1pbXBvcnQtcG9zaXRpb24gaXMgcHJvcGVybHkgcmVzZXQgd2hlbg0KK290aGVyIGVycm9ycyBhcmUgZGlzYWJsZWQuDQorIiIiDQorIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydCwgdG9vLWZldy1wdWJsaWMtbWV0aG9kcw0KKw0KKw0KK2NsYXNzIFNvbWV0aGluZyhvYmplY3QpOg0KKyAgICAiIiJBIGNsYXNzIGJlZm9yZSBhbiBpbXBvcnQuIiIiDQorDQorDQoraW1wb3J0IG9zDQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdF9jaGVja19wYXJhbGxlbC5weSBiL3Rlc3RzL3Rlc3RfY2hlY2tfcGFyYWxsZWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0MzdiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RfY2hlY2tfcGFyYWxsZWwucHkKQEAgLTAsMCArMSw0MDMgQEAKKyIiIlB1dHMgdGhlIGNoZWNrX3BhcmFsbGVsIHN5c3RlbSB1bmRlciB0ZXN0IiIiCisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRnJhbmsgSGFycmlzb24gPGZyYW5rQGRvdWJsZXRoZWZpc2guY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MsbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcsbm8tc2VsZi11c2UKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgb3MKKworaW1wb3J0IHB5dGVzdAorCitpbXBvcnQgcHlsaW50LmludGVyZmFjZXMKK2ltcG9ydCBweWxpbnQubGludC5wYXJhbGxlbAorZnJvbSBweWxpbnQuY2hlY2tlcnMuYmFzZV9jaGVja2VyIGltcG9ydCBCYXNlQ2hlY2tlcgorZnJvbSBweWxpbnQubGludCBpbXBvcnQgUHlMaW50ZXIKK2Zyb20gcHlsaW50LmxpbnQucGFyYWxsZWwgaW1wb3J0IF93b3JrZXJfY2hlY2tfc2luZ2xlX2ZpbGUgYXMgd29ya2VyX2NoZWNrX3NpbmdsZV9maWxlCitmcm9tIHB5bGludC5saW50LnBhcmFsbGVsIGltcG9ydCBfd29ya2VyX2luaXRpYWxpemUgYXMgd29ya2VyX2luaXRpYWxpemUKK2Zyb20gcHlsaW50LmxpbnQucGFyYWxsZWwgaW1wb3J0IGNoZWNrX3BhcmFsbGVsCitmcm9tIHB5bGludC50ZXN0dXRpbHMgaW1wb3J0IEdlbmVyaWNUZXN0UmVwb3J0ZXIgYXMgUmVwb3J0ZXIKKworCitkZWYgX2dlbl9maWxlX2RhdGEoaWR4PTApOgorICAgICIiIkdlbmVyYXRlcyBhIGZpbGUgdG8gdXNlIGFzIGEgc3RyZWFtIiIiCisgICAgZmlsZXBhdGggPSBvcy5wYXRoLmFic3BhdGgoCisgICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiaW5wdXQiLCAic2ltaWxhcjEiKQorICAgICkKKyAgICBmaWxlX2RhdGEgPSAoCisgICAgICAgICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtJWQtLSIgJSBpZHgsCisgICAgICAgIGZpbGVwYXRoLAorICAgICAgICAiLS10ZXN0LWZpbGVfZGF0YS1tb2RuYW1lLSVkLS0iICUgaWR4LAorICAgICkKKyAgICByZXR1cm4gZmlsZV9kYXRhCisKKworZGVmIF9nZW5fZmlsZV9kYXRhcyhjb3VudD0xKToKKyAgICByZXR1cm4gW19nZW5fZmlsZV9kYXRhKGlkeCkgZm9yIGlkeCBpbiByYW5nZShjb3VudCldCisKKworY2xhc3MgU2VxdWVudGlhbFRlc3RDaGVja2VyKEJhc2VDaGVja2VyKToKKyAgICAiIiJBIGNoZWNrZXIgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGNvbnNvbGlkYXRlIGRhdGEgYWNyb3NzIHJ1biBpbnZvY2F0aW9ucyIiIgorCisgICAgX19pbXBsZW1lbnRzX18gPSAocHlsaW50LmludGVyZmFjZXMuSVJhd0NoZWNrZXIsKQorCisgICAgbmFtZSA9ICJzZXF1ZW50aWFsLWNoZWNrZXIiCisgICAgdGVzdF9kYXRhID0gInNlcXVlbnRpYWwiCisgICAgbXNncyA9IHsKKyAgICAgICAgIlI5OTk5IjogKAorICAgICAgICAgICAgIlRlc3QiLAorICAgICAgICAgICAgInNlcXVlbnRpYWwtdGVzdC1jaGVjayIsCisgICAgICAgICAgICAiU29tZSBoZWxwZnVsIHRleHQuIiwKKyAgICAgICAgKQorICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW50ZXIsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18obGludGVyLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuZGF0YSA9IFtdCisgICAgICAgIHNlbGYubGludGVyID0gbGludGVyCisKKyAgICBkZWYgcHJvY2Vzc19tb2R1bGUoc2VsZiwgX2FzdHJvaWQpOgorICAgICAgICAiIiJDYWxsZWQgb25jZSBwZXIgc3RyZWFtL2ZpbGUvYXN0cm9pZCBvYmplY3QiIiIKKyAgICAgICAgIyByZWNvcmQgdGhlIG51bWJlciBvZiBpbnZvY2F0aW9ucyB3aXRoIHRoZSBkYXRhIG9iamVjdAorICAgICAgICByZWNvcmQgPSBzZWxmLnRlc3RfZGF0YSArIHN0cihsZW4oc2VsZi5kYXRhKSkKKyAgICAgICAgc2VsZi5kYXRhLmFwcGVuZChyZWNvcmQpCisKKworY2xhc3MgRXh0cmFTZXF1ZW50aWFsVGVzdENoZWNrZXIoU2VxdWVudGlhbFRlc3RDaGVja2VyKToKKyAgICAiIiJBIGNoZWNrZXIgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGNvbnNvbGlkYXRlIGRhdGEgYWNyb3NzIHJ1biBpbnZvY2F0aW9ucyIiIgorCisgICAgbmFtZSA9ICJleHRyYS1zZXF1ZW50aWFsLWNoZWNrZXIiCisgICAgdGVzdF9kYXRhID0gImV4dHJhLXNlcXVlbnRpYWwiCisKKworY2xhc3MgVGhpcmRTZXF1ZW50aWFsVGVzdENoZWNrZXIoU2VxdWVudGlhbFRlc3RDaGVja2VyKToKKyAgICAiIiJBIGNoZWNrZXIgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGNvbnNvbGlkYXRlIGRhdGEgYWNyb3NzIHJ1biBpbnZvY2F0aW9ucyIiIgorCisgICAgbmFtZSA9ICJ0aGlyZC1zZXF1ZW50aWFsLWNoZWNrZXIiCisgICAgdGVzdF9kYXRhID0gInRoaXJkLXNlcXVlbnRpYWwiCisKKworY2xhc3MgVGVzdENoZWNrUGFyYWxsZWxGcmFtZXdvcms6CisgICAgIiIiVGVzdHMgdGhlIGNoZWNrX3BhcmFsbGVsKCkgZnVuY3Rpb24ncyBmcmFtZXdvcmsiIiIKKworICAgIGRlZiBzZXR1cF9jbGFzcyhzZWxmKToKKyAgICAgICAgc2VsZi5fcHJldl9nbG9iYWxfbGludGVyID0gcHlsaW50LmxpbnQucGFyYWxsZWwuX3dvcmtlcl9saW50ZXIKKworICAgIGRlZiB0ZWFyZG93bl9jbGFzcyhzZWxmKToKKyAgICAgICAgcHlsaW50LmxpbnQucGFyYWxsZWwuX3dvcmtlcl9saW50ZXIgPSBzZWxmLl9wcmV2X2dsb2JhbF9saW50ZXIKKworICAgIGRlZiB0ZXN0X3dvcmtlcl9pbml0aWFsaXplKHNlbGYpOgorICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICB3b3JrZXJfaW5pdGlhbGl6ZShsaW50ZXI9bGludGVyKQorICAgICAgICBhc3NlcnQgcHlsaW50LmxpbnQucGFyYWxsZWwuX3dvcmtlcl9saW50ZXIgPT0gbGludGVyCisKKyAgICBkZWYgdGVzdF93b3JrZXJfY2hlY2tfc2luZ2xlX2ZpbGVfdW5pbml0aWFsaXNlZChzZWxmKToKKyAgICAgICAgcHlsaW50LmxpbnQucGFyYWxsZWwuX3dvcmtlcl9saW50ZXIgPSBOb25lCisgICAgICAgIHdpdGggcHl0ZXN0LnJhaXNlcyggICMgT2JqZWN0cyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgbGludGVyIGludGVyZmFjZSB3aWxsIGZhaWwKKyAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBtYXRjaD0iJ05vbmVUeXBlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnb3BlbiciCisgICAgICAgICk6CisgICAgICAgICAgICB3b3JrZXJfY2hlY2tfc2luZ2xlX2ZpbGUoX2dlbl9maWxlX2RhdGEoKSkKKworICAgIGRlZiB0ZXN0X3dvcmtlcl9jaGVja19zaW5nbGVfZmlsZV9ub19jaGVja2VycyhzZWxmKToKKyAgICAgICAgbGludGVyID0gUHlMaW50ZXIocmVwb3J0ZXI9UmVwb3J0ZXIoKSkKKyAgICAgICAgd29ya2VyX2luaXRpYWxpemUobGludGVyPWxpbnRlcikKKworICAgICAgICAoCisgICAgICAgICAgICBfLCAgIyBwcm9jLWlkCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgXywgICMgZmlsZV9wYXRoCisgICAgICAgICAgICBfLCAgIyBiYXNlX25hbWUKKyAgICAgICAgICAgIG1zZ3MsCisgICAgICAgICAgICBzdGF0cywKKyAgICAgICAgICAgIG1zZ19zdGF0dXMsCisgICAgICAgICAgICBfLCAgIyBtYXByZWR1Y2VfZGF0YQorICAgICAgICApID0gd29ya2VyX2NoZWNrX3NpbmdsZV9maWxlKF9nZW5fZmlsZV9kYXRhKCkpCisgICAgICAgIGFzc2VydCBuYW1lID09ICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtMC0tIgorICAgICAgICBhc3NlcnQgW10gPT0gbXNncworICAgICAgICBub19lcnJvcnNfc3RhdHVzID0gMAorICAgICAgICBhc3NlcnQgbm9fZXJyb3JzX3N0YXR1cyA9PSBtc2dfc3RhdHVzCisgICAgICAgIGFzc2VydCB7CisgICAgICAgICAgICAiYnlfbW9kdWxlIjogeworICAgICAgICAgICAgICAgICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtMC0tIjogeworICAgICAgICAgICAgICAgICAgICAiY29udmVudGlvbiI6IDAsCisgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAgICAgICAgICJmYXRhbCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJpbmZvIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInN0YXRlbWVudCI6IDE4LAorICAgICAgICAgICAgICAgICAgICAid2FybmluZyI6IDAsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJieV9tc2ciOiB7fSwKKyAgICAgICAgICAgICJjb252ZW50aW9uIjogMCwKKyAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAiZmF0YWwiOiAwLAorICAgICAgICAgICAgImluZm8iOiAwLAorICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICJzdGF0ZW1lbnQiOiAxOCwKKyAgICAgICAgICAgICJ3YXJuaW5nIjogMCwKKyAgICAgICAgfSA9PSBzdGF0cworCisgICAgZGVmIHRlc3Rfd29ya2VyX2NoZWNrX3NlcXVlbnRpYWxfY2hlY2tlcihzZWxmKToKKyAgICAgICAgIiIiU2FtZSBhcyB0ZXN0X3dvcmtlcl9jaGVja19zaW5nbGVfZmlsZV9ub19jaGVja2VycyB3aXRoIFNlcXVlbnRpYWxUZXN0Q2hlY2tlciIiIgorICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorICAgICAgICB3b3JrZXJfaW5pdGlhbGl6ZShsaW50ZXI9bGludGVyKQorCisgICAgICAgICMgQWRkIHRoZSBvbmx5IGNoZWNrZXIgd2UgY2FyZSBhYm91dCBpbiB0aGlzIHRlc3QKKyAgICAgICAgbGludGVyLnJlZ2lzdGVyX2NoZWNrZXIoU2VxdWVudGlhbFRlc3RDaGVja2VyKGxpbnRlcikpCisKKyAgICAgICAgKAorICAgICAgICAgICAgXywgICMgcHJvYy1pZAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIF8sICAjIGZpbGVfcGF0aAorICAgICAgICAgICAgXywgICMgYmFzZV9uYW1lCisgICAgICAgICAgICBtc2dzLAorICAgICAgICAgICAgc3RhdHMsCisgICAgICAgICAgICBtc2dfc3RhdHVzLAorICAgICAgICAgICAgXywgICMgbWFwcmVkdWNlX2RhdGEKKyAgICAgICAgKSA9IHdvcmtlcl9jaGVja19zaW5nbGVfZmlsZShfZ2VuX2ZpbGVfZGF0YSgpKQorCisgICAgICAgICMgRW5zdXJlIHdlIHJldHVybiB0aGUgc2FtZSBkYXRhIGFzIHRoZSBzaW5nbGVfZmlsZV9ub19jaGVja2VycyB0ZXN0CisgICAgICAgIGFzc2VydCBuYW1lID09ICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtMC0tIgorICAgICAgICBhc3NlcnQgW10gPT0gbXNncworICAgICAgICBub19lcnJvcnNfc3RhdHVzID0gMAorICAgICAgICBhc3NlcnQgbm9fZXJyb3JzX3N0YXR1cyA9PSBtc2dfc3RhdHVzCisgICAgICAgIGFzc2VydCB7CisgICAgICAgICAgICAiYnlfbW9kdWxlIjogeworICAgICAgICAgICAgICAgICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtMC0tIjogeworICAgICAgICAgICAgICAgICAgICAiY29udmVudGlvbiI6IDAsCisgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAgICAgICAgICJmYXRhbCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJpbmZvIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInN0YXRlbWVudCI6IDE4LAorICAgICAgICAgICAgICAgICAgICAid2FybmluZyI6IDAsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJieV9tc2ciOiB7fSwKKyAgICAgICAgICAgICJjb252ZW50aW9uIjogMCwKKyAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAiZmF0YWwiOiAwLAorICAgICAgICAgICAgImluZm8iOiAwLAorICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICJzdGF0ZW1lbnQiOiAxOCwKKyAgICAgICAgICAgICJ3YXJuaW5nIjogMCwKKyAgICAgICAgfSA9PSBzdGF0cworCisKK2NsYXNzIFRlc3RDaGVja1BhcmFsbGVsOgorICAgICIiIlRlc3RzIHRoZSBjaGVja19wYXJhbGxlbCgpIGZ1bmN0aW9uIiIiCisKKyAgICBkZWYgdGVzdF9zZXF1ZW50aWFsX2NoZWNrZXJzX3dvcmsoc2VsZik6CisgICAgICAgICIiIlRlc3RzIG9yaWdpbmFsIGJhc2ljIHR5cGVzIG9mIGNoZWNrZXIgd29ya3MgYXMgZXhwZWN0ZWQgaW4gLWpOCisKKyAgICAgICAgVGhpcyBtZWFucyB0aGF0IGEgc2VxdWVudGlhbCBjaGVja2VyIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgZGF0YSBmb3IgYSBnaXZlbgorICAgICAgICBmaWxlLXN0cmVhbSBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBpdHMgcnVuIGluIC1qMSBvciAtak4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbnRlciA9IFB5TGludGVyKHJlcG9ydGVyPVJlcG9ydGVyKCkpCisKKyAgICAgICAgIyBBZGQgYSBzZXF1ZW50aWFsIGNoZWNrZXIgdG8gZW5zdXJlIGl0IHJlY29yZHMgZGF0YSBhZ2FpbnN0IHNvbWUgc3RyZWFtcworICAgICAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihTZXF1ZW50aWFsVGVzdENoZWNrZXIobGludGVyKSkKKyAgICAgICAgbGludGVyLmVuYWJsZSgiUjk5OTkiKQorCisgICAgICAgICMgQ3JlYXRlIGEgZHVtbXkgZmlsZSwgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB3aGljaCB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlCisgICAgICAgICMgcmVnaXN0ZXIgdGVzdCBjaGVja2VycywgYnV0IGl0IHdpbGwgdHJpZ2dlciBhdCBsZWFzdCBhIHNpbmdsZS1qb2IgdG8gYmUgcnVuLgorICAgICAgICBzaW5nbGVfZmlsZV9jb250YWluZXIgPSBfZ2VuX2ZpbGVfZGF0YXMoY291bnQ9MSkKKworICAgICAgICAjIEludm9rZSB0aGUgbGludCBwcm9jZXNzIGluIGEgbXVsdGlwcm9jZXNzIHdheSwgYWx0aG91Z2ggd2Ugb25seSBzcGVjaWZ5IG9uZQorICAgICAgICAjIGpvYi4KKyAgICAgICAgY2hlY2tfcGFyYWxsZWwobGludGVyLCBqb2JzPTEsIGZpbGVzPXNpbmdsZV9maWxlX2NvbnRhaW5lciwgYXJndW1lbnRzPU5vbmUpCisgICAgICAgIGFzc2VydCBsZW4obGludGVyLmdldF9jaGVja2VycygpKSA9PSAyLCAoCisgICAgICAgICAgICAiV2Ugc2hvdWxkIG9ubHkgaGF2ZSB0aGUgJ21hc3RlcicgYW5kICdzZXF1ZW50aWFsLWNoZWNrZXInICIKKyAgICAgICAgICAgICJjaGVja2VycyByZWdpc3RlcmVkIgorICAgICAgICApCisgICAgICAgIGFzc2VydCB7CisgICAgICAgICAgICAiYnlfbW9kdWxlIjogeworICAgICAgICAgICAgICAgICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtMC0tIjogeworICAgICAgICAgICAgICAgICAgICAiY29udmVudGlvbiI6IDAsCisgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAgICAgICAgICJmYXRhbCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJpbmZvIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInN0YXRlbWVudCI6IDE4LAorICAgICAgICAgICAgICAgICAgICAid2FybmluZyI6IDAsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJieV9tc2ciOiB7fSwKKyAgICAgICAgICAgICJjb252ZW50aW9uIjogMCwKKyAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAiZmF0YWwiOiAwLAorICAgICAgICAgICAgImluZm8iOiAwLAorICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICJzdGF0ZW1lbnQiOiAxOCwKKyAgICAgICAgICAgICJ3YXJuaW5nIjogMCwKKyAgICAgICAgfSA9PSBsaW50ZXIuc3RhdHMKKworICAgICAgICAjIG5vdyBydW4gdGhlIHJlZ3VsYXIgbW9kZSBvZiBjaGVja2luZyBmaWxlcyBhbmQgY2hlY2sgdGhhdCwgaW4gdGhpcyBwcm9jLCB3ZQorICAgICAgICAjIGNvbGxlY3QgdGhlIHJpZ2h0IGRhdGEKKyAgICAgICAgZmlsZXBhdGggPSBzaW5nbGVfZmlsZV9jb250YWluZXJbMF1bMV0gICMgZ2V0IHRoZSBmaWxlcGF0aCBlbGVtZW50CisgICAgICAgIGxpbnRlci5jaGVjayhmaWxlcGF0aCkKKyAgICAgICAgYXNzZXJ0IHsKKyAgICAgICAgICAgICJieV9tb2R1bGUiOiB7CisgICAgICAgICAgICAgICAgImlucHV0LnNpbWlsYXIxIjogeyAgIyBtb2R1bGUgaXMgdGhlIG9ubHkgY2hhbmdlIGZyb20gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgImNvbnZlbnRpb24iOiAwLAorICAgICAgICAgICAgICAgICAgICAiZXJyb3IiOiAwLAorICAgICAgICAgICAgICAgICAgICAiZmF0YWwiOiAwLAorICAgICAgICAgICAgICAgICAgICAiaW5mbyI6IDAsCisgICAgICAgICAgICAgICAgICAgICJyZWZhY3RvciI6IDAsCisgICAgICAgICAgICAgICAgICAgICJzdGF0ZW1lbnQiOiAxOCwKKyAgICAgICAgICAgICAgICAgICAgIndhcm5pbmciOiAwLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYnlfbXNnIjoge30sCisgICAgICAgICAgICAiY29udmVudGlvbiI6IDAsCisgICAgICAgICAgICAiZXJyb3IiOiAwLAorICAgICAgICAgICAgImZhdGFsIjogMCwKKyAgICAgICAgICAgICJpbmZvIjogMCwKKyAgICAgICAgICAgICJyZWZhY3RvciI6IDAsCisgICAgICAgICAgICAic3RhdGVtZW50IjogMTgsCisgICAgICAgICAgICAid2FybmluZyI6IDAsCisgICAgICAgIH0gPT0gbGludGVyLnN0YXRzCisKKyAgICBkZWYgdGVzdF9pbnZva2Vfc2luZ2xlX2pvYihzZWxmKToKKyAgICAgICAgIiIiVGVzdHMgYmFzaWMgY2hlY2tlcnMgZnVuY3Rpb25hbGl0eSB1c2luZyBqdXN0IGEgc2luZ2xlIHdvcmtkZXJkbworCisgICAgICAgIFRoaXMgaXMgKm5vdCogdGhlIHNhbWUgLWoxIGFuZCBkb2VzIG5vdCBoYXBwZW4gdW5kZXIgbm9ybWFsIG9wZXJhdGlvbiIiIgorICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1SZXBvcnRlcigpKQorCisgICAgICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFNlcXVlbnRpYWxUZXN0Q2hlY2tlcihsaW50ZXIpKQorCisgICAgICAgICMgQ3JlYXRlIGEgZHVtbXkgZmlsZSwgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB3aGljaCB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlCisgICAgICAgICMgcmVnaXN0ZXIgdGVzdCBjaGVja2VycywgYnV0IGl0IHdpbGwgdHJpZ2dlciBhdCBsZWFzdCBhIHNpbmdsZS1qb2IgdG8gYmUgcnVuLgorICAgICAgICBzaW5nbGVfZmlsZV9jb250YWluZXIgPSBfZ2VuX2ZpbGVfZGF0YXMoY291bnQ9MSkKKworICAgICAgICAjIEludm9rZSB0aGUgbGludCBwcm9jZXNzIGluIGEgbXVsdGlwcm9jZXNzIHdheSwgYWx0aG91Z2ggd2Ugb25seSBzcGVjaWZ5IG9uZQorICAgICAgICAjIGpvYi4KKyAgICAgICAgY2hlY2tfcGFyYWxsZWwobGludGVyLCBqb2JzPTEsIGZpbGVzPXNpbmdsZV9maWxlX2NvbnRhaW5lciwgYXJndW1lbnRzPU5vbmUpCisKKyAgICAgICAgYXNzZXJ0IHsKKyAgICAgICAgICAgICJieV9tb2R1bGUiOiB7CisgICAgICAgICAgICAgICAgIi0tdGVzdC1maWxlX2RhdGEtbmFtZS0wLS0iOiB7CisgICAgICAgICAgICAgICAgICAgICJjb252ZW50aW9uIjogMCwKKyAgICAgICAgICAgICAgICAgICAgImVycm9yIjogMCwKKyAgICAgICAgICAgICAgICAgICAgImZhdGFsIjogMCwKKyAgICAgICAgICAgICAgICAgICAgImluZm8iOiAwLAorICAgICAgICAgICAgICAgICAgICAicmVmYWN0b3IiOiAwLAorICAgICAgICAgICAgICAgICAgICAic3RhdGVtZW50IjogMTgsCisgICAgICAgICAgICAgICAgICAgICJ3YXJuaW5nIjogMCwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImJ5X21zZyI6IGNvbGxlY3Rpb25zLkNvdW50ZXIoKSwKKyAgICAgICAgICAgICJjb252ZW50aW9uIjogMCwKKyAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAiZmF0YWwiOiAwLAorICAgICAgICAgICAgImluZm8iOiAwLAorICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICJzdGF0ZW1lbnQiOiAxOCwKKyAgICAgICAgICAgICJ3YXJuaW5nIjogMCwKKyAgICAgICAgfSA9PSBsaW50ZXIuc3RhdHMKKyAgICAgICAgYXNzZXJ0IGxpbnRlci5tc2dfc3RhdHVzID09IDAsICJXZSBleHBlY3QgYSBzaW5nbGUtZmlsZSBjaGVjayB0byBleGl0IGNsZWFubHkiCisKKyAgICBAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgICAgICJudW1fZmlsZXMsbnVtX2pvYnMsbnVtX2NoZWNrZXJzIiwKKyAgICAgICAgWworICAgICAgICAgICAgKDEsIDIsIDEpLAorICAgICAgICAgICAgKDEsIDIsIDIpLAorICAgICAgICAgICAgKDEsIDIsIDMpLAorICAgICAgICAgICAgKDIsIDIsIDEpLAorICAgICAgICAgICAgKDIsIDIsIDIpLAorICAgICAgICAgICAgKDIsIDIsIDMpLAorICAgICAgICAgICAgKDMsIDIsIDEpLAorICAgICAgICAgICAgKDMsIDIsIDIpLAorICAgICAgICAgICAgKDMsIDIsIDMpLAorICAgICAgICAgICAgKDMsIDEsIDEpLAorICAgICAgICAgICAgKDMsIDEsIDIpLAorICAgICAgICAgICAgKDMsIDEsIDMpLAorICAgICAgICAgICAgKDMsIDUsIDEpLAorICAgICAgICAgICAgKDMsIDUsIDIpLAorICAgICAgICAgICAgKDMsIDUsIDMpLAorICAgICAgICAgICAgKDEwLCAyLCAxKSwKKyAgICAgICAgICAgICgxMCwgMiwgMiksCisgICAgICAgICAgICAoMTAsIDIsIDMpLAorICAgICAgICAgICAgKDIsIDEwLCAxKSwKKyAgICAgICAgICAgICgyLCAxMCwgMiksCisgICAgICAgICAgICAoMiwgMTAsIDMpLAorICAgICAgICBdLAorICAgICkKKyAgICBkZWYgdGVzdF9jb21wYXJlX3dvcmtlcnNfdG9fc2luZ2xlX3Byb2Moc2VsZiwgbnVtX2ZpbGVzLCBudW1fam9icywgbnVtX2NoZWNrZXJzKToKKyAgICAgICAgIiIiQ29tcGFyZXMgdGhlIDMga2V5IHBhcmFtZXRlcnMgZm9yIGNoZWNrX3BhcmFsbGVsKCkgcHJvZHVjZXMgdGhlIHNhbWUgcmVzdWx0cworCisgICAgICAgIFRoZSBpbnRlbnQgaGVyZSBpcyB0byBlbnN1cmUgdGhhdCB0aGUgY2hlY2tfcGFyYWxsZWwoKSBvcGVyYXRlcyBvbiBlYWNoIGZpbGUsCisgICAgICAgIHdpdGhvdXQgb3JkZXJpbmcgaXNzdWVzLCBpcnJlc3BlY3RpdmUgb2YgdGhlIG51bWJlciBvZiB3b3JrZXJzIHVzZWQgYW5kIHRoZQorICAgICAgICBudW1iZXIgb2YgY2hlY2tlcnMgYXBwbGllZC4KKworICAgICAgICBUaGlzIHRlc3QgYmVjb21lcyBtb3JlIGltcG9ydGFudCBpZiB3ZSB3YW50IHRvIGNoYW5nZSBob3cgd2UgcGFyYW1ldHJpc2UgdGhlCisgICAgICAgIGNoZWNrZXJzLCBmb3IgZXhhbXBsZSBpZiB3ZSBhaW0gdG8gYmF0Y2ggdGhlIGZpbGVzIGFjcm9zcyBqb2JzLiIiIgorCisgICAgICAgICMgZGVmaW5lIHRoZSBzdGF0cyB3ZSBleHBlY3QgdG8gZ2V0IGJhY2sgZnJvbSB0aGUgcnVucywgdGhlc2Ugc2hvdWxkIG9ubHkgdmFyeQorICAgICAgICAjIHdpdGggdGhlIG51bWJlciBvZiBmaWxlcy4KKyAgICAgICAgZXhwZWN0ZWRfc3RhdHMgPSB7CisgICAgICAgICAgICAiYnlfbW9kdWxlIjogeworICAgICAgICAgICAgICAgICItLXRlc3QtZmlsZV9kYXRhLW5hbWUtJWQtLSIKKyAgICAgICAgICAgICAgICAlIGlkeDogeworICAgICAgICAgICAgICAgICAgICAiY29udmVudGlvbiI6IDAsCisgICAgICAgICAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAgICAgICAgICJmYXRhbCI6IDAsCisgICAgICAgICAgICAgICAgICAgICJpbmZvIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICAgICAgICAgInN0YXRlbWVudCI6IDE4LAorICAgICAgICAgICAgICAgICAgICAid2FybmluZyI6IDAsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciBpZHggaW4gcmFuZ2UobnVtX2ZpbGVzKQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJieV9tc2ciOiB7fSwKKyAgICAgICAgICAgICJjb252ZW50aW9uIjogMCwKKyAgICAgICAgICAgICJlcnJvciI6IDAsCisgICAgICAgICAgICAiZmF0YWwiOiAwLAorICAgICAgICAgICAgImluZm8iOiAwLAorICAgICAgICAgICAgInJlZmFjdG9yIjogMCwKKyAgICAgICAgICAgICJzdGF0ZW1lbnQiOiAxOCAqIG51bV9maWxlcywKKyAgICAgICAgICAgICJ3YXJuaW5nIjogMCwKKyAgICAgICAgfQorCisgICAgICAgIGZpbGVfaW5mb3MgPSBfZ2VuX2ZpbGVfZGF0YXMobnVtX2ZpbGVzKQorCisgICAgICAgICMgTG9vcCBmb3Igc2luZ2xlLXByb2MgYW5kIG11bHQtcHJvYyBzbyB3ZSBjYW4gZW5zdXJlIHRoZSBzYW1lIGxpbnRlci1jb25maWcKKyAgICAgICAgZm9yIGRvX3NpbmdsZV9wcm9jIGluIHJhbmdlKDIpOgorICAgICAgICAgICAgbGludGVyID0gUHlMaW50ZXIocmVwb3J0ZXI9UmVwb3J0ZXIoKSkKKworICAgICAgICAgICAgIyBBc3NpZ24gYmV0d2VlbiAxIGFuZCAzIGNoZWNrZXJzIHRvIHRoZSBsaW50ZXIsIHRoZXkgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlCisgICAgICAgICAgICAjIHJlc3VsdHMgb2YgdGhlIGxpbnQKKyAgICAgICAgICAgIGxpbnRlci5yZWdpc3Rlcl9jaGVja2VyKFNlcXVlbnRpYWxUZXN0Q2hlY2tlcihsaW50ZXIpKQorICAgICAgICAgICAgaWYgbnVtX2NoZWNrZXJzID4gMToKKyAgICAgICAgICAgICAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihFeHRyYVNlcXVlbnRpYWxUZXN0Q2hlY2tlcihsaW50ZXIpKQorICAgICAgICAgICAgaWYgbnVtX2NoZWNrZXJzID4gMjoKKyAgICAgICAgICAgICAgICBsaW50ZXIucmVnaXN0ZXJfY2hlY2tlcihUaGlyZFNlcXVlbnRpYWxUZXN0Q2hlY2tlcihsaW50ZXIpKQorCisgICAgICAgICAgICBpZiBkb19zaW5nbGVfcHJvYzoKKyAgICAgICAgICAgICAgICAjIGVzdGFibGlzaCB0aGUgYmFzZWxpbmUKKyAgICAgICAgICAgICAgICBhc3NlcnQgKAorICAgICAgICAgICAgICAgICAgICBsaW50ZXIuY29uZmlnLmpvYnMgPT0gMQorICAgICAgICAgICAgICAgICksICJqb2JzPjEgYXJlIGlnbm9yZWQgd2hlbiBjYWxsaW5nIF9jaGVja19maWxlcyIKKyAgICAgICAgICAgICAgICBsaW50ZXIuX2NoZWNrX2ZpbGVzKGxpbnRlci5nZXRfYXN0LCBmaWxlX2luZm9zKQorICAgICAgICAgICAgICAgIGFzc2VydCBsaW50ZXIubXNnX3N0YXR1cyA9PSAwLCAiV2Ugc2hvdWxkIG5vdCBmYWlsIHRoZSBsaW50IgorICAgICAgICAgICAgICAgIHN0YXRzX3NpbmdsZV9wcm9jID0gbGludGVyLnN0YXRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoZWNrX3BhcmFsbGVsKAorICAgICAgICAgICAgICAgICAgICBsaW50ZXIsCisgICAgICAgICAgICAgICAgICAgIGpvYnM9bnVtX2pvYnMsCisgICAgICAgICAgICAgICAgICAgIGZpbGVzPWZpbGVfaW5mb3MsCisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cz1Ob25lLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBzdGF0c19jaGVja19wYXJhbGxlbCA9IGxpbnRlci5zdGF0cworICAgICAgICAgICAgICAgIGFzc2VydCBsaW50ZXIubXNnX3N0YXR1cyA9PSAwLCAiV2Ugc2hvdWxkIG5vdCBmYWlsIHRoZSBsaW50IgorCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBzdGF0c19zaW5nbGVfcHJvYyA9PSBzdGF0c19jaGVja19wYXJhbGxlbAorICAgICAgICApLCAiU2luZ2xlLXByb2MgYW5kIGNoZWNrX3BhcmFsbGVsKCkgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB0aGluZyIKKyAgICAgICAgYXNzZXJ0ICgKKyAgICAgICAgICAgIHN0YXRzX2NoZWNrX3BhcmFsbGVsID09IGV4cGVjdGVkX3N0YXRzCisgICAgICAgICksICJUaGUgbGludCBpcyByZXR1cm5pbmcgdW5leHBlY3RlZCByZXN1bHRzLCBoYXMgc29tZXRoaW5nIGNoYW5nZWQ/IgpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdF9jb25maWcucHkgYi90ZXN0cy90ZXN0X2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ZhYzMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdF9jb25maWcucHkKQEAgLTAsMCArMSw5MyBAQAorIyBweWxpbnQ6IGRpc2FibGU9bWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nLCBtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZywgcHJvdGVjdGVkLWFjY2VzcworaW1wb3J0IHVuaXR0ZXN0Lm1vY2sKKworaW1wb3J0IHB5bGludC5saW50CisKKworZGVmIGNoZWNrX2NvbmZpZ3VyYXRpb25fZmlsZV9yZWFkZXIoY29uZmlnX2ZpbGUpOgorICAgICIiIkluaXRpYWxpemUgcHlsaW50IHdpdGggdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgY2hlY2sgdGhhdAorICAgIHdoYXQgd2UgaW5pdGlhbGl6ZWQgdGhlIGxpbnRlciB3aXRoIHdoYXQgd2FzIGV4cGVjdGVkLgorICAgICIiIgorICAgIGFyZ3MgPSBbIi0tcmNmaWxlIiwgc3RyKGNvbmZpZ19maWxlKSwgX19maWxlX19dCisgICAgIyBJZiB3ZSB1c2VkIGBweXRlc3QucmFpc2VzKFN5c3RlbUV4aXQpYCwgdGhlIGBydW5uZXJgIHZhcmlhYmxlCisgICAgIyB3b3VsZCBub3QgYmUgYWNjZXNzaWJsZSBvdXRzaWRlIHRoZSBgd2l0aGAgYmxvY2suCisgICAgd2l0aCB1bml0dGVzdC5tb2NrLnBhdGNoKCJzeXMuZXhpdCIpIGFzIG1vY2tlZF9leGl0OgorICAgICAgICAjIERvIG5vdCBhY3R1YWxseSBydW4gY2hlY2tzLCB0aGF0IGNvdWxkIGJlIHNsb3cuIERvIG5vdCBtb2NrCisgICAgICAgICMgYFB5bGludGVyLmNoZWNrYDogaXQgY2FsbHMgYFB5bGludGVyLmluaXRpYWxpemVgIHdoaWNoIGlzCisgICAgICAgICMgbmVlZGVkIHRvIHByb3Blcmx5IHNldCB1cCBtZXNzYWdlcyBpbmNsdXNpb24vZXhjbHVzaW9uCisgICAgICAgICMgaW4gYF9tc2dfc3RhdGVzYCwgdXNlZCBieSBgaXNfbWVzc2FnZV9lbmFibGVkYC4KKyAgICAgICAgd2l0aCB1bml0dGVzdC5tb2NrLnBhdGNoKCJweWxpbnQubGludC5weWxpbnRlci5jaGVja19wYXJhbGxlbCIpOgorICAgICAgICAgICAgcnVubmVyID0gcHlsaW50LmxpbnQuUnVuKGFyZ3MpCisKKyAgICAjICJsb2dnaW5nLW5vdC1sYXp5IiBhbmQgImxvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb24iCisgICAgZXhwZWN0ZWRfZGlzYWJsZWQgPSB7IlcxMjAxIiwgIlcxMjAyIn0KKyAgICBmb3IgbXNnaWQgaW4gZXhwZWN0ZWRfZGlzYWJsZWQ6CisgICAgICAgIGFzc2VydCBub3QgcnVubmVyLmxpbnRlci5pc19tZXNzYWdlX2VuYWJsZWQobXNnaWQpCisgICAgYXNzZXJ0IHJ1bm5lci5saW50ZXIuY29uZmlnLmpvYnMgPT0gMTAKKyAgICBhc3NlcnQgcnVubmVyLmxpbnRlci5jb25maWcucmVwb3J0cworCisgICAgbW9ja2VkX2V4aXQuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgoMCkKKyAgICByZXR1cm4gcnVubmVyCisKKworZGVmIHRlc3RfY2FuX3JlYWRfaW5pKHRtcF9wYXRoKToKKyAgICAjIENoZWNrIHRoYXQgd2UgY2FuIHJlYWQgdGhlICJyZWd1bGFyIiBJTkkgLnB5bGludHJjIGZpbGUKKyAgICBjb25maWdfZmlsZSA9IHRtcF9wYXRoIC8gIi5weWxpbnRyYyIKKyAgICBjb25maWdfZmlsZS53cml0ZV90ZXh0KAorICAgICAgICAiIiIKK1ttZXNzYWdlcyBjb250cm9sXQorZGlzYWJsZSA9IGxvZ2dpbmctbm90LWxhenksbG9nZ2luZy1mb3JtYXQtaW50ZXJwb2xhdGlvbgoram9icyA9IDEwCityZXBvcnRzID0geWVzCisiIiIKKyAgICApCisgICAgY2hlY2tfY29uZmlndXJhdGlvbl9maWxlX3JlYWRlcihjb25maWdfZmlsZSkKKworCitkZWYgdGVzdF9jYW5fcmVhZF9zZXR1cF9jZmcodG1wX3BhdGgpOgorICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gcmVhZCBhIHNldHVwLmNmZyAod2hpY2ggaXMgYW4gSU5JIGZpbGUgd2hlcmUKKyAgICAjIHNlY3Rpb24gbmFtZXMgYXJlIHByZWZpeGVkIHdpdGggInB5bGludC4iCisgICAgY29uZmlnX2ZpbGUgPSB0bXBfcGF0aCAvICJzZXR1cC5jZmciCisgICAgY29uZmlnX2ZpbGUud3JpdGVfdGV4dCgKKyAgICAgICAgIiIiCitbcHlsaW50Lm1lc3NhZ2VzIGNvbnRyb2xdCitkaXNhYmxlID0gbG9nZ2luZy1ub3QtbGF6eSxsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uCitqb2JzID0gMTAKK3JlcG9ydHMgPSB5ZXMKKyIiIgorICAgICkKKyAgICBjaGVja19jb25maWd1cmF0aW9uX2ZpbGVfcmVhZGVyKGNvbmZpZ19maWxlKQorCisKK2RlZiB0ZXN0X2Nhbl9yZWFkX3RvbWwodG1wX3BhdGgpOgorICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gcmVhZCBhIFRPTUwgZmlsZSB3aGVyZSBsaXN0cyBhbmQgaW50ZWdlcnMgYXJlCisgICAgIyBleHByZXNzZWQgYXMgc3RyaW5ncy4KKyAgICBjb25maWdfZmlsZSA9IHRtcF9wYXRoIC8gInB5cHJvamVjdC50b21sIgorICAgIGNvbmZpZ19maWxlLndyaXRlX3RleHQoCisgICAgICAgICIiIgorW3Rvb2wucHlsaW50LiJtZXNzYWdlcyBjb250cm9sIl0KK2Rpc2FibGUgPSAibG9nZ2luZy1ub3QtbGF6eSxsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uIgoram9icyA9ICIxMCIKK3JlcG9ydHMgPSAieWVzIgorIiIiCisgICAgKQorICAgIGNoZWNrX2NvbmZpZ3VyYXRpb25fZmlsZV9yZWFkZXIoY29uZmlnX2ZpbGUpCisKKworZGVmIHRlc3RfY2FuX3JlYWRfdG9tbF9yaWNoX3R5cGVzKHRtcF9wYXRoKToKKyAgICAjIENoZWNrIHRoYXQgd2UgY2FuIHJlYWQgYSBUT01MIGZpbGUgd2hlcmUgbGlzdHMsIGludGVnZXJzIGFuZAorICAgICMgYm9vbGVhbnMgYXJlIGV4cHJlc3NlZCBhcyBzdWNoIChhbmQgbm90IGFzIHN0cmluZ3MpLCB1c2luZyBUT01MCisgICAgIyB0eXBlIHN5c3RlbS4KKyAgICBjb25maWdfZmlsZSA9IHRtcF9wYXRoIC8gInB5cHJvamVjdC50b21sIgorICAgIGNvbmZpZ19maWxlLndyaXRlX3RleHQoCisgICAgICAgICIiIgorW3Rvb2wucHlsaW50LiJtZXNzYWdlcyBjb250cm9sIl0KK2Rpc2FibGUgPSBbCisgICAgImxvZ2dpbmctbm90LWxhenkiLAorICAgICJsb2dnaW5nLWZvcm1hdC1pbnRlcnBvbGF0aW9uIiwKK10KK2pvYnMgPSAxMAorcmVwb3J0cyA9IHRydWUKKyIiIgorICAgICkKKyAgICBjaGVja19jb25maWd1cmF0aW9uX2ZpbGVfcmVhZGVyKGNvbmZpZ19maWxlKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdF9lcHlsaW50LnB5IGIvdGVzdHMvdGVzdF9lcHlsaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2MyYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0X2VweWxpbnQucHkKQEAgLTAsMCArMSw2MSBAQAorIiIiVGVzdCBmb3IgaXNzdWUgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvNDI4NiIiIgorIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLW91dGVyLW5hbWUKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQgaW1wb3J0IGVweWxpbnQgYXMgbGludAorCisKK0BweXRlc3QuZml4dHVyZSgpCitkZWYgZXhhbXBsZV9wYXRoKHRtcF9wYXRoKToKKyAgICBjb250ZW50ID0gIiIiY2xhc3MgSXZyQXVkaW9BcHA6CisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmhhc3NhbigpCisgICAgIiIiCisgICAgcGF0aCA9IHRtcF9wYXRoIC8gIm15X2FwcC5weSIKKyAgICB3aXRoIG9wZW4ocGF0aCwgInciKSBhcyBmOgorICAgICAgICBmLndyaXRlKGNvbnRlbnQpCisgICAgcmV0dXJuIHBhdGgKKworCitkZWYgdGVzdF9lcHlsaW50X2dvb2RfY29tbWFuZChleGFtcGxlX3BhdGgpOgorICAgIG91dCwgZXJyID0gbGludC5weV9ydW4oCisgICAgICAgICIlcyAtRSAtLWRpc2FibGU9RTExMTEgLS1tc2ctdGVtcGxhdGUgJ3tjYXRlZ29yeX0ge21vZHVsZX0ge29ian0ge2xpbmV9IHtjb2x1bW59IHttc2d9JyIKKyAgICAgICAgJSBleGFtcGxlX3BhdGgsCisgICAgICAgIHJldHVybl9zdGQ9VHJ1ZSwKKyAgICApCisgICAgbXNnID0gb3V0LnJlYWQoKQorICAgIGFzc2VydCAoCisgICAgICAgIG1zZworICAgICAgICA9PSAiIiJcCisqKioqKioqKioqKioqIE1vZHVsZSBteV9hcHAKKyBlcnJvciBteV9hcHAgSXZyQXVkaW9BcHAucnVuIDQgOCBJbnN0YW5jZSBvZiAnSXZyQXVkaW9BcHAnIGhhcyBubyAnaGFzc2FuJyBtZW1iZXIKKyAiIiIKKyAgICApCisgICAgYXNzZXJ0IGVyci5yZWFkKCkgPT0gIiIKKworCitkZWYgdGVzdF9lcHlsaW50X3N0cmFuZ2VfY29tbWFuZChleGFtcGxlX3BhdGgpOgorICAgIG91dCwgZXJyID0gbGludC5weV9ydW4oCisgICAgICAgICIlcyAtRSAtLWRpc2FibGU9RTExMTEgLS1tc2ctdGVtcGxhdGU9e2NhdGVnb3J5fSB7bW9kdWxlfSB7b2JqfSB7bGluZX0ge2NvbHVtbn0ge21zZ30iCisgICAgICAgICUgZXhhbXBsZV9wYXRoLAorICAgICAgICByZXR1cm5fc3RkPVRydWUsCisgICAgKQorICAgIGFzc2VydCAoCisgICAgICAgIG91dC5yZWFkKCkKKyAgICAgICAgPT0gIiIiXAorKioqKioqKioqKioqKiBNb2R1bGUge21vZHVsZX0KKyBmYXRhbAorICoqKioqKioqKioqKiogTW9kdWxlIHtvYmp9CisgZmF0YWwKKyAqKioqKioqKioqKioqIE1vZHVsZSB7bGluZX0KKyBmYXRhbAorICoqKioqKioqKioqKiogTW9kdWxlIHtjb2x1bW59CisgZmF0YWwKKyAqKioqKioqKioqKioqIE1vZHVsZSB7bXNnfQorIGZhdGFsCisgKioqKioqKioqKioqKiBNb2R1bGUgbXlfYXBwCisgZXJyb3IKKyAiIiIKKyAgICApCisgICAgYXNzZXJ0IGVyci5yZWFkKCkgPT0gIiIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RfZnVuYy5weSBiL3Rlc3RzL3Rlc3RfZnVuYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVkZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdF9mdW5jLnB5CkBAIC0wLDAgKzEsMTczIEBACisjIENvcHlyaWdodCAoYykgMjAwNi0yMDEwLCAyMDEzLTIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTIgRkVMRCBCb3JpcyA8bG90aGlyYWxkYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBNaWNoYWwgTm93aWtvd3NraSA8Z29kZnJ5ZEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBNaWNoa2EgUG9wb2ZmIDxtaWNoa2Fwb3BvZmZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z28gdmFuIEtlbWVuYWRlIDxodWdvdmtAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyYyBNdWVsbGVyIDwzMDEzMDM3MStjZGNlOHBAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiImZ1bmN0aW9uYWwvbm9uIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIHB5bGludCIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgam9pbgorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LnRlc3R1dGlscyBpbXBvcnQgVVBEQVRFX0ZJTEUsIFVQREFURV9PUFRJT04sIF9nZXRfdGVzdHNfaW5mbywgbGludGVyCisKK0lOUFVUX0RJUiA9IGpvaW4oZGlybmFtZShhYnNwYXRoKF9fZmlsZV9fKSksICJpbnB1dCIpCitNU0dfRElSID0gam9pbihkaXJuYW1lKGFic3BhdGgoX19maWxlX18pKSwgIm1lc3NhZ2VzIikKKworCitGSUxURVJfUkdYID0gTm9uZQorSU5GT19URVNUX1JHWCA9IHJlLmNvbXBpbGUociJeZnVuY19pXGRcZFxkXGQkIikKKworCitkZWYgZXhjZXB0aW9uX3N0cihzZWxmLCBleCk6ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAiIiJmdW5jdGlvbiB1c2VkIHRvIHJlcGxhY2UgZGVmYXVsdCBfX3N0cl9fIG1ldGhvZCBvZiBleGNlcHRpb24gaW5zdGFuY2VzIiIiCisgICAgcmV0dXJuICJpbiB7fVxuOjoge30iLmZvcm1hdChleC5maWxlLCAiLCAiLmpvaW4oZXguYXJncykpCisKKworY2xhc3MgTGludFRlc3RVc2luZ01vZHVsZToKKyAgICBJTlBVVF9ESVIgPSBOb25lCisgICAgREVGQVVMVF9QQUNLQUdFID0gImlucHV0IgorICAgIHBhY2thZ2UgPSBERUZBVUxUX1BBQ0tBR0UKKyAgICBsaW50ZXIgPSBsaW50ZXIKKyAgICBtb2R1bGUgPSBOb25lCisgICAgZGVwZW5kcyA9IE5vbmUKKyAgICBvdXRwdXQgPSBOb25lCisKKyAgICBkZWYgX3Rlc3RfZnVuY3Rpb25hbGl0eShzZWxmKToKKyAgICAgICAgdG9jaGVjayA9IFtzZWxmLnBhY2thZ2UgKyAiLiIgKyBzZWxmLm1vZHVsZV0KKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9bm90LWFuLWl0ZXJhYmxlOyBjYW4ndCBoYW5kbGUgYm9vbGVhbiBjaGVja3MgZm9yIG5vdworICAgICAgICBpZiBzZWxmLmRlcGVuZHM6CisgICAgICAgICAgICB0b2NoZWNrICs9IFsKKyAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2UgKyAiLiVzIiAlIG5hbWUucmVwbGFjZSgiLnB5IiwgIiIpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUsIF8gaW4gc2VsZi5kZXBlbmRzCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuX3Rlc3QodG9jaGVjaykKKworICAgIGRlZiBfY2hlY2tfcmVzdWx0KHNlbGYsIGdvdCk6CisgICAgICAgIGVycm9yX21zZyA9ICgKKyAgICAgICAgICAgIGYiV3Jvbmcgb3V0cHV0IGZvciAne3NlbGYub3V0cHV0fSc6XG4iCisgICAgICAgICAgICAiWW91IGNhbiB1cGRhdGUgdGhlIGV4cGVjdGVkIG91dHB1dCBhdXRvbWF0aWNhbGx5IHdpdGg6ICciCisgICAgICAgICAgICBmInB5dGhvbiB0ZXN0cy90ZXN0X2Z1bmMucHkge1VQREFURV9PUFRJT059J1xuXG4iCisgICAgICAgICkKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2dldF9leHBlY3RlZCgpID09IGdvdCwgZXJyb3JfbXNnCisKKyAgICBkZWYgX3Rlc3Qoc2VsZiwgdG9jaGVjayk6CisgICAgICAgIGlmIElORk9fVEVTVF9SR1gubWF0Y2goc2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgc2VsZi5saW50ZXIuZW5hYmxlKCJJIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGludGVyLmRpc2FibGUoIkkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmxpbnRlci5jaGVjayh0b2NoZWNrKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgIyBuZWVkIGZpbmFsaXphdGlvbiB0byByZXN0b3JlIGEgY29ycmVjdCBzdGF0ZQorICAgICAgICAgICAgc2VsZi5saW50ZXIucmVwb3J0ZXIuZmluYWxpemUoKQorICAgICAgICAgICAgZXguZmlsZSA9IHRvY2hlY2sKKyAgICAgICAgICAgIHByaW50KGV4KQorICAgICAgICAgICAgZXguX19zdHJfXyA9IGV4Y2VwdGlvbl9zdHIKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuX2NoZWNrX3Jlc3VsdChzZWxmLmxpbnRlci5yZXBvcnRlci5maW5hbGl6ZSgpKQorCisgICAgZGVmIF9oYXNfb3V0cHV0KHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYubW9kdWxlLnN0YXJ0c3dpdGgoImZ1bmNfbm9lcnJvcl8iKQorCisgICAgZGVmIF9nZXRfZXhwZWN0ZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc19vdXRwdXQoKSBhbmQgc2VsZi5vdXRwdXQ6CisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5vdXRwdXQpIGFzIGZvYmo6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvYmoucmVhZCgpLnN0cmlwKCkgKyAiXG4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiIKKworCitjbGFzcyBMaW50VGVzdFVwZGF0ZShMaW50VGVzdFVzaW5nTW9kdWxlKToKKyAgICBkZWYgX2NoZWNrX3Jlc3VsdChzZWxmLCBnb3QpOgorICAgICAgICBpZiBub3Qgc2VsZi5faGFzX291dHB1dCgpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gc2VsZi5fZ2V0X2V4cGVjdGVkKCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBleHBlY3RlZCA9ICIiCisgICAgICAgIGlmIGdvdCAhPSBleHBlY3RlZDoKKyAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLm91dHB1dCwgInciKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoZ290KQorCisKK2RlZiBnZW5fdGVzdHMoZmlsdGVyX3JneCk6CisgICAgaWYgZmlsdGVyX3JneDoKKyAgICAgICAgaXNfdG9fcnVuID0gcmUuY29tcGlsZShmaWx0ZXJfcmd4KS5zZWFyY2gKKyAgICBlbHNlOgorICAgICAgICBpc190b19ydW4gPSBsYW1iZGEgeDogMSAgIyBub3FhOiBFNzMxIFdlJ3JlIGdvaW5nIHRvIHRocm93IGFsbCB0aGlzIGFueXdheQorICAgIHRlc3RzID0gW10KKyAgICBmb3IgbW9kdWxlX2ZpbGUsIG1lc3NhZ2VzX2ZpbGUgaW4gX2dldF90ZXN0c19pbmZvKElOUFVUX0RJUiwgTVNHX0RJUiwgImZ1bmNfIiwgIiIpOgorICAgICAgICBpZiBub3QgaXNfdG9fcnVuKG1vZHVsZV9maWxlKSBvciBtb2R1bGVfZmlsZS5lbmRzd2l0aCgoIi5weWMiLCAiJHB5LmNsYXNzIikpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYmFzZSA9IG1vZHVsZV9maWxlLnJlcGxhY2UoIi5weSIsICIiKS5zcGxpdCgiXyIpWzFdCisgICAgICAgIGRlcGVuZGVuY2llcyA9IF9nZXRfdGVzdHNfaW5mbyhJTlBVVF9ESVIsIE1TR19ESVIsIGJhc2UsICIucHkiKQorICAgICAgICB0ZXN0cy5hcHBlbmQoKG1vZHVsZV9maWxlLCBtZXNzYWdlc19maWxlLCBkZXBlbmRlbmNpZXMpKQorICAgIGlmIFVQREFURV9GSUxFLmV4aXN0cygpOgorICAgICAgICByZXR1cm4gdGVzdHMKKyAgICBhc3NlcnQgbGVuKHRlc3RzKSA8IDEyLCAiUGxlYXNlIGRvIG5vdCBhZGQgbmV3IHRlc3QgY2FzZXMgaGVyZS4iICsgIlxuIi5qb2luKAorICAgICAgICBzdHIoaykgZm9yIGsgaW4gdGVzdHMgaWYgbm90IGtbMl0KKyAgICApCisgICAgcmV0dXJuIHRlc3RzCisKKworVEVTVF9XSVRIX0VYUEVDVEVEX0RFUFJFQ0FUSU9OID0gWyJmdW5jX2V4Y2Vzc19lc2NhcGVzLnB5Il0KKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgIm1vZHVsZV9maWxlLG1lc3NhZ2VzX2ZpbGUsZGVwZW5kZW5jaWVzIiwKKyAgICBnZW5fdGVzdHMoRklMVEVSX1JHWCksCisgICAgaWRzPVtvWzBdIGZvciBvIGluIGdlbl90ZXN0cyhGSUxURVJfUkdYKV0sCispCitkZWYgdGVzdF9mdW5jdGlvbmFsaXR5KG1vZHVsZV9maWxlLCBtZXNzYWdlc19maWxlLCBkZXBlbmRlbmNpZXMsIHJlY3dhcm4pOgorICAgIF9fdGVzdF9mdW5jdGlvbmFsaXR5KG1vZHVsZV9maWxlLCBtZXNzYWdlc19maWxlLCBkZXBlbmRlbmNpZXMpCisgICAgd2FybmluZyA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgICMgQ2F0Y2ggPHVua25vd24+Ong6IERlcHJlY2F0aW9uV2FybmluZzogaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UKKyAgICAgICAgIyBzbyBpdCdzIG5vdCBzaG93biBkdXJpbmcgdGVzdHMKKyAgICAgICAgd2FybmluZyA9IHJlY3dhcm4ucG9wKCkKKyAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpZiB3YXJuaW5nIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBtb2R1bGVfZmlsZSBpbiBURVNUX1dJVEhfRVhQRUNURURfREVQUkVDQVRJT04gYW5kIHN5cy52ZXJzaW9uX2luZm8ubWlub3IgPiA1OgorICAgICAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3Mod2FybmluZy5jYXRlZ29yeSwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgYXNzZXJ0ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSIgaW4gc3RyKHdhcm5pbmcubWVzc2FnZSkKKworCitkZWYgX190ZXN0X2Z1bmN0aW9uYWxpdHkobW9kdWxlX2ZpbGUsIG1lc3NhZ2VzX2ZpbGUsIGRlcGVuZGVuY2llcyk6CisgICAgbGludF90ZXN0ID0gTGludFRlc3RVcGRhdGUoKSBpZiBVUERBVEVfRklMRS5leGlzdHMoKSBlbHNlIExpbnRUZXN0VXNpbmdNb2R1bGUoKQorICAgIGxpbnRfdGVzdC5tb2R1bGUgPSBtb2R1bGVfZmlsZS5yZXBsYWNlKCIucHkiLCAiIikKKyAgICBsaW50X3Rlc3Qub3V0cHV0ID0gbWVzc2FnZXNfZmlsZQorICAgIGxpbnRfdGVzdC5kZXBlbmRzID0gZGVwZW5kZW5jaWVzIG9yIE5vbmUKKyAgICBsaW50X3Rlc3QuSU5QVVRfRElSID0gSU5QVVRfRElSCisgICAgbGludF90ZXN0Ll90ZXN0X2Z1bmN0aW9uYWxpdHkoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgVVBEQVRFX09QVElPTiBpbiBzeXMuYXJndjoKKyAgICAgICAgVVBEQVRFX0ZJTEUudG91Y2goKQorICAgICAgICBzeXMuYXJndi5yZW1vdmUoVVBEQVRFX09QVElPTikKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgRklMVEVSX1JHWCA9IHN5cy5hcmd2WzFdCisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgIHRyeToKKyAgICAgICAgcHl0ZXN0Lm1haW4oc3lzLmFyZ3YpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgVVBEQVRFX0ZJTEUuZXhpc3RzKCk6CisgICAgICAgICAgICBVUERBVEVfRklMRS51bmxpbmsoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdF9mdW5jdGlvbmFsLnB5IGIvdGVzdHMvdGVzdF9mdW5jdGlvbmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MmNiMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0X2Z1bmN0aW9uYWwucHkKQEAgLTAsMCArMSwxMzAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IE1pY2hhbCBOb3dpa293c2tpIDxnb2RmcnlkQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgxYF1a2FzeiBSb2dhbHNraSA8cm9nYWxza2kuOTFAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBMdWNhcyBDaW1vbiA8bHVjYXMuY2ltb25AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggVmlsbGUgU2t5dHTDpCA8dmlsbGUuc2t5dHRhQGlraS5maT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBNci4gU2Vua28gPGF0b2Rvcm92QG1yc2Vua28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRGFtaWVuIEJhdHkgPGRhbWllbi5iYXR5QHBvbHljb25zZWlsLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMCBiZXJuaWUgZ3JheSA8YmZncmF5M0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiRnVuY3Rpb25hbCBmdWxsLW1vZHVsZSB0ZXN0cyBmb3IgUHlMaW50LiIiIgoraW1wb3J0IGNzdgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQgaW1wb3J0IHRlc3R1dGlscworZnJvbSBweWxpbnQudGVzdHV0aWxzIGltcG9ydCBVUERBVEVfRklMRSwgVVBEQVRFX09QVElPTgorZnJvbSBweWxpbnQudXRpbHMgaW1wb3J0IEhBU19JU09SVF81CisKKyMgTm90ZXM6CisjIC0gZm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgdGVzdCwgdGhlIGNvbmZpZGVuY2UgbGV2ZWxzIEhJR0ggYW5kIFVOREVGSU5FRAorIyAgIGFyZSB0cmVhdGVkIGFzIHRoZSBzYW1lLgorCisjIFRPRE9zCisjICAtIGltcGxlbWVudCBleGhhdXN0aXZpdHkgdGVzdHMKKworIyAnV2V0IGZpbmdlcicgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIHJlYXNvbmFibGUgdG8gZGlzcGxheSBieSBhbiBJREUKKyMgJ1dldCBmaW5nZXInIGFzIGluICdpbiBteSBzZXR0aW5ncyB0aGVyZSBhcmUgcHJlY2lzZWx5IHRoaXMgbWFueScuCitSRUFTT05BQkxZX0RJU1BMQVlBQkxFX1ZFUlRJQ0FMTFkgPSA0OAorCisKK2NsYXNzIExpbnRNb2R1bGVPdXRwdXRVcGRhdGUodGVzdHV0aWxzLkxpbnRNb2R1bGVUZXN0KToKKyAgICAiIiJJZiBtZXNzYWdlIGZpbGVzIHNob3VsZCBiZSB1cGRhdGVkIGluc3RlYWQgb2YgY2hlY2tlZC4iIiIKKworICAgIGNsYXNzIFRlc3REaWFsZWN0KGNzdi5leGNlbCk6CisgICAgICAgIGRlbGltaXRlciA9ICI6IgorICAgICAgICBsaW5ldGVybWluYXRvciA9ICJcbiIKKworICAgIGNzdi5yZWdpc3Rlcl9kaWFsZWN0KCJ0ZXN0IiwgVGVzdERpYWxlY3QpCisKKyAgICBkZWYgX2NoZWNrX291dHB1dF90ZXh0KHNlbGYsIF8sIGV4cGVjdGVkX291dHB1dCwgYWN0dWFsX291dHB1dCk6CisgICAgICAgIGlmIGV4cGVjdGVkX291dHB1dCBhbmQgZXhwZWN0ZWRfb3V0cHV0ID09IGFjdHVhbF9vdXRwdXQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGV4cGVjdGVkX291dHB1dCBhbmQgbm90IGFjdHVhbF9vdXRwdXQ6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLl90ZXN0X2ZpbGUuZXhwZWN0ZWRfb3V0cHV0KToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5fdGVzdF9maWxlLmV4cGVjdGVkX291dHB1dCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fdGVzdF9maWxlLmV4cGVjdGVkX291dHB1dCwgInciKSBhcyBmOgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmLCBkaWFsZWN0PSJ0ZXN0IikKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGFjdHVhbF9vdXRwdXQ6CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGxpbmUudG9fY3N2KCkpCisKKworZGVmIGdldF90ZXN0cygpOgorICAgIGlucHV0X2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksICJmdW5jdGlvbmFsIikKKyAgICBzdWl0ZSA9IFtdCisgICAgZm9yIGRpcnBhdGgsIF8sIGZpbGVuYW1lcyBpbiBvcy53YWxrKGlucHV0X2Rpcik6CisgICAgICAgIGlmIGRpcnBhdGguZW5kc3dpdGgoIl9fcHljYWNoZV9fIik6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBsZW4oZmlsZW5hbWVzKSA8PSBSRUFTT05BQkxZX0RJU1BMQVlBQkxFX1ZFUlRJQ0FMTFkKKyAgICAgICAgKSwgZiJ7ZGlycGF0aH0gY29udGFpbiB0b28gbXVjaCBmdW5jdGlvbmFsIHRlc3RzIGZpbGVzLiIKKworICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUgIT0gIl9faW5pdF9fLnB5IiBhbmQgZmlsZW5hbWUuZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgICAgICMgaXNvcnQgNSBoYXMgc2xpZ2h0bHkgZGlmZmVyZW50IHJ1bGVzIGFzIGlzb3J0IDQuIFRlc3RpbmcKKyAgICAgICAgICAgICAgICAjIGJvdGggd291bGQgYmUgaGFyZDogdGVzdCB3aXRoIGlzb3J0IDUgb25seS4KKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAid3JvbmdfaW1wb3J0X29yZGVyLnB5IiBhbmQgbm90IEhBU19JU09SVF81OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHN1aXRlLmFwcGVuZCh0ZXN0dXRpbHMuRnVuY3Rpb25hbFRlc3RGaWxlKGRpcnBhdGgsIGZpbGVuYW1lKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitURVNUUyA9IGdldF90ZXN0cygpCitURVNUU19OQU1FUyA9IFt0LmJhc2UgZm9yIHQgaW4gVEVTVFNdCitURVNUX1dJVEhfRVhQRUNURURfREVQUkVDQVRJT04gPSBbCisgICAgImZ1dHVyZV91bmljb2RlX2xpdGVyYWxzIiwKKyAgICAiYW5vbWFsb3VzX3VuaWNvZGVfZXNjYXBlX3B5MyIsCitdCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJ0ZXN0X2ZpbGUiLCBURVNUUywgaWRzPVRFU1RTX05BTUVTKQorZGVmIHRlc3RfZnVuY3Rpb25hbCh0ZXN0X2ZpbGUsIHJlY3dhcm4sIHB5dGVzdGNvbmZpZyk6CisgICAgX190cmFjZWJhY2toaWRlX18gPSBUcnVlICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKKyAgICBpZiBVUERBVEVfRklMRS5leGlzdHMoKToKKyAgICAgICAgbGludF90ZXN0ID0gTGludE1vZHVsZU91dHB1dFVwZGF0ZSh0ZXN0X2ZpbGUsIHB5dGVzdGNvbmZpZykKKyAgICBlbHNlOgorICAgICAgICBsaW50X3Rlc3QgPSB0ZXN0dXRpbHMuTGludE1vZHVsZVRlc3QodGVzdF9maWxlLCBweXRlc3Rjb25maWcpCisgICAgbGludF90ZXN0LnNldFVwKCkKKyAgICBsaW50X3Rlc3QucnVuVGVzdCgpCisgICAgd2FybmluZyA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgICMgQ2F0Y2ggPHVua25vd24+Ong6IERlcHJlY2F0aW9uV2FybmluZzogaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UKKyAgICAgICAgIyBzbyBpdCdzIG5vdCBzaG93biBkdXJpbmcgdGVzdHMKKyAgICAgICAgd2FybmluZyA9IHJlY3dhcm4ucG9wKCkKKyAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpZiB3YXJuaW5nIGlzIG5vdCBOb25lOgorICAgICAgICBpZiAoCisgICAgICAgICAgICB0ZXN0X2ZpbGUuYmFzZSBpbiBURVNUX1dJVEhfRVhQRUNURURfREVQUkVDQVRJT04KKyAgICAgICAgICAgIGFuZCBzeXMudmVyc2lvbl9pbmZvLm1pbm9yID4gNQorICAgICAgICApOgorICAgICAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3Mod2FybmluZy5jYXRlZ29yeSwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgYXNzZXJ0ICJpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSIgaW4gc3RyKHdhcm5pbmcubWVzc2FnZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGlmIFVQREFURV9PUFRJT04gaW4gc3lzLmFyZ3Y6CisgICAgICAgIFVQREFURV9GSUxFLnRvdWNoKCkKKyAgICAgICAgc3lzLmFyZ3YucmVtb3ZlKFVQREFURV9PUFRJT04pCisgICAgdHJ5OgorICAgICAgICBweXRlc3QubWFpbihzeXMuYXJndikKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBVUERBVEVfRklMRS5leGlzdHMoKToKKyAgICAgICAgICAgIFVQREFURV9GSUxFLnVubGluaygpCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0X2ltcG9ydF9ncmFwaC5weSBiL3Rlc3RzL3Rlc3RfaW1wb3J0X2dyYXBoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmFlYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0X2ltcG9ydF9ncmFwaC5weQpAQCAtMCwwICsxLDExMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgMjAxMCwgMjAxMyBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxMiBGRUxEIEJvcmlzIDxsb3RoaXJhbGRhbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUmV2ZXJiIEMgPHJldmVyYmNAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisjIENvcHlyaWdodCAoYykgMjAyMCBGcmFuayBIYXJyaXNvbiA8ZnJhbmtAZG91YmxldGhlZmlzaC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbmRyZXcgSG93ZSA8aG93ZWFqQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLW91dGVyLW5hbWUKKworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitmcm9tIG9zLnBhdGggaW1wb3J0IGV4aXN0cworCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50IGltcG9ydCB0ZXN0dXRpbHMKK2Zyb20gcHlsaW50LmNoZWNrZXJzIGltcG9ydCBpbXBvcnRzLCBpbml0aWFsaXplCitmcm9tIHB5bGludC5saW50IGltcG9ydCBQeUxpbnRlcgorCisKK0BweXRlc3QuZml4dHVyZQorZGVmIGRlc3QocmVxdWVzdCk6CisgICAgZGVzdCA9IHJlcXVlc3QucGFyYW0KKyAgICB5aWVsZCBkZXN0CisgICAgdHJ5OgorICAgICAgICBvcy5yZW1vdmUoZGVzdCkKKyAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICMgZmlsZSBtYXkgbm90IGhhdmUgYmVlbiBjcmVhdGVkIGlmIHRlc3RzIGluc2lkZSBmaXh0dXJlIHNraXBwZWQKKyAgICAgICAgcGFzcworCisKK1BPU1NJQkxFX0RPVF9GSUxFTkFNRVMgPSBbImZvby5kb3QiLCAiZm9vLmd2IiwgInRlc3RzL3JlZ3J0ZXN0X2RhdGEvZm9vLmRvdCJdCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJkZXN0IiwgUE9TU0lCTEVfRE9UX0ZJTEVOQU1FUywgaW5kaXJlY3Q9VHJ1ZSkKK2RlZiB0ZXN0X2RlcGVuZGVuY2llc19ncmFwaChkZXN0KToKKyAgICAiIiJET0MgZmlsZXMgYXJlIGNvcnJlY3RseSBnZW5lcmF0ZWQsIGFuZCB0aGUgZ3JhcGhuYW1lIGlzIHRoZSBiYXNlbmFtZSIiIgorICAgIGltcG9ydHMuX2RlcGVuZGVuY2llc19ncmFwaChkZXN0LCB7ImxhYmFzIjogWyJob2hvIiwgInllcCJdLCAiaG9obyI6IFsieWVwIl19KQorICAgIHdpdGggb3BlbihkZXN0KSBhcyBzdHJlYW06CisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBzdHJlYW0ucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgID09ICIiIgorZGlncmFwaCAiZm9vIiB7CityYW5rZGlyPUxSCitjaGFyc2V0PSJ1dGYtOCIKK1VSTD0iLiIgbm9kZVtzaGFwZT0iYm94Il0KKyJob2hvIiBbXTsKKyJ5ZXAiIFtdOworImxhYmFzIiBbXTsKKyJ5ZXAiIC0+ICJob2hvIiBbXTsKKyJob2hvIiAtPiAibGFiYXMiIFtdOworInllcCIgLT4gImxhYmFzIiBbXTsKK30KKyIiIi5zdHJpcCgpCisgICAgICAgICkKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoImZpbGVuYW1lIiwgWyJncmFwaC5wbmciLCAiZ3JhcGgiXSkKK0BweXRlc3QubWFyay5za2lwaWYoCisgICAgYW55KHNodXRpbC53aGljaCh4KSBmb3IgeCBpbiAoImRvdCIsICJndiIpKSwgcmVhc29uPSJkb3Qgb3IgZ3YgaXMgaW5zdGFsbGVkIgorKQorZGVmIHRlc3RfbWlzc2luZ19ncmFwaHZpeihmaWxlbmFtZSk6CisgICAgIiIiUmFpc2VzIGlmIGdyYXBodml6IGlzIG5vdCBpbnN0YWxsZWQsIGFuZCBkZWZhdWx0cyB0byBwbmcgaWYgbm8gZXh0ZW5zaW9uIGdpdmVuIiIiCisgICAgd2l0aCBweXRlc3QucmFpc2VzKFJ1bnRpbWVFcnJvciwgbWF0Y2g9ciJDYW5ub3QgZ2VuZXJhdGUgYGdyYXBoXC5wbmdgLioiKToKKyAgICAgICAgaW1wb3J0cy5fZGVwZW5kZW5jaWVzX2dyYXBoKGZpbGVuYW1lLCB7ImEiOiBbImIiLCAiYyJdLCAiYiI6IFsiYyJdfSkKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBsaW50ZXIoKToKKyAgICBweWxpbnRlciA9IFB5TGludGVyKHJlcG9ydGVyPXRlc3R1dGlscy5HZW5lcmljVGVzdFJlcG9ydGVyKCkpCisgICAgaW5pdGlhbGl6ZShweWxpbnRlcikKKyAgICByZXR1cm4gcHlsaW50ZXIKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiByZW1vdmVfZmlsZXMoKToKKyAgICB5aWVsZAorICAgIGZvciBmbmFtZSBpbiAoImltcG9ydC5kb3QiLCAiZXh0X2ltcG9ydC5kb3QiLCAiaW50X2ltcG9ydC5kb3QiKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGZuYW1lKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworQHB5dGVzdC5tYXJrLnVzZWZpeHR1cmVzKCJyZW1vdmVfZmlsZXMiKQorZGVmIHRlc3RfY2hlY2tlcl9kZXBfZ3JhcGhzKGxpbnRlcik6CisgICAgbGludGVyLmdsb2JhbF9zZXRfb3B0aW9uKCJwZXJzaXN0ZW50IiwgRmFsc2UpCisgICAgbGludGVyLmdsb2JhbF9zZXRfb3B0aW9uKCJyZXBvcnRzIiwgVHJ1ZSkKKyAgICBsaW50ZXIuZ2xvYmFsX3NldF9vcHRpb24oImVuYWJsZSIsICJpbXBvcnRzIikKKyAgICBsaW50ZXIuZ2xvYmFsX3NldF9vcHRpb24oImltcG9ydC1ncmFwaCIsICJpbXBvcnQuZG90IikKKyAgICBsaW50ZXIuZ2xvYmFsX3NldF9vcHRpb24oImV4dC1pbXBvcnQtZ3JhcGgiLCAiZXh0X2ltcG9ydC5kb3QiKQorICAgIGxpbnRlci5nbG9iYWxfc2V0X29wdGlvbigiaW50LWltcG9ydC1ncmFwaCIsICJpbnRfaW1wb3J0LmRvdCIpCisgICAgbGludGVyLmdsb2JhbF9zZXRfb3B0aW9uKCJpbnQtaW1wb3J0LWdyYXBoIiwgImludF9pbXBvcnQuZG90IikKKyAgICAjIGlnbm9yZSB0aGlzIGZpbGUgY2F1c2luZyBzcHVyaW91cyBNZW1vcnlFcnJvciB3LyBzb21lIHB5dGhvbiB2ZXJzaW9uICg+PTIuMz8pCisgICAgbGludGVyLmdsb2JhbF9zZXRfb3B0aW9uKCJpZ25vcmUiLCAoImZ1bmNfdW5rbm93bl9lbmNvZGluZy5weSIsKSkKKyAgICBsaW50ZXIuY2hlY2soImlucHV0IikKKyAgICBsaW50ZXIuZ2VuZXJhdGVfcmVwb3J0cygpCisgICAgYXNzZXJ0IGV4aXN0cygiaW1wb3J0LmRvdCIpCisgICAgYXNzZXJ0IGV4aXN0cygiZXh0X2ltcG9ydC5kb3QiKQorICAgIGFzc2VydCBleGlzdHMoImludF9pbXBvcnQuZG90IikKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RfbnVtdmVyc2lvbi5weSBiL3Rlc3RzL3Rlc3RfbnVtdmVyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY0NTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdF9udW12ZXJzaW9uLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5fX3BrZ2luZm9fXyBpbXBvcnQgZ2V0X251bXZlcnNpb25fZnJvbV92ZXJzaW9uCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICJ2ZXJzaW9uLGV4cGVjdGVkX251bXZlcnNpb24iLAorICAgIFsKKyAgICAgICAgWyIyLjguMSIsICgyLCA4LCAxKV0sCisgICAgICAgIFsiMi44LjIrIiwgKDIsIDgsIDIpXSwKKyAgICAgICAgWyIzLjAuMGEwIiwgKDMsIDAsIDApXSwKKyAgICAgICAgWyIzLi4wIiwgKDMsIDAsIDApXSwKKyAgICAgICAgWyIxLmEiLCAoMSwgMCwgMCldLAorICAgICAgICBbIiIsICgwLCAwLCAwKV0sCisgICAgICAgIFsiMy4wLjBiMSIsICgzLCAwLCAwKV0sCisgICAgICAgIFsiMy4wLjByYzEiLCAoMywgMCwgMCldLAorICAgICAgICBbIjMuMC4wZGV2LTIzNDMyNDIzNDIzNGYyM2FiYzQiLCAoMywgMCwgMCldLAorICAgICAgICBbInB5bGludC0yLjQuNyIsICgyLCA0LCA3KV0sCisgICAgICAgIFsiMi44LjMuZGV2MytnMjhjMDkzYzIuZDIwMjEwNDI4IiwgKDIsIDgsIDMpXSwKKyAgICBdLAorKQorZGVmIHRlc3RfbnVtdmVyc2lvbih2ZXJzaW9uLCBleHBlY3RlZF9udW12ZXJzaW9uKToKKyAgICBhc3NlcnQgZ2V0X251bXZlcnNpb25fZnJvbV92ZXJzaW9uKHZlcnNpb24pID09IGV4cGVjdGVkX251bXZlcnNpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RfcHJhZ21hX3BhcnNlci5weSBiL3Rlc3RzL3Rlc3RfcHJhZ21hX3BhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGVjOGFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdF9wcmFnbWFfcGFyc2VyLnB5CkBAIC0wLDAgKzEsMTAwIEBACitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50LnV0aWxzLnByYWdtYV9wYXJzZXIgaW1wb3J0ICgKKyAgICBPUFRJT05fUE8sCisgICAgSW52YWxpZFByYWdtYUVycm9yLAorICAgIFVuUmVjb2duaXplZE9wdGlvbkVycm9yLAorICAgIHBhcnNlX3ByYWdtYSwKKykKKworCitkZWYgdGVzdF9zaW1wbGVfcHJhZ21hKCk6CisgICAgY29tbWVudCA9ICIjcHlsaW50OiBkaXNhYmxlID0gbWlzc2luZy1kb2NzdHJpbmciCisgICAgbWF0Y2ggPSBPUFRJT05fUE8uc2VhcmNoKGNvbW1lbnQpCisgICAgZm9yIHByYWdtYV9yZXByIGluIHBhcnNlX3ByYWdtYShtYXRjaC5ncm91cCgyKSk6CisgICAgICAgIGFzc2VydCBwcmFnbWFfcmVwci5hY3Rpb24gPT0gImRpc2FibGUiCisgICAgICAgIGFzc2VydCBwcmFnbWFfcmVwci5tZXNzYWdlcyA9PSBbIm1pc3NpbmctZG9jc3RyaW5nIl0KKworCitkZWYgdGVzdF9kaXNhYmxlX2NoZWNrZXJfd2l0aF9udW1iZXJfaW5fbmFtZSgpOgorICAgIGNvbW1lbnQgPSAiI3B5bGludDogZGlzYWJsZSA9IGozLWN1c3RvbS1jaGVja2VyIgorICAgIG1hdGNoID0gT1BUSU9OX1BPLnNlYXJjaChjb21tZW50KQorICAgIGZvciBwcmFnbWFfcmVwciBpbiBwYXJzZV9wcmFnbWEobWF0Y2guZ3JvdXAoMikpOgorICAgICAgICBhc3NlcnQgcHJhZ21hX3JlcHIuYWN0aW9uID09ICJkaXNhYmxlIgorICAgICAgICBhc3NlcnQgcHJhZ21hX3JlcHIubWVzc2FnZXMgPT0gWyJqMy1jdXN0b20tY2hlY2tlciJdCisKKworZGVmIHRlc3Rfc2ltcGxlX3ByYWdtYV9ub19tZXNzYWdlcygpOgorICAgIGNvbW1lbnQgPSAiI3B5bGludDogc2tpcC1maWxlIgorICAgIG1hdGNoID0gT1BUSU9OX1BPLnNlYXJjaChjb21tZW50KQorICAgIGZvciBwcmFnbWFfcmVwciBpbiBwYXJzZV9wcmFnbWEobWF0Y2guZ3JvdXAoMikpOgorICAgICAgICBhc3NlcnQgcHJhZ21hX3JlcHIuYWN0aW9uID09ICJza2lwLWZpbGUiCisgICAgICAgIGFzc2VydCBwcmFnbWFfcmVwci5tZXNzYWdlcyA9PSBbXQorCisKK2RlZiB0ZXN0X3NpbXBsZV9wcmFnbWFfbXVsdGlwbGVfbWVzc2FnZXMoKToKKyAgICBjb21tZW50ID0gIiNweWxpbnQ6IGRpc2FibGUgPSBtaXNzaW5nLWRvY3N0cmluZywgaW52YWxpZC1uYW1lIgorICAgIG1hdGNoID0gT1BUSU9OX1BPLnNlYXJjaChjb21tZW50KQorICAgIGZvciBwcmFnbWFfcmVwciBpbiBwYXJzZV9wcmFnbWEobWF0Y2guZ3JvdXAoMikpOgorICAgICAgICBhc3NlcnQgcHJhZ21hX3JlcHIuYWN0aW9uID09ICJkaXNhYmxlIgorICAgICAgICBhc3NlcnQgcHJhZ21hX3JlcHIubWVzc2FnZXMgPT0gWyJtaXNzaW5nLWRvY3N0cmluZyIsICJpbnZhbGlkLW5hbWUiXQorCisKK2RlZiB0ZXN0X211bHRpcGxlX3ByYWdtYV9tdWx0aXBsZV9tZXNzYWdlcygpOgorICAgIGNvbW1lbnQgPSAiI3B5bGludDogZGlzYWJsZSA9IG1pc3NpbmctZG9jc3RyaW5nLCBpbnZhbGlkLW5hbWUsIGVuYWJsZSA9IFIwMjAyLCBuby1zZWxmLXVzZSIKKyAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29tbWVudCkKKyAgICByZXMgPSBsaXN0KHBhcnNlX3ByYWdtYShtYXRjaC5ncm91cCgyKSkpCisgICAgYXNzZXJ0IHJlc1swXS5hY3Rpb24gPT0gImRpc2FibGUiCisgICAgYXNzZXJ0IHJlc1swXS5tZXNzYWdlcyA9PSBbIm1pc3NpbmctZG9jc3RyaW5nIiwgImludmFsaWQtbmFtZSJdCisgICAgYXNzZXJ0IHJlc1sxXS5hY3Rpb24gPT0gImVuYWJsZSIKKyAgICBhc3NlcnQgcmVzWzFdLm1lc3NhZ2VzID09IFsiUjAyMDIiLCAibm8tc2VsZi11c2UiXQorCisKK2RlZiB0ZXN0X21pc3NpbmdfYXNzaWdubWVudCgpOgorICAgIGNvbW1lbnQgPSAiI3B5bGludDogZGlzYWJsZSBtaXNzaW5nLWRvY3N0cmluZyIKKyAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29tbWVudCkKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoSW52YWxpZFByYWdtYUVycm9yKToKKyAgICAgICAgbGlzdChwYXJzZV9wcmFnbWEobWF0Y2guZ3JvdXAoMikpKQorCisKK2RlZiB0ZXN0X21pc3Npbmdfa2V5d29yZCgpOgorICAgIGNvbW1lbnQgPSAiI3B5bGludDogPSBtaXNzaW5nLWRvY3N0cmluZyIKKyAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29tbWVudCkKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoSW52YWxpZFByYWdtYUVycm9yKToKKyAgICAgICAgbGlzdChwYXJzZV9wcmFnbWEobWF0Y2guZ3JvdXAoMikpKQorCisKK2RlZiB0ZXN0X3Vuc3VwcG9ydGVkX2Fzc2lnbm1lbnQoKToKKyAgICBjb21tZW50ID0gIiNweWxpbnQ6IGRpc2FibGUtYWxsID0gbWlzc2luZy1kb2NzdHJpbmciCisgICAgbWF0Y2ggPSBPUFRJT05fUE8uc2VhcmNoKGNvbW1lbnQpCisgICAgd2l0aCBweXRlc3QucmFpc2VzKFVuUmVjb2duaXplZE9wdGlvbkVycm9yKToKKyAgICAgICAgbGlzdChwYXJzZV9wcmFnbWEobWF0Y2guZ3JvdXAoMikpKQorCisKK2RlZiB0ZXN0X3Vua25vd25fa2V5d29yZF93aXRoX21lc3NhZ2VzKCk6CisgICAgY29tbWVudCA9ICIjcHlsaW50OiB1bmtub3duLWtleXdvcmQgPSBtaXNzaW5nLWRvY3N0cmluZyIKKyAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29tbWVudCkKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IpOgorICAgICAgICBsaXN0KHBhcnNlX3ByYWdtYShtYXRjaC5ncm91cCgyKSkpCisKKworZGVmIHRlc3RfdW5rbm93bl9rZXl3b3JkX3dpdGhvdXRfbWVzc2FnZXMoKToKKyAgICBjb21tZW50ID0gIiNweWxpbnQ6IHVua25vd24ta2V5d29yZCIKKyAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29tbWVudCkKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoVW5SZWNvZ25pemVkT3B0aW9uRXJyb3IpOgorICAgICAgICBsaXN0KHBhcnNlX3ByYWdtYShtYXRjaC5ncm91cCgyKSkpCisKKworZGVmIHRlc3RfbWlzc2luZ19tZXNzYWdlKCk6CisgICAgY29tbWVudCA9ICIjcHlsaW50OiBkaXNhYmxlID0gIgorICAgIG1hdGNoID0gT1BUSU9OX1BPLnNlYXJjaChjb21tZW50KQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhJbnZhbGlkUHJhZ21hRXJyb3IpOgorICAgICAgICBsaXN0KHBhcnNlX3ByYWdtYShtYXRjaC5ncm91cCgyKSkpCisKKworZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV93aXRoX2Rhc2goKToKKyAgICBjb21tZW50ID0gIiNweWxpbnQ6IGRpc2FibGUgPSByYXdfaW5wdXQtYnVpbHRpbiIKKyAgICBtYXRjaCA9IE9QVElPTl9QTy5zZWFyY2goY29tbWVudCkKKyAgICByZXMgPSBsaXN0KHBhcnNlX3ByYWdtYShtYXRjaC5ncm91cCgyKSkpCisgICAgYXNzZXJ0IHJlc1swXS5hY3Rpb24gPT0gImRpc2FibGUiCisgICAgYXNzZXJ0IHJlc1swXS5tZXNzYWdlcyA9PSBbInJhd19pbnB1dC1idWlsdGluIl0KZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3RfcHlsaW50X3J1bm5lcnMucHkgYi90ZXN0cy90ZXN0X3B5bGludF9ydW5uZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzczOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0X3B5bGludF9ydW5uZXJzLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyMgcHlsaW50OiBkaXNhYmxlPW1pc3NpbmctbW9kdWxlLWRvY3N0cmluZywgbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50IGltcG9ydCBydW5fZXB5bGludCwgcnVuX3B5bGludCwgcnVuX3B5cmV2ZXJzZSwgcnVuX3N5bWlsYXIKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgInJ1bm5lciIsIFtydW5fcHlsaW50LCBydW5fZXB5bGludCwgcnVuX3B5cmV2ZXJzZSwgcnVuX3N5bWlsYXJdCispCitkZWYgdGVzdF9ydW5uZXIocnVubmVyKToKKyAgICBmaWxlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykKKyAgICB0ZXN0YXJncyA9IFsiIiwgZmlsZXBhdGhdCisgICAgd2l0aCBwYXRjaC5vYmplY3Qoc3lzLCAiYXJndiIsIHRlc3RhcmdzKToKKyAgICAgICAgd2l0aCBweXRlc3QucmFpc2VzKFN5c3RlbUV4aXQpIGFzIGVycjoKKyAgICAgICAgICAgIHJ1bm5lcigpCisgICAgICAgIGFzc2VydCBlcnIudmFsdWUuY29kZSA9PSAwCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0X3JlZ3IucHkgYi90ZXN0cy90ZXN0X3JlZ3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1YmFiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3RfcmVnci5weQpAQCAtMCwwICsxLDEzNyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMSwgMjAxMy0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDEyIEZFTEQgQm9yaXMgPGxvdGhpcmFsZGFuQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNi0yMDE3IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggUmV2ZXJiIEMgPHJldmVyYmNAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIibm9uIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIHB5bGludCwgd2hpY2ggcmVxdWlyZXMgYSB0b28gc3BlY2lmaWMgY29uZmlndXJhdGlvbgordG8gYmUgaW5jb3Jwb3JhdGVkIGluIHRoZSBhdXRvbWF0aWMgZnVuY3Rpb25hbCB0ZXN0IGZyYW1ld29yaworIiIiCisjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtb3V0ZXItbmFtZQorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgam9pbgorCitpbXBvcnQgYXN0cm9pZAoraW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludCBpbXBvcnQgdGVzdHV0aWxzCisKK1JFR1JfREFUQSA9IGpvaW4oZGlybmFtZShhYnNwYXRoKF9fZmlsZV9fKSksICJyZWdydGVzdF9kYXRhIikKK3N5cy5wYXRoLmluc2VydCgxLCBSRUdSX0RBVEEpCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIHJlcG9ydGVyKCk6CisgICAgcmV0dXJuIHRlc3R1dGlscy5HZW5lcmljVGVzdFJlcG9ydGVyCisKKworQHB5dGVzdC5maXh0dXJlKHNjb3BlPSJtb2R1bGUiKQorZGVmIGRpc2FibGUoKToKKyAgICByZXR1cm4gWyJJIl0KKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBmaW5hbGl6ZV9saW50ZXIobGludGVyKToKKyAgICAiIiJjYWxsIHJlcG9ydGVyLmZpbmFsaXplKCkgdG8gY2xlYW51cAorICAgIHBlbmRpbmcgbWVzc2FnZXMgaWYgYSB0ZXN0IGZpbmlzaGVkIGJhZGx5CisgICAgIiIiCisgICAgeWllbGQgbGludGVyCisgICAgbGludGVyLnJlcG9ydGVyLmZpbmFsaXplKCkKKworCitkZWYgRXF1YWxzKGV4cGVjdGVkKToKKyAgICByZXR1cm4gbGFtYmRhIGdvdDogZ290ID09IGV4cGVjdGVkCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICJmaWxlX25hbWUsIGNoZWNrIiwKKyAgICBbCisgICAgICAgICgicGFja2FnZS5fX2luaXRfXyIsIEVxdWFscygiIikpLAorICAgICAgICAoInByZWNlZGVuY2VfdGVzdCIsIEVxdWFscygiIikpLAorICAgICAgICAoImltcG9ydF9wYWNrYWdlX3N1YnBhY2thZ2VfbW9kdWxlIiwgRXF1YWxzKCIiKSksCisgICAgICAgICgicHlsaW50LmNoZWNrZXJzLl9faW5pdF9fIiwgbGFtYmRhIHg6ICJfX3BhdGhfXyIgbm90IGluIHgpLAorICAgICAgICAoam9pbihSRUdSX0RBVEEsICJjbGFzc2RvY191c2FnZS5weSIpLCBFcXVhbHMoIiIpKSwKKyAgICAgICAgKGpvaW4oUkVHUl9EQVRBLCAibW9kdWxlX2dsb2JhbC5weSIpLCBFcXVhbHMoIiIpKSwKKyAgICAgICAgKGpvaW4oUkVHUl9EQVRBLCAiZGVjaW1hbF9pbmZlcmVuY2UucHkiKSwgRXF1YWxzKCIiKSksCisgICAgICAgIChqb2luKFJFR1JfREFUQSwgImFic2ltcCIsICJzdHJpbmcucHkiKSwgRXF1YWxzKCIiKSksCisgICAgICAgIChqb2luKFJFR1JfREFUQSwgImJhZF9wYWNrYWdlIiksIGxhbWJkYSB4OiAiVW51c2VkIGltcG9ydCBtaXNzaW5nIiBpbiB4KSwKKyAgICBdLAorKQorZGVmIHRlc3RfcGFja2FnZShmaW5hbGl6ZV9saW50ZXIsIGZpbGVfbmFtZSwgY2hlY2spOgorICAgIGZpbmFsaXplX2xpbnRlci5jaGVjayhmaWxlX25hbWUpCisgICAgZ290ID0gZmluYWxpemVfbGludGVyLnJlcG9ydGVyLmZpbmFsaXplKCkuc3RyaXAoKQorICAgIGFzc2VydCBjaGVjayhnb3QpCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICJmaWxlX25hbWUiLAorICAgIFsKKyAgICAgICAgam9pbihSRUdSX0RBVEEsICJpbXBvcnRfYXNzaWduLnB5IiksCisgICAgICAgIGpvaW4oUkVHUl9EQVRBLCAic3BlY2lhbF9hdHRyX3Njb3BlX2xvb2t1cF9jcmFzaC5weSIpLAorICAgICAgICBqb2luKFJFR1JfREFUQSwgInRyeV9maW5hbGx5X2Rpc2FibGVfbXNnX2NyYXNoIiksCisgICAgXSwKKykKK2RlZiB0ZXN0X2NyYXNoKGZpbmFsaXplX2xpbnRlciwgZmlsZV9uYW1lKToKKyAgICBmaW5hbGl6ZV9saW50ZXIuY2hlY2soZmlsZV9uYW1lKQorCisKK0BweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAiZm5hbWUiLCBbeCBmb3IgeCBpbiBvcy5saXN0ZGlyKFJFR1JfREFUQSkgaWYgeC5lbmRzd2l0aCgiX2NyYXNoLnB5IildCispCitkZWYgdGVzdF9kZXNjcmlwdG9yX2NyYXNoKGZuYW1lLCBmaW5hbGl6ZV9saW50ZXIpOgorICAgIGZpbmFsaXplX2xpbnRlci5jaGVjayhqb2luKFJFR1JfREFUQSwgZm5hbWUpKQorICAgIGZpbmFsaXplX2xpbnRlci5yZXBvcnRlci5maW5hbGl6ZSgpLnN0cmlwKCkKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBtb2RpZnlfcGF0aCgpOgorICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsICIiKQorICAgIHlpZWxkCisgICAgc3lzLnBhdGgucG9wKDApCisgICAgb3MuY2hkaXIoY3dkKQorCisKK0BweXRlc3QubWFyay51c2VmaXh0dXJlcygibW9kaWZ5X3BhdGgiKQorZGVmIHRlc3RfY2hlY2tfcGFja2FnZV9fX2luaXRfXyhmaW5hbGl6ZV9saW50ZXIpOgorICAgIGZpbGVuYW1lID0gInBhY2thZ2UuX19pbml0X18iCisgICAgZmluYWxpemVfbGludGVyLmNoZWNrKGZpbGVuYW1lKQorICAgIGNoZWNrZWQgPSBsaXN0KGZpbmFsaXplX2xpbnRlci5zdGF0c1siYnlfbW9kdWxlIl0ua2V5cygpKQorICAgIGFzc2VydCBjaGVja2VkID09IFtmaWxlbmFtZV0KKworICAgIG9zLmNoZGlyKGpvaW4oUkVHUl9EQVRBLCAicGFja2FnZSIpKQorICAgIGZpbmFsaXplX2xpbnRlci5jaGVjaygiX19pbml0X18iKQorICAgIGNoZWNrZWQgPSBsaXN0KGZpbmFsaXplX2xpbnRlci5zdGF0c1siYnlfbW9kdWxlIl0ua2V5cygpKQorICAgIGFzc2VydCBjaGVja2VkID09IFsiX19pbml0X18iXQorCisKK2RlZiB0ZXN0X3B5bGludF9jb25maWdfYXR0cigpOgorICAgIG1vZCA9IGFzdHJvaWQuTUFOQUdFUi5hc3RfZnJvbV9tb2R1bGVfbmFtZSgicHlsaW50LmxpbnQucHlsaW50ZXIiKQorICAgIHB5bGludGVyID0gbW9kWyJQeUxpbnRlciJdCisgICAgZXhwZWN0ID0gWworICAgICAgICAiT3B0aW9uc01hbmFnZXJNaXhJbiIsCisgICAgICAgICJvYmplY3QiLAorICAgICAgICAiTWVzc2FnZXNIYW5kbGVyTWl4SW4iLAorICAgICAgICAiUmVwb3J0c0hhbmRsZXJNaXhJbiIsCisgICAgICAgICJCYXNlVG9rZW5DaGVja2VyIiwKKyAgICAgICAgIkJhc2VDaGVja2VyIiwKKyAgICAgICAgIk9wdGlvbnNQcm92aWRlck1peEluIiwKKyAgICBdCisgICAgYXNzZXJ0IFtjLm5hbWUgZm9yIGMgaW4gcHlsaW50ZXIuYW5jZXN0b3JzKCldID09IGV4cGVjdAorICAgIGFzc2VydCBsaXN0KGFzdHJvaWQuSW5zdGFuY2UocHlsaW50ZXIpLmdldGF0dHIoImNvbmZpZyIpKQorICAgIGluZmVycmVkID0gbGlzdChhc3Ryb2lkLkluc3RhbmNlKHB5bGludGVyKS5pZ2V0YXR0cigiY29uZmlnIikpCisgICAgYXNzZXJ0IGxlbihpbmZlcnJlZCkgPT0gMQorICAgIGFzc2VydCBpbmZlcnJlZFswXS5yb290KCkubmFtZSA9PSAib3B0cGFyc2UiCisgICAgYXNzZXJ0IGluZmVycmVkWzBdLm5hbWUgPT0gIlZhbHVlcyIKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3Rfc2VsZi5weSBiL3Rlc3RzL3Rlc3Rfc2VsZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDdlMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdF9zZWxmLnB5CkBAIC0wLDAgKzEsMTIwMSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBMT0dJTEFCIFMuQS4gKFBhcmlzLCBGUkFOQ0UpIDxjb250YWN0QGxvZ2lsYWIuZnI+CisjIENvcHlyaWdodCAoYykgMjAxNC0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgVmxhZCBUZW1pYW4gPHZsYWR0ZW1pYW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxNCBBcnVuIFBlcnNhdWQgPGFydW5AbnViYXRpLm5ldD4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IElvbmVsIENyaXN0aWFuIE1hcmllcyA8Y29udGFjdEBpb25lbG1jLnJvPgorIyBDb3B5cmlnaHQgKGMpIDIwMTYgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBNb2lzZXMgTG9wZXogPG1veWxvcDI2MEB2YXV4b28uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE5IFRob21hcyBIaXNjaCA8dC5oaXNjaEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBEYW5pZWwgTWlsbGVyIDxtaWxsZXJkZXZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTcgQnJ5Y2UgR3VpbnRhIDxicnljZS5wYXVsLmd1aW50YUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNyBWaWxsZSBTa3l0dMOkIDx2aWxsZS5za3l0dGFAaWtpLmZpPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggU3VzaG9iaGl0IDwzMTk4Nzc2OStzdXNob2JoaXQyN0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBKYXNvbiBPd2VuIDxqYXNvbi5hLm93ZW5AZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTggSmFjZSBCcm93bmluZyA8amFjZWJyb3duaW5nQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFJldmVyYiBDIDxyZXZlcmJjQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEh1Z3VlcyA8aHVndWVzLmJydWFudEBhZmZpcm0uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgSHVnbyB2YW4gS2VtZW5hZGUgPGh1Z292a0B1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgRnJhbmsgSGFycmlzb24gPGZyYW5rQGRvdWJsZXRoZWZpc2guY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgTWF0xJtqIEdyYWJvdnNrw70gPG1ncmFib3ZzQHJlZGhhdC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBQaWV0ZXIgRW5nZWxicmVjaHQgPHBlbmdlbGJyZWNodEByZW1zMi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBDbMOpbWVudCBQaXQtQ2xhdWRlbCA8Y3BpdGNsYXVkZWxAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgQW50aG9ueSBTb3R0aWxlIDxhc290dGlsZUB1bWljaC5lZHU+CisjIENvcHlyaWdodCAoYykgMjAyMSBNYXJjIE11ZWxsZXIgPDMwMTMwMzcxK2NkY2U4cEB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBEci4gTmljayA8ZGFzLWludGVuc2l0eUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBBbmRyZWFzIEZpbmtsZXIgPGFuZGkuZmlua2xlckBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMSBjaG9obmVyIDxtYWlsQGNob2huZXIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTG91aXMgU2F1dGllciA8c2F1dGllci5sb3Vpc0BnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIyBweWxpbnQ6IGRpc2FibGU9dG9vLW1hbnktcHVibGljLW1ldGhvZHMKKworaW1wb3J0IGNvbmZpZ3BhcnNlcgoraW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY29weSBpbXBvcnQgY29weQorZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgam9pbgorZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCitmcm9tIHR5cGluZyBpbXBvcnQgR2VuZXJhdG9yLCBPcHRpb25hbAorZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jaworZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAorCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50IGltcG9ydCBtb2RpZnlfc3lzX3BhdGgKK2Zyb20gcHlsaW50LmNvbnN0YW50cyBpbXBvcnQgTUFJTl9DSEVDS0VSX05BTUUsIE1TR19UWVBFU19TVEFUVVMKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IFJ1bgorZnJvbSBweWxpbnQubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorZnJvbSBweWxpbnQucmVwb3J0ZXJzIGltcG9ydCBKU09OUmVwb3J0ZXIKK2Zyb20gcHlsaW50LnJlcG9ydGVycy50ZXh0IGltcG9ydCBCYXNlUmVwb3J0ZXIsIENvbG9yaXplZFRleHRSZXBvcnRlciwgVGV4dFJlcG9ydGVyCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgdXRpbHMKKworSEVSRSA9IGFic3BhdGgoZGlybmFtZShfX2ZpbGVfXykpCitDTEVBTl9QQVRIID0gcmUuZXNjYXBlKGRpcm5hbWUoZGlybmFtZShfX2ZpbGVfXykpICsgb3MucGF0aC5zZXApCitVTk5FQ0VTU0FSWV9MQU1CREEgPSBqb2luKAorICAgIEhFUkUsICJmdW5jdGlvbmFsIiwgInUiLCAidW5uZWNlc3NhcnkiLCAidW5uZWNlc3NhcnlfbGFtYmRhLnB5IgorKQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgX3BhdGNoX3N0cmVhbXMob3V0KToKKyAgICBzeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IG91dAorICAgIHRyeToKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMuc3RkZXJyID0gc3lzLl9fc3RkZXJyX18KKyAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCisKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBfY29uZmlndXJlX2xjX2N0eXBlKGxjX2N0eXBlKToKKyAgICBsY19jdHlwZV9lbnYgPSAiTENfQ1RZUEUiCisgICAgb3JpZ2luYWxfbGN0eXBlID0gb3MuZW52aXJvbi5nZXQobGNfY3R5cGVfZW52KQorICAgIG9zLmVudmlyb25bbGNfY3R5cGVfZW52XSA9IGxjX2N0eXBlCisgICAgdHJ5OgorICAgICAgICB5aWVsZAorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmVudmlyb24ucG9wKGxjX2N0eXBlX2VudikKKyAgICAgICAgaWYgb3JpZ2luYWxfbGN0eXBlOgorICAgICAgICAgICAgb3MuZW52aXJvbltsY19jdHlwZV9lbnZdID0gb3JpZ2luYWxfbGN0eXBlCisKKworY2xhc3MgTXVsdGlSZXBvcnRlcihCYXNlUmVwb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXBvcnRlcnMpOgorICAgICAgICAjIHB5bGludDogZGlzYWJsZT1zdXBlci1pbml0LW5vdC1jYWxsZWQKKyAgICAgICAgIyBXZSBkb24ndCBjYWxsIGl0IGJlY2F1c2UgdGhlcmUgaXMgYW4gYXR0cmlidXRlICJsaW50ZXIiIHRoYXQgaXMgc2V0IGluc2lkZSB0aGUgYmFzZSBjbGFzcworICAgICAgICAjIGFuZCB3ZSBoYXZlIGFub3RoZXIgc2V0dGVyIGhlcmUgdXNpbmcgeWV0IHVuZGVmaW5lZCBhdHRyaWJ1dGUuCisgICAgICAgICMgSSBkb24ndCB0aGluayBmaXhpbmcgdGhlIGluaXQgb3JkZXIgaW4gYSB0ZXN0IGNsYXNzIHVzZWQgb25jZSBpcyB3b3J0aCBpdC4KKyAgICAgICAgc2VsZi5fcmVwb3J0ZXJzID0gcmVwb3J0ZXJzCisgICAgICAgIHNlbGYucGF0aF9zdHJpcF9wcmVmaXggPSBvcy5nZXRjd2QoKSArIG9zLnNlcAorCisgICAgZGVmIG9uX3NldF9jdXJyZW50X21vZHVsZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmb3IgcmVwIGluIHNlbGYuX3JlcG9ydGVyczoKKyAgICAgICAgICAgIHJlcC5vbl9zZXRfY3VycmVudF9tb2R1bGUoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGhhbmRsZV9tZXNzYWdlKHNlbGYsIG1zZzogTWVzc2FnZSkgLT4gTm9uZToKKyAgICAgICAgZm9yIHJlcCBpbiBzZWxmLl9yZXBvcnRlcnM6CisgICAgICAgICAgICByZXAuaGFuZGxlX21lc3NhZ2UobXNnKQorCisgICAgZGVmIF9kaXNwbGF5KHNlbGYsIGxheW91dCk6CisgICAgICAgIHBhc3MKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBvdXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnRlcnNbMF0ub3V0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbGludGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGludGVyCisKKyAgICBAbGludGVyLnNldHRlcgorICAgIGRlZiBsaW50ZXIoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9saW50ZXIgPSB2YWx1ZQorICAgICAgICBmb3IgcmVwIGluIHNlbGYuX3JlcG9ydGVyczoKKyAgICAgICAgICAgIHJlcC5saW50ZXIgPSB2YWx1ZQorCisKK2NsYXNzIFRlc3RSdW5UQzoKKyAgICBkZWYgX3J1bnRlc3Qoc2VsZiwgYXJncywgcmVwb3J0ZXI9Tm9uZSwgb3V0PU5vbmUsIGNvZGU9Tm9uZSk6CisgICAgICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICAgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICBweWxpbnRfY29kZSA9IHNlbGYuX3J1bl9weWxpbnQoYXJncywgcmVwb3J0ZXI9cmVwb3J0ZXIsIG91dD1vdXQpCisgICAgICAgIGlmIHJlcG9ydGVyOgorICAgICAgICAgICAgb3V0cHV0ID0gcmVwb3J0ZXIub3V0LmdldHZhbHVlKCkKKyAgICAgICAgZWxpZiBoYXNhdHRyKG91dCwgImdldHZhbHVlIik6CisgICAgICAgICAgICBvdXRwdXQgPSBvdXQuZ2V0dmFsdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0cHV0ID0gTm9uZQorICAgICAgICBtc2cgPSBmImV4cGVjdGVkIG91dHB1dCBzdGF0dXMge2NvZGV9LCBnb3Qge3B5bGludF9jb2RlfSIKKyAgICAgICAgaWYgb3V0cHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbXNnID0gZiJ7bXNnfS4gQmVsb3cgcHlsaW50IG91dHB1dDogXG57b3V0cHV0fSIKKyAgICAgICAgYXNzZXJ0IHB5bGludF9jb2RlID09IGNvZGUsIG1zZworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfcnVuX3B5bGludChhcmdzLCBvdXQsIHJlcG9ydGVyPU5vbmUpOgorICAgICAgICBhcmdzID0gYXJncyArIFsiLS1wZXJzaXN0ZW50PW5vIl0KKyAgICAgICAgd2l0aCBfcGF0Y2hfc3RyZWFtcyhvdXQpOgorICAgICAgICAgICAgd2l0aCBweXRlc3QucmFpc2VzKFN5c3RlbUV4aXQpIGFzIGNtOgorICAgICAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICBSdW4oYXJncywgcmVwb3J0ZXI9cmVwb3J0ZXIpCisgICAgICAgICAgICByZXR1cm4gY20udmFsdWUuY29kZQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY2xlYW5fcGF0aHMob3V0cHV0KToKKyAgICAgICAgIiIiTm9ybWFsaXplIHBhdGggdG8gdGhlIHRlc3RzIGRpcmVjdG9yeS4iIiIKKyAgICAgICAgb3V0cHV0ID0gcmUuc3ViKENMRUFOX1BBVEgsICIiLCBvdXRwdXQsIGZsYWdzPXJlLk1VTFRJTElORSkKKyAgICAgICAgcmV0dXJuIG91dHB1dC5yZXBsYWNlKCJcXCIsICIvIikKKworICAgIGRlZiBfdGVzdF9vdXRwdXQoc2VsZiwgYXJncywgZXhwZWN0ZWRfb3V0cHV0KToKKyAgICAgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9ydW5fcHlsaW50KGFyZ3MsIG91dD1vdXQpCisgICAgICAgIGFjdHVhbF9vdXRwdXQgPSBzZWxmLl9jbGVhbl9wYXRocyhvdXQuZ2V0dmFsdWUoKSkKKyAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gc2VsZi5fY2xlYW5fcGF0aHMoZXhwZWN0ZWRfb3V0cHV0KQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRfb3V0cHV0LnN0cmlwKCkgaW4gYWN0dWFsX291dHB1dC5zdHJpcCgpCisKKyAgICBkZWYgX3Rlc3Rfb3V0cHV0X2ZpbGUoc2VsZiwgYXJncywgZmlsZW5hbWUsIGV4cGVjdGVkX291dHB1dCk6CisgICAgICAgICIiIgorICAgICAgICBSdW4gUHlsaW50IHdpdGggdGhlIGBgb3V0cHV0YGAgb3B0aW9uIHNldCAobXVzdCBiZSBpbmNsdWRlZCBpbgorICAgICAgICB0aGUgYGBhcmdzYGAgcGFzc2VkIHRvIHRoaXMgbWV0aG9kISkgYW5kIGNoZWNrIHRoZSBmaWxlIGNvbnRlbnQgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgIiIiCisgICAgICAgIG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcnVuX3B5bGludChhcmdzLCBvdXQ9b3V0KQorICAgICAgICBjbWRsaW5lX291dHB1dCA9IG91dC5nZXR2YWx1ZSgpCisgICAgICAgIGZpbGVfb3V0cHV0ID0gc2VsZi5fY2xlYW5fcGF0aHMoUGF0aChmaWxlbmFtZSkucmVhZF90ZXh0KGVuY29kaW5nPSJ1dGYtOCIpKQorICAgICAgICBleHBlY3RlZF9vdXRwdXQgPSBzZWxmLl9jbGVhbl9wYXRocyhleHBlY3RlZF9vdXRwdXQpCisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBjbWRsaW5lX291dHB1dCA9PSAiIgorICAgICAgICApLCAiVW5leHBlY3RlZCBvdXRwdXQgdG8gc3Rkb3V0L3N0ZGVyciB3aGlsZSBvdXRwdXQgb3B0aW9uIHdhcyBzZXQiCisgICAgICAgIGFzc2VydCBleHBlY3RlZF9vdXRwdXQuc3RyaXAoKSBpbiBmaWxlX291dHB1dC5zdHJpcCgpCisKKyAgICBkZWYgdGVzdF9wa2dpbmZvKHNlbGYpOgorICAgICAgICAiIiJNYWtlIHB5bGludCBjaGVjayBpdHNlbGYuIiIiCisgICAgICAgIHNlbGYuX3J1bnRlc3QoWyJweWxpbnQuX19wa2dpbmZvX18iXSwgcmVwb3J0ZXI9VGV4dFJlcG9ydGVyKFN0cmluZ0lPKCkpLCBjb2RlPTApCisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgICIiIk1ha2UgcHlsaW50IGNoZWNrIGl0c2VsZi4iIiIKKyAgICAgICAgcmVwb3J0ZXJzID0gWworICAgICAgICAgICAgVGV4dFJlcG9ydGVyKFN0cmluZ0lPKCkpLAorICAgICAgICAgICAgQ29sb3JpemVkVGV4dFJlcG9ydGVyKFN0cmluZ0lPKCkpLAorICAgICAgICAgICAgSlNPTlJlcG9ydGVyKFN0cmluZ0lPKCkpLAorICAgICAgICBdCisgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICBbam9pbihIRVJFLCAiZnVuY3Rpb25hbCIsICJhIiwgImFyZ3VtZW50cy5weSIpXSwKKyAgICAgICAgICAgIHJlcG9ydGVyPU11bHRpUmVwb3J0ZXIocmVwb3J0ZXJzKSwKKyAgICAgICAgICAgIGNvZGU9MiwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfbm9fZXh0X2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bnRlc3QoW2pvaW4oSEVSRSwgImlucHV0IiwgIm5vZXh0IildLCBjb2RlPTApCisKKyAgICBkZWYgdGVzdF93MDcwNF9pZ25vcmVkKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW50ZXN0KFtqb2luKEhFUkUsICJpbnB1dCIsICJpZ25vcmVfZXhjZXB0X3Bhc3NfYnlfZGVmYXVsdC5weSIpXSwgY29kZT0wKQorCisgICAgZGVmIHRlc3RfZXhpdF96ZXJvKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW50ZXN0KAorICAgICAgICAgICAgWyItLWV4aXQtemVybyIsIGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAic3ludGF4X2Vycm9yLnB5IildLCBjb2RlPTAKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZ2VuZXJhdGVfY29uZmlnX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVudGVzdChbIi0tZ2VuZXJhdGUtcmNmaWxlIl0sIGNvZGU9MCkKKworICAgIGRlZiB0ZXN0X2dlbmVyYXRlX2NvbmZpZ19vcHRpb25fb3JkZXIoc2VsZik6CisgICAgICAgIG91dDEgPSBTdHJpbmdJTygpCisgICAgICAgIG91dDIgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3J1bnRlc3QoWyItLWdlbmVyYXRlLXJjZmlsZSJdLCBjb2RlPTAsIG91dD1vdXQxKQorICAgICAgICBzZWxmLl9ydW50ZXN0KFsiLS1nZW5lcmF0ZS1yY2ZpbGUiXSwgY29kZT0wLCBvdXQ9b3V0MikKKyAgICAgICAgb3V0cHV0MSA9IG91dDEuZ2V0dmFsdWUoKQorICAgICAgICBvdXRwdXQyID0gb3V0Mi5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBvdXRwdXQxID09IG91dHB1dDIKKworICAgIGRlZiB0ZXN0X2dlbmVyYXRlX2NvbmZpZ19kaXNhYmxlX3N5bWJvbGljX25hbWVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCAtLWdlbmVyYXRlLXJjZmlsZSBwdXRzIHN5bWJvbGljIG5hbWVzIGluIHRoZSAtLWRpc2FibGUKKyAgICAgICAgIyBvcHRpb24uCisKKyAgICAgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9ydW5fcHlsaW50KFsiLS1nZW5lcmF0ZS1yY2ZpbGUiLCAiLS1yY2ZpbGU9Il0sIG91dD1vdXQpCisKKyAgICAgICAgb3V0cHV0ID0gb3V0LmdldHZhbHVlKCkKKyAgICAgICAgIyBHZXQgcmlkIG9mIHRoZSBwZXNreSBtZXNzYWdlcyB0aGF0IHB5bGludCBlbWl0cyBpZiB0aGUKKyAgICAgICAgIyBjb25maWd1cmF0aW9uIGZpbGUgaXMgbm90IGZvdW5kLgorICAgICAgICBwYXR0ZXJuID0gcmYiXFt7TUFJTl9DSEVDS0VSX05BTUUudXBwZXIoKX0iCisgICAgICAgIG1hc3RlciA9IHJlLnNlYXJjaChwYXR0ZXJuLCBvdXRwdXQpCisgICAgICAgIGFzc2VydCBtYXN0ZXIgaXMgbm90IE5vbmUsIGYie3BhdHRlcm59IG5vdCBmb3VuZCBpbiB7b3V0cHV0fSIKKyAgICAgICAgb3V0ID0gU3RyaW5nSU8ob3V0cHV0W21hc3Rlci5zdGFydCgpIDpdKQorICAgICAgICBwYXJzZXIgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnJlYWRfZmlsZShvdXQpCisgICAgICAgIG1lc3NhZ2VzID0gdXRpbHMuX3NwbGl0c3RyaXAocGFyc2VyLmdldCgiTUVTU0FHRVMgQ09OVFJPTCIsICJkaXNhYmxlIikpCisgICAgICAgIGFzc2VydCAic3VwcHJlc3NlZC1tZXNzYWdlIiBpbiBtZXNzYWdlcworCisgICAgZGVmIHRlc3RfZ2VuZXJhdGVfcmNmaWxlX25vX29ic29sZXRlX21ldGhvZHMoc2VsZik6CisgICAgICAgIG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcnVuX3B5bGludChbIi0tZ2VuZXJhdGUtcmNmaWxlIl0sIG91dD1vdXQpCisgICAgICAgIG91dHB1dCA9IG91dC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCAicHJvZmlsZSIgbm90IGluIG91dHB1dAorCisgICAgZGVmIHRlc3Rfbm9uZXhpc3RlbnRfY29uZmlnX2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bnRlc3QoWyItLXJjZmlsZT0vdG1wL3RoaXNfZmlsZV9kb2VzX25vdF9leGlzdCJdLCBjb2RlPTMyKQorCisgICAgZGVmIHRlc3RfaGVscF9tZXNzYWdlX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVudGVzdChbIi0taGVscC1tc2ciLCAiVzAxMDEiXSwgY29kZT0wKQorCisgICAgZGVmIHRlc3RfZXJyb3JfaGVscF9tZXNzYWdlX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVudGVzdChbIi0taGVscC1tc2ciLCAiV1gxMDEiXSwgY29kZT0wKQorCisgICAgZGVmIHRlc3RfZXJyb3JfbWlzc2luZ19hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bnRlc3QoW10sIGNvZGU9MzIpCisKKyAgICBkZWYgdGVzdF9ub19vdXRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICIiInRlc3QgcmVkaXJlY3Rpb24gb2Ygc3Rkb3V0IHdpdGggbm9uIGFzY2lpIGNhcmFjdGVycyIiIgorICAgICAgICAjIFRoaXMgdGVzdCByZXByb2R1Y2VzIGJ1ZyAjNDgwNjYgOyBpdCBoYXBwZW5zIHdoZW4gc3Rkb3V0IGlzIHJlZGlyZWN0ZWQKKyAgICAgICAgIyB0aHJvdWdoICc+JyA6IHRoZSBzeXMuc3Rkb3V0LmVuY29kaW5nIGJlY29tZXMgdGhlbiBOb25lLCBhbmQgaWYgdGhlCisgICAgICAgICMgb3V0cHV0IGNvbnRhaW5zIG5vbiBhc2NpaSwgcHlsaW50IHdpbGwgY3Jhc2gKKyAgICAgICAgc3RyaW8gPSBTdHJpbmdJTygpCisgICAgICAgIGFzc2VydCBzdHJpby5lbmNvZGluZyBpcyBOb25lCisgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICBbam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJub19zdGRvdXRfZW5jb2RpbmcucHkiKSwgIi0tZW5hYmxlPWFsbCJdLAorICAgICAgICAgICAgb3V0PXN0cmlvLAorICAgICAgICAgICAgY29kZT0yOCwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfcGFyYWxsZWxfZXhlY3V0aW9uKHNlbGYpOgorICAgICAgICBvdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgIi1qIDIiLAorICAgICAgICAgICAgICAgIGpvaW4oSEVSRSwgImZ1bmN0aW9uYWwiLCAiYSIsICJhcmd1bWVudHMucHkiKSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBvdXQ9b3V0LAorICAgICAgICAgICAgIyBXZSBleHBlY3Qgc2ltaWxhcml0aWVzIHRvIGZhaWwgYW5kIGFuIGVycm9yCisgICAgICAgICAgICBjb2RlPU1TR19UWVBFU19TVEFUVVNbIkUiXSwKKyAgICAgICAgKQorICAgICAgICBhc3NlcnQgKAorICAgICAgICAgICAgIlVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnZm91cnRoJyBpbiBmdW5jdGlvbiBjYWxsIgorICAgICAgICAgICAgaW4gb3V0LmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wYXJhbGxlbF9leGVjdXRpb25fYnVnXzI2NzQoc2VsZik6CisgICAgICAgICIiIlRlc3RzIHRoYXQgZGlzYWJsaW5nIGFic29sdXRlIGltcG9ydHMgd29ya3MgdGhlIHNhbWUgaW4gLWoxL2oyIiIiCisgICAgICAgIGV4cGVjdGVkX3JldF9jb2RlID0gMCAgIyB3ZSBhcmUgZGlzYWJsaW5nIHRoZSBjaGVjaywgc2hvdWxkIHBhc3MKKyAgICAgICAgZm9yIGpvYnMgaW4gKDEsIDIpOgorICAgICAgICAgICAgc2VsZi5fcnVudGVzdCgKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICItLXB5M2siLAorICAgICAgICAgICAgICAgICAgICAiLS1kaXNhYmxlPW5vLWFic29sdXRlLWltcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICItaiAlZCIgJSBqb2JzLAorICAgICAgICAgICAgICAgICAgICBqb2luKEhFUkUsICJpbnB1dCIsICJub19hYnNvbHV0ZV9pbXBvcnQucHkiKSwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGNvZGU9ZXhwZWN0ZWRfcmV0X2NvZGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wYXJhbGxlbF9leGVjdXRpb25fbWlzc2luZ19hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bnRlc3QoWyItaiAyIiwgIm5vdF9oZXJlIiwgIm5vdF9oZXJlX3RvbyJdLCBjb2RlPTEpCisKKyAgICBkZWYgdGVzdF9weTNrX29wdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgLS1weTNrIGZsYWcgd29ya3MuCisgICAgICAgIHJjX2NvZGUgPSAwCisgICAgICAgIHNlbGYuX3J1bnRlc3QoW1VOTkVDRVNTQVJZX0xBTUJEQSwgIi0tcHkzayJdLCBjb2RlPXJjX2NvZGUpCisKKyAgICBkZWYgdGVzdF9weTNrX2pvYnNfb3B0aW9uKHNlbGYpOgorICAgICAgICByY19jb2RlID0gMAorICAgICAgICBzZWxmLl9ydW50ZXN0KFtVTk5FQ0VTU0FSWV9MQU1CREEsICItLXB5M2siLCAiLWogMiJdLCBjb2RlPXJjX2NvZGUpCisKKyAgICBkZWYgdGVzdF9hYmJyZXZpYXRpb25zX2FyZV9ub3Rfc3VwcG9ydGVkKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICJubyBzdWNoIG9wdGlvbjogLS1sb2FkLXBsdWdpbiIKKyAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoWyIuIiwgIi0tbG9hZC1wbHVnaW4iXSwgZXhwZWN0ZWRfb3V0cHV0PWV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZW5hYmxlX2FsbF93b3JrcyhzZWxmKToKKyAgICAgICAgbW9kdWxlID0gam9pbihIRVJFLCAiZGF0YSIsICJjbGllbnRtb2R1bGVfdGVzdC5weSIpCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgZiIiIgorICAgICAgICAqKioqKioqKioqKioqIE1vZHVsZSBkYXRhLmNsaWVudG1vZHVsZV90ZXN0CisgICAgICAgIHttb2R1bGV9OjEwOjg6IFcwNjEyOiBVbnVzZWQgdmFyaWFibGUgJ2xvY2FsX3ZhcmlhYmxlJyAodW51c2VkLXZhcmlhYmxlKQorICAgICAgICB7bW9kdWxlfToxODo0OiBDMDExNjogTWlzc2luZyBmdW5jdGlvbiBvciBtZXRob2QgZG9jc3RyaW5nIChtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZykKKyAgICAgICAge21vZHVsZX06MjI6MDogQzAxMTU6IE1pc3NpbmcgY2xhc3MgZG9jc3RyaW5nIChtaXNzaW5nLWNsYXNzLWRvY3N0cmluZykKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoCisgICAgICAgICAgICBbbW9kdWxlLCAiLS1kaXNhYmxlPWFsbCIsICItLWVuYWJsZT1hbGwiLCAiLXJuIl0sIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF93cm9uZ19pbXBvcnRfcG9zaXRpb25fd2hlbl9vdGhlcnNfZGlzYWJsZWQoc2VsZik6CisgICAgICAgIG1vZHVsZTEgPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgImltcG9ydF9zb21ldGhpbmcucHkiKQorICAgICAgICBtb2R1bGUyID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJ3cm9uZ19pbXBvcnRfcG9zaXRpb24ucHkiKQorICAgICAgICBleHBlY3RlZF9vdXRwdXQgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICBmIiIiCisgICAgICAgICoqKioqKioqKioqKiogTW9kdWxlIHdyb25nX2ltcG9ydF9wb3NpdGlvbgorICAgICAgICB7bW9kdWxlMn06MTE6MDogQzA0MTM6IEltcG9ydCAiaW1wb3J0IG9zIiBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSAod3JvbmctaW1wb3J0LXBvc2l0aW9uKQorICAgICAgICAiIiIKKyAgICAgICAgKQorICAgICAgICBhcmdzID0gWworICAgICAgICAgICAgbW9kdWxlMiwKKyAgICAgICAgICAgIG1vZHVsZTEsCisgICAgICAgICAgICAiLS1kaXNhYmxlPWFsbCIsCisgICAgICAgICAgICAiLS1lbmFibGU9d3JvbmctaW1wb3J0LXBvc2l0aW9uIiwKKyAgICAgICAgICAgICItcm4iLAorICAgICAgICAgICAgIi1zbiIsCisgICAgICAgIF0KKyAgICAgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9ydW5fcHlsaW50KGFyZ3MsIG91dD1vdXQpCisgICAgICAgIGFjdHVhbF9vdXRwdXQgPSBzZWxmLl9jbGVhbl9wYXRocyhvdXQuZ2V0dmFsdWUoKS5zdHJpcCgpKQorCisgICAgICAgIHRvX3JlbW92ZSA9ICJObyBjb25maWcgZmlsZSBmb3VuZCwgdXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIgorICAgICAgICBpZiB0b19yZW1vdmUgaW4gYWN0dWFsX291dHB1dDoKKyAgICAgICAgICAgIGFjdHVhbF9vdXRwdXQgPSBhY3R1YWxfb3V0cHV0W2xlbih0b19yZW1vdmUpIDpdCisgICAgICAgIGlmIGFjdHVhbF9vdXRwdXQuc3RhcnRzd2l0aCgiVXNpbmcgY29uZmlnIGZpbGUgIik6CisgICAgICAgICAgICAjIElmIH4vLnB5bGludHJjIGlzIHByZXNlbnQgcmVtb3ZlIHRoZQorICAgICAgICAgICAgIyBVc2luZyBjb25maWcgZmlsZS4uLiAgbGluZQorICAgICAgICAgICAgYWN0dWFsX291dHB1dCA9IGFjdHVhbF9vdXRwdXRbYWN0dWFsX291dHB1dC5maW5kKCJcbiIpIDpdCisgICAgICAgIGFzc2VydCBzZWxmLl9jbGVhbl9wYXRocyhleHBlY3RlZF9vdXRwdXQuc3RyaXAoKSkgPT0gYWN0dWFsX291dHB1dC5zdHJpcCgpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfaXRzZWxmX25vdF9hY2NvdW50ZWRfZm9yX3JlbGF0aXZlX2ltcG9ydHMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gIllvdXIgY29kZSBoYXMgYmVlbiByYXRlZCBhdCAxMC4wMC8xMCIKKyAgICAgICAgcGFja2FnZSA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiZHVtbXkiKQorICAgICAgICBzZWxmLl90ZXN0X291dHB1dCgKKyAgICAgICAgICAgIFtwYWNrYWdlLCAiLS1kaXNhYmxlPWxvY2FsbHktZGlzYWJsZWQiLCAiLXJuIl0sIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9yZWplY3RfZW1wdHlfaW5kZW50X3N0cmluZ3Moc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gImluZGVudCBzdHJpbmcgY2FuJ3QgYmUgZW1wdHkiCisgICAgICAgIG1vZHVsZSA9IGpvaW4oSEVSRSwgImRhdGEiLCAiY2xpZW50bW9kdWxlX3Rlc3QucHkiKQorICAgICAgICBzZWxmLl90ZXN0X291dHB1dChbbW9kdWxlLCAiLS1pbmRlbnQtc3RyaW5nPSJdLCBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9qc29uX3JlcG9ydF93aGVuX2ZpbGVfaGFzX3N5bnRheF9lcnJvcihzZWxmKToKKyAgICAgICAgb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICBtb2R1bGUgPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgInN5bnRheF9lcnJvci5weSIpCisgICAgICAgIHNlbGYuX3J1bnRlc3QoW21vZHVsZV0sIGNvZGU9MiwgcmVwb3J0ZXI9SlNPTlJlcG9ydGVyKG91dCkpCisgICAgICAgIG91dHB1dCA9IGpzb24ubG9hZHMob3V0LmdldHZhbHVlKCkpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG91dHB1dCwgbGlzdCkKKyAgICAgICAgYXNzZXJ0IGxlbihvdXRwdXQpID09IDEKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3V0cHV0WzBdLCBkaWN0KQorICAgICAgICAjIFNvIGVhY2ggdmVyc2lvbiB3YW50cyBhIGRpZmZlcmVudCBjb2x1bW4gbnVtYmVyLi4uCisgICAgICAgIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICJQeVB5IjoKKyAgICAgICAgICAgIGNvbHVtbiA9IDkKKyAgICAgICAgZWxpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA4KToKKyAgICAgICAgICAgIGNvbHVtbiA9IDkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbHVtbiA9IDE1CisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgIm9iaiI6ICIiLAorICAgICAgICAgICAgImNvbHVtbiI6IGNvbHVtbiwKKyAgICAgICAgICAgICJsaW5lIjogMSwKKyAgICAgICAgICAgICJ0eXBlIjogImVycm9yIiwKKyAgICAgICAgICAgICJzeW1ib2wiOiAic3ludGF4LWVycm9yIiwKKyAgICAgICAgICAgICJtb2R1bGUiOiAic3ludGF4X2Vycm9yIiwKKyAgICAgICAgfQorICAgICAgICBtZXNzYWdlID0gb3V0cHV0WzBdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGV4cGVjdGVkLml0ZW1zKCk6CisgICAgICAgICAgICBhc3NlcnQga2V5IGluIG1lc3NhZ2UKKyAgICAgICAgICAgIGFzc2VydCBtZXNzYWdlW2tleV0gPT0gdmFsdWUKKyAgICAgICAgbXNnID0gbWVzc2FnZVsibWVzc2FnZSJdLmxvd2VyKCkKKyAgICAgICAgYXNzZXJ0IGFueSh4IGluIG1zZyBmb3IgeCBpbiAoImV4cGVjdGVkICc6JyIsICJpbnZhbGlkIHN5bnRheCIpKQorICAgICAgICBhc3NlcnQgIjx1bmtub3duPiIgaW4gbXNnCisgICAgICAgIGFzc2VydCAibGluZSAxIiBpbiBtc2cKKworICAgIGRlZiB0ZXN0X2pzb25fcmVwb3J0X3doZW5fZmlsZV9pc19taXNzaW5nKHNlbGYpOgorICAgICAgICBvdXQgPSBTdHJpbmdJTygpCisgICAgICAgIG1vZHVsZSA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAidG90YWxseV9taXNzaW5nLnB5IikKKyAgICAgICAgc2VsZi5fcnVudGVzdChbbW9kdWxlXSwgY29kZT0xLCByZXBvcnRlcj1KU09OUmVwb3J0ZXIob3V0KSkKKyAgICAgICAgb3V0cHV0ID0ganNvbi5sb2FkcyhvdXQuZ2V0dmFsdWUoKSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3V0cHV0LCBsaXN0KQorICAgICAgICBhc3NlcnQgbGVuKG91dHB1dCkgPT0gMQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdXRwdXRbMF0sIGRpY3QpCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgIm9iaiI6ICIiLAorICAgICAgICAgICAgImNvbHVtbiI6IDAsCisgICAgICAgICAgICAibGluZSI6IDEsCisgICAgICAgICAgICAidHlwZSI6ICJmYXRhbCIsCisgICAgICAgICAgICAic3ltYm9sIjogImZhdGFsIiwKKyAgICAgICAgICAgICJtb2R1bGUiOiBtb2R1bGUsCisgICAgICAgIH0KKyAgICAgICAgbWVzc2FnZSA9IG91dHB1dFswXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBleHBlY3RlZC5pdGVtcygpOgorICAgICAgICAgICAgYXNzZXJ0IGtleSBpbiBtZXNzYWdlCisgICAgICAgICAgICBhc3NlcnQgbWVzc2FnZVtrZXldID09IHZhbHVlCisgICAgICAgIGFzc2VydCBtZXNzYWdlWyJtZXNzYWdlIl0uc3RhcnRzd2l0aCgiTm8gbW9kdWxlIG5hbWVkIikKKworICAgIGRlZiB0ZXN0X2pzb25fcmVwb3J0X2RvZXNfbm90X2VzY2FwZV9xdW90ZXMoc2VsZik6CisgICAgICAgIG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgbW9kdWxlID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJ1bnVzZWRfdmFyaWFibGUucHkiKQorICAgICAgICBzZWxmLl9ydW50ZXN0KFttb2R1bGVdLCBjb2RlPTQsIHJlcG9ydGVyPUpTT05SZXBvcnRlcihvdXQpKQorICAgICAgICBvdXRwdXQgPSBqc29uLmxvYWRzKG91dC5nZXR2YWx1ZSgpKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvdXRwdXQsIGxpc3QpCisgICAgICAgIGFzc2VydCBsZW4ob3V0cHV0KSA9PSAxCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG91dHB1dFswXSwgZGljdCkKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICAic3ltYm9sIjogInVudXNlZC12YXJpYWJsZSIsCisgICAgICAgICAgICAibW9kdWxlIjogInVudXNlZF92YXJpYWJsZSIsCisgICAgICAgICAgICAiY29sdW1uIjogNCwKKyAgICAgICAgICAgICJtZXNzYWdlIjogIlVudXNlZCB2YXJpYWJsZSAndmFyaWFibGUnIiwKKyAgICAgICAgICAgICJtZXNzYWdlLWlkIjogIlcwNjEyIiwKKyAgICAgICAgICAgICJsaW5lIjogNCwKKyAgICAgICAgICAgICJ0eXBlIjogIndhcm5pbmciLAorICAgICAgICB9CisgICAgICAgIG1lc3NhZ2UgPSBvdXRwdXRbMF0KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZXhwZWN0ZWQuaXRlbXMoKToKKyAgICAgICAgICAgIGFzc2VydCBrZXkgaW4gbWVzc2FnZQorICAgICAgICAgICAgYXNzZXJ0IG1lc3NhZ2Vba2V5XSA9PSB2YWx1ZQorCisgICAgZGVmIHRlc3RfaW5mb3JtYXRpb25fY2F0ZWdvcnlfZGlzYWJsZWRfYnlfZGVmYXVsdChzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAiWW91ciBjb2RlIGhhcyBiZWVuIHJhdGVkIGF0IDEwLjAwLzEwIgorICAgICAgICBwYXRoID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJtZXRhLnB5IikKKyAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoW3BhdGhdLCBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9tb2RlX3Nob3dzX25vX3Njb3JlKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgImFwcGxpY2F0aW9uX2NyYXNoLnB5IikKKyAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgZiIiIgorICAgICAgICAqKioqKioqKioqKioqIE1vZHVsZSBhcHBsaWNhdGlvbl9jcmFzaAorICAgICAgICB7bW9kdWxlfToxOjY6IEUwNjAyOiBVbmRlZmluZWQgdmFyaWFibGUgJ3NvbWV0aGluZ191bmRlZmluZWQnICh1bmRlZmluZWQtdmFyaWFibGUpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KFttb2R1bGUsICItRSJdLCBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWRfb3V0cHV0KQorCisgICAgZGVmIHRlc3RfZXZhbHVhdGlvbl9zY29yZV9zaG93bl9ieV9kZWZhdWx0KHNlbGYpOgorICAgICAgICBleHBlY3RlZF9vdXRwdXQgPSAiWW91ciBjb2RlIGhhcyBiZWVuIHJhdGVkIGF0ICIKKyAgICAgICAgbW9kdWxlID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJhcHBsaWNhdGlvbl9jcmFzaC5weSIpCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KFttb2R1bGVdLCBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWRfb3V0cHV0KQorCisgICAgZGVmIHRlc3RfY29uZmlkZW5jZV9sZXZlbHMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gIllvdXIgY29kZSBoYXMgYmVlbiByYXRlZCBhdCIKKyAgICAgICAgcGF0aCA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAibWV0YS5weSIpCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KAorICAgICAgICAgICAgW3BhdGgsICItLWNvbmZpZGVuY2U9SElHSCxJTkZFUkVOQ0UiXSwgZXhwZWN0ZWRfb3V0cHV0PWV4cGVjdGVkCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JvbV9tYXJrZXIoc2VsZik6CisgICAgICAgIHBhdGggPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgIm1ldGEucHkiKQorICAgICAgICBjb25maWdfcGF0aCA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiLnB5bGludHJjIikKKyAgICAgICAgZXhwZWN0ZWQgPSAiWW91ciBjb2RlIGhhcyBiZWVuIHJhdGVkIGF0IDEwLjAwLzEwIgorICAgICAgICBzZWxmLl90ZXN0X291dHB1dCgKKyAgICAgICAgICAgIFtwYXRoLCAiLS1yY2ZpbGU9JXMiICUgY29uZmlnX3BhdGgsICItcm4iXSwgZXhwZWN0ZWRfb3V0cHV0PWV4cGVjdGVkCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3B5bGludHJjX3BsdWdpbl9kdXBsaWNhdGVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgZHVtbXlfcGx1Z2luX3BhdGggPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgImR1bW15X3BsdWdpbiIpCisgICAgICAgICMgRW5hYmxlIC0tbG9hZC1wbHVnaW5zPWR1bW15X3BsdWdpbgorICAgICAgICBzeXMucGF0aC5hcHBlbmQoZHVtbXlfcGx1Z2luX3BhdGgpCisgICAgICAgIGNvbmZpZ19wYXRoID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJkdW1teV9wbHVnaW4ucmMiKQorICAgICAgICBleHBlY3RlZCA9ICgKKyAgICAgICAgICAgICI6ZHVtbXktbWVzc2FnZS0wMSAoSTkwNjEpOiAqRHVtbXkgc2hvcnQgZGVzYyAwMSpcbiIKKyAgICAgICAgICAgICIgIER1bW15IGxvbmcgZGVzYyBUaGlzIG1lc3NhZ2UgYmVsb25ncyB0byB0aGUgZHVtbXlfcGx1Z2luIGNoZWNrZXIuXG5cbiIKKyAgICAgICAgICAgICI6ZHVtbXktbWVzc2FnZS0wMiAoSTkwNjApOiAqRHVtbXkgc2hvcnQgZGVzYyAwMipcbiIKKyAgICAgICAgICAgICIgIER1bW15IGxvbmcgZGVzYyBUaGlzIG1lc3NhZ2UgYmVsb25ncyB0byB0aGUgZHVtbXlfcGx1Z2luIGNoZWNrZXIuIgorICAgICAgICApCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICItLXJjZmlsZT0lcyIgJSBjb25maWdfcGF0aCwKKyAgICAgICAgICAgICAgICAiLS1oZWxwLW1zZz1kdW1teS1tZXNzYWdlLTAxLGR1bW15LW1lc3NhZ2UtMDIiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZCwKKyAgICAgICAgKQorICAgICAgICBleHBlY3RlZCA9ICgKKyAgICAgICAgICAgICJbRFVNTVlfUExVR0lOXVxuXG4jIER1bW15IG9wdGlvbiAxXG5kdW1teV9vcHRpb25fMT1kdW1teSB2YWx1ZSAxXG5cbiIKKyAgICAgICAgICAgICIjIER1bW15IG9wdGlvbiAyXG5kdW1teV9vcHRpb25fMj1kdW1teSB2YWx1ZSAyIgorICAgICAgICApCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KAorICAgICAgICAgICAgWyItLXJjZmlsZT0lcyIgJSBjb25maWdfcGF0aCwgIi0tZ2VuZXJhdGUtcmNmaWxlIl0sIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZAorICAgICAgICApCisgICAgICAgIHN5cy5wYXRoLnJlbW92ZShkdW1teV9wbHVnaW5fcGF0aCkKKworICAgIGRlZiB0ZXN0X3B5bGludHJjX2NvbW1lbnRzX2luX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgcGF0aCA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAidGVzdF9weWxpbnRyY19jb21tZW50cy5weSIpCisgICAgICAgIGNvbmZpZ19wYXRoID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJjb21tZW50c19weWxpbnRyYyIpCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgZiIiIgorICAgICAgICAqKioqKioqKioqKioqIE1vZHVsZSB0ZXN0X3B5bGludHJjX2NvbW1lbnRzCisgICAgICAgIHtwYXRofToyOjA6IFcwMzExOiBCYWQgaW5kZW50YXRpb24uIEZvdW5kIDEgc3BhY2VzLCBleHBlY3RlZCA0IChiYWQtaW5kZW50YXRpb24pCisgICAgICAgIHtwYXRofToxOjA6IEMwMTE0OiBNaXNzaW5nIG1vZHVsZSBkb2NzdHJpbmcgKG1pc3NpbmctbW9kdWxlLWRvY3N0cmluZykKKyAgICAgICAge3BhdGh9OjE6MDogQzAxMTY6IE1pc3NpbmcgZnVuY3Rpb24gb3IgbWV0aG9kIGRvY3N0cmluZyAobWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcpCisgICAgICAgICIiIgorICAgICAgICApCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KAorICAgICAgICAgICAgW3BhdGgsICItLXJjZmlsZT0lcyIgJSBjb25maWdfcGF0aCwgIi1ybiJdLCBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWQKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfbm9fY3Jhc2hfd2l0aF9mb3JtYXR0aW5nX3JlZ2V4X2RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW50ZXN0KAorICAgICAgICAgICAgWyItLWlnbm9yZS1wYXR0ZXJucz1hIl0sIHJlcG9ydGVyPVRleHRSZXBvcnRlcihTdHJpbmdJTygpKSwgY29kZT0zMgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9nZXRkZWZhdWx0ZW5jb2RpbmdfY3Jhc2hlc193aXRoX2xjX2N0eXBlX3V0Zjgoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiYXBwbGljYXRpb25fY3Jhc2gucHkiKQorICAgICAgICBleHBlY3RlZF9vdXRwdXQgPSB0ZXh0d3JhcC5kZWRlbnQoCisgICAgICAgICAgICBmIiIiCisgICAgICAgIHttb2R1bGV9OjE6NjogRTA2MDI6IFVuZGVmaW5lZCB2YXJpYWJsZSAnc29tZXRoaW5nX3VuZGVmaW5lZCcgKHVuZGVmaW5lZC12YXJpYWJsZSkKKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgd2l0aCBfY29uZmlndXJlX2xjX2N0eXBlKCJVVEYtOCIpOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoW21vZHVsZSwgIi1FIl0sIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZF9vdXRwdXQpCisKKyAgICBAcHl0ZXN0Lm1hcmsuc2tpcGlmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCByZWFzb249Im9ubHkgb2NjdXJzIG9uICpuaXgiKQorICAgIGRlZiB0ZXN0X3BhcnNlYWJsZV9maWxlX3BhdGgoc2VsZik6CisgICAgICAgIGZpbGVfbmFtZSA9ICJ0ZXN0X3RhcmdldC5weSIKKyAgICAgICAgZmFrZV9wYXRoID0gSEVSRSArIG9zLmdldGN3ZCgpCisgICAgICAgIG1vZHVsZSA9IGpvaW4oZmFrZV9wYXRoLCBmaWxlX25hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBjcmVhdGUgbW9kdWxlIHVuZGVyIGRpcmVjdG9yaWVzIHdoaWNoIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyByZXBvcnRlci5wYXRoX3N0cmlwX3ByZWZpeAorICAgICAgICAgICAgIyBlLmcuIC9zcmMvc29tZS9wYXRoL3NyYy90ZXN0X3RhcmdldC5weSB3aGVuIHJlcG9ydGVyLnBhdGhfc3RyaXBfcHJlZml4ID0gL3NyYy8KKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKGZha2VfcGF0aCkKKyAgICAgICAgICAgIHdpdGggb3Blbihtb2R1bGUsICJ3IikgYXMgdGVzdF90YXJnZXQ6CisgICAgICAgICAgICAgICAgdGVzdF90YXJnZXQud3JpdGUoImEsYiA9IG9iamVjdCgpIikKKworICAgICAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoCisgICAgICAgICAgICAgICAgW21vZHVsZSwgIi0tb3V0cHV0LWZvcm1hdD1wYXJzZWFibGUiXSwgZXhwZWN0ZWRfb3V0cHV0PWZpbGVfbmFtZQorICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKG1vZHVsZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMoZmFrZV9wYXRoKQorCisgICAgQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICAgICAiaW5wdXRfcGF0aCxtb2R1bGUsZXhwZWN0ZWRfcGF0aCIsCisgICAgICAgIFsKKyAgICAgICAgICAgIChqb2luKEhFUkUsICJteW1vZHVsZS5weSIpLCAibXltb2R1bGUiLCBqb2luKEhFUkUsICJteW1vZHVsZS5weSIpKSwKKyAgICAgICAgICAgICgibXltb2R1bGUucHkiLCAibXltb2R1bGUiLCAibXltb2R1bGUucHkiKSwKKyAgICAgICAgXSwKKyAgICApCisgICAgZGVmIHRlc3Rfc3RkaW4oc2VsZiwgaW5wdXRfcGF0aCwgbW9kdWxlLCBleHBlY3RlZF9wYXRoKToKKyAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gZiIiIioqKioqKioqKioqKiogTW9kdWxlIHttb2R1bGV9Cit7ZXhwZWN0ZWRfcGF0aH06MTowOiBXMDYxMTogVW51c2VkIGltcG9ydCBvcyAodW51c2VkLWltcG9ydCkKKworIiIiCisKKyAgICAgICAgd2l0aCBtb2NrLnBhdGNoKAorICAgICAgICAgICAgInB5bGludC5saW50LnB5bGludGVyLl9yZWFkX3N0ZGluIiwgcmV0dXJuX3ZhbHVlPSJpbXBvcnQgb3NcbiIKKyAgICAgICAgKSBhcyBtb2NrX3N0ZGluOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoCisgICAgICAgICAgICAgICAgWyItLWZyb20tc3RkaW4iLCBpbnB1dF9wYXRoLCAiLS1kaXNhYmxlPWFsbCIsICItLWVuYWJsZT11bnVzZWQtaW1wb3J0Il0sCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0PWV4cGVjdGVkX291dHB1dCwKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGFzc2VydCBtb2NrX3N0ZGluLmNhbGxfY291bnQgPT0gMQorCisgICAgZGVmIHRlc3Rfc3RkaW5fbWlzc2luZ19tb2R1bGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW50ZXN0KFsiLS1mcm9tLXN0ZGluIl0sIGNvZGU9MzIpCisKKyAgICBAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoIndyaXRlX2JweV90b19kaXNrIiwgW0ZhbHNlLCBUcnVlXSkKKyAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRzKHNlbGYsIHdyaXRlX2JweV90b19kaXNrLCB0bXBkaXIpOgorICAgICAgICBhID0gdG1wZGlyLmpvaW4oImEiKQorCisgICAgICAgIGJfY29kZSA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZnJvbSAuYyBpbXBvcnQgZm9vYmFyCisgICAgICAgICAgICBmcm9tIC5kIGltcG9ydCBibGEgICMgbW9kdWxlIGRvZXMgbm90IGV4aXN0CisKKyAgICAgICAgICAgIGZvb2JhcignaGVsbG8nKQorICAgICAgICAgICAgYmxhKCkKKyAgICAgICAgICAgICIiIgorICAgICAgICApCisKKyAgICAgICAgY19jb2RlID0gdGV4dHdyYXAuZGVkZW50KAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBkZWYgZm9vYmFyKGFyZyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgICkKKworICAgICAgICBhLm1rZGlyKCkKKyAgICAgICAgYS5qb2luKCJfX2luaXRfXy5weSIpLndyaXRlKCIiKQorICAgICAgICBpZiB3cml0ZV9icHlfdG9fZGlzazoKKyAgICAgICAgICAgIGEuam9pbigiYi5weSIpLndyaXRlKGJfY29kZSkKKyAgICAgICAgYS5qb2luKCJjLnB5Iikud3JpdGUoY19jb2RlKQorCisgICAgICAgIHdpdGggdG1wZGlyLmFzX2N3ZCgpOgorICAgICAgICAgICAgIyB3aHkgZG9uJ3Qgd2Ugc3RhcnQgcHlsaW50IGluIGEgc3VicHJvY2Vzcz8KKyAgICAgICAgICAgIGV4cGVjdGVkID0gKAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqIE1vZHVsZSBhLmJcbiIKKyAgICAgICAgICAgICAgICAiYS9iLnB5OjM6MDogRTA0MDE6IFVuYWJsZSB0byBpbXBvcnQgJ2EuZCcgKGltcG9ydC1lcnJvcilcblxuIgorICAgICAgICAgICAgKQorCisgICAgICAgICAgICBpZiB3cml0ZV9icHlfdG9fZGlzazoKKyAgICAgICAgICAgICAgICAjIC0tZnJvbS1zdGRpbiBpcyBub3QgdXNlZCBoZXJlCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIFsiYS9iLnB5IiwgIi0tZGlzYWJsZT1hbGwiLCAiLS1lbmFibGU9aW1wb3J0LWVycm9yIl0sCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZCwKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICMgdGhpcyBjb2RlIG5lZWRzIHRvIHdvcmsgdy8gYW5kIHcvbyBhIGZpbGUgbmFtZWQgYS9iLnB5IG9uIHRoZQorICAgICAgICAgICAgIyBoYXJkZGlzay4KKyAgICAgICAgICAgIHdpdGggbW9jay5wYXRjaCgicHlsaW50LmxpbnQucHlsaW50ZXIuX3JlYWRfc3RkaW4iLCByZXR1cm5fdmFsdWU9Yl9jb2RlKToKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X291dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgIi0tZnJvbS1zdGRpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBqb2luKCJhIiwgImIucHkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICItLWRpc2FibGU9YWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICItLWVuYWJsZT1pbXBvcnQtZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfc3RkaW5fc3ludGF4ZXJyb3Ioc2VsZik6CisgICAgICAgIGV4cGVjdGVkX291dHB1dCA9ICgKKyAgICAgICAgICAgICIqKioqKioqKioqKioqIE1vZHVsZSBhXG4iCisgICAgICAgICAgICAiYS5weToxOjQ6IEUwMDAxOiBpbnZhbGlkIHN5bnRheCAoPHVua25vd24+LCBsaW5lIDEpIChzeW50YXgtZXJyb3IpIgorICAgICAgICApCisKKyAgICAgICAgd2l0aCBtb2NrLnBhdGNoKAorICAgICAgICAgICAgInB5bGludC5saW50LnB5bGludGVyLl9yZWFkX3N0ZGluIiwgcmV0dXJuX3ZhbHVlPSJmb3JcbiIKKyAgICAgICAgKSBhcyBtb2NrX3N0ZGluOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXQoCisgICAgICAgICAgICAgICAgWyItLWZyb20tc3RkaW4iLCAiYS5weSIsICItLWRpc2FibGU9YWxsIiwgIi0tZW5hYmxlPXN5bnRheC1lcnJvciJdLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZF9vdXRwdXQsCisgICAgICAgICAgICApCisgICAgICAgICAgICBhc3NlcnQgbW9ja19zdGRpbi5jYWxsX2NvdW50ID09IDEKKworICAgIGRlZiB0ZXN0X3ZlcnNpb24oc2VsZik6CisgICAgICAgIGRlZiBjaGVjayhsaW5lcyk6CisgICAgICAgICAgICBhc3NlcnQgbGluZXNbMF0uc3RhcnRzd2l0aCgicHlsaW50ICIpCisgICAgICAgICAgICBhc3NlcnQgbGluZXNbMV0uc3RhcnRzd2l0aCgiYXN0cm9pZCAiKQorICAgICAgICAgICAgYXNzZXJ0IGxpbmVzWzJdLnN0YXJ0c3dpdGgoIlB5dGhvbiAiKQorCisgICAgICAgIG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcnVuX3B5bGludChbIi0tdmVyc2lvbiJdLCBvdXQ9b3V0KQorICAgICAgICBjaGVjayhvdXQuZ2V0dmFsdWUoKS5zcGxpdGxpbmVzKCkpCisKKyAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoW3N5cy5leGVjdXRhYmxlLCAiLW0iLCAicHlsaW50IiwgIi0tdmVyc2lvbiJdKQorICAgICAgICByZXN1bHQgPSByZXN1bHQuZGVjb2RlKCJ1dGYtOCIpCisgICAgICAgIGNoZWNrKHJlc3VsdC5zcGxpdGxpbmVzKCkpCisKKyAgICBkZWYgdGVzdF9mYWlsX3VuZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW50ZXN0KAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICItLWZhaWwtdW5kZXIiLAorICAgICAgICAgICAgICAgICItMTAiLAorICAgICAgICAgICAgICAgICItLWVuYWJsZT1hbGwiLAorICAgICAgICAgICAgICAgIGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiZmFpbF91bmRlcl9wbHVzN181LnB5IiksCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY29kZT0wLAorICAgICAgICApCisgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgIi0tZmFpbC11bmRlciIsCisgICAgICAgICAgICAgICAgIjYiLAorICAgICAgICAgICAgICAgICItLWVuYWJsZT1hbGwiLAorICAgICAgICAgICAgICAgIGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiZmFpbF91bmRlcl9wbHVzN181LnB5IiksCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY29kZT0wLAorICAgICAgICApCisgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgIi0tZmFpbC11bmRlciIsCisgICAgICAgICAgICAgICAgIjcuNSIsCisgICAgICAgICAgICAgICAgIi0tZW5hYmxlPWFsbCIsCisgICAgICAgICAgICAgICAgam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJmYWlsX3VuZGVyX3BsdXM3XzUucHkiKSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBjb2RlPTAsCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fcnVudGVzdCgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1mYWlsLXVuZGVyIiwKKyAgICAgICAgICAgICAgICAiNy42IiwKKyAgICAgICAgICAgICAgICAiLS1lbmFibGU9YWxsIiwKKyAgICAgICAgICAgICAgICBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgImZhaWxfdW5kZXJfcGx1czdfNS5weSIpLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGNvZGU9MTYsCisgICAgICAgICkKKworICAgICAgICBzZWxmLl9ydW50ZXN0KAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICItLWZhaWwtdW5kZXIiLAorICAgICAgICAgICAgICAgICItMTEiLAorICAgICAgICAgICAgICAgICItLWVuYWJsZT1hbGwiLAorICAgICAgICAgICAgICAgIGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiZmFpbF91bmRlcl9taW51czEwLnB5IiksCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY29kZT0wLAorICAgICAgICApCisgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgIi0tZmFpbC11bmRlciIsCisgICAgICAgICAgICAgICAgIi0xMCIsCisgICAgICAgICAgICAgICAgIi0tZW5hYmxlPWFsbCIsCisgICAgICAgICAgICAgICAgam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJmYWlsX3VuZGVyX21pbnVzMTAucHkiKSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBjb2RlPTAsCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fcnVudGVzdCgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1mYWlsLXVuZGVyIiwKKyAgICAgICAgICAgICAgICAiLTkiLAorICAgICAgICAgICAgICAgICItLWVuYWJsZT1hbGwiLAorICAgICAgICAgICAgICAgIGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAiZmFpbF91bmRlcl9taW51czEwLnB5IiksCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY29kZT0yMiwKKyAgICAgICAgKQorICAgICAgICBzZWxmLl9ydW50ZXN0KAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICItLWZhaWwtdW5kZXIiLAorICAgICAgICAgICAgICAgICItNSIsCisgICAgICAgICAgICAgICAgIi0tZW5hYmxlPWFsbCIsCisgICAgICAgICAgICAgICAgam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJmYWlsX3VuZGVyX21pbnVzMTAucHkiKSwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBjb2RlPTIyLAorICAgICAgICApCisKKyAgICBAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgICAgICJmdV9zY29yZSxmb19tc2dzLGZuYW1lLG91dCIsCisgICAgICAgIFsKKyAgICAgICAgICAgICMgRXNzZW50aWFsbHkgc2FtZSB0ZXN0IGNhc2VzIGFzIC0tZmFpbC11bmRlciwgYnV0IHJ1biB3aXRoL3dpdGhvdXQgYSBkZXRlY3RlZCBpc3N1ZSBjb2RlCisgICAgICAgICAgICAjIG1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nIChDMDExNikgaXMgaXNzdWUgaW4gYm90aCBmaWxlcworICAgICAgICAgICAgIyAtLWZhaWwtdW5kZXIgc2hvdWxkIGJlIGlycmVsZXZhbnQgYXMgbWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmcgaXMgaGl0CisgICAgICAgICAgICAoLTEwLCAibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCAiZmFpbF91bmRlcl9wbHVzN181LnB5IiwgMTYpLAorICAgICAgICAgICAgKDYsICJtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZyIsICJmYWlsX3VuZGVyX3BsdXM3XzUucHkiLCAxNiksCisgICAgICAgICAgICAoNy41LCAibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCAiZmFpbF91bmRlcl9wbHVzN181LnB5IiwgMTYpLAorICAgICAgICAgICAgKDcuNiwgIm1pc3NpbmctZnVuY3Rpb24tZG9jc3RyaW5nIiwgImZhaWxfdW5kZXJfcGx1czdfNS5weSIsIDE2KSwKKyAgICAgICAgICAgICgtMTEsICJtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZyIsICJmYWlsX3VuZGVyX21pbnVzMTAucHkiLCAyMiksCisgICAgICAgICAgICAoLTEwLCAibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCAiZmFpbF91bmRlcl9taW51czEwLnB5IiwgMjIpLAorICAgICAgICAgICAgKC05LCAibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCAiZmFpbF91bmRlcl9taW51czEwLnB5IiwgMjIpLAorICAgICAgICAgICAgKC01LCAibWlzc2luZy1mdW5jdGlvbi1kb2NzdHJpbmciLCAiZmFpbF91bmRlcl9taW51czEwLnB5IiwgMjIpLAorICAgICAgICAgICAgIyAtLWZhaWwtdW5kZXIgc2hvdWxkIGd1aWRlIHdoZXRoZXIgZXJyb3IgY29kZSBhcyBtaXNzaW5nLWZ1bmN0aW9uLWRvY3N0cmluZyBpcyBub3QgaGl0CisgICAgICAgICAgICAoLTEwLCAiYnJvYWQtZXhjZXB0IiwgImZhaWxfdW5kZXJfcGx1czdfNS5weSIsIDApLAorICAgICAgICAgICAgKDYsICJicm9hZC1leGNlcHQiLCAiZmFpbF91bmRlcl9wbHVzN181LnB5IiwgMCksCisgICAgICAgICAgICAoNy41LCAiYnJvYWQtZXhjZXB0IiwgImZhaWxfdW5kZXJfcGx1czdfNS5weSIsIDApLAorICAgICAgICAgICAgKDcuNiwgImJyb2FkLWV4Y2VwdCIsICJmYWlsX3VuZGVyX3BsdXM3XzUucHkiLCAxNiksCisgICAgICAgICAgICAoLTExLCAiYnJvYWQtZXhjZXB0IiwgImZhaWxfdW5kZXJfbWludXMxMC5weSIsIDApLAorICAgICAgICAgICAgKC0xMCwgImJyb2FkLWV4Y2VwdCIsICJmYWlsX3VuZGVyX21pbnVzMTAucHkiLCAwKSwKKyAgICAgICAgICAgICgtOSwgImJyb2FkLWV4Y2VwdCIsICJmYWlsX3VuZGVyX21pbnVzMTAucHkiLCAyMiksCisgICAgICAgICAgICAoLTUsICJicm9hZC1leGNlcHQiLCAiZmFpbF91bmRlcl9taW51czEwLnB5IiwgMjIpLAorICAgICAgICAgICAgIyBFbmFibGUgYnkgbWVzc2FnZSBpZAorICAgICAgICAgICAgKC0xMCwgIkMwMTE2IiwgImZhaWxfdW5kZXJfcGx1czdfNS5weSIsIDE2KSwKKyAgICAgICAgICAgICMgRW5hYmxlIGJ5IGNhdGVnb3J5CisgICAgICAgICAgICAoLTEwLCAiQyIsICJmYWlsX3VuZGVyX3BsdXM3XzUucHkiLCAxNiksCisgICAgICAgICAgICAoLTEwLCAiZmFrZTEsQyxmYWtlMiIsICJmYWlsX3VuZGVyX3BsdXM3XzUucHkiLCAxNiksCisgICAgICAgICAgICAjIEVuc3VyZSBlbnRpcmUgY2F0ZWdvcnkgbm90IGVuYWJsZWQgYnkgYW55IG1zZyBpZAorICAgICAgICAgICAgKC0xMCwgIkMwMTE1IiwgImZhaWxfdW5kZXJfcGx1czdfNS5weSIsIDApLAorICAgICAgICBdLAorICAgICkKKyAgICBkZWYgdGVzdF9mYWlsX29uKHNlbGYsIGZ1X3Njb3JlLCBmb19tc2dzLCBmbmFtZSwgb3V0KToKKyAgICAgICAgc2VsZi5fcnVudGVzdCgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAiLS1mYWlsLXVuZGVyIiwKKyAgICAgICAgICAgICAgICBmIntmdV9zY29yZTpmfSIsCisgICAgICAgICAgICAgICAgZiItLWZhaWwtb249e2ZvX21zZ3N9IiwKKyAgICAgICAgICAgICAgICAiLS1lbmFibGU9YWxsIiwKKyAgICAgICAgICAgICAgICBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgZm5hbWUpLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGNvZGU9b3V0LAorICAgICAgICApCisKKyAgICBAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoCisgICAgICAgICJvcHRzLG91dCIsCisgICAgICAgIFsKKyAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIHRvIGVuc3VyZSB0aGF0IGRpc2FibGVkIGl0ZW1zIGZyb20gY2F0ZWdvcnkgYXJlbid0IGVuYWJsZWQKKyAgICAgICAgICAgIChbIi0tZGlzYWJsZT1DMDExNiIsICItLWZhaWwtb249QyJdLCAwKSwKKyAgICAgICAgICAgICMgRW5zdXJlIG9yZGVyIGRvZXMgbm90IG1hdHRlcgorICAgICAgICAgICAgKFsiLS1mYWlsLW9uPUMiLCAiLS1kaXNhYmxlPUMwMTE2Il0sIDApLAorICAgICAgICAgICAgIyBFbnN1cmUgLS1mYWlsLW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAtLWRpc2FibGUKKyAgICAgICAgICAgIChbIi0tZGlzYWJsZT1DMDExNiIsICItLWZhaWwtb249QzAxMTYiXSwgMTYpLAorICAgICAgICAgICAgIyBFbnN1cmUgb3JkZXIgZG9lcyBub3QgbWF0dGVyCisgICAgICAgICAgICAoWyItLWZhaWwtb249QzAxMTYiLCAiLS1kaXNhYmxlPUMwMTE2Il0sIDE2KSwKKyAgICAgICAgXSwKKyAgICApCisgICAgZGVmIHRlc3RfZmFpbF9vbl9lZGdlX2Nhc2Uoc2VsZiwgb3B0cywgb3V0KToKKyAgICAgICAgc2VsZi5fcnVudGVzdCgKKyAgICAgICAgICAgIG9wdHMgKyBbam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJmYWlsX3VuZGVyX3BsdXM3XzUucHkiKV0sCisgICAgICAgICAgICBjb2RlPW91dCwKKyAgICAgICAgKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB0ZXN0X21vZGlmeV9zeXNfcGF0aCgpIC0+IE5vbmU6CisgICAgICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiB0ZXN0X3N5c19wYXRoKCkgLT4gR2VuZXJhdG9yW05vbmUsIE5vbmUsIE5vbmVdOgorICAgICAgICAgICAgb3JpZ2luYWxfcGF0aCA9IHN5cy5wYXRoCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnBhdGggPSBvcmlnaW5hbF9wYXRoCisKKyAgICAgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHRlc3RfZW52aXJvbl9weXRob25wYXRoKAorICAgICAgICAgICAgbmV3X3B5dGhvbnBhdGg6IE9wdGlvbmFsW3N0cl0sCisgICAgICAgICkgLT4gR2VuZXJhdG9yW05vbmUsIE5vbmUsIE5vbmVdOgorICAgICAgICAgICAgb3JpZ2luYWxfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQWVRIT05QQVRIIikKKyAgICAgICAgICAgIGlmIG5ld19weXRob25wYXRoOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlBZVEhPTlBBVEgiXSA9IG5ld19weXRob25wYXRoCisgICAgICAgICAgICBlbGlmIG5ld19weXRob25wYXRoIGlzIE5vbmUgYW5kIG9yaWdpbmFsX3B5dGhvbnBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBJZiBuZXdfcHl0aG9ucGF0aCBpcyBOb25lLCBtYWtlIHN1cmUgdG8gZGVsZXRlIFBZVEhPTlBBVEggaWYgcHJlc2VudAorICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWyJQWVRIT05QQVRIIl0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBvcmlnaW5hbF9weXRob25wYXRoOgorICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWyJQWVRIT05QQVRIIl0gPSBvcmlnaW5hbF9weXRob25wYXRoCisgICAgICAgICAgICAgICAgZWxpZiBuZXdfcHl0aG9ucGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBPbmx5IGRlbGV0ZSBQWVRIT05QQVRIIGlmIG5ld19weXRob25wYXRoIHdhc24ndCBOb25lCisgICAgICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWyJQWVRIT05QQVRIIl0KKworICAgICAgICB3aXRoIHRlc3Rfc3lzX3BhdGgoKSwgcGF0Y2goIm9zLmdldGN3ZCIpIGFzIG1vY2tfZ2V0Y3dkOgorICAgICAgICAgICAgY3dkID0gIi90bXAvcHl0ZXN0LW9mLXJvb3QvcHl0ZXN0LTAvdGVzdF9kb19ub3RfaW1wb3J0X2ZpbGVzX2Zyb21fMCIKKyAgICAgICAgICAgIG1vY2tfZ2V0Y3dkLnJldHVybl92YWx1ZSA9IGN3ZAorICAgICAgICAgICAgZGVmYXVsdF9wYXRocyA9IFsKKyAgICAgICAgICAgICAgICAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMzkuemlwIiwKKyAgICAgICAgICAgICAgICAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMy45IiwKKyAgICAgICAgICAgICAgICAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMy45L2xpYi1keW5sb2FkIiwKKyAgICAgICAgICAgICAgICAiL3Vzci9sb2NhbC9saWIvcHl0aG9uMy45L3NpdGUtcGFja2FnZXMiLAorICAgICAgICAgICAgXQorCisgICAgICAgICAgICBwYXRocyA9IFsKKyAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgKmRlZmF1bHRfcGF0aHMsCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzeXMucGF0aCA9IGNvcHkocGF0aHMpCisgICAgICAgICAgICB3aXRoIHRlc3RfZW52aXJvbl9weXRob25wYXRoKE5vbmUpOgorICAgICAgICAgICAgICAgIG1vZGlmeV9zeXNfcGF0aCgpCisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gcGF0aHNbMTpdCisKKyAgICAgICAgICAgIHBhdGhzID0gWworICAgICAgICAgICAgICAgIGN3ZCwKKyAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgKmRlZmF1bHRfcGF0aHMsCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzeXMucGF0aCA9IGNvcHkocGF0aHMpCisgICAgICAgICAgICB3aXRoIHRlc3RfZW52aXJvbl9weXRob25wYXRoKCIuIik6CisgICAgICAgICAgICAgICAgbW9kaWZ5X3N5c19wYXRoKCkKKyAgICAgICAgICAgIGFzc2VydCBzeXMucGF0aCA9PSBwYXRoc1sxOl0KKworICAgICAgICAgICAgcGF0aHMgPSBbCisgICAgICAgICAgICAgICAgY3dkLAorICAgICAgICAgICAgICAgICIvY3VzdG9tX3B5dGhvbnBhdGgiLAorICAgICAgICAgICAgICAgICpkZWZhdWx0X3BhdGhzLAorICAgICAgICAgICAgXQorICAgICAgICAgICAgc3lzLnBhdGggPSBjb3B5KHBhdGhzKQorICAgICAgICAgICAgd2l0aCB0ZXN0X2Vudmlyb25fcHl0aG9ucGF0aCgiL2N1c3RvbV9weXRob25wYXRoIik6CisgICAgICAgICAgICAgICAgbW9kaWZ5X3N5c19wYXRoKCkKKyAgICAgICAgICAgIGFzc2VydCBzeXMucGF0aCA9PSBwYXRoc1sxOl0KKworICAgICAgICAgICAgcGF0aHMgPSBbCisgICAgICAgICAgICAgICAgY3dkLAorICAgICAgICAgICAgICAgICIvY3VzdG9tX3B5dGhvbnBhdGgiLAorICAgICAgICAgICAgICAgIGN3ZCwKKyAgICAgICAgICAgICAgICAqZGVmYXVsdF9wYXRocywKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIHN5cy5wYXRoID0gY29weShwYXRocykKKyAgICAgICAgICAgIHdpdGggdGVzdF9lbnZpcm9uX3B5dGhvbnBhdGgoIi9jdXN0b21fcHl0aG9ucGF0aDoiKToKKyAgICAgICAgICAgICAgICBtb2RpZnlfc3lzX3BhdGgoKQorICAgICAgICAgICAgYXNzZXJ0IHN5cy5wYXRoID09IFtwYXRoc1sxXV0gKyBwYXRoc1szOl0KKworICAgICAgICAgICAgcGF0aHMgPSBbCisgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgY3dkLAorICAgICAgICAgICAgICAgICIvY3VzdG9tX3B5dGhvbnBhdGgiLAorICAgICAgICAgICAgICAgICpkZWZhdWx0X3BhdGhzLAorICAgICAgICAgICAgXQorICAgICAgICAgICAgc3lzLnBhdGggPSBjb3B5KHBhdGhzKQorICAgICAgICAgICAgd2l0aCB0ZXN0X2Vudmlyb25fcHl0aG9ucGF0aCgiOi9jdXN0b21fcHl0aG9ucGF0aCIpOgorICAgICAgICAgICAgICAgIG1vZGlmeV9zeXNfcGF0aCgpCisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gcGF0aHNbMjpdCisKKyAgICAgICAgICAgIHBhdGhzID0gWworICAgICAgICAgICAgICAgIGN3ZCwKKyAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgIi9jdXN0b21fcHl0aG9ucGF0aCIsCisgICAgICAgICAgICAgICAgKmRlZmF1bHRfcGF0aHMsCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzeXMucGF0aCA9IGNvcHkocGF0aHMpCisgICAgICAgICAgICB3aXRoIHRlc3RfZW52aXJvbl9weXRob25wYXRoKCI6L2N1c3RvbV9weXRob25wYXRoOiIpOgorICAgICAgICAgICAgICAgIG1vZGlmeV9zeXNfcGF0aCgpCisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gcGF0aHNbMjpdCisKKyAgICAgICAgICAgIHBhdGhzID0gWworICAgICAgICAgICAgICAgIGN3ZCwKKyAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgKmRlZmF1bHRfcGF0aHMsCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzeXMucGF0aCA9IGNvcHkocGF0aHMpCisgICAgICAgICAgICB3aXRoIHRlc3RfZW52aXJvbl9weXRob25wYXRoKCI6LiIpOgorICAgICAgICAgICAgICAgIG1vZGlmeV9zeXNfcGF0aCgpCisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gcGF0aHNbMTpdCisgICAgICAgICAgICBzeXMucGF0aCA9IGNvcHkocGF0aHMpCisgICAgICAgICAgICB3aXRoIHRlc3RfZW52aXJvbl9weXRob25wYXRoKGYiOntjd2R9Iik6CisgICAgICAgICAgICAgICAgbW9kaWZ5X3N5c19wYXRoKCkKKyAgICAgICAgICAgIGFzc2VydCBzeXMucGF0aCA9PSBwYXRoc1sxOl0KKworICAgICAgICAgICAgc3lzLnBhdGggPSBjb3B5KHBhdGhzKQorICAgICAgICAgICAgd2l0aCB0ZXN0X2Vudmlyb25fcHl0aG9ucGF0aCgiLjoiKToKKyAgICAgICAgICAgICAgICBtb2RpZnlfc3lzX3BhdGgoKQorICAgICAgICAgICAgYXNzZXJ0IHN5cy5wYXRoID09IHBhdGhzWzE6XQorICAgICAgICAgICAgc3lzLnBhdGggPSBjb3B5KHBhdGhzKQorICAgICAgICAgICAgd2l0aCB0ZXN0X2Vudmlyb25fcHl0aG9ucGF0aChmIntjd2R9OiIpOgorICAgICAgICAgICAgICAgIG1vZGlmeV9zeXNfcGF0aCgpCisgICAgICAgICAgICBhc3NlcnQgc3lzLnBhdGggPT0gcGF0aHNbMTpdCisKKyAgICAgICAgICAgIHBhdGhzID0gWworICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgIGN3ZCwKKyAgICAgICAgICAgICAgICAqZGVmYXVsdF9wYXRocywKKyAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzeXMucGF0aCA9IGNvcHkocGF0aHMpCisgICAgICAgICAgICB3aXRoIHRlc3RfZW52aXJvbl9weXRob25wYXRoKGN3ZCk6CisgICAgICAgICAgICAgICAgbW9kaWZ5X3N5c19wYXRoKCkKKyAgICAgICAgICAgIGFzc2VydCBzeXMucGF0aCA9PSBwYXRoc1sxOl0KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgdGVzdF9kb19ub3RfaW1wb3J0X2ZpbGVzX2Zyb21fbG9jYWxfZGlyZWN0b3J5KHRtcGRpcik6CisgICAgICAgIHBfYXN0cm9pZCA9IHRtcGRpciAvICJhc3Ryb2lkLnB5IgorICAgICAgICBwX2FzdHJvaWQud3JpdGUoIidEb2NzdHJpbmcnXG5pbXBvcnQgY29tcGxldGVseV91bmtub3duXG4iKQorICAgICAgICBwX2htYWMgPSB0bXBkaXIgLyAiaG1hYy5weSIKKyAgICAgICAgcF9obWFjLndyaXRlKCInRG9jc3RyaW5nJ1xuaW1wb3J0IGNvbXBsZXRlbHlfdW5rbm93blxuIikKKworICAgICAgICB3aXRoIHRtcGRpci5hc19jd2QoKToKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgICItbSIsCisgICAgICAgICAgICAgICAgICAgICJweWxpbnQiLAorICAgICAgICAgICAgICAgICAgICAiYXN0cm9pZC5weSIsCisgICAgICAgICAgICAgICAgICAgICItLWRpc2FibGU9aW1wb3J0LWVycm9yLHVudXNlZC1pbXBvcnQiLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgY3dkPXN0cih0bXBkaXIpLAorICAgICAgICAgICAgKQorCisgICAgICAgICMgTGludGluZyB0aGlzIGFzdHJvaWQgZmlsZSBkb2VzIG5vdCBpbXBvcnQgaXQKKyAgICAgICAgd2l0aCB0bXBkaXIuYXNfY3dkKCk6CisgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAiLW0iLAorICAgICAgICAgICAgICAgICAgICAicHlsaW50IiwKKyAgICAgICAgICAgICAgICAgICAgIi1qMiIsCisgICAgICAgICAgICAgICAgICAgICJhc3Ryb2lkLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgIi0tZGlzYWJsZT1pbXBvcnQtZXJyb3IsdW51c2VkLWltcG9ydCIsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBjd2Q9c3RyKHRtcGRpciksCisgICAgICAgICAgICApCisKKyAgICAgICAgIyBUZXN0IHdpdGggbXVsdGlwbGUgam9icyBmb3IgaG1hYy5weSBmb3Igd2hpY2ggd2UgaGF2ZSBhCisgICAgICAgICMgQ1ZFIGFnYWluc3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvaXNzdWVzLzk1OQorICAgICAgICB3aXRoIHRtcGRpci5hc19jd2QoKToKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2FsbCgKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAiLW0iLAorICAgICAgICAgICAgICAgICAgICAicHlsaW50IiwKKyAgICAgICAgICAgICAgICAgICAgIi1qMiIsCisgICAgICAgICAgICAgICAgICAgICJobWFjLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgIi0tZGlzYWJsZT1pbXBvcnQtZXJyb3IsdW51c2VkLWltcG9ydCIsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBjd2Q9c3RyKHRtcGRpciksCisgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHRlc3RfZG9fbm90X2ltcG9ydF9maWxlc19mcm9tX2xvY2FsX2RpcmVjdG9yeV93aXRoX3B5dGhvbnBhdGgodG1wZGlyKToKKyAgICAgICAgcF9hc3Ryb2lkID0gdG1wZGlyIC8gImFzdHJvaWQucHkiCisgICAgICAgIHBfYXN0cm9pZC53cml0ZSgiJ0RvY3N0cmluZydcbmltcG9ydCBjb21wbGV0ZWx5X3Vua25vd25cbiIpCisgICAgICAgIHBfaG1hYyA9IHRtcGRpciAvICJobWFjLnB5IgorICAgICAgICBwX2htYWMud3JpdGUoIidEb2NzdHJpbmcnXG5pbXBvcnQgY29tcGxldGVseV91bmtub3duXG4iKQorCisgICAgICAgICMgQXBwZW5kaW5nIGEgY29sb24gdG8gUFlUSE9OUEFUSCBzaG91bGQgbm90IGJyZWFrIHBhdGggc3RyaXBwaW5nCisgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9pc3N1ZXMvMzYzNgorICAgICAgICB3aXRoIHRtcGRpci5hc19jd2QoKToKKyAgICAgICAgICAgIG9yaWdfcHl0aG9ucGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQWVRIT05QQVRIIikKKyAgICAgICAgICAgIG9zLmVudmlyb25bIlBZVEhPTlBBVEgiXSA9IGYieyhvcmlnX3B5dGhvbnBhdGggb3IgJycpLnN0cmlwKCc6Jyl9OiIKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgICItbSIsCisgICAgICAgICAgICAgICAgICAgICJweWxpbnQiLAorICAgICAgICAgICAgICAgICAgICAiYXN0cm9pZC5weSIsCisgICAgICAgICAgICAgICAgICAgICItLWRpc2FibGU9aW1wb3J0LWVycm9yLHVudXNlZC1pbXBvcnQiLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgY3dkPXN0cih0bXBkaXIpLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgb3JpZ19weXRob25wYXRoOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlBZVEhPTlBBVEgiXSA9IG9yaWdfcHl0aG9ucGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvblsiUFlUSE9OUEFUSCJdCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHRlc3RfaW1wb3J0X3BsdWdpbl9mcm9tX2xvY2FsX2RpcmVjdG9yeV9pZl9weXRob25wYXRoX2N3ZCh0bXBkaXIpOgorICAgICAgICBwX3BsdWdpbiA9IHRtcGRpciAvICJwbHVnaW4ucHkiCisgICAgICAgIHBfcGx1Z2luLndyaXRlKCIjIFNvbWUgcGx1Z2luIGNvbnRlbnQiKQorCisgICAgICAgIHdpdGggdG1wZGlyLmFzX2N3ZCgpOgorICAgICAgICAgICAgb3JpZ19weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoIlBZVEhPTlBBVEgiKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsiUFlUSE9OUEFUSCJdID0gIi4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlBZVEhPTlBBVEgiXSA9IGYieyhvcmlnX3B5dGhvbnBhdGggb3IgJycpLnN0cmlwKCc6Jyl9Oi4iCisgICAgICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5ydW4oCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIi1tIiwKKyAgICAgICAgICAgICAgICAgICAgInB5bGludCIsCisgICAgICAgICAgICAgICAgICAgICItLWxvYWQtcGx1Z2lucyIsCisgICAgICAgICAgICAgICAgICAgICJwbHVnaW4iLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgY3dkPXN0cih0bXBkaXIpLAorICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgY2hlY2s9RmFsc2UsCisgICAgICAgICAgICApCisgICAgICAgICAgICBhc3NlcnQgKAorICAgICAgICAgICAgICAgICJBdHRyaWJ1dGVFcnJvcjogbW9kdWxlICdwbHVnaW4nIGhhcyBubyBhdHRyaWJ1dGUgJ3JlZ2lzdGVyJyIKKyAgICAgICAgICAgICAgICBpbiBwcm9jZXNzLnN0ZGVyci5kZWNvZGUoKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgb3JpZ19weXRob25wYXRoOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlBZVEhPTlBBVEgiXSA9IG9yaWdfcHl0aG9ucGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvblsiUFlUSE9OUEFUSCJdCisKKyAgICBkZWYgdGVzdF9hbGxvd19pbXBvcnRfb2ZfZmlsZXNfZm91bmRfaW5fbW9kdWxlc19kdXJpbmdfcGFyYWxsZWxfY2hlY2soc2VsZiwgdG1wZGlyKToKKyAgICAgICAgdGVzdF9kaXJlY3RvcnkgPSB0bXBkaXIgLyAidGVzdF9kaXJlY3RvcnkiCisgICAgICAgIHRlc3RfZGlyZWN0b3J5Lm1rZGlyKCkKKyAgICAgICAgc3BhbV9tb2R1bGUgPSB0ZXN0X2RpcmVjdG9yeSAvICJzcGFtLnB5IgorICAgICAgICBzcGFtX21vZHVsZS53cml0ZSgiJ0VtcHR5JyIpCisKKyAgICAgICAgaW5pdF9tb2R1bGUgPSB0ZXN0X2RpcmVjdG9yeSAvICJfX2luaXRfXy5weSIKKyAgICAgICAgaW5pdF9tb2R1bGUud3JpdGUoIidFbXB0eSciKQorCisgICAgICAgICMgRm9yIG11bHRpcGxlIGpvYnMgd2UgY291bGQgbm90IGZpbmQgdGhlIGBzcGFtLnB5YCBmaWxlLgorICAgICAgICB3aXRoIHRtcGRpci5hc19jd2QoKToKKyAgICAgICAgICAgIHNlbGYuX3J1bnRlc3QoCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAiLWoyIiwKKyAgICAgICAgICAgICAgICAgICAgIi0tZGlzYWJsZT1taXNzaW5nLWRvY3N0cmluZywgbWlzc2luZy1maW5hbC1uZXdsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RfZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGNvZGU9MCwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIEEgc2luZ2xlIGpvYiBzaG91bGQgYmUgZmluZSBhcyB3ZWxsCisgICAgICAgIHdpdGggdG1wZGlyLmFzX2N3ZCgpOgorICAgICAgICAgICAgc2VsZi5fcnVudGVzdCgKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICItajEiLAorICAgICAgICAgICAgICAgICAgICAiLS1kaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBtaXNzaW5nLWZpbmFsLW5ld2xpbmUiLAorICAgICAgICAgICAgICAgICAgICAidGVzdF9kaXJlY3RvcnkiLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgY29kZT0wLAorICAgICAgICAgICAgKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiB0ZXN0X2Nhbl9saXN0X2RpcmVjdG9yaWVzX3dpdGhvdXRfZHVuZGVyX2luaXQodG1wZGlyKToKKyAgICAgICAgdGVzdF9kaXJlY3RvcnkgPSB0bXBkaXIgLyAidGVzdF9kaXJlY3RvcnkiCisgICAgICAgIHRlc3RfZGlyZWN0b3J5Lm1rZGlyKCkKKyAgICAgICAgc3BhbV9tb2R1bGUgPSB0ZXN0X2RpcmVjdG9yeSAvICJzcGFtLnB5IgorICAgICAgICBzcGFtX21vZHVsZS53cml0ZSgiJ0VtcHR5JyIpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgIi1tIiwKKyAgICAgICAgICAgICAgICAicHlsaW50IiwKKyAgICAgICAgICAgICAgICAiLS1kaXNhYmxlPW1pc3NpbmctZG9jc3RyaW5nLCBtaXNzaW5nLWZpbmFsLW5ld2xpbmUiLAorICAgICAgICAgICAgICAgICJ0ZXN0X2RpcmVjdG9yeSIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgY3dkPXN0cih0bXBkaXIpLAorICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfam9ic19zY29yZShzZWxmKToKKyAgICAgICAgcGF0aCA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAidW51c2VkX3ZhcmlhYmxlLnB5IikKKyAgICAgICAgZXhwZWN0ZWQgPSAiWW91ciBjb2RlIGhhcyBiZWVuIHJhdGVkIGF0IDcuNTAvMTAiCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KFtwYXRoLCAiLS1qb2JzPTIiLCAiLXJ5Il0sIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2R1cGxpY2F0ZV9jb2RlX3Jhd19zdHJpbmdzKHNlbGYpOgorICAgICAgICBwYXRoID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJkdXBsaWNhdGVfZGF0YV9yYXdfc3RyaW5ncyIpCisgICAgICAgIGV4cGVjdGVkX291dHB1dCA9ICJTaW1pbGFyIGxpbmVzIGluIDIgZmlsZXMiCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KAorICAgICAgICAgICAgW3BhdGgsICItLWRpc2FibGU9YWxsIiwgIi0tZW5hYmxlPWR1cGxpY2F0ZS1jb2RlIl0sCisgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWRfb3V0cHV0LAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9yZWdyZXNzaW9uX3BhcmFsbGVsX21vZGVfd2l0aG91dF9maWxlcGF0aChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgcGFyYWxsZWwgbW9kZSBwcm9wZXJseSBwYXNzZXMgZmlsZXBhdGgKKyAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2lzc3Vlcy8zNTY0CisgICAgICAgIHBhdGggPSBqb2luKAorICAgICAgICAgICAgSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAicmVncmVzc2lvbl9taXNzaW5nX2luaXRfMzU2NCIsICJzdWJkaXJlY3RvcnkvIgorICAgICAgICApCisgICAgICAgIHNlbGYuX3Rlc3Rfb3V0cHV0KFtwYXRoLCAiLWoyIl0sIGV4cGVjdGVkX291dHB1dD0iTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpCisKKyAgICBkZWYgdGVzdF9vdXRwdXRfZmlsZV92YWxpZF9wYXRoKHNlbGYsIHRtcGRpcik6CisgICAgICAgIHBhdGggPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgInVudXNlZF92YXJpYWJsZS5weSIpCisgICAgICAgIG91dHB1dF9maWxlID0gdG1wZGlyIC8gIm91dHB1dC50eHQiCisgICAgICAgIGV4cGVjdGVkID0gIllvdXIgY29kZSBoYXMgYmVlbiByYXRlZCBhdCA3LjUwLzEwIgorICAgICAgICBzZWxmLl90ZXN0X291dHB1dF9maWxlKAorICAgICAgICAgICAgW3BhdGgsIGYiLS1vdXRwdXQ9e291dHB1dF9maWxlfSJdLAorICAgICAgICAgICAgb3V0cHV0X2ZpbGUsCisgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQ9ZXhwZWN0ZWQsCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X291dHB1dF9maWxlX2ludmFsaWRfcGF0aF9leGl0c193aXRoX2NvZGVfMzIoc2VsZik6CisgICAgICAgIHBhdGggPSBqb2luKEhFUkUsICJyZWdydGVzdF9kYXRhIiwgInVudXNlZF92YXJpYWJsZS5weSIpCisgICAgICAgIG91dHB1dF9maWxlID0gInRoaXNkaXJlY3Rvcnlkb2Vzbm90ZXhpdC9vdXRwdXQudHh0IgorICAgICAgICBzZWxmLl9ydW50ZXN0KFtwYXRoLCBmIi0tb3V0cHV0PXtvdXRwdXRfZmlsZX0iXSwgY29kZT0zMikKKworICAgIEBweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAgICAgIm91dHB1dF9mb3JtYXQsIGV4cGVjdGVkX291dHB1dCIsCisgICAgICAgIFsKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAidGV4dCIsCisgICAgICAgICAgICAgICAgInRlc3RzL3JlZ3J0ZXN0X2RhdGEvdW51c2VkX3ZhcmlhYmxlLnB5OjQ6NDogVzA2MTI6IFVudXNlZCB2YXJpYWJsZSAndmFyaWFibGUnICh1bnVzZWQtdmFyaWFibGUpIiwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgInBhcnNlYWJsZSIsCisgICAgICAgICAgICAgICAgInRlc3RzL3JlZ3J0ZXN0X2RhdGEvdW51c2VkX3ZhcmlhYmxlLnB5OjQ6IFtXMDYxMih1bnVzZWQtdmFyaWFibGUpLCB0ZXN0XSBVbnVzZWQgdmFyaWFibGUgJ3ZhcmlhYmxlJyIsCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJtc3ZzIiwKKyAgICAgICAgICAgICAgICAidGVzdHMvcmVncnRlc3RfZGF0YS91bnVzZWRfdmFyaWFibGUucHkoNCk6IFtXMDYxMih1bnVzZWQtdmFyaWFibGUpdGVzdF0gVW51c2VkIHZhcmlhYmxlICd2YXJpYWJsZSciLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29sb3JpemVkIiwKKyAgICAgICAgICAgICAgICAidGVzdHMvcmVncnRlc3RfZGF0YS91bnVzZWRfdmFyaWFibGUucHk6NDo0OiBXMDYxMjogG1szNW1VbnVzZWQgdmFyaWFibGUgJ3ZhcmlhYmxlJxtbMG0gKBtbMzVtdW51c2VkLXZhcmlhYmxlG1swbSkiLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgianNvbiIsICcibWVzc2FnZSI6ICJVbnVzZWQgdmFyaWFibGUgXCd2YXJpYWJsZVwnIiwnKSwKKyAgICAgICAgXSwKKyAgICApCisgICAgZGVmIHRlc3Rfb3V0cHV0X2ZpbGVfY2FuX2JlX2NvbWJpbmVkX3dpdGhfb3V0cHV0X2Zvcm1hdF9vcHRpb24oCisgICAgICAgIHNlbGYsIHRtcGRpciwgb3V0cHV0X2Zvcm1hdCwgZXhwZWN0ZWRfb3V0cHV0CisgICAgKToKKyAgICAgICAgcGF0aCA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAidW51c2VkX3ZhcmlhYmxlLnB5IikKKyAgICAgICAgb3V0cHV0X2ZpbGUgPSB0bXBkaXIgLyAib3V0cHV0LnR4dCIKKyAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXRfZmlsZSgKKyAgICAgICAgICAgIFtwYXRoLCBmIi0tb3V0cHV0PXtvdXRwdXRfZmlsZX0iLCBmIi0tb3V0cHV0LWZvcm1hdD17b3V0cHV0X2Zvcm1hdH0iXSwKKyAgICAgICAgICAgIG91dHB1dF9maWxlLAorICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0LAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9vdXRwdXRfZmlsZV9jYW5fYmVfY29tYmluZWRfd2l0aF9jdXN0b21fcmVwb3J0ZXIoc2VsZiwgdG1wZGlyKToKKyAgICAgICAgcGF0aCA9IGpvaW4oSEVSRSwgInJlZ3J0ZXN0X2RhdGEiLCAidW51c2VkX3ZhcmlhYmxlLnB5IikKKyAgICAgICAgb3V0cHV0X2ZpbGUgPSB0bXBkaXIgLyAib3V0cHV0LnR4dCIKKyAgICAgICAgIyBJdCBkb2VzIG5vdCByZWFsbHkgaGF2ZSB0byBiZSBhIHRydWx5IGN1c3RvbSByZXBvcnRlci4KKyAgICAgICAgIyBJdCBpcyBvbmx5IGltcG9ydGFudCB0aGF0IGl0IGlzIGJlaW5nIHBhc3NlZCBleHBsaWNpdGx5IHRvIGBgUnVuYGAuCisgICAgICAgIG15cmVwb3J0ZXIgPSBUZXh0UmVwb3J0ZXIoKQorICAgICAgICBzZWxmLl9ydW5fcHlsaW50KAorICAgICAgICAgICAgW3BhdGgsIGYiLS1vdXRwdXQ9e291dHB1dF9maWxlfSJdLAorICAgICAgICAgICAgb3V0PXN5cy5zdGRvdXQsCisgICAgICAgICAgICByZXBvcnRlcj1teXJlcG9ydGVyLAorICAgICAgICApCisgICAgICAgIGFzc2VydCBvdXRwdXRfZmlsZS5leGlzdHMoKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0X2ZpbGVfc3BlY2lmaWVkX2luX3JjZmlsZShzZWxmLCB0bXBkaXIpOgorICAgICAgICBvdXRwdXRfZmlsZSA9IHRtcGRpciAvICJvdXRwdXQudHh0IgorICAgICAgICByY2ZpbGUgPSB0bXBkaXIgLyAicHlsaW50cmMiCisgICAgICAgIHJjZmlsZV9jb250ZW50cyA9IHRleHR3cmFwLmRlZGVudCgKKyAgICAgICAgICAgIGYiIiIKKyAgICAgICAgW01BU1RFUl0KKyAgICAgICAgb3V0cHV0PXtvdXRwdXRfZmlsZX0KKyAgICAgICAgIiIiCisgICAgICAgICkKKyAgICAgICAgcmNmaWxlLndyaXRlX3RleHQocmNmaWxlX2NvbnRlbnRzLCBlbmNvZGluZz0idXRmLTgiKQorICAgICAgICBwYXRoID0gam9pbihIRVJFLCAicmVncnRlc3RfZGF0YSIsICJ1bnVzZWRfdmFyaWFibGUucHkiKQorICAgICAgICBleHBlY3RlZCA9ICJZb3VyIGNvZGUgaGFzIGJlZW4gcmF0ZWQgYXQgNy41MC8xMCIKKyAgICAgICAgc2VsZi5fdGVzdF9vdXRwdXRfZmlsZSgKKyAgICAgICAgICAgIFtwYXRoLCBmIi0tb3V0cHV0PXtvdXRwdXRfZmlsZX0iLCBmIi0tcmNmaWxlPXtyY2ZpbGV9Il0sCisgICAgICAgICAgICBvdXRwdXRfZmlsZSwKKyAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dD1leHBlY3RlZCwKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdHV0aWxzL3Rlc3Rfb3V0cHV0X2xpbmUucHkgYi90ZXN0cy90ZXN0dXRpbHMvdGVzdF9vdXRwdXRfbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIzNDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdHV0aWxzL3Rlc3Rfb3V0cHV0X2xpbmUucHkKQEAgLTAsMCArMSwxMDMgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLW91dGVyLW5hbWUKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5jb25zdGFudHMgaW1wb3J0IFBZMzhfUExVUworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSElHSCwgSU5GRVJFTkNFCitmcm9tIHB5bGludC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIHB5bGludC50ZXN0dXRpbHMub3V0cHV0X2xpbmUgaW1wb3J0IE1hbGZvcm1lZE91dHB1dExpbmVFeGNlcHRpb24sIE91dHB1dExpbmUKKworCitAcHl0ZXN0LmZpeHR1cmUoKQorZGVmIG1lc3NhZ2UoKToKKyAgICBkZWYgaW5uZXIoY29uZmlkZW5jZT1ISUdIKToKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2UoCisgICAgICAgICAgICBzeW1ib2w9Im1pc3NpbmctZG9jc3RyaW5nIiwKKyAgICAgICAgICAgIG1zZ19pZD0iQzAxMjMiLAorICAgICAgICAgICAgbG9jYXRpb249WworICAgICAgICAgICAgICAgICJhYnNwYXRoIiwKKyAgICAgICAgICAgICAgICAicGF0aCIsCisgICAgICAgICAgICAgICAgIm1vZHVsZSIsCisgICAgICAgICAgICAgICAgIm9iaiIsCisgICAgICAgICAgICAgICAgImxpbmUiLAorICAgICAgICAgICAgICAgICJjb2x1bW4iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIG1zZz0ibXNnIiwKKyAgICAgICAgICAgIGNvbmZpZGVuY2U9Y29uZmlkZW5jZSwKKyAgICAgICAgKQorCisgICAgcmV0dXJuIGlubmVyCisKKworZGVmIHRlc3Rfb3V0cHV0X2xpbmUoKToKKyAgICBvdXRwdXRfbGluZSA9IE91dHB1dExpbmUoCisgICAgICAgIHN5bWJvbD0ibWlzc2luZy1kb2NzdHJpbmciLAorICAgICAgICBsaW5lbm89MCwKKyAgICAgICAgY29sdW1uPTAsCisgICAgICAgIG9iamVjdD0iIiwKKyAgICAgICAgbXNnPSJNaXNzaW5nIGRvY3N0cmluZydzIGJhZC4iLAorICAgICAgICBjb25maWRlbmNlPUhJR0gsCisgICAgKQorICAgIGFzc2VydCBvdXRwdXRfbGluZS5zeW1ib2wgPT0gIm1pc3NpbmctZG9jc3RyaW5nIgorCisKK2RlZiB0ZXN0X291dHB1dF9saW5lX2Zyb21fbWVzc2FnZShtZXNzYWdlKToKKyAgICBvdXRwdXRfbGluZSA9IE91dHB1dExpbmUuZnJvbV9tc2cobWVzc2FnZSgpKQorICAgIGFzc2VydCBvdXRwdXRfbGluZS5zeW1ib2wgPT0gIm1pc3NpbmctZG9jc3RyaW5nIgorICAgIGFzc2VydCBvdXRwdXRfbGluZS5tc2cgPT0gIm1zZyIKKworCitAcHl0ZXN0Lm1hcmsucGFyYW1ldHJpemUoImNvbmZpZGVuY2UiLCBbSElHSCwgSU5GRVJFTkNFXSkKK2RlZiB0ZXN0X291dHB1dF9saW5lX3RvX2Nzdihjb25maWRlbmNlLCBtZXNzYWdlKToKKyAgICBvdXRwdXRfbGluZSA9IE91dHB1dExpbmUuZnJvbV9tc2cobWVzc2FnZShjb25maWRlbmNlKSkKKyAgICBjc3YgPSBvdXRwdXRfbGluZS50b19jc3YoKQorICAgIGV4cGVjdGVkX2NvbHVtbiA9ICJjb2x1bW4iIGlmIFBZMzhfUExVUyBlbHNlICIiCisgICAgYXNzZXJ0IGNzdiA9PSAoCisgICAgICAgICJtaXNzaW5nLWRvY3N0cmluZyIsCisgICAgICAgICJsaW5lIiwKKyAgICAgICAgZXhwZWN0ZWRfY29sdW1uLAorICAgICAgICAib2JqIiwKKyAgICAgICAgIm1zZyIsCisgICAgICAgIGNvbmZpZGVuY2UubmFtZSwKKyAgICApCisKKworZGVmIHRlc3Rfb3V0cHV0X2xpbmVfZnJvbV9jc3ZfZXJyb3IoKToKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoCisgICAgICAgIE1hbGZvcm1lZE91dHB1dExpbmVFeGNlcHRpb24sCisgICAgICAgIG1hdGNoPSJtc2ctc3ltYm9saWMtbmFtZTo0MjoyNzpNeUNsYXNzLm15X2Z1bmN0aW9uOlRoZSBtZXNzYWdlIiwKKyAgICApOgorICAgICAgICBPdXRwdXRMaW5lLmZyb21fY3N2KCInbWlzc2luZy1kb2NzdHJpbmcnLCAnbGluZScsICdjb2x1bW4nLCAnb2JqJywgJ21zZyciKQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcygKKyAgICAgICAgTWFsZm9ybWVkT3V0cHV0TGluZUV4Y2VwdGlvbiwgbWF0Y2g9InN5bWJvbD0nbWlzc2luZy1kb2NzdHJpbmcnID8iCisgICAgKToKKyAgICAgICAgY3N2ID0gKCJtaXNzaW5nLWRvY3N0cmluZyIsICJsaW5lIiwgImNvbHVtbiIsICJvYmoiLCAibXNnIikKKyAgICAgICAgT3V0cHV0TGluZS5mcm9tX2Nzdihjc3YpCisKKworQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKAorICAgICJjb25maWRlbmNlLGV4cGVjdGVkX2NvbmZpZGVuY2UiLCBbW05vbmUsICJISUdIIl0sIFsiSU5GRVJFTkNFIiwgIklORkVSRU5DRSJdXQorKQorZGVmIHRlc3Rfb3V0cHV0X2xpbmVfZnJvbV9jc3YoY29uZmlkZW5jZSwgZXhwZWN0ZWRfY29uZmlkZW5jZSk6CisgICAgcHJvcGVyX2NzdiA9ICgKKyAgICAgICAgIm1pc3NpbmctZG9jc3RyaW5nIiwKKyAgICAgICAgIjEiLAorICAgICAgICAiMiIsCisgICAgICAgICJvYmoiLAorICAgICAgICAibXNnIiwKKyAgICApCisgICAgaWYgY29uZmlkZW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgcHJvcGVyX2NzdiArPSAoY29uZmlkZW5jZSwpCisgICAgb3V0cHV0X2xpbmUgPSBPdXRwdXRMaW5lLmZyb21fY3N2KHByb3Blcl9jc3YpCisgICAgZXhwZWN0ZWRfY29sdW1uID0gIjIiIGlmIFBZMzhfUExVUyBlbHNlICIiCisgICAgYXNzZXJ0IG91dHB1dF9saW5lID09IE91dHB1dExpbmUoCisgICAgICAgIHN5bWJvbD0ibWlzc2luZy1kb2NzdHJpbmciLAorICAgICAgICBsaW5lbm89MSwKKyAgICAgICAgY29sdW1uPWV4cGVjdGVkX2NvbHVtbiwKKyAgICAgICAgb2JqZWN0PSJvYmoiLAorICAgICAgICBtc2c9Im1zZyIsCisgICAgICAgIGNvbmZpZGVuY2U9ZXhwZWN0ZWRfY29uZmlkZW5jZSwKKyAgICApCmRpZmYgLS1naXQgYS90ZXN0cy91bml0dGVzdF9jb25maWcucHkgYi90ZXN0cy91bml0dGVzdF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZDgxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3VuaXR0ZXN0X2NvbmZpZy5weQpAQCAtMCwwICsxLDY1IEBACisjIENvcHlyaWdodCAoYykgMjAxNSBBcnUgU2FobmkgPGFydXNhaG5pQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisKKyIiIlVuaXQgdGVzdHMgZm9yIHRoZSBjb25maWcgbW9kdWxlLiIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBzcmVfY29uc3RhbnRzCisKK2ltcG9ydCBweXRlc3QKKworZnJvbSBweWxpbnQgaW1wb3J0IGNvbmZpZworCitSRV9QQVRURVJOX1RZUEUgPSBnZXRhdHRyKHJlLCAiUGF0dGVybiIsIGdldGF0dHIocmUsICJfcGF0dGVybl90eXBlIiwgTm9uZSkpCisKKworZGVmIHRlc3RfX3JlZ2V4cF92YWxpZGF0b3JfdmFsaWQoKToKKyAgICByZXN1bHQgPSBjb25maWcub3B0aW9uLl9yZWdleHBfdmFsaWRhdG9yKE5vbmUsIE5vbmUsICJ0ZXN0Xy4qIikKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShyZXN1bHQsIFJFX1BBVFRFUk5fVFlQRSkKKyAgICBhc3NlcnQgcmVzdWx0LnBhdHRlcm4gPT0gInRlc3RfLioiCisKKworZGVmIHRlc3RfX3JlZ2V4cF92YWxpZGF0b3JfaW52YWxpZCgpOgorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhzcmVfY29uc3RhbnRzLmVycm9yKToKKyAgICAgICAgY29uZmlnLm9wdGlvbi5fcmVnZXhwX3ZhbGlkYXRvcihOb25lLCBOb25lLCAidGVzdF8pIikKKworCitkZWYgdGVzdF9fY3N2X3ZhbGlkYXRvcl9ub19zcGFjZXMoKToKKyAgICB2YWx1ZXMgPSBbIk9uZSIsICJUd28iLCAiVGhyZWUiXQorICAgIHJlc3VsdCA9IGNvbmZpZy5vcHRpb24uX2Nzdl92YWxpZGF0b3IoTm9uZSwgTm9uZSwgIiwiLmpvaW4odmFsdWVzKSkKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShyZXN1bHQsIGxpc3QpCisgICAgYXNzZXJ0IGxlbihyZXN1bHQpID09IDMKKyAgICBmb3IgaSwgdmFsdWUgaW4gZW51bWVyYXRlKHZhbHVlcyk6CisgICAgICAgIGFzc2VydCByZXN1bHRbaV0gPT0gdmFsdWUKKworCitkZWYgdGVzdF9fY3N2X3ZhbGlkYXRvcl9zcGFjZXMoKToKKyAgICB2YWx1ZXMgPSBbIk9uZSIsICJUd28iLCAiVGhyZWUiXQorICAgIHJlc3VsdCA9IGNvbmZpZy5vcHRpb24uX2Nzdl92YWxpZGF0b3IoTm9uZSwgTm9uZSwgIiwgIi5qb2luKHZhbHVlcykpCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UocmVzdWx0LCBsaXN0KQorICAgIGFzc2VydCBsZW4ocmVzdWx0KSA9PSAzCisgICAgZm9yIGksIHZhbHVlIGluIGVudW1lcmF0ZSh2YWx1ZXMpOgorICAgICAgICBhc3NlcnQgcmVzdWx0W2ldID09IHZhbHVlCisKKworZGVmIHRlc3RfX3JlZ2V4cF9jc3ZfdmFsaWRhdG9yX3ZhbGlkKCk6CisgICAgcGF0dGVybl9zdHJpbmdzID0gWyJ0ZXN0Xy4qIiwgImZvb1xcLmJhciIsICJeYmF6JCJdCisgICAgcmVzdWx0ID0gY29uZmlnLm9wdGlvbi5fcmVnZXhwX2Nzdl92YWxpZGF0b3IoTm9uZSwgTm9uZSwgIiwiLmpvaW4ocGF0dGVybl9zdHJpbmdzKSkKKyAgICBmb3IgaSwgcmVnZXggaW4gZW51bWVyYXRlKHJlc3VsdCk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHJlZ2V4LCBSRV9QQVRURVJOX1RZUEUpCisgICAgICAgIGFzc2VydCByZWdleC5wYXR0ZXJuID09IHBhdHRlcm5fc3RyaW5nc1tpXQorCisKK2RlZiB0ZXN0X19yZWdleHBfY3N2X3ZhbGlkYXRvcl9pbnZhbGlkKCk6CisgICAgcGF0dGVybl9zdHJpbmdzID0gWyJ0ZXN0Xy4qIiwgImZvb1xcLmJhciIsICJeYmF6KSQiXQorICAgIHdpdGggcHl0ZXN0LnJhaXNlcyhzcmVfY29uc3RhbnRzLmVycm9yKToKKyAgICAgICAgY29uZmlnLm9wdGlvbi5fcmVnZXhwX2Nzdl92YWxpZGF0b3IoTm9uZSwgTm9uZSwgIiwiLmpvaW4ocGF0dGVybl9zdHJpbmdzKSkKZGlmZiAtLWdpdCBhL3Rlc3RzL3VuaXR0ZXN0X3B5cmV2ZXJzZV9kaWFkZWZzLnB5IGIvdGVzdHMvdW5pdHRlc3RfcHlyZXZlcnNlX2RpYWRlZnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViMWY3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3VuaXR0ZXN0X3B5cmV2ZXJzZV9kaWFkZWZzLnB5CkBAIC0wLDAgKzEsMTk5IEBACisjIENvcHlyaWdodCAoYykgMjAwOC0yMDEwLCAyMDEzIExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisjIENvcHlyaWdodCAoYykgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIE1hcmMgTXVlbGxlciA8MzAxMzAzNzErY2RjZThwQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIxIGJvdCA8Ym90QG5vcmVwbHkuZ2l0aHViLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiJVbml0IHRlc3QgZm9yIHRoZSBleHRlbnNpb25zLmRpYWRlZnNsaWIgbW9kdWxlcyIiIgorIyBweWxpbnQ6IGRpc2FibGU9cmVkZWZpbmVkLW91dGVyLW5hbWUKK2ltcG9ydCBzeXMKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitpbXBvcnQgYXN0cm9pZAoraW1wb3J0IHB5dGVzdAorZnJvbSB1bml0dGVzdF9weXJldmVyc2Vfd3JpdGVyIGltcG9ydCBDb25maWcsIGdldF9wcm9qZWN0CisKK2Zyb20gcHlsaW50LnB5cmV2ZXJzZS5kaWFkZWZzbGliIGltcG9ydCAoCisgICAgQ2xhc3NEaWFkZWZHZW5lcmF0b3IsCisgICAgRGVmYXVsdERpYWRlZkdlbmVyYXRvciwKKyAgICBEaWFEZWZHZW5lcmF0b3IsCisgICAgRGlhZGVmc0hhbmRsZXIsCispCitmcm9tIHB5bGludC5weXJldmVyc2UuaW5zcGVjdG9yIGltcG9ydCBMaW5rZXIKKworCitkZWYgX3Byb2Nlc3NfY2xhc3NlcyhjbGFzc2VzKToKKyAgICAiIiJleHRyYWN0IGNsYXNzIG5hbWVzIG9mIGEgbGlzdCIiIgorICAgIHJldHVybiBzb3J0ZWQoKGlzaW5zdGFuY2UoYy5ub2RlLCBhc3Ryb2lkLkNsYXNzRGVmKSwgYy50aXRsZSkgZm9yIGMgaW4gY2xhc3NlcykKKworCitkZWYgX3Byb2Nlc3NfcmVsYXRpb25zKHJlbGF0aW9ucyk6CisgICAgIiIiZXh0cmFjdCByZWxhdGlvbiBpbmRpY2VzIGZyb20gYSByZWxhdGlvbiBsaXN0IiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgcmVsX3R5cGUsIHJlbHMgaW4gcmVsYXRpb25zLml0ZW1zKCk6CisgICAgICAgIGZvciByZWwgaW4gcmVsczoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHJlbF90eXBlLCByZWwuZnJvbV9vYmplY3QudGl0bGUsIHJlbC50b19vYmplY3QudGl0bGUpKQorICAgIHJlc3VsdC5zb3J0KCkKKyAgICByZXR1cm4gcmVzdWx0CisKKworQHB5dGVzdC5maXh0dXJlCitkZWYgSEFORExFUigpOgorICAgIHJldHVybiBEaWFkZWZzSGFuZGxlcihDb25maWcoKSkKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgUFJPSkVDVCgpOgorICAgIHJldHVybiBnZXRfcHJvamVjdCgiZGF0YSIpCisKKworZGVmIHRlc3Rfb3B0aW9uX3ZhbHVlcyhIQU5ETEVSLCBQUk9KRUNUKToKKyAgICAiIiJ0ZXN0IGZvciBhbmNlc3RvciwgYXNzb2NpYXRlZCBhbmQgbW9kdWxlIG9wdGlvbnMiIiIKKyAgICBkZl9oID0gRGlhRGVmR2VuZXJhdG9yKExpbmtlcihQUk9KRUNUKSwgSEFORExFUikKKyAgICBjbF9jb25maWcgPSBDb25maWcoKQorICAgIGNsX2NvbmZpZy5jbGFzc2VzID0gWyJTcGVjaWFsaXphdGlvbiJdCisgICAgY2xfaCA9IERpYURlZkdlbmVyYXRvcihMaW5rZXIoUFJPSkVDVCksIERpYWRlZnNIYW5kbGVyKGNsX2NvbmZpZykpCisgICAgYXNzZXJ0IGRmX2guX2dldF9sZXZlbHMoKSA9PSAoMCwgMCkKKyAgICBhc3NlcnQgbm90IGRmX2gubW9kdWxlX25hbWVzCisgICAgYXNzZXJ0IGNsX2guX2dldF9sZXZlbHMoKSA9PSAoLTEsIC0xKQorICAgIGFzc2VydCBjbF9oLm1vZHVsZV9uYW1lcworICAgIGZvciBobmRsIGluIChkZl9oLCBjbF9oKToKKyAgICAgICAgaG5kbC5jb25maWcuYWxsX2FuY2VzdG9ycyA9IFRydWUKKyAgICAgICAgaG5kbC5jb25maWcuYWxsX2Fzc29jaWF0ZWQgPSBUcnVlCisgICAgICAgIGhuZGwuY29uZmlnLm1vZHVsZV9uYW1lcyA9IFRydWUKKyAgICAgICAgaG5kbC5fc2V0X2RlZmF1bHRfb3B0aW9ucygpCisgICAgICAgIGFzc2VydCBobmRsLl9nZXRfbGV2ZWxzKCkgPT0gKC0xLCAtMSkKKyAgICAgICAgYXNzZXJ0IGhuZGwubW9kdWxlX25hbWVzCisgICAgaGFuZGxlciA9IERpYWRlZnNIYW5kbGVyKENvbmZpZygpKQorICAgIGRmX2ggPSBEaWFEZWZHZW5lcmF0b3IoTGlua2VyKFBST0pFQ1QpLCBoYW5kbGVyKQorICAgIGNsX2NvbmZpZyA9IENvbmZpZygpCisgICAgY2xfY29uZmlnLmNsYXNzZXMgPSBbIlNwZWNpYWxpemF0aW9uIl0KKyAgICBjbF9oID0gRGlhRGVmR2VuZXJhdG9yKExpbmtlcihQUk9KRUNUKSwgRGlhZGVmc0hhbmRsZXIoY2xfY29uZmlnKSkKKyAgICBmb3IgaG5kbCBpbiAoZGZfaCwgY2xfaCk6CisgICAgICAgIGhuZGwuY29uZmlnLnNob3dfYW5jZXN0b3JzID0gMgorICAgICAgICBobmRsLmNvbmZpZy5zaG93X2Fzc29jaWF0ZWQgPSAxCisgICAgICAgIGhuZGwuY29uZmlnLm1vZHVsZV9uYW1lcyA9IEZhbHNlCisgICAgICAgIGhuZGwuX3NldF9kZWZhdWx0X29wdGlvbnMoKQorICAgICAgICBhc3NlcnQgaG5kbC5fZ2V0X2xldmVscygpID09ICgyLCAxKQorICAgICAgICBhc3NlcnQgbm90IGhuZGwubW9kdWxlX25hbWVzCisKKworZGVmIHRlc3RfZGVmYXVsdF92YWx1ZXMoKToKKyAgICAiIiJ0ZXN0IGRlZmF1bHQgdmFsdWVzIGZvciBwYWNrYWdlIG9yIGNsYXNzIGRpYWdyYW1zIiIiCisgICAgIyBUT0RPIDogc2hvdWxkIHRlc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlZmF1bHQgdmFsdWVzIGZvciBwYWNrYWdlIG9yIGNsYXNzIGRpYWdyYW1zIHB5bGludDogZGlzYWJsZT1maXhtZQorCisKK2NsYXNzIFRlc3REZWZhdWx0RGlhZGVmR2VuZXJhdG9yOgorICAgIF9zaG91bGRfcmVscyA9IFsKKyAgICAgICAgKCJhc3NvY2lhdGlvbiIsICJEb05vdGhpbmciLCAiQW5jZXN0b3IiKSwKKyAgICAgICAgKCJhc3NvY2lhdGlvbiIsICJEb05vdGhpbmciLCAiU3BlY2lhbGl6YXRpb24iKSwKKyAgICAgICAgKCJpbXBsZW1lbnRzIiwgIkFuY2VzdG9yIiwgIkludGVyZmFjZSIpLAorICAgICAgICAoInNwZWNpYWxpemF0aW9uIiwgIlNwZWNpYWxpemF0aW9uIiwgIkFuY2VzdG9yIiksCisgICAgXQorCisgICAgZGVmIHRlc3RfZXhjdHJhY3RfcmVsYXRpb25zKHNlbGYsIEhBTkRMRVIsIFBST0pFQ1QpOgorICAgICAgICAiIiJ0ZXN0IGV4dHJhY3RfcmVsYXRpb25zIGJldHdlZW4gY2xhc3NlcyIiIgorICAgICAgICBjZCA9IERlZmF1bHREaWFkZWZHZW5lcmF0b3IoTGlua2VyKFBST0pFQ1QpLCBIQU5ETEVSKS52aXNpdChQUk9KRUNUKVsxXQorICAgICAgICBjZC5leHRyYWN0X3JlbGF0aW9uc2hpcHMoKQorICAgICAgICByZWxhdGlvbnMgPSBfcHJvY2Vzc19yZWxhdGlvbnMoY2QucmVsYXRpb25zaGlwcykKKyAgICAgICAgYXNzZXJ0IHJlbGF0aW9ucyA9PSBzZWxmLl9zaG91bGRfcmVscworCisgICAgZGVmIHRlc3RfZnVuY3Rpb25hbF9yZWxhdGlvbl9leHRyYWN0aW9uKHNlbGYpOgorICAgICAgICAiIiJmdW5jdGlvbmFsIHRlc3Qgb2YgcmVsYXRpb25zIGV4dHJhY3Rpb247CisgICAgICAgIGRpZmZlcmVudCBjbGFzc2VzIHBvc3NpYmx5IGluIGRpZmZlcmVudCBtb2R1bGVzIiIiCisgICAgICAgICMgWFhYIHNob3VsZCBiZSBjYXRjaGluZyBweXJldmVyc2UgZW52aXJvbm5lbWVudCBwcm9ibGVtIGJ1dCBkb2Vzbid0CisgICAgICAgICMgcHlyZXZlcnNlIGRvZXNuJ3QgZXh0cmFjdHMgdGhlIHJlbGF0aW9ucyBidXQgdGhpcyB0ZXN0IG9rCisgICAgICAgIHByb2plY3QgPSBnZXRfcHJvamVjdCgiZGF0YSIpCisgICAgICAgIGhhbmRsZXIgPSBEaWFkZWZzSGFuZGxlcihDb25maWcoKSkKKyAgICAgICAgZGlhZGVmcyA9IGhhbmRsZXIuZ2V0X2RpYWRlZnMocHJvamVjdCwgTGlua2VyKHByb2plY3QsIHRhZz1UcnVlKSkKKyAgICAgICAgY2QgPSBkaWFkZWZzWzFdCisgICAgICAgIHJlbGF0aW9ucyA9IF9wcm9jZXNzX3JlbGF0aW9ucyhjZC5yZWxhdGlvbnNoaXBzKQorICAgICAgICBhc3NlcnQgcmVsYXRpb25zID09IHNlbGYuX3Nob3VsZF9yZWxzCisKKworZGVmIHRlc3Rfa25vd25fdmFsdWVzMShIQU5ETEVSLCBQUk9KRUNUKToKKyAgICBkZCA9IERlZmF1bHREaWFkZWZHZW5lcmF0b3IoTGlua2VyKFBST0pFQ1QpLCBIQU5ETEVSKS52aXNpdChQUk9KRUNUKQorICAgIGFzc2VydCBsZW4oZGQpID09IDIKKyAgICBrZXlzID0gW2QuVFlQRSBmb3IgZCBpbiBkZF0KKyAgICBhc3NlcnQga2V5cyA9PSBbInBhY2thZ2UiLCAiY2xhc3MiXQorICAgIHBkID0gZGRbMF0KKyAgICBhc3NlcnQgcGQudGl0bGUgPT0gInBhY2thZ2VzIE5vIE5hbWUiCisgICAgbW9kdWxlcyA9IHNvcnRlZCgoaXNpbnN0YW5jZShtLm5vZGUsIGFzdHJvaWQuTW9kdWxlKSwgbS50aXRsZSkgZm9yIG0gaW4gcGQub2JqZWN0cykKKyAgICBhc3NlcnQgbW9kdWxlcyA9PSBbCisgICAgICAgIChUcnVlLCAiZGF0YSIpLAorICAgICAgICAoVHJ1ZSwgImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QiKSwKKyAgICAgICAgKFRydWUsICJkYXRhLnN1cHBsaWVybW9kdWxlX3Rlc3QiKSwKKyAgICBdCisgICAgY2QgPSBkZFsxXQorICAgIGFzc2VydCBjZC50aXRsZSA9PSAiY2xhc3NlcyBObyBOYW1lIgorICAgIGNsYXNzZXMgPSBfcHJvY2Vzc19jbGFzc2VzKGNkLm9iamVjdHMpCisgICAgYXNzZXJ0IGNsYXNzZXMgPT0gWworICAgICAgICAoVHJ1ZSwgIkFuY2VzdG9yIiksCisgICAgICAgIChUcnVlLCAiRG9Ob3RoaW5nIiksCisgICAgICAgIChUcnVlLCAiSW50ZXJmYWNlIiksCisgICAgICAgIChUcnVlLCAiU3BlY2lhbGl6YXRpb24iKSwKKyAgICBdCisKKworZGVmIHRlc3Rfa25vd25fdmFsdWVzMihIQU5ETEVSKToKKyAgICBwcm9qZWN0ID0gZ2V0X3Byb2plY3QoImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QiKQorICAgIGRkID0gRGVmYXVsdERpYWRlZkdlbmVyYXRvcihMaW5rZXIocHJvamVjdCksIEhBTkRMRVIpLnZpc2l0KHByb2plY3QpCisgICAgYXNzZXJ0IGxlbihkZCkgPT0gMQorICAgIGtleXMgPSBbZC5UWVBFIGZvciBkIGluIGRkXQorICAgIGFzc2VydCBrZXlzID09IFsiY2xhc3MiXQorICAgIGNkID0gZGRbMF0KKyAgICBhc3NlcnQgY2QudGl0bGUgPT0gImNsYXNzZXMgTm8gTmFtZSIKKyAgICBjbGFzc2VzID0gX3Byb2Nlc3NfY2xhc3NlcyhjZC5vYmplY3RzKQorICAgIGFzc2VydCBjbGFzc2VzID09IFsoVHJ1ZSwgIkFuY2VzdG9yIiksIChUcnVlLCAiU3BlY2lhbGl6YXRpb24iKV0KKworCitkZWYgdGVzdF9rbm93bl92YWx1ZXMzKEhBTkRMRVIsIFBST0pFQ1QpOgorICAgIEhBTkRMRVIuY29uZmlnLmNsYXNzZXMgPSBbIlNwZWNpYWxpemF0aW9uIl0KKyAgICBjZGcgPSBDbGFzc0RpYWRlZkdlbmVyYXRvcihMaW5rZXIoUFJPSkVDVCksIEhBTkRMRVIpCisgICAgc3BlY2lhbCA9ICJkYXRhLmNsaWVudG1vZHVsZV90ZXN0LlNwZWNpYWxpemF0aW9uIgorICAgIGNkID0gY2RnLmNsYXNzX2RpYWdyYW0oUFJPSkVDVCwgc3BlY2lhbCkKKyAgICBhc3NlcnQgY2QudGl0bGUgPT0gc3BlY2lhbAorICAgIGNsYXNzZXMgPSBfcHJvY2Vzc19jbGFzc2VzKGNkLm9iamVjdHMpCisgICAgYXNzZXJ0IGNsYXNzZXMgPT0gWworICAgICAgICAoVHJ1ZSwgImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QuQW5jZXN0b3IiKSwKKyAgICAgICAgKFRydWUsIHNwZWNpYWwpLAorICAgICAgICAoVHJ1ZSwgImRhdGEuc3VwcGxpZXJtb2R1bGVfdGVzdC5Eb05vdGhpbmciKSwKKyAgICBdCisKKworZGVmIHRlc3Rfa25vd25fdmFsdWVzNChIQU5ETEVSLCBQUk9KRUNUKToKKyAgICBIQU5ETEVSLmNvbmZpZy5jbGFzc2VzID0gWyJTcGVjaWFsaXphdGlvbiJdCisgICAgSEFORExFUi5jb25maWcubW9kdWxlX25hbWVzID0gRmFsc2UKKyAgICBjZCA9IENsYXNzRGlhZGVmR2VuZXJhdG9yKExpbmtlcihQUk9KRUNUKSwgSEFORExFUikuY2xhc3NfZGlhZ3JhbSgKKyAgICAgICAgUFJPSkVDVCwgImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QuU3BlY2lhbGl6YXRpb24iCisgICAgKQorICAgIGFzc2VydCBjZC50aXRsZSA9PSAiZGF0YS5jbGllbnRtb2R1bGVfdGVzdC5TcGVjaWFsaXphdGlvbiIKKyAgICBjbGFzc2VzID0gX3Byb2Nlc3NfY2xhc3NlcyhjZC5vYmplY3RzKQorICAgIGFzc2VydCBjbGFzc2VzID09IFsKKyAgICAgICAgKFRydWUsICJBbmNlc3RvciIpLAorICAgICAgICAoVHJ1ZSwgIkRvTm90aGluZyIpLAorICAgICAgICAoVHJ1ZSwgIlNwZWNpYWxpemF0aW9uIiksCisgICAgXQorCisKK0BweXRlc3QubWFyay5za2lwaWYoc3lzLnZlcnNpb25faW5mbyA8ICgzLCA4KSwgcmVhc29uPSJSZXF1aXJlcyBkYXRhY2xhc3NlcyIpCitkZWYgdGVzdF9yZWdyZXNzaW9uX2RhdGFjbGFzc2VzX2luZmVyZW5jZShIQU5ETEVSKToKKyAgICBwcm9qZWN0X3BhdGggPSBQYXRoKCJyZWdydGVzdF9kYXRhIikgLyAiZGF0YWNsYXNzZXNfcHlyZXZlcnNlIgorICAgIHBhdGggPSBnZXRfcHJvamVjdChzdHIocHJvamVjdF9wYXRoKSkKKworICAgIGNkZyA9IENsYXNzRGlhZGVmR2VuZXJhdG9yKExpbmtlcihwYXRoKSwgSEFORExFUikKKyAgICBzcGVjaWFsID0gInJlZ3J0ZXN0X2RhdGEuZGF0YWNsYXNzZXNfcHlyZXZlcnNlLkludmVudG9yeUl0ZW0iCisgICAgY2QgPSBjZGcuY2xhc3NfZGlhZ3JhbShwYXRoLCBzcGVjaWFsKQorICAgIGFzc2VydCBjZC50aXRsZSA9PSBzcGVjaWFsCmRpZmYgLS1naXQgYS90ZXN0cy91bml0dGVzdF9weXJldmVyc2VfaW5zcGVjdG9yLnB5IGIvdGVzdHMvdW5pdHRlc3RfcHlyZXZlcnNlX2luc3BlY3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWZmNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdW5pdHRlc3RfcHlyZXZlcnNlX2luc3BlY3Rvci5weQpAQCAtMCwwICsxLDEzMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IERlcmVrIEd1c3RhZnNvbiA8ZGVndXN0YWZAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBEYW1pZW4gQmF0eSA8ZGFtaWVuLmJhdHlAcG9seWNvbnNlaWwuZnI+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiCisgZm9yIHRoZSB2aXNpdG9ycy5kaWFkZWZzIG1vZHVsZQorIiIiCisjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtb3V0ZXItbmFtZQorCitpbXBvcnQgb3MKKworaW1wb3J0IGFzdHJvaWQKK2ltcG9ydCBweXRlc3QKK2Zyb20gdW5pdHRlc3RfcHlyZXZlcnNlX3dyaXRlciBpbXBvcnQgZ2V0X3Byb2plY3QKKworZnJvbSBweWxpbnQucHlyZXZlcnNlIGltcG9ydCBpbnNwZWN0b3IKKworCitAcHl0ZXN0LmZpeHR1cmUKK2RlZiBwcm9qZWN0KCk6CisgICAgcHJvamVjdCA9IGdldF9wcm9qZWN0KCJkYXRhIiwgImRhdGEiKQorICAgIGxpbmtlciA9IGluc3BlY3Rvci5MaW5rZXIocHJvamVjdCkKKyAgICBsaW5rZXIudmlzaXQocHJvamVjdCkKKyAgICByZXR1cm4gcHJvamVjdAorCisKK2RlZiB0ZXN0X2NsYXNzX2ltcGxlbWVudHMocHJvamVjdCk6CisgICAga2xhc3MgPSBwcm9qZWN0LmdldF9tb2R1bGUoImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QiKVsiQW5jZXN0b3IiXQorICAgIGFzc2VydCBoYXNhdHRyKGtsYXNzLCAiaW1wbGVtZW50cyIpCisgICAgYXNzZXJ0IGxlbihrbGFzcy5pbXBsZW1lbnRzKSA9PSAxCisgICAgYXNzZXJ0IGlzaW5zdGFuY2Uoa2xhc3MuaW1wbGVtZW50c1swXSwgYXN0cm9pZC5ub2Rlcy5DbGFzc0RlZikKKyAgICBhc3NlcnQga2xhc3MuaW1wbGVtZW50c1swXS5uYW1lID09ICJJbnRlcmZhY2UiCisKKworZGVmIHRlc3RfY2xhc3NfaW1wbGVtZW50c19zcGVjaWFsaXphdGlvbihwcm9qZWN0KToKKyAgICBrbGFzcyA9IHByb2plY3QuZ2V0X21vZHVsZSgiZGF0YS5jbGllbnRtb2R1bGVfdGVzdCIpWyJTcGVjaWFsaXphdGlvbiJdCisgICAgYXNzZXJ0IGhhc2F0dHIoa2xhc3MsICJpbXBsZW1lbnRzIikKKyAgICBhc3NlcnQgbGVuKGtsYXNzLmltcGxlbWVudHMpID09IDAKKworCitkZWYgdGVzdF9sb2NhbHNfYXNzaWdubWVudF9yZXNvbHV0aW9uKHByb2plY3QpOgorICAgIGtsYXNzID0gcHJvamVjdC5nZXRfbW9kdWxlKCJkYXRhLmNsaWVudG1vZHVsZV90ZXN0IilbIlNwZWNpYWxpemF0aW9uIl0KKyAgICBhc3NlcnQgaGFzYXR0cihrbGFzcywgImxvY2Fsc190eXBlIikKKyAgICB0eXBlX2RpY3QgPSBrbGFzcy5sb2NhbHNfdHlwZQorICAgIGFzc2VydCBsZW4odHlwZV9kaWN0KSA9PSAyCisgICAga2V5cyA9IHNvcnRlZCh0eXBlX2RpY3Qua2V5cygpKQorICAgIGFzc2VydCBrZXlzID09IFsiVFlQRSIsICJ0b3AiXQorICAgIGFzc2VydCBsZW4odHlwZV9kaWN0WyJUWVBFIl0pID09IDEKKyAgICBhc3NlcnQgdHlwZV9kaWN0WyJUWVBFIl1bMF0udmFsdWUgPT0gImZpbmFsIGNsYXNzIgorICAgIGFzc2VydCBsZW4odHlwZV9kaWN0WyJ0b3AiXSkgPT0gMQorICAgIGFzc2VydCB0eXBlX2RpY3RbInRvcCJdWzBdLnZhbHVlID09ICJjbGFzcyIKKworCitkZWYgdGVzdF9pbnN0YW5jZV9hdHRyc19yZXNvbHV0aW9uKHByb2plY3QpOgorICAgIGtsYXNzID0gcHJvamVjdC5nZXRfbW9kdWxlKCJkYXRhLmNsaWVudG1vZHVsZV90ZXN0IilbIlNwZWNpYWxpemF0aW9uIl0KKyAgICBhc3NlcnQgaGFzYXR0cihrbGFzcywgImluc3RhbmNlX2F0dHJzX3R5cGUiKQorICAgIHR5cGVfZGljdCA9IGtsYXNzLmluc3RhbmNlX2F0dHJzX3R5cGUKKyAgICBhc3NlcnQgbGVuKHR5cGVfZGljdCkgPT0gMgorICAgIGtleXMgPSBzb3J0ZWQodHlwZV9kaWN0LmtleXMoKSkKKyAgICBhc3NlcnQga2V5cyA9PSBbIl9pZCIsICJyZWxhdGlvbiJdCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UodHlwZV9kaWN0WyJyZWxhdGlvbiJdWzBdLCBhc3Ryb2lkLmJhc2VzLkluc3RhbmNlKSwgdHlwZV9kaWN0WworICAgICAgICAicmVsYXRpb24iCisgICAgXQorICAgIGFzc2VydCB0eXBlX2RpY3RbInJlbGF0aW9uIl1bMF0ubmFtZSA9PSAiRG9Ob3RoaW5nIgorICAgIGFzc2VydCB0eXBlX2RpY3RbIl9pZCJdWzBdIGlzIGFzdHJvaWQuVW5pbmZlcmFibGUKKworCitkZWYgdGVzdF9jb25jYXRfaW50ZXJmYWNlcygpOgorICAgIGNscyA9IGFzdHJvaWQuZXh0cmFjdF9ub2RlKAorICAgICAgICAnJycKKyAgICAgICAgY2xhc3MgSU1hY2hpbjogcGFzcworCisgICAgICAgIGNsYXNzIENvcnJlY3QyOgorICAgICAgICAgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgICAgICAgICBfX2ltcGxlbWVudHNfXyA9IChJTWFjaGluLCkKKworICAgICAgICBjbGFzcyBCYWRBcmd1bWVudDoKKyAgICAgICAgICAgICIiImRvY3N0cmluZyIiIgorICAgICAgICAgICAgX19pbXBsZW1lbnRzX18gPSAoSU1hY2hpbiwpCisKKyAgICAgICAgY2xhc3MgSW50ZXJmYWNlQ2FuTm93QmVGb3VuZDogI0AKKyAgICAgICAgICAgICIiImRvY3N0cmluZyIiIgorICAgICAgICAgICAgX19pbXBsZW1lbnRzX18gPSBCYWRBcmd1bWVudC5fX2ltcGxlbWVudHNfXyArIENvcnJlY3QyLl9faW1wbGVtZW50c19fCisgICAgJycnCisgICAgKQorICAgIGludGVyZmFjZXMgPSBpbnNwZWN0b3IuaW50ZXJmYWNlcyhjbHMpCisgICAgYXNzZXJ0IFtpLm5hbWUgZm9yIGkgaW4gaW50ZXJmYWNlc10gPT0gWyJJTWFjaGluIl0KKworCitkZWYgdGVzdF9pbnRlcmZhY2VzKCk6CisgICAgbW9kdWxlID0gYXN0cm9pZC5wYXJzZSgKKyAgICAgICAgIiIiCisgICAgY2xhc3MgSW50ZXJmYWNlKG9iamVjdCk6IHBhc3MKKyAgICBjbGFzcyBNeUlGYWNlKEludGVyZmFjZSk6IHBhc3MKKyAgICBjbGFzcyBBbm90aGVySUZhY2UoSW50ZXJmYWNlKTogcGFzcworICAgIGNsYXNzIENvbmNyZXRlMChvYmplY3QpOgorICAgICAgICBfX2ltcGxlbWVudHNfXyA9IE15SUZhY2UKKyAgICBjbGFzcyBDb25jcmV0ZTE6CisgICAgICAgIF9faW1wbGVtZW50c19fID0gKE15SUZhY2UsIEFub3RoZXJJRmFjZSkKKyAgICBjbGFzcyBDb25jcmV0ZTI6CisgICAgICAgIF9faW1wbGVtZW50c19fID0gKE15SUZhY2UsIEFub3RoZXJJRmFjZSkKKyAgICBjbGFzcyBDb25jcmV0ZTIzKENvbmNyZXRlMSk6IHBhc3MKKyAgICAiIiIKKyAgICApCisKKyAgICBmb3Iga2xhc3MsIGludGVyZmFjZXMgaW4gKAorICAgICAgICAoIkNvbmNyZXRlMCIsIFsiTXlJRmFjZSJdKSwKKyAgICAgICAgKCJDb25jcmV0ZTEiLCBbIk15SUZhY2UiLCAiQW5vdGhlcklGYWNlIl0pLAorICAgICAgICAoIkNvbmNyZXRlMiIsIFsiTXlJRmFjZSIsICJBbm90aGVySUZhY2UiXSksCisgICAgICAgICgiQ29uY3JldGUyMyIsIFsiTXlJRmFjZSIsICJBbm90aGVySUZhY2UiXSksCisgICAgKToKKyAgICAgICAga2xhc3MgPSBtb2R1bGVba2xhc3NdCisgICAgICAgIGFzc2VydCBbaS5uYW1lIGZvciBpIGluIGluc3BlY3Rvci5pbnRlcmZhY2VzKGtsYXNzKV0gPT0gaW50ZXJmYWNlcworCisKK2RlZiB0ZXN0X2Zyb21fZGlyZWN0b3J5KHByb2plY3QpOgorICAgIGV4cGVjdGVkID0gb3MucGF0aC5qb2luKCJ0ZXN0cyIsICJkYXRhIiwgIl9faW5pdF9fLnB5IikKKyAgICBhc3NlcnQgcHJvamVjdC5uYW1lID09ICJkYXRhIgorICAgIGFzc2VydCBwcm9qZWN0LnBhdGguZW5kc3dpdGgoZXhwZWN0ZWQpCisKKworZGVmIHRlc3RfcHJvamVjdF9ub2RlKHByb2plY3QpOgorICAgIGV4cGVjdGVkID0gWyJkYXRhIiwgImRhdGEuY2xpZW50bW9kdWxlX3Rlc3QiLCAiZGF0YS5zdXBwbGllcm1vZHVsZV90ZXN0Il0KKyAgICBhc3NlcnQgc29ydGVkKHByb2plY3Qua2V5cygpKSA9PSBleHBlY3RlZApkaWZmIC0tZ2l0IGEvdGVzdHMvdW5pdHRlc3RfcHlyZXZlcnNlX3dyaXRlci5weSBiL3Rlc3RzL3VuaXR0ZXN0X3B5cmV2ZXJzZV93cml0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiYjAxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3VuaXR0ZXN0X3B5cmV2ZXJzZV93cml0ZXIucHkKQEAgLTAsMCArMSwxMzQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwLCAyMDEzIExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIDIwMjAgQ2xhdWRpdSBQb3BhIDxwY21hbnRpY29yZUBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNCBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFZpbGxlIFNreXR0w6QgPHZpbGxlLnNreXR0YUBpa2kuZmk+CisjIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTkgQXNobGV5IFdoZXR0ZXIgPGFzaGxleUBhd2hldHRlci5jby51az4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIGhpcHBvOTEgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDIwIEFudGhvbnkgU290dGlsZSA8YXNvdHRpbGVAdW1pY2guZWR1PgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgTWFyayBCeXJuZSA8bWJ5cm5lcHIyQGdtYWlsLmNvbT4KKworIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCisiIiIKK3VuaXQgdGVzdCBmb3IgdmlzaXRvcnMuZGlhZGVmcyBhbmQgZXh0ZW5zaW9ucy5kaWFkZWZzbGliIG1vZHVsZXMKKyIiIgorCisKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBvcworZnJvbSBkaWZmbGliIGltcG9ydCB1bmlmaWVkX2RpZmYKKworaW1wb3J0IHB5dGVzdAorCitmcm9tIHB5bGludC5weXJldmVyc2UuZGlhZGVmc2xpYiBpbXBvcnQgRGVmYXVsdERpYWRlZkdlbmVyYXRvciwgRGlhZGVmc0hhbmRsZXIKK2Zyb20gcHlsaW50LnB5cmV2ZXJzZS5pbnNwZWN0b3IgaW1wb3J0IExpbmtlciwgcHJvamVjdF9mcm9tX2ZpbGVzCitmcm9tIHB5bGludC5weXJldmVyc2UudXRpbHMgaW1wb3J0IGdldF92aXNpYmlsaXR5Citmcm9tIHB5bGludC5weXJldmVyc2Uud3JpdGVyIGltcG9ydCBEb3RXcml0ZXIKKworX0RFRkFVTFRTID0geworICAgICJhbGxfYW5jZXN0b3JzIjogTm9uZSwKKyAgICAic2hvd19hc3NvY2lhdGVkIjogTm9uZSwKKyAgICAibW9kdWxlX25hbWVzIjogTm9uZSwKKyAgICAib3V0cHV0X2Zvcm1hdCI6ICJkb3QiLAorICAgICJkaWFkZWZzX2ZpbGUiOiBOb25lLAorICAgICJxdWlldCI6IDAsCisgICAgInNob3dfYW5jZXN0b3JzIjogTm9uZSwKKyAgICAiY2xhc3NlcyI6ICgpLAorICAgICJhbGxfYXNzb2NpYXRlZCI6IE5vbmUsCisgICAgIm1vZGUiOiAiUFVCX09OTFkiLAorICAgICJzaG93X2J1aWx0aW4iOiBGYWxzZSwKKyAgICAib25seV9jbGFzc25hbWVzIjogRmFsc2UsCisgICAgIm91dHB1dF9kaXJlY3RvcnkiOiAiIiwKK30KKworCitjbGFzcyBDb25maWc6CisgICAgIiIiY29uZmlnIG9iamVjdCBmb3IgdGVzdHMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIF9ERUZBVUxUUy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKKworCitkZWYgX2ZpbGVfbGluZXMocGF0aCk6CisgICAgIyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBhY3R1YWwgZW5jb2RpbmcsIGJ1dCBweXRob24zIGZvcmNlcyB1cyB0byBwaWNrIG9uZQorICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgZW5jb2Rpbmc9ImxhdGluMSIpIGFzIHN0cmVhbToKKyAgICAgICAgbGluZXMgPSBbCisgICAgICAgICAgICBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHN0cmVhbS5yZWFkbGluZXMoKQorICAgICAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgIGxpbmUuZmluZCgic3F1ZWxldG9uIGdlbmVyYXRlZCBieSAiKSA9PSAtMQorICAgICAgICAgICAgICAgIGFuZCBub3QgbGluZS5zdGFydHN3aXRoKCdfX3JldmlzaW9uX18gPSAiJElkOicpCisgICAgICAgICAgICApCisgICAgICAgIF0KKyAgICByZXR1cm4gW2xpbmUgZm9yIGxpbmUgaW4gbGluZXMgaWYgbGluZV0KKworCitkZWYgZ2V0X3Byb2plY3QobW9kdWxlLCBuYW1lPSJObyBOYW1lIik6CisgICAgIiIicmV0dXJuIGFuIGFzdHJvaWQgcHJvamVjdCByZXByZXNlbnRhdGlvbiIiIgorCisgICAgZGVmIF9hc3Ryb2lkX3dyYXBwZXIoZnVuYywgbW9kbmFtZSk6CisgICAgICAgIHJldHVybiBmdW5jKG1vZG5hbWUpCisKKyAgICByZXR1cm4gcHJvamVjdF9mcm9tX2ZpbGVzKFttb2R1bGVdLCBfYXN0cm9pZF93cmFwcGVyLCBwcm9qZWN0X25hbWU9bmFtZSkKKworCitET1RfRklMRVMgPSBbInBhY2thZ2VzX05vX05hbWUuZG90IiwgImNsYXNzZXNfTm9fTmFtZS5kb3QiXQorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiBzZXR1cCgpOgorICAgIHByb2plY3QgPSBnZXRfcHJvamVjdChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImRhdGEiKSkKKyAgICBsaW5rZXIgPSBMaW5rZXIocHJvamVjdCkKKyAgICBDT05GSUcgPSBDb25maWcoKQorICAgIGhhbmRsZXIgPSBEaWFkZWZzSGFuZGxlcihDT05GSUcpCisgICAgZGQgPSBEZWZhdWx0RGlhZGVmR2VuZXJhdG9yKGxpbmtlciwgaGFuZGxlcikudmlzaXQocHJvamVjdCkKKyAgICBmb3IgZGlhZ3JhbSBpbiBkZDoKKyAgICAgICAgZGlhZ3JhbS5leHRyYWN0X3JlbGF0aW9uc2hpcHMoKQorICAgIHdyaXRlciA9IERvdFdyaXRlcihDT05GSUcpCisgICAgd3JpdGVyLndyaXRlKGRkKQorICAgIHlpZWxkCisgICAgZm9yIGZuYW1lIGluIERPVF9GSUxFUzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGZuYW1lKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorCisKK0BweXRlc3QubWFyay51c2VmaXh0dXJlcygic2V0dXAiKQorQHB5dGVzdC5tYXJrLnBhcmFtZXRyaXplKCJnZW5lcmF0ZWRfZmlsZSIsIERPVF9GSUxFUykKK2RlZiB0ZXN0X2RvdF9maWxlcyhnZW5lcmF0ZWRfZmlsZSk6CisgICAgZXhwZWN0ZWRfZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZGF0YSIsIGdlbmVyYXRlZF9maWxlKQorICAgIGdlbmVyYXRlZCA9IF9maWxlX2xpbmVzKGdlbmVyYXRlZF9maWxlKQorICAgIGV4cGVjdGVkID0gX2ZpbGVfbGluZXMoZXhwZWN0ZWRfZmlsZSkKKyAgICBnZW5lcmF0ZWQgPSAiXG4iLmpvaW4oZ2VuZXJhdGVkKQorICAgIGV4cGVjdGVkID0gIlxuIi5qb2luKGV4cGVjdGVkKQorICAgIGZpbGVzID0gZiJcbiAqKiogZXhwZWN0ZWQgOiB7ZXhwZWN0ZWRfZmlsZX0sIGdlbmVyYXRlZCA6IHtnZW5lcmF0ZWRfZmlsZX0gXG4iCisgICAgZGlmZiA9ICJcbiIuam9pbigKKyAgICAgICAgbGluZSBmb3IgbGluZSBpbiB1bmlmaWVkX2RpZmYoZXhwZWN0ZWQuc3BsaXRsaW5lcygpLCBnZW5lcmF0ZWQuc3BsaXRsaW5lcygpKQorICAgICkKKyAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gZ2VuZXJhdGVkLCBmIntmaWxlc317ZGlmZn0iCisgICAgb3MucmVtb3ZlKGdlbmVyYXRlZF9maWxlKQorCisKK0BweXRlc3QubWFyay5wYXJhbWV0cml6ZSgKKyAgICAibmFtZXMsIGV4cGVjdGVkIiwKKyAgICBbCisgICAgICAgIChbIl9fcmVkdWNlX2V4X18iLCAiX19zZXRhdHRyX18iXSwgInNwZWNpYWwiKSwKKyAgICAgICAgKFsiX19nXyIsICJfX19fZHNmIiwgIl9fMjNfOSJdLCAicHJpdmF0ZSIpLAorICAgICAgICAoWyJzaW1wbGUiXSwgInB1YmxpYyIpLAorICAgICAgICAoCisgICAgICAgICAgICBbIl8iLCAiX18iLCAiX19fIiwgIl9fX18iLCAiX19fX18iLCAiX19fZV9fIiwgIl9uZXh0c2ltcGxlIiwgIl9maWx0ZXJfaXRfIl0sCisgICAgICAgICAgICAicHJvdGVjdGVkIiwKKyAgICAgICAgKSwKKyAgICBdLAorKQorZGVmIHRlc3RfZ2V0X3Zpc2liaWxpdHkobmFtZXMsIGV4cGVjdGVkKToKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgZ290ID0gZ2V0X3Zpc2liaWxpdHkobmFtZSkKKyAgICAgICAgYXNzZXJ0IGdvdCA9PSBleHBlY3RlZCwgZiJnb3Qge2dvdH0gaW5zdGVhZCBvZiB7ZXhwZWN0ZWR9IGZvciB2YWx1ZSB7bmFtZX0iCmRpZmYgLS1naXQgYS90ZXN0cy91bml0dGVzdF9yZXBvcnRlcnNfanNvbi5weSBiL3Rlc3RzL3VuaXR0ZXN0X3JlcG9ydGVyc19qc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDM3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91bml0dGVzdF9yZXBvcnRlcnNfanNvbi5weQpAQCAtMCwwICsxLDYyIEBACisjIENvcHlyaWdodCAoYykgMjAxNCBWbGFkIFRlbWlhbiA8dmxhZHRlbWlhbkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxNS0yMDE4LCAyMDIwIENsYXVkaXUgUG9wYSA8cGNtYW50aWNvcmVAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IGd1aWxsYXVtZTIgPGd1aWxsYXVtZS5wZWlsbGV4QGdtYWlsLmNvbD4KKyMgQ29weXJpZ2h0IChjKSAyMDE4IFN1c2hvYmhpdCA8MzE5ODc3Njkrc3VzaG9iaGl0MjdAdXNlcnMubm9yZXBseS5naXRodWIuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBQaWVycmUgU2Fzc291bGFzIDxwaWVycmUuc2Fzc291bGFzQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworIiIiVGVzdCBmb3IgdGhlIEpTT04gcmVwb3J0ZXIuIiIiCisKK2ltcG9ydCBqc29uCitmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworCitmcm9tIHB5bGludCBpbXBvcnQgY2hlY2tlcnMKK2Zyb20gcHlsaW50LmxpbnQgaW1wb3J0IFB5TGludGVyCitmcm9tIHB5bGludC5yZXBvcnRlcnMgaW1wb3J0IEpTT05SZXBvcnRlcgorZnJvbSBweWxpbnQucmVwb3J0ZXJzLnVyZXBvcnRzLm5vZGVzIGltcG9ydCBFdmFsdWF0aW9uU2VjdGlvbgorCitleHBlY3RlZF9zY29yZV9tZXNzYWdlID0gIkV4cGVjdGVkIHNjb3JlIG1lc3NhZ2UiCitleHBlY3RlZF9yZXN1bHQgPSBbCisgICAgWworICAgICAgICAoImNvbHVtbiIsIDApLAorICAgICAgICAoImxpbmUiLCAxKSwKKyAgICAgICAgKCJtZXNzYWdlIiwgIkxpbmUgdG9vIGxvbmcgKDEvMikiKSwKKyAgICAgICAgKCJtZXNzYWdlLWlkIiwgIkMwMzAxIiksCisgICAgICAgICgibW9kdWxlIiwgIjAxMjMiKSwKKyAgICAgICAgKCJvYmoiLCAiIiksCisgICAgICAgICgicGF0aCIsICIwMTIzIiksCisgICAgICAgICgic3ltYm9sIiwgImxpbmUtdG9vLWxvbmciKSwKKyAgICAgICAgKCJ0eXBlIiwgImNvbnZlbnRpb24iKSwKKyAgICBdCitdCisKKworZGVmIHRlc3Rfc2ltcGxlX2pzb25fb3V0cHV0X25vX3Njb3JlKCk6CisgICAgcmVwb3J0ID0gZ2V0X2xpbnRlcl9yZXN1bHQoc2NvcmU9RmFsc2UpCisgICAgYXNzZXJ0IGxlbihyZXBvcnQpID09IDEKKyAgICByZXBvcnRfcmVzdWx0ID0gW3NvcnRlZChyZXBvcnRbMF0uaXRlbXMoKSwga2V5PWxhbWJkYSBpdGVtOiBpdGVtWzBdKV0KKyAgICBhc3NlcnQgcmVwb3J0X3Jlc3VsdCA9PSBleHBlY3RlZF9yZXN1bHQKKworCitkZWYgZ2V0X2xpbnRlcl9yZXN1bHQoc2NvcmUpOgorICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICByZXBvcnRlciA9IEpTT05SZXBvcnRlcihvdXRwdXQpCisgICAgbGludGVyID0gUHlMaW50ZXIocmVwb3J0ZXI9cmVwb3J0ZXIpCisgICAgY2hlY2tlcnMuaW5pdGlhbGl6ZShsaW50ZXIpCisgICAgbGludGVyLmNvbmZpZy5wZXJzaXN0ZW50ID0gMAorICAgIGxpbnRlci5jb25maWcuc2NvcmUgPSBzY29yZQorICAgIGxpbnRlci5vcGVuKCkKKyAgICBsaW50ZXIuc2V0X2N1cnJlbnRfbW9kdWxlKCIwMTIzIikKKyAgICBsaW50ZXIuYWRkX21lc3NhZ2UoImxpbmUtdG9vLWxvbmciLCBsaW5lPTEsIGFyZ3M9KDEsIDIpKQorICAgICMgd2UgY2FsbCB0aG9zZSBtZXRob2RzIGJlY2F1c2Ugd2UgZGlkbid0IGFjdHVhbGx5IHJ1biB0aGUgY2hlY2tlcnMKKyAgICBpZiBzY29yZToKKyAgICAgICAgcmVwb3J0ZXIuZGlzcGxheV9yZXBvcnRzKEV2YWx1YXRpb25TZWN0aW9uKGV4cGVjdGVkX3Njb3JlX21lc3NhZ2UpKQorICAgIHJlcG9ydGVyLmRpc3BsYXlfbWVzc2FnZXMoTm9uZSkKKyAgICByZXBvcnRfcmVzdWx0ID0ganNvbi5sb2FkcyhvdXRwdXQuZ2V0dmFsdWUoKSkKKyAgICByZXR1cm4gcmVwb3J0X3Jlc3VsdApkaWZmIC0tZ2l0IGEvdGVzdHMvdW5pdHRlc3RfcmVwb3J0aW5nLnB5IGIvdGVzdHMvdW5pdHRlc3RfcmVwb3J0aW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGJkYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91bml0dGVzdF9yZXBvcnRpbmcucHkKQEAgLTAsMCArMSwyNjQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTE9HSUxBQiBTLkEuIChQYXJpcywgRlJBTkNFKSA8Y29udGFjdEBsb2dpbGFiLmZyPgorIyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IENhbGluIERvbiA8Y2FsaW4uZG9uQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEdvb2dsZSwgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMTQgQXJ1biBQZXJzYXVkIDxhcnVuQG51YmF0aS5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNSBJb25lbCBDcmlzdGlhbiBNYXJpZXMgPGNvbnRhY3RAaW9uZWxtYy5ybz4KKyMgQ29weXJpZ2h0IChjKSAyMDE2LTIwMTcgRGVyZWsgR3VzdGFmc29uIDxkZWd1c3RhZkBnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOCBTdXNob2JoaXQgPDMxOTg3NzY5K3N1c2hvYmhpdDI3QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgUGllcnJlIFNhc3NvdWxhcyA8cGllcnJlLnNhc3NvdWxhc0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAxOSBBc2hsZXkgV2hldHRlciA8YXNobGV5QGF3aGV0dGVyLmNvLnVrPgorIyBDb3B5cmlnaHQgKGMpIDIwMjAgaGlwcG85MSA8Z3VpbGxhdW1lLnBlaWxsZXhAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMjEgcnVybyA8cnVyby5ydXJvQHlhLnJ1PgorCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEw6IGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvb2xkLWxpY2Vuc2VzL2dwbC0yLjAuaHRtbAorIyBGb3IgZGV0YWlsczogaHR0cHM6Ly9naXRodWIuY29tL1B5Q1FBL3B5bGludC9ibG9iL21hc3Rlci9MSUNFTlNFCisjIHB5bGludDogZGlzYWJsZT1yZWRlZmluZWQtb3V0ZXItbmFtZQorCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgcmVkaXJlY3Rfc3Rkb3V0Citmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworZnJvbSBqc29uIGltcG9ydCBkdW1wcworCitpbXBvcnQgcHl0ZXN0CisKK2Zyb20gcHlsaW50IGltcG9ydCBjaGVja2VycworZnJvbSBweWxpbnQuaW50ZXJmYWNlcyBpbXBvcnQgSVJlcG9ydGVyCitmcm9tIHB5bGludC5saW50IGltcG9ydCBQeUxpbnRlcgorZnJvbSBweWxpbnQucmVwb3J0ZXJzIGltcG9ydCBCYXNlUmVwb3J0ZXIKK2Zyb20gcHlsaW50LnJlcG9ydGVycy50ZXh0IGltcG9ydCBQYXJzZWFibGVUZXh0UmVwb3J0ZXIsIFRleHRSZXBvcnRlcgorCisKK0BweXRlc3QuZml4dHVyZShzY29wZT0ibW9kdWxlIikKK2RlZiByZXBvcnRlcigpOgorICAgIHJldHVybiBUZXh0UmVwb3J0ZXIKKworCitAcHl0ZXN0LmZpeHR1cmUoc2NvcGU9Im1vZHVsZSIpCitkZWYgZGlzYWJsZSgpOgorICAgIHJldHVybiBbIkkiXQorCisKK2RlZiB0ZXN0X3RlbXBsYXRlX29wdGlvbihsaW50ZXIpOgorICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICBsaW50ZXIucmVwb3J0ZXIuc2V0X291dHB1dChvdXRwdXQpCisgICAgbGludGVyLnNldF9vcHRpb24oIm1zZy10ZW1wbGF0ZSIsICJ7bXNnX2lkfTp7bGluZTowM2R9IikKKyAgICBsaW50ZXIub3BlbigpCisgICAgbGludGVyLnNldF9jdXJyZW50X21vZHVsZSgiMDEyMyIpCisgICAgbGludGVyLmFkZF9tZXNzYWdlKCJDMDMwMSIsIGxpbmU9MSwgYXJncz0oMSwgMikpCisgICAgbGludGVyLmFkZF9tZXNzYWdlKCJsaW5lLXRvby1sb25nIiwgbGluZT0yLCBhcmdzPSgzLCA0KSkKKyAgICBhc3NlcnQgb3V0cHV0LmdldHZhbHVlKCkgPT0gIioqKioqKioqKioqKiogTW9kdWxlIDAxMjNcbkMwMzAxOjAwMVxuQzAzMDE6MDAyXG4iCisKKworZGVmIHRlc3RfcGFyc2VhYmxlX291dHB1dF9kZXByZWNhdGVkKCk6CisgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgY206CisgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgUGFyc2VhYmxlVGV4dFJlcG9ydGVyKCkKKworICAgIGFzc2VydCBsZW4oY20pID09IDEKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShjbVswXS5tZXNzYWdlLCBEZXByZWNhdGlvbldhcm5pbmcpCisKKworZGVmIHRlc3RfcGFyc2VhYmxlX291dHB1dF9yZWdyZXNzaW9uKCk6CisgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQorICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpOgorICAgICAgICBsaW50ZXIgPSBQeUxpbnRlcihyZXBvcnRlcj1QYXJzZWFibGVUZXh0UmVwb3J0ZXIoKSkKKworICAgIGNoZWNrZXJzLmluaXRpYWxpemUobGludGVyKQorICAgIGxpbnRlci5jb25maWcucGVyc2lzdGVudCA9IDAKKyAgICBsaW50ZXIucmVwb3J0ZXIuc2V0X291dHB1dChvdXRwdXQpCisgICAgbGludGVyLnNldF9vcHRpb24oIm91dHB1dC1mb3JtYXQiLCAicGFyc2VhYmxlIikKKyAgICBsaW50ZXIub3BlbigpCisgICAgbGludGVyLnNldF9jdXJyZW50X21vZHVsZSgiMDEyMyIpCisgICAgbGludGVyLmFkZF9tZXNzYWdlKCJsaW5lLXRvby1sb25nIiwgbGluZT0xLCBhcmdzPSgxLCAyKSkKKyAgICBhc3NlcnQgKAorICAgICAgICBvdXRwdXQuZ2V0dmFsdWUoKSA9PSAiKioqKioqKioqKioqKiBNb2R1bGUgMDEyM1xuIgorICAgICAgICAiMDEyMzoxOiBbQzAzMDEobGluZS10b28tbG9uZyksIF0gIgorICAgICAgICAiTGluZSB0b28gbG9uZyAoMS8yKVxuIgorICAgICkKKworCitjbGFzcyBOb3BSZXBvcnRlcihCYXNlUmVwb3J0ZXIpOgorICAgIF9faW1wbGVtZW50c19fID0gSVJlcG9ydGVyCisgICAgbmFtZSA9ICJub3AtcmVwb3J0ZXIiCisgICAgZXh0ZW5zaW9uID0gIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18ob3V0cHV0KQorICAgICAgICBwcmludCgiQSBOb3BSZXBvcnRlciB3YXMgaW5pdGlhbGl6ZWQuIiwgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiB3cml0ZWxuKHNlbGYsIHN0cmluZz0iIik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfZGlzcGxheShzZWxmLCBsYXlvdXQpOgorICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfbXVsdGlfZm9ybWF0X291dHB1dCh0bXBfcGF0aCk6CisgICAgdGV4dCA9IFN0cmluZ0lPKG5ld2xpbmU9Tm9uZSkKKyAgICBqc29uID0gdG1wX3BhdGggLyAic29tZWZpbGUuanNvbiIKKworICAgIHNvdXJjZV9maWxlID0gdG1wX3BhdGggLyAic29tZW1vZHVsZS5weSIKKyAgICBzb3VyY2VfZmlsZS53cml0ZV90ZXh0KCdOT1RfRU1QVFkgPSAiVGhpcyBtb2R1bGUgaXMgbm90IGVtcHR5IlxuJykKKyAgICBlc2NhcGVkX3NvdXJjZV9maWxlID0gZHVtcHMoc3RyKHNvdXJjZV9maWxlKSkKKworICAgIG5vcF9mb3JtYXQgPSBOb3BSZXBvcnRlci5fX21vZHVsZV9fICsgIi4iICsgTm9wUmVwb3J0ZXIuX19uYW1lX18KKyAgICBmb3JtYXRzID0gIiwiLmpvaW4oWyJqc29uOiIgKyBzdHIoanNvbiksICJ0ZXh0Iiwgbm9wX2Zvcm1hdF0pCisKKyAgICB3aXRoIHJlZGlyZWN0X3N0ZG91dCh0ZXh0KToKKyAgICAgICAgbGludGVyID0gUHlMaW50ZXIoKQorICAgICAgICBsaW50ZXIuc2V0X29wdGlvbigicGVyc2lzdGVudCIsIEZhbHNlKQorICAgICAgICBsaW50ZXIuc2V0X29wdGlvbigib3V0cHV0LWZvcm1hdCIsIGZvcm1hdHMpCisgICAgICAgIGxpbnRlci5zZXRfb3B0aW9uKCJyZXBvcnRzIiwgVHJ1ZSkKKyAgICAgICAgbGludGVyLnNldF9vcHRpb24oInNjb3JlIiwgVHJ1ZSkKKyAgICAgICAgbGludGVyLmxvYWRfZGVmYXVsdF9wbHVnaW5zKCkKKworICAgICAgICBhc3NlcnQgbGludGVyLnJlcG9ydGVyLmxpbnRlciBpcyBsaW50ZXIKKyAgICAgICAgd2l0aCBweXRlc3QucmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgbGludGVyLnJlcG9ydGVyLnNldF9vdXRwdXQodGV4dCkKKworICAgICAgICBsaW50ZXIub3BlbigpCisgICAgICAgIGxpbnRlci5jaGVja19zaW5nbGVfZmlsZSgic29tZW1vZHVsZSIsIHNvdXJjZV9maWxlLCAic29tZW1vZHVsZSIpCisgICAgICAgIGxpbnRlci5hZGRfbWVzc2FnZSgibGluZS10b28tbG9uZyIsIGxpbmU9MSwgYXJncz0oMSwgMikpCisgICAgICAgIGxpbnRlci5nZW5lcmF0ZV9yZXBvcnRzKCkKKyAgICAgICAgbGludGVyLnJlcG9ydGVyLndyaXRlbG4oImRpcmVjdCBvdXRwdXQiKQorCisgICAgICAgICMgRW5zdXJlIHRoZSBvdXRwdXQgZmlsZXMgYXJlIGZsdXNoZWQgYW5kIGNsb3NlZAorICAgICAgICBsaW50ZXIucmVwb3J0ZXIuY2xvc2Vfb3V0cHV0X2ZpbGVzKCkKKyAgICAgICAgZGVsIGxpbnRlci5yZXBvcnRlcgorCisgICAgd2l0aCBvcGVuKGpzb24pIGFzIGY6CisgICAgICAgIGFzc2VydCAoCisgICAgICAgICAgICBmLnJlYWQoKSA9PSAiW1xuIgorICAgICAgICAgICAgIiAgICB7XG4iCisgICAgICAgICAgICAnICAgICAgICAidHlwZSI6ICJjb252ZW50aW9uIixcbicKKyAgICAgICAgICAgICcgICAgICAgICJtb2R1bGUiOiAic29tZW1vZHVsZSIsXG4nCisgICAgICAgICAgICAnICAgICAgICAib2JqIjogIiIsXG4nCisgICAgICAgICAgICAnICAgICAgICAibGluZSI6IDEsXG4nCisgICAgICAgICAgICAnICAgICAgICAiY29sdW1uIjogMCxcbicKKyAgICAgICAgICAgIGYnICAgICAgICAicGF0aCI6IHtlc2NhcGVkX3NvdXJjZV9maWxlfSxcbicKKyAgICAgICAgICAgICcgICAgICAgICJzeW1ib2wiOiAibWlzc2luZy1tb2R1bGUtZG9jc3RyaW5nIixcbicKKyAgICAgICAgICAgICcgICAgICAgICJtZXNzYWdlIjogIk1pc3NpbmcgbW9kdWxlIGRvY3N0cmluZyIsXG4nCisgICAgICAgICAgICAnICAgICAgICAibWVzc2FnZS1pZCI6ICJDMDExNCJcbicKKyAgICAgICAgICAgICIgICAgfSxcbiIKKyAgICAgICAgICAgICIgICAge1xuIgorICAgICAgICAgICAgJyAgICAgICAgInR5cGUiOiAiY29udmVudGlvbiIsXG4nCisgICAgICAgICAgICAnICAgICAgICAibW9kdWxlIjogInNvbWVtb2R1bGUiLFxuJworICAgICAgICAgICAgJyAgICAgICAgIm9iaiI6ICIiLFxuJworICAgICAgICAgICAgJyAgICAgICAgImxpbmUiOiAxLFxuJworICAgICAgICAgICAgJyAgICAgICAgImNvbHVtbiI6IDAsXG4nCisgICAgICAgICAgICBmJyAgICAgICAgInBhdGgiOiB7ZXNjYXBlZF9zb3VyY2VfZmlsZX0sXG4nCisgICAgICAgICAgICAnICAgICAgICAic3ltYm9sIjogImxpbmUtdG9vLWxvbmciLFxuJworICAgICAgICAgICAgJyAgICAgICAgIm1lc3NhZ2UiOiAiTGluZSB0b28gbG9uZyAoMS8yKSIsXG4nCisgICAgICAgICAgICAnICAgICAgICAibWVzc2FnZS1pZCI6ICJDMDMwMSJcbicKKyAgICAgICAgICAgICIgICAgfVxuIgorICAgICAgICAgICAgIl1cbiIKKyAgICAgICAgICAgICJkaXJlY3Qgb3V0cHV0XG4iCisgICAgICAgICkKKworICAgIGFzc2VydCAoCisgICAgICAgIHRleHQuZ2V0dmFsdWUoKSA9PSAiQSBOb3BSZXBvcnRlciB3YXMgaW5pdGlhbGl6ZWQuXG4iCisgICAgICAgICIqKioqKioqKioqKioqIE1vZHVsZSBzb21lbW9kdWxlXG4iCisgICAgICAgIGYie3NvdXJjZV9maWxlfToxOjA6IEMwMTE0OiBNaXNzaW5nIG1vZHVsZSBkb2NzdHJpbmcgKG1pc3NpbmctbW9kdWxlLWRvY3N0cmluZylcbiIKKyAgICAgICAgZiJ7c291cmNlX2ZpbGV9OjE6MDogQzAzMDE6IExpbmUgdG9vIGxvbmcgKDEvMikgKGxpbmUtdG9vLWxvbmcpXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiUmVwb3J0XG4iCisgICAgICAgICI9PT09PT1cbiIKKyAgICAgICAgIjEgc3RhdGVtZW50cyBhbmFseXNlZC5cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiU3RhdGlzdGljcyBieSB0eXBlXG4iCisgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4iCisgICAgICAgICJ8dHlwZSAgICAgfG51bWJlciB8b2xkIG51bWJlciB8ZGlmZmVyZW5jZSB8JWRvY3VtZW50ZWQgfCViYWRuYW1lIHxcbiIKKyAgICAgICAgIis9PT09PT09PT0rPT09PT09PSs9PT09PT09PT09PSs9PT09PT09PT09PSs9PT09PT09PT09PT0rPT09PT09PT09K1xuIgorICAgICAgICAifG1vZHVsZSAgIHwxICAgICAgfE5DICAgICAgICAgfE5DICAgICAgICAgfDAuMDAgICAgICAgIHwwLjAwICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbiIKKyAgICAgICAgInxjbGFzcyAgICB8MCAgICAgIHxOQyAgICAgICAgIHxOQyAgICAgICAgIHwwICAgICAgICAgICB8MCAgICAgICAgfFxuIgorICAgICAgICAiKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4iCisgICAgICAgICJ8bWV0aG9kICAgfDAgICAgICB8TkMgICAgICAgICB8TkMgICAgICAgICB8MCAgICAgICAgICAgfDAgICAgICAgIHxcbiIKKyAgICAgICAgIistLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuIgorICAgICAgICAifGZ1bmN0aW9uIHwwICAgICAgfE5DICAgICAgICAgfE5DICAgICAgICAgfDAgICAgICAgICAgIHwwICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIlJhdyBtZXRyaWNzXG4iCisgICAgICAgICItLS0tLS0tLS0tLVxuIgorICAgICAgICAiXG4iCisgICAgICAgICIrLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8dHlwZSAgICAgIHxudW1iZXIgfCUgICAgIHxwcmV2aW91cyB8ZGlmZmVyZW5jZSB8XG4iCisgICAgICAgICIrPT09PT09PT09PSs9PT09PT09Kz09PT09PSs9PT09PT09PT0rPT09PT09PT09PT0rXG4iCisgICAgICAgICJ8Y29kZSAgICAgIHwyICAgICAgfDY2LjY3IHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8ZG9jc3RyaW5nIHwwICAgICAgfDAuMDAgIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8Y29tbWVudCAgIHwwICAgICAgfDAuMDAgIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8ZW1wdHkgICAgIHwxICAgICAgfDMzLjMzIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICJEdXBsaWNhdGlvblxuIgorICAgICAgICAiLS0tLS0tLS0tLS1cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLStcbiIKKyAgICAgICAgInwgICAgICAgICAgICAgICAgICAgICAgICAgfG5vdyAgIHxwcmV2aW91cyB8ZGlmZmVyZW5jZSB8XG4iCisgICAgICAgICIrPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT0rPT09PT09PT09Kz09PT09PT09PT09K1xuIgorICAgICAgICAifG5iIGR1cGxpY2F0ZWQgbGluZXMgICAgICB8MCAgICAgfE5DICAgICAgIHxOQyAgICAgICAgIHxcbiIKKyAgICAgICAgIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8cGVyY2VudCBkdXBsaWNhdGVkIGxpbmVzIHwwLjAwMCB8TkMgICAgICAgfE5DICAgICAgICAgfFxuIgorICAgICAgICAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLStcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIk1lc3NhZ2VzIGJ5IGNhdGVnb3J5XG4iCisgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgICAiXG4iCisgICAgICAgICIrLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8dHlwZSAgICAgICB8bnVtYmVyIHxwcmV2aW91cyB8ZGlmZmVyZW5jZSB8XG4iCisgICAgICAgICIrPT09PT09PT09PT0rPT09PT09PSs9PT09PT09PT0rPT09PT09PT09PT0rXG4iCisgICAgICAgICJ8Y29udmVudGlvbiB8MiAgICAgIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8cmVmYWN0b3IgICB8MCAgICAgIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8d2FybmluZyAgICB8MCAgICAgIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJ8ZXJyb3IgICAgICB8MCAgICAgIHxOQyAgICAgICB8TkMgICAgICAgICB8XG4iCisgICAgICAgICIrLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICJNZXNzYWdlc1xuIgorICAgICAgICAiLS0tLS0tLS1cbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuIgorICAgICAgICAifG1lc3NhZ2UgaWQgICAgICAgICAgICAgICB8b2NjdXJyZW5jZXMgfFxuIgorICAgICAgICAiKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09K1xuIgorICAgICAgICAifG1pc3NpbmctbW9kdWxlLWRvY3N0cmluZyB8MSAgICAgICAgICAgfFxuIgorICAgICAgICAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuIgorICAgICAgICAifGxpbmUtdG9vLWxvbmcgICAgICAgICAgICB8MSAgICAgICAgICAgfFxuIgorICAgICAgICAiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuIgorICAgICAgICAiXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgICAgICJZb3VyIGNvZGUgaGFzIGJlZW4gcmF0ZWQgYXQgLTEwLjAwLzEwXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImRpcmVjdCBvdXRwdXRcbiIKKyAgICApCisKKworZGVmIHRlc3RfZGlzcGxheV9yZXN1bHRzX2lzX3JlbmFtZWQoKToKKyAgICBjbGFzcyBDdXN0b21SZXBvcnRlcihUZXh0UmVwb3J0ZXIpOgorICAgICAgICBkZWYgX2Rpc3BsYXkoc2VsZiwgbGF5b3V0KToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICByZXBvcnRlciA9IEN1c3RvbVJlcG9ydGVyKCkKKyAgICB3aXRoIHB5dGVzdC5yYWlzZXMoQXR0cmlidXRlRXJyb3IpIGFzIGV4YzoKKyAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9bm8tbWVtYmVyCisgICAgICAgIHJlcG9ydGVyLmRpc3BsYXlfcmVzdWx0cygpCisgICAgYXNzZXJ0ICJubyBhdHRyaWJ1dGUgJ2Rpc3BsYXlfcmVzdWx0cyciIGluIHN0cihleGMpCmRpZmYgLS1naXQgYS90ZXN0cy91dGlscy9fX2luaXRfXy5weSBiL3Rlc3RzL3V0aWxzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy91dGlscy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvdGVzdHMvdXRpbHMvdW5pdHRlc3RfYXN0X3dhbGtlci5weSBiL3Rlc3RzL3V0aWxzL3VuaXR0ZXN0X2FzdF93YWxrZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmNWI1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3V0aWxzL3VuaXR0ZXN0X2FzdF93YWxrZXIucHkKQEAgLTAsMCArMSw2NyBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMOiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL29sZC1saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyMgRm9yIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9QeUNRQS9weWxpbnQvYmxvYi9tYXN0ZXIvTElDRU5TRQorCitpbXBvcnQgd2FybmluZ3MKKworaW1wb3J0IGFzdHJvaWQKKworZnJvbSBweWxpbnQuY2hlY2tlcnMudXRpbHMgaW1wb3J0IGNoZWNrX21lc3NhZ2VzCitmcm9tIHB5bGludC51dGlscyBpbXBvcnQgQVNUV2Fsa2VyCisKKworY2xhc3MgVGVzdEFTVFdhbGtlcjoKKyAgICBjbGFzcyBNb2NrTGludGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbXNncyk6CisgICAgICAgICAgICBzZWxmLl9tc2dzID0gbXNncworCisgICAgICAgIGRlZiBpc19tZXNzYWdlX2VuYWJsZWQoc2VsZiwgbXNnaWQpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21zZ3MuZ2V0KG1zZ2lkLCBUcnVlKQorCisgICAgY2xhc3MgQ2hlY2tlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBzZXQoKQorCisgICAgICAgIEBjaGVja19tZXNzYWdlcygiZmlyc3QtbWVzc2FnZSIpCisgICAgICAgIGRlZiB2aXNpdF9tb2R1bGUoc2VsZiwgbW9kdWxlKTogICMgcHlsaW50OiBkaXNhYmxlPXVudXNlZC1hcmd1bWVudAorICAgICAgICAgICAgc2VsZi5jYWxsZWQuYWRkKCJtb2R1bGUiKQorCisgICAgICAgIEBjaGVja19tZXNzYWdlcygic2Vjb25kLW1lc3NhZ2UiKQorICAgICAgICBkZWYgdmlzaXRfY2FsbChzZWxmLCBtb2R1bGUpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIEBjaGVja19tZXNzYWdlcygic2Vjb25kLW1lc3NhZ2UiLCAidGhpcmQtbWVzc2FnZSIpCisgICAgICAgIGRlZiB2aXNpdF9hc3NpZ25uYW1lKHNlbGYsIG1vZHVsZSk6ICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKKyAgICAgICAgICAgIHNlbGYuY2FsbGVkLmFkZCgiYXNzaWdubmFtZSIpCisKKyAgICAgICAgQGNoZWNrX21lc3NhZ2VzKCJzZWNvbmQtbWVzc2FnZSIpCisgICAgICAgIGRlZiBsZWF2ZV9hc3NpZ25uYW1lKHNlbGYsIG1vZHVsZSk6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgdGVzdF9jaGVja19tZXNzYWdlcyhzZWxmKToKKyAgICAgICAgbGludGVyID0gc2VsZi5Nb2NrTGludGVyKAorICAgICAgICAgICAgeyJmaXJzdC1tZXNzYWdlIjogVHJ1ZSwgInNlY29uZC1tZXNzYWdlIjogRmFsc2UsICJ0aGlyZC1tZXNzYWdlIjogVHJ1ZX0KKyAgICAgICAgKQorICAgICAgICB3YWxrZXIgPSBBU1RXYWxrZXIobGludGVyKQorICAgICAgICBjaGVja2VyID0gc2VsZi5DaGVja2VyKCkKKyAgICAgICAgd2Fsa2VyLmFkZF9jaGVja2VyKGNoZWNrZXIpCisgICAgICAgIHdhbGtlci53YWxrKGFzdHJvaWQucGFyc2UoInggPSBmdW5jKCkiKSkKKyAgICAgICAgYXNzZXJ0IHsibW9kdWxlIiwgImFzc2lnbm5hbWUifSA9PSBjaGVja2VyLmNhbGxlZAorCisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9tZXRob2RzKHNlbGYpOgorICAgICAgICBjbGFzcyBDaGVja2VyOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKworICAgICAgICAgICAgQGNoZWNrX21lc3NhZ2VzKCJmaXJzdC1tZXNzYWdlIikKKyAgICAgICAgICAgIGRlZiB2aXNpdF9hc3NuYW1lKHNlbGYsIG5vZGUpOiAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWFyZ3VtZW50CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisKKyAgICAgICAgbGludGVyID0gc2VsZi5Nb2NrTGludGVyKHsiZmlyc3QtbWVzc2FnZSI6IFRydWV9KQorICAgICAgICB3YWxrZXIgPSBBU1RXYWxrZXIobGludGVyKQorICAgICAgICBjaGVja2VyID0gQ2hlY2tlcigpCisgICAgICAgIHdhbGtlci5hZGRfY2hlY2tlcihjaGVja2VyKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgIHdhbGtlci53YWxrKGFzdHJvaWQucGFyc2UoInggPSAxIikpCisKKyAgICAgICAgICAgIGFzc2VydCBub3QgY2hlY2tlci5jYWxsZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3V0aWxzL3VuaXR0ZXN0X3V0aWxzLnB5IGIvdGVzdHMvdXRpbHMvdW5pdHRlc3RfdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4NWI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3V0aWxzL3VuaXR0ZXN0X3V0aWxzLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgR29vZ2xlLCBJbmMuCisjIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IExPR0lMQUIgUy5BLiAoUGFyaXMsIEZSQU5DRSkgPGNvbnRhY3RAbG9naWxhYi5mcj4KKyMgQ29weXJpZ2h0IChjKSAyMDE0IEFydW4gUGVyc2F1ZCA8YXJ1bkBudWJhdGkubmV0PgorIyBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCwgMjAyMCBDbGF1ZGl1IFBvcGEgPHBjbWFudGljb3JlQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IEFydSBTYWhuaSA8YXJ1c2FobmlAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTUgSW9uZWwgQ3Jpc3RpYW4gTWFyaWVzIDxjb250YWN0QGlvbmVsbWMucm8+CisjIENvcHlyaWdodCAoYykgMjAxNiBEZXJlayBHdXN0YWZzb24gPGRlZ3VzdGFmQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE2IEdsZW5uIE1hdHRoZXdzIDxnbGVubkBlLWRhZC5uZXQ+CisjIENvcHlyaWdodCAoYykgMjAxNy0yMDE5LCAyMDIxIFBpZXJyZSBTYXNzb3VsYXMgPHBpZXJyZS5zYXNzb3VsYXNAZ21haWwuY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCwgMjAyMCBBbnRob255IFNvdHRpbGUgPGFzb3R0aWxlQHVtaWNoLmVkdT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IHR0ZW5ob2V2ZS1hYSA8dHRlbmhvZXZlQGFwcGFubmllLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE3IMWBdWthc3ogUm9nYWxza2kgPHJvZ2Fsc2tpLjkxQGdtYWlsLmNvbT4KKyMgQ29weXJpZ2h0IChjKSAyMDE5IEFzaGxleSBXaGV0dGVyIDxhc2hsZXlAYXdoZXR0ZXIuY28udWs+CisjIENvcHlyaWdodCAoYykgMjAyMCBQZXRlciBLb2xidXMgPHBldGVyLmtvbGJ1c0BnbWFpbC5jb20+CisjIENvcHlyaWdodCAoYykgMjAyMCBoaXBwbzkxIDxndWlsbGF1bWUucGVpbGxleEBnbWFpbC5jb20+CisKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTDogaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvZ3BsLTIuMC5odG1sCisjIEZvciBkZXRhaWxzOiBodHRwczovL2dpdGh1Yi5jb20vUHlDUUEvcHlsaW50L2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKworaW1wb3J0IGlvCisKK2Zyb20gcHlsaW50LnV0aWxzIGltcG9ydCB1dGlscworCisKK2RlZiB0ZXN0X2RlY29kaW5nX3N0cmVhbV91bmtub3duX2VuY29kaW5nKCk6CisgICAgIiIiZGVjb2Rpbmdfc3RyZWFtIHNob3VsZCBmYWxsIGJhY2sgdG8gKnNvbWUqIGRlY29kaW5nIHdoZW4gZ2l2ZW4gYW4KKyAgICB1bmtub3duIGVuY29kaW5nLgorICAgICIiIgorICAgIGJpbmFyeV9pbyA9IGlvLkJ5dGVzSU8oYiJmb29cbmJhciIpCisgICAgc3RyZWFtID0gdXRpbHMuZGVjb2Rpbmdfc3RyZWFtKGJpbmFyeV9pbywgImdhcmJhZ2UtZW5jb2RpbmciKQorICAgICMgc2hvdWxkIHN0aWxsIGFjdCBsaWtlIGEgU3RyZWFtUmVhZGVyCisgICAgcmV0ID0gc3RyZWFtLnJlYWRsaW5lcygpCisgICAgYXNzZXJ0IHJldCA9PSBbImZvb1xuIiwgImJhciJdCisKKworZGVmIHRlc3RfZGVjb2Rpbmdfc3RyZWFtX2tub3duX2VuY29kaW5nKCk6CisgICAgYmluYXJ5X2lvID0gaW8uQnl0ZXNJTygi4oKsIi5lbmNvZGUoImNwMTI1MiIpKQorICAgIHN0cmVhbSA9IHV0aWxzLmRlY29kaW5nX3N0cmVhbShiaW5hcnlfaW8sICJjcDEyNTIiKQorICAgIGFzc2VydCBzdHJlYW0ucmVhZCgpID09ICLigqwiCmRpZmYgLS1naXQgYS90b3guaW5pIGIvdG94LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDEzZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG94LmluaQpAQCAtMCwwICsxLDg1IEBACitbdG94XQorbWludmVyc2lvbiA9IDIuNAorZW52bGlzdCA9IGZvcm1hdHRpbmcsIHB5MzYsIHB5MzcsIHB5MzgsIHB5MzksIHB5MzEwLCBweXB5LCBiZW5jaG1hcmsKK3NraXBfbWlzc2luZ19pbnRlcnByZXRlcnMgPSB0cnVlCisKK1t0ZXN0ZW52OnB5bGludF0KK2RlcHMgPQorICAgIC1yIHt0b3hpbmlkaXJ9L3JlcXVpcmVtZW50c190ZXN0X21pbi50eHQKKyAgICBwcmUtY29tbWl0fj0yLjEzCitjb21tYW5kcyA9CisgICAgcHJlLWNvbW1pdCBydW4gcHlsaW50IC0tYWxsLWZpbGVzCisKK1t0ZXN0ZW52OmZvcm1hdHRpbmddCitiYXNlcHl0aG9uID0gcHl0aG9uMworZGVwcyA9CisgICAgLXIge3RveGluaWRpcn0vcmVxdWlyZW1lbnRzX3Rlc3RfbWluLnR4dAorICAgIHByZS1jb21taXR+PTIuMTMKK2NvbW1hbmRzID0KKyAgICBwcmUtY29tbWl0IHJ1biAtLWFsbC1maWxlcworCitbdGVzdGVudjpteXB5XQorYmFzZXB5dGhvbiA9IHB5dGhvbjMKK2RlcHMgPQorICAgIHByZS1jb21taXR+PTIuMTMKK2NvbW1hbmRzID0KKyAgICBwcmUtY29tbWl0IHJ1biBteXB5IC0tYWxsLWZpbGVzCisKK1t0ZXN0ZW52XQorc2V0ZW52ID0KKyAgICBDT1ZFUkFHRV9GSUxFID0ge3RveGluaWRpcn0vLmNvdmVyYWdlLntlbnZuYW1lfQorZGVwcyA9CisgICAgLXIge3RveGluaWRpcn0vcmVxdWlyZW1lbnRzX3Rlc3QudHh0Citjb21tYW5kcyA9CisgICAgOyBSdW4gdGVzdHMsIGVuc3VyaW5nIGFsbCBiZW5jaG1hcmsgdGVzdHMgZG8gbm90IHJ1bgorICAgIHB5dGVzdCAtLWJlbmNobWFyay1kaXNhYmxlIHt0b3hpbmlkaXJ9L3Rlc3RzLyB7cG9zYXJnczp9CisKK1t0ZXN0ZW52OnNwZWxsaW5nXQorZGVwcyA9CisgICAgLXIge3RveGluaWRpcn0vcmVxdWlyZW1lbnRzX3Rlc3QudHh0Citjb21tYW5kcyA9CisgICAgcHl0ZXN0IHt0b3hpbmlkaXJ9L3Rlc3RzLyB7cG9zYXJnczp9IC1rIHVuaXR0ZXN0X3NwZWxsaW5nCisKK1t0ZXN0ZW52OmNvdmVyYWdlLWh0bWxdCitzZXRlbnYgPQorICAgIENPVkVSQUdFX0ZJTEUgPSB7dG94aW5pZGlyfS8uY292ZXJhZ2UKK2RlcHMgPQorICAgIC1yIHt0b3hpbmlkaXJ9L3JlcXVpcmVtZW50c190ZXN0LnR4dAorc2tpcF9pbnN0YWxsID0gdHJ1ZQorY29tbWFuZHMgPQorICAgIGNvdmVyYWdlIGNvbWJpbmUKKyAgICBjb3ZlcmFnZSBodG1sIC0taWdub3JlLWVycm9ycyAtLXJjZmlsZT17dG94aW5pZGlyfS8uY292ZXJhZ2VyYworCitbdGVzdGVudjpkb2NzXQorY2hhbmdlZGlyID0gZG9jLworZGVwcyA9CisgICAgLXIge3RveGluaWRpcn0vZG9jL3JlcXVpcmVtZW50cy50eHQKK2NvbW1hbmRzID0KKyAgICBzcGhpbngtYnVpbGQgLVcgLWIgaHRtbCAtZCBfYnVpbGQvZG9jdHJlZXMgLiBfYnVpbGQvaHRtbAorCitbdGVzdGVudjpiZW5jaG1hcmtdCitkZXBzID0KKyAgICAtciB7dG94aW5pZGlyfS9yZXF1aXJlbWVudHNfdGVzdC50eHQKKyAgICBweWdhbAorY29tbWFuZHMgPQorICAgIDsgUnVuIHRoZSBvbmx5IHRoZSBiZW5jaG1hcmsgdGVzdHMsIGdyb3VwaW5nIG91dHB1dCBhbmQgZm9yY2luZyAuanNvbiBvdXRwdXQgc28gd2UKKyAgICA7IGNhbiBjb21wYXJlIGJlbmNobWFyayBydW5zCisgICAgcHl0ZXN0IC0tZXhpdGZpcnN0IFwKKyAgICAtLWZhaWxlZC1maXJzdCBcCisgICAgLS1iZW5jaG1hcmstb25seSBcCisgICAgLS1iZW5jaG1hcmstc2F2ZT1iYXRjaF9maWxlcyBcCisgICAgLS1iZW5jaG1hcmstc2F2ZS1kYXRhIFwKKyAgICAtLWJlbmNobWFyay1hdXRvc2F2ZSB7dG94aW5pZGlyfS90ZXN0cyBcCisgICAgLS1iZW5jaG1hcmstZ3JvdXAtYnk9Imdyb3VwIiBcCisgICAge3Bvc2FyZ3M6fQorCitbdGVzdGVudjpwcm9maWxlX2FnYWluc3RfZXh0ZXJuYWxdCitzZXRlbnYgPQorICAgIFBZVEVTVF9QUk9GSUxFX0VYVEVSTkFMID0gMQorZGVwcyA9CisgICAgLXIge3RveGluaWRpcn0vcmVxdWlyZW1lbnRzX3Rlc3QudHh0CisgICAgZ3Byb2YyZG90Citjb21tYW5kcyA9CisgICAgcHl0ZXN0IC0tZXhpdGZpcnN0IFwKKyAgICAtLXByb2ZpbGUtc3ZnIFwKKyAgICB7dG94aW5pZGlyfS90ZXN0cy9wcm9maWxlL3Rlc3RfcHJvZmlsZV9hZ2FpbnN0X2V4dGVybmFscy5weQo=