From 747f359f14650a11fb7767e67717a755376ba41e Mon Sep 17 00:00:00 2001 From: Fabio Boi Date: Sun, 4 Oct 2026 11:39:31 +0200 Subject: [PATCH] Add interactive LXC enrollment with Headscale, Tailscale SSH and Wazuh --- lxc-enroll.sh | 1 + 1 file changed, 1 insertion(+) create mode 100644 lxc-enroll.sh diff --git a/lxc-enroll.sh b/lxc-enroll.sh new file mode 100644 index 0000000..dd2a481 --- /dev/null +++ b/lxc-enroll.sh @@ -0,0 +1 @@ +IyEvdXNyL2Jpbi9lbnYgYmFzaAojIFJ1biBhcyByb290IG9uIGEgUHJveG1veCBob3N0LiBObyBjcmVkZW50aWFscyBvciBzaXRlLXNwZWNpZmljIGFkZHJlc3NlcyBoZXJlLgpzZXQgLUVldW8gcGlwZWZhaWwKc2V0ICt4CnVtYXNrIDA3NwoKZmFpbCgpIHsgcHJpbnRmICdGRUhMRVI6ICVzXG4nICIkKiIgPiYyOyBleGl0IDE7IH0Kc2F5KCkgeyBwcmludGYgJyVzXG4nICIkKiI7IH0KYXNrKCkgeyBwcmludGYgJyVzICcgIiQxIiA+JjI7IElGUz0gcmVhZCAtciBSRVBMWSA8JjMgfHwgZmFpbCAnRWluZ2FiZSBhYmdlYnJvY2hlbi4nOyB9CnNlY3JldCgpIHsKICBwcmludGYgJyVzICcgIiQxIiA+JjIKICBJRlM9IHJlYWQgLXIgLXMgUkVQTFkgPCYzIHx8IGZhaWwgJ0VpbmdhYmUgYWJnZWJyb2NoZW4uJwogIHByaW50ZiAnXG4nID4mMgp9Cmluc3RhbGxlZF9sYWJlbCgpIHsgaWYgW1sgJDEgPT0gMSBdXTsgdGhlbiBwcmludGYgJ3ZvcmhhbmRlbic7IGVsc2UgcHJpbnRmICdmZWhsdCc7IGZpOyB9CgpMSVNUPTA7IERSWT0wOyBNQU5BR0VSPScnOyBWRVJTSU9OPScnOyBMT0dJTl9TRVJWRVI9Jyc7IFNFTEVDVElPTj0nJzsgVkVSU0lPTl9FWFBMSUNJVD0wClNTSF9FTkFCTEVEPTE7IFNTSF9VU0VSPScnOyBTU0hfU1VETz0wOyBTU0hfTk9QQVNTV0Q9MDsgU0FWRV9TRVRUSU5HUz0xClZBUlNfRklMRT0vZXRjL2x4Yy1lbnJvbGwvLnZhcnMKd2hpbGUgW1sgJCMgLWd0IDAgXV07IGRvCiAgY2FzZSAiJDEiIGluCiAgICAtLWxpc3QpIExJU1Q9MTsgc2hpZnQgOzsKICAgIC0tZHJ5LXJ1bikgRFJZPTE7IHNoaWZ0IDs7CiAgICAtLW1hbmFnZXJ8LS1hZ2VudC12ZXJzaW9ufC0tbG9naW4tc2VydmVyfC0tc2VsZWN0KQogICAgICBbWyAkIyAtZ2UgMiAmJiAtbiAkMiBdXSB8fCBmYWlsICJXZXJ0IGZlaGx0OiAkMSIKICAgICAgY2FzZSAiJDEiIGluCiAgICAgICAgLS1tYW5hZ2VyKSBNQU5BR0VSPSQyOzsgLS1hZ2VudC12ZXJzaW9uKSBWRVJTSU9OPSQyOyBWRVJTSU9OX0VYUExJQ0lUPTE7OwogICAgICAgIC0tbG9naW4tc2VydmVyKSBMT0dJTl9TRVJWRVI9JDI7OyAtLXNlbGVjdCkgU0VMRUNUSU9OPSQyOzsKICAgICAgZXNhYwogICAgICBzaGlmdCAyIDs7CiAgICAtLWhlbHB8LWgpCiAgICAgIGNhdCA8PCdIRUxQJwpBdWYgZGVtIFByb3htb3gtSG9zdCBhbHMgcm9vdCBzdGFydGVuOgogIGJhc2ggbHhjLWVucm9sbC5zaAogIGJhc2ggbHhjLWVucm9sbC5zaCAtLWxpc3QKICBiYXNoIGx4Yy1lbnJvbGwuc2ggLS1kcnktcnVuIC0tc2VsZWN0ICcxMDYgMTA3JwpPcHRpb25lbjogLS1tYW5hZ2VyIElQL05BTUUgLS1hZ2VudC12ZXJzaW9uIFZFUlNJT04gLS1sb2dpbi1zZXJ2ZXIgSFRUUFMtVVJMCiAgICAgICAgICAtLXNlbGVjdCAnQ1RJRCBDVElEJyAtLWxpc3QgLS1kcnktcnVuCk51ciBsYXVmZW5kZSBEZWJpYW4tL1VidW50dS1MWENzIG1pdCBzeXN0ZW1kLiBWb3JoYW5kZW5lIFRhaWxzY2FsZS0vV2F6dWgtClJlZ2lzdHJpZXJ1bmdlbiBibGVpYmVuIHVudmVyYWVuZGVydC4gT3B0aW9uYWwgVGFpbHNjYWxlIFNTSC9OdXR6ZXIvU3VkbyBmdWVyIGRpZSBBdXN3YWhsLgpMb2thbGUgRWluc3RlbGx1bmdlbjogL2V0Yy9seGMtZW5yb2xsLy52YXJzIChKU09OLCBvaG5lIEdlaGVpbW5pc3NlKS4KS2VpbmUgSG9zdC1BZ2VudC1JbnN0YWxsYXRpb24uIEdlaGVpbW5pc3NlIHdlcmRlbiBsb2thbCBhYmdlZnJhZ3QuCkhFTFAKICAgICAgZXhpdCAwIDs7CiAgICAqKSBmYWlsICJVbmJla2FubnRlIE9wdGlvbjogJDEiIDs7CiAgZXNhYwpkb25lCltbICRFVUlEID09IDAgXV0gfHwgZmFpbCAnQml0dGUgYXVmIGRlbSBQcm94bW94LUhvc3QgYWxzIHJvb3Qgc3RhcnRlbi4nCmZvciB0b29sIGluIHBjdCB0aW1lb3V0IHB5dGhvbjM7IGRvIGNvbW1hbmQgLXYgIiR0b29sIiA+L2Rldi9udWxsIHx8IGZhaWwgIiR0b29sIGZlaGx0IGF1ZiBkZW0gSG9zdC4iOyBkb25lCgpkZWNsYXJlIC1hIElEUz0oKSBOQU1FUz0oKSBUUz0oKSBXWj0oKSBUVU49KCkgTUFOQUdFUlM9KCkgU0VMRUNURUQ9KCkgUkVNT1RFX0RJUlM9KCkKVE1QPScnCmNsZWFudXAoKSB7CiAgbG9jYWwgaWQgZGlyCiAgZm9yIGlkIGluICIke1NFTEVDVEVEW0BdfSI7IGRvCiAgICBkaXI9JHtSRU1PVEVfRElSU1skaWRdOi19CiAgICBpZiBbWyAkZGlyID1+IF4vcnVuL2x4Yy1lbnJvbGxcLltBLVphLXowLTldKyQgXV07IHRoZW4KICAgICAgdGltZW91dCAxNSBwY3QgZXhlYyAiJGlkIiAtLSBybSAtcmYgLS0gIiRkaXIiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKICBbWyAteiAkVE1QIF1dIHx8IHJtIC1yZiAtLSAiJFRNUCIKfQp0cmFwIGNsZWFudXAgRVhJVAp0cmFwICdleGl0IDEzMCcgSU5UCnRyYXAgJ2V4aXQgMTQzJyBURVJNCgp5ZXNfbm8oKSB7CiAgbG9jYWwgcHJvbXB0PSQxIGRlZmF1bHQ9JDIKICBhc2sgIiRwcm9tcHQiCiAgY2FzZSAiJFJFUExZIiBpbiAnJyApIFJFUExZPSRkZWZhdWx0OzsganxKfGphfEphfHl8WXx5ZXN8WWVzKSBSRVBMWT0xOzsgbnxOfG5laW58TmVpbnxub3xObykgUkVQTFk9MDs7ICopIGZhaWwgJ0JpdHRlIGogb2RlciBuIGVpbmdlYmVuLic7OyBlc2FjCn0KCmxvYWRfc2V0dGluZ3MoKSB7CiAgbG9jYWwgZmllbGRzIGtleSB2YWx1ZQogIFtbICEgLWUgJFZBUlNfRklMRSAmJiAhIC1MICRWQVJTX0ZJTEUgXV0gJiYgcmV0dXJuIDAKICB5ZXNfbm8gJ0dlc3BlaWNoZXJ0ZSBFaW5zdGVsbHVuZ2VuIGF1cyAvZXRjL2x4Yy1lbnJvbGwvLnZhcnMgdmVyd2VuZGVuPyBbSi9uXScgMQogIFtbICRSRVBMWSA9PSAxIF1dIHx8IHJldHVybiAwCiAgIyBKU09OIGRhdGEsIG5ldmVyIHNvdXJjZS9ldmFsLiBSZWplY3Qgbm9uLXJvb3Qtb3duZWQgb3Igd3JpdGFibGUgc2V0dGluZ3MuCiAgZmllbGRzPSQocHl0aG9uMyAtICIkVkFSU19GSUxFIiA8PCdQWScKaW1wb3J0IGpzb24sIG9zLCBzdGF0LCBzeXMKcD1zeXMuYXJndlsxXTsgcz1vcy5sc3RhdChwKQppZiBub3Qgc3RhdC5TX0lTUkVHKHMuc3RfbW9kZSkgb3Igcy5zdF91aWQgIT0gMCBvciBzdGF0LlNfSU1PREUocy5zdF9tb2RlKSAmIDBvMDc3OgogICAgc3lzLmV4aXQoJ1Vuc2ljaGVyZSBSZWNodGUgZGVyIC52YXJzOiByZWd1bGFlcmUgRGF0ZWksIHJvb3QsIE1vZHVzIDYwMCBlcmZvcmRlcmxpY2guJykKZD1qc29uLmxvYWQob3BlbihwKSkKZm9yIGsgaW4gKCdtYW5hZ2VyJywnYWdlbnRfdmVyc2lvbicsJ2xvZ2luX3NlcnZlcicsJ3NzaF9lbmFibGVkJywnc3NoX3VzZXInLCdzc2hfc3VkbycsJ3NzaF9ub3Bhc3N3ZCcpOgogICAgdj1kLmdldChrLCcnKQogICAgaWYgbm90IGlzaW5zdGFuY2UodixzdHIpIG9yIGFueShjIGluIHYgZm9yIGMgaW4gJ1xuXHJcdFwwJykgb3IgbGVuKHYpPjE2Mzg0OgogICAgICAgIHN5cy5leGl0KCdVbmd1ZWx0aWdlIC52YXJzLicpCiAgICBwcmludChrKydcdCcrdikKUFkKICApIHx8IGZhaWwgJ0dlc3BlaWNoZXJ0ZSBFaW5zdGVsbHVuZ2VuIGtvbm50ZW4gbmljaHQgc2ljaGVyIGdlbGVzZW4gd2VyZGVuLicKICB3aGlsZSBJRlM9JCdcdCcgcmVhZCAtciBrZXkgdmFsdWU7IGRvCiAgICBjYXNlICIka2V5IiBpbgogICAgICBtYW5hZ2VyKSBbWyAtbiAkTUFOQUdFUiBdXSB8fCBNQU5BR0VSPSR2YWx1ZTs7CiAgICAgIGFnZW50X3ZlcnNpb24pIFtbIC1uICRWRVJTSU9OIF1dIHx8IFZFUlNJT049JHZhbHVlOzsKICAgICAgbG9naW5fc2VydmVyKSBbWyAtbiAkTE9HSU5fU0VSVkVSIF1dIHx8IExPR0lOX1NFUlZFUj0kdmFsdWU7OwogICAgICBzc2hfZW5hYmxlZCkgW1sgJHZhbHVlID1+IF5bMDFdJCBdXSB8fCBmYWlsICdVbmd1ZWx0aWdlIFNTSC1FaW5zdGVsbHVuZy4nOyBTU0hfRU5BQkxFRD0kdmFsdWU7OwogICAgICBzc2hfdXNlcikgU1NIX1VTRVI9JHZhbHVlOzsKICAgICAgc3NoX3N1ZG8pIFtbICR2YWx1ZSA9fiBeWzAxXSQgXV0gfHwgZmFpbCAnVW5ndWVsdGlnZSBTdWRvLUVpbnN0ZWxsdW5nLic7IFNTSF9TVURPPSR2YWx1ZTs7CiAgICAgIHNzaF9ub3Bhc3N3ZCkgW1sgJHZhbHVlID1+IF5bMDFdJCBdXSB8fCBmYWlsICdVbmd1ZWx0aWdlIFN1ZG8tRWluc3RlbGx1bmcuJzsgU1NIX05PUEFTU1dEPSR2YWx1ZTs7CiAgICBlc2FjCiAgZG9uZSA8PDwiJGZpZWxkcyIKfQoKc2F2ZV9zZXR0aW5ncygpIHsKICBbWyAkU0FWRV9TRVRUSU5HUyA9PSAxIF1dIHx8IHJldHVybiAwCiAgaW5zdGFsbCAtZCAtbSA3MDAgL2V0Yy9seGMtZW5yb2xsCiAgcHl0aG9uMyAtICIkVkFSU19GSUxFIiAiJE1BTkFHRVIiICIkVkVSU0lPTiIgIiRMT0dJTl9TRVJWRVIiICIkU1NIX0VOQUJMRUQiICIkU1NIX1VTRVIiICIkU1NIX1NVRE8iICIkU1NIX05PUEFTU1dEIiA8PCdQWScKaW1wb3J0IGpzb24sIG9zLCBzeXMsIHRlbXBmaWxlCnA9c3lzLmFyZ3ZbMV0Ka2V5cz0oJ21hbmFnZXInLCdhZ2VudF92ZXJzaW9uJywnbG9naW5fc2VydmVyJywnc3NoX2VuYWJsZWQnLCdzc2hfdXNlcicsJ3NzaF9zdWRvJywnc3NoX25vcGFzc3dkJykKZmQsdG1wPXRlbXBmaWxlLm1rc3RlbXAocHJlZml4PScudmFycy4nLGRpcj1vcy5wYXRoLmRpcm5hbWUocCkpCnRyeToKICAgIG9zLmZjaG1vZChmZCwwbzYwMCkKICAgIHdpdGggb3MuZmRvcGVuKGZkLCd3JykgYXMgZjoganNvbi5kdW1wKGRpY3QoemlwKGtleXMsc3lzLmFyZ3ZbMjpdKSksZixpbmRlbnQ9Mik7IGYud3JpdGUoJ1xuJykKICAgIG9zLnJlcGxhY2UodG1wLHApCmZpbmFsbHk6CiAgICBpZiBvcy5wYXRoLmV4aXN0cyh0bXApOiBvcy51bmxpbmsodG1wKQpQWQogIHNheSAnRWluc3RlbGx1bmdlbiBvaG5lIEdlaGVpbW5pc3NlIGdlc3BlaWNoZXJ0OiAvZXRjL2x4Yy1lbnJvbGwvLnZhcnMnCn0KCnNjYW4oKSB7CiAgbG9jYWwgcm93cyBpZCBzdGF0dXMgcmVzdCBjb25maWcgbWV0YSBuYW1lIG9zIGNvZGVuYW1lIHRzIHd6IG1nciB0dW4gaW5pdAogIHJvd3M9JChwY3QgbGlzdCkgfHwgZmFpbCAnQ29udGFpbmVybGlzdGUga29ubnRlIG5pY2h0IGdlbGVzZW4gd2VyZGVuLicKICB3aGlsZSByZWFkIC1yIGlkIHN0YXR1cyByZXN0OyBkbwogICAgW1sgJGlkID1+IF5bMS05XVswLTldKiQgXV0gfHwgY29udGludWUKICAgIGlmIFtbICRzdGF0dXMgIT0gcnVubmluZyBdXTsgdGhlbiBzYXkgIlVlYmVyc3BydW5nZW46IExYQyAkaWQgKCRzdGF0dXMpLiI7IGNvbnRpbnVlOyBmaQogICAgY29uZmlnPSQocGN0IGNvbmZpZyAiJGlkIikgfHwgeyBzYXkgIlVlYmVyc3BydW5nZW46IExYQyAkaWQgKEtvbmZpZ3VyYXRpb24gbmljaHQgbGVzYmFyKS4iOyBjb250aW51ZTsgfQogICAgaWYgZ3JlcCAtcSAnXmxvY2s6JyA8PDwiJGNvbmZpZyI7IHRoZW4gc2F5ICJVZWJlcnNwcnVuZ2VuOiBMWEMgJGlkIChnZXNwZXJydCkuIjsgY29udGludWU7IGZpCiAgICBtZXRhPSQodGltZW91dCAyMCBwY3QgZXhlYyAiJGlkIiAtLSBzaCAtcyA8PCdQUk9CRScKc2V0IC1ldQppc19pbnN0YWxsZWQoKSB7IFsgIiQoZHBrZy1xdWVyeSAtVyAtZj0nJHtTdGF0dXN9JyAiJDEiIDI+L2Rldi9udWxsIHx8IHRydWUpIiA9ICdpbnN0YWxsIG9rIGluc3RhbGxlZCcgXTsgfQouIC9ldGMvb3MtcmVsZWFzZQp0cz0wOyB3ej0wOyBtZ3I9MDsgdHVuPTA7IGluaXQ9MAppZiBjb21tYW5kIC12IHRhaWxzY2FsZSA+L2Rldi9udWxsIDI+JjEgfHwgaXNfaW5zdGFsbGVkIHRhaWxzY2FsZTsgdGhlbiB0cz0xOyBmaQppZiBbIC14IC92YXIvb3NzZWMvYmluL3dhenVoLWFnZW50ZCBdIHx8IGlzX2luc3RhbGxlZCB3YXp1aC1hZ2VudDsgdGhlbiB3ej0xOyBmaQppZiBbIC14IC92YXIvb3NzZWMvYmluL3dhenVoLW1hbmFnZXJkIF0gfHwgaXNfaW5zdGFsbGVkIHdhenVoLW1hbmFnZXI7IHRoZW4gbWdyPTE7IHd6PTE7IGZpClsgISAtYyAvZGV2L25ldC90dW4gXSB8fCB0dW49MQpbICEgLWQgL3J1bi9zeXN0ZW1kL3N5c3RlbSBdIHx8IGluaXQ9MQpwcmludGYgJyVzfCVzfCVzfCVzfCVzfCVzfCVzfCVzfCVzXG4nICIkKGhvc3RuYW1lKSIgIiRJRCIgIiR7VkVSU0lPTl9DT0RFTkFNRTotdW5rbm93bn0iICIkdHMiICIkd3oiICIkbWdyIiAiJHR1biIgIiRpbml0IiBkb25lClBST0JFCiAgICApIHx8IHsgc2F5ICJVZWJlcnNwcnVuZ2VuOiBMWEMgJGlkIChQcnVlZnVuZyBmZWhsZ2VzY2hsYWdlbikuIjsgY29udGludWU7IH0KICAgIElGUz0nfCcgcmVhZCAtciBuYW1lIG9zIGNvZGVuYW1lIHRzIHd6IG1nciB0dW4gaW5pdCByZXN0IDw8PCIkbWV0YSIKICAgIFtbICRtZ3IgPT0gMCBdXSB8fCBNQU5BR0VSUys9KCIkaWQiKQogICAgaWYgW1sgJHJlc3QgIT0gZG9uZSB8fCAkaW5pdCAhPSAxIHx8ICEgJG9zID1+IF4oZGViaWFufHVidW50dSkkIHx8ICEgJGNvZGVuYW1lID1+IF5bYS16XSskIF1dOyB0aGVuCiAgICAgIHNheSAiVWViZXJzcHJ1bmdlbjogTFhDICRpZCAodW50ZXJzdHVldHp0OiBEZWJpYW4vVWJ1bnR1IG1pdCBzeXN0ZW1kIHVuZCBWZXJzaW9ucy1Db2RlbmFtZSkuIjsgY29udGludWUKICAgIGZpCiAgICBpZiBbWyAkdHMgPT0gMSAmJiAkd3ogPT0gMSBdXTsgdGhlbgogICAgICBzYXkgIkF1c2dlYmxlbmRldDogTFhDICRpZCAkbmFtZSAoYmVpZGUgS29tcG9uZW50ZW4gdm9yaGFuZGVuOyBWZXJiaW5kdW5nIG5pY2h0IGdlcHJ1ZWZ0KS4iOyBjb250aW51ZQogICAgZmkKICAgIFtbICRuYW1lID1+IF5bQS1aYS16MC05XVtBLVphLXowLTkuXy1dezAsNjJ9JCBdXSB8fCB7IHNheSAiVWViZXJzcHJ1bmdlbjogTFhDICRpZCAoSG9zdG5hbWUgdW5ndWVsdGlnKS4iOyBjb250aW51ZTsgfQogICAgSURTKz0oIiRpZCIpOyBOQU1FU1skaWRdPSRuYW1lOyBUU1skaWRdPSR0czsgV1pbJGlkXT0kd3o7IFRVTlskaWRdPSR0dW4KICBkb25lIDw8PCIkcm93cyIKICBzYXkgJyc7IHNheSAnQXVzd2FlaGxiYXJlIExYQ3MgKG51ciBmZWhsZW5kZSBLb21wb25lbnRlbiB3ZXJkZW4gaW5zdGFsbGllcnQpOicKICBwcmludGYgJyUtOHMgJS0yNHMgJS0xMnMgJS0xMnMgJXNcbicgJ0NUSUQnICdOYW1lJyAnVGFpbHNjYWxlJyAnV2F6dWgnICdUVU4nCiAgZm9yIGlkIGluICIke0lEU1tAXX0iOyBkbwogICAgcHJpbnRmICclLThzICUtMjRzICUtMTJzICUtMTJzICVzXG4nICIkaWQiICIke05BTUVTWyRpZF19IiAiJChpbnN0YWxsZWRfbGFiZWwgIiR7VFNbJGlkXX0iKSIgIiQoaW5zdGFsbGVkX2xhYmVsICIke1daWyRpZF19IikiICIkKGluc3RhbGxlZF9sYWJlbCAiJHtUVU5bJGlkXX0iKSIKICBkb25lCn0KCmVuc3VyZV90dW4oKSB7CiAgbG9jYWwgaWQ9JDEgY2ZnIHNsb3Q9LTEgbgogIGNmZz0kKHBjdCBjb25maWcgIiRpZCIpIHx8IHJldHVybiAxCiAgaWYgISBncmVwIC1FcSAnXmRldlswLTldKzouKigvZGV2L25ldC90dW4pKCx8JCknIDw8PCIkY2ZnIjsgdGhlbgogICAgZm9yIG4gaW4gezAuLjI1NX07IGRvCiAgICAgIGlmICEgZ3JlcCAtcSAiXmRldiRuOiIgPDw8IiRjZmciOyB0aGVuIHNsb3Q9JG47IGJyZWFrOyBmaQogICAgZG9uZQogICAgW1sgJHNsb3QgIT0gLTEgXV0gfHwgeyBzYXkgIkxYQyAkaWQ6IEtlaW4gZnJlaWVyIERldmljZS1TbG90LiI7IHJldHVybiAxOyB9CiAgICBwcmludGYgJyVzXG4nICIkY2ZnIiA+IiRUTVAvbHhjLSRpZC5jb25mLmJlZm9yZSIgfHwgcmV0dXJuIDEKICAgICMgQmFja3VwcyBzdXJ2aXZlIHRoaXMgcnVuOyBubyBzZWNyZXRzIGFyZSBzdG9yZWQgaW4gdGhlc2UgZmlsZXMuCiAgICBpbnN0YWxsIC1kIC1tIDcwMCAvdmFyL2JhY2t1cHMvbHhjLWVucm9sbCB8fCByZXR1cm4gMQogICAgaW5zdGFsbCAtbSA2MDAgIiRUTVAvbHhjLSRpZC5jb25mLmJlZm9yZSIgIi92YXIvYmFja3Vwcy9seGMtZW5yb2xsLyRpZC0kKGRhdGUgKyVZJW0lZC0lSCVNJVMpLmNvbmYiIHx8IHJldHVybiAxCiAgICBwY3Qgc2V0ICIkaWQiICItLWRldiRzbG90IiAvZGV2L25ldC90dW4gfHwgcmV0dXJuIDEKICBmaQogICMgTmV2ZXIgZm9yY2libHkgc3RvcCBhIHdvcmtsb2FkLiBJZiBjbGVhbiBzaHV0ZG93biBmYWlscywgc3RvcCB0aGlzIENUJ3Mgd29yay4KICBwY3Qgc2h1dGRvd24gIiRpZCIgLS10aW1lb3V0IDkwIHx8IHJldHVybiAxCiAgcGN0IHN0YXJ0ICIkaWQiIHx8IHJldHVybiAxCiAgZm9yIG4gaW4gezEuLjMwfTsgZG8KICAgIGlmIHBjdCBleGVjICIkaWQiIC0tIHRlc3QgLWMgL2Rldi9uZXQvdHVuIDI+L2Rldi9udWxsOyB0aGVuIHJldHVybiAwOyBmaQogICAgc2xlZXAgMgogIGRvbmUKICBzYXkgIkxYQyAkaWQ6IFRVTiBuYWNoIE5ldXN0YXJ0IG5pY2h0IHZlcmZ1ZWdiYXIuIjsgcmV0dXJuIDEKfQoKd3JpdGVfd29ya2VyKCkgewogIGNhdCA+IiRUTVAvd29ya2VyLnNoIiA8PCdXT1JLRVInCiMhL3Vzci9iaW4vZW52IGJhc2gKc2V0IC1FZXVvIHBpcGVmYWlsCnNldCAreAp1bWFzayAwNzcKRElSPSQxOyBNQU5BR0VSPSQyOyBBR0VOVF9WRVJTSU9OPSQzOyBMT0dJTj0kNDsgTkFNRT0kNTsgV0FOVF9UUz0kNjsgV0FOVF9XWj0kNwpTU0hfRU5BQkxFRD0kODsgU1NIX1VTRVI9JDk7IFNTSF9TVURPPSR7MTB9OyBTU0hfTk9QQVNTV0Q9JHsxMX0KdHJhcCAncm0gLWYgLS0gIiRESVIvaGVhZHNjYWxlLmtleSIgIiRESVIvZW5yb2xsbWVudC5wYXNzIiAiJERJUi9zdWRvLnBhc3MiJyBFWElUCmV4cG9ydCBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUKcHJlc2VudCgpIHsgW1sgJChkcGtnLXF1ZXJ5IC1XIC1mPScke1N0YXR1c30nICIkMSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkgPT0gJ2luc3RhbGwgb2sgaW5zdGFsbGVkJyBdXTsgfQpkb3dubG9hZCgpIHsgY3VybCAtLWZhaWwgLS1zaWxlbnQgLS1zaG93LWVycm9yIC0tbG9jYXRpb24gLS1wcm90byAnPWh0dHBzJyAtLXRsc3YxLjIgLS1jb25uZWN0LXRpbWVvdXQgMTAgLS1tYXgtdGltZSA2MCAtLXJldHJ5IDIgIiQxIiAtbyAiJDIiOyB9Cmhhc19yZXBvKCkgeyBncmVwIC1ScXMgLS0gIiQxIiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZCAyPi9kZXYvbnVsbCB8fCBncmVwIC1xcyAtLSAiJDEiIC9ldGMvYXB0L3NvdXJjZXMubGlzdCAyPi9kZXYvbnVsbDsgfQoKIyBSZWNoZWNrIGJlZm9yZSBpbnN0YWxsaW5nOyBuZXZlciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IG9yIGVucm9sbG1lbnQuCmlmIHByZXNlbnQgdGFpbHNjYWxlIHx8IGNvbW1hbmQgLXYgdGFpbHNjYWxlID4vZGV2L251bGw7IHRoZW4gV0FOVF9UUz0wOyBmaQppZiBwcmVzZW50IHdhenVoLWFnZW50IHx8IHByZXNlbnQgd2F6dWgtbWFuYWdlciB8fCBbWyAteCAvdmFyL29zc2VjL2Jpbi93YXp1aC1hZ2VudGQgXV07IHRoZW4gV0FOVF9XWj0wOyBmaQppZiBbWyAkV0FOVF9XWiA9PSAxICYmIC1lIC92YXIvb3NzZWMvZXRjL29zc2VjLmNvbmYgXV07IHRoZW4KICBlY2hvICdXYXp1aC1Lb25maWd1cmF0aW9uIGJlcmVpdHMgdm9yaGFuZGVuOiBiaXR0ZSB1bnZvbGxzdGFlbmRpZ2UgSW5zdGFsbGF0aW9uIHp1ZXJzdCByZXBhcmllcmVuLicgPiYyOyBleGl0IDEKZmkKW1sgJFdBTlRfVFMgPT0gMSB8fCAkV0FOVF9XWiA9PSAxIHx8ICRTU0hfRU5BQkxFRCA9PSAxIF1dIHx8IHsgZWNobyAnS29tcG9uZW50ZW4gaW56d2lzY2hlbiB2b3JoYW5kZW47IG5pY2h0cyBnZWFlbmRlcnQuJzsgZXhpdCAwOyB9CgojIENoZWNrIG1hbmFnZXIgcmVhY2hhYmlsaXR5IGJlZm9yZSBpbnN0YWxsaW5nIGEgbmV3IGFnZW50LgppZiBbWyAkV0FOVF9XWiA9PSAxIF1dOyB0aGVuCiAgZm9yIHBvcnQgaW4gMTUxNCAxNTE1OyBkbwogICAgdGltZW91dCA1IGJhc2ggLWMgJ2V4ZWMgNzw+L2Rldi90Y3AvJDEvJDInIC0tICIkTUFOQUdFUiIgIiRwb3J0IiB8fCB7CiAgICAgIGVjaG8gIldhenVoLU1hbmFnZXIgYXVmIFBvcnQgJHBvcnQgbmljaHQgZXJyZWljaGJhcjsgSW5zdGFsbGF0aW9uIGFiZ2Vicm9jaGVuLiIgPiYyOyBleGl0IDE7CiAgICB9CiAgZG9uZQpmaQphcHQtZ2V0IC1vIERQa2c6OkxvY2s6OlRpbWVvdXQ9MTIwIHVwZGF0ZQphcHQtZ2V0IC1vIERQa2c6OkxvY2s6OlRpbWVvdXQ9MTIwIGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgY2EtY2VydGlmaWNhdGVzIGN1cmwgZ251cGcKaW5zdGFsbCAtZCAtbSA3NTUgL3Vzci9zaGFyZS9rZXlyaW5ncyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZAoKaWYgW1sgJFdBTlRfVFMgPT0gMSBdXTsgdGhlbgogIFtbIC1jIC9kZXYvbmV0L3R1biAmJiAtcyAkRElSL2hlYWRzY2FsZS5rZXkgXV0gfHwgeyBlY2hvICdUVU4gb2RlciBIZWFkc2NhbGUtU2NobHVlc3NlbCBmZWhsdC4nID4mMjsgZXhpdCAxOyB9CiAgLiAvZXRjL29zLXJlbGVhc2UKICBpZiAhIGhhc19yZXBvICdwa2dzLnRhaWxzY2FsZS5jb20nOyB0aGVuCiAgICBbWyAhIC1lIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL3RhaWxzY2FsZS5saXN0IF1dIHx8IHsgZWNobyAnVm9yaGFuZGVuZSB0YWlsc2NhbGUubGlzdCBiaXR0ZSB6dWVyc3QgcHJ1ZWZlbi4nID4mMjsgZXhpdCAxOyB9CiAgICBkb3dubG9hZCAiaHR0cHM6Ly9wa2dzLnRhaWxzY2FsZS5jb20vc3RhYmxlLyRJRC8kVkVSU0lPTl9DT0RFTkFNRS5ub2FybW9yLmdwZyIgIiRESVIvdGFpbHNjYWxlLmdwZyIKICAgIGRvd25sb2FkICJodHRwczovL3BrZ3MudGFpbHNjYWxlLmNvbS9zdGFibGUvJElELyRWRVJTSU9OX0NPREVOQU1FLnRhaWxzY2FsZS1rZXlyaW5nLmxpc3QiICIkRElSL3RhaWxzY2FsZS5saXN0IgogICAgaW5zdGFsbCAtbSA2NDQgIiRESVIvdGFpbHNjYWxlLmdwZyIgL3Vzci9zaGFyZS9rZXlyaW5ncy90YWlsc2NhbGUtYXJjaGl2ZS1rZXlyaW5nLmdwZwogICAgaW5zdGFsbCAtbSA2NDQgIiRESVIvdGFpbHNjYWxlLmxpc3QiIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL3RhaWxzY2FsZS5saXN0CiAgZmkKICBhcHQtZ2V0IC1vIERQa2c6OkxvY2s6OlRpbWVvdXQ9MTIwIHVwZGF0ZQogIGFwdC1nZXQgLW8gRFBrZzo6TG9jazo6VGltZW91dD0xMjAgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyB0YWlsc2NhbGUKICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93IHRhaWxzY2FsZWQKICAjIEZpbGUgcmVmZXJlbmNlIGtlZXBzIHRoZSBrZXkgb3V0IG9mIGNvbW1hbmQgYXJndW1lbnRzL2hpc3RvcnkuIEtlZXAgbG9jYWwgRE5TLgogIHRpbWVvdXQgOTAgdGFpbHNjYWxlIHVwIC0tbG9naW4tc2VydmVyPSIkTE9HSU4iIC0tYXV0aC1rZXk9ImZpbGU6JERJUi9oZWFkc2NhbGUua2V5IiAtLWhvc3RuYW1lPSIkTkFNRSIgLS1hY2NlcHQtZG5zPWZhbHNlIC0tdGltZW91dD02MHMKICBybSAtZiAtLSAiJERJUi9oZWFkc2NhbGUua2V5IgogIHRhaWxzY2FsZSBpcCAtNAogIGVjaG8gJ1RhaWxzY2FsZSBpbnN0YWxsaWVydCB1bmQgYW5nZW1lbGRldC4nCmZpCgppZiBbWyAkV0FOVF9XWiA9PSAxIF1dOyB0aGVuCiAgaWYgISBoYXNfcmVwbyAncGFja2FnZXMud2F6dWguY29tJzsgdGhlbgogICAgW1sgISAtZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9seGMtZW5yb2xsLXdhenVoLmxpc3QgXV0gfHwgZXhpdCAxCiAgICBkb3dubG9hZCBodHRwczovL3BhY2thZ2VzLndhenVoLmNvbS9rZXkvR1BHLUtFWS1XQVpVSCAiJERJUi93YXp1aC5hc2MiCiAgICBncGcgLS1iYXRjaCAtLXllcyAtLWRlYXJtb3IgLW8gIiRESVIvd2F6dWguZ3BnIiAiJERJUi93YXp1aC5hc2MiCiAgICBpbnN0YWxsIC1tIDY0NCAiJERJUi93YXp1aC5ncGciIC91c3Ivc2hhcmUva2V5cmluZ3MvbHhjLWVucm9sbC13YXp1aC5ncGcKICAgIHByaW50ZiAnJXNcbicgJ2RlYiBbc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3MvbHhjLWVucm9sbC13YXp1aC5ncGddIGh0dHBzOi8vcGFja2FnZXMud2F6dWguY29tLzQueC9hcHQvIHN0YWJsZSBtYWluJyA+L2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbHhjLWVucm9sbC13YXp1aC5saXN0CiAgICBjaG1vZCA2NDQgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbHhjLWVucm9sbC13YXp1aC5saXN0CiAgZmkKICBhcHQtZ2V0IC1vIERQa2c6OkxvY2s6OlRpbWVvdXQ9MTIwIHVwZGF0ZQogIGFwdC1jYWNoZSBtYWRpc29uIHdhenVoLWFnZW50IHwgYXdrICd7cHJpbnQgJDN9JyB8IGdyZXAgLUZ4ICIkQUdFTlRfVkVSU0lPTiIgPi9kZXYvbnVsbCB8fCB7CiAgICBlY2hvICJXYXp1aC1WZXJzaW9uICRBR0VOVF9WRVJTSU9OIG5pY2h0IHZlcmZ1ZWdiYXI7IGtlaW4gbmV1ZXJlciBBZ2VudCB3aXJkIGluc3RhbGxpZXJ0LiIgPiYyOyBleGl0IDE7CiAgfQogIGV4cG9ydCBXQVpVSF9NQU5BR0VSPSIkTUFOQUdFUiIgV0FaVUhfUkVHSVNUUkFUSU9OX1NFUlZFUj0iJE1BTkFHRVIiIFdBWlVIX0FHRU5UX05BTUU9IiROQU1FIgogIGlmIFtbIC1zICRESVIvZW5yb2xsbWVudC5wYXNzIF1dOyB0aGVuIGV4cG9ydCBXQVpVSF9SRUdJU1RSQVRJT05fUEFTU1dPUkQ7IFdBWlVIX1JFR0lTVFJBVElPTl9QQVNTV09SRD0kKGNhdCAiJERJUi9lbnJvbGxtZW50LnBhc3MiKTsgZmkKICBhcHQtZ2V0IC1vIERQa2c6OkxvY2s6OlRpbWVvdXQ9MTIwIGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgIndhenVoLWFnZW50PSRBR0VOVF9WRVJTSU9OIgogIHVuc2V0IFdBWlVIX1JFR0lTVFJBVElPTl9QQVNTV09SRAogIHJtIC1mIC0tICIkRElSL2Vucm9sbG1lbnQucGFzcyIKICBhcHQtbWFyayBob2xkIHdhenVoLWFnZW50CiAgc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQKICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93IHdhenVoLWFnZW50CiAgY29ubmVjdGVkPTAKICBmb3IgYXR0ZW1wdCBpbiB7MS4uMzB9OyBkbwogICAgaWYgZ3JlcCAtcSAiXnN0YXR1cz0nY29ubmVjdGVkJyIgL3Zhci9vc3NlYy92YXIvcnVuL3dhenVoLWFnZW50ZC5zdGF0ZSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICBjb25uZWN0ZWQ9MTsgYnJlYWsKICAgIGZpCiAgICBzbGVlcCAyCiAgZG9uZQogIGlmIFtbICRjb25uZWN0ZWQgPT0gMCBdXTsgdGhlbgogICAgZWNobyAnV2F6dWggaW5zdGFsbGllcnQsIFZlcmJpbmR1bmcgbmljaHQgYmVzdGFldGlndC4gQWdlbnQtS29uZmlndXJhdGlvbi9Mb2dzIHBydWVmZW47IGtlaW5lIGF1dG9tYXRpc2NoZSBOZXVyZWdpc3RyaWVydW5nLicgPiYyCiAgICBleGl0IDEKICBmaQogIGVjaG8gJ1dhenVoIGluc3RhbGxpZXJ0IHVuZCBtaXQgZGVtIE1hbmFnZXIgdmVyYnVuZGVuLicKZmkKCmlmIFtbICRTU0hfRU5BQkxFRCA9PSAxIF1dOyB0aGVuCiAgaWYgW1sgJFNTSF9TVURPID09IDEgXV07IHRoZW4gYXB0LWdldCAtbyBEUGtnOjpMb2NrOjpUaW1lb3V0PTEyMCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIHN1ZG87IGZpCiAgbmV3X3VzZXI9MAogIGlmIGlkICIkU1NIX1VTRVIiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgW1sgJChpZCAtdSAiJFNTSF9VU0VSIikgIT0gMCBdXSB8fCB7IGVjaG8gJ1NTSC1aaWVsIGRhcmYga2VpbiByb290LUtvbnRvIHNlaW4uJyA+JjI7IGV4aXQgMTsgfQogIGVsc2UKICAgIHVzZXJhZGQgLW0gLVUgLXMgL2Jpbi9iYXNoICIkU1NIX1VTRVIiCiAgICBuZXdfdXNlcj0xCiAgZmkKICBpZiBbWyAkU1NIX1NVRE8gPT0gMSBdXTsgdGhlbgogICAgdXNlcm1vZCAtYUcgc3VkbyAiJFNTSF9VU0VSIgogICAgaWYgW1sgJFNTSF9OT1BBU1NXRCA9PSAxIF1dOyB0aGVuCiAgICAgIHN1ZG9fcnVsZT0iL2V0Yy9zdWRvZXJzLmQvbHhjLWVucm9sbC0kU1NIX1VTRVIiCiAgICAgIHByaW50ZiAnJXMgQUxMPShBTEw6QUxMKSBOT1BBU1NXRDogQUxMXG4nICIkU1NIX1VTRVIiID4iJERJUi9zdWRvZXJzIgogICAgICB2aXN1ZG8gLWNmICIkRElSL3N1ZG9lcnMiCiAgICAgIGlmIFtbIC1lICRzdWRvX3J1bGUgXV0gJiYgISBjbXAgLXMgIiRESVIvc3Vkb2VycyIgIiRzdWRvX3J1bGUiOyB0aGVuCiAgICAgICAgZWNobyAnQWJ3ZWljaGVuZGUgdm9yaGFuZGVuZSBTdWRvLVJlZ2VsOiBiaXR0ZSBtYW51ZWxsIHBydWVmZW4uJyA+JjI7IGV4aXQgMQogICAgICBmaQogICAgICBpbnN0YWxsIC1tIDQ0MCAiJERJUi9zdWRvZXJzIiAiJHN1ZG9fcnVsZSIKICAgIGVsaWYgW1sgJG5ld191c2VyID09IDEgXV07IHRoZW4KICAgICAgW1sgLXMgJERJUi9zdWRvLnBhc3MgXV0gfHwgeyBlY2hvICdQYXNzd29ydCBmdWVyIG5ldWVuIFN1ZG8tTnV0emVyIGZlaGx0LicgPiYyOyBleGl0IDE7IH0KICAgICAgeyBwcmludGYgJyVzOicgIiRTU0hfVVNFUiI7IGNhdCAiJERJUi9zdWRvLnBhc3MiOyBwcmludGYgJ1xuJzsgfSB8IGNocGFzc3dkCiAgICAgIGVjaG8gJ1Bhc3N3b3J0IGZ1ZXIgbmV1ZW4gTnV0emVyIGdlc2V0enQ7IGJlc3RlaGVuZGUgTnV0emVycGFzc3dvZXJ0ZXIgYmxlaWJlbiB1bnZlcmFlbmRlcnQuJwogICAgZmkKICBmaQogIHJtIC1mIC0tICIkRElSL3N1ZG8ucGFzcyIKICB0YWlsc2NhbGUgc2V0IC0tc3NoPXRydWUKICBlY2hvICJUYWlsc2NhbGUgU1NIIGZ1ZXIgJFNTSF9VU0VSIGFrdGl2aWVydC4gSGVhZHNjYWxlLU5ldHp3ZXJrLSBVTkQgU1NILVBvbGljeSBtdWVzc2VuIGRpZXNlbiBadWdyaWZmIGVybGF1YmVuLiIKICBlY2hvICdLZWluIE9wZW5TU0gtU2VydmVyIGluc3RhbGxpZXJ0LiBWb3JoYW5kZW5lIE51dHplci0vU3Vkby1SZWNodGUgd2VyZGVuIG5pY2h0IGVudHpvZ2VuLicKZmkKV09SS0VSCn0KCmRlcGxveV9vbmUoKSB7CiAgbG9jYWwgaWQ9JDEgZGlyIHRzIHd6CiAgW1sgJChwY3Qgc3RhdHVzICIkaWQiKSA9PSAnc3RhdHVzOiBydW5uaW5nJyBdXSB8fCByZXR1cm4gMQogIGlmIHBjdCBjb25maWcgIiRpZCIgfCBncmVwIC1xICdebG9jazonOyB0aGVuIHNheSAiTFhDICRpZCBpbnp3aXNjaGVuIGdlc3BlcnJ0LiI7IHJldHVybiAxOyBmaQogIHRzPSQoKDEtJHtUU1skaWRdfSkpOyB3ej0kKCgxLSR7V1pbJGlkXX0pKQogIGlmIFtbICR0cyA9PSAxICYmICR7VFVOWyRpZF19ID09IDAgXV07IHRoZW4gZW5zdXJlX3R1biAiJGlkIiB8fCByZXR1cm4gMTsgZmkKICBkaXI9JChwY3QgZXhlYyAiJGlkIiAtLSBta3RlbXAgLWQgL3J1bi9seGMtZW5yb2xsLlhYWFhYWFhYKSB8fCByZXR1cm4gMQogIFtbICRkaXIgPX4gXi9ydW4vbHhjLWVucm9sbFwuW0EtWmEtejAtOV0rJCBdXSB8fCByZXR1cm4gMQogIFJFTU9URV9ESVJTWyRpZF09JGRpcgogIHBjdCBwdXNoICIkaWQiICIkVE1QL3dvcmtlci5zaCIgIiRkaXIvd29ya2VyLnNoIiAtLXVzZXIgMCAtLWdyb3VwIDAgLS1wZXJtcyA2MDAgfHwgcmV0dXJuIDEKICBpZiBbWyAkdHMgPT0gMSBdXTsgdGhlbiBwY3QgcHVzaCAiJGlkIiAiJFRNUC9oZWFkc2NhbGUua2V5IiAiJGRpci9oZWFkc2NhbGUua2V5IiAtLXVzZXIgMCAtLWdyb3VwIDAgLS1wZXJtcyA2MDAgfHwgcmV0dXJuIDE7IGZpCiAgaWYgW1sgJHd6ID09IDEgJiYgLXMgJFRNUC9lbnJvbGxtZW50LnBhc3MgXV07IHRoZW4gcGN0IHB1c2ggIiRpZCIgIiRUTVAvZW5yb2xsbWVudC5wYXNzIiAiJGRpci9lbnJvbGxtZW50LnBhc3MiIC0tdXNlciAwIC0tZ3JvdXAgMCAtLXBlcm1zIDYwMCB8fCByZXR1cm4gMTsgZmkKICBpZiBbWyAkU1NIX0VOQUJMRUQgPT0gMSBdXTsgdGhlbgogICAgaWYgW1sgLXMgJFRNUC9zdWRvLnBhc3MgXV07IHRoZW4gcGN0IHB1c2ggIiRpZCIgIiRUTVAvc3Vkby5wYXNzIiAiJGRpci9zdWRvLnBhc3MiIC0tdXNlciAwIC0tZ3JvdXAgMCAtLXBlcm1zIDYwMCB8fCByZXR1cm4gMTsgZmkKICBmaQogICMgQ3JlZGVudGlhbHMgYXJlIGZpbGVzLCBuZXZlciBwY3QgYXJndW1lbnRzLiBiYXNoIHJlY2VpdmVzIG9ubHkgbm9uLXNlY3JldCBzZXR0aW5ncy4KICBwY3QgZXhlYyAiJGlkIiAtLSBiYXNoICIkZGlyL3dvcmtlci5zaCIgIiRkaXIiICIkTUFOQUdFUiIgIiRWRVJTSU9OIiAiJExPR0lOX1NFUlZFUiIgIiR7TkFNRVNbJGlkXX0iICIkdHMiICIkd3oiICIkU1NIX0VOQUJMRUQiICIkU1NIX1VTRVIiICIkU1NIX1NVRE8iICIkU1NIX05PUEFTU1dEIiB8fCByZXR1cm4gMQogIGlmIFtbICR0cyA9PSAxIF1dOyB0aGVuCiAgICBwY3QgZXhlYyAiJGlkIiAtLSB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbiB8IHB5dGhvbjMgLWMgJ2ltcG9ydCBqc29uLHN5czsgZD1qc29uLmxvYWQoc3lzLnN0ZGluKTsgc3lzLmV4aXQoMCBpZiBkLmdldCgiQmFja2VuZFN0YXRlIik9PSJSdW5uaW5nIiBhbmQgZC5nZXQoIlNlbGYiLHt9KS5nZXQoIk9ubGluZSIpIGlzIFRydWUgZWxzZSAxKScgfHwgewogICAgICBzYXkgIkxYQyAkaWQ6IEhlYWRzY2FsZS1WZXJiaW5kdW5nIG5pY2h0IGFscyBvbmxpbmUgYmVzdGFldGlndC4iOyByZXR1cm4gMTsKICAgIH0KICBmaQogIHBjdCBleGVjICIkaWQiIC0tIHJtIC1yZiAtLSAiJGRpciIgfHwgcmV0dXJuIDEKICBSRU1PVEVfRElSU1skaWRdPScnCn0KCm1haW4oKSB7CiAgbG9jYWwgaWQgaW5wdXQgd2FudGVkIGZvdW5kIG5lZWRfdHM9MCBuZWVkX3d6PTAgcmVzdGFydF9pZHM9Jycgb2s9JycgZmFpbGVkPScnIGF1dG9fdmVyc2lvbiBwYXNzd29yZAogIHNjYW4KICBbWyAkTElTVCA9PSAwIF1dIHx8IHJldHVybiAwCiAgW1sgJHsjSURTW0BdfSAtZ3QgMCBdXSB8fCB7IHNheSAnS2VpbmUgcGFzc2VuZGVuIExYQ3MgZ2VmdW5kZW4uJzsgcmV0dXJuIDA7IH0KICBleGVjIDM8Pi9kZXYvdHR5IHx8IGZhaWwgJ0ludGVyYWt0aXZlcyBUZXJtaW5hbCBmZWhsdC4gLS1saXN0IGthbm4gb2huZSBUZXJtaW5hbCBsYXVmZW4uJwogIGxvYWRfc2V0dGluZ3MKICB5ZXNfbm8gIlRhaWxzY2FsZSBTU0ggZnVlciBhbGxlIGF1c2dld2FlaGx0ZW4gTFhDcyBha3RpdmllcmVuPyAoU3RhbmRhcmQ6ICRTU0hfRU5BQkxFRDsgMT1KYSwgMD1OZWluKSBbai9uXSIgIiRTU0hfRU5BQkxFRCIKICBTU0hfRU5BQkxFRD0kUkVQTFkKICBpZiBbWyAkU1NIX0VOQUJMRUQgPT0gMSBdXTsgdGhlbgogICAgYXNrICJTU0gtTnV0emVybmFtZSR7U1NIX1VTRVI6KyBbJFNTSF9VU0VSXX06IgogICAgU1NIX1VTRVI9JHtSRVBMWTotJFNTSF9VU0VSfQogICAgW1sgJFNTSF9VU0VSID1+IF5bYS16X11bYS16MC05Xy1dezAsMzB9JCAmJiAkU1NIX1VTRVIgIT0gcm9vdCBdXSB8fCBmYWlsICdCaXR0ZSBlaW5lbiBub3JtYWxlbiBMaW51eC1OdXR6ZXJuYW1lbiB2ZXJ3ZW5kZW4uJwogICAgeWVzX25vICJOdXR6ZXIgenUgc3VkbyBoaW56dWZ1ZWdlbj8gKFN0YW5kYXJkOiAkU1NIX1NVRE8pIFtqL25dIiAiJFNTSF9TVURPIjsgU1NIX1NVRE89JFJFUExZCiAgICBpZiBbWyAkU1NIX1NVRE8gPT0gMSBdXTsgdGhlbgogICAgICB5ZXNfbm8gIlN1ZG8gT0hORSBQYXNzd29ydCBlcmxhdWJlbj8gKFN0YW5kYXJkOiAkU1NIX05PUEFTU1dEOyAwPVBhc3N3b3J0IGVyZm9yZGVybGljaCkgW2ovbl0iICIkU1NIX05PUEFTU1dEIjsgU1NIX05PUEFTU1dEPSRSRVBMWQogICAgZmkKICBmaQogIHllc19ubyAnRWluc3RlbGx1bmdlbiBvaG5lIEdlaGVpbW5pc3NlIGxva2FsIGluIC52YXJzIHNwZWljaGVybj8gW0ovbl0nIDE7IFNBVkVfU0VUVElOR1M9JFJFUExZCiAgaWYgW1sgLXogJFNFTEVDVElPTiBdXTsgdGhlbiBhc2sgJ0NUSURzIGF1c3dhZWhsZW4gKExlZXJ6ZWljaGVuLCBvZGVyIGFsbDsgbGVlciA9IGFiYnJlY2hlbik6JzsgU0VMRUNUSU9OPSRSRVBMWTsgZmkKICBbWyAtbiAkU0VMRUNUSU9OIF1dIHx8IHJldHVybiAwCiAgaWYgW1sgJFNFTEVDVElPTiA9PSBhbGwgXV07IHRoZW4gU0VMRUNURUQ9KCIke0lEU1tAXX0iKTsgZWxzZQogICAgU0VMRUNUSU9OPSR7U0VMRUNUSU9OLy8sLyB9CiAgICBmb3Igd2FudGVkIGluICRTRUxFQ1RJT047IGRvCiAgICAgIFtbICR3YW50ZWQgPX4gXlsxLTldWzAtOV0qJCBdXSB8fCBmYWlsICdCaXR0ZSBudXIgQ1RJRHMgZWluZ2ViZW4uJwogICAgICBmb3VuZD0wCiAgICAgIGZvciBpZCBpbiAiJHtJRFNbQF19IjsgZG8gW1sgJGlkICE9ICIkd2FudGVkIiBdXSB8fCBmb3VuZD0xOyBkb25lCiAgICAgIFtbICRmb3VuZCA9PSAxIF1dIHx8IGZhaWwgIkxYQyAkd2FudGVkIGlzdCBuaWNodCBhdXN3YWVobGJhci4iCiAgICAgIGZvciBpZCBpbiAiJHtTRUxFQ1RFRFtAXX0iOyBkbyBbWyAkaWQgIT0gIiR3YW50ZWQiIF1dIHx8IGZhaWwgIkxYQyAkd2FudGVkIGRvcHBlbHQgYXVzZ2V3YWVobHQuIjsgZG9uZQogICAgICBTRUxFQ1RFRCs9KCIkd2FudGVkIikKICAgIGRvbmUKICBmaQogIHNheSAnJzsgc2F5ICdHZXBsYW50ZSBBZW5kZXJ1bmdlbjonCiAgZm9yIGlkIGluICIke1NFTEVDVEVEW0BdfSI7IGRvCiAgICBzYXkgIkxYQyAkaWQgJHtOQU1FU1skaWRdfTogVGFpbHNjYWxlICQoaW5zdGFsbGVkX2xhYmVsICIke1RTWyRpZF19IiksIFdhenVoICQoaW5zdGFsbGVkX2xhYmVsICIke1daWyRpZF19IikuIgogICAgaWYgW1sgJHtUU1skaWRdfSA9PSAwIF1dOyB0aGVuCiAgICAgIG5lZWRfdHM9MQogICAgICBpZiBbWyAke1RVTlskaWRdfSA9PSAwIF1dOyB0aGVuIHJlc3RhcnRfaWRzKz0iICRpZCI7IGZpCiAgICBmaQogICAgW1sgJHtXWlskaWRdfSAhPSAwIF1dIHx8IG5lZWRfd3o9MQogIGRvbmUKICBpZiBbWyAtbiAkcmVzdGFydF9pZHMgXV07IHRoZW4gc2F5ICJUVU4tWnVncmlmZiBlcmdhZW56ZW4gdW5kIHNhdWJlciBuZXUgc3RhcnRlbjokcmVzdGFydF9pZHMiOyBmaQogIGlmIFtbICRTU0hfRU5BQkxFRCA9PSAxIF1dOyB0aGVuCiAgICBzYXkgIlRhaWxzY2FsZSBTU0ggZnVlciBkaWUgQXVzd2FobDogTnV0emVyICRTU0hfVVNFUiwgU3Vkbz0kU1NIX1NVRE8sIFN1ZG8tb2huZS1QYXNzd29ydD0kU1NIX05PUEFTU1dELiIKICAgIHNheSAnSGVhZHNjYWxlIG11c3MgWnVncmlmZiBhdWYgUG9ydCAyMiB1bmQgZGVuIGdld2FlaGx0ZW4gTGludXgtTnV0emVyIGluIHNlaW5lciBTU0gtUG9saWN5IGVybGF1YmVuLicKICAgIHNheSAnQmVzdGVoZW5kZSBTU0gtU2l0enVuZ2VuIHVlYmVyIFRhaWxzY2FsZSBrb2VubmVuIGJlaW0gQWt0aXZpZXJlbiB1bnRlcmJyb2NoZW4gd2VyZGVuLicKICBmaQogIFtbICREUlkgPT0gMCBdXSB8fCB7IHNheSAnVm9yc2NoYXUgYWJnZXNjaGxvc3Nlbi4gS2VpbmUgQWVuZGVydW5nZW4gdm9yZ2Vub21tZW4uJzsgcmV0dXJuIDA7IH0KICBjb21tYW5kIC12IGZsb2NrID4vZGV2L251bGwgfHwgZmFpbCAnZmxvY2sgZmVobHQgYXVmIGRlbSBIb3N0LicKICBleGVjIDg+L3J1bi9seGMtZW5yb2xsLmxvY2sKICBmbG9jayAtbiA4IHx8IGZhaWwgJ0VpbiBhbmRlcmVyIEVucm9sbG1lbnQtTGF1ZiBpc3QgYmVyZWl0cyBha3Rpdi4nCiAgaWYgW1sgJG5lZWRfd3ogPT0gMSBdXTsgdGhlbgogICAgaWYgW1sgLXogJE1BTkFHRVIgXV07IHRoZW4gYXNrICdFcnJlaWNoYmFyZSBXYXp1aC1NYW5hZ2VyLUFkcmVzc2UgKExBTi1JUCBvZGVyIEhlYWRzY2FsZS1JUCk6JzsgTUFOQUdFUj0kUkVQTFk7IGZpCiAgICBbWyAkTUFOQUdFUiA9fiBeW0EtWmEtejAtOV1bQS1aYS16MC05LjotXSokIF1dIHx8IGZhaWwgJ01hbmFnZXItQWRyZXNzZSB1bmd1ZWx0aWcuJwogICAgaWYgW1sgJHsjTUFOQUdFUlNbQF19ID09IDEgXV07IHRoZW4KICAgICAgYXV0b192ZXJzaW9uPSQocGN0IGV4ZWMgIiR7TUFOQUdFUlNbMF19IiAtLSBkcGtnLXF1ZXJ5IC1XICctZj0ke1ZlcnNpb259JyB3YXp1aC1tYW5hZ2VyKSB8fCBmYWlsICdNYW5hZ2VyLVZlcnNpb24gbmljaHQgbGVzYmFyLicKICAgICAgaWYgW1sgJFZFUlNJT05fRVhQTElDSVQgPT0gMSAmJiAkVkVSU0lPTiAhPSAiJGF1dG9fdmVyc2lvbiIgXV07IHRoZW4gZmFpbCAnQWdlbnQtVmVyc2lvbiBtdXNzIGRlciBsb2thbGVuIE1hbmFnZXItVmVyc2lvbiBlbnRzcHJlY2hlbi4nOyBmaQogICAgICBWRVJTSU9OPSRhdXRvX3ZlcnNpb24KICAgIGVsaWYgW1sgLXogJFZFUlNJT04gXV07IHRoZW4gYXNrICdFeGFrdGUgTWFuYWdlci1QYWtldHZlcnNpb24gKHouQi4gNC4xNC44LTEpOic7IFZFUlNJT049JFJFUExZOyBmaQogICAgW1sgJFZFUlNJT04gPX4gXlswLTldK1wuWzAtOV0rXC5bMC05XSstWzAtOV0rJCBdXSB8fCBmYWlsICdQYWtldHZlcnNpb24gdW5ndWVsdGlnLicKICAgIHNheSAiTmV1ZSBXYXp1aC1BZ2VudHM6ICRWRVJTSU9OIChhbnNjaGxpZXNzZW5kIGF1ZiBob2xkOyBnZW1laW5zYW0gbWl0IE1hbmFnZXIgYWt0dWFsaXNpZXJlbikuIgogIGZpCiAgaWYgW1sgJG5lZWRfdHMgPT0gMSBdXTsgdGhlbgogICAgaWYgW1sgLXogJExPR0lOX1NFUlZFUiBdXTsgdGhlbiBhc2sgJ0hlYWRzY2FsZS1Mb2dpbi1TZXJ2ZXIgKHZvbGxzdGFlbmRpZ2UgSFRUUFMtVVJMKTonOyBMT0dJTl9TRVJWRVI9JFJFUExZOyBmaQogICAgW1sgJExPR0lOX1NFUlZFUiA9fiBeaHR0cHM6Ly9bQS1aYS16MC05XVtBLVphLXowLTkuOi1dKi8/JCBdXSB8fCBmYWlsICdCaXR0ZSBlaW5lIEhUVFBTLVNlcnZlci1VUkwgb2huZSBadWdhbmdzZGF0ZW4vUXVlcnkgZWluZ2ViZW4uJwogICAgc2F5ICdOZXVlIFRhaWxzY2FsZS1DbGllbnRzIHZlcndlbmRlbiBIZWFkc2NhbGU7IHZvcmhhbmRlbmUgbG9rYWxlIEROUy1FaW5zdGVsbHVuZ2VuIGJsZWliZW4gYWt0aXYuJwogIGZpCiAgYXNrICdOdXIgZGllc2UgZmVobGVuZGVuIEtvbXBvbmVudGVuIGluc3RhbGxpZXJlbj8gQml0dGUgSU5TVEFMTCBlaW5nZWJlbjonCiAgW1sgJFJFUExZID09IElOU1RBTEwgXV0gfHwgeyBzYXkgJ0FiZ2Vicm9jaGVuLic7IHJldHVybiAwOyB9CiAgaWYgW1sgLW4gJHJlc3RhcnRfaWRzIF1dOyB0aGVuCiAgICBhc2sgIkRpZXNlIENvbnRhaW5lciB3ZXJkZW4ga3VyeiB1bnRlcmJyb2NoZW46JHJlc3RhcnRfaWRzLiBCaXR0ZSBORVVTVEFSVCBlaW5nZWJlbjoiCiAgICBbWyAkUkVQTFkgPT0gTkVVU1RBUlQgXV0gfHwgeyBzYXkgJ0FiZ2Vicm9jaGVuOyBuaWNodHMgaW5zdGFsbGllcnQuJzsgcmV0dXJuIDA7IH0KICBmaQogIFRNUD0kKG1rdGVtcCAtZCAvcnVuL2x4Yy1lbnJvbGwuWFhYWFhYWFgpCiAgaWYgW1sgJFNTSF9FTkFCTEVEID09IDEgXV07IHRoZW4KICAgIGlmIFtbICRTU0hfU1VETyA9PSAxICYmICRTU0hfTk9QQVNTV0QgPT0gMCBdXTsgdGhlbgogICAgICBzZWNyZXQgJ1Bhc3N3b3J0IGZ1ZXIgTkVVIGFuZ2VsZWd0ZSBTdWRvLU51dHplciAoYmVzdGVoZW5kZSBQYXNzd29lcnRlciBibGVpYmVuIHVudmVyYWVuZGVydCk6JzsgcGFzc3dvcmQ9JFJFUExZCiAgICAgIFtbIC1uICRwYXNzd29yZCAmJiAkcGFzc3dvcmQgIT0gKjoqICYmICRwYXNzd29yZCAhPSAqJCdccicqIF1dIHx8IGZhaWwgJ1Bhc3N3b3J0IGxlZXIgb2RlciBlbnRoYWVsdCB1bmd1ZWx0aWdlIFplaWNoZW4uJwogICAgICBzZWNyZXQgJ1Bhc3N3b3J0IHdpZWRlcmhvbGVuOic7IFtbICRSRVBMWSA9PSAiJHBhc3N3b3JkIiBdXSB8fCBmYWlsICdQYXNzd29lcnRlciBzdGltbWVuIG5pY2h0IHVlYmVyZWluLicKICAgICAgcHJpbnRmICclcycgIiRwYXNzd29yZCIgPiIkVE1QL3N1ZG8ucGFzcyI7IHBhc3N3b3JkPScnOyBSRVBMWT0nJwogICAgZmkKICBmaQogIHNhdmVfc2V0dGluZ3MKICBpZiBbWyAkbmVlZF90cyA9PSAxIF1dOyB0aGVuCiAgICBzZWNyZXQgJ1dpZWRlcnZlcndlbmRiYXJlbiwga3VyeiBndWVsdGlnZW4gSGVhZHNjYWxlLVByZWF1dGgtS2V5IGVpbmdlYmVuICh3aXJkIG5pY2h0IGFuZ2V6ZWlndCk6JwogICAgW1sgLW4gJFJFUExZICYmICRSRVBMWSAhPSAqJCdccicqIF1dIHx8IGZhaWwgJ1NjaGx1ZXNzZWwgZmVobHQvdW5ndWVsdGlnLicKICAgIHByaW50ZiAnJXMnICIkUkVQTFkiID4iJFRNUC9oZWFkc2NhbGUua2V5IjsgUkVQTFk9JycKICBmaQogIGlmIFtbICRuZWVkX3d6ID09IDEgXV07IHRoZW4KICAgIHNlY3JldCAnT3B0aW9uYWxlcyBXYXp1aC1FbnJvbGxtZW50LVBhc3N3b3J0IChsZWVyLCBmYWxscyBrZWluZXMgdmVybGFuZ3Qgd2lyZCk6JwogICAgcHJpbnRmICclcycgIiRSRVBMWSIgPiIkVE1QL2Vucm9sbG1lbnQucGFzcyI7IFJFUExZPScnCiAgZmkKICB3cml0ZV93b3JrZXIKICBmb3IgaWQgaW4gIiR7U0VMRUNURURbQF19IjsgZG8KICAgIHNheSAnJzsgc2F5ICJCZWFyYmVpdGUgTFhDICRpZCAke05BTUVTWyRpZF19IC4uLiIKICAgICMgQWxsIGRlcGxveW1lbnQgb3BlcmF0aW9ucyBleHBsaWNpdGx5IHByb3BhZ2F0ZSBlcnJvcnMuIFBhcmVudCBvd25zIGNsZWFudXAuCiAgICBpZiBkZXBsb3lfb25lICIkaWQiOyB0aGVuIG9rKz0iICRpZCI7IGVsc2UgZmFpbGVkKz0iICRpZCI7IGZpCiAgZG9uZQogIHNheSAnJzsgc2F5ICJFcmZvbGdyZWljaCBhYmdlc2NobG9zc2VuOiR7b2s6LSBrZWluZX0iCiAgc2F5ICJOaWNodCBhYmdlc2NobG9zc2VuOiR7ZmFpbGVkOi0ga2VpbmV9IgogIHNheSAnQmVyZWl0cyB2b3JoYW5kZW5lIEtvbXBvbmVudGVuIHd1cmRlbiBuaWNodCB1bWtvbmZpZ3VyaWVydDsgZGVyZW4gVmVyYmluZHVuZyBiaXR0ZSBzZXBhcmF0IHBydWVmZW4uJwogIHNheSAnRW5yb2xsbWVudCByaWNodGV0IG5vY2gga2VpbmUgRGlzY29yZC1SZWdlbG4gb2RlciB2b2xsc3RhZW5kaWdlIFNjaHdhY2hzdGVsbGVuYWJkZWNrdW5nIGVpbi4nCiAgW1sgLXogJGZhaWxlZCBdXQp9Cm1haW4K \ No newline at end of file