From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from lists.gentoo.org ([140.105.134.102] helo=robin.gentoo.org) by nuthatch.gentoo.org with esmtp (Exim 4.43) id 1E3znc-00030K-B0 for garchives@archives.gentoo.org; Sat, 13 Aug 2005 17:28:27 +0000 Received: from robin.gentoo.org (localhost [127.0.0.1]) by robin.gentoo.org (8.13.4/8.13.4) with SMTP id j7DHRJmA032241; Sat, 13 Aug 2005 17:27:19 GMT Received: from zproxy.gmail.com (zproxy.gmail.com [64.233.162.200]) by robin.gentoo.org (8.13.4/8.13.4) with ESMTP id j7DHRH2f015545 for ; Sat, 13 Aug 2005 17:27:18 GMT Received: by zproxy.gmail.com with SMTP id v1so634672nzb for ; Sat, 13 Aug 2005 10:27:25 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:user-agent:x-accept-language:mime-version:to:subject:references:in-reply-to:content-type; b=RW4R/5SZZd+Fpq7I90CuNk44TFwEs7VzQ8SsFtCvK4ULAieOC539e+9HyA4U7rbDtybUYcUaEPaAM+VilQ0XlhsVZzuQ0L+MfoBovDtqCDxref0VKEAPOfAAdlVVL9Ykwa/1e9Apm61Llu/qLzc6D0lazAb61hUu8TAhVPsQm84= Received: by 10.36.221.73 with SMTP id t73mr1533917nzg; Sat, 13 Aug 2005 10:27:25 -0700 (PDT) Received: from ?192.168.1.104? ([24.30.171.44]) by mx.gmail.com with ESMTP id 12sm1088465nzn.2005.08.13.10.27.21; Sat, 13 Aug 2005 10:27:25 -0700 (PDT) Message-ID: <42FE2F3F.7000806@gmail.com> Date: Sat, 13 Aug 2005 10:34:55 -0700 From: Zac Medico User-Agent: Mozilla Thunderbird 1.0.6 (X11/20050804) X-Accept-Language: en-us, en Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-portage-dev@gentoo.org Reply-to: gentoo-portage-dev@lists.gentoo.org MIME-Version: 1.0 To: gentoo-portage-dev@lists.gentoo.org Subject: Re: [gentoo-portage-dev] the refactoring of emerge, continued... (was PATCH: refactor emerge spinner (#102073)) References: <42FADD3A.7020103@gmail.com> <200508112306.20986.jstubbs@gentoo.org> <42FC3163.2080709@gmail.com> In-Reply-To: <42FC3163.2080709@gmail.com> Content-Type: multipart/mixed; boundary="------------060708010309040903070809" X-Archives-Salt: 70b6e7ef-4f5e-4d08-92bd-5775b1736fca X-Archives-Hash: 26f76e326b39d1057f1becf0016c5dbb This is a multi-part message in MIME format. --------------060708010309040903070809 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Zac Medico wrote: > Hello All, > > The use of global scope code should be minimized in order to prevent > confusion and thereby make code more understandable and maintainable. > After some analysis of emerge's global scope code, I am confident that > all of it can be refactored quite easily, with no regressions or changes > in functionality (reorganization only). > > In order to accomplish this goal, I have categorized the global scope > variables by which parts of code depend on them. The variables are > listed in the following table, in the order that they occur in the > source code: > > Variable Name Dependency > ------------------------------------------------------- > spinner search.execute(),depgraph.create() > merged unused > params unused > actions local > options local > shortmapping local > myaction global > myopts global > myfiles global > edebug global > verbosity global > tmpcmdline local > cmdline local > CLEAN_DELAY unmerge() > EMERGE_WARNING_DELAY global > myparams depgraph.create(),depgraph.xcreate() > add local > sub local > > Variables within a given category can be dealt with in a similar > manner. For example, variables with "local" dependency should be > enclosed within a function or method along with the code that depends on > them. Variables with "global" dependency can either remain as global > variables or become instance variables of an object. > > Based on this analysis, I believe that I can quickly create an emerge > refactorization patch for portage-2.1 with no regressions or changes in > functionality (reorganization only). If all (or some) of the portage > developers agree that it is a good idea then I would be happy to create > a patch for all to scrutinize. :-) > > Zac > Okay folks, I've done quite a bit of cleanup and I am pleased with the result. I have created a new class called emerge_cmd that encapsulates all of the previously global variables. All of the global scope code has been moved to the bottom so start down there if you want to see how it works. The new class is also at the bottom. I had to move so many things around that the diff against portage-2.1.0_alpha20050718 is practically useless. Therefore, I have attached the entire emerge source file. Let me emphasize again that it should be 100% equivalent in functionality to the emerge from portage-2.1.0_alpha20050718. If I have overlooked anything during the refactoring it should be easy to fix. I have done some minimal testing and it seems to work well. I would appreciate any feedback. Thanks, Zac --------------060708010309040903070809 Content-Type: text/plain; name="emerge-2.1.0_alpha20050718-refactored" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="emerge-2.1.0_alpha20050718-refactored" IyEvdXNyL2Jpbi9weXRob24gLU8KIyBDb3B5cmlnaHQgMTk5OS0yMDA0IEdlbnRvbyBGb3Vu ZGF0aW9uCiMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSB2MgojICRIZWFkZXI6IC92YXIvY3Zzcm9vdC9nZW50b28tc3Jj L3BvcnRhZ2UvYmluL2VtZXJnZSx2IDEuMzc5IDIwMDUvMDQvMjQgMTI6NDk6MDEganN0dWJi cyBFeHAgJAoKaW1wb3J0IG9zLHN5cwpvcy5lbnZpcm9uWyJQT1JUQUdFX0NBTExFUiJdPSJl bWVyZ2UiCnN5cy5wYXRoID0gWyIvdXNyL2xpYi9wb3J0YWdlL3B5bSJdK3N5cy5wYXRoCgpp bXBvcnQgcG9ydGFnZQppbXBvcnQgcmFuZG9tCgppbXBvcnQgZW1lcmdlaGVscCx4cGFrLHN0 cmluZyxyZSxjb21tYW5kcyx0aW1lLHNodXRpbCx0cmFjZWJhY2ssYXRleGl0LHNpZ25hbCxz b2NrZXQsdHlwZXMKZnJvbSBzdGF0IGltcG9ydCAqCmZyb20gb3V0cHV0IGltcG9ydCAqCgpp bXBvcnQgcG9ydGFnZV91dGlsCmltcG9ydCBwb3J0YWdlX2xvY2tzCmltcG9ydCBwb3J0YWdl X2V4Y2VwdGlvbgppbXBvcnQgcG9ydGFnZV9leGVjLCBzeW5jCmZyb20gcG9ydGFnZV9kZXAg aW1wb3J0IERlcGVuZGVuY3lHcmFwaAppbXBvcnQgcG9ydGFnZV9kZXAsIHBvcnRhZ2VfdmVy c2lvbnMKCmRlZiBlbWVyZ2VleGl0c2lnKHNpZ251bSwgZnJhbWUpOgoJc2lnbmFsLnNpZ25h bChzaWduYWwuU0lHSU5ULCBzaWduYWwuU0lHX0lHTikKCXBvcnRhZ2UucG9ydGFnZWV4aXQo KQoJcG9ydGFnZV91dGlsLndyaXRlbXNnKCJcblxuRXhpdGluZyBvbiBzaWduYWwgJShzaWdu YWwpc1xuIiAlIHsic2lnbmFsIjpzaWdudW19KQoJc3lzLmV4aXQoMTAwK3NpZ251bSkKc2ln bmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBlbWVyZ2VleGl0c2lnKQoKZGVmIGVtZXJnZWxv ZyhlZGVidWcsbXlzdHIsc2hvcnRfbXNnPU5vbmUpOgoJaWYgIm5vdGl0bGVzIiBub3QgaW4g cG9ydGFnZS5mZWF0dXJlczoKCQlpZiBzaG9ydF9tc2c6CgkJCXh0ZXJtVGl0bGUoc2hvcnRf bXNnKQoJCWVsc2U6CgkJCXh0ZXJtVGl0bGUobXlzdHIpCgl0cnk6CgkJI3NlZW1zIG9kZCBv cGVuaW5nIGEgZmlsZSBlYWNoIHdyaXRlLi4uCgkJaWYgbm90IG9zLnBhdGguZXhpc3RzKCIv dmFyL2xvZy9lbWVyZ2UubG9nIik6CgkJCW15bG9nZmlsZT1vcGVuKCIvdmFyL2xvZy9lbWVy Z2UubG9nIiwgInciKQoJCQlvcy5jaG1vZCgiL3Zhci9sb2cvZW1lcmdlLmxvZyIsIFNfSVJV U1J8U19JV1VTUnxTX0lSR1JQfFNfSVdHUlApCgkJCW9zLmNob3duKCIvdmFyL2xvZy9lbWVy Z2UubG9nIiwgcG9ydGFnZS5wb3J0YWdlX3VpZCwgcG9ydGFnZS5wb3J0YWdlX2dpZCkKCQll bHNlOgoJCQlteWxvZ2ZpbGU9b3BlbigiL3Zhci9sb2cvZW1lcmdlLmxvZyIsICJhIikKCgkJ bD1wb3J0YWdlX2xvY2tzLmxvY2tmaWxlKG15bG9nZmlsZSkKCQkjIHNlZWsgYmVjYXVzZSB3 ZSBtYXkgaGF2ZSBnb3R0ZW4gaGVsZCB1cCBieSB0aGUgbG9jay4KCQkjIGlmIHNvLCB3ZSBt YXkgbm90IGJlIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KCQlteWxvZ2Zp bGUuc2VlaygwLDIpCgkJbXlsb2dmaWxlLndyaXRlKHN0cih0aW1lLnRpbWUoKSlbOjEwXSsi OiAiK215c3RyKyJcbiIpCgkJbXlsb2dmaWxlLmZsdXNoKCkKCQlwb3J0YWdlX2xvY2tzLnVu bG9ja2ZpbGUobCkKCQlteWxvZ2ZpbGUuY2xvc2UoKQoJZXhjZXB0IFN5c3RlbUV4aXQsIGU6 CgkJcmFpc2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBleGl0CglleGNlcHQgRXhjZXB0aW9uLCBl OgoJCWlmIGVkZWJ1ZzoKCQkJcHJpbnQgImVtZXJnZWxvZygpOiIsZQoJCXBhc3MKCgpjbGFz cyBzdGRvdXRfc3Bpbm5lcjoKCQoJZGVmIF9faW5pdF9fKHNlbGYpOgoJCXNwaW5uZXJfbXNn cyA9IFsiR2VudG9vIFJvY2tzICgiK29zLnVuYW1lKClbMF0rIikiLAoJCSAgICAgICAgICAg ICAgICAiVGhhbmsgeW91IGZvciB1c2luZyBHZW50b28uIDopIiwKCQkgICAgICAgICAgICAg ICAgIkFyZSB5b3UgYWN0dWFsbHkgdHJ5aW5nIHRvIHJlYWQgdGhpcz8iLAoJCSAgICAgICAg ICAgICAgICAiSG93IG1hbnkgdGltZXMgaGF2ZSB5b3Ugc3RhcmVkIGF0IHRoaXM/IiwKCQkg ICAgICAgICAgICAgICAgIldlIGFyZSBnZW5lcmF0aW5nIHRoZSBjYWNoZSByaWdodCBub3ci LAoJCSAgICAgICAgICAgICAgICAiWW91IGFyZSBwYXlpbmcgdG9vIG11Y2ggYXR0ZW50aW9u LiIsCgkJICAgICAgICAgICAgICAgICJBIHRoZW9yeSBpcyBiZXR0ZXIgdGhhbiBpdHMgZXhw bGFuYXRpb24uIiwKCQkgICAgICAgICAgICAgICAgIlBoYXNlcnMgbG9ja2VkIG9uIHRhcmdl dCwgQ2FwdGFpbi4iLAoJCSAgICAgICAgICAgICAgICAiVGhyYXNoaW5nIGlzIGp1c3Qgdmly dHVhbCBjcmFzaGluZy4iLAoJCSAgICAgICAgICAgICAgICAiVG8gYmUgaXMgdG8gcHJvZ3Jh bS4iLAoJCSAgICAgICAgICAgICAgICAiUmVhbCBVc2VycyBoYXRlIFJlYWwgUHJvZ3JhbW1l cnMuIiwKCQkgICAgICAgICAgICAgICAgIldoZW4gYWxsIGVsc2UgZmFpbHMsIHJlYWQgdGhl IGluc3RydWN0aW9ucy4iLAoJCSAgICAgICAgICAgICAgICAiRnVuY3Rpb25hbGl0eSBicmVl ZHMgQ29udGVtcHQuIiwKCQkgICAgICAgICAgICAgICAgIlRoZSBmdXR1cmUgbGllcyBhaGVh ZC4iLAoJCSAgICAgICAgICAgICAgICAiMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMy Nzk1MDI4ODQxOTcxNjk0IiwKCQkgICAgICAgICAgICAgICAgIlNvbWV0aW1lcyBpbnNhbml0 eSBpcyB0aGUgb25seSBhbHRlcm5hdGl2ZS4iLAoJCSAgICAgICAgICAgICAgICAiSW5hY2N1 cmFjeSBzYXZlcyBhIHdvcmxkIG9mIGV4cGxhbmF0aW9uLiIsCgkJICAgICAgICAgICAgICAg XQoJCQoJCXNlbGYuc3BpbnBvcyA9IDAKCQlzZWxmLnNwaW5uZXIgPSAiLy1cXHwvLVxcfC8t XFx8Ly1cXHxcXC0vfFxcLS98XFwtL3xcXC0vfCIKCQlzZWxmLnVwZGF0ZV9zcGlubmVyID0g c2VsZi51cGRhdGVfdHdpcmxfc3Bpbm5lcgoJCQoJCWlmICJjYW5keSIgaW4gcG9ydGFnZS5z ZXR0aW5ncy5mZWF0dXJlczoKCQkJc2VsZi5zcGlubmVyID0gc3Bpbm5lcl9tc2dzW2ludCh0 aW1lLnRpbWUoKSoxMDApJWxlbihzcGlubmVyX21zZ3MpXQoJCQlzZWxmLnVwZGF0ZV9zcGlu bmVyID0gc2VsZi51cGRhdGVfc2Nyb2xsX3NwaW5uZXIKCglkZWYgdXBkYXRlX2Jhc2ljX3Nw aW5uZXIoc2VsZik6CgkJc2VsZi5zcGlucG9zID0gKHNlbGYuc3BpbnBvcysxKSAlIDUwMAoJ CWlmIChzZWxmLnNwaW5wb3MgJSAxMDApID09IDA6CgkJCWlmIHNlbGYuc3BpbnBvcyA9PSAw OgoJCQkJc3lzLnN0ZG91dC53cml0ZSgiLiAiKQoJCQllbHNlOgoJCQkJc3lzLnN0ZG91dC53 cml0ZSgiLiIpCgkJc3lzLnN0ZG91dC5mbHVzaCgpCgkKCWRlZiB1cGRhdGVfc2Nyb2xsX3Nw aW5uZXIoc2VsZik6CgkJCWlmKHNlbGYuc3BpbnBvcyA+PSBsZW4oc2VsZi5zcGlubmVyKSk6 CgkJCQlzeXMuc3Rkb3V0LndyaXRlKGRhcmtncmVlbigiIFxiXGJcYiIrc2VsZi5zcGlubmVy W2xlbihzZWxmLnNwaW5uZXIpLTEtKHNlbGYuc3BpbnBvcyVsZW4oc2VsZi5zcGlubmVyKSld KSkKCQkJZWxzZToKCQkJCXN5cy5zdGRvdXQud3JpdGUoZ3JlZW4oIlxiICIrc2VsZi5zcGlu bmVyW3NlbGYuc3BpbnBvc10pKQoJCQlzeXMuc3Rkb3V0LmZsdXNoKCkKCQkJc2VsZi5zcGlu cG9zID0gKHNlbGYuc3BpbnBvcysxKSAlICgyKmxlbihzZWxmLnNwaW5uZXIpKQoJCglkZWYg dXBkYXRlX3R3aXJsX3NwaW5uZXIoc2VsZik6CgkJc2VsZi5zcGlucG9zID0gKHNlbGYuc3Bp bnBvcysxKSAlIGxlbihzZWxmLnNwaW5uZXIpCgkJc3lzLnN0ZG91dC53cml0ZSgiXGJcYiAi K3NlbGYuc3Bpbm5lcltzZWxmLnNwaW5wb3NdKQoJCXN5cy5zdGRvdXQuZmx1c2goKQoKZGVm IG5vcm1wYXRoKG15c3RyKToKCWlmIG15c3RyIGFuZCAobXlzdHJbMF09PScvJyk6CgkJcmV0 dXJuIG9zLnBhdGgubm9ybXBhdGgoIi8vLyIrbXlzdHIpCgllbHNlOgoJCXJldHVybiBvcy5w YXRoLm5vcm1wYXRoKG15c3RyKQoKZGVmIHVzZXJxdWVyeShwcm9tcHQsIHJlc3BvbnNlcz1O b25lLCBjb2xvdXJzPU5vbmUpOgoJIiIiRGlzcGxheXMgYSBwcm9tcHQgYW5kIGEgc2V0IG9m IHJlc3BvbnNlcywgdGhlbiB3YWl0cyBmb3IgYSByZXNwb25zZQoJd2hpY2ggaXMgY2hlY2tl ZCBhZ2FpbnN0IHRoZSByZXNwb25zZXMgYW5kIHRoZSBmaXJzdCB0byBtYXRjaCBpcyAKCXJl dHVybmVkLgoJCglwcm9tcHQ6IGEgU3RyaW5nLgoJcmVzcG9uc2VzOiBhIExpc3Qgb2YgU3Ry aW5ncy4KCWNvbG91cnM6IGEgTGlzdCBvZiBGdW5jdGlvbnMgdGFraW5nIGFuZCByZXR1cm5p bmcgYSBTdHJpbmcsIHVzZWQgdG8gCglwcm9jZXNzIHRoZSByZXNwb25zZXMgZm9yIGRpc3Bs YXkuIFR5cGljYWxseSB0aGVzZSB3aWxsIGJlIGZ1bmN0aW9ucyAKCWxpa2UgcmVkKCkgYnV0 IGNvdWxkIGJlIGUuZy4gbGFtYmRhIHg6ICJEaXNwbGF5U3RyaW5nIi4KCUlmIHJlc3BvbnNl cyBpcyBvbWl0dGVkLCBkZWZhdWx0cyB0byBbIlllcyIsICJObyJdLCBbZ3JlZW4sIHJlZF0u CglJZiBvbmx5IGNvbG91cnMgaXMgb21pdHRlZCwgZGVmYXVsdHMgdG8gW2JvbGQsIC4uLl0u CgoJUmV0dXJucyBhIG1lbWJlciBvZiB0aGUgTGlzdCByZXNwb25zZXMuIChJZiBjYWxsZWQg d2l0aG91dCBvcHRpb25hbAoJYXJndW1lbnRzLCByZXR1cm5zICJZZXMiIG9yICJObyIuKQoJ S2V5Ym9hcmRJbnRlcnJ1cHQgaXMgY29udmVydGVkIHRvIFN5c3RlbUV4aXQgdG8gYXZvaWQg dHJhY2ViYWNrcyBiZWluZyAKCXByaW50ZWQuIiIiCglpZiByZXNwb25zZXMgaXMgTm9uZToK CQlyZXNwb25zZXMsIGNvbG91cnMgPSBbIlllcyIsICJObyJdLCBbZ3JlZW4sIHJlZF0KCWVs aWYgY29sb3VycyBpcyBOb25lOgoJCWNvbG91cnM9W2JvbGRdCgljb2xvdXJzPShjb2xvdXJz KmxlbihyZXNwb25zZXMpKVs6bGVuKHJlc3BvbnNlcyldCglwcmludCBib2xkKHByb21wdCks Cgl0cnk6CgkJd2hpbGUgVHJ1ZToKCQkJcmVzcG9uc2U9cmF3X2lucHV0KCJbIisiLyIuam9p bihbY29sb3VyKHJlc3BvbnNlKSBmb3IgY29sb3VyLHJlc3BvbnNlIGluIHppcChjb2xvdXJz LHJlc3BvbnNlcyldKSsiXSAiKQoJCQlmb3Iga2V5IGluIHJlc3BvbnNlczoKCQkJCWlmIHJl c3BvbnNlLnVwcGVyKCk9PWtleVs6bGVuKHJlc3BvbnNlKV0udXBwZXIoKToKCQkJCQlyZXR1 cm4ga2V5CgkJCXByaW50ICJTb3JyeSwgcmVzcG9uc2UgJyVzJyBub3QgdW5kZXJzdG9vZC4i ICUgcmVzcG9uc2UsCglleGNlcHQgKEVPRkVycm9yLCBLZXlib2FyZEludGVycnVwdCk6CgkJ cHJpbnQgIkludGVycnVwdGVkLiIKCQlzeXMuZXhpdCgxKQoKZGVmIGNvdW50ZG93bihzZWNz PTUsIGRvaW5nPSJTdGFydGluZyIpOgoJaWYgc2VjczoKCQlwcmludCAiPj4+IFdhaXRpbmci LHNlY3MsInNlY29uZHMgYmVmb3JlIHN0YXJ0aW5nLi4uIgoJCXByaW50ICI+Pj4gKENvbnRy b2wtQyB0byBhYm9ydCkuLi5cbiIrZG9pbmcrIiBpbjogIiwKCQl0aWNrcz1yYW5nZShzZWNz KQoJCXRpY2tzLnJldmVyc2UoKQoJCWZvciBzZWMgaW4gdGlja3M6CgkJCXN5cy5zdGRvdXQu d3JpdGUocmVkKHN0cihzZWMrMSkrIiAiKSkKCQkJc3lzLnN0ZG91dC5mbHVzaCgpCgkJCXRp bWUuc2xlZXAoMSkKCQlwcmludAoKIyBmb3JtYXRzIGEgc2l6ZSBnaXZlbiBpbiBieXRlcyBu aWNlbHkKZGVmIGZvcm1hdF9zaXplKG15c2l6ZSk6CglpZiB0eXBlKG15c2l6ZSkgbm90IGlu IFt0eXBlcy5JbnRUeXBlLHR5cGVzLkxvbmdUeXBlXToKCQlyZXR1cm4gc3RyKG15c2l6ZSkK CW15c3RyPXN0cihteXNpemUvMTAyNCkKCW15Y291bnQ9bGVuKG15c3RyKQoJd2hpbGUgKG15 Y291bnQgPiAzKToKCQlteWNvdW50LT0zCgkJbXlzdHI9bXlzdHJbOm15Y291bnRdKyIsIitt eXN0cltteWNvdW50Ol0KCXJldHVybiBteXN0cisiIGtCIgoKCmRlZiBnZXRnY2N2ZXJzaW9u KCk6CgkiIiIKCXJ0eXBlOiBDe3N0cn0KCXJldHVybjogIHRoZSBjdXJyZW50IGluLXVzZSBn Y2MgdmVyc2lvbgoJIiIiCgoJZ2NjX2Vudl9kaXIgPSBvcy5wYXRoLmpvaW4oJy8nLCAnZXRj JywgJ2Vudi5kJywgJ2djYycpCglnY2NfY29uZmlnX2NvbmZpZyA9IG9zLnBhdGguam9pbihn Y2NfZW52X2RpciwgJ2NvbmZpZycpCglnY2NfdmVyX2NvbW1hbmQgPSAnZ2NjIC1kdW1wdmVy c2lvbicKCWdjY192ZXJfcHJlZml4ID0gJ2djYy0nCgoJZ2NjX25vdF9mb3VuZF9lcnJvciA9 IHJlZCgKCSIhISEgTm8gZ2NjIGZvdW5kLiBZb3UgcHJvYmFibHkgbmVlZCB0byAnc291cmNl IC9ldGMvcHJvZmlsZSdcbiIgKwoJIiEhISB0byB1cGRhdGUgdGhlIGVudmlyb25tZW50IG9m IHRoaXMgdGVybWluYWwgYW5kIHBvc3NpYmx5XG4iICsKCSIhISEgb3RoZXIgdGVybWluYWxz IGFsc28uIgoJKQoKCWdjY19kaXN0Y2NfYnJva2VuX2Vycm9yID0gZ3JlZW4oCgknISEhIFJl bHlpbmcgb24gdGhlIHNoZWxsIHRvIGxvY2F0ZSBnY2MsIHRoaXMgbWF5IGJyZWFrXG4nICsK CSchISEgRElTVENDLCBpbnN0YWxsaW5nIGdjYy1jb25maWcgYW5kIHNldHRpbmcgeW91ciBj dXJyZW50IGdjY1xuJyArCgknISEhIHByb2ZpbGUgd2lsbCBmaXggdGhpcycKCSkKCglkZWYg ZmFsbGJhY2soKToKCgkJcHJpbnQgPj5zeXMuc3RkZXJyLCBnY2NfZGlzdGNjX2Jyb2tlbl9l cnJvciAKCgkJZ2Njb3V0ID0gcG9ydGFnZV9leGVjLnNwYXduX2dldF9vdXRwdXQoZ2NjX3Zl cl9jb21tYW5kKQoKCQlpZiBnY2NvdXRbMF0gIT0gMDoKCQkJcHJpbnQgPj5zeXMuc3RkZXJy LCBnY2Nfbm90X2ZvdW5kX2Vycm9yCgkJCWdjY3ZlciA9ICJbdW5hdmFpbGFibGVdIgoJCWVs c2U6CgkJCWdjY3ZlciA9IGdjY192ZXJfcHJlZml4ICsgZ2Njb3V0WzFdCgoJCXJldHVybiBn Y2N2ZXIKCSAgIAoJaWYgb3MucGF0aC5pc2ZpbGUoZ2NjX2NvbmZpZ19jb25maWcpOgoJCXRy eToKCQkJZ2NjdmVyX3N0ciA9IG9wZW4oZ2NjX2NvbmZpZ19jb25maWcpLnJlYWQoKS5zdHJp cCgpCgkJCWdjY3ZlciA9IGdjY192ZXJfcHJlZml4ICsgc3RyaW5nLmpvaW4oZ2NjdmVyX3N0 ci5zcGxpdCgnLScpWzQ6XSwgJy0nKQoJCWV4Y2VwdCBJbmRleEVycm9yOgoJCQlnY2N2ZXIg PSBmYWxsYmFjaygpCgoJZWxzZToKCQlpbXBvcnQgZ2xvYgoJCWRpcl9sID0gZ2xvYi5nbG9i KG9zLnBhdGguam9pbihnY2NfZW52X2RpciwgJyotKicpKQoKCQlpZiBsZW4oZGlyX2wpID09 IDE6CgkJCXRyeTogCgkJCQlnY2N2ZXIgPSBnY2NfdmVyX3ByZWZpeCArIGRpcl9sWzBdLnNw bGl0KCctJylbLTFdCgkJCWV4Y2VwdCBJbmRleEVycm9yOgoJCQkJZ2NjdmVyID0gZmFsbGJh Y2soKQoJCQkKCQllbHNlOgoJCQkjIFRoZXJlIHdhcyBubyAiY29uZmlnIiBmaWxlIGluIC9l dGMvZW52LmQvZ2NjIGFuZCB0aGVyZSB3YXMgbW9yZQoJCQkjIHRoYW4gb25lIHByb2ZpbGUg aW4gL2V0Yy9lbnYuZC9nY2Mgc28gd2UgY2FuJ3QgYWN0aXZlbHkKCQkJIyBkZXRlcm1pbmUg d2hhdCB2ZXJzaW9uIG9mIGdjYyB3ZSBhcmUgdXNpbmcgc28gd2UgZmFsbCBiYWNrIG9uIHRo ZQoJCQkjIG9sZCB3YXkgdGhhdCBicmVha3MgZGlzdGNjCgoJCQlnY2N2ZXIgPSBmYWxsYmFj aygpCgoJcmV0dXJuIGdjY3ZlcgoKZGVmIGdldHBvcnRhZ2V2ZXJzaW9uKCk6Cgl0cnk6CgkJ aW1wb3J0IHJlCgkJcHJvZmlsZXZlciA9IG9zLnBhdGgubm9ybXBhdGgoIi8vLyIrb3MucmVh ZGxpbmsoIi9ldGMvbWFrZS5wcm9maWxlIikpCgkJYmFzZXBhdGggICA9IG9zLnBhdGgubm9y bXBhdGgoIi8vLyIrcG9ydGFnZS5zZXR0aW5nc1siUE9SVERJUiJdKyIvcHJvZmlsZXMiKQoJ CWlmIHJlLm1hdGNoKGJhc2VwYXRoLHByb2ZpbGV2ZXIpOgoJCQlwcm9maWxldmVyID0gcHJv ZmlsZXZlcltsZW4oYmFzZXBhdGgpKzE6XQoJCWVsc2U6CgkJCXByb2ZpbGV2ZXIgPSAiISIr cHJvZmlsZXZlcgoJCWRlbCBiYXNlcGF0aAoJZXhjZXB0IFN5c3RlbUV4aXQsIGU6CgkJcmFp c2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBleGl0CglleGNlcHQ6CgkJcHJvZmlsZXZlcj0idW5h dmFpbGFibGUiCglsaWJjdmVyPVtdCglsaWJjbGlzdCAgPSBwb3J0YWdlLnZhcmRiYXBpKHBv cnRhZ2Uucm9vdCkubWF0Y2goInZpcnR1YWwvbGliYyIpCglsaWJjbGlzdCArPSBwb3J0YWdl LnZhcmRiYXBpKHBvcnRhZ2Uucm9vdCkubWF0Y2goInZpcnR1YWwvZ2xpYmMiKQoJbGliY2xp c3QgID0gcG9ydGFnZV91dGlsLnVuaXF1ZV9hcnJheShsaWJjbGlzdCkKCWZvciB4IGluIGxp YmNsaXN0OgoJCXhzPXBvcnRhZ2VfdmVyc2lvbnMuY2F0cGtnc3BsaXQoeCkKCQlpZiBsaWJj dmVyOgoJCQlsaWJjdmVyKz0iLCIrIi0iLmpvaW4oeHNbMTpdKQoJCWVsc2U6CgkJCWxpYmN2 ZXI9Ii0iLmpvaW4oeHNbMTpdKQoJaWYgbGliY3Zlcj09W106CgkJbGliY3Zlcj0idW5hdmFp bGFibGUiCgoJZ2NjdmVyID0gZ2V0Z2NjdmVyc2lvbigpCgl1bmFtZW91dD1vcy51bmFtZSgp WzJdKyIgIitvcy51bmFtZSgpWzRdCgoJcmV0dXJuICJQb3J0YWdlICIgKyBwb3J0YWdlLlZF UlNJT04gKyIgKCIrcHJvZmlsZXZlcisiLCAiK2djY3ZlcisiLCAiK2xpYmN2ZXIrIiwgIit1 bmFtZW91dCsiKSIKCiMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkKY2xhc3Mgc2VhcmNoOgoJCgkj CgkjIGNsYXNzIGNvbnN0YW50cwoJIwoJVkVSU0lPTl9TSE9SVD0xCglWRVJTSU9OX1JFTEVB U0U9MgoJCgkjCgkjIHB1YmxpYyBpbnRlcmZhY2UKCSMKCWRlZiBfX2luaXRfXyhzZWxmLG15 b3B0cyxlZGVidWcsdmVyYm9zaXR5LHNwaW5uZXIpOgoJCSIiIlNlYXJjaGVzIHRoZSBhdmFp bGFibGUgYW5kIGluc3RhbGxlZCBwYWNrYWdlcyBmb3IgdGhlIHN1cHBsaWVkIHNlYXJjaCBr ZXkuCgkJVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGFuZCBpbnN0YWxsZWQgcGFja2FnZXMgaXMg Y3JlYXRlZCBhdCBvYmplY3QgaW5zdGFudGlhdGlvbi4KCQlUaGlzIG1ha2VzIHN1Y2Nlc3Np dmUgc2VhcmNoZXMgZmFzdGVyLiIiIgoJCXNlbGYuaW5zdGFsbGNhY2hlID0gcG9ydGFnZS5k YlsiLyJdWyJ2YXJ0cmVlIl0KCQlzZWxmLm15b3B0cz1teW9wdHMKCQlzZWxmLmVkZWJ1Zz1l ZGVidWcKCQlzZWxmLnZlcmJvc2l0eT12ZXJib3NpdHkKCQlzZWxmLnNwaW5uZXI9c3Bpbm5l cgoJCQoJZGVmIGV4ZWN1dGUoc2VsZixzZWFyY2hrZXkpOgoJCSIiIlBlcmZvcm1zIHRoZSBz ZWFyY2ggZm9yIHRoZSBzdXBwbGllZCBzZWFyY2gga2V5IiIiCgkJbWF0Y2hfY2F0ZWdvcnkg PSAwCgkJc2VsZi5zZWFyY2hrZXk9c2VhcmNoa2V5CgkJc2VsZi5wYWNrYWdlbWF0Y2hlcyA9 IFtdCgkJaWYgIi0tc2VhcmNoZGVzYyIgaW4gc2VsZi5teW9wdHM6CgkJCXNlbGYuc2VhcmNo ZGVzYz0xCgkJCXNlbGYubWF0Y2hlcyA9IHsicGtnIjpbXSwgImRlc2MiOltdfQoJCWVsc2U6 CgkJCXNlbGYuc2VhcmNoZGVzYz0wCgkJCXNlbGYubWF0Y2hlcyA9IHsicGtnIjpbXX0KCQlw cmludCAiU2VhcmNoaW5nLi4uICAgIiwKCgkJaWYgc2VsZi5zZWFyY2hrZXlbMF0gPT0gJ0An OgoJCQltYXRjaF9jYXRlZ29yeSA9IDEKCQkJc2VsZi5zZWFyY2hrZXkgPSBzZWxmLnNlYXJj aGtleVsxOl0KCQlpZiBzZWxmLnNlYXJjaGtleT09IioiOgoJCQkjaGFjayBmb3IgcGVvcGxl IHdobyBhcmVuJ3QgcmVndWxhciBleHByZXNzaW9uIGd1cnVzCgkJCXNlbGYuc2VhcmNoa2V5 PT0iLioiCgkJaWYgcmUuc2VhcmNoKCJcK1wrIiwgc2VsZi5zZWFyY2hrZXkpOgoJCQkjaGFj ayBmb3IgcGVvcGxlIHdobyBhcmVuJ3QgcmVndWxhciBleHByZXNzaW9uIGd1cnVzCgkJCXNl bGYuc2VhcmNoa2V5PXJlLnN1YigiXCtcKyIsIlwrXCsiLHNlbGYuc2VhcmNoa2V5KQoJCXNl bGYuc2VhcmNocmU9cmUuY29tcGlsZShzZWxmLnNlYXJjaGtleS5sb3dlcigpLHJlLkkpCgkJ Zm9yIHBhY2thZ2UgaW4gcG9ydGFnZS5wb3J0ZGIuY3BfYWxsKCk6CgkJCXNlbGYuc3Bpbm5l ci51cGRhdGVfc3Bpbm5lcigpCgkJCQoJCQlpZiBtYXRjaF9jYXRlZ29yeToKCQkJCW1hdGNo X3N0cmluZyAgPSBwYWNrYWdlWzpdCgkJCWVsc2U6CgkJCQltYXRjaF9zdHJpbmcgID0gcGFj a2FnZS5zcGxpdCgiLyIpWy0xXQoJCQkKCQkJbWFza2VkPTAKCQkJaWYgc2VsZi5zZWFyY2hy ZS5zZWFyY2gobWF0Y2hfc3RyaW5nKToKCQkJCWlmIG5vdCBwb3J0YWdlLnBvcnRkYi54bWF0 Y2goIm1hdGNoLXZpc2libGUiLHBhY2thZ2UpOgoJCQkJCW1hc2tlZD0xCgkJCQlzZWxmLm1h dGNoZXNbInBrZyJdLmFwcGVuZChbcGFja2FnZSxtYXNrZWRdKQoJCQllbGlmIHNlbGYuc2Vh cmNoZGVzYzogIyBERVNDUklQVElPTiBzZWFyY2hpbmcKCQkJCWZ1bGxfcGFja2FnZSA9IHBv cnRhZ2UucG9ydGRiLnhtYXRjaCgiYmVzdG1hdGNoLXZpc2libGUiLHBhY2thZ2UpCgkJCQlp ZiBub3QgZnVsbF9wYWNrYWdlOgoJCQkJCSNubyBtYXRjaCBmb3VuZDsgd2UgZG9uJ3Qgd2Fu dCB0byBxdWVyeSBkZXNjcmlwdGlvbgoJCQkJCWZ1bGxfcGFja2FnZT1wb3J0YWdlLmJlc3Qo cG9ydGFnZS5wb3J0ZGIueG1hdGNoKCJtYXRjaC1hbGwiLHBhY2thZ2UpKQoJCQkJCWlmIG5v dCBmdWxsX3BhY2thZ2U6CgkJCQkJCWNvbnRpbnVlCgkJCQkJZWxzZToKCQkJCQkJbWFza2Vk PTEKCQkJCXRyeToKCQkJCQlmdWxsX2Rlc2MgPSBwb3J0YWdlLnBvcnRkYi5hdXhfZ2V0KGZ1 bGxfcGFja2FnZSxbIkRFU0NSSVBUSU9OIl0pWzBdCgkJCQlleGNlcHQgS2V5RXJyb3I6CgkJ CQkJcHJpbnQgImVtZXJnZTogc2VhcmNoOiBhdXhfZ2V0KCkgZmFpbGVkLCBza2lwcGluZyIK CQkJCQljb250aW51ZQoJCQkJaWYgc2VsZi5zZWFyY2hyZS5zZWFyY2goZnVsbF9kZXNjKToK CQkJCQlzZWxmLm1hdGNoZXNbImRlc2MiXS5hcHBlbmQoW2Z1bGxfcGFja2FnZSxtYXNrZWRd KQoJCXNlbGYubWxlbj0wCgkJZm9yIG10eXBlIGluIHNlbGYubWF0Y2hlcy5rZXlzKCk6CgkJ CXNlbGYubWF0Y2hlc1ttdHlwZV0uc29ydCgpCgkJCXNlbGYubWxlbiArPSBsZW4oc2VsZi5t YXRjaGVzW210eXBlXSkJCgoJZGVmIG91dHB1dChzZWxmKToKCQkiIiJPdXRwdXRzIHRoZSBy ZXN1bHRzIG9mIHRoZSBzZWFyY2guIiIiCgkJcHJpbnQgIlxiXGIgIFxuWyBSZXN1bHRzIGZv ciBzZWFyY2gga2V5IDogIit3aGl0ZShzZWxmLnNlYXJjaGtleSkrIiBdIgoJCXByaW50ICJb IEFwcGxpY2F0aW9ucyBmb3VuZCA6ICIrd2hpdGUoc3RyKHNlbGYubWxlbikpKyIgXSIKCQlw cmludCAiICIKCQlmb3IgbXR5cGUgaW4gc2VsZi5tYXRjaGVzLmtleXMoKToJCgkJCWZvciBt YXRjaCxtYXNrZWQgaW4gc2VsZi5tYXRjaGVzW210eXBlXToKCQkJCWlmIG10eXBlPT0icGtn IjoKCQkJCQljYXRwYWNrPW1hdGNoCgkJCQkJZnVsbF9wYWNrYWdlID0gcG9ydGFnZS5wb3J0 ZGIueG1hdGNoKCJiZXN0bWF0Y2gtdmlzaWJsZSIsbWF0Y2gpCgkJCQkJaWYgbm90IGZ1bGxf cGFja2FnZToKCQkJCQkJI25vIG1hdGNoIGZvdW5kOyB3ZSBkb24ndCB3YW50IHRvIHF1ZXJ5 IGRlc2NyaXB0aW9uCgkJCQkJCW1hc2tlZD0xCgkJCQkJCWZ1bGxfcGFja2FnZT1wb3J0YWdl LmJlc3QocG9ydGFnZS5wb3J0ZGIueG1hdGNoKCJtYXRjaC1hbGwiLG1hdGNoKSkKCQkJCWVs c2U6CgkJCQkJZnVsbF9wYWNrYWdlID0gbWF0Y2gKCQkJCQltYXRjaCAgICAgICAgPSBwb3J0 YWdlX3ZlcnNpb25zLnBrZ3NwbGl0KG1hdGNoKVswXQoKCQkJCWlmIGZ1bGxfcGFja2FnZToK CQkJCQl0cnk6CgkJCQkJCWRlc2MsIGhvbWVwYWdlLCBsaWNlbnNlID0gcG9ydGFnZS5wb3J0 ZGIuYXV4X2dldChmdWxsX3BhY2thZ2UsWyJERVNDUklQVElPTiIsIkhPTUVQQUdFIiwiTElD RU5TRSJdKQoJCQkJCWV4Y2VwdCBLZXlFcnJvcjoKCQkJCQkJcHJpbnQgImVtZXJnZTogc2Vh cmNoOiBhdXhfZ2V0KCkgZmFpbGVkLCBza2lwcGluZyIKCQkJCQkJY29udGludWUKCQkJCQlp ZiBtYXNrZWQ6CgkJCQkJCXByaW50IGdyZWVuKCIqIikrIiAgIit3aGl0ZShtYXRjaCkrIiAi K3JlZCgiWyBNYXNrZWQgXSIpCgkJCQkJZWxzZToKCQkJCQkJcHJpbnQgZ3JlZW4oIioiKSsi ICAiK3doaXRlKG1hdGNoKQoJCQkJCW15dmVyc2lvbiA9IHNlbGYuZ2V0VmVyc2lvbihmdWxs X3BhY2thZ2UsIHNlYXJjaC5WRVJTSU9OX1JFTEVBU0UpCgoJCQkJCW15c3VtID0gWzAsMF0K CQkJCQlteWNhdCA9IG1hdGNoLnNwbGl0KCIvIilbMF0KCQkJCQlteXBrZyA9IG1hdGNoLnNw bGl0KCIvIilbMV0KCgkJCQkJbXlkaWdlc3QgPSBwb3J0YWdlLmRiWyIvIl1bInBvcnR0cmVl Il0uZGJhcGkuZmluZGRpZ2VzdChteWNhdCsiLyIrbXlwa2cgKyAiLSIgKyBteXZlcnNpb24p CgkJCQkJCgkJCQkJdHJ5OgoJCQkJCQlteWZpbGUgPSBvcGVuKG15ZGlnZXN0LCJyIikKCQkJ CQkJZm9yIGxpbmUgaW4gbXlmaWxlLnJlYWRsaW5lcygpOgoJCQkJCQkJbXlzdW1bMF0gKz0g aW50KGxpbmUuc3BsaXQoIiAiKVszXSkKCQkJCQkJbXlmaWxlLmNsb3NlKCkKCQkJCQkJbXlz dHIgPSBzdHIobXlzdW1bMF0vMTAyNCkKCQkJCQkJbXljb3VudD1sZW4obXlzdHIpCgkJCQkJ CXdoaWxlIChteWNvdW50ID4gMyk6CgkJCQkJCQlteWNvdW50LT0zCgkJCQkJCQlteXN0cj1t eXN0cls6bXljb3VudF0rIiwiK215c3RyW215Y291bnQ6XQoJCQkJCQlteXN1bVswXT1teXN0 cisiIGtCIgoJCQkJCWV4Y2VwdCBTeXN0ZW1FeGl0LCBlOgoJCQkJCQlyYWlzZSAjIE5lZWRl ZCBlbHNlIGNhbid0IGV4aXQKCQkJCQlleGNlcHQgRXhjZXB0aW9uLCBlOgoJCQkJCQlpZiBz ZWxmLmVkZWJ1ZzoKCQkJCQkJCXByaW50ICIhISEgRXhjZXB0aW9uOiIsZQoJCQkJCQlteXN1 bVswXT0iIFtuby9iYWQgZGlnZXN0XSIKCQkJCQkJCgkJCQkJaWYgIi0tcXVpZXQiIG5vdCBp biBzZWxmLm15b3B0czoKCQkJCQkJcHJpbnQgIiAgICAgIiwgZGFya2dyZWVuKCJMYXRlc3Qg dmVyc2lvbiBhdmFpbGFibGU6IiksbXl2ZXJzaW9uCgkJCQkJCXByaW50ICIgICAgICIsIHNl bGYuZ2V0SW5zdGFsbGF0aW9uU3RhdHVzKG15Y2F0KycvJytteXBrZykKCQkJCQkJcHJpbnQg IiAgICAgIiwgZGFya2dyZWVuKCJTaXplIG9mIGRvd25sb2FkZWQgZmlsZXM6IiksbXlzdW1b MF0KCQkJCQkJcHJpbnQgIiAgICAgIiwgZGFya2dyZWVuKCJIb21lcGFnZToiKSsiICAgIixo b21lcGFnZQoJCQkJCQlwcmludCAiICAgICAiLCBkYXJrZ3JlZW4oIkRlc2NyaXB0aW9uOiIp LGRlc2MKCQkJCQkJcHJpbnQgIiAgICAgIiwgZGFya2dyZWVuKCJMaWNlbnNlOiIpKyIgICAg IixsaWNlbnNlCgkJCQkJCWlmIChzZWxmLnZlcmJvc2l0eSk6CgkJCQkJCQkjIHNob3cgaGVy ZC9tYWludGFpbmVycyBpZiB2ZXJib3NpdHk+PTEgKGllOiAtdnYpCgkJCQkJCQltZXRhZGF0 YV9maWxlPXBvcnRhZ2Uuc2V0dGluZ3NbIlBPUlRESVIiXSArICIvIiArIG1hdGNoICsgIi9t ZXRhZGF0YS54bWwiCgkJCQkJCQlpZiBub3Qgb3MucGF0aC5leGlzdHMobWV0YWRhdGFfZmls ZSk6CgkJCQkJCQkJcHJpbnQgIiAgICAgICIgKyBkYXJrZ3JlZW4oIk1ldGFkYXRhOiAgICAi KSArIHJlZCgiKE1pc3NpbmcgIittZXRhZGF0YV9maWxlKyIpIikKCQkJCQkJCWVsc2U6CgkJ CQkJCQkJcGFyc2VyID0gcG9ydGFnZV9tZXRhZGF0YS5tYWtlX3BhcnNlcigpCgkJCQkJCQkJ aGFuZGxlciA9IHBvcnRhZ2VfbWV0YWRhdGEuTWV0YWRhdGFfWE1MKCkKCQkJCQkJCQloYW5k bGVyLl9tYWludGFpbmVycyA9IFtdCgkJCQkJCQkJaGFuZGxlci5faGVyZHMgPSBbXQoJCQkJ CQkJCXBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKQoJCQkJCQkJCXBhcnNlci5w YXJzZSggbWV0YWRhdGFfZmlsZSApCgkJCQkJCQkJaWYgbGVuKGhhbmRsZXIuX2hlcmRzKSA+ IDA6CgkJCQkJCQkJCXByaW50ICIgICAgICAiICsgZGFya2dyZWVuKCJIZXJkOiAgICAgICAg IikgKyAiLCAiLmpvaW4oaGFuZGxlci5faGVyZHMpCgkJCQkJCQkJCWlmIGxlbihoYW5kbGVy Ll9tYWludGFpbmVycyk6CgkJCQkJCQkJCQlwcmludCAiICAgICAgIiArIGRhcmtncmVlbigi TWFpbnRhaW5lcnM6ICIpICsgIiwgIi5qb2luKGhhbmRsZXIuX21haW50YWluZXJzKQoJCQkJ CQlwcmludAoJCXByaW50CgkjCgkjIHByaXZhdGUgaW50ZXJmYWNlCgkjCglkZWYgZ2V0SW5z dGFsbGF0aW9uU3RhdHVzKHNlbGYscGFja2FnZSk6CgkJaW5zdGFsbGVkX3BhY2thZ2UgPSBz ZWxmLmluc3RhbGxjYWNoZS5kZXBfYmVzdG1hdGNoKHBhY2thZ2UpCgkJcmVzdWx0ID0gIiIK CQl2ZXJzaW9uID0gc2VsZi5nZXRWZXJzaW9uKGluc3RhbGxlZF9wYWNrYWdlLHNlYXJjaC5W RVJTSU9OX1JFTEVBU0UpCgkJaWYgbGVuKHZlcnNpb24pID4gMDoKCQkJcmVzdWx0ID0gZGFy a2dyZWVuKCJMYXRlc3QgdmVyc2lvbiBpbnN0YWxsZWQ6IikrIiAiK3ZlcnNpb24KCQllbHNl OgoJCQlyZXN1bHQgPSBkYXJrZ3JlZW4oIkxhdGVzdCB2ZXJzaW9uIGluc3RhbGxlZDoiKSsi IFsgTm90IEluc3RhbGxlZCBdIgoJCXJldHVybiByZXN1bHQKCglkZWYgZ2V0VmVyc2lvbihz ZWxmLGZ1bGxfcGFja2FnZSxkZXRhaWwpOgoJCWlmIGxlbihmdWxsX3BhY2thZ2UpID4gMToK CQkJcGFja2FnZV9wYXJ0cyA9IHBvcnRhZ2VfdmVyc2lvbnMuY2F0cGtnc3BsaXQoZnVsbF9w YWNrYWdlKQoJCQlpZiBkZXRhaWwgPT0gc2VhcmNoLlZFUlNJT05fUkVMRUFTRSBhbmQgcGFj a2FnZV9wYXJ0c1szXSAhPSAncjAnOgoJCQkJcmVzdWx0ID0gcGFja2FnZV9wYXJ0c1syXSsg Ii0iICsgcGFja2FnZV9wYXJ0c1szXQoJCQllbHNlOgoJCQkJcmVzdWx0ID0gcGFja2FnZV9w YXJ0c1syXQoJCWVsc2U6CgkJCXJlc3VsdCA9ICIiCgkJcmV0dXJuIHJlc3VsdAoKCiNidWls ZCBvdXIgcGFja2FnZSBkaWdyYXBoCmRlZiBnZXRsaXN0KG1vZGUpOgoJaWYgbW9kZT09InN5 c3RlbSI6CgkJbXlsaW5lcz1wb3J0YWdlLnNldHRpbmdzLnBhY2thZ2VzCgllbGlmIG1vZGU9 PSJ3b3JsZCI6CgkJdHJ5OgoJCQlteWZpbGU9b3Blbihwb3J0YWdlLnJvb3QrcG9ydGFnZS5X T1JMRF9GSUxFLCJyIikKCQkJbXlsaW5lcz1teWZpbGUucmVhZGxpbmVzKCkKCQkJbXlmaWxl LmNsb3NlKCkKCQlleGNlcHQgT1NFcnJvcjoKCQkJcHJpbnQgIiEhISBDb3VsZG4ndCBvcGVu ICIrcGZpbGUrIjsgZXhpdGluZy4iCgkJCXN5cy5leGl0KDEpCgkJZXhjZXB0IElPRXJyb3I6 CgkJCSN3b3JsZCBmaWxlIGRvZXNuJ3QgZXhpc3QKCQkJbXlsaW5lcz1bXQoJbXluZXdsaW5l cz1bXQoJZm9yIHggaW4gbXlsaW5lczoKCQlteWxpbmU9IiAiLmpvaW4oIHguc3BsaXQoKSAp CgkJaWYgbm90IGxlbihteWxpbmUpOgoJCQljb250aW51ZQoJCWVsaWYgbXlsaW5lWzBdPT0i IyI6CgkJCWNvbnRpbnVlCgkJZWxpZiBtb2RlPT0ic3lzdGVtIjoKCQkJaWYgbXlsaW5lWzBd IT0iKiI6CgkJCQljb250aW51ZQoJCQlteWxpbmU9bXlsaW5lWzE6XQoJCW15bmV3bGluZXMu YXBwZW5kKG15bGluZS5zdHJpcCgpKQoJcmV0dXJuIG15bmV3bGluZXMKCmRlZiBnZW5lcmlj ZGljdChteWxpc3QpOgoJbXluZXdkaWN0PXt9Cglmb3IgeCBpbiBteWxpc3Q6CgkJbXluZXdk aWN0W3BvcnRhZ2UucG9ydGFnZV9kZXAuZGVwX2dldGtleSh4KV09eAoJcmV0dXJuIG15bmV3 ZGljdAoKY2xhc3MgZGVwZ3JhcGg6CgoJZGVmIF9faW5pdF9fKHNlbGYsbXlhY3Rpb24sbXlv cHRzLG15cGFyYW1zLGVkZWJ1Zyx2ZXJib3NpdHksRU1FUkdFX1dBUk5JTkdfREVMQVksc3Bp bm5lcik6CgkJc2VsZi5teXBhcmFtcz1teXBhcmFtcwoJCXNlbGYubXlvcHRzPW15b3B0cwoJ CXNlbGYuZWRlYnVnPWVkZWJ1ZwoJCXNlbGYudmVyYm9zaXR5PXZlcmJvc2l0eQoJCXNlbGYu RU1FUkdFX1dBUk5JTkdfREVMQVk9RU1FUkdFX1dBUk5JTkdfREVMQVkKCQlzZWxmLnNwaW5u ZXI9c3Bpbm5lcgoJCXNlbGYucGtnc2V0dGluZ3MgPSBwb3J0YWdlLmNvbmZpZyhjbG9uZT1w b3J0YWdlLnNldHRpbmdzKQoJCWlmIG5vdCBzZWxmLnBrZ3NldHRpbmdzWyJBUkNIIl06CgkJ CXBvcnRhZ2Uud3JpdGVtc2cocmVkKCJcYSEhISBBUkNIIGlzIG5vdCBzZXQuLi4gQXJlIHlv dSBtaXNzaW5nIHRoZSAvZXRjL21ha2UucHJvZmlsZSBzeW1saW5rP1xuIikpCgkJCXBvcnRh Z2Uud3JpdGVtc2cocmVkKCJcYSEhISBJcyB0aGUgc3ltbGluayBjb3JyZWN0PyBJcyB5b3Vy IHBvcnRhZ2UgdHJlZSBjb21wbGV0ZT9cblxuIikpCgkJCXN5cy5leGl0KDkpCgkJc2VsZi5h cHBsaWVkX3VzZWZsYWdzID0ge30KCQkKCQlzZWxmLm1pc3NpbmdiaW5zPVtdCgkJc2VsZi5t eWFjdGlvbj1teWFjdGlvbgoJCXNlbGYubXluZXdncmFwaCA9IERlcGVuZGVuY3lHcmFwaCgp CgkJc2VsZi5vcmRlcmVka2V5cz1bXQoJCXNlbGYub3V0ZGF0ZWRwYWNrYWdlcz1bXQoJCXNl bGYubXlkYmFwaT17fQoJCXNlbGYubXlkYmFwaVsiLyJdID0gcG9ydGFnZS5mYWtlZGJhcGko KQoJCWlmICJlbXB0eSIgbm90IGluIHNlbGYubXlwYXJhbXM6CgkJCWZvciBwa2cgaW4gcG9y dGFnZS5kYlsiLyJdWyJ2YXJ0cmVlIl0uZ2V0YWxsY3B2KCk6CgkJCQlzZWxmLm15ZGJhcGlb Ii8iXS5jcHZfaW5qZWN0KHBrZykKCQlpZiBwb3J0YWdlLnJvb3QgIT0gIi8iOgoJCQlzZWxm Lm15ZGJhcGlbcG9ydGFnZS5yb290XSA9IHBvcnRhZ2UuZmFrZWRiYXBpKCkKCQkJaWYgImVt cHR5IiBub3QgaW4gc2VsZi5teXBhcmFtczoKCQkJCWZvciBwa2cgaW4gcG9ydGFnZS5kYltw b3J0YWdlLnJvb3RdWyJ2YXJ0cmVlIl0uZ2V0YWxsY3B2KCk6CgkJCQkJc2VsZi5teWRiYXBp W3BvcnRhZ2Uucm9vdF0uY3B2X2luamVjdChwa2cpCgkJCgkJaWYgIi0tdXNlcGtnIiBpbiBz ZWxmLm15b3B0czoKCQkJcG9ydGFnZS5kYlsiLyJdWyJiaW50cmVlIl0ucG9wdWxhdGUoKCIt LWdldGJpbnBrZyIgaW4gc2VsZi5teW9wdHMpLCAoIi0tZ2V0YmlucGtnb25seSIgaW4gc2Vs Zi5teW9wdHMpKQoKCWRlZiBjcmVhdGUoc2VsZixteWJpZ2tleSxteXBhcmVudD1Ob25lLGFk ZG1lPTEsbXl1c2U9Tm9uZSk6CgkJIiIiY3JlYXRlcyB0aGUgYWN0dWFsIGRpZ3JhcGggb2Yg cGFja2FnZXMgdG8gbWVyZ2UuICByZXR1cm4gMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUK CQlteWJpZ2tleSA9IHNwZWNpZmljYXRpb24gb2YgcGFja2FnZSB0byBtZXJnZTsgbXlwYXJl bnQgPSBwYXJlbnQgcGFja2FnZSAob25lIGRlcGVuZGluZyBvbiBtZSk7CgkJYWRkbWUgPSBz aG91bGQgSSBiZSBhZGRlZCB0byB0aGUgdHJlZT8gKGZvciB0aGUgLS1vbmx5ZGVwcyBtb2Rl KSIiIgoJCSNzdHVmZiB0byBhZGQ6CgkJI1NMT1QtYXdhcmUgZW1lcmdlCgkJI0lVU0UtYXdh cmUgZW1lcmdlCgkJIyJubyBkb3duZ3JhZGUiIGVtZXJnZQoJCSNwcmludCAibXliaWdrZXk6 IixteWJpZ2tleQoJCQoJCWpiaWdrZXk9IiAiLmpvaW4obXliaWdrZXkpCgkJaWYgc2VsZi5t eW5ld2dyYXBoLmhhc19ub2RlKGpiaWdrZXkrIiBtZXJnZSIpIG9yIHNlbGYubXluZXdncmFw aC5oYXNfbm9kZShqYmlna2V5KyIgbm9tZXJnZSIpOgoJCQlpZiBteXBhcmVudDoKCQkJCWlm IHNlbGYubXluZXdncmFwaC5oYXNfbm9kZShqYmlna2V5KyIgbWVyZ2UiKToKCQkJCQljaGls ZCA9IGpiaWdrZXkrIiBtZXJnZSIKCQkJCWVsc2U6CgkJCQkJY2hpbGQgPSBqYmlna2V5KyIg bm9tZXJnZSIKCQkJCXNlbGYubXluZXdncmFwaC5hZGRfcmVsYXRpb25zaGlwKG15cGFyZW50 LCBjaGlsZCkKCQkJI3RoaXMgY29uZGl0aW9uYWwgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5m aW5pdGUgcmVjdXJzaW9uIG9uIGFscmVhZHktcHJvY2Vzc2VkIGRlcHMKCQkJcmV0dXJuIDEK CgkJc2VsZi5zcGlubmVyLnVwZGF0ZV9zcGlubmVyKCkKCgkJbXl0eXBlLG15cm9vdCxteWtl eT1teWJpZ2tleQoJCSMgc2VsZWN0IHRoZSBjb3JyZWN0IC92YXIgZGF0YWJhc2UgdGhhdCB3 ZSdsbCBiZSBjaGVja2luZyBhZ2FpbnN0CgkJdmFyZGJhcGk9cG9ydGFnZS5kYltteXJvb3Rd WyJ2YXJ0cmVlIl0uZGJhcGkKCgkJaWYgYWRkbWU6CgkJCWlmIG15dHlwZT09ImJsb2NrcyI6 CgkJCQkjIHdlJ3ZlIGVuY291bnRlcmVkIGEgImJsb2NrcyIgbm9kZS4gIFdlIHdpbGwgdG90 YWxseSBpZ25vcmUgdGhpcwoJCQkJIyBub2RlIGFuZCBub3QgYWRkIGl0IHRvIG91ciBkaWdy YXBoIGlmIGl0IGRvZXNuJ3QgYXBwbHkgdG8gdXMuCgkJCQlpZiBteXBhcmVudCBhbmQgKHNl bGYubXlkYmFwaVtteXJvb3RdLm1hdGNoKG15a2V5KSBvciB2YXJkYmFwaS5tYXRjaChteWtl eSkpOgoJCQkJCW15Ymlna2V5LmFwcGVuZChteXBhcmVudC5zcGxpdCgpWzJdKQoJCQkJCXNl bGYubXluZXdncmFwaC5hZGRfbm9kZSgiICIuam9pbihteWJpZ2tleSkpCgkJCQkJc2VsZi5t eW5ld2dyYXBoLmFkZF9yZWxhdGlvbnNoaXAobXlwYXJlbnQsICIgIi5qb2luKG15Ymlna2V5 KSkKCQkJCXJldHVybiAxCgoJCWlmIG15dXNlID09IE5vbmU6CgkJCXNlbGYucGtnc2V0dGlu Z3Muc2V0Y3B2KG15a2V5KQoJCQlteXVzZT1zZWxmLnBrZ3NldHRpbmdzWyJVU0UiXS5zcGxp dCgpCgoJCXNlbGYuYXBwbGllZF91c2VmbGFnc1tteWtleV0gPSBteXVzZQoJCgkJbWVyZ2lu Zz0xCgkJaWYgYWRkbWU6CgkJIyB0aGlzIGlzIHdoZXJlIHdlIGFkZCB0aGUgbm9kZSB0byB0 aGUgbGlzdCBvZiBwYWNrYWdlcyB0byBtZXJnZQoJCQlpZiBub3QgbXlwYXJlbnQ6CgkJCQkj IGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgb3IgcGFydCBvZiBhIHdvcmxkIGxpc3QuLi4KCQkJ CWlmICgic2VsZiIgbm90IGluIHNlbGYubXlwYXJhbXMpIG9yICgoInNlbGVjdGl2ZSIgaW4g c2VsZi5teXBhcmFtcykgYW5kIHZhcmRiYXBpLmNwdl9leGlzdHMobXlrZXkpKToKCQkJCQkj IHRoZSBwYWNrYWdlIGlzIG9uIHRoZSBzeXN0ZW0sIHNvIGRvbid0IG1lcmdlIGl0LgoJCQkJ CW1lcmdpbmc9MAoJCQllbGlmICgic2VsZWN0aXZlIiBpbiBzZWxmLm15cGFyYW1zKSBhbmQg dmFyZGJhcGkuY3B2X2V4aXN0cyhteWtleSk6CgkJCQltZXJnaW5nPTAKCgkJCWlmIChtZXJn aW5nPT0wIGFuZCAiLS1uZXd1c2UiIGluIHNlbGYubXlvcHRzIGFuZCB2YXJkYmFwaS5jcHZf ZXhpc3RzKG15a2V5KSk6CgkJCQlpdXNlcz1wb3J0YWdlLnBvcnRkYi5hdXhfZ2V0KG15a2V5 LCBbIklVU0UiXSlbMF0uc3BsaXQoKQoJCQkJb2xkX3VzZT12YXJkYmFwaS5hdXhfZ2V0KG15 a2V5LCBbIlVTRSJdKVswXS5zcGxpdCgpCgkJCQlub3dfdXNlPXNlbGYucGtnc2V0dGluZ3Nb IlVTRSJdLnNwbGl0KCkKCQkJCWZvciB4IGluIGl1c2VzOgoJCQkJCWlmIChvbGRfdXNlLmNv dW50KHgpIGFuZCBub3Qgbm93X3VzZS5jb3VudCh4KSkgb3IgKG5vdCBvbGRfdXNlLmNvdW50 KHgpIGFuZCBub3dfdXNlLmNvdW50KHgpKToKCQkJCQkJbWVyZ2luZz0xCgkJCQkJCWJyZWFr CgkJZWxzZToKCQkJI29ubHlkZXBzIG1vZGU7IGRvbid0IG1lcmdlCgkJCW1lcmdpbmc9MgoK CQkjIGlmIHRoZSBwYWNrYWdlIGlzIGFscmVhZHkgb24gdGhlIHN5c3RlbSwgd2UgYWRkIGEg Im5vbWVyZ2UiCgkJIyBkaXJlY3RpdmUsIG90aGVyd2lzZSB3ZSBhZGQgYSAibWVyZ2UiIGRp cmVjdGl2ZS4KCQlpZiBtZXJnaW5nPT0xOgoJCQlteWJpZ2tleS5hcHBlbmQoIm1lcmdlIikK CQllbHNlOgoJCQlteWJpZ2tleS5hcHBlbmQoIm5vbWVyZ2UiKQoJCQoJCSMgd2hhdGV2ZXIg dGhlIGNhc2UsIHdlIG5lZWQgdG8gYWRkIHRoZSBub2RlIHRvIG91ciBkaWdyYXBoIHNvCgkJ IyB0aGF0IGNoaWxkcmVuIGNhbiBkZXBlbmQgdXBvbiBpdC4KCQlzZWxmLm15bmV3Z3JhcGgu YWRkX25vZGUoIiAiLmpvaW4obXliaWdrZXkpKQoJCWlmIG15cGFyZW50OgoJCQlzZWxmLm15 bmV3Z3JhcGguYWRkX3JlbGF0aW9uc2hpcChteXBhcmVudCwgIiAiLmpvaW4obXliaWdrZXkp KQoJCWlmICgiZGVlcCIgbm90IGluIHNlbGYubXlwYXJhbXMpIGFuZCAobm90IG1lcmdpbmcp OgoJCQlyZXR1cm4gMQoJCWVsaWYgInJlY3Vyc2UiIG5vdCBpbiBzZWxmLm15cGFyYW1zOgoJ CQlyZXR1cm4gMQoKCQllZGVwZW5kPXt9CgkJaWYgbXl0eXBlPT0iYmluYXJ5IjoKCQkJbXlw a2dwYXJ0cz1wb3J0YWdlX3ZlcnNpb25zLmNhdHBrZ3NwbGl0KG15a2V5KQoJCQl0YnoybmFt ZSA9IG15a2V5LnNwbGl0KCIvIilbMV0rIi50YnoyIgoJCQlpZiB0YnoybmFtZSBpbiBwb3J0 YWdlLmRiW3BvcnRhZ2Uucm9vdF1bImJpbnRyZWUiXS5pbnZhbGlkczoKCQkJCXN5cy5zdGRl cnIud3JpdGUoIlxuSU5WQUxJRCBQQUNLQUdFIChpcyByZXF1aXJlZCB0byBjb250aW51ZSk6 ICIrc3RyKG15a2V5KSsiXG4iKQoJCQkJc3lzLmV4aXQoMSkKCQkJaWYgcG9ydGFnZS5kYltw b3J0YWdlLnJvb3RdWyJiaW50cmVlIl0uaXNyZW1vdGUobXlrZXkpOgoJCQkJZWRlcGVuZCA9 IHBvcnRhZ2UuZGJbcG9ydGFnZS5yb290XVsiYmludHJlZSJdLnJlbW90ZXBrZ3NbdGJ6Mm5h bWVdCgkJCQllZGVwZW5kWyJERVBFTkQiXSA9IiIKCQkJCWVkZXBlbmRbIlJERVBFTkQiXT0i ICIuam9pbihlZGVwZW5kWyJSREVQRU5EIl0uc3BsaXQoKSkKCQkJCWVkZXBlbmRbIlBERVBF TkQiXT0iICIuam9pbihlZGVwZW5kWyJQREVQRU5EIl0uc3BsaXQoKSkKCQkJCWVkZXBlbmRb IkNERVBFTkQiXT0iICIuam9pbihlZGVwZW5kWyJDREVQRU5EIl0uc3BsaXQoKSkKCQkJCWVk ZXBlbmRbIlNMT1QiXSAgID1lZGVwZW5kWyJTTE9UIl0uc3RyaXAoKQoJCQkJI3BvcnRhZ2Uu ZGJbcG9ydGFnZS5yb290XVsiYmludHJlZSJdLmdldHRiejIobXlrZXkpCgkJCWVsc2U6ICMg SXQncyBsb2NhbC4KCQkJCW15dGJ6Mj14cGFrLnRiejIocG9ydGFnZS5kYltwb3J0YWdlLnJv b3RdWyJiaW50cmVlIl0uZ2V0bmFtZShteWtleSkpCgkJCQllZGVwZW5kWyJERVBFTkQiXSA9 IiIKCQkJCWVkZXBlbmRbIlJERVBFTkQiXT0iICIuam9pbihteXRiejIuZ2V0ZWxlbWVudHMo IlJERVBFTkQiKSkKCQkJCWVkZXBlbmRbIlBERVBFTkQiXT0iICIuam9pbihteXRiejIuZ2V0 ZWxlbWVudHMoIlBERVBFTkQiKSkKCQkJCWVkZXBlbmRbIkNERVBFTkQiXT0iICIuam9pbiht eXRiejIuZ2V0ZWxlbWVudHMoIkNERVBFTkQiKSkKCQkJCWVkZXBlbmRbIlNMT1QiXSAgID1t eXRiejIuZ2V0ZmlsZSgiU0xPVCIsbXlwa2dwYXJ0c1syXSkKCQllbGlmIG15dHlwZT09ImVi dWlsZCI6CgkJCXRyeToKCQkJCW15bWV0YSA9IFsiREVQRU5EIiwiUkRFUEVORCIsIlBERVBF TkQiLCJDREVQRU5EIl0KCQkJCW15Zm9vID0gcG9ydGFnZS5wb3J0ZGIuYXV4X2dldChteWtl eSwgbXltZXRhKQoJCQkJZm9yIGluZGV4IGluIHJhbmdlKDAsbGVuKG15bWV0YSkpOgoJCQkJ CWVkZXBlbmRbbXltZXRhW2luZGV4XV0gPSBteWZvb1tpbmRleF0KCQkJZXhjZXB0IChLZXlF cnJvcixJT0Vycm9yKToKCQkJCXByaW50ICJlbWVyZ2U6IGNyZWF0ZSgpOiBhdXhfZ2V0KCkg ZXJyb3Igb24iLG15a2V5KyI7IGFib3J0aW5nLi4uIgoJCQkJc3lzLmV4aXQoMSkKCQlteWRl cD17fQkKCQltcD0iICIuam9pbihteWJpZ2tleSkKCgkJaWYgbXlyb290PT0iLyI6CgkJCW15 ZGVwWyIvIl09ZWRlcGVuZFsiREVQRU5EIl0rIiAiK2VkZXBlbmRbIlJERVBFTkQiXQoJCQlp ZiBub3Qgc2VsZi5zZWxlY3RfZGVwKCIvIixteWRlcFsiLyJdLG15cGFyZW50PW1wLG15dXNl PW15dXNlKToKCQkJCXJldHVybiAwCgkJZWxzZToKCQkJbXlkZXBbIi8iXT1lZGVwZW5kWyJE RVBFTkQiXQoJCQlteWRlcFtteXJvb3RdPWVkZXBlbmRbIlJERVBFTkQiXQoJCQlpZiBub3Qg c2VsZi5zZWxlY3RfZGVwKCIvIixteWRlcFsiLyJdLG15cGFyZW50PW1wLG15dXNlPW15dXNl KToKCQkJCXJldHVybiAwCgkJCWlmIG5vdCBzZWxmLnNlbGVjdF9kZXAobXlyb290LG15ZGVw W215cm9vdF0sbXlwYXJlbnQ9bXAsbXl1c2U9bXl1c2UpOgoJCQkJcmV0dXJuIDAKCgkJaWYg ZWRlcGVuZC5oYXNfa2V5KCJQREVQRU5EIikgYW5kIGVkZXBlbmRbIlBERVBFTkQiXToKCQkJ IyBQb3N0IERlcGVuZCAtLSBBZGQgdG8gdGhlIGxpc3Qgd2l0aG91dCBhIHBhcmVudCwgYXMg aXQgZGVwZW5kcwoJCQkjIG9uIGEgcGFja2FnZSBiZWluZyBwcmVzZW50IEFORCBtdXN0IGJl IGJ1aWx0IGFmdGVyIHRoYXQgcGFja2FnZS4KCQkJaWYgbm90IHNlbGYuc2VsZWN0X2RlcCht eXJvb3QsZWRlcGVuZFsiUERFUEVORCJdLG15dXNlPW15dXNlKToKCQkJCXJldHVybiAwCgkJ CQoJCXJldHVybiAxCgkJCQoJZGVmIHNlbGVjdF9maWxlcyhzZWxmLG15ZmlsZXMpOgoJCSJn aXZlbiBhIGxpc3Qgb2YgLnRiejJzLCAuZWJ1aWxkcyBhbmQgZGVwcywgY3JlYXRlIHRoZSBh cHByb3ByaWF0ZSBkZXBncmFwaCBhbmQgcmV0dXJuIGEgZmF2b3JpdGUgbGlzdCIKCQlteWZh dm9yaXRlcz1bXQoJCWZvciB4IGluIG15ZmlsZXM6CgkJCWlmIHhbLTU6XT09Ii50YnoyIjoK CQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyh4KToKCQkJCQlpZiBvcy5wYXRoLmV4aXN0cyhz ZWxmLnBrZ3NldHRpbmdzWyJQS0dESVIiXSsiL0FsbC8iK3gpOgoJCQkJCQl4PXNlbGYucGtn c2V0dGluZ3NbIlBLR0RJUiJdKyIvQWxsLyIreAoJCQkJCWVsaWYgb3MucGF0aC5leGlzdHMo c2VsZi5wa2dzZXR0aW5nc1siUEtHRElSIl0rIi8iK3gpOgoJCQkJCQl4PXNlbGYucGtnc2V0 dGluZ3NbIlBLR0RJUiJdKyIvIit4CgkJCQkJZWxzZToKCQkJCQkJcHJpbnQgIlxuXG4hISEg QmluYXJ5IHBhY2thZ2UgJyIrc3RyKHgpKyInIGRvZXMgbm90IGV4aXN0LiIKCQkJCQkJcHJp bnQgIiEhISBQbGVhc2UgZW5zdXJlIHRoZSB0YnoyIGV4aXN0cyBhcyBzcGVjaWZpZWQuXG4i CgkJCQkJCXN5cy5leGl0KDEpCgkJCQlteXRiejI9eHBhay50YnoyKHgpCgkJCQlteWtleT1t eXRiejIuZ2V0ZWxlbWVudHMoIkNBVEVHT1JZIilbMF0rIi8iK29zLnBhdGguYmFzZW5hbWUo eClbOi01XQoJCQkJaWYgb3MucGF0aC5yZWFscGF0aChwb3J0YWdlLmRiWyIvIl1bImJpbnRy ZWUiXS5nZXRuYW1lKG15a2V5KSkgIT0gb3MucGF0aC5yZWFscGF0aCh4KToKCQkJCQlwcmlu dCByZWQoIlxuKioqIFlvdSBuZWVkIHRvIGFkanVzdCBQS0dESVIgdG8gZW1lcmdlIHRoaXMg cGFja2FnZS5cbiIpCgkJCQkJc3lzLmV4aXQoMSkKCQkJCWlmIG5vdCBzZWxmLmNyZWF0ZShb ImJpbmFyeSIscG9ydGFnZS5yb290LG15a2V5XSxOb25lLCItLW9ubHlkZXBzIiBub3QgaW4g c2VsZi5teW9wdHMpOgoJCQkJCXJldHVybiAoMCxteWZhdm9yaXRlcykKCQkJCWVsaWYgbm90 ICItLW9uZXNob3QiIGluIHNlbGYubXlvcHRzOgoJCQkJCW15ZmF2b3JpdGVzLmFwcGVuZCht eWtleSkKCQkJZWxpZiB4Wy03Ol09PSIuZWJ1aWxkIjoKCQkJCXggPSBvcy5wYXRoLnJlYWxw YXRoKHgpCgkJCQlteWtleT1vcy5wYXRoLmJhc2VuYW1lKG9zLnBhdGgubm9ybXBhdGgoeCsi Ly4uLy4uIikpKyIvIitvcy5wYXRoLmJhc2VuYW1lKHgpWzotN10KCQkJCWVidWlsZF9wYXRo ID0gcG9ydGFnZS5kYlsiLyJdWyJwb3J0dHJlZSJdLmRiYXBpLmZpbmRuYW1lKG15a2V5KQoJ CQkJaWYgZWJ1aWxkX3BhdGg6CgkJCQkgICAgICAgIGlmIG9zLnBhdGgucmVhbHBhdGgoZWJ1 aWxkX3BhdGgpICE9IHg6CgkJCQkgICAgICAgICAgICAgICAgcHJpbnQgcmVkKCJcbioqKiBZ b3UgbmVlZCB0byBhZGp1c3QgUE9SVERJUiBvciBQT1JURElSX09WRVJMQVkgdG8gZW1lcmdl IHRoaXMgcGFja2FnZS5cbiIpCgkJCQkgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKCQkJ CSAgICAgICAgaWYgbXlrZXkgbm90IGluIHBvcnRhZ2UuZGJbIi8iXVsicG9ydHRyZWUiXS5k YmFwaS54bWF0Y2goIm1hdGNoLXZpc2libGUiLCBwb3J0YWdlLnBvcnRhZ2VfZGVwLmRlcF9n ZXRrZXkobXlrZXkpKToKCQkJCSAgICAgICAgICAgICAgICBwcmludCByZWQoIlxuKioqIFlv dSBhcmUgZW1lcmdpbmcgYSBtYXNrZWQgcGFja2FnZS4gSXQgaXMgTVVDSCBiZXR0ZXIgdG8g dXNlIikKCQkJCSAgICAgICAgICAgICAgICBwcmludCByZWQoIioqKiAvZXRjL3BvcnRhZ2Uv cGFja2FnZS4qIHRvIGFjY29tcGxpc2ggdGhpcy4gU2VlIHBvcnRhZ2UoNSkgbWFuIikKCQkJ CSAgICAgICAgICAgICAgICBwcmludCByZWQoIioqKiBwYWdlIGZvciBkZXRhaWxzLiIpCgkJ CQkgICAgICAgICAgICAgICAgY291bnRkb3duKHNlbGYuRU1FUkdFX1dBUk5JTkdfREVMQVks ICJDb250aW51aW5nLi4uIikKCQkJCWVsc2U6CgkJCQkgICAgICAgIHByaW50IHJlZCgiXG4q KiogIit4KyIgZG9lcyBub3QgZXhpc3QiKQoJCQkJICAgICAgICBzeXMuZXhpdCgxKQoJCQkJ aWYgbm90IHNlbGYuY3JlYXRlKFsiZWJ1aWxkIixwb3J0YWdlLnJvb3QsbXlrZXldLE5vbmUs Ii0tb25seWRlcHMiIG5vdCBpbiBzZWxmLm15b3B0cyk6CgkJCQkJcmV0dXJuICgwLG15ZmF2 b3JpdGVzKQoJCQkJZWxpZiBub3QgIi0tb25lc2hvdCIgaW4gc2VsZi5teW9wdHM6CgkJCQkJ bXlmYXZvcml0ZXMuYXBwZW5kKG15a2V5KQoJCQllbHNlOgoJCQkJdHJ5OgoJCQkJCW15a2V5 PXBvcnRhZ2UuZGVwX2V4cGFuZCh4LHBvcnRhZ2UucG9ydGRiKQoJCQkJZXhjZXB0IFZhbHVl RXJyb3IsIGVycnBrZ3M6CgkJCQkJcHJpbnQgIlxuXG4hISEgVGhlIHNob3J0IGVidWlsZCBu YW1lIFwiIiArIHggKyAiXCIgaXMgYW1iaWd1b3VzLiAgUGxlYXNlIHNwZWNpZnkiCgkJCQkJ cHJpbnQgIiEhISBvbmUgb2YgdGhlIGZvbGxvd2luZyBmdWxseS1xdWFsaWZpZWQgZWJ1aWxk IG5hbWVzIGluc3RlYWQ6XG4iCgkJCQkJZm9yIGkgaW4gZXJycGtnc1swXToKCQkJCQkJcHJp bnQgIiAgICAiICsgZ3JlZW4oaSkKCQkJCQlwcmludAoJCQkJCXN5cy5leGl0KDEpCgoJCQkJ IyBzZWxlY3QgbmVlZHMgdG8gcmV0dXJuIDAgb24gZGVwX2NoZWNrIGZhaWx1cmUKCgkJCQlz eXMuc3Rkb3V0LmZsdXNoKCkKCQkJCXN5cy5zdGRlcnIuZmx1c2goKQoKCQkJCXRyeToKCQkJ CQlzZWxmLm15c2QgPSBzZWxmLnNlbGVjdF9kZXAocG9ydGFnZS5yb290LG15a2V5LGFyZz14 KQoJCQkJZXhjZXB0IHBvcnRhZ2VfZXhjZXB0aW9uLk1pc3NpbmdTaWduYXR1cmUsIGU6CgkJ CQkJcG9ydGFnZS53cml0ZW1zZygiXG5cbiEhISBBIG1pc3NpbmcgZ3BnIHNpZ25hdHVyZSBp cyBwcmV2ZW50aW5nIHBvcnRhZ2UgZnJvbSBjYWxjdWxhdGluZyB0aGVcbiIpCgkJCQkJcG9y dGFnZS53cml0ZW1zZygiISEhIHJlcXVpcmVkIGRlcGVuZGVuY2llcy4gVGhpcyBpcyBhIHNl Y3VyaXR5IGZlYXR1cmUgZW5hYmxlZCBieSB0aGUgYWRtaW5cbiIpCgkJCQkJcG9ydGFnZS53 cml0ZW1zZygiISEhIHRvIGFpZCBpbiB0aGUgZGV0ZWN0aW9uIG9mIG1hbGljaW91cyBpbnRl bnQuXG5cbiIpCgkJCQkJcG9ydGFnZS53cml0ZW1zZygiISEhIFRISVMgSVMgQSBQT1NTSUJM RSBJTkRJQ0FUSU9OIE9GIEEgVEFNUEVSRUQgRklMRVMgLS0gQ0hFQ0sgQ0FSRUZVTExZLlxu IikKCQkJCQlwb3J0YWdlLndyaXRlbXNnKCIhISEgQWZmZWN0ZWQgZmlsZTogJXNcbiIgJSAo ZSkpCgkJCQkJc3lzLmV4aXQoMSkKCQkJCWV4Y2VwdCBwb3J0YWdlX2V4Y2VwdGlvbi5JbnZh bGlkU2lnbmF0dXJlLCBlOgoJCQkJCXBvcnRhZ2Uud3JpdGVtc2coIlxuXG4hISEgQW4gaW52 YWxpZCBncGcgc2lnbmF0dXJlIGlzIHByZXZlbnRpbmcgcG9ydGFnZSBmcm9tIGNhbGN1bGF0 aW5nIHRoZVxuIikKCQkJCQlwb3J0YWdlLndyaXRlbXNnKCIhISEgcmVxdWlyZWQgZGVwZW5k ZW5jaWVzLiBUaGlzIGlzIGEgc2VjdXJpdHkgZmVhdHVyZSBlbmFibGVkIGJ5IHRoZSBhZG1p blxuIikKCQkJCQlwb3J0YWdlLndyaXRlbXNnKCIhISEgdG8gYWlkIGluIHRoZSBkZXRlY3Rp b24gb2YgbWFsaWNpb3VzIGludGVudC5cblxuIikKCQkJCQlwb3J0YWdlLndyaXRlbXNnKCIh ISEgVEhJUyBJUyBBIFBPU1NJQkxFIElORElDQVRJT04gT0YgQSBUQU1QRVJFRCBGSUxFUyAt LSBDSEVDSyBDQVJFRlVMTFkuXG4iKQoJCQkJCXBvcnRhZ2Uud3JpdGVtc2coIiEhISBBZmZl Y3RlZCBmaWxlOiAlc1xuIiAlIChlKSkKCQkJCQlzeXMuZXhpdCgxKQoJCQkJZXhjZXB0IFN5 c3RlbUV4aXQsIGU6CgkJCQkJcmFpc2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBleGl0CgkJCQll eGNlcHQgRXhjZXB0aW9uLCBlOgoJCQkJCWlmICItLWRlYnVnIiBpbiBzZWxmLm15b3B0czoK CQkJCQkJcmFpc2UKCQkJCQlwcmludCAiXG5cbiEhISBQcm9ibGVtIGluIixteWtleSwiZGVw ZW5kZW5jaWVzLiIKCQkJCQlwcmludCAiISEhIixzdHIoZSksZS5fX21vZHVsZV9fCgkJCQkJ c3lzLmV4aXQoMSkKCgkJCQlpZiBub3Qgc2VsZi5teXNkOgoJCQkJCXJldHVybiAoMCxteWZh dm9yaXRlcykKCQkJCWVsaWYgbm90ICItLW9uZXNob3QiIGluIHNlbGYubXlvcHRzOgoJCQkJ CW15ZmF2b3JpdGVzLmFwcGVuZChteWtleSkKCgkJbWlzc2luZz0wCgkJaWYgIi0tdXNlcGtn b25seSIgaW4gc2VsZi5teW9wdHM6CgkJCWZvciB4IGluIHNlbGYubXluZXdncmFwaC5nZXRf YWxsX25vZGVzKCk6CgkJCQl4cz14LnNwbGl0KCIgIikKCQkJCWlmICh4c1swXSAhPSAiYmlu YXJ5IikgYW5kICh4c1szXT09Im1lcmdlIik6CgkJCQkJaWYgbWlzc2luZyA9PSAwOgoJCQkJ CQlwcmludAoJCQkJCW1pc3NpbmcgKz0gMQoJCQkJCXByaW50ICJNaXNzaW5nIGJpbmFyeSBm b3I6Iix4c1syXQoKCQkjIFdlJ3JlIHRydWUgaGVyZSB1bmxlc3Mgd2UgYXJlIG1pc3Npbmcg YmluYXJpZXMuCgkJcmV0dXJuIChub3QgbWlzc2luZyxteWZhdm9yaXRlcykKCglkZWYgc2Vs ZWN0X2RlcChzZWxmLG15cm9vdCxkZXBzdHJpbmcsbXlwYXJlbnQ9Tm9uZSxhcmc9Tm9uZSxt eXVzZT1Ob25lKToKCQkiZ2l2ZW4gYSBkZXBlbmRlbmN5IHN0cmluZywgY3JlYXRlIHRoZSBh cHByb3ByaWF0ZSBkZXBncmFwaCBhbmQgcmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBvbiBm YWlsdXJlIgoJCWlmICItLWRlYnVnIiBpbiBzZWxmLm15b3B0czoKCQkJcHJpbnQKCQkJcHJp bnQgIlBhcmVudDogICAiLG15cGFyZW50CgkJCXByaW50ICJEZXBzdHJpbmc6IixkZXBzdHJp bmcKCQlpZiBub3QgYXJnOgoJCQkjcHJvY2Vzc2luZyBkZXBlbmRlbmNpZXMKCQkJbXljaGVj az1wb3J0YWdlLmRlcF9jaGVjayhkZXBzdHJpbmcsc2VsZi5teWRiYXBpW215cm9vdF0sc2Vs Zi5wa2dzZXR0aW5ncyxteXVzZT1teXVzZSx1c2VfYmluYXJpZXM9KCItLXVzZXBrZyIgaW4g c2VsZi5teW9wdHMpKQoJCQkjbXljaGVjaz1wb3J0YWdlLmRlcF9jaGVjayhkZXBzdHJpbmcs c2VsZi5teWRiYXBpW215cm9vdF0sc2VsZi5wa2dzZXR0aW5ncyxteXVzZT1teXVzZSkKCgkJ CWlmIG5vdCBteWNoZWNrWzBdOgoJCQkJbXltZXJnZT1bXQoJCQllbHNlOgoJCQkJbXltZXJn ZT1teWNoZWNrWzFdCgoJCWVsc2U6CgkJCSN3ZSdyZSBwcm9jZXNzaW5nIGEgY29tbWFuZC1s aW5lIGFyZ3VtZW50OyB1bmNvbmRpdGlvbmFsbHkgbWVyZ2UgaXQgZXZlbiBpZiBpdCdzIGFs cmVhZHkgbWVyZ2VkCgkJCW15bWVyZ2U9W2RlcHN0cmluZ10KCgkJIyBkZXBfY2hlY2sgaGFz IGJlZW4gcnVuIHNvIHdlIGNhbiBub3cgYWRkIG91ciBwYXJlbnQgdG8gb3VyCgkJIyBidWls ZCBzdGF0ZSB0byB1cGRhdGUgdmlydHVhbHMgYW5kIG90aGVyIHNldHRpbmdzLiBUaGlzCgkJ IyBoYXBwZW5zIGFmdGVyIHRoZSBwYWNrYWdlIGlzIGFkZGVkIHRvIHRoZSB0cmVlIHNvIHRo YXQgYQoJCSMgcGFja2FnZSBjYW4gZGVwZW5kIG9uIGEgdmlydHVhbCB3aGljaCBpdCBzYXRp c2ZpZXMuCgkJaWYgbXlwYXJlbnQ6CgkJCW15cCA9IG15cGFyZW50LnNwbGl0KCkKCQkJaWYg bXlwWzNdPT0ibWVyZ2UiOgoJCQkJc2VsZi5teWRiYXBpW215cm9vdF0uY3B2X2luamVjdCht eXBbMl0pCgkJCQlpZiBteXBbMF09PSJiaW5hcnkiOgoJCQkJCXNlbGYucGtnc2V0dGluZ3Mu c2V0aW5zdChteXBbMl0scG9ydGFnZS5kYlsiLyJdWyJiaW50cmVlIl0uZGJhcGkpCgkJCQll bHNlOgoJCQkJCXNlbGYucGtnc2V0dGluZ3Muc2V0aW5zdChteXBbMl0scG9ydGFnZS5kYltt eXJvb3RdWyJwb3J0dHJlZSJdLmRiYXBpKQoKCQlpZiBub3QgbXltZXJnZToKCQkJcmV0dXJu IDEKCgkJaWYgIi0tZGVidWciIGluIHNlbGYubXlvcHRzOgoJCQlwcmludCAiQ2FuZGlkYXRl czoiLG15bWVyZ2UKCQlmb3IgeCBpbiBteW1lcmdlOgoJCQlteWs9Tm9uZQoJCQliaW5wa2d1 c2VmbGFncz1Ob25lCgkJCWlmIHhbMF09PSIhIjoKCQkJCSMgaWYgdGhpcyBwYWNrYWdlIGlz IG15c2VsZiwgZG9uJ3QgYXBwZW5kIGl0IHRvIGJsb2NrIGxpc3QuCgkJCQlpZiAiLS1kZWJ1 ZyIgaW4gc2VsZi5teW9wdHM6CgkJCQkJcHJpbnQgIk15cGFyZW50IixteXBhcmVudAoJCQkJ aWYgKG15cGFyZW50KToKCQkJCQlpZiBteXBhcmVudC5zcGxpdCgpWzJdIGluIHBvcnRhZ2Uu cG9ydGRiLnhtYXRjaCgibWF0Y2gtYWxsIiwgeFsxOl0pOgoJCQkJCQkjIG15c2VsZiwgc28g ZXhpdC4KCQkJCQkJY29udGludWUKCQkJCSMgYWRkaW5nIGJsb2NrCgkJCQlteWs9WyJibG9j a3MiLG15cm9vdCx4WzE6XV0KCQkJZWxzZToKCQkJCSNXZSBhcmUgbm90IHByb2Nlc3Npbmcg YSBibG9ja2VyIGJ1dCBhIG5vcm1hbCBkZXBlbmRlbmN5CgkJCQlteWViPU5vbmUKCQkJCW15 ZWJfbWF0Y2hlcyA9IHBvcnRhZ2UucG9ydGRiLnhtYXRjaCgibWF0Y2gtdmlzaWJsZSIseCkK CQkJCWlmICgiLS11c2Vwa2dvbmx5IiBub3QgaW4gc2VsZi5teW9wdHMpOgoJCQkJCW15ZWI9 cG9ydGFnZS5iZXN0KG15ZWJfbWF0Y2hlcykKCQkJCQoJCQkJbXllYl9wa2c9Tm9uZQoJCQkJ aWYgKCItLXVzZXBrZyIgaW4gc2VsZi5teW9wdHMpOgoJCQkJCSMgVGhlIG5leHQgbGluZSBh c3N1bWVzIHRoZSBiaW5hcnl0cmVlIGhhcyBiZWVuIHBvcHVsYXRlZC4KCQkJCQkjIFhYWDog TmVlZCB0byB3b3JrIG91dCBob3cgd2UgdXNlIHRoZSBiaW5hcnkgdHJlZSB3aXRoIHJvb3Rz LgoJCQkJCW15ZWJfcGtnX21hdGNoZXM9cG9ydGFnZS5kYlsiLyJdWyJiaW50cmVlIl0uZGJh cGkubWF0Y2goeCkKCQkJCQlpZiAoIi0tdXNlcGtnb25seSIgbm90IGluIHNlbGYubXlvcHRz KToKCQkJCQkJIyBSZW1vdmUgYW55IGJpbmFyeSBwYWNrYWdlIGVudHJpZXMgdGhhdCBhcmUg bWFza2VkIGluIHRoZSBwb3J0YWdlIHRyZWUgKCM1NTg3MSkKCQkJCQkJZm9yIGlkeCBpbiBy YW5nZShsZW4obXllYl9wa2dfbWF0Y2hlcyktMSwtMSwtMSk6CgkJCQkJCQlpZiBteWViX3Br Z19tYXRjaGVzW2lkeF0gbm90IGluIG15ZWJfbWF0Y2hlczoKCQkJCQkJCQlkZWwgbXllYl9w a2dfbWF0Y2hlc1tpZHhdCgkJCQkJbXllYl9wa2cgPSBwb3J0YWdlLmJlc3QobXllYl9wa2df bWF0Y2hlcykKCQkJCQlpZiBteWViX3BrZyA9PSAnJzoKCQkJCQkJbXllYl9wa2cgPSBOb25l CgkJCQkKCQkJCWlmIChub3QgbXllYikgYW5kIChub3QgbXllYl9wa2cpOgoJCQkJCWlmIG5v dCBhcmc6CgkJCQkJCXhpbmZvPSciJyt4KyciJwoJCQkJCWVsc2U6CgkJCQkJCXhpbmZvPSci JythcmcrJyInCgkJCQkJaWYgbXlwYXJlbnQ6CgkJCQkJCXhmcm9tID0gJyhkZXBlbmRlbmN5 IHJlcXVpcmVkIGJ5ICcrZ3JlZW4oJyInK215cGFyZW50LnNwbGl0KClbMl0rJyInKStyZWQo JyBbJytteXBhcmVudC5zcGxpdCgpWzBdKyJdKSIpCgkJCQkJYWxsZWI9cG9ydGFnZS5wb3J0 ZGIueG1hdGNoKCJtYXRjaC1hbGwiLHgpCgkJCQkJaWYgYWxsZWI6CgkJCQkJCWlmICItLXVz ZXBrZ29ubHkiIG5vdCBpbiBzZWxmLm15b3B0czoKCQkJCQkJCXByaW50ICJcbiEhISAiK3Jl ZCgiQWxsIGVidWlsZHMgdGhhdCBjb3VsZCBzYXRpc2Z5ICIpK2dyZWVuKHhpbmZvKStyZWQo IiBoYXZlIGJlZW4gbWFza2VkLiIpCgkJCQkJCQlwcmludCAiISEhIE9uZSBvZiB0aGUgZm9s bG93aW5nIG1hc2tlZCBwYWNrYWdlcyBpcyByZXF1aXJlZCB0byBjb21wbGV0ZSB5b3VyIHJl cXVlc3Q6IgoJCQkJCQkJb2xkY29tbWVudCA9ICIiCgkJCQkJCQlmb3IgcCBpbiBhbGxlYjoK CQkJCQkJCQltcmVhc29ucyA9IHBvcnRhZ2UucG9ydGRiLmdldG1hc2tpbmdzdGF0dXMocCkK CQkJCQkJCQlwcmludCAiLSAiK3ArIiAobWFza2VkIGJ5OiAiKyIsICIuam9pbihtcmVhc29u cykrIikiCgkJCQkJCQkJY29tbWVudCA9IHBvcnRhZ2UucG9ydGRiLmdldG1hc2tpbmdyZWFz b24ocCkKCQkJCQkJCQlpZiBjb21tZW50IGFuZCBjb21tZW50ICE9IG9sZGNvbW1lbnQ6CgkJ CQkJCQkJCXByaW50IGNvbW1lbnQKCQkJCQkJCQkJb2xkY29tbWVudCA9IGNvbW1lbnQKCQkJ CQkJCXByaW50CgkJCQkJCQlwcmludCAiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBNQVNL RUQgUEFDS0FHRVMgc2VjdGlvbiBpbiB0aGUgZW1lcmdlIG1hbiBwYWdlIG9yICIKCQkJCQkJ CXByaW50ICJzZWN0aW9uIDIuMiBcIlNvZnR3YXJlIEF2YWlsYWJpbGl0eVwiIGluIHRoZSBH ZW50b28gSGFuZGJvb2suIgoJCQkJCQkJaWYgbXlwYXJlbnQ6CgkJCQkJCQkJcHJpbnQgICAg ICIhISEgICAgIityZWQoeGZyb20pCgkJCQkJCQlwcmludAoJCQkJCQllbHNlOgoJCQkJCQkJ cHJpbnQgIlxuISEhICIrcmVkKCJUaGVyZSBhcmUgbm8gcGFja2FnZXMgYXZhaWxhYmxlIHRv IHNhdGlzZnk6ICIpK2dyZWVuKHhpbmZvKQoJCQkJCQkJcHJpbnQgIiEhISBFaXRoZXIgYWRk IGEgc3VpdGFibGUgYmluYXJ5IHBhY2thZ2Ugb3IgY29tcGlsZSBmcm9tIGFuIGVidWlsZC4i CgkJCQkJZWxzZToKCQkJCQkJcHJpbnQgIlxuZW1lcmdlOiB0aGVyZSBhcmUgbm8gZWJ1aWxk cyB0byBzYXRpc2Z5ICIreGluZm8rIi4iCgkJCQkJCXByaW50CgkJCQkJcmV0dXJuIDAKCgkJ CQlpZiAiLS1kZWJ1ZyIgaW4gc2VsZi5teW9wdHM6CgkJCQkJcHJpbnQgImVidWlsZDoiLG15 ZWIKCQkJCQlwcmludCAiYmlucGtnOiIsbXllYl9wa2cKCgkJCQlpZiBteWViIGFuZCBteWVi X3BrZzoKCQkJCQlteWViX3MgICAgID0gcG9ydGFnZV92ZXJzaW9ucy5jYXRwa2dzcGxpdCht eWViKQoJCQkJCW15ZWJfcyAgICAgPSBbbXllYl9zWzBdKyIvIitteWViX3NbMV0sIG15ZWJf c1syXSwgbXllYl9zWzNdXQoJCQkJCW15ZWJfcGtnX3MgPSBwb3J0YWdlX3ZlcnNpb25zLmNh dHBrZ3NwbGl0KG15ZWJfcGtnKQoJCQkJCW15ZWJfcGtnX3MgPSBbbXllYl9wa2dfc1swXSsi LyIrbXllYl9wa2dfc1sxXSwgbXllYl9wa2dfc1syXSwgbXllYl9wa2dfc1szXV0KCQkJCQkK CQkJCQlpZiBwb3J0YWdlX3ZlcnNpb25zLnBrZ2NtcChteWViX3MsIG15ZWJfcGtnX3MpID09 IDA6CgkJCQkJCSMgcGtnIGlzIHNhbWUgdmVyc2lvbiBhcyBlYnVpbGQKCQkJCQkJbXllYiA9 IE5vbmUKCQkJCQllbHNlOgoJCQkJCQlteWViX3BrZyA9IE5vbmUKCgkJCQlpZiBteWViOgoJ CQkJCW15az1bImVidWlsZCIsbXlyb290LG15ZWJdCgkJCQllbGlmIG15ZWJfcGtnOgoJCQkJ CWJpbnBrZ3VzZWZsYWdzPXBvcnRhZ2UuZGJbcG9ydGFnZS5yb290XVsiYmludHJlZSJdLmdl dF91c2UobXllYl9wa2cpCgkJCQkJbXlrPVsiYmluYXJ5IixteXJvb3QsbXllYl9wa2ddCgkJ CQllbHNlOgoJCQkJCXN5cy5zdGRlcnIud3JpdGUoIiEhISBDb25mdXNlZC4uLiBEb24ndCBr bm93IHdoYXQgSSdtIHVzaW5nIGZvciBkZXBlbmRlbmN5IGluZm8uIDooXG4iKQoJCQkJCXN5 cy5leGl0KDEpCgoJCQkJI2lmICItLXVzZXBrZyIgaW4gbXlvcHRzOgoJCQkJIwkjSWYgd2Ug d2FudCB0byB1c2UgcGFja2FnZXMsIHNlZSBpZiB3ZSBoYXZlIGEgcHJlLWJ1aWx0IG9uZS4u LgoJCQkJIwlteXBrPXBvcnRhZ2UuZGJbIi8iXVsiYmludHJlZSJdLmRiYXBpLm1hdGNoKHgp CgkJCQkjCWlmIG15ZWIgaW4gbXlwazoKCQkJCSMJCSNVc2UgaXQgb25seSBpZiBpdCdzIGV4 YWN0bHkgdGhlIHZlcnNpb24gd2Ugd2FudC4KCQkJCSMJCW15az1bImJpbmFyeSIsbXlyb290 LG15ZWJdCgkJCQkjCWVsc2U6CgkJCQkjCQlteWs9WyJlYnVpbGQiLG15cm9vdCxteWViXQoJ CQkJI2Vsc2U6CgkJCQkjCW15az1bImVidWlsZCIsbXlyb290LG15ZWJdCgkJCWlmIG15cGFy ZW50OgoJCQkJI3dlIGFyZSBhIGRlcGVuZGVuY3ksIHNvIHdlIHdhbnQgdG8gYmUgdW5jb25k aXRpb25hbGx5IGFkZGVkCgkJCQlpZiBub3Qgc2VsZi5jcmVhdGUobXlrLG15cGFyZW50LG15 dXNlPWJpbnBrZ3VzZWZsYWdzKToKCQkJCQlyZXR1cm4gMAoJCQllbHNlOgoJCQkJI2lmIG15 c291cmNlIGlzIG5vdCBzZXQsIHRoZW4gd2UgYXJlIGEgY29tbWFuZC1saW5lIGRlcGVuZGVu Y3kgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQKCQkJCSNpZiAtLW9ubHlkZXBzIGlzIHNwZWNp ZmllZC4KCQkJCWlmIG5vdCBzZWxmLmNyZWF0ZShteWssbXlwYXJlbnQsIi0tb25seWRlcHMi IG5vdCBpbiBzZWxmLm15b3B0cyxteXVzZT1iaW5wa2d1c2VmbGFncyk6CgkJCQkJcmV0dXJu IDAKCgkJaWYgIi0tZGVidWciIGluIHNlbGYubXlvcHRzOgoJCQlwcmludCAiRXhpdGluZy4u LiIsbXlwYXJlbnQKCQlyZXR1cm4gMQoJCQoKCWRlZiBhbHRsaXN0KHNlbGYpOgoJCW15Z3Jh cGg9c2VsZi5teW5ld2dyYXBoLmNsb25lKCkKCQlkb2xpc3Q9WyIvIl0KCQlyZXRsaXN0PVtd CgkJZm9yIHggaW4gcG9ydGFnZS5kYjoKCQkJcG9ydGFnZS5kYlt4XVsibWVyZ2UiXT1bXQoJ CQlpZiB4IG5vdCBpbiBkb2xpc3Q6CgkJCQlkb2xpc3QuYXBwZW5kKHgpCgkJd2hpbGUgbXln cmFwaC5nZXRfYWxsX25vZGVzKCk6CgkJCW15Y3Vya2V5PW15Z3JhcGguZ2V0X2xlYWZfbm9k ZXMoKVswXQoJCQlzcGxpdHNraT1teWN1cmtleS5zcGxpdCgpCgkJCXBvcnRhZ2UuZGJbc3Bs aXRza2lbMV1dWyJtZXJnZSJdLmFwcGVuZChzcGxpdHNraSkJCgkJCW15Z3JhcGgucmVtb3Zl X25vZGUobXljdXJrZXkpCgkJZm9yIHggaW4gZG9saXN0OgoJCQlmb3IgeSBpbiBwb3J0YWdl LmRiW3hdWyJtZXJnZSJdOgoJCQkJcmV0bGlzdC5hcHBlbmQoeSkKCQlyZXR1cm4gcmV0bGlz dAoKCWRlZiB4Y3JlYXRlKHNlbGYsbW9kZT0ic3lzdGVtIik6CgkJaWYgbW9kZT09InN5c3Rl bSI6CgkJCW15bGlzdD1nZXRsaXN0KCJzeXN0ZW0iKQoJCWVsc2U6CgkJCSN3b3JsZCBtb2Rl CgkJCXdvcmxkbGlzdD1nZXRsaXN0KCJ3b3JsZCIpCgkJCXN5c2RpY3Q9Z2VuZXJpY2RpY3Qo Z2V0bGlzdCgic3lzdGVtIikpCgkJCXdvcmxkZGljdD1nZW5lcmljZGljdCh3b3JsZGxpc3Qp CgkJCSN3ZSdyZSBlZmZlY3RpdmVseSB1cGdyYWRpbmcgc3lzZGljdCB0byBjb250YWluIGFs bCBuZXcgZGVwcyBmcm9tIHdvcmxkZGljdAoJCQlmb3IgeCBpbiB3b3JsZGRpY3Qua2V5cygp OgoJCQkJI29ubHkgYWRkIHRoZSB3b3JsZCBub2RlIGlmIHRoZSBwYWNrYWdlIGlzOgoJCQkJ I2FjdHVhbGx5IGluc3RhbGxlZCAtLSB0aGlzIHByZXZlbnRzIHRoZSByZW1lcmdpbmcgb2Yg YWxyZWFkeSB1bm1lcmdlZCBwYWNrYWdlcyB3aGVuIHdlIGRvIGEgd29ybGQgLS11cGRhdGU7 CgkJCQkjYWN0dWFsbHkgYXZhaWxhYmxlIC0tIHRoaXMgcHJldmVudHMgZW1lcmdlIGZyb20g Ym9tYmluZyBvdXQgZHVlIHRvIG5vIG1hdGNoIGJlaW5nIGZvdW5kICh3ZSB3YW50IGEgc2ls ZW50IGlnbm9yZSkKCQkJCWlmICJlbXB0eSIgaW4gc2VsZi5teXBhcmFtczoKCQkJCQlpZiBw b3J0YWdlLmRiWyIvIl1bInZhcnRyZWUiXS5kYmFwaS5tYXRjaCh4KToKCQkJCQkJc3lzZGlj dFt4XT13b3JsZGRpY3RbeF0KCQkJCWVsaWYgcG9ydGFnZS5kYltwb3J0YWdlLnJvb3RdWyJ2 YXJ0cmVlIl0uZGJhcGkubWF0Y2goeCk6CgkJCQkJI3BhY2thZ2UgaXMgaW5zdGFsbGVkCgkJ CQkJc3lzZGljdFt4XT13b3JsZGRpY3RbeF0KCQkJCWVsc2U6CgkJCQkJcHJpbnQgIlxuKioq IFBhY2thZ2UgaW4gd29ybGQgZmlsZSBpcyBub3QgaW5zdGFsbGVkOiAiK3gKCQkJbXlsaXN0 ID0gc3lzZGljdC52YWx1ZXMoKQoKCQlmb3IgbXlkZXAgaW4gbXlsaXN0OgoJCQlteWViPXBv cnRhZ2UucG9ydGRiLnhtYXRjaCgiYmVzdG1hdGNoLXZpc2libGUiLG15ZGVwKQoJCQlpZiBu b3QgbXllYjoKCQkJCSN0aGlzIGlzIGFuIHVuYXZhaWxhYmxlIHdvcmxkIGVudHJ5OyBqdXN0 IGNvbnRpbnVlCgkJCQljb250aW51ZQoKCQkJI1RISVMgTkVYVCBCVU5DSCBPRiBDT0RFIE5F RURTIFRPIEJFIFJFUExBQ0VEIFRPIFNVUFBPUlQgV09STEQgQU5USS1ERVBTCgkJCSNpZiBt eWRlcDJbMF09PSIhIjosIGV0Yy4KCQkJYmlucGtndXNlZmxhZ3MgPSBOb25lCgkJCWlmICIt LXVzZXBrZyIgaW4gc2VsZi5teW9wdHM6CgkJCQlteXBrPXBvcnRhZ2UuZGJbcG9ydGFnZS5y b290XVsiYmludHJlZSJdLmRlcF9iZXN0bWF0Y2gobXlkZXApCgkJCQlpZiBteWViPT1teXBr OgoJCQkJCW15az1bImJpbmFyeSIscG9ydGFnZS5yb290LG15cGtdCgkJCQkJYmlucGtndXNl ZmxhZ3M9cG9ydGFnZS5kYltwb3J0YWdlLnJvb3RdWyJiaW50cmVlIl0uZ2V0X3VzZShteXBr KQoJCQkJZWxpZiAiLS11c2Vwa2dvbmx5IiBpbiBzZWxmLm15b3B0czoKCQkJCQlpZiBub3Qg bXlwazoKCQkJCQkJc2VsZi5taXNzaW5nYmlucyArPSBbbXllYl0KCQkJCQkJbXlrPVsiYmlu YXJ5Iixwb3J0YWdlLnJvb3QsbXllYl0KCQkJCQllbHNlOgoJCQkJCQlteWs9WyJiaW5hcnki LHBvcnRhZ2Uucm9vdCxteXBrXQoJCQkJZWxzZToKCQkJCQlteWs9WyJlYnVpbGQiLHBvcnRh Z2Uucm9vdCxteWViXQoJCQllbHNlOgoJCQkJbXlrPVsiZWJ1aWxkIixwb3J0YWdlLnJvb3Qs bXllYl0KCgkJCWlmIG5vdCBzZWxmLmNyZWF0ZShteWssbXl1c2U9YmlucGtndXNlZmxhZ3Mp OgoJCQkJcHJpbnQKCQkJCXByaW50ICIhISEgUHJvYmxlbSB3aXRoIixteWtbMF0sbXlrWzJd CgkJCQlwcmludCAiISEhIFBvc3NpYmx5IGEgREVQRU5ELypERVBFTkQgcHJvYmxlbS4iCgkJ CQlwcmludAoJCQkJcmV0dXJuIDAKCQlyZXR1cm4gMQoKCWRlZiBtYXRjaChzZWxmLG15ZGVw LG15cm9vdD1wb3J0YWdlLnJvb3QsbXlrZXk9Tm9uZSk6CgkJIyBzdXBwb3J0IG11dHVhbCBl eGNsdXNpdmUgZGVwcwoJCWlmIG15ZGVwWzBdPT0iISI6CgkJCSNhZGQgb3VyIGJsb2NrZXI7 IGl0IHdpbGwgYmUgaWdub3JlZCBsYXRlciBpZiBuZWNlc3NhcnkgKGlmIHdlIGFyZSByZW1l cmdpbmcgdGhlIHNhbWUgcGtnLCBmb3IgZXhhbXBsZSkKCQkJbXlrPSJibG9ja3MgIitteXJv b3QrIiAiK215ZGVwWzE6XQoJCWVsc2U6CgkJCW15ZWI9cG9ydGFnZS5kYltwb3J0YWdlLnJv b3RdWyJwb3J0dHJlZSJdLmRlcF9iZXN0bWF0Y2gobXlkZXApCgkJCWlmIG5vdCBteWViOgoJ CQkJaWYgbm90IG15a2V5OgoJCQkJCXByaW50ICJcbiEhISBFcnJvcjogY291bGRuJ3QgZmlu ZCBtYXRjaCBmb3IiLG15ZGVwCgkJCQllbHNlOgoJCQkJCXByaW50ICJcbiEhISBFcnJvcjog Y291bGRuJ3QgZmluZCBtYXRjaCBmb3IiLG15ZGVwLCJpbiIsbXlrZXkKCQkJCXByaW50CgkJ CQlzeXMuZXhpdCgxKQoKCQkJaWYgIi0tdXNlcGtnIiBpbiBzZWxmLm15b3B0czoKCQkJCW15 cGs9cG9ydGFnZS5kYltwb3J0YWdlLnJvb3RdWyJiaW50cmVlIl0uZGVwX2Jlc3RtYXRjaCht eWRlcCkKCQkJCWlmIG15ZWI9PW15cGs6CgkJCQkJbXlrPSJiaW5hcnkgIitwb3J0YWdlLnJv b3QrIiAiK215cGsKCQkJCWVsc2U6CgkJCQkJbXlrPSJlYnVpbGQgIitteXJvb3QrIiAiK215 ZWIKCQkJZWxzZToKCQkJCW15az0iZWJ1aWxkICIrbXlyb290KyIgIitteWViCgoJCXJldHVy biBteWsKCglkZWYgZGlzcGxheShzZWxmLG15bGlzdCk6CgkJY2hhbmdlbG9ncz1bXQoJCXA9 W10KCQl0b3RhbHNpemU9MAoKCQlpZiBzZWxmLnZlcmJvc2l0eToKCQkJb3ZlcmxheXMgPSBw b3J0YWdlLnNldHRpbmdzWydQT1JURElSX09WRVJMQVknXS5zcGxpdCgpCgkJCgkJaSA9IDAK CQl3aGlsZSBpIDwgbGVuKG15bGlzdCk6CgkJCWlmIG15bGlzdFtpXVstMV09PSJub21lcmdl IjoKCQkJCSMgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGVsZW1lbnRzCgkJCQlteWxpc3Qu cG9wKGkpCgkJCQljb250aW51ZQoJCQkjIHRoZSBicmFuY2ggY29udGludWVzLCBvciB3ZSd2 ZSBmb3VuZCBhIGdvb2QgZWxlbWVudC4KCQkJIyAtPiBsZXQncyBzZWUgd2hhdCdzIG5leHQs IGlmIGFueXRoaW5nCgkJCWkgKz0gMQoKCQlkaXNwbGF5X292ZXJsYXlzPUZhbHNlCgkJIyBm aWxlcyB0byBmZXRjaCBsaXN0IC0gYXZvaWRzIGNvdW50aW5nIGEgc2FtZSBmaWxlIHR3aWNl IAoJCSMgaW4gc2l6ZSBkaXNwbGF5ICh2ZXJib3NlIG1vZGUpCgkJbXlmZXRjaGxpc3Q9W10K CQlmb3IgeCBpbiBteWxpc3Q6CgkJCWZldGNoPSIgIgoJCQkKCQkJaWYgeFswXT09ImJsb2Nr cyI6CgkJCQlhZGRsPSIiK3JlZCgiQiIpKyIgICIrZmV0Y2grIiAgIgoJCQkJcmVzb2x2ZWQ9 cG9ydGFnZS5kYlt4WzFdXVsidmFydHJlZSJdLnJlc29sdmVfa2V5KHhbMl0pCgkJCQlwcmlu dCAiWyIreFswXSsiICIrYWRkbCsiXSIscmVkKHJlc29sdmVkKSwKCQkJCWlmIHJlc29sdmVk IT14WzJdOgoJCQkJCWlmIHhbM106CgkJCQkJCXByaW50IHJlZCgiKFwiIit4WzJdKyJcIiBp cyBibG9ja2luZyAiK3hbM10rIikiKQoJCQkJCWVsc2U6CgkJCQkJCXByaW50IHJlZCgiKFwi Iit4WzJdKyJcIikiKQoJCQkJZWxzZToKCQkJCQlpZiB4WzNdOgoJCQkJCQlwcmludCByZWQo IihpcyBibG9ja2luZyAiK3hbM10rIikiKQoJCQkJCWVsc2U6CgkJCQkJCXByaW50CgkJCWVs c2U6CgkJCQlpZiAoeFswXSE9ImJpbmFyeSIpIGFuZCAoImZldGNoIiBpbiBwb3J0YWdlLnBv cnRkYi5hdXhfZ2V0KHhbMl0sWyJSRVNUUklDVCJdKVswXS5zcGxpdCgpKToKCQkJCQlmZXRj aCA9IHJlZCgiRiIpCgkJCQkJaWYgcG9ydGFnZS5wb3J0ZGIuZmV0Y2hfY2hlY2soeFsyXSwg cG9ydGFnZS5zZXR0aW5ncyk6CgkJCQkJCWZldGNoID0gZ3JlZW4oImYiKQoKCQkJCSN3ZSBu ZWVkIHRvIHVzZSAiLS1lbXB0cnl0cmVlIiB0ZXN0aW5nIGhlcmUgcmF0aGVyIHRoYW4gImVt cHR5IiBwYXJhbSB0ZXN0aW5nIGJlY2F1c2UgImVtcHR5IgoJCQkJI3BhcmFtIGlzIHVzZWQg Zm9yIC11LCB3aGVyZSB5b3Ugc3RpbGwgKmRvKiB3YW50IHRvIHNlZSB3aGVuIHNvbWV0aGlu ZyBpcyBiZWluZyB1cGdyYWRlZC4KCQkJCW15b2xkYmVzdD0iIgoJCQkJaWYgKG5vdCAiLS1l bXB0eXRyZWUiIGluIHNlbGYubXlvcHRzKSBhbmQgcG9ydGFnZS5kYlt4WzFdXVsidmFydHJl ZSJdLmV4aXN0c19zcGVjaWZpYyh4WzJdKToKCQkJCQlhZGRsPSIgICIreWVsbG93KCJSIikr ZmV0Y2grIiAgIgoJCQkJZWxpZiAobm90ICItLWVtcHR5dHJlZSIgaW4gc2VsZi5teW9wdHMp IGFuZCBwb3J0YWdlLmRiW3hbMV1dWyJ2YXJ0cmVlIl0uZXhpc3RzX3NwZWNpZmljX2NhdCh4 WzJdKToKCQkJCQlpZiB4WzBdID09ICJiaW5hcnkiOgoJCQkJCQlteW5ld3Nsb3Q9cG9ydGFn ZS5kYlsiLyJdWyJiaW50cmVlIl0uZ2V0c2xvdCh4WzJdKQoJCQkJCWVsaWYgeFswXSA9PSAi ZWJ1aWxkIjoKCQkJCQkJbXluZXdzbG90PXBvcnRhZ2UuZGJbIi8iXVsicG9ydHRyZWUiXS5n ZXRzbG90KHhbMl0pCgkJCQkJbXlvbGRsaXN0PXBvcnRhZ2UuZGJbeFsxXV1bInZhcnRyZWUi XS5kYmFwaS5tYXRjaChwb3J0YWdlX3ZlcnNpb25zLnBrZ3NwbGl0KHhbMl0pWzBdKQoJCQkJ CW15aW5zbG90bGlzdD1maWx0ZXIoKGxhbWJkYSBwOiBwb3J0YWdlLmRiW3BvcnRhZ2Uucm9v dF1bInZhcnRyZWUiXS5nZXRzbG90KHApPT1teW5ld3Nsb3QpLG15b2xkbGlzdCkKCQkJCQlp ZiBteWluc2xvdGxpc3Q6CgkJCQkJCW15b2xkYmVzdD1wb3J0YWdlLmJlc3QobXlpbnNsb3Rs aXN0KQoJCQkJCQlhZGRsPSIgICAiK2ZldGNoCgkJCQkJCWlmIHBvcnRhZ2VfdmVyc2lvbnMu cGtnY21wKHBvcnRhZ2VfdmVyc2lvbnMucGtnc3BsaXQoeFsyXSksIHBvcnRhZ2VfdmVyc2lv bnMucGtnc3BsaXQobXlvbGRiZXN0KSkgPCAwOgoJCQkJCQkJIyBEb3duZ3JhZGUgaW4gc2xv dAoJCQkJCQkJYWRkbCs9dHVycXVvaXNlKCJVIikrYmx1ZSgiRCIpCgkJCQkJCWVsc2U6CgkJ CQkJCQkjIFVwZGF0ZSBpbiBzbG90CgkJCQkJCQlhZGRsKz10dXJxdW9pc2UoIlUiKSsiICIK CQkJCQllbHNlOgoJCQkJCQkjIE5ldyBzbG90LCBtYXJrIGl0IG5ldy4KCQkJCQkJYWRkbD0i ICIrZ3JlZW4oIk5TIikrZmV0Y2grIiAgIgoKCQkJCQlpZiAiLS1jaGFuZ2Vsb2ciIGluIHNl bGYubXlvcHRzOgoJCQkJCQljaGFuZ2Vsb2dzLmV4dGVuZChzZWxmLmNhbGNfY2hhbmdlbG9n KAoJCQkJCQkJcG9ydGFnZS5wb3J0ZGIuZmluZG5hbWUoeFsyXSksCgkJCQkJCQlwb3J0YWdl LmRiWyIvIl1bInZhcnRyZWUiXS5kZXBfYmVzdG1hdGNoKCcvJy5qb2luKHBvcnRhZ2VfdmVy c2lvbnMuY2F0cGtnc3BsaXQoeFsyXSlbOjJdKSksCgkJCQkJCQl4WzJdCgkJCQkJCQkpKQoJ CQkJZWxzZToKCQkJCQlhZGRsPSIgIitncmVlbigiTiIpKyIgIitmZXRjaCsiICAiCgoJCQkJ dmVyYm9zZWFkZD0iIgoJCQkJaWYgc2VsZi52ZXJib3NpdHkgPiAwOgoJCQkJCSMgaXVzZSB2 ZXJib3NlCgkJCQkJdHJ5OgoJCQkJCQlpZiB4WzBdID09ICJiaW5hcnkiOgoJCQkJCQkJaXVz ZV9zcGxpdCA9IHBvcnRhZ2UuZGJbIi8iXVsiYmludHJlZSJdLmRiYXBpLmF1eF9nZXQoeFsy XSxbIklVU0UiXSlbMF0uc3BsaXQoKQoJCQkJCQllbGlmIHhbMF0gPT0gImVidWlsZCI6CgkJ CQkJCQlpdXNlX3NwbGl0ID0gcG9ydGFnZS5wb3J0ZGIuYXV4X2dldCh4WzJdLFsiSVVTRSJd KVswXS5zcGxpdCgpCgkJCQkJCWVsc2U6CgkJCQkJCQlpdXNlX3NwbGl0ID0gW10KCQkJCQll eGNlcHQgU3lzdGVtRXhpdCwgZToKCQkJCQkJcmFpc2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBl eGl0CgkJCQkJZXhjZXB0OgoJCQkJCQlwb3J0YWdlLndyaXRlbXNnKCIhISEgRXJyb3IgZ2V0 dGluZyBJVVNFIChyZXBvcnQgdGhpcyB0byBidWdzLmdlbnRvby5vcmcpXG4iKQoJCQkJCQlw b3J0YWdlLndyaXRlbXNnKCIhISEgJXNcbiIgJSB4KQoJCQkJCQlpdXNlX3NwbGl0ID0gW10K CQkJCQlpdXNlX3NwbGl0LnNvcnQoKQoJCQkJCW9sZF91c2U9Tm9uZQoJCQkJCWlmIG15b2xk YmVzdDoKCQkJCQkJcGtnPW15b2xkYmVzdAoJCQkJCWVsc2U6CgkJCQkJCXBrZz14WzJdCgkJ CQkJaWYgcG9ydGFnZS5kYlsiLyJdWyJ2YXJ0cmVlIl0uZGJhcGkuY3B2X2V4aXN0cyhwa2cp OgoJCQkJCQl0cnk6CgkJCQkJCQlvbGRfdXNlPXBvcnRhZ2UuZGJbIi8iXVsidmFydHJlZSJd LmRiYXBpLmF1eF9nZXQocGtnLCBbIlVTRSJdKVswXS5zcGxpdCgpCgkJCQkJCWV4Y2VwdCBT eXN0ZW1FeGl0LCBlOgoJCQkJCQkJcmFpc2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBleGl0CgkJ CQkJCWV4Y2VwdDoKCQkJCQkJCXBhc3MKCQkJCQlpdXNlPSIiCgkJCQkJbm93X3VzZT1zZWxm LmFwcGxpZWRfdXNlZmxhZ3NbeFsyXV0KCQkJCQlmb3IgZWJ1aWxkX2l1c2UgaW4gcG9ydGFn ZV91dGlsLnVuaXF1ZV9hcnJheShpdXNlX3NwbGl0KToKCQkJCQkJdXNlY2hhbmdlPSIiCgkJ CQkJCWlmIG9sZF91c2U6CgkJCQkJCQlpZiAob2xkX3VzZS5jb3VudChlYnVpbGRfaXVzZSkg YW5kIG5vdCBub3dfdXNlLmNvdW50KGVidWlsZF9pdXNlKSkgb3IgKG5vdCBvbGRfdXNlLmNv dW50KGVidWlsZF9pdXNlKSBhbmQgbm93X3VzZS5jb3VudChlYnVpbGRfaXVzZSkpOgoJCQkJ CQkJCXVzZWNoYW5nZT0iKiIKCgkJCQkJCWlmIGVidWlsZF9pdXNlIGluIHNlbGYuYXBwbGll ZF91c2VmbGFnc1t4WzJdXToKCQkJCQkJCWlmIHVzZWNoYW5nZSA9PSAiKiI6CgkJCQkJCQkJ aXVzZT1ncmVlbigiKyIrZWJ1aWxkX2l1c2UpCgkJCQkJCQllbHNlOgoJCQkJCQkJCWl1c2U9 cmVkKCIrIitlYnVpbGRfaXVzZSkKCQkJCQkJZWxpZiBlYnVpbGRfaXVzZSBpbiBwb3J0YWdl LnNldHRpbmdzLnVzZW1hc2s6CgkJCQkJCQlpdXNlPWJsdWUoIigtIitlYnVpbGRfaXVzZSsi KSIpCgkJCQkJCWVsc2U6CgkJCQkJCQlpdXNlPWJsdWUoIi0iK2VidWlsZF9pdXNlKQoJCQkJ CQl2ZXJib3NlYWRkKz1pdXNlK3VzZWNoYW5nZSsiICIKCQkJCQlpZiAoc2VsZi52ZXJib3Np dHkgYW5kICItLXByZXRlbmQiIG5vdCBpbiBzZWxmLm15b3B0cykgb3IgXAoJCQkJCQkoc2Vs Zi52ZXJib3NpdHkgPiAxIGFuZCAiLS1wcmV0ZW5kIiBpbiBzZWxmLm15b3B0cyk6CgkJCQkJ CSMgc2hvdyBoZXJkL21haW50YWluZXJzLgoJCQkJCQltZXRhZGF0YV9maWxlPXBvcnRhZ2Uu c2V0dGluZ3NbIlBPUlRESVIiXSArICIvIiArIHBvcnRhZ2UucG9ydGFnZV92ZXJzaW9ucy5w a2dzcGxpdCh4WzJdKVswXSArICIvbWV0YWRhdGEueG1sIgoJICAgICAgICAJCQkJaWYgbm90 IG9zLnBhdGguZXhpc3RzKG1ldGFkYXRhX2ZpbGUpOgoJCQkJCQkJdmVyYm9zZWFkZCArPSBy ZWQoIihNaXNzaW5nIG1ldGFkYXRhLnhtbCkgIikKCQkJCQkJZWxzZToKCQkJCQkJCXBhcnNl ciA9IHBvcnRhZ2VfbWV0YWRhdGEubWFrZV9wYXJzZXIoKQoJCQkJCQkJaGFuZGxlciA9IHBv cnRhZ2VfbWV0YWRhdGEuTWV0YWRhdGFfWE1MKCkKCQkJCQkJCWhhbmRsZXIuX21haW50YWlu ZXJzID0gW10KCQkJCQkJCWhhbmRsZXIuX2hlcmRzID0gW10KCQkJCQkJCXBhcnNlci5zZXRD b250ZW50SGFuZGxlcihoYW5kbGVyKQoJCQkJCQkJcGFyc2VyLnBhcnNlKCBtZXRhZGF0YV9m aWxlICkKCgkJCQkJCQlpZiBsZW4oaGFuZGxlci5faGVyZHMpID4gMDoKCQkJCQkJCQl2ZXJi b3NlYWRkICs9ICIoIisgdGVhbCgiSDoiICsgIiwgIi5qb2luKGhhbmRsZXIuX2hlcmRzKSAp ICsgIikiCgkJCQkJCQkJaWYgbGVuKGhhbmRsZXIuX21haW50YWluZXJzKSA8IDE6CgkJCQkJ CQkJCXZlcmJvc2VhZGQgKz0gIiAoIiArIHRlYWwoIk06IiArICIsICIuam9pbihoYW5kbGVy Ll9oZXJkcykgKSArICIpICIKCQkJCQkJCQllbHNlOgoJCQkJCQkJCQl2ZXJib3NlYWRkICs9 ICIgKCIgKyB0ZWFsKCJNOiIgKyAiLCAiLmpvaW4oaGFuZGxlci5fbWFpbnRhaW5lcnMpICkg KyAiKSAiCgoKCQkJCQkjIHNpemUgdmVyYm9zZQoJCQkJCW15c2l6ZT0wCgkJCQkJaWYgeFsw XSA9PSAiZWJ1aWxkIiBhbmQgeFstMV0hPSJub21lcmdlIjoKCQkJCQkJbXlmaWxlc2RpY3Q9 cG9ydGFnZS5wb3J0ZGIuZ2V0ZmV0Y2hzaXplcyh4WzJdLCB1c2VmbGFncz1zZWxmLmFwcGxp ZWRfdXNlZmxhZ3NbeFsyXV0sIGRlYnVnPXNlbGYuZWRlYnVnKQoJCQkJCQlpZiBteWZpbGVz ZGljdD09Tm9uZToKCQkJCQkJCW15ZmlsZXNkaWN0PSJbZW1wdHkvbWlzc2luZy9iYWQgZGln ZXN0XSIKCQkJCQkJZWxzZToKCQkJCQkJCWZvciBteWZldGNoZmlsZSBpbiBteWZpbGVzZGlj dC5rZXlzKCk6CgkJCQkJCQkJaWYgbXlmZXRjaGZpbGUgbm90IGluIG15ZmV0Y2hsaXN0OgoJ CQkJCQkJCQlteXNpemUrPW15ZmlsZXNkaWN0W215ZmV0Y2hmaWxlXQoJCQkJCQkJCQlteWZl dGNobGlzdC5hcHBlbmQobXlmZXRjaGZpbGUpCgkJCQkJCQl0b3RhbHNpemUrPW15c2l6ZQoJ CQkJCQl2ZXJib3NlYWRkKz1mb3JtYXRfc2l6ZShteXNpemUpKyIgIgoKCQkJCQkjIG92ZXJs YXkgdmVyYm9zZQoJCQkJCSMgWFhYOiBJbnZhbGlkIGJpbmFyaWVzIGhhdmUgY2F1c2VkIHRy YWNlYmFja3MgaGVyZS4gJ2lmIGZpbGVfbmFtZScKCQkJCQkjIHggPSBbJ2JpbmFyeScsICcv JywgJ3N5cy1hcHBzL3BjbWNpYS1jcy0zLjIuNy4yLjYnLCAnbWVyZ2UnXQoJCQkJCWZpbGVf bmFtZT1wb3J0YWdlLnBvcnRkYi5maW5kbmFtZSh4WzJdKQoJCQkJCWlmIGZpbGVfbmFtZTog IyBJdCBtaWdodCBub3QgZXhpc3QgaW4gdGhlIHRyZWUKCQkJCQkJZGlyX25hbWU9b3MucGF0 aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShmaWxlX25hbWUpKyIvLi4vLi4iKQoJCQkJCQlp ZiAob3ZlcmxheXMuY291bnQoZGlyX25hbWUpPjApOgoJCQkJCQkJdmVyYm9zZWFkZCs9dGVh bCgiWyIrc3RyKG92ZXJsYXlzLmluZGV4KG9zLnBhdGgubm9ybXBhdGgoZGlyX25hbWUpKSsx KSsiXSIpKyIgIgoJCQkJCQkJZGlzcGxheV9vdmVybGF5cz1UcnVlCgkJCQkJZWxzZToKCQkJ CQkJdmVyYm9zZWFkZCArPSAiW05vIGVidWlsZD9dIgoKCQkJCXhzPXBvcnRhZ2UucG9ydGFn ZV92ZXJzaW9ucy5wa2dzcGxpdCh4WzJdKQoJCQkJaWYgeHNbMl09PSJyMCI6CgkJCQkJeHM9 KHhzWzBdLHhzWzFdLCIiKQoJCQkJZWxzZToKCQkJCQl4cz0oeHNbMF0seHNbMV0sIi0iK3hz WzJdKQoKCQkJCWlmIHNlbGYucGtnc2V0dGluZ3MuaGFzX2tleSgiQ09MVU1OV0lEVEgiKToK CQkJCQlteXdpZHRoPWludChzZWxmLnBrZ3NldHRpbmdzWyJDT0xVTU5XSURUSCJdKQoJCQkJ ZWxzZToKCQkJCQlteXdpZHRoPTEzMAoJCQkJb2xkbHA9bXl3aWR0aC0zMAoJCQkJbmV3bHA9 b2xkbHAtMzAKCQkJCQoJCQkJaW5kZW50PSIiCgoJCQkJaWYgbXlvbGRiZXN0OgoJCQkJCW15 b2xkYmVzdD1wb3J0YWdlX3ZlcnNpb25zLnBrZ3NwbGl0KG15b2xkYmVzdClbMV0rIi0iK3Bv cnRhZ2UucG9ydGFnZV92ZXJzaW9ucy5wa2dzcGxpdChteW9sZGJlc3QpWzJdCgkJCQkJaWYg bXlvbGRiZXN0Wy0zOl09PSItcjAiOgoJCQkJCQlteW9sZGJlc3Q9bXlvbGRiZXN0WzotM10K CQkJCQlteW9sZGJlc3Q9Ymx1ZSgiWyIrbXlvbGRiZXN0KyJdIikKCgkJCQlpZiB4WzFdIT0i LyI6CgkJCQkJaWYgIi0tY29sdW1ucyIgaW4gc2VsZi5teW9wdHM6CgkJCQkJCW15cHJpbnQ9 IlsiK3hbMF0rIiAiK2FkZGwrIl0gIitpbmRlbnQrZGFya2dyZWVuKHhzWzBdKQoJCQkJCQlp ZiAobmV3bHAtbmNfbGVuKG15cHJpbnQpKSA+IDA6CgkJCQkJCQlteXByaW50PW15cHJpbnQr KCIgIioobmV3bHAtbmNfbGVuKG15cHJpbnQpKSkKCQkJCQkJbXlwcmludD1teXByaW50KyJb IitkYXJrYmx1ZSh4c1sxXSt4c1syXSkrIl0gIgoJCQkJCQlpZiAob2xkbHAtbmNfbGVuKG15 cHJpbnQpKSA+IDA6CgkJCQkJCQlteXByaW50PW15cHJpbnQrIiAiKihvbGRscC1uY19sZW4o bXlwcmludCkpCgkJCQkJCW15cHJpbnQ9bXlwcmludCtteW9sZGJlc3QKCQkJCQkJbXlwcmlu dD1teXByaW50K2RhcmtncmVlbigiICB0byAiK3hbMV0pKyIgIit2ZXJib3NlYWRkCgkJCQkJ ZWxzZToKCQkJCQkJbXlwcmludD0iWyIreFswXSsiICIrYWRkbCsiXSAiK2RhcmtncmVlbih4 WzJdKSsiICIrbXlvbGRiZXN0KyIgIitkYXJrZ3JlZW4oInRvICIreFsxXSkrIiAiK3ZlcmJv c2VhZGQKCQkJCWVsc2U6CgkJCQkJaWYgIi0tY29sdW1ucyIgaW4gc2VsZi5teW9wdHM6CgkJ CQkJCW15cHJpbnQ9IlsiK3hbMF0rIiAiK2FkZGwrIl0gIitpbmRlbnQrZGFya2dyZWVuKHhz WzBdKQoJCQkJCQlpZiAobmV3bHAtbmNfbGVuKG15cHJpbnQpKSA+IDA6CgkJCQkJCQlteXBy aW50PW15cHJpbnQrKCIgIioobmV3bHAtbmNfbGVuKG15cHJpbnQpKSkKCQkJCQkJbXlwcmlu dD1teXByaW50K2dyZWVuKCIgWyIreHNbMV0reHNbMl0rIl0gIikKCQkJCQkJaWYgKG9sZGxw LW5jX2xlbihteXByaW50KSkgPiAwOgoJCQkJCQkJbXlwcmludD1teXByaW50KygiICIqKG9s ZGxwLW5jX2xlbihteXByaW50KSkpCgkJCQkJCW15cHJpbnQ9bXlwcmludCtteW9sZGJlc3Qr IiAgIit2ZXJib3NlYWRkCgkJCQkJZWxzZToKCQkJCQkJaWYgeFszXT09Im5vbWVyZ2UiOgoJ CQkJCQkJbXlwcmludD1kYXJrYmx1ZSgiW25vbWVyZ2UgICAgICBdICIraW5kZW50K3hbMl0r IiAiK215b2xkYmVzdCsiICIpK3ZlcmJvc2VhZGQKCQkJCQkJZWxzZToKCQkJCQkJCW15cHJp bnQ9IlsiK3hbMF0rIiAiK2FkZGwrIl0gIitpbmRlbnQrZGFya2dyZWVuKHhbMl0pKyIgIitt eW9sZGJlc3QrIiAiK3ZlcmJvc2VhZGQKCQkJCXAuYXBwZW5kKG15cHJpbnQpCgoJCQlpZiAo Ii0tdHJlZSIgbm90IGluIHNlbGYubXlvcHRzKToKCQkJCW15c3BsaXQ9cG9ydGFnZV92ZXJz aW9ucy5wa2dzcGxpdCh4WzJdKQoJCgkJCQkjIFhYWCBteXNwbGl0IF9jYW5fIGJlIE5vbmUu Li4uIFdoeT8KCQkJCWlmIG15c3BsaXQgYW5kIChsZW4obXlzcGxpdCk9PTMpOgoJCQkJCWlm ICItLWVtcHR5dHJlZSIgbm90IGluIHNlbGYubXlvcHRzOgoJCQkJCQlpZiBteXNwbGl0WzBd PT0ic3lzLWFwcHMvcG9ydGFnZSI6CgkJCQkJCQlpZiAobXlzcGxpdFsxXStteXNwbGl0WzJd IT1wb3J0YWdlLlZFUlNJT04gYW5kCgkJCQkJCQkJImxpdmVjdnNwb3J0YWdlIiBub3QgaW4g cG9ydGFnZS5zZXR0aW5ncy5mZWF0dXJlcyk6CgkJCQkJCQkJaWYgbXlsaXN0LmluZGV4KHgp PGxlbihteWxpc3QpLTE6CgkJCQkJCQkJCXAuYXBwZW5kKHJlZCgiKioqIFBvcnRhZ2Ugd2ls bCBzdG9wIG1lcmdpbmcgYXQgdGhpcyBwb2ludCBhbmQgcmVsb2FkIGl0c2VsZiwiKSkKCQkJ CQkJCQkJcC5hcHBlbmQocmVkKCIgICAgcmVjYWxjdWxhdGUgZGVwZW5kZW5jaWVzLCBhbmQg Y29tcGxldGUgdGhlIG1lcmdlLiIpKQoJCQkJCQkJCQlpZiAiLS11cGRhdGUiIG5vdCBpbiBz ZWxmLm15b3B0czoKCQkJCQkJCQkJCXAuYXBwZW5kKGRhcmtncmVlbigiICAgIFlvdSBtYXkg YXZvaWQgdGhlIHJlbWVyZ2luZyBvZiBwYWNrYWdlcyBieSB1cGRhdGluZyBwb3J0YWdlIG9u IGl0cyBvd24uIikpCgkJCQkJCQkJCXByaW50CgkJCQkJZWxzZToKCQkJCQkJaWYgbXlzcGxp dFswXT09InN5cy1hcHBzL3BvcnRhZ2UiIGFuZCAoIi0tZW1wdHl0cmVlIiBpbiBzZWxmLm15 b3B0cyk6CgkJCQkJCQlpZiBteXNwbGl0WzFdK215c3BsaXRbMl0hPXBvcnRhZ2UuVkVSU0lP TjoKCQkJCQkJCQlwLmFwcGVuZChyZWQoIioqKiIpKyIgUGxlYXNlIHVwZGF0ZSBwb3J0YWdl IHRvIHRoZSBhYm92ZSB2ZXJzaW9uIGJlZm9yZSBwcm9jZWVkaW5nLiIpCgkJCQkJCQkJcC5h cHBlbmQoIiAgICBGYWlsdXJlIHRvIGRvIHNvIG1heSByZXN1bHQgaW4gZmFpbGVkIG9yIGlt cHJvcGVyIG1lcmdlcy4iKQoJCQkJCQkJCXAuYXBwZW5kKCIgICAgQSBzaW1wbGUgJyIrZ3Jl ZW4oImVtZXJnZSAtdSBwb3J0YWdlIikrIicgaXMgc3VmZmljaWVudC4iKQoJCQkJCQkJCXAu YXBwZW5kKCIiKQoJCQkJZGVsIG15c3BsaXQKCgkJZm9yIHggaW4gcDoKCQkJcHJpbnQgeAoK CQlpZiBzZWxmLnZlcmJvc2l0eToKCQkJcHJpbnQKCQkJcHJpbnQgIlRvdGFsIHNpemUgb2Yg ZG93bmxvYWRzOiAiK2Zvcm1hdF9zaXplKHRvdGFsc2l6ZSkKCQkJaWYgb3ZlcmxheXMgYW5k IGRpc3BsYXlfb3ZlcmxheXM6CgkJCQlwcmludCAiUG9ydGFnZSBvdmVybGF5czoiCgkJCQl5 PTAKCQkJCWZvciB4IGluIG92ZXJsYXlzOgoJCQkJCXk9eSsxCgkJCQkJcHJpbnQgIiAiK3Rl YWwoIlsiK3N0cih5KSsiXSIpLHgKCQkKCQlpZiAiLS1jaGFuZ2Vsb2ciIGluIHNlbGYubXlv cHRzOgoJCQlwcmludAoJCQlmb3IgcmV2aXNpb24sdGV4dCBpbiBjaGFuZ2Vsb2dzOgoJCQkJ cHJpbnQgYm9sZCgnKicrcmV2aXNpb24pCgkJCQlzeXMuc3Rkb3V0LndyaXRlKHRleHQpCgoJ ZGVmIGNhbGNfY2hhbmdlbG9nKHNlbGYsZWJ1aWxkcGF0aCxjdXJyZW50LG5leHQpOgoJCWN1 cnJlbnQgPSAnLScuam9pbihwb3J0YWdlX3ZlcnNpb25zLmNhdHBrZ3NwbGl0KGN1cnJlbnQp WzE6XSkKCQlpZiBjdXJyZW50LmVuZHN3aXRoKCctcjAnKTogY3VycmVudCA9IGN1cnJlbnRb Oi0zXQoJCW5leHQgPSAnLScuam9pbihwb3J0YWdlX3ZlcnNpb25zLmNhdHBrZ3NwbGl0KG5l eHQpWzE6XSkKCQlpZiBuZXh0LmVuZHN3aXRoKCctcjAnKTogbmV4dCA9IG5leHRbOi0zXQoJ CWNoYW5nZWxvZ3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5zcGxpdChlYnVpbGRwYXRo KVswXSwnQ2hhbmdlTG9nJykKCQl0cnk6CgkJCWNoYW5nZWxvZyA9IG9wZW4oY2hhbmdlbG9n cGF0aCkucmVhZCgpCgkJZXhjZXB0IFN5c3RlbUV4aXQsIGU6CgkJCXJhaXNlICMgTmVlZGVk IGVsc2UgY2FuJ3QgZXhpdAoJCWV4Y2VwdDoKCQkJcmV0dXJuIFtdCgkJZGl2aXNpb25zID0g c2VsZi5maW5kX2NoYW5nZWxvZ190YWdzKGNoYW5nZWxvZykKCQkjcHJpbnQgJ1hYIGZyb20n LGN1cnJlbnQsJ3RvJyxuZXh0CgkJI2ZvciBkaXYsdGV4dCBpbiBkaXZpc2lvbnM6IHByaW50 ICdYWCcsZGl2CgkJIyBza2lwIGVudHJpZXMgZm9yIGFsbCByZXZpc2lvbnMgYWJvdmUgdGhl IG9uZSB3ZSBhcmUgYWJvdXQgdG8gZW1lcmdlCgkJZm9yIGkgaW4gcmFuZ2UobGVuKGRpdmlz aW9ucykpOgoJCQlpZiBkaXZpc2lvbnNbaV1bMF09PW5leHQ6CgkJCQlkaXZpc2lvbnMgPSBk aXZpc2lvbnNbaTpdCgkJCQlicmVhawoJCSMgZmluZCBvdXQgaG93IG1hbnkgZW50cmllcyB3 ZSBhcmUgZ29pbmcgdG8gZGlzcGxheQoJCWZvciBpIGluIHJhbmdlKGxlbihkaXZpc2lvbnMp KToKCQkJaWYgZGl2aXNpb25zW2ldWzBdPT1jdXJyZW50OgoJCQkJZGl2aXNpb25zID0gZGl2 aXNpb25zWzppXQoJCQkJYnJlYWsKCQllbHNlOgoJCSAgICAjIGNvdWxkbnQgZmluZCB0aGUg Y3VycmVudCByZXZpc2lvbiBpbiB0aGUgbGlzdC4gZGlzcGxheSBub3RoaW5nCgkJCXJldHVy biBbXQoJCXJldHVybiBkaXZpc2lvbnMKCglkZWYgZmluZF9jaGFuZ2Vsb2dfdGFncyhzZWxm LGNoYW5nZWxvZyk6CgkJZGl2cyA9IFtdCgkJcmVsZWFzZSA9IE5vbmUKCQl3aGlsZSAxOgoJ CQltYXRjaCA9IHJlLnNlYXJjaChyJ15cKlwgPyhbLWEtekEtWjAtOV8uXSopKD86XCAuKik/ XG4nLGNoYW5nZWxvZyxyZS5NKQoJCQlpZiBtYXRjaCBpcyBOb25lOiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKCQkJCWlmIHJlbGVhc2UgaXMgbm90IE5vbmU6CgkJCQkJZGl2cy5hcHBlbmQo KHJlbGVhc2UsY2hhbmdlbG9nKSkKCQkJCXJldHVybiBkaXZzCgkJCWlmIHJlbGVhc2UgaXMg bm90IE5vbmU6CgkJCQlkaXZzLmFwcGVuZCgocmVsZWFzZSxjaGFuZ2Vsb2dbOm1hdGNoLnN0 YXJ0KCldKSkKCQkJY2hhbmdlbG9nID0gY2hhbmdlbG9nW21hdGNoLmVuZCgpOl0KCQkJcmVs ZWFzZSA9IG1hdGNoLmdyb3VwKDEpCgkJCWlmIHJlbGVhc2UuZW5kc3dpdGgoJy5lYnVpbGQn KToKCQkJCXJlbGVhc2UgPSByZWxlYXNlWzotN10KCQkJaWYgcmVsZWFzZS5lbmRzd2l0aCgn LXIwJyk6CgkJCQlyZWxlYXNlID0gcmVsZWFzZVs6LTNdCgoJZGVmIG91dGRhdGVkKHNlbGYp OgoJCXJldHVybiBzZWxmLm91dGRhdGVkcGFja2FnZXMKCQkJCQojcmV0dmFsPXBvcnRhZ2Uu ZG9lYnVpbGQoeSwiZmV0Y2giLG15cm9vdCxzZWxmLnBrZ3NldHRpbmdzLGVkZWJ1ZywoIi0t cHJldGVuZCIgaW4gbXlvcHRzKSxmZXRjaG9ubHk9MSxmZXRjaGFsbD0xKQoJZGVmIF9fZmV0 Y2goc2VsZiwgcGtnX2xpc3QsZmRfcGlwZXM9ezE6MSwyOjJ9LGZldGNoYWxsPUZhbHNlLHZl cmJvc2l0eT0wKToKCQlteXNldHRpbmdzID0gcG9ydGFnZS5jb25maWcoY2xvbmU9c2VsZi5w a2dzZXR0aW5ncykKIwkJcHJpbnQgInBhc3NlZCBwa2dfbGlzdCIscGtnX2xpc3QKCQlwcmlu dCAia2lkZGllIHBpZCBpcyAlaSIgJSBvcy5nZXRwaWQoKQoJCWZvciB4IGluICgnYXV0b2Fk ZGN2cycsJ2N2cycpOgoJCQl0cnk6CXBvcnRhZ2UuZmVhdHVyZXMucmVtb3ZlKHgpCgkJCWV4 Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCgkJZm9yIHggaW4gcGtnX2xpc3Q6CgkJCXk9cG9ydGFn ZS5wb3J0ZGIuZmluZG5hbWUoeFsyXSkKCQkJcHJpbnQgImZldGNoaW5nIix5CgkJCXRyeToK CQkJCXJldCA9IHBvcnRhZ2UuZG9lYnVpbGQoeSwiZmV0Y2giLCB4WzFdLCBteXNldHRpbmdz LEZhbHNlLCBGYWxzZSwgZmV0Y2hvbmx5PVRydWUsIGZldGNoYWxsPWZldGNoYWxsLHZlcmJv c2l0eT12ZXJib3NpdHkpCgkJCWV4Y2VwdCBFeGNlcHRpb24sZToKCQkJCXJldD0xCgkJCWlm IHJldDoKCQkJCXJldHVybiBGYWxzZQoKCWRlZiBtZXJnZShzZWxmLG15bGlzdCxmYXZvcml0 ZXMpOgoJCXJldHVybm1lPTAKCQlteW1lcmdlbGlzdD1bXQoKCQkjY2hlY2sgZm9yIGJsb2Nr aW5nIGRlcGVuZGVuY2llcwoJCWlmICgiLS1mZXRjaG9ubHkiIG5vdCBpbiBzZWxmLm15b3B0 cykgYW5kICgiLS1idWlsZHBrZ29ubHkiIG5vdCBpbiBzZWxmLm15b3B0cyk6CgkJCWZvciB4 IGluIG15bGlzdDoKCQkJCWlmIHhbMF09PSJibG9ja3MiOgoJCQkJCXByaW50ICJcbiEhISBF cnJvcjogdGhlICIreFsyXSsiIHBhY2thZ2UgY29uZmxpY3RzIHdpdGggYW5vdGhlciBwYWNr YWdlLiIKCQkJCQlwcmludCAgICIhISEgICAgICAgIGJvdGggY2FuJ3QgYmUgaW5zdGFsbGVk IG9uIHRoZSBzYW1lIHN5c3RlbSB0b2dldGhlci4iCgkJCQkJcHJpbnQgICAiISEhICAgICAg ICBQbGVhc2UgdXNlICdlbWVyZ2UgLS1wcmV0ZW5kJyB0byBkZXRlcm1pbmUgYmxvY2tlcnMu IgoJCQkJCXByaW50CgkJCQkJaWYgKCItLXByZXRlbmQiIG5vdCBpbiBzZWxmLm15b3B0cyk6 CgkJCQkJCXN5cy5leGl0KDEpCgoJCSNidWlsZHN5c3BrZzogSSBuZWVkIG15c3lzZGljdCBh bHNvIG9uIHJlc3VtZSAobW92ZWQgZnJvbSB0aGUgZWxzZSBibG9jaykKCQlteXN5c2RpY3Q9 Z2VuZXJpY2RpY3QoZ2V0bGlzdCgic3lzdGVtIikpCgkJaWYgKCItLXJlc3VtZSIgaW4gc2Vs Zi5teW9wdHMpOgoJCQkjIFdlJ3JlIHJlc3VtaW5nLgoJCQlwcmludCBncmVlbigiKioqIFJl c3VtaW5nIG1lcmdlLi4uIikKCQkJc2VsZi5lbWVyZ2Vsb2coIiAqKiogUmVzdW1pbmcgbWVy Z2UuLi4iKQoJCQlteW1lcmdlbGlzdD1wb3J0YWdlLm10aW1lZGJbInJlc3VtZSJdWyJtZXJn ZWxpc3QiXVs6XQoJCQlpZiAoIi0tc2tpcGZpcnN0IiBpbiBzZWxmLm15b3B0cykgYW5kIG15 bWVyZ2VsaXN0OgoJCQkJZGVsIHBvcnRhZ2UubXRpbWVkYlsicmVzdW1lIl1bIm1lcmdlbGlz dCJdWzBdCgkJCQlkZWwgbXltZXJnZWxpc3RbMF0KCQllbHNlOgoJCQlteWZhdnM9cG9ydGFn ZS5ncmFiZmlsZShwb3J0YWdlLnJvb3QrcG9ydGFnZS5XT1JMRF9GSUxFKQoJCQlteWZhdmRp Y3Q9Z2VuZXJpY2RpY3QobXlmYXZzKQoJCQlmb3IgeCBpbiByYW5nZShsZW4obXlsaXN0KSk6 CgkJCQlpZiBteWxpc3RbeF1bM10hPSJub21lcmdlIjoKCQkJCQkjIEFkZCB0byB0aGUgbWVy Z2VsaXN0CgkJCQkJbXltZXJnZWxpc3QuYXBwZW5kKG15bGlzdFt4XSkKCQkJCWVsc2U6CgkJ CQkJbXlmYXZrZXk9cG9ydGFnZS5jcHZfZ2V0a2V5KG15bGlzdFt4XVsyXSkKCQkJCQlpZiAi LS1vbmx5ZGVwcyIgaW4gc2VsZi5teW9wdHM6CgkJCQkJCWNvbnRpbnVlCgkJCQkJIyBBZGQg dG8gdGhlIHdvcmxkIGZpbGUuIFNpbmNlIHdlIHdvbid0IGJlIGFibGUgdG8gbGF0ZXIuCgkJ CQkJaWYgKG5vdCAiLS1mZXRjaG9ubHkiIGluIHNlbGYubXlvcHRzKSBhbmQgKG15ZmF2a2V5 IGluIGZhdm9yaXRlcyk6CgkJCQkJCSNkb24ndCByZWNvcmQgaWYgYWxyZWFkeSBpbiBzeXN0 ZW0gcHJvZmlsZSBvciBhbHJlYWR5IHJlY29yZGVkCgkJCQkJCWlmIChub3QgbXlzeXNkaWN0 Lmhhc19rZXkobXlmYXZrZXkpKSBhbmQgKG5vdCBteWZhdmRpY3QuaGFzX2tleShteWZhdmtl eSkpOgoJCQkJCQkJI3dlIGRvbid0IGhhdmUgYSBmYXZvcml0ZXMgZW50cnkgZm9yIHRoaXMg cGFja2FnZSB5ZXQ7IGFkZCBvbmUKCQkJCQkJCW15ZmF2ZGljdFtteWZhdmtleV09bXlmYXZr ZXkKCQkJCQkJCXByaW50ICI+Pj4gUmVjb3JkaW5nIixteWZhdmtleSwiaW4gXCJ3b3JsZFwi IGZhdm9yaXRlcyBmaWxlLi4uIgoJCQlpZiBub3QgIi0tZmV0Y2hvbmx5IiBpbiBzZWxmLm15 b3B0czoKCQkJCXBvcnRhZ2Uud3JpdGVkaWN0KG15ZmF2ZGljdCxwb3J0YWdlLnJvb3QrcG9y dGFnZS5XT1JMRF9GSUxFLHdyaXRla2V5PTApCgoJCQlwb3J0YWdlLm10aW1lZGJbInJlc3Vt ZSJdWyJtZXJnZWxpc3QiXT1teW1lcmdlbGlzdFs6XQoKCQkjIFdlIG5lZWQgdG8geWFuayB0 aGUgaGFybWZ1bC10by1uZXctYnVpbGRzIHNldHRpbmdzIGZyb20gZmVhdHVyZXMuCgkJbXlv cmlnZmVhdD1zZWxmLnBrZ3NldHRpbmdzWyJGRUFUVVJFUyJdCgkJbXlmZWF0PW15b3JpZ2Zl YXQuc3BsaXQoKQoJCXdoaWxlICJrZWVwdGVtcCIgaW4gbXlmZWF0OgoJCQlteWZlYXQucmVt b3ZlKCJrZWVwdGVtcCIpCgkJd2hpbGUgImtlZXB3b3JrIiBpbiBteWZlYXQ6CgkJCW15ZmVh dC5yZW1vdmUoImtlZXB3b3JrIikKCgkJc2VsZi5wa2dzZXR0aW5nc1siRkVBVFVSRVMiXT0i ICIuam9pbihteWZlYXQpCgkJc2VsZi50aHJlYWQgPSBOb25lCgoJCSMgcGFyYWxsZWwtZmV0 Y2ggc2hvdWxkIG9ubHkga2ljayBpbiB3aGVuIG5vdCBwcmV0ZW5kaW5nLCBlbWVyZ2UgaXNu J3QganVzdCBmZXRjaGluZywgCgkJIyBhbmQgdGhlcmUgaXMgbW9yZSB0aGVuIG9uZSBub2Rl IGJlaW5nIHByb2Nlc3NlZC4KCQlpZiAicGFyYWxsZWwtZmV0Y2giIGluIHNlbGYucGtnc2V0 dGluZ3NbIkZFQVRVUkVTIl0gYW5kIG5vdCBcCgkJCSgiLS1hc2siIGluIHNlbGYubXlvcHRz IG9yICItLXByZXRlbmQiIGluIHNlbGYubXlvcHRzIG9yICItLWZldGNob25seSIgaW4gc2Vs Zi5teW9wdHMpIGFuZCBcCgkJCWxlbihteW1lcmdlbGlzdCkgPiAxOgoJCQlpZiAiZGlzdGxv Y2tzIiBub3QgaW4gc2VsZi5wa2dzZXR0aW5nc1siRkVBVFVSRVMiXToKCQkJCXByaW50IHJl ZCgiISEhIikKCQkJCXByaW50IHJlZCgiISEhIikrIiBwYXJhbGxlbC1mZXRjaGluZyB3b3Vs ZCd2ZSBiZWVuIGVuYWJsZWQsIGJ1dCB5b3UgbGFjayBkaXN0bG9ja3MiCgkJCQlwcmludCBy ZWQoIiEhISIpKyIgaW4geW91ciBmZWF0dXJlcy4gIHNvIHllYWgsIG5vIGdvLiIKCQkJCXBy aW50IHJlZCgiISEhIikrIiBlbmFibGUgZGlzdGxvY2tzIHRvIHVzZSBwYXJhbGxlbCBmZXRj aGluZyIKCQkJCXByaW50IHJlZCgiISEhIikKCQkJCWltcG9ydCB0aW1lCgkJCQl0aW1lLnNs ZWVwKDUpCgkJCWVsc2U6CiMJCQkJcHJpbnQgIm1lcmdlbGlzdD0iLG15bWVyZ2VsaXN0CiMK IwkJCQlzZWxmLnRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX19mZXRj aCxhcmdzPVtteW1lcmdlbGlzdF0sIFwKIwkJCQkJa3dhcmdzPXsidmVyYm9zaXR5IjoxLCAi ZmV0Y2hhbGwiOigiLS1mZXRjaGFsbHVyaSIgaW4gbXlvcHRzKX0pCiMJCQkJc2VsZi50aHJl YWQuc2V0RGFlbW9uKEZhbHNlKQojCQkJCXBvcnRhZ2UuZXhpdF9jYWxsYmFja3MuYXBwZW5k KHNlbGYudGhyZWFkLmpvaW4pCiMJCQkJc2VsZi50aHJlYWQuc3RhcnQoKQoJCQkJcHJpbnQg Ij4+PiBwYXJhbGxlbCBmZXRjaGluZyBpcyBpbiB0aGUgaG91c2UsIGhpenpheSIKCQkJCXBy aW50ICI+Pj4gcmVwcmVzZW50LiIKCQkJCXBvcnRhZ2VfZXhlYy5zcGF3bl9mdW5jKHNlbGYu X19mZXRjaCxbbXltZXJnZWxpc3RdLHsidmVyYm9zaXR5IjoxLFwKCQkJCQkiZmV0Y2hhbGwi OigiLS1mZXRjaGFsbHVyaSIgaW4gc2VsZi5teW9wdHMpfSxyZXR1cm5waWQ9VHJ1ZSxmZF9w aXBlcz17MToxLDI6Mn0pCiMJCQkJdGltZS5zbGVlcCgyKQoKCQltZXJnZWNvdW50PTAKCQlm b3IgeCBpbiBteW1lcmdlbGlzdDoKCQkJbWVyZ2Vjb3VudCs9MQoJCQlteXJvb3Q9eFsxXQoJ CQlwa2dpbmRleD0yCgkJCWlmIHhbMF09PSJibG9ja3MiOgoJCQkJcGtnaW5kZXg9MwoJCQl5 PXBvcnRhZ2UucG9ydGRiLmZpbmRuYW1lKHhbcGtnaW5kZXhdKQoJCQlpZiBub3QgIi0tcHJl dGVuZCIgaW4gc2VsZi5teW9wdHM6CgkJCQlwcmludCAiPj4+IGVtZXJnZSAoIitzdHIobWVy Z2Vjb3VudCkrIiBvZiAiK3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSIseFtwa2dpbmRleF0s InRvIix4WzFdCgkJCQlzZWxmLmVtZXJnZWxvZygiID4+PiBlbWVyZ2UgKCIrc3RyKG1lcmdl Y291bnQpKyIgb2YgIitzdHIobGVuKG15bWVyZ2VsaXN0KSkrIikgIit4W3BrZ2luZGV4XSsi IHRvICIreFsxXSkKCgkJCXNlbGYucGtnc2V0dGluZ3NbIkVNRVJHRV9GUk9NIl0gPSB4WzBd WzpdCgkJCXNlbGYucGtnc2V0dGluZ3MuYmFja3VwX2NoYW5nZXMoIkVNRVJHRV9GUk9NIikK CgkJCSNidWlsZHN5c3BrZzogQ2hlY2sgaWYgd2UgbmVlZCB0byBfZm9yY2VfIGJpbmFyeSBw YWNrYWdlIGNyZWF0aW9uCgkJCWlzc3lzcGtnID0gKCJidWlsZHN5c3BrZyIgaW4gbXlmZWF0 KSBcCgkJCQkJYW5kIHhbMF0gIT0gImJsb2NrcyIgXAoJCQkJCWFuZCBteXN5c2RpY3QuaGFz X2tleShwb3J0YWdlLmNwdl9nZXRrZXkoeFsyXSkpIFwKCQkJCQlhbmQgbm90ICgiLS1idWls ZHBrZyIgaW4gc2VsZi5teW9wdHMpCgkJCWlmIHhbMF0gaW4gWyJlYnVpbGQiLCJibG9ja3Mi XToKCQkJCWlmICh4WzBdPT0iYmxvY2tzIikgYW5kICgiLS1mZXRjaG9ubHkiIG5vdCBpbiBz ZWxmLm15b3B0cyk6CgkJCQkJcmFpc2UgRXhjZXB0aW9uLCAiTWVyZ2luZyBhIGJsb2NrZXIi CgkJCQllbGlmICgiLS1mZXRjaG9ubHkiIGluIHNlbGYubXlvcHRzKSBvciAoIi0tZmV0Y2gt YWxsLXVyaSIgaW4gc2VsZi5teW9wdHMpOgoJCQkJCWlmICgiLS1mZXRjaC1hbGwtdXJpIiBp biBzZWxmLm15b3B0cyk6CgkJCQkJCXJldHZhbD1wb3J0YWdlLmRvZWJ1aWxkKHksImZldGNo IixteXJvb3Qsc2VsZi5wa2dzZXR0aW5ncyxzZWxmLmVkZWJ1ZywoIi0tcHJldGVuZCIgaW4g c2VsZi5teW9wdHMpLGZldGNob25seT0xLGZldGNoYWxsPTEpCgkJCQkJZWxzZToKCQkJCQkJ cmV0dmFsPXBvcnRhZ2UuZG9lYnVpbGQoeSwiZmV0Y2giLG15cm9vdCxzZWxmLnBrZ3NldHRp bmdzLHNlbGYuZWRlYnVnLCgiLS1wcmV0ZW5kIiBpbiBzZWxmLm15b3B0cyksZmV0Y2hvbmx5 PTEpCgkJCQkJaWYgcmV0dmFsOgoJCQkJCQlwcmludAoJCQkJCQlwcmludCAiISEhIEZldGNo IGZvciIseSwiZmFpbGVkLCBjb250aW51aW5nLi4uIgoJCQkJCQlwcmludAkKCQkJCQkJcmV0 dXJubWU9MQoJCQkJCWNvbnRpbnVlCgkJCQllbGlmICItLWJ1aWxkcGtnIiBpbiBzZWxmLm15 b3B0cyBvciBpc3N5c3BrZzoKCQkJCQkjYnVpbGRzeXNwa2c6IFNvdW5kcyB1c2VmdWwgdG8g ZGlzcGxheSBzb21ldGhpbmcsIGJ1dCBJIGRvbid0IGtub3cgaWYgd2Ugc2hvdWxkIGFsc28g bG9nIGl0CgkJCQkJaWYgaXNzeXNwa2c6CgkJCQkJCXByaW50ICI+Pj4gVGhpcyBpcyBhIHN5 c3RlbSBwYWNrYWdlLCBsZXQncyBwYWNrIGEgcmVzY3VlIHRhcmJhbGwuIgoJCQkJCQkjZW1l cmdlbG9nKCI+Pj4gVGhpcyBpcyBhIHN5c3RlbSBwYWNrYWdlLCBsZXQncyBwYWNrIGEgcmVz Y3VlIHRhcmJhbGwuIikKCQkJCQkjY3JlYXRlIHBrZywgdGhlbiBtZXJnZSBwa2cKCQkJCQlz aG9ydF9tc2cgPSAiZW1lcmdlOiAoIitzdHIobWVyZ2Vjb3VudCkrIiBvZiAiK3N0cihsZW4o bXltZXJnZWxpc3QpKSsiKSAiK3hbcGtnaW5kZXhdKyIgQ2xlYW4iCgkJCQkJc2VsZi5lbWVy Z2Vsb2coIiA9PT0gKCIrc3RyKG1lcmdlY291bnQpKyIgb2YgIitzdHIobGVuKG15bWVyZ2Vs aXN0KSkrIikgQ2xlYW5pbmcgKCIreFtwa2dpbmRleF0rIjo6Iit5KyIpIiwgc2hvcnRfbXNn PXNob3J0X21zZykKCQkJCQlyZXR2YWw9cG9ydGFnZS5kb2VidWlsZCh5LCJjbGVhbiIsbXly b290LHNlbGYucGtnc2V0dGluZ3Msc2VsZi5lZGVidWcsY2xlYW51cD0xKQoJCQkJCWlmIHJl dHZhbDoKCQkJCQkJc3lzLmV4aXQoMSkKCQkJCQlzaG9ydF9tc2cgPSAiZW1lcmdlOiAoIitz dHIobWVyZ2Vjb3VudCkrIiBvZiAiK3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSAiK3hbcGtn aW5kZXhdKyIgQ29tcGlsZSIKCQkJCQlzZWxmLmVtZXJnZWxvZygiID09PSAoIitzdHIobWVy Z2Vjb3VudCkrIiBvZiAiK3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSBDb21waWxpbmcvUGFj a2FnaW5nICgiK3hbcGtnaW5kZXhdKyI6OiIreSsiKSIsIHNob3J0X21zZz1zaG9ydF9tc2cp CgkJCQkJcmV0dmFsPXBvcnRhZ2UuZG9lYnVpbGQoeSwicGFja2FnZSIsbXlyb290LHNlbGYu cGtnc2V0dGluZ3Msc2VsZi5lZGVidWcpCgkJCQkJaWYgcmV0dmFsOgoJCQkJCQlzeXMuZXhp dCgxKQoJCQkJCSNkeW5hbWljYWxseSB1cGRhdGUgb3VyIGRhdGFiYXNlCgkJCQkJaWYgIi0t YnVpbGRwa2dvbmx5IiBub3QgaW4gc2VsZi5teW9wdHM6CgkJCQkJCXBvcnRhZ2UuZGJbcG9y dGFnZS5yb290XVsiYmludHJlZSJdLmluamVjdCh4WzJdKQoJCQkJCQlteXRiejI9cG9ydGFn ZS5kYltwb3J0YWdlLnJvb3RdWyJiaW50cmVlIl0uZ2V0bmFtZSh4WzJdKQoJCQkJCQlzaG9y dF9tc2cgPSAiZW1lcmdlOiAoIitzdHIobWVyZ2Vjb3VudCkrIiBvZiAiK3N0cihsZW4obXlt ZXJnZWxpc3QpKSsiKSAiK3hbcGtnaW5kZXhdKyIgTWVyZ2UiCgkJCQkJCXNlbGYuZW1lcmdl bG9nKCIgPT09ICgiK3N0cihtZXJnZWNvdW50KSsiIG9mICIrc3RyKGxlbihteW1lcmdlbGlz dCkpKyIpIE1lcmdpbmcgKCIreFtwa2dpbmRleF0rIjo6Iit5KyIpIiwgc2hvcnRfbXNnPXNo b3J0X21zZykKCgkJCQkJCXNlbGYucGtnc2V0dGluZ3NbIkVNRVJHRV9GUk9NIl0gPSAiYmlu YXJ5IgoJCQkJCQlzZWxmLnBrZ3NldHRpbmdzLmJhY2t1cF9jaGFuZ2VzKCJFTUVSR0VfRlJP TSIpCgkJCQkJCQoJCQkJCQlyZXR2YWw9cG9ydGFnZS5wa2dtZXJnZShteXRiejIsbXlyb290 LHNlbGYucGtnc2V0dGluZ3MpCgkJCQkJCWlmIHJldHZhbD09Tm9uZToKCQkJCQkJCXN5cy5l eGl0KDEpCgkJCQllbHNlOgoJCQkJCXNob3J0X21zZyA9ICJlbWVyZ2U6ICgiK3N0cihtZXJn ZWNvdW50KSsiIG9mICIrc3RyKGxlbihteW1lcmdlbGlzdCkpKyIpICIreFtwa2dpbmRleF0r IiBDbGVhbiIKCQkJCQlzZWxmLmVtZXJnZWxvZygiID09PSAoIitzdHIobWVyZ2Vjb3VudCkr IiBvZiAiK3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSBDbGVhbmluZyAoIit4W3BrZ2luZGV4 XSsiOjoiK3krIikiLCBzaG9ydF9tc2c9c2hvcnRfbXNnKQoJCQkJCXJldHZhbD1wb3J0YWdl LmRvZWJ1aWxkKHksImNsZWFuIixteXJvb3Qsc2VsZi5wa2dzZXR0aW5ncyxzZWxmLmVkZWJ1 ZyxjbGVhbnVwPTEpCgkJCQkJaWYgcmV0dmFsOgoJCQkJCQlzeXMuZXhpdCgxKQoJCQkJCXNo b3J0X21zZyA9ICJlbWVyZ2U6ICgiK3N0cihtZXJnZWNvdW50KSsiIG9mICIrc3RyKGxlbiht eW1lcmdlbGlzdCkpKyIpICIreFtwa2dpbmRleF0rIiBDb21waWxlIgoJCQkJCXNlbGYuZW1l cmdlbG9nKCIgPT09ICgiK3N0cihtZXJnZWNvdW50KSsiIG9mICIrc3RyKGxlbihteW1lcmdl bGlzdCkpKyIpIENvbXBpbGluZy9NZXJnaW5nICgiK3hbcGtnaW5kZXhdKyI6OiIreSsiKSIs IHNob3J0X21zZz1zaG9ydF9tc2cpCgkJCQkJcmV0dmFsPXBvcnRhZ2UuZG9lYnVpbGQoeSwi bWVyZ2UiLG15cm9vdCxzZWxmLnBrZ3NldHRpbmdzLHNlbGYuZWRlYnVnKQoJCQkJCWlmIHJl dHZhbDoKCQkJCQkJc3lzLmV4aXQoMSkKCQkJCQkjZHluYW1pY2FsbHkgdXBkYXRlIG91ciBk YXRhYmFzZQkKCQkJZWxpZiB4WzBdPT0iYmluYXJ5IjoKCQkJCSNtZXJnZSB0aGUgdGJ6MgoJ CQkJbXl0YnoyPXBvcnRhZ2UuZGJbcG9ydGFnZS5yb290XVsiYmludHJlZSJdLmdldG5hbWUo eFsyXSkKCQkJCWlmIHBvcnRhZ2UuZGJbcG9ydGFnZS5yb290XVsiYmludHJlZSJdLmlzcmVt b3RlKHhbMl0pOgoJCQkJCXNob3J0X21zZyA9ICJlbWVyZ2U6ICgiK3N0cihtZXJnZWNvdW50 KSsiIG9mICIrc3RyKGxlbihteW1lcmdlbGlzdCkpKyIpICIreFtwa2dpbmRleF0rIiBGZXRj aCIKCQkJCQlzZWxmLmVtZXJnZWxvZygiIC0tLSAoIitzdHIobWVyZ2Vjb3VudCkrIiBvZiAi K3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSBGZXRjaGluZyBCaW5hcnkgKCIreFtwa2dpbmRl eF0rIjo6IitteXRiejIrIikiLCBzaG9ydF9tc2c9c2hvcnRfbXNnKQoJCQkJCXBvcnRhZ2Uu ZGJbcG9ydGFnZS5yb290XVsiYmludHJlZSJdLmdldHRiejIoeFsyXSkKCgkJCQlpZiAoIi0t ZmV0Y2hvbmx5IiBpbiBzZWxmLm15b3B0cykgb3IgKCItLWZldGNoLWFsbC11cmkiIGluIHNl bGYubXlvcHRzKToKCQkJCQljb250aW51ZQoJCQkJCgkJCQlzaG9ydF9tc2cgPSAiZW1lcmdl OiAoIitzdHIobWVyZ2Vjb3VudCkrIiBvZiAiK3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSAi K3hbcGtnaW5kZXhdKyIgTWVyZ2UgQmluYXJ5IgoJCQkJc2VsZi5lbWVyZ2Vsb2coIiA9PT0g KCIrc3RyKG1lcmdlY291bnQpKyIgb2YgIitzdHIobGVuKG15bWVyZ2VsaXN0KSkrIikgTWVy Z2luZyBCaW5hcnkgKCIreFtwa2dpbmRleF0rIjo6IitteXRiejIrIikiLCBzaG9ydF9tc2c9 c2hvcnRfbXNnKQoJCQkJcmV0dmFsPXBvcnRhZ2UucGtnbWVyZ2UobXl0YnoyLHhbMV0sc2Vs Zi5wa2dzZXR0aW5ncykKCQkJCWlmIHJldHZhbD09Tm9uZToKCQkJCQlzeXMuZXhpdCgxKQoJ CQkJI25lZWQgdG8gY2hlY2sgZm9yIGVycm9ycwoJCQlpZiAiLS1idWlsZHBrZ29ubHkiIG5v dCBpbiBzZWxmLm15b3B0czoKCQkJCXBvcnRhZ2UuZGJbeFsxXV1bInZhcnRyZWUiXS5pbmpl Y3QoeFsyXSkKCQkJCW15ZmF2a2V5PXBvcnRhZ2UuY3B2X2dldGtleSh4WzJdKQoJCQkJaWYg KG5vdCAiLS1mZXRjaG9ubHkiIGluIHNlbGYubXlvcHRzKSBhbmQgKG5vdCAiLS1mZXRjaC1h bGwtdXJpIiBpbiBzZWxmLm15b3B0cykgYW5kIChteWZhdmtleSBpbiBmYXZvcml0ZXMpOgoJ CQkJCW15ZmF2cz1wb3J0YWdlLmdyYWJmaWxlKG15cm9vdCtwb3J0YWdlLldPUkxEX0ZJTEUp CgkJCQkJbXlmYXZkaWN0PWdlbmVyaWNkaWN0KG15ZmF2cykKCQkJCQlteXN5c2RpY3Q9Z2Vu ZXJpY2RpY3QoZ2V0bGlzdCgic3lzdGVtIikpCgkJCQkJI2Rvbid0IHJlY29yZCBpZiBhbHJl YWR5IGluIHN5c3RlbSBwcm9maWxlIG9yIGFscmVhZHkgcmVjb3JkZWQKCQkJCQlpZiAoIi0t dXBkYXRlIiBub3QgaW4gc2VsZi5teW9wdHMgb3Igbm90IHBvcnRhZ2UuZGJbcG9ydGFnZS5y b290XVsidmFydHJlZSJdLmRiYXBpLm1hdGNoKG15ZmF2a2V5KSkgYW5kIFwKCQkJCQkgICAg KG5vdCBteXN5c2RpY3QuaGFzX2tleShteWZhdmtleSkpIGFuZCAobm90IG15ZmF2ZGljdC5o YXNfa2V5KG15ZmF2a2V5KSk6CgkJCQkJCSN3ZSBkb24ndCBoYXZlIGEgZmF2b3JpdGVzIGVu dHJ5IGZvciB0aGlzIHBhY2thZ2UgeWV0OyBhZGQgb25lCgkJCQkJCW15ZmF2ZGljdFtteWZh dmtleV09bXlmYXZrZXkKCQkJCQkJcHJpbnQgIj4+PiBSZWNvcmRpbmciLG15ZmF2a2V5LCJp biBcIndvcmxkXCIgZmF2b3JpdGVzIGZpbGUuLi4iCgkJCQkJCXNlbGYuZW1lcmdlbG9nKCIg PT09ICgiK3N0cihtZXJnZWNvdW50KSsiIG9mICIrc3RyKGxlbihteW1lcmdlbGlzdCkpKyIp IFVwZGF0aW5nIHdvcmxkIGZpbGUgKCIreFtwa2dpbmRleF0rIikiKQoJCQkJCQlwb3J0YWdl LndyaXRlZGljdChteWZhdmRpY3QsbXlyb290K3BvcnRhZ2UuV09STERfRklMRSx3cml0ZWtl eT0wKQoKCQkJCWlmICgibm9jbGVhbiIgbm90IGluIHBvcnRhZ2UuZmVhdHVyZXMpIGFuZCAo eFswXSAhPSAiYmluYXJ5Iik6CgkJCQkJc2hvcnRfbXNnID0gImVtZXJnZTogKCIrc3RyKG1l cmdlY291bnQpKyIgb2YgIitzdHIobGVuKG15bWVyZ2VsaXN0KSkrIikgIit4W3BrZ2luZGV4 XSsiIENsZWFuIFBvc3QiCgkJCQkJc2VsZi5lbWVyZ2Vsb2coIiA9PT0gKCIrc3RyKG1lcmdl Y291bnQpKyIgb2YgIitzdHIobGVuKG15bWVyZ2VsaXN0KSkrIikgUG9zdC1CdWlsZCBDbGVh bmluZyAoIit4W3BrZ2luZGV4XSsiOjoiK3krIikiLCBzaG9ydF9tc2c9c2hvcnRfbXNnKQoJ CQkJCXJldHZhbD1wb3J0YWdlLmRvZWJ1aWxkKHksImNsZWFuIixteXJvb3Qsc2VsZi5wa2dz ZXR0aW5ncyxzZWxmLmVkZWJ1ZyxjbGVhbnVwPTEpCgkJCQkJaWYgcmV0dmFsOgoJCQkJCQlz eXMuZXhpdCgxKQoJCQkKCQkJCWlmICgiLS1wcmV0ZW5kIiBub3QgaW4gc2VsZi5teW9wdHMp IGFuZCAoIi0tZmV0Y2hvbmx5IiBub3QgaW4gc2VsZi5teW9wdHMpIGFuZCAoIi0tZmV0Y2gt YWxsLXVyaSIgbm90IGluIHNlbGYubXlvcHRzKToKCQkJCQkjIENsZWFuIHRoZSBvbGQgcGFj a2FnZSB0aGF0IHdlIGhhdmUgbWVyZ2VkIG92ZXIgdG9wIG9mIGl0LgoJCQkJCXhzcGxpdD1w b3J0YWdlLnBvcnRhZ2VfdmVyc2lvbnMucGtnc3BsaXQoeFsyXSkKCQkJCQlzZWxmLmVtZXJn ZWxvZygiID4+PiBBVVRPQ0xFQU46ICIreHNwbGl0WzBdKQoJCQkJCXJldHZhbD1zZWxmLnVu bWVyZ2UoImNsZWFuIiwgW3hzcGxpdFswXV0pCgkJCQkJaWYgbm90IHJldHZhbDoKCQkJCQkJ c2VsZi5lbWVyZ2Vsb2coIiAtLS0gQVVUT0NMRUFOOiBOb3RoaW5nIHVubWVyZ2VkLiIpCgoJ CQkJCSMgRmlndXJlIG91dCBpZiB3ZSBuZWVkIGEgcmVzdGFydC4KCQkJCQlteXNwbGl0PXBv cnRhZ2UucG9ydGFnZV92ZXJzaW9ucy5wa2dzcGxpdCh4WzJdKQoJCQkJCWlmIG15c3BsaXRb MF09PSJzeXMtYXBwcy9wb3J0YWdlIjoKCQkJCQkJbXl2ZXI9bXlzcGxpdFsxXSsiLSIrbXlz cGxpdFsyXQoJCQkJCQlpZiBteXZlclstMzpdPT0nLXIwJzoKCQkJCQkJCW15dmVyPW15dmVy WzotM10KCQkJCQkJaWYgKG15dmVyIT1wb3J0YWdlLlZFUlNJT04gYW5kCgkJCQkJCQkibGl2 ZWN2c3BvcnRhZ2UiIG5vdCBpbiBwb3J0YWdlLnNldHRpbmdzLmZlYXR1cmVzKToKCQkJCQkJ CWlmIGxlbihteW1lcmdlbGlzdCkgPiBtZXJnZWNvdW50OgoJCQkJCQkJCW15YXJndj1zeXMu YXJndgoJCQkJCQkJCW15cj0wCgkJCQkJCQkJZm9yIG15cmEgaW4gcmFuZ2UobGVuKG15YXJn dikpOgoJCQkJCQkJCQlpZiBteWFyZ3ZbbXlyXVswOmxlbigicG9ydGFnZSIpXT09InBvcnRh Z2UiOgoJCQkJCQkJCQkJZGVsIG15YXJndltteXJdCgkJCQkJCQkJCQlteXItPTEKCQkJCQkJ CQkJaWYgbXlhcmd2W215cl1bMDpsZW4oInN5cy1hcHBzL3BvcnRhZ2UiKV09PSJzeXMtYXBw cy9wb3J0YWdlIjoKCQkJCQkJCQkJCWRlbCBteWFyZ3ZbbXlyXQoJCQkJCQkJCQkJbXlyLT0x CgkJCQkJCQkJCW15cis9MQoJCQkJCQkJCXNlbGYuZW1lcmdlbG9nKCIgKioqIFJFU1RBUlRJ TkcgZW1lcmdlIHZpYSBleGVjKCkgYWZ0ZXIgY2hhbmdlIG9mIHBvcnRhZ2UgdmVyc2lvbi4i KQoJCQkJCQkJCXBvcnRhZ2UucG9ydGFnZWV4aXQoKQoJCQkJCQkJCWJhZGxvbmdvcHRzID0g WyItLWFzayIsIi0tdHJlZSIsIi0tY2hhbmdlbG9nIl0KCQkJCQkJCQliYWRzaG9ydG9wdHMg PSBbImEiLCJ0IiwibCJdCgkJCQkJCQkJbXluZXdhcmd2PVtdCgkJCQkJCQkJZm9yIGFyZyBp biBteWFyZ3Y6CiAJCQkJCQkJCQlpZiBhcmdbMDoyXSA9PSAiLS0iOgoJCQkJCQkJCQkJaWYg YXJnIGluIGJhZGxvbmdvcHRzOgoJCQkJCQkJCQkJCWNvbnRpbnVlCgkJCQkJCQkJCQlteW5l d2FyZ3YgKz0gW2FyZ10KCQkJCQkJCQkJZWxpZiBhcmdbMF0gPT0gIi0iOgoJCQkJCQkJCQkJ bXlhcmcgPSAiLSIKIAkJCQkJCQkJCQlmb3IgY2ggaW4gYXJnWzE6XToKCQkJCQkJCQkJCQlp ZiBjaCBpbiBiYWRzaG9ydG9wdHM6CgkJCQkJCQkJCQkJCWNvbnRpbnVlCgkJCQkJCQkJCQkJ bXlhcmcgKz0gY2gKCQkJCQkJCQkJCW15bmV3YXJndiArPSBbbXlhcmddCgkJCQkJCQkJCWVs c2U6CgkJCQkJCQkJCQlteW5ld2FyZ3YgKz0gW2FyZ10KCQkJCQkJCQlvcy5leGVjdigiL3Vz ci9saWIvcG9ydGFnZS9iaW4vZW1lcmdlIiwgbXluZXdhcmd2KQoKCQkJaWYgKCItLXByZXRl bmQiIG5vdCBpbiBzZWxmLm15b3B0cykgYW5kICgiLS1mZXRjaG9ubHkiIG5vdCBpbiBzZWxm Lm15b3B0cykgYW5kICgiLS1mZXRjaC1hbGwtdXJpIiBub3QgaW4gc2VsZi5teW9wdHMpOgoJ CQkJc2VsZi5lbWVyZ2Vsb2coIiA6OjogY29tcGxldGVkIGVtZXJnZSAoIitzdHIobWVyZ2Vj b3VudCkrIiBvZiAiK3N0cihsZW4obXltZXJnZWxpc3QpKSsiKSAiK3hbMl0rIiB0byAiK3hb MV0pCgkJCQoJCQkjIFVuc2FmZSBmb3IgcGFyYWxsZWwgbWVyZ2VzCgkJCWRlbCBwb3J0YWdl Lm10aW1lZGJbInJlc3VtZSJdWyJtZXJnZWxpc3QiXVswXQoKCQlpZiBzZWxmLnRocmVhZDoK CQkJc2VsZi50aHJlYWQuam9pbigpCgkJCXNlbGYudGhyZWFkPU5vbmUKCgkJc2VsZi5lbWVy Z2Vsb2coIiAqKiogRmluaXNoZWQuIENsZWFuaW5nIHVwLi4uIikKCgkJIyBXZSdyZSBvdXQg b2YgdGhlIGxvb3AuLi4gV2UncmUgZG9uZS4gRGVsZXRlIHRoZSByZXN1bWUgZGF0YS4KCQlp ZiBwb3J0YWdlLm10aW1lZGIuaGFzX2tleSgicmVzdW1lIik6CgkJCWRlbCBwb3J0YWdlLm10 aW1lZGJbInJlc3VtZSJdCgoJCWlmICgiLS1wcmV0ZW5kIiBub3QgaW4gc2VsZi5teW9wdHMp OgoJCQlpZiAoIi0tZmV0Y2hvbmx5IiBub3QgaW4gc2VsZi5teW9wdHMpIGFuZCAoIi0tZmV0 Y2gtYWxsLXVyaSIgbm90IGluIHNlbGYubXlvcHRzKToKCQkJCWlmIChtZXJnZWNvdW50PjAp OgoJCQkJCWlmIHJldHZhbDoKCQkJCQkJcG9ydGFnZS5lbnZfdXBkYXRlKHBvcnRhZ2Uucm9v dCkKCgkJI2J5IGRvaW5nIGFuIGV4aXQgdGhpcyB3YXksIC0tZmV0Y2hvbmx5IGNhbiBjb250 aW51ZSB0byB0cnkgdG8KCQkjZmV0Y2ggZXZlcnl0aGluZyBldmVuIGlmIGEgcGFydGljdWxh ciBkb3dubG9hZCBmYWlscy4KCQlpZiAiLS1mZXRjaG9ubHkiIGluIHNlbGYubXlvcHRzIG9y ICItLWZldGNoLWFsbC11cmkiIGluIHNlbGYubXlvcHRzOgoJCQlpZiByZXR1cm5tZToKCQkJ CXByaW50ICJcblxuISEhIFNvbWUgZmV0Y2ggZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQuICBQ bGVhc2Ugc2VlIGFib3ZlIGZvciBkZXRhaWxzLlxuXG4iCgkJCQlzeXMuZXhpdChyZXR1cm5t ZSkKCQkJZWxzZToKCQkJCXN5cy5leGl0KDApCgoJZGVmIGVtZXJnZWxvZyhzZWxmLG15c3Ry LHNob3J0X21zZz1Ob25lKToKCQllbWVyZ2Vsb2coc2VsZi5lZGVidWcsbXlzdHIsc2hvcnRf bXNnKQoKCWRlZiB1bm1lcmdlKHNlbGYsdW5tZXJnZV9hY3Rpb24sdW5tZXJnZV9maWxlcyk6 CgkJcmV0dXJuIHVubWVyZ2Uoc2VsZi5teW9wdHMsIHNlbGYuZWRlYnVnLCBzZWxmLkVNRVJH RV9XQVJOSU5HX0RFTEFZLCB1bm1lcmdlX2FjdGlvbiwgdW5tZXJnZV9maWxlcykKCmNsYXNz IGdyYXBoX2Rpc3BsYXk6CgkKCWRlZiBfX2luaXRfXyhzZWxmLG15Z3JhcGgsbXlvcHRzLGVk ZWJ1Zyx2ZXJib3NpdHkpOgoJCXNlbGYuZ3JhcGggPSBteWdyYXBoLmNsb25lKCkKCQlzZWxm Lm15b3B0cz1teW9wdHMKCQlzZWxmLmVkZWJ1Zz1lZGVidWcKCQlzZWxmLnZlcmJvc2l0eT12 ZXJib3NpdHkKCQkKCQltZXJnZV9ub2RlcyA9IHNlbGYuZ3JhcGguZ2V0X2FsbF9ub2Rlcygp CgkJZm9yIHggaW4gcmFuZ2UobGVuKG1lcmdlX25vZGVzKS0xLC0xLC0xKToKCQkJaWYgbWVy Z2Vfbm9kZXNbeF0uc3BsaXQoKVszXSA9PSAibm9tZXJnZSI6CgkJCQlkZWwgbWVyZ2Vfbm9k ZXNbeF0KCQkKCQlyZWxldmFudCA9IG1lcmdlX25vZGVzWzpdCgkJZm9yIHggaW4gcmFuZ2Uo bGVuKG1lcmdlX25vZGVzKSk6CgkJCXBhcmVudHMgPSBzZWxmLmdyYXBoLmdldF9wYXJlbnRf bm9kZXMobWVyZ2Vfbm9kZXNbeF0sIGRlcHRoPTApCgkJCWZvciBub2RlIGluIHBhcmVudHM6 CgkJCQlpZiBub2RlIG5vdCBpbiByZWxldmFudDoKCQkJCQlyZWxldmFudC5hcHBlbmQobm9k ZSkKCQkKCQlmb3Igbm9kZSBpbiBzZWxmLmdyYXBoLmdldF9hbGxfbm9kZXMoKToKCQkJaWYg bm9kZSBub3QgaW4gcmVsZXZhbnQ6CgkJCQlzZWxmLmdyYXBoLnJlbW92ZV9ub2RlKG5vZGUp CgkJCgkJc2VsZi5mZXRjaHNpemVzID0ge30KCQlzZWxmLm92ZXJsYXlzID0gW10KCQlzZWxm LmNoYW5nZWxvZ3MgPSBbXQoJCglkZWYgb2xkX3ZlcnNpb24oc2VsZiwgbXlkZXApOgoJCWRl cF90eXBlID0gbXlkZXBbMF0KCQlkZXBfcm9vdCA9IG15ZGVwWzFdCgkJZGVwX3BrZyA9IG15 ZGVwWzJdCgkJCgkJaWYgbm90IHBvcnRhZ2UuZGJbZGVwX3Jvb3RdWyJ2YXJ0cmVlIl0uZXhp c3RzX3NwZWNpZmljX2NhdChkZXBfcGtnKToKCQkJcmV0dXJuIE5vbmUKCQkKCQlpZiBkZXBf dHlwZSA9PSAiYmluYXJ5IjoKCQkJbXluZXdzbG90PXBvcnRhZ2UuZGJbIi8iXVsiYmludHJl ZSJdLmdldHNsb3QoZGVwX3BrZykKCQllbHNlOgoJCQlteW5ld3Nsb3Q9cG9ydGFnZS5kYlsi LyJdWyJwb3J0dHJlZSJdLmdldHNsb3QoZGVwX3BrZykKCQkKCQlteWN1cnBrZ3MgPSBwb3J0 YWdlLmRiW2RlcF9yb290XVsidmFydHJlZSJdLmRiYXBpLm1hdGNoKHBvcnRhZ2UucG9ydGFn ZV92ZXJzaW9ucy5wa2dzcGxpdChkZXBfcGtnKVswXSkKCQlmb3IgeCBpbiByYW5nZShsZW4o bXljdXJwa2dzKS0xLCAtMSwgLTEpOgoJCQlpZiBwb3J0YWdlLmRiW2RlcF9yb290XVsidmFy dHJlZSJdLmdldHNsb3QobXljdXJwa2dzW3hdKSAhPSBteW5ld3Nsb3Q6CgkJCQlkZWwgbXlj dXJwa2dzW3hdCgkJCgkJaWYgbm90IG15Y3VycGtnczoKCQkJcmV0dXJuIE5vbmUKCQkKCQly ZXR1cm4gcG9ydGFnZS5iZXN0KG15Y3VycGtncykKCQoJZGVmIHVzZV9mbGFncyhzZWxmLCBt eWRlcCk6CgkJcG9ydGFnZS5zZXR0aW5ncy51bmxvY2soKQoJCXBvcnRhZ2Uuc2V0dGluZ3Mu c2V0Y3B2KG15ZGVwWzJdKQoJCW15ZmxhZ3MgPSBwb3J0YWdlLnNldHRpbmdzWyJVU0UiXS5z cGxpdCgpCgkJcG9ydGFnZS5zZXR0aW5ncy5yZXNldCgpCgkJcG9ydGFnZS5zZXR0aW5ncy5s b2NrKCkKCQlyZXR1cm4gbXlmbGFncwoJCglkZWYgZm9ybWF0X3N1bW1hcnkoc2VsZiwgbXlk ZXApOgoJCWRlcF90eXBlID0gbXlkZXBbMF0KCQlkZXBfcm9vdCA9IG15ZGVwWzFdCgkJZGVw X3BrZyA9IG15ZGVwWzJdCgkJZGVwX2V4dHJhID0gbXlkZXBbM10KCQkKCQlwcm9ibGVtX3N0 YXR1cyA9ICIgIgoJCW5ld19zdGF0dXMgPSAiICIKCQlzbG90X3N0YXR1cyA9ICIgIgoJCXVw ZGF0ZV9zdGF0dXMgPSAiICIKCQlkb3duZ3JhZGVfc3RhdHVzID0gIiAiCgkJCgkJaWYgZGVw X2V4dHJhID09ICJub21lcmdlIjoKCQkJZGVwX3R5cGUgPSBkYXJrYmx1ZSgibWVyZ2VkIikK CQkKCQllbGlmIGRlcF90eXBlID09ICJibG9ja3MiOgoJCQlwcm9ibGVtX3N0YXR1cyA9IHJl ZCgiQiIpCgkJCgkJZWxzZToKCQkJaWYgZGVwX3R5cGUgIT0gImJpbmFyeSI6CgkJCQlyZXN0 cmljdGlvbnMgPSBwb3J0YWdlLmRiWyIvIl1bInBvcnR0cmVlIl0uZGJhcGkuYXV4X2dldChk ZXBfcGtnLCBbIlJFU1RSSUNUIl0pWzBdLnNwbGl0KCkKCQkJCWlmICJmZXRjaCIgaW4gcmVz dHJpY3Rpb25zOgoJCQkJCWlmIHBvcnRhZ2UuZGJbIi8iXVsicG9ydHRyZWUiXS5kYmFwaS5m ZXRjaF9jaGVjayhkZXBfcGtnLCBwb3J0YWdlLnNldHRpbmdzKToKCQkJCQkJcHJvYmxlbV9z dGF0dXMgPSBncmVlbigiZiIpCgkJCQkJZWxzZToKCQkJCQkJcHJvYmxlbV9zdGF0dXMgPSBy ZWQoIkYiKQoJCQkKCQkJaWYgcG9ydGFnZS5kYltkZXBfcm9vdF1bInZhcnRyZWUiXS5leGlz dHNfc3BlY2lmaWMoZGVwX3BrZyk6CgkJCQluZXdfc3RhdHVzID0geWVsbG93KCJSIikKCQkJ CgkJCWVsc2U6CgkJCQlwcmV2cGtnID0gc2VsZi5vbGRfdmVyc2lvbihteWRlcCkKCQkJCWlm IHByZXZwa2c6CgkJCQkJdXBkYXRlX3N0YXR1cyA9IHR1cnF1b2lzZSgiVSIpCgkJCQkJbXlv bGRwa2cgPSBwb3J0YWdlLnBvcnRhZ2VfdmVyc2lvbnMucGtnc3BsaXQocHJldnBrZykKCQkJ CQlteW5ld3BrZyA9IHBvcnRhZ2UucG9ydGFnZV92ZXJzaW9ucy5wa2dzcGxpdChkZXBfcGtn KQoJCQkJCWlmIHBvcnRhZ2UucG9ydGFnZV92ZXJzaW9ucy5wa2djbXAobXluZXdwa2csIG15 b2xkcGtnKSA8IDA6CgkJCQkJCWRvd25ncmFkZV9zdGF0dXMgPSBibHVlKCJEIikKCQkJCWVs c2U6CgkJCQkJbmV3X3N0YXR1cyA9IGdyZWVuKCJOIikKCQkJCQlpZiBwb3J0YWdlLmRiW2Rl cF9yb290XVsidmFydHJlZSJdLmV4aXN0c19zcGVjaWZpY19jYXQoZGVwX3BrZyk6CgkJCQkJ CXNsb3Rfc3RhdHVzID0gZ3JlZW4oIlMiKQoJCQoJCXN1bW1hcnkgPSAiWyIrZGVwX3R5cGUr IiAiCgkJc3VtbWFyeSArPSBwcm9ibGVtX3N0YXR1cwoJCXN1bW1hcnkgKz0gbmV3X3N0YXR1 cwoJCXN1bW1hcnkgKz0gc2xvdF9zdGF0dXMKCQlzdW1tYXJ5ICs9IHVwZGF0ZV9zdGF0dXMK CQlzdW1tYXJ5ICs9IGRvd25ncmFkZV9zdGF0dXMrIl0iCgkJCgkJcmV0dXJuIHN1bW1hcnkK CQoJZGVmIGZvcm1hdF9jcHYoc2VsZiwgbXlkZXApOgoJCWlmIG15ZGVwWzBdID09ICJibG9j a3MiOgoJCQlyZXR1cm4gcmVkKG15ZGVwWzJdKQoJCWVsaWYgbXlkZXBbM10gPT0gIm5vbWVy Z2UiOgoJCQlyZXR1cm4gZGFya2JsdWUobXlkZXBbMl0pCgkJcmV0dXJuIGRhcmtncmVlbiht eWRlcFsyXSkKCQoJZGVmIGZvcm1hdF9uYW1lKHNlbGYsIG15ZGVwKToKCQlteXNwbGl0ID0g cG9ydGFnZS5wb3J0YWdlX3ZlcnNpb25zLnBrZ3NwbGl0KG15ZGVwWzJdKQoJCWlmIG15c3Bs aXQ6CgkJCW5hbWUgPSBteXNwbGl0WzBdCgkJZWxzZToKCQkJbmFtZSA9IG15ZGVwWzJdCgkJ CgkJaWYgbXlkZXBbMF0gPT0gImJsb2NrcyI6CgkJCXJldHVybiByZWQobmFtZSkKCQllbGlm IG15ZGVwWzNdID09ICJub21lcmdlIjoKCQkJcmV0dXJuIGRhcmtibHVlKG5hbWUpCgkJcmV0 dXJuIGRhcmtncmVlbihuYW1lKQoJCglkZWYgZm9ybWF0X25ld192ZXJzaW9uKHNlbGYsIG15 ZGVwKToKCQlteXNwbGl0ID0gcG9ydGFnZS5wb3J0YWdlX3ZlcnNpb25zLnBrZ3NwbGl0KG15 ZGVwWzJdKQoJCWlmIG5vdCBteXNwbGl0OgoJCQlyZXR1cm4gIiIKCQl2ZXJzaW9uID0gbXlz cGxpdFsxXQoJCWlmIG15c3BsaXRbMl0gIT0gInIwIjoKCQkJdmVyc2lvbiArPSAiLSIrbXlz cGxpdFsyXQoJCQoJCWlmIG15ZGVwWzBdID09ICJibG9ja3MiOgoJCQlyZXR1cm4gcmVkKCJb Iit2ZXJzaW9uKyJdIikKCQllbGlmIG15ZGVwWzNdID09ICJub21lcmdlIjoKCQkJcmV0dXJu IGRhcmtibHVlKCJbIit2ZXJzaW9uKyJdIikKCQlyZXR1cm4gZGFya2dyZWVuKCJbIit2ZXJz aW9uKyJdIikKCQoJZGVmIGZvcm1hdF9vbGRfdmVyc2lvbihzZWxmLCBteWRlcCk6CgkJZGVw X3R5cGUgPSBteWRlcFswXQoJCWRlcF9yb290ID0gbXlkZXBbMV0KCQlkZXBfcGtnID0gbXlk ZXBbMl0KCQlkZXBfZXh0cmEgPSBteWRlcFszXQoJCQoJCWlmIGRlcF9leHRyYSA9PSAibm9t ZXJnZSI6CgkJCXJldHVybiAiIgoJCQoJCWlmIGRlcF90eXBlID09ICJibG9ja3MiOgoJCQly ZXR1cm4gcmVkKCIoIitkZXBfZXh0cmErIikiKQoJCQoJCXByZXZwa2cgPSBzZWxmLm9sZF92 ZXJzaW9uKG15ZGVwKQoJCQoJCWlmIG5vdCBwcmV2cGtnIG9yIHByZXZwa2cgPT0gZGVwX3Br ZzoKCQkJcmV0dXJuICIiCgkJCgkJbXlvbGRzcGxpdCA9IHBvcnRhZ2UucG9ydGFnZV92ZXJz aW9ucy5wa2dzcGxpdChwcmV2cGtnKQoJCXZlcnNpb24gPSBteW9sZHNwbGl0WzFdCgkJaWYg bXlvbGRzcGxpdFsyXSAhPSAicjAiOgoJCQl2ZXJzaW9uICs9ICItIitteW9sZHNwbGl0WzJd CgkJcmV0dXJuIGJsdWUoIlsiK3ZlcnNpb24rIl0iKQoJCglkZWYgZm9ybWF0X2ZsYWdzKHNl bGYsIG15ZGVwKToKCQlkZXBfdHlwZSA9IG15ZGVwWzBdCgkJZGVwX3Jvb3QgPSBteWRlcFsx XQoJCWRlcF9wa2cgPSBteWRlcFsyXQoJCWRlcF9leHRyYSA9IG15ZGVwWzNdCgkJCgkJaWYg ZGVwX3R5cGUgPT0gImJsb2NrcyIgb3IgZGVwX2V4dHJhID09ICJub21lcmdlIjoKCQkJcmV0 dXJuICIiCgkJCgkJaWYgZGVwX3R5cGUgPT0gImJpbmFyeSI6CgkJCWl1c2UgPSBwb3J0YWdl LmRiWyIvIl1bImJpbnRyZWUiXS5kYmFwaS5hdXhfZ2V0KGRlcF9wa2csWyJJVVNFIl0pWzBd LnNwbGl0KCkKCQllbGlmIGRlcF90eXBlID09ICJlYnVpbGQiOgoJCQlpdXNlID0gcG9ydGFn ZS5kYlsiLyJdWyJwb3J0dHJlZSJdLmRiYXBpLmF1eF9nZXQoZGVwX3BrZyxbIklVU0UiXSlb MF0uc3BsaXQoKQoJCWVsc2U6CgkJCWl1c2UgPSBbXQoJCWl1c2Uuc29ydCgpCgkJaXVzZSA9 IHBvcnRhZ2VfdXRpbC51bmlxdWVfYXJyYXkoaXVzZSkKCQkKCQljdXJfdXNlID0gc2VsZi51 c2VfZmxhZ3MobXlkZXApCgkJYmFkX3VzZSA9IHBvcnRhZ2Uuc2V0dGluZ3MudXNlbWFzawoJ CQoJCXByZXZwa2cgPSBzZWxmLm9sZF92ZXJzaW9uKG15ZGVwKQoJCWlmIHByZXZwa2c6CgkJ CW9sZF91c2UgPSBwb3J0YWdlLmRiW2RlcF9yb290XVsidmFydHJlZSJdLmRiYXBpLmF1eF9n ZXQocHJldnBrZywgWyJVU0UiXSlbMF0uc3BsaXQoKQoJCWVsc2U6CgkJCW9sZF91c2UgPSBj dXJfdXNlCgkJCgkJdXNlbGlzdCA9IFtdCgkJZm9yIHVzZSBpbiBpdXNlOgoJCQlpZiB1c2Ug aW4gY3VyX3VzZToKCQkJCW15dXNlID0gcmVkKCIrIit1c2UpCgkJCWVsaWYgdXNlIGluIGJh ZF91c2U6CgkJCQlteXVzZSA9IGJsdWUoIigtIit1c2UrIikiKQoJCQllbHNlOgoJCQkJbXl1 c2UgPSBibHVlKCItIit1c2UpCgkJCWlmICh1c2UgaW4gb2xkX3VzZSBhbmQgdXNlIG5vdCBp biBjdXJfdXNlKSBvciBcCgkJCQkJKHVzZSBub3QgaW4gb2xkX3VzZSBhbmQgdXNlIGluIGN1 cl91c2UpOgoJCQkJbXl1c2UgKz0gIioiCgkJCXVzZWxpc3QuYXBwZW5kKG15dXNlKQoJCQkK CQlyZXR1cm4gIiAiLmpvaW4odXNlbGlzdCkKCQoJZGVmIGZvcm1hdF9tZXRhZGF0YShzZWxm LCBteWRlcCk6CgkJY2F0cGtnID0gcG9ydGFnZS5wb3J0YWdlX3ZlcnNpb25zLnBrZ3NwbGl0 KG15ZGVwWzJdKVswXQoJCW1ldGFkYXRhX2ZpbGUgPSBwb3J0YWdlLnNldHRpbmdzWyJQT1JU RElSIl0gKyAiLyIgKyBjYXRwa2cgKyAiL21ldGFkYXRhLnhtbCIKCQlpZiBub3Qgb3MucGF0 aC5leGlzdHMobWV0YWRhdGFfZmlsZSk6CgkJCXJldHVybiAiIgoJCQkKCQlwYXJzZXIgPSBw b3J0YWdlX21ldGFkYXRhLm1ha2VfcGFyc2VyKCkKCQloYW5kbGVyID0gcG9ydGFnZV9tZXRh ZGF0YS5NZXRhZGF0YV9YTUwoKQoJCWhhbmRsZXIuX21haW50YWluZXJzID0gW10KCQloYW5k bGVyLl9oZXJkcyA9IFtdCgkJcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpCgkJ cGFyc2VyLnBhcnNlKG1ldGFkYXRhX2ZpbGUpCgkJCgkJbWV0YWRhdGEgPSBbXQoJCWlmIGhh bmRsZXIuX2hlcmRzOgoJCQltZXRhZGF0YSArPSBbIigiICsgdGVhbCgiSDoiICsgIiwgIi5q b2luKGhhbmRsZXIuX2hlcmRzKSApICsgIikiXQoJCWlmIGhhbmRsZXIuX21haW50YWluZXJz OgoJCQltZXRhZGF0YSArPSBbIigiICsgdGVhbCgiTToiICsgIiwgIi5qb2luKGhhbmRsZXIu X21haW50YWluZXJzKSApICsgIikiXQoJCQoJCXJldHVybiAiICIuam9pbihtZXRhZGF0YSkK CQoJZGVmIGZvcm1hdF9zaXplKHNlbGYsIG15ZGVwKToKCQlteXNpemUgPSAwCgkJaWYgbXlk ZXBbMF0gPT0gImVidWlsZCIgYW5kIG15ZGVwWzNdICE9ICJub21lcmdlIjoKCQkJbXlmaWxl c2RpY3Q9cG9ydGFnZS5wb3J0ZGIuZ2V0ZmV0Y2hzaXplcyhteWRlcFsyXSwgdXNlZmxhZ3M9 c2VsZi51c2VfZmxhZ3MobXlkZXApLCBkZWJ1Zz1zZWxmLmVkZWJ1ZykKCQkJaWYgbXlmaWxl c2RpY3Q6CgkJCQlmb3IgbXlmZXRjaGZpbGUgaW4gbXlmaWxlc2RpY3Qua2V5cygpOgoJCQkJ CW15c2l6ZSArPSBteWZpbGVzZGljdFtteWZldGNoZmlsZV0KCQkJCQlzZWxmLmZldGNoc2l6 ZXNbbXlmZXRjaGZpbGVdID0gbXlmaWxlc2RpY3RbbXlmZXRjaGZpbGVdCgkJaWYgbXlzaXpl OgoJCQlyZXR1cm4gZm9ybWF0X3NpemUobXlzaXplKQoJCXJldHVybiAiIgoJCglkZWYgcG9z dF9zaXplX21zZyhzZWxmKToKCQlteXNpemUgPSAwCgkJZm9yIG15ZmV0Y2hmaWxlIGluIHNl bGYuZmV0Y2hzaXplcy5rZXlzKCk6CgkJCW15c2l6ZSArPSBzZWxmLmZldGNoc2l6ZXNbbXlm ZXRjaGZpbGVdCgkJcmV0dXJuICJUb3RhbCBzaXplIG9mIGRvd25sb2FkczogIitmb3JtYXRf c2l6ZShteXNpemUpCgkKCWRlZiBmb3JtYXRfb3ZlcmxheShzZWxmLCBteWRlcCk6CgkJaWYg bXlkZXBbMF0gIT0gImVidWlsZCIgb3IgbXlkZXBbM10gPT0gIm5vbWVyZ2UiOgoJCQlyZXR1 cm4gIiIKCQlmaWxlbmFtZSA9IHBvcnRhZ2UuZGJbIi8iXVsicG9ydHRyZWUiXS5kYmFwaS5m aW5kbmFtZShteWRlcFsyXSkKCQlkaXJuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgu ZGlybmFtZShmaWxlbmFtZSkrIi8uLi8uLiIpCgkJaWYgZGlybmFtZSBpbiBwb3J0YWdlLnNl dHRpbmdzWydQT1JURElSX09WRVJMQVknXS5zcGxpdCgpOgoJCQlpZiBkaXJuYW1lIG5vdCBp biBzZWxmLm92ZXJsYXlzOgoJCQkJc2VsZi5vdmVybGF5cy5hcHBlbmQoZGlybmFtZSkKCQkJ cmV0dXJuIHRlYWwoIlsiK3N0cihzZWxmLm92ZXJsYXlzLmluZGV4KGRpcm5hbWUpKzEpKyJd IikKCQlyZXR1cm4gIiIKCQoJZGVmIHBvc3Rfb3ZlcmxheV9tc2coc2VsZik6CgkJaWYgc2Vs Zi5vdmVybGF5czoKCQkJbXNnID0gIlBvcnRhZ2Ugb3ZlcmxheXM6XG4iCgkJCWZvciB4IGlu IHJhbmdlKDAsIGxlbihzZWxmLm92ZXJsYXlzKSk6CgkJCQltc2cgKz0gIiAiK3RlYWwoIlsi K3N0cih4KzEpKyJdIikrIiAiK3NlbGYub3ZlcmxheXNbeF0rIlxuIgoJCQlyZXR1cm4gbXNn CgkJcmV0dXJuICIiCgkKCWRlZiBmaW5kX2NoYW5nZWxvZ190YWdzKHNlbGYsY2hhbmdlbG9n KToKCQlkaXZzID0gW10KCQlyZWxlYXNlID0gTm9uZQoJCXdoaWxlIDE6CgkJCW1hdGNoID0g cmUuc2VhcmNoKHInXlwqXCA/KFstYS16QS1aMC05Xy5dKikoPzpcIC4qKT9cbicsY2hhbmdl bG9nLHJlLk0pCgkJCWlmIG1hdGNoIGlzIE5vbmU6ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJ CQkJaWYgcmVsZWFzZSBpcyBub3QgTm9uZToKCQkJCQlkaXZzLmFwcGVuZCgocmVsZWFzZSxj aGFuZ2Vsb2cpKQoJCQkJcmV0dXJuIGRpdnMKCQkJaWYgcmVsZWFzZSBpcyBub3QgTm9uZToK CQkJCWRpdnMuYXBwZW5kKChyZWxlYXNlLGNoYW5nZWxvZ1s6bWF0Y2guc3RhcnQoKV0pKQoJ CQljaGFuZ2Vsb2cgPSBjaGFuZ2Vsb2dbbWF0Y2guZW5kKCk6XQoJCQlyZWxlYXNlID0gbWF0 Y2guZ3JvdXAoMSkKCQkJaWYgcmVsZWFzZS5lbmRzd2l0aCgnLmVidWlsZCcpOgoJCQkJcmVs ZWFzZSA9IHJlbGVhc2VbOi03XQoJCQlpZiByZWxlYXNlLmVuZHN3aXRoKCctcjAnKToKCQkJ CXJlbGVhc2UgPSByZWxlYXNlWzotM10KCQoJZGVmIGNhbGNfY2hhbmdlbG9nKHNlbGYsZWJ1 aWxkcGF0aCxjdXJyZW50LG5leHQpOgoJCWN1cnJlbnQgPSAnLScuam9pbihwb3J0YWdlLnBv cnRhZ2VfdmVyc2lvbnMuY2F0cGtnc3BsaXQoY3VycmVudClbMTpdKQoJCWlmIGN1cnJlbnQu ZW5kc3dpdGgoJy1yMCcpOiBjdXJyZW50ID0gY3VycmVudFs6LTNdCgkJbmV4dCA9ICctJy5q b2luKHBvcnRhZ2UucG9ydGFnZV92ZXJzaW9ucy5jYXRwa2dzcGxpdChuZXh0KVsxOl0pCgkJ aWYgbmV4dC5lbmRzd2l0aCgnLXIwJyk6IG5leHQgPSBuZXh0WzotM10KCQkKCQljaGFuZ2Vs b2dwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguc3BsaXQoZWJ1aWxkcGF0aClbMF0sJ0No YW5nZUxvZycpCgkJaWYgb3MucGF0aC5leGlzdHMoY2hhbmdlbG9ncGF0aCk6CgkJCWNoYW5n ZWxvZyA9IG9wZW4oY2hhbmdlbG9ncGF0aCkucmVhZCgpCgkJZWxzZToKCQkJcmV0dXJuIFtd CgkJCgkJZGl2aXNpb25zID0gc2VsZi5maW5kX2NoYW5nZWxvZ190YWdzKGNoYW5nZWxvZykK CQkKCQlmb3IgaSBpbiByYW5nZShsZW4oZGl2aXNpb25zKSk6CgkJCWlmIGRpdmlzaW9uc1tp XVswXT09bmV4dDoKCQkJCWRpdmlzaW9ucyA9IGRpdmlzaW9uc1tpOl0KCQkJCWJyZWFrCgkJ CgkJZm9yIGkgaW4gcmFuZ2UobGVuKGRpdmlzaW9ucykpOgoJCQlpZiBkaXZpc2lvbnNbaV1b MF09PWN1cnJlbnQ6CgkJCQlkaXZpc2lvbnMgPSBkaXZpc2lvbnNbOmldCgkJCQlicmVhawoJ CQoJCXJldHVybiBkaXZpc2lvbnMKCglkZWYgZm9ybWF0X2NoYW5nZWxvZyhzZWxmLCBteWRl cCk6CgkJdGhpc3BrZyA9IG15ZGVwWzJdCgkJZWJ1aWxkX3BhdGggPSBwb3J0YWdlLmRiWyIv Il1bInBvcnR0cmVlIl0uZGJhcGkuZmluZG5hbWUodGhpc3BrZykKCQlpZiBlYnVpbGRfcGF0 aDoKCQkJcHJldnBrZyA9IHNlbGYub2xkX3ZlcnNpb24obXlkZXApCgkJCWlmIHByZXZwa2c6 CgkJCQlzZWxmLmNoYW5nZWxvZ3MuZXh0ZW5kKHNlbGYuY2FsY19jaGFuZ2Vsb2coZWJ1aWxk X3BhdGgsIHByZXZwa2csIHRoaXNwa2cpKQoJCglkZWYgcG9zdF9jaGFuZ2Vsb2dfbXNnKHNl bGYpOgoJCW1zZyA9ICIiCgkJZm9yIChyZXZpc2lvbix0ZXh0KSBpbiBzZWxmLmNoYW5nZWxv Z3M6CgkJCW1zZyArPSBib2xkKCIqIityZXZpc2lvbikrIlxuIgoJCQltc2cgKz0gdGV4dAoJ CWlmIG1zZzoKCQkJcmV0dXJuICJcbiIrbXNnCgkJcmV0dXJuICIiCgkKCWRlZiBkaXNwbGF5 X2ZsYXQoc2VsZik6CgkJbXlncmFwaCA9IHNlbGYuZ3JhcGguY2xvbmUoKQoJCQoJCWZ1bmNs aXN0ID0gW3NlbGYuZm9ybWF0X3N1bW1hcnksIHNlbGYuZm9ybWF0X2Nwdiwgc2VsZi5mb3Jt YXRfb2xkX3ZlcnNpb25dCgkJcG9zdGZ1bmNzID0gW10KCQlpZiBzZWxmLnZlcmJvc2l0eToK CQkJZnVuY2xpc3QgKz0gW3NlbGYuZm9ybWF0X2ZsYWdzXQoJCQlpZiBzZWxmLnZlcmJvc2l0 eSA+PSAyOgoJCQkJZnVuY2xpc3QgKz0gW3NlbGYuZm9ybWF0X21ldGFkYXRhXQoJCQlmdW5j bGlzdCArPSBbc2VsZi5mb3JtYXRfc2l6ZSwgc2VsZi5mb3JtYXRfb3ZlcmxheV0KCQkJcG9z dGZ1bmNzICs9IFtzZWxmLnBvc3Rfc2l6ZV9tc2csIHNlbGYucG9zdF9vdmVybGF5X21zZ10K CQlpZiAiLS1jaGFuZ2Vsb2ciIGluIHNlbGYubXlvcHRzOgoJCQlmdW5jbGlzdCArPSBbc2Vs Zi5mb3JtYXRfY2hhbmdlbG9nXQoJCQlwb3N0ZnVuY3MgKz0gW3NlbGYucG9zdF9jaGFuZ2Vs b2dfbXNnXQoJCQoJCXByaW50CgkJd2hpbGUgbXlncmFwaC5nZXRfYWxsX25vZGVzKCk6CgkJ CW5leHRwa2cgPSBteWdyYXBoLmdldF9sZWFmX25vZGVzKClbMF0KCQkJbXlncmFwaC5yZW1v dmVfbm9kZShuZXh0cGtnKQoJCQluZXh0cGtnID0gbmV4dHBrZy5zcGxpdCgpCgkJCWlmIG5l eHRwa2dbM10gPT0gIm5vbWVyZ2UiOgoJCQkJY29udGludWUKCQkJCgkJCWZvciBmdW5jIGlu IGZ1bmNsaXN0OgoJCQkJdHh0ID0gZnVuYyhuZXh0cGtnKQoJCQkJaWYgdHh0OgoJCQkJCXBy aW50IHR4dCwKCQkJcHJpbnQKCQkKCQlwcmludAoJCWZvciBmdW5jIGluIHBvc3RmdW5jczoK CQkJbXNnID0gZnVuYygpCgkJCWlmIG1zZzoKCQkJCXByaW50IG1zZwoJCglkZWYgZGlzcGxh eV9jb2x1bW5zKHNlbGYpOgoJCW15Z3JhcGggPSBzZWxmLmdyYXBoLmNsb25lKCkKCQkKCQlm dW5jbGlzdCA9IFtzZWxmLmZvcm1hdF9zdW1tYXJ5LCBzZWxmLmZvcm1hdF9uYW1lLAoJCSAg ICAgICAgICAgIHNlbGYuZm9ybWF0X25ld192ZXJzaW9uLCBzZWxmLmZvcm1hdF9vbGRfdmVy c2lvbl0KCQlwb3N0ZnVuY3MgPSBbXQoJCWlmIHNlbGYudmVyYm9zaXR5OgoJCQlmdW5jbGlz dCArPSBbc2VsZi5mb3JtYXRfZmxhZ3NdCgkJCWlmIHNlbGYudmVyYm9zaXR5ID49IDI6CgkJ CQlmdW5jbGlzdCArPSBbc2VsZi5mb3JtYXRfbWV0YWRhdGFdCgkJCWZ1bmNsaXN0ICs9IFtz ZWxmLmZvcm1hdF9zaXplLCBzZWxmLmZvcm1hdF9vdmVybGF5XQoJCQlwb3N0ZnVuY3MgKz0g W3NlbGYucG9zdF9zaXplX21zZywgc2VsZi5wb3N0X292ZXJsYXlfbXNnXQoJCWlmICItLWNo YW5nZWxvZyIgaW4gc2VsZi5teW9wdHM6CgkJCWZ1bmNsaXN0ICs9IFtzZWxmLmZvcm1hdF9j aGFuZ2Vsb2ddCgkJCXBvc3RmdW5jcyArPSBbc2VsZi5wb3N0X2NoYW5nZWxvZ19tc2ddCgkJ CgkJbXlvdXRwdXQgPSBbXQoJCW15d2lkdGhzID0gW10KCQlmb3IgeCBpbiByYW5nZShsZW4o ZnVuY2xpc3QpKToKCQkJbXl3aWR0aHMuYXBwZW5kKDApCgkJCgkJd2hpbGUgbXlncmFwaC5n ZXRfYWxsX25vZGVzKCk6CgkJCW5leHRwa2cgPSBteWdyYXBoLmdldF9sZWFmX25vZGVzKClb MF0KCQkJbXlncmFwaC5yZW1vdmVfbm9kZShuZXh0cGtnKQoJCQluZXh0cGtnID0gbmV4dHBr Zy5zcGxpdCgpCgkJCWlmIG5leHRwa2dbM10gPT0gIm5vbWVyZ2UiOgoJCQkJY29udGludWUK CQkJCgkJCXRoaXNvdXRwdXQgPSBbXQoJCQlmb3IgeCBpbiByYW5nZShsZW4oZnVuY2xpc3Qp KToKCQkJCWZ1bmMgPSBmdW5jbGlzdFt4XQoJCQkJdHh0ID0gZnVuYyhuZXh0cGtnKQoJCQkJ dHh0dyA9IG5jX2xlbih0eHQpCgkJCQlpZiB0eHQgYW5kIHR4dHcgPiBteXdpZHRoc1t4XToK CQkJCQlteXdpZHRoc1t4XSA9IHR4dHcKCQkJCXRoaXNvdXRwdXQuYXBwZW5kKHR4dCkKCQkJ bXlvdXRwdXQuYXBwZW5kKHRoaXNvdXRwdXQpCgkJCgkJcHJpbnQKCQlmb3Igb3V0cHV0IGlu IG15b3V0cHV0OgoJCQlmb3IgeCBpbiByYW5nZShsZW4ob3V0cHV0KSk6CgkJCQl0eHQgPSBv dXRwdXRbeF0KCQkJCXByaW50IHR4dCwoKG15d2lkdGhzW3hdLW5jX2xlbih0eHQpKSoiICIp LAoJCQlwcmludAoJCQoJCXByaW50CgkJZm9yIGZ1bmMgaW4gcG9zdGZ1bmNzOgoJCQltc2cg PSBmdW5jKCkKCQkJaWYgbXNnOgoJCQkJcHJpbnQgbXNnCgkKCWRlZiBkaXNwbGF5X3RyZWUo c2VsZik6CgkJbXlncmFwaCA9IHNlbGYuZ3JhcGguY2xvbmUoKQoJCQoJCWZ1bmNsaXN0ID0g W3NlbGYuZm9ybWF0X2Nwdiwgc2VsZi5mb3JtYXRfb2xkX3ZlcnNpb25dCgkJcG9zdGZ1bmNz ID0gW10KCQlpZiBzZWxmLnZlcmJvc2l0eToKCQkJZnVuY2xpc3QgKz0gW3NlbGYuZm9ybWF0 X2ZsYWdzXQoJCQlpZiBzZWxmLnZlcmJvc2l0eSA+PSAyOgoJCQkJZnVuY2xpc3QgKz0gW3Nl bGYuZm9ybWF0X21ldGFkYXRhXQoJCQlmdW5jbGlzdCArPSBbc2VsZi5mb3JtYXRfc2l6ZSwg c2VsZi5mb3JtYXRfb3ZlcmxheV0KCQkJcG9zdGZ1bmNzICs9IFtzZWxmLnBvc3Rfc2l6ZV9t c2csIHNlbGYucG9zdF9vdmVybGF5X21zZ10KCQlpZiAiLS1jaGFuZ2Vsb2ciIGluIHNlbGYu bXlvcHRzOgoJCQlmdW5jbGlzdCArPSBbc2VsZi5mb3JtYXRfY2hhbmdlbG9nXQoJCQlwb3N0 ZnVuY3MgKz0gW3NlbGYucG9zdF9jaGFuZ2Vsb2dfbXNnXQoJCQoJCWFsbCA9IFtdCgkJCgkJ c3RhY2sgPSBbXQoJCWRlcHRoID0gMAoJCXBhcmVudHMgPSBbXQoJCWN1cmxpc3QgPSBteWdy YXBoLmdldF9yb290X25vZGVzKCkKCQlpbmRleCA9IDAKCQkKCQlwcmludAoJCXdoaWxlIHN0 YWNrIG9yIGluZGV4ICE9IGxlbihjdXJsaXN0KToKCQkJaWYgaW5kZXggPT0gbGVuKGN1cmxp c3QpOgoJCQkJKGRlcHRoLCBwYXJlbnRzLCBjdXJsaXN0LCBpbmRleCkgPSBzdGFjay5wb3Ao KQoJCQllbHNlOgoJCQkJbmV4dHBrZyA9IGN1cmxpc3RbaW5kZXhdLnNwbGl0KCkKCQkJCWlm IGN1cmxpc3RbaW5kZXhdIGluIGFsbDoKCQkJCQluZXh0cGtnWzNdID0gIm5vbWVyZ2UiCgkJ CQlwcmludCBzZWxmLmZvcm1hdF9zdW1tYXJ5KG5leHRwa2cpLAoJCQkJaWYgZGVwdGg6CgkJ CQkJcHJpbnQgKGRlcHRoLTEpKiIgIiwKCQkJCWZvciBmdW5jIGluIGZ1bmNsaXN0OgoJCQkJ CXR4dCA9IGZ1bmMobmV4dHBrZykKCQkJCQlpZiB0eHQ6CgkJCQkJCXByaW50IHR4dCwKCQkJ CXByaW50CgkJCQlpZiBjdXJsaXN0W2luZGV4XSBub3QgaW4gcGFyZW50cyBhbmQgY3VybGlz dFtpbmRleF0gbm90IGluIGFsbDoKCQkJCQljaGlsZHJlbiA9IG15Z3JhcGguZ2V0X2NoaWxk X25vZGVzKGN1cmxpc3RbaW5kZXhdKQoJCQkJCXN0YWNrICs9IFsoZGVwdGgsIHBhcmVudHMs IGN1cmxpc3QsIGluZGV4KV0KCQkJCQlkZXB0aCArPSAxCgkJCQkJcGFyZW50cyA9IHBhcmVu dHMgKyBbY3VybGlzdFtpbmRleF1dCgkJCQkJY3VybGlzdCA9IGNoaWxkcmVuCgkJCQkJaW5k ZXggPSAwCgkJCQkJY29udGludWUKCQkJaWYgY3VybGlzdFtpbmRleF0gbm90IGluIGFsbDoK CQkJCWFsbC5hcHBlbmQoY3VybGlzdFtpbmRleF0pCgkJCWluZGV4ICs9IDEKCQkKCQlwcmlu dAoJCWZvciBmdW5jIGluIHBvc3RmdW5jczoKCQkJbXNnID0gZnVuYygpCgkJCWlmIG1zZzoK CQkJCXByaW50IG1zZwoKZGVmIHVubWVyZ2UobXlvcHRzLCBlZGVidWcsIEVNRVJHRV9XQVJO SU5HX0RFTEFZLCB1bm1lcmdlX2FjdGlvbiwgdW5tZXJnZV9maWxlcyk6CgljYW5kaWRhdGVf Y2F0cGtncz1bXQoJZ2xvYmFsX3VubWVyZ2U9MAoJCglyZWFsc3lzbGlzdCA9IGdldGxpc3Qo InN5c3RlbSIpCglzeXNsaXN0ID0gW10KCWZvciB4IGluIHJlYWxzeXNsaXN0OgoJCW15Y3Ag PSBwb3J0YWdlLnBvcnRhZ2VfZGVwLmRlcF9nZXRrZXkoeCkKCQlpZiBteWNwIGluIHBvcnRh Z2Uuc2V0dGluZ3MudmlydHVhbHM6CgkJCXN5c2xpc3QuZXh0ZW5kKHBvcnRhZ2Uuc2V0dGlu Z3MudmlydHVhbHNbbXljcF0pCgkJc3lzbGlzdC5hcHBlbmQobXljcCkKCQkKCW15c2V0dGlu Z3MgPSBwb3J0YWdlLmNvbmZpZyhjbG9uZT1wb3J0YWdlLnNldHRpbmdzKQoJCglpZiBub3Qg dW5tZXJnZV9maWxlcyBvciAid29ybGQiIGluIHVubWVyZ2VfZmlsZXMgb3IgInN5c3RlbSIg aW4gdW5tZXJnZV9maWxlczoKCQlpZiAidW5tZXJnZSI9PXVubWVyZ2VfYWN0aW9uOgoJCQlw cmludAoJCQlwcmludCBib2xkKCJlbWVyZ2UgdW5tZXJnZSIpKyIgY2FuIG9ubHkgYmUgdXNl ZCB3aXRoIHNwZWNpZmljIHBhY2thZ2UgbmFtZXMsIG5vdCB3aXRoICIrYm9sZCgid29ybGQi KSsiIG9yIgoJCQlwcmludCBib2xkKCJzeXN0ZW0iKSsiIHRhcmdldHMuIgoJCQlwcmludAoJ CQlyZXR1cm4gMAoJCWVsc2U6CgkJCWdsb2JhbF91bm1lcmdlPTEKCQoJbG9jYWx0cmVlPXBv cnRhZ2UuZGJbcG9ydGFnZS5yb290XVsidmFydHJlZSJdCgkjIHByb2Nlc3MgYWxsIGFyZ3Vt ZW50cyBhbmQgYWRkIGFsbCB2YWxpZCBkYiBlbnRyaWVzIHRvIGNhbmRpZGF0ZV9jYXRwa2dz CglpZiBnbG9iYWxfdW5tZXJnZToKCQlpZiBub3QgdW5tZXJnZV9maWxlcyBvciAid29ybGQi IGluIHVubWVyZ2VfZmlsZXM6CgkJCWNhbmRpZGF0ZV9jYXRwa2dzLmV4dGVuZChsb2NhbHRy ZWUuZ2V0YWxsbm9kZXMoKSkJCgkJZWxpZiAic3lzdGVtIiBpbiB1bm1lcmdlX2ZpbGVzOgoJ CQljYW5kaWRhdGVfY2F0cGtncy5leHRlbmQoZ2V0bGlzdCgic3lzdGVtIikpCgllbHNlOgoJ CSN3ZSd2ZSBnb3QgY29tbWFuZC1saW5lIGFyZ3VtZW50cwoJCWlmIG5vdCB1bm1lcmdlX2Zp bGVzOgoJCQlwcmludCAiXG5ObyBwYWNrYWdlcyB0byB1bm1lcmdlIGhhdmUgYmVlbiBwcm92 aWRlZC5cbiIKCQkJcmV0dXJuIDAKCQlmb3IgeCBpbiB1bm1lcmdlX2ZpbGVzOgoJCQlhcmdf cGFydHM9eC5zcGxpdCgnLycpCgkJCWlmICh4WzBdIG5vdCBpbiBbIi4iLCIvIl0pIGFuZCAo YXJnX3BhcnRzWy0xXVstNzpdICE9ICIuZWJ1aWxkIik6CgkJCQkjcG9zc2libGUgY2F0L3Br ZyBvciBkZXA7IHRyZWF0IGFzIHN1Y2gKCQkJCWNhbmRpZGF0ZV9jYXRwa2dzLmFwcGVuZCh4 KQoJCQllbGlmIHVubWVyZ2VfYWN0aW9uIGluIFsicHJ1bmUiLCJjbGVhbiJdOgoJCQkJcHJp bnQgIlxuISEhIFBydW5lIGFuZCBjbGVhbiBkbyBub3QgYWNjZXB0IGluZGl2aWR1YWwgZWJ1 aWxkcyBhcyBhcmd1bWVudHM7XG4gICAgc2tpcHBpbmcuXG4iCgkJCQljb250aW51ZQoJCQll bHNlOgoJCQkJIyBpdCBhcHBlYXJzIHRoYXQgdGhlIHVzZXIgaXMgc3BlY2lmeWluZyBhbiBp bnN0YWxsZWQgZWJ1aWxkIGFuZCB3ZSdyZSBpbiAidW5tZXJnZSIgbW9kZSwgc28gaXQncwoJ CQkJIyBvay4KCQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyh4KToKCQkJCQlwcmludCAiXG4h ISEgVGhlIHBhdGggJyIreCsiJyBkb2Vzbid0IGV4aXN0LlxuIgoJCQkJCXJldHVybiAwCgoJ CQkJYWJzeCAgID0gb3MucGF0aC5hYnNwYXRoKHgpCgkJCQlzcF9hYnN4ID0gYWJzeC5zcGxp dCgiLyIpCgkJCQlpZiBzcF9hYnN4Wy0xXVstNzpdID09ICIuZWJ1aWxkIjoKCQkJCQlkZWwg c3BfYWJzeFstMV0KCQkJCQlhYnN4ID0gIi8iLmpvaW4oc3BfYWJzeCkKCgkJCQlzcF9hYnN4 X2xlbiA9IGxlbihzcF9hYnN4KQoKCQkJCXZkYl9wYXRoID0gcG9ydGFnZS5yb290K3BvcnRh Z2UuVkRCX1BBVEgKCQkJCXZkYl9sZW4gID0gbGVuKHZkYl9wYXRoKQoJCQkJCgkJCQlzcF92 ZGIgICAgID0gdmRiX3BhdGguc3BsaXQoIi8iKQoJCQkJc3BfdmRiX2xlbiA9IGxlbihzcF92 ZGIpCgoJCQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGFic3grIi9DT05URU5UUyIpOgoJCQkJ CXByaW50ICIhISEgTm90IGEgdmFsaWQgZGIgZGlyOiAiK3N0cihhYnN4KQoJCQkJCXJldHVy biAwCgoJCQkJaWYgc3BfYWJzeF9sZW4gPD0gc3BfdmRiX2xlbjoKCQkJCQkjIFRoZSBQYXRo IGlzIHNob3J0ZXIuLi4gc28gaXQgY2FuJ3QgYmUgaW5zaWRlIHRoZSB2ZGIuCgkJCQkJcHJp bnQgc3BhYnN4CgkJCQkJcHJpbnQgYWJzeAoJCQkJCXByaW50ICJcbiEhISIseCwiY2Fubm90 IGJlIGluc2lkZSAiKyhwb3J0YWdlLnJvb3QrcG9ydGFnZS5WREJfUEFUSCkrIjsgYWJvcnRp bmcuXG4iCgkJCQkJcmV0dXJuIDAKCgkJCQlmb3IgaWR4IGluIHJhbmdlKDAsc3BfdmRiX2xl bik6CgkJCQkJaWYgKGlkeCA+PSBzcF9hYnN4X2xlbikgb3IgKHNwX3ZkYltpZHhdICE9IHNw X2Fic3hbaWR4XSk6CgkJCQkJCXByaW50IHNwX2Fic3gKCQkJCQkJcHJpbnQgYWJzeAoJCQkJ CQlwcmludCAiXG4hISEiLHgsImlzIG5vdCBpbnNpZGUgIisocG9ydGFnZS5yb290K3BvcnRh Z2UuVkRCX1BBVEgpKyI7IGFib3J0aW5nLlxuIgoJCQkJCQlyZXR1cm4gMAoJCQkJCgkJCQlw cmludCAiPSIrIi8iLmpvaW4oc3BfYWJzeFtzcF92ZGJfbGVuOl0pCgkJCQljYW5kaWRhdGVf Y2F0cGtncy5hcHBlbmQoIj0iKyIvIi5qb2luKHNwX2Fic3hbc3BfdmRiX2xlbjpdKSkKCglp ZiAoIi0tcHJldGVuZCIgaW4gbXlvcHRzKSBvciAoIi0tYXNrIiBpbiBteW9wdHMpOgoJCXBy aW50IGRhcmtncmVlbigiXG4+Pj4gVGhlc2UgYXJlIHRoZSBwYWNrYWdlcyB0aGF0IEkgd291 bGQgdW5tZXJnZToiKQoJCglwa2dtYXA9e30KCW51bXNlbGVjdGVkPTAKCWZvciB4IGluIGNh bmRpZGF0ZV9jYXRwa2dzOgoJCSNjeWNsZSB0aHJvdWdoIGFsbCBvdXIgY2FuZGlkYXRlIGRl cHMgYW5kIGRldGVybWluZSB3aGF0IHdpbGwgYW5kIHdpbGwgbm90IGdldCB1bm1lcmdlZAoJ CXRyeToKCQkJbXltYXRjaD1sb2NhbHRyZWUuZGVwX21hdGNoKHgpCgkJZXhjZXB0IEtleUVy cm9yOgoJCQlteW1hdGNoPU5vbmUKCQlleGNlcHQgVmFsdWVFcnJvciwgZXJycGtnczoKCQkJ cHJpbnQgIlxuXG4hISEgVGhlIHNob3J0IGVidWlsZCBuYW1lIFwiIiArIHggKyAiXCIgaXMg YW1iaWd1b3VzLiAgUGxlYXNlIHNwZWNpZnkiCgkJCXByaW50ICIhISEgb25lIG9mIHRoZSBm b2xsb3dpbmcgZnVsbHktcXVhbGlmaWVkIGVidWlsZCBuYW1lcyBpbnN0ZWFkOlxuIgoJCQlm b3IgaSBpbiBlcnJwa2dzWzBdOgoJCQkJcHJpbnQgIiAgICAiICsgZ3JlZW4oaSkKCQkJcHJp bnQKCQkJc3lzLmV4aXQoMSkKCgkJaWYgbm90IG15bWF0Y2ggYW5kIHhbMF0gbm90IGluICI8 Pj1+IjoKCQkJI2FkZCBhICI9IiBpZiBtaXNzaW5nCgkJCW15bWF0Y2g9bG9jYWx0cmVlLmRl cF9tYXRjaCgiPSIreCkKCQlpZiBub3QgbXltYXRjaDoKCQkJcHJpbnQgIlxuLS0tIENvdWxk bid0IGZpbmQgIiArIHdoaXRlKHgpICsgIiB0byAiK3VubWVyZ2VfYWN0aW9uKyIuIgoJCQlj b250aW51ZQoJCW15a2V5PXBvcnRhZ2Uua2V5X2V4cGFuZChwb3J0YWdlLnBvcnRhZ2VfZGVw LmRlcF9nZXRrZXkobXltYXRjaFswXSkscG9ydGFnZS5kYlsiLyJdWyJ2YXJ0cmVlIl0uZGJh cGkpCgkJaWYgbm90IHBrZ21hcC5oYXNfa2V5KG15a2V5KToKCQkJcGtnbWFwW215a2V5XT17 InByb3RlY3RlZCI6W10sICJzZWxlY3RlZCI6W10sICJvbWl0dGVkIjpbXSB9CgkJaWYgdW5t ZXJnZV9hY3Rpb249PSJ1bm1lcmdlIjoKCQkJCWZvciB5IGluIG15bWF0Y2g6CgkJCQkJaWYg eSBub3QgaW4gcGtnbWFwW215a2V5XVsic2VsZWN0ZWQiXToKCQkJCQkJcGtnbWFwW215a2V5 XVsic2VsZWN0ZWQiXS5hcHBlbmQoeSkKCQkJCQkJbnVtc2VsZWN0ZWQ9bnVtc2VsZWN0ZWQr bGVuKG15bWF0Y2gpCgkJCQlpZiBub3QgKHBrZ21hcFtteWtleV1bInByb3RlY3RlZCJdIG9y IHBrZ21hcFtteWtleV1bIm9taXR0ZWQiXSkgYW5kIFwKCQkJCShteWtleSBpbiBzeXNsaXN0 K1sic3lzLWFwcHMvcG9ydGFnZSJdKToKCQkJCQlwcmludCByZWQoIlxhXG5cbiEhISBUcnlp bmcgdG8gdW5tZXJnZSBwYWNrYWdlKHMpIGluIHN5c3RlbSBwcm9maWxlLiAnJXMnIiAlICht eWtleSkpCgkJCQkJcHJpbnQgeWVsbG93KCJcYSEhISBUaGlzIGNvdWxkIGJlIGRhbWFnaW5n IHRvIHlvdXIgc3lzdGVtLlxuIikKCQkJCQlpZiAiLS1wcmV0ZW5kIiBub3QgaW4gbXlvcHRz OgoJCQkJCQljb3VudGRvd24oRU1FUkdFX1dBUk5JTkdfREVMQVkscmVkKCJQcmVzcyBDdHJs LUMgdG8gU3RvcCIpKQoKCQllbHNlOgoJCQkjdW5tZXJnZV9hY3Rpb24gaW4gWyJwcnVuZSIs IGNsZWFuIl0KCQkJc2xvdG1hcD17fQoJCQlmb3IgbXlwa2cgaW4gbXltYXRjaDoKCQkJCWlm IHVubWVyZ2VfYWN0aW9uPT0iY2xlYW4iOgoJCQkJCW15c2xvdD1sb2NhbHRyZWUuZ2V0c2xv dChteXBrZykKCQkJCWVsc2U6CgkJCQkJI3NpbmNlIHdlJ3JlIHBydW5pbmcsIHdlIGRvbid0 IGNhcmUgYWJvdXQgc2xvdHMgYW5kIHB1dCBhbGwgdGhlIHBrZ3MgaW4gdG9nZXRoZXIKCQkJ CQlteXNsb3Q9MAoJCQkJaWYgbm90IHNsb3RtYXAuaGFzX2tleShteXNsb3QpOgoJCQkJCXNs b3RtYXBbbXlzbG90XT17fQoJCQkJc2xvdG1hcFtteXNsb3RdW2xvY2FsdHJlZS5kYmFwaS5j cHZfY291bnRlcihteXBrZyldPW15cGtnCgkJCWZvciBteXNsb3QgaW4gc2xvdG1hcC5rZXlz KCk6CgkJCQljb3VudGVya2V5cz1zbG90bWFwW215c2xvdF0ua2V5cygpCgkJCQljb3VudGVy a2V5cy5zb3J0KCkKCQkJCWlmIG5vdCBjb3VudGVya2V5czoKCQkJCQljb250aW51ZQoJCQkJ Y291bnRlcmtleXMuc29ydCgpCgkJCQlwa2dtYXBbbXlrZXldWyJwcm90ZWN0ZWQiXS5hcHBl bmQoc2xvdG1hcFtteXNsb3RdW2NvdW50ZXJrZXlzWy0xXV0pCgkJCQlkZWwgY291bnRlcmtl eXNbLTFdCgkJCQkjYmUgcHJldHR5IGFuZCBnZXQgdGhlbSBpbiBvcmRlciBvZiBtZXJnZToK CQkJCWZvciBja2V5IGluIGNvdW50ZXJrZXlzOgoJCQkJCXBrZ21hcFtteWtleV1bInNlbGVj dGVkIl0uYXBwZW5kKHNsb3RtYXBbbXlzbG90XVtja2V5XSkKCQkJCQludW1zZWxlY3RlZD1u dW1zZWxlY3RlZCsxCgkJCQkjb2ssIG5vdyB0aGUgbGFzdC1tZXJnZWQgcGFja2FnZSBpcyBw cm90ZWN0ZWQsIGFuZCB0aGUgcmVzdCBhcmUgc2VsZWN0ZWQKCWlmIGdsb2JhbF91bm1lcmdl IGFuZCBub3QgbnVtc2VsZWN0ZWQ6CgkJcHJpbnQgIlxuPj4+IE5vIG91dGRhdGVkIHBhY2th Z2VzIHdlcmUgZm91bmQgb24geW91ciBzeXN0ZW0uXG4iCgkJcmV0dXJuIDAKCglpZiBub3Qg bnVtc2VsZWN0ZWQ6CgkJcHJpbnQgIlxuPj4+Iix1bm1lcmdlX2FjdGlvbisiOiBObyBwYWNr YWdlcyBzZWxlY3RlZCBmb3IgcmVtb3ZhbC5cbiIKCQlyZXR1cm4gMAoKCWtleXMgPSBwa2dt YXAua2V5cygpCglrZXlzLnNvcnQoKQoJZm9yIHggaW4ga2V5czoKCQlmb3IgeSBpbiBsb2Nh bHRyZWUuZGVwX21hdGNoKHgpOgoJCQlpZiB5IG5vdCBpbiBwa2dtYXBbeF1bIm9taXR0ZWQi XSBhbmQgXAoJCQl5IG5vdCBpbiBwa2dtYXBbeF1bInNlbGVjdGVkIl0gYW5kIFwKCQkJeSBu b3QgaW4gcGtnbWFwW3hdWyJwcm90ZWN0ZWQiXToKCQkJCXBrZ21hcFt4XVsib21pdHRlZCJd LmFwcGVuZCh5KQoJCWlmIGdsb2JhbF91bm1lcmdlIGFuZCBub3QgcGtnbWFwW3hdWyJzZWxl Y3RlZCJdOgoJCQkjYXZvaWQgY2x1dHRlcmluZyB0aGUgcHJldmlldyBwcmludG91dCB3aXRo IHN0dWZmIHRoYXQgaXNuJ3QgZ2V0dGluZyB1bm1lcmdlZAoJCQljb250aW51ZQoJCXByaW50 ICJcbiAiK3doaXRlKHgpCgkJZm9yIG15dHlwZSBpbiBbInNlbGVjdGVkIiwicHJvdGVjdGVk Iiwib21pdHRlZCJdOgoJCQlwcmludCBteXR5cGUucmp1c3QoMTIpKyI6IiwKCQkJaWYgcGtn bWFwW3hdW215dHlwZV06CgkJCQlmb3IgbXlwa2cgaW4gcGtnbWFwW3hdW215dHlwZV06CgkJ CQkJbXlzcGxpdD1wb3J0YWdlX3ZlcnNpb25zLmNhdHBrZ3NwbGl0KG15cGtnKQoJCQkJCWlm IG15c3BsaXRbM109PSJyMCI6CgkJCQkJCW15dmVyc2lvbj1teXNwbGl0WzJdCgkJCQkJZWxz ZToKCQkJCQkJbXl2ZXJzaW9uPW15c3BsaXRbMl0rIi0iK215c3BsaXRbM10KCQkJCQlpZiBt eXR5cGU9PSJzZWxlY3RlZCI6CgkJCQkJCXByaW50IHJlZChteXZlcnNpb24pLAoJCQkJCWVs c2U6CgkJCQkJCXByaW50IGdyZWVuKG15dmVyc2lvbiksCgkJCWVsc2U6CgkJCQkJcHJpbnQg Im5vbmUiLAoJCQlwcmludAoJCglwcmludCAiXG4+Pj4iLHJlZCgiJ1NlbGVjdGVkJyIpLCJw YWNrYWdlcyBhcmUgc2xhdGVkIGZvciByZW1vdmFsLiIKCXByaW50ICI+Pj4iLGdyZWVuKCIn UHJvdGVjdGVkJyIpLCJhbmQiLGdyZWVuKCInb21pdHRlZCciKSwicGFja2FnZXMgd2lsbCBu b3QgYmUgcmVtb3ZlZC5cbiIKCQoJaWYgIi0tcHJldGVuZCIgaW4gbXlvcHRzOgoJCSN3ZSdy ZSBkb25lLi4uIHJldHVybgoJCXJldHVybiAwCglpZiAiLS1hc2siIGluIG15b3B0czoKCQlp ZiB1c2VycXVlcnkoIkRvIHlvdSB3YW50IG1lIHRvIHVubWVyZ2UgdGhlc2UgcGFja2FnZXM/ Iik9PSJObyI6CgkJCSMgZW50ZXIgcHJldGVuZCBtb2RlIGZvciBjb3JyZWN0IGZvcm1hdHRp bmcgb2YgcmVzdWx0cwoJCQlteW9wdHMrPVsiLS1wcmV0ZW5kIl0KCQkJcHJpbnQKCQkJcHJp bnQgIlF1aXR0aW5nLiIKCQkJcHJpbnQKCQkJcmV0dXJuIDAKCSN0aGUgcmVhbCB1bm1lcmdp bmcgYmVnaW5zLCBhZnRlciBhIHNob3J0IGRlbGF5Li4uLgoJCglDTEVBTl9ERUxBWSA9IDUK CWlmIHBvcnRhZ2Uuc2V0dGluZ3NbIkNMRUFOX0RFTEFZIl06CgkJQ0xFQU5fREVMQVkgPSBp bnQoIjAiK3BvcnRhZ2Uuc2V0dGluZ3NbIkNMRUFOX0RFTEFZIl0pCgljb3VudGRvd24oQ0xF QU5fREVMQVksICI+Pj4gVW5tZXJnaW5nIikKCglmb3IgeCBpbiBwa2dtYXAua2V5cygpOgoJ CWZvciB5IGluIHBrZ21hcFt4XVsic2VsZWN0ZWQiXToKCQkJcHJpbnQgIj4+PiBVbm1lcmdp bmcgIit5KyIuLi4iCgkJCWVtZXJnZWxvZyhlZGVidWcsIj09PSBVbm1lcmdpbmcuLi4gKCIr eSsiKSIpCgkJCW15c3BsaXQ9eS5zcGxpdCgiLyIpCgkJCSN1bm1lcmdlLi4uCgkJCXJldHZh bD1wb3J0YWdlLnVubWVyZ2UobXlzcGxpdFswXSxteXNwbGl0WzFdLHBvcnRhZ2Uucm9vdCxt eXNldHRpbmdzLHVubWVyZ2VfYWN0aW9uIG5vdCBpbiBbImNsZWFuIiwicHJ1bmUiXSkKCQkJ aWYgcmV0dmFsOgoJCQkJZW1lcmdlbG9nKGVkZWJ1ZywiICEhISB1bm1lcmdlIEZBSUxVUkU6 ICIreSkKCQkJZWxzZToKCQkJCWVtZXJnZWxvZyhlZGVidWcsIiA+Pj4gdW5tZXJnZSBzdWNj ZXNzOiAiK3kpCgkjcnVuIGxkY29uZmlnLCBldGMuLi4KCXBvcnRhZ2UuZW52X3VwZGF0ZShw b3J0YWdlLnJvb3QpCglpZiBub3QgbnVtc2VsZWN0ZWQ6CgkJcmV0dXJuIDAKCWVsc2U6CgkJ cmV0dXJuIDEKCmRlZiBjaGtfdXBkYXRlZF9pbmZvX2ZpbGVzKCk6Cglyb290PXBvcnRhZ2Uu cm9vdAoKCWluZm9kaXJzID1wb3J0YWdlLnNldHRpbmdzWyJJTkZPUEFUSCJdLnNwbGl0KCI6 IikKCWluZm9kaXJzKz1wb3J0YWdlLnNldHRpbmdzWyJJTkZPRElSIl0uc3BsaXQoIjoiKQoK CXByaW50CglpZiBvcy5wYXRoLmV4aXN0cygiL3Vzci9iaW4vaW5zdGFsbC1pbmZvIik6CgkJ cmVnZW5faW5mb2RpcnM9W10KCQlmb3IgeiBpbiBpbmZvZGlyczoKCQkJaWYgej09Jyc6CgkJ CQljb250aW51ZQoJCQlpbmZvcm9vdD1ub3JtcGF0aChyb290K3opCgkJCWlmIG9zLnBhdGgu aXNkaXIoaW5mb3Jvb3QpOgoJCQkJdHJ5OgoJCQkJCWluZm9tdGltZT1vcy5zdGF0KGluZm9y b290KVtTVF9NVElNRV0KCQkJCWV4Y2VwdCBTeXN0ZW1FeGl0LCBlOgoJCQkJCXJhaXNlICMg TmVlZGVkIGVsc2UgY2FuJ3QgZXhpdAoJCQkJZXhjZXB0OgoJCQkJCWluZm9tdGltZT0wCgoJ CQkJaWYgbm90IHBvcnRhZ2UubXRpbWVkYi5oYXNfa2V5KCJpbmZvIik6CgkJCQkJcG9ydGFn ZS5tdGltZWRiWyJpbmZvIl09e30KCQkJCWlmIHBvcnRhZ2UubXRpbWVkYlsiaW5mbyJdLmhh c19rZXkoaW5mb3Jvb3QpOgoJCQkJCWlmIHBvcnRhZ2UubXRpbWVkYlsiaW5mbyJdW2luZm9y b290XT09aW5mb210aW1lOgoJCQkJCQlwYXNzCgkJCQkJZWxzZToKCQkJCQkJcG9ydGFnZS5t dGltZWRiWyJpbmZvIl1baW5mb3Jvb3RdPWluZm9tdGltZQoJCQkJCQlyZWdlbl9pbmZvZGly cy5hcHBlbmQoaW5mb3Jvb3QpCgkJCQllbHNlOgoJCQkJCXJlZ2VuX2luZm9kaXJzLmFwcGVu ZChpbmZvcm9vdCkKCgkJaWYgbm90IHJlZ2VuX2luZm9kaXJzOgoJCQlwcmludCAiICIrZ3Jl ZW4oIioiKSsiIEdOVSBpbmZvIGRpcmVjdG9yeSBpbmRleCBpcyB1cC10by1kYXRlLiIKCQll bHNlOgoJCQlwcmludCAiICIrZ3JlZW4oIioiKSsiIFJlZ2VuZXJhdGluZyBHTlUgaW5mbyBk aXJlY3RvcnkgaW5kZXguLi4iCgoJCQlpY291bnQ9MAoJCQliYWRjb3VudD0wCgkJCWZvciBp bmZvcm9vdCBpbiByZWdlbl9pbmZvZGlyczoKCQkJCWlmIGluZm9yb290PT0nJzoKCQkJCQlj b250aW51ZQoJCQkJdHJ5OgoJCQkJCW9zLnJlbmFtZShpbmZvcm9vdCsiL2RpciIsaW5mb3Jv b3QrIi9kaXIub2xkIikKCQkJCWV4Y2VwdCBTeXN0ZW1FeGl0LCBlOgoJCQkJCXJhaXNlICMg TmVlZGVkIGVsc2UgY2FuJ3QgZXhpdAoJCQkJZXhjZXB0OgoJCQkJCXBhc3MKCQkJCQoJCQkJ aWYgbm90IG9zLnBhdGguaXNkaXIoaW5mb3Jvb3QpOgoJCQkJCWNvbnRpbnVlCgkJCQllcnJt c2cgPSAiIgoJCQkJZm9yIHggaW4gb3MubGlzdGRpcihpbmZvcm9vdCk6CgkJCQkJaWYgKHhb MF0gPT0gIi4iKSBvciAoeCBpbiBbImRpciIsImRpci5vbGQiXSkgb3IgKG9zLnBhdGguaXNk aXIoaW5mb3Jvb3QrIi8iK3gpKToKCQkJCQkJY29udGludWUKIwkJCQkJbXlzbz1jb21tYW5k cy5nZXRzdGF0dXNvdXRwdXQoIkxBTkc9QyBMQU5HVUFHRT1DIC91c3IvYmluL2luc3RhbGwt aW5mbyAtLWRpci1maWxlPSIraW5mb3Jvb3QrIi9kaXIgIitpbmZvcm9vdCsiLyIreClbMV0K CQkJCQlteWNtZCA9ICJMQU5HPUMgTEFOR1VBR0U9QyAvdXNyL2Jpbi9pbnN0YWxsLWluZm8g LS1kaXItZmlsZT0iK2luZm9yb290KyIvZGlyICIraW5mb3Jvb3QrIi8iK3gKCQkJCQlteXNv PXBvcnRhZ2VfZXhlYy5zcGF3bl9nZXRfb3V0cHV0KG15Y21kLHNwYXduX3R5cGU9cG9ydGFn ZV9leGVjLnNwYXduX2Jhc2gpWzFdCgkJCQkJZXhpc3Rzc3RyPSJhbHJlYWR5IGV4aXN0cywg Zm9yIGZpbGUgYCIKCQkJCQlpZiBteXNvIT0iIjoKCQkJCQkJaWYgcmUuc2VhcmNoKGV4aXN0 c3N0cixteXNvKToKCQkJCQkJCSMgQWxyZWFkeSBleGlzdHMuLi4gRG9uJ3QgaW5jcmVtZW50 IHRoZSBjb3VudCBmb3IgdGhpcy4KCQkJCQkJCXBhc3MKCQkJCQkJZWxpZiBteXNvWzo0NF09 PSJpbnN0YWxsLWluZm86IHdhcm5pbmc6IG5vIGluZm8gZGlyIGVudHJ5IGluICI6CgkJCQkJ CQkjIFRoaXMgaW5mbyBmaWxlIGRvZXNuJ3QgY29udGFpbiBhIERJUi1oZWFkZXI6IGluc3Rh bGwtaW5mbyBwcm9kdWNlcyB0aGlzCgkJCQkJCQkjIChoYXJtbGVzcykgd2FybmluZyAodGhl IC0tcXVpZXQgc3dpdGNoIGRvZXNuJ3Qgc2VlbSB0byB3b3JrKS4KCQkJCQkJCSMgRG9uJ3Qg aW5jcmVtZW50IHRoZSBjb3VudCBmb3IgdGhpcy4KCQkJCQkJCXBhc3MKCQkJCQkJZWxzZToK CQkJCQkJCWJhZGNvdW50PWJhZGNvdW50KzEKCQkJCQkJCWVycm1zZyArPSBteXNvICsgIlxu IgoJCQkJCWljb3VudD1pY291bnQrMQoJCQkJCQoJCQkJI3VwZGF0ZSBtdGltZSBzbyB3ZSBj YW4gcG90ZW50aWFsbHkgYXZvaWQgcmVnZW5lcmF0aW5nLgoJCQkJcG9ydGFnZS5tdGltZWRi WyJpbmZvIl1baW5mb3Jvb3RdPW9zLnN0YXQoaW5mb3Jvb3QpW1NUX01USU1FXQoKCQkJaWYg YmFkY291bnQ6CgkJCQlwcmludCAiICIreWVsbG93KCIqIikrIiBQcm9jZXNzZWQiLGljb3Vu dCwiaW5mbyBmaWxlczsiLGJhZGNvdW50LCJlcnJvcnMuIgoJCQkJcHJpbnQgZXJybXNnCgkJ CWVsc2U6CgkJCQlwcmludCAiICIrZ3JlZW4oIioiKSsiIFByb2Nlc3NlZCIsaWNvdW50LCJp bmZvIGZpbGVzLiIKCmRlZiBjaGtfdXBkYXRlZF9jZmdfZmlsZXMoKToKCWlmIHBvcnRhZ2Uu c2V0dGluZ3NbIkNPTkZJR19QUk9URUNUIl06CgkJI251bWJlciBvZiBkaXJlY3RvcmllcyB3 aXRoIHNvbWUgcHJvdGVjdCBmaWxlcyBpbiB0aGVtCgkJcHJvY291bnQ9MAoJCWZvciB4IGlu IHBvcnRhZ2Uuc2V0dGluZ3NbIkNPTkZJR19QUk9URUNUIl0uc3BsaXQoKToKCQkJaWYgb3Mu cGF0aC5pc2Rpcih4KToKCQkJCWE9cG9ydGFnZV9leGVjLnNwYXduX2dldF9vdXRwdXQoImNk ICIreCsiOyBmaW5kIC4gLWluYW1lICcuX2NmZz8/Pz9fKiciLHNwYXduX3R5cGU9cG9ydGFn ZV9leGVjLnNwYXduX2Jhc2gpCgkJCQlpZiBhWzBdIT0wOgoJCQkJCXByaW50ICIgIityZWQo IioiKSsiIGVycm9yIHNjYW5uaW5nIix4CgkJCQllbHNlOgoJCQkJCWZpbGVzPWFbMV0uc3Bs aXQoKQoJCQkJCWlmIGZpbGVzOgoJCQkJCQlwcm9jb3VudD1wcm9jb3VudCsxCgkJCQkJCXBy aW50ICIgIit5ZWxsb3coIiogSU1QT1JUQU5UOiIpKyIiLGxlbihmaWxlcyksImNvbmZpZyBm aWxlcyBpbiIseCwibmVlZCB1cGRhdGluZy4iCgkJaWYgcHJvY291bnQ6CgkJCSNwcmludCAi ICIreWVsbG93KCIqIikrIiBUeXBlICIrZ3JlZW4oImVtZXJnZSAtLWhlbHAgY29uZmlnIikr IiB0byBsZWFybiBob3cgdG8gdXBkYXRlIGNvbmZpZyBmaWxlcy4iCgkJCXByaW50ICIgIit5 ZWxsb3coIioiKSsiIFR5cGUgIitncmVlbigiZW1lcmdlIC0taGVscCBjb25maWciKSsiIHRv IGxlYXJuIGhvdyB0byB1cGRhdGUgY29uZmlnIGZpbGVzLiIKCQlwcmludAoKY2xhc3MgZW1l cmdlX2NtZDoKCQoJZGVmIF9faW5pdF9fKHNlbGYpOgoJCXNlbGYubXlhY3Rpb249Tm9uZQoJ CXNlbGYubXlvcHRzPVtdCgkJc2VsZi5teWZpbGVzPVtdCgkJc2VsZi5teXBhcmFtcz1Ob25l CgkJc2VsZi5lZGVidWc9MAoJCXNlbGYudmVyYm9zaXR5PTAKCQlzZWxmLkVNRVJHRV9XQVJO SU5HX0RFTEFZID0gMTAKCQlpZiBwb3J0YWdlLnNldHRpbmdzWyJFTUVSR0VfV0FSTklOR19E RUxBWSJdOgoJCQlzZWxmLkVNRVJHRV9XQVJOSU5HX0RFTEFZID0gaW50KCIwIitwb3J0YWdl LnNldHRpbmdzWyJFTUVSR0VfV0FSTklOR19ERUxBWSJdKQoJCQoJCXNwaW5uZXI9c3Rkb3V0 X3NwaW5uZXIoKQoJCQoJCWlmIChub3Qgc3lzLnN0ZG91dC5pc2F0dHkoKSkgb3IgKHBvcnRh Z2Uuc2V0dGluZ3NbIk5PQ09MT1IiXSBpbiBbInllcyIsInRydWUiXSk6CgkJCW5vY29sb3Io KQoJCQoJCWlmIHBvcnRhZ2Uuc2V0dGluZ3MuaGFzX2tleSgiUE9SVEFHRV9OSUNFTkVTUyIp OgoJCQl0cnk6CgkJCQlvcy5uaWNlKGludChwb3J0YWdlLnNldHRpbmdzWyJQT1JUQUdFX05J Q0VORVNTIl0pKQoJCQlleGNlcHQgU3lzdGVtRXhpdCwgZToKCQkJCXJhaXNlICMgTmVlZGVk IGVsc2UgY2FuJ3QgZXhpdAoJCQlleGNlcHQgRXhjZXB0aW9uLGU6CgkJCQlwcmludCAiISEh IEZhaWxlZCB0byBjaGFuZ2UgbmljZSB2YWx1ZSB0byAnIitzdHIocG9ydGFnZS5zZXR0aW5n c1siUE9SVEFHRV9OSUNFTkVTUyJdKSsiJyIKCQkJCXByaW50ICIhISEiLGUKCQkKCQkjRnJl ZXplIHRoZSBwb3J0ZGJhcGkgZm9yIGVuaGFuY2VkIHBlcmZvcm1hbmNlOgoJCXBvcnRhZ2Uu cG9ydGRiLmZyZWV6ZSgpCgkJCgkJIyBLaWxsIG5vYXV0byBhcyBpdCB3aWxsIGJyZWFrIG1l cmdlcyBvdGhlcndpc2UuCgkJd2hpbGUgJ25vYXV0bycgaW4gcG9ydGFnZS5mZWF0dXJlczoK CQkJcG9ydGFnZS5mZWF0dXJlcy5yZW1vdmUoJ25vYXV0bycpCgkKCWRlZiBlbWVyZ2Vsb2co c2VsZixteXN0cixzaG9ydF9tc2c9Tm9uZSk6CgkJZW1lcmdlbG9nKHNlbGYuZWRlYnVnLG15 c3RyLHNob3J0X21zZykKCQoJZGVmIGhlbHAoc2VsZik6CgkJIyBNb3ZlIGFsbCB0aGUgaGVs cCBzdHVmZiBvdXQgb2YgdGhpcyBmaWxlLgoJCWVtZXJnZWhlbHAuaGVscChzZWxmLm15YWN0 aW9uLHNlbGYubXlvcHRzLGhhdmVjb2xvcikKCQoJZGVmIHBhcnNlX2FyZ3Moc2VsZixhcmdz KToKCQkKCQlhY3Rpb25zPVsKCQkiY2xlYW4iLCAiY29uZmlnIiwgImRlcGNsZWFuIiwKCQki aW5mbyIsICAgImluamVjdCIsICAgIm1ldGFkYXRhIiwKCQkicHJ1bmUiLCAicmVnZW4iLCAg InJzeW5jIiwgInNlYXJjaCIsCgkJInN5bmMiLCAgInN5c3RlbSIsICJ1bm1lcmdlIiwgICJ3 b3JsZCIsCgkJXQoJCW9wdGlvbnM9WwoJCSItLWFzayIsCgkJIi0tYnVpbGRwa2ciLCAgICAg Ii0tYnVpbGRwa2dvbmx5IiwKCQkiLS1jaGFuZ2Vsb2ciLCAgICAiLS1jb2x1bW5zIiwKCQki LS1kZWJ1ZyIsICAgICAgICAiLS1kZWVwIiwKCQkiLS1kaWdlc3QiLAoJCSItLWVtcHR5dHJl ZSIsCgkJIi0tZmV0Y2hvbmx5IiwgICAgIi0tZmV0Y2gtYWxsLXVyaSIsCgkJIi0tZ2V0Ymlu cGtnIiwgICAgIi0tZ2V0YmlucGtnb25seSIsCgkJIi0taGVscCIsICAgICAgICAgIi0tbm9j b25mbWVtIiwKCQkiLS1uZXd1c2UiLAoJCSItLW5vZGVwcyIsICAgICAgICItLW5vcmVwbGFj ZSIsCgkJIi0tbm9zcGlubmVyIiwgICAgIi0tb25lc2hvdCIsCgkJIi0tb25seWRlcHMiLCAg ICAgIi0tcHJldGVuZCIsCgkJIi0tcXVpZXQiLCAgICAgICAgIi0tcmVzdW1lIiwKCQkiLS1z ZWFyY2hkZXNjIiwgICAiLS1zZWxlY3RpdmUiLAoJCSItLXNraXBmaXJzdCIsCgkJIi0tdHJl ZSIsCgkJIi0tdXBkYXRlIiwKCQkiLS11c2Vwa2ciLCAgICAgICAiLS11c2Vwa2dvbmx5IiwK CQkiLS12ZXJib3NlIiwgICAgICAiLS12ZXJzaW9uIgoJCV0KCQkKCQlzaG9ydG1hcHBpbmc9 ewoJCSIxIjoiLS1vbmVzaG90IiwKCQkiYSI6Ii0tYXNrIiwKCQkiYiI6Ii0tYnVpbGRwa2ci LCAgIkIiOiItLWJ1aWxkcGtnb25seSIsCgkJImMiOiItLWNsZWFuIiwgICAgICJDIjoiLS11 bm1lcmdlIiwKCQkiZCI6Ii0tZGVidWciLCAgICAgIkQiOiItLWRlZXAiLAoJCSJlIjoiLS1l bXB0eXRyZWUiLAoJCSJmIjoiLS1mZXRjaG9ubHkiLCAiRiI6Ii0tZmV0Y2gtYWxsLXVyaSIs CgkJImciOiItLWdldGJpbnBrZyIsICJHIjoiLS1nZXRiaW5wa2dvbmx5IiwKCQkiaCI6Ii0t aGVscCIsCgkJImsiOiItLXVzZXBrZyIsICAgICJLIjoiLS11c2Vwa2dvbmx5IiwKCQkibCI6 Ii0tY2hhbmdlbG9nIiwKCQkibiI6Ii0tbm9yZXBsYWNlIiwgIk4iOiItLW5ld3VzZSIsCgkJ Im8iOiItLW9ubHlkZXBzIiwgICJPIjoiLS1ub2RlcHMiLAoJCSJwIjoiLS1wcmV0ZW5kIiwg ICAiUCI6Ii0tcHJ1bmUiLAoJCSJxIjoiLS1xdWlldCIsCgkJInMiOiItLXNlYXJjaCIsICAg ICJTIjoiLS1zZWFyY2hkZXNjIiwKCQkJCSd0JzoiLS10cmVlIiwKCQkidSI6Ii0tdXBkYXRl IiwKCQkidiI6Ii0tdmVyYm9zZSIsICAgIlYiOiItLXZlcnNpb24iCgkJfQoJCQoJCSMgcHJv Y2VzcyBzaG9ydCBhY3Rpb25zCgkJdG1wY21kbGluZT1hcmdzWzE6XQoJCSN0bXBjbWRsaW5l LmV4dGVuZChwb3J0YWdlLnNldHRpbmdzWyJFTUVSR0VfT1BUUyJdLnNwbGl0KCkpCgkJY21k bGluZT1bXQoJCWZvciB4IGluIHRtcGNtZGxpbmU6CgkJCWlmIHhbMDoxXT09Ii0iIGFuZCB4 WzE6Ml0hPSItIjoKCQkJCWZvciB5IGluIHhbMTpdOgoJCQkJCWlmIHNob3J0bWFwcGluZy5o YXNfa2V5KHkpOgoJCQkJCQlpZiBzaG9ydG1hcHBpbmdbeV09PSItLXZlcmJvc2UiOgoJCQkJ CQkJc2VsZi52ZXJib3NpdHkgKz0gMQoJCQkJCQllbGlmIHNob3J0bWFwcGluZ1t5XSBpbiBj bWRsaW5lOgoJCQkJCQkJcHJpbnQKCQkJCQkJCXByaW50ICIqKiogV2FybmluZzogUmVkdW5k YW50IHVzZSBvZiIsc2hvcnRtYXBwaW5nW3ldCgkJCQkJCWVsc2U6CgkJCQkJCQljbWRsaW5l LmFwcGVuZChzaG9ydG1hcHBpbmdbeV0pCgkJCQkJZWxzZToKCQkJCQkJcHJpbnQgIiEhISBF cnJvcjogLSIreSsiIGlzIGFuIGludmFsaWQgc2hvcnQgYWN0aW9uIG9yIG9wdGlvbi4iCgkJ CQkJCXN5cy5leGl0KDEpCgkJCWVsc2U6CgkJCQljbWRsaW5lLmFwcGVuZCh4KQoJCQoJCSMg cHJvY2VzcyB0aGUgb3B0aW9ucyBhbmQgY29tbWFuZCBhcmd1bWVudHMKCQlmb3IgeCBpbiBj bWRsaW5lOgoJCQlpZiBub3QgeDoKCQkJCWNvbnRpbnVlCgkJCWlmIGxlbih4KT49MiBhbmQg eFswOjJdPT0iLS0iOgoJCQkJaWYgeCBpbiBvcHRpb25zOgoJCQkJCXNlbGYubXlvcHRzLmFw cGVuZCh4KQoJCQkJZWxpZiB4WzI6XSBpbiBhY3Rpb25zOgoJCQkJCWlmIHhbMjpdPT0icnN5 bmMiIG9yIHg9PSJyc3luYyI6CgkJCQkJCSMgImVtZXJnZSAtLXJzeW5jIgoJCQkJCQlwcmlu dAoJCQkJCQlwcmludCByZWQoIioqKiAnLS1yc3luYycgaGFzIGJlZW4gZGVwcmVjYXRlZC4i KQoJCQkJCQlwcmludCByZWQoIioqKiBQbGVhc2UgdXNlICctLXN5bmMnIGluc3RlYWQuIikK CQkJCQkJcHJpbnQKCQkJCQkJeD0iLS1zeW5jIgoJCQkJCWlmIHNlbGYubXlhY3Rpb246CgkJ CQkJCWlmIHNlbGYubXlhY3Rpb24gbm90IGluIFsic3lzdGVtIiwgIndvcmxkIl06CgkJCQkJ CQlzZWxmLm15YWN0aW9uPSItLSIrc2VsZi5teWFjdGlvbgoJCQkJCQlwcmludAoJCQkJCQlw cmludCByZWQoIiEhISIpK2dyZWVuKCIgTXVsdGlwbGUgYWN0aW9ucyByZXF1ZXN0ZWQuLi4g UGxlYXNlIGNob29zZSBvbmUgb25seS4iKQoJCQkJCQlwcmludCByZWQoIiEhISIpKyIgJyIr ZGFya2dyZWVuKHNlbGYubXlhY3Rpb24pKyInICIrcmVkKCJvciIpKyIgJyIrZGFya2dyZWVu KHgpKyInIgoJCQkJCQlwcmludAoJCQkJCQlzeXMuZXhpdCgxKQoJCQkJCXNlbGYubXlhY3Rp b249eFsyOl0KCQkJCWVsc2U6CgkJCQkJcHJpbnQgIiEhISBFcnJvcjoiLHgsImlzIGFuIGlu dmFsaWQgb3B0aW9uLiIKCQkJCQlzeXMuZXhpdCgxKQoJCQllbGlmIChub3Qgc2VsZi5teWFj dGlvbikgYW5kICh4IGluIGFjdGlvbnMpOgoJCQkJaWYgeCBub3QgaW4gWyJzeXN0ZW0iLCAi d29ybGQiXToKCQkJCQkjcHJpbnQgcmVkKCIqKiogRGVwcmVjYXRlZCB1c2Ugb2YgYWN0aW9u ICciK3grIiciKQoJCQkJCWlmIHg9PSJyc3luYyI6CgkJCQkJCSMgImVtZXJnZSByc3luYyIK CQkJCQkJcHJpbnQKCQkJCQkJcHJpbnQgcmVkKCIqKiogJ3JzeW5jJyB3aWxsIG5vdyBpbnN0 YWxsIHRoZSBwYWNrYWdlIHJzeW5jLiIpCgkJCQkJCXByaW50IHJlZCgiKioqIFRvIHN5bmMg dGhlIHRyZWUsIHBsZWFzZSB1c2UgJy0tc3luYycgaW5zdGVhZC4iKQoJCQkJCQlwcmludAoJ CQkJCQlzZWxmLm15ZmlsZXMuYXBwZW5kKHgpCgkJCQkJCWNvbnRpbnVlCgkJCQlpZiBzZWxm Lm15YWN0aW9uOgoJCQkJCXByaW50CgkJCQkJcHJpbnQgcmVkKCIhISEiKStncmVlbigiIE11 bHRpcGxlIGFjdGlvbnMgcmVxdWVzdGVkLi4uIFBsZWFzZSBjaG9vc2Ugb25lIG9ubHkuIikK CQkJCQlwcmludCByZWQoIiEhISAnIikrZGFya2dyZWVuKHNlbGYubXlhY3Rpb24pKyInICIr cmVkKCJvciIpKyIgJyIrZGFya2dyZWVuKHgpKyInIgoJCQkJCXByaW50CgkJCQkJc3lzLmV4 aXQoMSkKCQkJCXNlbGYubXlhY3Rpb249eAoJCQllbGlmIHhbLTFdPT0iLyI6CgkJCQkjIHRo aXMgbGl0dGxlIGNvbmRpdGlvbmFsIGhlbHBzIHRhYiBjb21wbGV0aW9uCgkJCQlzZWxmLm15 ZmlsZXMuYXBwZW5kKHhbOi0xXSkKCQkJZWxzZToKCQkJCXNlbGYubXlmaWxlcy5hcHBlbmQo eCkKCQkKCQlpZiBzZWxmLnZlcmJvc2l0eToKCQkJaW1wb3J0IHBvcnRhZ2VfbWV0YWRhdGEK CQkKCQlpZiAibW9vIiBpbiBzZWxmLm15ZmlsZXM6CgkJCXByaW50ICIiIgoJCQoJCSAgR2Vu dG9vICgiIiIgKyBvcy51bmFtZSgpWzBdICsgIiIiKQoJCQoJCSBfX19fX19fX19fX19fX19f X19fX19fXwoJCTwgSGF2ZSB5b3UgbW9vZWQgdG9kYXk/ID4KCQkgLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KCQkgICAgICAgIFwgICBeX19eCgkJICAgICAgICAgXCAgKG9vKVxfX19fX19f CgkJICAgICAgICAgICAgKF9fKVwgICAgICAgKVwvXCAgCgkJICAgICAgICAgICAgICAgIHx8 LS0tLXcgfAoJCSAgICAgICAgICAgICAgICB8fCAgICAgfHwKCQkKIiIiCgkJCgkJaWYgKHNl bGYubXlhY3Rpb24gaW4gWyJ3b3JsZCIsICJzeXN0ZW0iXSkgYW5kIHNlbGYubXlmaWxlczoK CQkJcHJpbnQgImVtZXJnZTogcGxlYXNlIHNwZWNpZnkgYSBwYWNrYWdlIGNsYXNzIChcIndv cmxkXCIgb3IgXCJzeXN0ZW1cIikgb3IgaW5kaXZpZHVhbCBwYWNrYWdlcywgYnV0IG5vdCBi b3RoLiIKCQkJc3lzLmV4aXQoMSkKCQkKCQlmb3IgeCBpbiBzZWxmLm15ZmlsZXM6CgkJCWlm ICh4LmVuZHN3aXRoKCIuZWJ1aWxkIikgb3IgeC5lbmRzd2l0aCgiLnRiejIiKSkgYW5kIG9z LnBhdGguZXhpc3RzKG9zLnBhdGguYWJzcGF0aCh4KSk6CgkJCQlwcmludCAiZW1lcmdpbmcg YnkgcGF0aCBpbXBsaWVzIC0tb25lc2hvdC4uLiBhZGRpbmcgLS1vbmVzaG90IHRvIG9wdGlv bnMuIgoJCQkJcHJpbnQgcmVkKCJcbioqKiBlbWVyZ2luZyBieSBwYXRoIGlzIGJyb2tlbiBh bmQgbWF5IG5vdCBhbHdheXMgd29yayEhIVxuIikKCQkJCWJyZWFrCgkJCgkJaWYgKCItLXRy ZWUiIGluIHNlbGYubXlvcHRzKSBhbmQgKCItLWNvbHVtbnMiIGluIHNlbGYubXlvcHRzKToK CQkJcHJpbnQgImVtZXJnZTogY2FuJ3Qgc3BlY2lmeSBib3RoIG9mIFwiLS10cmVlXCIgYW5k IFwiLS1jb2x1bW5zXCIuIgoJCQlzeXMuZXhpdCgxKQoJCQoJCSMgQWx3YXlzIGNyZWF0ZSBw YWNrYWdlcyBpZiBGRUFUVVJFUz1idWlsZHBrZwoJCSMgSW1wbHkgLS1idWlsZHBrZyBpZiAt LWJ1aWxkcGtnb25seQoJCWlmICgiYnVpbGRwa2ciIGluIHBvcnRhZ2UuZmVhdHVyZXMpIG9y ICgiLS1idWlsZHBrZ29ubHkiIGluIHNlbGYubXlvcHRzKToKCQkJaWYgIi0tYnVpbGRwa2ci IG5vdCBpbiBzZWxmLm15b3B0czoKCQkJCXNlbGYubXlvcHRzLmFwcGVuZCgiLS1idWlsZHBr ZyIpCgkJCgkJIyAtLXRyZWUgb25seSBtYWtlcyBzZW5zZSB3aXRoIC0tcHJldGVuZAoJCWlm ICItLXRyZWUiIGluIHNlbGYubXlvcHRzIGFuZCBub3QgKCgiLS1wcmV0ZW5kIiBpbiBzZWxm Lm15b3B0cykgb3IgKCItLWFzayIgaW4gc2VsZi5teW9wdHMpKToKCQkJcHJpbnQgIj4+PiAt LXRyZWUgaW1wbGllcyAtLXByZXRlbmQuLi4gYWRkaW5nIC0tcHJldGVuZCB0byBvcHRpb25z LiIKCQkJc2VsZi5teW9wdHMuYXBwZW5kKCItLXByZXRlbmQiKQoJCQoJCSMgQWxzbyBhbGxv dyAtUyB0byBpbnZva2Ugc2VhcmNoIGFjdGlvbiAoLXNTKQoJCWlmICgiLS1zZWFyY2hkZXNj IiBpbiBzZWxmLm15b3B0cyk6CgkJCWlmIHNlbGYubXlhY3Rpb24gYW5kIHNlbGYubXlhY3Rp b24gIT0gInNlYXJjaCI6CgkJCQlzZWxmLm15ZmlsZXMuYXBwZW5kKHNlbGYubXlhY3Rpb24p CgkJCWlmICItLXNlYXJjaCIgbm90IGluIHNlbGYubXlvcHRzOgoJCQkJc2VsZi5teW9wdHMu YXBwZW5kKCItLXNlYXJjaCIpCgkJCXNlbGYubXlhY3Rpb24gPSAic2VhcmNoIgoJCQoJCSMg QWx3YXlzIHRyeSBhbmQgZmV0Y2ggYmluYXJ5IHBhY2thZ2VzIGlmIEZFQVRVUkVTPWdldGJp bnBrZwoJCWlmICgiZ2V0YmlucGtnIiBpbiBwb3J0YWdlLmZlYXR1cmVzKToKCQkJc2VsZi5t eW9wdHMuYXBwZW5kKCItLWdldGJpbnBrZyIpCgkJCgkJaWYgKCItLWdldGJpbnBrZ29ubHki IGluIHNlbGYubXlvcHRzKSBhbmQgbm90ICgiLS11c2Vwa2dvbmx5IiBpbiBzZWxmLm15b3B0 cyk6CgkJCXNlbGYubXlvcHRzLmFwcGVuZCgiLS11c2Vwa2dvbmx5IikKCQkKCQlpZiAoIi0t Z2V0YmlucGtnb25seSIgaW4gc2VsZi5teW9wdHMpIGFuZCBub3QgKCItLWdldGJpbnBrZyIg aW4gc2VsZi5teW9wdHMpOgoJCQlzZWxmLm15b3B0cy5hcHBlbmQoIi0tZ2V0YmlucGtnIikK CQkKCQlpZiAoIi0tZ2V0YmlucGtnIiBpbiBzZWxmLm15b3B0cykgYW5kIG5vdCAoIi0tdXNl cGtnIiBpbiBzZWxmLm15b3B0cyk6CgkJCXNlbGYubXlvcHRzLmFwcGVuZCgiLS11c2Vwa2ci KQoJCQoJCSMgQWxzbyBhbGxvdyAtSyB0byBhcHBseSAtLXVzZXBrZy8tawoJCWlmICgiLS11 c2Vwa2dvbmx5IiBpbiBzZWxmLm15b3B0cykgYW5kIG5vdCAoIi0tdXNlcGtnIiBpbiBzZWxm Lm15b3B0cyk6CgkJCXNlbGYubXlvcHRzLmFwcGVuZCgiLS11c2Vwa2ciKQoJCQoJCSMgQWxz byBhbGxvdyAtbCB0byBhcHBseSAtLXByZXRlbmQvLXAsIGJ1dCBpZiBhbHJlYWR5IGluIC0t YXNrIG1vZGUKCQlpZiAoIi0tY2hhbmdlbG9nIiBpbiBzZWxmLm15b3B0cykgYW5kIG5vdCAo KCItLXByZXRlbmQiIGluIHNlbGYubXlvcHRzKSBvciAoIi0tYXNrIiBpbiBzZWxmLm15b3B0 cykpOgoJCQlwcmludCAiPj4+IC0tY2hhbmdlbG9nIGltcGxpZXMgLS1wcmV0ZW5kLi4uIGFk ZGluZyAtLXByZXRlbmQgdG8gb3B0aW9ucy4iCgkJCXNlbGYubXlvcHRzLmFwcGVuZCgiLS1w cmV0ZW5kIikKCQkKCQkjIEFsbG93IC1wIHRvIHJlbW92ZSAtLWFzawoJCWlmICgiLS1wcmV0 ZW5kIiBpbiBzZWxmLm15b3B0cykgYW5kICgiLS1hc2siIGluIHNlbGYubXlvcHRzKToKCQkJ cHJpbnQgIj4+PiAtLXByZXRlbmQgZGlzYWJsZXMgLS1hc2suLi4gcmVtb3ZpbmcgLS1hc2sg ZnJvbSBvcHRpb25zLiIKCQkJc2VsZi5teW9wdHMucmVtb3ZlKCItLWFzayIpCgkJCgkJIyBm b3JiaWQgLS1hc2sgd2hlbiBub3QgaW4gYSB0ZXJtaW5hbAoJCSMgbm90ZTogdGhpcyBicmVh a3MgYGVtZXJnZSAtLWFzayB8IHRlZSBsb2dmaWxlYCwgYnV0IHRoYXQgZG9lc24ndCB3b3Jr IGFueXdheS4KCQlpZiAoIi0tYXNrIiBpbiBzZWxmLm15b3B0cykgYW5kIChub3Qgc3lzLnN0 ZG91dC5pc2F0dHkoKSk6CgkJCXBvcnRhZ2Uud3JpdGVtc2coIiEhISBcIi0tYXNrXCIgc2hv dWxkIG9ubHkgYmUgdXNlZCBpbiBhIHRlcm1pbmFsLiBFeGl0aW5nLlxuIikKCQkJc3lzLmV4 aXQoMSkKCQkKCQkjIFNldCBzbyB0aGF0IGNvbmZpZ3Mgd2lsbCBiZSBtZXJnZWQgcmVnYXJk bGVzcyBvZiByZW1lbWJlcmVkIHN0YXR1cwoJCWlmICgiLS1ub2NvbmZtZW0iIGluIHNlbGYu bXlvcHRzKToKCQkJcG9ydGFnZS5zZXR0aW5ncy51bmxvY2soKQoJCQlwb3J0YWdlLnNldHRp bmdzWyJOT0NPTkZNRU0iXT0iMSIKCQkJcG9ydGFnZS5zZXR0aW5ncy5iYWNrdXBfY2hhbmdl cygiTk9DT05GTUVNIikKCQkJcG9ydGFnZS5zZXR0aW5ncy5sb2NrKCkKCQkKCQkjIFNldCB2 YXJpb3VzIGRlYnVnIG1hcmtlcnMuLi4gVGhleSBzaG91bGQgYmUgbWVyZ2VkIHNvbWVob3cu CgkJaWYgKCItLWRlYnVnIiBpbiBzZWxmLm15b3B0cyk6CgkJCXBvcnRhZ2Uuc2V0dGluZ3Mu dW5sb2NrKCkKCQkJcG9ydGFnZS5zZXR0aW5nc1siUE9SVEFHRV9ERUJVRyJdPSIxIgoJCQlw b3J0YWdlLnNldHRpbmdzLmJhY2t1cF9jaGFuZ2VzKCJQT1JUQUdFX0RFQlVHIikKCQkJcG9y dGFnZS5kZWJ1Zz0xCgkJCXBvcnRhZ2Uuc2V0dGluZ3MubG9jaygpCgkJCgkJIyBjaGVjayBp ZiByb290IHVzZXIgaXMgdGhlIGN1cnJlbnQgdXNlciBmb3IgdGhlIGFjdGlvbnMgd2hlcmUg ZW1lcmdlIG5lZWRzIHRoaXMKCQlpZiAoIi0tcHJldGVuZCIgaW4gc2VsZi5teW9wdHMpIG9y ICgiLS1mZXRjaG9ubHkiIGluIHNlbGYubXlvcHRzIG9yICItLWZldGNoLWFsbC11cmkiIGlu IHNlbGYubXlvcHRzKSBvciAoc2VsZi5teWFjdGlvbj09InNlYXJjaCIpOgoJCQlpZiBub3Qg cG9ydGFnZS5zZWNwYXNzOgoJCQkJaWYgcG9ydGFnZS53aGVlbGdpZD09cG9ydGFnZS5wb3J0 YWdlX2dpZDoKCQkJCQlwcmludCAiZW1lcmdlOiB3aGVlbCBncm91cCBtZW1iZXJzaGlwIHJl cXVpcmVkIGZvciBcIi0tcHJldGVuZFwiIGFuZCBzZWFyY2guIgoJCQkJCXByaW50ICJlbWVy Z2U6IHdoZWVsIGdyb3VwIHVzZSBpcyBiZWluZyBkZXByZWNhdGVkLiBQbGVhc2UgdXBkYXRl IGdyb3VwIGFuZCBwYXNzd2QgdG8iCgkJCQkJcHJpbnQgIiAgICAgICAgaW5jbHVkZSB0aGUg cG9ydGFnZSB1c2VyIGFzIG5vdGVkIGFib3ZlLCBhbmQgdGhlbiB1c2UgZ3JvdXAgcG9ydGFn ZS4iCgkJCQllbHNlOgoJCQkJCXByaW50ICJlbWVyZ2U6IHBvcnRhZ2UgZ3JvdXAgbWVtYmVy c2hpcCByZXF1aXJlZCBmb3IgXCItLXByZXRlbmRcIiBhbmQgc2VhcmNoLiIKCQkJCXN5cy5l eGl0KDEpCgkJZWxpZiAiLS12ZXJzaW9uIiBpbiBzZWxmLm15b3B0czoKCQkJcHJpbnQgZ2V0 cG9ydGFnZXZlcnNpb24oKQoJCQlzeXMuZXhpdCgwKQoJCWVsaWYgIi0taGVscCIgaW4gc2Vs Zi5teW9wdHM6CgkJCXNlbGYuaGVscCgpCgkJCXN5cy5leGl0KDApCgkJZWxpZiBwb3J0YWdl LnNlY3Bhc3MhPTI6CgkJCWlmIHNlbGYubXlhY3Rpb24gaW4gWyJzZWFyY2giLCAiaW5mbyIs ICJyZWdlbiIsICJtZXRhZGF0YSJdOgoJCQkJcGFzcwoJCQllbGlmIChub3Qgc2VsZi5teWFj dGlvbikgYW5kIChub3Qgc2VsZi5teWZpbGVzKToKCQkJCXBhc3MKCQkJZWxpZiAoIi0tcHJl dGVuZCIgaW4gc2VsZi5teW9wdHMpIGFuZCAoc2VsZi5teWFjdGlvbiBpbiBbIndvcmxkIiwi c3lzdGVtIiwiY2xlYW4iLCJwcnVuZSIsInVubWVyZ2UiXSk6CgkJCQlwYXNzCgkJCWVsc2U6 CgkJCQlpZiAiLS1kZWJ1ZyIgaW4gc2VsZi5teW9wdHM6CgkJCQkJcHJpbnQgIm15YWN0aW9u IixzZWxmLm15YWN0aW9uCgkJCQkJcHJpbnQgIm15b3B0cyIsc2VsZi5teW9wdHMKCQkJCXBy aW50ICJlbWVyZ2U6IHJvb3QgYWNjZXNzIHJlcXVpcmVkLiIKCQkJCXN5cy5leGl0KDEpCgkJ CgkJaWYgbm90ICItLXByZXRlbmQiIGluIHNlbGYubXlvcHRzOgoJCQlzZWxmLmVtZXJnZWxv ZygiU3RhcnRlZCBlbWVyZ2Ugb246ICIrdGltZS5zdHJmdGltZSgiJWIgJWQsICVZICVIOiVN OiVTIiwgdGltZS5sb2NhbHRpbWUoKSkpCgkJCW15ZWxvZ3N0cj0iIgoJCQlpZiBzZWxmLm15 b3B0czoKCQkJCW15ZWxvZ3N0cj0iICIuam9pbihzZWxmLm15b3B0cykKCQkJaWYgc2VsZi5t eWFjdGlvbjoKCQkJCW15ZWxvZ3N0cis9IiAiK3NlbGYubXlhY3Rpb24KCQkJaWYgc2VsZi5t eWZpbGVzOgoJCQkJbXllbG9nc3RyKz0iICIrIiAiLmpvaW4oc2VsZi5teWZpbGVzKQoJCQlz ZWxmLmVtZXJnZWxvZygiICoqKiBlbWVyZ2UgIitteWVsb2dzdHIpCgkJCgkJI2NvbmZpZ3Vy ZSBlbWVyZ2UgZW5naW5lIHBhcmFtZXRlcnMKCQkjCgkJIyBzZWxmOiAgICAgIGluY2x1ZGUg X3RoaXNfIHBhY2thZ2UgcmVnYXJkbGVzcyBvZiBpZiBpdCBpcyBtZXJnZWQuCgkJIyBzZWxl Y3RpdmU6IGV4Y2x1ZGUgdGhlIHBhY2thZ2UgaWYgaXQgaXMgbWVyZ2VkCgkJIyByZWN1cnNl OiAgIGdvIGludG8gdGhlIGRlcGVuZGVuY2llcwoJCSMgZW1wdHk6ICAgICBwcmV0ZW5kIG5v dGhpbmcgaXMgbWVyZ2VkCgkJc2VsZi5teXBhcmFtcz1bInNlbGYiLCJyZWN1cnNlIl0KCQlh ZGQ9W10KCQlzdWI9W10KCQlpZiAiLS11cGRhdGUiIGluIHNlbGYubXlvcHRzOgoJCQlhZGQu ZXh0ZW5kKFsic2VsZWN0aXZlIiwiZW1wdHkiXSkKCQlpZiAiLS1lbXB0eXRyZWUiIGluIHNl bGYubXlvcHRzOgoJCQlhZGQuZXh0ZW5kKFsiZW1wdHkiXSkKCQkJc3ViLmV4dGVuZChbInNl bGVjdGl2ZSJdKQoJCWlmICItLW5vZGVwcyIgaW4gc2VsZi5teW9wdHM6CgkJCXN1Yi5leHRl bmQoWyJyZWN1cnNlIl0pCgkJaWYgIi0tbm9yZXBsYWNlIiBpbiBzZWxmLm15b3B0czoKCQkJ YWRkLmV4dGVuZChbInNlbGVjdGl2ZSJdKQoJCWlmICItLWRlZXAiIGluIHNlbGYubXlvcHRz OgoJCQlhZGQuZXh0ZW5kKFsiZGVlcCJdKQoJCWlmICItLXNlbGVjdGl2ZSIgaW4gc2VsZi5t eW9wdHM6CgkJCWFkZC5leHRlbmQoWyJzZWxlY3RpdmUiXSkKCQlpZiBzZWxmLm15YWN0aW9u IGluIFsid29ybGQiLCJzeXN0ZW0iXToKCQkJYWRkLmV4dGVuZChbInNlbGVjdGl2ZSJdKQoJ CWVsaWYgc2VsZi5teWFjdGlvbiBpbiBbImRlcGNsZWFuIl06CgkJCWFkZC5leHRlbmQoWyJl bXB0eSJdKQoJCQlzdWIuZXh0ZW5kKFsic2VsZWN0aXZlIl0pCgkJZm9yIHggaW4gYWRkOgoJ CQlpZiAoeCBub3QgaW4gc2VsZi5teXBhcmFtcykgYW5kICh4IG5vdCBpbiBzdWIpOgoJCQkJ c2VsZi5teXBhcmFtcy5hcHBlbmQoeCkKCQlmb3IgeCBpbiBzdWI6CgkJCWlmIHggaW4gc2Vs Zi5teXBhcmFtczoKCQkJCXNlbGYubXlwYXJhbXMucmVtb3ZlKHgpCgoJCSMgZ2VuZXJhbCBv cHRpb25zIHRoYXQgc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudCBiZWZvcmUgYW55IGFj dGlvbgoJCWlmICItLWRlYnVnIiBpbiBzZWxmLm15b3B0czoKCQkJc2VsZi5lZGVidWc9MQoJ CQoJCXNlbGYuc3Bpbm5lcj1zdGRvdXRfc3Bpbm5lcigpCgkJaWYgbm90IHN5cy5zdGRvdXQu aXNhdHR5KCkgb3IgKCItLW5vc3Bpbm5lciIgaW4gYXJncyk6CgkJCXNlbGYuc3Bpbm5lci51 cGRhdGVfc3Bpbm5lciA9IHNlbGYuc3Bpbm5lci51cGRhdGVfYmFzaWNfc3Bpbm5lcgoKCWRl ZiBwZXJmb3JtKHNlbGYpOgoJCWlmIHNlbGYubXlhY3Rpb24gaW4gWyJzeW5jIiwicnN5bmMi LCJtZXRhZGF0YSJdIGFuZCAobm90ICItLWhlbHAiIGluIHNlbGYubXlvcHRzKToKCQkJaWYg Ii0tcHJldGVuZCIgaW4gc2VsZi5teW9wdHM6CgkJCQlwcmludCAiZW1lcmdlOiBcInN5bmNc IiBhY3Rpb25zIGRvIG5vdCBzdXBwb3J0IFwiLS1wcmV0ZW5kLlwiIgoJCQkJc3lzLmV4aXQo MSkKCQkKCQkJc2VsZi5lbWVyZ2Vsb2coIiA9PT0gIitzdHIoc2VsZi5teWFjdGlvbikpCgkJ CW15cG9ydGRpcj1wb3J0YWdlLnNldHRpbmdzWyJQT1JURElSIl0KCQkJaWYgbXlwb3J0ZGly Wy0xXT09Ii8iOgoJCQkJbXlwb3J0ZGlyPW15cG9ydGRpcls6LTFdCgkJCWlmIG5vdCBvcy5w YXRoLmV4aXN0cyhteXBvcnRkaXIpOgoJCQkJcHJpbnQgIj4+PiIsbXlwb3J0ZGlyLCJub3Qg Zm91bmQsIGNyZWF0aW5nIGl0LiIKCQkJCW9zLm1ha2VkaXJzKG15cG9ydGRpciwwNzU1KQkK CQkJc3luY3VyaT1wb3J0YWdlLnNldHRpbmdzWyJTWU5DIl0ucnN0cmlwKCkKCQkJb3MudW1h c2soMDAyMikKCQkKCQkJc3luY192ZXJib3NpdHk9MAoJCQlpZiAiLS1xdWlldCIgaW4gc2Vs Zi5teW9wdHM6CgkJCQlzeW5jX3ZlcmJvc2l0eSA9IDEKCQkJZWxpZiAiLS12ZXJib3NlIiBp biBzZWxmLm15b3B0czoKCQkJCXN5bmNfdmVyYm9zaXR5ID0gMwoJCQllbHNlOgoJCQkJc3lu Y192ZXJib3NpdHkgPSAyCgkJCgkJCXByaW50ICJzeW5jX3ZlcmJvc2l0eT0iLHN5bmNfdmVy Ym9zaXR5CgkJCXRtcHNlcnZlcnRpbWVzdGFtcGZpbGUgPSBOb25lCgkJCgkJCXByb3RvY29s LGhvc3RfdXJpID0gc3luYy5wYXJzZVN5bmNVcmkoc3luY3VyaSkKCQkJcHJpbnQgImhvc3Rf dXJpPSIsaG9zdF91cmkKCQkKCQkJaWYgc2VsZi5teWFjdGlvbiA9PSAibWV0YWRhdGEiOgoJ CQkJaWYgIi0tYXNrIiBpbiBzZWxmLm15b3B0czoKCQkJCQlpZiB1c2VycXVlcnkoIkFyZSB5 b3Ugc3VyZT8iKSA9PSAiTm8iOgoJCQkJCQkjdXNlcnF1ZXJ5KCJBcmUgeW91IHN1cmUgeW91 IHNob3VsZCBiZSB1c2luZyAqTklYPyIsWyJEZWZpbmF0ZWx5IE5vdCJdKQoJCQkJCQlzeXMu ZXhpdCgxKQoJCQkJcHJpbnQgInNraXBwaW5nIHN5bmMiCgkJCQl1cGRhdGVjYWNoZV9mbGcg PSBUcnVlCgkJCQl0bXBzZXJ2ZXJ0aW1lc3RhbXBmaWxlID0gTm9uZQoJCQllbGlmIHByb3Rv Y29sID09ICJyc3luYyI6CgkJCQlteXRpbWVvdXQ9MTgwCgkJCQlpZiBwb3J0YWdlLnNldHRp bmdzLmhhc19rZXkoIlJTWU5DX1RJTUVPVVQiKToKCQkJCQl0cnk6CgkJCQkJCW15dGltZW91 dD1pbnQocG9ydGFnZS5zZXR0aW5nc1siUlNZTkNfVElNRU9VVCJdKQoJCQkJCWV4Y2VwdCBT eXN0ZW1FeGl0LCBlOgoJCQkJCQlyYWlzZSAjIE5lZWRlZCBlbHNlIGNhbid0IGV4aXQKCQkJ CQlleGNlcHQ6CgkJCQkJCXBhc3MKCQkKCQkJCXN5bmNlcj1zeW5jLnJzeW5jLlJzeW5jSG9z dChob3N0X3VyaSkKCQkKCQkJCXNlcnZlcnRpbWVzdGFtcGRpciAgPSBwb3J0YWdlLnNldHRp bmdzLmRlcGNhY2hlZGlyKyIvIgoJCQkJc2VydmVydGltZXN0YW1wZmlsZSA9IHBvcnRhZ2Uu c2V0dGluZ3MuZGVwY2FjaGVkaXIrIi90aW1lc3RhbXAuY2hrIgoJCQkJdG1wc2VydmVydGlt ZXN0YW1wZGlyICA9IHBvcnRhZ2Uuc2V0dGluZ3NbIlBPUlRBR0VfVE1QRElSIl0rIi8iCgkJ CQl0bXBzZXJ2ZXJ0aW1lc3RhbXBmaWxlID0gcG9ydGFnZS5zZXR0aW5nc1siUE9SVEFHRV9U TVBESVIiXSsiL3RpbWVzdGFtcC5jaGsiCgkJCgkJCQkjIFdlIG9ubHkgdXNlIHRoZSBiYWNr dXAgaWYgYSB0aW1lc3RhbXAgZXhpc3RzIGluIHRoZSBwb3J0ZGlyLgoJCQoJCQkJY29udGVu dD1Ob25lCgkJCQlpZiBvcy5wYXRoLmV4aXN0cyhteXBvcnRkaXIrIi9tZXRhZGF0YS90aW1l c3RhbXAuY2hrIik6CgkJCQkJY29udGVudD1wb3J0YWdlLmdyYWJmaWxlKHNlcnZlcnRpbWVz dGFtcGZpbGUpCgkJCQlpZiAobm90IGNvbnRlbnQpOgoJCQkJCWNvbnRlbnQ9cG9ydGFnZS5n cmFiZmlsZShteXBvcnRkaXIrIi9tZXRhZGF0YS90aW1lc3RhbXAuY2hrIikKCQkKCQkJCWlm IChjb250ZW50KToKCQkJCQl0cnk6CgkJCQkJCW15dGltZXN0YW1wPXRpbWUubWt0aW1lKHRp bWUuc3RycHRpbWUoY29udGVudFswXSwgIiVhLCAlZCAlYiAlWSAlSDolTTolUyArMDAwMCIp KQoJCQkJCWV4Y2VwdCBWYWx1ZUVycm9yOgoJCQkJCQlteXRpbWVzdGFtcD0wCgkJCQllbHNl OgoJCQkJCW15dGltZXN0YW1wPTAKCQkKCQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZXJ2 ZXJ0aW1lc3RhbXBkaXIpOgoJCQkJCW9zLm1rZGlyKHNlcnZlcnRpbWVzdGFtcGRpcikKCQkJ CQlvcy5jaG93bihzZXJ2ZXJ0aW1lc3RhbXBkaXIsIG9zLmdldHVpZCgpLCBwb3J0YWdlLnBv cnRhZ2VfZ2lkKQoJCQkJCW9zLmNobW9kKHNlcnZlcnRpbWVzdGFtcGRpciwgMDc3NSkKCQkK CQkJCSNleGl0Y29kZT0wCgkJCQl0cnk6CgkJCQkJbWF4cmV0cmllcz1pbnQocG9ydGFnZS5z ZXR0aW5nc1siUlNZTkNfUkVUUklFUyJdKQoJCQkJZXhjZXB0IFN5c3RlbUV4aXQsIGU6CgkJ CQkJcmFpc2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBleGl0CgkJCQlleGNlcHQ6CgkJCQkJbWF4 cmV0cmllcz0zICNkZWZhdWx0IG51bWJlciBvZiByZXRyaWVzCgkJCgkJCQlyZXRyaWVzPTAK CQkJCXVwZGF0ZWNhY2hlX2ZsZz1UcnVlCgkJCgkJCQlpcHM9c3luY2VyLmdldF9pcHMoKQoJ CQkJaWYgaXBzID09IE5vbmU6CgkJCQkJaXBzPVtOb25lXQoJCQkJd2hpbGUgKDEpOgoJCQkJ CWlmIChyZXRyaWVzPT0wKToKCQkJCQkJaWYgIi0tYXNrIiBpbiBzZWxmLm15b3B0czoKCQkJ CQkJCWlmIHVzZXJxdWVyeSgiRG8geW91IHdhbnQgdG8gc3luYyB5b3VyIFBvcnRhZ2UgdHJl ZSB3aXRoIHRoZSBtaXJyb3IgJXMgYXQgJXNcbiIgXAoJCQkJCQkJCSUgKGhvc3RfdXJpLCBi bHVlKHN0cihpcHNbMF0pKSkrYm9sZCgiPyIpKT09Ik5vIjoKCQkJCQkJCQlwcmludAoJCQkJ CQkJCXByaW50ICJRdWl0dGluZy4iCgkJCQkJCQkJcHJpbnQKCQkJCQkJCQlzeXMuZXhpdCgw KQoJCQkJCQlzZWxmLmVtZXJnZWxvZygiPj4+IHN0YXJ0aW5nIHJzeW5jIHdpdGggIitob3N0 X3VyaSkKCQkJCQkJaWYgIi0tcXVpZXQiIG5vdCBpbiBzZWxmLm15b3B0czoKCQkJCQkJCXBy aW50ICI+Pj4gc3RhcnRpbmcgcnN5bmMgd2l0aCAlcywgaXAgJXMuLi4iICUgKGhvc3RfdXJp LGlwc1swXSkKCQkJCQllbHNlOgoJCQkJCQlzZWxmLmVtZXJnZWxvZygiPj4+IFN0YXJ0aW5n IHJldHJ5ICVkIG9mICVkIHdpdGggJXMgaXAgJXMiICUgXAoJCQkJCQkJKHJldHJpZXMsbWF4 cmV0cmllcyxob3N0X3VyaSxpcHNbMF0pKQoJCQkJCQlwcmludCAiXG5cbj4+PiBTdGFydGlu ZyByZXRyeSAlZCBvZiAlZCB3aXRoICVzIiAlIChyZXRyaWVzLG1heHJldHJpZXMsaG9zdF91 cmkpCgkJCgkJCQkJdHJ5OgoJCQkJCQlpZiAiLS1xdWlldCIgbm90IGluIHNlbGYubXlvcHRz OgoJCQkJCQkJcHJpbnQgIj4+PiBzeW5jaW5nLi4uIgoJCQkJCQlleGl0Y29kZT1zeW5jZXIu c3luYyhwb3J0YWdlLnNldHRpbmdzLHRtcHNlcnZlcnRpbWVzdGFtcGRpciwgXAoJCQkJCQkJ cmVtb3RlX3BhdGg9c3luY2VyLmdldF9yZW1vdGVfcGF0aCgpKyIvbWV0YWRhdGEvdGltZXN0 YW1wLmNoayIsCgkJCQkJCQl2ZXJib3NpdHk9MCwgY2xlYW51cD1GYWxzZSwgaXA9aXBzWzBd KQoJCQkJCQlpZiBleGl0Y29kZT09VHJ1ZToKCQkJCQkJCWV4aXRjb2RlPTAKCQkJCQlleGNl cHQgKHN5bmMucnN5bmMuUlN5bmNTeW50YXhFcnJvcixJT0Vycm9yKSxlOgoJCQkJCQlwcmlu dCBlCgkJCQkJCWV4aXRjb2RlPTEKCQkKCQkJCQlpZiBleGl0Y29kZT09MDoKCQkJCQkJdHJ5 OgoJCQkJCQkJc2VydmVydGltZXN0YW1wID0gdGltZS5ta3RpbWUodGltZS5zdHJwdGltZShw b3J0YWdlLmdyYWJmaWxlKHRtcHNlcnZlcnRpbWVzdGFtcGZpbGUpWzBdLCAiJWEsICVkICVi ICVZICVIOiVNOiVTICswMDAwIikpCgkJCQkJCWV4Y2VwdCBTeXN0ZW1FeGl0LCBlOgoJCQkJ CQkJcmFpc2UgIyBOZWVkZWQgZWxzZSBjYW4ndCBleGl0CgkJCQkJCWV4Y2VwdDoKCQkJCQkJ CXNlcnZlcnRpbWVzdGFtcCA9IDAKCQkJCQkJCgkJCQkJCWlmIChzZXJ2ZXJ0aW1lc3RhbXAg IT0gMCkgYW5kIChzZXJ2ZXJ0aW1lc3RhbXAgPT0gbXl0aW1lc3RhbXApOgoJCQkJCQkJc2Vs Zi5lbWVyZ2Vsb2coIj4+PiBDYW5jZWxsaW5nIHN5bmMgLS0gQWxyZWFkeSBjdXJyZW50LiIp CgkJCQkJCQlwcmludAoJCQkJCQkJcHJpbnQgIj4+PiIKCQkJCQkJCXByaW50ICI+Pj4gVGlt ZXN0YW1wcyBvbiB0aGUgc2VydmVyIGFuZCBpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeSBhcmUg dGhlIHNhbWUuIgoJCQkJCQkJcHJpbnQgIj4+PiBDYW5jZWxsaW5nIGFsbCBmdXJ0aGVyIHN5 bmMgYWN0aW9uLiBZb3UgYXJlIGFscmVhZHkgdXAgdG8gZGF0ZS4iCgkJCQkJCQlwcmludCAi Pj4+IgoJCQkJCQkJcHJpbnQKCQkJCQkJCXN5cy5leGl0KDApCgkJCQkJCWVsaWYgKHNlcnZl cnRpbWVzdGFtcCAhPSAwKSBhbmQgKHNlcnZlcnRpbWVzdGFtcCA8IG15dGltZXN0YW1wKToK CQkJCQkJCXNlbGYuZW1lcmdlbG9nKCI+Pj4gU2VydmVyIG91dCBvZiBkYXRlOiAlcyIgJSBk b3N5bmN1cmkpCgkJCQkJCQlwcmludAoJCQkJCQkJcHJpbnQgIj4+PiIKCQkJCQkJCXByaW50 ICI+Pj4gU0VSVkVSIE9VVCBPRiBEQVRFOiAlcyIgJSBkb3N5bmN1cmkKCQkJCQkJCXByaW50 ICI+Pj4iCgkJCQkJCQlwcmludAoJCQkJCQllbGlmIChzZXJ2ZXJ0aW1lc3RhbXAgPT0gMCkg b3IgKHNlcnZlcnRpbWVzdGFtcCA+IG15dGltZXN0YW1wKToKCQkJCQkJCSMgYWN0dWFsIHN5 bmMKCQkJCQkJCXRyeToKCQkJCQkJCQlleGl0Y29kZT1zeW5jZXIuc3luYyhwb3J0YWdlLnNl dHRpbmdzLHBvcnRhZ2Uuc2V0dGluZ3NbIlBPUlRESVIiXSwKCQkJCQkJCQkJdmVyYm9zaXR5 PXN5bmNfdmVyYm9zaXR5LAoJCQkJCQkJCQlleGNsdWRlcz0oJy9kaXN0ZmlsZXMnLCcvbG9j YWwnLCcvcGFja2FnZXMnKSxpcD1pcHNbMF0pCgkJCQkJCQkJaWYgZXhpdGNvZGU9PVRydWU6 CgkJCQkJCQkJCWV4aXRjb2RlPTAKCQkJCQkJCWV4Y2VwdCAoc3luYy5yc3luYy5SU3luY1N5 bnRheEVycm9yLElPRXJyb3IpLGU6CgkJCQkJCQkJcHJpbnQgZQoJCQkJCQkJCWV4aXRjb2Rl PTIxCgkJCQkJCQlpZiBleGl0Y29kZSBpbiBbMCwxLDIsMyw0LDExLDE0LDIwLDIxXToKCQkJ CQkJCQlicmVhawoJCQkJCWVsaWYgZXhpdGNvZGUgaW4gWzAsMSwyLDMsNCwxMSwxNCwyMCwy MV06CgkJCQkJCWJyZWFrCgkJCgkJCQkJcmV0cmllcz1yZXRyaWVzKzEKCQkKCQkJCQlpZiBy ZXRyaWVzPD1tYXhyZXRyaWVzOgoJCQkJCQlwcmludCAiPj4+IHJldHJ5IC4uLiIKCQkJCQkJ dGltZS5zbGVlcCgxMSkKCQkJCQllbHNlOgoJCQkJCQkjIG92ZXIgcmV0cmllcwoJCQkJCQkj IGV4aXQgbG9vcAoJCQkJCQl1cGRhdGVjYWNoZV9mbGc9RmFsc2UKCQkJCQkJYnJlYWsKCQkK CQkJCWlmIChleGl0Y29kZT09MCk6CgkJCQkJc2VsZi5lbWVyZ2Vsb2coIj09PSBTeW5jIGNv bXBsZXRlZCB3aXRoICVzOiAlcyIgJSAoaG9zdF91cmksaXBzWzBdKSkKCQkJCWVsaWYgKGV4 aXRjb2RlPjApOgoJCQkJCXByaW50CgkJCQkJdHJ5OgoJCQkJCQlleGl0Y29kZT1zeW5jZXIu c3luYyhwb3J0YWdlLnNldHRpbmdzLHBvcnRhZ2Uuc2V0dGluZ3NbIlBPUlRESVIiXSwKCQkJ CQkJCWV4Y2x1ZGVzPSgiL2Rpc3RmaWxlcyIsIi9sb2NhbCIsIi9wYWNrYWdlcyIpLHZlcmJv c2l0eT1zeW5jX3ZlcmJvc2l0eSxpcD1pcHNbMF0pCgkJCQkJCWlmIGV4aXRjb2RlID09IFRy dWU6CgkJCQkJCQlleGl0Y29kZT0wCgkJCQkJZXhjZXB0IHN5bmMucnN5bmMuUlN5bmNTeW50 YXhFcnJvciwgcnNzZToKCQkJCQkJcHJpbnQgZGFya3JlZCgiISEhIikrZ3JlZW4oIiBSc3lu YyBoYXMgcmVwb3J0ZWQgdGhhdCB0aGVyZSBpcyBhIHN5bnRheCBlcnJvci4gUGxlYXNlIGVu c3VyZSIpCgkJCQkJCXByaW50IGRhcmtyZWQoIiEhISIpK2dyZWVuKCIgdGhhdCB5b3VyIFNZ TkMgc3RhdGVtZW50IGlzIHByb3Blci4iKQoJCQkJCQlwcmludCBkYXJrcmVkKCIhISEiKStn cmVlbigiIFNZTkM9Iityc3NlLnZhbHVlKQoJCQkJCWV4Y2VwdCBJT0Vycm9yLCBpZToKCQkJ CQkJcHJpbnQgZGFya3JlZCgiISEhIikrZ3JlZW4oIiBSc3luYyBoYXMgcmVwb3J0ZWQgdGhh dCB0aGVyZSBpcyBhIEZpbGUgSU8gZXJyb3IuIE5vcm1hbGx5IikKCQkJCQkJcHJpbnQgZGFy a3JlZCgiISEhIikrZ3JlZW4oIiB0aGlzIG1lYW5zIHlvdXIgZGlzayBpcyBmdWxsLCBidXQg Y2FuIGJlIGNhdXNlZCBieSBjb3JydXB0aW9uIikKCQkJCQkJcHJpbnQgZGFya3JlZCgiISEh IikrZ3JlZW4oIiBvbiB0aGUgZmlsZXN5c3RlbSB0aGF0IGNvbnRhaW5zIFBPUlRESVIuIFBs ZWFzZSBpbnZlc3RpZ2F0ZSIpCgkJCQkJCXByaW50IGRhcmtyZWQoIiEhISIpK2dyZWVuKCIg YW5kIHRyeSBhZ2FpbiBhZnRlciB0aGUgcHJvYmxlbSBoYXMgYmVlbiBmaXhlZC4iKQoJCQkJ CQlwcmludCBkYXJrcmVkKCIhISEiKStncmVlbigiIFBPUlRESVI9Iitwb3J0YWdlLnNldHRp bmdzWyJQT1JURElSIl0pCgkJCQkJaWYgZXhpdGNvZGU9PTIwOgoJCQkJCQlwcmludCBkYXJr cmVkKCIhISEiKStncmVlbigiIFJzeW5jIHdhcyBraWxsZWQgYmVmb3JlIGl0IGZpbmlzaGVk LiIpCgkJCQkJZWxpZiBleGl0Y29kZSA+IDA6CgkJCQkJCXByaW50IGRhcmtyZWQoIiEhISIp K2dyZWVuKCIgUnN5bmMgaGFzIG5vdCBzdWNjZXNzZnVsbHkgZmluaXNoZWQuIEl0IGlzIHJl Y29tbWVuZGVkIHRoYXQgeW91IGtlZXAiKQoJCQkJCQlwcmludCBkYXJrcmVkKCIhISEiKStn cmVlbigiIHRyeWluZyBvciB0aGF0IHlvdSB1c2UgdGhlICdlbWVyZ2Utd2VicnN5bmMnIG9w dGlvbiBpZiB5b3UgYXJlIHVuYWJsZSIpCgkJCQkJCXByaW50IGRhcmtyZWQoIiEhISIpK2dy ZWVuKCIgdG8gdXNlIHJzeW5jIGR1ZSB0byBmaXJld2FsbCBvciBvdGhlciByZXN0cmljdGlv bnMuIFRoaXMgc2hvdWxkIGJlIGEiKQoJCQkJCQlwcmludCBkYXJrcmVkKCIhISEiKStncmVl bigiIHRlbXBvcmFyeSBwcm9ibGVtIHVubGVzcyBjb21wbGljYXRpb25zIGV4aXN0IHdpdGgg eW91ciBuZXR3b3JrIikKCQkJCQkJcHJpbnQgZGFya3JlZCgiISEhIikrZ3JlZW4oIiAoYW5k IHBvc3NpYmx5IHlvdXIgc3lzdGVtJ3MgZmlsZXN5c3RlbSkgY29uZmlndXJhdGlvbi4iKQoJ CQkJCWlmIGV4aXRjb2RlOgoJCQkJCQlwcmludCAiYmFpbGluZyIsZXhpdGNvZGUKCQkJCQkJ c3lzLmV4aXQoZXhpdGNvZGUpCgkJCQkJZWxzZToKCQkJCQkJdXBkYXRlY2FjaGVfZmxnPVRy dWUKCQkJZWxpZiBwcm90b2NvbCA9PSAiY3ZzIjoKCQkJCXN5bmNlcj1zeW5jLmN2cy5DdnNI b3N0KGhvc3RfdXJpKQoJCQkJdHJ5OgoJCQkJCXByaW50ICI+Pj4gc3RhcnRpbmcgY3ZzIHVw ZGF0ZSB3aXRoICIrc3luY3VyaSsiLi4uIgoJCQkJCXN5bmNlci5zeW5jKHBvcnRhZ2Uuc2V0 dGluZ3NbIlBPUlRESVIiXSxjb21wcmVzcz1GYWxzZSkKCQkJCQlwcmludCAiPj4+IGZpbmlz aGVkIgoJCQkJZXhjZXB0IHN5bmMuY3ZzLkNWU0lPRXJyb3IsIGNlOgoJCQkJCXByaW50IHJl ZCgiISEhIikrImN2cyBvcGVyYXRpb24gZmFpbGVkLSIKCQkJCQlwcmludCBzdHIoY2UpCgkJ CQkJc3lzLmV4aXQoMSkKCQkJZWxpZiBwcm90b2NvbCA9PSAic25hcHNob3QiOgoJCQkJZmV0 Y2hlcj1wb3J0YWdlLmdldF9wcmVmZXJyZWRfZmV0Y2hlcigpCgkJCQlwcmludCAnaG9zdF91 cmk9Jyxob3N0X3VyaQoJCQkJaWYgaG9zdF91cmkgPT0gTm9uZToKCQkJCQlwcmludCAiPj4+ IGNob29zaW5nIGEgcmFuZG9tIG1pcnJvciBmcm9tIHRoZSBtaXJyb3IgbGlzdCIKCQkJCQlo b3N0X3VyaSA9IHBvcnRhZ2UudGhpcmRwYXJ0eW1pcnJvcnNbImdlbnRvbyJdWzpdCgkJCQkJ cmFuZG9tLnNodWZmbGUoaG9zdF91cmkpCgkJCQkJaG9zdF91cmk9aG9zdF91cmlbMF0ucmVw bGFjZSgiZGlzdGZpbGVzIiwic25hcHNob3RzIikKCQkJCQlwcmludCAiPj4+IHVzaW5nICVz IiAlIGhvc3RfdXJpCgkJCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocG9ydGFnZS5zZXR0aW5n c1siUE9SVEFHRV9UTVBESVIiXSsiL3NuYXBzaG90cyIpOgoJCQkJCW9zLm1rZGlyKHBvcnRh Z2Uuc2V0dGluZ3NbIlBPUlRBR0VfVE1QRElSIl0rIi9zbmFwc2hvdHMiKQoJCQkJc3luY2Vy PXN5bmMuc25hcHNob3QuU25hcHNob3RIb3N0KGhvc3RfdXJpLHBvcnRhZ2Uuc2V0dGluZ3Nb IkRJU1RESVIiXSwgXAoJCQkJCXBvcnRhZ2Uuc2V0dGluZ3NbIlBPUlRBR0VfVE1QRElSIl0r Ii9zbmFwc2hvdHMiLCBmZXRjaGVyPWZldGNoZXIpCgkJCQlpZiBub3Qgc3luY2VyLnN5bmMo cG9ydGFnZS5zZXR0aW5nc1siUE9SVERJUiJdLHZlcmJvc2l0eT1zeW5jX3ZlcmJvc2l0eSk6 CgkJCQkJcHJpbnQgIiEhISBzbmFwc2hvdCBmYWlsZWQiCgkJCQkJc3lzLmV4aXQoMSkKCQkJ CWlmIG9zLnBhdGguZXhpc3RzKCIlcy9tZXRhZGF0YS90aW1lc3RhbXAuY2hrIiAlIHBvcnRh Z2Uuc2V0dGluZ3NbIlBPUlRBR0VfUE9SVERJUiJdKToKCQkJCQl0bXBzZXJ2ZXJ0aW1lc3Rh bXBmaWxlID0gIiVzL21ldGFkYXRhLnRpbWVzdGFtcC5jaGsiICUgcG9ydGFnZS5zZXR0aW5n c1siUE9SVEFHRV9QT1JURElSIl0KCQkKCQkJCXVwZGF0ZWNhY2hlX2ZsZyA9IFRydWUKCQkJ ZWxzZToKCQkJCXByaW50ICIhISEgcnN5bmMgc2V0dGluZzogIixzeW5jdXJpLCJub3QgcmVj b2duaXplZDsgZXhpdGluZy4iCgkJCQlzeXMuZXhpdCgxKQoJCQoJCQoJCQlpZiBvcy5wYXRo LmV4aXN0cyhteXBvcnRkaXIrIi9tZXRhZGF0YS9jYWNoZSIpIGFuZCB1cGRhdGVjYWNoZV9m bGc6CgkJCQlpZiAiLS1xdWlldCIgbm90IGluIHNlbGYubXlvcHRzOgoJCQkJCXByaW50ICJc bj4+PiBVcGRhdGluZyBQb3J0YWdlIGNhY2hlOiAgICAgICIsCgkJCQlvcy51bWFzaygwMDAy KQoJCQkJY2FjaGVkaXIgPSBvcy5wYXRoLm5vcm1wYXRoKHBvcnRhZ2Uuc2V0dGluZ3MuZGVw Y2FjaGVkaXIpCgkJCQlpZiBjYWNoZWRpciBpbiBbIi8iLCAgICAiL2JpbiIsICIvZGV2Iiwg ICIvZXRjIiwgICIvaG9tZSIsCgkJCQkgICAgICAgICAgICAgICAgIi9saWIiLCAiL29wdCIs ICIvcHJvYyIsICIvcm9vdCIsICIvc2JpbiIsCgkJCQkgICAgICAgICAgICAgICAgIi9zeXMi LCAiL3RtcCIsICIvdXNyIiwgICIvdmFyIl06CgkJCQkJcHJpbnQgIiEhISBQT1JUQUdFX0NB Q0hFRElSIElTIFNFVCBUTyBBIFBSSU1BUlkgUk9PVCBESVJFQ1RPUlkgT04gWU9VUiBTWVNU RU0uIgoJCQkJCXByaW50ICIhISEgVGhpcyBpcyBBTE1PU1QgQ0VSVEFJTkxZIE5PVCB3aGF0 IHlvdSB3YW50OiAiK3N0cihjYWNoZWRpcikKCQkJCQlzeXMuZXhpdCg3MykKCQkJCWlmIG5v dCBvcy5wYXRoLmV4aXN0cyhjYWNoZWRpcik6CgkJCQkJb3MubWtkaXIoY2FjaGVkaXIpCgkJ CgkJCQlpZiAob3MucGF0aC5leGlzdHMoY2FjaGVkaXIpIGFuZCBvcy5wYXRoLmV4aXN0cyhj YWNoZWRpcisiL2FwcC1wb3J0YWdlIikpOgoJCQkJCSMgcmVtb3ZlZCBvbGQgc3R5bGUgY2Fj aGUuCgkJCQkJIyBYWFg6IENvbXBhdCBDb2RlLCBhbmQgUG90ZW50aWFsbHkgYmFkLgoJCQkJ CXBvcnRhZ2Uuc3Bhd24oInJtIC1SZiAiK2NhY2hlZGlyKyIvKiIscG9ydGFnZS5zZXR0aW5n cyxmcmVlPTEpCgkJCgkJCQkjIHNhdmUgdGltZXN0YW1wLmNoayBmb3IgbmV4dCB0aW1lc3Rh bXAgY2hlY2suCgkJCQl0cnk6CgkJCQkJaWYgdG1wc2VydmVydGltZXN0YW1wZmlsZSAhPSBO b25lOgoJCQkJCQlwb3J0YWdlLm1vdmVmaWxlKHRtcHNlcnZlcnRpbWVzdGFtcGZpbGUsIHNl cnZlcnRpbWVzdGFtcGZpbGUpCgkJCQlleGNlcHQgU3lzdGVtRXhpdCwgZToKCQkJCQlyYWlz ZSAjIE5lZWRlZCBlbHNlIGNhbid0IGV4aXQKCQkJCWV4Y2VwdCBFeGNlcHRpb24sIGU6CgkJ CQkJcHJpbnQgIiEhISBGYWlsZWQgdG8gc2F2ZSBjdXJyZW50IHRpbWVzdGFtcC4iCgkJCQkJ cHJpbnQgIiEhISIsZQoJCQoJCQkJcG9ydGFnZS5wb3J0ZGIuZmx1c2hfY2FjaGUoKQoJCQoJ CQkJdHJ5OgoJCQkJCW9zLnVtYXNrKDAwMikKCQkJCQlvcy5jaG93bihjYWNoZWRpciwgb3Mu Z2V0dWlkKCksIHBvcnRhZ2UucG9ydGFnZV9naWQpCgkJCQkJb3MuY2htb2QoY2FjaGVkaXIs IDAwNzc1KQoJCQkJZXhjZXB0IFN5c3RlbUV4aXQsIGU6CgkJCQkJcmFpc2UgIyBOZWVkZWQg ZWxzZSBjYW4ndCBleGl0CgkJCQlleGNlcHQ6CgkJCQkJcGFzcwoJCQkJIyB3ZSBkb24ndCBt YWtlIG92ZXJsYXkgdHJlZXMgY2FjaGUgaGVyZS4KCQkJCSNncmFiIG91ciBvd24gZWNsYXNz X2NhY2hlLgoJCQkJZWMgPSBwb3J0YWdlLmVjbGFzc19jYWNoZS5jYWNoZShwb3J0YWdlLnBv cnRkYi5wb3J0dHJlZV9yb290KQoJCQkJIyBraW5kYSB1Z2x5LgoJCQkJY20gPSBwb3J0YWdl LnNldHRpbmdzLmxvYWRfYmVzdF9tb2R1bGUoInBvcnRkYmFwaS5tZXRhZGJtb2R1bGUiKQoJ CQkJY21pID0gY20oIm1ldGFkYXRhL2NhY2hlIiwgY20uYXV4ZGJrZXlfb3JkZXIsIGJhc2Vw YXRoPW15cG9ydGRpcikKCQkJCQoJCQkJZGVmIHF1aWNreV9jcHZfZ2VuZXJhdG9yKGRiYXBp KToKCQkJCQlmb3IgeCBpbiBkYmFwaS5jcF9hbGwoKToKCQkJCQkJZm9yIHkgaW4gZGJhcGku Y3BfbGlzdCh4KToKCQkJCQkJCXlpZWxkIHkKCQkKCQkJCWltcG9ydCBjYWNoZS51dGlsCgkJ CQkjIG1hbmdsZSB0aGUgc2V0dGluZ3MgdmFyLgoJCQkJY29uZmlnPXBvcnRhZ2UuY29uZmln KGNsb25lPXBvcnRhZ2Uuc2V0dGluZ3MpCgkJCQljb25maWdbIlBPUlRESVJfT1ZFUkxBWSJd ID0gJycKCQkJCWNvbmZpZ1siUE9SVERJUiJdID0gbXlwb3J0ZGlyCgkJCQlwZGI9cG9ydGFn ZS5wb3J0ZGJhcGkobXlwb3J0ZGlyLCBjb25maWcpCgkJCQljYWNoZS51dGlsLm1pcnJvcl9j YWNoZShxdWlja3lfY3B2X2dlbmVyYXRvcihwZGIpLCBjbWksIAoJCQkJCXBkYi5hdXhkYltt eXBvcnRkaXJdLCBlY2xhc3NfY2FjaGU9ZWMsCgkJCQkJdmVyYm9zZV9pbnN0YW5jZT1jYWNo ZS51dGlsLm5vbl9xdWlldF9taXJyb3JpbmcoKSkKCQkJCWRlbCBlYwoJCQkJZGVsIGNtaQoJ CQkJZGVsIGNtCgkJCQlkZWwgcGRiCgkJIwkJbXlub2Rlcz1wb3J0YWdlLnBvcnRkYi5jcF9h bGwoKQoJCSMJCW15bm9kZXMuc29ydCgpCgkJIwkJcGNudD0wCgkJIwkJcGNudHN0cj0iIgoJ CSMJCXBjbnRjb3VudD1sZW4obXlub2RlcykvMTAwLjAKCQkjCQluZXh0dXBkYXRlPXBjbnRj b3VudAoJCSMJCWN1cnJlbnQ9MAoJCSMJCSMgbmVlZCB0byBhZGQgYSBjYWxsYmFjayBvcHRp b24gdG8gcmVnZW5fa2V5cyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgaGFwcHkgc3Bpbm55 IGV5ZS1jYW5keSBzdHVmZi4KCQkjCQlwb3J0YWdlLnBvcnRkYi5yZWdlbl9rZXlzKHNyY19j YWNoZT1teXBvcnRkaXIrIi9tZXRhZGF0YS9jYWNoZSIsZGVidWc9KCJjYWNoZWRlYnVnIiBp biBwb3J0YWdlLmZlYXR1cmVzKSwKCQkjCQkJdmVyYm9zZT1GYWxzZSkKCQkjCQlwb3J0YWdl LnBvcnRkYi5wb3J0dHJlZXM9YmFja3VwX3BvcnR0cmVlcwoJCQkJc3lzLnN0ZG91dC53cml0 ZSgiXG5cbiIpCgkJCQlzeXMuc3Rkb3V0LmZsdXNoKCkKCQkKCQkJcG9ydGFnZS5wb3J0YWdl ZXhpdCgpCgkJCXJlbG9hZChwb3J0YWdlKQoJCQlteWJlc3Rwdj1wb3J0YWdlLnBvcnRkYi54 bWF0Y2goImJlc3RtYXRjaC12aXNpYmxlIiwic3lzLWFwcHMvcG9ydGFnZSIpCgkJCW15cHZz PXBvcnRhZ2UuYmVzdChwb3J0YWdlLmRiW3BvcnRhZ2Uucm9vdF1bInZhcnRyZWUiXS5kYmFw aS5tYXRjaCgic3lzLWFwcHMvcG9ydGFnZSIpKQoJCQoJCQljaGtfdXBkYXRlZF9jZmdfZmls ZXMoKQoJCQoJCQlpZihteWJlc3RwdiAhPSBteXB2cyk6CgkJCQlwcmludAoJCQkJcHJpbnQg cmVkKCIgKiAiKStib2xkKCJBbiB1cGRhdGUgdG8gcG9ydGFnZSBpcyBhdmFpbGFibGUuIikr IiBJdCBpcyBfaGlnaGx5XyByZWNvbW1lbmRlZCIKCQkJCXByaW50IHJlZCgiICogIikrInRo YXQgeW91IHVwZGF0ZSBwb3J0YWdlIG5vdywgYmVmb3JlIGFueSBvdGhlciBwYWNrYWdlcyBh cmUgdXBkYXRlZC4iCgkJCQlwcmludCByZWQoIiAqICIpKyJQbGVhc2UgZG8gc28gYW5kIHRo ZW4gdXBkYXRlICIrYm9sZCgiQUxMIikrIiBvZiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMu IgoJCQkJcHJpbnQKCQllbGlmIHNlbGYubXlhY3Rpb249PSJyZWdlbiI6CgkJCXNlbGYuZW1l cmdlbG9nKCIgPT09IHJlZ2VuIikKCQkJI3JlZ2VuZXJhdGUgY2FjaGUgZW50cmllcwoJCQlw cmludCAiUmVnZW5lcmF0aW5nIGNhY2hlIGVudHJpZXMuLi4gIgoJCQlwb3J0YWdlLnBvcnRk Yi5yZWdlbl9rZXlzKCkKCQkJcHJpbnQgImRvbmUhIgoJCSMgSEVMUCBhY3Rpb24KCQllbGlm ICJjb25maWciPT1zZWxmLm15YWN0aW9uOgoJCQlzZWxmLmVtZXJnZWxvZygiID09PSBjb25m aWciKQoJCQlwcmludAoJCQlwcmludCAiQ3VycmVudGx5LCBcJ2NvbmZpZ1wnIGlzIGEgaGVs cCBvcHRpb24gb25seS4iCgkJCXByaW50CgkJIyBJTkZPIGFjdGlvbgoJCWVsaWYgImluZm8i PT1zZWxmLm15YWN0aW9uOgoJCQl1bmFtZW91dD1wb3J0YWdlX2V4ZWMuc3Bhd25fZ2V0X291 dHB1dCgidW5hbWUgLW1ycCIpWzFdCgkJCXByaW50IGdldHBvcnRhZ2V2ZXJzaW9uKCkKCQkJ cHJpbnQgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09IgoJCQlwcmludCAiU3lzdGVtIHVuYW1lOiAiK3VuYW1lb3V0 CgkJCWlmIG9zLnBhdGguZXhpc3RzKCIvZXRjL2dlbnRvby1yZWxlYXNlIik6CgkJCQlwb3J0 YWdlX2V4ZWMuc3Bhd24oImNhdCAvZXRjL2dlbnRvby1yZWxlYXNlIikKCQkJZWxzZToKCQkJ CXByaW50ICJVbmtub3duIEhvc3QgT3BlcmF0aW5nIFN5c3RlbSIKCQkJCgkJCXB5X3ZlcnMg PSBzdHJpbmcuam9pbihwb3J0YWdlLmRiWyIvIl1bInZhcnRyZWUiXS5kYmFwaS5tYXRjaCgi ZGV2LWxhbmcvcHl0aG9uIiksICIsIikKCQkJcHlfdGhpcyA9IHN0cmluZy5zdHJpcChzdHJp bmcuc3BsaXQoc3lzLnZlcnNpb24sIlxuIilbMF0pCgkJCXByaW50ICIlLTIwcyAlcyBbJXNd IiAlICgiUHl0aG9uOiIscHlfdmVycyxweV90aGlzKQoJCQoJCQlvdXRwdXQ9cG9ydGFnZV9l eGVjLnNwYXduX2dldF9vdXRwdXQoImRpc3RjYyAtLXZlcnNpb24iKQoJCQlpZiBub3Qgb3V0 cHV0WzBdOgoJCQkJcHJpbnQgb3V0cHV0WzFdLnNwbGl0KCJcbiIsMSlbMF0sCgkJCQlpZiAi ZGlzdGNjIiBpbiBwb3J0YWdlLmZlYXR1cmVzOgoJCQkJCXByaW50ICJbZW5hYmxlZF0iCgkJ CQllbHNlOgoJCQkJCXByaW50ICJbZGlzYWJsZWRdIgoJCQoJCQlvdXRwdXQ9cG9ydGFnZV9l eGVjLnNwYXduX2dldF9vdXRwdXQoImNjYWNoZSAtViIpCgkJCWlmIG5vdCBvdXRwdXRbMF06 CgkJCQlwcmludCBvdXRwdXRbMV0uc3BsaXQoIlxuIiwxKVswXSwKCQkJCWlmICJjY2FjaGUi IGluIHBvcnRhZ2UuZmVhdHVyZXM6CgkJCQkJcHJpbnQgIltlbmFibGVkXSIKCQkJCWVsc2U6 CgkJCQkJcHJpbnQgIltkaXNhYmxlZF0iCgkJCgkJCW15dmFycyAgPSBbInN5cy1kZXZlbC9h dXRvY29uZiIsICJzeXMtZGV2ZWwvYXV0b21ha2UiLCAidmlydHVhbC9vcy1oZWFkZXJzIiwK CQkJICAgICAgICAgICAic3lzLWRldmVsL2JpbnV0aWxzIiwgInN5cy1kZXZlbC9saWJ0b29s IiwgICJkZXYtbGFuZy9weXRob24iXQoJCQlteXZhcnMgKz0gcG9ydGFnZV91dGlsLmdyYWJm aWxlKHBvcnRhZ2Uuc2V0dGluZ3NbIlBPUlRESVIiXSsiL3Byb2ZpbGVzL2luZm9fcGtncyIp CgkJCW15dmFycyAgPSBwb3J0YWdlX3V0aWwudW5pcXVlX2FycmF5KG15dmFycykJCQoJCQlt eXZhcnMuc29ydCgpCgkJCQoJCQlmb3IgeCBpbiBteXZhcnM6CgkJCQlpZiBwb3J0YWdlLnBv cnRhZ2VfZGVwLmlzdmFsaWRhdG9tKHgpOgoJCQkJCXBrZ19tYXRjaGVzID0gcG9ydGFnZS5k YlsiLyJdWyJ2YXJ0cmVlIl0uZGJhcGkubWF0Y2goeCkKCQkJCQlwa2dzID0gIiIKCQkJCQlm b3IgeSBpbiBwa2dfbWF0Y2hlczoKCQkJCQkJbXljcHYgICA9IHBvcnRhZ2UuY2F0cGtnc3Bs aXQoeSkKCQkJCQkJaWYgcGtnczoKCQkJCQkJCXBrZ3MgKz0gIiwgIgoJCQkJCQlwa2dzICAg Kz0gc3RyKG15Y3B2WzJdKQoJCQkJCQlpZihteWNwdlszXSAhPSAicjAiKToKCQkJCQkJCXBr Z3MgKz0gIi0iICsgc3RyKG15Y3B2WzNdKQoJCQkJCWlmIG5vdCBwa2dzOgoJCQkJCQlwa2dz ID0gIltOb3QgUHJlc2VudF0iCgkJCQkJcHJpbnQgIiUtMjBzICVzIiAlICh4KyI6IiwgcGtn cykKCQkJCWVsc2U6CgkJCQkJcHJpbnQgIiUtMjBzICVzIiAlICh4KyI6IiwgIltOT1QgVkFM SURdIikKCQkKCQkJbGlidG9vbF92ZXJzID0gc3RyaW5nLmpvaW4ocG9ydGFnZS5kYlsiLyJd WyJ2YXJ0cmVlIl0uZGJhcGkubWF0Y2goInN5cy1kZXZlbC9saWJ0b29sIiksICIsIikKCQkJ CgkJCWlmICItLXZlcmJvc2UiIGluIHNlbGYubXlvcHRzOgoJCQkJbXl2YXJzPXBvcnRhZ2Uu c2V0dGluZ3Mua2V5cygpCgkJCWVsc2U6CgkJCQlteXZhcnMgPSBbJ0dFTlRPT19NSVJST1JT JywgJ0NPTkZJR19QUk9URUNUJywgJ0NPTkZJR19QUk9URUNUX01BU0snLAoJCQkJICAgICAg ICAgICdQT1JURElSJywgJ0RJU1RESVInLCAnUEtHRElSJywgJ1BPUlRBR0VfVE1QRElSJywK CQkJCSAgICAgICAgICAnUE9SVERJUl9PVkVSTEFZJywgJ1VTRScsICdDSE9TVCcsICdDRkxB R1MnLCAnQ1hYRkxBR1MnLAoJCQkJICAgICAgICAgICdBQ0NFUFRfS0VZV09SRFMnLCAnU1lO QycsICdGRUFUVVJFUyddCgkJCgkJCQlteXZhcnMuZXh0ZW5kKHBvcnRhZ2VfdXRpbC5ncmFi ZmlsZShwb3J0YWdlLnNldHRpbmdzWyJQT1JURElSIl0rIi9wcm9maWxlcy9pbmZvX3ZhcnMi KSkKCQkKCQkJbXl2YXJzID0gcG9ydGFnZV91dGlsLnVuaXF1ZV9hcnJheShteXZhcnMpCQkK CQkJdW5zZXRfdmFycyA9IFtdCgkJCW15dmFycy5zb3J0KCkKCQkJZm9yIHggaW4gbXl2YXJz OgoJCQkJaWYgcG9ydGFnZS5zZXR0aW5ncy5oYXNfa2V5KHgpOgoJCQkJCXByaW50IHgrJz0i Jytwb3J0YWdlLnNldHRpbmdzW3hdKyciJwoJCQkJZWxzZToKCQkJCQl1bnNldF92YXJzLmFw cGVuZCh4KQoJCQlpZiB1bnNldF92YXJzOgoJCQkJcHJpbnQgIlVuc2V0OiAgIisiLCAiLmpv aW4odW5zZXRfdmFycykKCQkJcHJpbnQKCQkKCQkJY29uZmlnX2ZpbGVzID0gW3BvcnRhZ2Uu TUFLRV9DT05GX0ZJTEUsCgkJCSAgICAgICAgICAgICAgICBwb3J0YWdlLk1PRFVMRVNfRklM RV9QQVRILAoJCQkgICAgICAgICAgICAgICAgcG9ydGFnZS5VU0VSX1ZJUlRVQUxTX0ZJTEUs CgkJCSAgICAgICAgICAgICAgICBwb3J0YWdlLkVCVUlMRF9TSF9FTlZfRklMRSwKCQkJICAg ICAgICAgICAgICAgIHBvcnRhZ2UuQ1VTVE9NX01JUlJPUlNfRklMRV0KCQkJY29uZmlnX2Zp bGVzICs9IFtwb3J0YWdlLlVTRVJfQ09ORklHX1BBVEgrIi9wYWNrYWdlLiIreCBmb3IgeCBp biBbIm1hc2siLCJ1bm1hc2siLCJrZXl3b3JkcyIsImVudiJdXQoJCQljb25maWdfZmlsZXMg Kz0gW3BvcnRhZ2UuQ1VTVE9NX1BST0ZJTEVfUEFUSCsiLyIreCBmb3IgeCBpbiBbIm1ha2Uu ZGVmYXVsdHMiLCJwYWNrYWdlcyIsInVzZS5tYXNrIiwidmlydHVhbHMiLCJwcm9maWxlLmJh c2hyYyIsInVzZS5kZWZhdWx0cyJdXQoJCQlwcmludCAiQ29uZmlnIGZpbGVzOiAiKygiLCAi LmpvaW4oW3ggZm9yIHggaW4gY29uZmlnX2ZpbGVzIGlmIG9zLnBhdGguZXhpc3RzKHgpXSkp CgkJCgkJCWlmICItLWRlYnVnIiBpbiBzZWxmLm15b3B0czoKCQkJCWZvciB4IGluIGRpcihw b3J0YWdlKToKCQkJCQltb2R1bGUgPSBnZXRhdHRyKHBvcnRhZ2UsIHgpCgkJCQkJaWYgImN2 c19pZF9zdHJpbmciIGluIGRpcihtb2R1bGUpOgoJCQkJCQlwcmludCAiJXM6ICVzIiAlIChz dHIoeCksIHN0cihtb2R1bGUuY3ZzX2lkX3N0cmluZykpCgkJCgkJIyBTRUFSQ0ggYWN0aW9u CgkJZWxpZiAic2VhcmNoIj09c2VsZi5teWFjdGlvbjoKCQkJaWYgbm90IHNlbGYubXlmaWxl czoKCQkJCXByaW50ICJlbWVyZ2U6IG5vIHNlYXJjaCB0ZXJtcyBwcm92aWRlZC4iCgkJCWVs c2U6CgkJCQlzZWFyY2hpbnN0YW5jZSA9IHNlYXJjaChzZWxmLm15b3B0cyxzZWxmLmVkZWJ1 ZyxzZWxmLnZlcmJvc2l0eSxzZWxmLnNwaW5uZXIpCgkJCQlmb3IgbXlzZWFyY2ggaW4gc2Vs Zi5teWZpbGVzOgoJCQkJCXRyeToKCQkJCQkJc2VhcmNoaW5zdGFuY2UuZXhlY3V0ZShteXNl YXJjaCkKCQkJCQlleGNlcHQgcmUuZXJyb3IsIGNvbW1lbnQ6CgkJCQkJCXByaW50ICJcbiEh ISBSZWd1bGFyIGV4cHJlc3Npb24gZXJyb3IgaW4gXCIlc1wiOiAlcyIgJSAoIG15c2VhcmNo LCBjb21tZW50ICkKCQkJCQkJc3lzLmV4aXQoMSkKCQkJCQlzZWFyY2hpbnN0YW5jZS5vdXRw dXQoKQoJCWVsaWYgInVubWVyZ2UiPT1zZWxmLm15YWN0aW9uIG9yICJwcnVuZSI9PXNlbGYu bXlhY3Rpb24gb3IgImNsZWFuIj09c2VsZi5teWFjdGlvbjoKCQkJaWYgMT09c2VsZi51bm1l cmdlKHNlbGYubXlhY3Rpb24sIHNlbGYubXlmaWxlcyk6CgkJCQlzZWxmLnBvc3RfZW1lcmdl KCkKCQkJCgkJZWxpZiAiZGVwY2xlYW4iPT1zZWxmLm15YWN0aW9uOgoJCQkjIEtpbGwgcGFj a2FnZXMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBtZXJnZWQgb3IgYXJlIHJlcXVpcmVkIGFz IGEKCQkJIyBkZXBlbmRlbmN5IG9mIGFub3RoZXIgcGFja2FnZS4gV29ybGQgZmlsZSBpcyBl eHBsaWNpdC4KCQkKCQkJcHJpbnQKCQkJcHJpbnQgcmVkKCIqKiogV0FSTklORyAqKioiKSsi IDogREVQQ0xFQU4gQ0FOICBTRVJJT1VTTFkgIElNUEFJUiBZT1VSIFNZU1RFTS4gVVNFIENB VVRJT04uIgoJCQlwcmludCByZWQoIioqKiBXQVJOSU5HICoqKiIpKyIgOiAoQ2FuY2VsOiBD T05UUk9MLUMpIC0tIEFMV0FZUyBWRVJJRlkgQUxMIFBBQ0tBR0VTIElOIFRIRSIKCQkJcHJp bnQgcmVkKCIqKiogV0FSTklORyAqKioiKSsiIDogQ0FORElEQVRFIExJU1QgRk9SICBTQU5J VFkgIEJFRk9SRSAgQUxMT1dJTkcgREVQQ0xFQU4gVE8iCgkJCXByaW50IHJlZCgiKioqIFdB Uk5JTkcgKioqIikrIiA6IFVOTUVSR0UgQU5ZIFBBQ0tBR0VTLiIKCQkJcHJpbnQgcmVkKCIq KiogV0FSTklORyAqKioiKSsiIDoiCgkJCXByaW50IHJlZCgiKioqIFdBUk5JTkcgKioqIikr IiA6IFVTRSBGTEFHUyBNQVkgSEFWRSBBTiBFWFRSRU1FIEVGRkVDVCBPTiBUSEUgT1VUUFVU LiIKCQkJcHJpbnQgcmVkKCIqKiogV0FSTklORyAqKioiKSsiIDogU09NRSBMSUJSQVJJRVMg TUFZIEJFIFVTRUQgQlkgUEFDS0FHRVMgQlVUIEFSRSBOT1QiCgkJCXByaW50IHJlZCgiKioq IFdBUk5JTkcgKioqIikrIiA6IENPTlNJREVSRUQgVE8gQkUgQSBERVBFTkQgRFVFIFRPIFVT RSBGTEFHIFNFVFRJTkdTLiIKCQkJcHJpbnQgcmVkKCIqKiogV0FSTklORyAqKioiKSsiIDog ZW1lcmdlIC0tdXBkYXRlIC0tZGVlcCAtLW5ld3VzZSB3b3JsZCBUTyBWRVJJRlkiCgkJCXBy aW50IHJlZCgiKioqIFdBUk5JTkcgKioqIikrIiA6IFNBTklUWSBJTiBUSElTIFJFR0FSRC4i CgkJCXByaW50IHJlZCgiKioqIFdBUk5JTkcgKioqIikrIiA6IgoJCQlwcmludCByZWQoIioq KiBXQVJOSU5HICoqKiIpKyIgOiBQYWNrYWdlcyAgaW4gdGhlIGxpc3QgIHRoYXQgYXJlICBk ZXNpcmVkICBtYXkgYmUgYWRkZWQiCgkJCXByaW50IHJlZCgiKioqIFdBUk5JTkcgKioqIikr IiA6IGRpcmVjdGx5IHRvIHRoZSB3b3JsZCBmaWxlIHRvIGNhdXNlIHRoZW0gdG8gYmUgaWdu b3JlZCIKCQkJcHJpbnQgcmVkKCIqKiogV0FSTklORyAqKioiKSsiIDogYnkgZGVwY2xlYW4g YW5kIG1haW50YWluZWQgaW4gdGhlIGZ1dHVyZS4gQlJFQUtBR0VTIERVRSIKCQkJcHJpbnQg cmVkKCIqKiogV0FSTklORyAqKioiKSsiIDogVE8gVU5NRVJHSU5HIEFOICA9PUlOLVVTRSBM SUJSQVJZPT0gIE1BWSBCRSBSRVBBSVJFRCBCWSIKCQkJcHJpbnQgcmVkKCIqKiogV0FSTklO RyAqKioiKSsiIDogTUVSR0lORyAgKioqIFRIRSBQQUNLQUdFIFRIQVQgQ09NUExBSU5TICoq KiAgQUJPVVQgVEhFIgoJCQlwcmludCByZWQoIioqKiBXQVJOSU5HICoqKiIpKyIgOiBNSVNT SU5HIExJQlJBUlkuIgoJCQlwcmludAoJCQlpZiAoIi0tcHJldGVuZCIgbm90IGluIHNlbGYu bXlvcHRzKSBhbmQgKCItLWFzayIgbm90IGluIHNlbGYubXlvcHRzKToKCQkJCWNvdW50ZG93 bihzZWxmLkVNRVJHRV9XQVJOSU5HX0RFTEFZLCAiPj4+IERlcGNsZWFuIikKCQkJCXNlbGYu ZW1lcmdlbG9nKCIgPj4+IGRlcGNsZWFuIikKCQkKCQkJbXlkZXBncmFwaD1kZXBncmFwaChz ZWxmLm15YWN0aW9uLHNlbGYubXlvcHRzLHNlbGYubXlwYXJhbXMsc2VsZi5lZGVidWcsc2Vs Zi52ZXJib3NpdHksc2VsZi5FTUVSR0VfV0FSTklOR19ERUxBWSxzZWxmLnNwaW5uZXIpCgkJ CXN5c2xpc3Q9Z2V0bGlzdCgic3lzdGVtIikKCQkJd29ybGRsaXN0PWdldGxpc3QoIndvcmxk IikKCQkKCQkJcHJpbnQgIkNhbGN1bGF0aW5nIixzZWxmLm15YWN0aW9uLCJkZXBlbmRlbmNp ZXMgICIsCgkJCWlmIG5vdCBteWRlcGdyYXBoLnhjcmVhdGUoIndvcmxkIik6CgkJCQlwcmlu dCAiXG4hISEgRmFpbGVkIHRvIGNyZWF0ZSBkZXB0cmVlLiIKCQkJCXN5cy5leGl0KDEpCgkJ CXByaW50ICJcYlxiIC4uLiBkb25lISIKCQkKCQkJaWYgKCItLXVzZXBrZ29ubHkiIGluIHNl bGYubXlvcHRzKSBhbmQgbXlkZXBncmFwaC5taXNzaW5nYmluczoKCQkJCXN5cy5zdGRlcnIu d3JpdGUocmVkKCJUaGUgZm9sbG93aW5nIGJpbmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlIGZv ciBtZXJnaW5nLi4uXG4iKSkKCQkJCWZvciB4IGluIG15ZGVwZ3JhcGgubWlzc2luZ2JpbnM6 CgkJCQkJc3lzLnN0ZGVyci53cml0ZSgiICAgIitzdHIoeCkrIlxuIikKCQkJCXN5cy5zdGRl cnIud3JpdGUoIlxuVGhlc2UgYXJlIHJlcXVpcmVkIGJ5ICctLXVzZXBrZ29ubHknIC0tIFRl cm1pbmF0aW5nLlxuXG4iKQoJCQkJc3lzLmV4aXQoMSkKCQkKCQkJYWxsZGVwcz1teWRlcGdy YXBoLm15bmV3Z3JhcGguZ2V0X2FsbF9ub2RlcygpCgkJCW15dmFybGlzdD1wb3J0YWdlLnZh cmRiYXBpKHBvcnRhZ2Uucm9vdCkuY3BfYWxsKCkKCQkKCQkJaWYgbm90IHN5c2xpc3Q6CgkJ CQlwcmludCAiISEhIFlvdSBoYXZlIG5vIHN5c3RlbSBsaXN0LiBDYW5ub3QgZGV0ZXJtaW5l IHN5c3RlbSBmcm9tIHdvcmxkLiIKCQkJaWYgbm90IHdvcmxkbGlzdDoKCQkJCXByaW50ICIh ISEgWW91IGhhdmUgbm8gd29ybGQgZmlsZS4gQ2Fubm90IGRldGVybWluZSBleHBsaWNpdCBt ZXJnZXMuIgoJCQlpZiBub3QgbXl2YXJsaXN0OgoJCQkJcHJpbnQgIiEhISBZb3UgaGF2ZSBu byBpbnN0YWxsZWQgcGFja2FnZSB0cmVlICglcykuIFRoaXMgaXMgYSBwcm9ibGVtLiIgJSBw b3J0YWdlLlZEQl9QQVRICgkJCWlmIG5vdCBhbGxkZXBzOgoJCQkJcHJpbnQgIiEhISBZb3Ug aGF2ZSBubyBkZXBlbmRlbmNpZXMuIEltcG9zc2libGUuIEJ1Zy4iCgkJCgkJCWlmIG5vdCAo c3lzbGlzdCBhbmQgd29ybGRsaXN0IGFuZCBteXZhcmxpc3QgYW5kIGFsbGRlcHMpOgoJCQkJ cHJpbnQKCQkJCXN5cy5leGl0KDEpCgkJCgkJCXJlYWxsaXN0PVtdCgkJCWZvciB4IGluIGFs bGRlcHM6CgkJCQlteXBhcnRzPXBvcnRhZ2VfdmVyc2lvbnMuY2F0cGtnc3BsaXQoeC5zcGxp dCgpWzJdKQoJCQkJaWYgbm90IG15cGFydHM6CgkJCQkJc3lzLnN0ZGVyci53cml0ZSgKCQkJ CQkgIHJlZCgiISEhIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIGZv bGxvd2luZyBwYWNrYWdlOlxuIikrCgkJCQkJCXJlZCgiISEhICIrc3RyKHguc3BsaXQoKVsy XSkrIlxuXG4iKSsKCQkJCQkJICAgICIhISEgUGxlYXNlIGVuc3VyZSB0aGF0IGJsb2NraW5n L2NvbmZsaWN0aW5nIHBhY2thZ2VzIGFyZSBub3QgbWVyZ2VkLiIrCgkJCQkJCQkJIiEhISAn ZW1lcmdlIC1wICIrc3RyKHguc3BsaXQoKVsyXSkrIlxuXG4iKQoJCQkJCWlmICgiLS1wcmV0 ZW5kIiBub3QgaW4gc2VsZi5teW9wdHMpIGFuZCAoIi0tYXNrIiBub3QgaW4gc2VsZi5teW9w dHMpOgoJCQkJCQljb3VudGRvd24oc2VsZi5FTUVSR0VfV0FSTklOR19ERUxBWSwgIioqKiBD b250aW51aW5nIikKCQkJCQljb250aW51ZQoJCQkJCQoJCQkJY2F0cGFjaz1teXBhcnRzWzBd KyIvIitteXBhcnRzWzFdCgkJCQlpZiBjYXRwYWNrIG5vdCBpbiByZWFsbGlzdDoKCQkJCQly ZWFsbGlzdC5hcHBlbmQoY2F0cGFjaykKCQkKCQkJY2xlYW5saXN0PVtdCgkJCWZvciB4IGlu IG15dmFybGlzdDoKCQkJCWlmIHggbm90IGluIHJlYWxsaXN0OgoJCQkJCWlmIHggbm90IGlu IGNsZWFubGlzdDoKCQkJCQkJY2xlYW5saXN0LmFwcGVuZCh4KQoJCQoJCQlmb3IgeCBpbiBz eXNsaXN0K3dvcmxkbGlzdDoKCQkJCW15cGFydHMgPSBwb3J0YWdlX3ZlcnNpb25zLmNhdHBr Z3NwbGl0KHgpCgkJCQlpZiBteXBhcnRzOgoJCQkJCW15Y2F0ID0gIiIKCQkJCQlteXBhcnRz ID0gbGlzdChteXBhcnRzKQoJCQkJCWlmIG15cGFydHNbMF1bMF0gaW4gKCc8JywnPicsJz0n KToKCQkJCQkJbXljYXQgPSBteXBhcnRzWzBdWzE6XQoJCQkJCWVsaWYgbXlwYXJ0c1swXVs6 Ml0gaW4gKCc8PScsJz49Jyk6CgkJCQkJCW15Y2F0ID0gbXlwYXJ0c1swXVsyOl0KCQkJCQlj YXRwYWNrPW15Y2F0KyIvIitteXBhcnRzWzFdCgkJCQllbHNlOgoJCQkJCWNhdHBhY2s9eAoJ CQkJaWYgY2F0cGFjayBpbiBjbGVhbmxpc3Q6CgkJCQkJY2xlYW5saXN0LnJlbW92ZShjYXRw YWNrKQoJCQoJCQkjcHJpbnQgIlxuXG5cbkNsZWFuaW5nOiAiCgkJCSNmb3IgeCBpbiBjbGVh bmxpc3Q6CgkJCSMJcHJpbnQgeAoJCQkjcHJpbnQKCQkKCQkJaWYgbGVuKGNsZWFubGlzdCk6 CgkJCQlzZWxmLnVubWVyZ2UoInVubWVyZ2UiLCBjbGVhbmxpc3QpCgkJCgkJCXByaW50CgkJ CXByaW50ICJQYWNrYWdlcyBpbnN0YWxsZWQ6ICAgIitzdHIobGVuKG15dmFybGlzdCkpCgkJ CXByaW50ICJQYWNrYWdlcyBpbiB3b3JsZDogICAgIitzdHIobGVuKHdvcmxkbGlzdCkpCgkJ CXByaW50ICJQYWNrYWdlcyBpbiBzeXN0ZW06ICAgIitzdHIobGVuKHN5c2xpc3QpKQoJCQlw cmludCAiVW5pcXVlIHBhY2thZ2UgbmFtZXM6ICIrc3RyKGxlbihyZWFsbGlzdCkpCgkJCXBy aW50ICJSZXF1aXJlZCBwYWNrYWdlczogICAgIitzdHIobGVuKGFsbGRlcHMpKQoJCQlpZiAi LS1wcmV0ZW5kIiBpbiBzZWxmLm15b3B0czoKCQkJCXByaW50ICJOdW1iZXIgdG8gcmVtb3Zl OiAgICAgIitzdHIobGVuKGNsZWFubGlzdCkpCgkJCWVsc2U6CgkJCQlwcmludCAiTnVtYmVy IHJlbW92ZWQ6ICAgICAgICIrc3RyKGxlbihjbGVhbmxpc3QpKQoJCQkJc2VsZi5wb3N0X2Vt ZXJnZSgpCgkJCgkJIyAidXBkYXRlIiwgInN5c3RlbSIsIG9yIGp1c3QgcHJvY2VzcyBmaWxl czoKCQllbHNlOgoJCQlmYXZvcml0ZXM9W10KCQkJc3lzbGlzdD1nZXRsaXN0KCJzeXN0ZW0i KQoJCQlpZiAoKCItLXByZXRlbmQiIGluIHNlbGYubXlvcHRzKSBhbmQgbm90ICgiLS1mZXRj aG9ubHkiIGluIHNlbGYubXlvcHRzIG9yICItLWZldGNoLWFsbC11cmkiIGluIHNlbGYubXlv cHRzKSkgb3IgKCItLWFzayIgaW4gc2VsZi5teW9wdHMpOgoJCQkJaWYgIi0tdHJlZSIgaW4g c2VsZi5teW9wdHM6CgkJCQkJcHJpbnQKCQkJCQlwcmludCBkYXJrZ3JlZW4oIlRoZXNlIGFy ZSB0aGUgcGFja2FnZXMgdGhhdCBJIHdvdWxkIG1lcmdlLCBpbiByZXZlcnNlIG9yZGVyOiIp CgkJCQkJcHJpbnQKCQkJCWVsc2U6CgkJCQkJcHJpbnQKCQkJCQlwcmludCBkYXJrZ3JlZW4o IlRoZXNlIGFyZSB0aGUgcGFja2FnZXMgdGhhdCBJIHdvdWxkIG1lcmdlLCBpbiBvcmRlcjoi KQoJCQkJCXByaW50CgkJCgkJCWlmICgiLS1yZXN1bWUiIGluIHNlbGYubXlvcHRzKSBhbmQg cG9ydGFnZS5tdGltZWRiLmhhc19rZXkoInJlc3VtZSIpOgoJCQkJbXlyZXN1bWVvcHRzPXBv cnRhZ2UubXRpbWVkYlsicmVzdW1lIl1bIm15b3B0cyJdWzpdCgkJCgkJCQl3aGlsZSAiLS1z a2lwZmlyc3QiIGluIG15cmVzdW1lb3B0czoKCQkJCQlteXJlc3VtZW9wdHMucmVtb3ZlKCIt LXNraXBmaXJzdCIpCgkJCQl3aGlsZSAiLS1hc2siIGluIG15cmVzdW1lb3B0czoKCQkJCQlt eXJlc3VtZW9wdHMucmVtb3ZlKCItLWFzayIpCgkJCQkJCgkJCQlmb3IgbXlvcHQgaW4gc2Vs Zi5teW9wdHM6CgkJCQkJaWYgbXlvcHQgbm90IGluIG15cmVzdW1lb3B0czoKCQkJCQkJbXly ZXN1bWVvcHRzLmFwcGVuZChteW9wdCkKCQkJCXNlbGYubXlvcHRzPW15cmVzdW1lb3B0cwoJ CQkJbXlkZXBncmFwaD1kZXBncmFwaCgicmVzdW1lIixzZWxmLm15b3B0cyxzZWxmLm15cGFy YW1zLHNlbGYuZWRlYnVnLHNlbGYudmVyYm9zaXR5LHNlbGYuRU1FUkdFX1dBUk5JTkdfREVM QVksc2VsZi5zcGlubmVyKQoJCQkJaWYgIi0tcmVzdW1lIiBub3QgaW4gc2VsZi5teW9wdHM6 CgkJCQkJc2VsZi5teW9wdHMrPVsiLS1yZXN1bWUiXQoJCQllbHNlOgoJCQkJaWYgKCItLXJl c3VtZSIgaW4gc2VsZi5teW9wdHMpOgoJCQkJCWRlbCBzZWxmLm15b3B0c1tzZWxmLm15b3B0 cy5pbmRleCgiLS1yZXN1bWUiKV0KCQkJCQlwcmludCBkYXJrZ3JlZW4oImVtZXJnZTogSXQg c2VlbXMgd2UgaGF2ZSBub3RoaW5nIHRvIHJlc3VtZS4uLiIpCgkJCQkJc3lzLmV4aXQoMCkK CQkKCQkJCW15ZGVwZ3JhcGg9ZGVwZ3JhcGgoc2VsZi5teWFjdGlvbixzZWxmLm15b3B0cyxz ZWxmLm15cGFyYW1zLHNlbGYuZWRlYnVnLHNlbGYudmVyYm9zaXR5LHNlbGYuRU1FUkdFX1dB Uk5JTkdfREVMQVksc2VsZi5zcGlubmVyKQoJCQkJaWYgc2VsZi5teWFjdGlvbiBpbiBbInN5 c3RlbSIsIndvcmxkIl06CgkJCQkJcHJpbnQgIkNhbGN1bGF0aW5nIixzZWxmLm15YWN0aW9u LCJkZXBlbmRlbmNpZXMgICIsCgkJCQkJc3lzLnN0ZG91dC5mbHVzaCgpCgkJCQkJaWYgbm90 IG15ZGVwZ3JhcGgueGNyZWF0ZShzZWxmLm15YWN0aW9uKToKCQkJCQkJcHJpbnQgIiEhISBE ZXBncmFwaCBjcmVhdGlvbiBmYWlsZWQuIgoJCQkJCQlzeXMuZXhpdCgxKQoJCQkJCXByaW50 ICJcYlxiIC4uLmRvbmUhIgoJCQkJZWxzZToKCQkJCQlpZiBub3Qgc2VsZi5teWZpbGVzOgoJ CQkJCQlwcmludCAiZW1lcmdlOiBwbGVhc2UgdGVsbCBtZSB3aGF0IHRvIGRvLiIKCQkJCQkJ c2VsZi5oZWxwKCkKCQkJCQkJc3lzLmV4aXQoMSkKCQkJCQkJI3dlIGRvbid0IGhhdmUgYW55 IGZpbGVzIHRvIHByb2Nlc3M7IHNraXAgdGhpcyBzdGVwIGFuZCBleGl0CgkJCQkJcHJpbnQg IkNhbGN1bGF0aW5nIGRlcGVuZGVuY2llcyAgIiwKCQkJCQlzeXMuc3Rkb3V0LmZsdXNoKCkK CQkJCQlyZXR2YWwsZmF2b3JpdGVzPW15ZGVwZ3JhcGguc2VsZWN0X2ZpbGVzKHNlbGYubXlm aWxlcykKCQkJCQlpZiBub3QgcmV0dmFsOgoJCQkJCQlzeXMuZXhpdCgxKQoJCQkJCXByaW50 ICJcYlxiIC4uLmRvbmUhIgoJCQoJCQkJCWlmICgiLS11c2Vwa2dvbmx5IiBpbiBzZWxmLm15 b3B0cykgYW5kIG15ZGVwZ3JhcGgubWlzc2luZ2JpbnM6CgkJCQkJCXN5cy5zdGRlcnIud3Jp dGUocmVkKCJUaGUgZm9sbG93aW5nIGJpbmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBt ZXJnaW5nLi4uXG4iKSkKCQkKCQkJCWlmIG15ZGVwZ3JhcGgubWlzc2luZ2JpbnM6CgkJCQkJ Zm9yIHggaW4gbXlkZXBncmFwaC5taXNzaW5nYmluczoKCQkJCQkJc3lzLnN0ZGVyci53cml0 ZSgiICAgIitzdHIoeCkrIlxuIikKCQkJCQlzeXMuc3RkZXJyLndyaXRlKCJcblRoZXNlIGFy ZSByZXF1aXJlZCBieSAnLS11c2Vwa2dvbmx5JyAtLSBUZXJtaW5hdGluZy5cblxuIikKCQkJ CQlzeXMuZXhpdCgxKQoJCQoJCQlpZiAiLS1hc2siIGluIHNlbGYubXlvcHRzOgoJCQkJaWYg Ii0tcmVzdW1lIiBpbiBzZWxmLm15b3B0czoKCQkJCQlteWRlcGdyYXBoLmRpc3BsYXkocG9y dGFnZS5tdGltZWRiWyJyZXN1bWUiXVsibWVyZ2VsaXN0Il0pCgkJCQkJcHJvbXB0PSJEbyB5 b3Ugd2FudCBtZSB0byByZXN1bWUgbWVyZ2luZyB0aGVzZSBwYWNrYWdlcz8iCgkJCQllbHNl OgoJCQkJCWdyYXBoZGlzcCA9IGdyYXBoX2Rpc3BsYXkobXlkZXBncmFwaC5teW5ld2dyYXBo LHNlbGYubXlvcHRzLHNlbGYuZWRlYnVnLHNlbGYudmVyYm9zaXR5KQoJCQkJCWlmICItLXRy ZWUiIGluIHNlbGYubXlvcHRzOgoJCQkJCQlncmFwaGRpc3AuZGlzcGxheV90cmVlKCkKCQkJ CQllbGlmICItLWNvbHVtbnMiIGluIHNlbGYubXlvcHRzOgoJCQkJCQlncmFwaGRpc3AuZGlz cGxheV9jb2x1bW5zKCkKCQkJCQllbHNlOgoJCQkJCQlncmFwaGRpc3AuZGlzcGxheV9mbGF0 KCkKCQkJCQltZXJnZWNvdW50PTAKCQkJCQlmb3IgeCBpbiBteWRlcGdyYXBoLmFsdGxpc3Qo KToKCQkJCQkJaWYgeFszXSE9Im5vbWVyZ2UiOgoJCQkJCQkJbWVyZ2Vjb3VudCs9MQoJCQkJ CQkjY2hlY2sgZm9yIGJsb2NraW5nIGRlcGVuZGVuY2llcwoJCQkJCQlpZiB4WzBdPT0iYmxv Y2tzIjoKCQkJCQkJCXByaW50ICJcbiEhISBFcnJvcjogVGhlIGFib3ZlIHBhY2thZ2UgbGlz dCBjb250YWlucyBwYWNrYWdlcyB3aGljaCBjYW5ub3QgYmUgaW5zdGFsbGVkIgoJCQkJCQkJ cHJpbnQgICAiISEhICAgICAgICBvbiB0aGUgc2FtZSBzeXN0ZW0uIgoJCQkJCQkJcHJpbnQK CQkJCQkJCXN5cy5leGl0KDEpCgkJCQkJaWYgbWVyZ2Vjb3VudD09MDoKCQkJCQkJcHJvbXB0 PSJOb3RoaW5nIHRvIG1lcmdlOyBkbyB5b3Ugd2FudCBtZSB0byBhdXRvLWNsZWFuIHBhY2th Z2VzPyIKCQkJCQllbGlmICItLWZldGNob25seSIgaW4gc2VsZi5teW9wdHMgb3IgIi0tZmV0 Y2gtYWxsLXVyaSIgaW4gc2VsZi5teW9wdHM6CgkJCQkJCXByb21wdD0iRG8geW91IHdhbnQg bWUgdG8gZmV0Y2ggdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlc2UgcGFja2FnZXM/IgoJCQkJ CWVsc2U6CgkJCQkJCXByb21wdD0iRG8geW91IHdhbnQgbWUgdG8gbWVyZ2UgdGhlc2UgcGFj a2FnZXM/IgoJCQkJcHJpbnQKCQkJCWlmIHVzZXJxdWVyeShwcm9tcHQpPT0iTm8iOgoJCQkJ CXByaW50CgkJCQkJcHJpbnQgIlF1aXR0aW5nLiIKCQkJCQlwcmludAoJCQkJCXN5cy5leGl0 KDApCgkJCQkjIERvbid0IGFzayBhZ2FpbiAoZS5nLiB3aGVuIGF1dG8tY2xlYW5pbmcgcGFj a2FnZXMgYWZ0ZXIgbWVyZ2UpCgkJCQlzZWxmLm15b3B0cy5yZW1vdmUoIi0tYXNrIikKCQkK CQkJaWYgKCItLXByZXRlbmQiIGluIHNlbGYubXlvcHRzKSBhbmQgbm90ICgiLS1mZXRjaG9u bHkiIGluIHNlbGYubXlvcHRzIG9yICItLWZldGNoLWFsbC11cmkiIGluIHNlbGYubXlvcHRz KToKCQkJCWlmICgiLS1yZXN1bWUiIGluIHNlbGYubXlvcHRzKToKCQkJCQlteWRlcGdyYXBo LmRpc3BsYXkocG9ydGFnZS5tdGltZWRiWyJyZXN1bWUiXVsibWVyZ2VsaXN0Il0pCgkJCQll bHNlOgoJCQkJCWdyYXBoZGlzcCA9IGdyYXBoX2Rpc3BsYXkobXlkZXBncmFwaC5teW5ld2dy YXBoLHNlbGYubXlvcHRzLHNlbGYuZWRlYnVnLHNlbGYudmVyYm9zaXR5KQoJCQkJCWlmICIt LXRyZWUiIGluIHNlbGYubXlvcHRzOgoJCQkJCQlncmFwaGRpc3AuZGlzcGxheV90cmVlKCkK CQkJCQllbGlmICItLWNvbHVtbnMiIGluIHNlbGYubXlvcHRzOgoJCQkJCQlncmFwaGRpc3Au ZGlzcGxheV9jb2x1bW5zKCkKCQkJCQllbHNlOgoJCQkJCQlncmFwaGRpc3AuZGlzcGxheV9m bGF0KCkKCQkJZWxzZToKCQkJCWlmICgiLS1idWlsZHBrZ29ubHkiIGluIHNlbGYubXlvcHRz KToKCQkJCQloYXNfZGVwcyA9IEZhbHNlCgkJCQkJZm9yIG5vZGUgaW4gbXlkZXBncmFwaC5t eW5ld2dyYXBoLmdldF9hbGxfbm9kZXMoKToKCQkJCQkJaWYgbXlkZXBncmFwaC5teW5ld2dy YXBoLmdldF9yZWxhdGlvbnNoaXBzKG5vZGUpWzBdOgoJCQkJCQkJaGFzX2RlcHMgPSBUcnVl CgkJCQkJaWYgaGFzX2RlcHM6CgkJCQkJCXByaW50ICJcbiEhISAtLWJ1aWxkcGtnb25seSBy ZXF1aXJlcyBhbGwgZGVwZW5kZW5jaWVzIHRvIGJlIG1lcmdlZC4iCgkJCQkJCXByaW50ICIh ISEgQ2Fubm90IG1lcmdlIHJlcXVlc3RlZCBwYWNrYWdlcy4gTWVyZ2UgZGVwcyBhbmQgdHJ5 IGFnYWluLlxuIgoJCQkJCQlzeXMuZXhpdCgxKQoJCQoJCQkJaWYgKCItLXJlc3VtZSIgaW4g c2VsZi5teW9wdHMpOgoJCQkJCW15ZGVwZ3JhcGgubWVyZ2UocG9ydGFnZS5tdGltZWRiWyJy ZXN1bWUiXVsibWVyZ2VsaXN0Il0scG9ydGFnZS5tdGltZWRiWyJyZXN1bWUiXVsiZmF2b3Jp dGVzIl0pCgkJCQllbHNlOgoJCQkJCXBvcnRhZ2UubXRpbWVkYlsicmVzdW1lIl09e30KCQkJ CQlwb3J0YWdlLm10aW1lZGJbInJlc3VtZSJdWyJteW9wdHMiXT1zZWxmLm15b3B0cwoJCQkJ CXBvcnRhZ2UubXRpbWVkYlsicmVzdW1lIl1bImZhdm9yaXRlcyJdPWZhdm9yaXRlcwoJCQkJ CWlmICgiLS1kaWdlc3QiIGluIHNlbGYubXlvcHRzKSBhbmQgbm90ICgiLS1mZXRjaG9ubHki IGluIHNlbGYubXlvcHRzIG9yICItLWZldGNoLWFsbC11cmkiIGluIHNlbGYubXlvcHRzKToK CQkJCQkJZm9yIHBrZ2xpbmUgaW4gbXlkZXBncmFwaC5hbHRsaXN0KCk6CgkJCQkJCQlpZiBw a2dsaW5lWzBdPT0iZWJ1aWxkIiBhbmQgcGtnbGluZVszXT09Im1lcmdlIjoKCQkJCQkJCQl5 PXBvcnRhZ2UucG9ydGRiLmZpbmRuYW1lKHBrZ2xpbmVbMl0pCgkJCQkJCQkJdG1wc2V0dGlu Z3MgPSBwb3J0YWdlLmNvbmZpZyhjbG9uZT1wb3J0YWdlLnNldHRpbmdzKQoJCQkJCQkJCXJl dHZhbD1wb3J0YWdlLmRvZWJ1aWxkKHksImRpZ2VzdCIscG9ydGFnZS5yb290LHRtcHNldHRp bmdzLHNlbGYuZWRlYnVnLCgiLS1wcmV0ZW5kIiBpbiBzZWxmLm15b3B0cykpCgkJCQkJbXlk ZXBncmFwaC5tZXJnZShteWRlcGdyYXBoLmFsdGxpc3QoKSxmYXZvcml0ZXMpCgkJCgkJCQlp ZiBwb3J0YWdlLm10aW1lZGIuaGFzX2tleSgicmVzdW1lIik6CgkJCQkJZGVsIHBvcnRhZ2Uu bXRpbWVkYlsicmVzdW1lIl0KCQkJCXByaW50ICI+Pj4gQXV0by1jbGVhbmluZyBwYWNrYWdl cyAuLi4iCgkJCQlzZWxmLnVubWVyZ2UoImNsZWFuIiwgWyJ3b3JsZCJdKQoJCQlzZWxmLnBv c3RfZW1lcmdlKCkKCglkZWYgcG9zdF9lbWVyZ2Uoc2VsZixyZXR2YWw9MCk6CgkJb3MuY2hk aXIoIi8iKQoJCWlmICItLXByZXRlbmQiIGluIHNlbGYubXlvcHRzOgoJCQlzeXMuZXhpdChy ZXR2YWwpCgkKCQlzZWxmLmVtZXJnZWxvZygiICoqKiBleGl0aW5nIHN1Y2Nlc3NmdWxseS4i KQoJCgkJaWYgIm5vaW5mbyIgbm90IGluIHBvcnRhZ2Uuc2V0dGluZ3MuZmVhdHVyZXM6CgkJ CWNoa191cGRhdGVkX2luZm9fZmlsZXMoKQoJCgkJY2hrX3VwZGF0ZWRfY2ZnX2ZpbGVzKCkK CQoJCXN5cy5leGl0KHJldHZhbCkKCglkZWYgdW5tZXJnZShzZWxmLHVubWVyZ2VfYWN0aW9u LHVubWVyZ2VfZmlsZXMpOgoJCXJldHVybiB1bm1lcmdlKHNlbGYubXlvcHRzLCBzZWxmLmVk ZWJ1Zywgc2VsZi5FTUVSR0VfV0FSTklOR19ERUxBWSwgdW5tZXJnZV9hY3Rpb24sIHVubWVy Z2VfZmlsZXMpCgoJZGVmIGV4aXQoc2VsZik6CgkJIiIiVGhpcyBnZXRzIG91dCBmaW5hbCBs b2cgbWVzc2FnZSBpbiBiZWZvcmUgd2UgcXVpdC4iIiIKCQlpZiAiLS1wcmV0ZW5kIiBub3Qg aW4gc2VsZi5teW9wdHM6CgkJCXNlbGYuZW1lcmdlbG9nKCIgKioqIHRlcm1pbmF0aW5nLiIp CgkJaWYgIm5vdGl0bGVzIiBub3QgaW4gcG9ydGFnZS5mZWF0dXJlczoKCQkJeHRlcm1UaXRs ZVJlc2V0KCkKCmlmIF9fbmFtZV9fPT0iX19tYWluX18iOgoJY21kPWVtZXJnZV9jbWQoKQoJ ZGVmIGVtZXJnZWV4aXQoKToKCQljbWQuZXhpdCgpCglhdGV4aXQucmVnaXN0ZXIoZW1lcmdl ZXhpdCkKCWNtZC5wYXJzZV9hcmdzKHN5cy5hcmd2KQoJY21kLnBlcmZvcm0oKQo= --------------060708010309040903070809-- -- gentoo-portage-dev@gentoo.org mailing list