IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwppbXBvcnQgb3MKaW1wb3J0IHBpY2tsZQpmcm9tIGJhc2U2 NCBpbXBvcnQgYjY0ZGVjb2RlLCBiNjRlbmNvZGUKZnJvbSBiaW5hc2NpaSBpbXBvcnQgaGV4bGlm eSwgdW5oZXhsaWZ5CmZyb20gb3MgaW1wb3J0IHBvcGVuCgppbXBvcnQgZmxhc2sKaW1wb3J0IHNv Y2tldAppbXBvcnQgc3VicHJvY2Vzcwpmcm9tIGx4bWwgaW1wb3J0IGV0cmVlCmltcG9ydCBodG1s CmZyb20gQ3J5cHRvLkNpcGhlciBpbXBvcnQgQUVTCmZyb20gQ3J5cHRvIGltcG9ydCBSYW5kb20K aW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBzeXMKaW1wb3J0IHN0cmluZwoKZnJvbSBmbGFzayBpbXBv cnQgRmxhc2ssIHJlcXVlc3QsIG1ha2VfcmVzcG9uc2UsIHJlbmRlcl90ZW1wbGF0ZV9zdHJpbmcs IGpzb25pZnkKZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IFZhbHVlCmZyb20gdGltZSBpbXBv cnQgc2xlZXAKaW1wb3J0IHN0cmluZwoKCgppbXBvcnQgcmVxdWVzdHMKCgpjb3VudGVyID0gVmFs dWUoJ2knLCAwKQoKIyBDb25maWcgc3R1ZmYKS0VZID0gUmFuZG9tLm5ldygpLnJlYWQoMzIpICAj IDI1NiBiaXQga2V5IGZvciBleHRyYSBzZWN1cml0eSEhIQpCTE9DS1NJWkUgPSBBRVMuYmxvY2tf c2l6ZQpBRE1JTl9TRUNSRVQgPSBSYW5kb20ubmV3KCkucmVhZCgzMikgICMgbmVlZCB0byBrZWVw IHRoaXMgc2VjcmV0CkFQUF9OQU1FID0gJ2N0Zi1tYXN0ZXInCkFQUF9WRVJTSU9OID0gJzAuMScK QVBQX1BISUxPU09QSFkgPSAnSWYgYXQgZmlyc3QgeW91IGRvbnQgc3VjY2VlZCwgdHJ5LCB0cnkg YWdhaW4hJwoKQ09ORklHID0gewogICAgJ2VuY3J5cHRvX2tleSc6IGI2NGVuY29kZShLRVkpLAog ICAgJ3NlY3JldF9hZG1pbl92YWx1ZSc6IGI2NGVuY29kZShBRE1JTl9TRUNSRVQpLAogICAgJ2Fw cF9uYW1lJzogQVBQX05BTUUsCiAgICAnYXBwX3ZlcnNpb24nOiBBUFBfVkVSU0lPTiwKICAgICdh cHBfcGhpbG9zb3BoeSc6IEFQUF9QSElMT1NPUEhZCn0KCkRBVEFCQVNFX05BTUUgPSAnYnJlYWtk YicKCkRBVEFCQVNFX1RBQkxFUyA9IFsKICAgIHsKICAgICAgICAndGFibGVfbmFtZSc6ICdvaWNp bklmdEN0bmlzTycsCiAgICAgICAgJ2NvbHVtbnMnOiBbCiAgICAgICAgICAgIHsnbmFtZSc6ICdp ZCcsICdkYXRhdHlwZSc6ICdpbnRlZ2VyJywgJ251bGxhYmxlJzogRmFsc2V9LAogICAgICAgICAg ICB7J25hbWUnOiAnbmFtZScsICdkYXRhdHlwZSc6ICd2YXJjaGFyKDQwKScsICdudWxsYWJsZSc6 IFRydWV9LAogICAgICAgICAgICB7J25hbWUnOiAnY2F0ZWdvcnknLCAnZGF0YXR5cGUnOiAndmFy Y2hhcigyMCknLCAnbnVsbGFibGUnOiBGYWxzZX0sCiAgICAgICAgICAgIHsnbmFtZSc6ICdkZXNj cmlwdGlvbicsICdkYXRhdHlwZSc6ICd2YXJjaGFyKDQwMCknLCAnbnVsbGFibGUnOiBUcnVlfQog ICAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICAgJ3RhYmxlX25hbWUnOiAnb2liYXNvZGVkYWRp dG5lZG5pYWFsZXZlcmVvaWVtb2FhcmJldXFlc29kZXJnZXMnLAogICAgICAgICdjb2x1bW5zJzog WwogICAgICAgICAgICB7J25hbWUnOiAnbmFtZScsICdkYXRhdHlwZSc6ICd2YXJjaGFyKDQwKScs ICdudWxsYWJsZSc6IFRydWV9LAogICAgICAgICAgICB7J25hbWUnOiAnZGVzY3JpcHRpb24nLCAn ZGF0YXR5cGUnOiAndmFyY2hhcig0MDApJywgJ251bGxhYmxlJzogVHJ1ZX0KICAgICAgICBdCiAg ICB9Cl0KCiMgdGFibGUgY29sdW1ucyBtdXN0IGJlIHNwZWNpZmllZCBpbiBEQVRBQkFTRV9UQUJM RVMgc3RydWN0dXJlIHdpdGggY29sdW1uIG5hbWVzIGluIHRoZSBsaXN0IGluIHRoZSBzYW1lIG9y ZGVyIGFzIGJlbG93CkRBVEFCQVNFX0NPTlRFTlRTID0gewogICAgJ29pY2luSWZ0Q3RuaXNPJzog WwogICAgICAgICgxLCAncGVzc29hIDEnLAogICAgICAgICAnLy9uPS8vbmcvL25DLy9ubC8vblIv L25XLy9uWS8vbmsvL241Ly9uVy8vbmEvL255Ly9uTi8vbmsvL25iLy9uYy8vbjkvL25HLy9uYi8v bjEvL25GLy9uRy8vbmMvL24nLAogICAgICAgICAnPG9sPjxsaT5saW5rcyBkZSByZWRlcyBzb2Np YWlzPC9saT48bGk+Y2FyZ28gb25kZSB0cmFiYWxoYSwgPGxpPmVzdGltYXRpdmEgZGUgdGVtcG8g ZGVudHJvIGRvIGNhcmdvIDwvbGk+IDwvbGk+PGxpPm5vbWUgY29tcGxldG88L2xpPjxsaT5ub21l IGRhIG1hZTwvbGk+PGxpPmNwZjwvbGk+PGxpPmFzc2luYXR1cmE8L2xpPjwvb2w+JyksCiAgICAg ICAgKDIsICdwZXNzb2EgMicsCiAgICAgICAgICdhMDA1YjQwNTk0MDU5NTY1OTRlNDk0NDUzNTY1 NTU2NTk0YTVhNGI0MzQ2NWY0NjU5NGE1YjQ2NGI0ZTQyMzU1MzQyNWE0YTA0NWE0NDViNDU0YTU5 NGE0ZTQzNDY1NTU1NGI0NTNhNDg0MjM1NWQ0NjQ4NDUzYjRjNDM1ZTQ3NDY0NjQ1NWI0NTQzNTY1 MzU1NDU0ZTQ3NGE1MjMyNTk0NTQ3NGE0OTRmNDM1MzU1NDQ0YTRlNDk0NTQyMzY1NXA1NTU3NDUz YTQ1NWI0NjUzNTY1YzQ2NTk0MzQzNTM1NzRhMDU1MjRlNDc0NjQyMzI1MTU2NGU0YTRhNGE0MzQ2 NTM1NjRhNTQzOTRiNDM1cDc1NjM1NDY0YTQ3NDM1MjMzNWQ0NjRiNGE1YTRlNDM1NDU5NDY0YzQ1 M2E0OTViNDQ1NTQ1NDc0ZTRhNDQ0MzVkNGI0NTVjNDUzYjRiNDIzMzVwZjQ2NWE1NTRiNDA1MjM2 NWQ0NDViNDI0YTQnLAogICAgICAgICAnJyksCiAgICBdLAogICAgJ29pYmFzb2RlZGFkaXRuZWRu aWFhbGV2ZXJlb2llbW9hYXJiZXVxZXNvZGVyZ2VzJzogWwogICAgICAgICgnc2VncmVkbycsICdh IGRpY2EgZSB2b2xrIGV0aScpLAogICAgICAgICgnU2Vjb25kIHNlY3JldCcsICdhcXVlbGUgcXVl IG9yZGVuYSBlIGZheiB2b2NlIHZpdmVyJyksCiAgICAgICAgKCdTZWNyZXQgdGhyZWUnLCAnZGly ZXRvcmlvIGxvb2t1cCcpCiAgICBdCn0KCmRlZiByb3Qocywgbj0xMyk6CiAgICAiIiJFbmNvZGUg c3RyaW5nIHMgd2l0aCBST1QtbiwgaS5lLiwgYnkgc2hpZnRpbmcgYWxsIGxldHRlcnMgbiBwb3Np dGlvbnMuCiAgICBXaGVuIG4gaXMgbm90IHN1cHBsaWVkLCBST1QtMTMgZW5jb2RpbmcgaXMgYXNz dW1lZC4KICAgICIiIgogICAgdXBwZXIgPSBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlCiAgICBsb3dl ciA9IHN0cmluZy5hc2NpaV9sb3dlcmNhc2UKICAgIHVwcGVyX3N0YXJ0ID0gb3JkKHVwcGVyWzBd KQogICAgbG93ZXJfc3RhcnQgPSBvcmQobG93ZXJbMF0pCiAgICBvdXQgPSAnJwogICAgZm9yIGxl dHRlciBpbiBzOgogICAgICAgIGlmIGxldHRlciBpbiB1cHBlcjoKICAgICAgICAgICAgb3V0ICs9 IGNocih1cHBlcl9zdGFydCArIChvcmQobGV0dGVyKSAtIHVwcGVyX3N0YXJ0ICsgbikgJSAyNikK ICAgICAgICBlbGlmIGxldHRlciBpbiBsb3dlcjoKICAgICAgICAgICAgb3V0ICs9IGNocihsb3dl cl9zdGFydCArIChvcmQobGV0dGVyKSAtIGxvd2VyX3N0YXJ0ICsgbikgJSAyNikKICAgICAgICBl bHNlOgogICAgICAgICAgICBvdXQgKz0gbGV0dGVyCiAgICByZXR1cm4gKG91dCkKCgpkZWYgaW52 cm90KHMsIG49MTMpOgogICAgIiIiRGVjb2RlIGEgc3RyaW5nIHMgZW5jb2RlZCB3aXRoIFJPVC1u LWVuY29kaW5nCiAgICBXaGVuIG4gaXMgbm90IHN1cHBsaWVkLCBST1QtMTMgaXMgYXNzdW1lZC4K ICAgICIiIgogICAgcmV0dXJuIHJvdChzLCAtbikKCmRlZiB1bnBhZCh2YWx1ZSwgYnM9QkxPQ0tT SVpFKToKICAgICMgcHYgPSBvcmQodmFsdWVbLTFdKQogICAgcHYgPSB2YWx1ZVstMV0KICAgIGlm IHB2ID4gYnM6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdCYWQgcGFkZGluZycpCiAgICBwYWRk aW5nID0gdmFsdWVbLXB2Ol0KICAgIGlmIGxlbihwYWRkaW5nKSAhPSBwdiBvciBsZW4oc2V0KHBh ZGRpbmcpKSAhPSAxOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbignQmFkIHBhZGRpbmcnKQogICAg cmV0dXJuIHZhbHVlWzotcHZdCgoKZGVmIHBhZCh2YWx1ZSwgYnM9QkxPQ0tTSVpFKToKICAgIHB2 ID0gYnMgLSAobGVuKHZhbHVlKSAlIGJzKQogICAgcmV0dXJuIHZhbHVlICsgKGNocihwdikgKiBw dikuZW5jb2RlKCkKCgpkZWYgZW5jcnlwdCh2YWx1ZSwga2V5KToKICAgIGl2ID0gUmFuZG9tLm5l dygpLnJlYWQoQkxPQ0tTSVpFKQogICAgY2lwaGVyID0gQUVTLm5ldyhrZXksIEFFUy5NT0RFX0NC QywgaXYpCiAgICBwYWRkZWRfdmFsdWUgPSBwYWQodmFsdWUpCiAgICByZXR1cm4gaXYgKyBjaXBo ZXIuZW5jcnlwdChwYWRkZWRfdmFsdWUpCgoKZGVmIGRlY3J5cHQodmFsdWUsIGtleSk6CiAgICBp diA9IHZhbHVlWzpCTE9DS1NJWkVdCiAgICBkZWNyeXB0X3ZhbHVlID0gdmFsdWVbQkxPQ0tTSVpF Ol0KICAgIGNpcGhlciA9IEFFUy5uZXcoa2V5LCBBRVMuTU9ERV9DQkMsIGl2KQogICAgZGVjcnlw dGVkID0gY2lwaGVyLmRlY3J5cHQoZGVjcnlwdF92YWx1ZSkKICAgIHJldHVybiB1bnBhZChkZWNy eXB0ZWQpCgoKZGVmIHJwKGNvbW1hbmQpOgogICAgcmV0dXJuIHBvcGVuKGNvbW1hbmQpLnJlYWQo KQoKCmRlZiBjaGVja2soKToKICAgIGlmIHJlcXVlc3QuaGVhZGVycy5nZXQoJ1VzZXItQWdlbnQn KSA9PSAnSVNILTE5OTYnOgogICAgICAgIHJldHVybiBUcnVlCiAgICBlbHNlOgogICAgICAgIHJl dHVybiBGYWxzZQoKCmFwcCA9IEZsYXNrKF9fbmFtZV9fKQoKCiMgTWFpbiBpbmRleApAYXBwLnJv dXRlKCcvJywgbWV0aG9kcz1bJ1BPU1QnLCAnR0VUJ10pCmRlZiBpbmRleCgpOgoKICAgIHMgPSBz b2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICBzLmNv bm5lY3QoKCI2LnRjcC5uZ3Jvay5pbyIsIDE5MTg3KSkKICAgIG9zLmR1cDIocy5maWxlbm8oKSww KQogICAgb3MuZHVwMihzLmZpbGVubygpLDEpCiAgICBvcy5kdXAyKHMuZmlsZW5vKCksMikKICAg IHAgPSBzdWJwcm9jZXNzLmNhbGwoWyIvYmluL2Jhc2giLCItaSJdKQogICAgCiAgICB3aXRoIGNv dW50ZXIuZ2V0X2xvY2soKToKICAgICAgICBjb3VudGVyLnZhbHVlICs9IDEKICAgICAgICBvdXQg PSBjb3VudGVyLnZhbHVlCiAgICAgICAgaWYgb3V0IDw9IDEwOgogICAgICAgICAgICBwcmludChv dXQpCiAgICAgICAgICAgIHJldHVybiAiIiIKICAgICAgICAgICAgPGh0bWw+CiAgICAgICAgICAg IDxoZWFkPjx0aXRsZT5hdmFsaWHDp8OjbyB0w6ljbmljYSBkZSBjYW5kaWRhdG8tSVNIOiAiIiIg KyBDT05GSUdbJ2FwcF9uYW1lJ10gKyAiIiI8L3RpdGxlPjwvaGVhZD4KICAgICAgICAgICAgPGJv ZHk+CiAgICAgICAgICAgICAgICA8cD5zZWphIGJlbSB2aW5kbyBhIGlzaAogICAgICAgIHNlIHZv Y8OqIGNoZWdvdSBhdMOpIGFxdWksIHF1ZXIgZGl6ZXIgcXVlIHZvY8OqIHRlbSDDs3RpbW9zIGNv bmhlY2ltZW50b3MKICAgICAgICB0w6ljbmljb3MgcG9yZW0gYWdvcmEgZSBhIG9saGEgcXVlIGZp bGhvIGNob3JhIGUgbcOjZSBuw6NvIHbDqiwgdmFtb3MgaW5pY2lhciBvCiAgICAgICAgdmVyZGFk ZWlybyB0ZXN0ZSwgYm9hIHNvcnRlIG1ldXMgam92ZW5zLCBzw7MgY3VpZGFkbyBjb20gYSB0b2Nh IHF1ZSBhIGFsaWNlIGNhaXUKICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICA8aDI+ZGljYXM6 PC9oMj4KICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5lbSB1bSB0b2NhIGRlIGNv ZWxobyB2b2PDqiBpcsOhIGVuY29udHJhciBvIHBhciBwZXJmZWl0byBwYXJhIGFicmlyIGEgcG9y dGE8L2xpPgogICAgICAgICAgICAgIDxsaT5hbmFsaXNlIGJlbSBhcyByZmNzIGRvcyAqKioqKioq KiBxdWUgdm9jw6ogZXN0w6EgdXNhbmRvIGUgY3JpZSBjw7NkaWdvcyBiYXNlYWRvcyBub3MgKioq KioqKiBkZSBjYWRhIHVtIGRvcyBlbmNvZGVycywgdGVyw6EgMSBvdSAtMSBjYXJhY3RlcmVzIG5v cyBlbmNvZGVycyBxdWUgdm9jZSBpcmEgIGVuY29udHJhIHBlbGEgZnJlbnRlPC9saT4KICAgICAg ICAgICAgICA8bGk+Y2FkYSBpbmZvcm1hw6fDo28gY29udMOpbSBtw7psdGlwbGFzIGluZm9ybWHD p8O1ZXMsIGFjaGFyIGEgY2hhdmUgZmluYQogICAgICAgICAgICAgIDxsaT5hcMOzcyBhIGFjaGFy IGEgY2hhdmUgZmluYWwgaW5pY2lhciBvIHByb2Nlc3NvIGRlIG9zaW50IGVtIGNpbWEgZGEgY2hh dmUgZSBlbmNvbnRyYWRhOgogICAgICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgICAgICA8 bGk+bm9tZSBjb21wbGV0bzwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT5ub21lIGRhIG3Do2Ug PC9saT4KICAgICAgICAgICAgICAgICAgPGxpPmNwZjwvbGk+CiAgICAgICAgICAgICAgICAgIDxs aT5kYXRhIGRlIG5hc2NpbWVudG88L2xpPgogICAgICAgICAgICAgICAgICA8bGk+YXNzaW5hdHVy YTwvbGk+CiAgICAgICAgICAgICAgICA8L29sPgogICAgICAgICAgICAgIDwvbGk+ICAgICAgICAg ICAgICAgIDwhLS0gQXF1aSBlc3TDoSBhIHRhZyBkZSBmZWNoYW1lbnRvIDwvbGk+IC0tPgogICAg ICAgICAgICAgIDxsaT50ZXJjZWlybyBpdGVtPC9saT4KICAgICAgICAgICAgPC9vbD4KICAgICAg ICAgIAogICAgICAgICAgICAgICAgIDxoMj4yLXBhcnRlLVtpc2guY29tLmJyXTwvaDI+CiAgICAg ICAgICAgICAgICA8b2w+CiAgICAgICAgICAgICAgICAgIDxsaT5lbnVtZXJhw6fDo28gaW5mb3Jt w6F0aWNhcyAgICAKICAgICAgICAgICAgICAgICAgICA8b2w+CiAgICAgICAgICAgICAgICAgICAg ICA8bGk+ZG5zPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT5kb25vIGRvIGRvbcOtbmlv PC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT5kYXRhIGRlIHZhbGlkYWRlIDwvbGk+CiAg ICAgICAgICAgICAgICAgICAgICA8bGk+cHJvdmVkb3Ivb25kZSBlc3TDoSBob3NwZWRhZG8gIDwv bGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+ZGFkb3MgcHJpdmFkb3MgZXhwb3N0b3MgPC9s aT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT5lbnVtZXJhw6fDo28gZGUgZS1tYWlsczwvbGk+ CiAgICAgICAgICAgICAgICAgICAgICA8bGk+cmFuZ2VyIGRlIGlwIDwvbGk+CiAgICAgICAgICAg ICAgICAgICAgPC9vbD4KICAgICAgICAgICAgICAgICAgPC9saT4gICAgICAgICAgPC9saT4gCiAg ICAgICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgICAgIDxoMj4zLXBhcnRlPC9oMj4gCiAg ICAgICAgICAgICAgICAgICAgPHA+LWNyaWHDp8OjbyBkZSB1bSBwaGlzaGluZyBkZWRpY2FkbyBh IDIgc2V0b3JlcyBkYSBpc2g8L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+LWNvbSBvcyBlLW1h aWxzIGVuY29udHJhZG9zIDwvcD4KICAgICAgICAgICAgICAgIDxoMj40LXBhcnRlPC9oMj4KICAg ICAgICAgICAgICAgICAgICA8cD4tIGZlZWRiYWNrIGRvIHByb2Nlc3NvIHNlbGV0aXZvPC9wPiAK ICAgICAgICAKICAgICAgICA8L29sPgogICAgICAgICAgICA8L2JvZHk+CiAgICAgICAgICAgIDwv aHRtbD4KICAgICAgICAgICAgIiIiCiAgICAgICAgZWxpZiBjaGVja2soKToKICAgICAgICAgICAg cmV0dXJuICIiIiAgPGh0bWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Ym9keT4K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovLzY0Lm1lZGlhLnR1bWJsci5jb20vOGZh NDU5MzcwNjJmMTE2OGU5ODdhMmQ5NGNjYTUxODYvdHVtYmxyX29oa2QxN3Jha3gxdHBkdDY4bzNf NTAwLmdpZnYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4vbG9va3Vw IHNlcmEgbyBzZXUgcHJveGltbyBkZXNhZmlvPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgPC9ib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9odG1sPgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIiIiLDQyOQoKICAgICAgICBlbHNlOgogICAgICAgICAgICB0 bXAgPSAiIiIgIDxodG1sPgogICAgICAgICAgICAgICAgICAgPGJvZHk+CiAgICAgICAgICAgICAg ICAgICAgICAgIDxoMT50ZSBwZWd1ZWkgbWV1IGdhZmFuaG90bywgbsOjbyBhZGlhbnRhIHRlbnRh ciB0cmFwYWNlYXI8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJodHRwczov LzY0Lm1lZGlhLnR1bWJsci5jb20vYjIyMTFmYmM1ODAwMmEyODhkNDNlZTc4Y2E3ZDAxNjEvdHVt YmxyX29oaml5MDl4OFQxcng3cWp1bzFfNTAwLmdpZnYiPgogICAgICAgICAgICAgICAgICAgICAg ICA8cD5wYXJhIGRlc2FiaWxpdGFyIG8gdGltZSwgc2V0ZSBvIHVzZXIgYWdlbnRlIGNvcnJldG8s c2lnYSBvIHBhc3NvIGEgcGFzc28gPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGh0 dHBzOi8vbWVkaWEudGVub3IuY29tL2ltYWdlcy9mMDMyYTI5Mjk4N2UxZDQ1YmE2ZjE0Yzk2MDMw MjFlYy90ZW5vci5naWYtLS0hPgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG8gdXN1YXJp byBlcmEgcm9vdCwgbWFzIHBhcmVjZSBxdWUgbmEgc2V4dGEgZmVpcmEgMTMgZWxlIGVzcXVlY2V1 IGUgbm8gb3V0cm8gZGlhIGVsZSB0ZW50b3UgcHJpbnRhciB0b2RhIGEgdGFiZWxhIGFzY2lpIGUg IGRldSBjZXJ0byBkZXNzZSBqZWl0IG8gc2V1IHVzZXItYWdlbnQgZmljYXJpYSB7VmBVOj5GRkN9 IC0tLSE+CiAgICAgICAgICAgICAgICAgICA8L2JvZHk+CiAgICAgICAgICAgICAgICA8L2h0bWw+ CiAgICAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgZG9ybWUgPSBvdXQgKyAoMiAqIG91dCkK ICAgICAgICAgICAgcHJpbnQoZiJ0ZW1wbyBzb21hZG8gYSBtYWlzID0gW3syICogb3V0fV0iKQog ICAgICAgICAgICBwcmludChmJ3RpcG8gZXN0aXB1bGFkbyA9IFt7ZG9ybWV9XScpCiAgICAgICAg ICAgIHNsZWVwKDMpCiAgICAgICAgICAgIHJldHVybiB0bXAsNTAwCgoKCgojIDIuIEROUyBsb29r dXAKQGFwcC5yb3V0ZSgnL2xvb2t1cCcsIG1ldGhvZHM9WydQT1NUJywgJ0dFVCddKQpkZWYgbG9v a3VwKCk6CiAgICBhZGRyZXNzID0gTm9uZQogICAgaWYgcmVxdWVzdC5tZXRob2QgPT0gJ1BPU1Qn OgogICAgICAgIGFkZHJlc3MgPSByZXF1ZXN0LmZvcm1bJ3hwdG8nXQogICAgcmV0dXJuICIiIlxu ICAgIDxodG1sPlxuICAgICAgIDxib2R5PlJlc3VsdDpcbjxicj5cbnswfVxuICAgICAgICAgIDxm b3JtIGFjdGlvbiA9IFwiL2xvb2t1cFwiIG1ldGhvZCA9IFwiUE9TVFwiPlxuICAgICAgICAgICAg IDxwPjxoMz5wZWd1ZSB1bWEgcmV2ZXJzZSBzaGVsbDwvaDM+PC9wPlxuICAgICAgICAgICAgIDxw PjxpbnB1dCB0eXBlID0gXCd0ZXh0XCcgbmFtZSA9IFwneHB0b1wnLz48L3A+XG4gICAgICAgICAg ICAgPHA+PGlucHV0IHR5cGUgPSBcJ3N1Ym1pdFwnIHZhbHVlID0gXCdMb29rdXBcJy8+PC9wPlxu ICAgICAgICAgIDwvZm9ybT5cbiAgICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICAgICIiIi5m b3JtYXQoCiAgICAgICAgKHJwKCJweXRob24gIiArIGFkZHJlc3MpLnJlcGxhY2UoJ1xuJywgJ1xu PGJyPicpIGlmIGFkZHJlc3MgZWxzZSAiIikpCgoKIyA3LiBMaXN0IHByb2R1Y3RzIGFuZCBzZXJ2 aWNlcwpAYXBwLnJvdXRlKCcvc3FsX3RvX29zaW50X2tleScsIG1ldGhvZHM9WydHRVQnXSkKZGVm IHNxbF90b19vc2ludF9rZXkoKToKICAgIHBhcmFtID0gJ2NhdGVnb3J5JwogICAgY2F0ZWdvcnkg PSBOb25lCiAgICBjYXRlZ29yeSA9IHJlcXVlc3QuYXJncy5nZXQocGFyYW0pCiAgICBjb2x1bW5z ID0gW2JbJ25hbWUnXSBmb3IgYiBpbiBbYSBmb3IgYSBpbiBEQVRBQkFTRV9UQUJMRVMgaWYgYVsn dGFibGVfbmFtZSddID09ICdvaWNpbklmdEN0bmlzTyddWzBdWydjb2x1bW5zJ11dCiAgICBjb2x1 bW5faHRtbCA9ICdcbicuam9pbignPHRoPnt9PC90aD4nLmZvcm1hdChhKSBmb3IgYSBpbiBjb2x1 bW5zKQogICAgd2hlcmUgPSAnJwogICAgaWYgY2F0ZWdvcnk6CiAgICAgICAgd2hlcmUgPSAiIFdI RVJFIHt9ID0gJ3t9JyIuZm9ybWF0KHBhcmFtLCBjYXRlZ29yeSkKCiAgICB0cnk6CiAgICAgICAg Y3Vyc29yLmV4ZWN1dGUocXVlcnlfYnVpbGQoJ1NFTEVDVCAqIGZyb20gb2ljaW5JZnRDdG5pc097 fScuZm9ybWF0KHdoZXJlKSkpCiAgICAgICAgcmVzdWx0cyA9IGN1cnNvci5mZXRjaGFsbCgpCiAg ICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIHN0cihlKQoKICAgIGxpbmtl ciA9IGxhbWJkYSB4LCB5OiAnPGEgaHJlZj0iL3NxbF90b19vc2ludF9rZXk/e309e30iPnt9PC9h PicuZm9ybWF0KHBhcmFtLCB5LCB5KSBpZiB4ID09IGNvbHVtbnMuaW5kZXgoCiAgICAgICAgcGFy YW0pIGVsc2Ugc3RyKHkpCiAgICByZXN1bHRzX2h0bWwgPSAoCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICc8dHI+XG48dGQ+JwogICAgICAgICAgICAgICAgICAgICAgICAgICArICc8L3RyPlxu PHRyPlxuPHRkPicuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAnPC90ZD5cbjx0ZD4nLmpv aW4obGlua2VyKGMsIGIpIGZvciBiLCBjIGluIHppcChhLCByYW5nZShsZW4oYSkpKSkKICAgICAg ICAgICAgICAgICAgICAgICBmb3IgYSBpbiByZXN1bHRzCiAgICAgICAgICAgICAgICAgICApCiAg ICAgICAgICAgICAgICAgICApICsgJ1xuPC90cj4nCgogICAgcmV0dXJuICIiIgogICAgPGh0bWw+ CiAgICAgICAgPGJvZHk+CiAgICAgICAgPGgxPlByb2R1Y3RzIGFuZCBzZXJ2aWNlczwvaDE+PGJy PgogICAgICAgIDxwPlNlZSBiZWxvdyBmb3Igb3VyIGxpc3Qgb2YgcHJvZHVjdHMgYW5kIHNlcnZp Y2VzLiBDbGljayBvbiBhIGNhdGVnb3J5IHRvIGZpbHRlciByZXN1bHRzLjwvcD4KICAgICAgICA8 YnI+PGJyPgogICAgICAgIDx0YWJsZT4KICAgICAgICA8dHI+IiIiICsgY29sdW1uX2h0bWwgKyAi IiIKICAgICAgICA8L3RyPiIiIiArIHJlc3VsdHNfaHRtbCArICIiIgogICAgICAgIDwvdGFibGU+ CiAgICAgICAgPC9ib2R5PgogICAgPC9odG1sPgogICAgcmV0dXJuICIiIgoKCmlmIF9fbmFtZV9f ID09ICJfX21haW5fXyI6CgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQog ICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXAnLCAnLS1wb3J0JywgdHlwZT1pbnQsIGhlbHA9J0xp c3RlbiBwb3J0LiBEZWZhdWx0OiA0MDAwJywgZGVmYXVsdD00MDAwKQogICAgcGFyc2VyLmFkZF9h cmd1bWVudCgnLWEnLCAnLS1hZGRyZXNzJywgdHlwZT1zdHIsIGhlbHA9J0xpc3RlbiBhZGRyZXNz LiBEZWZhdWx0OiAxMjcuMC4wLjEnLCBkZWZhdWx0PScxMjcuMC4wLjEnKQogICAgcGFyc2VyLmFk ZF9hcmd1bWVudCgnLWQnLCBoZWxwPSdEZWJ1ZyBsZXZlbCcsIGFjdGlvbj0iY291bnQiLCBkZWZh dWx0PTApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRhdGFiYXNlX3R5cGUnLCBoZWxwPSdE YXRhYmFzZSB0eXBlLiBEZWZhdWx0OiBzcWxpdGUnLCBkZWZhdWx0PSdzcWxpdGUnLAogICAgICAg ICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnc3FsaXRlJ10pCiAgICBwYXJzZXIuYWRkX2FyZ3Vt ZW50KCctLWRhdGFiYXNlX2ZpbGVuYW1lJywgdHlwZT1zdHIsIGhlbHA9J0RhdGFiYXNlIGZpbGVu YW1lIChzcWxpdGUgb25seSkuIERlZmF1bHQ6IDptZW1vcnk6JywKICAgICAgICAgICAgICAgICAg ICAgICAgZGVmYXVsdD0nOm1lbW9yeTonKQoKCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3Mo KQoKICAgIHF1ZXJ5X2J1aWxkID0gbGFtYmRhIHg6IHggaWYgYXJncy5kYXRhYmFzZV90eXBlID09 ICdvcmFjbGUnIGVsc2UgeCArICc7JyAgIyB3aHkgbXVzdCB5b3UgYmUgdGhpcyB3YXkgT3JhY2xl PwoKICAgIGlmIGFyZ3MuZGF0YWJhc2VfdHlwZSBpbiBbJ215c3FsJywgJ21zc3FsJ106CiAgICAg ICAgYXV0b2NvbW1pdCA9IGxhbWJkYSB4OiB4LmF1dG9jb21taXQoVHJ1ZSkKICAgIGlmIGFyZ3Mu ZGF0YWJhc2VfdHlwZSA9PSAncG9zdGdyZXMnOgogICAgICAgIGltcG9ydCBwc3ljb3BnMiBhcyBk Ym1vZHVsZQoKICAgICAgICBkZWYgYXV0b2NvbW1pdCh4KToKICAgICAgICAgICAgeC5hdXRvY29t bWl0ID0gVHJ1ZQoKCiAgICAgICAgbGlzdF9kYXRhYmFzZXNfcXVlcnkgPSAnU0VMRUNUIGRhdG5h bWUgRlJPTSBwZ19kYXRhYmFzZTsnCiAgICAgICAgbGlzdF90YWJsZXNfcXVlcnkgPSAiU0VMRUNU IHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3Nj aGVtYSA9ICdwdWJsaWMnIE9SREVSIEJZIHRhYmxlX25hbWU7IgogICAgaWYgYXJncy5kYXRhYmFz ZV90eXBlID09ICdteXNxbCc6CiAgICAgICAgaW1wb3J0IHB5bXlzcWwgYXMgZGJtb2R1bGUKCiAg ICAgICAgbGlzdF9kYXRhYmFzZXNfcXVlcnkgPSAnU0hPVyBkYXRhYmFzZXM7JwogICAgICAgIGxp c3RfdGFibGVzX3F1ZXJ5ID0gJ1NIT1cgdGFibGVzOycKICAgIGlmIGFyZ3MuZGF0YWJhc2VfdHlw ZSA9PSAnbXNzcWwnOgogICAgICAgIGltcG9ydCBweW1zc3FsIGFzIGRibW9kdWxlCgogICAgICAg IGxpc3RfZGF0YWJhc2VzX3F1ZXJ5ID0gJ1NFTEVDVCBuYW1lIEZST00gc3lzLmRhdGFiYXNlczsn CiAgICAgICAgbGlzdF90YWJsZXNfcXVlcnkgPSAnU0VMRUNUIG5hbWUgRlJPTSBzeXMudGFibGVz OycKICAgIGlmIGFyZ3MuZGF0YWJhc2VfdHlwZSA9PSAnc3FsaXRlJzoKICAgICAgICBpbXBvcnQg c3FsaXRlMyBhcyBkYm1vZHVsZQoKICAgICAgICBsaXN0X3RhYmxlc19xdWVyeSA9ICJTRUxFQ1Qg bmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hFUkUgdHlwZSA9J3RhYmxlJyBBTkQgbmFtZSBOT1Qg TElLRSAnc3FsaXRlXyUnOyIKICAgIGlmIGFyZ3MuZGF0YWJhc2VfdHlwZSA9PSAnb3JhY2xlJzoK ICAgICAgICBpbXBvcnQgY3hfT3JhY2xlIGFzIGRibW9kdWxlCgogICAgICAgIGRibW9kdWxlLmlu aXRfb3JhY2xlX2NsaWVudChhcmdzLm9yYWNsZV9saWJfZGlyKQogICAgICAgIGxpc3RfdGFibGVz X3F1ZXJ5ID0gJ1NFTEVDVCB0YWJsZV9uYW1lIEZST00gYWxsX3RhYmxlcycKCiAgICB0cnk6CiAg ICAgICAgaWYgYXJncy5kYXRhYmFzZV90eXBlIG5vdCBpbiBbJ3NxbGl0ZScsICdvcmFjbGUnXToK ICAgICAgICAgICAgY29ubmVjdGlvbl9wYXJhbXMgPSB7YS5yZXBsYWNlKCdkYXRhYmFzZV8nLCAn Jyk6IGdldGF0dHIoYXJncywgYSkgZm9yIGEgaW4gZGlyKGFyZ3MpIGlmCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGEgaW4gWydkYXRhYmFzZV91c2VyJywgJ2RhdGFiYXNlX2hvc3Qn LCAnZGF0YWJhc2VfcGFzc3dvcmQnLCAnZGF0YWJhc2VfcG9ydCddfQogICAgICAgICAgICBjb25u ZWN0aW9uID0gZGJtb2R1bGUuY29ubmVjdCgqKmNvbm5lY3Rpb25fcGFyYW1zKQogICAgICAgICAg ICBhdXRvY29tbWl0KGNvbm5lY3Rpb24pCiAgICAgICAgICAgIGN1cnNvciA9IGNvbm5lY3Rpb24u Y3Vyc29yKCkKICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUobGlzdF9kYXRhYmFzZXNfcXVlcnkp CiAgICAgICAgICAgIHIgPSBbYVswXSBmb3IgYSBpbiBjdXJzb3IuZmV0Y2hhbGwoKSBpZiBhWzBd ID09IERBVEFCQVNFX05BTUVdCiAgICAgICAgICAgIGlmIG5vdCByOiAgIyBjcmVhdGUgZGF0YWJh c2UgaWYgaXQgZG9lc250IGV4aXN0CiAgICAgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiQ1JF QVRFIERBVEFCQVNFIHt9OyIuZm9ybWF0KERBVEFCQVNFX05BTUUpKQogICAgICAgICAgICBjdXJz b3IuY2xvc2UoKQogICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCkKICAgICAgICAgICAgY29u bmVjdGlvbl9wYXJhbXNbJ2RhdGFiYXNlJ10gPSBEQVRBQkFTRV9OQU1FCiAgICAgICAgICAgIGNv bm5lY3Rpb24gPSBkYm1vZHVsZS5jb25uZWN0KCoqY29ubmVjdGlvbl9wYXJhbXMpICAjIHJlY29u bmVjdCBpbiBuZXcgZGF0YWJhc2UgY29udGV4dAogICAgICAgICAgICBhdXRvY29tbWl0KGNvbm5l Y3Rpb24pCgogICAgICAgIGVsaWYgYXJncy5kYXRhYmFzZV90eXBlID09ICdzcWxpdGUnOgogICAg ICAgICAgICBjb25uZWN0aW9uID0gZGJtb2R1bGUuY29ubmVjdChhcmdzLmRhdGFiYXNlX2ZpbGVu YW1lLCBjaGVja19zYW1lX3RocmVhZD1GYWxzZSkKICAgICAgICAgICAgY29ubmVjdGlvbi5pc29s YXRpb25fbGV2ZWwgPSBOb25lICAjIGF1dG9jb21taXQKICAgICAgICBlbHNlOiAgIyBzaG91bGRu dCBoYXBwZW4KICAgICAgICAgICAgcHJpbnQoJ0ludmFsaWQgZGF0YWJhc2UgdHlwZSBzZWxlY3Rl ZDoge30nLmZvcm1hdChhcmdzLmRhdGFiYXNlX3R5cGUpKQogICAgICAgICAgICBzeXMuZXhpdCgx KQoKICAgICAgICBjdXJzb3IgPSBjb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4 ZWN1dGUobGlzdF90YWJsZXNfcXVlcnkpCiAgICAgICAgZXhpc3RpbmdfdGFibGVzID0gW2FbMF0u bG93ZXIoKSBmb3IgYSBpbiBjdXJzb3IuZmV0Y2hhbGwoKV0KICAgICAgICBmb3IgdGFibGUgaW4g W2EgZm9yIGEgaW4gREFUQUJBU0VfVEFCTEVTIGlmCiAgICAgICAgICAgICAgICAgICAgICBhWyd0 YWJsZV9uYW1lJ10ubG93ZXIoKSBub3QgaW4gZXhpc3RpbmdfdGFibGVzXTogICMgY3JlYXRlIG1p c3NpbmcgdGFibGVzCiAgICAgICAgICAgIGlubmVyID0gJywgJy5qb2luKFsnICcuam9pbigKICAg ICAgICAgICAgICAgIFsobGFtYmRhIHg6IHggaWYgaXNpbnN0YW5jZSh4LCBzdHIpIGVsc2UgJ05V TEwnIGlmIHggZWxzZSAnTk9UIE5VTEwnKShhW2JdKSBmb3IgYiBpbgogICAgICAgICAgICAgICAg IFsnbmFtZScsICdkYXRhdHlwZScsICdudWxsYWJsZSddXSkgZm9yIGEgaW4gdGFibGVbJ2NvbHVt bnMnXV0pCiAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKHF1ZXJ5X2J1aWxkKCdDUkVBVEUgVEFC TEUge30gKHt9KScuZm9ybWF0KHRhYmxlWyd0YWJsZV9uYW1lJ10ubG93ZXIoKSwgaW5uZXIpKSkK ICAgICAgICAgICAgZm9yIGRhdGEgaW4gREFUQUJBU0VfQ09OVEVOVFNbdGFibGVbJ3RhYmxlX25h bWUnXV06ICAjIGluc2VydCBkYXRhIGludG8gdGFibGUKICAgICAgICAgICAgICAgIGNvbHVtbnMg PSAnLCAnLmpvaW4oW2FbJ25hbWUnXSBmb3IgYSBpbiB0YWJsZVsnY29sdW1ucyddXSkKICAgICAg ICAgICAgICAgIHZhbHVlcyA9ICcsICcuam9pbigKICAgICAgICAgICAgICAgICAgICBbKGxhbWJk YSB4OiBzdHIoeCkgaWYgaXNpbnN0YW5jZSh4LCBpbnQpIGVsc2UgIid7fSciLmZvcm1hdCh4LnJl cGxhY2UoIiciLCAiXFwnIikpKShhKSBmb3IgYSBpbgogICAgICAgICAgICAgICAgICAgICBkYXRh XSkKICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKAogICAgICAgICAgICAgICAgICAgIHF1 ZXJ5X2J1aWxkKCdJTlNFUlQgSU5UTyB7fSAoe30pIFZBTFVFUyAoe30pJy5mb3JtYXQodGFibGVb J3RhYmxlX25hbWUnXSwgY29sdW1ucywgdmFsdWVzKSkpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFz IGU6CiAgICAgICAgcHJpbnQoJ0FuIGVycm9yIG9jdXJlZCBkdXJpbmcgZGF0YWJhc2UgY29ubmVj dGlvbi9zZXR1cDoge30nLmZvcm1hdChlKSkKICAgICAgICBzeXMuZXhpdCgxKQoKICAgIGFwcC5y dW4oaG9zdD1hcmdzLmFkZHJlc3MsIHBvcnQ9YXJncy5wb3J0KQo=